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 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)
@@ -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,4 @@
1
+ from .commands import run
2
+ from .utils import create_directory, get_data_directory
3
+
4
+ __all__ = ["run", "create_directory", "get_data_directory"]
@@ -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()