Skip to content

Commit dd403c2

Browse files
authored
Merge pull request #184 from ligangty/release
Merge from main branch for release 1.2.1
2 parents eb68a14 + f1c2b40 commit dd403c2

11 files changed

+46
-48
lines changed

.github/workflows/unittests.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ jobs:
1616
strategy:
1717
fail-fast: false
1818
matrix:
19-
python-version: ["3.7", "3.8", "3.9"]
19+
python-version: ["3.8", "3.9"]
2020

2121
steps:
2222
- uses: actions/checkout@v3

charon/pkgs/npm.py

+9-4
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
import logging
1717
import os
1818
import sys
19-
from json import load, loads, dump, JSONDecodeError
19+
from json import load, loads, dump, JSONDecodeError, JSONEncoder
2020
import tarfile
2121
from tempfile import mkdtemp
2222
from typing import List, Set, Tuple
@@ -32,7 +32,7 @@
3232
from charon.pkgs.pkg_utils import upload_post_process, rollback_post_process
3333
from charon.utils.strings import remove_prefix
3434
from charon.utils.files import write_manifest
35-
from charon.utils.map import del_none
35+
from charon.utils.map import del_none, replace_field
3636

3737
logger = logging.getLogger(__name__)
3838

@@ -61,10 +61,15 @@ def __init__(self, metadata, is_version):
6161
self.dist_tags = {'latest': metadata.get('version')}
6262
self.versions = {metadata.get('version'): metadata}
6363
else:
64-
self.dist_tags = metadata.get('dist_tags', None)
64+
self.dist_tags = metadata.get('dist-tags', None)
6565
self.versions = metadata.get('versions', None)
6666

6767

68+
class NPMPackageMetadataEncoder(JSONEncoder):
69+
def default(self, o):
70+
return replace_field(del_none(o.__dict__.copy()), "dist_tags", "dist-tags")
71+
72+
6873
def handle_npm_uploading(
6974
tarball_path: str,
7075
product: str,
@@ -549,7 +554,7 @@ def _write_package_metadata_to_file(package_metadata: NPMPackageMetadata, root='
549554
final_package_metadata_path = os.path.join(root, package_metadata.name, PACKAGE_JSON)
550555
try:
551556
with open(final_package_metadata_path, mode='w', encoding='utf-8') as f:
552-
dump(del_none(package_metadata.__dict__.copy()), f)
557+
dump(obj=package_metadata, cls=NPMPackageMetadataEncoder, fp=f)
553558
return final_package_metadata_path
554559
except FileNotFoundError:
555560
logger.error(

charon/storage.py

+12-8
Original file line numberDiff line numberDiff line change
@@ -698,32 +698,36 @@ def list_folder_content(self, bucket_name: str, folder: str) -> List[str]:
698698
not in its subfolders.
699699
"""
700700
bucket = self.__get_bucket(bucket_name)
701+
701702
try:
703+
paginator = bucket.meta.client.get_paginator('list_objects_v2')
702704
if not folder or folder.strip() == "/" or folder.strip() == "":
703-
result = bucket.meta.client.list_objects(
705+
pages = paginator.paginate(
704706
Bucket=bucket.name,
705707
Delimiter='/'
706708
)
707709
else:
708710
prefix = folder if folder.endswith("/") else folder+"/"
709-
result = bucket.meta.client.list_objects(
711+
pages = paginator.paginate(
710712
Bucket=bucket.name,
711713
Prefix=prefix,
712714
Delimiter='/'
713715
)
716+
714717
except (ClientError, HTTPClientError) as e:
715718
logger.error("ERROR: Can not get contents of %s from bucket"
716719
" %s due to error: %s ", folder,
717720
bucket_name, e)
718721
return []
719722

720723
contents = []
721-
folders = result.get("CommonPrefixes")
722-
if folders:
723-
contents.extend([f.get("Prefix") for f in folders])
724-
files = result.get("Contents")
725-
if files:
726-
contents.extend([f.get("Key") for f in files])
724+
for page in pages:
725+
folders = page.get("CommonPrefixes")
726+
if folders:
727+
contents.extend([f.get("Prefix") for f in folders])
728+
files = page.get("Contents")
729+
if files:
730+
contents.extend([f.get("Key") for f in files])
727731
return contents
728732

729733
def file_exists_in_bucket(

charon/utils/map.py

+7
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,10 @@ def del_none(d):
55
elif isinstance(value, dict):
66
del_none(value)
77
return d
8+
9+
10+
def replace_field(d, field, new_field):
11+
if d[field]:
12+
d[new_field] = d[field]
13+
del d[field]
14+
return d

requirements.txt

+8-8
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
setuptools-rust==1.1.2
2-
jinja2==3.0.3
3-
boto3==1.20.45
4-
botocore==1.23.45
5-
click==8.0.3
6-
requests==2.27.1
7-
PyYAML==6.0
1+
setuptools-rust==1.7.0
2+
Jinja2==3.1.2
3+
boto3==1.28.46
4+
botocore==1.31.46
5+
click==8.1.7
6+
requests==2.31.0
7+
PyYAML==6.0.1
88
defusedxml==0.7.1
99
subresource-integrity==0.2
10-
jsonschema==3.2.0
10+
jsonschema==4.19.0

setup.py

+1-19
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,9 @@
1313
See the License for the specific language governing permissions and
1414
limitations under the License.
1515
"""
16-
17-
# !/usr/bin/env python
18-
19-
import re
20-
2116
from setuptools import setup, find_packages
2217

23-
version = "1.1.2"
18+
version = "1.2.1"
2419

2520
# f = open('README.md')
2621
# long_description = f.read().strip()
@@ -33,18 +28,6 @@
3328
in future. And Ronda service will be hosted in AWS S3.
3429
"""
3530

36-
37-
def _get_requirements(path):
38-
try:
39-
with open(path, encoding="utf-8") as f:
40-
packages = f.read().splitlines()
41-
except (IOError, OSError) as ex:
42-
raise RuntimeError(f"Can't open file with requirements: {ex}") from ex
43-
packages = (p.strip() for p in packages if not re.match(r'^\s*#', p))
44-
packages = list(filter(None, packages))
45-
return packages
46-
47-
4831
setup(
4932
zip_safe=True,
5033
name="charon",
@@ -62,7 +45,6 @@ def _get_requirements(path):
6245
author="RedHat EXD SPMM",
6346
license="APLv2",
6447
packages=find_packages(exclude=["ez_setup", "examples", "tests"]),
65-
install_requires=_get_requirements('requirements.txt'),
6648
package_data={'charon': ['schemas/*.json']},
6749
test_suite="tests",
6850
entry_points={

tests/test_npm_del.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ def __test_prefix(self, prefix: str = None):
8383
self.assertIn("\"versions\": {\"7.15.8\":", meta_content_client)
8484
self.assertNotIn("\"7.14.5\": {\"name\":", meta_content_client)
8585
self.assertIn("\"license\": \"MIT\"", meta_content_client)
86-
self.assertIn("\"dist_tags\": {\"latest\": \"7.15.8\"}", meta_content_client)
86+
self.assertIn("\"dist-tags\": {\"latest\": \"7.15.8\"}", meta_content_client)
8787

8888
test_tgz = os.path.join(INPUTS, "code-frame-7.15.8.tgz")
8989
handle_npm_del(

tests/test_npm_del_multi_tgts.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ def __test_prefix(self, prefix: str = None):
117117
"\"license\": \"MIT\"", meta_content_client, msg=f'{bucket_name}'
118118
)
119119
self.assertIn(
120-
"\"dist_tags\": {\"latest\": \"7.15.8\"}",
120+
"\"dist-tags\": {\"latest\": \"7.15.8\"}",
121121
meta_content_client, msg=f'{bucket_name}'
122122
)
123123

tests/test_npm_meta.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ def test_handle_npm_uploading_for_old_version(self):
4848
bucket = self.mock_s3.Bucket(MY_BUCKET)
4949
original_version_0_5_8_package_json = """
5050
{"name": "@redhat/kogito-tooling-workspace",
51-
"dist_tags": {"latest": "0.5.8"}, "versions": {"0.5.8": {"name":
51+
"dist-tags": {"latest": "0.5.8"}, "versions": {"0.5.8": {"name":
5252
"@redhat/kogito-tooling-workspace", "version": "0.5.8", "title": "0.5.8title",
5353
"description": "0.5.8description", "keywords": ["0.5.8"], "maintainers": [
5454
"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):
9898
def test_handle_npm_uploading_for_new_version(self):
9999
bucket = self.mock_s3.Bucket(MY_BUCKET)
100100
original_version_1_0_1_package_json = """
101-
{"name": "@redhat/kogito-tooling-workspace", "dist_tags": {"latest": "1.0.1"},
101+
{"name": "@redhat/kogito-tooling-workspace", "dist-tags": {"latest": "1.0.1"},
102102
"versions": {"1.0.1": {"name": "@redhat/kogito-tooling-workspace", "version": "1.0.1",
103103
"title": "1.0.1title", "description": "1.0.1description", "keywords": ["1.0.1"],
104104
"maintainers": ["1.0.1maintainer"], "repository": {"type": "git",

tests/test_npm_upload.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ def test_double_uploads(self):
8686
self.assertIn("\"7.15.8\": {\"name\":", meta_content_client)
8787
self.assertIn("\"7.14.5\": {\"name\":", meta_content_client)
8888
self.assertIn("\"license\": \"MIT\"", meta_content_client)
89-
self.assertIn("\"dist_tags\": {\"latest\": \"7.15.8\"}", meta_content_client)
89+
self.assertIn("\"dist-tags\": {\"latest\": \"7.15.8\"}", meta_content_client)
9090

9191
def __test_prefix(self, prefix: str = None):
9292
test_tgz = os.path.join(INPUTS, "code-frame-7.14.5.tgz")
@@ -131,4 +131,4 @@ def __test_prefix(self, prefix: str = None):
131131
self.assertIn("\"version\": \"7.14.5\"", meta_content_client)
132132
self.assertIn("\"versions\": {\"7.14.5\":", meta_content_client)
133133
self.assertIn("\"license\": \"MIT\"", meta_content_client)
134-
self.assertIn("\"dist_tags\": {\"latest\": \"7.14.5\"}", meta_content_client)
134+
self.assertIn("\"dist-tags\": {\"latest\": \"7.14.5\"}", meta_content_client)

tests/test_npm_upload_multi_tgts.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ def test_double_uploads(self):
121121
"\"license\": \"MIT\"", meta_content_client, msg=f'{bucket_name}'
122122
)
123123
self.assertIn(
124-
"\"dist_tags\": {\"latest\": \"7.15.8\"}", meta_content_client, msg=f'{bucket_name}'
124+
"\"dist-tags\": {\"latest\": \"7.15.8\"}", meta_content_client, msg=f'{bucket_name}'
125125
)
126126

127127
def __test_prefix(self, prefix: str = None):
@@ -192,6 +192,6 @@ def __test_prefix(self, prefix: str = None):
192192
msg=f'{bucket_name}'
193193
)
194194
self.assertIn(
195-
"\"dist_tags\": {\"latest\": \"7.14.5\"}",
195+
"\"dist-tags\": {\"latest\": \"7.14.5\"}",
196196
meta_content_client, msg=f'{bucket_name}'
197197
)

0 commit comments

Comments
 (0)