Skip to content

Commit c3783d3

Browse files
authored
Use commit hashes in pre-commit config and actions (#913)
1 parent e6f5801 commit c3783d3

13 files changed

Lines changed: 73 additions & 70 deletions

.github/workflows/codeql.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,16 @@ jobs:
2222

2323
steps:
2424
- name: Checkout
25-
uses: actions/checkout@v6
25+
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
2626

2727
- name: Initialize CodeQL
28-
uses: github/codeql-action/init@v4
28+
uses: github/codeql-action/init@9e0d7b8d25671d64c341c19c0152d693099fb5ba # v4.35.5
2929
with:
3030
languages: python
3131
queries: +security-and-quality
3232
config-file: ./.github/codeql-config.yaml
3333

3434
- name: Perform CodeQL Analysis
35-
uses: github/codeql-action/analyze@v4
35+
uses: github/codeql-action/analyze@9e0d7b8d25671d64c341c19c0152d693099fb5ba # v4.35.5
3636
with:
3737
category: "/language:python"

.github/workflows/manual.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ jobs:
1616
tox-coverage:
1717
runs-on: ${{ inputs.OS }}
1818
steps:
19-
- uses: actions/checkout@v6
20-
- uses: actions/setup-python@v6
19+
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
20+
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
2121
with:
2222
python-version: |
2323
3.9
@@ -26,7 +26,7 @@ jobs:
2626
3.12
2727
- run: pip install -e ".[dev]"
2828
- run: tox -- --cov=../jsonargparse --cov-append
29-
- uses: actions/upload-artifact@v7
29+
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
3030
with:
3131
name: coverage
3232
path: jsonargparse_tests/.coverage

.github/workflows/tests.yaml

Lines changed: 37 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ jobs:
2121
matrix:
2222
python: ["3.9", "3.10", "3.11", "3.12", "3.13", "3.14"]
2323
steps:
24-
- uses: actions/checkout@v6
25-
- uses: actions/setup-python@v6
24+
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
25+
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
2626
with:
2727
python-version: ${{ matrix.python }}
2828
cache: pip
@@ -45,11 +45,11 @@ jobs:
4545
pytest --cov --cov-report=term --cov-report=xml --junit-xml=junit.xml
4646
mv coverage.xml coverage_py${{ matrix.python }}_types.xml
4747
mv junit.xml junit_py${{ matrix.python }}_types.xml
48-
- uses: actions/upload-artifact@v7
48+
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
4949
with:
5050
name: coverage_py${{ matrix.python }}
5151
path: ./coverage_py*
52-
- uses: actions/upload-artifact@v7
52+
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
5353
with:
5454
name: junit_py${{ matrix.python }}
5555
path: ./junit_py*
@@ -60,8 +60,8 @@ jobs:
6060
matrix:
6161
python: ["3.10", "3.11", "3.12", "3.13", "3.14"]
6262
steps:
63-
- uses: actions/checkout@v6
64-
- uses: actions/setup-python@v6
63+
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
64+
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
6565
with:
6666
python-version: ${{ matrix.python }}
6767
cache: pip
@@ -75,8 +75,8 @@ jobs:
7575
matrix:
7676
python: ["3.10", "3.11", "3.12", "3.13", "3.14"]
7777
steps:
78-
- uses: actions/checkout@v6
79-
- uses: actions/setup-python@v6
78+
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
79+
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
8080
with:
8181
python-version: ${{ matrix.python }}
8282
cache: pip
@@ -90,8 +90,8 @@ jobs:
9090
matrix:
9191
python: ["3.12", "3.14"]
9292
steps:
93-
- uses: actions/checkout@v6
94-
- uses: actions/setup-python@v6
93+
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
94+
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
9595
with:
9696
python-version: ${{ matrix.python }}
9797
cache: pip
@@ -101,8 +101,8 @@ jobs:
101101
omegaconf:
102102
runs-on: ubuntu-latest
103103
steps:
104-
- uses: actions/checkout@v6
105-
- uses: actions/setup-python@v6
104+
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
105+
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
106106
with:
107107
python-version: "3.12"
108108
cache: pip
@@ -112,8 +112,8 @@ jobs:
112112
pydantic-v1:
113113
runs-on: ubuntu-latest
114114
steps:
115-
- uses: actions/checkout@v6
116-
- uses: actions/setup-python@v6
115+
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
116+
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
117117
with:
118118
python-version: "3.12"
119119
cache: pip
@@ -132,20 +132,20 @@ jobs:
132132
pytest --cov --cov-report=term --cov-report=xml --junit-xml=junit.xml jsonargparse_tests/test_pydantic.py
133133
mv coverage.xml coverage_pydantic2.xml
134134
mv junit.xml junit_pydantic2.xml
135-
- uses: actions/upload-artifact@v7
135+
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
136136
with:
137137
name: coverage_pydantic
138138
path: ./coverage_py*
139-
- uses: actions/upload-artifact@v7
139+
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
140140
with:
141141
name: junit_pydantic
142142
path: ./junit_py*
143143

144144
build-package:
145145
runs-on: ubuntu-latest
146146
steps:
147-
- uses: actions/checkout@v6
148-
- uses: actions/setup-python@v6
147+
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
148+
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
149149
with:
150150
python-version: "3.12"
151151
- name: Build package
@@ -155,7 +155,7 @@ jobs:
155155
cd jsonargparse_tests
156156
python -m build --wheel
157157
mv dist/*.whl ../dist/
158-
- uses: actions/upload-artifact@v7
158+
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
159159
with:
160160
name: package
161161
path: ./dist/*
@@ -164,12 +164,12 @@ jobs:
164164
runs-on: ubuntu-latest
165165
needs: [build-package]
166166
steps:
167-
- uses: actions/checkout@v6
168-
- uses: actions/setup-python@v6
167+
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
168+
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
169169
with:
170170
python-version: "3.12"
171171
cache: pip
172-
- uses: actions/download-artifact@v8
172+
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
173173
with:
174174
name: package
175175
path: dist
@@ -188,8 +188,8 @@ jobs:
188188
doctest:
189189
runs-on: ubuntu-latest
190190
steps:
191-
- uses: actions/checkout@v6
192-
- uses: actions/setup-python@v6
191+
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
192+
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
193193
with:
194194
python-version: "3.12"
195195
cache: pip
@@ -200,14 +200,14 @@ jobs:
200200
mypy:
201201
runs-on: ubuntu-latest
202202
steps:
203-
- uses: actions/checkout@v6
204-
- uses: actions/setup-python@v6
203+
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
204+
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
205205
with:
206206
python-version: "3.12"
207207
cache: pip
208-
- uses: actions/cache@v5
208+
- uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
209209
with:
210-
key: pre-commit-cache
210+
key: pre-commit-cache-${{ hashFiles('.pre-commit-config.yaml') }}
211211
path: ~/.cache/pre-commit
212212
- run: pip install pre-commit
213213
- run: pre-commit run -a --hook-stage pre-push mypy
@@ -218,16 +218,16 @@ jobs:
218218
permissions:
219219
id-token: write
220220
steps:
221-
- uses: actions/checkout@v6
222-
- uses: actions/download-artifact@v8
221+
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
222+
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
223223
with:
224224
merge-multiple: true
225-
- uses: codecov/codecov-action@v6
225+
- uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0
226226
with:
227227
fail_ci_if_error: true
228228
files: ./coverage_*.xml
229229
use_oidc: true
230-
- uses: codecov/codecov-action@v6
230+
- uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0
231231
with:
232232
fail_ci_if_error: true
233233
report_type: test_results
@@ -242,10 +242,10 @@ jobs:
242242
(github.event_name == 'pull_request' && !github.event.pull_request.head.repo.fork)
243243
needs: [linux, pydantic-v1]
244244
steps:
245-
- uses: actions/checkout@v6
245+
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
246246
with:
247247
fetch-depth: 0 # Shallow clone disabled for a better relevancy of analysis
248-
- uses: actions/download-artifact@v8
248+
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
249249
with:
250250
merge-multiple: true
251251
- name: Get version
@@ -257,7 +257,7 @@ jobs:
257257
VERSION="$(git describe --tags --abbrev=0 | sed 's/^v//')+$(git rev-parse --short HEAD)"
258258
fi
259259
echo "VERSION=$VERSION" >> $GITHUB_ENV
260-
- uses: SonarSource/sonarqube-scan-action@v8
260+
- uses: SonarSource/sonarqube-scan-action@59db25f34e16620e48ab4bb9e4a5dce155cb5432 # v8.0.0
261261
with:
262262
args: >
263263
-Dsonar.organization=omni-us
@@ -282,9 +282,9 @@ jobs:
282282
permissions:
283283
id-token: write
284284
steps:
285-
- uses: actions/download-artifact@v8
285+
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
286286
with:
287287
name: package
288288
path: dist
289289
- name: Publish to PyPI
290-
uses: pypa/gh-action-pypi-publish@release/v1
290+
uses: pypa/gh-action-pypi-publish@cef221092ed1bacb1cc03d23a2d87d1d172e277b # v1.14.0

.pre-commit-config.yaml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ ci:
1313
repos:
1414

1515
- repo: https://github.com/pre-commit/pre-commit-hooks
16-
rev: v6.0.0
16+
rev: 3e8a8703264a2f4a69428a0aa4dcb512790b2c8c # v6.0.0
1717
hooks:
1818
- id: check-added-large-files
1919
- id: check-ast
@@ -25,20 +25,20 @@ repos:
2525
exclude: .bumpversion.cfg
2626

2727
- repo: https://github.com/astral-sh/ruff-pre-commit
28-
rev: v0.15.12
28+
rev: 5e2fb545eba1ea9dc051f6f962d52fe8f76a9794 # v0.15.13
2929
hooks:
3030
- id: ruff-check
3131
- id: ruff-format
3232

3333
- repo: https://github.com/crate-ci/typos
34-
rev: v1.46.0
34+
rev: aca895bf05aec0cb7dffa6f94495e923224d9f17 # v1.46.2
3535
hooks:
3636
- id: typos
3737
args: []
3838
verbose: true
3939

4040
- repo: https://github.com/pre-commit/mirrors-mypy
41-
rev: v1.20.2
41+
rev: d2823d321df3af8f878f7ee3414dc94d037145b9 # v2.1.0
4242
hooks:
4343
- id: mypy
4444
files: jsonargparse.*/.*.py

jsonargparse/_common.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ def validate_default(container: ActionsContainer, action: argparse.Action):
230230
from ._core import ArgumentGroup
231231

232232
if isinstance(container, ArgumentGroup):
233-
container = container.parser # type: ignore[assignment]
233+
container = container.parser
234234
with parser_context(parent_parser=container, validating_defaults=True):
235235
default = action.default
236236
action.default = None

jsonargparse/_formatters.py

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -59,28 +59,31 @@ def __init__(self, help_formatter: HelpFormatter):
5959

6060
def add_yaml_comments(self, cfg: str) -> str:
6161
"""Adds help text as yaml comments."""
62+
from ._core import ArgumentParser
63+
6264
ruyaml = import_ruamel("add_yaml_comments")
6365
yaml = ruyaml.YAML()
6466
cfg = yaml.load(cfg)
6567

66-
def get_subparsers(parser, prefix=""):
67-
subparsers = {}
68+
def get_parsers(parser: ArgumentParser, prefix="") -> dict[Optional[str], ArgumentParser]:
69+
parsers = {}
6870
if parser._subparsers is not None:
69-
for key, subparser in parser._subparsers._group_actions[0].choices.items():
71+
for key, subparser in parser._subparsers._group_actions[0].choices.items(): # type: ignore[union-attr]
7072
full_key = (prefix + "." if prefix else "") + key
71-
subparsers[full_key] = subparser
72-
subparsers.update(get_subparsers(subparser, prefix=full_key))
73-
return subparsers
73+
parsers[full_key] = subparser
74+
parsers.update(get_parsers(subparser, prefix=full_key))
75+
parsers[None] = parser
76+
return parsers
7477

7578
parser = parent_parser.get()
76-
parsers = get_subparsers(parser)
77-
parsers[None] = parser
79+
assert isinstance(parser, ArgumentParser)
80+
parsers = get_parsers(parser)
7881

7982
group_titles = {}
80-
for parser_key, parser in parsers.items():
81-
group_titles[parser_key] = parser.description
82-
prefix = "" if parser_key is None else parser_key + "."
83-
for group in parser._action_groups:
83+
for parser_n_key, parser_n in parsers.items():
84+
group_titles[parser_n_key] = parser_n.description
85+
prefix = "" if parser_n_key is None else parser_n_key + "."
86+
for group in parser_n._action_groups:
8487
actions = filter_non_parsing_actions(group._group_actions)
8588
actions = [
8689
a for a in actions if not isinstance(a, (_ActionConfigLoad, ActionConfigFile, ActionSubCommands))

jsonargparse/_instantiation.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ def instantiate(
101101
applied_instantiation_links=cfg.get("__applied_instantiation_links__"),
102102
):
103103
parent[key] = component.instantiate_classes(value)
104-
else:
104+
elif hasattr(component, "instantiate_class"):
105105
with parser_context(
106106
load_value_mode=self.parser_mode, # type: ignore[attr-defined]
107107
class_instantiators=get_class_instantiators(self),

jsonargparse/_parameter_resolvers.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -488,7 +488,7 @@ def get_component_and_parent(
488488
function_or_class = function_or_class.wrapped_function # type: ignore[union-attr]
489489
if isinstance(function_or_class, MethodType):
490490
method_or_property = function_or_class.__name__
491-
function_or_class = function_or_class.__self__ # type: ignore[assignment]
491+
function_or_class = function_or_class.__self__
492492
else:
493493
method_or_property = None
494494
elif inspect.isclass(get_generic_origin(function_or_class)) and method_or_property is None:
@@ -1052,7 +1052,7 @@ def get_parameters_from_stubs(
10521052
return None
10531053
except Exception:
10541054
pass # only from stubs if getting signature fails
1055-
params = None
1055+
params: Optional[ParamList] = None
10561056
resolver = get_stubs_resolver()
10571057
stub_import = resolver.get_component_imported_info(component, parent)
10581058
if stub_import:

jsonargparse/_postponed_annotations.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -324,7 +324,7 @@ def get_types(obj: Any, logger: Optional[logging.Logger] = None) -> dict:
324324
try:
325325
types = get_type_hints(obj, global_vars)
326326
except Exception as ex1:
327-
types = ex1 # type: ignore[assignment]
327+
types = ex1
328328
if isinstance(types, dict) and all(not type_requires_eval(t) for t in types.values()):
329329
return types
330330

jsonargparse/_signatures.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ def add_class_arguments(
124124
if skip_not_added:
125125
skip.update(skip_not_added) # skip init=False
126126
if defaults:
127-
defaults = {prefix + k: v for k, v in defaults.items() if k not in skip}
127+
defaults = {prefix + k: v for k, v in defaults.items() if k not in skip} # type: ignore[union-attr]
128128
self.set_defaults(**defaults) # type: ignore[attr-defined]
129129

130130
return added_args
@@ -483,7 +483,7 @@ def add_subclass_arguments(
483483
ValueError: When given an invalid base class.
484484
"""
485485
if type(baseclass) is not tuple:
486-
baseclass = (baseclass,) # type: ignore[assignment]
486+
baseclass = (baseclass,)
487487
assert isinstance(baseclass, tuple)
488488
if not baseclass or not all(ActionTypeHint.is_subclass_typehint(c, also_lists=True) for c in baseclass):
489489
raise ValueError(f"Expected 'baseclass' to be a subclass type or a tuple of subclass types: {baseclass}")

0 commit comments

Comments
 (0)