mpt-extension-sdk 5.1.2__tar.gz → 5.2.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.
- {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.1}/PKG-INFO +1 -1
- {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.1}/mpt_extension_sdk/constants.py +1 -1
- {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.1}/mpt_extension_sdk/mpt_http/mpt.py +0 -3
- {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.1}/mpt_extension_sdk/runtime/commands/django.py +17 -5
- {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.1}/mpt_extension_sdk/runtime/commands/run.py +5 -4
- {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.1}/mpt_extension_sdk/runtime/djapp/conf/default.py +8 -7
- mpt_extension_sdk-5.2.1/mpt_extension_sdk/runtime/djapp/conf/urls.py +10 -0
- {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.1}/mpt_extension_sdk/runtime/djapp/management/commands/consume_events.py +8 -6
- {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.1}/mpt_extension_sdk/runtime/events/dispatcher.py +7 -3
- {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.1}/mpt_extension_sdk/runtime/initializer.py +1 -3
- {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.1}/mpt_extension_sdk/runtime/master.py +6 -4
- {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.1}/mpt_extension_sdk/runtime/utils.py +22 -0
- {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.1}/mpt_extension_sdk/runtime/workers.py +10 -3
- {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.1}/pyproject.toml +6 -3
- mpt_extension_sdk-5.1.2/.env.sample +0 -6
- mpt_extension_sdk-5.1.2/.flake8 +0 -6
- mpt_extension_sdk-5.1.2/.github/CODEOWNERS +0 -1
- mpt_extension_sdk-5.1.2/.github/workflows/on-release.yml +0 -45
- mpt_extension_sdk-5.1.2/.github/workflows/pr-build-merge.yml +0 -47
- mpt_extension_sdk-5.1.2/dev.Dockerfile +0 -13
- mpt_extension_sdk-5.1.2/docker-compose.yml +0 -32
- mpt_extension_sdk-5.1.2/prod.Dockerfile +0 -13
- mpt_extension_sdk-5.1.2/sonar-project.properties +0 -13
- mpt_extension_sdk-5.1.2/tests/conftest.py +0 -848
- mpt_extension_sdk-5.1.2/tests/core/test_core_registry.py +0 -47
- mpt_extension_sdk-5.1.2/tests/core/test_core_utils.py +0 -11
- mpt_extension_sdk-5.1.2/tests/django/__init__.py +0 -0
- mpt_extension_sdk-5.1.2/tests/django/settings.py +0 -186
- mpt_extension_sdk-5.1.2/tests/flows/__init__.py +0 -0
- mpt_extension_sdk-5.1.2/tests/flows/test_context.py +0 -81
- mpt_extension_sdk-5.1.2/tests/flows/test_pipeline.py +0 -74
- mpt_extension_sdk-5.1.2/tests/key_vault/__init__.py +0 -0
- mpt_extension_sdk-5.1.2/tests/key_vault/test_key_vault.py +0 -88
- mpt_extension_sdk-5.1.2/tests/mpt/__init__.py +0 -0
- mpt_extension_sdk-5.1.2/tests/mpt/conftest.py +0 -41
- mpt_extension_sdk-5.1.2/tests/mpt/test_error.py +0 -15
- mpt_extension_sdk-5.1.2/tests/mpt/test_mpt.py +0 -1256
- mpt_extension_sdk-5.1.2/tests/runtime/events/test_events_dispatcher.py +0 -45
- mpt_extension_sdk-5.1.2/tests/runtime/events/test_events_producers.py +0 -139
- mpt_extension_sdk-5.1.2/tests/runtime/test_apps.py +0 -43
- mpt_extension_sdk-5.1.2/tests/runtime/test_initializer.py +0 -22
- mpt_extension_sdk-5.1.2/tests/runtime/test_runtime_logging.py +0 -18
- mpt_extension_sdk-5.1.2/tests/runtime/test_runtime_master.py +0 -89
- mpt_extension_sdk-5.1.2/tests/runtime/test_runtime_utils.py +0 -69
- mpt_extension_sdk-5.1.2/tests/runtime/test_runtime_workers.py +0 -60
- mpt_extension_sdk-5.1.2/uv.lock +0 -2217
- {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.1}/.gitignore +0 -0
- {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.1}/LICENSE +0 -0
- {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.1}/README.md +0 -0
- {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.1}/mpt_extension_sdk/__init__.py +0 -0
- {mpt_extension_sdk-5.1.2/mpt_extension_sdk/core → mpt_extension_sdk-5.2.1/mpt_extension_sdk/airtable}/__init__.py +0 -0
- {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.1}/mpt_extension_sdk/airtable/wrap_http_error.py +0 -0
- {mpt_extension_sdk-5.1.2/mpt_extension_sdk/core/events → mpt_extension_sdk-5.2.1/mpt_extension_sdk/core}/__init__.py +0 -0
- {mpt_extension_sdk-5.1.2/mpt_extension_sdk/flows → mpt_extension_sdk-5.2.1/mpt_extension_sdk/core/events}/__init__.py +0 -0
- {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.1}/mpt_extension_sdk/core/events/dataclasses.py +0 -0
- {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.1}/mpt_extension_sdk/core/events/registry.py +0 -0
- {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.1}/mpt_extension_sdk/core/extension.py +0 -0
- {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.1}/mpt_extension_sdk/core/security.py +0 -0
- {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.1}/mpt_extension_sdk/core/utils.py +0 -0
- {mpt_extension_sdk-5.1.2/mpt_extension_sdk/key_vault → mpt_extension_sdk-5.2.1/mpt_extension_sdk/flows}/__init__.py +0 -0
- {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.1}/mpt_extension_sdk/flows/context.py +0 -0
- {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.1}/mpt_extension_sdk/flows/pipeline.py +0 -0
- {mpt_extension_sdk-5.1.2/mpt_extension_sdk/mpt_http → mpt_extension_sdk-5.2.1/mpt_extension_sdk/key_vault}/__init__.py +0 -0
- {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.1}/mpt_extension_sdk/key_vault/base.py +0 -0
- {mpt_extension_sdk-5.1.2/mpt_extension_sdk/runtime/commands → mpt_extension_sdk-5.2.1/mpt_extension_sdk/mpt_http}/__init__.py +0 -0
- {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.1}/mpt_extension_sdk/mpt_http/base.py +0 -0
- {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.1}/mpt_extension_sdk/mpt_http/utils.py +0 -0
- {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.1}/mpt_extension_sdk/mpt_http/wrap_http_error.py +0 -0
- {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.1}/mpt_extension_sdk/runtime/__init__.py +0 -0
- {mpt_extension_sdk-5.1.2/mpt_extension_sdk/runtime/djapp → mpt_extension_sdk-5.2.1/mpt_extension_sdk/runtime/commands}/__init__.py +0 -0
- {mpt_extension_sdk-5.1.2/mpt_extension_sdk/runtime/djapp/management → mpt_extension_sdk-5.2.1/mpt_extension_sdk/runtime/djapp}/__init__.py +0 -0
- {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.1}/mpt_extension_sdk/runtime/djapp/apps.py +0 -0
- {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.1}/mpt_extension_sdk/runtime/djapp/conf/__init__.py +0 -0
- {mpt_extension_sdk-5.1.2/mpt_extension_sdk/runtime/djapp/management/commands → mpt_extension_sdk-5.2.1/mpt_extension_sdk/runtime/djapp/management}/__init__.py +0 -0
- {mpt_extension_sdk-5.1.2/mpt_extension_sdk/runtime/events → mpt_extension_sdk-5.2.1/mpt_extension_sdk/runtime/djapp/management/commands}/__init__.py +0 -0
- {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.1}/mpt_extension_sdk/runtime/djapp/middleware.py +0 -0
- {mpt_extension_sdk-5.1.2/tests → mpt_extension_sdk-5.2.1/mpt_extension_sdk/runtime/events}/__init__.py +0 -0
- {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.1}/mpt_extension_sdk/runtime/events/producers.py +0 -0
- {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.1}/mpt_extension_sdk/runtime/events/utils.py +0 -0
- {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.1}/mpt_extension_sdk/runtime/logging.py +0 -0
- {mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.1}/mpt_extension_sdk/runtime/swoext.py +0 -0
|
@@ -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.
|
|
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:
|
{mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.1}/mpt_extension_sdk/runtime/commands/django.py
RENAMED
|
@@ -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
|
-
|
|
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__)
|
{mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.1}/mpt_extension_sdk/runtime/commands/run.py
RENAMED
|
@@ -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
|
{mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.1}/mpt_extension_sdk/runtime/djapp/conf/default.py
RENAMED
|
@@ -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
|
|
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
|
{mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.1}/mpt_extension_sdk/runtime/events/dispatcher.py
RENAMED
|
@@ -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))
|
{mpt_extension_sdk-5.1.2 → mpt_extension_sdk-5.2.1}/mpt_extension_sdk/runtime/initializer.py
RENAMED
|
@@ -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
|
)
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import logging
|
|
2
|
+
import os
|
|
2
3
|
import signal
|
|
3
4
|
import threading
|
|
4
5
|
import time
|
|
@@ -14,20 +15,21 @@ 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
|
-
def _display_path(path):
|
|
21
|
+
def _display_path(path): # pragma: no cover
|
|
21
22
|
try:
|
|
22
23
|
return f'"{path.relative_to(Path.cwd())}"'
|
|
23
|
-
except ValueError:
|
|
24
|
+
except ValueError:
|
|
24
25
|
return f'"{path}"'
|
|
25
26
|
|
|
26
27
|
|
|
27
28
|
class Master:
|
|
28
|
-
def __init__(self, options):
|
|
29
|
+
def __init__(self, options, settings):
|
|
29
30
|
self.workers = {}
|
|
30
31
|
self.options = options
|
|
32
|
+
self.settings = settings
|
|
31
33
|
self.stop_event = threading.Event()
|
|
32
34
|
self.monitor_event = threading.Event()
|
|
33
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(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(
|
|
33
|
-
|
|
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":
|
|
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.1
|
|
3
|
+
version = "5.2.1"
|
|
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
|
]
|
mpt_extension_sdk-5.1.2/.flake8
DELETED
|
@@ -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,32 +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
|
-
|
|
24
|
-
format:
|
|
25
|
-
container_name: mpt_extension_sdk_format
|
|
26
|
-
build:
|
|
27
|
-
context: .
|
|
28
|
-
dockerfile: dev.Dockerfile
|
|
29
|
-
working_dir: /extension_sdk
|
|
30
|
-
command: bash -c "ruff check . --select I --fix && ruff format ."
|
|
31
|
-
volumes:
|
|
32
|
-
- .:/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
|