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.
@@ -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=node_env, check=False
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)
@@ -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(ctx, all: bool, execute: bool, no_website: bool):
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
- If --all is enabled, starts MyST dev servers for all content types (doc/blog/tutorial/example/guide)
42
- and the project website.
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 all:
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 all:
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:
@@ -16,6 +16,7 @@ command_kwargs = {
16
16
  ignore_unknown_options=True,
17
17
  allow_extra_args=True,
18
18
  ),
19
+ "hidden": True, # Hide these commands from help output
19
20
  }
20
21
 
21
22
 
@@ -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 read_metadata
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
@@ -2,4 +2,4 @@ from afterpython._typing import tContentType
2
2
 
3
3
 
4
4
  NODEENV_VERSION = "24.11.0"
5
- CONTENT_TYPES: list[tContentType] = ["doc", "blog", "tutorial", "example", "guide"]
5
+ CONTENT_TYPES: set[tContentType] = {"doc", "blog", "tutorial", "example", "guide"}
@@ -69,8 +69,6 @@ jobs:
69
69
  - name: Build website
70
70
  run: |
71
71
  ap build
72
- env:
73
- BASE_PATH: '/${{ github.event.repository.name }}'
74
72
 
75
73
  - name: Upload artifact
76
74
  uses: actions/upload-pages-artifact@v3
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
- # set comments for project section for convenience
70
- if "project" in existing_data:
71
- if not existing_data["project"].ca.items.get("id"):
72
- existing_data["project"].yaml_set_comment_before_after_key(
73
- "id",
74
- before="See how to create Table of Contents at: https://mystmd.org/guide/table-of-contents",
75
- )
76
- if not existing_data["project"].ca.items.get("authors"):
77
- existing_data["project"].yaml_set_comment_before_after_key(
78
- "authors",
79
- before="See more authors' fields at: https://mystmd.org/guide/frontmatter#frontmatter-authors",
80
- )
81
- if not existing_data["project"].ca.items.get("venue"):
82
- existing_data["project"].yaml_set_comment_before_after_key(
83
- "venue",
84
- before="See more venue's fields at: https://mystmd.org/guide/frontmatter#venue",
85
- )
86
- if "site" in existing_data:
87
- if not existing_data["site"].ca.items.get("options"):
88
- existing_data["site"].yaml_set_comment_before_after_key(
89
- "options",
90
- before="See options at: https://mystmd.org/guide/website-templates#site-options",
91
- )
92
- if not existing_data["site"].ca.items.get("actions"):
93
- existing_data["site"].yaml_set_comment_before_after_key(
94
- "actions",
95
- before="See web layout at: https://mystmd.org/guide/website-navigation",
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://ap.afterpython.org)
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 isinstance(base[key], list) and isinstance(value, list):
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.dev5
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://ap.afterpython.org/doc
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
  [![afterpython](https://afterpython.org/shield.svg)](https://afterpython.org)
40
- [![Pixi Badge](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/prefix-dev/pixi/main/assets/badge/v0.json)](https://pixi.sh)
41
40
  ![PyPI downloads](https://img.shields.io/pypi/dm/afterpython)
42
41
  [![PyPI](https://img.shields.io/pypi/v/afterpython.svg)](https://pypi.org/project/afterpython)
43
42
  ![PyPI - Support Python Versions](https://img.shields.io/pypi/pyversions/afterpython)
44
43
  [![Discussions](https://img.shields.io/badge/Discussions-Let's%20Chat-green)](https://github.com/AfterPythonOrg/afterpython/discussions)
45
44
  [![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/AfterPythonOrg/afterpython)
45
+ <!-- [![Pixi Badge](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/prefix-dev/pixi/main/assets/badge/v0.json)](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=Ir4jA5r2prpqUEIRsEt8hQctAwFEEjLVyxLp2FzgkQk,6600
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=QJmV9sARdxXTMX6oedeoJg3QAr7PYC0n3gcFkppd1X0,5106
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=_ikrxPErYSGYtn8MAlbWD0CDEhYdoKvZ9e7XvrUZfog,3932
25
- afterpython/cli/commands/sync.py,sha256=Cy9M52YmEGOZkhI8tX8RgM8SNad7q_LRlaNrkFEUYfM,4057
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=lNmmyObrjSxxMkVpIsEqtd9Nms_ndrW_omIP79BWvPc,159
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=jR0PudUbgzJ3q9iVdIeyES-jFXdFT8G3DPyZR8Vq9Go,2438
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=m-1W_Tv3VrP6GQIoRaCJZuiy3AuedJ42UV7jHcrg56c,6238
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=7r4jsxn-Rr2gvCh7MJqxVIjzZH7Jnjt1z_sl95cFaEk,6831
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.dev5.dist-info/WHEEL,sha256=YUH1mBqsx8Dh2cQG2rlcuRYUhJddG9iClegy4IgnHik,79
45
- afterpython-0.1.0.dev5.dist-info/entry_points.txt,sha256=roa0PDgBueM1JPbRG0G2OSxzaN394OUL_oS9iEwVLBc,80
46
- afterpython-0.1.0.dev5.dist-info/METADATA,sha256=JLl45YccZwBdpT11-PjaN1vej7rOarYGArD46xVOvdM,4742
47
- afterpython-0.1.0.dev5.dist-info/RECORD,,
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,,