relm 3.0.1__tar.gz → 3.0.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- relm-3.0.2/PKG-INFO +240 -0
- relm-3.0.2/README.md +204 -0
- {relm-3.0.1 → relm-3.0.2}/pyproject.toml +1 -1
- {relm-3.0.1 → relm-3.0.2}/src/relm/__init__.py +1 -1
- relm-3.0.2/src/relm.egg-info/PKG-INFO +240 -0
- {relm-3.0.1 → relm-3.0.2}/tests/test_core.py +1 -1
- {relm-3.0.1 → relm-3.0.2}/tests/test_custom_commit_message.py +1 -1
- {relm-3.0.1 → relm-3.0.2}/tests/test_main.py +21 -21
- {relm-3.0.1 → relm-3.0.2}/tests/test_release.py +11 -11
- {relm-3.0.1 → relm-3.0.2}/tests/test_verify.py +1 -1
- {relm-3.0.1 → relm-3.0.2}/tests/test_verify_command.py +1 -1
- relm-3.0.1/PKG-INFO +0 -245
- relm-3.0.1/README.md +0 -209
- relm-3.0.1/src/relm.egg-info/PKG-INFO +0 -245
- {relm-3.0.1 → relm-3.0.2}/setup.cfg +0 -0
- {relm-3.0.1 → relm-3.0.2}/src/relm/banner.py +0 -0
- {relm-3.0.1 → relm-3.0.2}/src/relm/changelog.py +0 -0
- {relm-3.0.1 → relm-3.0.2}/src/relm/clean.py +0 -0
- {relm-3.0.1 → relm-3.0.2}/src/relm/commands/__init__.py +0 -0
- {relm-3.0.1 → relm-3.0.2}/src/relm/commands/base.py +0 -0
- {relm-3.0.1 → relm-3.0.2}/src/relm/commands/clean_command.py +0 -0
- {relm-3.0.1 → relm-3.0.2}/src/relm/commands/create_command.py +0 -0
- {relm-3.0.1 → relm-3.0.2}/src/relm/commands/gc_command.py +0 -0
- {relm-3.0.1 → relm-3.0.2}/src/relm/commands/install_command.py +0 -0
- {relm-3.0.1 → relm-3.0.2}/src/relm/commands/list_command.py +0 -0
- {relm-3.0.1 → relm-3.0.2}/src/relm/commands/release_command.py +0 -0
- {relm-3.0.1 → relm-3.0.2}/src/relm/commands/run_command.py +0 -0
- {relm-3.0.1 → relm-3.0.2}/src/relm/commands/status_command.py +0 -0
- {relm-3.0.1 → relm-3.0.2}/src/relm/commands/verify_command.py +0 -0
- {relm-3.0.1 → relm-3.0.2}/src/relm/config.py +0 -0
- {relm-3.0.1 → relm-3.0.2}/src/relm/core.py +0 -0
- {relm-3.0.1 → relm-3.0.2}/src/relm/gc.py +0 -0
- {relm-3.0.1 → relm-3.0.2}/src/relm/git_ops.py +0 -0
- {relm-3.0.1 → relm-3.0.2}/src/relm/install.py +0 -0
- {relm-3.0.1 → relm-3.0.2}/src/relm/main.py +0 -0
- {relm-3.0.1 → relm-3.0.2}/src/relm/release.py +0 -0
- {relm-3.0.1 → relm-3.0.2}/src/relm/runner.py +0 -0
- {relm-3.0.1 → relm-3.0.2}/src/relm/verify.py +0 -0
- {relm-3.0.1 → relm-3.0.2}/src/relm/versioning.py +0 -0
- {relm-3.0.1 → relm-3.0.2}/src/relm.egg-info/SOURCES.txt +0 -0
- {relm-3.0.1 → relm-3.0.2}/src/relm.egg-info/dependency_links.txt +0 -0
- {relm-3.0.1 → relm-3.0.2}/src/relm.egg-info/entry_points.txt +0 -0
- {relm-3.0.1 → relm-3.0.2}/src/relm.egg-info/requires.txt +0 -0
- {relm-3.0.1 → relm-3.0.2}/src/relm.egg-info/top_level.txt +0 -0
- {relm-3.0.1 → relm-3.0.2}/tests/test_banner.py +0 -0
- {relm-3.0.1 → relm-3.0.2}/tests/test_changed_since.py +0 -0
- {relm-3.0.1 → relm-3.0.2}/tests/test_changelog.py +0 -0
- {relm-3.0.1 → relm-3.0.2}/tests/test_clean.py +0 -0
- {relm-3.0.1 → relm-3.0.2}/tests/test_config.py +0 -0
- {relm-3.0.1 → relm-3.0.2}/tests/test_create_command.py +0 -0
- {relm-3.0.1 → relm-3.0.2}/tests/test_dependency_sorting.py +0 -0
- {relm-3.0.1 → relm-3.0.2}/tests/test_execution_order.py +0 -0
- {relm-3.0.1 → relm-3.0.2}/tests/test_gc.py +0 -0
- {relm-3.0.1 → relm-3.0.2}/tests/test_git_ops.py +0 -0
- {relm-3.0.1 → relm-3.0.2}/tests/test_install.py +0 -0
- {relm-3.0.1 → relm-3.0.2}/tests/test_runner.py +0 -0
- {relm-3.0.1 → relm-3.0.2}/tests/test_versioning.py +0 -0
relm-3.0.2/PKG-INFO
ADDED
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: relm
|
|
3
|
+
Version: 3.0.2
|
|
4
|
+
Summary: A unified CLI tool to manage versioning, git, and PyPI releases for multiple projects.
|
|
5
|
+
Author-email: dhruv13x <dhruv13x@gmail.com>
|
|
6
|
+
License: MIT © dhruv13x
|
|
7
|
+
Project-URL: Homepage, https://github.com/dhruv13x/relm
|
|
8
|
+
Project-URL: Source, https://github.com/dhruv13x/relm
|
|
9
|
+
Project-URL: Issues, https://github.com/dhruv13x/relm/issues
|
|
10
|
+
Keywords: cli,release,versioning,automation,pypi,git
|
|
11
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
12
|
+
Classifier: Programming Language :: Python :: 3
|
|
13
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
14
|
+
Classifier: Environment :: Console
|
|
15
|
+
Classifier: Topic :: Software Development :: Build Tools
|
|
16
|
+
Requires-Python: >=3.8
|
|
17
|
+
Description-Content-Type: text/markdown
|
|
18
|
+
Requires-Dist: tomli; python_version < "3.11"
|
|
19
|
+
Requires-Dist: rich>=13.0.0
|
|
20
|
+
Requires-Dist: rich-argparse>=1.0.0
|
|
21
|
+
Requires-Dist: build>=1.0.0
|
|
22
|
+
Requires-Dist: twine>=4.0.0
|
|
23
|
+
Provides-Extra: dev
|
|
24
|
+
Requires-Dist: pytest>=8.0.0; extra == "dev"
|
|
25
|
+
Requires-Dist: pytest-cov>=5.0.0; extra == "dev"
|
|
26
|
+
Requires-Dist: pytest-timeout>=2.2.0; extra == "dev"
|
|
27
|
+
Requires-Dist: pytest-json-report>=1.5.0; extra == "dev"
|
|
28
|
+
Requires-Dist: pytest-asyncio>=0.23.0; extra == "dev"
|
|
29
|
+
Requires-Dist: pytest-mock>=3.10.0; extra == "dev"
|
|
30
|
+
Requires-Dist: pyfakefs>=5.0.0; extra == "dev"
|
|
31
|
+
Requires-Dist: ruff>=0.6.0; extra == "dev"
|
|
32
|
+
Requires-Dist: black>=24.3.0; extra == "dev"
|
|
33
|
+
Requires-Dist: mypy>=1.11.0; extra == "dev"
|
|
34
|
+
Requires-Dist: PyYAML>=6.0; extra == "dev"
|
|
35
|
+
Requires-Dist: types-PyYAML>=6.0; extra == "dev"
|
|
36
|
+
|
|
37
|
+
<div align="center">
|
|
38
|
+
<img src="https://raw.githubusercontent.com/dhruv13x/relm/main/relm_logo.png" alt="relm logo" width="200"/>
|
|
39
|
+
</div>
|
|
40
|
+
|
|
41
|
+
<div align="center">
|
|
42
|
+
|
|
43
|
+
<!-- Package Info -->
|
|
44
|
+
[](https://pypi.org/project/relm/)
|
|
45
|
+
[](https://www.python.org/)
|
|
46
|
+

|
|
47
|
+
[](https://pypi.org/project/relm/)
|
|
48
|
+
|
|
49
|
+
<!-- Build & Quality -->
|
|
50
|
+
[](https://github.com/dhruv13x/relm/actions/workflows/publish.yml)
|
|
51
|
+
[](https://codecov.io/gh/dhruv13x/relm)
|
|
52
|
+
[](https://github.com/dhruv13x/relm/actions/workflows/test.yml)
|
|
53
|
+
[](https://github.com/psf/black)
|
|
54
|
+
[](https://github.com/astral-sh/ruff)
|
|
55
|
+
|
|
56
|
+
<!-- Usage -->
|
|
57
|
+

|
|
58
|
+
[](https://opensource.org/licenses/MIT)
|
|
59
|
+
|
|
60
|
+
</div>
|
|
61
|
+
|
|
62
|
+
# relm
|
|
63
|
+
|
|
64
|
+
**The Monorepo Manager for Python.** "Batteries Included" CLI for managing your Python mono-repo or multi-project workspace. Automate versioning, git tagging, PyPI releases, and local environment setup with a single tool.
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## ⚡ Quick Start (The "5-Minute Rule")
|
|
69
|
+
|
|
70
|
+
### Prerequisites
|
|
71
|
+
* **Python 3.8+**
|
|
72
|
+
* **Docker** (Optional, for containerized workflows)
|
|
73
|
+
* **Git** (Required for version control operations)
|
|
74
|
+
|
|
75
|
+
### Installation
|
|
76
|
+
Install globally with `pipx` (recommended) or `pip`:
|
|
77
|
+
```bash
|
|
78
|
+
# Recommended
|
|
79
|
+
pipx install relm
|
|
80
|
+
|
|
81
|
+
# Alternative
|
|
82
|
+
pip install relm
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### Run
|
|
86
|
+
Start managing your workspace instantly:
|
|
87
|
+
```bash
|
|
88
|
+
# Discover projects in the current directory
|
|
89
|
+
relm list
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### Demo
|
|
93
|
+
Copy-paste this snippet to see `relm` in action (assumes you have a Python project structure):
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
# 1. List all projects and their current versions
|
|
97
|
+
relm list
|
|
98
|
+
|
|
99
|
+
# 2. Check git status across the entire workspace
|
|
100
|
+
relm status all
|
|
101
|
+
|
|
102
|
+
# 3. Install all projects in editable mode
|
|
103
|
+
relm install all
|
|
104
|
+
|
|
105
|
+
# 4. Run tests across all projects (stops on first failure)
|
|
106
|
+
relm run "pytest" all --fail-fast
|
|
107
|
+
|
|
108
|
+
# 5. Release a patch version for a specific library
|
|
109
|
+
relm release my-library patch
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## ✨ Features (The "Why")
|
|
115
|
+
|
|
116
|
+
### Core
|
|
117
|
+
* **Automated Discovery**: Recursively scans and identifies Python projects (`pyproject.toml`) in your workspace.
|
|
118
|
+
* **Smart Versioning**: Semantically bumps versions (`major`, `minor`, `patch`, `alpha`, `beta`, `rc`) and updates files automatically.
|
|
119
|
+
* **Zero-Config Git Ops**: Auto-stages, commits, tags, and pushes releases with standardized messages.
|
|
120
|
+
|
|
121
|
+
### Performance & Workflow
|
|
122
|
+
* **Bulk Operations**: **Install, Test, or Release ALL projects** with a single command.
|
|
123
|
+
* **Dependency Awareness**: **Topologically sorts projects** to ensure correct build order (build `lib-a` before `app-b`).
|
|
124
|
+
* **"Changed Since" Detection**: Filter operations to only target projects modified since a specific git reference (`--since`).
|
|
125
|
+
* **Workspace Cleaning**: Instantly wipe `dist/`, `build/`, and `__pycache__` artifacts with `relm clean`.
|
|
126
|
+
|
|
127
|
+
### Automation & Security
|
|
128
|
+
* **Automated Changelog**: **Parses Conventional Commits** to auto-generate `CHANGELOG.md`.
|
|
129
|
+
* **PyPI Publishing**: seamless build and upload workflow.
|
|
130
|
+
* **PyPI Verification**: Verify local tags match PyPI releases with `relm verify`.
|
|
131
|
+
* **Safety Checks**: Prevents accidental execution in system roots.
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## 🛠️ Configuration (The "How")
|
|
136
|
+
|
|
137
|
+
`relm` is configured via a `.relm.toml` file in your workspace root and CLI arguments.
|
|
138
|
+
|
|
139
|
+
### Environment Variables
|
|
140
|
+
`relm` primarily uses `.relm.toml` for configuration, but respects standard tool variables:
|
|
141
|
+
|
|
142
|
+
| Name | Description | Default | Required |
|
|
143
|
+
| :--- | :--- | :--- | :--- |
|
|
144
|
+
| `TWINE_USERNAME` | Username for PyPI upload (used by internal tools) | None | For Release |
|
|
145
|
+
| `TWINE_PASSWORD` | Password/Token for PyPI upload | None | For Release |
|
|
146
|
+
|
|
147
|
+
### CLI Arguments
|
|
148
|
+
|
|
149
|
+
**Global Options**
|
|
150
|
+
| Flag | Description |
|
|
151
|
+
| :--- | :--- |
|
|
152
|
+
| `--path` | Root directory to scan for projects (default: `.`) |
|
|
153
|
+
|
|
154
|
+
**Commands**
|
|
155
|
+
| Command | Arguments | Description |
|
|
156
|
+
| :--- | :--- | :--- |
|
|
157
|
+
| `list` | `--since <ref>` | List projects (optionally filtered by changes since git ref). |
|
|
158
|
+
| `status` | `project_name` | Show git branch and dirty status. |
|
|
159
|
+
| `install` | `project_name`, `--no-editable` | Install projects (default: editable). |
|
|
160
|
+
| `run` | `command`, `project_name`, `--fail-fast` | Execute shell command in project directories. |
|
|
161
|
+
| `release` | `project`, `type`, `-y`, `-m` | Bump version, tag, and publish. Type: `major`, `minor`, `patch`, etc. |
|
|
162
|
+
| `clean` | `project_name` | Remove build artifacts. |
|
|
163
|
+
| `create` | `name`, `path` | Scaffold a new project. |
|
|
164
|
+
| `verify` | `project_name` | Verify PyPI release availability. |
|
|
165
|
+
| `gc` | N/A | Run `git gc` on all projects. |
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
## 🏗️ Architecture
|
|
170
|
+
|
|
171
|
+
`relm` uses a modular architecture designed for maintainability and separation of concerns.
|
|
172
|
+
|
|
173
|
+
### Directory Tree
|
|
174
|
+
```text
|
|
175
|
+
src/relm/
|
|
176
|
+
├── commands/ # 🔌 Pluggable Command Modules
|
|
177
|
+
│ ├── list_command.py
|
|
178
|
+
│ ├── release_command.py
|
|
179
|
+
│ └── ...
|
|
180
|
+
├── core.py # 🧠 Project Model & Dependency Graph
|
|
181
|
+
├── config.py # ⚙️ Configuration Loader (.relm.toml)
|
|
182
|
+
├── git_ops.py # 🐙 Git Wrapper
|
|
183
|
+
├── release.py # 🚀 Release Workflow Engine
|
|
184
|
+
├── versioning.py # 🏷️ SemVer Logic
|
|
185
|
+
├── changelog.py # 📝 Changelog Generator
|
|
186
|
+
├── main.py # 🏁 CLI Entry Point
|
|
187
|
+
└── banner.py # 🎨 ASCII Art
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
### Data Flow
|
|
191
|
+
1. **Discovery**: `main.py` bootstraps and calls `core.py` to recursively find `pyproject.toml` files.
|
|
192
|
+
2. **Graph Construction**: Projects are parsed into `Project` objects; dependencies are mapped.
|
|
193
|
+
3. **Topological Sort**: For bulk operations (`install`, `run`), projects are ordered so dependencies are processed first.
|
|
194
|
+
4. **Execution**: The appropriate `command` module is invoked, orchestrating `git_ops`, `subprocess` calls, or file manipulations.
|
|
195
|
+
|
|
196
|
+
---
|
|
197
|
+
|
|
198
|
+
## 🐞 Troubleshooting
|
|
199
|
+
|
|
200
|
+
### Common Issues
|
|
201
|
+
| Error Message | Possible Cause | Solution |
|
|
202
|
+
| :--- | :--- | :--- |
|
|
203
|
+
| `Project 'xyz' not found` | The project is not in the scan path. | Ensure `--path` is correct and `pyproject.toml` exists. |
|
|
204
|
+
| `Git repository is not clean` | Uncommitted changes exist. | Commit or stash changes before releasing. |
|
|
205
|
+
| `Circular dependency detected` | Projects depend on each other. | Refactor dependencies to be acyclic. |
|
|
206
|
+
| `Running in system root` | Executing from `/` or similar. | Navigate to your workspace folder or use `--path`. |
|
|
207
|
+
|
|
208
|
+
### Debug Mode
|
|
209
|
+
`relm` uses `rich` for output. While there is no dedicated `--debug` flag, exceptions are printed with tracebacks on failure.
|
|
210
|
+
Check `pyproject.toml` for `log_cli = true` to enable verbose logging during test runs (`relm run "pytest"`).
|
|
211
|
+
|
|
212
|
+
---
|
|
213
|
+
|
|
214
|
+
## 🤝 Contributing
|
|
215
|
+
|
|
216
|
+
We welcome contributions! Please see [CONTRIBUTING.md](CONTRIBUTING.md) for details.
|
|
217
|
+
|
|
218
|
+
### Dev Setup
|
|
219
|
+
1. Clone the repo.
|
|
220
|
+
2. Install dependencies: `pip install .[dev]`.
|
|
221
|
+
3. Run tests: `pytest`.
|
|
222
|
+
4. Linting: `ruff check .` and `black .`.
|
|
223
|
+
|
|
224
|
+
---
|
|
225
|
+
|
|
226
|
+
## 🗺️ Roadmap
|
|
227
|
+
|
|
228
|
+
See [ROADMAP.md](ROADMAP.md) for the full vision.
|
|
229
|
+
|
|
230
|
+
* [x] Bulk Release Support
|
|
231
|
+
* [x] Task Runner (`relm run`)
|
|
232
|
+
* [x] Project Status (`relm status`)
|
|
233
|
+
* [x] Pre-release Version Support (`alpha`, `beta`, `rc`)
|
|
234
|
+
* [x] Automated Changelog Generation
|
|
235
|
+
* [x] Configuration File Support (`.relm.toml`)
|
|
236
|
+
* [x] Dependency Graph Awareness
|
|
237
|
+
* [ ] Parallel execution for `run` and `install`
|
|
238
|
+
* [ ] Interactive mode for project selection
|
|
239
|
+
* [ ] Docker container support
|
|
240
|
+
* [ ] CI/CD Integration templates
|
relm-3.0.2/README.md
ADDED
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
<img src="https://raw.githubusercontent.com/dhruv13x/relm/main/relm_logo.png" alt="relm logo" width="200"/>
|
|
3
|
+
</div>
|
|
4
|
+
|
|
5
|
+
<div align="center">
|
|
6
|
+
|
|
7
|
+
<!-- Package Info -->
|
|
8
|
+
[](https://pypi.org/project/relm/)
|
|
9
|
+
[](https://www.python.org/)
|
|
10
|
+

|
|
11
|
+
[](https://pypi.org/project/relm/)
|
|
12
|
+
|
|
13
|
+
<!-- Build & Quality -->
|
|
14
|
+
[](https://github.com/dhruv13x/relm/actions/workflows/publish.yml)
|
|
15
|
+
[](https://codecov.io/gh/dhruv13x/relm)
|
|
16
|
+
[](https://github.com/dhruv13x/relm/actions/workflows/test.yml)
|
|
17
|
+
[](https://github.com/psf/black)
|
|
18
|
+
[](https://github.com/astral-sh/ruff)
|
|
19
|
+
|
|
20
|
+
<!-- Usage -->
|
|
21
|
+

|
|
22
|
+
[](https://opensource.org/licenses/MIT)
|
|
23
|
+
|
|
24
|
+
</div>
|
|
25
|
+
|
|
26
|
+
# relm
|
|
27
|
+
|
|
28
|
+
**The Monorepo Manager for Python.** "Batteries Included" CLI for managing your Python mono-repo or multi-project workspace. Automate versioning, git tagging, PyPI releases, and local environment setup with a single tool.
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## ⚡ Quick Start (The "5-Minute Rule")
|
|
33
|
+
|
|
34
|
+
### Prerequisites
|
|
35
|
+
* **Python 3.8+**
|
|
36
|
+
* **Docker** (Optional, for containerized workflows)
|
|
37
|
+
* **Git** (Required for version control operations)
|
|
38
|
+
|
|
39
|
+
### Installation
|
|
40
|
+
Install globally with `pipx` (recommended) or `pip`:
|
|
41
|
+
```bash
|
|
42
|
+
# Recommended
|
|
43
|
+
pipx install relm
|
|
44
|
+
|
|
45
|
+
# Alternative
|
|
46
|
+
pip install relm
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### Run
|
|
50
|
+
Start managing your workspace instantly:
|
|
51
|
+
```bash
|
|
52
|
+
# Discover projects in the current directory
|
|
53
|
+
relm list
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### Demo
|
|
57
|
+
Copy-paste this snippet to see `relm` in action (assumes you have a Python project structure):
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
# 1. List all projects and their current versions
|
|
61
|
+
relm list
|
|
62
|
+
|
|
63
|
+
# 2. Check git status across the entire workspace
|
|
64
|
+
relm status all
|
|
65
|
+
|
|
66
|
+
# 3. Install all projects in editable mode
|
|
67
|
+
relm install all
|
|
68
|
+
|
|
69
|
+
# 4. Run tests across all projects (stops on first failure)
|
|
70
|
+
relm run "pytest" all --fail-fast
|
|
71
|
+
|
|
72
|
+
# 5. Release a patch version for a specific library
|
|
73
|
+
relm release my-library patch
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## ✨ Features (The "Why")
|
|
79
|
+
|
|
80
|
+
### Core
|
|
81
|
+
* **Automated Discovery**: Recursively scans and identifies Python projects (`pyproject.toml`) in your workspace.
|
|
82
|
+
* **Smart Versioning**: Semantically bumps versions (`major`, `minor`, `patch`, `alpha`, `beta`, `rc`) and updates files automatically.
|
|
83
|
+
* **Zero-Config Git Ops**: Auto-stages, commits, tags, and pushes releases with standardized messages.
|
|
84
|
+
|
|
85
|
+
### Performance & Workflow
|
|
86
|
+
* **Bulk Operations**: **Install, Test, or Release ALL projects** with a single command.
|
|
87
|
+
* **Dependency Awareness**: **Topologically sorts projects** to ensure correct build order (build `lib-a` before `app-b`).
|
|
88
|
+
* **"Changed Since" Detection**: Filter operations to only target projects modified since a specific git reference (`--since`).
|
|
89
|
+
* **Workspace Cleaning**: Instantly wipe `dist/`, `build/`, and `__pycache__` artifacts with `relm clean`.
|
|
90
|
+
|
|
91
|
+
### Automation & Security
|
|
92
|
+
* **Automated Changelog**: **Parses Conventional Commits** to auto-generate `CHANGELOG.md`.
|
|
93
|
+
* **PyPI Publishing**: seamless build and upload workflow.
|
|
94
|
+
* **PyPI Verification**: Verify local tags match PyPI releases with `relm verify`.
|
|
95
|
+
* **Safety Checks**: Prevents accidental execution in system roots.
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## 🛠️ Configuration (The "How")
|
|
100
|
+
|
|
101
|
+
`relm` is configured via a `.relm.toml` file in your workspace root and CLI arguments.
|
|
102
|
+
|
|
103
|
+
### Environment Variables
|
|
104
|
+
`relm` primarily uses `.relm.toml` for configuration, but respects standard tool variables:
|
|
105
|
+
|
|
106
|
+
| Name | Description | Default | Required |
|
|
107
|
+
| :--- | :--- | :--- | :--- |
|
|
108
|
+
| `TWINE_USERNAME` | Username for PyPI upload (used by internal tools) | None | For Release |
|
|
109
|
+
| `TWINE_PASSWORD` | Password/Token for PyPI upload | None | For Release |
|
|
110
|
+
|
|
111
|
+
### CLI Arguments
|
|
112
|
+
|
|
113
|
+
**Global Options**
|
|
114
|
+
| Flag | Description |
|
|
115
|
+
| :--- | :--- |
|
|
116
|
+
| `--path` | Root directory to scan for projects (default: `.`) |
|
|
117
|
+
|
|
118
|
+
**Commands**
|
|
119
|
+
| Command | Arguments | Description |
|
|
120
|
+
| :--- | :--- | :--- |
|
|
121
|
+
| `list` | `--since <ref>` | List projects (optionally filtered by changes since git ref). |
|
|
122
|
+
| `status` | `project_name` | Show git branch and dirty status. |
|
|
123
|
+
| `install` | `project_name`, `--no-editable` | Install projects (default: editable). |
|
|
124
|
+
| `run` | `command`, `project_name`, `--fail-fast` | Execute shell command in project directories. |
|
|
125
|
+
| `release` | `project`, `type`, `-y`, `-m` | Bump version, tag, and publish. Type: `major`, `minor`, `patch`, etc. |
|
|
126
|
+
| `clean` | `project_name` | Remove build artifacts. |
|
|
127
|
+
| `create` | `name`, `path` | Scaffold a new project. |
|
|
128
|
+
| `verify` | `project_name` | Verify PyPI release availability. |
|
|
129
|
+
| `gc` | N/A | Run `git gc` on all projects. |
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
## 🏗️ Architecture
|
|
134
|
+
|
|
135
|
+
`relm` uses a modular architecture designed for maintainability and separation of concerns.
|
|
136
|
+
|
|
137
|
+
### Directory Tree
|
|
138
|
+
```text
|
|
139
|
+
src/relm/
|
|
140
|
+
├── commands/ # 🔌 Pluggable Command Modules
|
|
141
|
+
│ ├── list_command.py
|
|
142
|
+
│ ├── release_command.py
|
|
143
|
+
│ └── ...
|
|
144
|
+
├── core.py # 🧠 Project Model & Dependency Graph
|
|
145
|
+
├── config.py # ⚙️ Configuration Loader (.relm.toml)
|
|
146
|
+
├── git_ops.py # 🐙 Git Wrapper
|
|
147
|
+
├── release.py # 🚀 Release Workflow Engine
|
|
148
|
+
├── versioning.py # 🏷️ SemVer Logic
|
|
149
|
+
├── changelog.py # 📝 Changelog Generator
|
|
150
|
+
├── main.py # 🏁 CLI Entry Point
|
|
151
|
+
└── banner.py # 🎨 ASCII Art
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### Data Flow
|
|
155
|
+
1. **Discovery**: `main.py` bootstraps and calls `core.py` to recursively find `pyproject.toml` files.
|
|
156
|
+
2. **Graph Construction**: Projects are parsed into `Project` objects; dependencies are mapped.
|
|
157
|
+
3. **Topological Sort**: For bulk operations (`install`, `run`), projects are ordered so dependencies are processed first.
|
|
158
|
+
4. **Execution**: The appropriate `command` module is invoked, orchestrating `git_ops`, `subprocess` calls, or file manipulations.
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## 🐞 Troubleshooting
|
|
163
|
+
|
|
164
|
+
### Common Issues
|
|
165
|
+
| Error Message | Possible Cause | Solution |
|
|
166
|
+
| :--- | :--- | :--- |
|
|
167
|
+
| `Project 'xyz' not found` | The project is not in the scan path. | Ensure `--path` is correct and `pyproject.toml` exists. |
|
|
168
|
+
| `Git repository is not clean` | Uncommitted changes exist. | Commit or stash changes before releasing. |
|
|
169
|
+
| `Circular dependency detected` | Projects depend on each other. | Refactor dependencies to be acyclic. |
|
|
170
|
+
| `Running in system root` | Executing from `/` or similar. | Navigate to your workspace folder or use `--path`. |
|
|
171
|
+
|
|
172
|
+
### Debug Mode
|
|
173
|
+
`relm` uses `rich` for output. While there is no dedicated `--debug` flag, exceptions are printed with tracebacks on failure.
|
|
174
|
+
Check `pyproject.toml` for `log_cli = true` to enable verbose logging during test runs (`relm run "pytest"`).
|
|
175
|
+
|
|
176
|
+
---
|
|
177
|
+
|
|
178
|
+
## 🤝 Contributing
|
|
179
|
+
|
|
180
|
+
We welcome contributions! Please see [CONTRIBUTING.md](CONTRIBUTING.md) for details.
|
|
181
|
+
|
|
182
|
+
### Dev Setup
|
|
183
|
+
1. Clone the repo.
|
|
184
|
+
2. Install dependencies: `pip install .[dev]`.
|
|
185
|
+
3. Run tests: `pytest`.
|
|
186
|
+
4. Linting: `ruff check .` and `black .`.
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
## 🗺️ Roadmap
|
|
191
|
+
|
|
192
|
+
See [ROADMAP.md](ROADMAP.md) for the full vision.
|
|
193
|
+
|
|
194
|
+
* [x] Bulk Release Support
|
|
195
|
+
* [x] Task Runner (`relm run`)
|
|
196
|
+
* [x] Project Status (`relm status`)
|
|
197
|
+
* [x] Pre-release Version Support (`alpha`, `beta`, `rc`)
|
|
198
|
+
* [x] Automated Changelog Generation
|
|
199
|
+
* [x] Configuration File Support (`.relm.toml`)
|
|
200
|
+
* [x] Dependency Graph Awareness
|
|
201
|
+
* [ ] Parallel execution for `run` and `install`
|
|
202
|
+
* [ ] Interactive mode for project selection
|
|
203
|
+
* [ ] Docker container support
|
|
204
|
+
* [ ] CI/CD Integration templates
|