ordercloud-python 2026.4.1__tar.gz → 2026.6.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.6.1}/.github/workflows/ci.yml +4 -4
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/.github/workflows/codeql.yml +4 -4
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/.github/workflows/dependency-review.yml +2 -2
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/.github/workflows/release.yml +2 -2
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/.github/workflows/sbom.yml +2 -2
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/.github/workflows/scorecard.yml +2 -2
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/CHANGELOG.md +16 -0
- ordercloud_python-2026.6.1/CONTRIBUTING.md +133 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/PKG-INFO +11 -11
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/README.md +10 -10
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/pyproject.toml +1 -1
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/__init__.py +6 -1
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/buyer.py +15 -3
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/discount.py +2 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/misc.py +17 -1
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/order.py +34 -2
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/promotion.py +41 -4
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/sync.py +11 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/entity_syncs.py +64 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/orders.py +29 -1
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/promotions.py +27 -3
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/tools/codegen/grouping.py +6 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/.github/dependabot.yml +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/.gitignore +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/CODE_REVIEW.md +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/LICENSE +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/SECURITY.md +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/SECURITY_AUDIT.md +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/examples/basic_workflow.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/__init__.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/auth.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/client.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/config.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/errors.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/http.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/middleware.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/address.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/api_client.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/approval.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/assignments.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/auth_models.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/bundle.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/catalog.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/category.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/cost_center.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/credit_card.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/delivery.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/integration.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/inventory_record.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/line_item.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/line_item_types.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/message_sender.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/open_id_connect.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/order_return.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/payment.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/price_schedule.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/product.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/product_collection.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/security.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/shared.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/shipment.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/spec.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/spending_account.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/subscription.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/supplier.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/user.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/user_group.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/webhook.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/py.typed +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/__init__.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/addresses.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/admin_addresses.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/admin_user_groups.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/admin_users.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/api_clients.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/approval_rules.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/base.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/bundle_line_items.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/bundle_subscription_items.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/bundles.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/buyer_groups.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/buyers.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/cart.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/catalogs.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/categories.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/cost_centers.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/credit_cards.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/delivery_configurations.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/discounts.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/error_configs.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/forgotten_credentials.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/group_orders.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/impersonation_configs.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/incrementors.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/integration_events.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/inventory_integrations.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/inventory_records.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/line_items.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/locales.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/me.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/message_senders.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/open_id_connects.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/order_returns.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/order_syncs.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/payments.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/price_schedules.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/product_collections.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/product_facets.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/product_syncs.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/products.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/promotion_integrations.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/security_profiles.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/seller_approval_rules.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/shipments.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/specs.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/spending_accounts.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/subscription_integrations.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/subscription_items.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/subscriptions.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/supplier_addresses.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/supplier_user_groups.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/supplier_users.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/suppliers.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/tracking_events.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/user_groups.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/users.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/webhooks.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/xp_indices.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/sync_client.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/tests/__init__.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/tests/conftest.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/tests/integration/__init__.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/tests/integration/conftest.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/tests/integration/test_auth.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/tests/integration/test_crud.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/tests/integration/test_errors.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/tests/integration/test_pagination.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/tests/integration/test_query_params.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/tests/integration/test_sync_client.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/tests/test_auth.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/tests/test_http.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/tests/test_models.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/tests/test_resource_coverage.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/tests/test_resources.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/tests/test_sync_client.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/tools/__init__.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/tools/codegen/__init__.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/tools/codegen/__main__.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/tools/codegen/cli.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/tools/codegen/ir.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/tools/codegen/naming.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/tools/codegen/parser.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/tools/codegen/renderer.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/tools/codegen/templates/client.py.j2 +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/tools/codegen/templates/model_module.py.j2 +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/tools/codegen/templates/models_init.py.j2 +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/tools/codegen/templates/resource_module.py.j2 +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/tools/codegen/templates/resources_init.py.j2 +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/tools/codegen/transformer.py +0 -0
- {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/tools/codegen/type_mapping.py +0 -0
|
@@ -14,7 +14,7 @@ jobs:
|
|
|
14
14
|
name: Lint
|
|
15
15
|
runs-on: ubuntu-latest
|
|
16
16
|
steps:
|
|
17
|
-
- uses: actions/checkout@
|
|
17
|
+
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
|
18
18
|
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
|
|
19
19
|
with:
|
|
20
20
|
python-version: "3.13"
|
|
@@ -29,7 +29,7 @@ jobs:
|
|
|
29
29
|
name: Type check
|
|
30
30
|
runs-on: ubuntu-latest
|
|
31
31
|
steps:
|
|
32
|
-
- uses: actions/checkout@
|
|
32
|
+
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
|
33
33
|
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
|
|
34
34
|
with:
|
|
35
35
|
python-version: "3.13"
|
|
@@ -46,7 +46,7 @@ jobs:
|
|
|
46
46
|
matrix:
|
|
47
47
|
python-version: ["3.10", "3.11", "3.12", "3.13"]
|
|
48
48
|
steps:
|
|
49
|
-
- uses: actions/checkout@
|
|
49
|
+
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
|
50
50
|
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
|
|
51
51
|
with:
|
|
52
52
|
python-version: ${{ matrix.python-version }}
|
|
@@ -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@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
|
22
22
|
|
|
23
23
|
- name: Initialize CodeQL
|
|
24
|
-
uses: github/codeql-action/init@
|
|
24
|
+
uses: github/codeql-action/init@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4.36.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@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4.36.2
|
|
31
31
|
|
|
32
32
|
- name: Perform CodeQL Analysis
|
|
33
|
-
uses: github/codeql-action/analyze@
|
|
33
|
+
uses: github/codeql-action/analyze@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4.36.2
|
|
34
34
|
with:
|
|
35
35
|
category: "/language:python"
|
{ordercloud_python-2026.4.1 → ordercloud_python-2026.6.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@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
|
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,7 +14,7 @@ jobs:
|
|
|
14
14
|
permissions:
|
|
15
15
|
contents: read
|
|
16
16
|
steps:
|
|
17
|
-
- uses: actions/checkout@
|
|
17
|
+
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
|
18
18
|
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
|
|
19
19
|
with:
|
|
20
20
|
python-version: "3.13"
|
|
@@ -80,7 +80,7 @@ jobs:
|
|
|
80
80
|
permissions:
|
|
81
81
|
contents: write
|
|
82
82
|
steps:
|
|
83
|
-
- uses: actions/checkout@
|
|
83
|
+
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
|
84
84
|
- name: Download distributions
|
|
85
85
|
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
|
86
86
|
with:
|
|
@@ -16,7 +16,7 @@ jobs:
|
|
|
16
16
|
permissions:
|
|
17
17
|
contents: read
|
|
18
18
|
steps:
|
|
19
|
-
- uses: actions/checkout@
|
|
19
|
+
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
|
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@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
|
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@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4.36.2
|
|
35
35
|
with:
|
|
36
36
|
sarif_file: results.sarif
|
|
@@ -4,6 +4,22 @@ All notable changes to this project will be documented in this file.
|
|
|
4
4
|
|
|
5
5
|
This project uses [Calendar Versioning](https://calver.org/) — `YYYY.MM.N` where `N` is the release number within that month.
|
|
6
6
|
|
|
7
|
+
## 2026.6.1 — 2026-06-14
|
|
8
|
+
|
|
9
|
+
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.
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- **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`).
|
|
14
|
+
- **Repeat order** — `Orders.Repeat` (`POST /orders/{direction}/{orderID}/repeat`) with the `OrderRepeatResponse` and `UnavailableLineItem` models.
|
|
15
|
+
- **Catalog entity sync** — five `EntitySyncs` catalog operations (get / save / patch / delete on `/integrations/entitysync/catalogs`, plus `/catalogs/sync`) and the `SyncCatalog` model.
|
|
16
|
+
- **New models** — `BuyerDiscount` (on `BuyerPriceSchedule`) and `ApiError` (the typed error returned within `UnavailableLineItem`).
|
|
17
|
+
- **New fields / values** — `Percent` on `DiscountedPrices`; `BulkReader` added to the `ApiRole` enum.
|
|
18
|
+
|
|
19
|
+
### Changed
|
|
20
|
+
|
|
21
|
+
- Bumped package version to `2026.6.1` (CalVer).
|
|
22
|
+
|
|
7
23
|
## 2026.4.1 — 2026-04-13
|
|
8
24
|
|
|
9
25
|
Initial release. Full SDK for the Sitecore OrderCloud API, generated from the OpenAPI v3 spec (version 1.0.445).
|
|
@@ -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
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ordercloud-python
|
|
3
|
-
Version: 2026.
|
|
3
|
+
Version: 2026.6.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
|
+
- **791 tests, 97% coverage** — 766 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.454).
|
|
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,9 +504,9 @@ 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
|
+
791 tests across 12 modules.
|
|
508
508
|
|
|
509
|
-
**Unit tests (
|
|
509
|
+
**Unit tests (766)** — mocked HTTP via [respx](https://lundberg.github.io/respx/), no network calls:
|
|
510
510
|
|
|
511
511
|
| Module | Tests | Purpose |
|
|
512
512
|
|--------|-------|---------|
|
|
@@ -514,7 +514,7 @@ The test suite is self-bootstrapping — it uses the SDK itself to create all te
|
|
|
514
514
|
| `test_http.py` | 16 | HTTP client, error parsing, retries |
|
|
515
515
|
| `test_models.py` | 28 | Model round-trips, enums, xp, ListPage |
|
|
516
516
|
| `test_resources.py` | 22 | Representative resource operations |
|
|
517
|
-
| `test_resource_coverage.py` |
|
|
517
|
+
| `test_resource_coverage.py` | 639 | All 60 resources, all 639 operations |
|
|
518
518
|
| `test_sync_client.py` | 48 | Sync wrapper, pagination |
|
|
519
519
|
|
|
520
520
|
**Integration tests (25)** — live sandbox, skipped when credentials are absent:
|
|
@@ -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
|
+
- **791 tests, 97% coverage** — 766 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.454).
|
|
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,9 +464,9 @@ 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
|
+
791 tests across 12 modules.
|
|
468
468
|
|
|
469
|
-
**Unit tests (
|
|
469
|
+
**Unit tests (766)** — mocked HTTP via [respx](https://lundberg.github.io/respx/), no network calls:
|
|
470
470
|
|
|
471
471
|
| Module | Tests | Purpose |
|
|
472
472
|
|--------|-------|---------|
|
|
@@ -474,7 +474,7 @@ The test suite is self-bootstrapping — it uses the SDK itself to create all te
|
|
|
474
474
|
| `test_http.py` | 16 | HTTP client, error parsing, retries |
|
|
475
475
|
| `test_models.py` | 28 | Model round-trips, enums, xp, ListPage |
|
|
476
476
|
| `test_resources.py` | 22 | Representative resource operations |
|
|
477
|
-
| `test_resource_coverage.py` |
|
|
477
|
+
| `test_resource_coverage.py` | 639 | All 60 resources, all 639 operations |
|
|
478
478
|
| `test_sync_client.py` | 48 | Sync wrapper, pagination |
|
|
479
479
|
|
|
480
480
|
**Integration tests (25)** — live sandbox, skipped when credentials are absent:
|
|
@@ -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
|
|
|
@@ -31,6 +31,8 @@ from .order import ( # noqa: F401
|
|
|
31
31
|
ExtendedLineItem,
|
|
32
32
|
OrderWorksheet,
|
|
33
33
|
Order,
|
|
34
|
+
UnavailableLineItem,
|
|
35
|
+
OrderRepeatResponse,
|
|
34
36
|
OrderDirection,
|
|
35
37
|
OrderStatus,
|
|
36
38
|
)
|
|
@@ -50,6 +52,7 @@ from .order_return import ( # noqa: F401
|
|
|
50
52
|
)
|
|
51
53
|
from .buyer import ( # noqa: F401
|
|
52
54
|
BuyerPriceBreak,
|
|
55
|
+
BuyerDiscount,
|
|
53
56
|
BuyerPriceSchedule,
|
|
54
57
|
ProductSeller,
|
|
55
58
|
BuyerAddress,
|
|
@@ -98,6 +101,7 @@ from .promotion import ( # noqa: F401
|
|
|
98
101
|
RemovedPromo,
|
|
99
102
|
EligiblePromotion,
|
|
100
103
|
RefreshPromosResponse,
|
|
104
|
+
PromotionCode,
|
|
101
105
|
Promotion,
|
|
102
106
|
)
|
|
103
107
|
from .payment import ( # noqa: F401
|
|
@@ -201,6 +205,7 @@ from .sync import ( # noqa: F401
|
|
|
201
205
|
SyncBuyer,
|
|
202
206
|
SyncBuyerUser,
|
|
203
207
|
SyncBuyerUserGroup,
|
|
208
|
+
SyncCatalog,
|
|
204
209
|
SyncCategory,
|
|
205
210
|
SyncInventoryRecord,
|
|
206
211
|
SyncProduct,
|
|
@@ -259,6 +264,7 @@ from .misc import ( # noqa: F401
|
|
|
259
264
|
XpIndex,
|
|
260
265
|
ProductFacet,
|
|
261
266
|
GroupOrderInvitation,
|
|
267
|
+
ApiError,
|
|
262
268
|
)
|
|
263
269
|
from .shared import ( # noqa: F401
|
|
264
270
|
ListFacet,
|
|
@@ -266,6 +272,5 @@ from .shared import ( # noqa: F401
|
|
|
266
272
|
ListPage,
|
|
267
273
|
Meta,
|
|
268
274
|
MetaWithFacets,
|
|
269
|
-
OrderCloudEnum,
|
|
270
275
|
OrderCloudModel,
|
|
271
276
|
)
|
|
@@ -7,11 +7,12 @@ from typing import Generic, Optional
|
|
|
7
7
|
from pydantic import Field
|
|
8
8
|
|
|
9
9
|
from .shared import OrderCloudModel, XP
|
|
10
|
-
from .discount import
|
|
10
|
+
from .discount import DiscountedPrices
|
|
11
11
|
from .product import Inventory
|
|
12
12
|
|
|
13
13
|
__all__ = [
|
|
14
14
|
"BuyerPriceBreak",
|
|
15
|
+
"BuyerDiscount",
|
|
15
16
|
"BuyerPriceSchedule",
|
|
16
17
|
"ProductSeller",
|
|
17
18
|
"BuyerAddress",
|
|
@@ -21,7 +22,6 @@ __all__ = [
|
|
|
21
22
|
"BuyerGroup",
|
|
22
23
|
"Buyer",
|
|
23
24
|
]
|
|
24
|
-
_Discount = Discount
|
|
25
25
|
_Inventory = Inventory
|
|
26
26
|
|
|
27
27
|
|
|
@@ -45,6 +45,18 @@ class BuyerPriceBreak(OrderCloudModel):
|
|
|
45
45
|
bundle_price: Optional[float] = Field(None, alias="BundlePrice")
|
|
46
46
|
|
|
47
47
|
|
|
48
|
+
class BuyerDiscount(OrderCloudModel):
|
|
49
|
+
"""An OrderCloud BuyerDiscount.
|
|
50
|
+
|
|
51
|
+
Attributes:
|
|
52
|
+
id: ID of the discount.
|
|
53
|
+
description: Description of the discount.
|
|
54
|
+
"""
|
|
55
|
+
|
|
56
|
+
id: Optional[str] = Field(None, alias="ID")
|
|
57
|
+
description: Optional[str] = Field(None, alias="Description")
|
|
58
|
+
|
|
59
|
+
|
|
48
60
|
class BuyerPriceSchedule(OrderCloudModel, Generic[XP]):
|
|
49
61
|
"""An OrderCloud BuyerPriceSchedule.
|
|
50
62
|
|
|
@@ -68,7 +80,7 @@ class BuyerPriceSchedule(OrderCloudModel, Generic[XP]):
|
|
|
68
80
|
"""
|
|
69
81
|
|
|
70
82
|
price_breaks: Optional[list[BuyerPriceBreak]] = Field(None, alias="PriceBreaks")
|
|
71
|
-
discount: Optional[
|
|
83
|
+
discount: Optional[BuyerDiscount] = Field(None, alias="Discount")
|
|
72
84
|
owner_id: Optional[str] = Field(None, alias="OwnerID")
|
|
73
85
|
id: Optional[str] = Field(None, alias="ID")
|
|
74
86
|
name: Optional[str] = Field(None, alias="Name")
|
|
@@ -31,12 +31,14 @@ class DiscountedPrices(OrderCloudModel):
|
|
|
31
31
|
sale_price: Discounted sale price per unit.
|
|
32
32
|
subscription_price: Discounted subscription price per unit.
|
|
33
33
|
bundle_price: Discounted bundle price per unit.
|
|
34
|
+
percent: The discount percentage applied (e.g., 10 for 10% off).
|
|
34
35
|
"""
|
|
35
36
|
|
|
36
37
|
price: Optional[float] = Field(None, alias="Price")
|
|
37
38
|
sale_price: Optional[float] = Field(None, alias="SalePrice")
|
|
38
39
|
subscription_price: Optional[float] = Field(None, alias="SubscriptionPrice")
|
|
39
40
|
bundle_price: Optional[float] = Field(None, alias="BundlePrice")
|
|
41
|
+
percent: Optional[float] = Field(None, alias="Percent")
|
|
40
42
|
|
|
41
43
|
|
|
42
44
|
class Discount(OrderCloudModel, Generic[XP]):
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"""OrderCloud AccessLevel and related models."""
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
|
-
from typing import Generic, Optional
|
|
6
|
+
from typing import Any, Generic, Optional
|
|
7
7
|
from pydantic import Field
|
|
8
8
|
|
|
9
9
|
from .shared import OrderCloudEnum, OrderCloudModel, XP
|
|
@@ -21,6 +21,7 @@ __all__ = [
|
|
|
21
21
|
"XpIndex",
|
|
22
22
|
"ProductFacet",
|
|
23
23
|
"GroupOrderInvitation",
|
|
24
|
+
"ApiError",
|
|
24
25
|
]
|
|
25
26
|
|
|
26
27
|
|
|
@@ -47,6 +48,7 @@ class ApiRole(OrderCloudEnum):
|
|
|
47
48
|
AdminUserReader = "AdminUserReader"
|
|
48
49
|
ApprovalRuleAdmin = "ApprovalRuleAdmin"
|
|
49
50
|
ApprovalRuleReader = "ApprovalRuleReader"
|
|
51
|
+
BulkReader = "BulkReader"
|
|
50
52
|
BundleAdmin = "BundleAdmin"
|
|
51
53
|
BundleAssignmentAdmin = "BundleAssignmentAdmin"
|
|
52
54
|
BundleReader = "BundleReader"
|
|
@@ -277,4 +279,18 @@ class GroupOrderInvitation(OrderCloudModel, Generic[XP]):
|
|
|
277
279
|
xp: Optional[XP] = Field(None, alias="xp")
|
|
278
280
|
|
|
279
281
|
|
|
282
|
+
class ApiError(OrderCloudModel):
|
|
283
|
+
"""An OrderCloud ApiError.
|
|
284
|
+
|
|
285
|
+
Attributes:
|
|
286
|
+
error_code:
|
|
287
|
+
message:
|
|
288
|
+
data:
|
|
289
|
+
"""
|
|
290
|
+
|
|
291
|
+
error_code: Optional[str] = Field(None, alias="ErrorCode")
|
|
292
|
+
message: Optional[str] = Field(None, alias="Message")
|
|
293
|
+
data: Optional[dict[str, Any]] = Field(None, alias="Data")
|
|
294
|
+
|
|
295
|
+
|
|
280
296
|
_OrderStatus = OrderStatus
|