dyngle 0.2.0__py3-none-any.whl → 0.3.0__py3-none-any.whl
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.
Potentially problematic release.
This version of dyngle might be problematic. Click here for more details.
- dyngle/__init__.py +4 -0
- dyngle/__main__.py +1 -2
- dyngle/command/run_command.py +22 -27
- dyngle/template.py +30 -0
- {dyngle-0.2.0.dist-info → dyngle-0.3.0.dist-info}/METADATA +1 -1
- dyngle-0.3.0.dist-info/RECORD +9 -0
- dyngle-0.2.0.dist-info/RECORD +0 -8
- {dyngle-0.2.0.dist-info → dyngle-0.3.0.dist-info}/WHEEL +0 -0
- {dyngle-0.2.0.dist-info → dyngle-0.3.0.dist-info}/entry_points.txt +0 -0
dyngle/__init__.py
CHANGED
dyngle/__main__.py
CHANGED
dyngle/command/run_command.py
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import shlex
|
|
2
2
|
import subprocess
|
|
3
3
|
from wizlib.parser import WizParser
|
|
4
|
+
from yaml import safe_load
|
|
4
5
|
|
|
5
6
|
from dyngle.command import DyngleCommand
|
|
7
|
+
from dyngle.template import Template
|
|
8
|
+
from dyngle import DyngleError
|
|
6
9
|
|
|
7
10
|
|
|
8
11
|
class RunCommand(DyngleCommand):
|
|
@@ -13,40 +16,32 @@ class RunCommand(DyngleCommand):
|
|
|
13
16
|
@classmethod
|
|
14
17
|
def add_args(cls, parser: WizParser):
|
|
15
18
|
super().add_args(parser)
|
|
16
|
-
parser.add_argument('
|
|
19
|
+
parser.add_argument('operation', help='Operation name to run')
|
|
17
20
|
|
|
18
21
|
def handle_vals(self):
|
|
19
22
|
super().handle_vals()
|
|
20
|
-
if not self.provided('flow'):
|
|
21
|
-
self.flow = self.app.ui.get_input('Enter flow name: ')
|
|
22
23
|
|
|
23
|
-
def
|
|
24
|
-
"""Validate that the requested
|
|
25
|
-
if not operations:
|
|
26
|
-
raise RuntimeError('No operations configured')
|
|
27
|
-
|
|
28
|
-
if self.flow not in operations:
|
|
24
|
+
def _validate_operation_exists(self, operations):
|
|
25
|
+
"""Validate that the requested operation exists in configuration"""
|
|
26
|
+
if self.operation not in operations:
|
|
29
27
|
available_operations = ', '.join(operations.keys())
|
|
30
|
-
raise
|
|
31
|
-
f'Operation "{self.
|
|
28
|
+
raise DyngleError(
|
|
29
|
+
f'Operation "{self.operation}" not found. " + \
|
|
32
30
|
f"Available operations: {available_operations}')
|
|
33
31
|
|
|
34
|
-
def _execute_task(self, task_str):
|
|
35
|
-
"""Execute a single task and handle errors"""
|
|
36
|
-
task_parts = shlex.split(task_str)
|
|
37
|
-
result = subprocess.run(task_parts)
|
|
38
|
-
|
|
39
|
-
if result.returncode != 0:
|
|
40
|
-
raise RuntimeError(
|
|
41
|
-
f'Task failed with code {result.returncode}: {task_str}')
|
|
42
|
-
|
|
43
32
|
@DyngleCommand.wrap
|
|
44
33
|
def execute(self):
|
|
45
34
|
operations = self.app.config.get('dyngle-operations')
|
|
46
|
-
self.
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
35
|
+
self._validate_operation_exists(operations)
|
|
36
|
+
steps = operations[self.operation]
|
|
37
|
+
data_string = self.app.stream.text
|
|
38
|
+
data = safe_load(data_string)
|
|
39
|
+
for step_template in steps:
|
|
40
|
+
step = Template(step_template).render(data)
|
|
41
|
+
parts = shlex.split(step)
|
|
42
|
+
result = subprocess.run(parts)
|
|
43
|
+
if result.returncode != 0:
|
|
44
|
+
raise DyngleError(
|
|
45
|
+
f'Task failed with code {result.returncode}: {step}')
|
|
46
|
+
|
|
47
|
+
return f'Operation "{self.operation}" completed successfully'
|
dyngle/template.py
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
from dataclasses import dataclass
|
|
2
|
+
from functools import partial
|
|
3
|
+
import re
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
PATTERN = re.compile(r'\{\{\s*([^}]+)\s*\}\}')
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
@dataclass
|
|
10
|
+
class Template:
|
|
11
|
+
|
|
12
|
+
template: str
|
|
13
|
+
|
|
14
|
+
def render(self, data):
|
|
15
|
+
"""Render the template with the provided data."""
|
|
16
|
+
resolver = partial(self._resolve, data=data)
|
|
17
|
+
return PATTERN.sub(resolver, self.template)
|
|
18
|
+
|
|
19
|
+
def _resolve(self, match, *, data):
|
|
20
|
+
"""Resolve a single name/path from the template."""
|
|
21
|
+
path = match.group(1).strip()
|
|
22
|
+
# Try an expression first, then data
|
|
23
|
+
if False:
|
|
24
|
+
pass
|
|
25
|
+
else:
|
|
26
|
+
parts = path.split('.')
|
|
27
|
+
current = data
|
|
28
|
+
for part in parts:
|
|
29
|
+
current = current[part]
|
|
30
|
+
return current
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
dyngle/__init__.py,sha256=mgotD7qSS5tlTRCLFDD7zsUEAPNwhSlFe4yfIGtJgNI,379
|
|
2
|
+
dyngle/__main__.py,sha256=pYRIwzix_AL8CdJaDDis_8yMBBWO2N72NNwkroo1dQo,95
|
|
3
|
+
dyngle/command/__init__.py,sha256=1S86gbef8MYvG-TWD5JRIWzFg7qV5xKhp9QXx9zEx5c,94
|
|
4
|
+
dyngle/command/run_command.py,sha256=QEdNzjqCg1YMllfiTXqeiqyWiC8QWEZYxo0giRHSGF4,1615
|
|
5
|
+
dyngle/template.py,sha256=CRpcBKDM7VCz1HWNbXGTsbDDMhDvACE49X2uFT5GY1s,757
|
|
6
|
+
dyngle-0.3.0.dist-info/METADATA,sha256=s7KosVT5a3a3i4f5UvDbDiKDE7FGkCy5MCxc4WobO-k,2288
|
|
7
|
+
dyngle-0.3.0.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
|
|
8
|
+
dyngle-0.3.0.dist-info/entry_points.txt,sha256=rekiGhtweiHKm9g1jdGb3FhzqDrk1kigJDeSNollZSA,48
|
|
9
|
+
dyngle-0.3.0.dist-info/RECORD,,
|
dyngle-0.2.0.dist-info/RECORD
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
dyngle/__init__.py,sha256=2KD52sWHfMhk1g1wxHdnxjRtEKeYNJn7sTPkKRpSqNA,338
|
|
2
|
-
dyngle/__main__.py,sha256=mXOQ5tiUi5mEfp1NG2viz5kW2DEeWg1oCPFhfXgxJ4U,92
|
|
3
|
-
dyngle/command/__init__.py,sha256=1S86gbef8MYvG-TWD5JRIWzFg7qV5xKhp9QXx9zEx5c,94
|
|
4
|
-
dyngle/command/run_command.py,sha256=UbkzqlrbAkxQSbN8lHBaTaV23xYmVBlGEOZTiiuARjo,1667
|
|
5
|
-
dyngle-0.2.0.dist-info/METADATA,sha256=naF-xfNR-gcqrJGOOur2pM0gX5tRTwbrTcqfePuhntQ,2288
|
|
6
|
-
dyngle-0.2.0.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
|
|
7
|
-
dyngle-0.2.0.dist-info/entry_points.txt,sha256=rekiGhtweiHKm9g1jdGb3FhzqDrk1kigJDeSNollZSA,48
|
|
8
|
-
dyngle-0.2.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|