Пример #1
0
    def testFlattenAndPack(self):
        structure = ((3, 4), 5, (6, 7, (9, 10), 8))
        flat = ["a", "b", "c", "d", "e", "f", "g", "h"]
        self.assertEqual(nest.flatten(structure), [3, 4, 5, 6, 7, 9, 10, 8])
        self.assertEqual(nest.pack_sequence_as(structure, flat),
                         (("a", "b"), "c", ("d", "e", ("f", "g"), "h")))
        structure = (NestTest.PointXY(x=4, y=2), ((NestTest.PointXY(x=1,
                                                                    y=0), ), ))
        flat = [4, 2, 1, 0]
        self.assertEqual(nest.flatten(structure), flat)
        restructured_from_flat = nest.pack_sequence_as(structure, flat)
        self.assertEqual(restructured_from_flat, structure)
        self.assertEqual(restructured_from_flat[0].x, 4)
        self.assertEqual(restructured_from_flat[0].y, 2)
        self.assertEqual(restructured_from_flat[1][0][0].x, 1)
        self.assertEqual(restructured_from_flat[1][0][0].y, 0)

        self.assertEqual([5], nest.flatten(5))
        self.assertEqual([np.array([5])], nest.flatten(np.array([5])))

        self.assertEqual("a", nest.pack_sequence_as(5, ["a"]))
        self.assertEqual(np.array([5]),
                         nest.pack_sequence_as("scalar", [np.array([5])]))

        with self.assertRaisesRegexp(ValueError, "Structure is a scalar"):
            nest.pack_sequence_as("scalar", [4, 5])

        with self.assertRaisesRegexp(TypeError, "flat_sequence"):
            nest.pack_sequence_as([4, 5], "bad_sequence")

        with self.assertRaises(ValueError):
            nest.pack_sequence_as([5, 6, [7, 8]], ["a", "b", "c"])
Пример #2
0
 def testPackSequenceAs_notIterableError(self):
   # NOTE(taylorrobie): The second pattern is for version compatibility.
   with self.assertRaisesRegex(
       TypeError,
       "(Attempted to pack value:\n  bye\ninto a sequence, but found "
       "incompatible type `<(type|class) 'str'>` instead.)|"
       "(flat_sequence must be a sequence)"):
     nest.pack_sequence_as("hi", "bye")
Пример #3
0
 def testPackDictOrder(self, mapping_type):
   """Packing orders dicts by key, including OrderedDicts."""
   custom = mapping_type([("d", 0), ("b", 0), ("a", 0), ("c", 0)])
   plain = {"d": 0, "b": 0, "a": 0, "c": 0}
   seq = [0, 1, 2, 3]
   custom_reconstruction = nest.pack_sequence_as(custom, seq)
   plain_reconstruction = nest.pack_sequence_as(plain, seq)
   self.assertIsInstance(custom_reconstruction, mapping_type)
   self.assertIsInstance(plain_reconstruction, dict)
   self.assertEqual(
       mapping_type([("d", 3), ("b", 1), ("a", 0), ("c", 2)]),
       custom_reconstruction)
   self.assertEqual({"d": 3, "b": 1, "a": 0, "c": 2}, plain_reconstruction)
Пример #4
0
  def testFlattenAndPack(self):
    structure = ((3, 4), 5, (6, 7, (9, 10), 8))
    flat = ["a", "b", "c", "d", "e", "f", "g", "h"]
    self.assertEqual(nest.flatten(structure), [3, 4, 5, 6, 7, 9, 10, 8])
    self.assertEqual(
        nest.pack_sequence_as(structure, flat),
        (("a", "b"), "c", ("d", "e", ("f", "g"), "h")))
    structure = (NestTest.PointXY(x=4, y=2), ((NestTest.PointXY(x=1, y=0),),))
    flat = [4, 2, 1, 0]
    self.assertEqual(nest.flatten(structure), flat)
    restructured_from_flat = nest.pack_sequence_as(structure, flat)
    self.assertEqual(restructured_from_flat, structure)
    self.assertEqual(restructured_from_flat[0].x, 4)
    self.assertEqual(restructured_from_flat[0].y, 2)
    self.assertEqual(restructured_from_flat[1][0][0].x, 1)
    self.assertEqual(restructured_from_flat[1][0][0].y, 0)

    self.assertEqual([5], nest.flatten(5))
    self.assertEqual([np.array([5])], nest.flatten(np.array([5])))

    self.assertEqual("a", nest.pack_sequence_as(5, ["a"]))
    self.assertEqual(
        np.array([5]), nest.pack_sequence_as("scalar", [np.array([5])]))

    # NOTE(taylorrobie): The second pattern is for version compatibility.
    with self.assertRaisesRegex(
        ValueError,
        "(nest cannot guarantee that it is safe to map one to the other.)|"
        "(Structure is a scalar)"):
      nest.pack_sequence_as("scalar", [4, 5])

    # NOTE(taylorrobie): The second pattern is for version compatibility.
    with self.assertRaisesRegex(
        TypeError,
        "(Attempted to pack value:\n  bad_sequence\ninto a sequence, but found "
        "incompatible type `<(type|class) 'str'>` instead.)|"
        "(flat_sequence must be a sequence)"):
      nest.pack_sequence_as([4, 5], "bad_sequence")

    with self.assertRaises(ValueError):
      nest.pack_sequence_as([5, 6, [7, 8]], ["a", "b", "c"])
Пример #5
0
  def testFlattenAndPack_withDicts(self):
    # A nice messy mix of tuples, lists, dicts, and `OrderedDict`s.
    mess = [
        "z",
        NestTest.Abc(3, 4), {
            "d": _CustomMapping({
                41: 4
            }),
            "c": [
                1,
                collections.OrderedDict([
                    ("b", 3),
                    ("a", 2),
                ]),
            ],
            "b": 5
        }, 17
    ]

    flattened = nest.flatten(mess)
    self.assertEqual(flattened, ["z", 3, 4, 5, 1, 2, 3, 4, 17])

    structure_of_mess = [
        14,
        NestTest.Abc("a", True),
        {
            "d": _CustomMapping({
                41: 42
            }),
            "c": [
                0,
                collections.OrderedDict([
                    ("b", 9),
                    ("a", 8),
                ]),
            ],
            "b": 3
        },
        "hi everybody",
    ]

    unflattened = nest.pack_sequence_as(structure_of_mess, flattened)
    self.assertEqual(unflattened, mess)

    # Check also that the OrderedDict was created, with the correct key order.
    unflattened_ordered_dict = unflattened[2]["c"][1]
    self.assertIsInstance(unflattened_ordered_dict, collections.OrderedDict)
    self.assertEqual(list(unflattened_ordered_dict.keys()), ["b", "a"])

    unflattened_custom_mapping = unflattened[2]["d"]
    self.assertIsInstance(unflattened_custom_mapping, _CustomMapping)
    self.assertEqual(list(unflattened_custom_mapping.keys()), [41])
Пример #6
0
    def testAttrsFlattenAndPack(self):
        if attr is None:
            self.skipTest("attr module is unavailable.")

        field_values = [1, 2]
        sample_attr = NestTest.SampleAttr(*field_values)
        self.assertFalse(nest._is_attrs(field_values))
        self.assertTrue(nest._is_attrs(sample_attr))
        flat = nest.flatten(sample_attr)
        self.assertEqual(field_values, flat)
        restructured_from_flat = nest.pack_sequence_as(sample_attr, flat)
        self.assertIsInstance(restructured_from_flat, NestTest.SampleAttr)
        self.assertEqual(restructured_from_flat, sample_attr)

        # Check that flatten fails if attributes are not iterable
        with self.assertRaisesRegexp(TypeError, "object is not iterable"):
            flat = nest.flatten(NestTest.BadAttr())
Пример #7
0
 def testPackSequenceAs_wrongLengthsError(self):
     with self.assertRaisesRegexp(
             ValueError,
             "Structure had 2 elements, but flat_sequence had 3 elements."):
         nest.pack_sequence_as(["hello", "world"],
                               ["and", "goodbye", "again"])
Пример #8
0
 def testPackSequenceAs_notIterableError(self):
     with self.assertRaisesRegexp(TypeError,
                                  "flat_sequence must be a sequence"):
         nest.pack_sequence_as("hi", "bye")
Пример #9
0
 def testFlatten_stringIsNotFlattened(self):
     structure = "lots of letters"
     flattened = nest.flatten(structure)
     self.assertLen(flattened, 1)
     unflattened = nest.pack_sequence_as("goodbye", flattened)
     self.assertEqual(structure, unflattened)