sensorswave-sdk 0.1.0__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.
- sensorswave_sdk-0.1.0/.github/workflows/lint.yml +75 -0
- sensorswave_sdk-0.1.0/.github/workflows/release.yml +46 -0
- sensorswave_sdk-0.1.0/.github/workflows/security.yml +35 -0
- sensorswave_sdk-0.1.0/.github/workflows/test.yml +58 -0
- sensorswave_sdk-0.1.0/.gitignore +28 -0
- sensorswave_sdk-0.1.0/Makefile +22 -0
- sensorswave_sdk-0.1.0/PKG-INFO +678 -0
- sensorswave_sdk-0.1.0/README.md +651 -0
- sensorswave_sdk-0.1.0/README.zh-CN.md +642 -0
- sensorswave_sdk-0.1.0/examples/ab_example.py +260 -0
- sensorswave_sdk-0.1.0/examples/quickstart.py +157 -0
- sensorswave_sdk-0.1.0/pyproject.toml +69 -0
- sensorswave_sdk-0.1.0/src/sensorswave/__init__.py +72 -0
- sensorswave_sdk-0.1.0/src/sensorswave/__version__.py +1 -0
- sensorswave_sdk-0.1.0/src/sensorswave/ab.py +1214 -0
- sensorswave_sdk-0.1.0/src/sensorswave/client.py +823 -0
- sensorswave_sdk-0.1.0/src/sensorswave/constants.py +39 -0
- sensorswave_sdk-0.1.0/src/sensorswave/errors.py +33 -0
- sensorswave_sdk-0.1.0/src/sensorswave/models.py +212 -0
- sensorswave_sdk-0.1.0/src/sensorswave/signing.py +94 -0
- sensorswave_sdk-0.1.0/src/sensorswave/transport.py +152 -0
- sensorswave_sdk-0.1.0/tests/conformance/loader.py +79 -0
- sensorswave_sdk-0.1.0/tests/conformance/test_ABCoreEvaluation.py +142 -0
- sensorswave_sdk-0.1.0/tests/conformance/test_ABMetaSnapshotBootstrap.py +122 -0
- sensorswave_sdk-0.1.0/tests/conformance/test_ClientSDKCore.py +66 -0
- sensorswave_sdk-0.1.0/tests/conformance/test_RequestSigningACS3.py +33 -0
- sensorswave_sdk-0.1.0/tests/conformance/test_TrackingCore.py +93 -0
- sensorswave_sdk-0.1.0/tests/conformance/test_UserProfileOps.py +110 -0
- sensorswave_sdk-0.1.0/tests/conformance/test_loader.py +77 -0
- sensorswave_sdk-0.1.0/tests/fixtures/conformance/fixtures/ab-core-evaluation.json +1997 -0
- sensorswave_sdk-0.1.0/tests/fixtures/conformance/fixtures/ab-meta-snapshot-bootstrap.json +38 -0
- sensorswave_sdk-0.1.0/tests/fixtures/conformance/fixtures/client-sdk-core.json +46 -0
- sensorswave_sdk-0.1.0/tests/fixtures/conformance/fixtures/request-signing-acs3.json +33 -0
- sensorswave_sdk-0.1.0/tests/fixtures/conformance/fixtures/tracking-core.json +84 -0
- sensorswave_sdk-0.1.0/tests/fixtures/conformance/fixtures/user-profile-ops.json +72 -0
- sensorswave_sdk-0.1.0/tests/fixtures/conformance/golden/ab-core-evaluation.json +3332 -0
- sensorswave_sdk-0.1.0/tests/fixtures/conformance/golden/ab-meta-snapshot-bootstrap.json +264 -0
- sensorswave_sdk-0.1.0/tests/fixtures/conformance/golden/client-sdk-core.json +60 -0
- sensorswave_sdk-0.1.0/tests/fixtures/conformance/golden/request-signing-acs3.json +29 -0
- sensorswave_sdk-0.1.0/tests/fixtures/conformance/golden/tracking-core.json +103 -0
- sensorswave_sdk-0.1.0/tests/fixtures/conformance/golden/user-profile-ops.json +107 -0
- sensorswave_sdk-0.1.0/tests/helpers.py +39 -0
- sensorswave_sdk-0.1.0/tests/test_ab_core.py +531 -0
- sensorswave_sdk-0.1.0/tests/test_ab_meta.py +481 -0
- sensorswave_sdk-0.1.0/tests/test_client_core.py +637 -0
- sensorswave_sdk-0.1.0/tests/test_public_api.py +133 -0
- sensorswave_sdk-0.1.0/tests/test_signing.py +106 -0
- sensorswave_sdk-0.1.0/tests/test_tracking.py +137 -0
- sensorswave_sdk-0.1.0/tests/test_transport.py +110 -0
- sensorswave_sdk-0.1.0/tests/test_user_profile.py +199 -0
- sensorswave_sdk-0.1.0/tests/testdata/config/first_match_wins.json +109 -0
- sensorswave_sdk-0.1.0/tests/testdata/config/holdout.json +78 -0
- sensorswave_sdk-0.1.0/tests/testdata/config/override.json +89 -0
- sensorswave_sdk-0.1.0/tests/testdata/config/public.json +70 -0
- sensorswave_sdk-0.1.0/tests/testdata/config/qa_complex_running.json +125 -0
- sensorswave_sdk-0.1.0/tests/testdata/config/qa_debug_override.json +54 -0
- sensorswave_sdk-0.1.0/tests/testdata/config/qa_live_complex_20260520.json +132 -0
- sensorswave_sdk-0.1.0/tests/testdata/config/qa_live_multi_20260520.json +75 -0
- sensorswave_sdk-0.1.0/tests/testdata/config/qa_live_multi_gate_default_20260521.json +105 -0
- sensorswave_sdk-0.1.0/tests/testdata/config/qa_live_multi_gate_variants_20260521.json +145 -0
- sensorswave_sdk-0.1.0/tests/testdata/config/qa_multi_user_variants.json +74 -0
- sensorswave_sdk-0.1.0/tests/testdata/config/qa_released_variant.json +55 -0
- sensorswave_sdk-0.1.0/tests/testdata/config/qa_target_blocked.json +65 -0
- sensorswave_sdk-0.1.0/tests/testdata/config/sticky.json +56 -0
- sensorswave_sdk-0.1.0/tests/testdata/config/target.json +70 -0
- sensorswave_sdk-0.1.0/tests/testdata/config/variant_group_decimal.json +68 -0
- sensorswave_sdk-0.1.0/tests/testdata/exp/gate_target_fail.json +106 -0
- sensorswave_sdk-0.1.0/tests/testdata/exp/gate_target_pass.json +115 -0
- sensorswave_sdk-0.1.0/tests/testdata/exp/holdout.json +81 -0
- sensorswave_sdk-0.1.0/tests/testdata/exp/layer.json +83 -0
- sensorswave_sdk-0.1.0/tests/testdata/exp/layer_with_holdout.json +90 -0
- sensorswave_sdk-0.1.0/tests/testdata/exp/public.json +80 -0
- sensorswave_sdk-0.1.0/tests/testdata/exp/release.json +75 -0
- sensorswave_sdk-0.1.0/tests/testdata/exp/sticky.json +74 -0
- sensorswave_sdk-0.1.0/tests/testdata/exp/target.json +76 -0
- sensorswave_sdk-0.1.0/tests/testdata/gate/after.json +45 -0
- sensorswave_sdk-0.1.0/tests/testdata/gate/anon_id.json +45 -0
- sensorswave_sdk-0.1.0/tests/testdata/gate/anyof_insensitive.json +47 -0
- sensorswave_sdk-0.1.0/tests/testdata/gate/anyof_sensitive.json +47 -0
- sensorswave_sdk-0.1.0/tests/testdata/gate/before.json +45 -0
- sensorswave_sdk-0.1.0/tests/testdata/gate/complicate.json +135 -0
- sensorswave_sdk-0.1.0/tests/testdata/gate/complicate_anon_rollout100.json +135 -0
- sensorswave_sdk-0.1.0/tests/testdata/gate/custom_field.json +60 -0
- sensorswave_sdk-0.1.0/tests/testdata/gate/disable.json +45 -0
- sensorswave_sdk-0.1.0/tests/testdata/gate/eq.json +45 -0
- sensorswave_sdk-0.1.0/tests/testdata/gate/equal_version.json +45 -0
- sensorswave_sdk-0.1.0/tests/testdata/gate/first_match_wins.json +75 -0
- sensorswave_sdk-0.1.0/tests/testdata/gate/gate_circular.json +79 -0
- sensorswave_sdk-0.1.0/tests/testdata/gate/gate_fail.json +79 -0
- sensorswave_sdk-0.1.0/tests/testdata/gate/gate_filter.json +79 -0
- sensorswave_sdk-0.1.0/tests/testdata/gate/gate_filter_easy_pass.json +79 -0
- sensorswave_sdk-0.1.0/tests/testdata/gate/greater_equal_version.json +45 -0
- sensorswave_sdk-0.1.0/tests/testdata/gate/greater_version.json +45 -0
- sensorswave_sdk-0.1.0/tests/testdata/gate/gte_number.json +45 -0
- sensorswave_sdk-0.1.0/tests/testdata/gate/holdout.json +54 -0
- sensorswave_sdk-0.1.0/tests/testdata/gate/invalid_common_field.json +45 -0
- sensorswave_sdk-0.1.0/tests/testdata/gate/is_false.json +45 -0
- sensorswave_sdk-0.1.0/tests/testdata/gate/is_true.json +45 -0
- sensorswave_sdk-0.1.0/tests/testdata/gate/isnotnull.json +45 -0
- sensorswave_sdk-0.1.0/tests/testdata/gate/isnull.json +45 -0
- sensorswave_sdk-0.1.0/tests/testdata/gate/less_equal_version.json +45 -0
- sensorswave_sdk-0.1.0/tests/testdata/gate/less_version.json +45 -0
- sensorswave_sdk-0.1.0/tests/testdata/gate/lt_number.json +45 -0
- sensorswave_sdk-0.1.0/tests/testdata/gate/lte_number.json +45 -0
- sensorswave_sdk-0.1.0/tests/testdata/gate/missing_gate_rules.json +29 -0
- sensorswave_sdk-0.1.0/tests/testdata/gate/multi_gates.json +117 -0
- sensorswave_sdk-0.1.0/tests/testdata/gate/neq_number.json +45 -0
- sensorswave_sdk-0.1.0/tests/testdata/gate/noneof_insentive.json +48 -0
- sensorswave_sdk-0.1.0/tests/testdata/gate/noneof_sensitive.json +48 -0
- sensorswave_sdk-0.1.0/tests/testdata/gate/not_equal.json +45 -0
- sensorswave_sdk-0.1.0/tests/testdata/gate/override_condition.json +85 -0
- sensorswave_sdk-0.1.0/tests/testdata/gate/override_id.json +66 -0
- sensorswave_sdk-0.1.0/tests/testdata/gate/public.json +45 -0
- sensorswave_sdk-0.1.0/tests/testdata/gate/release.json +44 -0
- sensorswave_sdk-0.1.0/tests/testdata/gate/sticky.json +45 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
name: Lint
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [ master ]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [ master ]
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
ruff:
|
|
11
|
+
name: Ruff Lint + Format
|
|
12
|
+
runs-on: ubuntu-latest
|
|
13
|
+
|
|
14
|
+
steps:
|
|
15
|
+
- name: Checkout code
|
|
16
|
+
uses: actions/checkout@v4
|
|
17
|
+
|
|
18
|
+
- name: Set up Python
|
|
19
|
+
uses: actions/setup-python@v5
|
|
20
|
+
with:
|
|
21
|
+
python-version: '3.13'
|
|
22
|
+
cache: pip
|
|
23
|
+
cache-dependency-path: pyproject.toml
|
|
24
|
+
|
|
25
|
+
- name: Install ruff
|
|
26
|
+
run: pip install ruff
|
|
27
|
+
|
|
28
|
+
- name: Check lint
|
|
29
|
+
run: ruff check src/
|
|
30
|
+
|
|
31
|
+
- name: Check formatting
|
|
32
|
+
run: ruff format --check src/
|
|
33
|
+
|
|
34
|
+
mypy:
|
|
35
|
+
name: Mypy Type Check
|
|
36
|
+
runs-on: ubuntu-latest
|
|
37
|
+
|
|
38
|
+
steps:
|
|
39
|
+
- name: Checkout code
|
|
40
|
+
uses: actions/checkout@v4
|
|
41
|
+
|
|
42
|
+
- name: Set up Python
|
|
43
|
+
uses: actions/setup-python@v5
|
|
44
|
+
with:
|
|
45
|
+
python-version: '3.13'
|
|
46
|
+
cache: pip
|
|
47
|
+
cache-dependency-path: pyproject.toml
|
|
48
|
+
|
|
49
|
+
- name: Install dependencies
|
|
50
|
+
run: |
|
|
51
|
+
pip install -e ".[dev]"
|
|
52
|
+
|
|
53
|
+
- name: Run mypy
|
|
54
|
+
run: python3 -m mypy
|
|
55
|
+
|
|
56
|
+
compile:
|
|
57
|
+
name: Compile Check
|
|
58
|
+
runs-on: ubuntu-latest
|
|
59
|
+
|
|
60
|
+
steps:
|
|
61
|
+
- name: Checkout code
|
|
62
|
+
uses: actions/checkout@v4
|
|
63
|
+
|
|
64
|
+
- name: Set up Python
|
|
65
|
+
uses: actions/setup-python@v5
|
|
66
|
+
with:
|
|
67
|
+
python-version: '3.13'
|
|
68
|
+
cache: pip
|
|
69
|
+
cache-dependency-path: pyproject.toml
|
|
70
|
+
|
|
71
|
+
- name: Install dependencies
|
|
72
|
+
run: pip install -e "."
|
|
73
|
+
|
|
74
|
+
- name: Compile check
|
|
75
|
+
run: python3 -m compileall -q src/
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags:
|
|
6
|
+
- 'v*' # Trigger on tags like v0.1.0, v1.2.3
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: write # Required for creating releases
|
|
10
|
+
id-token: write # Required for PyPI trusted publishing
|
|
11
|
+
|
|
12
|
+
jobs:
|
|
13
|
+
release:
|
|
14
|
+
runs-on: ubuntu-latest
|
|
15
|
+
|
|
16
|
+
steps:
|
|
17
|
+
- name: Checkout code
|
|
18
|
+
uses: actions/checkout@v4
|
|
19
|
+
- name: Set up Python
|
|
20
|
+
uses: actions/setup-python@v5
|
|
21
|
+
with:
|
|
22
|
+
python-version: '3.13'
|
|
23
|
+
cache: pip
|
|
24
|
+
cache-dependency-path: pyproject.toml
|
|
25
|
+
|
|
26
|
+
- name: Install dependencies
|
|
27
|
+
run: |
|
|
28
|
+
pip install build
|
|
29
|
+
pip install -e ".[dev]"
|
|
30
|
+
|
|
31
|
+
- name: Run tests
|
|
32
|
+
run: python3 -m pytest -v -n auto
|
|
33
|
+
|
|
34
|
+
- name: Build wheel + source dist
|
|
35
|
+
run: python3 -m build
|
|
36
|
+
|
|
37
|
+
- name: Create GitHub Release
|
|
38
|
+
uses: softprops/action-gh-release@v2
|
|
39
|
+
with:
|
|
40
|
+
generate_release_notes: true
|
|
41
|
+
files: dist/*
|
|
42
|
+
env:
|
|
43
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
44
|
+
|
|
45
|
+
- name: Publish to PyPI
|
|
46
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
name: Security
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [ master ]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [ master ]
|
|
8
|
+
schedule:
|
|
9
|
+
- cron: '0 2 * * 2'
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
dependency-check:
|
|
13
|
+
name: Dependency Vulnerability Check
|
|
14
|
+
runs-on: ubuntu-latest
|
|
15
|
+
|
|
16
|
+
steps:
|
|
17
|
+
- name: Checkout code
|
|
18
|
+
uses: actions/checkout@v4
|
|
19
|
+
|
|
20
|
+
- name: Set up Python
|
|
21
|
+
uses: actions/setup-python@v5
|
|
22
|
+
with:
|
|
23
|
+
python-version: '3.13'
|
|
24
|
+
cache: pip
|
|
25
|
+
cache-dependency-path: pyproject.toml
|
|
26
|
+
|
|
27
|
+
- name: Install dependencies
|
|
28
|
+
run: |
|
|
29
|
+
pip install pip-audit
|
|
30
|
+
pip install -e "."
|
|
31
|
+
|
|
32
|
+
- name: Audit dependencies
|
|
33
|
+
# Ignore CVEs in pip itself — pip is a CI build tool, not a runtime
|
|
34
|
+
# dependency of this SDK (which has zero runtime dependencies).
|
|
35
|
+
run: pip-audit --ignore-vuln CVE-2026-3219 --ignore-vuln CVE-2026-6357
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
name: Tests
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [ master ]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [ master ]
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
test:
|
|
11
|
+
name: Test (Python ${{ matrix.python-version }} on ${{ matrix.os }})
|
|
12
|
+
runs-on: ${{ matrix.os }}
|
|
13
|
+
|
|
14
|
+
strategy:
|
|
15
|
+
fail-fast: false
|
|
16
|
+
matrix:
|
|
17
|
+
python-version: ['3.10', '3.11', '3.12', '3.13']
|
|
18
|
+
os: [ubuntu-latest, macos-latest, windows-latest]
|
|
19
|
+
|
|
20
|
+
steps:
|
|
21
|
+
- name: Checkout code
|
|
22
|
+
uses: actions/checkout@v4
|
|
23
|
+
|
|
24
|
+
- name: Set up Python ${{ matrix.python-version }}
|
|
25
|
+
uses: actions/setup-python@v5
|
|
26
|
+
with:
|
|
27
|
+
python-version: ${{ matrix.python-version }}
|
|
28
|
+
cache: pip
|
|
29
|
+
cache-dependency-path: pyproject.toml
|
|
30
|
+
|
|
31
|
+
- name: Install dependencies
|
|
32
|
+
run: |
|
|
33
|
+
python3 -m pip install --upgrade pip
|
|
34
|
+
pip install -e ".[dev]"
|
|
35
|
+
|
|
36
|
+
- name: Run tests
|
|
37
|
+
run: python3 -m pytest -v -n auto
|
|
38
|
+
|
|
39
|
+
build:
|
|
40
|
+
name: Build
|
|
41
|
+
runs-on: ubuntu-latest
|
|
42
|
+
|
|
43
|
+
steps:
|
|
44
|
+
- name: Checkout code
|
|
45
|
+
uses: actions/checkout@v4
|
|
46
|
+
|
|
47
|
+
- name: Set up Python
|
|
48
|
+
uses: actions/setup-python@v5
|
|
49
|
+
with:
|
|
50
|
+
python-version: '3.13'
|
|
51
|
+
cache: pip
|
|
52
|
+
cache-dependency-path: pyproject.toml
|
|
53
|
+
|
|
54
|
+
- name: Install build tools
|
|
55
|
+
run: pip install build
|
|
56
|
+
|
|
57
|
+
- name: Build wheel + source dist
|
|
58
|
+
run: python3 -m build
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Python bytecode caches
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*$py.class
|
|
5
|
+
|
|
6
|
+
# Virtual environments
|
|
7
|
+
.venv/
|
|
8
|
+
venv/
|
|
9
|
+
env/
|
|
10
|
+
|
|
11
|
+
# Build / dist artifacts
|
|
12
|
+
build/
|
|
13
|
+
dist/
|
|
14
|
+
*.egg-info/
|
|
15
|
+
|
|
16
|
+
# Test / coverage caches
|
|
17
|
+
.pytest_cache/
|
|
18
|
+
.mypy_cache/
|
|
19
|
+
.coverage
|
|
20
|
+
htmlcov/
|
|
21
|
+
|
|
22
|
+
# Agent/tool caches
|
|
23
|
+
.serena/
|
|
24
|
+
|
|
25
|
+
# Editor / OS files
|
|
26
|
+
.idea/
|
|
27
|
+
.vscode/
|
|
28
|
+
.DS_Store
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
.PHONY: build publish release
|
|
2
|
+
|
|
3
|
+
# Build wheel and source distribution
|
|
4
|
+
build:
|
|
5
|
+
python3 -m build
|
|
6
|
+
|
|
7
|
+
# Publish to PyPI
|
|
8
|
+
# Requires PyPI credentials via ~/.pypirc or trusted publishing.
|
|
9
|
+
publish: build
|
|
10
|
+
python3 -m twine upload dist/*
|
|
11
|
+
|
|
12
|
+
# Release: bump version, commit, tag.
|
|
13
|
+
# Usage: make release VERSION=0.2.0
|
|
14
|
+
release:
|
|
15
|
+
@test -n "$(VERSION)" || (echo "Usage: make release VERSION=x.y.z"; exit 1)
|
|
16
|
+
@echo "Setting version to $(VERSION)..."
|
|
17
|
+
@echo '__version__ = "$(VERSION)"' > src/sensorswave/__version__.py
|
|
18
|
+
git add src/sensorswave/__version__.py
|
|
19
|
+
git commit -m "chore: bump version to $(VERSION)"
|
|
20
|
+
git tag v$(VERSION)
|
|
21
|
+
@echo "Committed and tagged v$(VERSION). Push with:"
|
|
22
|
+
@echo " git push && git push --tags"
|