mpt-extension-sdk 5.1.2__tar.gz → 5.2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/PKG-INFO +1 -1
  2. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/docker-compose.yml +2 -0
  3. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/mpt_extension_sdk/mpt_http/mpt.py +16 -0
  4. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/mpt_extension_sdk/runtime/master.py +2 -1
  5. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/pyproject.toml +1 -1
  6. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/tests/django/settings.py +1 -1
  7. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/tests/mpt/conftest.py +18 -0
  8. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/tests/mpt/test_mpt.py +18 -0
  9. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/.env.sample +0 -0
  10. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/.flake8 +0 -0
  11. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/.github/CODEOWNERS +0 -0
  12. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/.github/workflows/on-release.yml +0 -0
  13. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/.github/workflows/pr-build-merge.yml +0 -0
  14. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/.gitignore +0 -0
  15. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/LICENSE +0 -0
  16. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/README.md +0 -0
  17. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/dev.Dockerfile +0 -0
  18. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/mpt_extension_sdk/__init__.py +0 -0
  19. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/mpt_extension_sdk/airtable/wrap_http_error.py +0 -0
  20. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/mpt_extension_sdk/constants.py +0 -0
  21. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/mpt_extension_sdk/core/__init__.py +0 -0
  22. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/mpt_extension_sdk/core/events/__init__.py +0 -0
  23. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/mpt_extension_sdk/core/events/dataclasses.py +0 -0
  24. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/mpt_extension_sdk/core/events/registry.py +0 -0
  25. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/mpt_extension_sdk/core/extension.py +0 -0
  26. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/mpt_extension_sdk/core/security.py +0 -0
  27. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/mpt_extension_sdk/core/utils.py +0 -0
  28. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/mpt_extension_sdk/flows/__init__.py +0 -0
  29. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/mpt_extension_sdk/flows/context.py +0 -0
  30. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/mpt_extension_sdk/flows/pipeline.py +0 -0
  31. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/mpt_extension_sdk/key_vault/__init__.py +0 -0
  32. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/mpt_extension_sdk/key_vault/base.py +0 -0
  33. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/mpt_extension_sdk/mpt_http/__init__.py +0 -0
  34. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/mpt_extension_sdk/mpt_http/base.py +0 -0
  35. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/mpt_extension_sdk/mpt_http/utils.py +0 -0
  36. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/mpt_extension_sdk/mpt_http/wrap_http_error.py +0 -0
  37. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/mpt_extension_sdk/runtime/__init__.py +0 -0
  38. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/mpt_extension_sdk/runtime/commands/__init__.py +0 -0
  39. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/mpt_extension_sdk/runtime/commands/django.py +0 -0
  40. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/mpt_extension_sdk/runtime/commands/run.py +0 -0
  41. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/mpt_extension_sdk/runtime/djapp/__init__.py +0 -0
  42. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/mpt_extension_sdk/runtime/djapp/apps.py +0 -0
  43. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/mpt_extension_sdk/runtime/djapp/conf/__init__.py +0 -0
  44. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/mpt_extension_sdk/runtime/djapp/conf/default.py +0 -0
  45. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/mpt_extension_sdk/runtime/djapp/management/__init__.py +0 -0
  46. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/mpt_extension_sdk/runtime/djapp/management/commands/__init__.py +0 -0
  47. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/mpt_extension_sdk/runtime/djapp/management/commands/consume_events.py +0 -0
  48. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/mpt_extension_sdk/runtime/djapp/middleware.py +0 -0
  49. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/mpt_extension_sdk/runtime/events/__init__.py +0 -0
  50. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/mpt_extension_sdk/runtime/events/dispatcher.py +0 -0
  51. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/mpt_extension_sdk/runtime/events/producers.py +0 -0
  52. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/mpt_extension_sdk/runtime/events/utils.py +0 -0
  53. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/mpt_extension_sdk/runtime/initializer.py +0 -0
  54. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/mpt_extension_sdk/runtime/logging.py +0 -0
  55. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/mpt_extension_sdk/runtime/swoext.py +0 -0
  56. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/mpt_extension_sdk/runtime/utils.py +0 -0
  57. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/mpt_extension_sdk/runtime/workers.py +0 -0
  58. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/prod.Dockerfile +0 -0
  59. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/sonar-project.properties +0 -0
  60. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/tests/__init__.py +0 -0
  61. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/tests/conftest.py +0 -0
  62. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/tests/core/test_core_registry.py +0 -0
  63. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/tests/core/test_core_utils.py +0 -0
  64. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/tests/django/__init__.py +0 -0
  65. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/tests/flows/__init__.py +0 -0
  66. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/tests/flows/test_context.py +0 -0
  67. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/tests/flows/test_pipeline.py +0 -0
  68. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/tests/key_vault/__init__.py +0 -0
  69. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/tests/key_vault/test_key_vault.py +0 -0
  70. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/tests/mpt/__init__.py +0 -0
  71. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/tests/mpt/test_error.py +0 -0
  72. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/tests/runtime/events/test_events_dispatcher.py +0 -0
  73. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/tests/runtime/events/test_events_producers.py +0 -0
  74. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/tests/runtime/test_apps.py +0 -0
  75. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/tests/runtime/test_initializer.py +0 -0
  76. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/tests/runtime/test_runtime_logging.py +0 -0
  77. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/tests/runtime/test_runtime_master.py +0 -0
  78. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/tests/runtime/test_runtime_utils.py +0 -0
  79. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/tests/runtime/test_runtime_workers.py +0 -0
  80. {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.0}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mpt-extension-sdk
3
- Version: 5.1.2
3
+ Version: 5.2.0
4
4
  Summary: Extensions SDK for SoftwareONE Marketplace Platform
5
5
  Author: SoftwareOne AG
6
6
  License: Apache-2.0 license
@@ -20,6 +20,8 @@ services:
20
20
  command: bash -c "ruff check . && pytest"
21
21
  volumes:
22
22
  - .:/extension_sdk
23
+ environment:
24
+ - PROCESS_CHECK_INTERVAL_SECS=0
23
25
 
24
26
  format:
25
27
  container_name: mpt_extension_sdk_format
@@ -209,6 +209,22 @@ def get_agreements_by_next_sync(mpt_client, next_sync_parameter):
209
209
  return get_agreements_by_query(mpt_client, rql_query)
210
210
 
211
211
 
212
+ def get_agreements_by_3yc_enroll_status(
213
+ mpt_client: MPTClient, enroll_statuses: tuple[str], status: str = "Active"
214
+ ):
215
+ param_condition = (
216
+ f"any(parameters.fulfillment,"
217
+ f"and(eq(externalId,3YCEnrollStatus),in(displayValue,({",".join(enroll_statuses)}))))"
218
+ )
219
+ status_condition = f"eq(status,{status})"
220
+
221
+ rql_query = (
222
+ f"and({status_condition},{param_condition})"
223
+ "&select=lines,parameters,subscriptions,product,listing"
224
+ )
225
+ return get_agreements_by_query(mpt_client, rql_query)
226
+
227
+
212
228
  @wrap_mpt_http_error
213
229
  def update_agreement_subscription(mpt_client, subscription_id, **kwargs):
214
230
  response = mpt_client.put(
@@ -1,4 +1,5 @@
1
1
  import logging
2
+ import os
2
3
  import signal
3
4
  import threading
4
5
  import time
@@ -14,7 +15,7 @@ logger = logging.getLogger(__name__)
14
15
 
15
16
 
16
17
  HANDLED_SIGNALS = (signal.SIGINT, signal.SIGTERM)
17
- PROCESS_CHECK_INTERVAL_SECS = 5
18
+ PROCESS_CHECK_INTERVAL_SECS = int(os.environ.get("PROCESS_CHECK_INTERVAL_SECS", 5))
18
19
 
19
20
 
20
21
  def _display_path(path):
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "mpt-extension-sdk"
3
- version = "5.1.2"
3
+ version = "5.2.0"
4
4
  description = "Extensions SDK for SoftwareONE Marketplace Platform"
5
5
  authors = [{ name = "SoftwareOne AG" }]
6
6
  requires-python = ">=3.12,<4"
@@ -169,7 +169,7 @@ MPT_API_TOKEN = os.getenv("MPT_API_TOKEN", "change-me!")
169
169
  MPT_API_TOKEN_OPERATIONS = os.getenv("MPT_API_TOKEN_OPERATIONS", "change-me!")
170
170
  # TODO: Should be synced with the initializer.py::initialize function
171
171
  MPT_PRODUCTS_IDS = ["PRD-1111-1111"]
172
- MPT_ORDERS_API_POLLING_INTERVAL_SECS = 30
172
+ MPT_ORDERS_API_POLLING_INTERVAL_SECS = 0
173
173
  MPT_PORTAL_BASE_URL = "https://portal.s1.local"
174
174
  MPT_NOTIFY_CATEGORIES = json.loads(
175
175
  os.getenv("MPT_NOTIFY_CATEGORIES", '{"ORDERS": "NTC-0000-0006"}')
@@ -1,5 +1,23 @@
1
1
  import pytest
2
2
 
3
+ from mpt_extension_sdk.mpt_http.base import MPTClient
4
+
5
+
6
+ @pytest.fixture()
7
+ def mock_mpt_client(mocker):
8
+ """
9
+ Create an instance of the MPT client used by the extension.
10
+ """
11
+ return mocker.MagicMock(spec=MPTClient)
12
+
13
+
14
+ @pytest.fixture()
15
+ def mock_get_agreements_by_query(mocker):
16
+ return mocker.patch(
17
+ "mpt_extension_sdk.mpt_http.mpt.get_agreements_by_query",
18
+ spec=True,
19
+ )
20
+
3
21
 
4
22
  @pytest.fixture(scope="session")
5
23
  def notify_post_resp():
@@ -15,6 +15,7 @@ from mpt_extension_sdk.mpt_http.mpt import (
15
15
  get_agreement,
16
16
  get_agreement_subscription,
17
17
  get_agreement_subscription_by_external_id,
18
+ get_agreements_by_3yc_enroll_status,
18
19
  get_agreements_by_customer_deployments,
19
20
  get_agreements_by_external_id_values,
20
21
  get_agreements_by_ids,
@@ -1054,6 +1055,23 @@ def test_get_agreements_by_next_sync(mocker):
1054
1055
  mocked_get_by_query.assert_called_once_with(mocked_client, rql_query)
1055
1056
 
1056
1057
 
1058
+ @pytest.mark.parametrize("status", ["Active", "processing"])
1059
+ def test_get_agreements_by_3yc_enroll_status(
1060
+ mock_mpt_client, mock_get_agreements_by_query, status
1061
+ ):
1062
+ rql_query = (
1063
+ f"and(eq(status,{status}),any(parameters.fulfillment,and(eq(externalId,3YCEnrollStatus),"
1064
+ "in(displayValue,(REQUESTED,ACCEPTED)))))"
1065
+ "&select=lines,parameters,subscriptions,product,listing"
1066
+ )
1067
+
1068
+ get_agreements_by_3yc_enroll_status(
1069
+ mock_mpt_client, ("REQUESTED", "ACCEPTED"), status=status
1070
+ )
1071
+
1072
+ mock_get_agreements_by_query.assert_called_once_with(mock_mpt_client, rql_query)
1073
+
1074
+
1057
1075
  def test_get_buyer(mpt_client, requests_mocker):
1058
1076
  buyer_id = "buyer_id"
1059
1077
  requests_mocker.get(