diff --git a/mkp/__init__.py b/mkp/__init__.py index 9a152b3d00c086b946733774d23ee8d4f2a15a86..d1335f3d5d775b10211801c32acc6f7da57a007c 100644 --- a/mkp/__init__.py +++ b/mkp/__init__.py @@ -1,24 +1,23 @@ import ast import io +import json import os import os.path import pprint import tarfile from ._version import get_versions + __version__ = get_versions()['version'] del get_versions - _DIRECTORIES = [ 'agents', 'checkman', 'checks', 'doc', 'inventory', 'notifications', 'pnp-templates', 'web', ] - _VERSION_PACKAGED = 'python-mkp' - _DIST_DIR = 'dist' @@ -83,6 +82,7 @@ def pack_to_bytes(info, path): bytes_io = io.BytesIO() with tarfile.open(fileobj=bytes_io, mode='w:gz') as archive: _add_to_archive(archive, 'info', encode_info(info)) + _add_to_archive(archive, 'info.json', encode_info_json(info)) for directory in _DIRECTORIES: files = info['files'].get(directory, []) @@ -124,6 +124,10 @@ def encode_info(info): return pprint.pformat(info).encode() +def encode_info_json(info): + return json.dumps(info).encode() + + def decode_info(info_bytes): return ast.literal_eval(info_bytes.decode()) @@ -133,15 +137,27 @@ class Package(object): def __init__(self, fileobj): self.archive = tarfile.open(fileobj=fileobj) self._info = self._get_info() + self._json_info = self._get_json_info() def _get_info(self): info_file = self.archive.extractfile('info') return decode_info(info_file.read()) + def _get_json_info(self): + try: + info_file = self.archive.extractfile('info.json') + return json.loads(info_file.read()) + except KeyError: + return None + @property def info(self): return self._info + @property + def json_info(self): + return self._json_info + def extract_files(self, path): for directory in _DIRECTORIES: self._extract_files_in_directory(path, directory) diff --git a/test/integration/test_mkp.py b/test/integration/test_mkp.py index 90c3e7749d084ce2db80f8a73595c6fb6fdc4b9b..3ea2273f80786d6944ecb1aff66333f8137cf665 100644 --- a/test/integration/test_mkp.py +++ b/test/integration/test_mkp.py @@ -2,6 +2,8 @@ import ast import io import tarfile +import pytest + import mkp DIRECTORIES = [ @@ -10,6 +12,23 @@ DIRECTORIES = [ ] +@pytest.fixture +def sample_files(tmpdir): + tmpdir.join('agents', 'special', 'agent_test').write_binary(b'hello', ensure=True) + tmpdir.join('checks', 'foo').write_binary(b'Check Me!', ensure=True) + + +@pytest.fixture +def sample_info(): + return { + 'author': 'John Doe', + 'name': 'foo', + 'version': '42', + 'version.min_required': '1.2.6p5', + 'version.usable_until': None, + } + + def test_load_bytes(original_mkp_file): package = mkp.load_bytes(original_mkp_file) @@ -130,18 +149,8 @@ def test_pack_and_unpack_covers_all_known_directories(tmpdir): assert dest.join(directory, 'test').exists() -def test_dist(tmpdir): - tmpdir.join('agents', 'special', 'agent_test').write_binary(b'hello', ensure=True) - tmpdir.join('checks', 'foo').write_binary(b'Check Me!', ensure=True) - info = { - 'author': 'John Doe', - 'name': 'foo', - 'version': '42', - 'version.min_required': '1.2.6p5', - 'version.usable_until': None, - } - - mkp.dist(info, str(tmpdir)) +def test_dist(tmpdir, sample_files, sample_info): + mkp.dist(sample_info, str(tmpdir)) assert tmpdir.join('dist', 'foo-42.mkp').exists() package = mkp.load_file(str(tmpdir.join('dist', 'foo-42.mkp'))) @@ -156,8 +165,23 @@ def test_dist(tmpdir): assert package.info['version.usable_until'] is None -def test_dist_uses_script_path_when_no_path_is_given(tmpdir): +def test_dist_json(tmpdir, sample_files, sample_info): + mkp.dist(sample_info, str(tmpdir)) + + assert tmpdir.join('dist', 'foo-42.mkp').exists() + package = mkp.load_file(str(tmpdir.join('dist', 'foo-42.mkp'))) + assert package.json_info['author'] == 'John Doe' + assert package.json_info['name'] == 'foo' + assert package.json_info['files']['agents'] == ['special/agent_test'] + assert package.json_info['files']['checks'] == ['foo'] + assert package.json_info['num_files'] == 2 + assert package.json_info['version'] == '42' + assert package.json_info['version.packaged'] == 'python-mkp' + assert package.json_info['version.min_required'] == '1.2.6p5' + assert package.json_info['version.usable_until'] is None + +def test_dist_uses_script_path_when_no_path_is_given(tmpdir): script = tmpdir.join('dist.py') script.write_text(u'''#!/usr/bin/env python @@ -184,4 +208,4 @@ dist({ assert package.info['files']['checks'] == ['foo'] assert package.info['version'] == '42' assert package.info['version.packaged'] == 'python-mkp' - assert package.info['num_files'] == 2 \ No newline at end of file + assert package.info['num_files'] == 2