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.
Files changed (22) hide show
  1. stoobly_agent/__init__.py +1 -1
  2. stoobly_agent/app/cli/scaffold/docker/workflow/decorators_factory.py +6 -0
  3. stoobly_agent/app/cli/scaffold/docker/workflow/development_decorator.py +30 -0
  4. stoobly_agent/app/cli/scaffold/docker/workflow/reverse_proxy_decorator.py +1 -9
  5. stoobly_agent/app/cli/scaffold/templates/app/.Dockerfile.context +1 -1
  6. stoobly_agent/app/cli/scaffold/templates/app/.Dockerfile.proxy +1 -1
  7. stoobly_agent/app/cli/scaffold/templates/app/.Makefile +13 -11
  8. stoobly_agent/app/cli/scaffold/templates/app/entrypoint/mock/bin/.configure +1 -1
  9. stoobly_agent/app/cli/scaffold/templates/app/entrypoint/test/bin/.configure +1 -1
  10. stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/exec/bin/{.stop → .down} +1 -1
  11. stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/exec/bin/{.run → .up} +1 -1
  12. stoobly_agent/app/cli/scaffold/workflow_run_command.py +29 -9
  13. stoobly_agent/app/cli/scaffold_cli.py +10 -4
  14. stoobly_agent/test/app/cli/scaffold/cli_invoker.py +4 -4
  15. stoobly_agent/test/app/cli/scaffold/cli_test.py +1 -1
  16. stoobly_agent/test/app/cli/scaffold/e2e_test.py +4 -4
  17. stoobly_agent/test/app/models/schemas/.stoobly/db/VERSION +1 -1
  18. {stoobly_agent-1.1.3.dist-info → stoobly_agent-1.2.0.dist-info}/METADATA +1 -1
  19. {stoobly_agent-1.1.3.dist-info → stoobly_agent-1.2.0.dist-info}/RECORD +22 -21
  20. {stoobly_agent-1.1.3.dist-info → stoobly_agent-1.2.0.dist-info}/LICENSE +0 -0
  21. {stoobly_agent-1.1.3.dist-info → stoobly_agent-1.2.0.dist-info}/WHEEL +0 -0
  22. {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.1.3'
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 stoobly_agent.config.data_dir import DataDir
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
 
@@ -1,4 +1,4 @@
1
- FROM stoobly/agent:1.1
1
+ FROM stoobly/agent:1.2
2
2
 
3
3
  ARG USER_ID
4
4
 
@@ -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.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 --build --remove-orphans --pull always
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
- stoobly_exec=$(stoobly_exec_env) && $(source_env) && $(docker_compose_command) -f "$(docker_compose_file_path)" $(stoobly_exec_args)
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/.run && \
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/stop:
78
- @export EXEC_COMMAND=bin/.stop && \
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/.run && \
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/stop:
96
- @export EXEC_COMMAND=bin/.stop && \
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/.run && \
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/stop:
143
- @export EXEC_COMMAND=bin/.stop && \
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) && \
@@ -1,7 +1,7 @@
1
1
  #!/bin/bash
2
2
 
3
3
  echo "Configuring intercept mode"
4
- stoobly-agent intercept configure --mode mock --policy found
4
+ stoobly-agent intercept configure --mode mock --policy all
5
5
 
6
6
  echo "Enabling intercept"
7
7
  stoobly-agent intercept enable
@@ -1,7 +1,7 @@
1
1
  #!/bin/bash
2
2
 
3
3
  echo "Configuring intercept mode"
4
- stoobly-agent intercept configure --mode mock --policy found
4
+ stoobly-agent intercept configure --mode mock --policy all
5
5
 
6
6
  echo "Enabling intercept"
7
7
  stoobly-agent intercept enable
@@ -5,7 +5,7 @@ workflow=$1
5
5
 
6
6
  mkdir -p .stoobly/tmp
7
7
 
8
- stoobly-agent scaffold workflow stop \
8
+ stoobly-agent scaffold workflow down \
9
9
  --app-dir-path "$(pwd)" \
10
10
  --dry-run \
11
11
  --log-level error \
@@ -7,7 +7,7 @@ mkdir -p .stoobly/tmp
7
7
 
8
8
  stoobly-agent scaffold app mkcert
9
9
 
10
- stoobly-agent scaffold workflow run \
10
+ stoobly-agent scaffold workflow up \
11
11
  --app-dir-path "$(pwd)" \
12
12
  --dry-run \
13
13
  --log-level warning \
@@ -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
- command.append(f"-f {os.path.relpath(self.compose_path, self.__current_working_dir)}")
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
- command.append(f"-f {os.path.relpath(self.custom_compose_path, self.__current_working_dir)}")
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
- command.append(f"-f {os.path.relpath(self.extra_compose_path, self.__current_working_dir)}")
124
+ command_options.append(f"-f {os.path.relpath(self.extra_compose_path, self.__current_working_dir)}")
121
125
 
122
- command.append(f"--profile {self.workflow_name}")
126
+ command_options.append(f"--profile {self.workflow_name}")
123
127
 
124
128
  if options.get('namespace'):
125
- command.append(f"-p {options['namespace']}")
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 stop(**kwargs):
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 run(**kwargs):
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(attached=attached, namespace=kwargs['namespace'])
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 cli_workflow_run(runner: CliRunner, app_dir_path: str, target_workflow_name: str):
111
- command = ['workflow', 'run',
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 cli_workflow_stop(runner: CliRunner, app_dir_path: str, target_workflow_name: str):
124
- command = ['workflow', 'stop',
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.cli_workflow_stop(runner, app_dir_path, target_workflow_name)
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.cli_workflow_run(runner, app_dir_path, target_workflow_name)
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.cli_workflow_stop(runner, app_dir_path, target_workflow_name)
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.cli_workflow_run(runner, app_dir_path, target_workflow_name=target_workflow_name)
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.cli_workflow_stop(runner, app_dir_path, target_workflow_name)
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.0.14
1
+ 1.1.4
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: stoobly-agent
3
- Version: 1.1.3
3
+ Version: 1.2.0
4
4
  Summary: Record, mock, and test HTTP(s) requests. CLI agent for Stoobly
5
5
  License: Apache-2.0
6
6
  Author: Matt Le
@@ -1,4 +1,4 @@
1
- stoobly_agent/__init__.py,sha256=RDVATMzONZZkAKiL7eEYtrHytxhxShWZgElMHXzqw3w,44
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=Mi6SEFpG2MG9pymPLbPTWBMfosi1ThRAs5DXfjBz4Iw,643
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=d2E0ba0ga2IjIE3v1VnLmZLgKiyBB15BerCtL0FyndI,2095
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=qvZFhJxfGAYMKr2VfYye5LX264phfl4cIfkS-TJs2-w,193
105
- stoobly_agent/app/cli/scaffold/templates/app/.Dockerfile.proxy,sha256=HN2tv7dfJL9riJUrrtQRHZTC2QeSTf06tQ8aBhdHAaw,1027
106
- stoobly_agent/app/cli/scaffold/templates/app/.Makefile,sha256=PcprOXanBlsMCswcip0QDBLvaUiHD-1gSxhgUOoDfVA,5372
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=I4MhiSVbBaQWy056opYfPqnWPZmS5rKBW_Y26nDGMeY,256
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=I4MhiSVbBaQWy056opYfPqnWPZmS5rKBW_Y26nDGMeY,256
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/.stop,sha256=qj5fRkBubAGGAKiFrjHPMVULDiRLMsIkEF5Al3uhQlo,232
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=ounJeIp1_baB5baWPyAvudI9PJZ4tuJ_BPnVdjvzkqo,7685
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=RaJD3EwCKYLFHWd1tSTcf_0hK4tGvTGB078LdPreDPM,19437
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=azCL0Fhgsj2nt0nDI4DndPAdbaw4_Hrr3G8f3H4mVQQ,3704
667
- stoobly_agent/test/app/cli/scaffold/cli_test.py,sha256=dWvkbkUHSJ3Wqe3pdDeCeij6U8loPEkOB9eJWDUSBTw,4557
668
- stoobly_agent/test/app/cli/scaffold/e2e_test.py,sha256=5qwz0hZaaQ1lsh565uSIC6mj6oQa22G68-VS_Uyzmwk,12980
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=TafAeNpokhr_A1hH48JIPDGBG9QBJMyLwCllTViWDCk,6
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.1.3.dist-info/LICENSE,sha256=8QKGyy45eN76Zk52h8gu1DKX2B_gbWgZ3nzDLofEbaE,548
732
- stoobly_agent-1.1.3.dist-info/METADATA,sha256=y124kMIiYQVNrhZKo3lOwJ3wbiprV1vBqF_4wYhPEgc,3384
733
- stoobly_agent-1.1.3.dist-info/WHEEL,sha256=XbeZDeTWKc1w7CSIyre5aMDU_-PohRwTQceYnisIYYY,88
734
- stoobly_agent-1.1.3.dist-info/entry_points.txt,sha256=aq5wix5oC8MDQtmyPGU0xaFrsjJg7WH28NmXh2sc3Z8,56
735
- stoobly_agent-1.1.3.dist-info/RECORD,,
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,,