summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--python-smart-arg.spec465
-rw-r--r--sources1
3 files changed, 467 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
index e69de29..545a889 100644
--- a/.gitignore
+++ b/.gitignore
@@ -0,0 +1 @@
+/smart-arg-1.1.2.tar.gz
diff --git a/python-smart-arg.spec b/python-smart-arg.spec
new file mode 100644
index 0000000..dd39b9a
--- /dev/null
+++ b/python-smart-arg.spec
@@ -0,0 +1,465 @@
+%global _empty_manifest_terminate_build 0
+Name: python-smart-arg
+Version: 1.1.2
+Release: 1
+Summary: Argument class <=> Human friendly cli
+License: BSD-2-CLAUSE
+URL: https://smart-arg.readthedocs.io
+Source0: https://mirrors.nju.edu.cn/pypi/web/packages/e6/a5/dbe281299d40a574071a5704d73775970c3d148bd55cf69dd9d475bcafe0/smart-arg-1.1.2.tar.gz
+BuildArch: noarch
+
+
+%description
+# Smart Argument Suite (`smart-arg`)
+
+[![GitHub tag](https://img.shields.io/github/tag/linkedin/smart-arg.svg)](https://GitHub.com/linkedin/smart-arg/tags/)
+[![PyPI version](https://img.shields.io/pypi/v/smart-arg.svg)](https://pypi.python.org/pypi/smart-arg/)
+
+Smart Argument Suite (`smart-arg`) is a slim and handy Python library that helps one work safely and conveniently
+with the arguments that are represented by an immutable argument container class' fields
+([`NamedTuple`](https://docs.python.org/3.7/library/typing.html?highlight=namedtuple#typing.NamedTuple) or
+[`dataclass`](https://docs.python.org/3.7/library/dataclasses.html#dataclasses.dataclass) out-of-box),
+and passed through command-line interfaces.
+
+`smart-arg` promotes arguments type-safety, enables IDEs' code autocompletion and type hints
+functionalities, and helps one produce correct code.
+
+![](smart-arg-demo.gif)
+
+## Quick start
+
+The [`smart-arg`](https://pypi.org/project/smart-arg/) package is available through `pip`.
+```shell
+pip3 install smart-arg
+```
+
+Users can bring or define, if not already, their argument container class -- a `NamedTuple` or `dataclass`,
+and then annotate it with `smart-arg` decorator `@arg_suite` in their Python scripts.
+
+Now an argument container class instance, e.g. `my_arg` of `MyArg` class, once created, is ready to be serialized by the `smart-arg` API --
+`my_arg.__to_argv__()` to a sequence of strings, passed through the command-line interface
+and then deserialized back to an instance again by `my_arg = MyArg.__from_argv__(sys.argv[1:])`.
+
+```python
+import sys
+from typing import NamedTuple, List, Tuple, Dict, Optional
+from smart_arg import arg_suite
+
+
+# Define the argument container class
+@arg_suite
+class MyArg(NamedTuple):
+ """
+ MyArg is smart! (docstring goes to description)
+ """
+ nn: List[int] # Comments go to argparse help
+ a_tuple: Tuple[str, int] # a random tuple argument
+ encoder: str # Text encoder type
+ h_param: Dict[str, int] # Hyperparameters
+ batch_size: Optional[int] = None
+ adp: bool = True # bool is a bit tricky
+ embedding_dim: int = 100 # Size of embedding vector
+ lr: float = 1e-3 # Learning rate
+
+
+def cli_interfaced_job_scheduler():
+ """
+ This is to be called by the job scheduler to set up the job launching command,
+ i.e., producer side of the Python job arguments
+ """
+ # Create the argument container instance
+ my_arg = MyArg(nn=[3], a_tuple=("str", 1), encoder='lstm', h_param={}, adp=False) # The patched argument container class requires keyword arguments to instantiate the class
+
+ # Serialize the argument to command-line representation
+ argv = my_arg.__to_argv__()
+ cli = 'my_job.py ' + ' '.join(argv)
+ # Schedule the job with command line `cli`
+ print(f"Executing job:\n{cli}")
+ # Executing job:
+ # my_job.py --nn 3 --a_tuple str 1 --encoder lstm --h_param --batch_size None --adp False --embedding_dim 100 --lr 0.001
+
+
+def my_job(my_arg: MyArg):
+ """
+ This is the actual job defined by the input argument my_arg,
+ i.e., consumer side of the Python job arguments
+ """
+ print(my_arg)
+ # MyArg(nn=[3], a_tuple=('str', 1), encoder='lstm', h_param={}, batch_size=None, adp=False, embedding_dim=100, lr=0.001)
+
+ # `my_arg` can be used in later script with a typed manner, which help of IDEs (type hints and auto completion)
+ # ...
+ print(f"My network has {len(my_arg.nn)} layers with sizes of {my_arg.nn}.")
+ # My network has 1 layers with sizes of [3].
+
+
+# my_job.py
+if __name__ == '__main__':
+ # Deserialize the command-line representation of the argument back to a container instance
+ arg_deserialized: MyArg = MyArg.__from_argv__(sys.argv[1:]) # Equivalent to `MyArg(None)`, one positional arg required to indicate the arg is a command-line representation.
+ my_job(arg_deserialized)
+```
+
+```shell-session
+> python my_job.py -h
+usage: my_job.py [-h] --nn [int [int ...]] --a_tuple str int --encoder str
+ --h_param [str:int [str:int ...]] [--batch_size int]
+ [--adp {True,False}] [--embedding_dim int] [--lr float]
+
+MyArg is smart! (docstring goes to description)
+
+optional arguments:
+ -h, --help show this help message and exit
+ --nn [int [int ...]] (List[int], required) Comments go to argparse help
+ --a_tuple str int (Tuple[str, int], required) a random tuple argument
+ --encoder str (str, required) Text encoder type
+ --h_param [str:int [str:int ...]]
+ (Dict[str, int], required) Hyperparameters
+ --batch_size int (Optional[int], default: None)
+ --adp {True,False} (bool, default: True) bool is a bit tricky
+ --embedding_dim int (int, default: 100) Size of embedding vector
+ --lr float (float, default: 0.001) Learning rate
+
+```
+## Promoted practices
+* Focus on defining the arguments diligently, and let the `smart-arg`
+ (backed by [argparse.ArgumentParser](https://docs.python.org/3/library/argparse.html#argumentparser-objects))
+ work its magic around command-line interface.
+* Always work directly with argument container class instances when possible, even if you only need to generate the command-line representation.
+* Stick to the default behavior and the basic features, think twice before using any of the [advanced features](https://smart-arg.readthedocs.io/en/latest/advanced.html#advanced-usages).
+
+
+## More detail
+For more features and implementation detail, please refer to the [documentation](https://smart-arg.readthedocs.io/).
+
+## Contributing
+
+Please read [CONTRIBUTING.md](CONTRIBUTING.md) for details on our code of conduct, and the process for submitting pull requests to us.
+
+## License
+
+This project is licensed under the BSD 2-CLAUSE LICENSE - see the [LICENSE.md](LICENSE.md) file for details
+
+
+
+
+%package -n python3-smart-arg
+Summary: Argument class <=> Human friendly cli
+Provides: python-smart-arg
+BuildRequires: python3-devel
+BuildRequires: python3-setuptools
+BuildRequires: python3-pip
+%description -n python3-smart-arg
+# Smart Argument Suite (`smart-arg`)
+
+[![GitHub tag](https://img.shields.io/github/tag/linkedin/smart-arg.svg)](https://GitHub.com/linkedin/smart-arg/tags/)
+[![PyPI version](https://img.shields.io/pypi/v/smart-arg.svg)](https://pypi.python.org/pypi/smart-arg/)
+
+Smart Argument Suite (`smart-arg`) is a slim and handy Python library that helps one work safely and conveniently
+with the arguments that are represented by an immutable argument container class' fields
+([`NamedTuple`](https://docs.python.org/3.7/library/typing.html?highlight=namedtuple#typing.NamedTuple) or
+[`dataclass`](https://docs.python.org/3.7/library/dataclasses.html#dataclasses.dataclass) out-of-box),
+and passed through command-line interfaces.
+
+`smart-arg` promotes arguments type-safety, enables IDEs' code autocompletion and type hints
+functionalities, and helps one produce correct code.
+
+![](smart-arg-demo.gif)
+
+## Quick start
+
+The [`smart-arg`](https://pypi.org/project/smart-arg/) package is available through `pip`.
+```shell
+pip3 install smart-arg
+```
+
+Users can bring or define, if not already, their argument container class -- a `NamedTuple` or `dataclass`,
+and then annotate it with `smart-arg` decorator `@arg_suite` in their Python scripts.
+
+Now an argument container class instance, e.g. `my_arg` of `MyArg` class, once created, is ready to be serialized by the `smart-arg` API --
+`my_arg.__to_argv__()` to a sequence of strings, passed through the command-line interface
+and then deserialized back to an instance again by `my_arg = MyArg.__from_argv__(sys.argv[1:])`.
+
+```python
+import sys
+from typing import NamedTuple, List, Tuple, Dict, Optional
+from smart_arg import arg_suite
+
+
+# Define the argument container class
+@arg_suite
+class MyArg(NamedTuple):
+ """
+ MyArg is smart! (docstring goes to description)
+ """
+ nn: List[int] # Comments go to argparse help
+ a_tuple: Tuple[str, int] # a random tuple argument
+ encoder: str # Text encoder type
+ h_param: Dict[str, int] # Hyperparameters
+ batch_size: Optional[int] = None
+ adp: bool = True # bool is a bit tricky
+ embedding_dim: int = 100 # Size of embedding vector
+ lr: float = 1e-3 # Learning rate
+
+
+def cli_interfaced_job_scheduler():
+ """
+ This is to be called by the job scheduler to set up the job launching command,
+ i.e., producer side of the Python job arguments
+ """
+ # Create the argument container instance
+ my_arg = MyArg(nn=[3], a_tuple=("str", 1), encoder='lstm', h_param={}, adp=False) # The patched argument container class requires keyword arguments to instantiate the class
+
+ # Serialize the argument to command-line representation
+ argv = my_arg.__to_argv__()
+ cli = 'my_job.py ' + ' '.join(argv)
+ # Schedule the job with command line `cli`
+ print(f"Executing job:\n{cli}")
+ # Executing job:
+ # my_job.py --nn 3 --a_tuple str 1 --encoder lstm --h_param --batch_size None --adp False --embedding_dim 100 --lr 0.001
+
+
+def my_job(my_arg: MyArg):
+ """
+ This is the actual job defined by the input argument my_arg,
+ i.e., consumer side of the Python job arguments
+ """
+ print(my_arg)
+ # MyArg(nn=[3], a_tuple=('str', 1), encoder='lstm', h_param={}, batch_size=None, adp=False, embedding_dim=100, lr=0.001)
+
+ # `my_arg` can be used in later script with a typed manner, which help of IDEs (type hints and auto completion)
+ # ...
+ print(f"My network has {len(my_arg.nn)} layers with sizes of {my_arg.nn}.")
+ # My network has 1 layers with sizes of [3].
+
+
+# my_job.py
+if __name__ == '__main__':
+ # Deserialize the command-line representation of the argument back to a container instance
+ arg_deserialized: MyArg = MyArg.__from_argv__(sys.argv[1:]) # Equivalent to `MyArg(None)`, one positional arg required to indicate the arg is a command-line representation.
+ my_job(arg_deserialized)
+```
+
+```shell-session
+> python my_job.py -h
+usage: my_job.py [-h] --nn [int [int ...]] --a_tuple str int --encoder str
+ --h_param [str:int [str:int ...]] [--batch_size int]
+ [--adp {True,False}] [--embedding_dim int] [--lr float]
+
+MyArg is smart! (docstring goes to description)
+
+optional arguments:
+ -h, --help show this help message and exit
+ --nn [int [int ...]] (List[int], required) Comments go to argparse help
+ --a_tuple str int (Tuple[str, int], required) a random tuple argument
+ --encoder str (str, required) Text encoder type
+ --h_param [str:int [str:int ...]]
+ (Dict[str, int], required) Hyperparameters
+ --batch_size int (Optional[int], default: None)
+ --adp {True,False} (bool, default: True) bool is a bit tricky
+ --embedding_dim int (int, default: 100) Size of embedding vector
+ --lr float (float, default: 0.001) Learning rate
+
+```
+## Promoted practices
+* Focus on defining the arguments diligently, and let the `smart-arg`
+ (backed by [argparse.ArgumentParser](https://docs.python.org/3/library/argparse.html#argumentparser-objects))
+ work its magic around command-line interface.
+* Always work directly with argument container class instances when possible, even if you only need to generate the command-line representation.
+* Stick to the default behavior and the basic features, think twice before using any of the [advanced features](https://smart-arg.readthedocs.io/en/latest/advanced.html#advanced-usages).
+
+
+## More detail
+For more features and implementation detail, please refer to the [documentation](https://smart-arg.readthedocs.io/).
+
+## Contributing
+
+Please read [CONTRIBUTING.md](CONTRIBUTING.md) for details on our code of conduct, and the process for submitting pull requests to us.
+
+## License
+
+This project is licensed under the BSD 2-CLAUSE LICENSE - see the [LICENSE.md](LICENSE.md) file for details
+
+
+
+
+%package help
+Summary: Development documents and examples for smart-arg
+Provides: python3-smart-arg-doc
+%description help
+# Smart Argument Suite (`smart-arg`)
+
+[![GitHub tag](https://img.shields.io/github/tag/linkedin/smart-arg.svg)](https://GitHub.com/linkedin/smart-arg/tags/)
+[![PyPI version](https://img.shields.io/pypi/v/smart-arg.svg)](https://pypi.python.org/pypi/smart-arg/)
+
+Smart Argument Suite (`smart-arg`) is a slim and handy Python library that helps one work safely and conveniently
+with the arguments that are represented by an immutable argument container class' fields
+([`NamedTuple`](https://docs.python.org/3.7/library/typing.html?highlight=namedtuple#typing.NamedTuple) or
+[`dataclass`](https://docs.python.org/3.7/library/dataclasses.html#dataclasses.dataclass) out-of-box),
+and passed through command-line interfaces.
+
+`smart-arg` promotes arguments type-safety, enables IDEs' code autocompletion and type hints
+functionalities, and helps one produce correct code.
+
+![](smart-arg-demo.gif)
+
+## Quick start
+
+The [`smart-arg`](https://pypi.org/project/smart-arg/) package is available through `pip`.
+```shell
+pip3 install smart-arg
+```
+
+Users can bring or define, if not already, their argument container class -- a `NamedTuple` or `dataclass`,
+and then annotate it with `smart-arg` decorator `@arg_suite` in their Python scripts.
+
+Now an argument container class instance, e.g. `my_arg` of `MyArg` class, once created, is ready to be serialized by the `smart-arg` API --
+`my_arg.__to_argv__()` to a sequence of strings, passed through the command-line interface
+and then deserialized back to an instance again by `my_arg = MyArg.__from_argv__(sys.argv[1:])`.
+
+```python
+import sys
+from typing import NamedTuple, List, Tuple, Dict, Optional
+from smart_arg import arg_suite
+
+
+# Define the argument container class
+@arg_suite
+class MyArg(NamedTuple):
+ """
+ MyArg is smart! (docstring goes to description)
+ """
+ nn: List[int] # Comments go to argparse help
+ a_tuple: Tuple[str, int] # a random tuple argument
+ encoder: str # Text encoder type
+ h_param: Dict[str, int] # Hyperparameters
+ batch_size: Optional[int] = None
+ adp: bool = True # bool is a bit tricky
+ embedding_dim: int = 100 # Size of embedding vector
+ lr: float = 1e-3 # Learning rate
+
+
+def cli_interfaced_job_scheduler():
+ """
+ This is to be called by the job scheduler to set up the job launching command,
+ i.e., producer side of the Python job arguments
+ """
+ # Create the argument container instance
+ my_arg = MyArg(nn=[3], a_tuple=("str", 1), encoder='lstm', h_param={}, adp=False) # The patched argument container class requires keyword arguments to instantiate the class
+
+ # Serialize the argument to command-line representation
+ argv = my_arg.__to_argv__()
+ cli = 'my_job.py ' + ' '.join(argv)
+ # Schedule the job with command line `cli`
+ print(f"Executing job:\n{cli}")
+ # Executing job:
+ # my_job.py --nn 3 --a_tuple str 1 --encoder lstm --h_param --batch_size None --adp False --embedding_dim 100 --lr 0.001
+
+
+def my_job(my_arg: MyArg):
+ """
+ This is the actual job defined by the input argument my_arg,
+ i.e., consumer side of the Python job arguments
+ """
+ print(my_arg)
+ # MyArg(nn=[3], a_tuple=('str', 1), encoder='lstm', h_param={}, batch_size=None, adp=False, embedding_dim=100, lr=0.001)
+
+ # `my_arg` can be used in later script with a typed manner, which help of IDEs (type hints and auto completion)
+ # ...
+ print(f"My network has {len(my_arg.nn)} layers with sizes of {my_arg.nn}.")
+ # My network has 1 layers with sizes of [3].
+
+
+# my_job.py
+if __name__ == '__main__':
+ # Deserialize the command-line representation of the argument back to a container instance
+ arg_deserialized: MyArg = MyArg.__from_argv__(sys.argv[1:]) # Equivalent to `MyArg(None)`, one positional arg required to indicate the arg is a command-line representation.
+ my_job(arg_deserialized)
+```
+
+```shell-session
+> python my_job.py -h
+usage: my_job.py [-h] --nn [int [int ...]] --a_tuple str int --encoder str
+ --h_param [str:int [str:int ...]] [--batch_size int]
+ [--adp {True,False}] [--embedding_dim int] [--lr float]
+
+MyArg is smart! (docstring goes to description)
+
+optional arguments:
+ -h, --help show this help message and exit
+ --nn [int [int ...]] (List[int], required) Comments go to argparse help
+ --a_tuple str int (Tuple[str, int], required) a random tuple argument
+ --encoder str (str, required) Text encoder type
+ --h_param [str:int [str:int ...]]
+ (Dict[str, int], required) Hyperparameters
+ --batch_size int (Optional[int], default: None)
+ --adp {True,False} (bool, default: True) bool is a bit tricky
+ --embedding_dim int (int, default: 100) Size of embedding vector
+ --lr float (float, default: 0.001) Learning rate
+
+```
+## Promoted practices
+* Focus on defining the arguments diligently, and let the `smart-arg`
+ (backed by [argparse.ArgumentParser](https://docs.python.org/3/library/argparse.html#argumentparser-objects))
+ work its magic around command-line interface.
+* Always work directly with argument container class instances when possible, even if you only need to generate the command-line representation.
+* Stick to the default behavior and the basic features, think twice before using any of the [advanced features](https://smart-arg.readthedocs.io/en/latest/advanced.html#advanced-usages).
+
+
+## More detail
+For more features and implementation detail, please refer to the [documentation](https://smart-arg.readthedocs.io/).
+
+## Contributing
+
+Please read [CONTRIBUTING.md](CONTRIBUTING.md) for details on our code of conduct, and the process for submitting pull requests to us.
+
+## License
+
+This project is licensed under the BSD 2-CLAUSE LICENSE - see the [LICENSE.md](LICENSE.md) file for details
+
+
+
+
+%prep
+%autosetup -n smart-arg-1.1.2
+
+%build
+%py3_build
+
+%install
+%py3_install
+install -d -m755 %{buildroot}/%{_pkgdocdir}
+if [ -d doc ]; then cp -arf doc %{buildroot}/%{_pkgdocdir}; fi
+if [ -d docs ]; then cp -arf docs %{buildroot}/%{_pkgdocdir}; fi
+if [ -d example ]; then cp -arf example %{buildroot}/%{_pkgdocdir}; fi
+if [ -d examples ]; then cp -arf examples %{buildroot}/%{_pkgdocdir}; fi
+pushd %{buildroot}
+if [ -d usr/lib ]; then
+ find usr/lib -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+if [ -d usr/lib64 ]; then
+ find usr/lib64 -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+if [ -d usr/bin ]; then
+ find usr/bin -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+if [ -d usr/sbin ]; then
+ find usr/sbin -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+touch doclist.lst
+if [ -d usr/share/man ]; then
+ find usr/share/man -type f -printf "/%h/%f.gz\n" >> doclist.lst
+fi
+popd
+mv %{buildroot}/filelist.lst .
+mv %{buildroot}/doclist.lst .
+
+%files -n python3-smart-arg -f filelist.lst
+%dir %{python3_sitelib}/*
+
+%files help -f doclist.lst
+%{_docdir}/*
+
+%changelog
+* Fri May 05 2023 Python_Bot <Python_Bot@openeuler.org> - 1.1.2-1
+- Package Spec generated
diff --git a/sources b/sources
new file mode 100644
index 0000000..8cc8934
--- /dev/null
+++ b/sources
@@ -0,0 +1 @@
+317bac82cce7a7fc250f4163ed3a7682 smart-arg-1.1.2.tar.gz