masster 0.5.25__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.

Files changed (89) hide show
  1. {masster-0.5.25 → masster-0.5.27}/PKG-INFO +7 -1
  2. {masster-0.5.25 → masster-0.5.27}/README.md +5 -0
  3. masster-0.5.27/THIRD_PARTY_NOTICES.md +64 -0
  4. {masster-0.5.25 → masster-0.5.27}/pyproject.toml +31 -13
  5. masster-0.5.25/.github/workflows/publish.yml +0 -174
  6. masster-0.5.25/.github/workflows/security.yml +0 -88
  7. masster-0.5.25/.github/workflows/test.yml +0 -164
  8. masster-0.5.25/.pre-commit-config.yaml +0 -96
  9. masster-0.5.25/Makefile +0 -76
  10. masster-0.5.25/demo/example_batch_process.py +0 -190
  11. masster-0.5.25/demo/example_sample_process.py +0 -24
  12. masster-0.5.25/tox.ini +0 -61
  13. masster-0.5.25/uv.lock +0 -3626
  14. {masster-0.5.25 → masster-0.5.27}/.gitignore +0 -0
  15. {masster-0.5.25 → masster-0.5.27}/LICENSE +0 -0
  16. {masster-0.5.25 → masster-0.5.27}/src/masster/__init__.py +0 -0
  17. {masster-0.5.25 → masster-0.5.27}/src/masster/_version.py +0 -0
  18. {masster-0.5.25 → masster-0.5.27}/src/masster/chromatogram.py +0 -0
  19. {masster-0.5.25 → masster-0.5.27}/src/masster/data/libs/aa.csv +0 -0
  20. {masster-0.5.25 → masster-0.5.27}/src/masster/data/libs/ccm.csv +0 -0
  21. {masster-0.5.25 → masster-0.5.27}/src/masster/data/libs/urine.csv +0 -0
  22. {masster-0.5.25 → 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
  23. {masster-0.5.25 → 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
  24. {masster-0.5.25 → 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
  25. {masster-0.5.25 → 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
  26. {masster-0.5.25 → masster-0.5.27}/src/masster/lib/__init__.py +0 -0
  27. {masster-0.5.25 → masster-0.5.27}/src/masster/lib/lib.py +0 -0
  28. {masster-0.5.25 → masster-0.5.27}/src/masster/logger.py +0 -0
  29. {masster-0.5.25 → masster-0.5.27}/src/masster/sample/__init__.py +0 -0
  30. {masster-0.5.25 → masster-0.5.27}/src/masster/sample/adducts.py +0 -0
  31. {masster-0.5.25 → masster-0.5.27}/src/masster/sample/defaults/__init__.py +0 -0
  32. {masster-0.5.25 → masster-0.5.27}/src/masster/sample/defaults/find_adducts_def.py +0 -0
  33. {masster-0.5.25 → masster-0.5.27}/src/masster/sample/defaults/find_features_def.py +0 -0
  34. {masster-0.5.25 → masster-0.5.27}/src/masster/sample/defaults/find_ms2_def.py +0 -0
  35. {masster-0.5.25 → masster-0.5.27}/src/masster/sample/defaults/get_spectrum_def.py +0 -0
  36. {masster-0.5.25 → masster-0.5.27}/src/masster/sample/defaults/sample_def.py +0 -0
  37. {masster-0.5.25 → masster-0.5.27}/src/masster/sample/h5.py +0 -0
  38. {masster-0.5.25 → masster-0.5.27}/src/masster/sample/helpers.py +0 -0
  39. {masster-0.5.25 → masster-0.5.27}/src/masster/sample/lib.py +0 -0
  40. {masster-0.5.25 → masster-0.5.27}/src/masster/sample/load.py +0 -0
  41. {masster-0.5.25 → masster-0.5.27}/src/masster/sample/parameters.py +0 -0
  42. {masster-0.5.25 → masster-0.5.27}/src/masster/sample/plot.py +0 -0
  43. {masster-0.5.25 → masster-0.5.27}/src/masster/sample/processing.py +0 -0
  44. {masster-0.5.25 → masster-0.5.27}/src/masster/sample/quant.py +0 -0
  45. {masster-0.5.25 → masster-0.5.27}/src/masster/sample/sample.py +0 -0
  46. {masster-0.5.25 → masster-0.5.27}/src/masster/sample/sample5_schema.json +0 -0
  47. {masster-0.5.25 → masster-0.5.27}/src/masster/sample/save.py +0 -0
  48. {masster-0.5.25 → masster-0.5.27}/src/masster/sample/sciex.py +0 -0
  49. {masster-0.5.25 → masster-0.5.27}/src/masster/sample/thermo.py +0 -0
  50. {masster-0.5.25 → masster-0.5.27}/src/masster/spectrum.py +0 -0
  51. {masster-0.5.25 → masster-0.5.27}/src/masster/study/__init__.py +0 -0
  52. {masster-0.5.25 → masster-0.5.27}/src/masster/study/analysis.py +0 -0
  53. {masster-0.5.25 → masster-0.5.27}/src/masster/study/defaults/__init__.py +0 -0
  54. {masster-0.5.25 → masster-0.5.27}/src/masster/study/defaults/align_def.py +0 -0
  55. {masster-0.5.25 → masster-0.5.27}/src/masster/study/defaults/export_def.py +0 -0
  56. {masster-0.5.25 → masster-0.5.27}/src/masster/study/defaults/fill_def.py +0 -0
  57. {masster-0.5.25 → masster-0.5.27}/src/masster/study/defaults/find_consensus_def.py +0 -0
  58. {masster-0.5.25 → masster-0.5.27}/src/masster/study/defaults/find_ms2_def.py +0 -0
  59. {masster-0.5.25 → masster-0.5.27}/src/masster/study/defaults/identify_def.py +0 -0
  60. {masster-0.5.25 → masster-0.5.27}/src/masster/study/defaults/integrate_chrom_def.py +0 -0
  61. {masster-0.5.25 → masster-0.5.27}/src/masster/study/defaults/integrate_def.py +0 -0
  62. {masster-0.5.25 → masster-0.5.27}/src/masster/study/defaults/merge_def.py +0 -0
  63. {masster-0.5.25 → masster-0.5.27}/src/masster/study/defaults/study_def.py +0 -0
  64. {masster-0.5.25 → masster-0.5.27}/src/masster/study/export.py +0 -0
  65. {masster-0.5.25 → masster-0.5.27}/src/masster/study/h5.py +0 -0
  66. {masster-0.5.25 → masster-0.5.27}/src/masster/study/helpers.py +0 -0
  67. {masster-0.5.25 → masster-0.5.27}/src/masster/study/id.py +0 -0
  68. {masster-0.5.25 → masster-0.5.27}/src/masster/study/importers.py +0 -0
  69. {masster-0.5.25 → masster-0.5.27}/src/masster/study/load.py +0 -0
  70. {masster-0.5.25 → masster-0.5.27}/src/masster/study/merge.py +0 -0
  71. {masster-0.5.25 → masster-0.5.27}/src/masster/study/parameters.py +0 -0
  72. {masster-0.5.25 → masster-0.5.27}/src/masster/study/plot.py +0 -0
  73. {masster-0.5.25 → masster-0.5.27}/src/masster/study/processing.py +0 -0
  74. {masster-0.5.25 → masster-0.5.27}/src/masster/study/save.py +0 -0
  75. {masster-0.5.25 → masster-0.5.27}/src/masster/study/study.py +0 -0
  76. {masster-0.5.25 → masster-0.5.27}/src/masster/study/study5_schema.json +0 -0
  77. {masster-0.5.25 → masster-0.5.27}/src/masster/wizard/__init__.py +0 -0
  78. {masster-0.5.25 → masster-0.5.27}/src/masster/wizard/wizard.py +0 -0
  79. {masster-0.5.25 → masster-0.5.27}/tests/conftest.py +0 -0
  80. {masster-0.5.25 → masster-0.5.27}/tests/test_chromatogram.py +0 -0
  81. {masster-0.5.25 → masster-0.5.27}/tests/test_defaults.py +0 -0
  82. {masster-0.5.25 → masster-0.5.27}/tests/test_imports.py +0 -0
  83. {masster-0.5.25 → masster-0.5.27}/tests/test_integration.py +0 -0
  84. {masster-0.5.25 → masster-0.5.27}/tests/test_logger.py +0 -0
  85. {masster-0.5.25 → masster-0.5.27}/tests/test_parameters.py +0 -0
  86. {masster-0.5.25 → masster-0.5.27}/tests/test_sample.py +0 -0
  87. {masster-0.5.25 → masster-0.5.27}/tests/test_spectrum.py +0 -0
  88. {masster-0.5.25 → masster-0.5.27}/tests/test_study.py +0 -0
  89. {masster-0.5.25 → 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.25
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
@@ -851,5 +852,10 @@ python -c "from masster import Wizard; wiz = Wizard(source='D:/Data/studies/my_s
851
852
  ## License
852
853
  GNU Affero General Public License v3
853
854
 
855
+ See the [LICENSE](LICENSE) file for details.
856
+
857
+ ### Third-Party Licenses
858
+ This project uses several third-party libraries, including pyOpenMS which is licensed under the BSD 3-Clause License. For complete information about third-party dependencies and their licenses, see [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md).
859
+
854
860
  ## Citation
855
861
  If you use Masster in your research, please cite this repository.
@@ -124,5 +124,10 @@ python -c "from masster import Wizard; wiz = Wizard(source='D:/Data/studies/my_s
124
124
  ## License
125
125
  GNU Affero General Public License v3
126
126
 
127
+ See the [LICENSE](LICENSE) file for details.
128
+
129
+ ### Third-Party Licenses
130
+ This project uses several third-party libraries, including pyOpenMS which is licensed under the BSD 3-Clause License. For complete information about third-party dependencies and their licenses, see [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md).
131
+
127
132
  ## Citation
128
133
  If you use Masster in your research, please cite this repository.
@@ -0,0 +1,64 @@
1
+ # Third-Party Licenses and Notices
2
+
3
+ This project uses third-party libraries and components that are distributed under their own licenses. Below is a list of these dependencies and their respective license information.
4
+
5
+ ---
6
+
7
+ ## pyOpenMS
8
+
9
+ **License:** BSD 3-Clause License
10
+ **Copyright:** OpenMS Team
11
+ **Source:** https://github.com/OpenMS/OpenMS
12
+
13
+ pyOpenMS is a Python wrapper for OpenMS, a library for mass spectrometry data analysis.
14
+
15
+ ### BSD 3-Clause License
16
+
17
+ ```
18
+ Copyright (c) 2002-2025, The OpenMS Team
19
+ All rights reserved.
20
+
21
+ Redistribution and use in source and binary forms, with or without
22
+ modification, are permitted provided that the following conditions are met:
23
+
24
+ 1. Redistributions of source code must retain the above copyright notice,
25
+ this list of conditions and the following disclaimer.
26
+
27
+ 2. Redistributions in binary form must reproduce the above copyright notice,
28
+ this list of conditions and the following disclaimer in the documentation
29
+ and/or other materials provided with the distribution.
30
+
31
+ 3. Neither the name of the copyright holder nor the names of its
32
+ contributors may be used to endorse or promote products derived from
33
+ this software without specific prior written permission.
34
+
35
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
36
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
37
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
38
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
39
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
40
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
41
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
42
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
43
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
44
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
45
+ ```
46
+
47
+ ---
48
+
49
+ ## Other Dependencies
50
+
51
+ This project also depends on the following open-source libraries. Please refer to their respective repositories for detailed license information:
52
+
53
+ - **NumPy** - BSD License
54
+ - **Pandas** - BSD License
55
+ - **SciPy** - BSD License
56
+ - **Matplotlib** - PSF-based License
57
+ - **h5py** - BSD License
58
+ - **Bokeh** - BSD License
59
+ - **Panel** - BSD License
60
+ - **Polars** - MIT License
61
+ - **scikit-learn** - BSD License
62
+ - **and others** - See pyproject.toml for complete dependency list
63
+
64
+ For the most up-to-date license information for these dependencies, please refer to their official repositories and documentation.
@@ -1,7 +1,7 @@
1
1
 
2
2
  [project]
3
3
  name = "masster"
4
- version = "0.5.25"
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]