ordercloud-python 2026.4.1__tar.gz → 2026.10.1__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.
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/.github/dependabot.yml +6 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/.github/workflows/ci.yml +7 -7
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/.github/workflows/codeql.yml +4 -4
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/.github/workflows/dependency-review.yml +2 -2
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/.github/workflows/release.yml +35 -7
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/.github/workflows/sbom.yml +2 -2
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/.github/workflows/scorecard.yml +2 -2
- ordercloud_python-2026.10.1/CHANGELOG.md +85 -0
- ordercloud_python-2026.10.1/CONTRIBUTING.md +133 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/PKG-INFO +19 -19
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/README.md +17 -17
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/pyproject.toml +6 -1
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/__init__.py +6 -1
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/api_client.py +0 -2
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/buyer.py +15 -3
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/discount.py +4 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/misc.py +18 -1
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/order.py +34 -2
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/promotion.py +41 -4
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/sync.py +11 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/entity_syncs.py +64 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/orders.py +29 -1
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/promotions.py +27 -3
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/tests/test_models.py +51 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/tests/test_resources.py +42 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/tools/codegen/grouping.py +6 -0
- ordercloud_python-2026.4.1/CHANGELOG.md +0 -34
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/.gitignore +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/CODE_REVIEW.md +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/LICENSE +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/SECURITY.md +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/SECURITY_AUDIT.md +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/examples/basic_workflow.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/__init__.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/auth.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/client.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/config.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/errors.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/http.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/middleware.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/address.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/approval.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/assignments.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/auth_models.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/bundle.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/catalog.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/category.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/cost_center.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/credit_card.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/delivery.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/integration.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/inventory_record.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/line_item.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/line_item_types.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/message_sender.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/open_id_connect.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/order_return.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/payment.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/price_schedule.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/product.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/product_collection.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/security.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/shared.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/shipment.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/spec.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/spending_account.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/subscription.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/supplier.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/user.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/user_group.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/webhook.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/py.typed +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/__init__.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/addresses.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/admin_addresses.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/admin_user_groups.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/admin_users.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/api_clients.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/approval_rules.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/base.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/bundle_line_items.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/bundle_subscription_items.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/bundles.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/buyer_groups.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/buyers.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/cart.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/catalogs.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/categories.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/cost_centers.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/credit_cards.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/delivery_configurations.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/discounts.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/error_configs.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/forgotten_credentials.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/group_orders.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/impersonation_configs.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/incrementors.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/integration_events.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/inventory_integrations.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/inventory_records.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/line_items.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/locales.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/me.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/message_senders.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/open_id_connects.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/order_returns.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/order_syncs.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/payments.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/price_schedules.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/product_collections.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/product_facets.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/product_syncs.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/products.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/promotion_integrations.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/security_profiles.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/seller_approval_rules.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/shipments.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/specs.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/spending_accounts.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/subscription_integrations.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/subscription_items.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/subscriptions.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/supplier_addresses.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/supplier_user_groups.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/supplier_users.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/suppliers.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/tracking_events.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/user_groups.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/users.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/webhooks.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/xp_indices.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/sync_client.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/tests/__init__.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/tests/conftest.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/tests/integration/__init__.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/tests/integration/conftest.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/tests/integration/test_auth.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/tests/integration/test_crud.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/tests/integration/test_errors.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/tests/integration/test_pagination.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/tests/integration/test_query_params.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/tests/integration/test_sync_client.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/tests/test_auth.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/tests/test_http.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/tests/test_resource_coverage.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/tests/test_sync_client.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/tools/__init__.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/tools/codegen/__init__.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/tools/codegen/__main__.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/tools/codegen/cli.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/tools/codegen/ir.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/tools/codegen/naming.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/tools/codegen/parser.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/tools/codegen/renderer.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/tools/codegen/templates/client.py.j2 +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/tools/codegen/templates/model_module.py.j2 +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/tools/codegen/templates/models_init.py.j2 +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/tools/codegen/templates/resource_module.py.j2 +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/tools/codegen/templates/resources_init.py.j2 +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/tools/codegen/transformer.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/tools/codegen/type_mapping.py +0 -0
|
@@ -24,3 +24,9 @@ updates:
|
|
|
24
24
|
labels:
|
|
25
25
|
- "ci"
|
|
26
26
|
open-pull-requests-limit: 5
|
|
27
|
+
groups:
|
|
28
|
+
# The init / autobuild / analyze / upload-sarif steps must share one
|
|
29
|
+
# version, so they are bumped together in a single PR.
|
|
30
|
+
codeql-action:
|
|
31
|
+
patterns:
|
|
32
|
+
- "github/codeql-action*"
|
|
@@ -14,8 +14,8 @@ jobs:
|
|
|
14
14
|
name: Lint
|
|
15
15
|
runs-on: ubuntu-latest
|
|
16
16
|
steps:
|
|
17
|
-
- uses: actions/checkout@
|
|
18
|
-
- uses: actions/setup-python@
|
|
17
|
+
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
18
|
+
- uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0
|
|
19
19
|
with:
|
|
20
20
|
python-version: "3.13"
|
|
21
21
|
- name: Install ruff
|
|
@@ -29,8 +29,8 @@ jobs:
|
|
|
29
29
|
name: Type check
|
|
30
30
|
runs-on: ubuntu-latest
|
|
31
31
|
steps:
|
|
32
|
-
- uses: actions/checkout@
|
|
33
|
-
- uses: actions/setup-python@
|
|
32
|
+
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
33
|
+
- uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0
|
|
34
34
|
with:
|
|
35
35
|
python-version: "3.13"
|
|
36
36
|
- name: Install dependencies
|
|
@@ -46,8 +46,8 @@ jobs:
|
|
|
46
46
|
matrix:
|
|
47
47
|
python-version: ["3.10", "3.11", "3.12", "3.13"]
|
|
48
48
|
steps:
|
|
49
|
-
- uses: actions/checkout@
|
|
50
|
-
- uses: actions/setup-python@
|
|
49
|
+
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
50
|
+
- uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0
|
|
51
51
|
with:
|
|
52
52
|
python-version: ${{ matrix.python-version }}
|
|
53
53
|
- name: Install dependencies
|
|
@@ -56,7 +56,7 @@ jobs:
|
|
|
56
56
|
run: pytest --cov=ordercloud --cov-report=xml --cov-report=term-missing --cov-fail-under=90
|
|
57
57
|
- name: Upload coverage to Codecov
|
|
58
58
|
if: matrix.python-version == '3.13'
|
|
59
|
-
uses: codecov/codecov-action@
|
|
59
|
+
uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0
|
|
60
60
|
with:
|
|
61
61
|
files: ./coverage.xml
|
|
62
62
|
fail_ci_if_error: false
|
|
@@ -18,18 +18,18 @@ jobs:
|
|
|
18
18
|
name: Analyze (Python)
|
|
19
19
|
runs-on: ubuntu-latest
|
|
20
20
|
steps:
|
|
21
|
-
- uses: actions/checkout@
|
|
21
|
+
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
22
22
|
|
|
23
23
|
- name: Initialize CodeQL
|
|
24
|
-
uses: github/codeql-action/init@
|
|
24
|
+
uses: github/codeql-action/init@2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2 # v4.38.2
|
|
25
25
|
with:
|
|
26
26
|
languages: python
|
|
27
27
|
queries: security-and-quality
|
|
28
28
|
|
|
29
29
|
- name: Autobuild
|
|
30
|
-
uses: github/codeql-action/autobuild@
|
|
30
|
+
uses: github/codeql-action/autobuild@2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2 # v4.38.2
|
|
31
31
|
|
|
32
32
|
- name: Perform CodeQL Analysis
|
|
33
|
-
uses: github/codeql-action/analyze@
|
|
33
|
+
uses: github/codeql-action/analyze@2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2 # v4.38.2
|
|
34
34
|
with:
|
|
35
35
|
category: "/language:python"
|
{ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/.github/workflows/dependency-review.yml
RENAMED
|
@@ -12,9 +12,9 @@ jobs:
|
|
|
12
12
|
name: Review dependencies
|
|
13
13
|
runs-on: ubuntu-latest
|
|
14
14
|
steps:
|
|
15
|
-
- uses: actions/checkout@
|
|
15
|
+
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
16
16
|
- name: Dependency Review
|
|
17
|
-
uses: actions/dependency-review-action@
|
|
17
|
+
uses: actions/dependency-review-action@a1d282b36b6f3519aa1f3fc636f609c47dddb294 # v5.0.0
|
|
18
18
|
with:
|
|
19
19
|
fail-on-severity: moderate
|
|
20
20
|
deny-licenses: GPL-3.0, AGPL-3.0
|
|
@@ -14,8 +14,8 @@ jobs:
|
|
|
14
14
|
permissions:
|
|
15
15
|
contents: read
|
|
16
16
|
steps:
|
|
17
|
-
- uses: actions/checkout@
|
|
18
|
-
- uses: actions/setup-python@
|
|
17
|
+
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
18
|
+
- uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0
|
|
19
19
|
with:
|
|
20
20
|
python-version: "3.13"
|
|
21
21
|
- name: Install build
|
|
@@ -38,7 +38,8 @@ jobs:
|
|
|
38
38
|
|
|
39
39
|
publish:
|
|
40
40
|
name: Publish to PyPI
|
|
41
|
-
|
|
41
|
+
# The PyPI upload cannot be undone, so it runs only after attestation.
|
|
42
|
+
needs: attestation
|
|
42
43
|
runs-on: ubuntu-latest
|
|
43
44
|
permissions:
|
|
44
45
|
id-token: write
|
|
@@ -52,7 +53,7 @@ jobs:
|
|
|
52
53
|
name: dist
|
|
53
54
|
path: dist/
|
|
54
55
|
- name: Publish to PyPI
|
|
55
|
-
uses: pypa/gh-action-pypi-publish@
|
|
56
|
+
uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
|
|
56
57
|
|
|
57
58
|
attestation:
|
|
58
59
|
name: Attest build provenance
|
|
@@ -69,9 +70,26 @@ jobs:
|
|
|
69
70
|
name: dist
|
|
70
71
|
path: dist/
|
|
71
72
|
- name: Attest build provenance
|
|
72
|
-
|
|
73
|
+
id: attest
|
|
74
|
+
uses: actions/attest-build-provenance@0f67c3f4856b2e3261c31976d6725780e5e4c373 # v4.1.1
|
|
73
75
|
with:
|
|
74
76
|
subject-path: dist/*
|
|
77
|
+
- name: Name provenance file
|
|
78
|
+
env:
|
|
79
|
+
BUNDLE_PATH: ${{ steps.attest.outputs.bundle-path }}
|
|
80
|
+
run: |
|
|
81
|
+
if [ ! -s "$BUNDLE_PATH" ]; then
|
|
82
|
+
echo "::error::Attestation bundle is missing or empty: $BUNDLE_PATH"
|
|
83
|
+
exit 1
|
|
84
|
+
fi
|
|
85
|
+
mkdir provenance
|
|
86
|
+
cp "$BUNDLE_PATH" "provenance/ordercloud_python-${GITHUB_REF_NAME#v}.intoto.jsonl"
|
|
87
|
+
- name: Upload provenance
|
|
88
|
+
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
|
89
|
+
with:
|
|
90
|
+
name: provenance
|
|
91
|
+
path: provenance/
|
|
92
|
+
if-no-files-found: error
|
|
75
93
|
|
|
76
94
|
github-release:
|
|
77
95
|
name: Create GitHub Release
|
|
@@ -80,16 +98,26 @@ jobs:
|
|
|
80
98
|
permissions:
|
|
81
99
|
contents: write
|
|
82
100
|
steps:
|
|
83
|
-
- uses: actions/checkout@
|
|
101
|
+
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
84
102
|
- name: Download distributions
|
|
85
103
|
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
|
86
104
|
with:
|
|
87
105
|
name: dist
|
|
88
106
|
path: dist/
|
|
107
|
+
- name: Download provenance
|
|
108
|
+
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
|
109
|
+
with:
|
|
110
|
+
name: provenance
|
|
111
|
+
path: provenance/
|
|
89
112
|
- name: Create GitHub Release
|
|
90
113
|
env:
|
|
91
114
|
GH_TOKEN: ${{ github.token }}
|
|
92
115
|
run: |
|
|
93
|
-
|
|
116
|
+
PROVENANCE="provenance/ordercloud_python-${GITHUB_REF_NAME#v}.intoto.jsonl"
|
|
117
|
+
if [ ! -s "$PROVENANCE" ]; then
|
|
118
|
+
echo "::error::Provenance file is missing or empty: $PROVENANCE"
|
|
119
|
+
exit 1
|
|
120
|
+
fi
|
|
121
|
+
gh release create "$GITHUB_REF_NAME" dist/* "$PROVENANCE" \
|
|
94
122
|
--title "$GITHUB_REF_NAME" \
|
|
95
123
|
--generate-notes
|
|
@@ -16,7 +16,7 @@ jobs:
|
|
|
16
16
|
permissions:
|
|
17
17
|
contents: read
|
|
18
18
|
steps:
|
|
19
|
-
- uses: actions/checkout@
|
|
19
|
+
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
20
20
|
|
|
21
21
|
- name: Generate SBOM
|
|
22
22
|
uses: anchore/sbom-action@e22c389904149dbc22b58101806040fa8d37a610 # v0
|
|
@@ -25,7 +25,7 @@ jobs:
|
|
|
25
25
|
output-file: sbom.spdx.json
|
|
26
26
|
|
|
27
27
|
- name: Upload SBOM as artifact
|
|
28
|
-
uses: actions/upload-artifact@
|
|
28
|
+
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
|
29
29
|
with:
|
|
30
30
|
name: sbom
|
|
31
31
|
path: sbom.spdx.json
|
|
@@ -19,7 +19,7 @@ jobs:
|
|
|
19
19
|
contents: read
|
|
20
20
|
actions: read
|
|
21
21
|
steps:
|
|
22
|
-
- uses: actions/checkout@
|
|
22
|
+
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
23
23
|
with:
|
|
24
24
|
persist-credentials: false
|
|
25
25
|
|
|
@@ -31,6 +31,6 @@ jobs:
|
|
|
31
31
|
publish_results: true
|
|
32
32
|
|
|
33
33
|
- name: Upload SARIF results
|
|
34
|
-
uses: github/codeql-action/upload-sarif@
|
|
34
|
+
uses: github/codeql-action/upload-sarif@2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2 # v4.38.2
|
|
35
35
|
with:
|
|
36
36
|
sarif_file: results.sarif
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
This project uses [Calendar Versioning](https://calver.org/) — `YYYY.MM.N` where `N` is the release number within that month.
|
|
6
|
+
|
|
7
|
+
## 2026.10.1 — 2026-10-05
|
|
8
|
+
|
|
9
|
+
Regenerated from the OrderCloud OpenAPI v3 spec, **version 1.0.454 → 1.0.470**. This release contains **one breaking change** — `ApiClient.client_secret` is removed — which the CalVer version number does not signal. Coverage is unchanged: **639 operations** across 60 resources, with 173 models and 17 enums.
|
|
10
|
+
|
|
11
|
+
### Breaking
|
|
12
|
+
|
|
13
|
+
- **`ApiClient.client_secret` (`ClientSecret`) removed**, following its removal from the `ApiClient` schema in the spec. `ApiClient` keeps the models' `extra="allow"` configuration, so code that still uses the field now behaves as follows:
|
|
14
|
+
- Reading `.client_secret` on an `ApiClient` that was not given one raises `AttributeError` (it previously returned `None`).
|
|
15
|
+
- mypy reports any `.client_secret` access as an `attr-defined` error.
|
|
16
|
+
- A `ClientSecret` value in an API response is no longer available as `.client_secret`; it is kept as an undeclared extra under its API name, in `model_extra["ClientSecret"]`.
|
|
17
|
+
- `ApiClient(ClientSecret="...")` is accepted, and the value is still sent to the API under the key `ClientSecret`.
|
|
18
|
+
- `ApiClient(client_secret="...")` is accepted, but the value is now sent to the API under the snake_case key `client_secret` instead of `ClientSecret`.
|
|
19
|
+
- Request bodies passed as plain dicts are sent unchanged.
|
|
20
|
+
|
|
21
|
+
The five API-client secret operations (`ApiClients.ListSecrets` / `CreateSecret` / `GetSecret` / `PatchSecret` / `DeleteSecret`) and the `ApiClientSecret` / `ApiClientSecretCreateResponse` models are unchanged in this release.
|
|
22
|
+
|
|
23
|
+
### Added
|
|
24
|
+
|
|
25
|
+
- **`Discount.priority`** (`Priority`, integer). The spec describes it as: "Controls precedence when multiple discounts apply to the same user and product. Lower number = higher precedence (1 beats 2). Null is applied last."
|
|
26
|
+
- **`OrderEditAfterSubmit`** added to the `ApiRole` enum. Role lists that contain it (for example `SecurityProfile.roles` or `ApiClient.maximum_granted_roles`) now validate; on 2026.6.1 they raise a pydantic `ValidationError`.
|
|
27
|
+
|
|
28
|
+
### Spec changes with no SDK code change
|
|
29
|
+
|
|
30
|
+
- The `x-lifecycle: Beta` marker is removed from the Discounts tag and its nine operations. The code generator does not read this marker.
|
|
31
|
+
- `GET /discounts` now lists `Priority` and `!Priority` as `sortBy` values. `Discounts.list` takes `sort_by` as a plain string and passes it through unvalidated, so no SDK change was needed.
|
|
32
|
+
- `OrderEditAfterSubmit` is also added to the spec's OAuth2 scopes. The SDK's `scopes` setting takes plain strings.
|
|
33
|
+
|
|
34
|
+
### Release artefacts
|
|
35
|
+
|
|
36
|
+
- GitHub releases now also attach the build provenance attestation for the sdist and wheel, as `ordercloud_python-<version>.intoto.jsonl`, alongside the distributions themselves.
|
|
37
|
+
|
|
38
|
+
### Changed
|
|
39
|
+
|
|
40
|
+
- Bumped package version to `2026.10.1` (CalVer).
|
|
41
|
+
|
|
42
|
+
## 2026.6.1 — 2026-06-14
|
|
43
|
+
|
|
44
|
+
Regenerated from the OrderCloud OpenAPI v3 spec, **version 1.0.445 → 1.0.454**. All changes are additive — no breaking changes to existing models or operations. Coverage now spans **639 operations** (was 632) across the same 60 resources, with **173 models** and 17 enums.
|
|
45
|
+
|
|
46
|
+
### Added
|
|
47
|
+
|
|
48
|
+
- **Generated promotion codes** — `Promotions.ListCodes` (`GET /promotions/{promotionID}/codes`), the `PromotionCode` model, and `GeneratedCodeCount` / `GeneratedCodeLength` / `GeneratedCodePrefix` fields on the `Promotion` model family (`Promotion`, `OrderPromotion`, `AddedPromo`, `RemovedPromo`, `EligiblePromotion`).
|
|
49
|
+
- **Repeat order** — `Orders.Repeat` (`POST /orders/{direction}/{orderID}/repeat`) with the `OrderRepeatResponse` and `UnavailableLineItem` models.
|
|
50
|
+
- **Catalog entity sync** — five `EntitySyncs` catalog operations (get / save / patch / delete on `/integrations/entitysync/catalogs`, plus `/catalogs/sync`) and the `SyncCatalog` model.
|
|
51
|
+
- **New models** — `BuyerDiscount` (on `BuyerPriceSchedule`) and `ApiError` (the typed error returned within `UnavailableLineItem`).
|
|
52
|
+
- **New fields / values** — `Percent` on `DiscountedPrices`; `BulkReader` added to the `ApiRole` enum.
|
|
53
|
+
|
|
54
|
+
### Changed
|
|
55
|
+
|
|
56
|
+
- Bumped package version to `2026.6.1` (CalVer).
|
|
57
|
+
|
|
58
|
+
## 2026.4.1 — 2026-04-13
|
|
59
|
+
|
|
60
|
+
Initial release. Full SDK for the Sitecore OrderCloud API, generated from the OpenAPI v3 spec (version 1.0.445).
|
|
61
|
+
|
|
62
|
+
### Features
|
|
63
|
+
|
|
64
|
+
- **Full API coverage** — 632 operations across 60 resources, generated from the official OpenAPI spec
|
|
65
|
+
- **Async and sync clients** — `OrderCloudClient` (async, default) and `SyncOrderCloudClient` with identical API shapes
|
|
66
|
+
- **Pydantic v2 typed models** — 167 models and 17 enums with full type annotations
|
|
67
|
+
- **Typed extended properties (xp)** — `Product[MyXp]` pattern for type-safe custom fields, backward compatible with untyped `dict[str, Any]`
|
|
68
|
+
- **Auto-pagination** — `paginate()` and `paginate_sync()` async/sync generators for any list method
|
|
69
|
+
- **Retry with exponential backoff** — configurable `max_retries` and `retry_backoff`; retries 429/5xx, respects `Retry-After` headers
|
|
70
|
+
- **Structured logging** — `logging.getLogger("ordercloud")` with DEBUG request/response and WARNING retry logging
|
|
71
|
+
- **Middleware hooks** — `add_before_request()` / `add_after_response()` for request/response interception
|
|
72
|
+
- **OAuth2 client credentials** — automatic token acquisition, caching, and refresh
|
|
73
|
+
- **PEP 561 typed** — `py.typed` marker for downstream type checking
|
|
74
|
+
|
|
75
|
+
### Code Generation
|
|
76
|
+
|
|
77
|
+
Three-stage pipeline in `tools/codegen/`: OpenAPI JSON -> parser -> IR dataclasses -> transformer -> Jinja2 templates -> Python source -> ruff format. 10 source files, 5 templates. Generates 100 files (37 model modules, 60 resource modules, 2 init barrels, 1 client).
|
|
78
|
+
|
|
79
|
+
### Quality
|
|
80
|
+
|
|
81
|
+
- 759 unit tests, 97% overall coverage (100% on all hand-written infrastructure and all 37 model modules)
|
|
82
|
+
- CI: lint, format, type check (mypy strict), test matrix (Python 3.10-3.13), coverage upload
|
|
83
|
+
- CodeQL security scanning, OpenSSF Scorecard, SBOM generation, dependency review
|
|
84
|
+
- Dependabot for pip and GitHub Actions version management
|
|
85
|
+
- Branch protection with required status checks
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
# Contributing to ordercloud-python
|
|
2
|
+
|
|
3
|
+
Bug reports, feature requests, and pull requests are welcome.
|
|
4
|
+
|
|
5
|
+
## Reporting Issues
|
|
6
|
+
|
|
7
|
+
Open a [GitHub Issue](https://github.com/markcassidyconsulting/ordercloud-python/issues). For bugs, include:
|
|
8
|
+
|
|
9
|
+
- Python version and OS
|
|
10
|
+
- SDK version (`python -c "import ordercloud; print(ordercloud.__version__)"`)
|
|
11
|
+
- Minimal code to reproduce
|
|
12
|
+
- Full traceback
|
|
13
|
+
|
|
14
|
+
## Development Setup
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
git clone https://github.com/markcassidyconsulting/ordercloud-python.git
|
|
18
|
+
cd ordercloud-python
|
|
19
|
+
pip install -e ".[dev,examples,codegen]"
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
This installs the SDK in editable mode with all development dependencies: pytest, ruff, mypy, respx, python-dotenv, and jinja2.
|
|
23
|
+
|
|
24
|
+
## Running Checks
|
|
25
|
+
|
|
26
|
+
All of these must pass before submitting a PR:
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
# Lint and format
|
|
30
|
+
ruff check src/ tests/
|
|
31
|
+
ruff format --check src/ tests/
|
|
32
|
+
|
|
33
|
+
# Type checking (strict)
|
|
34
|
+
mypy src/
|
|
35
|
+
|
|
36
|
+
# Unit tests (no network calls)
|
|
37
|
+
pytest tests/ --ignore=tests/integration
|
|
38
|
+
|
|
39
|
+
# Unit tests with coverage
|
|
40
|
+
pytest tests/ --ignore=tests/integration --cov=ordercloud --cov-report=term-missing
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
CI runs these across Python 3.10, 3.11, 3.12, and 3.13. Coverage must stay above 90%.
|
|
44
|
+
|
|
45
|
+
## Integration Tests
|
|
46
|
+
|
|
47
|
+
Integration tests run against a live OrderCloud sandbox and are skipped automatically when credentials aren't set. To run them locally:
|
|
48
|
+
|
|
49
|
+
1. Create a `.env` file at the repo root (gitignored):
|
|
50
|
+
|
|
51
|
+
```env
|
|
52
|
+
ORDERCLOUD_TEST_CLIENT_ID=your-sandbox-client-id
|
|
53
|
+
ORDERCLOUD_TEST_CLIENT_SECRET=your-sandbox-client-secret
|
|
54
|
+
ORDERCLOUD_TEST_BASE_URL=https://sandboxapi.ordercloud.io/v1
|
|
55
|
+
ORDERCLOUD_TEST_AUTH_URL=https://sandboxauth.ordercloud.io/oauth/token
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
2. Run:
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
pytest tests/integration/ -v
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
The `ORDERCLOUD_TEST_*` prefix ensures these never accidentally run against a production instance.
|
|
65
|
+
|
|
66
|
+
## Code Structure
|
|
67
|
+
|
|
68
|
+
| Directory | What lives there |
|
|
69
|
+
|-----------|-----------------|
|
|
70
|
+
| `src/ordercloud/` | The SDK package |
|
|
71
|
+
| `src/ordercloud/models/` | Pydantic models (generated) |
|
|
72
|
+
| `src/ordercloud/resources/` | Resource clients (generated) |
|
|
73
|
+
| `src/ordercloud/auth.py` | OAuth2 token management (hand-written) |
|
|
74
|
+
| `src/ordercloud/http.py` | HTTP client with retries (hand-written) |
|
|
75
|
+
| `src/ordercloud/config.py` | Configuration dataclass (hand-written) |
|
|
76
|
+
| `src/ordercloud/errors.py` | Exception types (hand-written) |
|
|
77
|
+
| `src/ordercloud/middleware.py` | Request/response hooks (hand-written) |
|
|
78
|
+
| `src/ordercloud/sync_client.py` | Sync wrapper (hand-written) |
|
|
79
|
+
| `src/ordercloud/resources/base.py` | Base resource + pagination (hand-written) |
|
|
80
|
+
| `src/ordercloud/models/shared.py` | Base model, enums, ListPage (hand-written) |
|
|
81
|
+
| `tools/codegen/` | Code generation pipeline |
|
|
82
|
+
| `tests/` | Unit tests (mocked HTTP) |
|
|
83
|
+
| `tests/integration/` | Integration tests (live sandbox) |
|
|
84
|
+
|
|
85
|
+
Files marked `# GENERATED by tools/codegen` are regenerated from the OpenAPI spec. Don't edit them by hand — change the codegen templates or pipeline instead.
|
|
86
|
+
|
|
87
|
+
## Code Generation
|
|
88
|
+
|
|
89
|
+
Models and resource clients are generated from the OrderCloud OpenAPI v3 spec:
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
python -m tools.codegen --spec openapi.json --output src/ordercloud
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
The pipeline: **OpenAPI JSON** -> parser -> IR dataclasses -> transformer -> Jinja2 templates -> Python source -> ruff format.
|
|
96
|
+
|
|
97
|
+
If you need to change how models or resources are structured, the relevant files are:
|
|
98
|
+
|
|
99
|
+
- `tools/codegen/ir.py` — intermediate representation dataclasses
|
|
100
|
+
- `tools/codegen/parser.py` — OpenAPI spec to IR
|
|
101
|
+
- `tools/codegen/transformer.py` — IR enrichment (imports, grouping)
|
|
102
|
+
- `tools/codegen/templates/*.j2` — Jinja2 templates for output files
|
|
103
|
+
|
|
104
|
+
## Conventions
|
|
105
|
+
|
|
106
|
+
- **snake_case** for all Python identifiers. Model fields use snake_case with PascalCase aliases matching the API.
|
|
107
|
+
- **Google-style docstrings** on public classes and methods.
|
|
108
|
+
- **`ruff`** for both linting and formatting. No additional style config needed.
|
|
109
|
+
- **`mypy --strict`** on hand-written infrastructure. Generated code has targeted relaxations in `pyproject.toml`.
|
|
110
|
+
- **Tests for every change.** Unit tests for logic, integration tests if it touches API behaviour.
|
|
111
|
+
|
|
112
|
+
## Pull Requests
|
|
113
|
+
|
|
114
|
+
- One concern per PR. Keep them focused.
|
|
115
|
+
- Include tests for new functionality or bug fixes.
|
|
116
|
+
- All CI checks must pass (lint, format, typecheck, tests across 4 Python versions).
|
|
117
|
+
- Update `CHANGELOG.md` if the change is user-facing.
|
|
118
|
+
|
|
119
|
+
## Branching & Merging
|
|
120
|
+
|
|
121
|
+
`main` is protected by a repository ruleset: every change lands through a pull request with all required status checks green. This applies to **everyone, including the maintainer** — there are no direct pushes to `main`, and the ruleset carries no bypass. Force-pushes and branch deletion are blocked.
|
|
122
|
+
|
|
123
|
+
No reviewing approval is required (this is a single-maintainer project), so the practical flow for a small change is:
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
git checkout -b fix/short-description
|
|
127
|
+
# ...make the change, commit...
|
|
128
|
+
git push -u origin fix/short-description
|
|
129
|
+
gh pr create --fill
|
|
130
|
+
gh pr merge --auto --squash --delete-branch
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
`--auto` queues the merge to happen the moment CI passes, so there's no need to sit and watch the checks. The full matrix takes a few minutes; a slight delay before merge is expected and accepted. Dependabot PRs follow the same path automatically.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
2
|
Name: ordercloud-python
|
|
3
|
-
Version: 2026.
|
|
3
|
+
Version: 2026.10.1
|
|
4
4
|
Summary: Idiomatic Python SDK for Sitecore OrderCloud
|
|
5
5
|
Project-URL: Homepage, https://github.com/markcassidyconsulting/ordercloud-python
|
|
6
6
|
Project-URL: Repository, https://github.com/markcassidyconsulting/ordercloud-python
|
|
@@ -50,7 +50,7 @@ Description-Content-Type: text/markdown
|
|
|
50
50
|
|
|
51
51
|
A fully typed, async-first Python SDK for [Sitecore OrderCloud](https://ordercloud.io).
|
|
52
52
|
|
|
53
|
-
**Complete API coverage** — all
|
|
53
|
+
**Complete API coverage** — all 639 operations across 60 resources, generated from the official OpenAPI spec. Built for modern Python:
|
|
54
54
|
|
|
55
55
|
- **Async and sync clients** — `async with OrderCloudClient(...)` or `with SyncOrderCloudClient(...)`. Same API shape, your choice of runtime.
|
|
56
56
|
- **Pydantic v2 models** — every API resource is a typed, validated model. snake_case fields, PascalCase aliases for API compatibility.
|
|
@@ -60,7 +60,7 @@ A fully typed, async-first Python SDK for [Sitecore OrderCloud](https://orderclo
|
|
|
60
60
|
- **Middleware hooks** — intercept requests and responses for logging, metrics, or header injection.
|
|
61
61
|
- **Structured logging** — standard Python `logging` module, DEBUG/WARNING levels.
|
|
62
62
|
- **Full type annotations** — `py.typed` marker for downstream type checking with mypy, pyright, etc.
|
|
63
|
-
- **
|
|
63
|
+
- **803 tests, 97% coverage** — 778 unit tests (mocked HTTP) + 25 integration tests (live sandbox).
|
|
64
64
|
|
|
65
65
|
## Installation
|
|
66
66
|
|
|
@@ -244,14 +244,14 @@ Before-request hooks receive a mutable `RequestContext` — modify `headers`, `p
|
|
|
244
244
|
|
|
245
245
|
## API Coverage
|
|
246
246
|
|
|
247
|
-
The SDK covers **all 60 resources** and **
|
|
247
|
+
The SDK covers **all 60 resources** and **639 operations** in the OrderCloud API. Models and resource clients are generated from the official OpenAPI v3 spec (version 1.0.470).
|
|
248
248
|
|
|
249
249
|
### Core Commerce
|
|
250
250
|
|
|
251
251
|
| Resource | Operations | Highlights |
|
|
252
252
|
|----------|-----------|------------|
|
|
253
253
|
| Products | 18 | CRUD, variants, specs, suppliers, assignments |
|
|
254
|
-
| Orders |
|
|
254
|
+
| Orders | 30 | CRUD, submit, approve, decline, cancel, complete, forward, split, ship, repeat, promotions |
|
|
255
255
|
| Line Items | 9 | CRUD, shipping address management, cross-order listing |
|
|
256
256
|
| Cart | 37 | Full shopping cart lifecycle, checkout, payments, promotions |
|
|
257
257
|
| Bundles | 12 | CRUD, product/catalog assignments |
|
|
@@ -275,7 +275,7 @@ The SDK covers **all 60 resources** and **632 operations** in the OrderCloud API
|
|
|
275
275
|
| Resource | Operations | Highlights |
|
|
276
276
|
|----------|-----------|------------|
|
|
277
277
|
| Price Schedules | 8 | CRUD, price breaks |
|
|
278
|
-
| Promotions |
|
|
278
|
+
| Promotions | 10 | CRUD, assignments, generated codes |
|
|
279
279
|
| Discounts | 9 | CRUD, assignments |
|
|
280
280
|
| Specs | 15 | CRUD, options, product assignments |
|
|
281
281
|
|
|
@@ -307,7 +307,7 @@ The SDK covers **all 60 resources** and **632 operations** in the OrderCloud API
|
|
|
307
307
|
| Integration Events | 10 | CRUD, calculate, estimate shipping |
|
|
308
308
|
| Message Senders | 11 | CRUD, assignments, CC listeners |
|
|
309
309
|
| Subscriptions | 6 | CRUD |
|
|
310
|
-
| Entity Syncs |
|
|
310
|
+
| Entity Syncs | 45 | Full sync infrastructure (incl. catalogs) |
|
|
311
311
|
| Delivery Configurations | 6 | CRUD |
|
|
312
312
|
| Inventory Records | 18 | CRUD, variant records, assignments |
|
|
313
313
|
|
|
@@ -504,18 +504,18 @@ The test suite is self-bootstrapping — it uses the SDK itself to create all te
|
|
|
504
504
|
|
|
505
505
|
### Test Suite
|
|
506
506
|
|
|
507
|
-
|
|
507
|
+
803 tests across 12 modules.
|
|
508
508
|
|
|
509
|
-
**Unit tests (
|
|
509
|
+
**Unit tests (778)** — mocked HTTP via [respx](https://lundberg.github.io/respx/), no network calls:
|
|
510
510
|
|
|
511
511
|
| Module | Tests | Purpose |
|
|
512
512
|
|--------|-------|---------|
|
|
513
513
|
| `test_auth.py` | 13 | OAuth2 token management |
|
|
514
|
-
| `test_http.py` |
|
|
515
|
-
| `test_models.py` |
|
|
516
|
-
| `test_resources.py` |
|
|
517
|
-
| `test_resource_coverage.py` |
|
|
518
|
-
| `test_sync_client.py` |
|
|
514
|
+
| `test_http.py` | 37 | HTTP client, error parsing, retries |
|
|
515
|
+
| `test_models.py` | 44 | Model round-trips, enums, xp, ListPage |
|
|
516
|
+
| `test_resources.py` | 33 | Representative resource operations |
|
|
517
|
+
| `test_resource_coverage.py` | 639 | All 60 resources, all 639 operations |
|
|
518
|
+
| `test_sync_client.py` | 12 | Sync wrapper, pagination |
|
|
519
519
|
|
|
520
520
|
**Integration tests (25)** — live sandbox, skipped when credentials are absent:
|
|
521
521
|
|
|
@@ -532,11 +532,11 @@ The test suite is self-bootstrapping — it uses the SDK itself to create all te
|
|
|
532
532
|
|
|
533
533
|
| Module | Coverage |
|
|
534
534
|
|--------|----------|
|
|
535
|
-
| `auth.py` |
|
|
535
|
+
| `auth.py` | 93% |
|
|
536
536
|
| `client.py` | 100% |
|
|
537
|
-
| `config.py` |
|
|
537
|
+
| `config.py` | 94% |
|
|
538
538
|
| `errors.py` | 100% |
|
|
539
|
-
| `http.py` |
|
|
539
|
+
| `http.py` | 98% |
|
|
540
540
|
| `middleware.py` | 100% |
|
|
541
541
|
| `sync_client.py` | 100% |
|
|
542
542
|
| `resources/base.py` | 100% |
|
|
@@ -545,7 +545,7 @@ The test suite is self-bootstrapping — it uses the SDK itself to create all te
|
|
|
545
545
|
|
|
546
546
|
## Contributing
|
|
547
547
|
|
|
548
|
-
Bug reports and
|
|
548
|
+
Bug reports, feature requests, and pull requests are welcome. See [CONTRIBUTING.md](CONTRIBUTING.md) for development setup, running tests, code generation, and PR guidelines. See the [Changelog](CHANGELOG.md) for release history.
|
|
549
549
|
|
|
550
550
|
## License
|
|
551
551
|
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
|
|
11
11
|
A fully typed, async-first Python SDK for [Sitecore OrderCloud](https://ordercloud.io).
|
|
12
12
|
|
|
13
|
-
**Complete API coverage** — all
|
|
13
|
+
**Complete API coverage** — all 639 operations across 60 resources, generated from the official OpenAPI spec. Built for modern Python:
|
|
14
14
|
|
|
15
15
|
- **Async and sync clients** — `async with OrderCloudClient(...)` or `with SyncOrderCloudClient(...)`. Same API shape, your choice of runtime.
|
|
16
16
|
- **Pydantic v2 models** — every API resource is a typed, validated model. snake_case fields, PascalCase aliases for API compatibility.
|
|
@@ -20,7 +20,7 @@ A fully typed, async-first Python SDK for [Sitecore OrderCloud](https://orderclo
|
|
|
20
20
|
- **Middleware hooks** — intercept requests and responses for logging, metrics, or header injection.
|
|
21
21
|
- **Structured logging** — standard Python `logging` module, DEBUG/WARNING levels.
|
|
22
22
|
- **Full type annotations** — `py.typed` marker for downstream type checking with mypy, pyright, etc.
|
|
23
|
-
- **
|
|
23
|
+
- **803 tests, 97% coverage** — 778 unit tests (mocked HTTP) + 25 integration tests (live sandbox).
|
|
24
24
|
|
|
25
25
|
## Installation
|
|
26
26
|
|
|
@@ -204,14 +204,14 @@ Before-request hooks receive a mutable `RequestContext` — modify `headers`, `p
|
|
|
204
204
|
|
|
205
205
|
## API Coverage
|
|
206
206
|
|
|
207
|
-
The SDK covers **all 60 resources** and **
|
|
207
|
+
The SDK covers **all 60 resources** and **639 operations** in the OrderCloud API. Models and resource clients are generated from the official OpenAPI v3 spec (version 1.0.470).
|
|
208
208
|
|
|
209
209
|
### Core Commerce
|
|
210
210
|
|
|
211
211
|
| Resource | Operations | Highlights |
|
|
212
212
|
|----------|-----------|------------|
|
|
213
213
|
| Products | 18 | CRUD, variants, specs, suppliers, assignments |
|
|
214
|
-
| Orders |
|
|
214
|
+
| Orders | 30 | CRUD, submit, approve, decline, cancel, complete, forward, split, ship, repeat, promotions |
|
|
215
215
|
| Line Items | 9 | CRUD, shipping address management, cross-order listing |
|
|
216
216
|
| Cart | 37 | Full shopping cart lifecycle, checkout, payments, promotions |
|
|
217
217
|
| Bundles | 12 | CRUD, product/catalog assignments |
|
|
@@ -235,7 +235,7 @@ The SDK covers **all 60 resources** and **632 operations** in the OrderCloud API
|
|
|
235
235
|
| Resource | Operations | Highlights |
|
|
236
236
|
|----------|-----------|------------|
|
|
237
237
|
| Price Schedules | 8 | CRUD, price breaks |
|
|
238
|
-
| Promotions |
|
|
238
|
+
| Promotions | 10 | CRUD, assignments, generated codes |
|
|
239
239
|
| Discounts | 9 | CRUD, assignments |
|
|
240
240
|
| Specs | 15 | CRUD, options, product assignments |
|
|
241
241
|
|
|
@@ -267,7 +267,7 @@ The SDK covers **all 60 resources** and **632 operations** in the OrderCloud API
|
|
|
267
267
|
| Integration Events | 10 | CRUD, calculate, estimate shipping |
|
|
268
268
|
| Message Senders | 11 | CRUD, assignments, CC listeners |
|
|
269
269
|
| Subscriptions | 6 | CRUD |
|
|
270
|
-
| Entity Syncs |
|
|
270
|
+
| Entity Syncs | 45 | Full sync infrastructure (incl. catalogs) |
|
|
271
271
|
| Delivery Configurations | 6 | CRUD |
|
|
272
272
|
| Inventory Records | 18 | CRUD, variant records, assignments |
|
|
273
273
|
|
|
@@ -464,18 +464,18 @@ The test suite is self-bootstrapping — it uses the SDK itself to create all te
|
|
|
464
464
|
|
|
465
465
|
### Test Suite
|
|
466
466
|
|
|
467
|
-
|
|
467
|
+
803 tests across 12 modules.
|
|
468
468
|
|
|
469
|
-
**Unit tests (
|
|
469
|
+
**Unit tests (778)** — mocked HTTP via [respx](https://lundberg.github.io/respx/), no network calls:
|
|
470
470
|
|
|
471
471
|
| Module | Tests | Purpose |
|
|
472
472
|
|--------|-------|---------|
|
|
473
473
|
| `test_auth.py` | 13 | OAuth2 token management |
|
|
474
|
-
| `test_http.py` |
|
|
475
|
-
| `test_models.py` |
|
|
476
|
-
| `test_resources.py` |
|
|
477
|
-
| `test_resource_coverage.py` |
|
|
478
|
-
| `test_sync_client.py` |
|
|
474
|
+
| `test_http.py` | 37 | HTTP client, error parsing, retries |
|
|
475
|
+
| `test_models.py` | 44 | Model round-trips, enums, xp, ListPage |
|
|
476
|
+
| `test_resources.py` | 33 | Representative resource operations |
|
|
477
|
+
| `test_resource_coverage.py` | 639 | All 60 resources, all 639 operations |
|
|
478
|
+
| `test_sync_client.py` | 12 | Sync wrapper, pagination |
|
|
479
479
|
|
|
480
480
|
**Integration tests (25)** — live sandbox, skipped when credentials are absent:
|
|
481
481
|
|
|
@@ -492,11 +492,11 @@ The test suite is self-bootstrapping — it uses the SDK itself to create all te
|
|
|
492
492
|
|
|
493
493
|
| Module | Coverage |
|
|
494
494
|
|--------|----------|
|
|
495
|
-
| `auth.py` |
|
|
495
|
+
| `auth.py` | 93% |
|
|
496
496
|
| `client.py` | 100% |
|
|
497
|
-
| `config.py` |
|
|
497
|
+
| `config.py` | 94% |
|
|
498
498
|
| `errors.py` | 100% |
|
|
499
|
-
| `http.py` |
|
|
499
|
+
| `http.py` | 98% |
|
|
500
500
|
| `middleware.py` | 100% |
|
|
501
501
|
| `sync_client.py` | 100% |
|
|
502
502
|
| `resources/base.py` | 100% |
|
|
@@ -505,7 +505,7 @@ The test suite is self-bootstrapping — it uses the SDK itself to create all te
|
|
|
505
505
|
|
|
506
506
|
## Contributing
|
|
507
507
|
|
|
508
|
-
Bug reports and
|
|
508
|
+
Bug reports, feature requests, and pull requests are welcome. See [CONTRIBUTING.md](CONTRIBUTING.md) for development setup, running tests, code generation, and PR guidelines. See the [Changelog](CHANGELOG.md) for release history.
|
|
509
509
|
|
|
510
510
|
## License
|
|
511
511
|
|