@neralabs/rerail-pack-python 0.1.1
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.
- package/LICENSE +202 -0
- package/NOTICE +7 -0
- package/README.md +36 -0
- package/licenses/bandit/LICENSE +175 -0
- package/licenses/bandit/UPSTREAM.md +100 -0
- package/licenses/ruff/LICENSE +430 -0
- package/licenses/ruff/UPSTREAM.md +338 -0
- package/pack.json +912 -0
- package/package.json +30 -0
- package/rules/bandit-b101-assert-used.json +38 -0
- package/rules/bandit-b102-exec-used.json +125 -0
- package/rules/bandit-b110-try-except-pass.json +109 -0
- package/rules/bandit-b112-try-except-continue.json +109 -0
- package/rules/bandit-b113-request-without-timeout.json +138 -0
- package/rules/bandit-b301-pickle.json +58 -0
- package/rules/bandit-b302-marshal.json +48 -0
- package/rules/bandit-b303-md5.json +79 -0
- package/rules/bandit-b305-cipher-modes.json +47 -0
- package/rules/bandit-b306-mktemp-q.json +54 -0
- package/rules/bandit-b307-eval.json +125 -0
- package/rules/bandit-b308-mark-safe.json +47 -0
- package/rules/bandit-b310-urllib-urlopen.json +54 -0
- package/rules/bandit-b311-random.json +57 -0
- package/rules/bandit-b312-telnetlib.json +47 -0
- package/rules/bandit-b313-xml-bad-celementtree.json +50 -0
- package/rules/bandit-b314-xml-bad-elementtree.json +50 -0
- package/rules/bandit-b315-xml-bad-expatreader.json +47 -0
- package/rules/bandit-b316-xml-bad-expatbuilder.json +48 -0
- package/rules/bandit-b317-xml-bad-sax.json +58 -0
- package/rules/bandit-b318-xml-bad-minidom.json +48 -0
- package/rules/bandit-b319-xml-bad-pulldom.json +48 -0
- package/rules/bandit-b321-ftplib.json +47 -0
- package/rules/bandit-b323-unverified-context.json +47 -0
- package/rules/bandit-b401-import-telnetlib.json +48 -0
- package/rules/bandit-b402-import-ftplib.json +48 -0
- package/rules/bandit-b405-import-xml-etree.json +69 -0
- package/rules/bandit-b406-import-xml-sax.json +73 -0
- package/rules/bandit-b407-import-xml-expat.json +54 -0
- package/rules/bandit-b408-import-xml-minidom.json +54 -0
- package/rules/bandit-b409-import-xml-pulldom.json +54 -0
- package/rules/bandit-b411-import-xmlrpclib.json +48 -0
- package/rules/bandit-b413-import-pycrypto.json +159 -0
- package/rules/bandit-b415-import-pyghmi.json +48 -0
- package/rules/bandit-b502-ssl-with-bad-version.json +90 -0
- package/rules/bandit-b505-weak-cryptographic-key.json +166 -0
- package/rules/bandit-b507-ssh-no-host-key-verification.json +210 -0
- package/rules/bandit-b606-start-process-with-no-shell.json +63 -0
- package/rules/bandit-b610-django-extra-used.json +268 -0
- package/rules/bandit-b615-huggingface-unsafe-download.json +1152 -0
- package/rules/ruff-async100-cancel-scope-no-checkpoint.json +357 -0
- package/rules/ruff-async105-trio-sync-call.json +199 -0
- package/rules/ruff-async115-async-zero-sleep.json +264 -0
- package/rules/ruff-async116-long-sleep-not-forever.json +267 -0
- package/rules/ruff-async210-blocking-http-call-in-async-function.json +161 -0
- package/rules/ruff-async221-run-process-in-async-function.json +342 -0
- package/rules/ruff-async222-wait-for-process-in-async-function.json +144 -0
- package/rules/ruff-async230-blocking-open-call-in-async-function.json +339 -0
- package/rules/ruff-async250-blocking-input-in-async-function.json +143 -0
- package/rules/ruff-async251-blocking-sleep-in-async-function.json +140 -0
- package/rules/ruff-b002-unary-prefix-increment-decrement.json +54 -0
- package/rules/ruff-b003-assignment-to-os-environ.json +54 -0
- package/rules/ruff-b004-unreliable-callable-check.json +171 -0
- package/rules/ruff-b005-strip-with-multi-characters.json +131 -0
- package/rules/ruff-b007-unused-loop-control-variable.json +368 -0
- package/rules/ruff-b009-get-attr-with-constant.json +190 -0
- package/rules/ruff-b010-set-attr-with-constant.json +219 -0
- package/rules/ruff-b011-assert-false.json +62 -0
- package/rules/ruff-b013-redundant-tuple-in-exception-handler.json +94 -0
- package/rules/ruff-b014-duplicate-handler-exception.json +126 -0
- package/rules/ruff-b016-raise-literal.json +47 -0
- package/rules/ruff-b020-loop-variable-overrides-iterator.json +341 -0
- package/rules/ruff-b021-f-string-docstring.json +48 -0
- package/rules/ruff-b022-useless-contextlib-suppress.json +95 -0
- package/rules/ruff-b023-function-uses-loop-variable.json +560 -0
- package/rules/ruff-b025-duplicate-try-block-exception.json +182 -0
- package/rules/ruff-b026-star-arg-unpacking-after-keyword-arg.json +57 -0
- package/rules/ruff-b028-no-explicit-stacklevel.json +177 -0
- package/rules/ruff-b029-except-with-empty-tuple.json +102 -0
- package/rules/ruff-b032-unintentional-type-annotation.json +157 -0
- package/rules/ruff-b033-duplicate-value.json +129 -0
- package/rules/ruff-b034-re-sub-positional-args.json +159 -0
- package/rules/ruff-b039-mutable-contextvar-default.json +281 -0
- package/rules/ruff-b904-raise-without-from-inside-except.json +194 -0
- package/rules/ruff-b905-zip-without-explicit-strict.json +429 -0
- package/rules/ruff-e711-none-comparison.json +199 -0
- package/rules/ruff-e721-type-comparison.json +293 -0
- package/rules/ruff-e722-bare-except.json +57 -0
- package/rules/ruff-e742-ambiguous-class-name.json +47 -0
- package/rules/ruff-e743-ambiguous-function-name.json +47 -0
- package/rules/ruff-f403-undefined-local-with-import-star.json +73 -0
- package/rules/ruff-f405-undefined-local-with-import-star-usage.json +87 -0
- package/rules/ruff-f406-undefined-local-with-nested-import-star-usage.json +39 -0
- package/rules/ruff-f407-future-feature-not-defined.json +56 -0
- package/rules/ruff-f501-percent-format-invalid-format.json +88 -0
- package/rules/ruff-f502-percent-format-expected-mapping.json +127 -0
- package/rules/ruff-f503-percent-format-expected-sequence.json +127 -0
- package/rules/ruff-f504-percent-format-extra-named-arguments.json +46 -0
- package/rules/ruff-f505-percent-format-missing-argument.json +49 -0
- package/rules/ruff-f506-percent-format-mixed-positional-and-named.json +114 -0
- package/rules/ruff-f507-percent-format-positional-count-mismatch.json +78 -0
- package/rules/ruff-f508-percent-format-star-requires-sequence.json +112 -0
- package/rules/ruff-f509-percent-format-unsupported-format-character.json +86 -0
- package/rules/ruff-f521-string-dot-format-invalid-format.json +83 -0
- package/rules/ruff-f522-string-dot-format-extra-named-arguments.json +46 -0
- package/rules/ruff-f523-string-dot-format-extra-positional-arguments.json +48 -0
- package/rules/ruff-f524-string-dot-format-missing-arguments.json +46 -0
- package/rules/ruff-f525-string-dot-format-mixing-automatic.json +99 -0
- package/rules/ruff-f541-f-string-missing-placeholders.json +52 -0
- package/rules/ruff-f601-multi-value-repeated-key-literal.json +215 -0
- package/rules/ruff-f602-multi-value-repeated-key-variable.json +123 -0
- package/rules/ruff-f622-multiple-starred-expressions.json +57 -0
- package/rules/ruff-f632-is-literal.json +232 -0
- package/rules/ruff-f633-invalid-print-syntax.json +299 -0
- package/rules/ruff-f701-break-outside-loop.json +64 -0
- package/rules/ruff-f702-continue-outside-loop.json +64 -0
- package/rules/ruff-f706-return-outside-function.json +61 -0
- package/rules/ruff-f707-default-except-not-last.json +50 -0
- package/rules/ruff-f722-forward-annotation-syntax-error.json +654 -0
- package/rules/ruff-f822-undefined-export.json +55 -0
- package/rules/ruff-f823-undefined-local.json +42 -0
- package/rules/ruff-f842-unused-annotation.json +51 -0
- package/rules/ruff-f901-raise-not-implemented.json +97 -0
- package/rules/ruff-pie794-duplicate-class-field-definition.json +157 -0
- package/rules/ruff-pie796-non-unique-enums.json +460 -0
- package/rules/ruff-pie800-unnecessary-spread.json +62 -0
- package/rules/ruff-pie804-unnecessary-dict-kwargs.json +179 -0
- package/rules/ruff-pie807-reimplemented-container-builtin.json +100 -0
- package/rules/ruff-pie810-multiple-starts-ends-with.json +585 -0
- package/rules/ruff-ret501-unnecessary-return-none.json +256 -0
- package/rules/ruff-ret502-implicit-return-value.json +163 -0
- package/rules/ruff-ret505-superfluous-else-return.json +211 -0
- package/rules/ruff-ret506-superfluous-else-raise.json +211 -0
- package/rules/ruff-ret507-superfluous-else-continue.json +211 -0
- package/rules/ruff-ret508-superfluous-else-break.json +211 -0
- package/rules/ruff-sim101-duplicate-isinstance-call.json +384 -0
- package/rules/ruff-sim107-return-in-try-except-finally.json +82 -0
- package/rules/ruff-sim109-compare-with-tuple.json +205 -0
- package/rules/ruff-sim112-uncapitalized-environment-variables.json +168 -0
- package/rules/ruff-sim113-enumerate-for-loop.json +562 -0
- package/rules/ruff-sim208-double-negation.json +58 -0
- package/rules/ruff-sim210-if-expr-with-true-false.json +90 -0
- package/rules/ruff-sim211-if-expr-with-false-true.json +90 -0
- package/rules/ruff-sim212-if-expr-with-twisted-arms.json +95 -0
- package/rules/ruff-sim300-yoda-conditions.json +487 -0
- package/rules/ruff-sim905-split-static-string.json +579 -0
- package/rules/ruff-sim910-dict-get-with-none-default.json +518 -0
- package/rules/ruff-t100-debugger.json +197 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
{
|
|
2
|
+
"format": "rerail.policy/v1",
|
|
3
|
+
"id": "ruff-f505-percent-format-missing-argument",
|
|
4
|
+
"revision": 1,
|
|
5
|
+
"mode": "steer",
|
|
6
|
+
"description": "Port of Ruff's F505 (percent-format-missing-argument): a valid `%`-format string without positional placeholders applied to a dict display without `**`, all of whose keys are string literals, that passes no value for some `%(key)` placeholder. `formatArgs` reads the format string left of `%` (a str literal with no f/t/b prefix, implicit concatenations joined, escapes decoded, parentheses transparent) with the `percentFormat` grammar (a port of ruff_python_literal's cformat parser), and the right operand as Ruff's strings.rs does.",
|
|
7
|
+
"scope": {
|
|
8
|
+
"include": [
|
|
9
|
+
"**/*"
|
|
10
|
+
],
|
|
11
|
+
"exclude": []
|
|
12
|
+
},
|
|
13
|
+
"clauses": [
|
|
14
|
+
{
|
|
15
|
+
"id": "percent-format-missing-argument",
|
|
16
|
+
"forbid": {
|
|
17
|
+
"ast": {
|
|
18
|
+
"language": "python",
|
|
19
|
+
"rule": {
|
|
20
|
+
"pattern": "$S % $R",
|
|
21
|
+
"formatArgs": {
|
|
22
|
+
"style": "percent",
|
|
23
|
+
"string": "S",
|
|
24
|
+
"args": "R",
|
|
25
|
+
"missing": {
|
|
26
|
+
"kind": "placeholder",
|
|
27
|
+
"has": {
|
|
28
|
+
"kind": "mapping_key"
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
"violation": {
|
|
36
|
+
"anchor": "witness.span",
|
|
37
|
+
"code": "F505",
|
|
38
|
+
"message": "`%`-format string is missing argument(s) for placeholder(s)",
|
|
39
|
+
"suppress": {
|
|
40
|
+
"noqa": {
|
|
41
|
+
"codes": [
|
|
42
|
+
"F505"
|
|
43
|
+
]
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
]
|
|
49
|
+
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
{
|
|
2
|
+
"format": "rerail.policy/v1",
|
|
3
|
+
"id": "ruff-f506-percent-format-mixed-positional-and-named",
|
|
4
|
+
"revision": 1,
|
|
5
|
+
"mode": "steer",
|
|
6
|
+
"description": "Port of Ruff's F506 (percent-format-mixed-positional-and-named): a valid `%`-format string with both a `%(key)` placeholder and a positional value (a placeholder without a key, or a `*` width or precision). The format string is a str literal (no f/t/b prefix; implicit concatenations joined, escapes decoded, parentheses transparent) left of `%`, read with the `percentFormat` grammar (a port of ruff_python_literal's cformat parser).",
|
|
7
|
+
"scope": {
|
|
8
|
+
"include": [
|
|
9
|
+
"**/*"
|
|
10
|
+
],
|
|
11
|
+
"exclude": []
|
|
12
|
+
},
|
|
13
|
+
"clauses": [
|
|
14
|
+
{
|
|
15
|
+
"id": "percent-format-mixed-positional-and-named",
|
|
16
|
+
"forbid": {
|
|
17
|
+
"ast": {
|
|
18
|
+
"language": "python",
|
|
19
|
+
"utils": {
|
|
20
|
+
"plain-string": {
|
|
21
|
+
"any": [
|
|
22
|
+
{
|
|
23
|
+
"kind": "string",
|
|
24
|
+
"not": {
|
|
25
|
+
"regex": "^[A-Za-z]*[fFbBtT][A-Za-z]*['\"]"
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"kind": "concatenated_string",
|
|
30
|
+
"not": {
|
|
31
|
+
"has": {
|
|
32
|
+
"kind": "string",
|
|
33
|
+
"regex": "^[A-Za-z]*[fFbBtT][A-Za-z]*['\"]"
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
]
|
|
38
|
+
},
|
|
39
|
+
"format-string": {
|
|
40
|
+
"any": [
|
|
41
|
+
{
|
|
42
|
+
"matches": "plain-string",
|
|
43
|
+
"parse": {
|
|
44
|
+
"grammar": "percentFormat",
|
|
45
|
+
"not": {
|
|
46
|
+
"has": {
|
|
47
|
+
"kind": "error"
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
"all": [
|
|
51
|
+
{
|
|
52
|
+
"has": {
|
|
53
|
+
"kind": "placeholder",
|
|
54
|
+
"stopBy": "end",
|
|
55
|
+
"has": {
|
|
56
|
+
"kind": "mapping_key"
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"has": {
|
|
62
|
+
"stopBy": "end",
|
|
63
|
+
"any": [
|
|
64
|
+
{
|
|
65
|
+
"kind": "placeholder",
|
|
66
|
+
"not": {
|
|
67
|
+
"has": {
|
|
68
|
+
"kind": "mapping_key"
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
"kind": "star"
|
|
74
|
+
}
|
|
75
|
+
]
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
]
|
|
79
|
+
}
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
"kind": "parenthesized_expression",
|
|
83
|
+
"has": {
|
|
84
|
+
"matches": "format-string"
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
]
|
|
88
|
+
}
|
|
89
|
+
},
|
|
90
|
+
"rule": {
|
|
91
|
+
"pattern": "$S % $R"
|
|
92
|
+
},
|
|
93
|
+
"constraints": {
|
|
94
|
+
"S": {
|
|
95
|
+
"matches": "format-string"
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
"violation": {
|
|
101
|
+
"anchor": "witness.span",
|
|
102
|
+
"code": "F506",
|
|
103
|
+
"message": "`%`-format string has mixed positional and named placeholders",
|
|
104
|
+
"suppress": {
|
|
105
|
+
"noqa": {
|
|
106
|
+
"codes": [
|
|
107
|
+
"F506"
|
|
108
|
+
]
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
]
|
|
114
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
{
|
|
2
|
+
"format": "rerail.policy/v1",
|
|
3
|
+
"id": "ruff-f507-percent-format-positional-count-mismatch",
|
|
4
|
+
"revision": 1,
|
|
5
|
+
"mode": "steer",
|
|
6
|
+
"description": "Port of Ruff's F507 (percent-format-positional-count-mismatch): a valid `%`-format string without `%(key)` placeholders whose positional values differ in number from a tuple display without starred items, or, with any count but one, from a right operand Ruff's ResolvedPythonType infers as one non-tuple value; with no placeholder, any right operand but a tuple display or one Ruff types as a tuple (`(1,) + (2,)`). `formatArgs` reads the format string left of `%` (a str literal with no f/t/b prefix, implicit concatenations joined, escapes decoded, parentheses transparent) with the `percentFormat` grammar (a port of ruff_python_literal's cformat parser), and the right operand as Ruff's strings.rs does. Ported from the Ruff conformance suite (rerail/conformance/ruff/rules/F507.json at 3f102adcb), with Ruff's `# noqa` honoured as the Ruff CLI honours it.",
|
|
7
|
+
"scope": {
|
|
8
|
+
"include": [
|
|
9
|
+
"**/*"
|
|
10
|
+
],
|
|
11
|
+
"exclude": []
|
|
12
|
+
},
|
|
13
|
+
"clauses": [
|
|
14
|
+
{
|
|
15
|
+
"id": "percent-format-positional-count-mismatch",
|
|
16
|
+
"forbid": {
|
|
17
|
+
"ast": {
|
|
18
|
+
"language": "python",
|
|
19
|
+
"rule": {
|
|
20
|
+
"pattern": "$S % $R",
|
|
21
|
+
"all": [
|
|
22
|
+
{
|
|
23
|
+
"any": [
|
|
24
|
+
{
|
|
25
|
+
"formatArgs": {
|
|
26
|
+
"style": "percent",
|
|
27
|
+
"string": "S",
|
|
28
|
+
"args": "R",
|
|
29
|
+
"unused": {
|
|
30
|
+
"not": {
|
|
31
|
+
"kind": "pair"
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"formatArgs": {
|
|
38
|
+
"style": "percent",
|
|
39
|
+
"string": "S",
|
|
40
|
+
"args": "R",
|
|
41
|
+
"missing": {
|
|
42
|
+
"any": [
|
|
43
|
+
{
|
|
44
|
+
"kind": "star"
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"kind": "placeholder",
|
|
48
|
+
"not": {
|
|
49
|
+
"has": {
|
|
50
|
+
"kind": "mapping_key"
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
]
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
]
|
|
59
|
+
}
|
|
60
|
+
]
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
"violation": {
|
|
65
|
+
"anchor": "witness.span",
|
|
66
|
+
"code": "F507",
|
|
67
|
+
"message": "`%`-format string placeholder count differs from the substitution count",
|
|
68
|
+
"suppress": {
|
|
69
|
+
"noqa": {
|
|
70
|
+
"codes": [
|
|
71
|
+
"F507"
|
|
72
|
+
]
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
]
|
|
78
|
+
}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
{
|
|
2
|
+
"format": "rerail.policy/v1",
|
|
3
|
+
"id": "ruff-f508-percent-format-star-requires-sequence",
|
|
4
|
+
"revision": 1,
|
|
5
|
+
"mode": "steer",
|
|
6
|
+
"description": "Port of Ruff's F508 (percent-format-star-requires-sequence): a valid `%`-format string with a `*` width or precision applied to a dict display or comprehension. The format string is a str literal (no f/t/b prefix; implicit concatenations joined, escapes decoded, parentheses transparent) left of `%`, read with the `percentFormat` grammar (a port of ruff_python_literal's cformat parser).",
|
|
7
|
+
"scope": {
|
|
8
|
+
"include": [
|
|
9
|
+
"**/*"
|
|
10
|
+
],
|
|
11
|
+
"exclude": []
|
|
12
|
+
},
|
|
13
|
+
"clauses": [
|
|
14
|
+
{
|
|
15
|
+
"id": "percent-format-star-requires-sequence",
|
|
16
|
+
"forbid": {
|
|
17
|
+
"ast": {
|
|
18
|
+
"language": "python",
|
|
19
|
+
"utils": {
|
|
20
|
+
"plain-string": {
|
|
21
|
+
"any": [
|
|
22
|
+
{
|
|
23
|
+
"kind": "string",
|
|
24
|
+
"not": {
|
|
25
|
+
"regex": "^[A-Za-z]*[fFbBtT][A-Za-z]*['\"]"
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"kind": "concatenated_string",
|
|
30
|
+
"not": {
|
|
31
|
+
"has": {
|
|
32
|
+
"kind": "string",
|
|
33
|
+
"regex": "^[A-Za-z]*[fFbBtT][A-Za-z]*['\"]"
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
]
|
|
38
|
+
},
|
|
39
|
+
"format-string": {
|
|
40
|
+
"any": [
|
|
41
|
+
{
|
|
42
|
+
"matches": "plain-string",
|
|
43
|
+
"parse": {
|
|
44
|
+
"grammar": "percentFormat",
|
|
45
|
+
"not": {
|
|
46
|
+
"has": {
|
|
47
|
+
"kind": "error"
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
"has": {
|
|
51
|
+
"kind": "star",
|
|
52
|
+
"stopBy": "end"
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"kind": "parenthesized_expression",
|
|
58
|
+
"has": {
|
|
59
|
+
"matches": "format-string"
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
]
|
|
63
|
+
},
|
|
64
|
+
"operand": {
|
|
65
|
+
"any": [
|
|
66
|
+
{
|
|
67
|
+
"any": [
|
|
68
|
+
{
|
|
69
|
+
"kind": "dictionary"
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"kind": "dictionary_comprehension"
|
|
73
|
+
}
|
|
74
|
+
]
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
"kind": "parenthesized_expression",
|
|
78
|
+
"has": {
|
|
79
|
+
"matches": "operand"
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
]
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
"rule": {
|
|
86
|
+
"pattern": "$S % $R"
|
|
87
|
+
},
|
|
88
|
+
"constraints": {
|
|
89
|
+
"S": {
|
|
90
|
+
"matches": "format-string"
|
|
91
|
+
},
|
|
92
|
+
"R": {
|
|
93
|
+
"matches": "operand"
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
"violation": {
|
|
99
|
+
"anchor": "witness.span",
|
|
100
|
+
"code": "F508",
|
|
101
|
+
"message": "`%`-format string `*` specifier requires sequence",
|
|
102
|
+
"suppress": {
|
|
103
|
+
"noqa": {
|
|
104
|
+
"codes": [
|
|
105
|
+
"F508"
|
|
106
|
+
]
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
]
|
|
112
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
{
|
|
2
|
+
"format": "rerail.policy/v1",
|
|
3
|
+
"id": "ruff-f509-percent-format-unsupported-format-character",
|
|
4
|
+
"revision": 1,
|
|
5
|
+
"mode": "steer",
|
|
6
|
+
"description": "Port of Ruff's F509 (percent-format-unsupported-format-character): a `%`-format string the parser refuses at an unsupported conversion character. The format string is a str literal (no f/t/b prefix; implicit concatenations joined, escapes decoded, parentheses transparent) left of `%`, read with the `percentFormat` grammar (a port of ruff_python_literal's cformat parser).",
|
|
7
|
+
"scope": {
|
|
8
|
+
"include": [
|
|
9
|
+
"**/*"
|
|
10
|
+
],
|
|
11
|
+
"exclude": []
|
|
12
|
+
},
|
|
13
|
+
"clauses": [
|
|
14
|
+
{
|
|
15
|
+
"id": "percent-format-unsupported-format-character",
|
|
16
|
+
"forbid": {
|
|
17
|
+
"ast": {
|
|
18
|
+
"language": "python",
|
|
19
|
+
"utils": {
|
|
20
|
+
"plain-string": {
|
|
21
|
+
"any": [
|
|
22
|
+
{
|
|
23
|
+
"kind": "string",
|
|
24
|
+
"not": {
|
|
25
|
+
"regex": "^[A-Za-z]*[fFbBtT][A-Za-z]*['\"]"
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"kind": "concatenated_string",
|
|
30
|
+
"not": {
|
|
31
|
+
"has": {
|
|
32
|
+
"kind": "string",
|
|
33
|
+
"regex": "^[A-Za-z]*[fFbBtT][A-Za-z]*['\"]"
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
]
|
|
38
|
+
},
|
|
39
|
+
"format-string": {
|
|
40
|
+
"any": [
|
|
41
|
+
{
|
|
42
|
+
"matches": "plain-string",
|
|
43
|
+
"parse": {
|
|
44
|
+
"grammar": "percentFormat",
|
|
45
|
+
"has": {
|
|
46
|
+
"kind": "error",
|
|
47
|
+
"value": {
|
|
48
|
+
"regex": "^unsupported format character"
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
"kind": "parenthesized_expression",
|
|
55
|
+
"has": {
|
|
56
|
+
"matches": "format-string"
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
]
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
"rule": {
|
|
63
|
+
"pattern": "$S % $R"
|
|
64
|
+
},
|
|
65
|
+
"constraints": {
|
|
66
|
+
"S": {
|
|
67
|
+
"matches": "format-string"
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
"violation": {
|
|
73
|
+
"anchor": "witness.span",
|
|
74
|
+
"code": "F509",
|
|
75
|
+
"message": "`%`-format string has unsupported format character",
|
|
76
|
+
"suppress": {
|
|
77
|
+
"noqa": {
|
|
78
|
+
"codes": [
|
|
79
|
+
"F509"
|
|
80
|
+
]
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
]
|
|
86
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
{
|
|
2
|
+
"format": "rerail.policy/v1",
|
|
3
|
+
"id": "ruff-f521-string-dot-format-invalid-format",
|
|
4
|
+
"revision": 1,
|
|
5
|
+
"mode": "steer",
|
|
6
|
+
"description": "Port of Ruff's F521 (string-dot-format-invalid-format): a `.format` call on a str literal the format parser refuses (unmatched braces, fields nested deeper than one level, an empty attribute or index, an unclosed `[`, a bad conversion or format spec). The format string is a str literal (no f/t/b prefix; implicit concatenations joined, escapes decoded, parentheses transparent) receiving `.format`, read with the `braceFormat` grammar (a port of ruff_python_literal's format parser as pyflakes' FormatSummary reads it).",
|
|
7
|
+
"scope": {
|
|
8
|
+
"include": [
|
|
9
|
+
"**/*"
|
|
10
|
+
],
|
|
11
|
+
"exclude": []
|
|
12
|
+
},
|
|
13
|
+
"clauses": [
|
|
14
|
+
{
|
|
15
|
+
"id": "string-dot-format-invalid-format",
|
|
16
|
+
"forbid": {
|
|
17
|
+
"ast": {
|
|
18
|
+
"language": "python",
|
|
19
|
+
"utils": {
|
|
20
|
+
"plain-string": {
|
|
21
|
+
"any": [
|
|
22
|
+
{
|
|
23
|
+
"kind": "string",
|
|
24
|
+
"not": {
|
|
25
|
+
"regex": "^[A-Za-z]*[fFbBtT][A-Za-z]*['\"]"
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"kind": "concatenated_string",
|
|
30
|
+
"not": {
|
|
31
|
+
"has": {
|
|
32
|
+
"kind": "string",
|
|
33
|
+
"regex": "^[A-Za-z]*[fFbBtT][A-Za-z]*['\"]"
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
]
|
|
38
|
+
},
|
|
39
|
+
"format-string": {
|
|
40
|
+
"any": [
|
|
41
|
+
{
|
|
42
|
+
"matches": "plain-string",
|
|
43
|
+
"parse": {
|
|
44
|
+
"grammar": "braceFormat",
|
|
45
|
+
"has": {
|
|
46
|
+
"kind": "error"
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"kind": "parenthesized_expression",
|
|
52
|
+
"has": {
|
|
53
|
+
"matches": "format-string"
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
]
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
"rule": {
|
|
60
|
+
"pattern": "$S.format($$$A)"
|
|
61
|
+
},
|
|
62
|
+
"constraints": {
|
|
63
|
+
"S": {
|
|
64
|
+
"matches": "format-string"
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
"violation": {
|
|
70
|
+
"anchor": "witness.span",
|
|
71
|
+
"code": "F521",
|
|
72
|
+
"message": "`.format` call has invalid format string",
|
|
73
|
+
"suppress": {
|
|
74
|
+
"noqa": {
|
|
75
|
+
"codes": [
|
|
76
|
+
"F521"
|
|
77
|
+
]
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
]
|
|
83
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"format": "rerail.policy/v1",
|
|
3
|
+
"id": "ruff-f522-string-dot-format-extra-named-arguments",
|
|
4
|
+
"revision": 1,
|
|
5
|
+
"mode": "steer",
|
|
6
|
+
"description": "Port of Ruff's F522 (string-dot-format-extra-named-arguments): a `.format` call without `**` on a valid format string, passing a keyword argument no named field (top level or nested in a spec) reads. `formatArgs` reads the format string receiving `.format` (a str literal with no f/t/b prefix, implicit concatenations joined, escapes decoded, parentheses transparent) with the `braceFormat` grammar (a port of ruff_python_literal's format parser as pyflakes' FormatSummary reads it), and the call's arguments as Ruff's strings.rs does.",
|
|
7
|
+
"scope": {
|
|
8
|
+
"include": [
|
|
9
|
+
"**/*"
|
|
10
|
+
],
|
|
11
|
+
"exclude": []
|
|
12
|
+
},
|
|
13
|
+
"clauses": [
|
|
14
|
+
{
|
|
15
|
+
"id": "string-dot-format-extra-named-arguments",
|
|
16
|
+
"forbid": {
|
|
17
|
+
"ast": {
|
|
18
|
+
"language": "python",
|
|
19
|
+
"rule": {
|
|
20
|
+
"pattern": "$S.format($$$A)",
|
|
21
|
+
"formatArgs": {
|
|
22
|
+
"style": "brace",
|
|
23
|
+
"string": "S",
|
|
24
|
+
"args": "A",
|
|
25
|
+
"unused": {
|
|
26
|
+
"kind": "keyword_argument"
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
"violation": {
|
|
33
|
+
"anchor": "witness.span",
|
|
34
|
+
"code": "F522",
|
|
35
|
+
"message": "`.format` call has unused named argument(s)",
|
|
36
|
+
"suppress": {
|
|
37
|
+
"noqa": {
|
|
38
|
+
"codes": [
|
|
39
|
+
"F522"
|
|
40
|
+
]
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
]
|
|
46
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"format": "rerail.policy/v1",
|
|
3
|
+
"id": "ruff-f523-string-dot-format-extra-positional-arguments",
|
|
4
|
+
"revision": 1,
|
|
5
|
+
"mode": "steer",
|
|
6
|
+
"description": "Port of Ruff's F523 (string-dot-format-extra-positional-arguments): a `.format` call on a valid format string with a positional argument (not starred; counted by syntactic index, past a starred one too) that no automatic or numbered field reads. `formatArgs` reads the format string receiving `.format` (a str literal with no f/t/b prefix, implicit concatenations joined, escapes decoded, parentheses transparent) with the `braceFormat` grammar (a port of ruff_python_literal's format parser as pyflakes' FormatSummary reads it), and the call's arguments as Ruff's strings.rs does. Ported from the Ruff conformance suite (rerail/conformance/ruff/rules/F523.json at 3f102adcb), with Ruff's `# noqa` honoured as the Ruff CLI honours it.",
|
|
7
|
+
"scope": {
|
|
8
|
+
"include": [
|
|
9
|
+
"**/*"
|
|
10
|
+
],
|
|
11
|
+
"exclude": []
|
|
12
|
+
},
|
|
13
|
+
"clauses": [
|
|
14
|
+
{
|
|
15
|
+
"id": "string-dot-format-extra-positional-arguments",
|
|
16
|
+
"forbid": {
|
|
17
|
+
"ast": {
|
|
18
|
+
"language": "python",
|
|
19
|
+
"rule": {
|
|
20
|
+
"pattern": "$S.format($$$A)",
|
|
21
|
+
"formatArgs": {
|
|
22
|
+
"style": "brace",
|
|
23
|
+
"string": "S",
|
|
24
|
+
"args": "A",
|
|
25
|
+
"unused": {
|
|
26
|
+
"not": {
|
|
27
|
+
"kind": "keyword_argument"
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
"violation": {
|
|
35
|
+
"anchor": "witness.span",
|
|
36
|
+
"code": "F523",
|
|
37
|
+
"message": "`.format` call has unused arguments",
|
|
38
|
+
"suppress": {
|
|
39
|
+
"noqa": {
|
|
40
|
+
"codes": [
|
|
41
|
+
"F523"
|
|
42
|
+
]
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
]
|
|
48
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"format": "rerail.policy/v1",
|
|
3
|
+
"id": "ruff-f524-string-dot-format-missing-arguments",
|
|
4
|
+
"revision": 1,
|
|
5
|
+
"mode": "steer",
|
|
6
|
+
"description": "Port of Ruff's F524 (string-dot-format-missing-arguments): a `.format` call without `*` or `**` on a valid format string with a field (top level or nested in a spec) whose index is past the positional arguments or whose name no keyword argument passes. `formatArgs` reads the format string receiving `.format` (a str literal with no f/t/b prefix, implicit concatenations joined, escapes decoded, parentheses transparent) with the `braceFormat` grammar (a port of ruff_python_literal's format parser as pyflakes' FormatSummary reads it), and the call's arguments as Ruff's strings.rs does. Ported from the Ruff conformance suite (rerail/conformance/ruff/rules/F524.json at 3f102adcb), with Ruff's `# noqa` honoured as the Ruff CLI honours it.",
|
|
7
|
+
"scope": {
|
|
8
|
+
"include": [
|
|
9
|
+
"**/*"
|
|
10
|
+
],
|
|
11
|
+
"exclude": []
|
|
12
|
+
},
|
|
13
|
+
"clauses": [
|
|
14
|
+
{
|
|
15
|
+
"id": "string-dot-format-missing-arguments",
|
|
16
|
+
"forbid": {
|
|
17
|
+
"ast": {
|
|
18
|
+
"language": "python",
|
|
19
|
+
"rule": {
|
|
20
|
+
"pattern": "$S.format($$$A)",
|
|
21
|
+
"formatArgs": {
|
|
22
|
+
"style": "brace",
|
|
23
|
+
"string": "S",
|
|
24
|
+
"args": "A",
|
|
25
|
+
"missing": {
|
|
26
|
+
"kind": "field"
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
"violation": {
|
|
33
|
+
"anchor": "witness.span",
|
|
34
|
+
"code": "F524",
|
|
35
|
+
"message": "`.format` call is missing argument(s) for placeholder(s)",
|
|
36
|
+
"suppress": {
|
|
37
|
+
"noqa": {
|
|
38
|
+
"codes": [
|
|
39
|
+
"F524"
|
|
40
|
+
]
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
]
|
|
46
|
+
}
|