def from_json(cls, data): """Parse the JSON data and produce an index.""" mapping = json.loads(data) # Parse the global data, of which there is only the timestamp. Even # though the string will contain 'UTC' (which we assert is so since we # can only handle UTC timestamps), strptime() will return a naive # datetime. We'll turn it into an aware datetime in UTC, which is the # only thing that can possibly make sense. timestamp_str = mapping['global']['generated_at'] assert 'UTC' in timestamp_str.split(), 'timestamps must be UTC' naive_generated_at = datetime.strptime(timestamp_str, IN_FMT) generated_at = naive_generated_at.replace(tzinfo=timezone.utc) global_ = Bag(generated_at=generated_at) # Parse the images. images = [] for image_data in mapping['images']: # Descriptions can be any of: # # * description # * description-xx (e.g. description-en) # * description-xx_CC (e.g. description-en_US) # # We want to preserve the keys exactly as given, and because the # extended forms are not Python identifiers, we'll pull these out # into a separate, non-Bag dictionary. descriptions = {} # We're going to mutate the dictionary during iteration. for key in list(image_data): if key.startswith('description'): descriptions[key] = image_data.pop(key) files = image_data.pop('files', []) bundles = [Bag(**bundle_data) for bundle_data in files] image = Image(files=bundles, descriptions=descriptions, **image_data) images.append(image) return cls(global_=global_, images=images)
def test_full_equal(self): image_1 = Image(type='full', version=17) image_2 = Image(type='full', version=17) self.assertEqual(image_1, image_2)
def test_delta_with_more_info(self): image = Image(type='delta', version=99, base=83) self.assertEqual(hash(image), 0b00000000011000110000000001010011)
def test_delta_includes_base(self): image = Image(type='delta', version=3, base=2) self.assertEqual(hash(image), 0b00000000000000110000000000000010)
def test_full_hash_ignores_base(self): image = Image(type='full', version=3, base=2) self.assertEqual(hash(image), 0b00000000000000110000000000000000)
def test_full_hash(self): image = Image(type='full', version=3) self.assertEqual(hash(image), 0b00000000000000110000000000000000)
def test_explicit_phased_percentage(self): kws = dict(type='full', version=10) kws['phased-percentage'] = '39' image = Image(**kws) self.assertEqual(image.phased_percentage, 39)
def test_default_phased_percentage(self): image = Image(type='full', version=10) self.assertEqual(image.phased_percentage, 100)
def test_full_delta_with_base_inequal(self): image_1 = Image(type='full', version=400, base=300) image_2 = Image(type='delta', version=400, base=300) self.assertNotEqual(image_1, image_2)
def test_full_equal_ignores_missing_base(self): image_1 = Image(type='full', version=400, base=300) image_2 = Image(type='full', version=400) self.assertEqual(image_1, image_2)
def test_full_inequal(self): image_1 = Image(type='full', version=400) image_2 = Image(type='full', version=401) self.assertNotEqual(image_1, image_2)
def test_mixed_regime_reversed_rejects(self): self.assertRaises(AssertionError, hash, Image(type='delta', version=20130899, base=3))
def test_mixed_regime_full_okay(self): self.assertEqual(hash(Image(type='full', version=3, base=20130899)), 0b00000000000000110000000000000000)
def test_17bit_version_rejects(self): self.assertRaises(AssertionError, hash, Image(type='full', version=1 << 16))
def test_signed_version_rejects(self): self.assertRaises(AssertionError, hash, Image(type='full', version=-1))