afterpython 0.1.0.dev5__py3-none-any.whl → 0.1.0.dev6__py3-none-any.whl
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.
- afterpython/cli/commands/build.py +45 -4
- afterpython/cli/commands/dev.py +68 -5
- afterpython/cli/commands/start.py +1 -0
- afterpython/cli/commands/sync.py +14 -2
- afterpython/const.py +1 -1
- afterpython/templates/deploy-workflow-template.yml +0 -2
- afterpython/tools/myst.py +36 -33
- afterpython/utils.py +5 -3
- {afterpython-0.1.0.dev5.dist-info → afterpython-0.1.0.dev6.dist-info}/METADATA +6 -4
- {afterpython-0.1.0.dev5.dist-info → afterpython-0.1.0.dev6.dist-info}/RECORD +12 -12
- {afterpython-0.1.0.dev5.dist-info → afterpython-0.1.0.dev6.dist-info}/WHEEL +0 -0
- {afterpython-0.1.0.dev5.dist-info → afterpython-0.1.0.dev6.dist-info}/entry_points.txt +0 -0
|
@@ -22,6 +22,41 @@ from afterpython.builders import (
|
|
|
22
22
|
)
|
|
23
23
|
|
|
24
24
|
|
|
25
|
+
def determine_base_path() -> str:
|
|
26
|
+
"""Determine BASE_PATH based on website URL configuration.
|
|
27
|
+
|
|
28
|
+
Returns:
|
|
29
|
+
Empty string if custom domain is configured (no github.io in URL)
|
|
30
|
+
/repo-name if using default GitHub Pages URL (contains github.io)
|
|
31
|
+
"""
|
|
32
|
+
from afterpython.tools._afterpython import read_afterpython
|
|
33
|
+
from afterpython.tools.pyproject import read_metadata
|
|
34
|
+
from afterpython._io.toml import _from_tomlkit
|
|
35
|
+
|
|
36
|
+
# Read website URL from afterpython.toml
|
|
37
|
+
afterpython = read_afterpython()
|
|
38
|
+
website_url = str(_from_tomlkit(afterpython["website"]).get("url", ""))
|
|
39
|
+
|
|
40
|
+
# If custom domain (no github.io), no BASE_PATH needed
|
|
41
|
+
if "github.io" not in website_url:
|
|
42
|
+
return ""
|
|
43
|
+
|
|
44
|
+
# For GitHub Pages default URL, extract repo name from repository URL
|
|
45
|
+
pyproject = read_metadata()
|
|
46
|
+
github_url = str(pyproject.urls.get("repository", ""))
|
|
47
|
+
|
|
48
|
+
if not github_url:
|
|
49
|
+
click.echo(
|
|
50
|
+
"Warning: No repository URL found in pyproject.toml, using empty BASE_PATH"
|
|
51
|
+
)
|
|
52
|
+
return ""
|
|
53
|
+
|
|
54
|
+
# Extract repo name from URL like "https://github.com/AfterPythonOrg/afterpython"
|
|
55
|
+
# -> "afterpython"
|
|
56
|
+
repo_name = github_url.rstrip("/").split("/")[-1]
|
|
57
|
+
return f"/{repo_name}"
|
|
58
|
+
|
|
59
|
+
|
|
25
60
|
def prebuild():
|
|
26
61
|
def _check_initialized():
|
|
27
62
|
# Check if 'ap init' has been run
|
|
@@ -145,6 +180,13 @@ def build(ctx, dev: bool, execute: bool):
|
|
|
145
180
|
paths = ctx.obj["paths"]
|
|
146
181
|
prebuild()
|
|
147
182
|
|
|
183
|
+
# Determine BASE_PATH based on website URL configuration
|
|
184
|
+
base_path = determine_base_path()
|
|
185
|
+
if base_path:
|
|
186
|
+
click.echo(f"Using BASE_PATH: {base_path}")
|
|
187
|
+
else:
|
|
188
|
+
click.echo("Using BASE_PATH: (empty - custom domain)")
|
|
189
|
+
|
|
148
190
|
click.echo("Building metadata.json...")
|
|
149
191
|
build_metadata()
|
|
150
192
|
|
|
@@ -159,10 +201,8 @@ def build(ctx, dev: bool, execute: bool):
|
|
|
159
201
|
|
|
160
202
|
click.echo(f"Building {content_type}/...")
|
|
161
203
|
# NOTE: needs to set BASE_URL so that the project website can link to the content pages correctly at e.g. localhost:5173/doc
|
|
162
|
-
# BASE_PATH is set by the GitHub Actions workflow
|
|
163
|
-
base_path = os.getenv("BASE_PATH", "")
|
|
164
204
|
base_url = f"{base_path}/{content_type}"
|
|
165
|
-
build_env = {**node_env, "BASE_URL": base_url}
|
|
205
|
+
build_env = {**node_env, "BASE_URL": base_url, "BASE_PATH": base_path}
|
|
166
206
|
result = subprocess.run(
|
|
167
207
|
[
|
|
168
208
|
"myst",
|
|
@@ -183,8 +223,9 @@ def build(ctx, dev: bool, execute: bool):
|
|
|
183
223
|
# website's production build
|
|
184
224
|
if not dev:
|
|
185
225
|
click.echo("Building project website...")
|
|
226
|
+
website_env = {**node_env, "BASE_PATH": base_path}
|
|
186
227
|
result = subprocess.run(
|
|
187
|
-
["pnpm", "build"], cwd=paths.website_path, env=
|
|
228
|
+
["pnpm", "build"], cwd=paths.website_path, env=website_env, check=False
|
|
188
229
|
)
|
|
189
230
|
if result.returncode != 0:
|
|
190
231
|
raise Exit(result.returncode)
|
afterpython/cli/commands/dev.py
CHANGED
|
@@ -27,19 +27,61 @@ from afterpython.const import CONTENT_TYPES
|
|
|
27
27
|
is_flag=True,
|
|
28
28
|
help="Start the development server for all content types and the project website",
|
|
29
29
|
)
|
|
30
|
+
@click.option(
|
|
31
|
+
"--doc",
|
|
32
|
+
is_flag=True,
|
|
33
|
+
help="Start the development server for documentation content",
|
|
34
|
+
)
|
|
35
|
+
@click.option(
|
|
36
|
+
"--blog",
|
|
37
|
+
is_flag=True,
|
|
38
|
+
help="Start the development server for blog content",
|
|
39
|
+
)
|
|
40
|
+
@click.option(
|
|
41
|
+
"--tutorial",
|
|
42
|
+
is_flag=True,
|
|
43
|
+
help="Start the development server for tutorial content",
|
|
44
|
+
)
|
|
45
|
+
@click.option(
|
|
46
|
+
"--example",
|
|
47
|
+
is_flag=True,
|
|
48
|
+
help="Start the development server for example content",
|
|
49
|
+
)
|
|
50
|
+
@click.option(
|
|
51
|
+
"--guide",
|
|
52
|
+
is_flag=True,
|
|
53
|
+
help="Start the development server for guide content",
|
|
54
|
+
)
|
|
30
55
|
@click.option(
|
|
31
56
|
"--execute", is_flag=True, help="Execute Jupyter notebooks for all content types"
|
|
32
57
|
)
|
|
33
58
|
@click.option(
|
|
34
59
|
"--no-website",
|
|
60
|
+
"-n",
|
|
35
61
|
is_flag=True,
|
|
36
62
|
help="Skip running the website dev server (pnpm dev). Useful when you want to run pnpm dev manually with custom options.",
|
|
37
63
|
)
|
|
38
|
-
def dev(
|
|
64
|
+
def dev(
|
|
65
|
+
ctx,
|
|
66
|
+
all: bool,
|
|
67
|
+
doc: bool,
|
|
68
|
+
blog: bool,
|
|
69
|
+
tutorial: bool,
|
|
70
|
+
example: bool,
|
|
71
|
+
guide: bool,
|
|
72
|
+
execute: bool,
|
|
73
|
+
no_website: bool,
|
|
74
|
+
):
|
|
39
75
|
"""Run the development server for the project website.
|
|
40
76
|
|
|
41
|
-
|
|
42
|
-
|
|
77
|
+
By default, runs only the website without any content servers.
|
|
78
|
+
Use --all to start all content types, or specify individual content types with --doc, --blog, etc.
|
|
79
|
+
|
|
80
|
+
Examples:
|
|
81
|
+
ap dev # Website only
|
|
82
|
+
ap dev --all # Website + all content types
|
|
83
|
+
ap dev --doc # Website + doc content
|
|
84
|
+
ap dev --doc --blog # Website + doc and blog content
|
|
43
85
|
|
|
44
86
|
Any extra arguments are passed to the MyST servers (via 'ap doc/blog/tutorial/example/guide' commands).
|
|
45
87
|
See "myst start --help" for more details.
|
|
@@ -79,14 +121,35 @@ def dev(ctx, all: bool, execute: bool, no_website: bool):
|
|
|
79
121
|
except Exception:
|
|
80
122
|
pass
|
|
81
123
|
|
|
124
|
+
# Determine which content types to run
|
|
125
|
+
if all:
|
|
126
|
+
enabled_content_types = set(CONTENT_TYPES)
|
|
127
|
+
else:
|
|
128
|
+
# Check individual flags
|
|
129
|
+
content_flags = {
|
|
130
|
+
"doc": doc,
|
|
131
|
+
"blog": blog,
|
|
132
|
+
"tutorial": tutorial,
|
|
133
|
+
"example": example,
|
|
134
|
+
"guide": guide,
|
|
135
|
+
}
|
|
136
|
+
assert set(content_flags.keys()) == set(CONTENT_TYPES), (
|
|
137
|
+
"Incomplete content flags"
|
|
138
|
+
)
|
|
139
|
+
enabled_content_types = {ct for ct, flag in content_flags.items() if flag}
|
|
140
|
+
|
|
82
141
|
try:
|
|
83
|
-
if
|
|
142
|
+
if enabled_content_types:
|
|
84
143
|
# Clear .env.development before writing new ports
|
|
85
144
|
env_file = paths.website_path / ".env.development"
|
|
86
145
|
env_file.write_text("") # Clear existing content
|
|
87
146
|
|
|
88
147
|
next_port = 3000
|
|
89
148
|
for content_type in CONTENT_TYPES:
|
|
149
|
+
# Skip content types that are not enabled
|
|
150
|
+
if content_type not in enabled_content_types:
|
|
151
|
+
continue
|
|
152
|
+
|
|
90
153
|
# Find available port for MyST server
|
|
91
154
|
myst_port = find_available_port(start_port=next_port)
|
|
92
155
|
next_port = myst_port + 1
|
|
@@ -134,7 +197,7 @@ def dev(ctx, all: bool, execute: bool, no_website: bool):
|
|
|
134
197
|
click.echo(
|
|
135
198
|
"Skipping website dev server (--no-website flag). Run 'pnpm dev' manually in afterpython/_website/ with your custom options."
|
|
136
199
|
)
|
|
137
|
-
if
|
|
200
|
+
if enabled_content_types:
|
|
138
201
|
# Keep the process running to maintain MyST servers
|
|
139
202
|
click.echo("Press Ctrl+C to stop MyST servers...")
|
|
140
203
|
while True:
|
afterpython/cli/commands/sync.py
CHANGED
|
@@ -2,6 +2,7 @@ from datetime import datetime
|
|
|
2
2
|
|
|
3
3
|
import click
|
|
4
4
|
from pyproject_metadata import StandardMetadata
|
|
5
|
+
from tomlkit.toml_document import TOMLDocument
|
|
5
6
|
|
|
6
7
|
import afterpython as ap
|
|
7
8
|
from afterpython.utils import convert_author_name_to_id
|
|
@@ -38,7 +39,11 @@ def sync():
|
|
|
38
39
|
"""Sync between pyproject.toml+afterpython.toml and authors.yml+myst.yml files"""
|
|
39
40
|
from afterpython.const import CONTENT_TYPES
|
|
40
41
|
from afterpython.tools._afterpython import read_afterpython
|
|
41
|
-
from afterpython.tools.pyproject import
|
|
42
|
+
from afterpython.tools.pyproject import (
|
|
43
|
+
read_metadata,
|
|
44
|
+
read_pyproject,
|
|
45
|
+
write_pyproject,
|
|
46
|
+
)
|
|
42
47
|
from afterpython._io.toml import _from_tomlkit
|
|
43
48
|
from afterpython.tools.myst import update_myst_yml
|
|
44
49
|
|
|
@@ -62,12 +67,19 @@ def sync():
|
|
|
62
67
|
|
|
63
68
|
_sync_authors_yml(authors)
|
|
64
69
|
|
|
70
|
+
# update "homepage", "repository", and "documentation" in pyproject.toml
|
|
71
|
+
if website_url:
|
|
72
|
+
doc: TOMLDocument = read_pyproject()
|
|
73
|
+
doc["project"]["urls"]["homepage"] = website_url
|
|
74
|
+
doc["project"]["urls"]["documentation"] = f"{website_url}/doc"
|
|
75
|
+
write_pyproject(doc)
|
|
76
|
+
|
|
65
77
|
# update myst.yml files for each content type (e.g. doc/, blog/, tutorial/, example/, guide/)
|
|
66
78
|
# based on the current values in pyproject.toml and afterpython.toml
|
|
67
79
|
for content_type in CONTENT_TYPES:
|
|
68
80
|
path = ap.paths.afterpython_path / content_type
|
|
69
81
|
nav_bar_per_content_type = [
|
|
70
|
-
item for item in nav_bar if item["title"] != content_type.capitalize()
|
|
82
|
+
item for item in nav_bar if item["title"] != content_type.capitalize() + "s"
|
|
71
83
|
]
|
|
72
84
|
title = project_name + f"'s {content_type.capitalize()}"
|
|
73
85
|
data = {
|
afterpython/const.py
CHANGED
afterpython/tools/myst.py
CHANGED
|
@@ -48,7 +48,7 @@ def update_authors_yml(data_update: dict):
|
|
|
48
48
|
write_yaml(file_path, existing_data)
|
|
49
49
|
|
|
50
50
|
|
|
51
|
-
def update_myst_yml(data_update: dict, path: Path):
|
|
51
|
+
def update_myst_yml(data_update: dict, path: Path, add_comments: bool = False):
|
|
52
52
|
"""Update myst.yml while preserving order and formatting
|
|
53
53
|
|
|
54
54
|
Args:
|
|
@@ -64,36 +64,39 @@ def update_myst_yml(data_update: dict, path: Path):
|
|
|
64
64
|
)
|
|
65
65
|
|
|
66
66
|
existing_data = read_yaml(file_path) or {}
|
|
67
|
-
existing_data = deep_merge(existing_data, data_update)
|
|
68
|
-
|
|
69
|
-
#
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
67
|
+
existing_data = deep_merge(existing_data, data_update, extend_lists=False)
|
|
68
|
+
|
|
69
|
+
# NOTE: this checking existing_data["key1"].ca.items.get("key2") is buggy
|
|
70
|
+
# only add_comments=True during init to avoid adding duplicate comments
|
|
71
|
+
if add_comments:
|
|
72
|
+
# set comments for project section for convenience
|
|
73
|
+
if "project" in existing_data:
|
|
74
|
+
if not existing_data["project"].ca.items.get("id"):
|
|
75
|
+
existing_data["project"].yaml_set_comment_before_after_key(
|
|
76
|
+
"id",
|
|
77
|
+
before="See how to create Table of Contents at: https://mystmd.org/guide/table-of-contents",
|
|
78
|
+
)
|
|
79
|
+
if not existing_data["project"].ca.items.get("authors"):
|
|
80
|
+
existing_data["project"].yaml_set_comment_before_after_key(
|
|
81
|
+
"authors",
|
|
82
|
+
before="See more authors' fields at: https://mystmd.org/guide/frontmatter#frontmatter-authors",
|
|
83
|
+
)
|
|
84
|
+
if not existing_data["project"].ca.items.get("venue"):
|
|
85
|
+
existing_data["project"].yaml_set_comment_before_after_key(
|
|
86
|
+
"venue",
|
|
87
|
+
before="See more venue's fields at: https://mystmd.org/guide/frontmatter#venue",
|
|
88
|
+
)
|
|
89
|
+
if "site" in existing_data:
|
|
90
|
+
if not existing_data["site"].ca.items.get("options"):
|
|
91
|
+
existing_data["site"].yaml_set_comment_before_after_key(
|
|
92
|
+
"options",
|
|
93
|
+
before="See options at: https://mystmd.org/guide/website-templates#site-options",
|
|
94
|
+
)
|
|
95
|
+
if not existing_data["site"].ca.items.get("actions"):
|
|
96
|
+
existing_data["site"].yaml_set_comment_before_after_key(
|
|
97
|
+
"actions",
|
|
98
|
+
before="See web layout at: https://mystmd.org/guide/website-navigation",
|
|
99
|
+
)
|
|
97
100
|
|
|
98
101
|
write_yaml(file_path, existing_data)
|
|
99
102
|
|
|
@@ -116,7 +119,7 @@ Replace this placeholder content with your own. Here's what you can do:
|
|
|
116
119
|
|
|
117
120
|
## Resources
|
|
118
121
|
|
|
119
|
-
- [AfterPython's Project Website](https://
|
|
122
|
+
- [AfterPython's Project Website](https://afterpython.afterpython.org)
|
|
120
123
|
- [MyST Markdown Guide](https://mystmd.org)
|
|
121
124
|
|
|
122
125
|
Start building your amazing project! 🚀
|
|
@@ -159,6 +162,6 @@ def init_myst():
|
|
|
159
162
|
},
|
|
160
163
|
},
|
|
161
164
|
}
|
|
162
|
-
update_myst_yml(myst_yml_defaults, path)
|
|
165
|
+
update_myst_yml(myst_yml_defaults, path, add_comments=True)
|
|
163
166
|
_write_welcome_file(content_type)
|
|
164
167
|
subprocess.run(["ap", "sync"])
|
afterpython/utils.py
CHANGED
|
@@ -82,7 +82,7 @@ def detect_license_from_file(file_path: str) -> str:
|
|
|
82
82
|
return ""
|
|
83
83
|
|
|
84
84
|
|
|
85
|
-
def deep_merge(base: dict, updates: dict) -> dict:
|
|
85
|
+
def deep_merge(base: dict, updates: dict, extend_lists: bool = True) -> dict:
|
|
86
86
|
"""Deep merge updates into base, preserving structure and metadata.
|
|
87
87
|
|
|
88
88
|
Works with:
|
|
@@ -106,8 +106,10 @@ def deep_merge(base: dict, updates: dict) -> dict:
|
|
|
106
106
|
if key in base:
|
|
107
107
|
if isinstance(base[key], dict) and isinstance(value, dict):
|
|
108
108
|
# Recursively merge dicts
|
|
109
|
-
deep_merge(base[key], value)
|
|
110
|
-
elif
|
|
109
|
+
deep_merge(base[key], value, extend_lists=extend_lists)
|
|
110
|
+
elif (
|
|
111
|
+
isinstance(base[key], list) and isinstance(value, list) and extend_lists
|
|
112
|
+
):
|
|
111
113
|
# Extend lists, but only add items that don't already exist
|
|
112
114
|
for item in value:
|
|
113
115
|
if item not in base[key]:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: afterpython
|
|
3
|
-
Version: 0.1.0.
|
|
3
|
+
Version: 0.1.0.dev6
|
|
4
4
|
Summary: CLI tool for AfterPython
|
|
5
5
|
Keywords: package-maintenance,project-website,static-site-generator,developer-tools,documentation,cli-tool,ci/cd,mystmd,semantic-release,python-packaging
|
|
6
6
|
Author: Stephen Yau
|
|
@@ -29,20 +29,20 @@ Requires-Dist: ruff>=0.14.5
|
|
|
29
29
|
Requires-Dist: pre-commit>=4.4.0
|
|
30
30
|
Requires-Dist: commitizen>=4.10.0
|
|
31
31
|
Requires-Python: >=3.11
|
|
32
|
-
Project-URL: documentation, https://
|
|
33
|
-
Project-URL: homepage, https://afterpython.org
|
|
32
|
+
Project-URL: documentation, https://afterpython.afterpython.org/doc
|
|
33
|
+
Project-URL: homepage, https://afterpython.afterpython.org
|
|
34
34
|
Project-URL: repository, https://github.com/AfterPythonOrg/afterpython
|
|
35
35
|
Description-Content-Type: text/markdown
|
|
36
36
|
|
|
37
37
|
# AfterPython: Python Package Maintenance Toolkit and Project Website Generator
|
|
38
38
|
|
|
39
39
|
[](https://afterpython.org)
|
|
40
|
-
[](https://pixi.sh)
|
|
41
40
|

|
|
42
41
|
[](https://pypi.org/project/afterpython)
|
|
43
42
|

|
|
44
43
|
[](https://github.com/AfterPythonOrg/afterpython/discussions)
|
|
45
44
|
[](https://deepwiki.com/AfterPythonOrg/afterpython)
|
|
45
|
+
<!-- [](https://pixi.sh) -->
|
|
46
46
|
|
|
47
47
|
|
|
48
48
|
[MyST]: https://mystmd.org
|
|
@@ -57,6 +57,7 @@ Description-Content-Type: text/markdown
|
|
|
57
57
|
[Scikit-Learn]: https://scikit-learn.org
|
|
58
58
|
[WebLLM]: https://webllm.mlc.ai/
|
|
59
59
|
[project-website-template]: https://github.com/AfterPythonOrg/project-website-template
|
|
60
|
+
[commitizen]: https://github.com/commitizen-tools/commitizen
|
|
60
61
|
[uv]: https://docs.astral.sh/uv/
|
|
61
62
|
[ruff]: https://docs.astral.sh/ruff/
|
|
62
63
|
|
|
@@ -97,6 +98,7 @@ ap init
|
|
|
97
98
|
- [pre-commit]
|
|
98
99
|
- [GitHub Actions]
|
|
99
100
|
- [pdoc]
|
|
101
|
+
- [commitizen]
|
|
100
102
|
- [uv]
|
|
101
103
|
- [ruff]
|
|
102
104
|
- [pagefind]
|
|
@@ -8,40 +8,40 @@ afterpython/builders/__init__.py,sha256=MOv3spIh-ABwyUtvQAHhPZ2horWb0D93WNmOPNAz
|
|
|
8
8
|
afterpython/builders/metadata.py,sha256=IL-fe3GJYbAaqtMvw5HhpZJ7O57h5GX2GJtKKdWVab8,1275
|
|
9
9
|
afterpython/builders/molab.py,sha256=Qji8piWJB1tbzhgtld0pQWIsUA7d7RsGCfnoLVKd5EA,3714
|
|
10
10
|
afterpython/cli/__init__.py,sha256=1vLZylRMnGaV7cJ-kHO96dChp33_P4fBIJ_Vi-yyZg4,85
|
|
11
|
-
afterpython/cli/commands/build.py,sha256=
|
|
11
|
+
afterpython/cli/commands/build.py,sha256=GkO06D8ktaH3OZWcZhuh463n4vFE1A_OE-iwRuagQdM,8051
|
|
12
12
|
afterpython/cli/commands/bump.py,sha256=Wg-q3UQIkIRGT3umZCUBPpwIQTAHwQZVs1yHSZhmzKE,3088
|
|
13
13
|
afterpython/cli/commands/check.py,sha256=cLP4Vle3ENQHCXBv1okDlWK-L1XK-fv80m66xW3LQkg,1097
|
|
14
14
|
afterpython/cli/commands/clean.py,sha256=dCEkkWOTn93758wGTrWJG9V6c-lv2Z59CYfoP3i3rJE,2531
|
|
15
15
|
afterpython/cli/commands/commit.py,sha256=yRLOBs6JetZSGkFy9_uLzgR8yAX9djeUF291gabtuUo,880
|
|
16
16
|
afterpython/cli/commands/commitizen.py,sha256=naI8j4pfXIMsiOLmPMeZTGh831I3665_1_Sbn7yoKyE,811
|
|
17
|
-
afterpython/cli/commands/dev.py,sha256=
|
|
17
|
+
afterpython/cli/commands/dev.py,sha256=yI1g0v7HlVaVH6HwcHyukLYMyUbZjAd0BiCYk9QGdGw,6752
|
|
18
18
|
afterpython/cli/commands/format.py,sha256=cXvuc-6XwULM1VJjS2B2bJBvnV1TVHFl1CeSs0SYQ24,738
|
|
19
19
|
afterpython/cli/commands/init.py,sha256=Sc0B-Gv1bpYHzD8hYoVTXY2QsOV36kWcKH5vgHBmp1g,2987
|
|
20
20
|
afterpython/cli/commands/install.py,sha256=wgH9DEuN7hsA6BslNJASqOBn4VHJrYHBvowXDHi4smE,573
|
|
21
21
|
afterpython/cli/commands/pre_commit.py,sha256=DdmbkcZgJ7QArAY1y5vODYZmHUXWEIuXRyp69AS-pn0,1981
|
|
22
22
|
afterpython/cli/commands/preview.py,sha256=EbuB-dFcgonmqumTb2aHlLpXRiXkGE4DI3ddJdHwcaM,619
|
|
23
23
|
afterpython/cli/commands/release.py,sha256=6SDEnPtuCL0_XUqWUlvRSKxAv011QqOD0kc5pKu7378,2479
|
|
24
|
-
afterpython/cli/commands/start.py,sha256=
|
|
25
|
-
afterpython/cli/commands/sync.py,sha256=
|
|
24
|
+
afterpython/cli/commands/start.py,sha256=PnO1ECXnYtJxTOoDgG2ZoiVnkJVYNhPT63rabronjZ0,3992
|
|
25
|
+
afterpython/cli/commands/sync.py,sha256=PAb6t1sSvRBk_Gl0qCTu-j-6mepgVIZ5S9GzzTlorXE,4476
|
|
26
26
|
afterpython/cli/commands/update.py,sha256=f6dzoJIiEod7j44dgnaFe-v7INVdUbopVoWPxv7-Mpo,5491
|
|
27
27
|
afterpython/cli/main.py,sha256=GMcP7bmOA1glKGPsCuOXcd-9hv2k3BGkk_ofdo8oatw,2660
|
|
28
|
-
afterpython/const.py,sha256=
|
|
28
|
+
afterpython/const.py,sha256=KsALiC1kERK9BQQdYRXSHdYosxVExxgDN7iGYMAJrZE,158
|
|
29
29
|
afterpython/cz.toml,sha256=JlenGROat8jvxvqRH6KluDs6f7w0JAy8Skd3ak7sGLY,1506
|
|
30
30
|
afterpython/main.py,sha256=w0z6mTib3u4p2HxMrk-tIJlZtur7uRaqsbE0ewlYlSs,490
|
|
31
31
|
afterpython/pcu.py,sha256=RWgPcdAFyNBVhWbQPuL1seji9uyT8Pqz-zE6jCf_Qb8,6091
|
|
32
|
-
afterpython/templates/deploy-workflow-template.yml,sha256=
|
|
32
|
+
afterpython/templates/deploy-workflow-template.yml,sha256=O3uGNg-m-nK5ZUhIPpRMqLje1uAFm4OWk7JoTbEq8H4,2365
|
|
33
33
|
afterpython/templates/release-workflow-template.yml,sha256=DpuFLo3_43rqwBjDf3XrWbYJNRdlhy7-wJFL_TxdRNE,1606
|
|
34
34
|
afterpython/templates/ruff-template.toml,sha256=_yTtZ0YPsJiCxy66ZDfYaStTJ9aXXW-JXy-KW6l2bBE,1010
|
|
35
35
|
afterpython/tools/_afterpython.py,sha256=W88GhtQADB09DV4A24GOYBeYrHsnVVzllLdWFiKgS1A,1904
|
|
36
36
|
afterpython/tools/_git.py,sha256=pOcbP_hb6db3qRlbB4Hlp7MkShkTmUefnIBU2kqoq4I,3211
|
|
37
37
|
afterpython/tools/commitizen.py,sha256=9aGXsO4tTyDs3s8qS_fiskdSabHqc9XjHwePThybJU0,1469
|
|
38
38
|
afterpython/tools/github_actions.py,sha256=M3uGLJKOCml1fQBc8W2lkZWsR5p-0UVUolFWvqf5mDo,2866
|
|
39
|
-
afterpython/tools/myst.py,sha256=
|
|
39
|
+
afterpython/tools/myst.py,sha256=izNEpPmyV9Tut9tSaGxfzDfgb8xC0dTrAmP1Txpnk34,6601
|
|
40
40
|
afterpython/tools/pre_commit.py,sha256=stXUQfR0A6nPMCSuuKO-Icjc5F2z9VsZu2mKkIW1vWI,2193
|
|
41
41
|
afterpython/tools/pyproject.py,sha256=YwJJAB3lIqYK9wt8UtL4dfCli9UN7uzi3e-vtycB0HE,2325
|
|
42
|
-
afterpython/utils.py,sha256=
|
|
42
|
+
afterpython/utils.py,sha256=WzP34cA0_Mh3F_focTtk-4sSqrIZUpv7PpkPJHpUUzc,6934
|
|
43
43
|
afterpython/version.py,sha256=hihRV1S-gc1m46OaXD32ikkEkqzs-Gtq7AcAqOQV-wY,1603
|
|
44
|
-
afterpython-0.1.0.
|
|
45
|
-
afterpython-0.1.0.
|
|
46
|
-
afterpython-0.1.0.
|
|
47
|
-
afterpython-0.1.0.
|
|
44
|
+
afterpython-0.1.0.dev6.dist-info/WHEEL,sha256=YUH1mBqsx8Dh2cQG2rlcuRYUhJddG9iClegy4IgnHik,79
|
|
45
|
+
afterpython-0.1.0.dev6.dist-info/entry_points.txt,sha256=roa0PDgBueM1JPbRG0G2OSxzaN394OUL_oS9iEwVLBc,80
|
|
46
|
+
afterpython-0.1.0.dev6.dist-info/METADATA,sha256=BP2WPhprUjtWpHJE53UeCuQYj5lio4_S9O9ix4WC8Pw,4848
|
|
47
|
+
afterpython-0.1.0.dev6.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|