dycw-actions 0.11.3__py3-none-any.whl → 0.15.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,36 @@
1
+ from __future__ import annotations
2
+
3
+ from pathlib import Path
4
+ from typing import TYPE_CHECKING
5
+
6
+ import click
7
+ from click import argument
8
+ from typed_settings import click_options
9
+ from utilities.logging import basic_config
10
+ from utilities.os import is_pytest
11
+
12
+ from actions.logging import LOGGER
13
+ from actions.re_encrypt.lib import re_encrypt
14
+ from actions.re_encrypt.settings import Settings
15
+ from actions.utilities import LOADER
16
+
17
+ if TYPE_CHECKING:
18
+ from utilities.types import PathLike
19
+
20
+
21
+ @argument("path", type=click.Path(exists=True, dir_okay=False, path_type=Path))
22
+ @click_options(Settings, [LOADER], show_envvars_in_help=True)
23
+ def re_encrypt_sub_cmd(settings: Settings, /, *, path: PathLike) -> None:
24
+ if is_pytest():
25
+ return
26
+ basic_config(obj=LOGGER)
27
+ re_encrypt(
28
+ path,
29
+ key_file=settings.key_file,
30
+ key=settings.key,
31
+ new_key_file=settings.new_key_file,
32
+ new_key=settings.new_key,
33
+ )
34
+
35
+
36
+ __all__ = ["re_encrypt_sub_cmd"]
@@ -0,0 +1,7 @@
1
+ from __future__ import annotations
2
+
3
+ RE_ENCRYPT_DOCSTRING = "Re-encrypt a JSON file"
4
+ RE_ENCRYPT_SUB_CMD = "re-encrypt"
5
+
6
+
7
+ __all__ = ["RE_ENCRYPT_DOCSTRING", "RE_ENCRYPT_SUB_CMD"]
@@ -0,0 +1,115 @@
1
+ from __future__ import annotations
2
+
3
+ from contextlib import contextmanager
4
+ from os import environ
5
+ from pathlib import Path
6
+ from typing import TYPE_CHECKING, assert_never
7
+
8
+ from typed_settings import Secret
9
+ from utilities.atomicwrites import writer
10
+ from utilities.os import temp_environ
11
+ from utilities.subprocess import run
12
+ from utilities.tabulate import func_param_desc
13
+ from utilities.tempfile import TemporaryFile
14
+ from xdg_base_dirs import xdg_config_home
15
+
16
+ from actions import __version__
17
+ from actions.logging import LOGGER
18
+ from actions.re_encrypt.settings import SETTINGS
19
+
20
+ if TYPE_CHECKING:
21
+ from collections.abc import Iterator
22
+
23
+ from utilities.types import PathLike
24
+
25
+
26
+ def re_encrypt(
27
+ path: PathLike,
28
+ /,
29
+ *,
30
+ key_file: PathLike | None = SETTINGS.key_file,
31
+ key: Secret[str] | None = SETTINGS.key,
32
+ new_key_file: PathLike | None = SETTINGS.new_key_file,
33
+ new_key: Secret[str] | None = SETTINGS.new_key,
34
+ ) -> None:
35
+ """Re-encrypt a JSON file."""
36
+ LOGGER.info(
37
+ func_param_desc(
38
+ re_encrypt,
39
+ __version__,
40
+ f"{path=}",
41
+ f"{key_file=}",
42
+ f"{key=}",
43
+ f"{new_key_file=}",
44
+ f"{new_key=}",
45
+ )
46
+ )
47
+ with _yield_env(key_file=key_file, key=key):
48
+ decrypted = run(
49
+ "sops",
50
+ "decrypt",
51
+ "--input-type",
52
+ "json",
53
+ "--output-type",
54
+ "json",
55
+ "--ignore-mac",
56
+ str(path),
57
+ return_=True,
58
+ )
59
+ with _yield_env(key_file=new_key_file, key=new_key):
60
+ identity = _get_recipient()
61
+ with TemporaryFile(text=decrypted) as temp:
62
+ encrypted = run(
63
+ "sops",
64
+ "encrypt",
65
+ "--age",
66
+ identity,
67
+ "--input-type",
68
+ "json",
69
+ "--output-type",
70
+ "json",
71
+ str(temp),
72
+ return_=True,
73
+ )
74
+ with writer(path, overwrite=True) as temp:
75
+ _ = temp.write_text(encrypted)
76
+ LOGGER.info("Finished re-encrypting '%s'", path)
77
+
78
+
79
+ @contextmanager
80
+ def _yield_env(
81
+ *,
82
+ key_file: PathLike | None = SETTINGS.key_file,
83
+ key: Secret[str] | None = SETTINGS.key,
84
+ ) -> Iterator[None]:
85
+ match key_file, key:
86
+ case Path() | str(), _:
87
+ with temp_environ(SOPS_AGE_KEY_FILE=str(key_file)):
88
+ yield
89
+ case None, Secret():
90
+ with temp_environ(SOPS_AGE_KEY=key.get_secret_value()):
91
+ yield
92
+ case None, None:
93
+ path = xdg_config_home() / "sops/age/keys.txt"
94
+ with temp_environ(SOPS_AGE_KEY_FILE=str(path)):
95
+ yield
96
+ case never:
97
+ assert_never(never)
98
+
99
+
100
+ def _get_recipient() -> str:
101
+ try:
102
+ key_file = environ["SOPS_AGE_KEY_FILE"]
103
+ except KeyError:
104
+ with TemporaryFile(text=environ["SOPS_AGE_KEY"]) as temp:
105
+ return _get_recipient_from_path(temp)
106
+ else:
107
+ return _get_recipient_from_path(key_file)
108
+
109
+
110
+ def _get_recipient_from_path(path: PathLike, /) -> str:
111
+ recipient, *_ = run("age-keygen", "-y", str(path), return_=True).splitlines()
112
+ return recipient
113
+
114
+
115
+ __all__ = ["re_encrypt"]
@@ -0,0 +1,26 @@
1
+ # ruff: noqa: TC003
2
+ from __future__ import annotations
3
+
4
+ from pathlib import Path
5
+
6
+ from typed_settings import Secret, load_settings, option, secret, settings
7
+
8
+ from actions.utilities import LOADER
9
+
10
+
11
+ @settings
12
+ class Settings:
13
+ key_file: Path | None = option(default=None, help="The key file")
14
+ key: Secret[str] | None = secret(default=None, help="The age identity")
15
+ new_key_file: Path | None = option(
16
+ default=None, help="The new key file for encryption"
17
+ )
18
+ new_key: Secret[str] | None = secret(
19
+ default=None, help="The new age identity for encryption"
20
+ )
21
+
22
+
23
+ SETTINGS = load_settings(Settings, [LOADER])
24
+
25
+
26
+ __all__ = ["SETTINGS", "Settings"]
@@ -3,8 +3,7 @@ from __future__ import annotations
3
3
  from pathlib import Path
4
4
 
5
5
  from typed_settings import load_settings, option, settings
6
- from utilities.getpass import USER
7
- from utilities.socket import HOSTNAME
6
+ from utilities.constants import HOSTNAME, USER
8
7
 
9
8
  from actions.utilities import LOADER
10
9
 
actions/run_hooks/lib.py CHANGED
@@ -1,25 +1,28 @@
1
1
  from __future__ import annotations
2
2
 
3
- import time
4
3
  from contextlib import suppress
5
- from pathlib import Path
6
4
  from re import search
7
5
  from subprocess import CalledProcessError
8
- from typing import TYPE_CHECKING, Any
6
+ from typing import TYPE_CHECKING
9
7
 
10
- from utilities.functions import ensure_class, ensure_str, get_func_name
8
+ import utilities.time
9
+ from utilities.functions import ensure_str, get_func_name
11
10
  from utilities.tabulate import func_param_desc
12
11
  from whenever import TimeDelta
13
12
  from yaml import safe_load
14
13
 
15
14
  from actions import __version__
15
+ from actions.constants import PRE_COMMIT_CONFIG_YAML
16
16
  from actions.logging import LOGGER
17
+ from actions.pre_commit.utilities import get_list_dicts
17
18
  from actions.run_hooks.settings import SETTINGS
18
19
  from actions.utilities import logged_run
19
20
 
20
21
  if TYPE_CHECKING:
21
22
  from collections.abc import Iterator
22
23
 
24
+ from utilities.types import StrDict
25
+
23
26
 
24
27
  def run_hooks(
25
28
  *,
@@ -55,10 +58,10 @@ def _yield_hooks(
55
58
  hooks: list[str] | None = SETTINGS.hooks,
56
59
  hooks_exclude: list[str] | None = SETTINGS.hooks_exclude,
57
60
  ) -> Iterator[str]:
58
- dict_ = safe_load(Path(".pre-commit-config.yaml").read_text())
59
- repos_list = ensure_class(dict_["repos"], list)
61
+ dict_ = safe_load(PRE_COMMIT_CONFIG_YAML.read_text())
62
+ repos_list = get_list_dicts(dict_, "repos")
60
63
  results: set[str] = set()
61
- for repo in (ensure_class(r, dict) for r in repos_list):
64
+ for repo in repos_list:
62
65
  url = repo["repo"]
63
66
  if (repos is not None) and any(search(repo_i, url) for repo_i in repos):
64
67
  results.update(_yield_repo_hooks(repo))
@@ -73,9 +76,8 @@ def _yield_hooks(
73
76
  yield from sorted(results)
74
77
 
75
78
 
76
- def _yield_repo_hooks(repo: dict[str, Any], /) -> Iterator[str]:
77
- hooks = ensure_class(repo["hooks"], list)
78
- for hook in (ensure_class(r, dict) for r in hooks):
79
+ def _yield_repo_hooks(repo: StrDict, /) -> Iterator[str]:
80
+ for hook in get_list_dicts(repo, "hooks"):
79
81
  yield ensure_str(hook["id"])
80
82
 
81
83
 
@@ -94,7 +96,7 @@ def _run_hook(hook: str, /, *, sleep: int = SETTINGS.sleep) -> bool:
94
96
  "succeeded" if is_success else "failed",
95
97
  delta,
96
98
  )
97
- time.sleep(sleep)
99
+ utilities.time.sleep(sleep)
98
100
  LOGGER.info("Finished sleeping for %s", delta)
99
101
  return is_success
100
102
 
@@ -1,7 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from typed_settings import load_settings, option, settings
4
- from utilities.getpass import USER
4
+ from utilities.constants import USER
5
5
 
6
6
  from actions.utilities import LOADER
7
7
 
actions/types.py CHANGED
@@ -1,21 +1,17 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from collections.abc import Callable
4
- from typing import TYPE_CHECKING, Any
5
4
 
6
- from tomlkit.items import Array, Table
5
+ from tomlkit.container import Container
6
+ from tomlkit.items import AoT, Table
7
7
  from typed_settings import Secret
8
8
  from utilities.packaging import Requirement
9
9
  from utilities.types import StrDict
10
10
 
11
- if TYPE_CHECKING:
12
- from tomlkit.container import Container
13
-
14
-
11
+ type ArrayLike = AoT | list[str] | list[StrDict]
12
+ type ContainerLike = Container | Table
15
13
  type FuncRequirement = Callable[[Requirement], Requirement]
16
- type HasAppend = Array | list[Any]
17
- type HasSetDefault = Container | StrDict | Table
18
14
  type SecretLike = str | Secret[str]
19
15
 
20
16
 
21
- __all__ = ["FuncRequirement", "HasAppend", "HasSetDefault", "SecretLike"]
17
+ __all__ = ["ArrayLike", "ContainerLike", "FuncRequirement", "SecretLike"]
actions/utilities.py CHANGED
@@ -7,7 +7,6 @@ from typing import TYPE_CHECKING, Any, Literal, assert_never, overload
7
7
  from typed_settings import EnvLoader, Secret
8
8
  from utilities.atomicwrites import writer
9
9
  from utilities.subprocess import run
10
- from utilities.text import split_str
11
10
 
12
11
  from actions.constants import YAML_INSTANCE
13
12
  from actions.logging import LOGGER
@@ -71,14 +70,6 @@ def convert_str(x: str | None, /) -> str | None:
71
70
  assert_never(never)
72
71
 
73
72
 
74
- def copy_text(
75
- src: PathLike, dest: PathLike, /, *, modifications: MutableSet[Path] | None = None
76
- ) -> None:
77
- LOGGER.info("Copying '%s' -> '%s'...", str(src), str(dest))
78
- text = Path(src).read_text()
79
- write_text(dest, text, modifications=modifications)
80
-
81
-
82
73
  def ensure_new_line(text: str, /) -> str:
83
74
  return text.strip("\n") + "\n"
84
75
 
@@ -132,11 +123,6 @@ def logged_run(
132
123
  return run(*unwrapped, env=env, print=print, return_=return_, logger=LOGGER)
133
124
 
134
125
 
135
- def split_f_str_equals(text: str, /) -> tuple[str, str]:
136
- """Split an `f`-string with `=`."""
137
- return split_str(text, separator="=", n=2)
138
-
139
-
140
126
  def write_text(
141
127
  path: PathLike, text: str, /, *, modifications: MutableSet[Path] | None = None
142
128
  ) -> None:
@@ -162,10 +148,8 @@ __all__ = [
162
148
  "convert_list_strs",
163
149
  "convert_secret_str",
164
150
  "convert_str",
165
- "copy_text",
166
151
  "ensure_new_line",
167
152
  "logged_run",
168
- "split_f_str_equals",
169
153
  "write_text",
170
154
  "yaml_dump",
171
155
  ]
@@ -0,0 +1,45 @@
1
+ Metadata-Version: 2.3
2
+ Name: dycw-actions
3
+ Version: 0.15.3
4
+ Summary: Library of actions
5
+ Requires-Dist: attrs>=25.4.0
6
+ Requires-Dist: click>=8.3.1
7
+ Requires-Dist: coloredlogs>=15.0.1
8
+ Requires-Dist: dycw-utilities>=0.183.4
9
+ Requires-Dist: inflect>=7.5.0
10
+ Requires-Dist: libcst>=1.8.6
11
+ Requires-Dist: ordered-set>=4.1.0
12
+ Requires-Dist: packaging>=25.0
13
+ Requires-Dist: pydantic>=2.12.5
14
+ Requires-Dist: pyyaml>=6.0.3
15
+ Requires-Dist: requests>=2.32.5
16
+ Requires-Dist: rich>=14.2.0
17
+ Requires-Dist: ruamel-yaml>=0.19.1
18
+ Requires-Dist: tabulate>=0.9.0
19
+ Requires-Dist: tomlkit>=0.14.0
20
+ Requires-Dist: typed-settings>=25.3.0
21
+ Requires-Dist: xdg-base-dirs>=6.0.2
22
+ Requires-Dist: attrs==25.4.0 ; extra == 'cli'
23
+ Requires-Dist: click==8.3.1 ; extra == 'cli'
24
+ Requires-Dist: coloredlogs==15.0.1 ; extra == 'cli'
25
+ Requires-Dist: dycw-utilities==0.183.4 ; extra == 'cli'
26
+ Requires-Dist: inflect==7.5.0 ; extra == 'cli'
27
+ Requires-Dist: libcst==1.8.6 ; extra == 'cli'
28
+ Requires-Dist: ordered-set==4.1.0 ; extra == 'cli'
29
+ Requires-Dist: packaging==25.0 ; extra == 'cli'
30
+ Requires-Dist: pydantic==2.12.5 ; extra == 'cli'
31
+ Requires-Dist: pyyaml==6.0.3 ; extra == 'cli'
32
+ Requires-Dist: requests==2.32.5 ; extra == 'cli'
33
+ Requires-Dist: rich==14.2.0 ; extra == 'cli'
34
+ Requires-Dist: ruamel-yaml==0.19.1 ; extra == 'cli'
35
+ Requires-Dist: tabulate==0.9.0 ; extra == 'cli'
36
+ Requires-Dist: tomlkit==0.14.0 ; extra == 'cli'
37
+ Requires-Dist: typed-settings==25.3.0 ; extra == 'cli'
38
+ Requires-Dist: xdg-base-dirs==6.0.2 ; extra == 'cli'
39
+ Requires-Python: >=3.12
40
+ Provides-Extra: cli
41
+ Description-Content-Type: text/markdown
42
+
43
+ # `actions`
44
+
45
+ Library of actions
@@ -1,10 +1,10 @@
1
- actions/__init__.py,sha256=A7kvce4fHYgV1tEVj_d1Ynre-ZheJHHRqpWXzriT7ko,59
1
+ actions/__init__.py,sha256=XbeoNsmkdaaukFZ-Hixwveh-yF1iPTSeLzRyhJB1fls,59
2
2
  actions/clean_dir/__init__.py,sha256=U4S_2y3zgLZVfMenHRaJFBW8yqh2mUBuI291LGQVOJ8,35
3
3
  actions/clean_dir/cli.py,sha256=OrFA2nEN2LyGF22mhTNEBr7KSuKgX54sGy9RyE73qUc,569
4
4
  actions/clean_dir/constants.py,sha256=aDNaYtemEv3lcMXo96Oh4pw_HASMby1GZC1D_gbjPAc,167
5
5
  actions/clean_dir/lib.py,sha256=0B8Le09FxAjAFckh69Sq2GPWVN2-asuWRYK9oSWA7sg,1523
6
6
  actions/clean_dir/settings.py,sha256=mqM0Oq-yz4dXKcUi3JmOCvDhoeBNQm_Qe70cGmhdcQE,345
7
- actions/cli.py,sha256=vbFMcS0ndfMP57905WMYQQT-V6DuvYyVtxk6zZzxGP4,5074
7
+ actions/cli.py,sha256=jVfhgoGiOEbQvPVnXIUoMKbT9kzranvpWZG0qVIs2fU,5391
8
8
  actions/constants.py,sha256=sBspUPK_Wi5hEx_Ro43ACdnW1YtlTC2H4qk7NaGur8w,1646
9
9
  actions/git_clone_with/__init__.py,sha256=U4S_2y3zgLZVfMenHRaJFBW8yqh2mUBuI291LGQVOJ8,35
10
10
  actions/git_clone_with/cli.py,sha256=vJY6-jxpnxc6N-Gm7s75iKxiPju0JJqbUs66YTrJFAw,1086
@@ -16,12 +16,12 @@ actions/pre_commit/__init__.py,sha256=U4S_2y3zgLZVfMenHRaJFBW8yqh2mUBuI291LGQVOJ
16
16
  actions/pre_commit/click.py,sha256=BLHjkO0gIW7rgLabuWnszwXmI4yb8Li5D8gt81GR-FQ,270
17
17
  actions/pre_commit/conformalize_repo/__init__.py,sha256=U4S_2y3zgLZVfMenHRaJFBW8yqh2mUBuI291LGQVOJ8,35
18
18
  actions/pre_commit/conformalize_repo/action_dicts.py,sha256=DnOaGdWhGiSgdlh9wINmt6lVKsdTIUO8O-Cvi4mFIgE,8218
19
- actions/pre_commit/conformalize_repo/cli.py,sha256=u7mzsQ-JlPLpleD4rhNSZGJxVlsK_akD3DdoRv5aK7U,4079
19
+ actions/pre_commit/conformalize_repo/cli.py,sha256=-Z7Pn3CPbElZNbk4UPmulQELSlKhIM7wv4WS46Yf2_k,4045
20
20
  actions/pre_commit/conformalize_repo/configs/gitignore,sha256=8YCRPwysCD8-67yFXaTg6O8TTl4xeNIh7_DVmaU5Ix0,5063
21
- actions/pre_commit/conformalize_repo/constants.py,sha256=Ct44YCQBF35qdY415xDMfTkQHAFvIcOsLvmRXxIxR1Y,1233
22
- actions/pre_commit/conformalize_repo/lib.py,sha256=3iQHztcxbQ4CIW4ff2ENYT-agxP4MSADQzC4JZR3fGk,53881
23
- actions/pre_commit/conformalize_repo/settings.py,sha256=0R0J6_VQncHcbrgLQ7eGLMcWSY8ZwMP1PBc0pwcVSiI,6867
24
- actions/pre_commit/constants.py,sha256=gjwIj79hyQIkHUNV30k2U8FgyS0PkCyWPIOwVQv_NK0,240
21
+ actions/pre_commit/conformalize_repo/constants.py,sha256=hAidVV0nQ5SMTkWYFysNSnhBtm-wQS-__EHHDr1sjh0,1236
22
+ actions/pre_commit/conformalize_repo/lib.py,sha256=w8EXAYoNqluBBSjvIZp9Zf75WW_tO-3KGmFQB9Xb1ds,54590
23
+ actions/pre_commit/conformalize_repo/settings.py,sha256=2x9bxDuFLZvZjYZa0kjDgBYnsfuF2XuGacW_mgOtuPg,6839
24
+ actions/pre_commit/constants.py,sha256=GBxm8GXe7o3M_l314687ZS9JA3Tj_6OMcFJWApYMeh4,247
25
25
  actions/pre_commit/format_requirements/__init__.py,sha256=U4S_2y3zgLZVfMenHRaJFBW8yqh2mUBuI291LGQVOJ8,35
26
26
  actions/pre_commit/format_requirements/cli.py,sha256=c9UdOFDLEei5AEzrVvo6FopIEOf2EqyOliA-bOR5a2o,584
27
27
  actions/pre_commit/format_requirements/constants.py,sha256=ly41jgwq0VVyHQqHaIXRc5ZmbWrNY_C3ET4G9gtE7rI,228
@@ -33,39 +33,45 @@ actions/pre_commit/replace_sequence_strs/lib.py,sha256=2OU5vl4tGGfJZjJVPyvdsE7pR
33
33
  actions/pre_commit/touch_empty_py/__init__.py,sha256=U4S_2y3zgLZVfMenHRaJFBW8yqh2mUBuI291LGQVOJ8,35
34
34
  actions/pre_commit/touch_empty_py/cli.py,sha256=s2S5OfAGcSLtd2aGm1ooa1k20oNK-LQ1PZWz6T30vO8,559
35
35
  actions/pre_commit/touch_empty_py/constants.py,sha256=zSwH60zfn9RhIAbBFnXjHrm2s1nFpPUskX3CZuJpQLk,198
36
- actions/pre_commit/touch_empty_py/lib.py,sha256=MQhI4s4A5oQHqYhBlfMrzThupWwAyUpzwA5xOKc8I1Q,1698
36
+ actions/pre_commit/touch_empty_py/lib.py,sha256=0GslCRb3gPVKnpf8J0JuQmvR32T6qvzV4d4_k_-pqzw,1707
37
37
  actions/pre_commit/touch_py_typed/__init__.py,sha256=U4S_2y3zgLZVfMenHRaJFBW8yqh2mUBuI291LGQVOJ8,35
38
38
  actions/pre_commit/touch_py_typed/cli.py,sha256=CDJV4NuUHJlSdJ84dY0XvdwYHMdqygZ7C6x07B-iN3E,559
39
39
  actions/pre_commit/touch_py_typed/constants.py,sha256=kLZOm_wgypp7MaXRYq-6AZqVE4OttOMKmUqt11V2zn0,191
40
- actions/pre_commit/touch_py_typed/lib.py,sha256=nxbdOH-fqOsMl2ucmWW-iP65IlNnfOemYWnaQSpC59A,2052
40
+ actions/pre_commit/touch_py_typed/lib.py,sha256=e3OX4McR9rxz1I4DdFBVa51L7VbwB_AlEBHYRNMvoec,2109
41
41
  actions/pre_commit/update_requirements/__init__.py,sha256=U4S_2y3zgLZVfMenHRaJFBW8yqh2mUBuI291LGQVOJ8,35
42
42
  actions/pre_commit/update_requirements/classes.py,sha256=ERC70c1CxQ3rOsQaEtp6FGbK_VaJ4K0jAV5XTB5-L30,3486
43
- actions/pre_commit/update_requirements/cli.py,sha256=CBfm8M7hwSRw8KS6ttiNE86IFHJ52V42AxlfakqTDN0,584
43
+ actions/pre_commit/update_requirements/cli.py,sha256=hWMtC4R1NkHh6dKCQr8MwR-Zjmsmpz2vYMGr4HgN9Q4,894
44
44
  actions/pre_commit/update_requirements/constants.py,sha256=ve44_RYed_41ckgQNPkb08u7Y1cpLpzutGSL9FdGBF8,228
45
- actions/pre_commit/update_requirements/lib.py,sha256=oWi2JbnZUCvb1N8GIwdnCZ-ugbqAj0z_HI8MYJQ1ml0,4570
46
- actions/pre_commit/utilities.py,sha256=myONOjsgKTo-AwytcLEGGuQ9fmMvBo5MqK3NRvGPx_g,11668
45
+ actions/pre_commit/update_requirements/lib.py,sha256=oRsODobG-kl6God5opQADPDC4sKByeybkG094I1Jxik,7095
46
+ actions/pre_commit/update_requirements/settings.py,sha256=6EepqYra9JIDpBiPaQ1eup8A6S0ENRMQL3wNky6LB00,546
47
+ actions/pre_commit/utilities.py,sha256=H3u4pFzaU5HqcKd4vWf3haScn5apv72-s6PGOEEt3Bo,13799
47
48
  actions/publish_package/__init__.py,sha256=U4S_2y3zgLZVfMenHRaJFBW8yqh2mUBuI291LGQVOJ8,35
48
49
  actions/publish_package/cli.py,sha256=nAPHCq67mxUb3yHepVGcoQ69qgaQahM1-cxdbHfxQg0,803
49
50
  actions/publish_package/constants.py,sha256=C68ZCVL_jVlYdLGpOK6saZccWoFy5AmC_NMBIWYdYOE,209
50
- actions/publish_package/lib.py,sha256=ceEK1ee4-LW-t9JP5NKpOAvxapj3a8PoNhkfoCo43MI,1667
51
+ actions/publish_package/lib.py,sha256=6W4D2bl1ohPbT0oEXIGqIGPIvYVAoXA3lNLv0SzFjuQ,1824
51
52
  actions/publish_package/settings.py,sha256=UucS_yb-es9bDz0EPeWTIql6B1Dr4kcaEMdXpt23BNQ,935
52
53
  actions/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
53
54
  actions/random_sleep/__init__.py,sha256=U4S_2y3zgLZVfMenHRaJFBW8yqh2mUBuI291LGQVOJ8,35
54
55
  actions/random_sleep/cli.py,sha256=XZkgOdr9wSItM2uH1o5l-dnwFPKI6X5XZdtXwc_K3cM,691
55
56
  actions/random_sleep/constants.py,sha256=5GMqCD1f12uyKDVTZBbnDDn6TQa99mUYZb9p-crg5BA,190
56
- actions/random_sleep/lib.py,sha256=uVNUxJ0Iupd5NegS5tzzBE38Ut1nojnrlDnbujIa9Ws,1651
57
+ actions/random_sleep/lib.py,sha256=uDWE07SBsnbQakZiAy7-StiRiDRR7J_cp3bu48dnEE8,1660
57
58
  actions/random_sleep/settings.py,sha256=F8gO2j2EEX8moemwhWWCPdRuOpZ_qLtqzSfWhjIy3P8,529
59
+ actions/re_encrypt/__init__.py,sha256=U4S_2y3zgLZVfMenHRaJFBW8yqh2mUBuI291LGQVOJ8,35
60
+ actions/re_encrypt/cli.py,sha256=TnhEPUfYvtzzmGfmJfcKQEHH6sS9n8J0QMT8nErNvAo,975
61
+ actions/re_encrypt/constants.py,sha256=Y6PNhL5MGgm1yA2viNGKHjS96zSQZDb3xe-ZPQsiZGk,177
62
+ actions/re_encrypt/lib.py,sha256=6Kg6CGTYWIhVSNBqyDuflIhRXDcojP35bUnOmT6Gv8U,3176
63
+ actions/re_encrypt/settings.py,sha256=HUliK-TN3Stzgkin7lBjMa9k46PJS9rIxgz2BVK7WeM,673
58
64
  actions/register_gitea_runner/__init__.py,sha256=U4S_2y3zgLZVfMenHRaJFBW8yqh2mUBuI291LGQVOJ8,35
59
65
  actions/register_gitea_runner/cli.py,sha256=70RUyzKCZHxyDRMFwCAwDC0LDsUZxBi2T6ctzbFlpc8,1129
60
66
  actions/register_gitea_runner/configs/config.yml,sha256=0kpaqAjMRDqdSxkSK8ydOk2IsrlkB4cUkYmbkHAurrg,5683
61
67
  actions/register_gitea_runner/configs/entrypoint.sh,sha256=k0K9M38oj3AGHahE1a2011sPoRmYP6Lzu1hvbkjAesw,452
62
68
  actions/register_gitea_runner/constants.py,sha256=wX1f5qvhIXngBVWbIQRoIaXIdPaUByvG8HS8P0WcCGM,694
63
69
  actions/register_gitea_runner/lib.py,sha256=I8F-CVETA6Jj9Dc9gzXt0DCVjAgrO_-blMdN-3sS8ds,8664
64
- actions/register_gitea_runner/settings.py,sha256=0UQm8M3qDiBE3jiE333M4FdLjikNAzpc9gk_VlzI0s8,1149
70
+ actions/register_gitea_runner/settings.py,sha256=2i2o4GF65PbiUDiiuA7jI9UBWMxyRdB4E2NsrorzMiY,1123
65
71
  actions/run_hooks/__init__.py,sha256=U4S_2y3zgLZVfMenHRaJFBW8yqh2mUBuI291LGQVOJ8,35
66
72
  actions/run_hooks/cli.py,sha256=xKBw6iIlHpUlHl6-QWQLSL6KKVjnsihBeJ7h58Rl8P4,616
67
73
  actions/run_hooks/constants.py,sha256=JRhDk08qbzo5C-zwHdXZV5ajvNSKh4GcOcBvOIY6IGU,172
68
- actions/run_hooks/lib.py,sha256=HzK0Q5v82c2ByqPrXAflo_w44mhz6_gmmUuNDr4xops,3184
74
+ actions/run_hooks/lib.py,sha256=JDZnnq3c5Ui4xTkHRayJDUr9fySMYKsDm3zy0XrQMNs,3202
69
75
  actions/run_hooks/settings.py,sha256=Cj6QVK6JspzOp6-1CaOENlXbg25kvgPXG4FKWgIiDgY,740
70
76
  actions/setup_cronjob/__init__.py,sha256=U4S_2y3zgLZVfMenHRaJFBW8yqh2mUBuI291LGQVOJ8,35
71
77
  actions/setup_cronjob/cli.py,sha256=l6t2WjCUprACV0rY8kHvpHLt3LgMI4q2XY4AEOiutkk,891
@@ -73,7 +79,7 @@ actions/setup_cronjob/configs/cron.tmpl,sha256=UD_d0LYlB6tbkXAcUTzpGDWVNgIhCR45J
73
79
  actions/setup_cronjob/configs/logrotate.tmpl,sha256=kkMuCRe4l03er6cFmRI0CXerHYmDumnMXLGKBjXLVxo,137
74
80
  actions/setup_cronjob/constants.py,sha256=CNebyWFymrXBx3X9X7XXpU9PSd5wzUN6XkUVomSBnWQ,301
75
81
  actions/setup_cronjob/lib.py,sha256=Xyezg08q_lJhlhNoD24iiwujqZOPJT4vnyVbpfo2CdQ,3260
76
- actions/setup_cronjob/settings.py,sha256=SxSe25f0sHUgq2-xdJN6rbbaSVFQE7FuEisiO_fmZNw,990
82
+ actions/setup_cronjob/settings.py,sha256=BnOuYUoJjvXKYz0BJvYlsVvrbPx0H4pCcqdtB92GFDo,992
77
83
  actions/setup_ssh_config/__init__.py,sha256=U4S_2y3zgLZVfMenHRaJFBW8yqh2mUBuI291LGQVOJ8,35
78
84
  actions/setup_ssh_config/cli.py,sha256=lVmMQ1CcSifPVMgQl-nVsFTpLyBvDaFPKYJejhT0zaY,378
79
85
  actions/setup_ssh_config/constants.py,sha256=ZWMmq2uBSKUKppD0pmaZ5JSCX2Ty5wJhTHSsS05ygiU,206
@@ -83,9 +89,9 @@ actions/tag_commit/cli.py,sha256=1E6cM0XKTCt_Ukb7pxqOojHpJjoa63dVBO6DXoESe9Q,745
83
89
  actions/tag_commit/constants.py,sha256=ceOvQpY4dgtJSd7v_jI1V00S0SjRq2ToGeZu41-DL7M,176
84
90
  actions/tag_commit/lib.py,sha256=1jwduvr_WpDXPVrNFEW-uPmrhndPzenh8wkZ_MNK68U,1792
85
91
  actions/tag_commit/settings.py,sha256=TOeKG_GODP--2lBSyGzH_M32jDIfh4vk_Ts06R3_ak4,629
86
- actions/types.py,sha256=1P3oAnYxyKgAfv8986jZ6whwdHV0qLHoX0oR8brviQk,586
87
- actions/utilities.py,sha256=BKQOfuVH0U43F6jLpy1vG6L1AwSAPcqoqyXbPbjEiFY,4295
88
- dycw_actions-0.11.3.dist-info/WHEEL,sha256=eycQt0QpYmJMLKpE3X9iDk8R04v2ZF0x82ogq-zP6bQ,79
89
- dycw_actions-0.11.3.dist-info/entry_points.txt,sha256=2Uu7wAZOm0mmcsGBEsGB370HAWgVWECRFJ9rKgfC3-I,46
90
- dycw_actions-0.11.3.dist-info/METADATA,sha256=RlgGjDgh8s01cbBRWH6OW8BQozM_5YePOYdtS0wcyzA,689
91
- dycw_actions-0.11.3.dist-info/RECORD,,
92
+ actions/types.py,sha256=RRzJal-i9J3Yah8vyxJrXiBPUCff4LoMpiPNaPTYFRE,526
93
+ actions/utilities.py,sha256=2U7aBpK3XJ_SVdXGO9bQxn2aPFOxq02nxf8Uwso6Qu0,3801
94
+ dycw_actions-0.15.3.dist-info/WHEEL,sha256=XV0cjMrO7zXhVAIyyc8aFf1VjZ33Fen4IiJk5zFlC3g,80
95
+ dycw_actions-0.15.3.dist-info/entry_points.txt,sha256=c3Vrl8JrMg1-FkLKpEiMahoefkRBrFCFXDhX7a-OBfA,43
96
+ dycw_actions-0.15.3.dist-info/METADATA,sha256=GVfrK4LD7qIn-vW-00zrN-muLSo-avf17X3jtO3g_QU,1585
97
+ dycw_actions-0.15.3.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: uv 0.9.24
2
+ Generator: uv 0.9.26
3
3
  Root-Is-Purelib: true
4
- Tag: py3-none-any
4
+ Tag: py3-none-any
@@ -0,0 +1,3 @@
1
+ [console_scripts]
2
+ cli = actions.cli:_main
3
+
@@ -1,24 +0,0 @@
1
- Metadata-Version: 2.3
2
- Name: dycw-actions
3
- Version: 0.11.3
4
- Summary: Library of actions
5
- Requires-Dist: click>=8.3.1,<9
6
- Requires-Dist: dycw-utilities>=0.179.3,<1
7
- Requires-Dist: inflect>=7.5.0,<8
8
- Requires-Dist: libcst>=1.8.6,<2
9
- Requires-Dist: packaging>=25.0,<26
10
- Requires-Dist: pydantic>=2.12.5,<3
11
- Requires-Dist: pyyaml>=6.0.3,<7
12
- Requires-Dist: requests>=2.32.5,<3
13
- Requires-Dist: rich>=14.2.0,<15
14
- Requires-Dist: ruamel-yaml>=0.19.1,<1
15
- Requires-Dist: tabulate>=0.9.0,<1
16
- Requires-Dist: tomlkit>=0.14.0,<1
17
- Requires-Dist: typed-settings[attrs,click]>=25.3.0,<26
18
- Requires-Dist: xdg-base-dirs>=6.0.2,<7
19
- Requires-Python: >=3.12
20
- Description-Content-Type: text/markdown
21
-
22
- # `actions`
23
-
24
- Library of actions
@@ -1,3 +0,0 @@
1
- [console_scripts]
2
- action = actions.cli:_main
3
-