tox-pre-commit 0.0.1a0__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.
- tox_pre_commit-0.0.1a0/.codecov.yml +39 -0
- tox_pre_commit-0.0.1a0/.codespellrc +35 -0
- tox_pre_commit-0.0.1a0/.coveragerc +38 -0
- tox_pre_commit-0.0.1a0/.darglint +9 -0
- tox_pre_commit-0.0.1a0/.editorconfig +18 -0
- tox_pre_commit-0.0.1a0/.flake8 +171 -0
- tox_pre_commit-0.0.1a0/.gitattributes +5 -0
- tox_pre_commit-0.0.1a0/.github/CODE_OF_CONDUCT.md +87 -0
- tox_pre_commit-0.0.1a0/.github/CONTRIBUTING.md +88 -0
- tox_pre_commit-0.0.1a0/.github/FUNDING.yml +22 -0
- tox_pre_commit-0.0.1a0/.github/INCIDENT_RESPONSE.md +88 -0
- tox_pre_commit-0.0.1a0/.github/ISSUE_TEMPLATE/bug-report.yml +148 -0
- tox_pre_commit-0.0.1a0/.github/ISSUE_TEMPLATE/config.yml +26 -0
- tox_pre_commit-0.0.1a0/.github/ISSUE_TEMPLATE/feature-request.yml +109 -0
- tox_pre_commit-0.0.1a0/.github/PULL_REQUEST_TEMPLATE.md +39 -0
- tox_pre_commit-0.0.1a0/.github/SECURITY.md +44 -0
- tox_pre_commit-0.0.1a0/.github/THREAT_MODEL.md +112 -0
- tox_pre_commit-0.0.1a0/.github/actions/cache-keys/action.yml +48 -0
- tox_pre_commit-0.0.1a0/.github/reusables/tox-dev/workflow/reusable-tox/hooks/post-src-checkout/action.yml +39 -0
- tox_pre_commit-0.0.1a0/.github/reusables/tox-dev/workflow/reusable-tox/hooks/post-tox-job/action.yml +64 -0
- tox_pre_commit-0.0.1a0/.github/reusables/tox-dev/workflow/reusable-tox/hooks/post-tox-run/action.yml +75 -0
- tox_pre_commit-0.0.1a0/.github/reusables/tox-dev/workflow/reusable-tox/hooks/prepare-for-tox-run/action.yml +127 -0
- tox_pre_commit-0.0.1a0/.github/workflows/ci-cd.yml +984 -0
- tox_pre_commit-0.0.1a0/.github/workflows/scheduled-runs.yml +41 -0
- tox_pre_commit-0.0.1a0/.gitignore +479 -0
- tox_pre_commit-0.0.1a0/.mypy.ini +68 -0
- tox_pre_commit-0.0.1a0/.pre-commit-config.yaml +297 -0
- tox_pre_commit-0.0.1a0/.pylintrc.toml +636 -0
- tox_pre_commit-0.0.1a0/.ruff.toml +92 -0
- tox_pre_commit-0.0.1a0/.yamllint +20 -0
- tox_pre_commit-0.0.1a0/AGENTS.md +195 -0
- tox_pre_commit-0.0.1a0/CLAUDE.md +5 -0
- tox_pre_commit-0.0.1a0/LICENSE +43 -0
- tox_pre_commit-0.0.1a0/PKG-INFO +80 -0
- tox_pre_commit-0.0.1a0/README.md +57 -0
- tox_pre_commit-0.0.1a0/nitpick-style.toml +109 -0
- tox_pre_commit-0.0.1a0/pyproject.toml +51 -0
- tox_pre_commit-0.0.1a0/pytest.ini +80 -0
- tox_pre_commit-0.0.1a0/setup.cfg +4 -0
- tox_pre_commit-0.0.1a0/src/tox_plugins/pre_commit/_plugin.py +95 -0
- tox_pre_commit-0.0.1a0/src/tox_pre_commit.egg-info/PKG-INFO +80 -0
- tox_pre_commit-0.0.1a0/src/tox_pre_commit.egg-info/SOURCES.txt +49 -0
- tox_pre_commit-0.0.1a0/src/tox_pre_commit.egg-info/dependency_links.txt +1 -0
- tox_pre_commit-0.0.1a0/src/tox_pre_commit.egg-info/entry_points.txt +2 -0
- tox_pre_commit-0.0.1a0/src/tox_pre_commit.egg-info/requires.txt +1 -0
- tox_pre_commit-0.0.1a0/src/tox_pre_commit.egg-info/top_level.txt +1 -0
- tox_pre_commit-0.0.1a0/tests/conftest.py +19 -0
- tox_pre_commit-0.0.1a0/tests/importable_test.py +51 -0
- tox_pre_commit-0.0.1a0/tests/integration_test.py +60 -0
- tox_pre_commit-0.0.1a0/tests/smoke_test.py +11 -0
- tox_pre_commit-0.0.1a0/tox.ini +290 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
---
|
|
2
|
+
|
|
3
|
+
codecov:
|
|
4
|
+
notify:
|
|
5
|
+
manual_trigger: true # prevent notifications until we notify Codecov
|
|
6
|
+
wait_for_ci: false
|
|
7
|
+
|
|
8
|
+
require_ci_to_pass: false
|
|
9
|
+
|
|
10
|
+
comment:
|
|
11
|
+
require_changes: true
|
|
12
|
+
|
|
13
|
+
coverage:
|
|
14
|
+
range: 100..100
|
|
15
|
+
status:
|
|
16
|
+
patch:
|
|
17
|
+
default:
|
|
18
|
+
target: 100%
|
|
19
|
+
pytest:
|
|
20
|
+
target: 100%
|
|
21
|
+
flags:
|
|
22
|
+
- pytest
|
|
23
|
+
project:
|
|
24
|
+
default:
|
|
25
|
+
target: 100%
|
|
26
|
+
lib:
|
|
27
|
+
flags:
|
|
28
|
+
- pytest
|
|
29
|
+
paths:
|
|
30
|
+
- src/
|
|
31
|
+
target: 100%
|
|
32
|
+
tests:
|
|
33
|
+
flags:
|
|
34
|
+
- pytest
|
|
35
|
+
paths:
|
|
36
|
+
- tests/
|
|
37
|
+
target: 100%
|
|
38
|
+
|
|
39
|
+
...
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
[codespell]
|
|
2
|
+
# Ref: https://github.com/codespell-project/codespell#using-a-config-file
|
|
3
|
+
|
|
4
|
+
builtin = clear,code,en-GB_to_en-US,informal,names,rare
|
|
5
|
+
|
|
6
|
+
check-filenames =
|
|
7
|
+
check-hidden =
|
|
8
|
+
|
|
9
|
+
count =
|
|
10
|
+
|
|
11
|
+
# NOTE: `exclude-file` should be uncommented once we have Sphinx
|
|
12
|
+
# exclude-file = docs/spelling_ignorelines.txt
|
|
13
|
+
|
|
14
|
+
# NOTE: `ignore-words` should be uncommented once we have Sphinx
|
|
15
|
+
# ignore-words = docs/spelling_wordlist.txt
|
|
16
|
+
ignore-words-list = THIRDPARTY
|
|
17
|
+
# NOTE: `cancelled()` is a common helper function in GHA
|
|
18
|
+
ignore-regex = \b!?cancelled()\b
|
|
19
|
+
|
|
20
|
+
quiet-level = 3
|
|
21
|
+
|
|
22
|
+
# NOTE: `.gitignore` is skipped due to
|
|
23
|
+
# NOTE: https://github.com/codespell-project/codespell/issues/3941
|
|
24
|
+
skip =
|
|
25
|
+
.git,
|
|
26
|
+
.gitignore,
|
|
27
|
+
.mypy_cache,
|
|
28
|
+
.ruff_cache,
|
|
29
|
+
.tox,
|
|
30
|
+
__pycache__,
|
|
31
|
+
build,
|
|
32
|
+
dist,
|
|
33
|
+
*.egg-info,
|
|
34
|
+
|
|
35
|
+
# write-changes = true
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
[html]
|
|
2
|
+
show_contexts = true
|
|
3
|
+
skip_covered = false
|
|
4
|
+
|
|
5
|
+
[paths]
|
|
6
|
+
_site-packages-to-src-mapping =
|
|
7
|
+
src
|
|
8
|
+
*/src
|
|
9
|
+
*\src
|
|
10
|
+
*/lib/pypy*/site-packages
|
|
11
|
+
*/lib/python*/site-packages
|
|
12
|
+
*\Lib\site-packages
|
|
13
|
+
|
|
14
|
+
[report]
|
|
15
|
+
skip_covered = true
|
|
16
|
+
skip_empty = true
|
|
17
|
+
show_missing = true
|
|
18
|
+
# custom excludes extend baselines from coverage + covdefaults
|
|
19
|
+
# for reference, see
|
|
20
|
+
# coverage: https://coverage.readthedocs.io/en/latest/excluding.html#default-exclusions
|
|
21
|
+
# covdefaults: https://github.com/asottile/covdefaults/blob/8d8712c26ad505f1269851a7c8431b8c1fedaa62/covdefaults.py#L86-L105
|
|
22
|
+
exclude_also =
|
|
23
|
+
^\s*@pytest\.mark\.xfail
|
|
24
|
+
^\s*if _t\.TYPE_CHECKING:
|
|
25
|
+
|
|
26
|
+
[run]
|
|
27
|
+
branch = true
|
|
28
|
+
cover_pylib = false
|
|
29
|
+
# https://coverage.rtfd.io/en/latest/contexts.html#dynamic-contexts
|
|
30
|
+
# dynamic_context = test_function # conflicts with `pytest-cov` if set here
|
|
31
|
+
parallel = true
|
|
32
|
+
plugins =
|
|
33
|
+
covdefaults
|
|
34
|
+
relative_files = true
|
|
35
|
+
source =
|
|
36
|
+
.
|
|
37
|
+
source_pkgs =
|
|
38
|
+
tox_plugins
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
[darglint]
|
|
2
|
+
# NOTE: All `darglint` styles except for `sphinx` hit ridiculously low
|
|
3
|
+
# NOTE: performance on some of the in-project Python modules.
|
|
4
|
+
# Refs:
|
|
5
|
+
# * https://github.com/terrencepreilly/darglint/issues/186
|
|
6
|
+
# * https://github.com/wemake-services/wemake-python-styleguide/issues/2287
|
|
7
|
+
docstring_style = sphinx
|
|
8
|
+
# enable = DAR104 # covered by `sphinx_autodoc_typehints`
|
|
9
|
+
strictness = full
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
root = true
|
|
2
|
+
|
|
3
|
+
[*]
|
|
4
|
+
charset = utf-8
|
|
5
|
+
end_of_line = lf
|
|
6
|
+
indent_size = 4
|
|
7
|
+
indent_style = space
|
|
8
|
+
insert_final_newline = true
|
|
9
|
+
trim_trailing_whitespace = true
|
|
10
|
+
|
|
11
|
+
[*.{bat,cmd,ps1}]
|
|
12
|
+
end_of_line = crlf
|
|
13
|
+
|
|
14
|
+
[*.{js,json,json5,yml,yaml,md,rb}]
|
|
15
|
+
indent_size = 2
|
|
16
|
+
|
|
17
|
+
[Makefile]
|
|
18
|
+
indent_style = tab
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
[flake8]
|
|
2
|
+
|
|
3
|
+
# Print the total number of errors:
|
|
4
|
+
count = true
|
|
5
|
+
|
|
6
|
+
# Don't even try to analyze these:
|
|
7
|
+
extend-exclude =
|
|
8
|
+
# Circle CI configs
|
|
9
|
+
.circleci,
|
|
10
|
+
# No need to traverse egg info dir
|
|
11
|
+
*.egg-info,
|
|
12
|
+
# GitHub configs
|
|
13
|
+
.github,
|
|
14
|
+
# Cache files of MyPy
|
|
15
|
+
.mypy_cache,
|
|
16
|
+
# Cache files of pytest
|
|
17
|
+
.pytest_cache,
|
|
18
|
+
# Temp dir of pytest-testmon
|
|
19
|
+
.tmontmp,
|
|
20
|
+
# Countless third-party libs in venvs
|
|
21
|
+
.tox,
|
|
22
|
+
# Occasional virtualenv dir
|
|
23
|
+
.venv,
|
|
24
|
+
# VS Code
|
|
25
|
+
.vscode,
|
|
26
|
+
# Temporary build dir
|
|
27
|
+
build,
|
|
28
|
+
# This contains sdists and wheels that we don't want to check
|
|
29
|
+
dist,
|
|
30
|
+
# Metadata of `pip wheel` cmd is autogenerated
|
|
31
|
+
pip-wheel-metadata,
|
|
32
|
+
|
|
33
|
+
# IMPORTANT: avoid using ignore option, always use extend-ignore instead
|
|
34
|
+
# Completely and unconditionally ignore the following errors:
|
|
35
|
+
extend-ignore =
|
|
36
|
+
# Legitimate cases, no need to "fix" these violations:
|
|
37
|
+
# E501: "line too long", its function is replaced by `flake8-length`
|
|
38
|
+
E501,
|
|
39
|
+
# I: isort-handled
|
|
40
|
+
I,
|
|
41
|
+
# W505: "doc line too long", its function is replaced by `flake8-length`
|
|
42
|
+
W505,
|
|
43
|
+
# S101: MyPy requires `asserts`, plus they're not bad if cooked well
|
|
44
|
+
S101,
|
|
45
|
+
# WPS300: "Found local folder import" -- nothing bad about this
|
|
46
|
+
WPS300,
|
|
47
|
+
# WPS305: "Found f string" -- nothing bad about this
|
|
48
|
+
WPS305,
|
|
49
|
+
# An opposite consistency expectation is currently enforced
|
|
50
|
+
# by pylint via: useless-object-inheritance (R0205):
|
|
51
|
+
# WPS306: "Found class without a base class: *" -- nothing bad about this
|
|
52
|
+
WPS306,
|
|
53
|
+
# WPS317 enforces weird indents
|
|
54
|
+
WPS317,
|
|
55
|
+
# WPS318 enforces weird indents too
|
|
56
|
+
WPS318,
|
|
57
|
+
# WPS322: "Found incorrect multi-line string" -- false-positives with
|
|
58
|
+
# attribute docstrings. Ref:
|
|
59
|
+
# https://github.com/wemake-services/wemake-python-styleguide/issues/3056
|
|
60
|
+
WPS322,
|
|
61
|
+
# WPS326: "Found implicit string concatenation" -- nothing bad about this
|
|
62
|
+
WPS326,
|
|
63
|
+
# WPS332: "Found walrus operator" -- nothing bad about this
|
|
64
|
+
WPS332,
|
|
65
|
+
# WPS422: "Found future import: *" -- we need these for multipython
|
|
66
|
+
WPS422,
|
|
67
|
+
# WPS428: "Found statement that has no effect" -- false-positives with
|
|
68
|
+
# attribute docstrings. Ref:
|
|
69
|
+
# https://github.com/wemake-services/wemake-python-styleguide/issues/3056
|
|
70
|
+
WPS428,
|
|
71
|
+
# WPS462: "Wrong multiline string usage" -- false-positives with
|
|
72
|
+
# attribute docstrings. Ref:
|
|
73
|
+
# https://github.com/wemake-services/wemake-python-styleguide/issues/3056
|
|
74
|
+
WPS462,
|
|
75
|
+
|
|
76
|
+
# IMPORTANT: avoid using select option, always use extend-select instead
|
|
77
|
+
# Enable the following errors:
|
|
78
|
+
extend-select =
|
|
79
|
+
# B950: "line too long", longer than `max-line-length` + 10%
|
|
80
|
+
B950,
|
|
81
|
+
|
|
82
|
+
# https://wemake-python-stylegui.de/en/latest/pages/usage/formatter.html
|
|
83
|
+
format = wemake
|
|
84
|
+
|
|
85
|
+
# Let's not overcomplicate the code:
|
|
86
|
+
max-complexity = 10
|
|
87
|
+
|
|
88
|
+
# Accessibility/large fonts and PEP8 friendly.
|
|
89
|
+
# This is being flexibly extended through the `flake8-length`:
|
|
90
|
+
max-line-length = 79
|
|
91
|
+
|
|
92
|
+
# Allow certain violations in certain files:
|
|
93
|
+
# Please keep both sections of this list sorted, as it will be easier for others to find and add entries in the future
|
|
94
|
+
per-file-ignores =
|
|
95
|
+
# The following ignores have been researched and should be considered permanent
|
|
96
|
+
# each should be preceded with an explanation of each of the error codes
|
|
97
|
+
# If other ignores are added for a specific file in the section following this,
|
|
98
|
+
# these will need to be added to that line as well.
|
|
99
|
+
|
|
100
|
+
# There are multiple `assert`s (S101) in tests;
|
|
101
|
+
# we don't care about the security of temporary directories in tests (S108);
|
|
102
|
+
# also, using fixtures looks like shadowing the outer scope (WPS442);
|
|
103
|
+
# nested functions are often necessary for mocking (WPS430);
|
|
104
|
+
# furthermore, we should be able to import and test private attributes
|
|
105
|
+
# (WPS450) and modules (WPS436); `pytest.raises()` allows inspecting the
|
|
106
|
+
# exception outside the CM (WPS441); additionally test docstrings don't
|
|
107
|
+
# need param lists (DAR, DCO020):
|
|
108
|
+
tests/**.py: DAR, DCO020, S101, S108, WPS430, WPS436, WPS441, WPS442, WPS450
|
|
109
|
+
|
|
110
|
+
tests/importable_test.py: ANN101, DAR
|
|
111
|
+
|
|
112
|
+
# Count the number of occurrences of each error/warning code and print a report:
|
|
113
|
+
statistics = true
|
|
114
|
+
|
|
115
|
+
# ## Plugin-provided settings: ##
|
|
116
|
+
|
|
117
|
+
# flake8-eradicate
|
|
118
|
+
# E800:
|
|
119
|
+
eradicate-whitelist-extend = isort:\s+\w+|(Ref:|\*)\s+https?:\/\/
|
|
120
|
+
|
|
121
|
+
# flake8-pytest-style
|
|
122
|
+
# PT001:
|
|
123
|
+
pytest-fixture-no-parentheses = true
|
|
124
|
+
# PT006:
|
|
125
|
+
pytest-parametrize-names-type = tuple
|
|
126
|
+
# PT007:
|
|
127
|
+
pytest-parametrize-values-type = tuple
|
|
128
|
+
pytest-parametrize-values-row-type = tuple
|
|
129
|
+
# PT023:
|
|
130
|
+
pytest-mark-no-parentheses = true
|
|
131
|
+
|
|
132
|
+
# flake8-quotes
|
|
133
|
+
inline-quotes = single
|
|
134
|
+
multiline-quotes = double
|
|
135
|
+
docstring-quotes = double
|
|
136
|
+
|
|
137
|
+
# flake8-rst-docstrings
|
|
138
|
+
rst-directives =
|
|
139
|
+
spelling
|
|
140
|
+
rst-roles =
|
|
141
|
+
# Built-in Sphinx roles:
|
|
142
|
+
class,
|
|
143
|
+
data,
|
|
144
|
+
file,
|
|
145
|
+
func,
|
|
146
|
+
exc,
|
|
147
|
+
meth,
|
|
148
|
+
mod,
|
|
149
|
+
term,
|
|
150
|
+
py:class,
|
|
151
|
+
py:data,
|
|
152
|
+
py:exc,
|
|
153
|
+
py:func,
|
|
154
|
+
py:meth,
|
|
155
|
+
py:term,
|
|
156
|
+
# Sphinx's internal role:
|
|
157
|
+
event,
|
|
158
|
+
|
|
159
|
+
# flake8-typing-as-t
|
|
160
|
+
# TYT02:
|
|
161
|
+
typing-as-t-imported-name = _t
|
|
162
|
+
|
|
163
|
+
# wemake-python-styleguide
|
|
164
|
+
# WPS111:
|
|
165
|
+
# `_t` will be enforced by `flake8-typing-as-t`
|
|
166
|
+
allowed-domain-names =
|
|
167
|
+
_t,
|
|
168
|
+
_c,
|
|
169
|
+
i-control-code = false
|
|
170
|
+
show-violation-links = true
|
|
171
|
+
show-source = true
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# Contributor Covenant Code of Conduct
|
|
2
|
+
|
|
3
|
+
## Our Pledge
|
|
4
|
+
|
|
5
|
+
In the interest of fostering an open and welcoming environment, we as
|
|
6
|
+
contributors and maintainers pledge to making participation in our project
|
|
7
|
+
and our community a harassment-free experience for everyone, regardless of
|
|
8
|
+
age, body size, disability, ethnicity, gender identity and expression,
|
|
9
|
+
level of experience, nationality, personal appearance, race, religion, or
|
|
10
|
+
sexual identity and orientation.
|
|
11
|
+
|
|
12
|
+
## Our Standards
|
|
13
|
+
|
|
14
|
+
Examples of behavior that contributes to creating a positive environment
|
|
15
|
+
include:
|
|
16
|
+
|
|
17
|
+
* Using welcoming and inclusive language
|
|
18
|
+
* Being respectful of differing viewpoints and experiences
|
|
19
|
+
* Gracefully accepting constructive criticism
|
|
20
|
+
* Focusing on what is best for the community
|
|
21
|
+
* Showing empathy towards other community members
|
|
22
|
+
|
|
23
|
+
Examples of unacceptable behavior by participants include:
|
|
24
|
+
|
|
25
|
+
* The use of sexualized language or imagery and unwelcome sexual attention
|
|
26
|
+
or advances
|
|
27
|
+
* Trolling, insulting/derogatory comments, and personal or political
|
|
28
|
+
attacks
|
|
29
|
+
* Public or private harassment
|
|
30
|
+
* Publishing others' private information, such as a physical or electronic
|
|
31
|
+
address, without explicit permission
|
|
32
|
+
* Submitting low-quality AI-generated contributions (commonly known as
|
|
33
|
+
"AI slop") -- unsolicited LLM-authored pull requests, issues, comments,
|
|
34
|
+
or documentation that the human submitter has not personally reviewed,
|
|
35
|
+
validated, and taken responsibility for. See the [contribution guide]
|
|
36
|
+
for the full LLM contribution policy.
|
|
37
|
+
* Other conduct which could reasonably be considered inappropriate in a
|
|
38
|
+
professional setting
|
|
39
|
+
|
|
40
|
+
[contribution guide]: ./CONTRIBUTING.md#llm-generated-contributions
|
|
41
|
+
|
|
42
|
+
## Our Responsibilities
|
|
43
|
+
|
|
44
|
+
Project maintainers are responsible for clarifying the standards of
|
|
45
|
+
acceptable behavior and are expected to take appropriate and fair
|
|
46
|
+
corrective action in response to any instances of unacceptable behavior.
|
|
47
|
+
|
|
48
|
+
Project maintainers have the right and responsibility to remove, edit, or
|
|
49
|
+
reject comments, commits, code, wiki edits, issues, and other
|
|
50
|
+
contributions that are not aligned to this Code of Conduct, or to ban
|
|
51
|
+
temporarily or permanently any contributor for other behaviors that they
|
|
52
|
+
deem inappropriate, threatening, offensive, or harmful. **Repeated
|
|
53
|
+
submission of AI-generated spam contributions constitutes grounds for a
|
|
54
|
+
ban under this provision.**
|
|
55
|
+
|
|
56
|
+
## Scope
|
|
57
|
+
|
|
58
|
+
This Code of Conduct applies both within project spaces and in public
|
|
59
|
+
spaces when an individual is representing the project or its community.
|
|
60
|
+
Examples of representing a project or community include using an
|
|
61
|
+
official project e-mail address, posting via an official social media
|
|
62
|
+
account, or acting as an appointed representative at an online or
|
|
63
|
+
offline event. Representation of a project may be further defined and
|
|
64
|
+
clarified by project maintainers.
|
|
65
|
+
|
|
66
|
+
## Enforcement
|
|
67
|
+
|
|
68
|
+
Instances of abusive, harassing, or otherwise unacceptable behavior may
|
|
69
|
+
be reported by contacting the project maintainer at
|
|
70
|
+
`wk+~foss/tox-dev/tox-plugins/coc@sydorenko.org.ua`. The project team
|
|
71
|
+
will review and investigate all complaints, and will respond in a way
|
|
72
|
+
that it deems appropriate to the circumstances. The project team is
|
|
73
|
+
obligated to maintain confidentiality with regard to the reporter of an
|
|
74
|
+
incident. Further details of specific enforcement policies may be
|
|
75
|
+
posted separately.
|
|
76
|
+
|
|
77
|
+
Project maintainers who do not follow or enforce the Code of Conduct in
|
|
78
|
+
good faith may face temporary or permanent repercussions as determined
|
|
79
|
+
by other members of the project's leadership.
|
|
80
|
+
|
|
81
|
+
## Attribution
|
|
82
|
+
|
|
83
|
+
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
|
|
84
|
+
version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
|
|
85
|
+
|
|
86
|
+
[homepage]: http://contributor-covenant.org
|
|
87
|
+
[version]: http://contributor-covenant.org/version/1/4/
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# Contributing
|
|
2
|
+
|
|
3
|
+
<!-- sphinx-inclusion-post-this-line -->
|
|
4
|
+
|
|
5
|
+
This project is part of the [tox-dev] ecosystem. By contributing, you
|
|
6
|
+
agree to abide by the [Contributor Code of Conduct][coc] and follow the
|
|
7
|
+
conventions outlined below.
|
|
8
|
+
|
|
9
|
+
## Project Contribution Guidelines
|
|
10
|
+
|
|
11
|
+
The following apply to contributions in this repository:
|
|
12
|
+
|
|
13
|
+
- Use [`tox`] to invoke the testing, linting and packaging environments
|
|
14
|
+
declared in `tox.ini`.
|
|
15
|
+
- Local code-style and static-analysis checks run under [`pre-commit`].
|
|
16
|
+
Run `pre-commit run --all-files` before pushing.
|
|
17
|
+
- Add tests for behavioral changes. The test suite uses [`tox.pytest`]
|
|
18
|
+
to exercise the plugin against a real `tox` runtime.
|
|
19
|
+
- Give a clear one-line description in the pull request title.
|
|
20
|
+
- Wait for review from at least one other contributor before merging,
|
|
21
|
+
even if you have write access.
|
|
22
|
+
|
|
23
|
+
The only exception to these guidelines is for trivial changes, such as
|
|
24
|
+
documentation corrections or contributions that do not change the
|
|
25
|
+
plugin itself.
|
|
26
|
+
|
|
27
|
+
Contributions following these guidelines are always welcomed, encouraged
|
|
28
|
+
and appreciated.
|
|
29
|
+
|
|
30
|
+
[`pre-commit`]: https://pre-commit.com
|
|
31
|
+
[`tox`]: https://tox.wiki
|
|
32
|
+
[`tox.pytest`]:
|
|
33
|
+
https://tox.wiki/en/latest/plugin/howto.html#testing-plugins
|
|
34
|
+
[coc]: ./CODE_OF_CONDUCT.md
|
|
35
|
+
[tox-dev]: https://github.com/tox-dev
|
|
36
|
+
|
|
37
|
+
### LLM Generated Contributions
|
|
38
|
+
|
|
39
|
+
Contributors are free to use whatever tools they like, but we have some
|
|
40
|
+
additional guidance for LLM-assisted contributions.
|
|
41
|
+
|
|
42
|
+
When interacting in this project's spaces (issues, pull requests,
|
|
43
|
+
discussions, etc.), do not use LLMs to speak for you, except for
|
|
44
|
+
translation or grammar edits. This includes the creation of change
|
|
45
|
+
logs and pull request descriptions. Human-to-human communication is
|
|
46
|
+
foundational to open source communities.
|
|
47
|
+
|
|
48
|
+
> [!CAUTION]
|
|
49
|
+
> In extreme cases, low quality PRs may be closed as spam.
|
|
50
|
+
|
|
51
|
+
#### Responsibility
|
|
52
|
+
|
|
53
|
+
Remember that you, not the LLM, are responsible for your contributions.
|
|
54
|
+
Be ready to discuss your changes.
|
|
55
|
+
Do not submit code you have not reviewed.
|
|
56
|
+
|
|
57
|
+
Do your best to follow the conventions and standards of the project.
|
|
58
|
+
Make sure your code really works.
|
|
59
|
+
Be thoughtful about testing and documentation.
|
|
60
|
+
|
|
61
|
+
Try to make your code brief, and recognize when less is more.
|
|
62
|
+
|
|
63
|
+
#### Autonomous Code Submissions
|
|
64
|
+
|
|
65
|
+
The use of agents which write code and submit pull requests without
|
|
66
|
+
human review is not permitted.
|
|
67
|
+
|
|
68
|
+
We can already run these tools ourselves, if we want to. Contributions
|
|
69
|
+
should provide value beyond running a tool.
|
|
70
|
+
|
|
71
|
+
#### Pull Request Templates
|
|
72
|
+
|
|
73
|
+
Please do not replace the pull request template, which is part of the
|
|
74
|
+
maintainers' process.
|
|
75
|
+
|
|
76
|
+
### The `good first issue` label
|
|
77
|
+
|
|
78
|
+
The [`good first issue` label] is used to designate items which are
|
|
79
|
+
being left for new contributors.
|
|
80
|
+
They're a great way to get onboarded into the project and learn.
|
|
81
|
+
|
|
82
|
+
Having an LLM resolve one of these issues does not help anyone learn.
|
|
83
|
+
Therefore, please be considerate of those who may benefit from these
|
|
84
|
+
opportunities, and refrain from asking an LLM to produce a complete
|
|
85
|
+
solution.
|
|
86
|
+
|
|
87
|
+
[`good first issue` label]:
|
|
88
|
+
https://github.com/search?q=org%3Atox-dev+label%3A%22good+first+issue%22&type=issues
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
---
|
|
2
|
+
|
|
3
|
+
custom:
|
|
4
|
+
- https://savelife.in.ua/donate-en
|
|
5
|
+
- https://github.com/vshymanskyy/StandWithUkraine#for-maintainers-and-authors
|
|
6
|
+
- https://www.paypal.me/webknjazCZ
|
|
7
|
+
- https://webknjaz.me
|
|
8
|
+
|
|
9
|
+
github:
|
|
10
|
+
- webknjaz
|
|
11
|
+
|
|
12
|
+
ko_fi: webknjaz
|
|
13
|
+
|
|
14
|
+
liberapay: webknjaz
|
|
15
|
+
|
|
16
|
+
open_collective: webknjaz
|
|
17
|
+
|
|
18
|
+
# patreon: webknjaz # not in use because of the ties with ruscism
|
|
19
|
+
|
|
20
|
+
thanks_dev: u/gh/webknjaz
|
|
21
|
+
|
|
22
|
+
...
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# Incident Response Playbook
|
|
2
|
+
|
|
3
|
+
This document captures how the maintainer triages, fixes and discloses
|
|
4
|
+
confirmed security incidents covering this plugin. The path is
|
|
5
|
+
written down here so it is decided in calm waters, not in the middle
|
|
6
|
+
of a live disclosure.
|
|
7
|
+
|
|
8
|
+
> [!note]
|
|
9
|
+
> Reporters should follow [`SECURITY.md`][SECURITY] to reach the
|
|
10
|
+
> maintainer. This file is for the maintainer's response side.
|
|
11
|
+
|
|
12
|
+
[SECURITY]: ./SECURITY.md
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
## Severity Classes
|
|
16
|
+
|
|
17
|
+
| Class | Definition |
|
|
18
|
+
|-------|------------|
|
|
19
|
+
| **Critical** | Arbitrary code execution from default plugin behavior, or any vulnerability that compromises the integrity of the published distribution. |
|
|
20
|
+
| **High** | Information disclosure or denial of service that the plugin can cause without explicit user opt-in. |
|
|
21
|
+
| **Medium** | Broken builds for legitimate users; CI hangs; spurious data leaks limited to the user's own machine. |
|
|
22
|
+
| **Low** | Cosmetic, non-exploitable bugs incorrectly classified as security. |
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
## Triage Timeline
|
|
26
|
+
|
|
27
|
+
| Step | Target turnaround |
|
|
28
|
+
|------|-------------------|
|
|
29
|
+
| Initial acknowledgment to the reporter | **≤ 72 hours** from receipt |
|
|
30
|
+
| Severity-class assignment | **≤ 72 hours** |
|
|
31
|
+
| Impact assessment + remediation plan | **≤ 7 days** |
|
|
32
|
+
| Fix-or-yank decision | **≤ 14 days** |
|
|
33
|
+
| Coordinated disclosure window for **Critical** / **High** | **≤ 45 days** from initial report by default; extendable on reporter request |
|
|
34
|
+
|
|
35
|
+
These are targets, not hard SLAs -- this is unpaid maintenance on an
|
|
36
|
+
open-source project.
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
## Coordination
|
|
40
|
+
|
|
41
|
+
* For **Critical** and **High**: open a GitHub Security Advisory
|
|
42
|
+
draft as soon as the issue is reproduced. The draft serves as the
|
|
43
|
+
shared workspace between the maintainer and the reporter.
|
|
44
|
+
* Cross-link the advisory to the `tox-dev` maintainer chat for severe
|
|
45
|
+
cross-project impact (e.g. if the bug originates in `tox` itself
|
|
46
|
+
rather than the plugin).
|
|
47
|
+
* CVE assignment is requested via GitHub's GHSA flow when CVSS
|
|
48
|
+
v4.0 base score ≥ 7.0 (High or Critical).
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
## Disclosure Philosophy
|
|
52
|
+
|
|
53
|
+
* Coordinated disclosure is preferred.
|
|
54
|
+
* The advisory is **published after** the fix release reaches PyPI
|
|
55
|
+
so users have a remediation available immediately.
|
|
56
|
+
* Embargo only when downstream coordination warrants it (e.g.
|
|
57
|
+
affected downstream packagers have not yet shipped the fix).
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
## Remediation Playbook
|
|
61
|
+
|
|
62
|
+
1. Cut a hot-fix branch from the latest released tag.
|
|
63
|
+
2. Land the minimal fix + a regression test under `tests/`.
|
|
64
|
+
3. Bump the patch component of the version.
|
|
65
|
+
4. Release via Trusted Publishing on PyPI (the existing
|
|
66
|
+
`ci-cd.yml` release flow does this).
|
|
67
|
+
5. If older versions are confirmed affected and not in active use,
|
|
68
|
+
`pip` yank them (PyPI maintainer console). Yanking does not
|
|
69
|
+
delete; it warns installers off.
|
|
70
|
+
6. Publish the GHSA advisory.
|
|
71
|
+
7. Open a public GitHub Discussion announcing the fix.
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
## Post-Incident
|
|
75
|
+
|
|
76
|
+
* A short public post-mortem is published within **30 days** after
|
|
77
|
+
disclosure for any **Critical** / **High** incident.
|
|
78
|
+
* The [threat model][threat-model] is updated to reflect any new
|
|
79
|
+
mitigations added.
|
|
80
|
+
* Regression coverage is verified to be in place under `tests/`.
|
|
81
|
+
|
|
82
|
+
[threat-model]: ./THREAT_MODEL.md
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
## Drills
|
|
86
|
+
|
|
87
|
+
Incident response drills are not currently scheduled. Revisit if user
|
|
88
|
+
base or attack surface grows substantially.
|