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.
Files changed (161) hide show
  1. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/.github/dependabot.yml +6 -0
  2. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/.github/workflows/ci.yml +7 -7
  3. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/.github/workflows/codeql.yml +4 -4
  4. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/.github/workflows/dependency-review.yml +2 -2
  5. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/.github/workflows/release.yml +35 -7
  6. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/.github/workflows/sbom.yml +2 -2
  7. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/.github/workflows/scorecard.yml +2 -2
  8. ordercloud_python-2026.10.1/CHANGELOG.md +85 -0
  9. ordercloud_python-2026.10.1/CONTRIBUTING.md +133 -0
  10. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/PKG-INFO +19 -19
  11. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/README.md +17 -17
  12. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/pyproject.toml +6 -1
  13. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/__init__.py +6 -1
  14. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/api_client.py +0 -2
  15. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/buyer.py +15 -3
  16. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/discount.py +4 -0
  17. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/misc.py +18 -1
  18. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/order.py +34 -2
  19. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/promotion.py +41 -4
  20. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/sync.py +11 -0
  21. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/entity_syncs.py +64 -0
  22. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/orders.py +29 -1
  23. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/promotions.py +27 -3
  24. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/tests/test_models.py +51 -0
  25. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/tests/test_resources.py +42 -0
  26. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/tools/codegen/grouping.py +6 -0
  27. ordercloud_python-2026.4.1/CHANGELOG.md +0 -34
  28. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/.gitignore +0 -0
  29. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/CODE_REVIEW.md +0 -0
  30. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/LICENSE +0 -0
  31. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/SECURITY.md +0 -0
  32. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/SECURITY_AUDIT.md +0 -0
  33. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/examples/basic_workflow.py +0 -0
  34. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/__init__.py +0 -0
  35. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/auth.py +0 -0
  36. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/client.py +0 -0
  37. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/config.py +0 -0
  38. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/errors.py +0 -0
  39. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/http.py +0 -0
  40. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/middleware.py +0 -0
  41. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/address.py +0 -0
  42. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/approval.py +0 -0
  43. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/assignments.py +0 -0
  44. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/auth_models.py +0 -0
  45. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/bundle.py +0 -0
  46. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/catalog.py +0 -0
  47. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/category.py +0 -0
  48. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/cost_center.py +0 -0
  49. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/credit_card.py +0 -0
  50. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/delivery.py +0 -0
  51. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/integration.py +0 -0
  52. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/inventory_record.py +0 -0
  53. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/line_item.py +0 -0
  54. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/line_item_types.py +0 -0
  55. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/message_sender.py +0 -0
  56. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/open_id_connect.py +0 -0
  57. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/order_return.py +0 -0
  58. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/payment.py +0 -0
  59. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/price_schedule.py +0 -0
  60. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/product.py +0 -0
  61. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/product_collection.py +0 -0
  62. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/security.py +0 -0
  63. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/shared.py +0 -0
  64. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/shipment.py +0 -0
  65. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/spec.py +0 -0
  66. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/spending_account.py +0 -0
  67. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/subscription.py +0 -0
  68. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/supplier.py +0 -0
  69. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/user.py +0 -0
  70. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/user_group.py +0 -0
  71. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/models/webhook.py +0 -0
  72. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/py.typed +0 -0
  73. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/__init__.py +0 -0
  74. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/addresses.py +0 -0
  75. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/admin_addresses.py +0 -0
  76. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/admin_user_groups.py +0 -0
  77. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/admin_users.py +0 -0
  78. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/api_clients.py +0 -0
  79. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/approval_rules.py +0 -0
  80. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/base.py +0 -0
  81. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/bundle_line_items.py +0 -0
  82. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/bundle_subscription_items.py +0 -0
  83. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/bundles.py +0 -0
  84. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/buyer_groups.py +0 -0
  85. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/buyers.py +0 -0
  86. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/cart.py +0 -0
  87. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/catalogs.py +0 -0
  88. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/categories.py +0 -0
  89. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/cost_centers.py +0 -0
  90. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/credit_cards.py +0 -0
  91. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/delivery_configurations.py +0 -0
  92. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/discounts.py +0 -0
  93. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/error_configs.py +0 -0
  94. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/forgotten_credentials.py +0 -0
  95. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/group_orders.py +0 -0
  96. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/impersonation_configs.py +0 -0
  97. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/incrementors.py +0 -0
  98. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/integration_events.py +0 -0
  99. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/inventory_integrations.py +0 -0
  100. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/inventory_records.py +0 -0
  101. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/line_items.py +0 -0
  102. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/locales.py +0 -0
  103. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/me.py +0 -0
  104. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/message_senders.py +0 -0
  105. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/open_id_connects.py +0 -0
  106. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/order_returns.py +0 -0
  107. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/order_syncs.py +0 -0
  108. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/payments.py +0 -0
  109. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/price_schedules.py +0 -0
  110. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/product_collections.py +0 -0
  111. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/product_facets.py +0 -0
  112. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/product_syncs.py +0 -0
  113. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/products.py +0 -0
  114. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/promotion_integrations.py +0 -0
  115. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/security_profiles.py +0 -0
  116. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/seller_approval_rules.py +0 -0
  117. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/shipments.py +0 -0
  118. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/specs.py +0 -0
  119. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/spending_accounts.py +0 -0
  120. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/subscription_integrations.py +0 -0
  121. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/subscription_items.py +0 -0
  122. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/subscriptions.py +0 -0
  123. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/supplier_addresses.py +0 -0
  124. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/supplier_user_groups.py +0 -0
  125. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/supplier_users.py +0 -0
  126. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/suppliers.py +0 -0
  127. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/tracking_events.py +0 -0
  128. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/user_groups.py +0 -0
  129. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/users.py +0 -0
  130. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/webhooks.py +0 -0
  131. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/resources/xp_indices.py +0 -0
  132. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/src/ordercloud/sync_client.py +0 -0
  133. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/tests/__init__.py +0 -0
  134. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/tests/conftest.py +0 -0
  135. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/tests/integration/__init__.py +0 -0
  136. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/tests/integration/conftest.py +0 -0
  137. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/tests/integration/test_auth.py +0 -0
  138. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/tests/integration/test_crud.py +0 -0
  139. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/tests/integration/test_errors.py +0 -0
  140. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/tests/integration/test_pagination.py +0 -0
  141. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/tests/integration/test_query_params.py +0 -0
  142. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/tests/integration/test_sync_client.py +0 -0
  143. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/tests/test_auth.py +0 -0
  144. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/tests/test_http.py +0 -0
  145. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/tests/test_resource_coverage.py +0 -0
  146. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/tests/test_sync_client.py +0 -0
  147. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/tools/__init__.py +0 -0
  148. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/tools/codegen/__init__.py +0 -0
  149. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/tools/codegen/__main__.py +0 -0
  150. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/tools/codegen/cli.py +0 -0
  151. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/tools/codegen/ir.py +0 -0
  152. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/tools/codegen/naming.py +0 -0
  153. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/tools/codegen/parser.py +0 -0
  154. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/tools/codegen/renderer.py +0 -0
  155. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/tools/codegen/templates/client.py.j2 +0 -0
  156. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/tools/codegen/templates/model_module.py.j2 +0 -0
  157. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/tools/codegen/templates/models_init.py.j2 +0 -0
  158. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/tools/codegen/templates/resource_module.py.j2 +0 -0
  159. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/tools/codegen/templates/resources_init.py.j2 +0 -0
  160. {ordercloud_python-2026.4.1 → ordercloud_python-2026.10.1}/tools/codegen/transformer.py +0 -0
  161. {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@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
18
- - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
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@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
33
- - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
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@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
50
- - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
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@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0
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@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
21
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
22
22
 
23
23
  - name: Initialize CodeQL
24
- uses: github/codeql-action/init@c10b8064de6f491fea524254123dbe5e09572f13 # v4.35.1
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@c10b8064de6f491fea524254123dbe5e09572f13 # v4.35.1
30
+ uses: github/codeql-action/autobuild@2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2 # v4.38.2
31
31
 
32
32
  - name: Perform CodeQL Analysis
33
- uses: github/codeql-action/analyze@c10b8064de6f491fea524254123dbe5e09572f13 # v4.35.1
33
+ uses: github/codeql-action/analyze@2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2 # v4.38.2
34
34
  with:
35
35
  category: "/language:python"
@@ -12,9 +12,9 @@ jobs:
12
12
  name: Review dependencies
13
13
  runs-on: ubuntu-latest
14
14
  steps:
15
- - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
15
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
16
16
  - name: Dependency Review
17
- uses: actions/dependency-review-action@2031cfc080254a8a887f58cffee85186f0e49e48 # v4
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@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
18
- - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
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
- needs: build
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@cef221092ed1bacb1cc03d23a2d87d1d172e277b # v1.14.0
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
- uses: actions/attest-build-provenance@a2bbfa25375fe432b6a289bc6b6cd05ecd0c4c32 # v4.1.0
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@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
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
- gh release create "$GITHUB_REF_NAME" dist/* \
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@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
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@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
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@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
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@c10b8064de6f491fea524254123dbe5e09572f13 # v4.35.1
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.4
1
+ Metadata-Version: 2.5
2
2
  Name: ordercloud-python
3
- Version: 2026.4.1
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 632 operations across 60 resources, generated from the official OpenAPI spec. Built for modern Python:
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
- - **784 tests, 97% coverage** — 759 unit tests (mocked HTTP) + 25 integration tests (live sandbox).
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 **632 operations** in the OrderCloud API. Models and resource clients are generated from the official OpenAPI v3 spec (version 1.0.445).
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 | 29 | CRUD, submit, approve, decline, cancel, complete, forward, split, ship, promotions |
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 | 9 | CRUD, assignments |
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 | 40 | Full sync infrastructure |
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
- 784 tests across 12 modules.
507
+ 803 tests across 12 modules.
508
508
 
509
- **Unit tests (759)** — mocked HTTP via [respx](https://lundberg.github.io/respx/), no network calls:
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` | 16 | HTTP client, error parsing, retries |
515
- | `test_models.py` | 28 | Model round-trips, enums, xp, ListPage |
516
- | `test_resources.py` | 22 | Representative resource operations |
517
- | `test_resource_coverage.py` | 632 | All 60 resources, all 632 operations |
518
- | `test_sync_client.py` | 48 | Sync wrapper, pagination |
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` | 100% |
535
+ | `auth.py` | 93% |
536
536
  | `client.py` | 100% |
537
- | `config.py` | 100% |
537
+ | `config.py` | 94% |
538
538
  | `errors.py` | 100% |
539
- | `http.py` | 97% |
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 feature requests are welcome via [GitHub Issues](https://github.com/markcassidyconsulting/ordercloud-python/issues). If you're interested in the internals, the codegen pipeline in `tools/codegen/` is a good starting point. See the [Changelog](CHANGELOG.md) for release history.
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 632 operations across 60 resources, generated from the official OpenAPI spec. Built for modern Python:
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
- - **784 tests, 97% coverage** — 759 unit tests (mocked HTTP) + 25 integration tests (live sandbox).
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 **632 operations** in the OrderCloud API. Models and resource clients are generated from the official OpenAPI v3 spec (version 1.0.445).
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 | 29 | CRUD, submit, approve, decline, cancel, complete, forward, split, ship, promotions |
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 | 9 | CRUD, assignments |
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 | 40 | Full sync infrastructure |
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
- 784 tests across 12 modules.
467
+ 803 tests across 12 modules.
468
468
 
469
- **Unit tests (759)** — mocked HTTP via [respx](https://lundberg.github.io/respx/), no network calls:
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` | 16 | HTTP client, error parsing, retries |
475
- | `test_models.py` | 28 | Model round-trips, enums, xp, ListPage |
476
- | `test_resources.py` | 22 | Representative resource operations |
477
- | `test_resource_coverage.py` | 632 | All 60 resources, all 632 operations |
478
- | `test_sync_client.py` | 48 | Sync wrapper, pagination |
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` | 100% |
495
+ | `auth.py` | 93% |
496
496
  | `client.py` | 100% |
497
- | `config.py` | 100% |
497
+ | `config.py` | 94% |
498
498
  | `errors.py` | 100% |
499
- | `http.py` | 97% |
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 feature requests are welcome via [GitHub Issues](https://github.com/markcassidyconsulting/ordercloud-python/issues). If you're interested in the internals, the codegen pipeline in `tools/codegen/` is a good starting point. See the [Changelog](CHANGELOG.md) for release history.
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