Skip to content

Commit 2617c6f

Browse files
committed
Fixed some of the log messages and CLI argument loading.
1 parent 20778cb commit 2617c6f

8 files changed

Lines changed: 64 additions & 43 deletions

File tree

src/same_version/checkers/checker.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,15 @@ class Checker():
1313
def __init__(self, extractor: Extractor, cli_args: Namespace):
1414
self.extractor = extractor
1515
self.cli_args = cli_args
16+
self._extracted_version: str | None = self.extractor.extract_version()
1617

1718
def create_pep440_version(self, version_str: str | None) -> packaging.version.Version | None:
1819
version_pep440 : packaging.version.Version | None = parse_version_pep440(version_str)
1920
return version_pep440
2021

2122
@property
2223
def target_version_str(self) -> str | None:
23-
return self.extractor.extract_version()
24+
return self._extracted_version
2425

2526
@property
2627
def target_version_pep440(self) -> packaging.version.Version | None:
@@ -54,13 +55,13 @@ def check(self, base_version_str: str | None) -> bool:
5455
return False
5556

5657
def _log_version_mismatch(self, base_version_str: str | None):
57-
logger.error(f"❌ Version mismatch: {self.target_name} {self.target_version_str} != base_version {base_version_str}")
58+
logger.error(f"❌ Version mismatch: {self.target_name} {self.target_version_str} != base version {base_version_str}")
5859

5960
def _log_missing_target(self, msg: str | None = None):
6061
if msg is None:
6162
msg = f"Data source for parameter {self.target_cli_parameter_name} does not exist: {self.target_name}"
6263

63-
if self.cli_args.fail_for_missing_file.lower() == 'true':
64+
if str(getattr(self.cli_args, 'fail_for_missing_file', '') or '').lower() == 'true':
6465
msg = "❌ " + msg
6566
logger.error(msg)
6667
else:

src/same_version/checkers/package_json_checker.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ def check(self, base_version_str: str | None) -> bool:
2727
target_version_semver = parse_version_semver(target_version_str)
2828

2929
if base_version_semver != target_version_semver:
30-
logger.error(f"❌ Version mismatch: {target_name} {target_version_str} != base_version {base_version_str}")
30+
logger.error(f"❌ Version mismatch: {target_name} {target_version_str} != base version {base_version_str}")
3131
return False
3232
else:
3333
return True

src/same_version/extractors/cli_extractor.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,13 @@ def __init__(self, cli_args: Namespace):
1212

1313
def extract_version(self) -> str | None:
1414
if self.target_exists:
15-
return self._cli_args.base_version
15+
return getattr(self._cli_args, 'base_version', None)
1616
else:
1717
return None
1818

1919
@property
2020
def target_exists(self) -> bool:
21-
return hasattr(self._cli_args, 'base_version') and self._cli_args.base_version is not None
21+
return hasattr(self._cli_args, 'base_version') and getattr(self._cli_args, 'base_version', None) is not None
2222

2323
@property
2424
def target_name(self) -> str | None:

src/same_version/extractors/extractor.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@ def extract_version(self) -> str | None:
2323
data: dict = self._get_data()
2424
version = self._get_version_from_data(data=data)
2525
if not version:
26-
self._log_missing_version_error(data=data)
26+
if self.target_exists:
27+
# only print this error if the target exists
28+
self._log_missing_version_error(data=data)
2729
return None
2830
self._log_found_version_info(version=version, data=data)
2931
return version

src/same_version/extractors/github_event_extractor.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ class GitHubEventExtractor(Extractor):
1111
def __init__(self, cli_args: Namespace):
1212
super().__init__()
1313
self._data: dict[str, str | None] = {
14-
'github_event_name': cli_args.github_event_name,
15-
'github_event_ref': cli_args.github_event_ref,
16-
'github_event_release_tag': cli_args.github_event_release_tag
14+
'github_event_name': getattr(cli_args, 'github_event_name', None),
15+
'github_event_ref': getattr(cli_args, 'github_event_ref', None),
16+
'github_event_release_tag': getattr(cli_args, 'github_event_release_tag', None)
1717
}
1818

1919
@property
@@ -22,7 +22,7 @@ def target_exists(self) -> bool:
2222

2323
@property
2424
def target_name(self) -> str | None:
25-
return self._data['github_event_name']
25+
return self._data.get('github_event_name', None)
2626

2727
@property
2828
def target_cli_parameter_name(self) -> str | None:

src/same_version/extractors/json_extractor.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ class JsonExtractor(FileExtractor):
77

88
def _get_data(self) -> dict:
99
data = {}
10-
if self.target_file_path:
10+
if self.target_file_path and self.target_exists:
1111
with open(self.target_file_path, 'r', encoding='utf-8') as f:
1212
data = json.load(f)
1313
return data

src/same_version/extractors/setup_py_extractor.py

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import logging
22
import subprocess
3-
import sys
43
from argparse import Namespace
54

65
from same_version.extractors.file_extractor import FileExtractor
@@ -20,13 +19,16 @@ def __init__(self, cli_args: Namespace):
2019

2120
def _get_data(self) -> dict:
2221
data = {}
23-
24-
try:
25-
output = subprocess.check_output(['python', str(self.target_file_path), '--version'], stderr=subprocess.STDOUT)
26-
data['version'] = output.decode('utf-8').strip()
27-
except subprocess.CalledProcessError as e:
28-
logger.error(f"❌ Error running {self.target_name} --version:\n{e.output.decode('utf-8')}")
29-
sys.exit(1)
22+
23+
if not self.target_exists:
24+
data['version'] = None
25+
else:
26+
try:
27+
output = subprocess.check_output(['python', str(self.target_file_path), '--version'], stderr=subprocess.STDOUT)
28+
data['version'] = output.decode('utf-8').strip()
29+
except subprocess.CalledProcessError as e:
30+
logger.error(f"❌ Error running {self.target_name} --version:\n{e.output.decode('utf-8')}")
31+
data['version'] = None
3032

3133
return data
3234

src/same_version/main.py

Lines changed: 39 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -29,20 +29,20 @@
2929
def parse_args() -> argparse.Namespace:
3030
parser = argparse.ArgumentParser(description="Check metadata files for consistent software versions using canonical PEP 440 and SemVer")
3131
parser.add_argument('--base-version', required=False, help='A base version from which to check')
32-
parser.add_argument('--fail-for-missing-file', required=False, help='Fail for any checked file that is missing')
33-
parser.add_argument('--check-citation-cff', required=False, help='Check CITATION.cff? (true/false)')
34-
parser.add_argument('--citation-cff-path', required=False, help='Path to CITATION.cff file')
35-
parser.add_argument('--check-pyproject-toml', required=False, help='Check pyproject.toml? (true/false)')
36-
parser.add_argument('--pyproject-toml-path', required=False, help='Path to pyproject.toml file')
37-
parser.add_argument('--check-codemeta-json', required=False, help='Check codemeta.json? (true/false)')
38-
parser.add_argument('--codemeta-json-path', required=False, help='Path to codemeta.json')
39-
parser.add_argument('--check-zenodo-json', required=False, help='Check .zenodo.json? (true/false)')
40-
parser.add_argument('--zenodo-json-path', required=False, help='Path to .zenodo.json')
41-
parser.add_argument('--check-package-json', required=False, help='Check package.json? (true/false)')
42-
parser.add_argument('--package-json-path', required=False, help='Path to package.json')
43-
parser.add_argument('--check-setup-py', required=False, help='Check setup.py? (true/false)')
44-
parser.add_argument('--setup-py-path', required=False, help='Path to setup.py')
45-
parser.add_argument('--check-github-event', required=False, help='Check GitHub events? (true/false)')
32+
parser.add_argument('--fail-for-missing-file', default=False, required=False, help='Fail for any checked file that is missing')
33+
parser.add_argument('--check-citation-cff', default=True, required=False, help='Check CITATION.cff? (true/false)')
34+
parser.add_argument('--citation-cff-path', default='CITATION.cff', required=False, help='Path to CITATION.cff file')
35+
parser.add_argument('--check-pyproject-toml', default=True, required=False, help='Check pyproject.toml? (true/false)')
36+
parser.add_argument('--pyproject-toml-path', default='pyproject.toml', required=False, help='Path to pyproject.toml file')
37+
parser.add_argument('--check-codemeta-json', default=True, required=False, help='Check codemeta.json? (true/false)')
38+
parser.add_argument('--codemeta-json-path', default='codemeta.json', required=False, help='Path to codemeta.json')
39+
parser.add_argument('--check-zenodo-json', default=True, required=False, help='Check .zenodo.json? (true/false)')
40+
parser.add_argument('--zenodo-json-path', default='.zenodo.json', required=False, help='Path to .zenodo.json')
41+
parser.add_argument('--check-package-json', default=True, required=False, help='Check package.json? (true/false)')
42+
parser.add_argument('--package-json-path', default='package.json', required=False, help='Path to package.json')
43+
parser.add_argument('--check-setup-py', default=True, required=False, help='Check setup.py? (true/false)')
44+
parser.add_argument('--setup-py-path', default='setup.py', required=False, help='Path to setup.py')
45+
parser.add_argument('--check-github-event', default=False, required=False, help='Check GitHub events? (true/false)')
4646
parser.add_argument('--github-event-name', required=False, help='GitHub event name (push/release)')
4747
parser.add_argument('--github-event-ref', required=False, help='GitHub ref (for push event)')
4848
parser.add_argument('--github-event-release-tag', required=False, help='GitHub release tag name (for release event)')
@@ -51,67 +51,83 @@ def parse_args() -> argparse.Namespace:
5151

5252
# --- Main ---
5353

54+
5455
def main():
5556
cli_args: argparse.Namespace = parse_args()
5657

5758
base_version_str: str | None = CliExtractor(cli_args=cli_args).extract_version()
5859

5960
checkers: list[Checker] = []
6061

62+
logger.info('📦 Extracting software version metadata...')
63+
6164
# GitHub Event
62-
if cli_args.check_github_event.lower() == 'true':
65+
if str(getattr(cli_args, 'check_github_event', '') or '').lower() == 'true':
6366
github_event_extractor: GitHubEventExtractor = GitHubEventExtractor(cli_args=cli_args)
6467
github_event_checker: GitHubEventChecker = GitHubEventChecker(extractor=github_event_extractor, cli_args=cli_args)
6568
checkers.append(github_event_checker)
6669

70+
6771
# CITATION.cff
68-
if cli_args.check_citation_cff.lower() == 'true':
72+
if str(getattr(cli_args, 'check_citation_cff', '') or '').lower() == 'true':
6973
citation_cff_extractor: CitationCffExtractor = CitationCffExtractor(cli_args=cli_args)
7074
citation_cff_checker: CitationCffChecker = CitationCffChecker(extractor=citation_cff_extractor, cli_args=cli_args)
7175
checkers.append(citation_cff_checker)
7276

77+
78+
7379
# pyproject.toml
74-
if cli_args.check_pyproject_toml.lower() == 'true':
80+
if str(getattr(cli_args, 'check_pyproject_toml', '') or '').lower() == 'true':
7581
pyproject_toml_extractor: PyprojectTomlExtractor = PyprojectTomlExtractor(cli_args=cli_args)
7682
pyproject_toml_checker: PyprojectTomlChecker = PyprojectTomlChecker(extractor=pyproject_toml_extractor, cli_args=cli_args)
7783
checkers.append(pyproject_toml_checker)
7884

85+
7986
# setup.py
80-
if cli_args.check_setup_py.lower() == 'true':
87+
if str(getattr(cli_args, 'check_setup_py', '') or '').lower() == 'true':
8188
setup_py_extractor: SetupPyExtractor = SetupPyExtractor(cli_args=cli_args)
8289
setup_py_checker: SetupPyChecker = SetupPyChecker(extractor=setup_py_extractor, cli_args=cli_args)
8390
checkers.append(setup_py_checker)
8491

92+
93+
8594
# package.json
86-
if cli_args.check_package_json.lower() == 'true':
95+
if str(getattr(cli_args, 'check_package_json', '') or '').lower() == 'true':
8796
package_json_extractor: PackageJsonExtractor = PackageJsonExtractor(cli_args=cli_args)
8897
package_json_checker: PackageJsonChecker = PackageJsonChecker(extractor=package_json_extractor, cli_args=cli_args)
8998
checkers.append(package_json_checker)
90-
99+
100+
101+
91102
# codemeta.json
92-
if cli_args.check_codemeta_json.lower() == 'true':
103+
if str(getattr(cli_args, 'check_codemeta_json', '') or '').lower() == 'true':
93104
codemeta_json_extractor: CodeMetaJsonExtractor = CodeMetaJsonExtractor(cli_args=cli_args)
94105
codemeta_json_checker: CodeMetaJsonChecker = CodeMetaJsonChecker(extractor=codemeta_json_extractor, cli_args=cli_args)
95106
checkers.append(codemeta_json_checker)
96107

108+
109+
97110
# .zenodo.json
98-
if cli_args.check_zenodo_json.lower() == 'true':
111+
if str(getattr(cli_args, 'check_zenodo_json', '') or '').lower() == 'true':
99112
zenodo_json_extractor: ZenodoJsonExtractor = ZenodoJsonExtractor(cli_args=cli_args)
100113
zenodo_json_checker: ZenodoJsonChecker = ZenodoJsonChecker(extractor=zenodo_json_extractor, cli_args=cli_args)
101114
checkers.append(zenodo_json_checker)
102115

103116
# Loop through checkers
117+
logger.info('📦 Checking software version metadata...')
118+
104119
for checker in checkers:
105120
# find the base version if it does not exist
106121
if base_version_str is None and checker.target_version_str is not None:
107122
base_version_str = checker.target_version_str
108-
logger.info(f'📦 Using base version ({base_version_str}) from {checker.target_name}')
123+
logger.info(f'📦 Using {checker.target_name} for base version: {base_version_str}')
109124
else:
110125
checker.check(base_version_str=base_version_str)
111126

112127
# Final result
113128

114129
if get_log_collector().get_error_logs():
130+
logger.error("❌ Some versions do not match!")
115131
sys.exit(1)
116132
else:
117133
if base_version_str is None:

0 commit comments

Comments
 (0)