groupoid 0.1.0.dev5__tar.gz → 0.1.0.dev6__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.
Files changed (85) hide show
  1. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/.github/workflows/auto-tag-release.yml +23 -5
  2. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/.github/workflows/docs-deploy.yml +1 -1
  3. groupoid-0.1.0.dev6/.github/workflows/release.yml +624 -0
  4. groupoid-0.1.0.dev6/.zenodo.json +39 -0
  5. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/CHANGELOG.md +70 -1
  6. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/CITATION.cff +1 -1
  7. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/LIMITATIONS.md +13 -7
  8. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/PKG-INFO +8 -4
  9. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/PROBLEMS.md +29 -5
  10. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/README.md +7 -3
  11. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/REPRODUCE.md +1 -1
  12. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/STATUS.md +4 -4
  13. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/codemeta.json +1 -1
  14. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/groupoid/__init__.py +1 -1
  15. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/groupoid/aggregation.py +29 -7
  16. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/groupoid/cohomology.py +9 -0
  17. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/groupoid/persistence.py +9 -1
  18. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/groupoid/transport.py +42 -23
  19. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/groupoid.egg-info/PKG-INFO +8 -4
  20. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/groupoid.egg-info/SOURCES.txt +1 -0
  21. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/pyproject.toml +5 -4
  22. groupoid-0.1.0.dev6/tests/test_audit_regressions.py +250 -0
  23. groupoid-0.1.0.dev6/tests/test_release_workflow_integrity.py +784 -0
  24. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/tests/test_transport_validation.py +30 -18
  25. groupoid-0.1.0.dev5/.github/workflows/release.yml +0 -222
  26. groupoid-0.1.0.dev5/.zenodo.json +0 -39
  27. groupoid-0.1.0.dev5/tests/test_release_workflow_integrity.py +0 -100
  28. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  29. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  30. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/.github/ISSUE_TEMPLATE/mathematical_correction.md +0 -0
  31. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/.github/dependabot.yml +0 -0
  32. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/.github/scripts/install_torch_cpu.sh +0 -0
  33. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/.github/workflows/ci.yml +0 -0
  34. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/.gitignore +0 -0
  35. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/.pre-commit-config.yaml +0 -0
  36. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/CONTRIBUTING.md +0 -0
  37. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/CORRECTION_NOTICE.md +0 -0
  38. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/LICENSE +0 -0
  39. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/SECURITY.md +0 -0
  40. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/benchmarks/__init__.py +0 -0
  41. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/benchmarks/conftest.py +0 -0
  42. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/benchmarks/test_karcher_benchmark.py +0 -0
  43. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/docs/api.md +0 -0
  44. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/docs/index.md +0 -0
  45. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/docs/overrides/404.html +0 -0
  46. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/docs/quickstart.md +0 -0
  47. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/docs/theory.md +0 -0
  48. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/examples/README.md +0 -0
  49. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/examples/__init__.py +0 -0
  50. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/examples/synthetic_curve_demo.py +0 -0
  51. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/experiments/PREREGISTRATION.md +0 -0
  52. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/experiments/README.md +0 -0
  53. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/experiments/RESULTS.md +0 -0
  54. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/experiments/analyze.py +0 -0
  55. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/experiments/results.json +0 -0
  56. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/experiments/run_benchmark.py +0 -0
  57. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/groupoid/groupoid.py +0 -0
  58. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/groupoid/laplacian.py +0 -0
  59. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/groupoid/manifold.py +0 -0
  60. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/groupoid/optimizer.py +0 -0
  61. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/groupoid/sheaf.py +0 -0
  62. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/groupoid.egg-info/dependency_links.txt +0 -0
  63. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/groupoid.egg-info/requires.txt +0 -0
  64. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/groupoid.egg-info/top_level.txt +0 -0
  65. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/mkdocs.yml +0 -0
  66. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/scripts/bind_release_sbom.py +0 -0
  67. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/scripts/reproduce_sheaf_laplacian.py +0 -0
  68. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/setup.cfg +0 -0
  69. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/tests/__init__.py +0 -0
  70. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/tests/test_aggregation_disconnected.py +0 -0
  71. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/tests/test_cohomology_cocycle.py +0 -0
  72. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/tests/test_coverage_gaps.py +0 -0
  73. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/tests/test_defensive_paths.py +0 -0
  74. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/tests/test_imports.py +0 -0
  75. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/tests/test_integration.py +0 -0
  76. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/tests/test_optimizer_validation.py +0 -0
  77. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/tests/test_persistence.py +0 -0
  78. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/tests/test_persistence_dimension_labels.py +0 -0
  79. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/tests/test_pipeline_integration.py +0 -0
  80. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/tests/test_release_sbom_binding.py +0 -0
  81. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/tests/test_scientific_corrections.py +0 -0
  82. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/tests/test_sheaf_laplacian.py +0 -0
  83. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/tests/test_smoke.py +0 -0
  84. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/tests/theory/__init__.py +0 -0
  85. {groupoid-0.1.0.dev5 → groupoid-0.1.0.dev6}/tests/theory/test_mathematical_invariants.py +0 -0
@@ -23,17 +23,23 @@ name: Auto Tag Release
23
23
  # missing, so a pre-existing manual tag always takes precedence and this
24
24
  # workflow becomes a no-op for that version.
25
25
 
26
+ # Tag only a main commit whose CI run succeeded. The tag-exists check below
27
+ # keeps this idempotent for CI runs on commits that did not bump the version.
26
28
  on:
27
- push:
28
- branches: [main]
29
- paths:
30
- - pyproject.toml
29
+ workflow_run:
30
+ workflows: ["CI"]
31
+ types: [completed]
31
32
 
32
33
  permissions:
33
34
  contents: read
34
35
 
35
36
  jobs:
36
37
  tag:
38
+ if: >-
39
+ ${{ github.event.workflow_run.conclusion == 'success' &&
40
+ github.event.workflow_run.event == 'push' &&
41
+ github.event.workflow_run.head_branch == 'main' &&
42
+ github.event.workflow_run.head_repository.full_name == github.repository }}
37
43
  runs-on: ubuntu-latest
38
44
  permissions:
39
45
  contents: write # push the tag
@@ -41,14 +47,26 @@ jobs:
41
47
  steps:
42
48
  - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
43
49
  with:
50
+ ref: ${{ github.event.workflow_run.head_sha }}
44
51
  fetch-depth: 0 # need full tag history to check for an existing tag
45
52
 
46
53
  - name: Create the release tag if this version doesn't have one yet, and dispatch the release
47
54
  env:
48
55
  GH_TOKEN: ${{ github.token }}
56
+ CI_SHA: ${{ github.event.workflow_run.head_sha }}
49
57
  run: |
50
58
  set -euo pipefail
51
59
 
60
+ # Tag only the exact commit that passed CI, and only while it is
61
+ # still the head of main.
62
+ ci_sha="${CI_SHA}"
63
+ [ "$(git rev-parse HEAD)" = "${ci_sha}" ]
64
+ main_sha="$(gh api "repos/${GITHUB_REPOSITORY}/git/ref/heads/main" --jq .object.sha)"
65
+ if [ "${main_sha}" != "${ci_sha}" ]; then
66
+ echo "main advanced past ${ci_sha}; the newer head's CI run decides."
67
+ exit 0
68
+ fi
69
+
52
70
  version=$(grep -m1 '^version = "' pyproject.toml | sed -E 's/version = "(.*)"/\1/')
53
71
  if [ -z "${version}" ]; then
54
72
  echo "::error::could not extract a version from pyproject.toml"
@@ -60,7 +78,7 @@ jobs:
60
78
  # anything else. A version that doesn't match this is presumably
61
79
  # intentional and unusual enough to want a human tagging it by
62
80
  # hand rather than this automation guessing.
63
- if ! echo "${version}" | grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+(\.dev[0-9]+|a[0-9]+|b[0-9]+|rc[0-9]+)?$'; then
81
+ if ! echo "${version}" | grep -Eq '^(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)(\.dev(0|[1-9][0-9]*)|a(0|[1-9][0-9]*)|b(0|[1-9][0-9]*)|rc(0|[1-9][0-9]*))?$'; then
64
82
  echo "::error::version '${version}' is not a recognized release format (expected X.Y.Z, optionally with .devN/aN/bN/rcN, no local metadata); refusing to tag automatically. Tag it manually if this is intentional."
65
83
  exit 1
66
84
  fi
@@ -42,4 +42,4 @@ jobs:
42
42
  url: ${{ steps.deployment.outputs.page_url }}
43
43
  steps:
44
44
  - id: deployment
45
- uses: actions/deploy-pages@cd2ce8fcbc39b97be8ca5fce6e763baed58fa128 # v5
45
+ uses: actions/deploy-pages@368f82528645a54fb793d4d04e342629a3f51346 # v5