Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
bbf59f0
Perf: vectorise Pandas datetime/timespan import+export; add Cython di…
stewjb Apr 4, 2026
346a150
Fix: wrap long conditional line to stay under 120 chars (E501)
stewjb Apr 4, 2026
7c3535d
Perf: zero-copy Pandas datetime/timespan export; single-pass NaT import
stewjb Apr 4, 2026
b39020f
Perf: vectorise date export; fix any(Series) hotspot; use DataFrame c…
stewjb Apr 4, 2026
f9d2e63
Perf: faster time export; drop redundant timedelta copy; guard object…
stewjb Apr 4, 2026
debf567
Fix: use np.asarray for date export to handle full year-1..9999 range
stewjb Apr 4, 2026
53b93b1
Test: add temporal edge-case coverage for optimized export/import paths
stewjb Apr 4, 2026
b74724c
Test: add empty-DataFrame and multi-chunk export tests for bounds safety
stewjb Apr 4, 2026
b188627
Revert "CI: add no_polars test environment to verify package works wi…
stewjb Apr 4, 2026
128de86
CI: add AddressSanitizer job to catch out-of-bounds access in native …
stewjb Apr 4, 2026
0319d65
Fix: rename df/df2 variables to satisfy pylint invalid-name rule (min…
stewjb Apr 4, 2026
ca99bf7
Fix: add intercept_cxx_exceptions=0 to ASAN_OPTIONS to suppress matpl…
stewjb Apr 4, 2026
eff1941
Fix: type: ignore for pd.array NaT overloads; pin ASan job to Python …
stewjb Apr 4, 2026
acb1054
CI: fix ASan crash by dropping pybind11 packages; bump actions to Nod…
stewjb Apr 4, 2026
544205b
Fix: make geopandas/matplotlib/seaborn imports optional; add CI concu…
stewjb Apr 4, 2026
53b6082
Fix: add explicit 'import matplotlib' so pylint recognises it as a mo…
stewjb Apr 4, 2026
d83e78f
Perf: direct pointer access in string/binary C helpers; eliminate sli…
stewjb Apr 4, 2026
7c1ed67
Fix: align continuation lines in sbdf_helpers.pxi to fix E127 pycodes…
stewjb Apr 5, 2026
fd7479c
linting
stewjb Apr 5, 2026
bb1d35d
Fix: remove stray 'git checkout' prefix from test_sbdf.py module docs…
stewjb Apr 5, 2026
87d0d07
Fix: wrap long function signatures in sbdf_helpers.c/.h to satisfy cp…
stewjb Apr 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 51 additions & 14 deletions .github/workflows/build.yaml
Original file line number Diff line number Diff line change
@@ -1,15 +1,20 @@
name: Build and Test Package
on: [push, pull_request]
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
env:
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
jobs:
build-sdist:
name: Build Source Dist
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
with:
submodules: recursive
- name: Set Up Python
uses: actions/setup-python@v5
uses: actions/setup-python@v6
with:
python-version: '3.x'
- name: Install Tools
Expand All @@ -18,11 +23,11 @@ jobs:
- name: Source Packaging
run: |
python -m build --sdist
- uses: actions/upload-artifact@v4
- uses: actions/upload-artifact@v7
with:
name: sdist
path: 'dist/spotfire-*.tar.gz'
- uses: actions/upload-artifact@v4
- uses: actions/upload-artifact@v7
with:
name: test-files
path: |
Expand Down Expand Up @@ -50,12 +55,12 @@ jobs:
operating-system: ['ubuntu-latest', 'windows-latest']
fail-fast: false
steps:
- uses: actions/download-artifact@v4
- uses: actions/download-artifact@v8
with:
name: sdist
path: dist
- name: Set Up Python
uses: actions/setup-python@v5
uses: actions/setup-python@v6
with:
python-version: ${{ matrix.python-version }}
- name: Install Build Requirements
Expand All @@ -81,7 +86,7 @@ jobs:
python -m build --wheel
# Move wheel out of build dir into top-level dist dir
mv dist\*.whl ..\dist
- uses: actions/upload-artifact@v4
- uses: actions/upload-artifact@v7
with:
name: wheel-${{ matrix.python-version }}-${{ matrix.operating-system }}
path: 'dist/spotfire-*.whl'
Expand All @@ -96,16 +101,16 @@ jobs:
test-environment: ${{ fromJson(needs.build-sdist.outputs.test-environments) }}
fail-fast: false
steps:
- uses: actions/download-artifact@v4
- uses: actions/download-artifact@v8
with:
name: wheel-${{ matrix.python-version }}-${{ matrix.operating-system }}
path: dist
- uses: actions/download-artifact@v4
- uses: actions/download-artifact@v8
with:
name: test-files
path: test-files
- name: Set Up Python
uses: actions/setup-python@v5
uses: actions/setup-python@v6
with:
python-version: ${{ matrix.python-version }}
- name: Install Dependencies (Linux)
Expand All @@ -122,7 +127,7 @@ jobs:
env:
TEST_FILES_DIR: ${{ github.workspace }}/test-files/spotfire/test/files
TEST_ENVIRONMENT: ${{ matrix.test-environment }}
- uses: actions/upload-artifact@v4
- uses: actions/upload-artifact@v7
if: ${{ always() }}
with:
name: test-results-${{ matrix.python-version }}-${{ matrix.operating-system }}-${{ matrix.test-environment }}
Expand All @@ -138,14 +143,14 @@ jobs:
echo -n "python-version=" >> $GITHUB_OUTPUT
echo '${{ needs.build-sdist.outputs.python-versions }}' | sed -e 's/[^"]*"//' -e 's/".*//' >> $GITHUB_OUTPUT
- name: Set Up Python
uses: actions/setup-python@v5
uses: actions/setup-python@v6
with:
python-version: ${{ steps.version.outputs.python-version }}
- uses: actions/download-artifact@v4
- uses: actions/download-artifact@v8
with:
name: sdist
path: dist
- uses: actions/download-artifact@v4
- uses: actions/download-artifact@v8
with:
name: wheel-${{ steps.version.outputs.python-version }}-ubuntu-latest
path: dist
Expand All @@ -163,3 +168,35 @@ jobs:
mypy spotfire
cython-lint spotfire vendor
find spotfire -name '*_helpers.[ch]' | xargs cpplint --repository=.
asan:
name: AddressSanitizer
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
with:
submodules: recursive
- uses: actions/setup-python@v6
with:
python-version: '3.13'
- name: Install dependencies
run: |
pip install setuptools Cython "numpy>=2.0.0rc1"
pip install ".[polars]"
pip install html-testRunner polars pillow
- name: Rebuild extension with AddressSanitizer
env:
CFLAGS: "-fsanitize=address -fno-omit-frame-pointer -g"
LDFLAGS: "-fsanitize=address"
run: python setup.py build_ext --inplace
- name: Run tests under AddressSanitizer
run: |
LIBASAN=$(gcc -print-file-name=libasan.so)
LD_PRELOAD="$LIBASAN" PYTHONMALLOC=malloc python -m spotfire.test
env:
ASAN_OPTIONS: "detect_leaks=0:allocator_may_return_null=1:intercept_cxx_exceptions=0"
TEST_ENVIRONMENT: asan
- uses: actions/upload-artifact@v7
if: always()
with:
name: test-results-asan
path: build/test-results/*.html
4 changes: 2 additions & 2 deletions .github/workflows/pylint.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,11 @@ jobs:
name: Check Linters
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
with:
submodules: recursive
- name: Set Up Python
uses: actions/setup-python@v5
uses: actions/setup-python@v6
with:
python-version: '3.x'
- name: Install Tools
Expand Down
22 changes: 11 additions & 11 deletions .github/workflows/sbom.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ jobs:
outputs:
python-versions: ${{ steps.dynamic.outputs.pythons }}
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- name: Read python-versions
id: dynamic
run: |
Expand All @@ -48,14 +48,14 @@ jobs:
needs: setup
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
with:
submodules: recursive # needed for vendor/sbdf-c when building/installing sdist

# workflow_run: reuse artifact from build.yaml — no rebuild
- name: Download sdist (from workflow_run)
if: github.event_name == 'workflow_run'
uses: actions/download-artifact@v4
uses: actions/download-artifact@v8
with:
name: sdist
path: dist
Expand All @@ -64,7 +64,7 @@ jobs:

# push / release / workflow_dispatch: build fresh
- name: Set Up Python
uses: actions/setup-python@v5
uses: actions/setup-python@v6
with:
python-version: '3.x'
- name: Build sdist
Expand Down Expand Up @@ -118,7 +118,7 @@ jobs:
--tool "trivy-${{ env.TRIVY_VERSION }}"

- name: Upload SBOM artifact
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: sbom-sdist
path: spotfire-sdist.sbom.spdx.json
Expand All @@ -133,14 +133,14 @@ jobs:
python-version: ${{ fromJson(needs.setup.outputs.python-versions) }}
fail-fast: false
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
with:
submodules: recursive # needed for vendor/sbdf-c when building wheel fresh

# workflow_run: reuse the ubuntu wheel artifact from build.yaml — no rebuild
- name: Download wheel (from workflow_run)
if: github.event_name == 'workflow_run'
uses: actions/download-artifact@v4
uses: actions/download-artifact@v8
with:
name: wheel-${{ matrix.python-version }}-ubuntu-latest
path: dist
Expand All @@ -150,7 +150,7 @@ jobs:
# Also download the sdist so scan-env can install from it (wheel is platform-specific)
- name: Download sdist (from workflow_run)
if: github.event_name == 'workflow_run'
uses: actions/download-artifact@v4
uses: actions/download-artifact@v8
with:
name: sdist
path: dist
Expand All @@ -160,7 +160,7 @@ jobs:
# push / release / workflow_dispatch: build fresh on Linux
- name: Set Up Python
if: github.event_name != 'workflow_run'
uses: actions/setup-python@v5
uses: actions/setup-python@v6
with:
python-version: ${{ matrix.python-version }}
- name: Build wheel
Expand Down Expand Up @@ -221,7 +221,7 @@ jobs:
--tool "trivy-${{ env.TRIVY_VERSION }}"

- name: Upload SBOM artifact
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: sbom-wheel-${{ matrix.python-version }}
path: spotfire-wheel-${{ matrix.python-version }}.sbom.spdx.json
Expand All @@ -234,7 +234,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Download all SBOM artifacts
uses: actions/download-artifact@v4
uses: actions/download-artifact@v8
with:
pattern: sbom-*
path: all-sboms
Expand Down
Loading