diff --git a/lib_not_dr/command/data.py b/lib_not_dr/command/data.py new file mode 100644 index 0000000..bfb5b3e --- /dev/null +++ b/lib_not_dr/command/data.py @@ -0,0 +1,40 @@ +from dataclasses import dataclass, field +from typing import Set, List + + +class Parsed: + ... + + +@dataclass +class Option: + name: str + shortcuts: List[str] + optional: bool + types: Set[type] = field(default_factory=lambda: {str}) + + +@dataclass +class OptionGroup: + options: List[Option] + optional: bool = True + exclusive: bool = False + + +@dataclass +class Argument: + name: str + types: Set[type] = field(default_factory=lambda: {str}) + + +@dataclass +class Flag: + name: str + shortcuts: List[str] + + +@dataclass +class FlagGroup: + flags: List[Flag] + exclusive: bool = False + diff --git a/lib_not_dr/command/exception.py b/lib_not_dr/command/exception.py index 56aad35..2f79c39 100644 --- a/lib_not_dr/command/exception.py +++ b/lib_not_dr/command/exception.py @@ -1,2 +1,2 @@ -class IllegalArgumentName(Exception): - """参数名称或快捷名不合法""" +class IllegalName(Exception): + """名称或快捷名不合法""" diff --git a/lib_not_dr/command/nodes.py b/lib_not_dr/command/nodes.py index 4a05109..2f1158f 100644 --- a/lib_not_dr/command/nodes.py +++ b/lib_not_dr/command/nodes.py @@ -5,18 +5,18 @@ # ------------------------------- import re -from dataclasses import dataclass -from typing import Callable, List, Optional, Union +from typing import Callable, List, Optional, Union, Set +from .data import Option, Argument, Flag, Parsed from .descriptor import CallBackDescriptor try: from typing import Self except ImportError: from typing import TypeVar - Self = TypeVar("Self") + Self = TypeVar("Self") # NOQA -from .exception import IllegalArgumentName +from .exception import IllegalName CallBack = Union[Callable[[str], None], str] # Equals to `Callable[[str], None] | str` # 可调用对象或字符串作为回调 @@ -29,21 +29,6 @@ ParseArgFunc = Callable[[str], Optional[type]] EMPTY_WORDS = re.compile(r"\s", re.I) -def check_once(cls, name) -> None: - """ - Check whether the attribute has been set. - if so, it will raise exception `AttributeError`. - 检查属性是否已经被设置。 - 如果已经被设置,将会抛出 `AttributeError` 异常。 - :param cls: class object - :param name: attribute name - :return: None - """ - if hasattr(cls, name): - if getattr(cls, name) is not None: - raise AttributeError(f"Attribute '{name}' has been set.") - - def check_name(name: Union[str, List[str]]) -> None: """ Check the name or shortcuts of argument(s) or flag(s). @@ -56,31 +41,13 @@ def check_name(name: Union[str, List[str]]) -> None: :return: None """ if isinstance(name, str) and EMPTY_WORDS.search(name): - raise IllegalArgumentName("The name of argument must not contains empty words.") + raise IllegalName("The name of argument must not contains empty words.") elif isinstance(name, list) and all((not isinstance(i, str)) and EMPTY_WORDS.search(i) for i in name): - raise IllegalArgumentName("The name of shortcut must be 'str', and must not contains empty words.") + raise IllegalName("The name of shortcut must be 'str', and must not contains empty words.") else: raise TypeError("The type of name must be 'str' or 'list[str]'.") -class Parsed: - ... - - -@dataclass -class Argument: - name: str - shortcuts: List[str] - optional: bool - type: type - - -@dataclass -class Flag: - name: str - shortcuts: List[str] - - class Literal: _tip = CallBackDescriptor("_tip") _func = CallBackDescriptor("_func") @@ -89,13 +56,13 @@ class Literal: def __init__(self, name: str): self.name: str = name self.sub: List[Self] = [] - - self._doc: Optional[str] = None self._tip: Optional[CallBack] = None self._func: Optional[CallBack] = None self._err_callback: Optional[CallBack] = None + + self._opts: List[Option] = [] self._args: List[Argument] = [] - self._flags: List[Argument] + self._flags: List[Flag] = [] def __call__(self, *nodes) -> Self: self.sub += nodes @@ -105,32 +72,40 @@ class Literal: attrs = (k for k in self.__dict__ if not (k.startswith("__") and k.endswith("__"))) return f"{self.__class__.__name__}({', '.join(f'{k}={v!r}' for k in attrs if (v := self.__dict__[k]))})" - def arg( + def arg(self, name: str, types: Optional[Set[type]] = None) -> Self: + Argument(name=name, types=types) + return self + + def opt( self, name: str, shortcuts: Optional[List[str]] = None, optional: bool = True, - type: Optional[type] = None + types: Optional[Set[type]] = None ) -> Self: check_name(name) if shortcuts is not None and len(shortcuts) != 0: check_name(shortcuts) - Argument(name=name, shortcuts=shortcuts, optional=optional, type=type) + self._opts.append( + Option(name=name, shortcuts=shortcuts, optional=optional, types=types) + ) return self - def arg_group(self, args: List[Argument], exclusive: bool = False): + def opt_group(self, opts: List[Option], exclusive: bool = False): ... def flag(self, name: str, shortcuts: Optional[List[str]] = None) -> Self: check_name(name) if shortcuts is not None and len(shortcuts) != 0: check_name(shortcuts) - # Flag(...) + Flag(name=name, shortcuts=shortcuts) ... return self - def flag_group(self, flags: List[Flag], exclusive: bool = False): + def flag_group(self, flags: List[Flag], exclusive: bool = False) -> Self: + ... + return self def error(self, callback: CallBack) -> Self: self._err_callback = callback @@ -149,8 +124,6 @@ class Literal: def to_doc(self) -> str: ... - self._doc = ... - return self._doc def builder(node: Literal) -> Literal: diff --git a/pdm.lock b/pdm.lock index a953a4a..503df2a 100644 --- a/pdm.lock +++ b/pdm.lock @@ -1,10 +1,83 @@ # This file is @generated by PDM. # It is not intended for manual editing. +[[package]] +name = "nepattern" +version = "0.5.10" +requires_python = ">=3.8" +summary = "a complex pattern, support typing" +dependencies = [ + "tarina>=0.3.3", + "typing-extensions>=4.5.0", +] + +[[package]] +name = "tarina" +version = "0.3.3" +requires_python = ">=3.8" +summary = "A collection of common utils for Arclet" +dependencies = [ + "typing-extensions>=4.4.0", +] + +[[package]] +name = "typing-extensions" +version = "4.7.1" +requires_python = ">=3.7" +summary = "Backported and Experimental Type Hints for Python 3.7+" + [metadata] lock_version = "4.2" cross_platform = true groups = ["default"] -content_hash = "sha256:cb30ff0b06924f6f0d5f726b84c255686a2e277a4180b00b7b6e427c05ca202b" +content_hash = "sha256:73e5bcd71ae7bae870ea57f3a7aefed66821d6b549ec2ca2e8cf202e645c2aa3" [metadata.files] +"nepattern 0.5.10" = [ + {url = "https://files.pythonhosted.org/packages/5b/07/295a685764d31e171ce0551f1d46c289d5279a80544629e86facaae946b1/nepattern-0.5.10-py3-none-any.whl", hash = "sha256:cfeae4906ed94ed4a5198da102b0f730a1c61793f7d0bfd0e63ca9dbd325e9d6"}, + {url = "https://files.pythonhosted.org/packages/ec/a3/e3c59a4a4878787913637ac5c3327912fe3bdc3afb997902b55cfcf0eb2a/nepattern-0.5.10.tar.gz", hash = "sha256:70648453e94aee75575e4e4ee13ba876d11ac20d8a80fe5eb7dc7e43573e0918"}, +] +"tarina 0.3.3" = [ + {url = "https://files.pythonhosted.org/packages/11/37/7948ddeb644212875fe18a8bb4e68dc3f1fc16fc18e4ecf51b79a0036a8d/tarina-0.3.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:934d970d4f355fe0042325f1c50c4ff885fa6d114c9c4b062a293f8d378b70f8"}, + {url = "https://files.pythonhosted.org/packages/11/d5/d686f2ae369c58c70a0eced645a9e6bd4fb4cf4f38cebb7a5cbd91f878f8/tarina-0.3.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:3cfb1cb0b6eabcd745d083d6031bab3319e46da94ca1df62cea1bbcc1abe3159"}, + {url = "https://files.pythonhosted.org/packages/12/22/a5ef2ad9cec1c23fce161817f10596c03c01af70cf248c7060702dbc7321/tarina-0.3.3.tar.gz", hash = "sha256:ac9faf7569021cfa137a9cee1be5185bae9ff4e4e6a5b93c66abdf056d1e04fa"}, + {url = "https://files.pythonhosted.org/packages/19/a3/3f79a4afaaac21c52785b60101a89ec79dbb645daa51e3b7f08dffc0c659/tarina-0.3.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d2c3c7808a3984f00b16f101c36443a042d3abc8ff5d5e84b9cb3fabebb330b1"}, + {url = "https://files.pythonhosted.org/packages/1b/a6/3005c325cdd7ba5eaa9b619b182cf8b75264ea409759dadf6d261d615c6d/tarina-0.3.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e1d28e974fe5915dde245019430f248ddbdd91e8df1dec53306448cc24f4d9a8"}, + {url = "https://files.pythonhosted.org/packages/1c/ad/376ad6150ad45039876f61984420535cdfe5c5db3433804d68dae995a167/tarina-0.3.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3efce03c7a46118afd009dc56169030dc8b698f6da20fce25cd0139530525d80"}, + {url = "https://files.pythonhosted.org/packages/20/4f/774bef8e456859529cb1bcabaf1639cc33fb8f5dd4c024f8a27a2f7a5e48/tarina-0.3.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3c4cec6381869116c7a8f7d9b0cb7433967f5b324faa9fc2e4784fdb9bab79f8"}, + {url = "https://files.pythonhosted.org/packages/2b/2c/2d1501948a95a45187d5add6f468ea46f5ec23e5fb713661fb5a3ed5cc10/tarina-0.3.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5195c7f9fa2313bdf422c24b8ed0b8d9549c4e46afc0c96eeaefdf1d2caa30e9"}, + {url = "https://files.pythonhosted.org/packages/2c/1f/124aeff1910a9393b9823594f17468fcd591e1e85e60c5f8be27a7f12e07/tarina-0.3.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:788001d26cb84a752df569aef900387ac4d9b2273b38b9ed26f6d56b4644aa06"}, + {url = "https://files.pythonhosted.org/packages/2c/f0/bdb27f86f0cb2ece0acb3e626ceaee508dcc261e16722a43f688058dfbe0/tarina-0.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2c643c1e384e206af3ba2eb7142f6b3680d51d0b51e01a61bbf1f3350040c791"}, + {url = "https://files.pythonhosted.org/packages/2e/07/e03e5fec539279d7cca66f883fc1e13fc4fb188c1df3f107b6b74de98e5c/tarina-0.3.3-py3-none-any.whl", hash = "sha256:0547c75e3e53ca202c420e6d829d5bcf5758e478fc5964b92f9de2f838cfb12a"}, + {url = "https://files.pythonhosted.org/packages/3a/39/abeb158b7c1b94542b4b68f0a07f7739ca0ff0be7064bfcbb138f85282fa/tarina-0.3.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d33bcfaad022214a5a534c065b69c14ad9f2e53aa03198d6de0216e173fec98b"}, + {url = "https://files.pythonhosted.org/packages/3a/8d/bb611259872326280f5b97fbb864c2739a76399a3c52e4d633d3dbc67b78/tarina-0.3.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa2897e7cad66be833c2e392181ecff33e59038bf85cf18000c3e48c2ee85fde"}, + {url = "https://files.pythonhosted.org/packages/42/11/97465d907f8b2e26358b07d3b67b568557990efc04995a0e2a303dca6e1b/tarina-0.3.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd778f324c512403afa3973661c480d6529a403435d205ee7bf7fc586894f4c1"}, + {url = "https://files.pythonhosted.org/packages/51/7a/6cb5efb75d526e72e9846e6fb71dae96e6e27470a965b0770c29a3c5a83a/tarina-0.3.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:de2429a632f31b09bdb2d5f668311d7de4882f1ac3ebc5022decf647f900af5a"}, + {url = "https://files.pythonhosted.org/packages/5b/6a/be6bf22769ef3e55e8afc4c256080613a5ec97d7a6f6787c9414c86b0061/tarina-0.3.3-cp310-cp310-win32.whl", hash = "sha256:ca4b1978614dbb5f30c4378be1ad4f4aa6fb227cdf32740964ee9760d6a8e3a9"}, + {url = "https://files.pythonhosted.org/packages/5e/32/30fae8ac68095dd919c0435c8ee744ed50a7f4b3942288a3294a8f3fa3f2/tarina-0.3.3-cp39-cp39-win32.whl", hash = "sha256:f6b7fc1799a70cc14548086602a2343562de722c490649c4bf2e74eb7c542c04"}, + {url = "https://files.pythonhosted.org/packages/62/cd/2f3722c02cf93cf68d92567efa7c5f632af3d15a686127241b52216b207a/tarina-0.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a14079252a54501285956f1e96004477af8b9ae64a575f561b99bfa778c01707"}, + {url = "https://files.pythonhosted.org/packages/67/67/e4f5bbe1bc4c696ac09a1325bcc3a9a464185914f0a2302e695e68f42757/tarina-0.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4dcc7112b927a023a635528566b62beb7a99f72f2b9e88fde29fafb61136a579"}, + {url = "https://files.pythonhosted.org/packages/69/ef/b24dc2963cb1b788e3331bc703f7c1d1963fc8b4a8c99b82f78c78fc0528/tarina-0.3.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:fbcaa4a6c57528ed23199f778445d20215cc2421c1d494dedbe671164bd29dc5"}, + {url = "https://files.pythonhosted.org/packages/6e/4b/f0bacb8118a30193150dd7d078a398bac5739ffbc3270652492dd656193d/tarina-0.3.3-cp38-cp38-win32.whl", hash = "sha256:5ec78f0d8bc5b529502e1be20bb8dc628ff1a6c5e31941f9572c105c6fe591b1"}, + {url = "https://files.pythonhosted.org/packages/72/7f/17d999c886905a0672337adb9501400c8a2ab209feaae0bb3eba7627cba1/tarina-0.3.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:35dc66fb6baac12fca363380ff12fd27164481f281f82ac2282e500b53fef961"}, + {url = "https://files.pythonhosted.org/packages/78/92/b24dddc1b836beaa6733c9b2caf51410a6cce0873ae6d55344f2d22db26b/tarina-0.3.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:1f78d6f75da0d34061ade10d0e1aeec3018a4d36836568085a4eb79fef65bb7e"}, + {url = "https://files.pythonhosted.org/packages/80/20/2c8303ab730af65a79a8cae869b463936bac2236519595c5e4259b72f4b8/tarina-0.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:9f8a0a505a9b226d1d45483fac105c55407c13a95449e15562601128dc2359d1"}, + {url = "https://files.pythonhosted.org/packages/8c/06/b864bceb1597ba142d729c34798aa6251879bb276d3b3f965b18c673fcad/tarina-0.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:efa6e1ab03c1948e3efd4645b8960dd312407e029462726a9e77822261a6be3d"}, + {url = "https://files.pythonhosted.org/packages/8f/ca/472e18aa2bbef0bb83526089012f2628a69a8b0213c1bb6cbd51c11f736c/tarina-0.3.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ccb1090fccd3dea3596bdea5ac80b7379663741dd5023b97840dca968f4081bd"}, + {url = "https://files.pythonhosted.org/packages/91/1f/1d7a52e8558eac6d5dd9ade3e88a2458e224178e018d9e602896cea20b05/tarina-0.3.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ecb4cbe65fe9b4e4c91ededb9d6941aae80b6827f07827e12e7ba3f7c3109c02"}, + {url = "https://files.pythonhosted.org/packages/c5/55/65ab39d0fd1c6010c7ae874d8c659b7d95ef415b5dd2489cda246ceff669/tarina-0.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f56b904a451e287e6251c1312be628afddf670bfa87841b5b1c32d324a1c7c43"}, + {url = "https://files.pythonhosted.org/packages/c6/f5/1180b80fe98bf86e0e7e7defdbf6fa7859795b77f7bf91cdb368e8d5b0cf/tarina-0.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:730a8fc6dc71adf09197a73ef1e39978e5fe7ec3b7be9a5060905fe48baf27ec"}, + {url = "https://files.pythonhosted.org/packages/d2/8a/7a922a79e2f6ae6bf0f3bac63e5f1cdfa39abf987b5a122a70bc327144e6/tarina-0.3.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:9b9a99acff1e6391c593f449ae76848471d34688f04eecf7d3ba0725157563c7"}, + {url = "https://files.pythonhosted.org/packages/d3/eb/bbbc5e5666382a55ab6e5d7c4dc68833af6126db2eb96a2836b8afe86d3c/tarina-0.3.3-cp311-cp311-win32.whl", hash = "sha256:87da7c87f448180712c02f6345c686742d9e755d58bb32f70c1bf680e1ae0684"}, + {url = "https://files.pythonhosted.org/packages/d8/55/2f96d10417cf96a6667d3a5d68bcfd9cf0dde7452d69a8970694529ae7eb/tarina-0.3.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6471aef032461a6917a24af1fb9952bfb5c9bbe26999ea87455bf43157687097"}, + {url = "https://files.pythonhosted.org/packages/de/14/2224da3ba13fb3d63d9a1da7747a55c43f4f3436344e03cd91bcdecb2fed/tarina-0.3.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:201e31c7b694132ce67662f63142b33e45835223a753fd5f4d301da5ac021b5e"}, + {url = "https://files.pythonhosted.org/packages/e6/21/78f9911125401d8256563bd94cb0d8b5a4a63fac1ecbdcfd5c4b9bff9c03/tarina-0.3.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5e2e0f5a3760823b23cc3fe49d01c0a75d482560c60934764e2142d187e553b"}, + {url = "https://files.pythonhosted.org/packages/ec/d4/9643018bb37a2c4e87331633d7c232d2fab3d6017c1f6fb580c87c10a988/tarina-0.3.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7546e4cefadcc5f163611b0af8af2391b711c337d7a0d32a3977ec0bf3e8c87d"}, + {url = "https://files.pythonhosted.org/packages/f6/a1/afd77bdf28621f3e9771288a9c866f5685610fc6ae4bdc6b4a34ea74d3e2/tarina-0.3.3-cp38-cp38-win_amd64.whl", hash = "sha256:ff5e49a37d6d72a392f8a84c6808f7cc00494352d9e459a0a3921e587b2ecb3f"}, + {url = "https://files.pythonhosted.org/packages/f8/b8/a7ab3d3e0281c2135c53ffb43e703653359374a5696057c55fbff8bc779a/tarina-0.3.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae87c40c09a62b0898267fb4cbeaece3ca2d7bd8cd2f50c8ecb19583cca3fa64"}, + {url = "https://files.pythonhosted.org/packages/f8/cd/be747301ea89ee45b5c38b0144a70ac5ed0abc0c3fe98842f528f8797da5/tarina-0.3.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c1ff19bf0b6e554d2fb3d6db35d74553a02b3781167370d11bc950f92fb33ba"}, +] +"typing-extensions 4.7.1" = [ + {url = "https://files.pythonhosted.org/packages/3c/8b/0111dd7d6c1478bf83baa1cab85c686426c7a6274119aceb2bd9d35395ad/typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"}, + {url = "https://files.pythonhosted.org/packages/ec/6b/63cc3df74987c36fe26157ee12e09e8f9db4de771e0f3404263117e75b95/typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36"}, +] diff --git a/pyproject.toml b/pyproject.toml index 45b221d..ebceb95 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,22 +1,22 @@ [project] version = "0.1.0" name = "lib-not-dr" - description = "A python lib created from Difficult Rocket development" - readme = "README.md" - authors = [ {name = "shenjackyuanjie", email = "3695888@qq.com"} ] requires-python = ">=3.8" - classifiers = [ "Programming Language :: Python :: 3", "Operating System :: OS Independent", ] license = { file = "LICENSE" } +dependencies = [ + "nepattern>=0.5.10", +] + [project.urls] Homepage = "https://github.com/shenjackyuanjie/lib-not-dr" Repository = "https://github.com/shenjackyuanjie/lib-not-dr" @@ -24,13 +24,9 @@ Changelog = "https://github.com/shenjackyuanjie/lib-not-dr/blob/main/docs/change [tool.ruff] - target-version = "py38" - line-length = 150 - src = [ "lib_not_dr" ] - format = "grouped" \ No newline at end of file