Skip to content

Commit 2c8d06b

Browse files
authored
Merge pull request #16 from willynilly/develop
Fixes issue #4. Updates to 5.1.0
2 parents aa5c0b4 + 1b3414f commit 2c8d06b

10 files changed

Lines changed: 93 additions & 15 deletions

File tree

.github/workflows/check-same-version.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ jobs:
2626
cache: 'pip' # optional and only works for Python projects
2727

2828
- name: Run same-version
29-
uses: willynilly/same-version@v5.0.0
29+
uses: willynilly/same-version@v5.1.0
3030
with:
3131
fail_for_missing_file: false
3232
check_github_event: true
@@ -42,6 +42,7 @@ jobs:
4242
check_zenodo_json: true
4343
zenodo_json_path: .zenodo.json
4444
check_package_json: false
45+
check_setup_cfg: false
4546
check_setup_py: false
4647
check_r_description: false
4748
check_composer_json: false

CITATION.cff

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ keywords:
3434
- metadata
3535
- harmonization
3636
license: Apache-2.0
37-
version: "5.0.0"
37+
version: "5.1.0"
3838
date-released: "2025-06-10"
3939
references:
4040
- title: Citation File Format

README.md

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ This workflow runs after the tag or release exists and can report problems, but
5757
- `CITATION.cff`
5858
- `pyproject.toml` (Python)
5959
- `setup.py` (Python)
60+
- `setup.cfg` (Python)
6061
- Python files with `__version__` assignment
6162
- `codemeta.json` (General)
6263
- `.zenodo.json` (General)
@@ -147,6 +148,7 @@ For those use cases, specialized dependency resolution libraries (e.g. `packagin
147148
|------------------|-------------------------|----------------|
148149
| `CITATION.cff` | PEP 440 / free text | Verple |
149150
| `pyproject.toml` | PEP 440 | Verple |
151+
| `setup.cfg` | PEP 440 | Verple |
150152
| `setup.py` | PEP 440 | Verple |
151153
| `package.json` | SemVer | Verple |
152154
| `codemeta.json` | Free text | Verple |
@@ -186,6 +188,8 @@ For those use cases, specialized dependency resolution libraries (e.g. `packagin
186188
| `--package-json-path` | `package_json_path` | Path to `package.json` | No | `package.json` |
187189
| `--check-setup-py` | `check_setup_py` | Check `setup.py`? (`true/false`) | No | `true` |
188190
| `--setup-py-path` | `setup_py_path` | Path to `setup.py` | No | `setup.py` |
191+
| `--check-setup-cfg` | `check_setup_cfg` | Check `setup.cfg`? (`true/false`) | No | `true` |
192+
| `--setup-cfg-path` | `setup_cfg_path` | Path to `setup.cfg` | No | `setup.cfg` |
189193
| `--check-py-version-assignment` | `check_py_version_assignment` | Check Python file with `__version__` assignment? (`true/false`) | No | `false` |
190194
| `--py-version-assignment-path` | `py_version_assignment_path` | Path to Python file with `__version__` assignment | No | *(empty)* |
191195
| `--check-composer-json` | `check_composer_json` | Check `composer.json`? (`true/false`) | No | `true` |
@@ -255,7 +259,7 @@ jobs:
255259
python-version: ">=3.10"
256260

257261
- name: Run same-version
258-
uses: willynilly/same-version@v5.0.0
262+
uses: willynilly/same-version@v5.1.0
259263
with:
260264
fail_for_missing_file: false
261265
check_github_event: true
@@ -266,6 +270,7 @@ jobs:
266270
check_citation_cff: true
267271
check_codemeta_json: true
268272
check_zenodo_json: true
273+
check_setup_cfg: false
269274
check_setup_py: false
270275
check_r_description: false
271276
check_cargo_toml: false
@@ -304,7 +309,7 @@ jobs:
304309
python-version: ">=3.10"
305310

306311
- name: Run same-version
307-
uses: willynilly/same-version@v5.0.0
312+
uses: willynilly/same-version@v5.1.0
308313
with:
309314
fail_for_missing_file: false
310315
check_github_event: true
@@ -315,6 +320,7 @@ jobs:
315320
check_citation_cff: true
316321
check_codemeta_json: true
317322
check_zenodo_json: true
323+
check_setup_cfg: false
318324
check_setup_py: false
319325
check_r_description: false
320326
check_cargo_toml: false
@@ -341,7 +347,7 @@ Add to your `.pre-commit-config.yaml`:
341347
```yaml
342348
repos:
343349
- repo: https://github.com/willynilly/same-version
344-
rev: v5.0.0 # Use latest tag
350+
rev: v5.1.0 # Use latest tag
345351
hooks:
346352
- id: same-version
347353
stages: [pre-commit, pre-push]

action.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,14 @@ inputs:
105105
description: 'Path to Cargo.toml'
106106
required: false
107107
default: 'Cargo.toml'
108+
check_setup_cfg:
109+
description: 'Check setup.cfg? (true/false)'
110+
required: false
111+
default: 'true'
112+
setup_cfg_path:
113+
description: 'Path to setup.cfg'
114+
required: false
115+
default: 'setup.cfg'
108116
check_py_version_assignment:
109117
description: 'Check Python file with __version__ assignment? (true/false)'
110118
required: false

example.pre-commit-config.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
repos:
22
- repo: https://github.com/willynilly/same-version
3-
rev: v5.0.0 # Use latest tag
3+
rev: v5.1.0 # Use latest tag
44
hooks:
55
- id: same-version
66
stages: [pre-commit, pre-push]

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
44

55
[project]
66
name = "same-version"
7-
version = "5.0.0"
7+
version = "5.1.0"
88
description = "Automatically ensures your software version metadata is consistent across key project files."
99
readme = "README.md"
1010
requires-python = ">=3.10"
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
from argparse import Namespace
2+
3+
from same_version.checkers.file_checker import FileChecker
4+
from same_version.extractors.setup_cfg_extractor import SetupCfgExtractor
5+
6+
7+
class SetupCfgChecker(FileChecker):
8+
9+
def __init__(self, extractor: SetupCfgExtractor, cli_args: Namespace):
10+
super().__init__(extractor=extractor, cli_args=cli_args)
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import configparser
2+
3+
from same_version.extractors.file_extractor import FileExtractor
4+
5+
6+
class IniExtractor(FileExtractor):
7+
8+
def _get_data(self) -> dict:
9+
data = {}
10+
if self.target_file_path and self.target_exists:
11+
12+
config = configparser.ConfigParser()
13+
14+
# configparser lowercases keys by default — we'll preserve case sensitivity for safety
15+
setattr(config, 'optionxform', str)
16+
config.read(self.target_file_path)
17+
data['config'] = config
18+
19+
return data
20+
21+
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
from argparse import Namespace
2+
3+
from same_version.extractors.ini_extractor import IniExtractor
4+
5+
6+
class SetupCfgExtractor(IniExtractor):
7+
8+
def __init__(self, cli_args: Namespace):
9+
target_cli_parameter_name: str = '--setup-cfg-path'
10+
default_target_name: str = "setup.cfg"
11+
super().__init__(
12+
target_file_path=self._create_target_file_path_from_cli_arg(cli_args=cli_args, cli_arg_parameter=target_cli_parameter_name),
13+
default_target_name=default_target_name,
14+
target_cli_parameter_name=target_cli_parameter_name
15+
)
16+
17+
def _get_version_from_data(self, data: dict) -> str | None:
18+
config = data.get('config', None)
19+
if config is None:
20+
return None
21+
metadata = config.get('metadata', None)
22+
if metadata is None:
23+
return None
24+
version = config.get('version', None)
25+
if isinstance(version, str):
26+
version = version.strip()
27+
28+
return version

src/same_version/main.py

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
from same_version.checkers.ro_crate_metadata_json_checker import (
2222
RoCrateMetadataJsonChecker,
2323
)
24+
from same_version.checkers.setup_cfg_checker import SetupCfgChecker
2425
from same_version.checkers.setup_py_checker import SetupPyChecker
2526
from same_version.checkers.zenodo_json_checker import ZenodoJsonChecker
2627
from same_version.extractors.cargo_toml_extractor import CargoTomlExtractor
@@ -42,6 +43,7 @@
4243
from same_version.extractors.ro_crate_metadata_json_extractor import (
4344
RoCrateMetadataJsonExtractor,
4445
)
46+
from same_version.extractors.setup_cfg_extractor import SetupCfgExtractor
4547
from same_version.extractors.setup_py_extractor import SetupPyExtractor
4648
from same_version.extractors.zenodo_json_extractor import ZenodoJsonExtractor
4749
from same_version.log_collector import get_log_collector
@@ -62,31 +64,25 @@ def parse_args() -> argparse.Namespace:
6264
parser.add_argument('--zenodo-json-path', default='.zenodo.json', required=False, help='Path to .zenodo.json')
6365
parser.add_argument('--check-package-json', default=True, required=False, help='Check package.json? (true/false)')
6466
parser.add_argument('--package-json-path', default='package.json', required=False, help='Path to package.json')
67+
parser.add_argument('--check-setup-cfg', default=True, required=False, help='Check setup.cfg? (true/false)')
68+
parser.add_argument('--setup-cfg-path', required=False, help='Path to setup.cfg')
6569
parser.add_argument('--check-setup-py', default=True, required=False, help='Check setup.py? (true/false)')
6670
parser.add_argument('--setup-py-path', default='setup.py', required=False, help='Path to setup.py')
67-
6871
parser.add_argument('--check-r-description', default=True, required=False, help='Check R DESCRIPTION file? (true/false)')
6972
parser.add_argument('--r-description-path', default='DESCRIPTION', required=False, help='Path to R DESCRIPTION file')
70-
7173
parser.add_argument('--check-composer-json', default=True, required=False, help='Check setup.py? (true/false)')
7274
parser.add_argument('--composer-json-path', default='composer.json', required=False, help='Path to composer.json')
73-
7475
parser.add_argument('--check-pom-xml', default=True, required=False, help='Check pom.xml? (true/false)')
7576
parser.add_argument('--pom-xml-path', default='pom.xml', required=False, help='Path to pom.xml')
76-
7777
parser.add_argument('--check-nuspec', default=True, required=False, help='Check .nuspec? (true/false)')
7878
parser.add_argument('--nuspec-path', default='.nuspec', required=False, help='Path to .nuspec')
79-
8079
parser.add_argument('--check-cargo-toml', default=True, required=False, help='Check Cargo.toml? (true/false)')
8180
parser.add_argument('--cargo-toml-path', default='Cargo.toml', required=False, help='Path to Cargo.toml')
82-
8381
parser.add_argument('--check-py-version-assignment', default=False, required=False, help='Check Python file with __version__ assignment? (true/false)')
8482
parser.add_argument('--py-version-assignment-path', required=False, help='Path to Python file with __version__ assignment')
85-
8683
parser.add_argument('--check-ro-crate-metadata-json', default=False, required=False, help='Check ro-crate-metadata.json? (true/false)')
8784
parser.add_argument('--ro-crate-metadata-json-path', default='ro-crate-metadata.json', required=False, help='Path to ro-crate-metadata.json')
8885
parser.add_argument('--ro-crate-metadata-json-id', required=False, help='@id field for the resource in ro-crate-metadata.json')
89-
9086
parser.add_argument('--check-github-event', default=False, required=False, help='Check GitHub events? (true/false)')
9187
parser.add_argument('--github-event-name', required=False, help='GitHub event name (push/release)')
9288
parser.add_argument('--github-event-ref', required=False, help='GitHub ref (for push event)')
@@ -131,6 +127,12 @@ def main():
131127
setup_py_checker: SetupPyChecker = SetupPyChecker(extractor=setup_py_extractor, cli_args=cli_args)
132128
checkers.append(setup_py_checker)
133129

130+
# setup.cfg
131+
if str(getattr(cli_args, 'check_setup_cfg', '') or '').lower() == 'true':
132+
setup_cfg_extractor: SetupCfgExtractor = SetupCfgExtractor(cli_args=cli_args)
133+
setup_cfg_checker: SetupCfgChecker = SetupCfgChecker(extractor=setup_cfg_extractor, cli_args=cli_args)
134+
checkers.append(setup_cfg_checker)
135+
134136
# package.json
135137
if str(getattr(cli_args, 'check_package_json', '') or '').lower() == 'true':
136138
package_json_extractor: PackageJsonExtractor = PackageJsonExtractor(cli_args=cli_args)
@@ -191,6 +193,8 @@ def main():
191193
zenodo_json_checker: ZenodoJsonChecker = ZenodoJsonChecker(extractor=zenodo_json_extractor, cli_args=cli_args)
192194
checkers.append(zenodo_json_checker)
193195

196+
197+
194198
# Loop through checkers
195199
logger.info('📦 Checking software version metadata...')
196200

0 commit comments

Comments
 (0)