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