masster 0.5.26__tar.gz → 0.5.27__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.
Potentially problematic release.
This version of masster might be problematic. Click here for more details.
- {masster-0.5.26 → masster-0.5.27}/PKG-INFO +2 -1
- {masster-0.5.26 → masster-0.5.27}/pyproject.toml +31 -13
- masster-0.5.26/.github/workflows/publish.yml +0 -174
- masster-0.5.26/.github/workflows/security.yml +0 -88
- masster-0.5.26/.github/workflows/test.yml +0 -164
- masster-0.5.26/.pre-commit-config.yaml +0 -96
- masster-0.5.26/Makefile +0 -76
- masster-0.5.26/demo/example_batch_process.py +0 -190
- masster-0.5.26/demo/example_sample_process.py +0 -24
- masster-0.5.26/tox.ini +0 -61
- masster-0.5.26/uv.lock +0 -3629
- {masster-0.5.26 → masster-0.5.27}/.gitignore +0 -0
- {masster-0.5.26 → masster-0.5.27}/LICENSE +0 -0
- {masster-0.5.26 → masster-0.5.27}/README.md +0 -0
- {masster-0.5.26 → masster-0.5.27}/THIRD_PARTY_NOTICES.md +0 -0
- {masster-0.5.26 → masster-0.5.27}/src/masster/__init__.py +0 -0
- {masster-0.5.26 → masster-0.5.27}/src/masster/_version.py +0 -0
- {masster-0.5.26 → masster-0.5.27}/src/masster/chromatogram.py +0 -0
- {masster-0.5.26 → masster-0.5.27}/src/masster/data/libs/aa.csv +0 -0
- {masster-0.5.26 → masster-0.5.27}/src/masster/data/libs/ccm.csv +0 -0
- {masster-0.5.26 → masster-0.5.27}/src/masster/data/libs/urine.csv +0 -0
- {masster-0.5.26 → masster-0.5.27}/src/masster/data/wiff/2025_01_14_VW_7600_LpMx_DBS_CID_2min_TOP15_030msecMS1_005msecReac_CE35_DBS-ON_3.timeseries.data +0 -0
- {masster-0.5.26 → masster-0.5.27}/src/masster/data/wiff/2025_01_14_VW_7600_LpMx_DBS_CID_2min_TOP15_030msecMS1_005msecReac_CE35_DBS-ON_3.wiff +0 -0
- {masster-0.5.26 → masster-0.5.27}/src/masster/data/wiff/2025_01_14_VW_7600_LpMx_DBS_CID_2min_TOP15_030msecMS1_005msecReac_CE35_DBS-ON_3.wiff.scan +0 -0
- {masster-0.5.26 → masster-0.5.27}/src/masster/data/wiff/2025_01_14_VW_7600_LpMx_DBS_CID_2min_TOP15_030msecMS1_005msecReac_CE35_DBS-ON_3.wiff2 +0 -0
- {masster-0.5.26 → masster-0.5.27}/src/masster/lib/__init__.py +0 -0
- {masster-0.5.26 → masster-0.5.27}/src/masster/lib/lib.py +0 -0
- {masster-0.5.26 → masster-0.5.27}/src/masster/logger.py +0 -0
- {masster-0.5.26 → masster-0.5.27}/src/masster/sample/__init__.py +0 -0
- {masster-0.5.26 → masster-0.5.27}/src/masster/sample/adducts.py +0 -0
- {masster-0.5.26 → masster-0.5.27}/src/masster/sample/defaults/__init__.py +0 -0
- {masster-0.5.26 → masster-0.5.27}/src/masster/sample/defaults/find_adducts_def.py +0 -0
- {masster-0.5.26 → masster-0.5.27}/src/masster/sample/defaults/find_features_def.py +0 -0
- {masster-0.5.26 → masster-0.5.27}/src/masster/sample/defaults/find_ms2_def.py +0 -0
- {masster-0.5.26 → masster-0.5.27}/src/masster/sample/defaults/get_spectrum_def.py +0 -0
- {masster-0.5.26 → masster-0.5.27}/src/masster/sample/defaults/sample_def.py +0 -0
- {masster-0.5.26 → masster-0.5.27}/src/masster/sample/h5.py +0 -0
- {masster-0.5.26 → masster-0.5.27}/src/masster/sample/helpers.py +0 -0
- {masster-0.5.26 → masster-0.5.27}/src/masster/sample/lib.py +0 -0
- {masster-0.5.26 → masster-0.5.27}/src/masster/sample/load.py +0 -0
- {masster-0.5.26 → masster-0.5.27}/src/masster/sample/parameters.py +0 -0
- {masster-0.5.26 → masster-0.5.27}/src/masster/sample/plot.py +0 -0
- {masster-0.5.26 → masster-0.5.27}/src/masster/sample/processing.py +0 -0
- {masster-0.5.26 → masster-0.5.27}/src/masster/sample/quant.py +0 -0
- {masster-0.5.26 → masster-0.5.27}/src/masster/sample/sample.py +0 -0
- {masster-0.5.26 → masster-0.5.27}/src/masster/sample/sample5_schema.json +0 -0
- {masster-0.5.26 → masster-0.5.27}/src/masster/sample/save.py +0 -0
- {masster-0.5.26 → masster-0.5.27}/src/masster/sample/sciex.py +0 -0
- {masster-0.5.26 → masster-0.5.27}/src/masster/sample/thermo.py +0 -0
- {masster-0.5.26 → masster-0.5.27}/src/masster/spectrum.py +0 -0
- {masster-0.5.26 → masster-0.5.27}/src/masster/study/__init__.py +0 -0
- {masster-0.5.26 → masster-0.5.27}/src/masster/study/analysis.py +0 -0
- {masster-0.5.26 → masster-0.5.27}/src/masster/study/defaults/__init__.py +0 -0
- {masster-0.5.26 → masster-0.5.27}/src/masster/study/defaults/align_def.py +0 -0
- {masster-0.5.26 → masster-0.5.27}/src/masster/study/defaults/export_def.py +0 -0
- {masster-0.5.26 → masster-0.5.27}/src/masster/study/defaults/fill_def.py +0 -0
- {masster-0.5.26 → masster-0.5.27}/src/masster/study/defaults/find_consensus_def.py +0 -0
- {masster-0.5.26 → masster-0.5.27}/src/masster/study/defaults/find_ms2_def.py +0 -0
- {masster-0.5.26 → masster-0.5.27}/src/masster/study/defaults/identify_def.py +0 -0
- {masster-0.5.26 → masster-0.5.27}/src/masster/study/defaults/integrate_chrom_def.py +0 -0
- {masster-0.5.26 → masster-0.5.27}/src/masster/study/defaults/integrate_def.py +0 -0
- {masster-0.5.26 → masster-0.5.27}/src/masster/study/defaults/merge_def.py +0 -0
- {masster-0.5.26 → masster-0.5.27}/src/masster/study/defaults/study_def.py +0 -0
- {masster-0.5.26 → masster-0.5.27}/src/masster/study/export.py +0 -0
- {masster-0.5.26 → masster-0.5.27}/src/masster/study/h5.py +0 -0
- {masster-0.5.26 → masster-0.5.27}/src/masster/study/helpers.py +0 -0
- {masster-0.5.26 → masster-0.5.27}/src/masster/study/id.py +0 -0
- {masster-0.5.26 → masster-0.5.27}/src/masster/study/importers.py +0 -0
- {masster-0.5.26 → masster-0.5.27}/src/masster/study/load.py +0 -0
- {masster-0.5.26 → masster-0.5.27}/src/masster/study/merge.py +0 -0
- {masster-0.5.26 → masster-0.5.27}/src/masster/study/parameters.py +0 -0
- {masster-0.5.26 → masster-0.5.27}/src/masster/study/plot.py +0 -0
- {masster-0.5.26 → masster-0.5.27}/src/masster/study/processing.py +0 -0
- {masster-0.5.26 → masster-0.5.27}/src/masster/study/save.py +0 -0
- {masster-0.5.26 → masster-0.5.27}/src/masster/study/study.py +0 -0
- {masster-0.5.26 → masster-0.5.27}/src/masster/study/study5_schema.json +0 -0
- {masster-0.5.26 → masster-0.5.27}/src/masster/wizard/__init__.py +0 -0
- {masster-0.5.26 → masster-0.5.27}/src/masster/wizard/wizard.py +0 -0
- {masster-0.5.26 → masster-0.5.27}/tests/conftest.py +0 -0
- {masster-0.5.26 → masster-0.5.27}/tests/test_chromatogram.py +0 -0
- {masster-0.5.26 → masster-0.5.27}/tests/test_defaults.py +0 -0
- {masster-0.5.26 → masster-0.5.27}/tests/test_imports.py +0 -0
- {masster-0.5.26 → masster-0.5.27}/tests/test_integration.py +0 -0
- {masster-0.5.26 → masster-0.5.27}/tests/test_logger.py +0 -0
- {masster-0.5.26 → masster-0.5.27}/tests/test_parameters.py +0 -0
- {masster-0.5.26 → masster-0.5.27}/tests/test_sample.py +0 -0
- {masster-0.5.26 → masster-0.5.27}/tests/test_spectrum.py +0 -0
- {masster-0.5.26 → masster-0.5.27}/tests/test_study.py +0 -0
- {masster-0.5.26 → masster-0.5.27}/tests/test_version.py +0 -0
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: masster
|
|
3
|
-
Version: 0.5.
|
|
3
|
+
Version: 0.5.27
|
|
4
4
|
Summary: Mass spectrometry data analysis package
|
|
5
5
|
Project-URL: homepage, https://github.com/zamboni-lab/masster
|
|
6
6
|
Project-URL: repository, https://github.com/zamboni-lab/masster
|
|
7
7
|
Project-URL: documentation, https://github.com/zamboni-lab/masster#readme
|
|
8
|
+
Project-URL: Third-Party Licenses, https://github.com/zamboni-lab/masster/blob/main/THIRD_PARTY_NOTICES.md
|
|
8
9
|
Author: Zamboni Lab
|
|
9
10
|
License: GNU AFFERO GENERAL PUBLIC LICENSE
|
|
10
11
|
Version 3, 19 November 2007
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
|
|
2
2
|
[project]
|
|
3
3
|
name = "masster"
|
|
4
|
-
version = "0.5.
|
|
4
|
+
version = "0.5.27"
|
|
5
5
|
description = "Mass spectrometry data analysis package"
|
|
6
6
|
authors = [
|
|
7
7
|
{ name = "Zamboni Lab" }
|
|
@@ -25,6 +25,7 @@ classifiers = [
|
|
|
25
25
|
urls.homepage = "https://github.com/zamboni-lab/masster"
|
|
26
26
|
urls.repository = "https://github.com/zamboni-lab/masster"
|
|
27
27
|
urls.documentation = "https://github.com/zamboni-lab/masster#readme"
|
|
28
|
+
urls."Third-Party Licenses" = "https://github.com/zamboni-lab/masster/blob/main/THIRD_PARTY_NOTICES.md"
|
|
28
29
|
dependencies = [
|
|
29
30
|
"alpharaw>=0.4.8",
|
|
30
31
|
"bokeh>=3.7.3",
|
|
@@ -83,6 +84,23 @@ masster-version = "masster._version:main"
|
|
|
83
84
|
requires = ["hatchling>=1.18.0"]
|
|
84
85
|
build-backend = "hatchling.build"
|
|
85
86
|
|
|
87
|
+
# Hatchling configuration - include additional files in distribution
|
|
88
|
+
[tool.hatch.build.targets.sdist]
|
|
89
|
+
include = [
|
|
90
|
+
"/src",
|
|
91
|
+
"/tests",
|
|
92
|
+
"/LICENSE",
|
|
93
|
+
"/README.md",
|
|
94
|
+
"/THIRD_PARTY_NOTICES.md",
|
|
95
|
+
"/pyproject.toml",
|
|
96
|
+
]
|
|
97
|
+
|
|
98
|
+
[tool.hatch.build.targets.wheel]
|
|
99
|
+
packages = ["src/masster"]
|
|
100
|
+
include = [
|
|
101
|
+
"/THIRD_PARTY_NOTICES.md",
|
|
102
|
+
]
|
|
103
|
+
|
|
86
104
|
# Testing configuration
|
|
87
105
|
[tool.pytest.ini_options]
|
|
88
106
|
testpaths = ["tests"]
|
|
@@ -132,18 +150,18 @@ exclude_lines = [
|
|
|
132
150
|
line-length = 88
|
|
133
151
|
target-version = ['py311']
|
|
134
152
|
include = '\.pyi?$'
|
|
135
|
-
extend-exclude = '''
|
|
136
|
-
/(
|
|
137
|
-
# directories
|
|
138
|
-
\.eggs
|
|
139
|
-
| \.git
|
|
140
|
-
| \.hg
|
|
141
|
-
| \.mypy_cache
|
|
142
|
-
| \.tox
|
|
143
|
-
| \.venv
|
|
144
|
-
| build
|
|
145
|
-
| dist
|
|
146
|
-
)/
|
|
153
|
+
extend-exclude = '''
|
|
154
|
+
/(
|
|
155
|
+
# directories
|
|
156
|
+
\.eggs
|
|
157
|
+
| \.git
|
|
158
|
+
| \.hg
|
|
159
|
+
| \.mypy_cache
|
|
160
|
+
| \.tox
|
|
161
|
+
| \.venv
|
|
162
|
+
| build
|
|
163
|
+
| dist
|
|
164
|
+
)/
|
|
147
165
|
'''
|
|
148
166
|
|
|
149
167
|
# MyPy configuration
|
|
@@ -1,174 +0,0 @@
|
|
|
1
|
-
name: Create release and Publish to PyPI
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
workflow_dispatch:
|
|
5
|
-
inputs:
|
|
6
|
-
version:
|
|
7
|
-
description: 'Version to release (e.g., v1.0.0)'
|
|
8
|
-
required: true
|
|
9
|
-
type: string
|
|
10
|
-
test_pypi:
|
|
11
|
-
description: 'Publish to Test PyPI instead of PyPI'
|
|
12
|
-
required: false
|
|
13
|
-
default: false
|
|
14
|
-
type: boolean
|
|
15
|
-
|
|
16
|
-
jobs:
|
|
17
|
-
create-release:
|
|
18
|
-
runs-on: ubuntu-latest
|
|
19
|
-
steps:
|
|
20
|
-
- uses: actions/checkout@v4
|
|
21
|
-
with:
|
|
22
|
-
fetch-depth: 0
|
|
23
|
-
|
|
24
|
-
- name: Set up Python
|
|
25
|
-
uses: actions/setup-python@v5
|
|
26
|
-
with:
|
|
27
|
-
python-version: "3.11"
|
|
28
|
-
|
|
29
|
-
- name: Update version in pyproject.toml
|
|
30
|
-
run: |
|
|
31
|
-
# Remove 'v' prefix if present
|
|
32
|
-
VERSION="${{ github.event.inputs.version }}"
|
|
33
|
-
VERSION=${VERSION#v}
|
|
34
|
-
|
|
35
|
-
# Update version in pyproject.toml
|
|
36
|
-
sed -i "s/^version = \".*\"/version = \"$VERSION\"/" pyproject.toml
|
|
37
|
-
|
|
38
|
-
# Verify the change
|
|
39
|
-
echo "Updated pyproject.toml version:"
|
|
40
|
-
grep "^version = " pyproject.toml
|
|
41
|
-
|
|
42
|
-
- name: Update version in _version.py
|
|
43
|
-
run: |
|
|
44
|
-
# Remove 'v' prefix if present
|
|
45
|
-
VERSION="${{ github.event.inputs.version }}"
|
|
46
|
-
VERSION=${VERSION#v}
|
|
47
|
-
|
|
48
|
-
# Update version in _version.py
|
|
49
|
-
sed -i "s/__version__ = \".*\"/__version__ = \"$VERSION\"/" src/masster/_version.py
|
|
50
|
-
|
|
51
|
-
# Verify the change
|
|
52
|
-
echo "Updated _version.py:"
|
|
53
|
-
grep "__version__ = " src/masster/_version.py
|
|
54
|
-
|
|
55
|
-
- name: Commit version updates
|
|
56
|
-
run: |
|
|
57
|
-
git config --local user.email "action@github.com"
|
|
58
|
-
git config --local user.name "GitHub Action"
|
|
59
|
-
git add pyproject.toml src/masster/_version.py
|
|
60
|
-
git commit -m "Update version to ${{ github.event.inputs.version }}" || echo "No changes to commit"
|
|
61
|
-
git push
|
|
62
|
-
|
|
63
|
-
- name: Create Release
|
|
64
|
-
id: create-release
|
|
65
|
-
uses: softprops/action-gh-release@v1
|
|
66
|
-
with:
|
|
67
|
-
tag_name: ${{ github.event.inputs.version }}
|
|
68
|
-
name: Release ${{ github.event.inputs.version }}
|
|
69
|
-
draft: false
|
|
70
|
-
prerelease: false
|
|
71
|
-
generate_release_notes: true
|
|
72
|
-
env:
|
|
73
|
-
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
74
|
-
|
|
75
|
-
build:
|
|
76
|
-
needs: create-release
|
|
77
|
-
runs-on: ubuntu-latest
|
|
78
|
-
steps:
|
|
79
|
-
- uses: actions/checkout@v4
|
|
80
|
-
with:
|
|
81
|
-
fetch-depth: 0
|
|
82
|
-
|
|
83
|
-
- name: Pull latest changes
|
|
84
|
-
run: git pull origin ${{ github.ref_name }}
|
|
85
|
-
|
|
86
|
-
- name: Verify version synchronization
|
|
87
|
-
run: |
|
|
88
|
-
echo "Checking version synchronization..."
|
|
89
|
-
PYPROJECT_VERSION=$(grep "^version = " pyproject.toml | sed 's/version = "\(.*\)"/\1/')
|
|
90
|
-
VERSION_PY=$(grep "__version__ = " src/masster/_version.py | sed 's/__version__ = "\(.*\)"/\1/')
|
|
91
|
-
INPUT_VERSION="${{ github.event.inputs.version }}"
|
|
92
|
-
INPUT_VERSION=${INPUT_VERSION#v}
|
|
93
|
-
|
|
94
|
-
echo "Input version: $INPUT_VERSION"
|
|
95
|
-
echo "pyproject.toml version: $PYPROJECT_VERSION"
|
|
96
|
-
echo "_version.py version: $VERSION_PY"
|
|
97
|
-
|
|
98
|
-
if [ "$PYPROJECT_VERSION" != "$INPUT_VERSION" ] || [ "$VERSION_PY" != "$INPUT_VERSION" ]; then
|
|
99
|
-
echo "Version mismatch detected!"
|
|
100
|
-
exit 1
|
|
101
|
-
fi
|
|
102
|
-
echo "All versions synchronized correctly!"
|
|
103
|
-
|
|
104
|
-
- name: Set up Python
|
|
105
|
-
uses: actions/setup-python@v5
|
|
106
|
-
with:
|
|
107
|
-
python-version: "3.11"
|
|
108
|
-
|
|
109
|
-
- name: Install UV
|
|
110
|
-
uses: astral-sh/setup-uv@v3
|
|
111
|
-
|
|
112
|
-
- name: Install dependencies
|
|
113
|
-
run: |
|
|
114
|
-
uv sync --all-extras --dev
|
|
115
|
-
|
|
116
|
-
- name: Run tests
|
|
117
|
-
run: |
|
|
118
|
-
uv run pytest tests/ -v
|
|
119
|
-
|
|
120
|
-
- name: Build package
|
|
121
|
-
run: |
|
|
122
|
-
uv build
|
|
123
|
-
|
|
124
|
-
- name: Check package
|
|
125
|
-
run: |
|
|
126
|
-
uv run twine check dist/*
|
|
127
|
-
|
|
128
|
-
- name: Upload build artifacts
|
|
129
|
-
uses: actions/upload-artifact@v4
|
|
130
|
-
with:
|
|
131
|
-
name: dist
|
|
132
|
-
path: dist/
|
|
133
|
-
|
|
134
|
-
publish-test-pypi:
|
|
135
|
-
needs: build
|
|
136
|
-
runs-on: ubuntu-latest
|
|
137
|
-
if: github.event.inputs.test_pypi == 'true'
|
|
138
|
-
environment:
|
|
139
|
-
name: testpypi
|
|
140
|
-
url: https://test.pypi.org/p/masster
|
|
141
|
-
permissions:
|
|
142
|
-
id-token: write
|
|
143
|
-
|
|
144
|
-
steps:
|
|
145
|
-
- name: Download build artifacts
|
|
146
|
-
uses: actions/download-artifact@v4
|
|
147
|
-
with:
|
|
148
|
-
name: dist
|
|
149
|
-
path: dist/
|
|
150
|
-
|
|
151
|
-
- name: Publish to Test PyPI
|
|
152
|
-
uses: pypa/gh-action-pypi-publish@release/v1
|
|
153
|
-
with:
|
|
154
|
-
repository-url: https://test.pypi.org/legacy/
|
|
155
|
-
|
|
156
|
-
publish-pypi:
|
|
157
|
-
needs: build
|
|
158
|
-
runs-on: ubuntu-latest
|
|
159
|
-
if: github.event.inputs.test_pypi != 'true'
|
|
160
|
-
environment:
|
|
161
|
-
name: pypi
|
|
162
|
-
url: https://pypi.org/p/masster
|
|
163
|
-
permissions:
|
|
164
|
-
id-token: write
|
|
165
|
-
|
|
166
|
-
steps:
|
|
167
|
-
- name: Download build artifacts
|
|
168
|
-
uses: actions/download-artifact@v4
|
|
169
|
-
with:
|
|
170
|
-
name: dist
|
|
171
|
-
path: dist/
|
|
172
|
-
|
|
173
|
-
- name: Publish to PyPI
|
|
174
|
-
uses: pypa/gh-action-pypi-publish@release/v1
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
name: Security Scan
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
workflow_dispatch:
|
|
5
|
-
inputs:
|
|
6
|
-
scan_type:
|
|
7
|
-
description: 'Type of security scan to run'
|
|
8
|
-
required: false
|
|
9
|
-
default: 'all'
|
|
10
|
-
type: choice
|
|
11
|
-
options:
|
|
12
|
-
- all
|
|
13
|
-
- safety-only
|
|
14
|
-
- bandit-only
|
|
15
|
-
upload_reports:
|
|
16
|
-
description: 'Upload security reports as artifacts'
|
|
17
|
-
required: false
|
|
18
|
-
default: true
|
|
19
|
-
type: boolean
|
|
20
|
-
schedule:
|
|
21
|
-
- cron: '0 3 * * 1' # Weekly on Monday at 3 AM UTC
|
|
22
|
-
|
|
23
|
-
jobs:
|
|
24
|
-
security:
|
|
25
|
-
runs-on: ubuntu-latest
|
|
26
|
-
steps:
|
|
27
|
-
- uses: actions/checkout@v4
|
|
28
|
-
|
|
29
|
-
- name: Set up Python
|
|
30
|
-
uses: actions/setup-python@v5
|
|
31
|
-
with:
|
|
32
|
-
python-version: "3.11"
|
|
33
|
-
|
|
34
|
-
- name: Install UV
|
|
35
|
-
uses: astral-sh/setup-uv@v3
|
|
36
|
-
|
|
37
|
-
- name: Install dependencies
|
|
38
|
-
run: |
|
|
39
|
-
uv sync --all-extras --dev
|
|
40
|
-
|
|
41
|
-
- name: Run safety check
|
|
42
|
-
if: github.event_name == 'schedule' || github.event.inputs.scan_type == 'all' || github.event.inputs.scan_type == 'safety-only'
|
|
43
|
-
run: |
|
|
44
|
-
echo "Running Safety security scan..."
|
|
45
|
-
uv run safety check --json --output safety-report.json || true
|
|
46
|
-
echo "Safety scan completed. Check safety-report.json for results."
|
|
47
|
-
|
|
48
|
-
- name: Run bandit security check
|
|
49
|
-
if: github.event_name == 'schedule' || github.event.inputs.scan_type == 'all' || github.event.inputs.scan_type == 'bandit-only'
|
|
50
|
-
run: |
|
|
51
|
-
echo "Running Bandit security scan..."
|
|
52
|
-
uv run bandit -r src/masster -f json -o bandit-report.json || true
|
|
53
|
-
echo "Bandit scan completed. Check bandit-report.json for results."
|
|
54
|
-
|
|
55
|
-
- name: Display scan summary
|
|
56
|
-
run: |
|
|
57
|
-
echo "=== Security Scan Summary ==="
|
|
58
|
-
if [ "${{ github.event_name }}" = "schedule" ]; then
|
|
59
|
-
echo "Scan type: all (scheduled run)"
|
|
60
|
-
else
|
|
61
|
-
echo "Scan type: ${{ github.event.inputs.scan_type || 'all' }}"
|
|
62
|
-
fi
|
|
63
|
-
|
|
64
|
-
if [[ ("${{ github.event_name }}" == "schedule") || ("${{ github.event.inputs.scan_type }}" == "all" || "${{ github.event.inputs.scan_type }}" == "safety-only") ]] && [ -f safety-report.json ]; then
|
|
65
|
-
echo "Safety report generated: safety-report.json"
|
|
66
|
-
# Show summary if available
|
|
67
|
-
if command -v jq &> /dev/null && [ -s safety-report.json ]; then
|
|
68
|
-
echo "Safety vulnerabilities found: $(jq '.vulnerabilities | length' safety-report.json 2>/dev/null || echo 'Unable to parse')"
|
|
69
|
-
fi
|
|
70
|
-
fi
|
|
71
|
-
|
|
72
|
-
if [[ ("${{ github.event_name }}" == "schedule") || ("${{ github.event.inputs.scan_type }}" == "all" || "${{ github.event.inputs.scan_type }}" == "bandit-only") ]] && [ -f bandit-report.json ]; then
|
|
73
|
-
echo "Bandit report generated: bandit-report.json"
|
|
74
|
-
# Show summary if available
|
|
75
|
-
if command -v jq &> /dev/null && [ -s bandit-report.json ]; then
|
|
76
|
-
echo "Bandit issues found: $(jq '.results | length' bandit-report.json 2>/dev/null || echo 'Unable to parse')"
|
|
77
|
-
fi
|
|
78
|
-
fi
|
|
79
|
-
|
|
80
|
-
- name: Upload security reports
|
|
81
|
-
if: github.event_name == 'schedule' || github.event.inputs.upload_reports == 'true'
|
|
82
|
-
uses: actions/upload-artifact@v4
|
|
83
|
-
with:
|
|
84
|
-
name: security-reports-${{ github.run_number }}
|
|
85
|
-
path: |
|
|
86
|
-
safety-report.json
|
|
87
|
-
bandit-report.json
|
|
88
|
-
retention-days: 30
|
|
@@ -1,164 +0,0 @@
|
|
|
1
|
-
name: Test Suite
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
workflow_dispatch:
|
|
5
|
-
inputs:
|
|
6
|
-
run_all_tests:
|
|
7
|
-
description: 'Run tests on all OS and Python versions'
|
|
8
|
-
required: false
|
|
9
|
-
default: true
|
|
10
|
-
type: boolean
|
|
11
|
-
target_os:
|
|
12
|
-
description: 'Target OS for testing (if not running all)'
|
|
13
|
-
required: false
|
|
14
|
-
default: 'ubuntu-latest'
|
|
15
|
-
type: choice
|
|
16
|
-
options:
|
|
17
|
-
- ubuntu-latest
|
|
18
|
-
- windows-latest
|
|
19
|
-
- macos-latest
|
|
20
|
-
python_version:
|
|
21
|
-
description: 'Python version for testing (if not running all)'
|
|
22
|
-
required: false
|
|
23
|
-
default: '3.11'
|
|
24
|
-
type: choice
|
|
25
|
-
options:
|
|
26
|
-
- '3.11'
|
|
27
|
-
- '3.12'
|
|
28
|
-
- '3.13'
|
|
29
|
-
schedule:
|
|
30
|
-
- cron: '0 2 * * 1' # Weekly on Monday at 2 AM UTC
|
|
31
|
-
|
|
32
|
-
jobs:
|
|
33
|
-
test-all:
|
|
34
|
-
if: github.event_name == 'schedule' || github.event.inputs.run_all_tests == 'true'
|
|
35
|
-
runs-on: ${{ matrix.os }}
|
|
36
|
-
strategy:
|
|
37
|
-
fail-fast: false
|
|
38
|
-
matrix:
|
|
39
|
-
os: [ubuntu-latest, windows-latest, macos-latest]
|
|
40
|
-
python-version: ["3.11", "3.12", "3.13"]
|
|
41
|
-
exclude:
|
|
42
|
-
# Exclude macOS with Python 3.11 and 3.12 to reduce CI costs
|
|
43
|
-
- os: macos-latest
|
|
44
|
-
python-version: "3.11"
|
|
45
|
-
- os: macos-latest
|
|
46
|
-
python-version: "3.12"
|
|
47
|
-
# Exclude Windows with Python 3.12 to reduce CI costs
|
|
48
|
-
- os: windows-latest
|
|
49
|
-
python-version: "3.12"
|
|
50
|
-
|
|
51
|
-
steps:
|
|
52
|
-
- uses: actions/checkout@v4
|
|
53
|
-
|
|
54
|
-
- name: Set up Python ${{ matrix.python-version }}
|
|
55
|
-
uses: actions/setup-python@v5
|
|
56
|
-
with:
|
|
57
|
-
python-version: ${{ matrix.python-version }}
|
|
58
|
-
|
|
59
|
-
- name: Install UV
|
|
60
|
-
uses: astral-sh/setup-uv@v3
|
|
61
|
-
with:
|
|
62
|
-
enable-cache: true
|
|
63
|
-
cache-dependency-glob: "uv.lock"
|
|
64
|
-
|
|
65
|
-
- name: Install dependencies
|
|
66
|
-
run: |
|
|
67
|
-
uv sync --all-extras --dev
|
|
68
|
-
|
|
69
|
-
- name: Lint with flake8
|
|
70
|
-
run: |
|
|
71
|
-
uv run flake8 src/masster tests --count --select=E9,F63,F7,F82 --show-source --statistics
|
|
72
|
-
uv run flake8 src/masster tests --count --exit-zero --max-complexity=10 --max-line-length=88 --statistics
|
|
73
|
-
|
|
74
|
-
- name: Type check with mypy
|
|
75
|
-
run: |
|
|
76
|
-
uv run mypy src/masster --ignore-missing-imports --no-strict-optional
|
|
77
|
-
|
|
78
|
-
- name: Test with pytest
|
|
79
|
-
run: |
|
|
80
|
-
uv run pytest tests/ -v --cov=masster --cov-report=xml --cov-report=term-missing
|
|
81
|
-
|
|
82
|
-
- name: Upload coverage to Codecov
|
|
83
|
-
if: matrix.os == 'ubuntu-latest' && matrix.python-version == '3.11'
|
|
84
|
-
uses: codecov/codecov-action@v3
|
|
85
|
-
with:
|
|
86
|
-
file: ./coverage.xml
|
|
87
|
-
flags: unittests
|
|
88
|
-
name: codecov-umbrella
|
|
89
|
-
|
|
90
|
-
test-selective:
|
|
91
|
-
if: github.event_name == 'workflow_dispatch' && github.event.inputs.run_all_tests != 'true'
|
|
92
|
-
runs-on: ${{ github.event.inputs.target_os || 'ubuntu-latest' }}
|
|
93
|
-
|
|
94
|
-
steps:
|
|
95
|
-
- uses: actions/checkout@v4
|
|
96
|
-
|
|
97
|
-
- name: Set up Python ${{ github.event.inputs.python_version || '3.11' }}
|
|
98
|
-
uses: actions/setup-python@v5
|
|
99
|
-
with:
|
|
100
|
-
python-version: ${{ github.event.inputs.python_version || '3.11' }}
|
|
101
|
-
|
|
102
|
-
- name: Install UV
|
|
103
|
-
uses: astral-sh/setup-uv@v3
|
|
104
|
-
with:
|
|
105
|
-
enable-cache: true
|
|
106
|
-
cache-dependency-glob: "uv.lock"
|
|
107
|
-
|
|
108
|
-
- name: Install dependencies
|
|
109
|
-
run: |
|
|
110
|
-
uv sync --all-extras --dev
|
|
111
|
-
|
|
112
|
-
- name: Lint with flake8
|
|
113
|
-
run: |
|
|
114
|
-
uv run flake8 src/masster tests --count --select=E9,F63,F7,F82 --show-source --statistics
|
|
115
|
-
uv run flake8 src/masster tests --count --exit-zero --max-complexity=10 --max-line-length=88 --statistics
|
|
116
|
-
|
|
117
|
-
- name: Type check with mypy
|
|
118
|
-
run: |
|
|
119
|
-
uv run mypy src/masster --ignore-missing-imports --no-strict-optional
|
|
120
|
-
|
|
121
|
-
- name: Test with pytest
|
|
122
|
-
run: |
|
|
123
|
-
uv run pytest tests/ -v --cov=masster --cov-report=xml --cov-report=term-missing
|
|
124
|
-
|
|
125
|
-
- name: Upload coverage to Codecov
|
|
126
|
-
if: github.event.inputs.target_os == 'ubuntu-latest' && github.event.inputs.python_version == '3.11'
|
|
127
|
-
uses: codecov/codecov-action@v3
|
|
128
|
-
with:
|
|
129
|
-
file: ./coverage.xml
|
|
130
|
-
flags: unittests
|
|
131
|
-
name: codecov-umbrella
|
|
132
|
-
|
|
133
|
-
build:
|
|
134
|
-
needs: [test-all, test-selective]
|
|
135
|
-
if: always() && (needs.test-all.result == 'success' || needs.test-selective.result == 'success')
|
|
136
|
-
runs-on: ubuntu-latest
|
|
137
|
-
steps:
|
|
138
|
-
- uses: actions/checkout@v4
|
|
139
|
-
|
|
140
|
-
- name: Set up Python
|
|
141
|
-
uses: actions/setup-python@v5
|
|
142
|
-
with:
|
|
143
|
-
python-version: "3.11"
|
|
144
|
-
|
|
145
|
-
- name: Install UV
|
|
146
|
-
uses: astral-sh/setup-uv@v3
|
|
147
|
-
|
|
148
|
-
- name: Install dependencies
|
|
149
|
-
run: |
|
|
150
|
-
uv sync --all-extras --dev
|
|
151
|
-
|
|
152
|
-
- name: Build package
|
|
153
|
-
run: |
|
|
154
|
-
uv build
|
|
155
|
-
|
|
156
|
-
- name: Check package
|
|
157
|
-
run: |
|
|
158
|
-
uv run twine check dist/*
|
|
159
|
-
|
|
160
|
-
- name: Upload build artifacts
|
|
161
|
-
uses: actions/upload-artifact@v4
|
|
162
|
-
with:
|
|
163
|
-
name: dist
|
|
164
|
-
path: dist/
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
repos:
|
|
3
|
-
- repo: https://github.com/pre-commit/pre-commit-hooks
|
|
4
|
-
rev: v5.0.0
|
|
5
|
-
hooks:
|
|
6
|
-
- id: check-added-large-files
|
|
7
|
-
- id: check-ast
|
|
8
|
-
- id: check-builtin-literals
|
|
9
|
-
- id: check-case-conflict
|
|
10
|
-
- id: check-docstring-first
|
|
11
|
-
- id: check-executables-have-shebangs
|
|
12
|
-
- id: check-illegal-windows-names
|
|
13
|
-
- id: check-merge-conflict
|
|
14
|
-
- id: check-symlinks
|
|
15
|
-
- id: check-shebang-scripts-are-executable
|
|
16
|
-
- id: check-symlinks
|
|
17
|
-
- id: check-toml
|
|
18
|
-
- id: check-xml
|
|
19
|
-
- id: check-yaml
|
|
20
|
-
- id: check-json
|
|
21
|
-
exclude: ^.devcontainer/devcontainer.json
|
|
22
|
-
- id: pretty-format-json
|
|
23
|
-
exclude: ^.devcontainer/devcontainer.json
|
|
24
|
-
args:
|
|
25
|
-
- --autofix
|
|
26
|
-
- id: debug-statements
|
|
27
|
-
- id: end-of-file-fixer
|
|
28
|
-
- id: mixed-line-ending
|
|
29
|
-
- id: pretty-format-json
|
|
30
|
-
- id: trailing-whitespace
|
|
31
|
-
# - repo: https://github.com/openstack/bashate
|
|
32
|
-
# rev: 2.1.1
|
|
33
|
-
# hooks:
|
|
34
|
-
# - id: bashate
|
|
35
|
-
- repo: https://github.com/fpgmaas/deptry
|
|
36
|
-
rev: 0.23.1
|
|
37
|
-
hooks:
|
|
38
|
-
- id: deptry
|
|
39
|
-
language: python
|
|
40
|
-
additional_dependencies: [deptry]
|
|
41
|
-
- repo: https://github.com/python-jsonschema/check-jsonschema
|
|
42
|
-
rev: 0.33.2
|
|
43
|
-
hooks:
|
|
44
|
-
- id: check-github-workflows
|
|
45
|
-
- id: check-taskfile
|
|
46
|
-
# - repo: https://github.com/mrtazz/checkmake.git
|
|
47
|
-
# rev: 0.2.2
|
|
48
|
-
# hooks:
|
|
49
|
-
# - id: checkmake
|
|
50
|
-
# - repo: https://github.com/hukkin/mdformat
|
|
51
|
-
# rev: 0.7.22
|
|
52
|
-
# hooks:
|
|
53
|
-
# - id: mdformat
|
|
54
|
-
# - repo: https://github.com/markdownlint/markdownlint
|
|
55
|
-
# rev: v0.12.0
|
|
56
|
-
# hooks:
|
|
57
|
-
# - id: markdownlint
|
|
58
|
-
# - repo: https://github.com/shssoichiro/oxipng
|
|
59
|
-
# rev: v9.1.5
|
|
60
|
-
# hooks:
|
|
61
|
-
# - id: oxipng
|
|
62
|
-
- repo: https://github.com/asottile/pyupgrade
|
|
63
|
-
rev: v3.20.0
|
|
64
|
-
hooks:
|
|
65
|
-
- id: pyupgrade
|
|
66
|
-
- repo: https://github.com/asottile/add-trailing-comma
|
|
67
|
-
rev: v3.2.0
|
|
68
|
-
hooks:
|
|
69
|
-
- id: add-trailing-comma
|
|
70
|
-
- repo: https://github.com/astral-sh/ruff-pre-commit
|
|
71
|
-
rev: v0.12.7
|
|
72
|
-
hooks:
|
|
73
|
-
- id: ruff-check
|
|
74
|
-
args:
|
|
75
|
-
- --fix
|
|
76
|
-
- id: ruff-format
|
|
77
|
-
- repo: https://github.com/crate-ci/typos
|
|
78
|
-
rev: v1.34.0
|
|
79
|
-
hooks:
|
|
80
|
-
- id: typos
|
|
81
|
-
# - repo: https://github.com/shellcheck-py/shellcheck-py
|
|
82
|
-
# rev: v0.10.0.1
|
|
83
|
-
# hooks:
|
|
84
|
-
# - id: shellcheck
|
|
85
|
-
# - repo: https://github.com/sqlfluff/sqlfluff
|
|
86
|
-
# rev: 3.4.2
|
|
87
|
-
# hooks:
|
|
88
|
-
# - id: sqlfluff-fix
|
|
89
|
-
# - id: sqlfluff-lint
|
|
90
|
-
- repo: local
|
|
91
|
-
hooks:
|
|
92
|
-
- id: ty-check
|
|
93
|
-
name: ty-check
|
|
94
|
-
language: python
|
|
95
|
-
entry: ty check
|
|
96
|
-
additional_dependencies: [ty]
|
masster-0.5.26/Makefile
DELETED
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
.PHONY: help install install-dev test test-cov lint format type-check clean build publish publish-test security pre-commit
|
|
2
|
-
|
|
3
|
-
help: ## Show this help message
|
|
4
|
-
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}'
|
|
5
|
-
|
|
6
|
-
install: ## Install package for production
|
|
7
|
-
uv sync
|
|
8
|
-
|
|
9
|
-
install-dev: ## Install package with development dependencies
|
|
10
|
-
uv sync --all-extras --dev
|
|
11
|
-
|
|
12
|
-
test: ## Run tests
|
|
13
|
-
uv run pytest tests/ -v
|
|
14
|
-
|
|
15
|
-
test-cov: ## Run tests with coverage report
|
|
16
|
-
uv run pytest tests/ -v --cov=masster --cov-report=term-missing --cov-report=html
|
|
17
|
-
|
|
18
|
-
test-integration: ## Run integration tests only
|
|
19
|
-
uv run pytest tests/test_integration.py -v
|
|
20
|
-
|
|
21
|
-
lint: ## Run linting checks
|
|
22
|
-
uv run flake8 src/masster tests
|
|
23
|
-
uv run black --check src/masster tests
|
|
24
|
-
|
|
25
|
-
format: ## Format code with black
|
|
26
|
-
uv run black src/masster tests
|
|
27
|
-
|
|
28
|
-
type-check: ## Run type checking with mypy
|
|
29
|
-
uv run mypy src/masster --ignore-missing-imports
|
|
30
|
-
|
|
31
|
-
security: ## Run security checks
|
|
32
|
-
uv run safety check
|
|
33
|
-
uv run bandit -r src/masster
|
|
34
|
-
|
|
35
|
-
pre-commit: ## Run pre-commit hooks on all files
|
|
36
|
-
uv run pre-commit run --all-files
|
|
37
|
-
|
|
38
|
-
clean: ## Clean build artifacts
|
|
39
|
-
rm -rf build/
|
|
40
|
-
rm -rf dist/
|
|
41
|
-
rm -rf *.egg-info/
|
|
42
|
-
rm -rf .coverage
|
|
43
|
-
rm -rf htmlcov/
|
|
44
|
-
rm -rf .pytest_cache/
|
|
45
|
-
rm -rf .mypy_cache/
|
|
46
|
-
find . -type d -name __pycache__ -exec rm -rf {} +
|
|
47
|
-
find . -type f -name "*.pyc" -delete
|
|
48
|
-
|
|
49
|
-
build: ## Build package
|
|
50
|
-
uv build
|
|
51
|
-
|
|
52
|
-
check-build: ## Check built package
|
|
53
|
-
uv run twine check dist/*
|
|
54
|
-
|
|
55
|
-
publish-test: ## Publish to Test PyPI
|
|
56
|
-
uv run twine upload --repository testpypi dist/*
|
|
57
|
-
|
|
58
|
-
publish: ## Publish to PyPI
|
|
59
|
-
uv run twine upload dist/*
|
|
60
|
-
|
|
61
|
-
version-bump-patch: ## Bump patch version
|
|
62
|
-
@echo "Current version: $$(grep 'version = ' pyproject.toml | cut -d'"' -f2)"
|
|
63
|
-
@read -p "Enter new patch version (x.y.Z): " version && \
|
|
64
|
-
sed -i 's/version = "[0-9]*\.[0-9]*\.[0-9]*"/version = "'$$version'"/' pyproject.toml && \
|
|
65
|
-
sed -i 's/__version__ = "[0-9]*\.[0-9]*\.[0-9]*"/__version__ = "'$$version'"/' src/masster/_version.py
|
|
66
|
-
@echo "Updated to version: $$(grep 'version = ' pyproject.toml | cut -d'"' -f2)"
|
|
67
|
-
|
|
68
|
-
# Development workflow shortcuts
|
|
69
|
-
dev-setup: install-dev pre-commit ## Complete development setup
|
|
70
|
-
@echo "Development environment ready!"
|
|
71
|
-
|
|
72
|
-
test-all: lint type-check security test-cov ## Run all checks and tests
|
|
73
|
-
|
|
74
|
-
ci-test: test-all build check-build ## Run CI-like tests locally
|
|
75
|
-
|
|
76
|
-
release-check: clean test-all build check-build ## Pre-release checks
|