stoobly-agent 1.9.3__py3-none-any.whl → 1.9.5__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 CHANGED
@@ -1,2 +1,2 @@
1
1
  COMMAND = 'stoobly-agent'
2
- VERSION = '1.9.3'
2
+ VERSION = '1.9.5'
@@ -1,5 +1,5 @@
1
1
  from .config import Config
2
- from .constants import APP_NAME_ENV, APP_NETWORK_ENV
2
+ from .constants import APP_NAME_ENV, APP_NETWORK_ENV, APP_UI_PORT_ENV
3
3
 
4
4
  class AppConfig(Config):
5
5
 
@@ -27,11 +27,20 @@ class AppConfig(Config):
27
27
  def network(self, v):
28
28
  self.__network = v
29
29
 
30
+ @property
31
+ def ui_port(self):
32
+ return self.__ui_port
33
+
34
+ @ui_port.setter
35
+ def ui_port(self, v):
36
+ self.__ui_port = v
37
+
30
38
  def load(self, config = None):
31
39
  config = config or self.read()
32
40
 
33
41
  self.name = config.get(APP_NAME_ENV)
34
42
  self.network = config.get(APP_NETWORK_ENV)
43
+ self.ui_port = config.get(APP_UI_PORT_ENV)
35
44
 
36
45
  def write(self):
37
46
  config = {}
@@ -42,4 +51,7 @@ class AppConfig(Config):
42
51
  if self.network:
43
52
  config[APP_NETWORK_ENV] = self.network
44
53
 
54
+ if self.ui_port:
55
+ config[APP_UI_PORT_ENV] = self.ui_port
56
+
45
57
  super().write(config)
@@ -9,6 +9,7 @@ from .app_command import AppCommand
9
9
  class AppCreateOptions(TypedDict):
10
10
  name: str
11
11
  network: str
12
+ ui_port: int
12
13
 
13
14
  class AppCreateCommand(AppCommand):
14
15
 
@@ -21,6 +22,9 @@ class AppCreateCommand(AppCommand):
21
22
  if kwargs.get('network'):
22
23
  self.app_config.network = kwargs['network']
23
24
 
25
+ if kwargs.get('ui_port'):
26
+ self.app_config.ui_port = kwargs['ui_port']
27
+
24
28
  @property
25
29
  def app_name(self):
26
30
  return self.app_config.name
@@ -29,6 +33,10 @@ class AppCreateCommand(AppCommand):
29
33
  def app_network(self):
30
34
  return self.app_config.network
31
35
 
36
+ @property
37
+ def app_ui_port(self):
38
+ return self.app_config.ui_port
39
+
32
40
  def build(self):
33
41
  dest = self.scaffold_namespace_path
34
42
 
@@ -8,6 +8,7 @@ APP_DIR = '${APP_DIR}'
8
8
  APP_DIR_ENV = 'APP_DIR'
9
9
  APP_NETWORK_ENV = 'APP_NETWORK'
10
10
  APP_NAME_ENV = 'APP_NAME'
11
+ APP_UI_PORT_ENV = 'APP_UI_PORT'
11
12
  BIN_FOLDER_NAME = 'bin'
12
13
  CA_CERTS_DIR_ENV = 'CA_CERTS_DIR'
13
14
  CERTS_DIR_ENV = 'CERTS_DIR'
@@ -10,7 +10,7 @@ from stoobly_agent.app.cli.scaffold.service_config import ServiceConfig
10
10
  from stoobly_agent.app.cli.scaffold.docker.constants import APP_INGRESS_NETWORK_NAME, APP_EGRESS_NETWORK_NAME, DOCKER_COMPOSE_BASE, DOCKER_COMPOSE_BASE_TEMPLATE
11
11
  from stoobly_agent.app.cli.scaffold.templates.constants import CORE_GATEWAY_SERVICE_NAME
12
12
 
13
- def configure_gateway(service_paths: List[str], no_publish = False):
13
+ def configure_gateway(workflow_name, service_paths: List[str], no_publish = False):
14
14
  if len(service_paths) == 0:
15
15
  return
16
16
 
@@ -36,7 +36,7 @@ def configure_gateway(service_paths: List[str], no_publish = False):
36
36
  gateway_base['ports'] = ports
37
37
 
38
38
  app_dir_path = os.path.dirname(os.path.dirname(service_dir_path))
39
- __with_traefik_config(service_paths, gateway_base, app_dir_path)
39
+ __with_traefik_config(workflow_name, service_paths, app_dir_path, gateway_base)
40
40
  __with_networks(gateway_base, hostnames)
41
41
 
42
42
  with open(docker_compose_dest_path, 'w') as fp:
@@ -50,7 +50,9 @@ def __with_networks(config: dict, hostnames: List[str]):
50
50
  'aliases': hostnames
51
51
  }
52
52
 
53
- def __with_traefik_config(service_paths: str, compose: dict, app_dir_path: str):
53
+ def __with_traefik_config(workflow_name: str, service_paths: List[str], app_dir_path: str, compose: dict):
54
+ config_dest = '/etc/traefik/traefik.yml'
55
+
54
56
  if not compose['volumes']:
55
57
  compose['volumes'] = []
56
58
 
@@ -68,11 +70,15 @@ def __with_traefik_config(service_paths: str, compose: dict, app_dir_path: str):
68
70
  'providers': {
69
71
  'docker': {
70
72
  'exposedByDefault': False
73
+ },
74
+ 'file': {
75
+ 'fileName': config_dest,
76
+ 'watch': False
71
77
  }
72
78
  },
73
79
  'tls': {
74
- 'certificates': certificates
75
- }
80
+ 'certificates': certificates,
81
+ },
76
82
  }
77
83
 
78
84
  for path in service_paths:
@@ -88,11 +94,11 @@ def __with_traefik_config(service_paths: str, compose: dict, app_dir_path: str):
88
94
  if config.scheme == 'https':
89
95
  certificates.append({
90
96
  'certFile': f"/certs/{config.hostname}.crt",
91
- 'keyFile': f"/certs/{config.hostname}.key"
97
+ 'keyFile': f"/certs/{config.hostname}.key",
92
98
  })
93
99
 
94
100
  # Create traefik.yml in .stoobly/tmp
95
- traefik_template_relative_path = os.path.join(DATA_DIR_NAME, TMP_DIR_NAME, 'traefik.yml')
101
+ traefik_template_relative_path = os.path.join(DATA_DIR_NAME, TMP_DIR_NAME, workflow_name, 'traefik.yml')
96
102
  traefik_template_dest_path = os.path.join(app_dir_path, traefik_template_relative_path)
97
103
 
98
104
  if not os.path.exists(os.path.dirname(traefik_template_dest_path)):
@@ -102,7 +108,7 @@ def __with_traefik_config(service_paths: str, compose: dict, app_dir_path: str):
102
108
  fp.write(yaml.dump(traefik_config))
103
109
 
104
110
  compose['volumes'].append(
105
- f"{os.path.join(APP_DIR, traefik_template_relative_path)}:/etc/traefik/traefik.yml:ro"
111
+ f"{os.path.join(APP_DIR, traefik_template_relative_path)}:{config_dest}:ro"
106
112
  )
107
113
 
108
114
  def __find_hosts(service_paths):
@@ -33,8 +33,9 @@ app_namespace_dir=$(app_data_dir)/docker
33
33
  app_tmp_dir=$(app_data_dir)/tmp
34
34
  dockerfile_path=$(app_namespace_dir)/.Dockerfile.context
35
35
  exec_docker_compose_file_path=$(app_namespace_dir)/stoobly-ui/exec/.docker-compose.exec.yml
36
- exec_namespace=$(shell echo $(context_dir) | (md5 2>/dev/null || md5sum 2>/dev/null || shasum 2>/dev/null) | awk '{print $$1}')
37
- workflow_script=.stoobly/tmp/$(workflow).sh
36
+ exec_namespace=$(shell echo "$(workflow_namespace).$(context_dir)" | (md5 2>/dev/null || md5sum 2>/dev/null || shasum 2>/dev/null) | awk '{print $$1}')
37
+ workflow_namespace=$(if $(namespace),$(namespace),$(workflow))
38
+ workflow_script=.stoobly/tmp/$(workflow)/run.sh
38
39
 
39
40
  # Options
40
41
  certs_dir_options=--ca-certs-dir-path $(ca_certs_dir) --certs-dir-path $(certs_dir)
@@ -43,7 +44,7 @@ working_dir_options=--app-dir-path $(app_dir) --context-dir-path $(context_dir)
43
44
 
44
45
  workflow_down_options=--user-id $(USER_ID) $(workflow_down_extra_options)
45
46
  workflow_log_options=$(workflow_log_extra_options)
46
- workflow_run_options=--script-path $(workflow_script) $(workflow_service_options)
47
+ workflow_run_options=--namespace $(workflow_namespace) --script-path $(workflow_script) $(workflow_service_options)
47
48
  workflow_up_options=$(working_dir_options) $(certs_dir_options) --user-id $(USER_ID) $(workflow_up_extra_options)
48
49
 
49
50
  # Commands
@@ -71,6 +72,10 @@ stoobly_exec_run_env=$(source_env) && $(exec_env) CONTEXT_DIR="$(app_dir)"
71
72
  # Workflow run
72
73
  workflow_run=$(source_env) && bash "$(app_dir)/$(workflow_script)"
73
74
 
75
+ action/install:
76
+ $(eval action=install)
77
+ action/uninstall:
78
+ $(eval action=uninstall)
74
79
  ca-cert/install: stoobly/install
75
80
  @if [ -z "$$(ls $(ca_certs_dir) 2> /dev/null)" ]; then \
76
81
  read -p "Installing CA certificate is required for $(workflow)ing requests, continue? (y/N) " confirm && \
@@ -84,10 +89,6 @@ ca-cert/install: stoobly/install
84
89
  certs:
85
90
  @export EXEC_COMMAND=.mkcert && \
86
91
  $(stoobly_exec)
87
- command/install:
88
- $(eval COMMAND=install)
89
- command/uninstall:
90
- $(eval COMMAND=uninstall)
91
92
  exec/down:
92
93
  @$(stoobly_exec_env) EXEC_COMMAND=- EXEC_ARGS=- EXEC_OPTIONS=- $(exec_down)
93
94
  nameservers: tmpdir
@@ -179,7 +180,7 @@ workflow/down:
179
180
  $(stoobly_exec_run) && \
180
181
  $(workflow_run)
181
182
  workflow/hostname: stoobly/install
182
- @read -p "Do you want to $(COMMAND) hostname(s) in /etc/hosts? (y/N) " confirm && \
183
+ @read -p "Do you want to $(action) hostname(s) in /etc/hosts? (y/N) " confirm && \
183
184
  if [ "$$confirm" = "y" ] || [ "$$confirm" = "Y" ]; then \
184
185
  CURRENT_VERSION=$$(stoobly-agent --version); \
185
186
  REQUIRED_VERSION="1.4.0"; \
@@ -187,11 +188,11 @@ workflow/hostname: stoobly/install
187
188
  echo "stoobly-agent version $$REQUIRED_VERSION required. Please run: pipx upgrade stoobly-agent"; \
188
189
  exit 1; \
189
190
  fi; \
190
- echo "Running stoobly-agent scaffold hostname $(COMMAND) $(workflow_service_options)"; \
191
- stoobly-agent scaffold hostname $(COMMAND) --app-dir-path $(app_dir) --workflow $(workflow) $(workflow_service_options); \
191
+ echo "Running stoobly-agent scaffold hostname $(action) $(workflow_service_options)"; \
192
+ stoobly-agent scaffold hostname $(action) --app-dir-path $(app_dir) --workflow $(workflow) $(workflow_service_options); \
192
193
  fi
193
- workflow/hostname/install: command/install workflow/hostname
194
- workflow/hostname/uninstall: command/uninstall workflow/hostname
194
+ workflow/hostname/install: action/install workflow/hostname
195
+ workflow/hostname/uninstall: action/uninstall workflow/hostname
195
196
  workflow/logs:
196
197
  @export EXEC_COMMAND=.logs && \
197
198
  export EXEC_OPTIONS="$(workflow_log_options) $(workflow_run_options) $(options)" && \
@@ -6,6 +6,6 @@ services:
6
6
  service: stoobly_ui.base
7
7
  image: stoobly.${USER_ID}
8
8
  ports:
9
- - '4200:4200'
9
+ - '${APP_UI_PORT}:4200'
10
10
  profiles:
11
11
  - mock
@@ -6,7 +6,7 @@ services:
6
6
  service: stoobly_ui.base
7
7
  image: stoobly.${USER_ID}
8
8
  ports:
9
- - '4200:4200'
9
+ - '${APP_UI_PORT}:4200'
10
10
  profiles:
11
11
  - record
12
12
 
@@ -87,21 +87,22 @@ def hostname(ctx):
87
87
  help="Scaffold application"
88
88
  )
89
89
  @click.option('--app-dir-path', default=current_working_dir, help='Path to create the app scaffold.')
90
- @click.option('--force', is_flag=True, help='Overwrite maintained scaffolded app files.')
91
90
  @click.option('--network', help='App default network name. Defaults to app name.')
91
+ @click.option('--quiet', is_flag=True, help='Disable log output.')
92
+ @click.option('--ui-port', default=4200, type=click.IntRange(1, 65535), help='UI service port.')
92
93
  @click.argument('app_name')
93
94
  def create(**kwargs):
94
95
  __validate_app_dir(kwargs['app_dir_path'])
95
96
 
96
97
  app = App(kwargs['app_dir_path'], DOCKER_NAMESPACE)
97
98
 
98
- if kwargs['force'] or not os.path.exists(app.scaffold_namespace_path):
99
- if not kwargs['network']:
100
- kwargs['network'] = kwargs['app_name']
99
+ if not kwargs['quiet'] and os.path.exists(app.scaffold_namespace_path):
100
+ print(f"{kwargs['app_dir_path']} already exists, updating scaffold maintained files...")
101
101
 
102
- AppCreateCommand(app, **kwargs).build()
103
- else:
104
- print(f"{kwargs['app_dir_path']} already exists, use option '--force' to continue ")
102
+ if not kwargs['network']:
103
+ kwargs['network'] = kwargs['app_name']
104
+
105
+ AppCreateCommand(app, **kwargs).build()
105
106
 
106
107
  @app.command(
107
108
  help="Scaffold app service certs"
@@ -128,7 +129,6 @@ def mkcert(**kwargs):
128
129
  @click.option('--app-dir-path', default=current_working_dir, help='Path to application directory.')
129
130
  @click.option('--detached', is_flag=True, help='Use isolated and non-persistent context directory.')
130
131
  @click.option('--env', multiple=True, help='Specify an environment variable.')
131
- @click.option('--force', is_flag=True, help='Overwrite maintained scaffolded service files.')
132
132
  @click.option('--hostname', help='Service hostname.')
133
133
  @click.option('--port', type=click.IntRange(1, 65535), help='Service port.')
134
134
  @click.option('--priority', default=5, type=click.FloatRange(1.0, 9.0), help='Determines the service run order. Lower values run first.')
@@ -138,6 +138,7 @@ def mkcert(**kwargs):
138
138
  upstream proxy modes, SPEC is host specification in
139
139
  the form of "http[s]://host[:port]".
140
140
  ''')
141
+ @click.option('--quiet', is_flag=True, help='Disable log output.')
141
142
  @click.option('--scheme', type=click.Choice(['http', 'https']), help='Defaults to https if hostname is set.')
142
143
  @click.option('--workflow', multiple=True, type=click.Choice([WORKFLOW_MOCK_TYPE, WORKFLOW_RECORD_TYPE, WORKFLOW_TEST_TYPE]), help='Include pre-defined workflows.')
143
144
  @click.argument('service_name')
@@ -155,12 +156,12 @@ def create(**kwargs):
155
156
  __validate_proxy_mode(kwargs.get("proxy_mode"))
156
157
 
157
158
  app = App(kwargs['app_dir_path'], DOCKER_NAMESPACE)
158
-
159
159
  service = Service(kwargs['service_name'], app)
160
- if kwargs['force'] or not os.path.exists(service.dir_path):
161
- __scaffold_build(app, **kwargs)
162
- else:
163
- print(f"{service.dir_path} already exists, use option '--force' to continue")
160
+
161
+ if not kwargs['quiet'] and os.path.exists(service.dir_path):
162
+ print(f"{service.dir_path} already exists, updating scaffold maintained files...")
163
+
164
+ __scaffold_build(app, **kwargs)
164
165
 
165
166
  @service.command(
166
167
  help="List services",
@@ -271,7 +272,7 @@ def update(**kwargs):
271
272
  )
272
273
  @click.option('--app-dir-path', default=current_working_dir, help='Path to application directory.')
273
274
  @click.option('--context-dir-path', default=data_dir.context_dir_path, help='Path to Stoobly data directory.')
274
- @click.option('--force', is_flag=True, help='Overwrite maintained scaffolded workflow files.')
275
+ @click.option('--quiet', is_flag=True, help='Disable log output.')
275
276
  @click.option('--service', multiple=True, help='Specify the service(s) to create the workflow for.')
276
277
  @click.option('--template', required=True, type=click.Choice([WORKFLOW_MOCK_TYPE, WORKFLOW_RECORD_TYPE, WORKFLOW_TEST_TYPE]), help='Select which workflow to use as a template.')
277
278
  @click.argument('workflow_name')
@@ -289,10 +290,11 @@ def create(**kwargs):
289
290
  __validate_service_dir(service.dir_path)
290
291
 
291
292
  workflow_dir_path = service.workflow_dir_path(kwargs['workflow_name'])
292
- if kwargs['force'] or not os.path.exists(workflow_dir_path):
293
- __workflow_create(app, **config)
294
- else:
295
- print(f"{workflow_dir_path} already exists, use option '--force' to continue")
293
+
294
+ if not kwargs['quiet'] and os.path.exists(workflow_dir_path):
295
+ print(f"{workflow_dir_path} already exists, updating scaffold maintained files...")
296
+
297
+ __workflow_create(app, **config)
296
298
 
297
299
  @workflow.command(
298
300
  help="Copy a workflow for service(s)",
@@ -508,7 +510,7 @@ def up(**kwargs):
508
510
 
509
511
  # Gateway ports are dynamically set depending on the workflow run
510
512
  workflow = Workflow(kwargs['workflow_name'], app)
511
- configure_gateway(workflow.service_paths_from_services(services), kwargs['no_publish'])
513
+ configure_gateway(workflow.workflow_name, workflow.service_paths_from_services(services), kwargs['no_publish'])
512
514
 
513
515
  commands: List[WorkflowRunCommand] = []
514
516
  for service in services:
@@ -674,12 +676,12 @@ scaffold.add_command(hostname)
674
676
  def __build_script(**kwargs):
675
677
  script_path = kwargs['script_path']
676
678
  if not script_path:
677
- script_file_name = f"{kwargs['workflow_name']}.sh"
678
- script_path = os.path.join(data_dir.tmp_dir_path, script_file_name)
679
- else:
680
- script_dir = os.path.dirname(script_path)
681
- if not os.path.exists(script_dir):
682
- os.makedirs(script_dir, exist_ok=True)
679
+ script_file_name = 'run.sh'
680
+ script_path = os.path.join(data_dir.tmp_dir_path, kwargs['workflow_name'], script_file_name)
681
+
682
+ script_dir = os.path.dirname(script_path)
683
+ if not os.path.exists(script_dir):
684
+ os.makedirs(script_dir, exist_ok=True)
683
685
 
684
686
  # Truncate
685
687
  with open(script_path, 'w'):
@@ -161,7 +161,7 @@ def prune(**kwargs):
161
161
  )
162
162
  @click.option('--format', type=click.Choice(FORMATS), help='Format output.')
163
163
  @click.option('--select', multiple=True, help='Select column(s) to display.')
164
- @click.option('--verify', is_flag=True, default=False)
164
+ @click.option('--no-verify', is_flag=True, default=False)
165
165
  @click.option('--without-headers', is_flag=True, default=False, help='Disable printing column headers.')
166
166
  @click.argument('uuid')
167
167
  def update(**kwargs):
@@ -179,7 +179,7 @@ def update(**kwargs):
179
179
  print(f"Error: {kwargs['uuid']} not found", file=sys.stderr)
180
180
  sys.exit(1)
181
181
 
182
- if kwargs['verify']:
182
+ if not kwargs['no_verify']:
183
183
  if event.is_request():
184
184
  snapshot: RequestSnapshot = event.snapshot()
185
185
  __verify_request(snapshot)
stoobly_agent/cli.py CHANGED
@@ -115,12 +115,12 @@ def init(**kwargs):
115
115
  upstream proxy modes, SPEC is host specification in
116
116
  the form of "http[s]://host[:port]".
117
117
  ''')
118
- @click.option('--proxy-port', default=8080, help='Proxy service port.')
118
+ @click.option('--proxy-port', default=8080, type=click.IntRange(1, 65535), help='Proxy service port.')
119
119
  @click.option('--public-directory-path', help='Path to public files. Used for mocking requests.')
120
120
  @click.option('--response-fixtures-path', help='Path to response fixtures yaml. Used for mocking requests.')
121
121
  @click.option('--ssl-insecure', is_flag=True, default=False, help='Do not verify upstream server SSL/TLS certificates.')
122
122
  @click.option('--ui-host', default='0.0.0.0', help='Address to bind UI to.')
123
- @click.option('--ui-port', default=4200, help='UI service port.')
123
+ @click.option('--ui-port', default=4200, type=click.IntRange(1, 65535), help='UI service port.')
124
124
  def run(**kwargs):
125
125
  from .app.proxy.run import run as run_proxy
126
126
 
@@ -15,7 +15,7 @@ class ScaffoldCliInvoker():
15
15
 
16
16
  result = runner.invoke(scaffold, ['app', 'create',
17
17
  '--app-dir-path', app_dir_path,
18
- '--force',
18
+ '--quiet',
19
19
  app_name
20
20
  ])
21
21
 
@@ -45,10 +45,10 @@ class ScaffoldCliInvoker():
45
45
  result = runner.invoke(scaffold, ['service', 'create',
46
46
  '--app-dir-path', app_dir_path,
47
47
  '--env', 'TEST',
48
- '--force',
49
48
  '--hostname', hostname,
50
49
  '--scheme', scheme,
51
50
  '--port', port,
51
+ '--quiet',
52
52
  '--workflow', 'mock',
53
53
  '--workflow', 'record',
54
54
  '--workflow', 'test',
@@ -70,12 +70,12 @@ class ScaffoldCliInvoker():
70
70
 
71
71
  result = runner.invoke(scaffold, ['service', 'create',
72
72
  '--app-dir-path', app_dir_path,
73
- '--force',
74
73
  '--hostname', hostname,
75
74
  '--scheme', scheme,
76
75
  '--port', port,
77
76
  '--proxy-mode', proxy_mode_reverse_spec,
78
77
  '--detached',
78
+ '--quiet',
79
79
  '--workflow', 'test',
80
80
  service_name
81
81
  ])
@@ -94,7 +94,7 @@ class TestUpdate():
94
94
  def updated_event(self, runner: CliRunner, put_event: LogEvent):
95
95
  time.sleep(1) # Simulate update at different time
96
96
 
97
- apply_result = runner.invoke(snapshot, ['update', '--verify', put_event.uuid])
97
+ apply_result = runner.invoke(snapshot, ['update', put_event.uuid])
98
98
  assert apply_result.exit_code == 0
99
99
  log = Log()
100
100
  events = log.events
@@ -1 +1 @@
1
- 1.9.3
1
+ 1.9.4
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: stoobly-agent
3
- Version: 1.9.3
3
+ Version: 1.9.5
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=vWRmKJsuKpHHO4MRnGJ8EzKAw6gjkI7dsgVj0IsJ-DA,44
1
+ stoobly_agent/__init__.py,sha256=IIieB06ghDX3rkbVoznhopSYzZNIgt8A-_fJzdVS7i4,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=Vvz53yB0bR7J-QqMAkLlhcZrA4P64ZEN7w8cMbgl6o0,5261
@@ -69,11 +69,11 @@ stoobly_agent/app/cli/request_cli.py,sha256=THNloW111l9MLE0oPg4y7hVXL1U7OXoz760g
69
69
  stoobly_agent/app/cli/scaffold/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
70
70
  stoobly_agent/app/cli/scaffold/app.py,sha256=bgNc_dWZtgkuDAkS9aHSCMxCrjX907Phlfb2bOasswI,3435
71
71
  stoobly_agent/app/cli/scaffold/app_command.py,sha256=sliaYulMNmaxbRXpJIDtBDWEBGEv5Tht4rpErzC_xxw,2368
72
- stoobly_agent/app/cli/scaffold/app_config.py,sha256=Gs-BynV1vY7_PpTOenn2mqc7lBIu0vBx6as9vtEU1sk,818
73
- stoobly_agent/app/cli/scaffold/app_create_command.py,sha256=sy4017eiir9MK0TEbTi1NyG9mhOGlenGGVnq0GsGUrQ,966
72
+ stoobly_agent/app/cli/scaffold/app_config.py,sha256=UGVJ7DVmXh-o_gYBlAAEjngNIUZPQUiXXk2oMStcsPg,1075
73
+ stoobly_agent/app/cli/scaffold/app_create_command.py,sha256=0ogYliGbq1PYP5rFs-ML33q_Z4t_rAgPWjhk7rhnGw0,1153
74
74
  stoobly_agent/app/cli/scaffold/command.py,sha256=aoTsdkkBzyu7TkVSMdNQQGk0Gj874jNgFcjR14y3TuM,254
75
75
  stoobly_agent/app/cli/scaffold/config.py,sha256=HZU5tkvr3dkPr4JMXZtrJlu2wxxO-134Em6jReFFcq0,688
76
- stoobly_agent/app/cli/scaffold/constants.py,sha256=VEd8bXG6u919cmc9wGtxVQhoHzrRP2KLH0ZTjlDiUxI,2384
76
+ stoobly_agent/app/cli/scaffold/constants.py,sha256=dpCGvKzNtGQyaZfghfy0F6bJsZNp1KPACX3Z3rd13sw,2416
77
77
  stoobly_agent/app/cli/scaffold/containerized_app.py,sha256=dAjn4RwcZV3aEL0POUmrbF_DC-r9h6s1zx7gT2t45v0,175
78
78
  stoobly_agent/app/cli/scaffold/docker/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
79
79
  stoobly_agent/app/cli/scaffold/docker/app_builder.py,sha256=7z5pk5JKlRDHx2USxY-WurttLyyUkIVYfl34_u1x9dE,501
@@ -82,7 +82,7 @@ stoobly_agent/app/cli/scaffold/docker/constants.py,sha256=1khQdgTaQ89ykGRNdTQh_e
82
82
  stoobly_agent/app/cli/scaffold/docker/service/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
83
83
  stoobly_agent/app/cli/scaffold/docker/service/build_decorator.py,sha256=ZU7z4bkvdS3OK5O4fJhlA9_PNwnFtZW6t7vNF7V5obQ,1003
84
84
  stoobly_agent/app/cli/scaffold/docker/service/builder.py,sha256=4cIMSYvgrkGWVuuYymiwlrR829O91qQl9ML8FhaDMj4,5857
85
- stoobly_agent/app/cli/scaffold/docker/service/configure_gateway.py,sha256=avGKpxOTXtIvFguSAaihxQwRzUm6I7UfeZ9_WzvwXuA,3733
85
+ stoobly_agent/app/cli/scaffold/docker/service/configure_gateway.py,sha256=jtx8lhvKHl0ubSHaQpE8m9lCYnOJ6Qju-SBJPBs0l7I,3921
86
86
  stoobly_agent/app/cli/scaffold/docker/service/types.py,sha256=qB-yYHlu-PZDc0HYgTUvE5bWNpHxaSThC3JUG8okR1k,88
87
87
  stoobly_agent/app/cli/scaffold/docker/workflow/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
88
88
  stoobly_agent/app/cli/scaffold/docker/workflow/build_decorator.py,sha256=VKD9hXbJGRIWHS5IeYXeX0-FQ0F43zG8VmsegL6eYwA,703
@@ -104,7 +104,7 @@ stoobly_agent/app/cli/scaffold/service_workflow.py,sha256=sQ_Edy_wGHKMXpD0DmhnOW
104
104
  stoobly_agent/app/cli/scaffold/service_workflow_validate_command.py,sha256=xONRUtfC3IBd-Kr4wdUKWgx9ppSsbu2H72pb2VinizQ,11412
105
105
  stoobly_agent/app/cli/scaffold/templates/__init__.py,sha256=x8C_a0VoO_vUbosp4_6IC1U7Ge9NnUdVKDPpVMtMkeY,171
106
106
  stoobly_agent/app/cli/scaffold/templates/app/.Dockerfile.context,sha256=Okk4Q0Fj7Wi5NU58gQfpjpFwAL3RUBJyRe56kteQfcA,158
107
- stoobly_agent/app/cli/scaffold/templates/app/.Makefile,sha256=m89dz5LDaG5MXiBdBb9lxi6pAP90JOipNwS_EK9kGOs,9124
107
+ stoobly_agent/app/cli/scaffold/templates/app/.Makefile,sha256=zifPWDDZ9RPz0p872Kl00pnmFY3jMHulp84tYXhfSwg,9240
108
108
  stoobly_agent/app/cli/scaffold/templates/app/.docker-compose.base.yml,sha256=6tFqXh3ine8vaD0FCL5TMoY5NjKx2wLUR8XpW3tJtew,245
109
109
  stoobly_agent/app/cli/scaffold/templates/app/.docker-compose.networks.yml,sha256=I4PbJpQjFHb5IbAUWNvYM6okDEtmwtKFDQg-yog05WM,141
110
110
  stoobly_agent/app/cli/scaffold/templates/app/Makefile,sha256=TEmPG7Bf0KZOnmfsgdzza3UdwcVMmM5Lj1YdLc4cgjA,79
@@ -144,8 +144,8 @@ stoobly_agent/app/cli/scaffold/templates/app/gateway/test/.docker-compose.test.y
144
144
  stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/.config.yml,sha256=XnLQZMzzMMIwVycjyPN5QXsmRztkTFAna1kIHYuDfJQ,19
145
145
  stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/.docker-compose.base.yml,sha256=bxrtZqf3YtaJCukzScslh5PgWC5q8xkGIP1wKJf33LA,111
146
146
  stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/exec/.docker-compose.exec.yml,sha256=JN89sU5uRf6YqHvN_O63K8rwQIAPJHbhFDLFmuUjKNM,304
147
- stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/mock/.docker-compose.mock.yml,sha256=FnCn64DjxyAiB2P_1JUwFmXslMR961nVZHkYiEXytlg,232
148
- stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/record/.docker-compose.record.yml,sha256=t34FNYZboJSfrKnIB2oJ3UuE_mJaW77-hcbSn3sfWec,235
147
+ stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/mock/.docker-compose.mock.yml,sha256=2wg-YArlQVjat-bin_PLOnULQJW7mOmZjP7CFp6Knbs,242
148
+ stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/record/.docker-compose.record.yml,sha256=yDw8OSX7rFsW6J51K5Qf33qM-isGL8V4xPAYayIfnvQ,245
149
149
  stoobly_agent/app/cli/scaffold/templates/build/services/build/mock/.configure,sha256=SKvht2K_3tW08K24rl8_j0jMYOhq1k-GsVwhoHwjxYA,337
150
150
  stoobly_agent/app/cli/scaffold/templates/build/services/build/mock/.init,sha256=ecmyS6EZpa3op0CmO7bvd3pmAwRb0oLwj1qsTkee9_o,247
151
151
  stoobly_agent/app/cli/scaffold/templates/build/services/build/record/.configure,sha256=eXp9eKJ-TORE5B0zLW4-t43ogS3nxtj2SmSeDALbi1U,278
@@ -203,9 +203,9 @@ stoobly_agent/app/cli/scaffold/workflow_env.py,sha256=x8V5pJmIiklD3f2q2-qq-CORf4
203
203
  stoobly_agent/app/cli/scaffold/workflow_log_command.py,sha256=Bke4lMOMxuDUFuAx9nlXHbKgYMO4KAg9ASHvjz4aVWc,1372
204
204
  stoobly_agent/app/cli/scaffold/workflow_run_command.py,sha256=eF3aaK4OIZXYuSBEAeBnhAL7EZrS1G4mSYrJbEiXt2o,11082
205
205
  stoobly_agent/app/cli/scaffold/workflow_validate_command.py,sha256=Uo_yo6rVR1ZR7xpvsQvlH48AyMBVLRupd4G-bRjzm_Q,5584
206
- stoobly_agent/app/cli/scaffold_cli.py,sha256=DFGhuCV_vugJj2o_44dypYOIwX-IY5LRWuNt3sImcfY,31946
206
+ stoobly_agent/app/cli/scaffold_cli.py,sha256=NXlLuqAwv9p0dflksswAtgJPTfojvJDDHIdJ71-BCSE,31965
207
207
  stoobly_agent/app/cli/scenario_cli.py,sha256=3J1EiJOvunkfWrEkOsanw-XrKkOk78ij_GjBlE9p7CE,8229
208
- stoobly_agent/app/cli/snapshot_cli.py,sha256=Uf6g6ivsD0hUY8G99eU0fxzS3FymncAhI70PxV7Uaac,11919
208
+ stoobly_agent/app/cli/snapshot_cli.py,sha256=1Dw5JgDlmG6vctrawIRO7CdB73vAQk_wRBnPG2lVOrQ,11929
209
209
  stoobly_agent/app/cli/trace_cli.py,sha256=K7E-vx3JUcqEDSWOdIOi_AieKNQz7dBfmRrVvKDkzFI,4605
210
210
  stoobly_agent/app/cli/types/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
211
211
  stoobly_agent/app/cli/types/output.py,sha256=2wazv56g5IwLQeJCWfJXXAxTB9Y5WH1cKMHbpjbXNeo,439
@@ -415,7 +415,7 @@ stoobly_agent/app/settings/types/remote_settings.py,sha256=4PvEGKULXM0zv29XTDzV7
415
415
  stoobly_agent/app/settings/types/ui_settings.py,sha256=BqPy2F32AbODqzi2mp2kRk28QVUydQIwVmvftn46pco,84
416
416
  stoobly_agent/app/settings/ui_settings.py,sha256=YDEUMPuJFh0SLHaGz6O-Gpz8nwsunNzeuc-TzO9OUbM,1170
417
417
  stoobly_agent/app/settings/url_rule.py,sha256=Qx7YrIpVRSC-4LeNiCAfCtE50Jou4423hojMW-4qUYg,954
418
- stoobly_agent/cli.py,sha256=sw8Ke5mCvzQ50X-zsb2Ld_zW4T6S58P0fN5GyKNOrcQ,10255
418
+ stoobly_agent/cli.py,sha256=FS-V4gkzDE4PgXokqvWV7cFzWq5v6WNMro6B5Mi9E-4,10317
419
419
  stoobly_agent/config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
420
420
  stoobly_agent/config/constants/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
421
421
  stoobly_agent/config/constants/alias_resolve_strategy.py,sha256=_R1tVqFnyGxCraVS5-dhSskaDj_X8-NthsY7i_bEt9M,119
@@ -677,7 +677,7 @@ stoobly_agent/test/app/cli/request/request_reset_test.py,sha256=5My6Z452eideAOUu
677
677
  stoobly_agent/test/app/cli/request/request_response_test.py,sha256=Fu-A8tIn016DKme4WIaPzo3YeFY-CPtTOpaSFigUVVM,1263
678
678
  stoobly_agent/test/app/cli/request/request_snapshot_test.py,sha256=3kMmv0CuvnMXLgDQA-_u9S1DIiNOdL63L-IptVuOpf8,6308
679
679
  stoobly_agent/test/app/cli/request/request_test_test.py,sha256=-cJNXKjgryVVfVt-7IN5fIhBwe3NjFoPmeavDH8lAjU,5527
680
- stoobly_agent/test/app/cli/scaffold/cli_invoker.py,sha256=_nGDLUsYxqkeqs5DdhvAeXy3IuotpgqKHXKVzu6GDF4,3700
680
+ stoobly_agent/test/app/cli/scaffold/cli_invoker.py,sha256=ZOFeLh9TejJ_k3gQ0KC6iIuqKhwrkqZV5U7CMdRDnwM,3700
681
681
  stoobly_agent/test/app/cli/scaffold/cli_test.py,sha256=sMNvO845MIu5DVGa1HmwXQDmKDcwrfNTdEb3fK5886w,4557
682
682
  stoobly_agent/test/app/cli/scaffold/e2e_test.py,sha256=IGWT0EXrMtB8i8kdLFbN7O8NvLrJYTi-iQ_GRiUoA94,12978
683
683
  stoobly_agent/test/app/cli/scaffold/hosts_file_manager_test.py,sha256=ztcPh1x0ZCW1FWA5YL4ulEVjfbW9TOPgk1bnSDPNmCw,2287
@@ -692,7 +692,7 @@ stoobly_agent/test/app/cli/snapshot/snapshot_apply_test.py,sha256=mpkTZx8eaFFZU_
692
692
  stoobly_agent/test/app/cli/snapshot/snapshot_copy_test.py,sha256=Yg78-FhSiG_r6Jpm-sN8sn0LjVXTwTOXt6hg8ni2GIY,1953
693
693
  stoobly_agent/test/app/cli/snapshot/snapshot_migrate_test.py,sha256=voEvblK6CMGCrSJDTHVmkUkLXj0auNb78jxlGiiBBQQ,7370
694
694
  stoobly_agent/test/app/cli/snapshot/snapshot_prune_test.py,sha256=bn4yUU7Eb4-6GnwnRaPZPi5Cn7XEaIsrJ_mB7jydgWw,6693
695
- stoobly_agent/test/app/cli/snapshot/snapshot_update_test.py,sha256=fILsX2M5j4wuLRP6LJTHe4CPB8gvaEbsSoYmFCHmKVk,4514
695
+ stoobly_agent/test/app/cli/snapshot/snapshot_update_test.py,sha256=yx_QDPYc5utiqlRhy3hTGBKLafGq9nC_lDV-0k0qWOo,4502
696
696
  stoobly_agent/test/app/models/adapters/joined_rquest_adapter_test.py,sha256=bF7WMrAiASQDNzDTvIXGJhsWLNhfYOmdQpSDo0hyWYY,1098
697
697
  stoobly_agent/test/app/models/adapters/orm/joined_request_string_adapter_test.py,sha256=a2IHTk3l7aiLyYF7vtqissrk0MFTF2wlUBiaKWyJKfU,2667
698
698
  stoobly_agent/test/app/models/adapters/orm/request/orm_mitmproxy_request_adapter_test.py,sha256=PbJsAaxPUEbF9vM7DX4z858biWf4qlGnvE8KBuy8SgY,2763
@@ -708,7 +708,7 @@ stoobly_agent/test/app/models/factories/resource/local_db/helpers/log_test.py,sh
708
708
  stoobly_agent/test/app/models/factories/resource/local_db/helpers/tiebreak_scenario_request_test.py,sha256=a1SFLyEyRRLuADvAw6ckQQKORFXvyK1lyrbkaLWx8oU,3399
709
709
  stoobly_agent/test/app/models/factories/resource/local_db/request_adapter_test.py,sha256=Pzq1cBPnP9oSWG-p0c-VoymoHxgp483QmNwmV1b78RA,8453
710
710
  stoobly_agent/test/app/models/factories/resource/local_db/response_adapter_test.py,sha256=9P95EKH5rZGOrmRkRIDlQZqtiLJHk9735og18Ffwpfw,2204
711
- stoobly_agent/test/app/models/schemas/.stoobly/db/VERSION,sha256=JyvJHgCQJn-THkr7jL9H-s1Ea2VWcQz-X3BiHK64uxk,6
711
+ stoobly_agent/test/app/models/schemas/.stoobly/db/VERSION,sha256=MvlkhO5KUUDkZHqygfa1PgGkfddFw7TZAu1qTt_cq-g,5
712
712
  stoobly_agent/test/app/models/schemas/.stoobly/db/stoobly_agent.sqlite3,sha256=ch8gNx6zIelLKQx65gwFx_LRNqUD3EC5xcHZ0ukIQiU,188416
713
713
  stoobly_agent/test/app/models/schemas/.stoobly/settings.yml,sha256=vLwMjweKOdod6tSLtIlyBefPQuNXq9wio4kBaODKtAU,726
714
714
  stoobly_agent/test/app/models/schemas/.stoobly/tmp/options.json,sha256=OTRzarwus48CTrItedXCrgQttJHSEZonEYc7R_knvYg,2212
@@ -749,8 +749,8 @@ stoobly_agent/test/mock_data/scaffold/docker-compose-local-service.yml,sha256=1W
749
749
  stoobly_agent/test/mock_data/scaffold/index.html,sha256=qJwuYajKZ4ihWZrJQ3BNObV5kf1VGnnm_vqlPJzdqLE,258
750
750
  stoobly_agent/test/mock_data/uspto.yaml,sha256=6U5se7C3o-86J4m9xpOk9Npias399f5CbfWzR87WKwE,7835
751
751
  stoobly_agent/test/test_helper.py,sha256=m_oAI7tmRYCNZdKfNqISWhMv3e44tjeYViQ3nTUfnos,1007
752
- stoobly_agent-1.9.3.dist-info/LICENSE,sha256=o93sj12cdoEOsTCjPaPFsw3Xq0SXs3pPcY-9reE2sEw,548
753
- stoobly_agent-1.9.3.dist-info/METADATA,sha256=2T7T6OEFqeOhMH4V-af3VMftzxq-mIRn-nOcFd6-Crc,3087
754
- stoobly_agent-1.9.3.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
755
- stoobly_agent-1.9.3.dist-info/entry_points.txt,sha256=aq5wix5oC8MDQtmyPGU0xaFrsjJg7WH28NmXh2sc3Z8,56
756
- stoobly_agent-1.9.3.dist-info/RECORD,,
752
+ stoobly_agent-1.9.5.dist-info/LICENSE,sha256=o93sj12cdoEOsTCjPaPFsw3Xq0SXs3pPcY-9reE2sEw,548
753
+ stoobly_agent-1.9.5.dist-info/METADATA,sha256=Ar6dgljQ63YgEG_psjAkNEVUpGuRpudvTxCY4fAebgQ,3087
754
+ stoobly_agent-1.9.5.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
755
+ stoobly_agent-1.9.5.dist-info/entry_points.txt,sha256=aq5wix5oC8MDQtmyPGU0xaFrsjJg7WH28NmXh2sc3Z8,56
756
+ stoobly_agent-1.9.5.dist-info/RECORD,,