afterpython 0.1.0.dev8__py3-none-any.whl → 0.1.0.dev9__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/_io/toml.py +5 -3
- afterpython/_paths.py +1 -1
- afterpython/_typing.py +1 -2
- afterpython/builders/__init__.py +0 -1
- afterpython/builders/metadata.py +1 -1
- afterpython/builders/molab.py +2 -1
- afterpython/cli/__init__.py +0 -1
- afterpython/cli/commands/add.py +67 -0
- afterpython/cli/commands/build.py +9 -8
- afterpython/cli/commands/clean.py +2 -1
- afterpython/cli/commands/commit.py +16 -1
- afterpython/cli/commands/dev.py +3 -2
- afterpython/cli/commands/init.py +5 -5
- afterpython/cli/commands/install.py +8 -2
- afterpython/cli/commands/lock.py +23 -0
- afterpython/cli/commands/remove.py +67 -0
- afterpython/cli/commands/start.py +6 -3
- afterpython/cli/commands/sync.py +3 -3
- afterpython/cli/commands/update.py +26 -3
- afterpython/cli/main.py +73 -15
- afterpython/const.py +0 -1
- afterpython/pcu.py +3 -1
- afterpython/templates/ruff-template.toml +1 -1
- afterpython/tools/_afterpython.py +2 -1
- afterpython/tools/branch_rules.py +0 -1
- afterpython/tools/commitizen.py +1 -2
- afterpython/tools/myst.py +4 -2
- afterpython/tools/pre_commit.py +1 -3
- afterpython/tools/pyproject.py +4 -2
- afterpython/utils.py +4 -0
- {afterpython-0.1.0.dev8.dist-info → afterpython-0.1.0.dev9.dist-info}/METADATA +9 -7
- afterpython-0.1.0.dev9.dist-info/RECORD +52 -0
- {afterpython-0.1.0.dev8.dist-info → afterpython-0.1.0.dev9.dist-info}/WHEEL +1 -1
- afterpython-0.1.0.dev8.dist-info/RECORD +0 -49
- {afterpython-0.1.0.dev8.dist-info → afterpython-0.1.0.dev9.dist-info}/entry_points.txt +0 -0
afterpython/_io/toml.py
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
|
+
|
|
2
3
|
from typing import TYPE_CHECKING
|
|
3
4
|
|
|
4
5
|
if TYPE_CHECKING:
|
|
5
|
-
from tomlkit.toml_document import TOMLDocument
|
|
6
6
|
from pathlib import Path
|
|
7
7
|
|
|
8
|
+
from tomlkit.toml_document import TOMLDocument
|
|
9
|
+
|
|
8
10
|
import tomlkit
|
|
9
11
|
|
|
10
12
|
|
|
@@ -16,7 +18,7 @@ def _from_tomlkit(value):
|
|
|
16
18
|
- tomlkit containers → plain Python containers
|
|
17
19
|
- tomlkit primitives → plain Python primitives
|
|
18
20
|
"""
|
|
19
|
-
from tomlkit.items import Array, InlineTable, Table
|
|
21
|
+
from tomlkit.items import AoT, Array, InlineTable, Table
|
|
20
22
|
|
|
21
23
|
if value is None:
|
|
22
24
|
return None
|
|
@@ -58,7 +60,7 @@ def _to_tomlkit(value):
|
|
|
58
60
|
- List of dicts → array of inline tables: [{key = val}]
|
|
59
61
|
- Nested dicts → nested tables with proper structure
|
|
60
62
|
"""
|
|
61
|
-
from tomlkit import
|
|
63
|
+
from tomlkit import array, inline_table
|
|
62
64
|
|
|
63
65
|
if value is None:
|
|
64
66
|
return None
|
afterpython/_paths.py
CHANGED
afterpython/_typing.py
CHANGED
afterpython/builders/__init__.py
CHANGED
afterpython/builders/metadata.py
CHANGED
afterpython/builders/molab.py
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
|
+
|
|
2
3
|
from typing import TYPE_CHECKING
|
|
3
4
|
|
|
4
5
|
if TYPE_CHECKING:
|
|
@@ -10,8 +11,8 @@ from pathlib import Path
|
|
|
10
11
|
from pyproject_metadata import StandardMetadata
|
|
11
12
|
|
|
12
13
|
import afterpython as ap
|
|
13
|
-
from afterpython.tools.pyproject import read_metadata
|
|
14
14
|
from afterpython.const import CONTENT_TYPES
|
|
15
|
+
from afterpython.tools.pyproject import read_metadata
|
|
15
16
|
|
|
16
17
|
|
|
17
18
|
def _get_molab_badge() -> str:
|
afterpython/cli/__init__.py
CHANGED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import subprocess
|
|
2
|
+
|
|
3
|
+
import click
|
|
4
|
+
from click.exceptions import Exit
|
|
5
|
+
|
|
6
|
+
from afterpython.utils import has_pixi, has_uv
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
@click.command()
|
|
10
|
+
@click.option(
|
|
11
|
+
"--optional",
|
|
12
|
+
type=str,
|
|
13
|
+
default=None,
|
|
14
|
+
required=False,
|
|
15
|
+
help="Add to an optional dependency group (pixi: mapped to 'optional' feature)",
|
|
16
|
+
)
|
|
17
|
+
@click.option(
|
|
18
|
+
"--group",
|
|
19
|
+
type=str,
|
|
20
|
+
default=None,
|
|
21
|
+
required=False,
|
|
22
|
+
help="Add to a dependency group (pixi: mapped to same-named feature)",
|
|
23
|
+
)
|
|
24
|
+
@click.argument("lib", type=str, required=True)
|
|
25
|
+
def add(optional: str | None, group: str | None, lib: str):
|
|
26
|
+
"""Add a new dependency to the project (manages both uv and pixi if present)"""
|
|
27
|
+
if not has_uv():
|
|
28
|
+
click.echo("uv not found. Please install uv first.")
|
|
29
|
+
return
|
|
30
|
+
|
|
31
|
+
if optional and group:
|
|
32
|
+
click.echo("Error: Cannot specify both --optional and --group")
|
|
33
|
+
raise Exit(1)
|
|
34
|
+
|
|
35
|
+
result = subprocess.run(
|
|
36
|
+
[
|
|
37
|
+
"uv",
|
|
38
|
+
"add",
|
|
39
|
+
*(["--optional", optional] if optional else []),
|
|
40
|
+
*(["--group", group] if group else []),
|
|
41
|
+
lib,
|
|
42
|
+
],
|
|
43
|
+
check=False,
|
|
44
|
+
)
|
|
45
|
+
if result.returncode != 0:
|
|
46
|
+
raise Exit(result.returncode)
|
|
47
|
+
|
|
48
|
+
if has_pixi():
|
|
49
|
+
# NOTE: pixi doesn't support --optional, so we need to use --feature instead
|
|
50
|
+
if optional:
|
|
51
|
+
feature_name = "optional"
|
|
52
|
+
elif group:
|
|
53
|
+
feature_name = group
|
|
54
|
+
else:
|
|
55
|
+
feature_name = None
|
|
56
|
+
result = subprocess.run(
|
|
57
|
+
[
|
|
58
|
+
"pixi",
|
|
59
|
+
"add",
|
|
60
|
+
"--pypi",
|
|
61
|
+
*(["--feature", feature_name] if feature_name else []),
|
|
62
|
+
lib,
|
|
63
|
+
],
|
|
64
|
+
check=False,
|
|
65
|
+
)
|
|
66
|
+
if result.returncode != 0:
|
|
67
|
+
raise Exit(result.returncode)
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
|
-
|
|
2
|
+
|
|
3
3
|
from collections.abc import Callable
|
|
4
|
+
from typing import TYPE_CHECKING
|
|
4
5
|
|
|
5
6
|
if TYPE_CHECKING:
|
|
6
|
-
from afterpython._typing import NodeEnv
|
|
7
7
|
from pathlib import Path
|
|
8
8
|
|
|
9
|
+
from afterpython._typing import NodeEnv
|
|
10
|
+
|
|
9
11
|
import os
|
|
10
12
|
import shutil
|
|
11
13
|
import subprocess
|
|
@@ -14,12 +16,12 @@ import click
|
|
|
14
16
|
from click.exceptions import Exit
|
|
15
17
|
|
|
16
18
|
import afterpython as ap
|
|
17
|
-
from afterpython.utils import find_node_env
|
|
18
|
-
from afterpython.const import CONTENT_TYPES
|
|
19
19
|
from afterpython.builders import (
|
|
20
|
-
build_metadata,
|
|
21
20
|
add_molab_badge_to_jupyter_notebooks,
|
|
21
|
+
build_metadata,
|
|
22
22
|
)
|
|
23
|
+
from afterpython.const import CONTENT_TYPES
|
|
24
|
+
from afterpython.utils import find_node_env
|
|
23
25
|
|
|
24
26
|
|
|
25
27
|
def determine_base_path() -> str:
|
|
@@ -29,9 +31,9 @@ def determine_base_path() -> str:
|
|
|
29
31
|
Empty string if custom domain is configured (no github.io in URL)
|
|
30
32
|
/repo-name if using default GitHub Pages URL (contains github.io)
|
|
31
33
|
"""
|
|
34
|
+
from afterpython._io.toml import _from_tomlkit
|
|
32
35
|
from afterpython.tools._afterpython import read_afterpython
|
|
33
36
|
from afterpython.tools.pyproject import read_metadata
|
|
34
|
-
from afterpython._io.toml import _from_tomlkit
|
|
35
37
|
|
|
36
38
|
# Read website URL from afterpython.toml
|
|
37
39
|
afterpython = read_afterpython()
|
|
@@ -167,8 +169,7 @@ def build(ctx, dev: bool, execute: bool):
|
|
|
167
169
|
|
|
168
170
|
Use --execute to execute Jupyter notebooks for all content types.
|
|
169
171
|
"""
|
|
170
|
-
from afterpython.utils import has_content_for_myst
|
|
171
|
-
from afterpython.utils import handle_passthrough_help
|
|
172
|
+
from afterpython.utils import handle_passthrough_help, has_content_for_myst
|
|
172
173
|
|
|
173
174
|
# Show both our options and myst's help and exit
|
|
174
175
|
handle_passthrough_help(
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
|
+
|
|
2
3
|
from typing import TYPE_CHECKING
|
|
3
4
|
|
|
4
5
|
if TYPE_CHECKING:
|
|
@@ -10,8 +11,8 @@ import subprocess
|
|
|
10
11
|
import click
|
|
11
12
|
from click.exceptions import Exit
|
|
12
13
|
|
|
13
|
-
from afterpython.utils import find_node_env, has_content_for_myst
|
|
14
14
|
from afterpython.const import CONTENT_TYPES
|
|
15
|
+
from afterpython.utils import find_node_env, has_content_for_myst
|
|
15
16
|
|
|
16
17
|
|
|
17
18
|
@click.command(
|
|
@@ -15,7 +15,13 @@ import click
|
|
|
15
15
|
@click.option(
|
|
16
16
|
"--no-cz", "--no-commitizen", is_flag=True, help="Skip running 'cz commit'"
|
|
17
17
|
)
|
|
18
|
-
|
|
18
|
+
@click.option(
|
|
19
|
+
"--no-pc",
|
|
20
|
+
"--no-pre-commit",
|
|
21
|
+
is_flag=True,
|
|
22
|
+
help="Skip running pre-commit checks before commit",
|
|
23
|
+
)
|
|
24
|
+
def commit(ctx, no_cz: bool, no_pc: bool):
|
|
19
25
|
"""Run 'cz commit'"""
|
|
20
26
|
from afterpython.utils import handle_passthrough_help
|
|
21
27
|
|
|
@@ -26,6 +32,15 @@ def commit(ctx, no_cz: bool):
|
|
|
26
32
|
show_underlying=True,
|
|
27
33
|
)
|
|
28
34
|
|
|
35
|
+
# Run pre-commit checks first (unless --no-pc is set)
|
|
36
|
+
if not no_pc:
|
|
37
|
+
result = subprocess.run(["ap", "pc", "run"])
|
|
38
|
+
if result.returncode != 0:
|
|
39
|
+
click.echo(
|
|
40
|
+
"❌ Pre-commit checks failed. Please fix the issues and try again."
|
|
41
|
+
)
|
|
42
|
+
ctx.exit(1)
|
|
43
|
+
|
|
29
44
|
if not no_cz:
|
|
30
45
|
subprocess.run(["ap", "cz", "commit", *ctx.args])
|
|
31
46
|
else:
|
afterpython/cli/commands/dev.py
CHANGED
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
|
+
|
|
2
3
|
from typing import TYPE_CHECKING
|
|
3
4
|
|
|
4
5
|
if TYPE_CHECKING:
|
|
5
6
|
from afterpython._typing import NodeEnv
|
|
6
7
|
|
|
7
|
-
import time
|
|
8
8
|
import subprocess
|
|
9
|
+
import time
|
|
9
10
|
|
|
10
11
|
import click
|
|
11
12
|
from click.exceptions import Exit
|
|
12
13
|
|
|
13
|
-
from afterpython.utils import find_node_env, find_available_port
|
|
14
14
|
from afterpython.const import CONTENT_TYPES
|
|
15
|
+
from afterpython.utils import find_available_port, find_node_env
|
|
15
16
|
|
|
16
17
|
|
|
17
18
|
@click.command(
|
afterpython/cli/commands/init.py
CHANGED
|
@@ -22,7 +22,7 @@ def init_ruff_toml():
|
|
|
22
22
|
"repos": [
|
|
23
23
|
{
|
|
24
24
|
"repo": "https://github.com/astral-sh/ruff-pre-commit",
|
|
25
|
-
"rev": "v0.14.
|
|
25
|
+
"rev": "v0.14.6",
|
|
26
26
|
"hooks": [
|
|
27
27
|
{
|
|
28
28
|
"id": "ruff-check",
|
|
@@ -56,15 +56,15 @@ def init_website():
|
|
|
56
56
|
@click.pass_context
|
|
57
57
|
def init(ctx, yes):
|
|
58
58
|
"""Initialize afterpython with MyST Markdown (by default) and project website template"""
|
|
59
|
-
from afterpython.tools.pyproject import init_pyproject
|
|
60
59
|
from afterpython.tools._afterpython import init_afterpython
|
|
61
|
-
from afterpython.tools.myst import init_myst
|
|
62
|
-
from afterpython.tools.pre_commit import init_pre_commit
|
|
63
60
|
from afterpython.tools.commitizen import init_commitizen
|
|
64
61
|
from afterpython.tools.github_actions import (
|
|
65
|
-
create_workflow,
|
|
66
62
|
create_dependabot,
|
|
63
|
+
create_workflow,
|
|
67
64
|
)
|
|
65
|
+
from afterpython.tools.myst import init_myst
|
|
66
|
+
from afterpython.tools.pre_commit import init_pre_commit
|
|
67
|
+
from afterpython.tools.pyproject import init_pyproject
|
|
68
68
|
|
|
69
69
|
paths = ctx.obj["paths"]
|
|
70
70
|
click.echo("Initializing afterpython...")
|
|
@@ -3,7 +3,7 @@ import subprocess
|
|
|
3
3
|
import click
|
|
4
4
|
from click.exceptions import Exit
|
|
5
5
|
|
|
6
|
-
from afterpython.utils import has_uv
|
|
6
|
+
from afterpython.utils import has_pixi, has_uv
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
@click.command(
|
|
@@ -13,10 +13,16 @@ from afterpython.utils import has_uv
|
|
|
13
13
|
)
|
|
14
14
|
)
|
|
15
15
|
def install():
|
|
16
|
-
"""
|
|
16
|
+
"""Install all dependencies (runs 'uv sync --all-extras --all-groups' and 'pixi install' if present)"""
|
|
17
17
|
if not has_uv():
|
|
18
18
|
click.echo("uv not found. Please install uv first.")
|
|
19
19
|
return
|
|
20
|
+
|
|
20
21
|
result = subprocess.run(["uv", "sync", "--all-extras", "--all-groups"], check=False)
|
|
21
22
|
if result.returncode != 0:
|
|
22
23
|
raise Exit(result.returncode)
|
|
24
|
+
|
|
25
|
+
if has_pixi():
|
|
26
|
+
result = subprocess.run(["pixi", "install"], check=False)
|
|
27
|
+
if result.returncode != 0:
|
|
28
|
+
raise Exit(result.returncode)
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import subprocess
|
|
2
|
+
|
|
3
|
+
import click
|
|
4
|
+
from click.exceptions import Exit
|
|
5
|
+
|
|
6
|
+
from afterpython.utils import has_pixi, has_uv
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
@click.command()
|
|
10
|
+
def lock():
|
|
11
|
+
"""Lock the dependencies (runs 'uv lock' and 'pixi lock' if present)"""
|
|
12
|
+
if not has_uv():
|
|
13
|
+
click.echo("uv not found. Please install uv first.")
|
|
14
|
+
return
|
|
15
|
+
|
|
16
|
+
result = subprocess.run(["uv", "lock"], check=False)
|
|
17
|
+
if result.returncode != 0:
|
|
18
|
+
raise Exit(result.returncode)
|
|
19
|
+
|
|
20
|
+
if has_pixi():
|
|
21
|
+
result = subprocess.run(["pixi", "lock"], check=False)
|
|
22
|
+
if result.returncode != 0:
|
|
23
|
+
raise Exit(result.returncode)
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import subprocess
|
|
2
|
+
|
|
3
|
+
import click
|
|
4
|
+
from click.exceptions import Exit
|
|
5
|
+
|
|
6
|
+
from afterpython.utils import has_pixi, has_uv
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
@click.command()
|
|
10
|
+
@click.option(
|
|
11
|
+
"--optional",
|
|
12
|
+
type=str,
|
|
13
|
+
default=None,
|
|
14
|
+
required=False,
|
|
15
|
+
help="Remove from an optional dependency group (pixi: mapped to 'optional' feature)",
|
|
16
|
+
)
|
|
17
|
+
@click.option(
|
|
18
|
+
"--group",
|
|
19
|
+
type=str,
|
|
20
|
+
default=None,
|
|
21
|
+
required=False,
|
|
22
|
+
help="Remove from a dependency group (pixi: mapped to same-named feature)",
|
|
23
|
+
)
|
|
24
|
+
@click.argument("lib", type=str, required=True)
|
|
25
|
+
def remove(optional: str | None, group: str | None, lib: str):
|
|
26
|
+
"""Remove a dependency from the project (manages both uv and pixi if present)"""
|
|
27
|
+
if not has_uv():
|
|
28
|
+
click.echo("uv not found. Please install uv first.")
|
|
29
|
+
return
|
|
30
|
+
|
|
31
|
+
if optional and group:
|
|
32
|
+
click.echo("Error: Cannot specify both --optional and --group")
|
|
33
|
+
raise Exit(1)
|
|
34
|
+
|
|
35
|
+
result = subprocess.run(
|
|
36
|
+
[
|
|
37
|
+
"uv",
|
|
38
|
+
"remove",
|
|
39
|
+
*(["--optional", optional] if optional else []),
|
|
40
|
+
*(["--group", group] if group else []),
|
|
41
|
+
lib,
|
|
42
|
+
],
|
|
43
|
+
check=False,
|
|
44
|
+
)
|
|
45
|
+
if result.returncode != 0:
|
|
46
|
+
raise Exit(result.returncode)
|
|
47
|
+
|
|
48
|
+
if has_pixi():
|
|
49
|
+
# NOTE: pixi doesn't support --optional, so we need to use --feature instead
|
|
50
|
+
if optional:
|
|
51
|
+
feature_name = "optional"
|
|
52
|
+
elif group:
|
|
53
|
+
feature_name = group
|
|
54
|
+
else:
|
|
55
|
+
feature_name = None
|
|
56
|
+
result = subprocess.run(
|
|
57
|
+
[
|
|
58
|
+
"pixi",
|
|
59
|
+
"remove",
|
|
60
|
+
"--pypi",
|
|
61
|
+
*(["--feature", feature_name] if feature_name else []),
|
|
62
|
+
lib,
|
|
63
|
+
],
|
|
64
|
+
check=False,
|
|
65
|
+
)
|
|
66
|
+
if result.returncode != 0:
|
|
67
|
+
raise Exit(result.returncode)
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
|
+
|
|
2
3
|
from typing import TYPE_CHECKING
|
|
3
4
|
|
|
4
5
|
if TYPE_CHECKING:
|
|
@@ -9,7 +10,6 @@ import subprocess
|
|
|
9
10
|
import click
|
|
10
11
|
from click.exceptions import Exit
|
|
11
12
|
|
|
12
|
-
|
|
13
13
|
command_kwargs = {
|
|
14
14
|
"add_help_option": False, # disable click's --help option so that myst start --help can work
|
|
15
15
|
"context_settings": dict(
|
|
@@ -43,9 +43,12 @@ command_kwargs = {
|
|
|
43
43
|
)
|
|
44
44
|
def start(ctx, doc: bool, blog: bool, tutorial: bool, example: bool, guide: bool):
|
|
45
45
|
"""Simple wrapper for `myst start` for convenience"""
|
|
46
|
-
from afterpython.utils import find_node_env, has_content_for_myst
|
|
47
46
|
from afterpython.const import CONTENT_TYPES
|
|
48
|
-
from afterpython.utils import
|
|
47
|
+
from afterpython.utils import (
|
|
48
|
+
find_node_env,
|
|
49
|
+
handle_passthrough_help,
|
|
50
|
+
has_content_for_myst,
|
|
51
|
+
)
|
|
49
52
|
|
|
50
53
|
# Show both our options and myst's help and exit
|
|
51
54
|
handle_passthrough_help(
|
afterpython/cli/commands/sync.py
CHANGED
|
@@ -10,8 +10,8 @@ from afterpython.utils import convert_author_name_to_id
|
|
|
10
10
|
|
|
11
11
|
def _sync_authors_yml(authors: list[tuple[str, str | None]]):
|
|
12
12
|
"""Sync authors.yml with authors in pyproject.toml"""
|
|
13
|
-
from afterpython.tools.myst import update_authors_yml
|
|
14
13
|
from afterpython._io.yaml import read_yaml
|
|
14
|
+
from afterpython.tools.myst import update_authors_yml
|
|
15
15
|
|
|
16
16
|
# read myst.yml from docs path to get "version"
|
|
17
17
|
doc_myst_yml = read_yaml(ap.paths.afterpython_path / "doc" / "myst.yml")
|
|
@@ -37,15 +37,15 @@ def _sync_authors_yml(authors: list[tuple[str, str | None]]):
|
|
|
37
37
|
@click.command()
|
|
38
38
|
def sync():
|
|
39
39
|
"""Sync between pyproject.toml+afterpython.toml and authors.yml+myst.yml files"""
|
|
40
|
+
from afterpython._io.toml import _from_tomlkit
|
|
40
41
|
from afterpython.const import CONTENT_TYPES
|
|
41
42
|
from afterpython.tools._afterpython import read_afterpython
|
|
43
|
+
from afterpython.tools.myst import update_myst_yml
|
|
42
44
|
from afterpython.tools.pyproject import (
|
|
43
45
|
read_metadata,
|
|
44
46
|
read_pyproject,
|
|
45
47
|
write_pyproject,
|
|
46
48
|
)
|
|
47
|
-
from afterpython._io.toml import _from_tomlkit
|
|
48
|
-
from afterpython.tools.myst import update_myst_yml
|
|
49
49
|
|
|
50
50
|
pyproject: StandardMetadata = read_metadata()
|
|
51
51
|
project_name = str(pyproject.name)
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
|
+
|
|
2
3
|
from typing import TYPE_CHECKING
|
|
3
4
|
|
|
4
5
|
if TYPE_CHECKING:
|
|
5
6
|
from afterpython._typing import NodeEnv
|
|
6
7
|
from afterpython.pcu import Dependencies
|
|
7
8
|
|
|
8
|
-
import subprocess
|
|
9
9
|
import shutil
|
|
10
|
+
import subprocess
|
|
10
11
|
|
|
11
12
|
import click
|
|
12
13
|
from click.exceptions import Exit
|
|
@@ -33,7 +34,7 @@ def update():
|
|
|
33
34
|
def dependencies(upgrade: bool, all: bool):
|
|
34
35
|
"""Update pyproject.toml dependencies to the latest version"""
|
|
35
36
|
from afterpython.pcu import get_dependencies, update_dependencies
|
|
36
|
-
from afterpython.utils import has_uv
|
|
37
|
+
from afterpython.utils import has_pixi, has_uv
|
|
37
38
|
|
|
38
39
|
dependencies: Dependencies = get_dependencies()
|
|
39
40
|
has_at_least_one_update = False
|
|
@@ -79,7 +80,9 @@ def dependencies(upgrade: bool, all: bool):
|
|
|
79
80
|
raise Exit(result.returncode)
|
|
80
81
|
click.echo(
|
|
81
82
|
click.style(
|
|
82
|
-
"✓ All dependencies upgraded successfully 🎉",
|
|
83
|
+
"✓ All dependencies in pyproject.toml upgraded successfully 🎉",
|
|
84
|
+
fg="green",
|
|
85
|
+
bold=True,
|
|
83
86
|
)
|
|
84
87
|
)
|
|
85
88
|
else:
|
|
@@ -89,6 +92,26 @@ def dependencies(upgrade: bool, all: bool):
|
|
|
89
92
|
if all:
|
|
90
93
|
subprocess.run(["ap", "pre-commit", "autoupdate"])
|
|
91
94
|
click.echo("All pre-commit hooks updated successfully.")
|
|
95
|
+
if has_pixi():
|
|
96
|
+
click.echo("Upgrading dependencies with pixi...")
|
|
97
|
+
result = subprocess.run(
|
|
98
|
+
["pixi", "upgrade", "--exclude", "python"], check=False
|
|
99
|
+
)
|
|
100
|
+
if result.returncode != 0:
|
|
101
|
+
raise Exit(result.returncode)
|
|
102
|
+
result = subprocess.run(["pixi", "lock"], check=False)
|
|
103
|
+
if result.returncode != 0:
|
|
104
|
+
raise Exit(result.returncode)
|
|
105
|
+
result = subprocess.run(["pixi", "install"], check=False)
|
|
106
|
+
if result.returncode != 0:
|
|
107
|
+
raise Exit(result.returncode)
|
|
108
|
+
click.echo(
|
|
109
|
+
click.style(
|
|
110
|
+
"✓ All dependencies in pixi.toml upgraded successfully 🎉",
|
|
111
|
+
fg="green",
|
|
112
|
+
bold=True,
|
|
113
|
+
)
|
|
114
|
+
)
|
|
92
115
|
|
|
93
116
|
|
|
94
117
|
update.add_command(dependencies, name="deps") # alias for "dependencies"
|
afterpython/cli/main.py
CHANGED
|
@@ -1,33 +1,89 @@
|
|
|
1
1
|
import os
|
|
2
2
|
import subprocess
|
|
3
|
+
from collections import defaultdict
|
|
3
4
|
|
|
4
5
|
import click
|
|
6
|
+
from dotenv import find_dotenv, load_dotenv
|
|
5
7
|
from trogon import tui
|
|
6
|
-
from dotenv import load_dotenv, find_dotenv
|
|
7
8
|
|
|
8
9
|
import afterpython as ap
|
|
9
10
|
from afterpython import __version__
|
|
10
|
-
from afterpython.cli.commands.
|
|
11
|
+
from afterpython.cli.commands.add import add
|
|
11
12
|
from afterpython.cli.commands.build import build
|
|
12
|
-
from afterpython.cli.commands.
|
|
13
|
-
from afterpython.cli.commands.update import update
|
|
13
|
+
from afterpython.cli.commands.bump import bump
|
|
14
14
|
from afterpython.cli.commands.check import check
|
|
15
|
-
from afterpython.cli.commands.install import install
|
|
16
|
-
from afterpython.cli.commands.format import format
|
|
17
|
-
from afterpython.cli.commands.sync import sync
|
|
18
|
-
from afterpython.cli.commands.start import start, doc, blog, tutorial, example, guide
|
|
19
|
-
from afterpython.cli.commands.preview import preview
|
|
20
15
|
from afterpython.cli.commands.clean import clean
|
|
21
|
-
from afterpython.cli.commands.pre_commit import pre_commit
|
|
22
|
-
from afterpython.cli.commands.commitizen import commitizen
|
|
23
16
|
from afterpython.cli.commands.commit import commit
|
|
24
|
-
from afterpython.cli.commands.
|
|
25
|
-
from afterpython.cli.commands.
|
|
17
|
+
from afterpython.cli.commands.commitizen import commitizen
|
|
18
|
+
from afterpython.cli.commands.dev import dev
|
|
19
|
+
from afterpython.cli.commands.format import format
|
|
20
|
+
from afterpython.cli.commands.init import init
|
|
26
21
|
from afterpython.cli.commands.init_branch_rules import init_branch_rules
|
|
22
|
+
from afterpython.cli.commands.install import install
|
|
23
|
+
from afterpython.cli.commands.lock import lock
|
|
24
|
+
from afterpython.cli.commands.pre_commit import pre_commit
|
|
25
|
+
from afterpython.cli.commands.preview import preview
|
|
26
|
+
from afterpython.cli.commands.release import release
|
|
27
|
+
from afterpython.cli.commands.remove import remove
|
|
28
|
+
from afterpython.cli.commands.start import blog, doc, example, guide, start, tutorial
|
|
29
|
+
from afterpython.cli.commands.sync import sync
|
|
30
|
+
from afterpython.cli.commands.update import update
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class AliasGroup(click.Group):
|
|
34
|
+
"""Custom group that displays command aliases together."""
|
|
35
|
+
|
|
36
|
+
def __init__(self, *args, **kwargs):
|
|
37
|
+
super().__init__(*args, **kwargs)
|
|
38
|
+
self._aliases = defaultdict(list) # Maps primary command -> list of aliases
|
|
39
|
+
self._alias_to_primary = {} # Maps alias -> primary command name
|
|
40
|
+
|
|
41
|
+
def add_command(self, cmd, name=None):
|
|
42
|
+
"""Track aliases when the same command is added with different names."""
|
|
43
|
+
name = name or cmd.name
|
|
44
|
+
|
|
45
|
+
# Check if this command object was already added under a different name
|
|
46
|
+
for existing_name, existing_cmd in self.commands.items():
|
|
47
|
+
if existing_cmd is cmd and existing_name != name:
|
|
48
|
+
# This is an alias
|
|
49
|
+
self._aliases[existing_name].append(name)
|
|
50
|
+
self._alias_to_primary[name] = existing_name
|
|
51
|
+
break
|
|
52
|
+
|
|
53
|
+
super().add_command(cmd, name)
|
|
54
|
+
|
|
55
|
+
def format_commands(self, ctx, formatter):
|
|
56
|
+
"""Format commands with aliases shown together."""
|
|
57
|
+
commands = []
|
|
58
|
+
for subcommand in self.list_commands(ctx):
|
|
59
|
+
# Skip aliases - they'll be shown with their primary command
|
|
60
|
+
if subcommand in self._alias_to_primary:
|
|
61
|
+
continue
|
|
62
|
+
|
|
63
|
+
cmd = self.get_command(ctx, subcommand)
|
|
64
|
+
if cmd is None:
|
|
65
|
+
continue
|
|
66
|
+
|
|
67
|
+
# Skip hidden commands
|
|
68
|
+
if cmd.hidden:
|
|
69
|
+
continue
|
|
70
|
+
|
|
71
|
+
help_text = cmd.get_short_help_str(limit=formatter.width)
|
|
72
|
+
|
|
73
|
+
# Build command name with aliases
|
|
74
|
+
aliases = self._aliases.get(subcommand, [])
|
|
75
|
+
if aliases:
|
|
76
|
+
subcommand = f"{subcommand}, {', '.join(aliases)}"
|
|
77
|
+
|
|
78
|
+
commands.append((subcommand, help_text))
|
|
79
|
+
|
|
80
|
+
if commands:
|
|
81
|
+
with formatter.section("Commands"):
|
|
82
|
+
formatter.write_dl(commands)
|
|
27
83
|
|
|
28
84
|
|
|
29
85
|
@tui(command="tui", help="Open terminal UI")
|
|
30
|
-
@click.group(context_settings={"help_option_names": ["-h", "--help"]})
|
|
86
|
+
@click.group(cls=AliasGroup, context_settings={"help_option_names": ["-h", "--help"]})
|
|
31
87
|
@click.pass_context
|
|
32
88
|
@click.version_option(version=__version__)
|
|
33
89
|
def afterpython_group(ctx):
|
|
@@ -65,10 +121,12 @@ afterpython_group.add_command(preview)
|
|
|
65
121
|
afterpython_group.add_command(clean)
|
|
66
122
|
afterpython_group.add_command(pre_commit)
|
|
67
123
|
afterpython_group.add_command(pre_commit, name="pc")
|
|
68
|
-
afterpython_group.add_command(pre_commit, name="precommit")
|
|
69
124
|
afterpython_group.add_command(commitizen)
|
|
70
125
|
afterpython_group.add_command(commitizen, name="cz")
|
|
71
126
|
afterpython_group.add_command(commit)
|
|
72
127
|
afterpython_group.add_command(bump)
|
|
73
128
|
afterpython_group.add_command(release)
|
|
74
129
|
afterpython_group.add_command(init_branch_rules)
|
|
130
|
+
afterpython_group.add_command(add)
|
|
131
|
+
afterpython_group.add_command(remove)
|
|
132
|
+
afterpython_group.add_command(lock)
|
afterpython/const.py
CHANGED
afterpython/pcu.py
CHANGED
|
@@ -3,7 +3,8 @@ pcu = "pip check updates", similar to ncu (npm check updates in Node.js)
|
|
|
3
3
|
"""
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
|
-
|
|
6
|
+
|
|
7
|
+
from typing import TYPE_CHECKING, NamedTuple, TypeAlias, TypedDict
|
|
7
8
|
|
|
8
9
|
if TYPE_CHECKING:
|
|
9
10
|
from tomlkit.toml_document import TOMLDocument
|
|
@@ -60,6 +61,7 @@ async def get_latest_versions(
|
|
|
60
61
|
) -> dict[str, Version | None]:
|
|
61
62
|
"""Get latest versions for a list of dependencies from PyPI."""
|
|
62
63
|
import httpx
|
|
64
|
+
|
|
63
65
|
from afterpython.utils import fetch_pypi_json
|
|
64
66
|
|
|
65
67
|
async def fetch_version(
|
|
@@ -18,7 +18,7 @@ ignore = [
|
|
|
18
18
|
]
|
|
19
19
|
# extended rules:
|
|
20
20
|
extend-select = [
|
|
21
|
-
|
|
21
|
+
"I", # isort - import sorting
|
|
22
22
|
"UP", # pyupgrade - upgrade syntax for newer Python
|
|
23
23
|
"B", # flake8-bugbear - find likely bugs
|
|
24
24
|
"SIM", # flake8-simplify - simplify code
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
|
+
|
|
2
3
|
from typing import TYPE_CHECKING
|
|
3
4
|
|
|
4
5
|
if TYPE_CHECKING:
|
|
@@ -7,7 +8,7 @@ if TYPE_CHECKING:
|
|
|
7
8
|
import tomlkit
|
|
8
9
|
|
|
9
10
|
import afterpython as ap
|
|
10
|
-
from afterpython._io.toml import read_toml, write_toml
|
|
11
|
+
from afterpython._io.toml import _to_tomlkit, read_toml, write_toml
|
|
11
12
|
|
|
12
13
|
|
|
13
14
|
def read_afterpython() -> TOMLDocument:
|
afterpython/tools/commitizen.py
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import afterpython as ap
|
|
2
2
|
|
|
3
|
-
|
|
4
3
|
commitizen_default = {
|
|
5
4
|
"tool": {
|
|
6
5
|
"commitizen": {
|
|
@@ -36,8 +35,8 @@ commitizen_pre_commit_hook = {
|
|
|
36
35
|
|
|
37
36
|
|
|
38
37
|
def init_commitizen():
|
|
39
|
-
from afterpython.tools.pre_commit import update_pre_commit
|
|
40
38
|
from afterpython._io.toml import write_toml
|
|
39
|
+
from afterpython.tools.pre_commit import update_pre_commit
|
|
41
40
|
|
|
42
41
|
afterpython_path = ap.paths.afterpython_path
|
|
43
42
|
commitizen_toml_path = afterpython_path / "cz.toml"
|
afterpython/tools/myst.py
CHANGED
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
|
+
|
|
2
3
|
from typing import TYPE_CHECKING
|
|
3
4
|
|
|
4
5
|
if TYPE_CHECKING:
|
|
5
6
|
from pathlib import Path
|
|
6
|
-
|
|
7
|
+
|
|
8
|
+
from afterpython._typing import NodeEnv, tContentType
|
|
7
9
|
|
|
8
10
|
import subprocess
|
|
9
11
|
|
|
10
12
|
import afterpython as ap
|
|
13
|
+
from afterpython._io.yaml import read_yaml, write_yaml
|
|
11
14
|
from afterpython.utils import deep_merge
|
|
12
|
-
from afterpython._io.yaml import write_yaml, read_yaml
|
|
13
15
|
|
|
14
16
|
|
|
15
17
|
def update_authors_yml(data_update: dict):
|
afterpython/tools/pre_commit.py
CHANGED
afterpython/tools/pyproject.py
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
|
+
|
|
2
3
|
from typing import TYPE_CHECKING
|
|
3
4
|
|
|
4
5
|
if TYPE_CHECKING:
|
|
@@ -9,7 +10,7 @@ import asyncio
|
|
|
9
10
|
from pyproject_metadata import StandardMetadata
|
|
10
11
|
|
|
11
12
|
import afterpython as ap
|
|
12
|
-
from afterpython._io.toml import read_toml, write_toml
|
|
13
|
+
from afterpython._io.toml import _to_tomlkit, read_toml, write_toml
|
|
13
14
|
|
|
14
15
|
|
|
15
16
|
def read_pyproject() -> TOMLDocument:
|
|
@@ -32,8 +33,9 @@ def init_pyproject():
|
|
|
32
33
|
- add [project.urls] section with homepage, repository, and documentation URLs
|
|
33
34
|
"""
|
|
34
35
|
import httpx
|
|
35
|
-
|
|
36
|
+
|
|
36
37
|
from afterpython.tools._git import get_git_user_config, get_github_url
|
|
38
|
+
from afterpython.utils import fetch_pypi_json
|
|
37
39
|
|
|
38
40
|
build_backend = "uv_build"
|
|
39
41
|
|
afterpython/utils.py
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
|
+
|
|
2
3
|
from typing import TYPE_CHECKING
|
|
3
4
|
|
|
4
5
|
if TYPE_CHECKING:
|
|
5
6
|
from pathlib import Path
|
|
7
|
+
|
|
6
8
|
from httpx import AsyncClient
|
|
9
|
+
|
|
7
10
|
from afterpython._typing import NodeEnv
|
|
8
11
|
|
|
9
12
|
import os
|
|
@@ -20,6 +23,7 @@ def find_node_env() -> NodeEnv:
|
|
|
20
23
|
If no, install the Node.js version specified in NODEENV_VERSION
|
|
21
24
|
"""
|
|
22
25
|
from mystmd_py.nodeenv import find_any_node
|
|
26
|
+
|
|
23
27
|
from afterpython.const import NODEENV_VERSION
|
|
24
28
|
|
|
25
29
|
# from mystmd_py.main import ensure_valid_version
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: afterpython
|
|
3
|
-
Version: 0.1.0.
|
|
4
|
-
Summary: CLI tool
|
|
3
|
+
Version: 0.1.0.dev9
|
|
4
|
+
Summary: CLI tool to streamline Python package maintenance and generate a dedicated project website
|
|
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
|
|
7
7
|
Author-email: Stephen Yau <softwareentrepreneer+afterpython@gmail.com>
|
|
@@ -10,6 +10,7 @@ Classifier: Operating System :: OS Independent
|
|
|
10
10
|
Classifier: Intended Audience :: Developers
|
|
11
11
|
Classifier: Topic :: Software Development :: Build Tools
|
|
12
12
|
Classifier: Topic :: Software Development :: Documentation
|
|
13
|
+
Classifier: Typing :: Typed
|
|
13
14
|
Classifier: Programming Language :: Python :: 3.11
|
|
14
15
|
Classifier: Programming Language :: Python :: 3.12
|
|
15
16
|
Classifier: Programming Language :: Python :: 3.13
|
|
@@ -21,11 +22,11 @@ Requires-Dist: ruamel-yaml>=0.18.16
|
|
|
21
22
|
Requires-Dist: gitpython>=3.1.45
|
|
22
23
|
Requires-Dist: pygithub>=2.8.1
|
|
23
24
|
Requires-Dist: python-dotenv>=1.2.1
|
|
24
|
-
Requires-Dist: pyproject-metadata>=0.
|
|
25
|
+
Requires-Dist: pyproject-metadata>=0.10.0
|
|
25
26
|
Requires-Dist: mystmd>=1.6.6
|
|
26
27
|
Requires-Dist: pdoc>=16.0.0
|
|
27
|
-
Requires-Dist: ruff>=0.14.
|
|
28
|
-
Requires-Dist: pre-commit>=4.
|
|
28
|
+
Requires-Dist: ruff>=0.14.6
|
|
29
|
+
Requires-Dist: pre-commit>=4.5.0
|
|
29
30
|
Requires-Dist: commitizen>=4.10.0
|
|
30
31
|
Requires-Python: >=3.11
|
|
31
32
|
Project-URL: documentation, https://afterpython.afterpython.org/doc
|
|
@@ -75,8 +76,9 @@ First-time maintainers must learn multiple tools and concepts, e.g. [MyST], [Sem
|
|
|
75
76
|
|
|
76
77
|
## Core Features
|
|
77
78
|
- [x] Write content directly in [MyST Markdown] or [Jupyter Notebook]
|
|
78
|
-
- [x] Go from writing to website deployment in minutes — no need to learn any of the underlying tools
|
|
79
|
-
- [x] Centralize all your content in a modern, unified project website — from documentation to blog posts
|
|
79
|
+
- [x] Go from writing to **website deployment in minutes** — no need to learn any of the underlying tools
|
|
80
|
+
- [x] Centralize all your content in a modern, **unified project website** — from documentation to blog posts
|
|
81
|
+
- [x] Zero-config orchestration — Pre-configured modern tooling with sane defaults (see [Tech Stack](#tech-stack)), so you can start maintaining packages immediately **without learning each tool**
|
|
80
82
|
- [ ] Export content as PDF — for example, combine all blog posts into a single PDF file
|
|
81
83
|
- [ ] **⚡ Full-text search** across **ALL** your content in your website — docs, blogs, tutorials, everything
|
|
82
84
|
- [ ] **🤖 Embedded AI Chatbot** that answers questions directly using an in-browser LLM — at no cost
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
afterpython/__init__.py,sha256=aNochs72gU2NR1cBzIkk3NxSsdJ7ceHluI5gdYwaFpI,289
|
|
2
|
+
afterpython/_io/toml.py,sha256=dvmq6n4MhlJ02u_YjfC3mOnCWatfCn_J1lugavigoJw,3410
|
|
3
|
+
afterpython/_io/yaml.py,sha256=raksve_gaIFJim8lQrq-kQHkRjTloed7CT2FY0oUJSg,654
|
|
4
|
+
afterpython/_paths.py,sha256=FTwQ7necKYuRosCyMZPfv1eqaEmGIsyqd3yXpm-WQTA,1584
|
|
5
|
+
afterpython/_typing.py,sha256=FbphSGoujPuTfCZqt0HaKQrBgzhRpCOEAEQU6Cbl7oA,145
|
|
6
|
+
afterpython/builders/__init__.py,sha256=_3x9_xP3xmMn3lJTsKZBrEC8kKFXZfkSa6KhNk1TyLQ,214
|
|
7
|
+
afterpython/builders/metadata.py,sha256=NkhKQLCmdzRId_tHNldIC3h3an3QQPjqBRGnhr9az1U,1273
|
|
8
|
+
afterpython/builders/molab.py,sha256=viQ3HY5tnMiHjrgsm4BAMuYtTpiFJ0SDYzcm1TyoRDI,3715
|
|
9
|
+
afterpython/cli/__init__.py,sha256=G4AB-rllhmr7tURFc5cXJfkjZZ2bXtMBg3oy4zUGEFw,84
|
|
10
|
+
afterpython/cli/commands/add.py,sha256=Ppp4msdvOwN9_-fdG5-b0-IV9p0Eef9CiIEU3srUjYk,1792
|
|
11
|
+
afterpython/cli/commands/build.py,sha256=kFVdu0tNn82qaHVDS9tUKHYwH73zE3adkRBG_c2t44c,8020
|
|
12
|
+
afterpython/cli/commands/bump.py,sha256=Wg-q3UQIkIRGT3umZCUBPpwIQTAHwQZVs1yHSZhmzKE,3088
|
|
13
|
+
afterpython/cli/commands/check.py,sha256=cLP4Vle3ENQHCXBv1okDlWK-L1XK-fv80m66xW3LQkg,1097
|
|
14
|
+
afterpython/cli/commands/clean.py,sha256=ZNhOwxcdxhkzqLPwDJ2_NPLnvMz3C1EKyNttXTyIHnI,2532
|
|
15
|
+
afterpython/cli/commands/commit.py,sha256=TKhlybJxbcChMzZJuTfYafCrYUraqyBpLJ4TP0WA-xs,1335
|
|
16
|
+
afterpython/cli/commands/commitizen.py,sha256=naI8j4pfXIMsiOLmPMeZTGh831I3665_1_Sbn7yoKyE,811
|
|
17
|
+
afterpython/cli/commands/dev.py,sha256=zuto7Z6nfD1FAhZkhZNoLhxVH78Eo3W3iO6QujOMXII,6753
|
|
18
|
+
afterpython/cli/commands/format.py,sha256=cXvuc-6XwULM1VJjS2B2bJBvnV1TVHFl1CeSs0SYQ24,738
|
|
19
|
+
afterpython/cli/commands/init.py,sha256=lyNcE-fmgXyLGoSRkvHg_xpDt9gnySemTh-0m6lX0Ws,3354
|
|
20
|
+
afterpython/cli/commands/init_branch_rules.py,sha256=fzAm8D5qbW3u4bEMpqPuRgO-0akuCGG7pu09JlKhYn4,243
|
|
21
|
+
afterpython/cli/commands/install.py,sha256=K3xYzU7XOts_xdERyd4q3wUFv0hythy7ZP6jr9N_6L4,777
|
|
22
|
+
afterpython/cli/commands/lock.py,sha256=WAfZY4Jb7XLl7_zcjxCAs8VCGitX-zPlkXLTkPtOqDs,605
|
|
23
|
+
afterpython/cli/commands/pre_commit.py,sha256=DdmbkcZgJ7QArAY1y5vODYZmHUXWEIuXRyp69AS-pn0,1981
|
|
24
|
+
afterpython/cli/commands/preview.py,sha256=EbuB-dFcgonmqumTb2aHlLpXRiXkGE4DI3ddJdHwcaM,619
|
|
25
|
+
afterpython/cli/commands/release.py,sha256=6SDEnPtuCL0_XUqWUlvRSKxAv011QqOD0kc5pKu7378,2479
|
|
26
|
+
afterpython/cli/commands/remove.py,sha256=Fl79JSI9IdHyzYflocXxcxgBkBPkNFAW98Yuijly26g,1812
|
|
27
|
+
afterpython/cli/commands/start.py,sha256=nXMOYQmAWqsqLphm09qxag83aLI7_w3TxjJQQt2CQjk,3992
|
|
28
|
+
afterpython/cli/commands/sync.py,sha256=2PQA_jxH701l_Ijmr4hZV6K-f_G1Wx7lRScDttT3-9E,4669
|
|
29
|
+
afterpython/cli/commands/update.py,sha256=inMdpNNtyDdh7311sIFwEiNzetXCzjSFG8YhyM9GVh0,6393
|
|
30
|
+
afterpython/cli/main.py,sha256=m3BJ5rOlllUyOngD2HF2fosDLrduREzAQKpsTqcYPZc,4956
|
|
31
|
+
afterpython/const.py,sha256=B_yUBmHPyu98aOibwt7idWbhKNBBed0TeYXNBd8tPTk,157
|
|
32
|
+
afterpython/main.py,sha256=w0z6mTib3u4p2HxMrk-tIJlZtur7uRaqsbE0ewlYlSs,490
|
|
33
|
+
afterpython/pcu.py,sha256=EoEhSzFZ49b5qc9KH2RLxIHSzY8YFM5uhtw07chcrr8,6093
|
|
34
|
+
afterpython/templates/ci-workflow-template.yml,sha256=2L-SRPB2GKlfR4bQAgpdq4r9bFdT9vCYo4oWjnIzKfg,5933
|
|
35
|
+
afterpython/templates/dependabot-template.yml,sha256=CBQEgh8EsXw2X7IqzGtFI7lVT9liF6PW4DvGLB0X2LY,1136
|
|
36
|
+
afterpython/templates/deploy-workflow-template.yml,sha256=2W4K3lKMYjSTPrlXIsMweBzqP9IoLtZXAAcUu5FA5NA,2365
|
|
37
|
+
afterpython/templates/release-workflow-template.yml,sha256=3YBkgrqmi--uznslpMxPz7Vj7L4_NPlhDxgwYBt-Ui8,1606
|
|
38
|
+
afterpython/templates/ruff-template.toml,sha256=lNCd4EthoLScr4cyVEgGUH4xK5CfIX3f9I3zkJHAYgg,1008
|
|
39
|
+
afterpython/tools/_afterpython.py,sha256=aZdRJ9dprA1HFchDFTqreJbrsI_HTPUaxtuBinVz10I,1905
|
|
40
|
+
afterpython/tools/_git.py,sha256=aO-qDEQ4OevD_B74DYKK4nQKYeiaS1BXmYc8paJRfbQ,3772
|
|
41
|
+
afterpython/tools/branch_rules.py,sha256=ciQ2H2YBnoCZu_plyVeIHzf2FcAILRFhpjzOR2_IfJg,3159
|
|
42
|
+
afterpython/tools/commitizen.py,sha256=xpLZJuEqrRxCYz8la6po1PIlECk9O1BuAgsmSE1EY3I,1468
|
|
43
|
+
afterpython/tools/github_actions.py,sha256=zVmg9aqUg-EO0CnbRHl9i8TmFtXpt7nd0VjzckqqE30,1527
|
|
44
|
+
afterpython/tools/myst.py,sha256=fh0FtgL9A1dmFa98QKsWFqExsG7hPRP3nrj62U9PmaA,6603
|
|
45
|
+
afterpython/tools/pre_commit.py,sha256=U4cazFxaZmyamk_n-85sL6BLOttURm-I2giksgE0qb8,2191
|
|
46
|
+
afterpython/tools/pyproject.py,sha256=YiSbW-bXYtFCkXRl_Ibdca2OeYZT0lsqzRRjZFxMcp4,2327
|
|
47
|
+
afterpython/utils.py,sha256=Uh4pTGeavH5pf8GCeMYQGqs3iPpZzjjAJ_R7t2mhEyY,7045
|
|
48
|
+
afterpython/version.py,sha256=hihRV1S-gc1m46OaXD32ikkEkqzs-Gtq7AcAqOQV-wY,1603
|
|
49
|
+
afterpython-0.1.0.dev9.dist-info/WHEEL,sha256=3id4o64OvRm9dUknh3mMJNcfoTRK08ua5cU6DFyVy-4,79
|
|
50
|
+
afterpython-0.1.0.dev9.dist-info/entry_points.txt,sha256=roa0PDgBueM1JPbRG0G2OSxzaN394OUL_oS9iEwVLBc,80
|
|
51
|
+
afterpython-0.1.0.dev9.dist-info/METADATA,sha256=-67mS-Do6Uw1T_KvopXaXvAJafgaAgbX_oaAzDUJqWo,5906
|
|
52
|
+
afterpython-0.1.0.dev9.dist-info/RECORD,,
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
afterpython/__init__.py,sha256=aNochs72gU2NR1cBzIkk3NxSsdJ7ceHluI5gdYwaFpI,289
|
|
2
|
-
afterpython/_io/toml.py,sha256=nrx0CFPONgmkz5WDCSMyr4caic6nzu0uCd33qOmhhF0,3408
|
|
3
|
-
afterpython/_io/yaml.py,sha256=raksve_gaIFJim8lQrq-kQHkRjTloed7CT2FY0oUJSg,654
|
|
4
|
-
afterpython/_paths.py,sha256=1NrPQ4erjA_rIvDggx7QRY4_01zyU-yht9s95Q-4YgM,1584
|
|
5
|
-
afterpython/_typing.py,sha256=kmxBRbhft85C8Ycm5BFBP258Jozrw9tsl7KHOVPcF_o,146
|
|
6
|
-
afterpython/builders/__init__.py,sha256=MOv3spIh-ABwyUtvQAHhPZ2horWb0D93WNmOPNAzKYo,215
|
|
7
|
-
afterpython/builders/metadata.py,sha256=fj7rlawZCh43aJrBBfcmOTlYew1aW-om3QTpVulKbOk,1273
|
|
8
|
-
afterpython/builders/molab.py,sha256=Qji8piWJB1tbzhgtld0pQWIsUA7d7RsGCfnoLVKd5EA,3714
|
|
9
|
-
afterpython/cli/__init__.py,sha256=1vLZylRMnGaV7cJ-kHO96dChp33_P4fBIJ_Vi-yyZg4,85
|
|
10
|
-
afterpython/cli/commands/build.py,sha256=14C30vDU1SaR_5RVnA62lAAzX_eSRnlEfZI5h5AIrsk,8051
|
|
11
|
-
afterpython/cli/commands/bump.py,sha256=Wg-q3UQIkIRGT3umZCUBPpwIQTAHwQZVs1yHSZhmzKE,3088
|
|
12
|
-
afterpython/cli/commands/check.py,sha256=cLP4Vle3ENQHCXBv1okDlWK-L1XK-fv80m66xW3LQkg,1097
|
|
13
|
-
afterpython/cli/commands/clean.py,sha256=dCEkkWOTn93758wGTrWJG9V6c-lv2Z59CYfoP3i3rJE,2531
|
|
14
|
-
afterpython/cli/commands/commit.py,sha256=yRLOBs6JetZSGkFy9_uLzgR8yAX9djeUF291gabtuUo,880
|
|
15
|
-
afterpython/cli/commands/commitizen.py,sha256=naI8j4pfXIMsiOLmPMeZTGh831I3665_1_Sbn7yoKyE,811
|
|
16
|
-
afterpython/cli/commands/dev.py,sha256=yI1g0v7HlVaVH6HwcHyukLYMyUbZjAd0BiCYk9QGdGw,6752
|
|
17
|
-
afterpython/cli/commands/format.py,sha256=cXvuc-6XwULM1VJjS2B2bJBvnV1TVHFl1CeSs0SYQ24,738
|
|
18
|
-
afterpython/cli/commands/init.py,sha256=EDX6ojHJyQzaYTef2BjaWoy4_yL-bf6DAnCKa-ylfTU,3354
|
|
19
|
-
afterpython/cli/commands/init_branch_rules.py,sha256=fzAm8D5qbW3u4bEMpqPuRgO-0akuCGG7pu09JlKhYn4,243
|
|
20
|
-
afterpython/cli/commands/install.py,sha256=wgH9DEuN7hsA6BslNJASqOBn4VHJrYHBvowXDHi4smE,573
|
|
21
|
-
afterpython/cli/commands/pre_commit.py,sha256=DdmbkcZgJ7QArAY1y5vODYZmHUXWEIuXRyp69AS-pn0,1981
|
|
22
|
-
afterpython/cli/commands/preview.py,sha256=EbuB-dFcgonmqumTb2aHlLpXRiXkGE4DI3ddJdHwcaM,619
|
|
23
|
-
afterpython/cli/commands/release.py,sha256=6SDEnPtuCL0_XUqWUlvRSKxAv011QqOD0kc5pKu7378,2479
|
|
24
|
-
afterpython/cli/commands/start.py,sha256=PnO1ECXnYtJxTOoDgG2ZoiVnkJVYNhPT63rabronjZ0,3992
|
|
25
|
-
afterpython/cli/commands/sync.py,sha256=epgD8VvrkYB1GSKMu4UFQb3-uGjyiLzw8CjtjaGB6zs,4669
|
|
26
|
-
afterpython/cli/commands/update.py,sha256=f6dzoJIiEod7j44dgnaFe-v7INVdUbopVoWPxv7-Mpo,5491
|
|
27
|
-
afterpython/cli/main.py,sha256=_M5Z3msEZEZ4sIWeM8hvEmnrt9Qd2PHbC_GjibdKVfk,2832
|
|
28
|
-
afterpython/const.py,sha256=KsALiC1kERK9BQQdYRXSHdYosxVExxgDN7iGYMAJrZE,158
|
|
29
|
-
afterpython/main.py,sha256=w0z6mTib3u4p2HxMrk-tIJlZtur7uRaqsbE0ewlYlSs,490
|
|
30
|
-
afterpython/pcu.py,sha256=RWgPcdAFyNBVhWbQPuL1seji9uyT8Pqz-zE6jCf_Qb8,6091
|
|
31
|
-
afterpython/templates/ci-workflow-template.yml,sha256=2L-SRPB2GKlfR4bQAgpdq4r9bFdT9vCYo4oWjnIzKfg,5933
|
|
32
|
-
afterpython/templates/dependabot-template.yml,sha256=CBQEgh8EsXw2X7IqzGtFI7lVT9liF6PW4DvGLB0X2LY,1136
|
|
33
|
-
afterpython/templates/deploy-workflow-template.yml,sha256=2W4K3lKMYjSTPrlXIsMweBzqP9IoLtZXAAcUu5FA5NA,2365
|
|
34
|
-
afterpython/templates/release-workflow-template.yml,sha256=3YBkgrqmi--uznslpMxPz7Vj7L4_NPlhDxgwYBt-Ui8,1606
|
|
35
|
-
afterpython/templates/ruff-template.toml,sha256=_yTtZ0YPsJiCxy66ZDfYaStTJ9aXXW-JXy-KW6l2bBE,1010
|
|
36
|
-
afterpython/tools/_afterpython.py,sha256=W88GhtQADB09DV4A24GOYBeYrHsnVVzllLdWFiKgS1A,1904
|
|
37
|
-
afterpython/tools/_git.py,sha256=aO-qDEQ4OevD_B74DYKK4nQKYeiaS1BXmYc8paJRfbQ,3772
|
|
38
|
-
afterpython/tools/branch_rules.py,sha256=Tn6PdiZjj3duQd2u2wa89Cgbkun1lT4tGbbK9Eb71Ck,3160
|
|
39
|
-
afterpython/tools/commitizen.py,sha256=9aGXsO4tTyDs3s8qS_fiskdSabHqc9XjHwePThybJU0,1469
|
|
40
|
-
afterpython/tools/github_actions.py,sha256=zVmg9aqUg-EO0CnbRHl9i8TmFtXpt7nd0VjzckqqE30,1527
|
|
41
|
-
afterpython/tools/myst.py,sha256=w24zqWRUOLaZIC0twpGM4BF__wldmrgIvbns0FFdunA,6601
|
|
42
|
-
afterpython/tools/pre_commit.py,sha256=stXUQfR0A6nPMCSuuKO-Icjc5F2z9VsZu2mKkIW1vWI,2193
|
|
43
|
-
afterpython/tools/pyproject.py,sha256=YwJJAB3lIqYK9wt8UtL4dfCli9UN7uzi3e-vtycB0HE,2325
|
|
44
|
-
afterpython/utils.py,sha256=LcQCXUw3OlgSeSliRm_ivq4kt7EX-_Nh7YunrYD7TqA,7041
|
|
45
|
-
afterpython/version.py,sha256=hihRV1S-gc1m46OaXD32ikkEkqzs-Gtq7AcAqOQV-wY,1603
|
|
46
|
-
afterpython-0.1.0.dev8.dist-info/WHEEL,sha256=AaqHSNJgTyoT6I9ETCXrbV_7cVSjA_q07lkDGeNjGdQ,79
|
|
47
|
-
afterpython-0.1.0.dev8.dist-info/entry_points.txt,sha256=roa0PDgBueM1JPbRG0G2OSxzaN394OUL_oS9iEwVLBc,80
|
|
48
|
-
afterpython-0.1.0.dev8.dist-info/METADATA,sha256=qSdlGSV3R2ip84sSGFOR7tNGiOz4y2KPSmnHef0sZ1w,5604
|
|
49
|
-
afterpython-0.1.0.dev8.dist-info/RECORD,,
|
|
File without changes
|