Skip to content

Commit d76ee28

Browse files
authored
Merge pull request #115 from homebysix/ej/tame-islands-start-8km9l
Add automated testing and contribution doc
2 parents d3f1df8 + cfb4fb1 commit d76ee28

22 files changed

Lines changed: 117 additions & 59 deletions

.github/workflows/tests.yml

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
name: Tests
2+
3+
on:
4+
push:
5+
branches: [main]
6+
pull_request:
7+
branches: [main]
8+
9+
jobs:
10+
test:
11+
runs-on: ubuntu-latest
12+
strategy:
13+
fail-fast: false
14+
matrix:
15+
python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"]
16+
17+
steps:
18+
- uses: actions/checkout@v4
19+
20+
- name: Set up Python ${{ matrix.python-version }}
21+
uses: actions/setup-python@v5
22+
with:
23+
python-version: ${{ matrix.python-version }}
24+
25+
- name: Install package
26+
run: |
27+
python -m pip install --upgrade pip
28+
pip install -e .
29+
30+
- name: Run tests
31+
run: python -m unittest discover -s tests -v

.pre-commit-config.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ repos:
1919
rev: v3.21.2
2020
hooks:
2121
- id: pyupgrade
22-
args: ['--py36-plus']
22+
args: ['--py310-plus']
2323
- repo: https://github.com/pycqa/flake8
2424
rev: 7.3.0
2525
hooks:

CONTRIBUTING.md

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
# Contributing
2+
3+
Thanks for considering a contribution!
4+
5+
## Setup
6+
7+
```sh
8+
python3 -m venv .venv
9+
.venv/bin/pip install -e .
10+
.venv/bin/pip install pre-commit
11+
.venv/bin/pre-commit install
12+
```
13+
14+
## Running tests
15+
16+
```sh
17+
.venv/bin/python -m unittest discover -vs tests
18+
```
19+
20+
Tests also run in CI on Python 3.10–3.14. New hooks should ship with tests
21+
in `tests/`.
22+
23+
## Linting and formatting
24+
25+
`pre-commit` runs `black`, `isort`, `flake8`, and `pyupgrade`. Either let
26+
the installed hook handle it on commit, or run it manually:
27+
28+
```sh
29+
.venv/bin/pre-commit run --all-files
30+
```
31+
32+
pre-commit.ci also runs these hooks on every PR.
33+
34+
## Adding a new hook
35+
36+
A new hook needs:
37+
38+
- An entry in `.pre-commit-hooks.yaml`
39+
- An entry point in `setup.py`
40+
- A usage example in `README.md`
41+
- Tests in `tests/`

pre_commit_macadmin_hooks/check_autopkg_recipe_list.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
import argparse
99
import json
1010
import plistlib
11-
from typing import List, Optional
1211
from xml.parsers.expat import ExpatError
1312

1413
import ruamel.yaml
@@ -26,7 +25,7 @@ def build_argument_parser() -> argparse.ArgumentParser:
2625
return parser
2726

2827

29-
def main(argv: Optional[List[str]] = None) -> int:
28+
def main(argv: list[str] | None = None) -> int:
3029
"""Main process."""
3130

3231
# Parse command line arguments.

pre_commit_macadmin_hooks/check_autopkg_recipes.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import os
77
import sys
88
from contextlib import contextmanager
9-
from typing import Any, Dict, List
9+
from typing import Any
1010

1111
from packaging.version import Version
1212

@@ -88,7 +88,7 @@ def build_argument_parser() -> argparse.ArgumentParser:
8888

8989

9090
def validate_recipe_prefix(
91-
recipe: Dict[str, Any], filename: str, prefix: List[str]
91+
recipe: dict[str, Any], filename: str, prefix: list[str]
9292
) -> bool:
9393
"""Verify that the recipe identifier starts with the expected prefix."""
9494

pre_commit_macadmin_hooks/check_git_config_email.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33

44
import argparse
55
import subprocess
6-
from typing import List, Optional
76

87

98
def build_argument_parser() -> argparse.ArgumentParser:
@@ -20,7 +19,7 @@ def build_argument_parser() -> argparse.ArgumentParser:
2019
return parser
2120

2221

23-
def main(argv: Optional[List[str]] = None) -> int:
22+
def main(argv: list[str] | None = None) -> int:
2423
"""Main process."""
2524

2625
# Parse command line arguments.

pre_commit_macadmin_hooks/check_jamf_extension_attributes.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33

44
import argparse
55
import re
6-
from typing import List, Optional
76

87
from pre_commit_macadmin_hooks.util import validate_shebangs
98

@@ -24,7 +23,7 @@ def build_argument_parser() -> argparse.ArgumentParser:
2423
return parser
2524

2625

27-
def main(argv: Optional[List[str]] = None) -> int:
26+
def main(argv: list[str] | None = None) -> int:
2827
"""Main process."""
2928

3029
# Parse command line arguments.

pre_commit_macadmin_hooks/check_jamf_json_manifests.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import argparse
99
import json
1010
from datetime import datetime
11-
from typing import Any, Dict, List, Optional, Tuple
11+
from typing import Any
1212

1313
from pre_commit_macadmin_hooks.util import validate_required_keys
1414

@@ -45,7 +45,7 @@ def build_argument_parser() -> argparse.ArgumentParser:
4545
return parser
4646

4747

48-
def validate_key_types(name: str, manifest: Dict[str, Any], filename: str) -> bool:
48+
def validate_key_types(name: str, manifest: dict[str, Any], filename: str) -> bool:
4949
"""Validation of manifest key types."""
5050

5151
# Manifest keys and their known types. Omitted keys are left unvalidated.
@@ -80,8 +80,8 @@ def validate_key_types(name: str, manifest: Dict[str, Any], filename: str) -> bo
8080

8181

8282
def validate_type(
83-
name: str, property: Dict[str, Any], filename: str
84-
) -> Tuple[bool, Optional[str]]: # noqa: A002
83+
name: str, property: dict[str, Any], filename: str
84+
) -> tuple[bool, str | None]: # noqa: A002
8585
"""Ensure property type keu is present and among expected values."""
8686
passed = True
8787
type_found = None
@@ -102,7 +102,7 @@ def validate_type(
102102

103103

104104
def validate_list_item_types(
105-
name: str, manifest: Dict[str, Any], filename: str
105+
name: str, manifest: dict[str, Any], filename: str
106106
) -> bool:
107107
"""Validation of list member items."""
108108

@@ -131,7 +131,7 @@ def validate_list_item_types(
131131

132132

133133
def validate_default(
134-
name: str, prop: Dict[str, Any], type_found: Optional[str], filename: str
134+
name: str, prop: dict[str, Any], type_found: str | None, filename: str
135135
) -> bool:
136136
"""Ensure that default values have the expected type."""
137137
passed = True
@@ -151,7 +151,7 @@ def validate_default(
151151
return passed
152152

153153

154-
def validate_urls(name: str, prop: Dict[str, Any], filename: str) -> bool:
154+
def validate_urls(name: str, prop: dict[str, Any], filename: str) -> bool:
155155
"""Ensure that URL values are actual URLs."""
156156
passed = True
157157

@@ -167,7 +167,7 @@ def validate_urls(name: str, prop: Dict[str, Any], filename: str) -> bool:
167167
return passed
168168

169169

170-
def validate_properties(properties: Dict[str, Any], filename: str) -> bool:
170+
def validate_properties(properties: dict[str, Any], filename: str) -> bool:
171171
"""Given a list of properties, run validation on their contents."""
172172
passed = True
173173

@@ -206,7 +206,7 @@ def validate_properties(properties: Dict[str, Any], filename: str) -> bool:
206206
return passed
207207

208208

209-
def main(argv: Optional[List[str]] = None) -> int:
209+
def main(argv: list[str] | None = None) -> int:
210210
"""Main process."""
211211

212212
# Parse command line arguments.

pre_commit_macadmin_hooks/check_jamf_profiles.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33

44
import argparse
55
import plistlib
6-
from typing import List, Optional
76
from xml.parsers.expat import ExpatError
87

98

@@ -17,7 +16,7 @@ def build_argument_parser() -> argparse.ArgumentParser:
1716
return parser
1817

1918

20-
def main(argv: Optional[List[str]] = None) -> int:
19+
def main(argv: list[str] | None = None) -> int:
2120
"""Main process."""
2221

2322
# Parse command line arguments.

pre_commit_macadmin_hooks/check_jamf_scripts.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
"""Check Jamf scripts for common issues."""
33

44
import argparse
5-
from typing import List, Optional
65

76
from pre_commit_macadmin_hooks.util import validate_shebangs
87

@@ -23,7 +22,7 @@ def build_argument_parser() -> argparse.ArgumentParser:
2322
return parser
2423

2524

26-
def main(argv: Optional[List[str]] = None) -> int:
25+
def main(argv: list[str] | None = None) -> int:
2726
"""Main process."""
2827

2928
# Parse command line arguments.

0 commit comments

Comments
 (0)