preparse 0.0.0.dev0__tar.gz → 0.0.1.dev1__tar.gz

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.
@@ -18,4 +18,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
18
  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
19
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
20
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
21
+ SOFTWARE.
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: preparse
3
- Version: 0.0.0.dev0
4
- Summary: preparse
3
+ Version: 0.0.1.dev1
4
+ Summary: preparse arguments
5
5
  Author-email: Johannes <johannes-programming@mailfence.com>
6
6
  License: The MIT License (MIT)
7
7
 
@@ -23,54 +23,27 @@ License: The MIT License (MIT)
23
23
  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24
24
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25
25
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26
- SOFTWARE.
27
-
26
+ SOFTWARE.
28
27
  Project-URL: Documentation, https://pypi.org/project/preparse
29
28
  Project-URL: Download, https://pypi.org/project/preparse/#files
29
+ Project-URL: Index, https://pypi.org/project/preparse
30
30
  Project-URL: Source, https://github.com/johannes-programming/preparse
31
- Classifier: Development Status :: 1 - Planning
31
+ Project-URL: Website, https://preparse.johannes-programming.online/
32
+ Classifier: Development Status :: 2 - Pre-Alpha
32
33
  Classifier: License :: OSI Approved :: MIT License
33
34
  Classifier: Programming Language :: Python
34
35
  Classifier: Programming Language :: Python :: 3
35
36
  Classifier: Programming Language :: Python :: 3 :: Only
36
- Requires-Python: >=3.12.5
37
+ Requires-Python: >=3.8
37
38
  Description-Content-Type: text/x-rst
38
39
  License-File: LICENSE.txt
40
+ Requires-Dist: click>=8.1.7
41
+ Requires-Dist: datarepr>=0.0.4
42
+ Requires-Dist: makefunc>=0.0.3
43
+ Requires-Dist: makeprop>=0.1.0
39
44
 
40
45
  ========
41
46
  preparse
42
47
  ========
43
48
 
44
- Overview
45
- --------
46
-
47
- preparse
48
-
49
- Installation
50
- ------------
51
-
52
- To install ``preparse``, you can use ``pip``. Open your terminal and run:
53
-
54
- .. code-block:: bash
55
-
56
- pip install preparse
57
-
58
- License
59
- -------
60
-
61
- This project is licensed under the MIT License.
62
-
63
- Links
64
- -----
65
-
66
- * `Documentation <https://pypi.org/project/preparse>`_
67
- * `Download <https://pypi.org/project/preparse/#files>`_
68
- * `Source <https://github.com/johannes-programming/preparse>`_
69
-
70
- Credits
71
- -------
72
-
73
- * Author: Johannes
74
- * Email: `johannes-programming@mailfence.com <mailto:johannes-programming@mailfence.com>`_
75
-
76
- Thank you for using ``preparse``!
49
+ Visit the website https://preparse.johannes-programming.online for more information.
@@ -0,0 +1,5 @@
1
+ ========
2
+ preparse
3
+ ========
4
+
5
+ Visit the website https://preparse.johannes-programming.online for more information.
@@ -9,19 +9,24 @@ authors = [
9
9
  { email = "johannes-programming@mailfence.com", name = "Johannes" },
10
10
  ]
11
11
  classifiers = [
12
- "Development Status :: 1 - Planning",
12
+ "Development Status :: 2 - Pre-Alpha",
13
13
  "License :: OSI Approved :: MIT License",
14
14
  "Programming Language :: Python",
15
15
  "Programming Language :: Python :: 3",
16
16
  "Programming Language :: Python :: 3 :: Only",
17
17
  ]
18
- dependencies = []
19
- description = "preparse"
18
+ dependencies = [
19
+ "click>=8.1.7",
20
+ "datarepr>=0.0.4",
21
+ "makefunc>=0.0.3",
22
+ "makeprop>=0.1.0",
23
+ ]
24
+ description = "preparse arguments"
20
25
  keywords = []
21
26
  name = "preparse"
22
27
  readme = "README.rst"
23
- requires-python = ">=3.12.5"
24
- version = "0.0.0.dev0"
28
+ requires-python = ">=3.8"
29
+ version = "0.0.1.dev1"
25
30
 
26
31
  [project.license]
27
32
  file = "LICENSE.txt"
@@ -29,4 +34,6 @@ file = "LICENSE.txt"
29
34
  [project.urls]
30
35
  Documentation = "https://pypi.org/project/preparse"
31
36
  Download = "https://pypi.org/project/preparse/#files"
37
+ Index = "https://pypi.org/project/preparse"
32
38
  Source = "https://github.com/johannes-programming/preparse"
39
+ Website = "https://preparse.johannes-programming.online/"
@@ -0,0 +1,2 @@
1
+ from preparse.core import *
2
+ from preparse.tests import *
@@ -0,0 +1,297 @@
1
+ import dataclasses
2
+ import enum
3
+ import functools
4
+ import operator
5
+ import os
6
+ import sys
7
+ import types
8
+ import warnings
9
+ from typing import *
10
+
11
+ import click as cl
12
+ from datarepr import datarepr
13
+ from makeprop import makeprop
14
+
15
+ __all__ = ["PreParser"]
16
+
17
+
18
+ class Abbrev(enum.IntEnum):
19
+ REJECT = 0
20
+ COMPLETE = 1
21
+ KEEP = 2
22
+
23
+
24
+ class Nargs(enum.IntEnum):
25
+ NO_ARGUMENT = 0
26
+ REQUIRED_ARGUMENT = 1
27
+ OPTIONAL_ARGUMENT = 2
28
+
29
+
30
+ @dataclasses.dataclass(kw_only=True)
31
+ class PreParser:
32
+ def __init__(
33
+ self,
34
+ optdict: Any = None,
35
+ prog: Any = None,
36
+ abbrev: Any = Abbrev.COMPLETE,
37
+ permutate: Any = True,
38
+ posix: Any = "infer",
39
+ ):
40
+ self._optdict = dict()
41
+ self.optdict = optdict
42
+ self.prog = prog
43
+ self.abbrev = abbrev
44
+ self.permutate = permutate
45
+ self.posix = posix
46
+
47
+ def __repr__(self) -> str:
48
+ return datarepr(type(self).__name__, **self.todict())
49
+
50
+ @makeprop()
51
+ def abbrev(self, value):
52
+ return Abbrev(value)
53
+
54
+ def click(self, *, cmd=True, ctx=True):
55
+ return Click(parser=self, cmd=cmd, ctx=ctx)
56
+
57
+ def clickCommand(self, cmd: cl.Command):
58
+ optdict = dict()
59
+ for p in cmd.params:
60
+ if not isinstance(p, cl.Option):
61
+ continue
62
+ if p.is_flag or p.nargs == 0:
63
+ optn = Nargs.NO_ARGUMENT
64
+ elif p.nargs == 1:
65
+ optn = Nargs.REQUIRED_ARGUMENT
66
+ else:
67
+ optn = Nargs.OPTIONAL_ARGUMENT
68
+ for o in p.opts:
69
+ optdict[str(o)] = optn
70
+ self.optdict.clear()
71
+ self.optdict.update(optdict)
72
+
73
+ def clickContext(self, ctx: cl.Context):
74
+ self.prog = ctx.info_name
75
+
76
+ def copy(self):
77
+ return type(self)(**self.todict())
78
+
79
+ @makeprop()
80
+ def optdict(self, value):
81
+ if value is None:
82
+ self._optdict.clear()
83
+ return self._optdict
84
+ value = dict(value)
85
+ self._optdict.clear()
86
+ self._optdict.update(value)
87
+ return self._optdict
88
+
89
+ def parse_args(self, args: Optional[Iterable] = None) -> List[str]:
90
+ if args is None:
91
+ args = sys.argv[1:]
92
+ return _Parsing(
93
+ parser=self.copy(),
94
+ args=list(args),
95
+ ).ans
96
+
97
+ @makeprop()
98
+ def permutate(self, value):
99
+ return bool(value)
100
+
101
+ @makeprop()
102
+ def posix(self, value):
103
+ if value == "infer":
104
+ value = os.environ.get("POSIXLY_CORRECT")
105
+ value = bool(value)
106
+ return value
107
+
108
+ @makeprop()
109
+ def prog(self, value):
110
+ if value is None:
111
+ value = os.path.basename(sys.argv[0])
112
+ return str(value)
113
+
114
+ def todict(self) -> dict:
115
+ return dict(
116
+ optdict=self.optdict,
117
+ prog=self.prog,
118
+ abbrev=self.abbrev,
119
+ permutate=self.permutate,
120
+ posix=self.posix,
121
+ )
122
+
123
+ def warn(self, message):
124
+ warnings.warn("%s: %s" % (self.prog, message))
125
+
126
+ def warnAboutUnrecognizedOption(self, option):
127
+ self.warn("unrecognized option %r" % option)
128
+
129
+ def warnAboutInvalidOption(self, option):
130
+ self.warn("invalid option -- %r" % option)
131
+
132
+ def warnAboutAmbigousOption(self, option, possibilities):
133
+ msg = "option %r is ambiguous; possibilities:" % option
134
+ for x in possibilities:
135
+ msg += " %r" % x
136
+ self.warn(msg)
137
+
138
+ def warnAboutNotAllowedArgument(self, option):
139
+ self.warn("option %r doesn't allow an argument" % option)
140
+
141
+ def warnAboutRequiredArgument(self, option):
142
+ self.warn("option requires an argument -- %r" % option)
143
+
144
+
145
+ @dataclasses.dataclass
146
+ class Click:
147
+ parser: Any
148
+ cmd: Any
149
+ ctx: Any
150
+
151
+ def __call__(self, target: Any):
152
+ if isinstance(target, types.FunctionType):
153
+ return self._f(target)
154
+ elif isinstance(target, types.MethodType):
155
+ return self._m(target)
156
+ elif isinstance(target, type):
157
+ return self._t(target)
158
+ else:
159
+ return self._o(target)
160
+
161
+ def _f(self, target):
162
+ @functools.wraps(target)
163
+ def ans(cmd, ctx, args):
164
+ p = self.parser.copy()
165
+ if self.cmd:
166
+ p = p.clickCommand(cmd)
167
+ if self.ctx:
168
+ p = p.clickContext(ctx)
169
+ return target(cmd, ctx, p.parse_args(args))
170
+
171
+ return ans
172
+
173
+ def _m(self, target):
174
+ func = self._f(target.__func__)
175
+ ans = types.MethodType(func, target.__self__)
176
+ return ans
177
+
178
+ def _t(self, target):
179
+ target.parse_args = self._f(target)
180
+ return target
181
+
182
+ def _o(self, target):
183
+ target.parse_args = self._m(target)
184
+ return target
185
+
186
+
187
+ @dataclasses.dataclass
188
+ class _Parsing:
189
+ parser: PreParser
190
+ args: list[str]
191
+
192
+ def __post_init__(self):
193
+ self.ans = list()
194
+ self.spec = list()
195
+ optn = 0
196
+ while self.args:
197
+ optn = self.tick(optn)
198
+ if optn == 1:
199
+ self.parser.warnAboutRequiredArgument(self.ans[-1])
200
+ self.ans += self.spec
201
+
202
+ @functools.cached_property
203
+ def islongonly(self):
204
+ for k in self.optdict.keys():
205
+ if len(k) < 3:
206
+ continue
207
+ if k.startswith("--"):
208
+ continue
209
+ if not k.startswith("-"):
210
+ continue
211
+ return True
212
+ return False
213
+
214
+ @functools.cached_property
215
+ def optdict(self):
216
+ ans = dict()
217
+ for k, v in self.parser.items():
218
+ ans[str(k)] = Nargs(v)
219
+ return ans
220
+
221
+ def possibilities(self, opt):
222
+ if opt in self.optdict.keys():
223
+ return [opt]
224
+ if self.parser.abbrev == Abbrev.REJECT:
225
+ return list()
226
+ ans = list()
227
+ for k in self.optdict.keys():
228
+ if k.startswith(opt):
229
+ ans.append(k)
230
+ return ans
231
+
232
+ def tick(self, optn):
233
+ arg = self.args.pop(0)
234
+ if optn == "break":
235
+ self.spec.append(arg)
236
+ return "break"
237
+ if optn == 1:
238
+ self.ans.append(arg)
239
+ return 0
240
+ elif arg == "--":
241
+ self.ans.append("--")
242
+ return "break"
243
+ elif arg.startswith("-") and arg != "-":
244
+ if arg.startswith("--") or self.islongonly:
245
+ return self.tick_long(arg)
246
+ else:
247
+ return self.tick_short(arg)
248
+ else:
249
+ if self.parser.posix:
250
+ self.spec.append(arg)
251
+ return "break"
252
+ elif self.parser.permutate:
253
+ self.spec.append(arg)
254
+ return 0
255
+ else:
256
+ self.ans.append(arg)
257
+ return 0
258
+
259
+ def tick_long(self, arg: str):
260
+ try:
261
+ i = arg.index("=")
262
+ except ValueError:
263
+ i = len(arg)
264
+ opt = arg[:i]
265
+ possibilities = self.possibilities(opt)
266
+ if len(possibilities) == 0:
267
+ self.parser.warnAboutUnrecognizedOption(arg)
268
+ self.ans.append(arg)
269
+ return 0
270
+ if len(possibilities) > 1:
271
+ self.parser.warnAboutAmbigousOption(arg, possibilities)
272
+ self.ans.append(arg)
273
+ return 0
274
+ opt = possibilities[0]
275
+ if self.parser.abbrev == Abbrev.COMPLETE:
276
+ self.ans.append(opt + arg[i:])
277
+ else:
278
+ self.ans.append(arg)
279
+ if "=" in arg:
280
+ if self.optdict[opt] == 0:
281
+ self.parser.warnAboutNotAllowedArgument(opt)
282
+ return 0
283
+ else:
284
+ return self.optdict[opt]
285
+
286
+ def tick_short(self, arg: str):
287
+ self.ans.append(arg)
288
+ for i in range(1 - len(arg), 0):
289
+ optn = self.optdict.get("-" + arg[i])
290
+ if optn is None:
291
+ self.parser.warnAboutInvalidOption(arg[i])
292
+ optn = 0
293
+ if i != -1 and optn != 0:
294
+ return 0
295
+ if i == -1 and optn == 1:
296
+ return 1
297
+ return 0
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: preparse
3
- Version: 0.0.0.dev0
4
- Summary: preparse
3
+ Version: 0.0.1.dev1
4
+ Summary: preparse arguments
5
5
  Author-email: Johannes <johannes-programming@mailfence.com>
6
6
  License: The MIT License (MIT)
7
7
 
@@ -23,54 +23,27 @@ License: The MIT License (MIT)
23
23
  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24
24
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25
25
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26
- SOFTWARE.
27
-
26
+ SOFTWARE.
28
27
  Project-URL: Documentation, https://pypi.org/project/preparse
29
28
  Project-URL: Download, https://pypi.org/project/preparse/#files
29
+ Project-URL: Index, https://pypi.org/project/preparse
30
30
  Project-URL: Source, https://github.com/johannes-programming/preparse
31
- Classifier: Development Status :: 1 - Planning
31
+ Project-URL: Website, https://preparse.johannes-programming.online/
32
+ Classifier: Development Status :: 2 - Pre-Alpha
32
33
  Classifier: License :: OSI Approved :: MIT License
33
34
  Classifier: Programming Language :: Python
34
35
  Classifier: Programming Language :: Python :: 3
35
36
  Classifier: Programming Language :: Python :: 3 :: Only
36
- Requires-Python: >=3.12.5
37
+ Requires-Python: >=3.8
37
38
  Description-Content-Type: text/x-rst
38
39
  License-File: LICENSE.txt
40
+ Requires-Dist: click>=8.1.7
41
+ Requires-Dist: datarepr>=0.0.4
42
+ Requires-Dist: makefunc>=0.0.3
43
+ Requires-Dist: makeprop>=0.1.0
39
44
 
40
45
  ========
41
46
  preparse
42
47
  ========
43
48
 
44
- Overview
45
- --------
46
-
47
- preparse
48
-
49
- Installation
50
- ------------
51
-
52
- To install ``preparse``, you can use ``pip``. Open your terminal and run:
53
-
54
- .. code-block:: bash
55
-
56
- pip install preparse
57
-
58
- License
59
- -------
60
-
61
- This project is licensed under the MIT License.
62
-
63
- Links
64
- -----
65
-
66
- * `Documentation <https://pypi.org/project/preparse>`_
67
- * `Download <https://pypi.org/project/preparse/#files>`_
68
- * `Source <https://github.com/johannes-programming/preparse>`_
69
-
70
- Credits
71
- -------
72
-
73
- * Author: Johannes
74
- * Email: `johannes-programming@mailfence.com <mailto:johannes-programming@mailfence.com>`_
75
-
76
- Thank you for using ``preparse``!
49
+ Visit the website https://preparse.johannes-programming.online for more information.
@@ -4,10 +4,11 @@ README.rst
4
4
  pyproject.toml
5
5
  setup.cfg
6
6
  src/preparse/__init__.py
7
- src/preparse/__main__.py
8
7
  src/preparse.egg-info/PKG-INFO
9
8
  src/preparse.egg-info/SOURCES.txt
10
9
  src/preparse.egg-info/dependency_links.txt
10
+ src/preparse.egg-info/requires.txt
11
11
  src/preparse.egg-info/top_level.txt
12
+ src/preparse/core/__init__.py
12
13
  src/preparse/tests/__init__.py
13
14
  src/preparse/tests/test_1984.py
@@ -0,0 +1,4 @@
1
+ click>=8.1.7
2
+ datarepr>=0.0.4
3
+ makefunc>=0.0.3
4
+ makeprop>=0.1.0
@@ -1,37 +0,0 @@
1
- ========
2
- preparse
3
- ========
4
-
5
- Overview
6
- --------
7
-
8
- preparse
9
-
10
- Installation
11
- ------------
12
-
13
- To install ``preparse``, you can use ``pip``. Open your terminal and run:
14
-
15
- .. code-block:: bash
16
-
17
- pip install preparse
18
-
19
- License
20
- -------
21
-
22
- This project is licensed under the MIT License.
23
-
24
- Links
25
- -----
26
-
27
- * `Documentation <https://pypi.org/project/preparse>`_
28
- * `Download <https://pypi.org/project/preparse/#files>`_
29
- * `Source <https://github.com/johannes-programming/preparse>`_
30
-
31
- Credits
32
- -------
33
-
34
- * Author: Johannes
35
- * Email: `johannes-programming@mailfence.com <mailto:johannes-programming@mailfence.com>`_
36
-
37
- Thank you for using ``preparse``!
@@ -1,6 +0,0 @@
1
- def main(args=None):
2
- print("Hello World!")
3
-
4
-
5
- if __name__ == "__main__":
6
- main()
@@ -1,4 +0,0 @@
1
- from preparse import main
2
-
3
- if __name__ == "__main__":
4
- main()
File without changes
File without changes