From 11392444aa12426857aeedb30ce152564a160d99 Mon Sep 17 00:00:00 2001
From: Thomas Reifenberger <tom-mi@users.noreply.github.com>
Date: Sat, 14 Nov 2020 13:36:37 +0100
Subject: [PATCH] Also encode info as json

---
 mkp/__init__.py              | 22 ++++++++++++---
 test/integration/test_mkp.py | 52 ++++++++++++++++++++++++++----------
 2 files changed, 57 insertions(+), 17 deletions(-)

diff --git a/mkp/__init__.py b/mkp/__init__.py
index 9a152b3..d1335f3 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 90c3e77..3ea2273 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
-- 
GitLab