import json from image.docker.interfaces import ContentRetriever class ContentRetrieverForTesting(ContentRetriever): def __init__(self, digests=None): self.digests = digests or {} def add_digest(self, digest, content): self.digests[digest] = content def get_manifest_bytes_with_digest(self, digest): return self.digests.get(digest) def get_blob_bytes_with_digest(self, digest): return self.digests.get(digest) @classmethod def for_config(cls, config_obj, digest, size, ensure_ascii=True): config_str = json.dumps(config_obj, ensure_ascii=ensure_ascii) padded_string = config_str + ' ' * (size - len(config_str)) digests = {} digests[digest] = padded_string return ContentRetrieverForTesting(digests) class _CustomEncoder(json.JSONEncoder): def encode(self, o): encoded = super(_CustomEncoder, self).encode(o) if isinstance(o, basestring): encoded = encoded.replace('<', '\\u003c') encoded = encoded.replace('>', '\\u003e') encoded = encoded.replace('&', '\\u0026') return encoded def to_canonical_json(value, ensure_ascii=True, indent=None): """ Returns the canonical JSON string form of the given value, as per the guidelines in https://github.com/docker/distribution/blob/master/docs/spec/json.md. `indent` is allowed only for the purposes of indenting for debugging. """ return json.dumps(value, ensure_ascii=ensure_ascii, sort_keys=True, separators=(',', ':'), cls=_CustomEncoder, indent=indent)