diff --git a/charon/pkgs/npm.py b/charon/pkgs/npm.py index 7c160673..61ed549a 100644 --- a/charon/pkgs/npm.py +++ b/charon/pkgs/npm.py @@ -16,7 +16,7 @@ import logging import os import sys -from json import load, loads, dump, JSONDecodeError +from json import load, loads, dump, JSONDecodeError, JSONEncoder import tarfile from tempfile import mkdtemp from typing import List, Set, Tuple @@ -32,7 +32,7 @@ from charon.pkgs.pkg_utils import upload_post_process, rollback_post_process from charon.utils.strings import remove_prefix from charon.utils.files import write_manifest -from charon.utils.map import del_none +from charon.utils.map import del_none, replace_field logger = logging.getLogger(__name__) @@ -61,10 +61,15 @@ def __init__(self, metadata, is_version): self.dist_tags = {'latest': metadata.get('version')} self.versions = {metadata.get('version'): metadata} else: - self.dist_tags = metadata.get('dist_tags', None) + self.dist_tags = metadata.get('dist-tags', None) self.versions = metadata.get('versions', None) +class NPMPackageMetadataEncoder(JSONEncoder): + def default(self, o): + return replace_field(del_none(o.__dict__.copy()), "dist_tags", "dist-tags") + + def handle_npm_uploading( tarball_path: str, product: str, @@ -549,7 +554,7 @@ def _write_package_metadata_to_file(package_metadata: NPMPackageMetadata, root=' final_package_metadata_path = os.path.join(root, package_metadata.name, PACKAGE_JSON) try: with open(final_package_metadata_path, mode='w', encoding='utf-8') as f: - dump(del_none(package_metadata.__dict__.copy()), f) + dump(obj=package_metadata, cls=NPMPackageMetadataEncoder, fp=f) return final_package_metadata_path except FileNotFoundError: logger.error( diff --git a/charon/utils/map.py b/charon/utils/map.py index 606b0d9e..fe602ee9 100644 --- a/charon/utils/map.py +++ b/charon/utils/map.py @@ -5,3 +5,10 @@ def del_none(d): elif isinstance(value, dict): del_none(value) return d + + +def replace_field(d, field, new_field): + if d[field]: + d[new_field] = d[field] + del d[field] + return d diff --git a/tests/test_npm_del.py b/tests/test_npm_del.py index ad2b1f8e..8d6a6df0 100644 --- a/tests/test_npm_del.py +++ b/tests/test_npm_del.py @@ -83,7 +83,7 @@ def __test_prefix(self, prefix: str = None): self.assertIn("\"versions\": {\"7.15.8\":", meta_content_client) self.assertNotIn("\"7.14.5\": {\"name\":", meta_content_client) self.assertIn("\"license\": \"MIT\"", meta_content_client) - self.assertIn("\"dist_tags\": {\"latest\": \"7.15.8\"}", meta_content_client) + self.assertIn("\"dist-tags\": {\"latest\": \"7.15.8\"}", meta_content_client) test_tgz = os.path.join(INPUTS, "code-frame-7.15.8.tgz") handle_npm_del( diff --git a/tests/test_npm_del_multi_tgts.py b/tests/test_npm_del_multi_tgts.py index 1746fba5..ac1e2c32 100644 --- a/tests/test_npm_del_multi_tgts.py +++ b/tests/test_npm_del_multi_tgts.py @@ -117,7 +117,7 @@ def __test_prefix(self, prefix: str = None): "\"license\": \"MIT\"", meta_content_client, msg=f'{bucket_name}' ) self.assertIn( - "\"dist_tags\": {\"latest\": \"7.15.8\"}", + "\"dist-tags\": {\"latest\": \"7.15.8\"}", meta_content_client, msg=f'{bucket_name}' ) diff --git a/tests/test_npm_meta.py b/tests/test_npm_meta.py index df660492..b9cae1ab 100644 --- a/tests/test_npm_meta.py +++ b/tests/test_npm_meta.py @@ -48,7 +48,7 @@ def test_handle_npm_uploading_for_old_version(self): bucket = self.mock_s3.Bucket(MY_BUCKET) original_version_0_5_8_package_json = """ {"name": "@redhat/kogito-tooling-workspace", - "dist_tags": {"latest": "0.5.8"}, "versions": {"0.5.8": {"name": + "dist-tags": {"latest": "0.5.8"}, "versions": {"0.5.8": {"name": "@redhat/kogito-tooling-workspace", "version": "0.5.8", "title": "0.5.8title", "description": "0.5.8description", "keywords": ["0.5.8"], "maintainers": [ "0.5.8maintainer"], "repository": {"type": "git", "url": "https://github.com/0.5.8.git"}, @@ -98,7 +98,7 @@ def test_handle_npm_uploading_for_old_version(self): def test_handle_npm_uploading_for_new_version(self): bucket = self.mock_s3.Bucket(MY_BUCKET) original_version_1_0_1_package_json = """ - {"name": "@redhat/kogito-tooling-workspace", "dist_tags": {"latest": "1.0.1"}, + {"name": "@redhat/kogito-tooling-workspace", "dist-tags": {"latest": "1.0.1"}, "versions": {"1.0.1": {"name": "@redhat/kogito-tooling-workspace", "version": "1.0.1", "title": "1.0.1title", "description": "1.0.1description", "keywords": ["1.0.1"], "maintainers": ["1.0.1maintainer"], "repository": {"type": "git", diff --git a/tests/test_npm_upload.py b/tests/test_npm_upload.py index 1130b4d0..941f98cc 100644 --- a/tests/test_npm_upload.py +++ b/tests/test_npm_upload.py @@ -86,7 +86,7 @@ def test_double_uploads(self): self.assertIn("\"7.15.8\": {\"name\":", meta_content_client) self.assertIn("\"7.14.5\": {\"name\":", meta_content_client) self.assertIn("\"license\": \"MIT\"", meta_content_client) - self.assertIn("\"dist_tags\": {\"latest\": \"7.15.8\"}", meta_content_client) + self.assertIn("\"dist-tags\": {\"latest\": \"7.15.8\"}", meta_content_client) def __test_prefix(self, prefix: str = None): test_tgz = os.path.join(INPUTS, "code-frame-7.14.5.tgz") @@ -131,4 +131,4 @@ def __test_prefix(self, prefix: str = None): self.assertIn("\"version\": \"7.14.5\"", meta_content_client) self.assertIn("\"versions\": {\"7.14.5\":", meta_content_client) self.assertIn("\"license\": \"MIT\"", meta_content_client) - self.assertIn("\"dist_tags\": {\"latest\": \"7.14.5\"}", meta_content_client) + self.assertIn("\"dist-tags\": {\"latest\": \"7.14.5\"}", meta_content_client) diff --git a/tests/test_npm_upload_multi_tgts.py b/tests/test_npm_upload_multi_tgts.py index d95868bd..4827e298 100644 --- a/tests/test_npm_upload_multi_tgts.py +++ b/tests/test_npm_upload_multi_tgts.py @@ -121,7 +121,7 @@ def test_double_uploads(self): "\"license\": \"MIT\"", meta_content_client, msg=f'{bucket_name}' ) self.assertIn( - "\"dist_tags\": {\"latest\": \"7.15.8\"}", meta_content_client, msg=f'{bucket_name}' + "\"dist-tags\": {\"latest\": \"7.15.8\"}", meta_content_client, msg=f'{bucket_name}' ) def __test_prefix(self, prefix: str = None): @@ -192,6 +192,6 @@ def __test_prefix(self, prefix: str = None): msg=f'{bucket_name}' ) self.assertIn( - "\"dist_tags\": {\"latest\": \"7.14.5\"}", + "\"dist-tags\": {\"latest\": \"7.14.5\"}", meta_content_client, msg=f'{bucket_name}' )