omurtag 0.4.1__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.
- omurtag-0.4.1/LICENSE +13 -0
- omurtag-0.4.1/PKG-INFO +155 -0
- omurtag-0.4.1/README.md +128 -0
- omurtag-0.4.1/omurtag/__init__.py +4 -0
- omurtag-0.4.1/omurtag/__main__.py +131 -0
- omurtag-0.4.1/omurtag/commands.py +453 -0
- omurtag-0.4.1/omurtag/models.py +91 -0
- omurtag-0.4.1/omurtag/security.py +283 -0
- omurtag-0.4.1/omurtag/utils.py +189 -0
- omurtag-0.4.1/omurtag.egg-info/PKG-INFO +155 -0
- omurtag-0.4.1/omurtag.egg-info/SOURCES.txt +15 -0
- omurtag-0.4.1/omurtag.egg-info/dependency_links.txt +1 -0
- omurtag-0.4.1/omurtag.egg-info/entry_points.txt +2 -0
- omurtag-0.4.1/omurtag.egg-info/requires.txt +8 -0
- omurtag-0.4.1/omurtag.egg-info/top_level.txt +1 -0
- omurtag-0.4.1/pyproject.toml +36 -0
- omurtag-0.4.1/setup.cfg +4 -0
omurtag-0.4.1/LICENSE
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
The 3-Clause BSD License
|
|
2
|
+
|
|
3
|
+
Copyright 2026 Evgeni Genchev
|
|
4
|
+
|
|
5
|
+
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
|
6
|
+
|
|
7
|
+
1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
|
8
|
+
|
|
9
|
+
2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
|
10
|
+
|
|
11
|
+
3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
|
|
12
|
+
|
|
13
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
omurtag-0.4.1/PKG-INFO
ADDED
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: omurtag
|
|
3
|
+
Version: 0.4.1
|
|
4
|
+
Summary: Scaffold projects from personal templates, with a security audit on every create
|
|
5
|
+
License: BSD-3-Clause
|
|
6
|
+
Project-URL: Homepage, https://evgeni-genchev.com/omurtag/
|
|
7
|
+
Project-URL: Source, https://github.com/EvgeniGenchev/omurtag
|
|
8
|
+
Classifier: License :: OSI Approved :: BSD License
|
|
9
|
+
Classifier: Programming Language :: Python :: 3
|
|
10
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
11
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
12
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
15
|
+
Classifier: Environment :: Console
|
|
16
|
+
Classifier: Topic :: Software Development :: Code Generators
|
|
17
|
+
Requires-Python: >=3.9
|
|
18
|
+
Description-Content-Type: text/markdown
|
|
19
|
+
License-File: LICENSE
|
|
20
|
+
Requires-Dist: gitpython>=3.1.46
|
|
21
|
+
Requires-Dist: rich-argparse>=1.7.2
|
|
22
|
+
Requires-Dist: tqdm>=4.67.3
|
|
23
|
+
Requires-Dist: requests>=2.32.0
|
|
24
|
+
Requires-Dist: questionary>=2.0.0
|
|
25
|
+
Requires-Dist: tomli>=2.0.0; python_version < "3.11"
|
|
26
|
+
Dynamic: license-file
|
|
27
|
+
|
|
28
|
+
# omurtag
|
|
29
|
+
|
|
30
|
+
A builder for a builder. Scaffold projects from personal templates, with a security audit on every create.
|
|
31
|
+
|
|
32
|
+
## Install
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
curl -fsSL https://evgeni-genchev.com/omurtag/install.sh | sh
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Or directly:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
uv tool install omurtag
|
|
42
|
+
# or
|
|
43
|
+
pip install omurtag
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
If `omurtag` is not found after installing:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
uv tool update-shell
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Commands
|
|
53
|
+
|
|
54
|
+
```
|
|
55
|
+
omurtag {add,remove,create,list,pull,sync,search}
|
|
56
|
+
|
|
57
|
+
add Add a local folder as a template
|
|
58
|
+
remove Remove a template by name
|
|
59
|
+
create Generate a project from a template
|
|
60
|
+
list List templates with stack info
|
|
61
|
+
pull Pull a template from a git repo
|
|
62
|
+
sync Download/update all templates from config
|
|
63
|
+
search Browse and pull from the community template list
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### Examples
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
# browse community templates and pull interactively
|
|
70
|
+
omurtag search
|
|
71
|
+
|
|
72
|
+
# pull a template from GitHub
|
|
73
|
+
omurtag pull github:EvgeniGenchev/fastapi_frontend_omurtag_template
|
|
74
|
+
|
|
75
|
+
# pull a specific branch
|
|
76
|
+
omurtag pull github:user/repo_omurtag_template --branch dev
|
|
77
|
+
|
|
78
|
+
# list available templates
|
|
79
|
+
omurtag list
|
|
80
|
+
omurtag list --verbose
|
|
81
|
+
|
|
82
|
+
# create a project (interactive if no args)
|
|
83
|
+
omurtag create
|
|
84
|
+
omurtag create ~/projects/myapp --type fastapi_frontend
|
|
85
|
+
|
|
86
|
+
# add a local folder as a template
|
|
87
|
+
omurtag add ~/my_template_folder
|
|
88
|
+
|
|
89
|
+
# remove a template
|
|
90
|
+
omurtag remove fastapi_frontend
|
|
91
|
+
|
|
92
|
+
# sync all templates from config
|
|
93
|
+
omurtag sync
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
## Configuration
|
|
97
|
+
|
|
98
|
+
Config file location: `$XDG_CONFIG_HOME/omurtag/config.py` or `~/.omurtag/config.py`
|
|
99
|
+
|
|
100
|
+
```python
|
|
101
|
+
templates = [
|
|
102
|
+
"github:EvgeniGenchev/fastapi_frontend_omurtag_template",
|
|
103
|
+
"gitlab:user/my_project_omurtag_template",
|
|
104
|
+
"codeberg.org:user/tool_omurtag_template",
|
|
105
|
+
"https://codeberg.org/user/repo_omurtag_template.git",
|
|
106
|
+
]
|
|
107
|
+
|
|
108
|
+
# optional
|
|
109
|
+
transitive_deps = False # scan transitive deps on create (slower)
|
|
110
|
+
show_desc = True # show description in list
|
|
111
|
+
show_stack = True # show stack in list
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
## Creating templates
|
|
115
|
+
|
|
116
|
+
Any folder can be a template. Use `omurtag add <folder>` to register a local one. To host it so others can pull it, name the repo with a `_omurtag_template` suffix.
|
|
117
|
+
|
|
118
|
+
**Placeholders** use the `<*name*>` syntax. On `omurtag create`, every placeholder is replaced in file contents, filenames, and directory names. `<*project*>` is always set to the project name. Any other placeholders are prompted for interactively at create time.
|
|
119
|
+
|
|
120
|
+
**Security audit** runs automatically on every `create`. omurtag detects the stack from marker files (`pyproject.toml`, `package.json`, `Cargo.toml`, etc.) and checks direct dependencies for known CVEs via [deps.dev](https://deps.dev). Opt in to transitive scanning with `transitive_deps = True` in config.
|
|
121
|
+
|
|
122
|
+
An optional **`omurtag.sh`** at the template root is a post-create setup script. After the project is created, omurtag shows its contents and asks whether to run it in the project directory. It is never copied into created projects.
|
|
123
|
+
|
|
124
|
+
An optional **`omurtag.toml`** at the template root provides metadata shown in `omurtag list`. It is never copied into created projects.
|
|
125
|
+
|
|
126
|
+
```toml
|
|
127
|
+
[template]
|
|
128
|
+
name = "my-service"
|
|
129
|
+
description = "Minimal Python service"
|
|
130
|
+
stack = ["python"]
|
|
131
|
+
author = "you"
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
## Available templates
|
|
135
|
+
|
|
136
|
+
- [fastapi-frontend](https://github.com/EvgeniGenchev/fastapi_frontend_omurtag_template) — FastAPI backend with Jinja2 HTML frontend
|
|
137
|
+
- [jupyter-notebook](https://github.com/EvgeniGenchev/jupyter_notebook_omurtag_template) — Jupyter notebook project with uv
|
|
138
|
+
- [neovim-plugin](https://github.com/EvgeniGenchev/neovim_plugin_omurtag_template) — Neovim plugin boilerplate
|
|
139
|
+
- [tool-website](https://github.com/EvgeniGenchev/tool_website_omurtag_template) — Single-page tool website with docs, about, and donate pages
|
|
140
|
+
- [static-html-website](https://github.com/EvgeniGenchev/static_html_website_omurtag_template) — Static HTML/CSS website
|
|
141
|
+
- [typst-coursework](https://github.com/grexdin/typst_coursework_omurtag_template) — Typst coursework document template
|
|
142
|
+
|
|
143
|
+
Full list: [evgeni-genchev.com/omurtag/templates.json](https://evgeni-genchev.com/omurtag/templates.json)
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
## Dev install
|
|
148
|
+
|
|
149
|
+
```bash
|
|
150
|
+
uv cache clean && uv tool uninstall omurtag && uv tool install .
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
## License
|
|
154
|
+
|
|
155
|
+
[WTFPL](http://www.wtfpl.net)
|
omurtag-0.4.1/README.md
ADDED
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
# omurtag
|
|
2
|
+
|
|
3
|
+
A builder for a builder. Scaffold projects from personal templates, with a security audit on every create.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
curl -fsSL https://evgeni-genchev.com/omurtag/install.sh | sh
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Or directly:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
uv tool install omurtag
|
|
15
|
+
# or
|
|
16
|
+
pip install omurtag
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
If `omurtag` is not found after installing:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
uv tool update-shell
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Commands
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
omurtag {add,remove,create,list,pull,sync,search}
|
|
29
|
+
|
|
30
|
+
add Add a local folder as a template
|
|
31
|
+
remove Remove a template by name
|
|
32
|
+
create Generate a project from a template
|
|
33
|
+
list List templates with stack info
|
|
34
|
+
pull Pull a template from a git repo
|
|
35
|
+
sync Download/update all templates from config
|
|
36
|
+
search Browse and pull from the community template list
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### Examples
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
# browse community templates and pull interactively
|
|
43
|
+
omurtag search
|
|
44
|
+
|
|
45
|
+
# pull a template from GitHub
|
|
46
|
+
omurtag pull github:EvgeniGenchev/fastapi_frontend_omurtag_template
|
|
47
|
+
|
|
48
|
+
# pull a specific branch
|
|
49
|
+
omurtag pull github:user/repo_omurtag_template --branch dev
|
|
50
|
+
|
|
51
|
+
# list available templates
|
|
52
|
+
omurtag list
|
|
53
|
+
omurtag list --verbose
|
|
54
|
+
|
|
55
|
+
# create a project (interactive if no args)
|
|
56
|
+
omurtag create
|
|
57
|
+
omurtag create ~/projects/myapp --type fastapi_frontend
|
|
58
|
+
|
|
59
|
+
# add a local folder as a template
|
|
60
|
+
omurtag add ~/my_template_folder
|
|
61
|
+
|
|
62
|
+
# remove a template
|
|
63
|
+
omurtag remove fastapi_frontend
|
|
64
|
+
|
|
65
|
+
# sync all templates from config
|
|
66
|
+
omurtag sync
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## Configuration
|
|
70
|
+
|
|
71
|
+
Config file location: `$XDG_CONFIG_HOME/omurtag/config.py` or `~/.omurtag/config.py`
|
|
72
|
+
|
|
73
|
+
```python
|
|
74
|
+
templates = [
|
|
75
|
+
"github:EvgeniGenchev/fastapi_frontend_omurtag_template",
|
|
76
|
+
"gitlab:user/my_project_omurtag_template",
|
|
77
|
+
"codeberg.org:user/tool_omurtag_template",
|
|
78
|
+
"https://codeberg.org/user/repo_omurtag_template.git",
|
|
79
|
+
]
|
|
80
|
+
|
|
81
|
+
# optional
|
|
82
|
+
transitive_deps = False # scan transitive deps on create (slower)
|
|
83
|
+
show_desc = True # show description in list
|
|
84
|
+
show_stack = True # show stack in list
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## Creating templates
|
|
88
|
+
|
|
89
|
+
Any folder can be a template. Use `omurtag add <folder>` to register a local one. To host it so others can pull it, name the repo with a `_omurtag_template` suffix.
|
|
90
|
+
|
|
91
|
+
**Placeholders** use the `<*name*>` syntax. On `omurtag create`, every placeholder is replaced in file contents, filenames, and directory names. `<*project*>` is always set to the project name. Any other placeholders are prompted for interactively at create time.
|
|
92
|
+
|
|
93
|
+
**Security audit** runs automatically on every `create`. omurtag detects the stack from marker files (`pyproject.toml`, `package.json`, `Cargo.toml`, etc.) and checks direct dependencies for known CVEs via [deps.dev](https://deps.dev). Opt in to transitive scanning with `transitive_deps = True` in config.
|
|
94
|
+
|
|
95
|
+
An optional **`omurtag.sh`** at the template root is a post-create setup script. After the project is created, omurtag shows its contents and asks whether to run it in the project directory. It is never copied into created projects.
|
|
96
|
+
|
|
97
|
+
An optional **`omurtag.toml`** at the template root provides metadata shown in `omurtag list`. It is never copied into created projects.
|
|
98
|
+
|
|
99
|
+
```toml
|
|
100
|
+
[template]
|
|
101
|
+
name = "my-service"
|
|
102
|
+
description = "Minimal Python service"
|
|
103
|
+
stack = ["python"]
|
|
104
|
+
author = "you"
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
## Available templates
|
|
108
|
+
|
|
109
|
+
- [fastapi-frontend](https://github.com/EvgeniGenchev/fastapi_frontend_omurtag_template) — FastAPI backend with Jinja2 HTML frontend
|
|
110
|
+
- [jupyter-notebook](https://github.com/EvgeniGenchev/jupyter_notebook_omurtag_template) — Jupyter notebook project with uv
|
|
111
|
+
- [neovim-plugin](https://github.com/EvgeniGenchev/neovim_plugin_omurtag_template) — Neovim plugin boilerplate
|
|
112
|
+
- [tool-website](https://github.com/EvgeniGenchev/tool_website_omurtag_template) — Single-page tool website with docs, about, and donate pages
|
|
113
|
+
- [static-html-website](https://github.com/EvgeniGenchev/static_html_website_omurtag_template) — Static HTML/CSS website
|
|
114
|
+
- [typst-coursework](https://github.com/grexdin/typst_coursework_omurtag_template) — Typst coursework document template
|
|
115
|
+
|
|
116
|
+
Full list: [evgeni-genchev.com/omurtag/templates.json](https://evgeni-genchev.com/omurtag/templates.json)
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
## Dev install
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
uv cache clean && uv tool uninstall omurtag && uv tool install .
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
## License
|
|
127
|
+
|
|
128
|
+
[WTFPL](http://www.wtfpl.net)
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import argparse
|
|
2
|
+
from rich.console import Console
|
|
3
|
+
from rich import print
|
|
4
|
+
from rich_argparse import RichHelpFormatter
|
|
5
|
+
from omurtag import run
|
|
6
|
+
|
|
7
|
+
PROG = "omurtag"
|
|
8
|
+
DESCRIPTION = """
|
|
9
|
+
omurtag is a tool that helps you create projects from templates
|
|
10
|
+
"""
|
|
11
|
+
RichHelpFormatter.console = Console(force_terminal=True)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def main():
|
|
15
|
+
parser = argparse.ArgumentParser(
|
|
16
|
+
prog=PROG,
|
|
17
|
+
formatter_class=RichHelpFormatter,
|
|
18
|
+
description=DESCRIPTION,
|
|
19
|
+
)
|
|
20
|
+
parser.add_argument("-v","--version", action="store_true")
|
|
21
|
+
|
|
22
|
+
subparsers = parser.add_subparsers(dest="mode")
|
|
23
|
+
|
|
24
|
+
# -- add mode --
|
|
25
|
+
add_parser = subparsers.add_parser(
|
|
26
|
+
"add",
|
|
27
|
+
help="Add new template folder",
|
|
28
|
+
formatter_class=RichHelpFormatter,
|
|
29
|
+
)
|
|
30
|
+
add_parser.add_argument(
|
|
31
|
+
"input_file",
|
|
32
|
+
type=str,
|
|
33
|
+
help="Your project dependency template",
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
# -- remove mode --
|
|
37
|
+
remove_parser = subparsers.add_parser(
|
|
38
|
+
"remove",
|
|
39
|
+
help="Remove a template folder",
|
|
40
|
+
formatter_class=RichHelpFormatter,
|
|
41
|
+
)
|
|
42
|
+
remove_parser.add_argument(
|
|
43
|
+
"template_name",
|
|
44
|
+
type=str,
|
|
45
|
+
help="Remove the provided template from the list",
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
# -- create mode --
|
|
49
|
+
create_parser = subparsers.add_parser(
|
|
50
|
+
"create",
|
|
51
|
+
help="Generate a project based on an available template",
|
|
52
|
+
formatter_class=RichHelpFormatter,
|
|
53
|
+
)
|
|
54
|
+
create_parser.add_argument(
|
|
55
|
+
"project_name", type=str, help="Your project name", nargs="?"
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
create_parser.add_argument(
|
|
59
|
+
"-t",
|
|
60
|
+
"--type",
|
|
61
|
+
type=str,
|
|
62
|
+
help='Project type you want to generate. If unsure what projects are supported use "omurtag list"',
|
|
63
|
+
required=False,
|
|
64
|
+
default=None,
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
# -- list mode --
|
|
68
|
+
list_parser = subparsers.add_parser(
|
|
69
|
+
"list",
|
|
70
|
+
help="List template names and their technology stack, if present",
|
|
71
|
+
formatter_class=RichHelpFormatter,
|
|
72
|
+
)
|
|
73
|
+
list_parser.add_argument("--verbose", action="store_true")
|
|
74
|
+
|
|
75
|
+
# -- pull mode --
|
|
76
|
+
pull_parser = subparsers.add_parser(
|
|
77
|
+
"pull",
|
|
78
|
+
help="Pull a template from a git repository and add it to your local templates",
|
|
79
|
+
formatter_class=RichHelpFormatter,
|
|
80
|
+
)
|
|
81
|
+
pull_parser.add_argument(
|
|
82
|
+
"-b",
|
|
83
|
+
"--branch",
|
|
84
|
+
type=str,
|
|
85
|
+
help="The branch of the template git repo.",
|
|
86
|
+
required=False,
|
|
87
|
+
default=None,
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
pull_parser.add_argument(
|
|
91
|
+
"link",
|
|
92
|
+
type=str,
|
|
93
|
+
help="The http link of the template git repo.",
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
pull_parser.add_argument(
|
|
97
|
+
"-r",
|
|
98
|
+
"--recursive",
|
|
99
|
+
action="store_true",
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
# -- sync mode --
|
|
103
|
+
subparsers.add_parser(
|
|
104
|
+
"sync",
|
|
105
|
+
help="Downlaod/Update all the template repositories mentioned in the config file.",
|
|
106
|
+
formatter_class=RichHelpFormatter,
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
# -- search mode --
|
|
110
|
+
subparsers.add_parser(
|
|
111
|
+
"search",
|
|
112
|
+
help="Browse and pull templates from the community list.",
|
|
113
|
+
formatter_class=RichHelpFormatter,
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
args = parser.parse_args()
|
|
117
|
+
|
|
118
|
+
if not args.version and args.mode is None:
|
|
119
|
+
parser.error("a mode is required")
|
|
120
|
+
|
|
121
|
+
if args.version:
|
|
122
|
+
version = __import__("importlib").metadata.version("omurtag")
|
|
123
|
+
print(f"[blue]V{version}[/blue]")
|
|
124
|
+
|
|
125
|
+
exit(0)
|
|
126
|
+
|
|
127
|
+
run(args)
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
if __name__ == "__main__":
|
|
131
|
+
main()
|