omdev 0.0.0.dev193__py3-none-any.whl → 0.0.0.dev195__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
@@ -231,7 +231,7 @@
231
231
  "module": ".tools.cloc",
232
232
  "attr": "_CLI_MODULE",
233
233
  "file": "omdev/tools/cloc.py",
234
- "line": 194,
234
+ "line": 199,
235
235
  "value": {
236
236
  "$.cli.types.CliModule": {
237
237
  "cmd_name": "cloc",
@@ -1,4 +1,4 @@
1
- #!/bin/bash
1
+ #!/bin/sh
2
2
  set -e
3
3
 
4
4
  if [ -t 1 ] ; then
@@ -9,7 +9,7 @@ fi
9
9
 
10
10
  SERVICE_NAME="@PROJECT-dev"
11
11
  if ! [ $# -eq 0 ] ; then
12
- if [ "$1" == "--amd64" ] ; then
12
+ if [ "$1" = "--amd64" ] ; then
13
13
  SERVICE_NAME="$SERVICE_NAME-amd64"
14
14
  shift
15
15
  fi
@@ -22,9 +22,9 @@ if [ -z "$CONTAINER_ID" ] ; then
22
22
  fi
23
23
 
24
24
  if [ -z "$DOCKER_HOST_PLATFORM" ] ; then
25
- if [ $(uname) == "Linux" ] ; then
25
+ if [ $(uname) = "Linux" ] ; then
26
26
  DOCKER_HOST_PLATFORM=linux
27
- elif [ $(uname) == "Darwin" ] ; then
27
+ elif [ $(uname) = "Darwin" ] ; then
28
28
  DOCKER_HOST_PLATFORM=darwin
29
29
  fi
30
30
  fi
@@ -1,15 +1,16 @@
1
- #!/bin/bash
1
+ #!/bin/sh
2
2
  set -e
3
3
 
4
4
  if [ -z "${VENV}" ] ; then
5
- if [ $(uname) == "Linux" ] && (cat /proc/mounts | egrep '^overlay / .*/(docker|desktop-containerd)/' > /dev/null) ; then
5
+ if [ $(uname) = "Linux" ] && (cat /proc/mounts | grep -E '^overlay / .*/(docker|desktop-containerd)/' > /dev/null) ; then
6
6
  VENV=docker
7
7
  else
8
8
  VENV=default
9
9
  fi
10
10
  fi
11
11
 
12
- VENV_PYTHON_PATH="${BASH_SOURCE%/*}/.venvs/$VENV/bin/python"
12
+ SCRIPT_DIR=$(dirname "$0")
13
+ VENV_PYTHON_PATH="$SCRIPT_DIR/.venvs/$VENV/bin/python"
13
14
  if [ -f "$VENV_PYTHON_PATH" ] ; then
14
15
  PYTHON="$VENV_PYTHON_PATH"
15
16
  elif command -v python3 &> /dev/null ; then
@@ -1803,6 +1803,14 @@ class TomlWriter:
1803
1803
  else:
1804
1804
  raise TypeError(obj)
1805
1805
 
1806
+ #
1807
+
1808
+ @classmethod
1809
+ def write_str(cls, obj: ta.Any) -> str:
1810
+ out = io.StringIO()
1811
+ cls(out).write_value(obj)
1812
+ return out.getvalue()
1813
+
1806
1814
 
1807
1815
  ########################################
1808
1816
  # ../../../omlish/lite/cached.py
omdev/tagstrings.py ADDED
@@ -0,0 +1,206 @@
1
+ # ruff: noqa: UP006 UP007
2
+ # @omlish-lite
3
+ import dataclasses as dc
4
+ import typing as ta
5
+
6
+ from omlish.lite.check import check
7
+
8
+
9
+ HierarchyTagStringValue = ta.Tuple[str, ...] # ta.TypeAlias
10
+ TagStringValue = ta.Union[bool, str, HierarchyTagStringValue] # ta.TypeAlias
11
+ TagStringValueT = ta.TypeVar('TagStringValueT', bound=TagStringValue)
12
+
13
+
14
+ ##
15
+
16
+
17
+ TAG_STRING_VALUE_TYPES: ta.Tuple = (
18
+ bool,
19
+ str,
20
+ HierarchyTagStringValue,
21
+ )
22
+
23
+
24
+ TAG_STRING_BOOL_STR_MAP: ta.Mapping[str, bool] = {'true': True, 'false': False}
25
+
26
+
27
+ def check_tag_string_string(s: str) -> str:
28
+ check.non_empty_str(s)
29
+ check.equal(s.lower().strip(), s)
30
+ check.not_in(':', s)
31
+ return s
32
+
33
+
34
+ def build_hierarchy_tag_string_values(m: ta.Mapping[str, ta.Any]) -> ta.FrozenSet[HierarchyTagStringValue]:
35
+ def rec(c):
36
+ if isinstance(c, str):
37
+ yield (c,)
38
+ elif isinstance(c, ta.Mapping):
39
+ for k, v in c.items():
40
+ yield (k,)
41
+ for n in rec(v):
42
+ yield (k, *n)
43
+ else:
44
+ raise TypeError(c)
45
+
46
+ return frozenset(rec(m))
47
+
48
+
49
+ ##
50
+
51
+
52
+ @dc.dataclass(frozen=True)
53
+ class TagString(ta.Generic[TagStringValueT]):
54
+ name: str
55
+ type: ta.Type[TagStringValueT]
56
+
57
+ valid_values: ta.Optional[ta.FrozenSet[TagStringValueT]] = None
58
+ set: bool = False
59
+
60
+ def __post_init__(self) -> None:
61
+ check_tag_string_string(self.name)
62
+
63
+ check.in_(self.type, TAG_STRING_VALUE_TYPES)
64
+
65
+ if self.valid_values is not None:
66
+ check.isinstance(self.valid_values, frozenset)
67
+
68
+ v: ta.Any
69
+ if self.type is bool:
70
+ for v in self.valid_values:
71
+ check.isinstance(v, bool)
72
+
73
+ elif self.type is str:
74
+ for v in self.valid_values:
75
+ check_tag_string_string(v)
76
+
77
+ elif self.type is HierarchyTagStringValue:
78
+ for v in self.valid_values:
79
+ check.isinstance(v, tuple)
80
+ for c in v:
81
+ check_tag_string_string(c)
82
+ for i in range(1, len(v)):
83
+ p = v[:-i]
84
+ check.in_(p, self.valid_values)
85
+
86
+ else:
87
+ raise TypeError(self.type)
88
+
89
+ #
90
+
91
+ @classmethod
92
+ def new_bool(
93
+ cls,
94
+ name: str,
95
+ valid_values: ta.Optional[ta.Iterable[bool]] = None,
96
+ **kwargs: ta.Any,
97
+ ) -> 'TagString':
98
+ return cls(
99
+ name=name,
100
+ type=bool, # type: ignore
101
+ valid_values=frozenset(valid_values) if valid_values is not None else None, # type: ignore
102
+ **kwargs,
103
+ )
104
+
105
+ @classmethod
106
+ def new_str(
107
+ cls,
108
+ name: str,
109
+ valid_values: ta.Optional[ta.Iterable[str]] = None,
110
+ **kwargs: ta.Any,
111
+ ) -> 'TagString':
112
+ return cls(
113
+ name=name,
114
+ type=str, # type: ignore
115
+ valid_values=frozenset(check.not_isinstance(valid_values, str)) if valid_values is not None else None, # type: ignore # noqa
116
+ **kwargs,
117
+ )
118
+
119
+ @classmethod
120
+ def new_hierarchy(
121
+ cls,
122
+ name: str,
123
+ valid_values: ta.Optional[ta.Mapping[str, ta.Any]] = None,
124
+ **kwargs: ta.Any,
125
+ ) -> 'TagString':
126
+ return cls(
127
+ name=name,
128
+ type=HierarchyTagStringValue, # type: ignore
129
+ valid_values=build_hierarchy_tag_string_values(valid_values) if valid_values is not None else None, # type: ignore # noqa
130
+ **kwargs,
131
+ )
132
+
133
+
134
+ @dc.dataclass(frozen=True)
135
+ class TagStringSet:
136
+ dct: ta.Mapping[str, ta.FrozenSet[TagStringValue]]
137
+
138
+
139
+ ##
140
+
141
+
142
+ class TagStringCatalog:
143
+ def __init__(self, tags: ta.Iterable[TagString]) -> None:
144
+ super().__init__()
145
+
146
+ dct: ta.Dict[str, TagString] = {}
147
+ for t in tags:
148
+ check.not_in(t.name, dct)
149
+ dct[t.name] = t
150
+ self._by_name = dct
151
+
152
+ class Parsed(ta.NamedTuple):
153
+ tag: TagString
154
+ values: ta.FrozenSet[TagStringValue]
155
+
156
+ def parse_one(self, s: str) -> Parsed:
157
+ name, *rest = check.non_empty_str(s).split(':')
158
+
159
+ tag = self._by_name[name]
160
+
161
+ #
162
+
163
+ v: TagStringValue
164
+ if tag.type is bool:
165
+ bs = check.single(rest)
166
+ v = TAG_STRING_BOOL_STR_MAP[bs]
167
+
168
+ elif tag.type is str:
169
+ v = check.single(rest)
170
+
171
+ elif tag.type is HierarchyTagStringValue:
172
+ v = tuple(rest)
173
+
174
+ else:
175
+ raise TypeError(tag.type)
176
+
177
+ #
178
+
179
+ if tag.valid_values is not None:
180
+ check.in_(v, tag.valid_values)
181
+
182
+ #
183
+
184
+ vs: ta.FrozenSet[TagStringValue]
185
+ if tag.type is HierarchyTagStringValue:
186
+ vt = check.isinstance(v, tuple)
187
+ vs = frozenset(vt[:i + 1] for i in range(len(vt)))
188
+ else:
189
+ vs = frozenset([v])
190
+
191
+ #
192
+
193
+ return TagStringCatalog.Parsed(tag, vs)
194
+
195
+ def parse_set(self, *strs: str) -> TagStringSet:
196
+ dct: ta.Dict[str, ta.Set[TagStringValue]] = {}
197
+
198
+ for s in strs:
199
+ p = self.parse_one(s)
200
+
201
+ if not p.tag.set:
202
+ check.not_in(p.tag.name, dct)
203
+
204
+ dct.setdefault(p.tag.name, set()).update(p.values)
205
+
206
+ return TagStringSet({k: frozenset(v) for k, v in dct.items()})
omdev/tools/cloc.py CHANGED
@@ -1,3 +1,8 @@
1
+ """
2
+ TODO:
3
+ - handle test code separately
4
+ - tags again lol - language:, test:, whitespace:, comment:,
5
+ """
1
6
  import dataclasses as dc
2
7
  import os
3
8
  import re
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omdev
3
- Version: 0.0.0.dev193
3
+ Version: 0.0.0.dev195
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.dev193
15
+ Requires-Dist: omlish==0.0.0.dev195
16
16
  Provides-Extra: all
17
17
  Requires-Dist: black~=24.10; extra == "all"
18
18
  Requires-Dist: pycparser~=2.22; extra == "all"
@@ -1,4 +1,4 @@
1
- omdev/.manifests.json,sha256=L5cL40mDF0sj_CX3ta1-JvWmHdoWExT-3_FwbISK-ek,8309
1
+ omdev/.manifests.json,sha256=8HWjsS08zA6hAkjrOyjgda5T0iAOd8Oey9N-SCjhidM,8309
2
2
  omdev/__about__.py,sha256=n5x-SO70OgbDQFzQ1d7sZDVMsnkQc4PxQZPFaIQFa0E,1281
3
3
  omdev/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  omdev/bracepy.py,sha256=I8EdqtDvxzAi3I8TuMEW-RBfwXfqKbwp06CfOdj3L1o,2743
@@ -9,6 +9,7 @@ omdev/imgur.py,sha256=PNRrA440WP10DGm2bpXhisZdA4ODYCpOj1HqEzNx0Fs,2992
9
9
  omdev/pip.py,sha256=7cZ_IOpekQvgPm_gKnX3Pr8xjqUid50PPScTlZCYVlM,2118
10
10
  omdev/revisions.py,sha256=7Bgwd7cuKtcXJE4eDXmWP4Qx1aqZqf_LNFkOCuYS9I0,5008
11
11
  omdev/secrets.py,sha256=bcquaBIDKqX4UIKOzUuKrX7nxVCenj67rRHIMIrd9bk,540
12
+ omdev/tagstrings.py,sha256=hrinoRmYCFMt4WYCZAYrocVYKQvIApNGKbJaGz8whqs,5334
12
13
  omdev/tokens.py,sha256=zh2TCAfCbcq8ZnoVdQ824jrTiwNy3XJ_oCqlZpLpcCY,1574
13
14
  omdev/wheelfile.py,sha256=yfupGcGkbFlmzGzKU64k_vmOKpaKnUlDWxeGn2KdekU,10005
14
15
  omdev/amalg/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -147,19 +148,19 @@ omdev/pyproject/pkg.py,sha256=i0xgYWgkg-54gvzdUpjkp7TZAnD-gxgSJ9R_Q4XClKI,14565
147
148
  omdev/pyproject/reqs.py,sha256=8feZ71YnGzwKbLK4zO28CDQeNcZIIuq6cnkBhs6M-7E,2406
148
149
  omdev/pyproject/venvs.py,sha256=GUurjC7qzGlFL-su4C0YPO_pxbwDAyl1CqyLOB3WLCA,1911
149
150
  omdev/pyproject/resources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
150
- omdev/pyproject/resources/docker-dev.bash,sha256=H5ahHaOMFvP9ii1SWyPQFbbp8DrEJAqIwbTEpmXwBr8,843
151
- omdev/pyproject/resources/python.bash,sha256=pgffHVkEAYcQ-RgKTF5zeYS6sUSMGJDtBUS_kV0XOyQ,618
151
+ omdev/pyproject/resources/docker-dev.sh,sha256=DHkz5D18jok_oDolfg2mqrvGRWFoCe9GQo04dR1czcc,838
152
+ omdev/pyproject/resources/python.sh,sha256=A5vBdUInKZqzM0aPpAaIkLwrR7kzvkmM8k7tpotKTXg,638
152
153
  omdev/scripts/__init__.py,sha256=MKCvUAEQwsIvwLixwtPlpBqmkMXLCnjjXyAXvVpDwVk,91
153
154
  omdev/scripts/bumpversion.py,sha256=Kn7fo73Hs8uJh3Hi3EIyLOlzLPWAC6dwuD_lZ3cIzuY,1064
154
155
  omdev/scripts/execrss.py,sha256=mR0G0wERBYtQmVIn63lCIIFb5zkCM6X_XOENDFYDBKc,651
155
156
  omdev/scripts/exectime.py,sha256=sFb376GflU6s9gNX-2-we8hgH6w5MuQNS9g6i4SqJIo,610
156
157
  omdev/scripts/importtrace.py,sha256=oa7CtcWJVMNDbyIEiRHej6ICfABfErMeo4_haIqe18Q,14041
157
158
  omdev/scripts/interp.py,sha256=M_xCcROzRJsE0VpHRqMNoRjwRUy0XnQBZ7lb7nrDNW0,140898
158
- omdev/scripts/pyproject.py,sha256=dTc-wr3WKEdRbNOxBbJKalvCE0MBrPh-9-lSD65ak7s,242563
159
+ omdev/scripts/pyproject.py,sha256=lEOCcVdmzEKZZsw35xUJCZjrDSWpWQJupB88alTk-lY,242724
159
160
  omdev/scripts/slowcat.py,sha256=lssv4yrgJHiWfOiHkUut2p8E8Tq32zB-ujXESQxFFHY,2728
160
161
  omdev/scripts/tmpexec.py,sha256=WTYcf56Tj2qjYV14AWmV8SfT0u6Y8eIU6cKgQRvEK3c,1442
161
162
  omdev/tools/__init__.py,sha256=iVJAOQ0viGTQOm0DLX4uZLro-9jOioYJGLg9s0kDx1A,78
162
- omdev/tools/cloc.py,sha256=r5HkvaLoGw8djgvGdt_W_CjfSklW585dar9bDhDFeF8,5098
163
+ omdev/tools/cloc.py,sha256=jYlMHBae9oGKN4VKeBGuqjiQNcM2be7KIoTF0oNwx_I,5205
163
164
  omdev/tools/doc.py,sha256=wvgGhv6aFaV-Zl-Qivejx37i-lKQ207rZ-4K2fPf-Ss,2547
164
165
  omdev/tools/docker.py,sha256=KVFckA8eAdiapFUr8xkfMw9Uv3Qy4oNq0e70Lqt1F7I,7352
165
166
  omdev/tools/git.py,sha256=gqbvt8FFiPsj3vrQ7TxUiq9FpYX2c9UZ54io2p3-x7w,7541
@@ -181,9 +182,9 @@ omdev/tools/json/rendering.py,sha256=tMcjOW5edfozcMSTxxvF7WVTsbYLoe9bCKFh50qyaGw
181
182
  omdev/tools/pawk/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
182
183
  omdev/tools/pawk/__main__.py,sha256=VCqeRVnqT1RPEoIrqHFSu4PXVMg4YEgF4qCQm90-eRI,66
183
184
  omdev/tools/pawk/pawk.py,sha256=Eckymn22GfychCQcQi96BFqRo_LmiJ-EPhC8TTUJdB4,11446
184
- omdev-0.0.0.dev193.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
185
- omdev-0.0.0.dev193.dist-info/METADATA,sha256=Ee1AuYmCUHe3FBiEsoLVbAV7tYz8pmYC4yGIveGD8DY,1760
186
- omdev-0.0.0.dev193.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
187
- omdev-0.0.0.dev193.dist-info/entry_points.txt,sha256=dHLXFmq5D9B8qUyhRtFqTGWGxlbx3t5ejedjrnXNYLU,33
188
- omdev-0.0.0.dev193.dist-info/top_level.txt,sha256=1nr7j30fEWgLYHW3lGR9pkdHkb7knv1U1ES1XRNVQ6k,6
189
- omdev-0.0.0.dev193.dist-info/RECORD,,
185
+ omdev-0.0.0.dev195.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
186
+ omdev-0.0.0.dev195.dist-info/METADATA,sha256=ElF9ZdlagHdeBb92fpkesxv0SAiJhpzQxnuZBHNh06c,1760
187
+ omdev-0.0.0.dev195.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
188
+ omdev-0.0.0.dev195.dist-info/entry_points.txt,sha256=dHLXFmq5D9B8qUyhRtFqTGWGxlbx3t5ejedjrnXNYLU,33
189
+ omdev-0.0.0.dev195.dist-info/top_level.txt,sha256=1nr7j30fEWgLYHW3lGR9pkdHkb7knv1U1ES1XRNVQ6k,6
190
+ omdev-0.0.0.dev195.dist-info/RECORD,,