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.
Files changed (160) hide show
  1. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/.github/workflows/ci.yml +4 -4
  2. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/.github/workflows/codeql.yml +4 -4
  3. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/.github/workflows/dependency-review.yml +2 -2
  4. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/.github/workflows/release.yml +2 -2
  5. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/.github/workflows/sbom.yml +2 -2
  6. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/.github/workflows/scorecard.yml +2 -2
  7. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/CHANGELOG.md +16 -0
  8. ordercloud_python-2026.6.1/CONTRIBUTING.md +133 -0
  9. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/PKG-INFO +11 -11
  10. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/README.md +10 -10
  11. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/pyproject.toml +1 -1
  12. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/__init__.py +6 -1
  13. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/buyer.py +15 -3
  14. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/discount.py +2 -0
  15. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/misc.py +17 -1
  16. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/order.py +34 -2
  17. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/promotion.py +41 -4
  18. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/sync.py +11 -0
  19. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/entity_syncs.py +64 -0
  20. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/orders.py +29 -1
  21. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/promotions.py +27 -3
  22. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/tools/codegen/grouping.py +6 -0
  23. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/.github/dependabot.yml +0 -0
  24. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/.gitignore +0 -0
  25. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/CODE_REVIEW.md +0 -0
  26. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/LICENSE +0 -0
  27. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/SECURITY.md +0 -0
  28. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/SECURITY_AUDIT.md +0 -0
  29. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/examples/basic_workflow.py +0 -0
  30. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/__init__.py +0 -0
  31. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/auth.py +0 -0
  32. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/client.py +0 -0
  33. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/config.py +0 -0
  34. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/errors.py +0 -0
  35. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/http.py +0 -0
  36. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/middleware.py +0 -0
  37. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/address.py +0 -0
  38. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/api_client.py +0 -0
  39. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/approval.py +0 -0
  40. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/assignments.py +0 -0
  41. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/auth_models.py +0 -0
  42. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/bundle.py +0 -0
  43. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/catalog.py +0 -0
  44. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/category.py +0 -0
  45. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/cost_center.py +0 -0
  46. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/credit_card.py +0 -0
  47. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/delivery.py +0 -0
  48. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/integration.py +0 -0
  49. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/inventory_record.py +0 -0
  50. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/line_item.py +0 -0
  51. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/line_item_types.py +0 -0
  52. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/message_sender.py +0 -0
  53. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/open_id_connect.py +0 -0
  54. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/order_return.py +0 -0
  55. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/payment.py +0 -0
  56. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/price_schedule.py +0 -0
  57. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/product.py +0 -0
  58. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/product_collection.py +0 -0
  59. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/security.py +0 -0
  60. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/shared.py +0 -0
  61. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/shipment.py +0 -0
  62. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/spec.py +0 -0
  63. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/spending_account.py +0 -0
  64. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/subscription.py +0 -0
  65. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/supplier.py +0 -0
  66. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/user.py +0 -0
  67. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/user_group.py +0 -0
  68. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/models/webhook.py +0 -0
  69. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/py.typed +0 -0
  70. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/__init__.py +0 -0
  71. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/addresses.py +0 -0
  72. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/admin_addresses.py +0 -0
  73. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/admin_user_groups.py +0 -0
  74. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/admin_users.py +0 -0
  75. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/api_clients.py +0 -0
  76. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/approval_rules.py +0 -0
  77. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/base.py +0 -0
  78. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/bundle_line_items.py +0 -0
  79. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/bundle_subscription_items.py +0 -0
  80. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/bundles.py +0 -0
  81. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/buyer_groups.py +0 -0
  82. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/buyers.py +0 -0
  83. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/cart.py +0 -0
  84. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/catalogs.py +0 -0
  85. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/categories.py +0 -0
  86. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/cost_centers.py +0 -0
  87. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/credit_cards.py +0 -0
  88. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/delivery_configurations.py +0 -0
  89. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/discounts.py +0 -0
  90. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/error_configs.py +0 -0
  91. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/forgotten_credentials.py +0 -0
  92. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/group_orders.py +0 -0
  93. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/impersonation_configs.py +0 -0
  94. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/incrementors.py +0 -0
  95. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/integration_events.py +0 -0
  96. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/inventory_integrations.py +0 -0
  97. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/inventory_records.py +0 -0
  98. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/line_items.py +0 -0
  99. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/locales.py +0 -0
  100. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/me.py +0 -0
  101. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/message_senders.py +0 -0
  102. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/open_id_connects.py +0 -0
  103. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/order_returns.py +0 -0
  104. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/order_syncs.py +0 -0
  105. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/payments.py +0 -0
  106. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/price_schedules.py +0 -0
  107. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/product_collections.py +0 -0
  108. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/product_facets.py +0 -0
  109. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/product_syncs.py +0 -0
  110. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/products.py +0 -0
  111. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/promotion_integrations.py +0 -0
  112. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/security_profiles.py +0 -0
  113. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/seller_approval_rules.py +0 -0
  114. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/shipments.py +0 -0
  115. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/specs.py +0 -0
  116. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/spending_accounts.py +0 -0
  117. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/subscription_integrations.py +0 -0
  118. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/subscription_items.py +0 -0
  119. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/subscriptions.py +0 -0
  120. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/supplier_addresses.py +0 -0
  121. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/supplier_user_groups.py +0 -0
  122. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/supplier_users.py +0 -0
  123. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/suppliers.py +0 -0
  124. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/tracking_events.py +0 -0
  125. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/user_groups.py +0 -0
  126. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/users.py +0 -0
  127. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/webhooks.py +0 -0
  128. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/resources/xp_indices.py +0 -0
  129. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/src/ordercloud/sync_client.py +0 -0
  130. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/tests/__init__.py +0 -0
  131. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/tests/conftest.py +0 -0
  132. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/tests/integration/__init__.py +0 -0
  133. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/tests/integration/conftest.py +0 -0
  134. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/tests/integration/test_auth.py +0 -0
  135. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/tests/integration/test_crud.py +0 -0
  136. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/tests/integration/test_errors.py +0 -0
  137. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/tests/integration/test_pagination.py +0 -0
  138. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/tests/integration/test_query_params.py +0 -0
  139. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/tests/integration/test_sync_client.py +0 -0
  140. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/tests/test_auth.py +0 -0
  141. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/tests/test_http.py +0 -0
  142. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/tests/test_models.py +0 -0
  143. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/tests/test_resource_coverage.py +0 -0
  144. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/tests/test_resources.py +0 -0
  145. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/tests/test_sync_client.py +0 -0
  146. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/tools/__init__.py +0 -0
  147. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/tools/codegen/__init__.py +0 -0
  148. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/tools/codegen/__main__.py +0 -0
  149. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/tools/codegen/cli.py +0 -0
  150. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/tools/codegen/ir.py +0 -0
  151. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/tools/codegen/naming.py +0 -0
  152. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/tools/codegen/parser.py +0 -0
  153. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/tools/codegen/renderer.py +0 -0
  154. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/tools/codegen/templates/client.py.j2 +0 -0
  155. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/tools/codegen/templates/model_module.py.j2 +0 -0
  156. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/tools/codegen/templates/models_init.py.j2 +0 -0
  157. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/tools/codegen/templates/resource_module.py.j2 +0 -0
  158. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/tools/codegen/templates/resources_init.py.j2 +0 -0
  159. {ordercloud_python-2026.4.1 → ordercloud_python-2026.6.1}/tools/codegen/transformer.py +0 -0
  160. {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@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
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@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
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@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
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@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@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
22
22
 
23
23
  - name: Initialize CodeQL
24
- uses: github/codeql-action/init@c10b8064de6f491fea524254123dbe5e09572f13 # v4.35.1
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@c10b8064de6f491fea524254123dbe5e09572f13 # v4.35.1
30
+ uses: github/codeql-action/autobuild@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4.36.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@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4.36.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@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
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,7 +14,7 @@ jobs:
14
14
  permissions:
15
15
  contents: read
16
16
  steps:
17
- - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
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@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
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@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
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@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@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@c10b8064de6f491fea524254123dbe5e09572f13 # v4.35.1
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.4.1
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 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
+ - **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 **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.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 | 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,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
- 784 tests across 12 modules.
507
+ 791 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 (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` | 632 | All 60 resources, all 632 operations |
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 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
+ - **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 **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.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 | 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,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
- 784 tests across 12 modules.
467
+ 791 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 (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` | 632 | All 60 resources, all 632 operations |
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 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
 
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "ordercloud-python"
7
- version = "2026.4.1"
7
+ version = "2026.6.1"
8
8
  description = "Idiomatic Python SDK for Sitecore OrderCloud"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -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 Discount, DiscountedPrices
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[_Discount] = Field(None, alias="Discount")
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