stoobly-agent 1.1.3__py3-none-any.whl → 1.2.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.
- stoobly_agent/__init__.py +1 -1
- stoobly_agent/app/cli/scaffold/docker/workflow/decorators_factory.py +6 -0
- stoobly_agent/app/cli/scaffold/docker/workflow/development_decorator.py +30 -0
- stoobly_agent/app/cli/scaffold/docker/workflow/reverse_proxy_decorator.py +1 -9
- stoobly_agent/app/cli/scaffold/templates/app/.Dockerfile.context +1 -1
- stoobly_agent/app/cli/scaffold/templates/app/.Dockerfile.proxy +1 -1
- stoobly_agent/app/cli/scaffold/templates/app/.Makefile +13 -11
- stoobly_agent/app/cli/scaffold/templates/app/entrypoint/mock/bin/.configure +1 -1
- stoobly_agent/app/cli/scaffold/templates/app/entrypoint/test/bin/.configure +1 -1
- stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/exec/bin/{.stop → .down} +1 -1
- stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/exec/bin/{.run → .up} +1 -1
- stoobly_agent/app/cli/scaffold/workflow_run_command.py +29 -9
- stoobly_agent/app/cli/scaffold_cli.py +10 -4
- stoobly_agent/test/app/cli/scaffold/cli_invoker.py +4 -4
- stoobly_agent/test/app/cli/scaffold/cli_test.py +1 -1
- stoobly_agent/test/app/cli/scaffold/e2e_test.py +4 -4
- stoobly_agent/test/app/models/schemas/.stoobly/db/VERSION +1 -1
- {stoobly_agent-1.1.3.dist-info → stoobly_agent-1.2.0.dist-info}/METADATA +1 -1
- {stoobly_agent-1.1.3.dist-info → stoobly_agent-1.2.0.dist-info}/RECORD +22 -21
- {stoobly_agent-1.1.3.dist-info → stoobly_agent-1.2.0.dist-info}/LICENSE +0 -0
- {stoobly_agent-1.1.3.dist-info → stoobly_agent-1.2.0.dist-info}/WHEEL +0 -0
- {stoobly_agent-1.1.3.dist-info → stoobly_agent-1.2.0.dist-info}/entry_points.txt +0 -0
stoobly_agent/__init__.py
CHANGED
@@ -1,2 +1,2 @@
|
|
1
1
|
COMMAND = 'stoobly-agent'
|
2
|
-
VERSION = '1.
|
2
|
+
VERSION = '1.2.0'
|
@@ -1,6 +1,7 @@
|
|
1
1
|
from stoobly_agent.app.cli.scaffold.service_config import ServiceConfig
|
2
2
|
|
3
3
|
from ...constants import WORKFLOW_MOCK_TYPE, WORKFLOW_RECORD_TYPE
|
4
|
+
from .development_decorator import DevelopmentDecorator
|
4
5
|
from .mock_decorator import MockDecorator
|
5
6
|
from .reverse_proxy_decorator import ReverseProxyDecorator
|
6
7
|
|
@@ -10,6 +11,11 @@ def get_workflow_decorators(workflow: str, service_config: ServiceConfig):
|
|
10
11
|
if workflow == WORKFLOW_RECORD_TYPE:
|
11
12
|
if service_config.hostname:
|
12
13
|
workflow_decorators.append(ReverseProxyDecorator)
|
14
|
+
workflow_decorators.append(DevelopmentDecorator)
|
15
|
+
elif workflow == WORKFLOW_MOCK_TYPE:
|
16
|
+
if service_config.hostname:
|
17
|
+
workflow_decorators.append(ReverseProxyDecorator if service_config.detached else MockDecorator)
|
18
|
+
workflow_decorators.append(DevelopmentDecorator)
|
13
19
|
else:
|
14
20
|
if service_config.hostname:
|
15
21
|
workflow_decorators.append(ReverseProxyDecorator if service_config.detached else MockDecorator)
|
@@ -0,0 +1,30 @@
|
|
1
|
+
from ...constants import SERVICE_DNS
|
2
|
+
|
3
|
+
from .builder import WorkflowBuilder
|
4
|
+
|
5
|
+
class DevelopmentDecorator():
|
6
|
+
|
7
|
+
def __init__(self, workflow_builder: WorkflowBuilder):
|
8
|
+
self.__workflow_builder = workflow_builder
|
9
|
+
|
10
|
+
@property
|
11
|
+
def workflow_builder(self):
|
12
|
+
return self.__workflow_builder
|
13
|
+
|
14
|
+
@property
|
15
|
+
def service_builder(self):
|
16
|
+
return self.workflow_builder.service_builder
|
17
|
+
|
18
|
+
def decorate(self):
|
19
|
+
config = self.service_builder.config
|
20
|
+
proxy_name = self.workflow_builder.proxy
|
21
|
+
services = self.workflow_builder.services
|
22
|
+
|
23
|
+
# If we are reverse proxying to potentially an external host,
|
24
|
+
# Docker's embedded DNS will use the host's /etc/host file as part of the resolution process
|
25
|
+
# This can lead the hostname to resolve to localhost instead of the service's actual IP address
|
26
|
+
if not config.detached:
|
27
|
+
if not proxy_name in services:
|
28
|
+
services[proxy_name] = {}
|
29
|
+
|
30
|
+
services[proxy_name]['dns'] = SERVICE_DNS
|
@@ -2,9 +2,7 @@ import pdb
|
|
2
2
|
|
3
3
|
from urllib.parse import urlparse
|
4
4
|
|
5
|
-
from
|
6
|
-
|
7
|
-
from ...constants import SERVICE_DNS, SERVICE_DNS_ENV, SERVICE_HOSTNAME, SERVICE_PORT
|
5
|
+
from ...constants import SERVICE_HOSTNAME, SERVICE_PORT
|
8
6
|
from .builder import WorkflowBuilder
|
9
7
|
|
10
8
|
class ReverseProxyDecorator():
|
@@ -56,11 +54,5 @@ class ReverseProxyDecorator():
|
|
56
54
|
**additional_properties,
|
57
55
|
}
|
58
56
|
|
59
|
-
# If we are reverse proxying to potentially an external host,
|
60
|
-
# Docker's embedded DNS will use the host's /etc/host file as part of the resolution process
|
61
|
-
# This can lead the hostname to resolve to localhost instead of the service's actual IP address
|
62
|
-
if not config.detached:
|
63
|
-
service['dns'] = SERVICE_DNS
|
64
|
-
|
65
57
|
services[proxy_name] = service
|
66
58
|
|
@@ -19,7 +19,7 @@ WORKDIR /home/mkcert
|
|
19
19
|
|
20
20
|
RUN mkcert $SERVICE_HOSTNAME && mkcert -pkcs12 $SERVICE_HOSTNAME && cat $SERVICE_HOSTNAME.pem >> $SERVICE_HOSTNAME-joined.pem && cat $SERVICE_HOSTNAME-key.pem >> $SERVICE_HOSTNAME-joined.pem
|
21
21
|
|
22
|
-
FROM stoobly/agent:1.
|
22
|
+
FROM stoobly/agent:1.2
|
23
23
|
|
24
24
|
ARG SERVICE_HOSTNAME
|
25
25
|
ARG USER_ID
|
@@ -28,9 +28,11 @@ docker_compose_command=docker compose
|
|
28
28
|
source_env=set -a; [ -f .env ] && source .env; set +a
|
29
29
|
|
30
30
|
docker_compose_file_path=$(app_data_dir)/docker/stoobly-ui/exec/.docker-compose.exec.yml
|
31
|
-
stoobly_exec_args=--profile $(EXEC_WORKFLOW_NAME) -p $(EXEC_WORKFLOW_NAME) up --
|
31
|
+
stoobly_exec_args=--profile $(EXEC_WORKFLOW_NAME) -p $(EXEC_WORKFLOW_NAME) up --remove-orphans
|
32
32
|
stoobly_exec_env=export CONTEXT_DIR=$(context_dir) && export USER_ID=$$UID && export CA_CERTS_DIR="$(ca_certs_dir)"
|
33
|
-
|
33
|
+
stoobly_exec_build_args=--profile $(EXEC_WORKFLOW_NAME) -p $(EXEC_WORKFLOW_NAME) build --pull --quiet
|
34
|
+
stoobly_exec_build=$(docker_compose_command) "$(docker_compose_file_path)" $(stoobly_exec_build_args)
|
35
|
+
stoobly_exec=$(stoobly_exec_env) && $(source_env) && $(stoobly_exec_build) && $(docker_compose_command) -f "$(docker_compose_file_path)" $(stoobly_exec_args)
|
34
36
|
|
35
37
|
# Because scaffold is stored in the APP_DIR, when running a scaffold command from within a container,
|
36
38
|
# it needs access to APP_DIR rather than CONTEXT_DIR
|
@@ -63,7 +65,7 @@ intercept/enable:
|
|
63
65
|
export EXEC_ARGS=$(scenario_key) && \
|
64
66
|
$(stoobly_exec)
|
65
67
|
mock: nameservers
|
66
|
-
@export EXEC_COMMAND=bin/.
|
68
|
+
@export EXEC_COMMAND=bin/.up && \
|
67
69
|
export EXEC_OPTIONS="$(workflow_run_options)$(options)" && \
|
68
70
|
export EXEC_ARGS="mock" && \
|
69
71
|
$(stoobly_exec_run) && \
|
@@ -74,14 +76,14 @@ mock/logs:
|
|
74
76
|
export EXEC_ARGS="mock" && \
|
75
77
|
$(stoobly_exec_run) && \
|
76
78
|
$(workflow_run)
|
77
|
-
mock/
|
78
|
-
@export EXEC_COMMAND=bin/.
|
79
|
+
mock/down:
|
80
|
+
@export EXEC_COMMAND=bin/.down && \
|
79
81
|
export EXEC_OPTIONS="$(options)" && \
|
80
82
|
export EXEC_ARGS="mock" && \
|
81
83
|
$(stoobly_exec_run) && \
|
82
84
|
$(workflow_run)
|
83
85
|
record: nameservers
|
84
|
-
@export EXEC_COMMAND=bin/.
|
86
|
+
@export EXEC_COMMAND=bin/.up && \
|
85
87
|
export EXEC_OPTIONS="$(workflow_run_options)$(options)" && \
|
86
88
|
export EXEC_ARGS="record" && \
|
87
89
|
$(stoobly_exec_run) && \
|
@@ -92,8 +94,8 @@ record/logs:
|
|
92
94
|
export EXEC_ARGS="record" && \
|
93
95
|
$(stoobly_exec_run) && \
|
94
96
|
$(workflow_run)
|
95
|
-
record/
|
96
|
-
@export EXEC_COMMAND=bin/.
|
97
|
+
record/down:
|
98
|
+
@export EXEC_COMMAND=bin/.down && \
|
97
99
|
export EXEC_OPTIONS="$(options)" && \
|
98
100
|
export EXEC_ARGS="record" && \
|
99
101
|
$(stoobly_exec_run) && \
|
@@ -128,7 +130,7 @@ scenario/snapshot:
|
|
128
130
|
export EXEC_ARGS="$(key)" && \
|
129
131
|
$(stoobly_exec)
|
130
132
|
test:
|
131
|
-
@export EXEC_COMMAND=bin/.
|
133
|
+
@export EXEC_COMMAND=bin/.up && \
|
132
134
|
export EXEC_OPTIONS="$(workflow_run_options)$(options)" && \
|
133
135
|
export EXEC_ARGS="test" && \
|
134
136
|
$(stoobly_exec_run) && \
|
@@ -139,8 +141,8 @@ test/logs:
|
|
139
141
|
export EXEC_ARGS="test" && \
|
140
142
|
$(stoobly_exec_run) && \
|
141
143
|
$(workflow_run)
|
142
|
-
test/
|
143
|
-
@export EXEC_COMMAND=bin/.
|
144
|
+
test/down:
|
145
|
+
@export EXEC_COMMAND=bin/.down && \
|
144
146
|
export EXEC_OPTIONS="$(options)" && \
|
145
147
|
export EXEC_ARGS="test" && \
|
146
148
|
$(stoobly_exec_run) && \
|
@@ -22,6 +22,8 @@ LOG_ID = 'WorkflowRunCommand'
|
|
22
22
|
class UpOptions(TypedDict):
|
23
23
|
attached: bool
|
24
24
|
namespace: str
|
25
|
+
no_cache: bool
|
26
|
+
verbose: bool
|
25
27
|
|
26
28
|
class WorkflowRunCommand(WorkflowCommand):
|
27
29
|
def __init__(self, app: App, **kwargs):
|
@@ -93,10 +95,12 @@ class WorkflowRunCommand(WorkflowCommand):
|
|
93
95
|
if not os.path.exists(self.compose_path):
|
94
96
|
return ''
|
95
97
|
|
98
|
+
build_command = ['docker', 'compose']
|
96
99
|
command = ['COMPOSE_IGNORE_ORPHANS=true', 'docker', 'compose']
|
100
|
+
command_options = []
|
97
101
|
|
98
102
|
# Add docker compose file
|
99
|
-
|
103
|
+
command_options.append(f"-f {os.path.relpath(self.compose_path, self.__current_working_dir)}")
|
100
104
|
|
101
105
|
# Add custom docker compose file
|
102
106
|
custom_services = self.custom_services
|
@@ -114,16 +118,27 @@ class WorkflowRunCommand(WorkflowCommand):
|
|
114
118
|
# TODO: looking into why warning does not print in docker
|
115
119
|
Logger.instance(LOG_ID).error(f"Missing {self.workflow_name} profile in custom compose file")
|
116
120
|
|
117
|
-
|
121
|
+
command_options.append(f"-f {os.path.relpath(self.custom_compose_path, self.__current_working_dir)}")
|
118
122
|
|
119
123
|
if self.extra_compose_path:
|
120
|
-
|
124
|
+
command_options.append(f"-f {os.path.relpath(self.extra_compose_path, self.__current_working_dir)}")
|
121
125
|
|
122
|
-
|
126
|
+
command_options.append(f"--profile {self.workflow_name}")
|
123
127
|
|
124
128
|
if options.get('namespace'):
|
125
|
-
|
129
|
+
command_options.append(f"-p {options['namespace']}")
|
130
|
+
|
131
|
+
build_command += command_options
|
132
|
+
build_command.append('build')
|
133
|
+
build_command.append('--pull')
|
134
|
+
|
135
|
+
if not options.get('verbose'):
|
136
|
+
build_command.append('--quiet')
|
137
|
+
|
138
|
+
if options.get('no_cache'):
|
139
|
+
build_command.append('--no-cache')
|
126
140
|
|
141
|
+
command += command_options
|
127
142
|
command.append('up')
|
128
143
|
|
129
144
|
if not options.get('attached'):
|
@@ -141,13 +156,11 @@ class WorkflowRunCommand(WorkflowCommand):
|
|
141
156
|
# Otherwise, even if a service exits with a non-zero exit code, exit code 0 is returned
|
142
157
|
command.append(option)
|
143
158
|
|
144
|
-
command.append('--build')
|
145
|
-
|
146
159
|
self.write_env()
|
147
160
|
|
148
|
-
return ' '.join(command)
|
161
|
+
return ' && '.join([' '.join(build_command), ' '.join(command)])
|
149
162
|
|
150
|
-
def down(self):
|
163
|
+
def down(self, **options):
|
151
164
|
if not os.path.exists(self.compose_path):
|
152
165
|
return ''
|
153
166
|
|
@@ -164,8 +177,15 @@ class WorkflowRunCommand(WorkflowCommand):
|
|
164
177
|
command.append(f"-f {os.path.relpath(self.extra_compose_path, self.__current_working_dir)}")
|
165
178
|
|
166
179
|
command.append(f"--profile {self.workflow_name}")
|
180
|
+
|
181
|
+
if options.get('namespace'):
|
182
|
+
command.append(f"-p {options['namespace']}")
|
183
|
+
|
167
184
|
command.append('down')
|
168
185
|
|
186
|
+
if options.get('rmi'):
|
187
|
+
command.append(f"--rmi local")
|
188
|
+
|
169
189
|
return ' '.join(command)
|
170
190
|
|
171
191
|
def write_nameservers(self):
|
@@ -248,9 +248,11 @@ def copy(**kwargs):
|
|
248
248
|
@click.option('--log-level', default=INFO, type=click.Choice([DEBUG, INFO, WARNING, ERROR]), help='''
|
249
249
|
Log levels can be "debug", "info", "warning", or "error"
|
250
250
|
''')
|
251
|
+
@click.option('--namespace', help='Workflow namespace.')
|
252
|
+
@click.option('--rmi', is_flag=True, help='Remove images used by containers.')
|
251
253
|
@click.option('--service', multiple=True, help='Select which services to log. Defaults to all.')
|
252
254
|
@click.argument('workflow_name')
|
253
|
-
def
|
255
|
+
def down(**kwargs):
|
254
256
|
cwd = os.getcwd()
|
255
257
|
|
256
258
|
if not os.getenv(env_vars.LOG_LEVEL):
|
@@ -281,7 +283,7 @@ def stop(**kwargs):
|
|
281
283
|
for command in commands:
|
282
284
|
__print_header(f"SERVICE {command.service_name}")
|
283
285
|
|
284
|
-
exec_command = command.down()
|
286
|
+
exec_command = command.down(namespace=kwargs['namespace'], rmi=kwargs['rmi'])
|
285
287
|
if not exec_command:
|
286
288
|
continue
|
287
289
|
|
@@ -358,9 +360,11 @@ def logs(**kwargs):
|
|
358
360
|
''')
|
359
361
|
@click.option('--namespace', help='Workflow namespace.')
|
360
362
|
@click.option('--network', help='Workflow network namespace.')
|
363
|
+
@click.option('--no-cache', is_flag=True, help='Do not use cache when building images.')
|
361
364
|
@click.option('--service', multiple=True, help='Select which services to run. Defaults to all.')
|
365
|
+
@click.option('--verbose', is_flag=True)
|
362
366
|
@click.argument('workflow_name')
|
363
|
-
def
|
367
|
+
def up(**kwargs):
|
364
368
|
cwd = os.getcwd()
|
365
369
|
|
366
370
|
# Create the certs_dir_path if it doesn't exist
|
@@ -417,7 +421,9 @@ def run(**kwargs):
|
|
417
421
|
# By default, the entrypoint service should be last
|
418
422
|
# However, this can change if the user has configured a service's priority to be higher
|
419
423
|
attached = not kwargs['detached'] and index == len(commands) - 1
|
420
|
-
exec_command = command.up(
|
424
|
+
exec_command = command.up(
|
425
|
+
attached=attached, namespace=kwargs['namespace'], no_cache=kwargs['no_cache'], verbose=kwargs['verbose']
|
426
|
+
)
|
421
427
|
if not exec_command:
|
422
428
|
continue
|
423
429
|
|
@@ -107,8 +107,8 @@ class ScaffoldCliInvoker():
|
|
107
107
|
assert not output
|
108
108
|
|
109
109
|
@staticmethod
|
110
|
-
def
|
111
|
-
command = ['workflow', '
|
110
|
+
def cli_workflow_up(runner: CliRunner, app_dir_path: str, target_workflow_name: str):
|
111
|
+
command = ['workflow', 'up',
|
112
112
|
'--app-dir-path', app_dir_path,
|
113
113
|
'--context-dir-path', app_dir_path,
|
114
114
|
target_workflow_name,
|
@@ -120,8 +120,8 @@ class ScaffoldCliInvoker():
|
|
120
120
|
assert output
|
121
121
|
|
122
122
|
@staticmethod
|
123
|
-
def
|
124
|
-
command = ['workflow', '
|
123
|
+
def cli_workflow_down(runner: CliRunner, app_dir_path: str, target_workflow_name: str):
|
124
|
+
command = ['workflow', 'down',
|
125
125
|
'--app-dir-path', app_dir_path,
|
126
126
|
'--context-dir-path', app_dir_path,
|
127
127
|
target_workflow_name,
|
@@ -85,7 +85,7 @@ class TestScaffoldCli():
|
|
85
85
|
@pytest.fixture(scope="class", autouse=True)
|
86
86
|
def cleanup_after_all(self, runner, app_dir_path, target_workflow_name):
|
87
87
|
yield
|
88
|
-
ScaffoldCliInvoker.
|
88
|
+
ScaffoldCliInvoker.cli_workflow_down(runner, app_dir_path, target_workflow_name)
|
89
89
|
shutil.rmtree(app_dir_path)
|
90
90
|
|
91
91
|
|
@@ -129,12 +129,12 @@ class TestScaffoldE2e():
|
|
129
129
|
# Generate certs
|
130
130
|
ScaffoldCliInvoker.cli_app_mkcert(runner, app_dir_path)
|
131
131
|
|
132
|
-
ScaffoldCliInvoker.
|
132
|
+
ScaffoldCliInvoker.cli_workflow_up(runner, app_dir_path, target_workflow_name)
|
133
133
|
|
134
134
|
@pytest.fixture(scope="class", autouse=True)
|
135
135
|
def cleanup_after_all(self, runner, app_dir_path, target_workflow_name):
|
136
136
|
yield
|
137
|
-
ScaffoldCliInvoker.
|
137
|
+
ScaffoldCliInvoker.cli_workflow_down(runner, app_dir_path, target_workflow_name)
|
138
138
|
shutil.rmtree(app_dir_path)
|
139
139
|
|
140
140
|
def test_core_components(self, app_dir_path, target_workflow_name):
|
@@ -252,12 +252,12 @@ class TestScaffoldE2e():
|
|
252
252
|
with open(f"{command.fixtures_dir_path}/shared_file.txt", 'w') as file:
|
253
253
|
file.write('this is a shared file')
|
254
254
|
|
255
|
-
ScaffoldCliInvoker.
|
255
|
+
ScaffoldCliInvoker.cli_workflow_up(runner, app_dir_path, target_workflow_name=target_workflow_name)
|
256
256
|
|
257
257
|
@pytest.fixture(scope="class", autouse=True)
|
258
258
|
def cleanup_after_all(self, runner, app_dir_path, target_workflow_name):
|
259
259
|
yield
|
260
|
-
ScaffoldCliInvoker.
|
260
|
+
ScaffoldCliInvoker.cli_workflow_down(runner, app_dir_path, target_workflow_name)
|
261
261
|
shutil.rmtree(app_dir_path)
|
262
262
|
|
263
263
|
def test_no_core_components(self, app_dir_path, target_workflow_name):
|
@@ -1 +1 @@
|
|
1
|
-
1.
|
1
|
+
1.1.4
|
@@ -1,4 +1,4 @@
|
|
1
|
-
stoobly_agent/__init__.py,sha256=
|
1
|
+
stoobly_agent/__init__.py,sha256=2CaOxKsprE3DuC_BVDFB_Riqf8gAwUziEEd6yMCwXv4,44
|
2
2
|
stoobly_agent/app/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
3
3
|
stoobly_agent/app/api/__init__.py,sha256=ctkB8KR-eXO0SFhj602huHiyvQ3PslFWd8fkcufgrAI,1000
|
4
4
|
stoobly_agent/app/api/application_http_request_handler.py,sha256=jf4fkqjOiCeI2IM5Ro7ie0v_C6y0-7-5TIE_IKMPOfg,5513
|
@@ -86,9 +86,10 @@ stoobly_agent/app/cli/scaffold/docker/service/types.py,sha256=qB-yYHlu-PZDc0HYgT
|
|
86
86
|
stoobly_agent/app/cli/scaffold/docker/workflow/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
87
87
|
stoobly_agent/app/cli/scaffold/docker/workflow/build_decorator.py,sha256=vbmME0cbN2EnNRlzQ2umj7Y3L7aZT-EHqEpkBFMfe8U,758
|
88
88
|
stoobly_agent/app/cli/scaffold/docker/workflow/builder.py,sha256=bnKOqqoKEYzmJkIJwDoNz60doE-nf1GlDC9BqciUtkg,7107
|
89
|
-
stoobly_agent/app/cli/scaffold/docker/workflow/decorators_factory.py,sha256=
|
89
|
+
stoobly_agent/app/cli/scaffold/docker/workflow/decorators_factory.py,sha256=oi0Hkii2W9338IeG7BG2medQxqZUbBp71Cvj-qDunII,987
|
90
|
+
stoobly_agent/app/cli/scaffold/docker/workflow/development_decorator.py,sha256=cs00Cc2DuOYrGD8W9849PjHz6k2xyx0fSizqJlM7yR8,946
|
90
91
|
stoobly_agent/app/cli/scaffold/docker/workflow/mock_decorator.py,sha256=D8PgYULERvWLaW1Vn3qspRTuNBoicuP2M1EZnQyvD_M,1080
|
91
|
-
stoobly_agent/app/cli/scaffold/docker/workflow/reverse_proxy_decorator.py,sha256=
|
92
|
+
stoobly_agent/app/cli/scaffold/docker/workflow/reverse_proxy_decorator.py,sha256=C7cHNmnqgvDCZh2gor1LvNicOL02_3L2bVx_DWIH2aA,1687
|
92
93
|
stoobly_agent/app/cli/scaffold/env.py,sha256=e-Ve4p3RUgzFx22B3SIYttvJ_yLuDtA27oDACZ8n-6E,1140
|
93
94
|
stoobly_agent/app/cli/scaffold/hosts_file_reader.py,sha256=gYkkrOlY7QG2JNsET6DKq4djrQAH0UGJtTkF7UwYT5o,1748
|
94
95
|
stoobly_agent/app/cli/scaffold/managed_services_docker_compose.py,sha256=-wLBXUi7DCWsfm5KzZzd_kdJKOTl1NT924XR7dyjbSY,574
|
@@ -101,9 +102,9 @@ stoobly_agent/app/cli/scaffold/service_docker_compose.py,sha256=OMUN1-ujQYIZXxDv
|
|
101
102
|
stoobly_agent/app/cli/scaffold/service_workflow.py,sha256=sQ_Edy_wGHKMXpD0DmhnOWkGEKz7gSgEGNI8f7aXOdg,444
|
102
103
|
stoobly_agent/app/cli/scaffold/service_workflow_validate_command.py,sha256=z7Z_vS2dTpYuRMRd7esnXWpc_drWSX1hiojJgieHunw,10089
|
103
104
|
stoobly_agent/app/cli/scaffold/templates/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
104
|
-
stoobly_agent/app/cli/scaffold/templates/app/.Dockerfile.context,sha256=
|
105
|
-
stoobly_agent/app/cli/scaffold/templates/app/.Dockerfile.proxy,sha256=
|
106
|
-
stoobly_agent/app/cli/scaffold/templates/app/.Makefile,sha256=
|
105
|
+
stoobly_agent/app/cli/scaffold/templates/app/.Dockerfile.context,sha256=a4PUVIJ_0CEIwUTCEhvtiGJSnu--AWFE1lKv-8q17fU,193
|
106
|
+
stoobly_agent/app/cli/scaffold/templates/app/.Dockerfile.proxy,sha256=L0yDlJfPD775NM-HgPx4E5-r-AflVBGfBf5DYl1nfME,1027
|
107
|
+
stoobly_agent/app/cli/scaffold/templates/app/.Makefile,sha256=mQFdZqJAf83QN4ywhQ0sZDAazkvkwYPzhxRsyjo1z74,5575
|
107
108
|
stoobly_agent/app/cli/scaffold/templates/app/.docker-compose.base.yml,sha256=LNNuygX6hMtmElxaO6jTIYq3psYmxNv7xax7ra6JzO4,407
|
108
109
|
stoobly_agent/app/cli/scaffold/templates/app/Makefile,sha256=t7xRaCc9q3k7W34S0h9KX02GljSVwGpPnFmiLUvWxsw,80
|
109
110
|
stoobly_agent/app/cli/scaffold/templates/app/build/.config.yml,sha256=8Wt8ZZ5irvBYYS44xGrR_EWlZDuXH9kyWmquzsh7s8g,19
|
@@ -126,7 +127,7 @@ stoobly_agent/app/cli/scaffold/templates/app/build/test/bin/init,sha256=O7czui9G
|
|
126
127
|
stoobly_agent/app/cli/scaffold/templates/app/entrypoint/.config.yml,sha256=T9VQz6OwAQpKdIoFrnfKAxuX_to0c6EhuWRLKM34Sr4,22
|
127
128
|
stoobly_agent/app/cli/scaffold/templates/app/entrypoint/.docker-compose.base.yml,sha256=ZekJ2lHjnPPI7hV44x3_2JzJFbn2iao9ZLWCgENfTOo,341
|
128
129
|
stoobly_agent/app/cli/scaffold/templates/app/entrypoint/mock/.docker-compose.mock.yml,sha256=cxAJ7CrI3AeuzQs9qw3fDSHTfYTQ1Bw_0egfy_FYRJ8,684
|
129
|
-
stoobly_agent/app/cli/scaffold/templates/app/entrypoint/mock/bin/.configure,sha256=
|
130
|
+
stoobly_agent/app/cli/scaffold/templates/app/entrypoint/mock/bin/.configure,sha256=XuPxv-MprVjmv3S6WbJy9WsC3wizlx8TkFvNNhGyEJ8,254
|
130
131
|
stoobly_agent/app/cli/scaffold/templates/app/entrypoint/mock/bin/.init,sha256=5xJbfpwGOmRj5lwK5e0JNlVpNd3WFUkZ0GaCUK40aDk,97
|
131
132
|
stoobly_agent/app/cli/scaffold/templates/app/entrypoint/mock/bin/configure,sha256=Nme7aSLA-IH1NXgmqRMPzOlKcUSRXqZd-kcuZa47IEk,11
|
132
133
|
stoobly_agent/app/cli/scaffold/templates/app/entrypoint/mock/bin/init,sha256=O7czui9GFHbcoEC5I9MwkRyZvDGY42IwlyQwIWcgylY,12
|
@@ -138,7 +139,7 @@ stoobly_agent/app/cli/scaffold/templates/app/entrypoint/record/bin/configure,sha
|
|
138
139
|
stoobly_agent/app/cli/scaffold/templates/app/entrypoint/record/bin/init,sha256=O7czui9GFHbcoEC5I9MwkRyZvDGY42IwlyQwIWcgylY,12
|
139
140
|
stoobly_agent/app/cli/scaffold/templates/app/entrypoint/record/docker-compose.yml,sha256=5n4bZBHI9MtwBF55ugu1RTdwMy7T6SsYGQ_3sulFUj8,595
|
140
141
|
stoobly_agent/app/cli/scaffold/templates/app/entrypoint/test/.docker-compose.test.yml,sha256=ifPMJHPbAf6hI4vS1BWuzPOOt5SCaxHFnWA5BVnM9RY,685
|
141
|
-
stoobly_agent/app/cli/scaffold/templates/app/entrypoint/test/bin/.configure,sha256=
|
142
|
+
stoobly_agent/app/cli/scaffold/templates/app/entrypoint/test/bin/.configure,sha256=XuPxv-MprVjmv3S6WbJy9WsC3wizlx8TkFvNNhGyEJ8,254
|
142
143
|
stoobly_agent/app/cli/scaffold/templates/app/entrypoint/test/bin/.init,sha256=5xJbfpwGOmRj5lwK5e0JNlVpNd3WFUkZ0GaCUK40aDk,97
|
143
144
|
stoobly_agent/app/cli/scaffold/templates/app/entrypoint/test/bin/configure,sha256=Nme7aSLA-IH1NXgmqRMPzOlKcUSRXqZd-kcuZa47IEk,11
|
144
145
|
stoobly_agent/app/cli/scaffold/templates/app/entrypoint/test/bin/init,sha256=O7czui9GFHbcoEC5I9MwkRyZvDGY42IwlyQwIWcgylY,12
|
@@ -153,14 +154,14 @@ stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/exec/.docker-compose.exe
|
|
153
154
|
stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/exec/bin/.create,sha256=EZe84bLAKB-mrB9PGMx-amyMjp6x-ESUZKC8wxrWdLE,245
|
154
155
|
stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/exec/bin/.delete,sha256=RspRDQ7WT5jpN2o-6qXOlH-A2VpN4981pD4ZJljk9Rw,260
|
155
156
|
stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/exec/bin/.disable,sha256=xVf4Pk1RLvJm7Ff0rbGoWhYHPv0ME5e93fxS2yFqLnE,45
|
157
|
+
stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/exec/bin/.down,sha256=3xROM9J45s2C-qWZ5_IW23AU9U8YyNXI2ka_xGYNHeQ,232
|
156
158
|
stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/exec/bin/.enable,sha256=sfUSPG4uHdXX95BLgivXQYLbsLBP2DjJIiSTXRtvXuY,188
|
157
159
|
stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/exec/bin/.list,sha256=BdX3ARC-Piuwk0vFzBrcxEwtHjdFncpORzqP-hP4IwE,84
|
158
160
|
stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/exec/bin/.logs,sha256=2F1_IVU6Whj6bVXz7WcwSQKKQFO0HyBK22BdoSCUjbQ,187
|
159
161
|
stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/exec/bin/.mkcert,sha256=vyHaXmvy-7oL2RD8rIxwT-fdJS5kXmB0yHK5fRMo_cM,46
|
160
162
|
stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/exec/bin/.reset,sha256=_pvbLk-ektsCHEh_egDtd6c0sVqCPunwUWggarfoli0,238
|
161
|
-
stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/exec/bin/.run,sha256=Jkx7q0MO8pYCSnlOEAEkx2Odgb8xbUeylv_RLHDD8NI,268
|
162
163
|
stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/exec/bin/.snapshot,sha256=Kav1QNhKG7f0DBzc4-9dmxZMmmVTxmPqakT_W4kVYKk,241
|
163
|
-
stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/exec/bin/.
|
164
|
+
stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/exec/bin/.up,sha256=MZbIZpLlKpn-8jMFIFeIw6lfd8mc8A8GMONP-UOYwMI,267
|
164
165
|
stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/mock/.docker-compose.mock.yml,sha256=Ba-jNMZUcq62kK_hLpaN7dkEwz3_ZS91aJOOJ8U3Ark,257
|
165
166
|
stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/record/.docker-compose.record.yml,sha256=cbK8vJUnk8llJ6pIE65AxJxD6SSal2ugm5sKjtz3uRY,260
|
166
167
|
stoobly_agent/app/cli/scaffold/templates/constants.py,sha256=TjuWAZuAbWxS1hZR4jViF1LTBzT8iKLIJE65AvWRKNI,1460
|
@@ -192,9 +193,9 @@ stoobly_agent/app/cli/scaffold/workflow_copy_command.py,sha256=R9hh5dWVz7vGld7pE
|
|
192
193
|
stoobly_agent/app/cli/scaffold/workflow_create_command.py,sha256=5xnRYrVb2KlSDARZFjLGGWeURXRu63OHoRLEhO-EAvw,3401
|
193
194
|
stoobly_agent/app/cli/scaffold/workflow_env.py,sha256=x8V5pJmIiklD3f2q2-qq-CORf4YaXYq_r2JpR2MmSwk,416
|
194
195
|
stoobly_agent/app/cli/scaffold/workflow_log_command.py,sha256=Bke4lMOMxuDUFuAx9nlXHbKgYMO4KAg9ASHvjz4aVWc,1372
|
195
|
-
stoobly_agent/app/cli/scaffold/workflow_run_command.py,sha256=
|
196
|
+
stoobly_agent/app/cli/scaffold/workflow_run_command.py,sha256=ICJZXBa93GwDmMqk_dWU6ACnpPUUa4YJcpFxozRCtDc,8283
|
196
197
|
stoobly_agent/app/cli/scaffold/workflow_validate_command.py,sha256=fhHciJXg_u32Wmh8us8LhgQj8D1SxkBADtuBBF4K0FM,4377
|
197
|
-
stoobly_agent/app/cli/scaffold_cli.py,sha256=
|
198
|
+
stoobly_agent/app/cli/scaffold_cli.py,sha256=SAE6csE_pwE6vTeu054toGYHvz82bD1n4-dGY-FBxdk,19818
|
198
199
|
stoobly_agent/app/cli/scenario_cli.py,sha256=3J1EiJOvunkfWrEkOsanw-XrKkOk78ij_GjBlE9p7CE,8229
|
199
200
|
stoobly_agent/app/cli/snapshot_cli.py,sha256=XNxpTm5z3bnBGNGI3_XZIif0ypN62WqYfDmShL5fXg4,9965
|
200
201
|
stoobly_agent/app/cli/trace_cli.py,sha256=K7E-vx3JUcqEDSWOdIOi_AieKNQz7dBfmRrVvKDkzFI,4605
|
@@ -663,9 +664,9 @@ stoobly_agent/test/app/cli/request/request_reset_test.py,sha256=5My6Z452eideAOUu
|
|
663
664
|
stoobly_agent/test/app/cli/request/request_response_test.py,sha256=Fu-A8tIn016DKme4WIaPzo3YeFY-CPtTOpaSFigUVVM,1263
|
664
665
|
stoobly_agent/test/app/cli/request/request_snapshot_test.py,sha256=0013aoiMZin-2YEtHzEmQspAPA3SUd_6XiItbX0U7Ok,4425
|
665
666
|
stoobly_agent/test/app/cli/request/request_test_test.py,sha256=-cJNXKjgryVVfVt-7IN5fIhBwe3NjFoPmeavDH8lAjU,5527
|
666
|
-
stoobly_agent/test/app/cli/scaffold/cli_invoker.py,sha256=
|
667
|
-
stoobly_agent/test/app/cli/scaffold/cli_test.py,sha256=
|
668
|
-
stoobly_agent/test/app/cli/scaffold/e2e_test.py,sha256=
|
667
|
+
stoobly_agent/test/app/cli/scaffold/cli_invoker.py,sha256=BXqWjSMRrK6MxX6rM6uHbFj4keqylSGDPvgy4TDdb9I,3702
|
668
|
+
stoobly_agent/test/app/cli/scaffold/cli_test.py,sha256=sMNvO845MIu5DVGa1HmwXQDmKDcwrfNTdEb3fK5886w,4557
|
669
|
+
stoobly_agent/test/app/cli/scaffold/e2e_test.py,sha256=fd_LWwkkjMbQQ39hxG0SwrwXeR-_cycT0Bmz3QOzpss,12978
|
669
670
|
stoobly_agent/test/app/cli/scaffold/hosts_file_reader_test.py,sha256=zGx-fvYTT3N-WS09guOICcRHl8Ann43NHLGTt33FR1s,2279
|
670
671
|
stoobly_agent/test/app/cli/scenario/scenario_create_test.py,sha256=fGqcjO1_1OvdpUMQfGRVkSyFe61u8WIcp_ndLFrf33A,3962
|
671
672
|
stoobly_agent/test/app/cli/scenario/scenario_replay_integration_test.py,sha256=NbGJzmvPsNLBR0ac65yt_cOTfpnsST1IG7i3F0euwAk,7031
|
@@ -691,7 +692,7 @@ stoobly_agent/test/app/models/factories/resource/local_db/helpers/log_test.py,sh
|
|
691
692
|
stoobly_agent/test/app/models/factories/resource/local_db/helpers/tiebreak_scenario_request_test.py,sha256=5IFGVGn3ogvRT0fzZgXzhrYlSfSlr8IR1p_XExaegMQ,3399
|
692
693
|
stoobly_agent/test/app/models/factories/resource/local_db/request_adapter_test.py,sha256=Pzq1cBPnP9oSWG-p0c-VoymoHxgp483QmNwmV1b78RA,8453
|
693
694
|
stoobly_agent/test/app/models/factories/resource/local_db/response_adapter_test.py,sha256=9P95EKH5rZGOrmRkRIDlQZqtiLJHk9735og18Ffwpfw,2204
|
694
|
-
stoobly_agent/test/app/models/schemas/.stoobly/db/VERSION,sha256=
|
695
|
+
stoobly_agent/test/app/models/schemas/.stoobly/db/VERSION,sha256=s4n9aV0PFyXVJPIoNMaqvv68dMsxTpUy9-iiXCnuR9I,5
|
695
696
|
stoobly_agent/test/app/models/schemas/.stoobly/db/stoobly_agent.sqlite3,sha256=ch8gNx6zIelLKQx65gwFx_LRNqUD3EC5xcHZ0ukIQiU,188416
|
696
697
|
stoobly_agent/test/app/models/schemas/.stoobly/settings.yml,sha256=vLwMjweKOdod6tSLtIlyBefPQuNXq9wio4kBaODKtAU,726
|
697
698
|
stoobly_agent/test/app/models/schemas/.stoobly/tmp/options.json,sha256=OTRzarwus48CTrItedXCrgQttJHSEZonEYc7R_knvYg,2212
|
@@ -728,8 +729,8 @@ stoobly_agent/test/mock_data/scaffold/docker-compose-local-service.yml,sha256=x7
|
|
728
729
|
stoobly_agent/test/mock_data/scaffold/index.html,sha256=qJwuYajKZ4ihWZrJQ3BNObV5kf1VGnnm_vqlPJzdqLE,258
|
729
730
|
stoobly_agent/test/mock_data/uspto.yaml,sha256=6U5se7C3o-86J4m9xpOk9Npias399f5CbfWzR87WKwE,7835
|
730
731
|
stoobly_agent/test/test_helper.py,sha256=m_oAI7tmRYCNZdKfNqISWhMv3e44tjeYViQ3nTUfnos,1007
|
731
|
-
stoobly_agent-1.
|
732
|
-
stoobly_agent-1.
|
733
|
-
stoobly_agent-1.
|
734
|
-
stoobly_agent-1.
|
735
|
-
stoobly_agent-1.
|
732
|
+
stoobly_agent-1.2.0.dist-info/LICENSE,sha256=8QKGyy45eN76Zk52h8gu1DKX2B_gbWgZ3nzDLofEbaE,548
|
733
|
+
stoobly_agent-1.2.0.dist-info/METADATA,sha256=GRbxwWvjR6mp74RP97y9qa97PTVe76SJIIQ2jDbQyqg,3384
|
734
|
+
stoobly_agent-1.2.0.dist-info/WHEEL,sha256=XbeZDeTWKc1w7CSIyre5aMDU_-PohRwTQceYnisIYYY,88
|
735
|
+
stoobly_agent-1.2.0.dist-info/entry_points.txt,sha256=aq5wix5oC8MDQtmyPGU0xaFrsjJg7WH28NmXh2sc3Z8,56
|
736
|
+
stoobly_agent-1.2.0.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|