autopub 1.0.0a19__py3-none-any.whl → 1.0.0a21__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.
- autopub/__init__.py +31 -3
- autopub/cli/__init__.py +21 -26
- autopub/{cli/plugins.py → plugin_loader.py} +1 -1
- autopub/plugins/uv.py +34 -0
- autopub-1.0.0a21.dist-info/METADATA +21 -0
- {autopub-1.0.0a19.dist-info → autopub-1.0.0a21.dist-info}/RECORD +9 -8
- {autopub-1.0.0a19.dist-info → autopub-1.0.0a21.dist-info}/WHEEL +1 -1
- autopub-1.0.0a19.dist-info/METADATA +0 -94
- {autopub-1.0.0a19.dist-info → autopub-1.0.0a21.dist-info}/LICENSE +0 -0
- {autopub-1.0.0a19.dist-info → autopub-1.0.0a21.dist-info}/entry_points.txt +0 -0
autopub/__init__.py
CHANGED
@@ -2,11 +2,12 @@ from __future__ import annotations
|
|
2
2
|
|
3
3
|
import hashlib
|
4
4
|
import json
|
5
|
-
from
|
5
|
+
from functools import cached_property
|
6
6
|
from pathlib import Path
|
7
|
-
from typing import Mapping, TypeAlias
|
7
|
+
from typing import Iterable, Mapping, TypeAlias
|
8
8
|
|
9
9
|
import frontmatter
|
10
|
+
import tomlkit
|
10
11
|
from pydantic import ValidationError
|
11
12
|
|
12
13
|
from autopub.exceptions import (
|
@@ -21,6 +22,7 @@ from autopub.exceptions import (
|
|
21
22
|
ReleaseTypeInvalid,
|
22
23
|
ReleaseTypeMissing,
|
23
24
|
)
|
25
|
+
from autopub.plugin_loader import load_plugins
|
24
26
|
from autopub.plugins import (
|
25
27
|
AutopubPackageManagerPlugin,
|
26
28
|
AutopubPlugin,
|
@@ -35,12 +37,27 @@ ConfigType = Mapping[str, ConfigValue]
|
|
35
37
|
|
36
38
|
|
37
39
|
class Autopub:
|
38
|
-
config: ConfigType = {}
|
39
40
|
RELEASE_FILE_PATH = "RELEASE.md"
|
41
|
+
plugins: list[AutopubPlugin]
|
40
42
|
|
41
43
|
def __init__(self, plugins: Iterable[type[AutopubPlugin]] = ()) -> None:
|
42
44
|
self.plugins = [plugin_class() for plugin_class in plugins]
|
43
45
|
|
46
|
+
self.load_plugins()
|
47
|
+
|
48
|
+
@cached_property
|
49
|
+
def config(self) -> ConfigType:
|
50
|
+
pyproject_path = Path.cwd() / "pyproject.toml"
|
51
|
+
|
52
|
+
if not Path("pyproject.toml").exists():
|
53
|
+
return {}
|
54
|
+
|
55
|
+
content = pyproject_path.read_text()
|
56
|
+
|
57
|
+
data = tomlkit.parse(content)
|
58
|
+
|
59
|
+
return data.get("tool", {}).get("autopub", {}) # type: ignore
|
60
|
+
|
44
61
|
@property
|
45
62
|
def release_file(self) -> Path:
|
46
63
|
return Path.cwd() / self.RELEASE_FILE_PATH
|
@@ -69,6 +86,17 @@ class Autopub:
|
|
69
86
|
|
70
87
|
return ReleaseInfo.from_dict(release_info)
|
71
88
|
|
89
|
+
def load_plugins(self, default_plugins: list[str] | None = None) -> None:
|
90
|
+
default_plugins = default_plugins or []
|
91
|
+
|
92
|
+
additional_plugins: list[str] = self.config.get("plugins", []) # type: ignore
|
93
|
+
|
94
|
+
all_plugins = default_plugins + additional_plugins
|
95
|
+
|
96
|
+
plugins = load_plugins(all_plugins)
|
97
|
+
|
98
|
+
self.plugins += [plugin_class() for plugin_class in plugins]
|
99
|
+
|
72
100
|
def check(self) -> None:
|
73
101
|
release_file = Path(self.RELEASE_FILE_PATH)
|
74
102
|
|
autopub/cli/__init__.py
CHANGED
@@ -9,7 +9,6 @@ from rich.panel import Panel
|
|
9
9
|
from typing_extensions import Annotated
|
10
10
|
|
11
11
|
from autopub import Autopub
|
12
|
-
from autopub.cli.plugins import find_plugins
|
13
12
|
from autopub.exceptions import AutopubException, InvalidConfiguration
|
14
13
|
|
15
14
|
app = typer.Typer()
|
@@ -19,14 +18,15 @@ class State(TypedDict):
|
|
19
18
|
plugins: list[str]
|
20
19
|
|
21
20
|
|
22
|
-
|
21
|
+
class AutoPubCLI(typer.Context):
|
22
|
+
obj: Autopub
|
23
23
|
|
24
24
|
|
25
25
|
@app.command()
|
26
|
-
def check():
|
26
|
+
def check(context: AutoPubCLI):
|
27
27
|
"""This commands checks if the current PR has a valid release file."""
|
28
28
|
|
29
|
-
autopub =
|
29
|
+
autopub = context.obj
|
30
30
|
|
31
31
|
try:
|
32
32
|
autopub.validate_config()
|
@@ -38,7 +38,8 @@ def check():
|
|
38
38
|
for id_ in e.validation_errors:
|
39
39
|
error = e.validation_errors[id_]
|
40
40
|
parts.append("")
|
41
|
-
parts.append(f"[bold]Plugin:[/] {id_}")
|
41
|
+
parts.append(f"[bold on bright_magenta] Plugin: [/] {id_}")
|
42
|
+
parts.append("")
|
42
43
|
|
43
44
|
errors: list[RenderableType] = []
|
44
45
|
|
@@ -46,7 +47,8 @@ def check():
|
|
46
47
|
location = " -> ".join(map(str, error["loc"]))
|
47
48
|
message = error["msg"]
|
48
49
|
|
49
|
-
errors.append(f"[bold blue]{location}[/]: {message}")
|
50
|
+
errors.append(f"[bold on blue] {location} [/]: {message}")
|
51
|
+
errors.append("")
|
50
52
|
|
51
53
|
parts.append(Padding(Group(*errors), (0, 2)))
|
52
54
|
|
@@ -82,8 +84,8 @@ def check():
|
|
82
84
|
|
83
85
|
|
84
86
|
@app.command()
|
85
|
-
def build():
|
86
|
-
autopub =
|
87
|
+
def build(context: AutoPubCLI):
|
88
|
+
autopub = context.obj
|
87
89
|
|
88
90
|
try:
|
89
91
|
autopub.build()
|
@@ -96,8 +98,8 @@ def build():
|
|
96
98
|
|
97
99
|
|
98
100
|
@app.command()
|
99
|
-
def prepare():
|
100
|
-
autopub =
|
101
|
+
def prepare(context: AutoPubCLI):
|
102
|
+
autopub = context.obj
|
101
103
|
|
102
104
|
try:
|
103
105
|
autopub.prepare()
|
@@ -111,12 +113,13 @@ def prepare():
|
|
111
113
|
|
112
114
|
@app.command()
|
113
115
|
def publish(
|
116
|
+
context: AutoPubCLI,
|
114
117
|
repository: Annotated[
|
115
118
|
Optional[str],
|
116
119
|
typer.Option("--repository", "-r", help="Repository to publish to"),
|
117
120
|
] = None,
|
118
121
|
):
|
119
|
-
autopub =
|
122
|
+
autopub = context.obj
|
120
123
|
|
121
124
|
try:
|
122
125
|
autopub.publish(repository=repository)
|
@@ -130,28 +133,20 @@ def publish(
|
|
130
133
|
|
131
134
|
@app.callback(invoke_without_command=True)
|
132
135
|
def main(
|
133
|
-
|
134
|
-
[],
|
135
|
-
"--plugin",
|
136
|
-
"-p",
|
137
|
-
help="List of plugins to use",
|
138
|
-
),
|
136
|
+
context: AutoPubCLI,
|
139
137
|
should_show_version: Annotated[
|
140
138
|
Optional[bool], typer.Option("--version", is_eager=True)
|
141
139
|
] = None,
|
142
140
|
):
|
143
|
-
state["plugins"] = plugins
|
144
|
-
state["plugins"].extend(
|
145
|
-
[
|
146
|
-
"git",
|
147
|
-
"update_changelog",
|
148
|
-
"bump_version",
|
149
|
-
]
|
150
|
-
)
|
151
|
-
|
152
141
|
if should_show_version:
|
153
142
|
from importlib.metadata import version
|
154
143
|
|
155
144
|
print(version("autopub"))
|
156
145
|
|
157
146
|
raise typer.Exit()
|
147
|
+
|
148
|
+
autopub = Autopub()
|
149
|
+
# default plugins we always want to load (?)
|
150
|
+
autopub.load_plugins(["git", "update_changelog", "bump_version"])
|
151
|
+
|
152
|
+
context.obj = autopub
|
@@ -60,7 +60,7 @@ def _find_plugin(plugin: str) -> type[AutopubPlugin] | None:
|
|
60
60
|
return None
|
61
61
|
|
62
62
|
|
63
|
-
def
|
63
|
+
def load_plugins(names: list[str]) -> list[type[AutopubPlugin]]:
|
64
64
|
sys.path.append(os.getcwd())
|
65
65
|
|
66
66
|
plugins: list[type] = []
|
autopub/plugins/uv.py
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
from typing import Any
|
4
|
+
|
5
|
+
from autopub.plugins import AutopubPackageManagerPlugin, AutopubPlugin
|
6
|
+
|
7
|
+
|
8
|
+
class UvPlugin(AutopubPlugin, AutopubPackageManagerPlugin):
|
9
|
+
def build(self) -> None:
|
10
|
+
self.run_command(["uv", "build"])
|
11
|
+
|
12
|
+
def publish(self, repository: str | None = None, **kwargs: Any) -> None:
|
13
|
+
additional_args: list[str] = []
|
14
|
+
|
15
|
+
if repository:
|
16
|
+
raise ValueError("Not yet implemented")
|
17
|
+
|
18
|
+
if publish_url := kwargs.get("publish_url"):
|
19
|
+
additional_args.append("--publish-url")
|
20
|
+
additional_args.append(publish_url)
|
21
|
+
|
22
|
+
if username := kwargs.get("username"):
|
23
|
+
additional_args.append("--username")
|
24
|
+
additional_args.append(username)
|
25
|
+
|
26
|
+
if password := kwargs.get("password"):
|
27
|
+
additional_args.append("--password")
|
28
|
+
additional_args.append(password)
|
29
|
+
|
30
|
+
if token := kwargs.get("token"):
|
31
|
+
additional_args.append("--token")
|
32
|
+
additional_args.append(token)
|
33
|
+
|
34
|
+
self.run_command(["uv", "publish", *additional_args])
|
@@ -0,0 +1,21 @@
|
|
1
|
+
Metadata-Version: 2.1
|
2
|
+
Name: autopub
|
3
|
+
Version: 1.0.0a21
|
4
|
+
Summary: Automatic package release upon pull request merge
|
5
|
+
Home-page: https://github.com/autopub/autopub
|
6
|
+
Author: Justin Mayer
|
7
|
+
Author-email: entroP@gmail.com
|
8
|
+
Requires-Python: >=3.9.0,<4.0
|
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
|
+
Provides-Extra: github
|
16
|
+
Requires-Dist: dunamai (>=1.23.0,<2.0.0)
|
17
|
+
Requires-Dist: pydantic (>=2.10.5,<3.0.0)
|
18
|
+
Requires-Dist: python-frontmatter (>=1.1.0,<2.0.0)
|
19
|
+
Requires-Dist: tomlkit (>=0.13.2,<0.14.0)
|
20
|
+
Project-URL: Issue Tracker, https://github.com/autopub/autopub/issues
|
21
|
+
Project-URL: Repository, https://github.com/autopub/autopub
|
@@ -1,17 +1,18 @@
|
|
1
|
-
autopub/__init__.py,sha256=
|
2
|
-
autopub/cli/__init__.py,sha256=
|
3
|
-
autopub/cli/plugins.py,sha256=mEAsY2_OSsc-56ZH_x6pcP4mrTKBbyhze3uVPY39Ntk,1813
|
1
|
+
autopub/__init__.py,sha256=7u8F9STpmbbuMyfFx7piaICsAAQ4hd9z4Qjqq78wkfE,7057
|
2
|
+
autopub/cli/__init__.py,sha256=GZ1YNC0UDZqdMfQyNMD4D_D2ItTLcaiJLhPtsLwpH4s,3860
|
4
3
|
autopub/exceptions.py,sha256=gNUbiG3_fVmNjhk2kyueQHPSifNgQf0Bl6IDNvkVhxQ,1534
|
4
|
+
autopub/plugin_loader.py,sha256=i8nz0cmu5eaSRJ2Hx5KxbA-tOMR2mjcz8fdRg4zkGLE,1813
|
5
5
|
autopub/plugins/__init__.py,sha256=57ewn1lhZYKKuVL49l3cgqAN9LQfCRzdsgSZimIAkls,2030
|
6
6
|
autopub/plugins/bump_version.py,sha256=Z6UKEJKdZVn6kACN4nQTJ3253kwAnSm1HpOxq1zHWpw,1413
|
7
7
|
autopub/plugins/git.py,sha256=GeXcvlDEDOVb0cerebkfz8YruK7JYK6IyV872hBIqis,856
|
8
8
|
autopub/plugins/pdm.py,sha256=Pczye06fKg8_HMJDkEfMXQyvao9rZ7sqzTHFd6lLEpU,532
|
9
9
|
autopub/plugins/poetry.py,sha256=d2LvW9RI7ZB3reBOXbcp1mqWmzQ06Uyg_T-MxTvlSBg,517
|
10
10
|
autopub/plugins/update_changelog.py,sha256=g_6flOP5wocZbjOaYSayWxobL3ld8f0wT78nFtAIkFc,1586
|
11
|
+
autopub/plugins/uv.py,sha256=goo8QxaD3FVJ1c3xOSmN1hikZTCUXN8jWNac1S5uDDY,1089
|
11
12
|
autopub/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
12
13
|
autopub/types.py,sha256=gY1WR93XZVFS7vf5JMSmL_h5z7zO51-rtmZ6MYsh3so,1043
|
13
|
-
autopub-1.0.
|
14
|
-
autopub-1.0.
|
15
|
-
autopub-1.0.
|
16
|
-
autopub-1.0.
|
17
|
-
autopub-1.0.
|
14
|
+
autopub-1.0.0a21.dist-info/LICENSE,sha256=hIahDEOTzuHCU5J2nd07LWwkLW7Hko4UFO__ffsvB-8,34523
|
15
|
+
autopub-1.0.0a21.dist-info/METADATA,sha256=1o1828nJpXm7QGldNkEd8a3HyKWKxClzHmjhhFy5YZw,872
|
16
|
+
autopub-1.0.0a21.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
|
17
|
+
autopub-1.0.0a21.dist-info/entry_points.txt,sha256=oeTav5NgCxif6mcZ_HeVGgGv5LzS4DwdI01nr4bO1IM,43
|
18
|
+
autopub-1.0.0a21.dist-info/RECORD,,
|
@@ -1,94 +0,0 @@
|
|
1
|
-
Metadata-Version: 2.1
|
2
|
-
Name: autopub
|
3
|
-
Version: 1.0.0a19
|
4
|
-
Summary: Automatic package release upon pull request merge
|
5
|
-
Home-page: https://github.com/autopub/autopub
|
6
|
-
License: AGPL-3.0
|
7
|
-
Keywords: automatic,packaging,publish,release,version
|
8
|
-
Author: Justin Mayer
|
9
|
-
Author-email: entroP@gmail.com
|
10
|
-
Requires-Python: >=3.8,<4.0
|
11
|
-
Classifier: Development Status :: 4 - Beta
|
12
|
-
Classifier: Environment :: Console
|
13
|
-
Classifier: Intended Audience :: Developers
|
14
|
-
Classifier: License :: OSI Approved :: GNU Affero General Public License v3
|
15
|
-
Classifier: Operating System :: OS Independent
|
16
|
-
Classifier: Programming Language :: Python :: 3
|
17
|
-
Classifier: Programming Language :: Python :: 3.8
|
18
|
-
Classifier: Programming Language :: Python :: 3.9
|
19
|
-
Classifier: Programming Language :: Python :: 3.10
|
20
|
-
Classifier: Programming Language :: Python :: 3.11
|
21
|
-
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
22
|
-
Classifier: Topic :: System :: Software Distribution
|
23
|
-
Classifier: Topic :: System :: Systems Administration
|
24
|
-
Provides-Extra: github
|
25
|
-
Requires-Dist: build (>=0.10.0,<0.11.0)
|
26
|
-
Requires-Dist: dunamai (>=1.17.0,<2.0.0)
|
27
|
-
Requires-Dist: githubrelease (>=1.5.9,<2.0.0) ; extra == "github"
|
28
|
-
Requires-Dist: httpx (==0.16.1) ; extra == "github"
|
29
|
-
Requires-Dist: pydantic (>=2)
|
30
|
-
Requires-Dist: python-frontmatter (>=1.0.0,<2.0.0)
|
31
|
-
Requires-Dist: rich (>=12.5.1,<13.0.0)
|
32
|
-
Requires-Dist: time-machine (>=2.13.0,<3.0.0)
|
33
|
-
Requires-Dist: tomlkit (>=0.5,<2.0)
|
34
|
-
Requires-Dist: twine (>=4.0.2,<5.0.0)
|
35
|
-
Requires-Dist: typer (>=0.9.0,<0.10.0)
|
36
|
-
Project-URL: Issue Tracker, https://github.com/autopub/autopub/issues
|
37
|
-
Project-URL: Repository, https://github.com/autopub/autopub
|
38
|
-
Description-Content-Type: text/markdown
|
39
|
-
|
40
|
-
# AutoPub
|
41
|
-
|
42
|
-
[](https://circleci.com/gh/autopub/autopub) [](https://pypi.org/project/autopub/)
|
43
|
-
|
44
|
-
AutoPub enables project maintainers to release new package versions to PyPI by merging pull requests.
|
45
|
-
|
46
|
-
## Environment
|
47
|
-
|
48
|
-
AutoPub is intended for use with continuous integration (CI) systems such as [GitHub Actions][], [CircleCI][], or [Travis CI][]. Projects used with AutoPub are built via [build][] and published via [Twine][]. Contributions that add support for other CI and build systems are welcome.
|
49
|
-
|
50
|
-
## Configuration
|
51
|
-
|
52
|
-
AutoPub settings can be configured via the `[tool.autopub]` table in the target project’s `pyproject.toml` file. Required settings include Git username and email address:
|
53
|
-
|
54
|
-
```toml
|
55
|
-
[tool.autopub]
|
56
|
-
git-username = "Your Name"
|
57
|
-
git-email = "your_email@example.com"
|
58
|
-
```
|
59
|
-
|
60
|
-
## Release Files
|
61
|
-
|
62
|
-
Contributors should include a `RELEASE.md` file in their pull requests with two bits of information:
|
63
|
-
|
64
|
-
* Release type: major, minor, or patch
|
65
|
-
* Description of the changes, to be used as the changelog entry
|
66
|
-
|
67
|
-
Example:
|
68
|
-
|
69
|
-
Release type: patch
|
70
|
-
|
71
|
-
Add function to update version strings in multiple files.
|
72
|
-
|
73
|
-
## Usage
|
74
|
-
|
75
|
-
The following `autopub` sub-commands can be used as steps in your CI flows:
|
76
|
-
|
77
|
-
* `autopub check`: Check whether release file exists.
|
78
|
-
* `autopub prepare`: Update version strings and add entry to changelog.
|
79
|
-
* `autopub build`: Build the project.
|
80
|
-
* `autopub commit`: Add, commit, and push incremented version and changelog changes.
|
81
|
-
* `autopub githubrelease`: Create a new release on GitHub.
|
82
|
-
* `autopub publish`: Publish a new release.
|
83
|
-
|
84
|
-
For systems such as Travis CI in which only one deployment step is permitted, there is a single command that runs the above steps in sequence:
|
85
|
-
|
86
|
-
* `autopub deploy`: Run `prepare`, `build`, `commit`, `githubrelease`, and `publish` in one invocation.
|
87
|
-
|
88
|
-
|
89
|
-
[GitHub Actions]: https://github.com/features/actions
|
90
|
-
[CircleCI]: https://circleci.com
|
91
|
-
[Travis CI]: https://travis-ci.org
|
92
|
-
[build]: https://pypa-build.readthedocs.io
|
93
|
-
[Twine]: https://twine.readthedocs.io/
|
94
|
-
|
File without changes
|
File without changes
|