masster 0.4.5__tar.gz → 0.4.9__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.4.9/.github/workflows/publish.yml +174 -0
- masster-0.4.9/.github/workflows/security.yml +88 -0
- masster-0.4.9/.github/workflows/test.yml +164 -0
- masster-0.4.9/.gitignore +210 -0
- masster-0.4.9/.pre-commit-config.yaml +96 -0
- masster-0.4.9/Makefile +76 -0
- masster-0.4.9/PKG-INFO +788 -0
- {masster-0.4.5 → masster-0.4.9}/README.md +6 -6
- masster-0.4.9/TESTING.md +243 -0
- masster-0.4.9/demo/example_batch_process.py +190 -0
- masster-0.4.9/demo/example_sample_process.py +24 -0
- {masster-0.4.5 → masster-0.4.9}/pyproject.toml +19 -48
- {masster-0.4.5 → masster-0.4.9}/src/masster/__init__.py +8 -8
- {masster-0.4.5 → masster-0.4.9}/src/masster/_version.py +1 -1
- {masster-0.4.5 → masster-0.4.9}/src/masster/chromatogram.py +2 -2
- {masster-0.4.5 → masster-0.4.9}/src/masster/logger.py +11 -11
- {masster-0.4.5 → masster-0.4.9}/src/masster/sample/__init__.py +1 -1
- {masster-0.4.5 → masster-0.4.9}/src/masster/sample/adducts.py +1 -1
- {masster-0.4.5 → masster-0.4.9}/src/masster/sample/h5.py +7 -7
- {masster-0.4.5 → masster-0.4.9}/src/masster/sample/lib.py +2 -2
- {masster-0.4.5 → masster-0.4.9}/src/masster/sample/load.py +8 -8
- {masster-0.4.5 → masster-0.4.9}/src/masster/sample/parameters.py +1 -1
- {masster-0.4.5 → masster-0.4.9}/src/masster/sample/plot.py +2 -2
- {masster-0.4.5 → masster-0.4.9}/src/masster/sample/processing.py +2 -2
- {masster-0.4.5 → masster-0.4.9}/src/masster/sample/sample.py +86 -86
- {masster-0.4.5 → masster-0.4.9}/src/masster/sample/save.py +1 -1
- {masster-0.4.5 → masster-0.4.9}/src/masster/spectrum.py +2 -2
- {masster-0.4.5 → masster-0.4.9}/src/masster/study/__init__.py +1 -1
- {masster-0.4.5 → masster-0.4.9}/src/masster/study/export.py +7 -7
- {masster-0.4.5 → masster-0.4.9}/src/masster/study/h5.py +6 -6
- {masster-0.4.5 → masster-0.4.9}/src/masster/study/helpers.py +339 -146
- {masster-0.4.5 → masster-0.4.9}/src/masster/study/id.py +4 -4
- {masster-0.4.5 → masster-0.4.9}/src/masster/study/load.py +6 -6
- {masster-0.4.5 → masster-0.4.9}/src/masster/study/plot.py +3 -3
- {masster-0.4.5 → masster-0.4.9}/src/masster/study/processing.py +3 -3
- {masster-0.4.5 → masster-0.4.9}/src/masster/study/save.py +1 -1
- {masster-0.4.5 → masster-0.4.9}/src/masster/study/study.py +98 -98
- masster-0.4.9/tests/conftest.py +12 -0
- masster-0.4.9/tests/test_chromatogram.py +193 -0
- masster-0.4.9/tests/test_defaults.py +384 -0
- masster-0.4.9/tests/test_imports.py +76 -0
- masster-0.4.9/tests/test_integration.py +132 -0
- masster-0.4.9/tests/test_logger.py +268 -0
- masster-0.4.9/tests/test_parameters.py +109 -0
- masster-0.4.9/tests/test_sample.py +170 -0
- masster-0.4.9/tests/test_spectrum.py +143 -0
- masster-0.4.9/tests/test_study.py +133 -0
- masster-0.4.9/tests/test_version.py +51 -0
- masster-0.4.9/tox.ini +61 -0
- masster-0.4.9/uv.lock +3429 -0
- masster-0.4.5/MANIFEST.in +0 -8
- masster-0.4.5/PKG-INFO +0 -131
- masster-0.4.5/setup.cfg +0 -4
- masster-0.4.5/src/masster/data/libs/__pycache__/ccm.cpython-312.pyc +0 -0
- masster-0.4.5/src/masster/data/libs/__pycache__/urine.cpython-312.pyc +0 -0
- masster-0.4.5/src/masster/lib/__init__.py +0 -9
- masster-0.4.5/src/masster/lib/lib.py +0 -598
- masster-0.4.5/src/masster/study/helpers_optimized.py +0 -359
- masster-0.4.5/src/masster.egg-info/PKG-INFO +0 -131
- masster-0.4.5/src/masster.egg-info/SOURCES.txt +0 -75
- masster-0.4.5/src/masster.egg-info/dependency_links.txt +0 -1
- masster-0.4.5/src/masster.egg-info/entry_points.txt +0 -2
- masster-0.4.5/src/masster.egg-info/requires.txt +0 -48
- masster-0.4.5/src/masster.egg-info/top_level.txt +0 -1
- {masster-0.4.5 → masster-0.4.9}/LICENSE +0 -0
- {masster-0.4.5 → masster-0.4.9}/src/masster/data/dda/20250530_VH_IQX_KW_RP_HSST3_100mm_12min_pos_v4_DDA_OT_C-MiLUT_QC_dil2_01_20250602151849.sample5 +0 -0
- {masster-0.4.5 → masster-0.4.9}/src/masster/data/dda/20250530_VH_IQX_KW_RP_HSST3_100mm_12min_pos_v4_DDA_OT_C-MiLUT_QC_dil3_01_20250602150634.sample5 +0 -0
- {masster-0.4.5 → masster-0.4.9}/src/masster/data/dda/20250530_VH_IQX_KW_RP_HSST3_100mm_12min_pos_v4_MS1_C-MiLUT_C008_v6_r38_01.sample5 +0 -0
- {masster-0.4.5 → masster-0.4.9}/src/masster/data/dda/20250530_VH_IQX_KW_RP_HSST3_100mm_12min_pos_v4_MS1_C-MiLUT_C008_v7_r37_01.sample5 +0 -0
- {masster-0.4.5 → masster-0.4.9}/src/masster/data/dda/20250530_VH_IQX_KW_RP_HSST3_100mm_12min_pos_v4_MS1_C-MiLUT_C017_v5_r99_01.sample5 +0 -0
- {masster-0.4.5 → masster-0.4.9}/src/masster/data/libs/ccm.csv +0 -0
- {masster-0.4.5 → masster-0.4.9}/src/masster/data/libs/urine.csv +0 -0
- {masster-0.4.5 → masster-0.4.9}/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.4.5 → masster-0.4.9}/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.4.5 → masster-0.4.9}/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.4.5 → masster-0.4.9}/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.4.5 → masster-0.4.9}/src/masster/sample/defaults/__init__.py +0 -0
- {masster-0.4.5 → masster-0.4.9}/src/masster/sample/defaults/find_adducts_def.py +0 -0
- {masster-0.4.5 → masster-0.4.9}/src/masster/sample/defaults/find_features_def.py +0 -0
- {masster-0.4.5 → masster-0.4.9}/src/masster/sample/defaults/find_ms2_def.py +0 -0
- {masster-0.4.5 → masster-0.4.9}/src/masster/sample/defaults/get_spectrum_def.py +0 -0
- {masster-0.4.5 → masster-0.4.9}/src/masster/sample/defaults/sample_def.py +0 -0
- {masster-0.4.5 → masster-0.4.9}/src/masster/sample/helpers.py +0 -0
- {masster-0.4.5 → masster-0.4.9}/src/masster/sample/quant.py +0 -0
- {masster-0.4.5 → masster-0.4.9}/src/masster/sample/sample5_schema.json +0 -0
- {masster-0.4.5 → masster-0.4.9}/src/masster/sample/sciex.py +0 -0
- {masster-0.4.5 → masster-0.4.9}/src/masster/study/defaults/__init__.py +0 -0
- {masster-0.4.5 → masster-0.4.9}/src/masster/study/defaults/align_def.py +0 -0
- {masster-0.4.5 → masster-0.4.9}/src/masster/study/defaults/export_def.py +0 -0
- {masster-0.4.5 → masster-0.4.9}/src/masster/study/defaults/fill_chrom_def.py +0 -0
- {masster-0.4.5 → masster-0.4.9}/src/masster/study/defaults/fill_def.py +0 -0
- {masster-0.4.5 → masster-0.4.9}/src/masster/study/defaults/find_consensus_def.py +0 -0
- {masster-0.4.5 → masster-0.4.9}/src/masster/study/defaults/find_ms2_def.py +0 -0
- {masster-0.4.5 → masster-0.4.9}/src/masster/study/defaults/identify_def.py +0 -0
- {masster-0.4.5 → masster-0.4.9}/src/masster/study/defaults/integrate_chrom_def.py +0 -0
- {masster-0.4.5 → masster-0.4.9}/src/masster/study/defaults/integrate_def.py +0 -0
- {masster-0.4.5 → masster-0.4.9}/src/masster/study/defaults/merge_def.py +0 -0
- {masster-0.4.5 → masster-0.4.9}/src/masster/study/defaults/study_def.py +0 -0
- {masster-0.4.5 → masster-0.4.9}/src/masster/study/parameters.py +0 -0
- {masster-0.4.5 → masster-0.4.9}/src/masster/study/study5_schema.json +0 -0
|
@@ -0,0 +1,174 @@
|
|
|
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
|
|
@@ -0,0 +1,88 @@
|
|
|
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
|
|
@@ -0,0 +1,164 @@
|
|
|
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/
|
masster-0.4.9/.gitignore
ADDED
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
# Byte-compiled / optimized / DLL files
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[codz]
|
|
4
|
+
*$py.class
|
|
5
|
+
|
|
6
|
+
# C extensions
|
|
7
|
+
*.so
|
|
8
|
+
|
|
9
|
+
# Distribution / packaging
|
|
10
|
+
.Python
|
|
11
|
+
build/
|
|
12
|
+
develop-eggs/
|
|
13
|
+
dist/
|
|
14
|
+
downloads/
|
|
15
|
+
eggs/
|
|
16
|
+
.eggs/
|
|
17
|
+
lib/
|
|
18
|
+
lib64/
|
|
19
|
+
parts/
|
|
20
|
+
sdist/
|
|
21
|
+
var/
|
|
22
|
+
wheels/
|
|
23
|
+
share/python-wheels/
|
|
24
|
+
*.egg-info/
|
|
25
|
+
.installed.cfg
|
|
26
|
+
*.egg
|
|
27
|
+
MANIFEST
|
|
28
|
+
|
|
29
|
+
# PyInstaller
|
|
30
|
+
# Usually these files are written by a python script from a template
|
|
31
|
+
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
|
32
|
+
*.manifest
|
|
33
|
+
*.spec
|
|
34
|
+
|
|
35
|
+
# Installer logs
|
|
36
|
+
pip-log.txt
|
|
37
|
+
pip-delete-this-directory.txt
|
|
38
|
+
|
|
39
|
+
# Unit test / coverage reports
|
|
40
|
+
htmlcov/
|
|
41
|
+
.tox/
|
|
42
|
+
.nox/
|
|
43
|
+
.coverage
|
|
44
|
+
.coverage.*
|
|
45
|
+
.cache
|
|
46
|
+
nosetests.xml
|
|
47
|
+
coverage.xml
|
|
48
|
+
*.cover
|
|
49
|
+
*.py.cover
|
|
50
|
+
.hypothesis/
|
|
51
|
+
.pytest_cache/
|
|
52
|
+
cover/
|
|
53
|
+
|
|
54
|
+
# Translations
|
|
55
|
+
*.mo
|
|
56
|
+
*.pot
|
|
57
|
+
|
|
58
|
+
# Django stuff:
|
|
59
|
+
*.log
|
|
60
|
+
local_settings.py
|
|
61
|
+
db.sqlite3
|
|
62
|
+
db.sqlite3-journal
|
|
63
|
+
|
|
64
|
+
# Flask stuff:
|
|
65
|
+
instance/
|
|
66
|
+
.webassets-cache
|
|
67
|
+
|
|
68
|
+
# Scrapy stuff:
|
|
69
|
+
.scrapy
|
|
70
|
+
|
|
71
|
+
# VSCode settings
|
|
72
|
+
.vscode
|
|
73
|
+
|
|
74
|
+
# Sphinx documentation
|
|
75
|
+
docs/_build/
|
|
76
|
+
|
|
77
|
+
# PyBuilder
|
|
78
|
+
.pybuilder/
|
|
79
|
+
target/
|
|
80
|
+
|
|
81
|
+
# Jupyter Notebook
|
|
82
|
+
.ipynb_checkpoints
|
|
83
|
+
|
|
84
|
+
# IPython
|
|
85
|
+
profile_default/
|
|
86
|
+
ipython_config.py
|
|
87
|
+
|
|
88
|
+
# pyenv
|
|
89
|
+
# For a library or package, you might want to ignore these files since the code is
|
|
90
|
+
# intended to run in multiple environments; otherwise, check them in:
|
|
91
|
+
# .python-version
|
|
92
|
+
|
|
93
|
+
# pipenv
|
|
94
|
+
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
|
95
|
+
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
|
96
|
+
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
|
97
|
+
# install all needed dependencies.
|
|
98
|
+
#Pipfile.lock
|
|
99
|
+
|
|
100
|
+
# UV
|
|
101
|
+
# Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
|
|
102
|
+
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
|
103
|
+
# commonly ignored for libraries.
|
|
104
|
+
#uv.lock
|
|
105
|
+
|
|
106
|
+
# poetry
|
|
107
|
+
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
|
|
108
|
+
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
|
109
|
+
# commonly ignored for libraries.
|
|
110
|
+
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
|
|
111
|
+
#poetry.lock
|
|
112
|
+
#poetry.toml
|
|
113
|
+
|
|
114
|
+
# pdm
|
|
115
|
+
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
|
|
116
|
+
# pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python.
|
|
117
|
+
# https://pdm-project.org/en/latest/usage/project/#working-with-version-control
|
|
118
|
+
#pdm.lock
|
|
119
|
+
#pdm.toml
|
|
120
|
+
.pdm-python
|
|
121
|
+
.pdm-build/
|
|
122
|
+
|
|
123
|
+
# pixi
|
|
124
|
+
# Similar to Pipfile.lock, it is generally recommended to include pixi.lock in version control.
|
|
125
|
+
#pixi.lock
|
|
126
|
+
# Pixi creates a virtual environment in the .pixi directory, just like venv module creates one
|
|
127
|
+
# in the .venv directory. It is recommended not to include this directory in version control.
|
|
128
|
+
.pixi
|
|
129
|
+
|
|
130
|
+
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
|
|
131
|
+
__pypackages__/
|
|
132
|
+
|
|
133
|
+
# Celery stuff
|
|
134
|
+
celerybeat-schedule
|
|
135
|
+
celerybeat.pid
|
|
136
|
+
|
|
137
|
+
# SageMath parsed files
|
|
138
|
+
*.sage.py
|
|
139
|
+
|
|
140
|
+
# Environments
|
|
141
|
+
.env
|
|
142
|
+
.envrc
|
|
143
|
+
.venv
|
|
144
|
+
env/
|
|
145
|
+
venv/
|
|
146
|
+
ENV/
|
|
147
|
+
env.bak/
|
|
148
|
+
venv.bak/
|
|
149
|
+
|
|
150
|
+
# Spyder project settings
|
|
151
|
+
.spyderproject
|
|
152
|
+
.spyproject
|
|
153
|
+
|
|
154
|
+
# Rope project settings
|
|
155
|
+
.ropeproject
|
|
156
|
+
|
|
157
|
+
# mkdocs documentation
|
|
158
|
+
/site
|
|
159
|
+
|
|
160
|
+
# mypy
|
|
161
|
+
.mypy_cache/
|
|
162
|
+
.dmypy.json
|
|
163
|
+
dmypy.json
|
|
164
|
+
|
|
165
|
+
# Pyre type checker
|
|
166
|
+
.pyre/
|
|
167
|
+
|
|
168
|
+
# pytype static type analyzer
|
|
169
|
+
.pytype/
|
|
170
|
+
|
|
171
|
+
# Cython debug symbols
|
|
172
|
+
cython_debug/
|
|
173
|
+
|
|
174
|
+
# PyCharm
|
|
175
|
+
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
|
|
176
|
+
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
|
|
177
|
+
# and can be added to the global gitignore or merged into this file. For a more nuclear
|
|
178
|
+
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
|
|
179
|
+
#.idea/
|
|
180
|
+
|
|
181
|
+
# Abstra
|
|
182
|
+
# Abstra is an AI-powered process automation framework.
|
|
183
|
+
# Ignore directories containing user credentials, local state, and settings.
|
|
184
|
+
# Learn more at https://abstra.io/docs
|
|
185
|
+
.abstra/
|
|
186
|
+
|
|
187
|
+
# Visual Studio Code
|
|
188
|
+
# Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore
|
|
189
|
+
# that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore
|
|
190
|
+
# and can be added to the global gitignore or merged into this file. However, if you prefer,
|
|
191
|
+
# you could uncomment the following to ignore the entire vscode folder
|
|
192
|
+
# .vscode/
|
|
193
|
+
|
|
194
|
+
# Ruff stuff:
|
|
195
|
+
.ruff_cache/
|
|
196
|
+
|
|
197
|
+
# PyPI configuration file
|
|
198
|
+
.pypirc
|
|
199
|
+
|
|
200
|
+
# Cursor
|
|
201
|
+
# Cursor is an AI-powered code editor. `.cursorignore` specifies files/directories to
|
|
202
|
+
# exclude from AI features like autocomplete and code analysis. Recommended for sensitive data
|
|
203
|
+
# refer to https://docs.cursor.com/context/ignore-files
|
|
204
|
+
.cursorignore
|
|
205
|
+
.cursorindexingignore
|
|
206
|
+
|
|
207
|
+
# Marimo
|
|
208
|
+
marimo/_static/
|
|
209
|
+
marimo/_lsp/
|
|
210
|
+
__marimo__/
|