mpt-extension-sdk 5.2.0__tar.gz → 5.2.2__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 (81) hide show
  1. {mpt_extension_sdk-5.2.0 → mpt_extension_sdk-5.2.2}/PKG-INFO +1 -1
  2. {mpt_extension_sdk-5.2.0 → mpt_extension_sdk-5.2.2}/mpt_extension_sdk/constants.py +1 -1
  3. {mpt_extension_sdk-5.2.0 → mpt_extension_sdk-5.2.2}/mpt_extension_sdk/mpt_http/mpt.py +0 -19
  4. {mpt_extension_sdk-5.2.0 → mpt_extension_sdk-5.2.2}/mpt_extension_sdk/runtime/commands/django.py +17 -5
  5. {mpt_extension_sdk-5.2.0 → mpt_extension_sdk-5.2.2}/mpt_extension_sdk/runtime/commands/run.py +5 -4
  6. {mpt_extension_sdk-5.2.0 → mpt_extension_sdk-5.2.2}/mpt_extension_sdk/runtime/djapp/conf/default.py +8 -7
  7. mpt_extension_sdk-5.2.2/mpt_extension_sdk/runtime/djapp/conf/urls.py +10 -0
  8. {mpt_extension_sdk-5.2.0 → mpt_extension_sdk-5.2.2}/mpt_extension_sdk/runtime/djapp/management/commands/consume_events.py +8 -6
  9. {mpt_extension_sdk-5.2.0 → mpt_extension_sdk-5.2.2}/mpt_extension_sdk/runtime/events/dispatcher.py +7 -3
  10. {mpt_extension_sdk-5.2.0 → mpt_extension_sdk-5.2.2}/mpt_extension_sdk/runtime/initializer.py +1 -3
  11. {mpt_extension_sdk-5.2.0 → mpt_extension_sdk-5.2.2}/mpt_extension_sdk/runtime/master.py +4 -3
  12. {mpt_extension_sdk-5.2.0 → mpt_extension_sdk-5.2.2}/mpt_extension_sdk/runtime/utils.py +22 -0
  13. {mpt_extension_sdk-5.2.0 → mpt_extension_sdk-5.2.2}/mpt_extension_sdk/runtime/workers.py +10 -3
  14. {mpt_extension_sdk-5.2.0 → mpt_extension_sdk-5.2.2}/pyproject.toml +6 -3
  15. mpt_extension_sdk-5.2.0/.env.sample +0 -6
  16. mpt_extension_sdk-5.2.0/.flake8 +0 -6
  17. mpt_extension_sdk-5.2.0/.github/CODEOWNERS +0 -1
  18. mpt_extension_sdk-5.2.0/.github/workflows/on-release.yml +0 -45
  19. mpt_extension_sdk-5.2.0/.github/workflows/pr-build-merge.yml +0 -47
  20. mpt_extension_sdk-5.2.0/dev.Dockerfile +0 -13
  21. mpt_extension_sdk-5.2.0/docker-compose.yml +0 -34
  22. mpt_extension_sdk-5.2.0/prod.Dockerfile +0 -13
  23. mpt_extension_sdk-5.2.0/sonar-project.properties +0 -13
  24. mpt_extension_sdk-5.2.0/tests/conftest.py +0 -848
  25. mpt_extension_sdk-5.2.0/tests/core/test_core_registry.py +0 -47
  26. mpt_extension_sdk-5.2.0/tests/core/test_core_utils.py +0 -11
  27. mpt_extension_sdk-5.2.0/tests/django/__init__.py +0 -0
  28. mpt_extension_sdk-5.2.0/tests/django/settings.py +0 -186
  29. mpt_extension_sdk-5.2.0/tests/flows/__init__.py +0 -0
  30. mpt_extension_sdk-5.2.0/tests/flows/test_context.py +0 -81
  31. mpt_extension_sdk-5.2.0/tests/flows/test_pipeline.py +0 -74
  32. mpt_extension_sdk-5.2.0/tests/key_vault/__init__.py +0 -0
  33. mpt_extension_sdk-5.2.0/tests/key_vault/test_key_vault.py +0 -88
  34. mpt_extension_sdk-5.2.0/tests/mpt/__init__.py +0 -0
  35. mpt_extension_sdk-5.2.0/tests/mpt/conftest.py +0 -59
  36. mpt_extension_sdk-5.2.0/tests/mpt/test_error.py +0 -15
  37. mpt_extension_sdk-5.2.0/tests/mpt/test_mpt.py +0 -1274
  38. mpt_extension_sdk-5.2.0/tests/runtime/events/test_events_dispatcher.py +0 -45
  39. mpt_extension_sdk-5.2.0/tests/runtime/events/test_events_producers.py +0 -139
  40. mpt_extension_sdk-5.2.0/tests/runtime/test_apps.py +0 -43
  41. mpt_extension_sdk-5.2.0/tests/runtime/test_initializer.py +0 -22
  42. mpt_extension_sdk-5.2.0/tests/runtime/test_runtime_logging.py +0 -18
  43. mpt_extension_sdk-5.2.0/tests/runtime/test_runtime_master.py +0 -89
  44. mpt_extension_sdk-5.2.0/tests/runtime/test_runtime_utils.py +0 -69
  45. mpt_extension_sdk-5.2.0/tests/runtime/test_runtime_workers.py +0 -60
  46. mpt_extension_sdk-5.2.0/uv.lock +0 -2217
  47. {mpt_extension_sdk-5.2.0 → mpt_extension_sdk-5.2.2}/.gitignore +0 -0
  48. {mpt_extension_sdk-5.2.0 → mpt_extension_sdk-5.2.2}/LICENSE +0 -0
  49. {mpt_extension_sdk-5.2.0 → mpt_extension_sdk-5.2.2}/README.md +0 -0
  50. {mpt_extension_sdk-5.2.0 → mpt_extension_sdk-5.2.2}/mpt_extension_sdk/__init__.py +0 -0
  51. {mpt_extension_sdk-5.2.0/mpt_extension_sdk/core → mpt_extension_sdk-5.2.2/mpt_extension_sdk/airtable}/__init__.py +0 -0
  52. {mpt_extension_sdk-5.2.0 → mpt_extension_sdk-5.2.2}/mpt_extension_sdk/airtable/wrap_http_error.py +0 -0
  53. {mpt_extension_sdk-5.2.0/mpt_extension_sdk/core/events → mpt_extension_sdk-5.2.2/mpt_extension_sdk/core}/__init__.py +0 -0
  54. {mpt_extension_sdk-5.2.0/mpt_extension_sdk/flows → mpt_extension_sdk-5.2.2/mpt_extension_sdk/core/events}/__init__.py +0 -0
  55. {mpt_extension_sdk-5.2.0 → mpt_extension_sdk-5.2.2}/mpt_extension_sdk/core/events/dataclasses.py +0 -0
  56. {mpt_extension_sdk-5.2.0 → mpt_extension_sdk-5.2.2}/mpt_extension_sdk/core/events/registry.py +0 -0
  57. {mpt_extension_sdk-5.2.0 → mpt_extension_sdk-5.2.2}/mpt_extension_sdk/core/extension.py +0 -0
  58. {mpt_extension_sdk-5.2.0 → mpt_extension_sdk-5.2.2}/mpt_extension_sdk/core/security.py +0 -0
  59. {mpt_extension_sdk-5.2.0 → mpt_extension_sdk-5.2.2}/mpt_extension_sdk/core/utils.py +0 -0
  60. {mpt_extension_sdk-5.2.0/mpt_extension_sdk/key_vault → mpt_extension_sdk-5.2.2/mpt_extension_sdk/flows}/__init__.py +0 -0
  61. {mpt_extension_sdk-5.2.0 → mpt_extension_sdk-5.2.2}/mpt_extension_sdk/flows/context.py +0 -0
  62. {mpt_extension_sdk-5.2.0 → mpt_extension_sdk-5.2.2}/mpt_extension_sdk/flows/pipeline.py +0 -0
  63. {mpt_extension_sdk-5.2.0/mpt_extension_sdk/mpt_http → mpt_extension_sdk-5.2.2/mpt_extension_sdk/key_vault}/__init__.py +0 -0
  64. {mpt_extension_sdk-5.2.0 → mpt_extension_sdk-5.2.2}/mpt_extension_sdk/key_vault/base.py +0 -0
  65. {mpt_extension_sdk-5.2.0/mpt_extension_sdk/runtime/commands → mpt_extension_sdk-5.2.2/mpt_extension_sdk/mpt_http}/__init__.py +0 -0
  66. {mpt_extension_sdk-5.2.0 → mpt_extension_sdk-5.2.2}/mpt_extension_sdk/mpt_http/base.py +0 -0
  67. {mpt_extension_sdk-5.2.0 → mpt_extension_sdk-5.2.2}/mpt_extension_sdk/mpt_http/utils.py +0 -0
  68. {mpt_extension_sdk-5.2.0 → mpt_extension_sdk-5.2.2}/mpt_extension_sdk/mpt_http/wrap_http_error.py +0 -0
  69. {mpt_extension_sdk-5.2.0 → mpt_extension_sdk-5.2.2}/mpt_extension_sdk/runtime/__init__.py +0 -0
  70. {mpt_extension_sdk-5.2.0/mpt_extension_sdk/runtime/djapp → mpt_extension_sdk-5.2.2/mpt_extension_sdk/runtime/commands}/__init__.py +0 -0
  71. {mpt_extension_sdk-5.2.0/mpt_extension_sdk/runtime/djapp/management → mpt_extension_sdk-5.2.2/mpt_extension_sdk/runtime/djapp}/__init__.py +0 -0
  72. {mpt_extension_sdk-5.2.0 → mpt_extension_sdk-5.2.2}/mpt_extension_sdk/runtime/djapp/apps.py +0 -0
  73. {mpt_extension_sdk-5.2.0 → mpt_extension_sdk-5.2.2}/mpt_extension_sdk/runtime/djapp/conf/__init__.py +0 -0
  74. {mpt_extension_sdk-5.2.0/mpt_extension_sdk/runtime/djapp/management/commands → mpt_extension_sdk-5.2.2/mpt_extension_sdk/runtime/djapp/management}/__init__.py +0 -0
  75. {mpt_extension_sdk-5.2.0/mpt_extension_sdk/runtime/events → mpt_extension_sdk-5.2.2/mpt_extension_sdk/runtime/djapp/management/commands}/__init__.py +0 -0
  76. {mpt_extension_sdk-5.2.0 → mpt_extension_sdk-5.2.2}/mpt_extension_sdk/runtime/djapp/middleware.py +0 -0
  77. {mpt_extension_sdk-5.2.0/tests → mpt_extension_sdk-5.2.2/mpt_extension_sdk/runtime/events}/__init__.py +0 -0
  78. {mpt_extension_sdk-5.2.0 → mpt_extension_sdk-5.2.2}/mpt_extension_sdk/runtime/events/producers.py +0 -0
  79. {mpt_extension_sdk-5.2.0 → mpt_extension_sdk-5.2.2}/mpt_extension_sdk/runtime/events/utils.py +0 -0
  80. {mpt_extension_sdk-5.2.0 → mpt_extension_sdk-5.2.2}/mpt_extension_sdk/runtime/logging.py +0 -0
  81. {mpt_extension_sdk-5.2.0 → mpt_extension_sdk-5.2.2}/mpt_extension_sdk/runtime/swoext.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mpt-extension-sdk
3
- Version: 5.2.0
3
+ Version: 5.2.2
4
4
  Summary: Extensions SDK for SoftwareONE Marketplace Platform
5
5
  Author: SoftwareOne AG
6
6
  License: Apache-2.0 license
@@ -2,6 +2,6 @@ EVENT_TYPES = "orders"
2
2
  SECURITY_ALGORITHM = "HS256"
3
3
  USER_AGENT = "swo-extensions/1.0"
4
4
  CONSUME_EVENTS_HELP_TEXT = "Consume events from the MPT platform"
5
- DEFAULT_APP_CONFIG_GROUP = "swo.mpt.sdk"
5
+ DEFAULT_APP_CONFIG_GROUP = "swo.mpt.ext"
6
6
  DEFAULT_APP_CONFIG_NAME = "app_config"
7
7
  DJANGO_SETTINGS_MODULE = "mpt_extension_sdk.runtime.djapp.conf.default"
@@ -1,6 +1,5 @@
1
1
  import logging
2
2
  from datetime import date
3
- from enum import Enum
4
3
  from functools import cache
5
4
  from itertools import batched
6
5
 
@@ -11,8 +10,6 @@ from mpt_extension_sdk.mpt_http.wrap_http_error import wrap_mpt_http_error
11
10
 
12
11
  logger = logging.getLogger(__name__)
13
12
 
14
- NotifyCategories = Enum("NotifyCategories", settings.MPT_NOTIFY_CATEGORIES)
15
-
16
13
 
17
14
  def _has_more_pages(page):
18
15
  if not page:
@@ -209,22 +206,6 @@ def get_agreements_by_next_sync(mpt_client, next_sync_parameter):
209
206
  return get_agreements_by_query(mpt_client, rql_query)
210
207
 
211
208
 
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
-
228
209
  @wrap_mpt_http_error
229
210
  def update_agreement_subscription(mpt_client, subscription_id, **kwargs):
230
211
  response = mpt_client.put(
@@ -1,21 +1,33 @@
1
1
  from contextlib import nullcontext
2
2
 
3
3
  import click
4
+ from django.core.management import execute_from_command_line
4
5
  from opentelemetry import trace
5
6
 
7
+ from mpt_extension_sdk.constants import (
8
+ DEFAULT_APP_CONFIG_GROUP,
9
+ DEFAULT_APP_CONFIG_NAME,
10
+ DJANGO_SETTINGS_MODULE,
11
+ )
12
+ from mpt_extension_sdk.runtime.initializer import initialize
13
+
6
14
 
7
15
  @click.command(
8
16
  add_help_option=False, context_settings=dict(ignore_unknown_options=True)
9
17
  )
10
18
  @click.argument("management_args", nargs=-1, type=click.UNPROCESSED)
11
19
  @click.pass_context
12
- def django(ctx, management_args):
20
+ def django(ctx, management_args): # pragma: no cover
13
21
  "Execute Django subcommands."
14
- from mpt_extension_sdk.runtime.initializer import initialize
15
-
16
- initialize({})
17
22
  from django.conf import settings
18
- from django.core.management import execute_from_command_line
23
+
24
+ initialize(
25
+ {
26
+ "group": DEFAULT_APP_CONFIG_GROUP,
27
+ "name": DEFAULT_APP_CONFIG_NAME,
28
+ "django_settings_module": DJANGO_SETTINGS_MODULE,
29
+ }
30
+ )
19
31
 
20
32
  if settings.USE_APPLICATIONINSIGHTS:
21
33
  tracer = trace.get_tracer(__name__)
@@ -1,4 +1,6 @@
1
1
  import click
2
+ import debugpy
3
+ from django.conf import settings
2
4
 
3
5
  from mpt_extension_sdk.runtime.master import Master
4
6
 
@@ -25,10 +27,8 @@ def run(component, color, debug, reload, debug_py):
25
27
  """
26
28
 
27
29
  if debug_py:
28
- import debugpy
29
-
30
30
  host, port = debug_py.split(":")
31
- debugpy.listen((host, int(port)))
31
+ debugpy.listen((host, int(port))) # pragma: no cover
32
32
 
33
33
  master = Master(
34
34
  {
@@ -37,5 +37,6 @@ def run(component, color, debug, reload, debug_py):
37
37
  "reload": reload,
38
38
  "component": component,
39
39
  },
40
+ settings=settings,
40
41
  )
41
- master.run()
42
+ master.run() # pragma: no cover
@@ -10,7 +10,6 @@ For the full list of settings and their values, see
10
10
  https://docs.djangoproject.com/en/4.2/ref/settings/
11
11
  """
12
12
 
13
- import json
14
13
  import os
15
14
  from pathlib import Path
16
15
 
@@ -26,6 +25,12 @@ BASE_DIR = Path(__file__).resolve().parent.parent
26
25
  # Quick-start development settings - unsuitable for production
27
26
  # See https://docs.djangoproject.com/en/4.2/howto/deployment/checklist/
28
27
 
28
+ # SECURITY WARNING: keep the secret key used in production secret!
29
+ SECRET_KEY = os.getenv(
30
+ "MPT_DJANGO_SECRET_KEY",
31
+ "",
32
+ )
33
+
29
34
  # SECURITY WARNING: don't run with debug turned on in production!
30
35
  DEBUG = True
31
36
 
@@ -128,7 +133,7 @@ APPLICATIONINSIGHTS_CONNECTION_STRING = os.getenv(
128
133
  USE_APPLICATIONINSIGHTS = APPLICATIONINSIGHTS_CONNECTION_STRING != ""
129
134
 
130
135
 
131
- if USE_APPLICATIONINSIGHTS:
136
+ if USE_APPLICATIONINSIGHTS: # pragma: no cover
132
137
  logger_provider = LoggerProvider()
133
138
  set_logger_provider(logger_provider)
134
139
  exporter = AzureMonitorLogExporter(
@@ -208,11 +213,7 @@ MPT_ORDERS_API_POLLING_INTERVAL_SECS = int(
208
213
  os.getenv("MPT_ORDERS_API_POLLING_INTERVAL_SECS", "120")
209
214
  )
210
215
 
211
- # TODO: Should be synced with the initializer.py::initialize function
212
- MPT_NOTIFY_CATEGORIES = json.loads(
213
- os.getenv("MPT_NOTIFY_CATEGORIES", '{"ORDERS": "NTC-0000-0006"}')
214
- )
215
-
216
216
  EXTENSION_CONFIG = {
217
217
  "DUE_DATE_DAYS": "30",
218
+ "ORDER_CREATION_WINDOW_HOURS": os.getenv("EXT_ORDER_CREATION_WINDOW_HOURS", "24"),
218
219
  }
@@ -0,0 +1,10 @@
1
+
2
+ from mpt_extension_sdk.constants import (
3
+ DEFAULT_APP_CONFIG_GROUP,
4
+ DEFAULT_APP_CONFIG_NAME,
5
+ )
6
+ from mpt_extension_sdk.runtime.utils import get_extension, get_urlpatterns
7
+
8
+ extension = get_extension(name=DEFAULT_APP_CONFIG_NAME, group=DEFAULT_APP_CONFIG_GROUP)
9
+
10
+ urlpatterns = get_urlpatterns(extension)
@@ -1,11 +1,13 @@
1
- import signal
2
- from threading import Event
1
+ import signal # pragma: no cover
2
+ from threading import Event # pragma: no cover
3
3
 
4
- from django.core.management.base import BaseCommand
4
+ from django.core.management.base import BaseCommand # pragma: no cover
5
5
 
6
- from mpt_extension_sdk.constants import CONSUME_EVENTS_HELP_TEXT
7
- from mpt_extension_sdk.runtime.events.dispatcher import Dispatcher
8
- from mpt_extension_sdk.runtime.events.producers import OrderEventProducer
6
+ from mpt_extension_sdk.constants import CONSUME_EVENTS_HELP_TEXT # pragma: no cover
7
+ from mpt_extension_sdk.runtime.events.dispatcher import Dispatcher # pragma: no cover
8
+ from mpt_extension_sdk.runtime.events.producers import (
9
+ OrderEventProducer, # pragma: no cover
10
+ )
9
11
 
10
12
 
11
13
  class Command(BaseCommand): # pragma: no cover
@@ -5,6 +5,10 @@ import time
5
5
  from collections import deque
6
6
  from concurrent.futures import ThreadPoolExecutor
7
7
 
8
+ from mpt_extension_sdk.constants import (
9
+ DEFAULT_APP_CONFIG_GROUP,
10
+ DEFAULT_APP_CONFIG_NAME,
11
+ )
8
12
  from mpt_extension_sdk.core.events.dataclasses import Event
9
13
  from mpt_extension_sdk.core.events.registry import EventsRegistry
10
14
  from mpt_extension_sdk.core.utils import setup_client
@@ -24,8 +28,8 @@ def done_callback(futures, key, future): # pragma: no cover
24
28
 
25
29
 
26
30
  class Dispatcher:
27
- def __init__(self):
28
- self.registry: EventsRegistry = get_events_registry()
31
+ def __init__(self, group=DEFAULT_APP_CONFIG_GROUP, name=DEFAULT_APP_CONFIG_NAME):
32
+ self.registry: EventsRegistry = get_events_registry(group=group, name=name)
29
33
  self.queue = deque()
30
34
  self.futures = {}
31
35
  self.executor = ThreadPoolExecutor()
@@ -45,7 +49,7 @@ class Dispatcher:
45
49
  def running(self):
46
50
  return self.running_event.is_set()
47
51
 
48
- def dispatch_event(self, event: Event):
52
+ def dispatch_event(self, event: Event): # pragma: no cover
49
53
  if self.registry.is_event_supported(event.type):
50
54
  logger.info(f"event of type {event.type} with id {event.id} accepted")
51
55
  self.queue.appendleft((event.type, event))
@@ -24,10 +24,8 @@ JSON_EXT_VARIABLES = {
24
24
  }
25
25
 
26
26
 
27
- def initialize(options):
27
+ def initialize(options, group=DEFAULT_APP_CONFIG_GROUP, name=DEFAULT_APP_CONFIG_NAME):
28
28
  rich.reconfigure(theme=Theme({"repr.mpt_id": "bold light_salmon3"}))
29
- group = options.get("app_config_group", DEFAULT_APP_CONFIG_GROUP)
30
- name = options.get("app_config_name", DEFAULT_APP_CONFIG_NAME)
31
29
  django_settings_module = options.get(
32
30
  "django_settings_module", DJANGO_SETTINGS_MODULE
33
31
  )
@@ -18,17 +18,18 @@ HANDLED_SIGNALS = (signal.SIGINT, signal.SIGTERM)
18
18
  PROCESS_CHECK_INTERVAL_SECS = int(os.environ.get("PROCESS_CHECK_INTERVAL_SECS", 5))
19
19
 
20
20
 
21
- def _display_path(path):
21
+ def _display_path(path): # pragma: no cover
22
22
  try:
23
23
  return f'"{path.relative_to(Path.cwd())}"'
24
- except ValueError: # pragma: no cover
24
+ except ValueError:
25
25
  return f'"{path}"'
26
26
 
27
27
 
28
28
  class Master:
29
- def __init__(self, options):
29
+ def __init__(self, options, settings):
30
30
  self.workers = {}
31
31
  self.options = options
32
+ self.settings = settings
32
33
  self.stop_event = threading.Event()
33
34
  self.monitor_event = threading.Event()
34
35
  self.watch_filter = PythonFilter(ignore_paths=None)
@@ -4,6 +4,8 @@ import sys
4
4
  from importlib.metadata import entry_points
5
5
 
6
6
  from django.apps import apps
7
+ from django.contrib import admin
8
+ from django.urls import path
7
9
  from pyfiglet import Figlet
8
10
  from rich.console import Console
9
11
  from rich.text import Text
@@ -105,3 +107,23 @@ def get_extension_variables(json_ext_variables):
105
107
 
106
108
  variables[var[0][4:]] = value
107
109
  return variables
110
+
111
+
112
+ def get_api_url(extension):
113
+ if extension:
114
+ api_url = extension.api.urls
115
+ return api_url
116
+ return None
117
+
118
+
119
+ def get_urlpatterns(extension):
120
+ urlpatterns = [
121
+ path("admin/", admin.site.urls),
122
+ ]
123
+
124
+ api_url = get_api_url(extension)
125
+
126
+ if api_url:
127
+ urlpatterns.append(path("api/", api_url))
128
+
129
+ return urlpatterns
@@ -2,6 +2,10 @@ from django.core.management import call_command
2
2
  from django.core.wsgi import get_wsgi_application
3
3
  from gunicorn.app.base import BaseApplication
4
4
 
5
+ from mpt_extension_sdk.constants import (
6
+ DEFAULT_APP_CONFIG_GROUP,
7
+ DEFAULT_APP_CONFIG_NAME,
8
+ )
5
9
  from mpt_extension_sdk.runtime.initializer import initialize
6
10
 
7
11
 
@@ -29,15 +33,18 @@ def start_event_consumer(options):
29
33
  call_command("consume_events")
30
34
 
31
35
 
32
- def start_gunicorn(options):
33
- initialize(options)
36
+ def start_gunicorn(
37
+ options, group=DEFAULT_APP_CONFIG_GROUP, name=DEFAULT_APP_CONFIG_NAME
38
+ ):
39
+ initialize(options, group=group, name=name)
34
40
 
35
41
  logging_config = {
36
42
  "version": 1,
37
43
  "disable_existing_loggers": False,
38
44
  "formatters": {
39
45
  "verbose": {
40
- "format": "{asctime} {name} {levelname} (pid: {process}) {message}",
46
+ "format":
47
+ "{asctime} {name} {levelname} (pid: {process}, thread: {thread}) {message}",
41
48
  "style": "{",
42
49
  },
43
50
  "rich": {
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "mpt-extension-sdk"
3
- version = "5.2.0"
3
+ version = "5.2.2"
4
4
  description = "Extensions SDK for SoftwareONE Marketplace Platform"
5
5
  authors = [{ name = "SoftwareOne AG" }]
6
6
  requires-python = ">=3.12,<4"
@@ -68,6 +68,11 @@ dev = [
68
68
  requires = ["hatchling"]
69
69
  build-backend = "hatchling.build"
70
70
 
71
+ [tool.hatch.build]
72
+ include = [
73
+ "mpt_extension_sdk/**"
74
+ ]
75
+
71
76
  [tool.pytest.ini_options]
72
77
  testpaths = "tests"
73
78
  pythonpath = "."
@@ -85,8 +90,6 @@ relative_files = true
85
90
  omit = [
86
91
  "security.py",
87
92
  "django.py",
88
- "run.py",
89
- "default.py",
90
93
  "swoext.py",
91
94
  "__init__.py",
92
95
  ]
@@ -1,6 +0,0 @@
1
- OTEL_SERVICE_NAME=Swo.Extensions.MptExtensionsSDK
2
- MPT_PRODUCTS_IDS=PRD-1111-1111
3
- MPT_PORTAL_BASE_URL=http://devmock:8000
4
- MPT_API_BASE_URL=http://devmock:8000
5
- MPT_API_TOKEN=<vendor-api-token>
6
- MPT_ORDERS_API_POLLING_INTERVAL_SECS=120
@@ -1,6 +0,0 @@
1
- [flake8]
2
- exclude = .idea,.vscode,.git,venv,env,swo
3
- show-source = True
4
- max-line-length = 100
5
- max-cognitive-complexity = 15
6
- extend-ignore = PT004, E203, B008
@@ -1 +0,0 @@
1
- * @softwareone-platform/sirius
@@ -1,45 +0,0 @@
1
- name: Release
2
-
3
- on:
4
- release:
5
- types: [published]
6
-
7
- permissions:
8
- id-token: write # for OIDC
9
- contents: read
10
-
11
- jobs:
12
- build:
13
-
14
- runs-on: ubuntu-latest
15
- timeout-minutes: 10
16
-
17
- steps:
18
- - name: Checkout
19
- uses: actions/checkout@v4
20
- with:
21
- fetch-depth: 0
22
-
23
- - name: Set up Python 3.12
24
- uses: actions/setup-python@v4
25
- with:
26
- python-version: '3.12'
27
-
28
- - name: Install dependencies
29
- run: |
30
- python -m pip install --upgrade pip
31
- pip install poetry
32
-
33
- - name: 'Get the version'
34
- id: get_version
35
- run: echo "VERSION=${GITHUB_REF/refs\/tags\//}" >> "$GITHUB_OUTPUT"
36
-
37
- - name: 'Build'
38
- run: |
39
- poetry version ${{ steps.get_version.outputs.VERSION }}
40
- poetry build
41
-
42
- - name: Publish to PyPI
43
- uses: pypa/gh-action-pypi-publish@release/v1
44
- with:
45
- repository-url: https://upload.pypi.org/legacy/
@@ -1,47 +0,0 @@
1
-
2
- name: PR build and merge
3
-
4
- on:
5
- pull_request:
6
- types: [opened, synchronize, reopened]
7
- push:
8
- branches:
9
- - main
10
- - "release/**"
11
-
12
- permissions:
13
- contents: read
14
-
15
- jobs:
16
- build:
17
-
18
- runs-on: ubuntu-latest
19
- timeout-minutes: 10
20
-
21
- steps:
22
- - name: Checkout
23
- uses: actions/checkout@v4
24
- with:
25
- fetch-depth: 0
26
-
27
- - name: 'Build test containers'
28
- run: docker compose build app_test
29
-
30
- - name: 'Run validation & test'
31
- run: docker compose run --service-ports app_test
32
-
33
- - name: 'Run SonarCloud Scan'
34
- uses: SonarSource/sonarcloud-github-action@master
35
- env:
36
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
37
- SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
38
-
39
- - name: 'Run SonarQube Quality Gate check'
40
- uses: sonarsource/sonarqube-quality-gate-action@master
41
- timeout-minutes: 5
42
- env:
43
- SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
44
-
45
- - name: 'Stop containers'
46
- if: always()
47
- run: docker compose down
@@ -1,13 +0,0 @@
1
- FROM ghcr.io/astral-sh/uv:python3.12-bookworm-slim
2
-
3
- COPY . /extension_sdk
4
- WORKDIR /extension_sdk
5
-
6
- RUN uv venv /opt/venv
7
-
8
- ENV VIRTUAL_ENV=/opt/venv
9
- ENV PATH=/opt/venv/bin:$PATH
10
-
11
- RUN uv sync --frozen --no-cache --all-groups --active
12
-
13
- CMD ["swoext", "run", "--no-color"]
@@ -1,34 +0,0 @@
1
- services:
2
- bash:
3
- container_name: mpt_extension_sdk_bash
4
- build:
5
- context: .
6
- dockerfile: dev.Dockerfile
7
- working_dir: /extension_sdk
8
- command: bash
9
- stdin_open: true
10
- tty: true
11
- volumes:
12
- - .:/extension_sdk
13
-
14
- app_test:
15
- container_name: mpt_extension_sdk_test
16
- build:
17
- context: .
18
- dockerfile: dev.Dockerfile
19
- working_dir: /extension_sdk
20
- command: bash -c "ruff check . && pytest"
21
- volumes:
22
- - .:/extension_sdk
23
- environment:
24
- - PROCESS_CHECK_INTERVAL_SECS=0
25
-
26
- format:
27
- container_name: mpt_extension_sdk_format
28
- build:
29
- context: .
30
- dockerfile: dev.Dockerfile
31
- working_dir: /extension_sdk
32
- command: bash -c "ruff check . --select I --fix && ruff format ."
33
- volumes:
34
- - .:/extension_sdk
@@ -1,13 +0,0 @@
1
- FROM ghcr.io/astral-sh/uv:python3.12-bookworm-slim
2
-
3
- COPY . /extension_sdk
4
- WORKDIR /extension_sdk
5
-
6
- RUN uv venv /opt/venv
7
-
8
- ENV VIRTUAL_ENV=/opt/venv
9
- ENV PATH=/opt/venv/bin:$PATH
10
-
11
- RUN uv sync --frozen --no-cache --all-groups --active
12
-
13
- CMD ["swoext"]
@@ -1,13 +0,0 @@
1
- sonar.projectKey=softwareone-platform_mpt-extension-sdk
2
- sonar.organization=softwareone-mpt-github
3
-
4
- sonar.language=py
5
-
6
- sonar.sources=mpt_extension_sdk
7
- sonar.tests=tests
8
- sonar.inclusions=mpt_extension_sdk/**
9
- sonar.exclusions=tests/**
10
-
11
- sonar.python.coverage.reportPaths=coverage.xml
12
- sonar.python.xunit.reportPath=coverage.xml
13
- sonar.python.version=3