omdev 0.0.0.dev234__py3-none-any.whl → 0.0.0.dev235__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
omdev/.manifests.json CHANGED
@@ -291,7 +291,7 @@
291
291
  "module": ".tools.git.messages",
292
292
  "attr": "_TIMESTAMP_GIT_MESSAGE_GENERATOR_MANIFEST",
293
293
  "file": "omdev/tools/git/messages.py",
294
- "line": 54,
294
+ "line": 74,
295
295
  "value": {
296
296
  "$.tools.git.messages.GitMessageGeneratorManifest": {
297
297
  "mod_name": "omdev.tools.git.messages",
omdev/cmake.py CHANGED
@@ -45,7 +45,6 @@ class Target(abc.ABC):
45
45
 
46
46
  @dc.dataclass(frozen=True)
47
47
  class Library(Target):
48
-
49
48
  @property
50
49
  def command_name(self) -> str:
51
50
  return 'add_library'
@@ -53,7 +52,6 @@ class Library(Target):
53
52
 
54
53
  @dc.dataclass(frozen=True)
55
54
  class StaticLibrary(Library):
56
-
57
55
  @property
58
56
  def command_extra(self) -> ta.Sequence[str]:
59
57
  return ['STATIC']
@@ -61,7 +59,6 @@ class StaticLibrary(Library):
61
59
 
62
60
  @dc.dataclass(frozen=True)
63
61
  class ModuleLibrary(Library):
64
-
65
62
  @property
66
63
  def command_extra(self) -> ta.Sequence[str]:
67
64
  return ['MODULE']
@@ -69,14 +66,12 @@ class ModuleLibrary(Library):
69
66
 
70
67
  @dc.dataclass(frozen=True)
71
68
  class Executable(Target):
72
-
73
69
  @property
74
70
  def command_name(self) -> str:
75
71
  return 'add_executable'
76
72
 
77
73
 
78
74
  class CmakeGen:
79
-
80
75
  def __init__(
81
76
  self,
82
77
  out: ta.TextIO,
omdev/tools/git/cli.py CHANGED
@@ -15,8 +15,10 @@ from omlish.logs import all as logs
15
15
 
16
16
  from ...git.status import GitStatusItem
17
17
  from ...git.status import get_git_status
18
+ from .messages import GitMessageGenerator
18
19
  from .messages import TimestampGitMessageGenerator
19
20
  from .messages import load_message_generator_manifests
21
+ from .messages import load_message_generator_manifests_map
20
22
 
21
23
 
22
24
  ##
@@ -189,7 +191,9 @@ class Cli(ap.Cli):
189
191
 
190
192
  @ap.cmd(
191
193
  ap.arg('-m', '--message', nargs='?'),
192
- ap.arg('--time-fmt', default=TimestampGitMessageGenerator.DEFAULT_TIME_FMT),
194
+ ap.arg('-g', '--message-generator', nargs='?'),
195
+ ap.arg('--time-fmt', default=GitMessageGenerator.GenerateCommitMessageArgs.DEFAULT_TIME_FMT),
196
+ ap.arg('--dry-run', action='store_true'),
193
197
  ap.arg('dir', nargs='*'),
194
198
  aliases=['acp'],
195
199
  )
@@ -198,16 +202,27 @@ class Cli(ap.Cli):
198
202
  st = get_git_status(cwd=cwd)
199
203
 
200
204
  if st.has_dirty:
201
- subprocess.check_call(['git', 'add', '.'], cwd=cwd)
205
+ if not self.args.dry_run:
206
+ subprocess.check_call(['git', 'add', '.'], cwd=cwd)
202
207
 
203
208
  if st.has_staged or st.has_dirty:
204
209
  if self.args.message is not None:
205
210
  msg = self.args.message
206
211
  else:
207
- msg = TimestampGitMessageGenerator(self.args.time_fmt).generate_commit_message()
208
- subprocess.check_call(['git', 'commit', '-m', msg], cwd=cwd)
209
-
210
- subprocess.check_call(['git', 'push'], cwd=cwd)
212
+ mg_cls: type[GitMessageGenerator] = TimestampGitMessageGenerator
213
+ if (mg_name := self.args.message_generator) is not None:
214
+ mg_cls = load_message_generator_manifests_map()[mg_name].get_cls()
215
+ mg = mg_cls()
216
+ msg = mg.generate_commit_message(GitMessageGenerator.GenerateCommitMessageArgs(
217
+ cwd=cwd,
218
+ time_fmt=self.args.time_fmt,
219
+ ))
220
+
221
+ if not self.args.dry_run:
222
+ subprocess.check_call(['git', 'commit', '-m', msg], cwd=cwd)
223
+
224
+ if not self.args.dry_run:
225
+ subprocess.check_call(['git', 'push'], cwd=cwd)
211
226
 
212
227
  if not self.args.dir:
213
228
  run(None)
@@ -1,9 +1,11 @@
1
1
  import abc
2
2
  import dataclasses as dc
3
+ import importlib
3
4
  import os
4
5
  import typing as ta
5
6
 
6
7
  from omlish import cached
8
+ from omlish import check
7
9
  from omlish import lang
8
10
  from omlish.manifests import load as manifest_load
9
11
 
@@ -12,8 +14,15 @@ from omlish.manifests import load as manifest_load
12
14
 
13
15
 
14
16
  class GitMessageGenerator(abc.ABC):
17
+ @dc.dataclass(frozen=True, kw_only=True)
18
+ class GenerateCommitMessageArgs:
19
+ cwd: str | None = None
20
+
21
+ DEFAULT_TIME_FMT: ta.ClassVar[str] = '%Y-%m-%dT%H:%M:%SZ'
22
+ time_fmt: str = DEFAULT_TIME_FMT
23
+
15
24
  @abc.abstractmethod
16
- def generate_commit_message(self) -> str:
25
+ def generate_commit_message(self, args: GenerateCommitMessageArgs) -> str:
17
26
  raise NotImplementedError
18
27
 
19
28
 
@@ -27,6 +36,10 @@ class GitMessageGeneratorManifest:
27
36
  name: str
28
37
  aliases: ta.Collection[str] | None = None
29
38
 
39
+ def get_cls(self) -> type[GitMessageGenerator]:
40
+ mod = importlib.import_module(self.mod_name)
41
+ return check.issubclass(getattr(mod, self.attr_name), GitMessageGenerator)
42
+
30
43
 
31
44
  @cached.function
32
45
  def load_message_generator_manifests() -> ta.Sequence[GitMessageGeneratorManifest]:
@@ -36,16 +49,23 @@ def load_message_generator_manifests() -> ta.Sequence[GitMessageGeneratorManifes
36
49
  return [mf.value for mf in mfs]
37
50
 
38
51
 
52
+ @cached.function
53
+ def load_message_generator_manifests_map() -> ta.Mapping[str, GitMessageGeneratorManifest]:
54
+ dct: dict[str, GitMessageGeneratorManifest] = {}
55
+ for m in load_message_generator_manifests():
56
+ for n in (m.name, *(m.aliases or ())):
57
+ check.not_in(n, dct)
58
+ dct[n] = m
59
+ return dct
60
+
61
+
39
62
  ##
40
63
 
41
64
 
42
65
  @dc.dataclass(frozen=True)
43
66
  class TimestampGitMessageGenerator(GitMessageGenerator):
44
- DEFAULT_TIME_FMT: ta.ClassVar[str] = '%Y-%m-%d %H:%M:%S'
45
- time_fmt: str = DEFAULT_TIME_FMT
46
-
47
- def generate_commit_message(self) -> str:
48
- return lang.utcnow().strftime(self.time_fmt)
67
+ def generate_commit_message(self, args: GitMessageGenerator.GenerateCommitMessageArgs) -> str:
68
+ return lang.utcnow().strftime(args.time_fmt)
49
69
 
50
70
 
51
71
  #
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: omdev
3
- Version: 0.0.0.dev234
3
+ Version: 0.0.0.dev235
4
4
  Summary: omdev
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -12,7 +12,7 @@ Classifier: Operating System :: OS Independent
12
12
  Classifier: Operating System :: POSIX
13
13
  Requires-Python: >=3.12
14
14
  License-File: LICENSE
15
- Requires-Dist: omlish==0.0.0.dev234
15
+ Requires-Dist: omlish==0.0.0.dev235
16
16
  Provides-Extra: all
17
17
  Requires-Dist: black~=25.1; extra == "all"
18
18
  Requires-Dist: pycparser~=2.22; extra == "all"
@@ -1,9 +1,9 @@
1
- omdev/.manifests.json,sha256=-gFNSfj9LiUN5Wg47Jr9VVSd-Mhmhy8KMHhjmd_9RO0,9545
1
+ omdev/.manifests.json,sha256=qFKYwGJnQZsXpEFKYvzoSqimpWMnZkwwlJKlRDyPC-8,9545
2
2
  omdev/__about__.py,sha256=Iect_SBD2EXgx7QcFGiOqTHkOWD-bWOyvzgReDOY4Es,1214
3
3
  omdev/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  omdev/bracepy.py,sha256=I8EdqtDvxzAi3I8TuMEW-RBfwXfqKbwp06CfOdj3L1o,2743
5
5
  omdev/classdot.py,sha256=YOvgy6x295I_8NKBbBlRVd3AN7Osirm_Lqt4Wj0j9rY,1631
6
- omdev/cmake.py,sha256=Diy2ry65806dQP125DAstD3w46z_wszMH7PwC2-6iik,4578
6
+ omdev/cmake.py,sha256=oBAp1K8h-iCDd9uCn-OpNpZ6n36oYFkWLIiTyQw4irU,4573
7
7
  omdev/findimports.py,sha256=2t8QP852saEEJFeXySEzhi_nxRSxghlkXz2jVdvy08M,2392
8
8
  omdev/imgur.py,sha256=Uyz8nkORlhfXXK5Sty16tX8ro8s-b7LrxjOECv4_sB0,3005
9
9
  omdev/pip.py,sha256=7cZ_IOpekQvgPm_gKnX3Pr8xjqUid50PPScTlZCYVlM,2118
@@ -235,8 +235,8 @@ omdev/tools/qr.py,sha256=tm68lPwEAkEwIL2sUKPKBYfwwPtjVWG1DBZwur8_jY8,1737
235
235
  omdev/tools/sqlrepl.py,sha256=wAjrfXNrRV63-NJCC2HlGQnFh7lUH0bHMnOjYotQqFs,5753
236
236
  omdev/tools/git/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
237
237
  omdev/tools/git/__main__.py,sha256=gI87SBUgTkKUcUM-RtZWnei-UUDDqzbr5aPztb-gvbE,168
238
- omdev/tools/git/cli.py,sha256=0MwnDO4V-i3jvtCd9W0VR9LJjicY2_WoKq47_UhqNAA,7762
239
- omdev/tools/git/messages.py,sha256=gcXjzBUFOcL8Kia5x-t8jyN-aBLcHVhnfJX-lxXiQ3I,1299
238
+ omdev/tools/git/cli.py,sha256=jXEnMpw1WZpICwyhktQElkUuEpVhju3twN_CafYs2Ws,8516
239
+ omdev/tools/git/messages.py,sha256=D3u6DApTjWT9q329VRpCl7mvams-xYWjVvQI0amTnQE,2070
240
240
  omdev/tools/json/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
241
241
  omdev/tools/json/__main__.py,sha256=wqpkN_NsQyNwKW4qjVj8ADJ4_C98KhrFBtE-Z1UamfU,168
242
242
  omdev/tools/json/cli.py,sha256=EubIMT-n2XsjWBZjSy2fWXqijlwrIhLsfbkg3SZzi28,9586
@@ -248,9 +248,9 @@ omdev/tools/json/rendering.py,sha256=tMcjOW5edfozcMSTxxvF7WVTsbYLoe9bCKFh50qyaGw
248
248
  omdev/tools/pawk/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
249
249
  omdev/tools/pawk/__main__.py,sha256=VCqeRVnqT1RPEoIrqHFSu4PXVMg4YEgF4qCQm90-eRI,66
250
250
  omdev/tools/pawk/pawk.py,sha256=zsEkfQX0jF5bn712uqPAyBSdJt2dno1LH2oeSMNfXQI,11424
251
- omdev-0.0.0.dev234.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
252
- omdev-0.0.0.dev234.dist-info/METADATA,sha256=jYQg7Y-n7e6R8dy6ffJ5pVsrT0WIAPcyc4mUyHtpiEs,1636
253
- omdev-0.0.0.dev234.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
254
- omdev-0.0.0.dev234.dist-info/entry_points.txt,sha256=dHLXFmq5D9B8qUyhRtFqTGWGxlbx3t5ejedjrnXNYLU,33
255
- omdev-0.0.0.dev234.dist-info/top_level.txt,sha256=1nr7j30fEWgLYHW3lGR9pkdHkb7knv1U1ES1XRNVQ6k,6
256
- omdev-0.0.0.dev234.dist-info/RECORD,,
251
+ omdev-0.0.0.dev235.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
252
+ omdev-0.0.0.dev235.dist-info/METADATA,sha256=j2CxaL7vG7m9JHXYNaUZJVux695Lq1bJ6MMMtNXsQJk,1636
253
+ omdev-0.0.0.dev235.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
254
+ omdev-0.0.0.dev235.dist-info/entry_points.txt,sha256=dHLXFmq5D9B8qUyhRtFqTGWGxlbx3t5ejedjrnXNYLU,33
255
+ omdev-0.0.0.dev235.dist-info/top_level.txt,sha256=1nr7j30fEWgLYHW3lGR9pkdHkb7knv1U1ES1XRNVQ6k,6
256
+ omdev-0.0.0.dev235.dist-info/RECORD,,