bitwarden_workflow_linter 0.4.4__tar.gz → 0.4.6__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.
Files changed (75) hide show
  1. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/PKG-INFO +1 -1
  2. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/src/bitwarden_workflow_linter/__about__.py +1 -1
  3. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/src/bitwarden_workflow_linter/default_actions.json +5 -0
  4. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/src/bitwarden_workflow_linter/models/step.py +6 -3
  5. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/tests/rules/test_step_approved.py +9 -0
  6. bitwarden_workflow_linter-0.4.6/tests/test_step.py +144 -0
  7. bitwarden_workflow_linter-0.4.4/tests/test_step.py +0 -78
  8. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/.editorconfig +0 -0
  9. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/.gitattributes +0 -0
  10. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/.github/CODEOWNERS +0 -0
  11. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  12. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  13. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/.github/renovate.json +0 -0
  14. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/.github/workflows/_version_type.yml +0 -0
  15. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/.github/workflows/cd.yml +0 -0
  16. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/.github/workflows/ci.yml +0 -0
  17. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/.github/workflows/enforce-labels.yml +0 -0
  18. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/.github/workflows/scan.yml +0 -0
  19. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/.github/workflows/update_actions.yml +0 -0
  20. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/.gitignore +0 -0
  21. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/.husky/pre-commit +0 -0
  22. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/.python-version +0 -0
  23. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/CONTRIBUTING.md +0 -0
  24. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/LICENSE.txt +0 -0
  25. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/Pipfile +0 -0
  26. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/Pipfile.lock +0 -0
  27. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/README.md +0 -0
  28. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/SECURITY.md +0 -0
  29. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/Taskfile.yml +0 -0
  30. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/package-lock.json +0 -0
  31. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/package.json +0 -0
  32. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/pylintrc +0 -0
  33. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/pyproject.toml +0 -0
  34. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/pyproject.toml.tpl +0 -0
  35. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/settings.yaml +0 -0
  36. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/src/bitwarden_workflow_linter/__init__.py +0 -0
  37. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/src/bitwarden_workflow_linter/actions.py +0 -0
  38. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/src/bitwarden_workflow_linter/cli.py +0 -0
  39. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/src/bitwarden_workflow_linter/default_settings.yaml +0 -0
  40. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/src/bitwarden_workflow_linter/lint.py +0 -0
  41. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/src/bitwarden_workflow_linter/load.py +0 -0
  42. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/src/bitwarden_workflow_linter/models/__init__.py +0 -0
  43. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/src/bitwarden_workflow_linter/models/job.py +0 -0
  44. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/src/bitwarden_workflow_linter/models/workflow.py +0 -0
  45. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/src/bitwarden_workflow_linter/rule.py +0 -0
  46. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/src/bitwarden_workflow_linter/rules/__init__.py +0 -0
  47. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/src/bitwarden_workflow_linter/rules/job_environment_prefix.py +0 -0
  48. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/src/bitwarden_workflow_linter/rules/name_capitalized.py +0 -0
  49. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/src/bitwarden_workflow_linter/rules/name_exists.py +0 -0
  50. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/src/bitwarden_workflow_linter/rules/pinned_job_runner.py +0 -0
  51. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/src/bitwarden_workflow_linter/rules/step_approved.py +0 -0
  52. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/src/bitwarden_workflow_linter/rules/step_pinned.py +0 -0
  53. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/src/bitwarden_workflow_linter/rules/underscore_outputs.py +0 -0
  54. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/src/bitwarden_workflow_linter/utils.py +0 -0
  55. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/tests/__init__.py +0 -0
  56. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/tests/conftest.py +0 -0
  57. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/tests/fixtures/test-alt.yml +0 -0
  58. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/tests/fixtures/test-min-incorrect.yaml +0 -0
  59. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/tests/fixtures/test-min.yaml +0 -0
  60. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/tests/fixtures/test-outputs-incorrect.yml +0 -0
  61. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/tests/fixtures/test.yml +0 -0
  62. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/tests/fixtures/test_a.yaml +0 -0
  63. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/tests/rules/__init__.py +0 -0
  64. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/tests/rules/test_job_environment_prefix.py +0 -0
  65. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/tests/rules/test_name_capitalized.py +0 -0
  66. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/tests/rules/test_name_exists.py +0 -0
  67. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/tests/rules/test_pinned_job_runner.py +0 -0
  68. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/tests/rules/test_step_pinned.py +0 -0
  69. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/tests/rules/test_underscore_output.py +0 -0
  70. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/tests/test_job.py +0 -0
  71. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/tests/test_lint.py +0 -0
  72. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/tests/test_load.py +0 -0
  73. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/tests/test_rule.py +0 -0
  74. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/tests/test_utils.py +0 -0
  75. {bitwarden_workflow_linter-0.4.4 → bitwarden_workflow_linter-0.4.6}/tests/test_workflow.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bitwarden_workflow_linter
3
- Version: 0.4.4
3
+ Version: 0.4.6
4
4
  Summary: Custom GitHub Action Workflow Linter
5
5
  Project-URL: Homepage, https://github.com/bitwarden/workflow-linter
6
6
  Project-URL: Issues, https://github.com/bitwarden/workflow-linter/issues
@@ -1,3 +1,3 @@
1
1
  """Metadata for Workflow Linter."""
2
2
 
3
- __version__ = "0.4.4"
3
+ __version__ = "0.4.6"
@@ -374,6 +374,11 @@
374
374
  "sha": "64c70c67f5ebc54d4c7ea09cbe3553322778afd5",
375
375
  "version": "1.1.2"
376
376
  },
377
+ "withastro/action": {
378
+ "name": "withastro/action",
379
+ "sha": "44cbafd43567733e3b007918c6e0711480560516",
380
+ "version": "v3.0.0"
381
+ },
377
382
  "yogevbd/enforce-label-action": {
378
383
  "name": "yogevbd/enforce-label-action",
379
384
  "sha": "a3c219da6b8fa73f6ba62b68ff09c469b3a1c024",
@@ -39,10 +39,13 @@ class Step:
39
39
  new_step.key = idx
40
40
  new_step.job = job
41
41
 
42
- if "uses" in data.ca.items and data.ca.items["uses"][2]:
43
- new_step.uses_comment = data.ca.items["uses"][2].value.replace("\n", "")
42
+ if new_step.uses:
43
+ if "uses" in data.ca.items and data.ca.items["uses"][2]:
44
+ new_step.uses_comment = data.ca.items["uses"][2].value.replace("\n", "")
45
+ new_step.uses_version = new_step.uses_comment.split(" ")[-1]
44
46
  if "@" in new_step.uses:
45
47
  new_step.uses_path, new_step.uses_ref = new_step.uses.split("@")
46
- new_step.uses_version = new_step.uses_comment.split(" ")[-1]
48
+ else:
49
+ new_step.uses_path = new_step.uses
47
50
 
48
51
  return new_step
@@ -70,6 +70,11 @@ jobs:
70
70
  - name: Checkout Branch
71
71
  uses: joseph-flinn/action-DNE@main
72
72
 
73
+ - name: Checkout Branch with Ref
74
+ uses: notbitwarden/subfolder/action-DNE@main
75
+ with:
76
+ ref: main
77
+
73
78
  """
74
79
  return WorkflowBuilder.build(workflow=yaml.load(workflow), from_file=False)
75
80
 
@@ -98,6 +103,10 @@ def test_rule_on_incorrect_workflow(rule, incorrect_workflow):
98
103
  assert result is False
99
104
  assert "New Action detected" in message
100
105
 
106
+ result, message = rule.fn(incorrect_workflow.jobs["job-key"].steps[1])
107
+ assert result is False
108
+ assert "New Action detected" in message
109
+
101
110
 
102
111
  def test_fail_compatibility(rule, correct_workflow):
103
112
  finding = rule.execute(correct_workflow)
@@ -0,0 +1,144 @@
1
+ """Test src/bitwarden_workflow_linter/models/step.py."""
2
+
3
+ import json
4
+ import pytest
5
+
6
+ from ruamel.yaml import YAML
7
+
8
+ from src.bitwarden_workflow_linter.models.step import Step
9
+
10
+
11
+ @pytest.fixture(name="default_step")
12
+ def fixture_default_step():
13
+ step_str = """\
14
+ name: Default Step
15
+ run: echo "test"
16
+ """
17
+ yaml = YAML()
18
+ step_yaml = yaml.load(step_str)
19
+ return Step.init(0, "default", step_yaml)
20
+
21
+
22
+ @pytest.fixture(name="uses_step")
23
+ def fixture_uses_step():
24
+ step_str = """\
25
+ name: Download Artifacts
26
+ uses: bitwarden/download-artifacts@main # v1.0.0
27
+ with:
28
+ workflow: upload-test-artifacts.yml
29
+ artifacts: artifact
30
+ path: artifact
31
+ branch: main
32
+
33
+ """
34
+ yaml = YAML()
35
+ step_yaml = yaml.load(step_str)
36
+ return Step.init(0, "default", step_yaml)
37
+
38
+
39
+ @pytest.fixture(name="uses_step_no_comments")
40
+ def fixture_uses_step_no_comments():
41
+ step_str = """\
42
+ name: Download Artifacts
43
+ uses: bitwarden/download-artifacts@main
44
+ with:
45
+ workflow: upload-test-artifacts.yml
46
+ artifacts: artifact
47
+ path: artifact
48
+ branch: main
49
+
50
+ """
51
+ yaml = YAML()
52
+ step_yaml = yaml.load(step_str)
53
+ return Step.init(0, "default", step_yaml)
54
+
55
+
56
+ @pytest.fixture(name="uses_step_no_ref")
57
+ def fixture_uses_step_no_ref():
58
+ step_str = """\
59
+ name: Run Local Workflow
60
+ uses: ./.github/workflows/_local.yml
61
+ """
62
+ yaml = YAML()
63
+ step_yaml = yaml.load(step_str)
64
+ return Step.init(0, "default", step_yaml)
65
+
66
+
67
+ @pytest.fixture(name="uses_step_no_ref_with_comments")
68
+ def fixture_uses_step_no_ref_with_comments():
69
+ step_str = """\
70
+ name: Run Local Workflow
71
+ uses: ./.github/workflows/_local.yml # A comment
72
+ """
73
+ yaml = YAML()
74
+ step_yaml = yaml.load(step_str)
75
+ return Step.init(0, "default", step_yaml)
76
+
77
+
78
+ def test_step_default(default_step):
79
+ assert default_step.key == 0
80
+ assert default_step.job == "default"
81
+ assert default_step.name == "Default Step"
82
+ assert default_step.env is None
83
+ assert default_step.uses is None
84
+ assert default_step.uses_with is None
85
+ assert default_step.run == 'echo "test"'
86
+
87
+
88
+ def test_step_no_keyword_field(default_step):
89
+ assert default_step.uses_with is None
90
+ assert "uses_with" not in default_step.to_json()
91
+
92
+
93
+ def test_step_extra_kwargs(default_step):
94
+ with pytest.raises(Exception):
95
+ assert default_step.extra == "test"
96
+
97
+
98
+ def test_step_keyword_field(uses_step):
99
+ expected_response = {
100
+ "workflow": "upload-test-artifacts.yml",
101
+ "artifacts": "artifact",
102
+ "path": "artifact",
103
+ "branch": "main",
104
+ }
105
+
106
+ step_json = uses_step.to_json()
107
+ assert uses_step.key == 0
108
+ assert "uses_with" not in step_json
109
+ assert "with" in step_json
110
+ assert json.loads(uses_step.to_json())["with"] == expected_response
111
+
112
+
113
+ def test_step_comment(uses_step):
114
+ assert uses_step.key == 0
115
+ assert uses_step.job == "default"
116
+ assert uses_step.uses_ref == "main"
117
+ assert uses_step.uses_version == "v1.0.0"
118
+ assert uses_step.uses_comment == "# v1.0.0"
119
+
120
+
121
+ def test_step_no_comments(uses_step_no_comments):
122
+ assert uses_step_no_comments.key == 0
123
+ assert uses_step_no_comments.job == "default"
124
+ assert uses_step_no_comments.uses_ref == "main"
125
+ assert uses_step_no_comments.uses_version is None
126
+ assert uses_step_no_comments.uses_comment is None
127
+
128
+
129
+ def test_step_no_ref(uses_step_no_ref):
130
+ assert uses_step_no_ref.key == 0
131
+ assert uses_step_no_ref.job == "default"
132
+ assert uses_step_no_ref.uses_ref is None
133
+ assert uses_step_no_ref.uses_version is None
134
+ assert uses_step_no_ref.uses_comment is None
135
+
136
+
137
+ def test_step_no_ref_with_comments(uses_step_no_ref_with_comments):
138
+ assert uses_step_no_ref_with_comments.key == 0
139
+ assert uses_step_no_ref_with_comments.job == "default"
140
+ assert uses_step_no_ref_with_comments.uses_ref is None
141
+ assert (
142
+ uses_step_no_ref_with_comments.uses_version == "comment"
143
+ ) # We are not currently validating the version matches a specific format
144
+ assert uses_step_no_ref_with_comments.uses_comment == "# A comment"
@@ -1,78 +0,0 @@
1
- """Test src/bitwarden_workflow_linter/models/step.py."""
2
-
3
- import json
4
- import pytest
5
-
6
- from ruamel.yaml import YAML
7
-
8
- from src.bitwarden_workflow_linter.models.step import Step
9
-
10
-
11
- @pytest.fixture(name="default_step")
12
- def fixture_default_step():
13
- step_str = """\
14
- name: Default Step
15
- run: echo "test"
16
- """
17
- yaml = YAML()
18
- step_yaml = yaml.load(step_str)
19
- return Step.init(0, "default", step_yaml)
20
-
21
-
22
- @pytest.fixture(name="uses_step")
23
- def fixture_uses_step():
24
- step_str = """\
25
- name: Download Artifacts
26
- uses: bitwarden/download-artifacts@main # v1.0.0
27
- with:
28
- workflow: upload-test-artifacts.yml
29
- artifacts: artifact
30
- path: artifact
31
- branch: main
32
-
33
- """
34
- yaml = YAML()
35
- step_yaml = yaml.load(step_str)
36
- return Step.init(0, "default", step_yaml)
37
-
38
-
39
- def test_step_default(default_step):
40
- assert default_step.key == 0
41
- assert default_step.job == "default"
42
- assert default_step.name == "Default Step"
43
- assert default_step.env is None
44
- assert default_step.uses is None
45
- assert default_step.uses_with is None
46
- assert default_step.run == 'echo "test"'
47
-
48
-
49
- def test_step_no_keyword_field(default_step):
50
- assert default_step.uses_with is None
51
- assert "uses_with" not in default_step.to_json()
52
-
53
-
54
- def test_step_extra_kwargs(default_step):
55
- with pytest.raises(Exception):
56
- assert default_step.extra == "test"
57
-
58
-
59
- def test_step_keyword_field(uses_step):
60
- expected_response = {
61
- "workflow": "upload-test-artifacts.yml",
62
- "artifacts": "artifact",
63
- "path": "artifact",
64
- "branch": "main",
65
- }
66
-
67
- step_json = uses_step.to_json()
68
- assert uses_step.key == 0
69
- assert "uses_with" not in step_json
70
- assert "with" in step_json
71
- assert json.loads(uses_step.to_json())["with"] == expected_response
72
-
73
-
74
- def test_step_comment(uses_step):
75
- assert uses_step.key == 0
76
- assert uses_step.job == "default"
77
- assert uses_step.uses_comment is not None
78
- assert uses_step.uses_comment == "# v1.0.0"