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.

Files changed (100) hide show
  1. masster-0.4.9/.github/workflows/publish.yml +174 -0
  2. masster-0.4.9/.github/workflows/security.yml +88 -0
  3. masster-0.4.9/.github/workflows/test.yml +164 -0
  4. masster-0.4.9/.gitignore +210 -0
  5. masster-0.4.9/.pre-commit-config.yaml +96 -0
  6. masster-0.4.9/Makefile +76 -0
  7. masster-0.4.9/PKG-INFO +788 -0
  8. {masster-0.4.5 → masster-0.4.9}/README.md +6 -6
  9. masster-0.4.9/TESTING.md +243 -0
  10. masster-0.4.9/demo/example_batch_process.py +190 -0
  11. masster-0.4.9/demo/example_sample_process.py +24 -0
  12. {masster-0.4.5 → masster-0.4.9}/pyproject.toml +19 -48
  13. {masster-0.4.5 → masster-0.4.9}/src/masster/__init__.py +8 -8
  14. {masster-0.4.5 → masster-0.4.9}/src/masster/_version.py +1 -1
  15. {masster-0.4.5 → masster-0.4.9}/src/masster/chromatogram.py +2 -2
  16. {masster-0.4.5 → masster-0.4.9}/src/masster/logger.py +11 -11
  17. {masster-0.4.5 → masster-0.4.9}/src/masster/sample/__init__.py +1 -1
  18. {masster-0.4.5 → masster-0.4.9}/src/masster/sample/adducts.py +1 -1
  19. {masster-0.4.5 → masster-0.4.9}/src/masster/sample/h5.py +7 -7
  20. {masster-0.4.5 → masster-0.4.9}/src/masster/sample/lib.py +2 -2
  21. {masster-0.4.5 → masster-0.4.9}/src/masster/sample/load.py +8 -8
  22. {masster-0.4.5 → masster-0.4.9}/src/masster/sample/parameters.py +1 -1
  23. {masster-0.4.5 → masster-0.4.9}/src/masster/sample/plot.py +2 -2
  24. {masster-0.4.5 → masster-0.4.9}/src/masster/sample/processing.py +2 -2
  25. {masster-0.4.5 → masster-0.4.9}/src/masster/sample/sample.py +86 -86
  26. {masster-0.4.5 → masster-0.4.9}/src/masster/sample/save.py +1 -1
  27. {masster-0.4.5 → masster-0.4.9}/src/masster/spectrum.py +2 -2
  28. {masster-0.4.5 → masster-0.4.9}/src/masster/study/__init__.py +1 -1
  29. {masster-0.4.5 → masster-0.4.9}/src/masster/study/export.py +7 -7
  30. {masster-0.4.5 → masster-0.4.9}/src/masster/study/h5.py +6 -6
  31. {masster-0.4.5 → masster-0.4.9}/src/masster/study/helpers.py +339 -146
  32. {masster-0.4.5 → masster-0.4.9}/src/masster/study/id.py +4 -4
  33. {masster-0.4.5 → masster-0.4.9}/src/masster/study/load.py +6 -6
  34. {masster-0.4.5 → masster-0.4.9}/src/masster/study/plot.py +3 -3
  35. {masster-0.4.5 → masster-0.4.9}/src/masster/study/processing.py +3 -3
  36. {masster-0.4.5 → masster-0.4.9}/src/masster/study/save.py +1 -1
  37. {masster-0.4.5 → masster-0.4.9}/src/masster/study/study.py +98 -98
  38. masster-0.4.9/tests/conftest.py +12 -0
  39. masster-0.4.9/tests/test_chromatogram.py +193 -0
  40. masster-0.4.9/tests/test_defaults.py +384 -0
  41. masster-0.4.9/tests/test_imports.py +76 -0
  42. masster-0.4.9/tests/test_integration.py +132 -0
  43. masster-0.4.9/tests/test_logger.py +268 -0
  44. masster-0.4.9/tests/test_parameters.py +109 -0
  45. masster-0.4.9/tests/test_sample.py +170 -0
  46. masster-0.4.9/tests/test_spectrum.py +143 -0
  47. masster-0.4.9/tests/test_study.py +133 -0
  48. masster-0.4.9/tests/test_version.py +51 -0
  49. masster-0.4.9/tox.ini +61 -0
  50. masster-0.4.9/uv.lock +3429 -0
  51. masster-0.4.5/MANIFEST.in +0 -8
  52. masster-0.4.5/PKG-INFO +0 -131
  53. masster-0.4.5/setup.cfg +0 -4
  54. masster-0.4.5/src/masster/data/libs/__pycache__/ccm.cpython-312.pyc +0 -0
  55. masster-0.4.5/src/masster/data/libs/__pycache__/urine.cpython-312.pyc +0 -0
  56. masster-0.4.5/src/masster/lib/__init__.py +0 -9
  57. masster-0.4.5/src/masster/lib/lib.py +0 -598
  58. masster-0.4.5/src/masster/study/helpers_optimized.py +0 -359
  59. masster-0.4.5/src/masster.egg-info/PKG-INFO +0 -131
  60. masster-0.4.5/src/masster.egg-info/SOURCES.txt +0 -75
  61. masster-0.4.5/src/masster.egg-info/dependency_links.txt +0 -1
  62. masster-0.4.5/src/masster.egg-info/entry_points.txt +0 -2
  63. masster-0.4.5/src/masster.egg-info/requires.txt +0 -48
  64. masster-0.4.5/src/masster.egg-info/top_level.txt +0 -1
  65. {masster-0.4.5 → masster-0.4.9}/LICENSE +0 -0
  66. {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
  67. {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
  68. {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
  69. {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
  70. {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
  71. {masster-0.4.5 → masster-0.4.9}/src/masster/data/libs/ccm.csv +0 -0
  72. {masster-0.4.5 → masster-0.4.9}/src/masster/data/libs/urine.csv +0 -0
  73. {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
  74. {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
  75. {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
  76. {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
  77. {masster-0.4.5 → masster-0.4.9}/src/masster/sample/defaults/__init__.py +0 -0
  78. {masster-0.4.5 → masster-0.4.9}/src/masster/sample/defaults/find_adducts_def.py +0 -0
  79. {masster-0.4.5 → masster-0.4.9}/src/masster/sample/defaults/find_features_def.py +0 -0
  80. {masster-0.4.5 → masster-0.4.9}/src/masster/sample/defaults/find_ms2_def.py +0 -0
  81. {masster-0.4.5 → masster-0.4.9}/src/masster/sample/defaults/get_spectrum_def.py +0 -0
  82. {masster-0.4.5 → masster-0.4.9}/src/masster/sample/defaults/sample_def.py +0 -0
  83. {masster-0.4.5 → masster-0.4.9}/src/masster/sample/helpers.py +0 -0
  84. {masster-0.4.5 → masster-0.4.9}/src/masster/sample/quant.py +0 -0
  85. {masster-0.4.5 → masster-0.4.9}/src/masster/sample/sample5_schema.json +0 -0
  86. {masster-0.4.5 → masster-0.4.9}/src/masster/sample/sciex.py +0 -0
  87. {masster-0.4.5 → masster-0.4.9}/src/masster/study/defaults/__init__.py +0 -0
  88. {masster-0.4.5 → masster-0.4.9}/src/masster/study/defaults/align_def.py +0 -0
  89. {masster-0.4.5 → masster-0.4.9}/src/masster/study/defaults/export_def.py +0 -0
  90. {masster-0.4.5 → masster-0.4.9}/src/masster/study/defaults/fill_chrom_def.py +0 -0
  91. {masster-0.4.5 → masster-0.4.9}/src/masster/study/defaults/fill_def.py +0 -0
  92. {masster-0.4.5 → masster-0.4.9}/src/masster/study/defaults/find_consensus_def.py +0 -0
  93. {masster-0.4.5 → masster-0.4.9}/src/masster/study/defaults/find_ms2_def.py +0 -0
  94. {masster-0.4.5 → masster-0.4.9}/src/masster/study/defaults/identify_def.py +0 -0
  95. {masster-0.4.5 → masster-0.4.9}/src/masster/study/defaults/integrate_chrom_def.py +0 -0
  96. {masster-0.4.5 → masster-0.4.9}/src/masster/study/defaults/integrate_def.py +0 -0
  97. {masster-0.4.5 → masster-0.4.9}/src/masster/study/defaults/merge_def.py +0 -0
  98. {masster-0.4.5 → masster-0.4.9}/src/masster/study/defaults/study_def.py +0 -0
  99. {masster-0.4.5 → masster-0.4.9}/src/masster/study/parameters.py +0 -0
  100. {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/
@@ -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__/