stoobly-agent 1.5.4__py3-none-any.whl → 1.5.6__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 (34) hide show
  1. stoobly_agent/__init__.py +1 -1
  2. stoobly_agent/app/cli/ca_cert_cli.py +7 -6
  3. stoobly_agent/app/cli/helpers/certificate_authority.py +1 -1
  4. stoobly_agent/app/cli/scaffold/app.py +1 -1
  5. stoobly_agent/app/cli/scaffold/containerized_app.py +5 -0
  6. stoobly_agent/app/cli/scaffold/docker/builder.py +4 -4
  7. stoobly_agent/app/cli/scaffold/docker/constants.py +1 -1
  8. stoobly_agent/app/cli/scaffold/templates/app/.Makefile +11 -11
  9. stoobly_agent/app/cli/scaffold/templates/app/.docker-compose.base.yml +1 -6
  10. stoobly_agent/app/cli/scaffold/templates/app/entrypoint/mock/bin/.configure +2 -2
  11. stoobly_agent/app/cli/scaffold/templates/app/entrypoint/record/bin/.configure +2 -2
  12. stoobly_agent/app/cli/scaffold/templates/app/entrypoint/test/bin/.configure +2 -2
  13. stoobly_agent/app/cli/scaffold/templates/app/gateway/mock/.docker-compose.mock.yml +2 -2
  14. stoobly_agent/app/cli/scaffold/templates/app/gateway/record/.docker-compose.record.yml +2 -2
  15. stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/.docker-compose.base.yml +1 -1
  16. stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/exec/bin/.down +2 -3
  17. stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/exec/bin/.logs +1 -3
  18. stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/exec/bin/.up +4 -7
  19. stoobly_agent/app/cli/scaffold/templates/workflow/record/bin/configure +2 -2
  20. stoobly_agent/app/cli/scaffold_cli.py +86 -50
  21. stoobly_agent/app/proxy/run.py +4 -0
  22. stoobly_agent/cli.py +2 -2
  23. stoobly_agent/config/data_dir.py +15 -47
  24. stoobly_agent/config/mitmproxy.py +0 -17
  25. stoobly_agent/test/app/cli/helpers/certificate_authority_test.py +1 -2
  26. stoobly_agent/test/app/models/schemas/.stoobly/db/VERSION +1 -1
  27. stoobly_agent/test/config/data_dir_test.py +1 -10
  28. stoobly_agent/test/mock_data/scaffold/docker-compose-local-service.yml +2 -2
  29. {stoobly_agent-1.5.4.dist-info → stoobly_agent-1.5.6.dist-info}/METADATA +1 -1
  30. {stoobly_agent-1.5.4.dist-info → stoobly_agent-1.5.6.dist-info}/RECORD +33 -33
  31. {stoobly_agent-1.5.4.dist-info → stoobly_agent-1.5.6.dist-info}/WHEEL +1 -1
  32. stoobly_agent/config/constants/mitmproxy.py +0 -4
  33. {stoobly_agent-1.5.4.dist-info → stoobly_agent-1.5.6.dist-info}/LICENSE +0 -0
  34. {stoobly_agent-1.5.4.dist-info → stoobly_agent-1.5.6.dist-info}/entry_points.txt +0 -0
stoobly_agent/__init__.py CHANGED
@@ -1,2 +1,2 @@
1
1
  COMMAND = 'stoobly-agent'
2
- VERSION = '1.5.4'
2
+ VERSION = '1.5.6'
@@ -15,13 +15,13 @@ def ca_cert(ctx):
15
15
  pass
16
16
 
17
17
  @ca_cert.command()
18
- @click.option('--ca-certs-dir-path', default=DataDir.instance().mitmproxy_conf_dir_path, help='Path to ca certs directory used to sign SSL certs. Defaults to ~/.mitmproxy')
18
+ @click.option('--ca-certs-dir-path', default=DataDir.instance().ca_certs_dir_path, help='Path to ca certs directory used to sign SSL certs.')
19
19
  @click.option('--certs-dir-path', default=DataDir.instance().certs_dir_path, help='Output directory.')
20
20
  @click.argument('hostname')
21
21
  def mkcert(**kwargs):
22
- mitmproxy_ca_certs_dir = kwargs['ca_certs_dir_path']
22
+ ca_certs_dir_path = kwargs['ca_certs_dir_path']
23
23
 
24
- installer = CertificateAuthority(mitmproxy_ca_certs_dir)
24
+ installer = CertificateAuthority(ca_certs_dir_path)
25
25
 
26
26
  try:
27
27
  installer.sign(kwargs['hostname'], kwargs['certs_dir_path'])
@@ -30,10 +30,11 @@ def mkcert(**kwargs):
30
30
  sys.exit(1)
31
31
 
32
32
  @ca_cert.command()
33
- @click.option('--ca-certs-dir-path', default=DataDir.instance().mitmproxy_conf_dir_path, help='Path to ca certs directory.')
33
+ @click.option('--ca-certs-dir-path', default=DataDir.instance().ca_certs_dir_path, help='Path to ca certs directory.')
34
34
  def install(**kwargs):
35
- mitmproxy_ca_certs_dir = kwargs['ca_certs_dir_path']
36
- installer = CertificateAuthority(mitmproxy_ca_certs_dir)
35
+ pdb.set_trace()
36
+ ca_certs_dir_path = kwargs['ca_certs_dir_path']
37
+ installer = CertificateAuthority(ca_certs_dir_path)
37
38
 
38
39
  try:
39
40
  installer.install()
@@ -21,7 +21,7 @@ MITMPROXY_CN = 'mitmproxy'
21
21
 
22
22
  class CertificateAuthority():
23
23
 
24
- def __init__(self, certs_dir = DataDir.instance().mitmproxy_conf_dir_path, cn = MITMPROXY_CN):
24
+ def __init__(self, certs_dir = DataDir.instance().ca_certs_dir_path, cn = MITMPROXY_CN):
25
25
  self.certs_dir = certs_dir
26
26
  self.cn = cn
27
27
  self.key_size = 2048
@@ -10,7 +10,7 @@ class App():
10
10
  data_dir: DataDir = DataDir.instance(path)
11
11
 
12
12
  self.__data_dir_path = data_dir.path
13
- self.__ca_certs_dir_path = kwargs.get('ca_certs_dir_path') or data_dir.mitmproxy_conf_dir_path
13
+ self.__ca_certs_dir_path = kwargs.get('ca_certs_dir_path') or data_dir.ca_certs_dir_path
14
14
  self.__certs_dir_path = kwargs.get('certs_dir_path') or data_dir.certs_dir_path
15
15
  self.__context_dir_path = kwargs.get('context_dir_path') or data_dir.context_dir_path
16
16
  self.__data_dir = data_dir
@@ -0,0 +1,5 @@
1
+ from .app import App
2
+
3
+ class ContainerizedApp(App):
4
+ def __init__(self, path: str, scaffold_namespace: str, **kwargs):
5
+ super().__init__(path, scaffold_namespace, **kwargs)
@@ -3,7 +3,7 @@ import pathlib
3
3
  import pdb
4
4
  import yaml
5
5
 
6
- from .constants import APP_NETWORK, DOCKER_COMPOSE_CUSTOM, GATEWAY_NETWORK
6
+ from .constants import APP_NETWORK, APP_NETWORK_NAME, DOCKER_COMPOSE_CUSTOM
7
7
 
8
8
  class Builder():
9
9
 
@@ -36,11 +36,11 @@ class Builder():
36
36
 
37
37
  @property
38
38
  def public_network(self):
39
- return self.__networks.get(GATEWAY_NETWORK)
39
+ return self.__networks.get(APP_NETWORK_NAME)
40
40
 
41
41
  @property
42
42
  def public_network_name(self):
43
- return GATEWAY_NETWORK
43
+ return APP_NETWORK_NAME
44
44
 
45
45
  @property
46
46
  def networks(self):
@@ -91,7 +91,7 @@ class Builder():
91
91
  return self
92
92
 
93
93
  def with_public_network(self, network = APP_NETWORK):
94
- self.__networks[GATEWAY_NETWORK] = {
94
+ self.__networks[APP_NETWORK_NAME] = {
95
95
  'external': True,
96
96
  'name': network,
97
97
  }
@@ -1,10 +1,10 @@
1
+ APP_NETWORK_NAME = 'app'
1
2
  APP_NETWORK = '${APP_NETWORK}'
2
3
  DOCKER_COMPOSE_BASE = '.docker-compose.base.yml'
3
4
  DOCKER_COMPOSE_BASE_TEMPLATE = '.docker-compose.base.template.yml'
4
5
  DOCKER_COMPOSE_CUSTOM = 'docker-compose.yml'
5
6
  DOCKERFILE_CONTEXT = '.Dockerfile.context'
6
7
  DOCKERFILE_SERVICE = 'Dockerfile.source'
7
- GATEWAY_NETWORK = 'gateway'
8
8
 
9
9
  # TODO: add scaffold container name templates here
10
10
 
@@ -16,22 +16,22 @@ CONTEXT_DIR_DEFAULT := $(realpath $(DIR)/../..)
16
16
 
17
17
  # Configuration
18
18
  app_dir=$$(realpath "$${STOOBLY_APP_DIR:-$(CONTEXT_DIR_DEFAULT)}")
19
- ca_certs_dir=$$(realpath "$${STOOBLY_CA_CERTS_DIR:-$$(realpath ~)/.mitmproxy}")
19
+ ca_certs_dir=$$(realpath "$${STOOBLY_CA_CERTS_DIR:-$(app_data_dir)/ca_certs}")
20
20
  certs_dir=$$(realpath "$${STOOBLY_CERTS_DIR:-$(app_data_dir)/certs}")
21
21
  context_dir=$$(realpath "$${STOOBLY_CONTEXT_DIR:-$(CONTEXT_DIR_DEFAULT)}")
22
+ workflow_service_options=$(shell echo $$STOOBLY_WORKFLOW_SERVICE_OPTIONS)
22
23
 
23
24
  user_id_option=--user-id $(USER_ID)
24
25
  stoobly_exec_options=--profile $(EXEC_WORKFLOW_NAME) -p $(EXEC_WORKFLOW_NAME)
25
- workflow_down_options=$(user_id_option)
26
- workflow_service_options=$(shell echo $$STOOBLY_WORKFLOW_SERVICE_OPTIONS)
27
- workflow_up_options=--app-dir-path $(app_dir) --context-dir-path $(context_dir) --ca-certs-dir-path $(ca_certs_dir) --certs-dir-path $(certs_dir) --from-make $(user_id_option)
26
+ workflow_run_options=--script-path $(workflow_script) $(workflow_service_options)
27
+ workflow_up_options=--app-dir-path $(app_dir) --context-dir-path $(context_dir) --ca-certs-dir-path $(ca_certs_dir) --certs-dir-path $(certs_dir) $(user_id_option)
28
28
 
29
29
  app_data_dir=$(app_dir)/.stoobly
30
30
  app_namespace_dir=$(app_data_dir)/docker
31
31
  app_tmp_dir=$(app_data_dir)/tmp
32
32
  dockerfile_path=$(app_namespace_dir)/.Dockerfile.context
33
33
  docker_compose_file_path=$(app_namespace_dir)/stoobly-ui/exec/.docker-compose.exec.yml
34
- workflow_run_script=$(app_data_dir)/tmp/run.sh
34
+ workflow_script=.stoobly/tmp/$(WORKFLOW).sh
35
35
 
36
36
  # Commands
37
37
  docker_command=docker
@@ -55,14 +55,14 @@ stoobly_exec_run=$(stoobly_exec_build) && $(stoobly_exec_run_env) $(exec_up)
55
55
  stoobly_exec_run_env=$(source_env) && $(exec_env) CONTEXT_DIR="$(app_dir)"
56
56
 
57
57
  # Workflow run
58
- workflow_run=$(source_env) && bash "$(workflow_run_script)"
58
+ workflow_run=$(source_env) && bash "$(app_dir)/$(workflow_script)"
59
59
 
60
60
  ca-cert/install: stoobly/install
61
- @if [ ! -d "$$HOME/.mitmproxy" ]; then \
61
+ @if [ -z "$$(ls $(ca_certs_dir) 2> /dev/null)" ]; then \
62
62
  read -p "Installing CA certificate is required for $(WORKFLOW)ing requests, continue? (y/N) " confirm && \
63
63
  if [ "$$confirm" = "y" ] || [ "$$confirm" = "Y" ]; then \
64
64
  echo "Running stoobly-agent ca-cert install..."; \
65
- stoobly-agent ca-cert install; \
65
+ stoobly-agent ca-cert install --ca-certs-dir-path $(ca_certs_dir); \
66
66
  else \
67
67
  echo "You can install the CA certificate later by running: stoobly-agent ca-cert install"; \
68
68
  fi \
@@ -153,7 +153,7 @@ tmpdir:
153
153
  @mkdir -p $(app_tmp_dir)
154
154
  workflow/down:
155
155
  @export EXEC_COMMAND=bin/.down && \
156
- export EXEC_OPTIONS="$(workflow_down_options) $(workflow_service_options) $(options)" && \
156
+ export EXEC_OPTIONS="$(user_id_option) $(workflow_run_options) $(options)" && \
157
157
  export EXEC_ARGS="$(WORKFLOW)" && \
158
158
  $(stoobly_exec_run) && \
159
159
  $(workflow_run)
@@ -173,7 +173,7 @@ workflow/hostname/install: command/install workflow/hostname
173
173
  workflow/hostname/uninstall: command/uninstall workflow/hostname
174
174
  workflow/logs:
175
175
  @export EXEC_COMMAND=bin/.logs && \
176
- export EXEC_OPTIONS="$(workflow_service_options) $(options)" && \
176
+ export EXEC_OPTIONS="$(workflow_run_options) $(options)" && \
177
177
  export EXEC_ARGS="$(WORKFLOW)" && \
178
178
  $(stoobly_exec_run) && \
179
179
  $(workflow_run)
@@ -190,7 +190,7 @@ workflow/test:
190
190
  $(eval WORKFLOW=test)
191
191
  workflow/up:
192
192
  @export EXEC_COMMAND=bin/.up && \
193
- export EXEC_OPTIONS="$(workflow_up_options) $(workflow_service_options) $(options)" && \
193
+ export EXEC_OPTIONS="$(user_id_option) $(workflow_up_options) $(workflow_run_options) $(options)" && \
194
194
  export EXEC_ARGS="$(WORKFLOW)" && \
195
195
  $(stoobly_exec_run) && \
196
196
  $(workflow_run)
@@ -6,9 +6,4 @@ services:
6
6
  - ${CONTEXT_DIR}/.stoobly:/home/stoobly/.stoobly
7
7
  - ${APP_DIR}/.stoobly/docker:/home/stoobly/.stoobly/docker
8
8
  stoobly_base:
9
- image: stoobly.${USER_ID}
10
- ui_base:
11
- extends:
12
- service: context_base
13
- volumes:
14
- - ${CA_CERTS_DIR}:/home/stoobly/.mitmproxy
9
+ image: stoobly.${USER_ID}
@@ -1,9 +1,9 @@
1
1
  #!/bin/bash
2
2
 
3
- echo "Configuring intercept mode"
3
+ echo "Configuring intercept..."
4
4
  stoobly-agent intercept configure --mode mock --policy all
5
5
 
6
- echo "Enabling intercept"
6
+ echo "Enabling intercept..."
7
7
  stoobly-agent intercept enable
8
8
 
9
9
  entrypoint=$(dirname -- "$0")/configure
@@ -1,9 +1,9 @@
1
1
  #!/bin/bash
2
2
 
3
- echo "Configuring intercept mode"
3
+ echo "Configuring intercept..."
4
4
  stoobly-agent intercept configure --mode record --policy all
5
5
 
6
- echo "Disabling intercept"
6
+ echo "Disabling intercept..."
7
7
  stoobly-agent intercept disable
8
8
 
9
9
  entrypoint=$(dirname -- "$0")/configure
@@ -1,9 +1,9 @@
1
1
  #!/bin/bash
2
2
 
3
- echo "Configuring intercept mode"
3
+ echo "Configuring intercept..."
4
4
  stoobly-agent intercept configure --mode mock --policy all
5
5
 
6
- echo "Enabling intercept"
6
+ echo "Enabling intercept..."
7
7
  stoobly-agent intercept enable
8
8
 
9
9
  entrypoint=$(dirname -- "$0")/configure
@@ -4,10 +4,10 @@ services:
4
4
  file: ../.docker-compose.base.yml
5
5
  service: gateway_base
6
6
  networks:
7
- - gateway
7
+ - app
8
8
  profiles:
9
9
  - mock
10
10
  networks:
11
- gateway:
11
+ app:
12
12
  name: ${APP_NETWORK}
13
13
  external: true
@@ -4,10 +4,10 @@ services:
4
4
  file: ../.docker-compose.base.yml
5
5
  service: gateway_base
6
6
  networks:
7
- - gateway
7
+ - app
8
8
  profiles:
9
9
  - record
10
10
  networks:
11
- gateway:
11
+ app:
12
12
  name: ${APP_NETWORK}
13
13
  external: true
@@ -2,4 +2,4 @@ services:
2
2
  stoobly_ui.base:
3
3
  extends:
4
4
  file: ../.docker-compose.base.yml
5
- service: ui_base
5
+ service: context_base
@@ -1,13 +1,12 @@
1
1
  #!/bin/bash
2
2
 
3
3
  extra_options=$EXEC_OPTIONS
4
- workflow=$1
5
4
 
6
5
  mkdir -p .stoobly/tmp
7
6
 
8
7
  stoobly-agent scaffold workflow down \
9
8
  --app-dir-path "$(pwd)" \
9
+ --containerized \
10
10
  --dry-run \
11
11
  --log-level error \
12
- $extra_options \
13
- $workflow > .stoobly/tmp/run.sh
12
+ $extra_options $1 > /dev/null
@@ -1,11 +1,9 @@
1
1
  #!/bin/bash
2
2
 
3
3
  extra_options=$EXEC_OPTIONS
4
- workflow=$1
5
4
 
6
5
  stoobly-agent scaffold workflow logs \
7
6
  --app-dir-path "$(pwd)" \
8
7
  --dry-run \
9
8
  --log-level warning \
10
- $extra_options \
11
- $workflow > .stoobly/tmp/run.sh
9
+ $extra_options $1 > /dev/null
@@ -1,15 +1,12 @@
1
1
  #!/bin/bash
2
2
 
3
3
  extra_options=$EXEC_OPTIONS
4
- workflow=$1
5
-
6
- mkdir -p .stoobly/tmp
7
-
8
- stoobly-agent scaffold app mkcert
9
4
 
10
5
  stoobly-agent scaffold workflow up \
11
6
  --app-dir-path "$(pwd)" \
7
+ --containerized \
12
8
  --dry-run \
13
9
  --log-level warning \
14
- $extra_options \
15
- $workflow > .stoobly/tmp/run.sh
10
+ --mkcert \
11
+ --without-base \
12
+ $extra_options $1 > /dev/null
@@ -13,7 +13,7 @@ if [ "$scheme" = 'http' -a "$port" != '80' ] || [ "$scheme" = 'https' -a "$port"
13
13
  fi
14
14
 
15
15
  # Firewall
16
- echo "Configuring firewall rules"
16
+ echo "Configuring firewall rules..."
17
17
  stoobly-agent config firewall set \
18
18
  --action include \
19
19
  --method GET --method POST --method OPTIONS --method PUT --method DELETE \
@@ -21,7 +21,7 @@ stoobly-agent config firewall set \
21
21
  --pattern "$url/.*?"
22
22
 
23
23
  # Rewrite
24
- echo "Configuring rewrite rules"
24
+ echo "Configuring rewrite rules..."
25
25
  stoobly-agent config rewrite set \
26
26
  --method GET --method POST --method OPTIONS --method PUT --method DELETE \
27
27
  --mode record \
@@ -1,9 +1,9 @@
1
1
  import click
2
- import errno
3
2
  import os
4
3
  import pdb
5
4
  import sys
6
5
 
6
+ from io import TextIOWrapper
7
7
  from typing import List
8
8
 
9
9
  from stoobly_agent.app.cli.helpers.certificate_authority import CertificateAuthority
@@ -13,6 +13,7 @@ from stoobly_agent.app.cli.scaffold.app_create_command import AppCreateCommand
13
13
  from stoobly_agent.app.cli.scaffold.constants import (
14
14
  DOCKER_NAMESPACE, WORKFLOW_CONTAINER_PROXY, WORKFLOW_MOCK_TYPE, WORKFLOW_RECORD_TYPE, WORKFLOW_TEST_TYPE
15
15
  )
16
+ from stoobly_agent.app.cli.scaffold.containerized_app import ContainerizedApp
16
17
  from stoobly_agent.app.cli.scaffold.docker.service.set_gateway_ports import set_gateway_ports
17
18
  from stoobly_agent.app.cli.scaffold.docker.workflow.decorators_factory import get_workflow_decorators
18
19
  from stoobly_agent.app.cli.scaffold.hosts_file_manager import HostsFileManager
@@ -104,7 +105,7 @@ def create(**kwargs):
104
105
  help="Scaffold app service certs"
105
106
  )
106
107
  @click.option('--app-dir-path', default=current_working_dir, help='Path to application directory.')
107
- @click.option('--ca-certs-dir-path', default=data_dir.mitmproxy_conf_dir_path, help='Path to ca certs directory used to sign SSL certs. Defaults to ~/.mitmproxy')
108
+ @click.option('--ca-certs-dir-path', default=data_dir.ca_certs_dir_path, help='Path to ca certs directory used to sign SSL certs.')
108
109
  @click.option('--certs-dir-path', help='Path to certs directory. Defaults to the certs dir of the context.')
109
110
  @click.option('--context-dir-path', default=data_dir.context_dir_path, help='Path to Stoobly data directory.')
110
111
  @click.option('--service', multiple=True, help='Select which services to run. Defaults to all.')
@@ -117,24 +118,7 @@ def mkcert(**kwargs):
117
118
  app, service=kwargs['service'], without_core=True, workflow=kwargs['workflow']
118
119
  )
119
120
 
120
- for service_name in services:
121
- service = Service(service_name, app)
122
- __validate_service_dir(service.dir_path)
123
-
124
- service_config = ServiceConfig(service.dir_path)
125
-
126
- if service_config.scheme != 'https':
127
- continue
128
-
129
- hostname = service_config.hostname
130
-
131
- if not hostname:
132
- continue
133
-
134
- ca = CertificateAuthority(app.ca_certs_dir_path)
135
- if not ca.signed(hostname, app.certs_dir_path):
136
- Logger.instance(LOG_ID).info(f"Creating cert for {hostname}")
137
- ca.sign(hostname, app.certs_dir_path)
121
+ __services_mkcert(app, services)
138
122
 
139
123
  @service.command(
140
124
  help="Scaffold a service",
@@ -290,6 +274,7 @@ def copy(**kwargs):
290
274
  @workflow.command()
291
275
  @click.option('--app-dir-path', default=current_working_dir, help='Path to application directory.')
292
276
  @click.option('--context-dir-path', default=data_dir.context_dir_path, help='Path to Stoobly data directory.')
277
+ @click.option('--containerized', is_flag=True, help='Set if run from within a container.')
293
278
  @click.option('--dry-run', default=False, is_flag=True)
294
279
  @click.option('--extra-entrypoint-compose-path', help='Path to extra entrypoint compose file.')
295
280
  @click.option('--log-level', default=INFO, type=click.Choice([DEBUG, INFO, WARNING, ERROR]), help='''
@@ -298,6 +283,7 @@ def copy(**kwargs):
298
283
  @click.option('--namespace', help='Workflow namespace.')
299
284
  @click.option('--network', help='Workflow network name.')
300
285
  @click.option('--rmi', is_flag=True, help='Remove images used by containers.')
286
+ @click.option('--script-path', help='Path to intermediate script path.')
301
287
  @click.option('--service', multiple=True, help='Select which services to log. Defaults to all.')
302
288
  @click.option('--user-id', default=os.getuid(), help='OS user ID of the owner of context dir path.')
303
289
  @click.argument('workflow_name')
@@ -323,6 +309,8 @@ def down(**kwargs):
323
309
  command.current_working_dir = current_working_dir
324
310
  commands.append(command)
325
311
 
312
+ script = __build_script(**kwargs)
313
+
326
314
  commands = sorted(commands, key=lambda command: command.service_config.priority)
327
315
  for index, command in enumerate(commands):
328
316
  __print_header(f"SERVICE {command.service_name}")
@@ -342,11 +330,8 @@ def down(**kwargs):
342
330
  )
343
331
  if not exec_command:
344
332
  continue
345
-
346
- if not kwargs['dry_run']:
347
- exec_stream(exec_command)
348
- else:
349
- print(exec_command)
333
+
334
+ print(exec_command, file=script)
350
335
 
351
336
  # After services are stopped, their network needs to be removed
352
337
  if len(commands) > 0:
@@ -354,16 +339,16 @@ def down(**kwargs):
354
339
 
355
340
  if kwargs['rmi']:
356
341
  remove_image_command = command.remove_image(kwargs['user_id'])
357
- if not kwargs['dry_run']:
358
- exec_stream(remove_image_command)
359
- else:
360
- print(remove_image_command)
342
+ print(remove_image_command, file=script)
361
343
 
362
344
  remove_network_command = command.remove_network()
363
- if not kwargs['dry_run']:
364
- exec_stream(remove_network_command)
365
- else:
366
- print(remove_network_command)
345
+ print(remove_network_command, file=script)
346
+
347
+ __run_script(script, kwargs['dry_run'])
348
+
349
+ # Options are no longer valid
350
+ if kwargs['containerized'] and os.path.exists(data_dir.mitmproxy_options_json_path):
351
+ os.remove(data_dir.mitmproxy_options_json_path)
367
352
 
368
353
  @workflow.command()
369
354
  @click.option('--app-dir-path', default=current_working_dir, help='Path to application directory.')
@@ -376,6 +361,7 @@ def down(**kwargs):
376
361
  Log levels can be "debug", "info", "warning", or "error"
377
362
  ''')
378
363
  @click.option('--namespace', help='Workflow namespace.')
364
+ @click.option('--script-path', help='Path to intermediate script path.')
379
365
  @click.option('--service', multiple=True, help='Select which services to log. Defaults to all.')
380
366
  @click.argument('workflow_name')
381
367
  def logs(**kwargs):
@@ -407,6 +393,8 @@ def logs(**kwargs):
407
393
  command = WorkflowLogCommand(app, **config)
408
394
  commands.append(command)
409
395
 
396
+ script = __build_script(**kwargs)
397
+
410
398
  commands = sorted(commands, key=lambda command: command.service_config.priority)
411
399
  for index, command in enumerate(commands):
412
400
  __print_header(f"SERVICE {command.service_name}")
@@ -417,39 +405,41 @@ def logs(**kwargs):
417
405
  )
418
406
 
419
407
  for shell_command in shell_commands:
420
- print(shell_command)
408
+ print(shell_command, file=script)
421
409
 
422
- if not kwargs['dry_run']:
423
- exec_stream(shell_command)
410
+ __run_script(script, kwargs['dry_run'])
424
411
 
425
412
  @workflow.command()
426
413
  @click.option('--app-dir-path', default=current_working_dir, help='Path to application directory.')
427
414
  @click.option('--build', is_flag=True, help='Build images before starting containers.')
428
- @click.option('--ca-certs-dir-path', default=data_dir.mitmproxy_conf_dir_path, help='Path to ca certs directory used to sign SSL certs. Defaults to ~/.mitmproxy')
415
+ @click.option('--ca-certs-dir-path', default=data_dir.ca_certs_dir_path, help='Path to ca certs directory used to sign SSL certs.')
429
416
  @click.option('--certs-dir-path', help='Path to certs directory. Defaults to the certs dir of the context.')
417
+ @click.option('--containerized', is_flag=True, help='Set if run from within a container.')
430
418
  @click.option('--context-dir-path', default=data_dir.context_dir_path, help='Path to Stoobly data directory.')
431
419
  @click.option('--detached', is_flag=True, help='If set, will not run the highest priority service in the foreground.')
432
420
  @click.option('--dry-run', default=False, is_flag=True, help='If set, prints commands.')
433
421
  @click.option('--extra-entrypoint-compose-path', help='Path to extra entrypoint compose file.')
434
- @click.option('--from-make', is_flag=True, help='Set if run from scaffolded Makefile.')
435
422
  @click.option('--log-level', default=INFO, type=click.Choice([DEBUG, INFO, WARNING, ERROR]), help='''
436
423
  Log levels can be "debug", "info", "warning", or "error"
437
424
  ''')
425
+ @click.option('--mkcert', is_flag=True, help='Set to generate SSL certs for HTTPS services.')
438
426
  @click.option('--namespace', help='Workflow namespace.')
439
427
  @click.option('--network', help='Workflow network name.')
440
428
  @click.option('--pull', is_flag=True, help='Pull image before running.')
429
+ @click.option('--script-path', help='Path to intermediate script path.')
441
430
  @click.option('--service', multiple=True, help='Select which services to run. Defaults to all.')
442
431
  @click.option('--user-id', default=os.getuid(), help='OS user ID of the owner of context dir path.')
443
432
  @click.option('--verbose', is_flag=True)
433
+ @click.option('--without-base', is_flag=True, help='Disable building Stoobly base image.')
444
434
  @click.argument('workflow_name')
445
435
  def up(**kwargs):
446
436
  os.environ[env_vars.LOG_LEVEL] = kwargs['log_level']
447
437
 
448
- from_make = kwargs['from_make']
438
+ containerized = kwargs['containerized']
449
439
 
450
440
  # Because we are running a docker-compose command which depends on APP_DIR env var
451
- # when we are running this command through make, the host's app_dir_path will likely differ
452
- app_dir_path = current_working_dir if from_make else kwargs['app_dir_path']
441
+ # when we are running this command within a container, the host's app_dir_path will likely differ
442
+ app_dir_path = current_working_dir if containerized else kwargs['app_dir_path']
453
443
  app = App(app_dir_path, DOCKER_NAMESPACE, **kwargs)
454
444
  __validate_app(app)
455
445
 
@@ -461,6 +451,10 @@ def up(**kwargs):
461
451
  app, service=kwargs['service'], workflow=[kwargs['workflow_name']]
462
452
  )
463
453
 
454
+ if kwargs['mkcert']:
455
+ _app = ContainerizedApp(app_dir_path, DOCKER_NAMESPACE) if containerized else app
456
+ __services_mkcert(_app, services)
457
+
464
458
  # Gateway ports are dynamically set depending on the workflow run
465
459
  workflow = Workflow(kwargs['workflow_name'], app)
466
460
  set_gateway_ports(workflow.service_paths_from_services(services))
@@ -473,23 +467,24 @@ def up(**kwargs):
473
467
  command.current_working_dir = current_working_dir
474
468
  commands.append(command)
475
469
 
470
+ script = __build_script(**kwargs)
471
+
476
472
  # Before services can be started, their image and network needs to be created
477
473
  if len(commands) > 0:
478
474
  command: WorkflowRunCommand = commands[0]
479
475
 
480
476
  init_commands = []
481
- if not from_make:
477
+ if not kwargs['without_base']:
482
478
  create_image_command = command.create_image(user_id=kwargs['user_id'], verbose=kwargs['verbose'])
483
479
  init_commands.append(create_image_command)
484
480
 
485
481
  init_commands.append(command.create_network())
486
482
  joined_command = ' && '.join(init_commands)
487
483
 
488
- if not kwargs['dry_run']:
484
+ if not containerized:
489
485
  command.write_nameservers()
490
- exec_stream(joined_command)
491
- else:
492
- print(joined_command)
486
+
487
+ print(joined_command, file=script)
493
488
 
494
489
  commands = sorted(commands, key=lambda command: command.service_config.priority)
495
490
  for index, command in enumerate(commands):
@@ -515,10 +510,9 @@ def up(**kwargs):
515
510
  if not exec_command:
516
511
  continue
517
512
 
518
- if not kwargs['dry_run']:
519
- exec_stream(exec_command)
520
- else:
521
- print(exec_command)
513
+ print(exec_command, file=script)
514
+
515
+ __run_script(script, kwargs['dry_run'])
522
516
 
523
517
  @workflow.command(
524
518
  help="Validate a scaffold workflow"
@@ -620,6 +614,18 @@ scaffold.add_command(service)
620
614
  scaffold.add_command(workflow)
621
615
  scaffold.add_command(hostname)
622
616
 
617
+ def __build_script(**kwargs):
618
+ script_path = kwargs['script_path']
619
+ if not script_path:
620
+ script_file_name = f"{kwargs['workflow_name']}.sh"
621
+ script_path = os.path.join(data_dir.tmp_dir_path, script_file_name)
622
+
623
+ # Truncate
624
+ with open(script_path, 'w'):
625
+ pass
626
+
627
+ return open(script_path, 'a')
628
+
623
629
  def __elevate_sudo():
624
630
  import subprocess
625
631
 
@@ -662,6 +668,16 @@ def __get_services(app: App, **kwargs):
662
668
  def __print_header(text: str):
663
669
  Logger.instance(LOG_ID).info(f"{bcolors.OKBLUE}{text}{bcolors.ENDC}")
664
670
 
671
+ def __run_script(script: TextIOWrapper, dry_run = False):
672
+ script.close()
673
+
674
+ with open(script.name, 'r') as fp:
675
+ for line in fp:
676
+ if not dry_run:
677
+ exec_stream(line.strip())
678
+ else:
679
+ print(line.strip())
680
+
665
681
  def __scaffold_build(app, **kwargs):
666
682
  command = ServiceCreateCommand(app, **kwargs)
667
683
 
@@ -672,6 +688,26 @@ def __scaffold_delete(app, **kwargs):
672
688
 
673
689
  command.delete()
674
690
 
691
+ def __services_mkcert(app: App, services):
692
+ for service_name in services:
693
+ service = Service(service_name, app)
694
+ __validate_service_dir(service.dir_path)
695
+
696
+ service_config = ServiceConfig(service.dir_path)
697
+
698
+ if service_config.scheme != 'https':
699
+ continue
700
+
701
+ hostname = service_config.hostname
702
+
703
+ if not hostname:
704
+ continue
705
+
706
+ ca = CertificateAuthority(app.ca_certs_dir_path)
707
+ if not ca.signed(hostname, app.certs_dir_path):
708
+ Logger.instance(LOG_ID).info(f"Creating cert for {hostname}")
709
+ ca.sign(hostname, app.certs_dir_path)
710
+
675
711
  def __validate_app(app: App):
676
712
  if not app.valid:
677
713
  print(f"Error: {app.dir_path} is not a valid scaffold app", file=sys.stderr)
@@ -101,6 +101,7 @@ def __filter_options(options):
101
101
  Filter out non-mitmproxy options
102
102
  '''
103
103
 
104
+ options['confdir'] = options['ca_certs_dir_path']
104
105
  options['listen_host'] = options['proxy_host']
105
106
  options['listen_port'] = options['proxy_port']
106
107
  options['mode'] = options['proxy_mode']
@@ -108,6 +109,9 @@ def __filter_options(options):
108
109
  if 'api_url' in options:
109
110
  del options['api_url']
110
111
 
112
+ if 'ca_certs_dir_path' in options:
113
+ del options['ca_certs_dir_path']
114
+
111
115
  if 'certs' in options and not options['certs']:
112
116
  del options['certs']
113
117
 
stoobly_agent/cli.py CHANGED
@@ -11,7 +11,7 @@ from stoobly_agent.app.cli.helpers.handle_mock_service import print_raw_response
11
11
  from stoobly_agent.app.cli.helpers.validations import validate_project_key, validate_scenario_key
12
12
  from stoobly_agent.app.proxy.constants import custom_response_codes
13
13
  from stoobly_agent.app.proxy.replay.replay_request_service import replay as replay_request
14
- from stoobly_agent.config.constants import env_vars, mitmproxy, mode
14
+ from stoobly_agent.config.constants import env_vars, mode
15
15
  from stoobly_agent.config.data_dir import DataDir
16
16
  from stoobly_agent.lib.utils.conditional_decorator import ConditionalDecorator
17
17
 
@@ -79,6 +79,7 @@ def init(**kwargs):
79
79
  help="Run proxy and/or UI",
80
80
  )
81
81
  @ConditionalDecorator(lambda f: click.option('--api-url', help='API URL.')(f), is_remote)
82
+ @click.option('--ca-certs-dir-path', default=DataDir.instance().ca_certs_dir_path, help='Path to ca certs directory used to sign SSL certs.')
82
83
  @click.option('--certs', help='''
83
84
  SSL certificates of the form "[domain=]path". The domain may include a wildcard, and is equal to "*" if not specified. The file at path is a certificate in PEM format. If a private key is included in the
84
85
  PEM, it is used, else the default key in the conf dir is used. The PEM file should contain the full certificate chain, with the leaf certificate as the first entry. May be passed multiple times.
@@ -87,7 +88,6 @@ def init(**kwargs):
87
88
  Passphrase for decrypting the private key provided in the --cert option. Note that passing cert_passphrase on the command line makes your passphrase visible in your system's process list. Specify it in
88
89
  config.yaml to avoid this.
89
90
  ''')
90
- @click.option('--confdir', default=mitmproxy.DEFAULT_CONF_DIR_PATH, help='Location of the default mitmproxy configuration files.')
91
91
  @click.option('--connection-strategy', help=', '.join(CONNECTION_STRATEGIES), type=click.Choice(CONNECTION_STRATEGIES))
92
92
  @click.option('--flow-detail', default='1', type=click.Choice(['0', '1', '2', '3', '4']), help='''
93
93
  The display detail level for flows in mitmdump: 0 (quiet) to 4 (very verbose).
@@ -24,17 +24,7 @@ class DataDir:
24
24
  self.__data_dir_path = os.path.join(path, DATA_DIR_NAME)
25
25
  else:
26
26
  cwd = os.getcwd()
27
- self.__data_dir_path = os.path.join(cwd, DATA_DIR_NAME)
28
-
29
- # If the current working directory does not contain a .stoobly folder,
30
- # then search in the parent directories until the home directory.
31
- if not os.path.exists(self.__data_dir_path):
32
- data_dir = self.find_data_dir(cwd)
33
-
34
- if not data_dir:
35
- self.__data_dir_path = os.path.join(os.path.expanduser('~'), DATA_DIR_NAME)
36
- else:
37
- self.__data_dir_path = data_dir
27
+ self.__data_dir_path = self.find_data_dir(cwd)
38
28
 
39
29
  if not os.path.exists(self.__data_dir_path):
40
30
  self.create(os.path.dirname(self.__data_dir_path))
@@ -115,29 +105,13 @@ class DataDir:
115
105
  return os.path.join(self.tmp_dir_path, MITMPROXY_OPTIONS_FILE_NAME)
116
106
 
117
107
  @property
118
- def mitmproxy_conf_dir_path(self):
119
- from stoobly_agent.config.constants.mitmproxy import DEFAULT_CONF_DIR_PATH
120
-
121
- conf_dir = DEFAULT_CONF_DIR_PATH
122
-
123
- options_json = self.mitmproxy_options_json_path
124
- if os.path.exists(options_json):
125
- try:
126
- with open(options_json, 'r') as fp:
127
- import json
128
- contents = fp.read()
129
- options = json.loads(contents)
130
- _conf_dir = options.get('confdir')
131
-
132
- if _conf_dir and os.path.exists(_conf_dir):
133
- conf_dir = _conf_dir
134
- except Exception:
135
- pass
136
- else:
137
- if not os.path.exists(conf_dir):
138
- os.makedirs(conf_dir)
108
+ def ca_certs_dir_path(self):
109
+ path = os.path.join(self.path, 'ca_certs')
110
+
111
+ if not os.path.exists(path):
112
+ os.makedirs(path)
139
113
 
140
- return conf_dir
114
+ return path
141
115
 
142
116
  @property
143
117
  def settings_file_path(self):
@@ -227,6 +201,7 @@ class DataDir:
227
201
  with open(os.path.join(self.__data_dir_path, '.gitignore'), 'w') as fp:
228
202
  fp.write(
229
203
  "\n".join([
204
+ 'ca_certs',
230
205
  'certs',
231
206
  'db',
232
207
  'settings.yml',
@@ -236,28 +211,21 @@ class DataDir:
236
211
  ])
237
212
  )
238
213
 
239
-
214
+ # If the current working directory does not contain a .stoobly folder,
215
+ # then search in the parent directories until the home directory.
240
216
  def find_data_dir(self, start_path: str) -> str:
241
- # Note: these paths won't work for Windows
242
217
  root_dir = os.path.abspath(os.sep)
243
- home_dir = os.path.expanduser("~")
244
- root_reached = False
245
218
 
246
- while start_path != home_dir:
219
+ while True:
247
220
  data_dir_path = os.path.join(start_path, DATA_DIR_NAME)
248
-
249
- if os.path.exists(data_dir_path):
221
+ if os.path.exists(data_dir_path) and os.stat(data_dir_path).st_uid == os.getuid():
250
222
  return data_dir_path
251
223
 
252
- if root_reached:
253
- break
254
-
224
+ # Root reached
255
225
  if start_path == root_dir:
256
- root_reached = True
257
- start_path = home_dir
226
+ break
258
227
 
259
228
  # Move up one directory
260
229
  start_path = os.path.dirname(start_path)
261
230
 
262
- return ""
263
-
231
+ return os.path.join(os.path.expanduser('~'), DATA_DIR_NAME)
@@ -1,12 +1,9 @@
1
1
  import json
2
- import os
3
2
  import pdb
4
3
 
5
4
  from stoobly_agent.config.data_dir import DataDir
6
5
 
7
6
  class MitmproxyConfig():
8
- MITMPROXY_DIR_NAME = '.mitmproxy'
9
-
10
7
  __instance = None
11
8
  __master = None
12
9
 
@@ -16,11 +13,6 @@ class MitmproxyConfig():
16
13
  else:
17
14
  self.__master = master
18
15
 
19
- self.__mitmproxy_dir_path = DataDir.instance().mitmproxy_conf_dir_path
20
-
21
- if not os.path.exists(self.__mitmproxy_dir_path):
22
- os.mkdir(self.__mitmproxy_dir_path)
23
-
24
16
  @classmethod
25
17
  def instance(cls, master = None):
26
18
  if cls.__instance is None:
@@ -28,15 +20,6 @@ class MitmproxyConfig():
28
20
 
29
21
  return cls.__instance
30
22
 
31
- @property
32
- def ca_cert_pem_path(self):
33
- path = os.path.join(self.__mitmproxy_dir_path, 'mitmproxy-ca-cert.pem')
34
-
35
- if not os.path.exists(path):
36
- return ''
37
-
38
- return path
39
-
40
23
  def with_master(self, master):
41
24
  from mitmproxy.tools.dump import DumpMaster
42
25
  self.__master: DumpMaster = master
@@ -3,7 +3,6 @@ import pytest
3
3
 
4
4
  from stoobly_agent.test.test_helper import reset
5
5
 
6
- from stoobly_agent.config.constants.mitmproxy import DEFAULT_CONF_DIR_PATH
7
6
  from stoobly_agent.config.data_dir import DataDir
8
7
  from stoobly_agent.app.cli.helpers.certificate_authority import CertificateAuthority
9
8
 
@@ -33,7 +32,7 @@ class TestCertificateAuthority():
33
32
  return CertificateAuthority()
34
33
 
35
34
  def test_defaults_to_mitmproxy_confdir(self, certificate_authority: CertificateAuthority):
36
- assert certificate_authority.certs_dir == DEFAULT_CONF_DIR_PATH
35
+ assert certificate_authority.certs_dir == DataDir.instance().ca_certs_dir_path
37
36
 
38
37
  class TestSign():
39
38
 
@@ -1 +1 @@
1
- 1.5.0
1
+ 1.5.6
@@ -5,7 +5,6 @@ import pytest
5
5
 
6
6
  from stoobly_agent.config.constants.env_vars import ENV
7
7
  from stoobly_agent.config.constants.mode import NONE
8
- from stoobly_agent.config.constants.mitmproxy import DEFAULT_CONF_DIR_PATH
9
8
  from stoobly_agent.config.data_dir import DataDir, DATA_DIR_NAME
10
9
  from stoobly_agent.test.test_helper import reset
11
10
 
@@ -83,12 +82,4 @@ class TestDataDir():
83
82
 
84
83
  finally:
85
84
  shutil.rmtree(temp_dir)
86
- os.chdir(original_cwd)
87
-
88
- class TestMitmproxyConfDirPath():
89
- @pytest.fixture(autouse=True, scope='class')
90
- def settings(self):
91
- return reset()
92
-
93
- def test_default_path(self):
94
- assert DataDir.instance().mitmproxy_conf_dir_path == DEFAULT_CONF_DIR_PATH
85
+ os.chdir(original_cwd)
@@ -1,7 +1,7 @@
1
1
  # Define services here
2
2
 
3
3
  networks:
4
- gateway:
4
+ app:
5
5
  external: true
6
6
  name: ${APP_NETWORK}
7
7
 
@@ -10,7 +10,7 @@ services:
10
10
  image: kennethreitz/httpbin:latest
11
11
  hostname: my-httpbin.com
12
12
  networks:
13
- - gateway
13
+ - app
14
14
  profiles: &id001
15
15
  - record
16
16
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: stoobly-agent
3
- Version: 1.5.4
3
+ Version: 1.5.6
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=_pUiSvLhZOPO0Wy_VICL7hNLSG1thGwCZeb1IB6nWVk,44
1
+ stoobly_agent/__init__.py,sha256=69eeJOFdZIj_u7CdBLLEJH5aoH4EApq0KmNGYpvoPMc,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=ZgCfmdr5um-OFAiuRHdBxFqPIeph9WqYkVg-oVQWw-E,5543
@@ -17,7 +17,7 @@ stoobly_agent/app/api/scenarios_controller.py,sha256=zJViyme9l36mlJDQONRu4N-A0kd
17
17
  stoobly_agent/app/api/simple_http_request_handler.py,sha256=ZdJ4kKEcPDpck74dJu--M7zw76wQzpo_AQArZwN9Bes,4466
18
18
  stoobly_agent/app/api/statuses_controller.py,sha256=gQsl28h-3mZ_bByEHpc4mRy3KFvUz5PeAgVB0cPx_Ao,1791
19
19
  stoobly_agent/app/cli/__init__.py,sha256=uS4KJgMAhm0JVnEUC-ONW-Bq6A8I9v7Fk-_Ka7gXlrU,470
20
- stoobly_agent/app/cli/ca_cert_cli.py,sha256=QXl01nyCQLhiGr8vozZicui36AlgHU1q_V9c_w_xY-Q,1444
20
+ stoobly_agent/app/cli/ca_cert_cli.py,sha256=Jx3faedvkUrLG986D5YmMD6u6IROKqhP9I1i6JBgeyU,1407
21
21
  stoobly_agent/app/cli/config_cli.py,sha256=Ljr2Ir8P0dhGXALQQcq7fwthrcipPlvxS2G_0bNE6fY,15727
22
22
  stoobly_agent/app/cli/decorators/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
23
23
  stoobly_agent/app/cli/decorators/config.py,sha256=AWrDGZm_gjCWFYlRwdla3iE6H7OSlM4FxkaXRNovBZA,2428
@@ -28,7 +28,7 @@ stoobly_agent/app/cli/feature_cli.py,sha256=d-MUTbK3gbZxZNJUjM43fioZyhPyzetQNKjI
28
28
  stoobly_agent/app/cli/handlers/request_cli_handler.py,sha256=IPToK9OfiDda-mkq8HpiSSqK2m-UR15-8f8LVoLAHTA,6965
29
29
  stoobly_agent/app/cli/handlers/scenario_cli_handler.py,sha256=1KSsfhR1mmPUCmhjzWTjf_L9NcQglLvVK3KURrPt92A,7425
30
30
  stoobly_agent/app/cli/helpers/__init__.py,sha256=26ODsQi5NoJPwq4Ya7_lmtRalhhXOr_jfdZQWGLy6Gc,161
31
- stoobly_agent/app/cli/helpers/certificate_authority.py,sha256=j43f8W0A5lrNOIdB7QJQAVRCDP9ri4SpUZuT4XfI5v0,7374
31
+ stoobly_agent/app/cli/helpers/certificate_authority.py,sha256=gYFSf2b6LOR5AymX43h_f2Wsus8nCIoOug3XuH_60Vo,7368
32
32
  stoobly_agent/app/cli/helpers/context.py,sha256=Jv97ueNnqea5UDm57VOUiQSHKWBeNlCcrq5-qW2tcwQ,1624
33
33
  stoobly_agent/app/cli/helpers/endpoint_facade.py,sha256=_1TR9PcRnqpl9Q4njFHMM_Btqpr6cCf757FFcywa3oU,2318
34
34
  stoobly_agent/app/cli/helpers/endpoints_apply_context.py,sha256=PvUzJLXNKl6wIQj2q8YZK1MAm1yqzDLLlpCYMoyWb9I,1831
@@ -67,17 +67,18 @@ stoobly_agent/app/cli/project_cli.py,sha256=EXjeLjbnq9PhfCjvyfZ0UnJ2tejeCS0SIAo3
67
67
  stoobly_agent/app/cli/report_cli.py,sha256=ZxJw0Xkx7KFZJn9e45BSKRKon8AD0Msrwy1fbPfbv0c,2543
68
68
  stoobly_agent/app/cli/request_cli.py,sha256=THNloW111l9MLE0oPg4y7hVXL1U7OXoz760g0A1CtJ0,7747
69
69
  stoobly_agent/app/cli/scaffold/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
70
- stoobly_agent/app/cli/scaffold/app.py,sha256=umY7kgZb6xvwO1XxAV3zmgjW6xyLnAbKkM7oh4Dk7uk,3441
70
+ stoobly_agent/app/cli/scaffold/app.py,sha256=bgNc_dWZtgkuDAkS9aHSCMxCrjX907Phlfb2bOasswI,3435
71
71
  stoobly_agent/app/cli/scaffold/app_command.py,sha256=qtOdG08ehdRk1wujiTL7LCQXoJkGpwExepO2qYBXBNA,2027
72
72
  stoobly_agent/app/cli/scaffold/app_config.py,sha256=Gs-BynV1vY7_PpTOenn2mqc7lBIu0vBx6as9vtEU1sk,818
73
73
  stoobly_agent/app/cli/scaffold/app_create_command.py,sha256=sy4017eiir9MK0TEbTi1NyG9mhOGlenGGVnq0GsGUrQ,966
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
76
  stoobly_agent/app/cli/scaffold/constants.py,sha256=Vn7TLVmxbiLOb7_wFDE4mlwkcr4vs0ZEgMxhS1ANizA,2084
77
+ stoobly_agent/app/cli/scaffold/containerized_app.py,sha256=dAjn4RwcZV3aEL0POUmrbF_DC-r9h6s1zx7gT2t45v0,175
77
78
  stoobly_agent/app/cli/scaffold/docker/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
78
79
  stoobly_agent/app/cli/scaffold/docker/app_builder.py,sha256=7z5pk5JKlRDHx2USxY-WurttLyyUkIVYfl34_u1x9dE,501
79
- stoobly_agent/app/cli/scaffold/docker/builder.py,sha256=OE7r8vEdEkW3vwpmIctePiO0S5jvao5zMJNpxc-Yayw,2851
80
- stoobly_agent/app/cli/scaffold/docker/constants.py,sha256=fGnuo0ULYJa4CT3A4nPB7hZq8nFpdoCOSvrdJegdjMg,422
80
+ stoobly_agent/app/cli/scaffold/docker/builder.py,sha256=BQzjpDZmkUrii3VDcRCBXQkocxRwdS1omJFy5AkzJzw,2856
81
+ stoobly_agent/app/cli/scaffold/docker/constants.py,sha256=xfFBSF-1GQKNnUPTlz08Nm9HZDspUnvPvjwaLViQwVw,419
81
82
  stoobly_agent/app/cli/scaffold/docker/service/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
82
83
  stoobly_agent/app/cli/scaffold/docker/service/build_decorator.py,sha256=ZU7z4bkvdS3OK5O4fJhlA9_PNwnFtZW6t7vNF7V5obQ,1003
83
84
  stoobly_agent/app/cli/scaffold/docker/service/builder.py,sha256=a7jxzXEwHaNcnG281BrOtNlf5Nmc4Z97DQrm68xdCCU,3219
@@ -103,8 +104,8 @@ stoobly_agent/app/cli/scaffold/service_workflow.py,sha256=sQ_Edy_wGHKMXpD0DmhnOW
103
104
  stoobly_agent/app/cli/scaffold/service_workflow_validate_command.py,sha256=iORyPZEQurgWVxrdMgkdD3VsCz3ar2D15dmyY3RoeKw,9904
104
105
  stoobly_agent/app/cli/scaffold/templates/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
105
106
  stoobly_agent/app/cli/scaffold/templates/app/.Dockerfile.context,sha256=EVoSqGJH_H7Xw1Ktan5GH2SWaOXIr916NUpptr2hkiA,158
106
- stoobly_agent/app/cli/scaffold/templates/app/.Makefile,sha256=JOunQ18rT64lYqYkFb3DVXDxP5m1WCtLgy8aAlGLyLs,7999
107
- stoobly_agent/app/cli/scaffold/templates/app/.docker-compose.base.yml,sha256=ieZmXTY0RLKowpP102uSKlfu1sbm0849T-mQz858M80,360
107
+ stoobly_agent/app/cli/scaffold/templates/app/.Makefile,sha256=iVlTpP0I8nbgO1EBhsomGrUFqIDdlhIEJEdD_aCeXRs,8083
108
+ stoobly_agent/app/cli/scaffold/templates/app/.docker-compose.base.yml,sha256=6tFqXh3ine8vaD0FCL5TMoY5NjKx2wLUR8XpW3tJtew,245
108
109
  stoobly_agent/app/cli/scaffold/templates/app/Makefile,sha256=TEmPG7Bf0KZOnmfsgdzza3UdwcVMmM5Lj1YdLc4cgjA,79
109
110
  stoobly_agent/app/cli/scaffold/templates/app/build/.config.yml,sha256=8Wt8ZZ5irvBYYS44xGrR_EWlZDuXH9kyWmquzsh7s8g,19
110
111
  stoobly_agent/app/cli/scaffold/templates/app/build/.docker-compose.base.yml,sha256=H43dtzQkuwWeeB-XzwQNqdKqwS04Ph_Al8AVCOjxCkQ,420
@@ -126,42 +127,42 @@ 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=IHLz4eJyZDfQdKd8HG218Zc3egtOCK1IR8vfkMNJ0Ug,491
128
129
  stoobly_agent/app/cli/scaffold/templates/app/entrypoint/mock/.docker-compose.mock.yml,sha256=-YbHd6BrAlBpT8PYg8kOsq0GyDeZ3g_q8IB0B0rGluU,551
129
- stoobly_agent/app/cli/scaffold/templates/app/entrypoint/mock/bin/.configure,sha256=XuPxv-MprVjmv3S6WbJy9WsC3wizlx8TkFvNNhGyEJ8,254
130
+ stoobly_agent/app/cli/scaffold/templates/app/entrypoint/mock/bin/.configure,sha256=dZNsKDou-7IS4yj8hYPudjoUIa8YlUbuE8pBkSIVtyE,255
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
133
134
  stoobly_agent/app/cli/scaffold/templates/app/entrypoint/mock/docker-compose.yml,sha256=Zh8h8yUqVXZMi_Y4aUPE48qw2DU-ONO4-rrSTh4E_Ts,591
134
135
  stoobly_agent/app/cli/scaffold/templates/app/entrypoint/record/.docker-compose.record.yml,sha256=aIcgjelss4V86lxS3-xN8j_2eR-0YkzhtN_b-g3Y0nE,555
135
- stoobly_agent/app/cli/scaffold/templates/app/entrypoint/record/bin/.configure,sha256=Jp7ozDgj0x9D8PYS8CMhGNs4VfwJhVwBqzss8ygbLJU,258
136
+ stoobly_agent/app/cli/scaffold/templates/app/entrypoint/record/bin/.configure,sha256=HKul_kbkob_EzSudYKRyQMk_YHE2jEBTarGHl3pCc18,259
136
137
  stoobly_agent/app/cli/scaffold/templates/app/entrypoint/record/bin/.init,sha256=5xJbfpwGOmRj5lwK5e0JNlVpNd3WFUkZ0GaCUK40aDk,97
137
138
  stoobly_agent/app/cli/scaffold/templates/app/entrypoint/record/bin/configure,sha256=Nme7aSLA-IH1NXgmqRMPzOlKcUSRXqZd-kcuZa47IEk,11
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=9-qPnSisun4adnrDcZsJiyeMjhIlCHBJap_cmdzUPVg,552
141
- stoobly_agent/app/cli/scaffold/templates/app/entrypoint/test/bin/.configure,sha256=XuPxv-MprVjmv3S6WbJy9WsC3wizlx8TkFvNNhGyEJ8,254
142
+ stoobly_agent/app/cli/scaffold/templates/app/entrypoint/test/bin/.configure,sha256=dZNsKDou-7IS4yj8hYPudjoUIa8YlUbuE8pBkSIVtyE,255
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
145
146
  stoobly_agent/app/cli/scaffold/templates/app/entrypoint/test/docker-compose.yml,sha256=E4gGJwHfnZoFo9-0vM17-Qg5LPjx7vIPpcz2K7eiZg0,591
146
147
  stoobly_agent/app/cli/scaffold/templates/app/gateway/.config.yml,sha256=XnLQZMzzMMIwVycjyPN5QXsmRztkTFAna1kIHYuDfJQ,19
147
148
  stoobly_agent/app/cli/scaffold/templates/app/gateway/.docker-compose.base.template.yml,sha256=bgBvyDhyehS75D2ObEi7sl9DLGV6U3c9JhCAncsvjq8,251
148
- stoobly_agent/app/cli/scaffold/templates/app/gateway/mock/.docker-compose.mock.yml,sha256=LiMgBvOozkBH34-72kQXLylmrnERwjQfs8aws6BlZHM,232
149
- stoobly_agent/app/cli/scaffold/templates/app/gateway/record/.docker-compose.record.yml,sha256=4pwMuBdfaf9hX1RVJ3KU3FY4E5BXYSPFsfUGKmiuXPk,234
149
+ stoobly_agent/app/cli/scaffold/templates/app/gateway/mock/.docker-compose.mock.yml,sha256=_nlhrpml5dm9AWqgDIaEPwrQiD1vAKVHSsY2mTIds2k,224
150
+ stoobly_agent/app/cli/scaffold/templates/app/gateway/record/.docker-compose.record.yml,sha256=FvPqOUs1k6Vc-rncnpgiRTZeEQlrizmcGkT8a4HdvUE,226
150
151
  stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/.config.yml,sha256=XnLQZMzzMMIwVycjyPN5QXsmRztkTFAna1kIHYuDfJQ,19
151
- stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/.docker-compose.base.yml,sha256=GO3dIJ1WlazBDik_PDo1YvrSXcqeT5MMJjbb_iBdH6g,106
152
+ stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/.docker-compose.base.yml,sha256=bxrtZqf3YtaJCukzScslh5PgWC5q8xkGIP1wKJf33LA,111
152
153
  stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/exec/.docker-compose.exec.yml,sha256=n-p_lIfsmpOJ78Zd0J2TdnV2M8hcn-K2TP9qOccbw1c,306
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
156
- stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/exec/bin/.down,sha256=3xROM9J45s2C-qWZ5_IW23AU9U8YyNXI2ka_xGYNHeQ,232
157
+ stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/exec/bin/.down,sha256=WtEjm2hJ01-1GGxRmmcUqZq7VjEe5JfZZKvm8TNhNEs,219
157
158
  stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/exec/bin/.enable,sha256=sfUSPG4uHdXX95BLgivXQYLbsLBP2DjJIiSTXRtvXuY,188
158
159
  stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/exec/bin/.list,sha256=BdX3ARC-Piuwk0vFzBrcxEwtHjdFncpORzqP-hP4IwE,84
159
- stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/exec/bin/.logs,sha256=k-2a3p6LL8QOnU6o240g6an8tVhJeztR3ZsNoI5G2wc,211
160
+ stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/exec/bin/.logs,sha256=4CJVEVLn9VTQN9LAjOJpijwd_DZ5IuIXL1aFCYkelxk,178
160
161
  stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/exec/bin/.mkcert,sha256=vyHaXmvy-7oL2RD8rIxwT-fdJS5kXmB0yHK5fRMo_cM,46
161
162
  stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/exec/bin/.reset,sha256=_pvbLk-ektsCHEh_egDtd6c0sVqCPunwUWggarfoli0,238
162
163
  stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/exec/bin/.services,sha256=sAbaKzBxNDXimyUNinB_a2Kt47vUCa0Kd3Z1QAp2GrU,161
163
164
  stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/exec/bin/.snapshot,sha256=Kav1QNhKG7f0DBzc4-9dmxZMmmVTxmPqakT_W4kVYKk,241
164
- stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/exec/bin/.up,sha256=MZbIZpLlKpn-8jMFIFeIw6lfd8mc8A8GMONP-UOYwMI,267
165
+ stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/exec/bin/.up,sha256=S88O31UgsabaMvSwkQJjLF9C7mrFkyEk9x6JDE6qSXI,228
165
166
  stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/mock/.docker-compose.mock.yml,sha256=FnCn64DjxyAiB2P_1JUwFmXslMR961nVZHkYiEXytlg,232
166
167
  stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/record/.docker-compose.record.yml,sha256=t34FNYZboJSfrKnIB2oJ3UuE_mJaW77-hcbSn3sfWec,235
167
168
  stoobly_agent/app/cli/scaffold/templates/constants.py,sha256=EXBiBB_gnSINGrIqfXMaJ2w0HEaICw4FxVjwIHPBqYw,1457
@@ -175,7 +176,7 @@ stoobly_agent/app/cli/scaffold/templates/workflow/mock/lifecycle_hooks.py,sha256
175
176
  stoobly_agent/app/cli/scaffold/templates/workflow/mock/public/.gitignore,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
176
177
  stoobly_agent/app/cli/scaffold/templates/workflow/record/bin/.configure,sha256=z135hJDmBWYOhZbjuzC8-C6a0VtQ9NPx5mfCpVZliEA,210
177
178
  stoobly_agent/app/cli/scaffold/templates/workflow/record/bin/.init,sha256=GekadmBjLyAxgTJbCA_NKgUXRwKFs8iX4qtV5YlvUXk,329
178
- stoobly_agent/app/cli/scaffold/templates/workflow/record/bin/configure,sha256=qBYEj_7kvYqf7wmRLPhX9y_cx2Msmn1VcDrq02hWT4w,744
179
+ stoobly_agent/app/cli/scaffold/templates/workflow/record/bin/configure,sha256=bkMZexceMEfoh5AqybtzpGPBrCGxl7Azn6QbR-qAuWM,750
179
180
  stoobly_agent/app/cli/scaffold/templates/workflow/record/bin/init,sha256=YxWVVQMEdGarcMtBcE1Sj2kdLgUgwY9kXp3MjPsVcmg,46
180
181
  stoobly_agent/app/cli/scaffold/templates/workflow/record/lifecycle_hooks.py,sha256=4vaVc_gnDTCLEqtcZybIk5dcmXrKmGuesF6gc3-_kX8,473
181
182
  stoobly_agent/app/cli/scaffold/templates/workflow/test/bin/.configure,sha256=z135hJDmBWYOhZbjuzC8-C6a0VtQ9NPx5mfCpVZliEA,210
@@ -195,7 +196,7 @@ stoobly_agent/app/cli/scaffold/workflow_env.py,sha256=x8V5pJmIiklD3f2q2-qq-CORf4
195
196
  stoobly_agent/app/cli/scaffold/workflow_log_command.py,sha256=Bke4lMOMxuDUFuAx9nlXHbKgYMO4KAg9ASHvjz4aVWc,1372
196
197
  stoobly_agent/app/cli/scaffold/workflow_run_command.py,sha256=GXteRAgco7NCb0Ov1B2_xs1DMyLg8vdDsCvH7whrlcE,9854
197
198
  stoobly_agent/app/cli/scaffold/workflow_validate_command.py,sha256=fhHciJXg_u32Wmh8us8LhgQj8D1SxkBADtuBBF4K0FM,4377
198
- stoobly_agent/app/cli/scaffold_cli.py,sha256=xELl0zXYen7FkjLkDcb1AJXzIzbj_D519UYeYjYKjuU,26783
199
+ stoobly_agent/app/cli/scaffold_cli.py,sha256=_qpeTzctvqeQ7TxSbiizKYUp7zKTLXzTPmhSjIN2jdc,28163
199
200
  stoobly_agent/app/cli/scenario_cli.py,sha256=3J1EiJOvunkfWrEkOsanw-XrKkOk78ij_GjBlE9p7CE,8229
200
201
  stoobly_agent/app/cli/snapshot_cli.py,sha256=cpCjxFYBuVwLuq_b2lIUu-5zWqupRlrp4xWgDytirSM,10047
201
202
  stoobly_agent/app/cli/trace_cli.py,sha256=K7E-vx3JUcqEDSWOdIOi_AieKNQz7dBfmRrVvKDkzFI,4605
@@ -346,7 +347,7 @@ stoobly_agent/app/proxy/replay/replay_request_service.py,sha256=UuTPPef6jchrJSjV
346
347
  stoobly_agent/app/proxy/replay/replay_scenario_service.py,sha256=9jV-iO5EBg8geUblEtjjWRFIkom_Pqmo7P-lTc3S4Xw,2824
347
348
  stoobly_agent/app/proxy/replay/rewrite_params_service.py,sha256=jEHlT6_OHq_VBa09Hd6QaRyErv7tZnziDvW7m3Q8CQg,2234
348
349
  stoobly_agent/app/proxy/replay/trace_context.py,sha256=lKpnQWVCUTcMPE-SOi90za3U1yL0VeBlIgj_KP63VsE,10435
349
- stoobly_agent/app/proxy/run.py,sha256=QA11dDOUFpOk0PSm28zQc6zgBEehiyCx6sp0d8ETZF4,4010
350
+ stoobly_agent/app/proxy/run.py,sha256=SfzMsaY6Ugsg4XEkQeU25lTyiMC0GRDEiYR70GUUaN4,4145
350
351
  stoobly_agent/app/proxy/settings.py,sha256=R0LkSa9HrkUXvCd-nur4syJePjbQZdlnAnOPpGnCx38,2172
351
352
  stoobly_agent/app/proxy/simulate_intercept_service.py,sha256=R-L2dh2dfYFebttWXU0NwyxFI_jP6Ud36oKPC-T8HiI,1942
352
353
  stoobly_agent/app/proxy/test/__init__.py,sha256=uW0Ab27oyH2odTeVRjcuUJF8A1FLbTT5sBMzhGZr1so,89
@@ -406,7 +407,7 @@ stoobly_agent/app/settings/types/remote_settings.py,sha256=4PvEGKULXM0zv29XTDzV7
406
407
  stoobly_agent/app/settings/types/ui_settings.py,sha256=BqPy2F32AbODqzi2mp2kRk28QVUydQIwVmvftn46pco,84
407
408
  stoobly_agent/app/settings/ui_settings.py,sha256=YDEUMPuJFh0SLHaGz6O-Gpz8nwsunNzeuc-TzO9OUbM,1170
408
409
  stoobly_agent/app/settings/url_rule.py,sha256=Qx7YrIpVRSC-4LeNiCAfCtE50Jou4423hojMW-4qUYg,954
409
- stoobly_agent/cli.py,sha256=nZDwOnhcNcZlr2hlznWVDnidPMe3LkVv88HOjamAqmA,10255
410
+ stoobly_agent/cli.py,sha256=sw8Ke5mCvzQ50X-zsb2Ld_zW4T6S58P0fN5GyKNOrcQ,10255
410
411
  stoobly_agent/config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
411
412
  stoobly_agent/config/constants/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
412
413
  stoobly_agent/config/constants/alias_resolve_strategy.py,sha256=_R1tVqFnyGxCraVS5-dhSskaDj_X8-NthsY7i_bEt9M,119
@@ -415,7 +416,6 @@ stoobly_agent/config/constants/env_vars.py,sha256=HAR_ZIdXXbpWQgCDaRR5RtpVyGXCsM
415
416
  stoobly_agent/config/constants/headers.py,sha256=Hfv7R8_NPXAGaMiZPqywGZDnr0qcVUyfenPb4g465rE,169
416
417
  stoobly_agent/config/constants/intercept_policy.py,sha256=5hIgOft8PQmCRdOHb5OEvEj10tU66DIQF3GYltlWyM8,25
417
418
  stoobly_agent/config/constants/lifecycle_hooks.py,sha256=aobclZmcND_mUnFKkUgpxgwd5EU3pjgAvB-NFf2dCgE,846
418
- stoobly_agent/config/constants/mitmproxy.py,sha256=AhaxRGMb7OC4DBqNvyBP0OVQSByCeA-itefzmMoIS14,116
419
419
  stoobly_agent/config/constants/mock_policy.py,sha256=oS3eKL5Ezpnm_4zvztcLvvtKppxm7eKvOOBHYKyKpeU,133
420
420
  stoobly_agent/config/constants/mode.py,sha256=J35vV1LPQRhD2ob6DaJ7mLGJrMhv-CVnC6IHWd7b_GM,160
421
421
  stoobly_agent/config/constants/query_params.py,sha256=b-QQGKTqf-HePt0X4ltFksf5ETiIFPgBvh-kFrF7kUk,63
@@ -426,8 +426,8 @@ stoobly_agent/config/constants/statuses.py,sha256=dR88qHHnDR_5ppuKijwc0R24D_fWc6
426
426
  stoobly_agent/config/constants/test_filter.py,sha256=rQ-eMZ8kpq49pqS1PQhaRx59dlRicd-Ag4sjgoXfpY8,109
427
427
  stoobly_agent/config/constants/test_output_level.py,sha256=yrn8cs-lexrK0Ckpc_SX3NhsZPfVhNpmjzjSP62LCro,135
428
428
  stoobly_agent/config/constants/test_strategy.py,sha256=d6-WgKqElB3q_csP-QYFkhR4XvlPGfGdCJ-SBEDEoL4,152
429
- stoobly_agent/config/data_dir.py,sha256=zNp-diJRcW6tl3YHWMcShwJgRIxc8Bq7DJ2WR9hJFIM,7777
430
- stoobly_agent/config/mitmproxy.py,sha256=z9L1JSWwQFsn4gMZk8Dcz5mOcUc6dYnW1ZugrYTEttw,1902
429
+ stoobly_agent/config/data_dir.py,sha256=r0ROg7rsKhhFW_VJBO-5vKUx6t1DYozbhgvSMVE07DA,6703
430
+ stoobly_agent/config/mitmproxy.py,sha256=8APQnpa8hnktA1T69w5bzWjfC2VpPTDpsFwOxiY9ppk,1472
431
431
  stoobly_agent/config/schema.yml,sha256=aLSrTI7c6_K-fGOyoGFUdA2Prx9zQwpF3IC43LvXupo,1993
432
432
  stoobly_agent/config/settings.yml.sample,sha256=muxP1bWrtknVaSgdseFaw23tuwduILNdQTVy7aB519M,404
433
433
  stoobly_agent/config/source_dir.py,sha256=3oYwWmIrid0YsIf91AIUI2itAA3pdPA10eHaC-nmelQ,1146
@@ -651,7 +651,7 @@ stoobly_agent/test/app/cli/config/project/config_project_set_test.py,sha256=bV2O
651
651
  stoobly_agent/test/app/cli/config/rewrite_test.py,sha256=Y1zSTJJK4Q8Ac8qqHbKt-kFraBIwJIpr29_7V81OTy0,5601
652
652
  stoobly_agent/test/app/cli/config/scenario/config_scenario_set_test.py,sha256=1A5cYH3OdwtRwTmDETg0af9urHA4K6VVeA76zub2dnQ,2525
653
653
  stoobly_agent/test/app/cli/endpoint/endpoint_cli_apply_test.py,sha256=cW5RDd-spyEknV1krFv37GHgWShPVOgvPyX2jgwnWZw,3886
654
- stoobly_agent/test/app/cli/helpers/certificate_authority_test.py,sha256=Y5YkwVFKyZBbfWK-vZVo3__jzRlRDOCFNvTLbDpjGg4,2639
654
+ stoobly_agent/test/app/cli/helpers/certificate_authority_test.py,sha256=-tWLLot9L6_0m5abYN4WMu3CNBpzkCWOJhzsGCf601E,2579
655
655
  stoobly_agent/test/app/cli/helpers/openapi_endpoint_adapter_additional_props_test.py,sha256=t4Wggky_fexBrRqvK12Qgj71UKsM0gGqutOEfAdOqtk,1772
656
656
  stoobly_agent/test/app/cli/helpers/openapi_endpoint_adapter_missing_info_test.py,sha256=qA6PJEtv1tS7Ksl6R7GjbIS_f9SxINPr8SrcXTuG-WU,3027
657
657
  stoobly_agent/test/app/cli/helpers/openapi_endpoint_adapter_missing_oauth2_scopes_test.py,sha256=Gw_YtZR2EKy09jAJEGQ4phrAoHlzlqhbJ9bLH91UrRU,3143
@@ -696,7 +696,7 @@ stoobly_agent/test/app/models/factories/resource/local_db/helpers/log_test.py,sh
696
696
  stoobly_agent/test/app/models/factories/resource/local_db/helpers/tiebreak_scenario_request_test.py,sha256=a1SFLyEyRRLuADvAw6ckQQKORFXvyK1lyrbkaLWx8oU,3399
697
697
  stoobly_agent/test/app/models/factories/resource/local_db/request_adapter_test.py,sha256=Pzq1cBPnP9oSWG-p0c-VoymoHxgp483QmNwmV1b78RA,8453
698
698
  stoobly_agent/test/app/models/factories/resource/local_db/response_adapter_test.py,sha256=9P95EKH5rZGOrmRkRIDlQZqtiLJHk9735og18Ffwpfw,2204
699
- stoobly_agent/test/app/models/schemas/.stoobly/db/VERSION,sha256=H03AltWPfSHjh1ZxrubymxIKuEIY-kfbLLU7yetbTaw,5
699
+ stoobly_agent/test/app/models/schemas/.stoobly/db/VERSION,sha256=WtHxF9tp4oUNGG9uaT9BVwB0t1KF7YkB7wiElV_Nk9k,5
700
700
  stoobly_agent/test/app/models/schemas/.stoobly/db/stoobly_agent.sqlite3,sha256=ch8gNx6zIelLKQx65gwFx_LRNqUD3EC5xcHZ0ukIQiU,188416
701
701
  stoobly_agent/test/app/models/schemas/.stoobly/settings.yml,sha256=vLwMjweKOdod6tSLtIlyBefPQuNXq9wio4kBaODKtAU,726
702
702
  stoobly_agent/test/app/models/schemas/.stoobly/tmp/options.json,sha256=OTRzarwus48CTrItedXCrgQttJHSEZonEYc7R_knvYg,2212
@@ -719,7 +719,7 @@ stoobly_agent/test/cli/mock_scenario_lifecycle_hooks.py,sha256=e57A3FWHt1ZgaWKhb
719
719
  stoobly_agent/test/cli/mock_scenario_test.py,sha256=tHT-p8Vm8APP2KOlyfZ-5z_AxZO9TS4sDgui3X2qkaE,2620
720
720
  stoobly_agent/test/cli/mock_test.py,sha256=zYAFhHkR-1oafZzzL_4aPOWzM2nXWRHGt36yTAuG8Rw,5636
721
721
  stoobly_agent/test/cli/record_test.py,sha256=CG7prrooTgkW8RYaiDRYD3LuuDIR8dz8jaP9RNRrF4o,15814
722
- stoobly_agent/test/config/data_dir_test.py,sha256=sszUW6MKGFCS9JGhYL-E91hBzfI2jMaHRJMifNjZ00M,2659
722
+ stoobly_agent/test/config/data_dir_test.py,sha256=K8_RspuAKWXU745WbXDxmB49MUxswGm2q-BU3UgCX6w,2338
723
723
  stoobly_agent/test/mock_data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
724
724
  stoobly_agent/test/mock_data/endpoint_show_response.py,sha256=JFEkceHI6nH38zitCbFMozE1lODahxmvj70N5eM_sec,5901
725
725
  stoobly_agent/test/mock_data/lifecycle_hooks.py,sha256=mLUSEMD-brQhLFKximX_kNmXjzrJTpGUwXnX4BPvx1E,1054
@@ -733,12 +733,12 @@ stoobly_agent/test/mock_data/petstore-swagger-io.yaml,sha256=FbOEaArZKl1dV7jEf1h
733
733
  stoobly_agent/test/mock_data/petstore.yaml,sha256=CCdliJky04Az4FIOkFA883uunwFDHLr2Y8ohtozFi_Q,2714
734
734
  stoobly_agent/test/mock_data/request_show_response.py,sha256=K_a0fP0QT58T8sX9PaM6hqtX1A1depZsqg_GsNPf--k,707
735
735
  stoobly_agent/test/mock_data/scaffold/docker-compose-assets-service.yml,sha256=TJpkkkSjUlfz3t8Oxsz6Ery1JX7Ed79Fh6oiEuKI4i0,275
736
- stoobly_agent/test/mock_data/scaffold/docker-compose-local-service.yml,sha256=x7hYB1R9RtDDcU1NS1bkhXlTCwCgCPrOW7Y9tyAVUjs,249
736
+ stoobly_agent/test/mock_data/scaffold/docker-compose-local-service.yml,sha256=_tCvHxpIKcKMWKrtTvJgqSfkzcaNvJN1w7Yb9OUOzLU,241
737
737
  stoobly_agent/test/mock_data/scaffold/index.html,sha256=qJwuYajKZ4ihWZrJQ3BNObV5kf1VGnnm_vqlPJzdqLE,258
738
738
  stoobly_agent/test/mock_data/uspto.yaml,sha256=6U5se7C3o-86J4m9xpOk9Npias399f5CbfWzR87WKwE,7835
739
739
  stoobly_agent/test/test_helper.py,sha256=m_oAI7tmRYCNZdKfNqISWhMv3e44tjeYViQ3nTUfnos,1007
740
- stoobly_agent-1.5.4.dist-info/LICENSE,sha256=o93sj12cdoEOsTCjPaPFsw3Xq0SXs3pPcY-9reE2sEw,548
741
- stoobly_agent-1.5.4.dist-info/METADATA,sha256=7wTGEHEUE283RjC9L7VMXjswoS3XN0hiFzY9CF5vdE0,3087
742
- stoobly_agent-1.5.4.dist-info/WHEEL,sha256=XbeZDeTWKc1w7CSIyre5aMDU_-PohRwTQceYnisIYYY,88
743
- stoobly_agent-1.5.4.dist-info/entry_points.txt,sha256=aq5wix5oC8MDQtmyPGU0xaFrsjJg7WH28NmXh2sc3Z8,56
744
- stoobly_agent-1.5.4.dist-info/RECORD,,
740
+ stoobly_agent-1.5.6.dist-info/LICENSE,sha256=o93sj12cdoEOsTCjPaPFsw3Xq0SXs3pPcY-9reE2sEw,548
741
+ stoobly_agent-1.5.6.dist-info/METADATA,sha256=ai5e5H-gA0lrsFe4TNmSiBI_SaPqdNfvKo27G9v0C3s,3087
742
+ stoobly_agent-1.5.6.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
743
+ stoobly_agent-1.5.6.dist-info/entry_points.txt,sha256=aq5wix5oC8MDQtmyPGU0xaFrsjJg7WH28NmXh2sc3Z8,56
744
+ stoobly_agent-1.5.6.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 2.1.1
2
+ Generator: poetry-core 2.1.2
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
@@ -1,4 +0,0 @@
1
- import os
2
-
3
- CONF_DIR_NAME = '.mitmproxy'
4
- DEFAULT_CONF_DIR_PATH = os.path.join(os.path.expanduser('~'), CONF_DIR_NAME)