Implement "ManifestParserFactory.new_from_archive" API

This commit is contained in:
Ivan Kravets
2020-06-15 22:05:59 +03:00
parent d3fd115743
commit a9c13aa20e
3 changed files with 29 additions and 1 deletions

View File

@ -17,6 +17,7 @@ import io
import json
import os
import re
import tarfile
import requests
@ -109,6 +110,17 @@ class ManifestParserFactory(object):
remote_url,
)
@staticmethod
def new_from_archive(path):
assert path.endswith("tar.gz")
with tarfile.open(path, mode="r:gz") as tf:
for t in sorted(ManifestFileType.items().values()):
try:
return ManifestParserFactory.new(tf.extractfile(t).read(), t)
except KeyError:
pass
raise UnknownManifestError("Unknown manifest file type in %s archive" % path)
@staticmethod
def new( # pylint: disable=redefined-builtin
contents, type, remote_url=None, package_dir=None

View File

@ -43,7 +43,7 @@ class PackageType(object):
def from_archive(cls, path):
assert path.endswith("tar.gz")
manifest_map = cls.get_manifest_map()
with tarfile.open(path, mode="r|gz") as tf:
with tarfile.open(path, mode="r:gz") as tf:
for t in sorted(cls.items().values()):
for manifest in manifest_map[t]:
try:

View File

@ -14,6 +14,7 @@
import os
import re
import tarfile
import jsondiff
import pytest
@ -790,6 +791,21 @@ def test_examples_from_dir(tmpdir_factory):
)
def test_parser_from_archive(tmpdir_factory):
pkg_dir = tmpdir_factory.mktemp("package")
pkg_dir.join("package.json").write('{"name": "package.json"}')
pkg_dir.join("library.json").write('{"name": "library.json"}')
pkg_dir.join("library.properties").write("name=library.properties")
archive_path = os.path.join(str(pkg_dir), "package.tar.gz")
with tarfile.open(archive_path, mode="w|gz") as tf:
for item in os.listdir(str(pkg_dir)):
tf.add(os.path.join(str(pkg_dir), item), item)
data = parser.ManifestParserFactory.new_from_archive(archive_path).as_dict()
assert data["name"] == "library.json"
def test_broken_schemas():
# missing required field
with pytest.raises(