changes-roller 0.1.0__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.
- changes_roller-0.1.0/.bandit +17 -0
- changes_roller-0.1.0/.claude/settings.local.json +35 -0
- changes_roller-0.1.0/.editorconfig +46 -0
- changes_roller-0.1.0/.gitattributes +56 -0
- changes_roller-0.1.0/.github/ISSUE_TEMPLATE/bug_report.yml +121 -0
- changes_roller-0.1.0/.github/ISSUE_TEMPLATE/config.yml +8 -0
- changes_roller-0.1.0/.github/ISSUE_TEMPLATE/documentation.yml +101 -0
- changes_roller-0.1.0/.github/ISSUE_TEMPLATE/feature_request.yml +112 -0
- changes_roller-0.1.0/.github/PYPI_TRUSTED_PUBLISHER_SETUP.md +200 -0
- changes_roller-0.1.0/.github/dependabot.yml +87 -0
- changes_roller-0.1.0/.github/pull_request_template.md +118 -0
- changes_roller-0.1.0/.github/workflows/README.md +372 -0
- changes_roller-0.1.0/.github/workflows/ci.yml +134 -0
- changes_roller-0.1.0/.github/workflows/release.yml +98 -0
- changes_roller-0.1.0/.github/workflows/security.yml +63 -0
- changes_roller-0.1.0/.gitignore +207 -0
- changes_roller-0.1.0/.pre-commit-config.yaml +89 -0
- changes_roller-0.1.0/.readthedocs.yaml +38 -0
- changes_roller-0.1.0/CHANGELOG.md +44 -0
- changes_roller-0.1.0/CODE_OF_CONDUCT.md +132 -0
- changes_roller-0.1.0/CONTRIBUTING.md +1012 -0
- changes_roller-0.1.0/LICENSE +201 -0
- changes_roller-0.1.0/PKG-INFO +331 -0
- changes_roller-0.1.0/README.md +282 -0
- changes_roller-0.1.0/SECURITY.md +73 -0
- changes_roller-0.1.0/SPECIFICATION.md +441 -0
- changes_roller-0.1.0/USAGE.md +503 -0
- changes_roller-0.1.0/docs/Makefile +33 -0
- changes_roller-0.1.0/docs/changelog.md +1 -0
- changes_roller-0.1.0/docs/code-of-conduct.md +1 -0
- changes_roller-0.1.0/docs/conf.py +157 -0
- changes_roller-0.1.0/docs/configuration.md +327 -0
- changes_roller-0.1.0/docs/contributing.md +1 -0
- changes_roller-0.1.0/docs/examples.md +424 -0
- changes_roller-0.1.0/docs/index.rst +104 -0
- changes_roller-0.1.0/docs/installation.md +149 -0
- changes_roller-0.1.0/docs/overview.md +51 -0
- changes_roller-0.1.0/docs/quick-start.md +133 -0
- changes_roller-0.1.0/docs/requirements.txt +15 -0
- changes_roller-0.1.0/docs/security.md +1 -0
- changes_roller-0.1.0/docs/specification.md +1 -0
- changes_roller-0.1.0/docs/usage.md +1 -0
- changes_roller-0.1.0/examples/dependency-update/README.md +33 -0
- changes_roller-0.1.0/examples/dependency-update/patch.sh +15 -0
- changes_roller-0.1.0/examples/dependency-update/series.ini +33 -0
- changes_roller-0.1.0/pyproject.toml +189 -0
- changes_roller-0.1.0/roller/__init__.py +6 -0
- changes_roller-0.1.0/roller/cli.py +277 -0
- changes_roller-0.1.0/roller/config.py +128 -0
- changes_roller-0.1.0/roller/executor.py +331 -0
- changes_roller-0.1.0/roller/reporter.py +58 -0
- changes_roller-0.1.0/roller/repository.py +252 -0
- changes_roller-0.1.0/roller/workspace.py +38 -0
- changes_roller-0.1.0/tests/README.md +163 -0
- changes_roller-0.1.0/tests/__init__.py +1 -0
- changes_roller-0.1.0/tests/conftest.py +91 -0
- changes_roller-0.1.0/tests/test_cli.py +322 -0
- changes_roller-0.1.0/tests/test_config.py +338 -0
- changes_roller-0.1.0/tests/test_executor.py +425 -0
- changes_roller-0.1.0/tests/test_integration.py +289 -0
- changes_roller-0.1.0/tests/test_reporter.py +180 -0
- changes_roller-0.1.0/tests/test_repository.py +480 -0
- changes_roller-0.1.0/tests/test_workspace.py +122 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Bandit configuration for changes-roller
|
|
2
|
+
# These warnings are intentional for this Git automation tool
|
|
3
|
+
|
|
4
|
+
# Exclude test directories
|
|
5
|
+
exclude_dirs:
|
|
6
|
+
- /tests/
|
|
7
|
+
|
|
8
|
+
# Skip checks:
|
|
9
|
+
# - B101: assert is OK for runtime validation
|
|
10
|
+
# - B404/B603/B607: subprocess and git commands are core functionality
|
|
11
|
+
# - B602: shell=True is intentional for run_command (executes user patch scripts)
|
|
12
|
+
skips:
|
|
13
|
+
- B101
|
|
14
|
+
- B404
|
|
15
|
+
- B603
|
|
16
|
+
- B607
|
|
17
|
+
- B602
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"permissions": {
|
|
3
|
+
"allow": [
|
|
4
|
+
"Bash(ruff check:*)",
|
|
5
|
+
"Bash(ruff format:*)",
|
|
6
|
+
"Bash(bandit:*)",
|
|
7
|
+
"Bash(mypy:*)",
|
|
8
|
+
"Bash(gh issue view:*)",
|
|
9
|
+
"Bash(xrandr:*)",
|
|
10
|
+
"Bash(python -m pytest:*)",
|
|
11
|
+
"Bash(gh issue list:*)",
|
|
12
|
+
"Bash(gh issue edit:*)",
|
|
13
|
+
"Bash(pre-commit install:*)",
|
|
14
|
+
"Bash(pre-commit run:*)",
|
|
15
|
+
"Bash(pytest:*)",
|
|
16
|
+
"Bash(pre-commit validate-config:*)",
|
|
17
|
+
"Bash(git add:*)",
|
|
18
|
+
"Bash(gh issue create:*)",
|
|
19
|
+
"Bash(python3:*)",
|
|
20
|
+
"Bash(pip index:*)",
|
|
21
|
+
"Bash(grep:*)",
|
|
22
|
+
"Bash(gh pr view:*)",
|
|
23
|
+
"Bash(gh pr diff:*)",
|
|
24
|
+
"Bash(gh label:*)",
|
|
25
|
+
"Bash(gh pr edit:*)",
|
|
26
|
+
"Bash(gh pr comment:*)",
|
|
27
|
+
"Bash(gh pr merge:*)",
|
|
28
|
+
"Bash(gh pr checks:*)",
|
|
29
|
+
"Bash(gh pr list:*)",
|
|
30
|
+
"WebSearch",
|
|
31
|
+
"Bash(ln:*)",
|
|
32
|
+
"Bash(sphinx-build:*)"
|
|
33
|
+
]
|
|
34
|
+
}
|
|
35
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# EditorConfig is awesome: https://EditorConfig.org
|
|
2
|
+
|
|
3
|
+
# Top-most EditorConfig file
|
|
4
|
+
root = true
|
|
5
|
+
|
|
6
|
+
# All files
|
|
7
|
+
[*]
|
|
8
|
+
charset = utf-8
|
|
9
|
+
end_of_line = lf
|
|
10
|
+
insert_final_newline = true
|
|
11
|
+
trim_trailing_whitespace = true
|
|
12
|
+
|
|
13
|
+
# Python files
|
|
14
|
+
[*.py]
|
|
15
|
+
indent_style = space
|
|
16
|
+
indent_size = 4
|
|
17
|
+
max_line_length = 88
|
|
18
|
+
|
|
19
|
+
# YAML files
|
|
20
|
+
[*.{yml,yaml}]
|
|
21
|
+
indent_style = space
|
|
22
|
+
indent_size = 2
|
|
23
|
+
|
|
24
|
+
# TOML files
|
|
25
|
+
[*.toml]
|
|
26
|
+
indent_style = space
|
|
27
|
+
indent_size = 2
|
|
28
|
+
|
|
29
|
+
# JSON files
|
|
30
|
+
[*.json]
|
|
31
|
+
indent_style = space
|
|
32
|
+
indent_size = 2
|
|
33
|
+
|
|
34
|
+
# Markdown files
|
|
35
|
+
[*.md]
|
|
36
|
+
trim_trailing_whitespace = false
|
|
37
|
+
max_line_length = off
|
|
38
|
+
|
|
39
|
+
# Shell scripts
|
|
40
|
+
[*.sh]
|
|
41
|
+
indent_style = space
|
|
42
|
+
indent_size = 2
|
|
43
|
+
|
|
44
|
+
# Makefile
|
|
45
|
+
[Makefile]
|
|
46
|
+
indent_style = tab
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# Auto detect text files and normalize line endings to LF
|
|
2
|
+
* text=auto eol=lf
|
|
3
|
+
|
|
4
|
+
# Source code
|
|
5
|
+
*.py text diff=python
|
|
6
|
+
*.sh text eol=lf
|
|
7
|
+
|
|
8
|
+
# Configuration files
|
|
9
|
+
*.yml text
|
|
10
|
+
*.yaml text
|
|
11
|
+
*.toml text
|
|
12
|
+
*.json text
|
|
13
|
+
*.ini text
|
|
14
|
+
*.cfg text
|
|
15
|
+
|
|
16
|
+
# Documentation
|
|
17
|
+
*.md text diff=markdown
|
|
18
|
+
*.txt text
|
|
19
|
+
*.rst text
|
|
20
|
+
|
|
21
|
+
# Git files
|
|
22
|
+
.gitignore text
|
|
23
|
+
.gitattributes text
|
|
24
|
+
|
|
25
|
+
# GitHub files
|
|
26
|
+
.github/**/* text
|
|
27
|
+
|
|
28
|
+
# Binary files
|
|
29
|
+
*.pyc binary
|
|
30
|
+
*.pyo binary
|
|
31
|
+
*.pyd binary
|
|
32
|
+
*.so binary
|
|
33
|
+
*.dylib binary
|
|
34
|
+
*.dll binary
|
|
35
|
+
*.exe binary
|
|
36
|
+
*.png binary
|
|
37
|
+
*.jpg binary
|
|
38
|
+
*.jpeg binary
|
|
39
|
+
*.gif binary
|
|
40
|
+
*.ico binary
|
|
41
|
+
*.pdf binary
|
|
42
|
+
*.zip binary
|
|
43
|
+
*.tar binary
|
|
44
|
+
*.gz binary
|
|
45
|
+
*.bz2 binary
|
|
46
|
+
*.7z binary
|
|
47
|
+
|
|
48
|
+
# Archives
|
|
49
|
+
*.tar.* binary
|
|
50
|
+
|
|
51
|
+
# Fonts
|
|
52
|
+
*.woff binary
|
|
53
|
+
*.woff2 binary
|
|
54
|
+
*.ttf binary
|
|
55
|
+
*.otf binary
|
|
56
|
+
*.eot binary
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
name: Bug Report
|
|
2
|
+
description: Report a bug or unexpected behavior
|
|
3
|
+
title: "[Bug]: "
|
|
4
|
+
labels: ["bug"]
|
|
5
|
+
body:
|
|
6
|
+
- type: markdown
|
|
7
|
+
attributes:
|
|
8
|
+
value: |
|
|
9
|
+
Thanks for taking the time to report a bug! Please fill out the information below to help us identify and fix the issue.
|
|
10
|
+
|
|
11
|
+
- type: textarea
|
|
12
|
+
id: description
|
|
13
|
+
attributes:
|
|
14
|
+
label: Bug Description
|
|
15
|
+
description: A clear and concise description of what the bug is.
|
|
16
|
+
placeholder: Tell us what went wrong...
|
|
17
|
+
validations:
|
|
18
|
+
required: true
|
|
19
|
+
|
|
20
|
+
- type: textarea
|
|
21
|
+
id: reproduction
|
|
22
|
+
attributes:
|
|
23
|
+
label: Steps to Reproduce
|
|
24
|
+
description: Detailed steps to reproduce the behavior.
|
|
25
|
+
placeholder: |
|
|
26
|
+
1. Run command '...'
|
|
27
|
+
2. With configuration '...'
|
|
28
|
+
3. See error
|
|
29
|
+
value: |
|
|
30
|
+
1.
|
|
31
|
+
2.
|
|
32
|
+
3.
|
|
33
|
+
validations:
|
|
34
|
+
required: true
|
|
35
|
+
|
|
36
|
+
- type: textarea
|
|
37
|
+
id: expected
|
|
38
|
+
attributes:
|
|
39
|
+
label: Expected Behavior
|
|
40
|
+
description: What did you expect to happen?
|
|
41
|
+
placeholder: Describe the expected outcome...
|
|
42
|
+
validations:
|
|
43
|
+
required: true
|
|
44
|
+
|
|
45
|
+
- type: textarea
|
|
46
|
+
id: actual
|
|
47
|
+
attributes:
|
|
48
|
+
label: Actual Behavior
|
|
49
|
+
description: What actually happened? Include error messages and stack traces.
|
|
50
|
+
placeholder: Paste error messages and relevant output...
|
|
51
|
+
render: shell
|
|
52
|
+
validations:
|
|
53
|
+
required: true
|
|
54
|
+
|
|
55
|
+
- type: input
|
|
56
|
+
id: version
|
|
57
|
+
attributes:
|
|
58
|
+
label: changes-roller Version
|
|
59
|
+
description: What version of changes-roller are you using?
|
|
60
|
+
placeholder: "e.g., 0.1.0 or output of 'pip show changes-roller'"
|
|
61
|
+
validations:
|
|
62
|
+
required: true
|
|
63
|
+
|
|
64
|
+
- type: input
|
|
65
|
+
id: python-version
|
|
66
|
+
attributes:
|
|
67
|
+
label: Python Version
|
|
68
|
+
description: What version of Python are you using?
|
|
69
|
+
placeholder: "e.g., 3.12.0 or output of 'python --version'"
|
|
70
|
+
validations:
|
|
71
|
+
required: true
|
|
72
|
+
|
|
73
|
+
- type: input
|
|
74
|
+
id: os
|
|
75
|
+
attributes:
|
|
76
|
+
label: Operating System
|
|
77
|
+
description: What operating system are you using?
|
|
78
|
+
placeholder: "e.g., Ubuntu 22.04, macOS 14.0, Windows 11"
|
|
79
|
+
validations:
|
|
80
|
+
required: true
|
|
81
|
+
|
|
82
|
+
- type: input
|
|
83
|
+
id: git-version
|
|
84
|
+
attributes:
|
|
85
|
+
label: Git Version
|
|
86
|
+
description: What version of Git are you using?
|
|
87
|
+
placeholder: "e.g., 2.40.0 or output of 'git --version'"
|
|
88
|
+
validations:
|
|
89
|
+
required: false
|
|
90
|
+
|
|
91
|
+
- type: textarea
|
|
92
|
+
id: configuration
|
|
93
|
+
attributes:
|
|
94
|
+
label: Configuration File
|
|
95
|
+
description: If relevant, include your configuration file (redact sensitive information).
|
|
96
|
+
placeholder: Paste your .ini configuration file...
|
|
97
|
+
render: ini
|
|
98
|
+
validations:
|
|
99
|
+
required: false
|
|
100
|
+
|
|
101
|
+
- type: textarea
|
|
102
|
+
id: logs
|
|
103
|
+
attributes:
|
|
104
|
+
label: Additional Context
|
|
105
|
+
description: Add any other context, logs, or screenshots about the problem.
|
|
106
|
+
placeholder: Any additional information that might help...
|
|
107
|
+
validations:
|
|
108
|
+
required: false
|
|
109
|
+
|
|
110
|
+
- type: checkboxes
|
|
111
|
+
id: checklist
|
|
112
|
+
attributes:
|
|
113
|
+
label: Pre-submission Checklist
|
|
114
|
+
description: Please verify the following before submitting.
|
|
115
|
+
options:
|
|
116
|
+
- label: I have searched existing issues to avoid duplicates
|
|
117
|
+
required: true
|
|
118
|
+
- label: I am using the latest version of changes-roller
|
|
119
|
+
required: false
|
|
120
|
+
- label: I have included all required information above
|
|
121
|
+
required: true
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
blank_issues_enabled: false
|
|
2
|
+
contact_links:
|
|
3
|
+
- name: Question or Discussion
|
|
4
|
+
url: https://github.com/k-pavlo/changes-roller/discussions
|
|
5
|
+
about: Ask questions or discuss ideas with the community
|
|
6
|
+
- name: Security Vulnerability
|
|
7
|
+
url: https://github.com/k-pavlo/changes-roller/security/advisories/new
|
|
8
|
+
about: Report a security vulnerability privately (see SECURITY.md)
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
name: Documentation Improvement
|
|
2
|
+
description: Suggest improvements to documentation
|
|
3
|
+
title: "[Docs]: "
|
|
4
|
+
labels: ["documentation"]
|
|
5
|
+
body:
|
|
6
|
+
- type: markdown
|
|
7
|
+
attributes:
|
|
8
|
+
value: |
|
|
9
|
+
Thanks for helping improve our documentation! Clear documentation helps everyone.
|
|
10
|
+
|
|
11
|
+
- type: dropdown
|
|
12
|
+
id: doc-type
|
|
13
|
+
attributes:
|
|
14
|
+
label: Documentation Type
|
|
15
|
+
description: What type of documentation needs improvement?
|
|
16
|
+
options:
|
|
17
|
+
- README.md
|
|
18
|
+
- USAGE.md (User Guide)
|
|
19
|
+
- SPECIFICATION.md
|
|
20
|
+
- CONTRIBUTING.md
|
|
21
|
+
- Code comments or docstrings
|
|
22
|
+
- API documentation
|
|
23
|
+
- Examples
|
|
24
|
+
- Other
|
|
25
|
+
validations:
|
|
26
|
+
required: true
|
|
27
|
+
|
|
28
|
+
- type: input
|
|
29
|
+
id: location
|
|
30
|
+
attributes:
|
|
31
|
+
label: Location
|
|
32
|
+
description: Where in the documentation is the issue?
|
|
33
|
+
placeholder: "e.g., README.md line 42, USAGE.md 'Branch Switching' section"
|
|
34
|
+
validations:
|
|
35
|
+
required: true
|
|
36
|
+
|
|
37
|
+
- type: textarea
|
|
38
|
+
id: issue
|
|
39
|
+
attributes:
|
|
40
|
+
label: Issue with Current Documentation
|
|
41
|
+
description: What is unclear, missing, incorrect, or could be improved?
|
|
42
|
+
placeholder: Describe what's wrong with the current documentation...
|
|
43
|
+
validations:
|
|
44
|
+
required: true
|
|
45
|
+
|
|
46
|
+
- type: textarea
|
|
47
|
+
id: suggestion
|
|
48
|
+
attributes:
|
|
49
|
+
label: Suggested Improvement
|
|
50
|
+
description: How should the documentation be improved?
|
|
51
|
+
placeholder: |
|
|
52
|
+
Describe or provide the improved documentation...
|
|
53
|
+
|
|
54
|
+
If providing specific text, please format it appropriately:
|
|
55
|
+
```markdown
|
|
56
|
+
Your suggested documentation text here...
|
|
57
|
+
```
|
|
58
|
+
validations:
|
|
59
|
+
required: true
|
|
60
|
+
|
|
61
|
+
- type: textarea
|
|
62
|
+
id: context
|
|
63
|
+
attributes:
|
|
64
|
+
label: Additional Context
|
|
65
|
+
description: Why is this improvement important? Who would benefit?
|
|
66
|
+
placeholder: |
|
|
67
|
+
Example: "New users get confused by this section..."
|
|
68
|
+
Example: "This feature isn't documented at all..."
|
|
69
|
+
validations:
|
|
70
|
+
required: false
|
|
71
|
+
|
|
72
|
+
- type: checkboxes
|
|
73
|
+
id: doc-areas
|
|
74
|
+
attributes:
|
|
75
|
+
label: Related Areas
|
|
76
|
+
description: Which areas of documentation might also need updates?
|
|
77
|
+
options:
|
|
78
|
+
- label: README.md
|
|
79
|
+
- label: USAGE.md
|
|
80
|
+
- label: SPECIFICATION.md
|
|
81
|
+
- label: CONTRIBUTING.md
|
|
82
|
+
- label: Code comments
|
|
83
|
+
- label: Examples
|
|
84
|
+
- label: CLI help text
|
|
85
|
+
|
|
86
|
+
- type: checkboxes
|
|
87
|
+
id: contribution
|
|
88
|
+
attributes:
|
|
89
|
+
label: Contribution
|
|
90
|
+
options:
|
|
91
|
+
- label: I would be willing to submit a PR with this documentation improvement
|
|
92
|
+
|
|
93
|
+
- type: checkboxes
|
|
94
|
+
id: checklist
|
|
95
|
+
attributes:
|
|
96
|
+
label: Pre-submission Checklist
|
|
97
|
+
options:
|
|
98
|
+
- label: I have checked that this documentation issue doesn't already have an open issue
|
|
99
|
+
required: true
|
|
100
|
+
- label: I have verified the current state of the documentation
|
|
101
|
+
required: true
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
name: Feature Request
|
|
2
|
+
description: Suggest a new feature or enhancement
|
|
3
|
+
title: "[Feature]: "
|
|
4
|
+
labels: ["enhancement"]
|
|
5
|
+
body:
|
|
6
|
+
- type: markdown
|
|
7
|
+
attributes:
|
|
8
|
+
value: |
|
|
9
|
+
Thanks for suggesting a new feature! Please provide as much detail as possible to help us understand your request.
|
|
10
|
+
|
|
11
|
+
- type: textarea
|
|
12
|
+
id: feature-description
|
|
13
|
+
attributes:
|
|
14
|
+
label: Feature Description
|
|
15
|
+
description: A clear and concise description of the feature you'd like to see.
|
|
16
|
+
placeholder: Describe the feature...
|
|
17
|
+
validations:
|
|
18
|
+
required: true
|
|
19
|
+
|
|
20
|
+
- type: textarea
|
|
21
|
+
id: problem
|
|
22
|
+
attributes:
|
|
23
|
+
label: Problem or Use Case
|
|
24
|
+
description: What problem does this feature solve? What use case does it address?
|
|
25
|
+
placeholder: |
|
|
26
|
+
Is your feature request related to a problem? Please describe.
|
|
27
|
+
Example: I'm always frustrated when...
|
|
28
|
+
validations:
|
|
29
|
+
required: true
|
|
30
|
+
|
|
31
|
+
- type: textarea
|
|
32
|
+
id: proposed-solution
|
|
33
|
+
attributes:
|
|
34
|
+
label: Proposed Solution
|
|
35
|
+
description: How would you like this feature to work? Describe the desired behavior.
|
|
36
|
+
placeholder: |
|
|
37
|
+
Describe how you envision this feature working...
|
|
38
|
+
Include examples of commands, configuration, or usage.
|
|
39
|
+
validations:
|
|
40
|
+
required: true
|
|
41
|
+
|
|
42
|
+
- type: textarea
|
|
43
|
+
id: alternatives
|
|
44
|
+
attributes:
|
|
45
|
+
label: Alternatives Considered
|
|
46
|
+
description: Have you considered any alternative solutions or workarounds?
|
|
47
|
+
placeholder: Describe alternatives you've considered...
|
|
48
|
+
validations:
|
|
49
|
+
required: false
|
|
50
|
+
|
|
51
|
+
- type: textarea
|
|
52
|
+
id: examples
|
|
53
|
+
attributes:
|
|
54
|
+
label: Usage Examples
|
|
55
|
+
description: Provide concrete examples of how this feature would be used.
|
|
56
|
+
placeholder: |
|
|
57
|
+
Example command usage:
|
|
58
|
+
```bash
|
|
59
|
+
roller create --new-option value
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Example configuration:
|
|
63
|
+
```ini
|
|
64
|
+
[SERIE]
|
|
65
|
+
new_setting = value
|
|
66
|
+
```
|
|
67
|
+
render: markdown
|
|
68
|
+
validations:
|
|
69
|
+
required: false
|
|
70
|
+
|
|
71
|
+
- type: dropdown
|
|
72
|
+
id: impact
|
|
73
|
+
attributes:
|
|
74
|
+
label: Impact
|
|
75
|
+
description: How would this feature impact your workflow?
|
|
76
|
+
options:
|
|
77
|
+
- Critical - Blocks major use cases
|
|
78
|
+
- High - Significantly improves workflow
|
|
79
|
+
- Medium - Nice to have enhancement
|
|
80
|
+
- Low - Minor convenience
|
|
81
|
+
validations:
|
|
82
|
+
required: true
|
|
83
|
+
|
|
84
|
+
- type: textarea
|
|
85
|
+
id: additional-context
|
|
86
|
+
attributes:
|
|
87
|
+
label: Additional Context
|
|
88
|
+
description: Add any other context, mockups, or screenshots about the feature request.
|
|
89
|
+
placeholder: Any additional information...
|
|
90
|
+
validations:
|
|
91
|
+
required: false
|
|
92
|
+
|
|
93
|
+
- type: checkboxes
|
|
94
|
+
id: contribution
|
|
95
|
+
attributes:
|
|
96
|
+
label: Contribution
|
|
97
|
+
description: Would you be willing to contribute to this feature?
|
|
98
|
+
options:
|
|
99
|
+
- label: I would be willing to implement this feature
|
|
100
|
+
- label: I would be willing to help test this feature
|
|
101
|
+
- label: I can provide additional requirements and feedback
|
|
102
|
+
|
|
103
|
+
- type: checkboxes
|
|
104
|
+
id: checklist
|
|
105
|
+
attributes:
|
|
106
|
+
label: Pre-submission Checklist
|
|
107
|
+
description: Please verify the following before submitting.
|
|
108
|
+
options:
|
|
109
|
+
- label: I have searched existing issues and feature requests to avoid duplicates
|
|
110
|
+
required: true
|
|
111
|
+
- label: This feature aligns with the project's goals (multi-repo patch automation)
|
|
112
|
+
required: true
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
# PyPI Trusted Publisher Setup
|
|
2
|
+
|
|
3
|
+
This document provides instructions for configuring PyPI Trusted Publishers (OIDC-based publishing) for the changes-roller project.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
**Trusted Publishers** is PyPI's recommended secure method for automated package publishing. It uses OpenID Connect (OIDC) to authenticate GitHub Actions workflows without requiring API tokens.
|
|
8
|
+
|
|
9
|
+
## Benefits
|
|
10
|
+
|
|
11
|
+
- ✅ No API tokens to store or manage
|
|
12
|
+
- ✅ No secrets in GitHub repository
|
|
13
|
+
- ✅ Automatic token rotation
|
|
14
|
+
- ✅ Scoped permissions (specific repo + workflow only)
|
|
15
|
+
- ✅ Complete audit trail on PyPI
|
|
16
|
+
|
|
17
|
+
## Prerequisites
|
|
18
|
+
|
|
19
|
+
Before setting up trusted publishing:
|
|
20
|
+
|
|
21
|
+
1. The package must be registered on PyPI (upload at least one version manually first)
|
|
22
|
+
2. You must be a maintainer/owner of the package on PyPI
|
|
23
|
+
3. You must have access to the GitHub repository
|
|
24
|
+
|
|
25
|
+
## Step 1: Initial Package Registration
|
|
26
|
+
|
|
27
|
+
If this is the first time publishing the package, you must upload it manually first:
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
# Build the package
|
|
31
|
+
pip install --upgrade build hatchling
|
|
32
|
+
python -m build
|
|
33
|
+
|
|
34
|
+
# Upload to PyPI (you'll need your PyPI credentials)
|
|
35
|
+
pip install --upgrade twine
|
|
36
|
+
twine upload dist/*
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
After this initial upload, you won't need to use tokens anymore.
|
|
40
|
+
|
|
41
|
+
## Step 2: Configure Trusted Publisher on PyPI
|
|
42
|
+
|
|
43
|
+
### 2.1 Access PyPI Project Settings
|
|
44
|
+
|
|
45
|
+
1. Go to https://pypi.org/manage/project/changes-roller/settings/
|
|
46
|
+
2. Log in with your PyPI account (must have maintainer access)
|
|
47
|
+
3. Scroll to the **Publishing** section
|
|
48
|
+
|
|
49
|
+
### 2.2 Add Pending Publisher
|
|
50
|
+
|
|
51
|
+
Click **"Add a new pending publisher"** and fill in:
|
|
52
|
+
|
|
53
|
+
| Field | Value |
|
|
54
|
+
| --------------------- | ---------------- |
|
|
55
|
+
| **PyPI Project Name** | `changes-roller` |
|
|
56
|
+
| **Owner** | `k-pavlo` |
|
|
57
|
+
| **Repository name** | `changes-roller` |
|
|
58
|
+
| **Workflow filename** | `release.yml` |
|
|
59
|
+
| **Environment name** | `release` |
|
|
60
|
+
|
|
61
|
+
### 2.3 Save Configuration
|
|
62
|
+
|
|
63
|
+
Click **"Add"** to save the trusted publisher configuration.
|
|
64
|
+
|
|
65
|
+
The publisher will show as "pending" until the first successful publish from GitHub Actions.
|
|
66
|
+
|
|
67
|
+
## Step 3: Configure GitHub Environment (Optional but Recommended)
|
|
68
|
+
|
|
69
|
+
Add extra protection by configuring the `release` environment in GitHub:
|
|
70
|
+
|
|
71
|
+
1. Go to https://github.com/k-pavlo/changes-roller/settings/environments
|
|
72
|
+
2. Click **"New environment"**
|
|
73
|
+
3. Name it: `release`
|
|
74
|
+
4. Configure protection rules:
|
|
75
|
+
- ✅ **Required reviewers**: Add maintainers (optional)
|
|
76
|
+
- ✅ **Deployment branches**: Select "Selected branches" → Add `main`
|
|
77
|
+
5. Click **"Save protection rules"**
|
|
78
|
+
|
|
79
|
+
This ensures releases can only be triggered from the `main` branch and optionally require manual approval.
|
|
80
|
+
|
|
81
|
+
## Step 4: Test the Setup
|
|
82
|
+
|
|
83
|
+
Create a test release to verify the configuration:
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
# 1. Ensure you're on main branch
|
|
87
|
+
git checkout main
|
|
88
|
+
git pull origin main
|
|
89
|
+
|
|
90
|
+
# 2. Bump version (or create a test tag manually)
|
|
91
|
+
cz bump
|
|
92
|
+
|
|
93
|
+
# 3. Push the tag
|
|
94
|
+
git push origin --tags
|
|
95
|
+
|
|
96
|
+
# 4. Monitor GitHub Actions
|
|
97
|
+
# Go to: https://github.com/k-pavlo/changes-roller/actions
|
|
98
|
+
# Watch the "Release to PyPI" workflow
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### Expected Workflow Steps
|
|
102
|
+
|
|
103
|
+
1. ✅ **Build** - Package is built with hatchling
|
|
104
|
+
2. ✅ **Publish to PyPI** - Authenticates via OIDC and uploads
|
|
105
|
+
3. ✅ **Create GitHub Release** - Release is created with notes
|
|
106
|
+
|
|
107
|
+
### Verification
|
|
108
|
+
|
|
109
|
+
After workflow completes:
|
|
110
|
+
|
|
111
|
+
- **PyPI**: Visit https://pypi.org/project/changes-roller/ and verify new version is listed
|
|
112
|
+
- **GitHub**: Visit https://github.com/k-pavlo/changes-roller/releases and verify release is created
|
|
113
|
+
- **Install**: Test `pip install changes-roller==<version>`
|
|
114
|
+
|
|
115
|
+
## Troubleshooting
|
|
116
|
+
|
|
117
|
+
### "Trusted publisher validation failed"
|
|
118
|
+
|
|
119
|
+
**Problem**: PyPI cannot verify the OIDC token from GitHub Actions.
|
|
120
|
+
|
|
121
|
+
**Solutions**:
|
|
122
|
+
|
|
123
|
+
1. **Check PyPI configuration**:
|
|
124
|
+
- Verify owner name matches: `k-pavlo`
|
|
125
|
+
- Verify repo name matches: `changes-roller`
|
|
126
|
+
- Verify workflow name matches: `release.yml`
|
|
127
|
+
- Verify environment name matches: `release`
|
|
128
|
+
|
|
129
|
+
2. **Check GitHub workflow**:
|
|
130
|
+
- Verify workflow file is named `.github/workflows/release.yml`
|
|
131
|
+
- Verify workflow uses `environment: release`
|
|
132
|
+
- Verify workflow has `permissions: id-token: write`
|
|
133
|
+
|
|
134
|
+
3. **Check workflow trigger**:
|
|
135
|
+
- Trusted publishing only works when triggered by tag push matching the pattern
|
|
136
|
+
- Manual workflow runs won't work if they don't set the environment correctly
|
|
137
|
+
|
|
138
|
+
### "This filename has already been used"
|
|
139
|
+
|
|
140
|
+
**Problem**: Trying to re-upload the same version to PyPI.
|
|
141
|
+
|
|
142
|
+
**Solution**: PyPI doesn't allow re-uploading the same version. Bump to a new version.
|
|
143
|
+
|
|
144
|
+
### "Publisher is pending"
|
|
145
|
+
|
|
146
|
+
**Problem**: Trusted publisher shows as "pending" on PyPI.
|
|
147
|
+
|
|
148
|
+
**Solution**: This is normal before the first successful publish. After the first successful automated publish from GitHub Actions, it will change to "active".
|
|
149
|
+
|
|
150
|
+
### "403 Forbidden" when publishing
|
|
151
|
+
|
|
152
|
+
**Problem**: Workflow doesn't have permission to publish.
|
|
153
|
+
|
|
154
|
+
**Solutions**:
|
|
155
|
+
|
|
156
|
+
1. Verify the PyPI project name matches exactly: `changes-roller`
|
|
157
|
+
2. Ensure the workflow is running from the correct repository
|
|
158
|
+
3. Check that the workflow has the correct environment configured
|
|
159
|
+
4. Verify `id-token: write` permission is set
|
|
160
|
+
|
|
161
|
+
## Additional Resources
|
|
162
|
+
|
|
163
|
+
- [PyPI Trusted Publishers Documentation](https://docs.pypi.org/trusted-publishers/)
|
|
164
|
+
- [GitHub OIDC Documentation](https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/about-security-hardening-with-openid-connect)
|
|
165
|
+
- [PyPA Publishing Action](https://github.com/pypa/gh-action-pypi-publish)
|
|
166
|
+
|
|
167
|
+
## Support
|
|
168
|
+
|
|
169
|
+
If you encounter issues:
|
|
170
|
+
|
|
171
|
+
1. Check the workflow logs in GitHub Actions
|
|
172
|
+
2. Review the PyPI trusted publisher configuration
|
|
173
|
+
3. Consult the resources above
|
|
174
|
+
4. Open an issue on the repository for help
|
|
175
|
+
|
|
176
|
+
## Migration from Token-based Publishing
|
|
177
|
+
|
|
178
|
+
If you previously used API tokens:
|
|
179
|
+
|
|
180
|
+
1. Remove the `PYPI_API_TOKEN` secret from GitHub repository settings
|
|
181
|
+
2. Configure trusted publisher as described above
|
|
182
|
+
3. The workflow already supports trusted publishing (no changes needed)
|
|
183
|
+
4. Previous token-based uploads are still valid and don't need to be redone
|
|
184
|
+
|
|
185
|
+
## Security Notes
|
|
186
|
+
|
|
187
|
+
- **No secrets required**: Trusted publishing uses OIDC, not static tokens
|
|
188
|
+
- **Automatic rotation**: Authentication tokens are ephemeral (valid only for the workflow run)
|
|
189
|
+
- **Audit trail**: All publishes are logged on PyPI with full context
|
|
190
|
+
- **Scoped access**: Publisher can only publish to the specific package from the specific repo/workflow
|
|
191
|
+
- **Revocable**: Publisher can be removed from PyPI settings at any time
|
|
192
|
+
|
|
193
|
+
## Maintenance
|
|
194
|
+
|
|
195
|
+
The trusted publisher configuration should not need regular maintenance. However:
|
|
196
|
+
|
|
197
|
+
- If you rename the repository, update the trusted publisher configuration
|
|
198
|
+
- If you rename the workflow file, update the trusted publisher configuration
|
|
199
|
+
- If you change the environment name, update both PyPI and the workflow
|
|
200
|
+
- Review active publishers periodically in PyPI settings
|