stoobly-agent 1.4.1__py3-none-any.whl → 1.4.2__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.4.1'
2
+ VERSION = '1.4.2'
@@ -1,7 +1,7 @@
1
1
  import os
2
2
  import pdb
3
3
 
4
- from ...constants import SERVICE_HOSTNAME, SERVICE_PORT, STOOBLY_CERTS_DIR
4
+ from ...constants import SERVICE_HOSTNAME, SERVICE_PORT, SERVICE_PROXY_MODE, STOOBLY_CERTS_DIR
5
5
  from .builder import WorkflowBuilder
6
6
 
7
7
  class MockDecorator():
@@ -24,7 +24,7 @@ class MockDecorator():
24
24
  '--headless',
25
25
  '--intercept',
26
26
  '--lifecycle-hooks-path', 'lifecycle_hooks.py',
27
- '--proxy-mode', config.proxy_mode,
27
+ '--proxy-mode', SERVICE_PROXY_MODE,
28
28
  '--proxy-port', f"{SERVICE_PORT}",
29
29
  '--response-fixtures-path', 'fixtures.yml',
30
30
  '--ssl-insecure'
@@ -3,7 +3,7 @@ import pdb
3
3
 
4
4
  from urllib.parse import urlparse
5
5
 
6
- from ...constants import SERVICE_HOSTNAME, SERVICE_PORT, STOOBLY_CERTS_DIR
6
+ from ...constants import SERVICE_HOSTNAME, SERVICE_PORT, SERVICE_PROXY_MODE, STOOBLY_CERTS_DIR
7
7
  from .builder import WorkflowBuilder
8
8
 
9
9
  class ReverseProxyDecorator():
@@ -25,7 +25,7 @@ class ReverseProxyDecorator():
25
25
  command = [
26
26
  '--headless',
27
27
  '--lifecycle-hooks-path', 'lifecycle_hooks.py',
28
- '--proxy-mode', config.proxy_mode,
28
+ '--proxy-mode', SERVICE_PROXY_MODE,
29
29
  '--proxy-port', f"{SERVICE_PORT}",
30
30
  '--ssl-insecure'
31
31
  ]
@@ -92,7 +92,21 @@ class ServiceConfig(Config):
92
92
  if self.__proxy_mode:
93
93
  return (self.__proxy_mode or '').strip()
94
94
 
95
- return f"reverse:{self.scheme}://{self.hostname}"
95
+ if not self.hostname:
96
+ return ''
97
+
98
+ _proxy_mode = f"reverse:{self.scheme}://{self.hostname}"
99
+
100
+ if not self.port:
101
+ return _proxy_mode
102
+
103
+ if self.scheme == 'http' and self.port == '80':
104
+ return _proxy_mode
105
+
106
+ if self.scheme == 'https' and self.port == '443':
107
+ return _proxy_mode
108
+
109
+ return f"{_proxy_mode}:{self.port}"
96
110
 
97
111
  @proxy_mode.setter
98
112
  def proxy_mode(self, v):
@@ -123,7 +137,7 @@ class ServiceConfig(Config):
123
137
  'port': self.port,
124
138
  'priority': self.priority,
125
139
  'proxy_mode': self.proxy_mode,
126
- 'scheme': self.scheme,
140
+ 'scheme': self.scheme if self.hostname else '',
127
141
  }
128
142
 
129
143
  def write(self):
@@ -61,8 +61,15 @@ stoobly_exec_run_env=$(source_env) && $(exec_env) && export CONTEXT_DIR="$(app_d
61
61
  workflow_run=$(source_env) && bash "$(workflow_run_script)"
62
62
 
63
63
  ca-cert/install: stoobly/install
64
- @echo "Running stoobly-agent ca-cert install..."; \
65
- stoobly-agent ca-cert install
64
+ @if [ ! -d "$$HOME/.mitmproxy" ]; then \
65
+ read -p "Installing CA certificate is required for $(WORKFLOW)ing requests, continue? (y/N) " confirm && \
66
+ if [ "$$confirm" = "y" ] || [ "$$confirm" = "Y" ]; then \
67
+ echo "Running stoobly-agent ca-cert install..."; \
68
+ stoobly-agent ca-cert install; \
69
+ else \
70
+ echo "You can install the CA certificate later by running: stoobly-agent ca-cert install"; \
71
+ fi \
72
+ fi
66
73
  certs:
67
74
  @export EXEC_COMMAND=bin/.mkcert && \
68
75
  $(stoobly_exec)
@@ -89,7 +96,7 @@ intercept/enable:
89
96
  @export EXEC_COMMAND=bin/.enable && \
90
97
  export EXEC_ARGS=$(scenario_key) && \
91
98
  $(stoobly_exec)
92
- mock: workflow/mock workflow/hostname/install nameservers workflow/up
99
+ mock: workflow/mock ca-cert/install workflow/hostname/install nameservers workflow/up
93
100
  mock/services: workflow/mock workflow/services
94
101
  mock/logs: workflow/mock workflow/logs
95
102
  mock/down: workflow/mock workflow/down workflow/hostname/uninstall
@@ -103,7 +110,7 @@ python/validate:
103
110
  echo "Error: Python 3.10, 3.11, or 3.12 is required."; \
104
111
  exit 1; \
105
112
  fi
106
- record: workflow/record workflow/hostname/install nameservers workflow/up
113
+ record: workflow/record ca-cert/install workflow/hostname/install nameservers workflow/up
107
114
  record/down: workflow/record workflow/down workflow/hostname/uninstall
108
115
  record/services: workflow/record workflow/services
109
116
  record/logs: workflow/record workflow/logs
@@ -139,7 +146,7 @@ scenario/snapshot:
139
146
  stoobly/install: python/validate pipx/install
140
147
  @if ! pipx list 2> /dev/null | grep -q 'stoobly-agent'; then \
141
148
  echo "stoobly-agent not found. Installing..."; \
142
- pipx install stoobly-agent; \
149
+ pipx install stoobly-agent || { echo "Failed to install stoobly-agent"; exit 1; }; \
143
150
  fi
144
151
  test: workflow/test workflow/up
145
152
  test/services: workflow/test workflow/services
@@ -108,14 +108,19 @@ def create(**kwargs):
108
108
  @click.option('--certs-dir-path', help='Path to certs directory. Defaults to the certs dir of the context.')
109
109
  @click.option('--context-dir-path', default=data_dir.context_dir_path, help='Path to Stoobly data directory.')
110
110
  @click.option('--service', multiple=True, help='Select which services to run. Defaults to all.')
111
+ @click.option('--workflow', multiple=True, help='Specify services by workflow(s). Defaults to all.')
111
112
  def mkcert(**kwargs):
112
113
  app = App(kwargs['app_dir_path'], DOCKER_NAMESPACE, **kwargs)
113
114
  __validate_app(app)
114
115
 
115
- services = __get_services(app.services, service=kwargs['service'])
116
+ services = __get_services(
117
+ app, service=kwargs['service'], without_core=True, workflow=kwargs['workflow']
118
+ )
116
119
 
117
120
  for service_name in services:
118
121
  service = Service(service_name, app)
122
+ __validate_service_dir(service.dir_path)
123
+
119
124
  service_config = ServiceConfig(service.dir_path)
120
125
 
121
126
  if service_config.scheme != 'https':
@@ -170,19 +175,23 @@ def create(**kwargs):
170
175
  @click.option('--select', multiple=True, help='Select column(s) to display.')
171
176
  @click.option('--service', multiple=True, help='Select specific services.')
172
177
  @click.option('--without-headers', is_flag=True, default=False, help='Disable printing column headers.')
173
- @click.option('--workflow', multiple=True, help='Specify workflow(s) to filter the services by.')
178
+ @click.option('--workflow', multiple=True, help='Specify workflow(s) to filter the services by. Defaults to all.')
174
179
  def _list(**kwargs):
175
- __validate_app_dir(kwargs['app_dir_path'])
176
-
177
180
  app = App(kwargs['app_dir_path'], DOCKER_NAMESPACE)
178
181
  __validate_app(app)
179
182
 
183
+ services = __get_services(app, service=kwargs['service'], workflow=kwargs['workflow'])
184
+
180
185
  rows = []
181
- for service_name in __get_workflow_services(app, **kwargs):
186
+ for service_name in services:
182
187
  service = Service(service_name, app)
183
188
  __validate_service_dir(service.dir_path)
189
+
184
190
  service_config = ServiceConfig(service.dir_path)
185
- rows.append(service_config.to_dict())
191
+ rows.append({
192
+ 'name': service_name,
193
+ **service_config.to_dict()
194
+ })
186
195
 
187
196
  print_services(rows, **select_print_options(kwargs))
188
197
 
@@ -192,9 +201,9 @@ def _list(**kwargs):
192
201
  @click.option('--app-dir-path', default=current_working_dir, help='Path to application directory.')
193
202
  @click.argument('service_name')
194
203
  def delete(**kwargs):
195
- __validate_app_dir(kwargs['app_dir_path'])
196
-
197
204
  app = App(kwargs['app_dir_path'], DOCKER_NAMESPACE)
205
+ __validate_app(app)
206
+
198
207
  service = Service(kwargs['service_name'], app)
199
208
 
200
209
  if not os.path.exists(service.dir_path):
@@ -211,9 +220,9 @@ def delete(**kwargs):
211
220
  @click.option('--priority', help='Determines the service run order.')
212
221
  @click.argument('service_name')
213
222
  def update(**kwargs):
214
- __validate_app_dir(kwargs['app_dir_path'])
215
-
216
223
  app = App(kwargs['app_dir_path'], DOCKER_NAMESPACE)
224
+ __validate_app(app)
225
+
217
226
  service = Service(kwargs['service_name'], app)
218
227
 
219
228
  __validate_service_dir(service.dir_path)
@@ -304,8 +313,9 @@ def down(**kwargs):
304
313
  if kwargs['namespace'] and not kwargs['network']:
305
314
  kwargs['network'] = kwargs['namespace']
306
315
 
307
- workflow = Workflow(kwargs['workflow_name'], app)
308
- services = __get_services(workflow.services, service=kwargs['service'])
316
+ services = __get_services(
317
+ app, service=kwargs['service'], workflow=[kwargs['workflow_name']]
318
+ )
309
319
 
310
320
  commands: List[WorkflowRunCommand] = []
311
321
  for service in services:
@@ -379,8 +389,9 @@ def logs(**kwargs):
379
389
  if len(kwargs['container']) == 0:
380
390
  kwargs['container'] = [WORKFLOW_CONTAINER_PROXY]
381
391
 
382
- workflow = Workflow(kwargs['workflow_name'], app)
383
- services = __get_services(workflow.services, service=kwargs['service'], without_core=True)
392
+ services = __get_services(
393
+ app, service=kwargs['service'], without_core=True, workflow=[kwargs['workflow_name']]
394
+ )
384
395
 
385
396
  commands: List[WorkflowLogCommand] = []
386
397
  for service in services:
@@ -445,10 +456,12 @@ def up(**kwargs):
445
456
  if kwargs['namespace'] and not kwargs['network']:
446
457
  kwargs['network'] = kwargs['namespace']
447
458
 
448
- workflow = Workflow(kwargs['workflow_name'], app)
449
- services = __get_services(workflow.services, service=kwargs['service'])
459
+ services = __get_services(
460
+ app, service=kwargs['service'], workflow=[kwargs['workflow_name']]
461
+ )
450
462
 
451
463
  # Gateway ports are dynamically set depending on the workflow run
464
+ workflow = Workflow(kwargs['workflow_name'], app)
452
465
  set_gateway_ports(workflow.service_paths_from_services(services))
453
466
 
454
467
  commands: List[WorkflowRunCommand] = []
@@ -541,13 +554,15 @@ def validate(**kwargs):
541
554
  help="Update the system hosts file for all scaffold service hostnames"
542
555
  )
543
556
  @click.option('--app-dir-path', default=current_working_dir, help='Path to application directory.')
544
- @click.option('--service', multiple=True, help='Select specific services.')
545
- @click.option('--workflow', multiple=True, help='Specify services by workflow(s).')
557
+ @click.option('--service', multiple=True, help='Select specific services. Defaults to all.')
558
+ @click.option('--workflow', multiple=True, help='Specify services by workflow(s). Defaults to all.')
546
559
  def install(**kwargs):
547
560
  app = App(kwargs['app_dir_path'], DOCKER_NAMESPACE)
548
561
  __validate_app(app)
549
562
 
550
- services = __get_workflow_services(app, **kwargs)
563
+ services = __get_services(
564
+ app, service=kwargs['service'], without_core=True, workflow=kwargs['workflow']
565
+ )
551
566
 
552
567
  hostnames = []
553
568
  for service_name in services:
@@ -571,13 +586,15 @@ def install(**kwargs):
571
586
  help="Delete from the system hosts file all scaffold service hostnames"
572
587
  )
573
588
  @click.option('--app-dir-path', default=current_working_dir, help='Path to application directory.')
574
- @click.option('--service', multiple=True, help='Select specific services.')
575
- @click.option('--workflow', multiple=True, help='Specify services by workflow(s).')
589
+ @click.option('--service', multiple=True, help='Select specific services. Defaults to all.')
590
+ @click.option('--workflow', multiple=True, help='Specify services by workflow(s). Defaults to all.')
576
591
  def uninstall(**kwargs):
577
592
  app = App(kwargs['app_dir_path'], DOCKER_NAMESPACE)
578
593
  __validate_app(app)
579
594
 
580
- services = __get_workflow_services(app, **kwargs)
595
+ services = __get_services(
596
+ app, service=kwargs['service'], without_core=True, workflow=kwargs['workflow']
597
+ )
581
598
 
582
599
  hostnames = []
583
600
  for service_name in services:
@@ -609,39 +626,37 @@ def __elevate_sudo():
609
626
  subprocess.run(["sudo", sys.executable] + sys.argv)
610
627
  sys.exit(0)
611
628
 
612
- def __get_services(services: List[str], **kwargs) -> List[str]:
629
+ def __get_services(app: App, **kwargs):
613
630
  selected_services = list(kwargs['service'])
614
631
 
615
- # If service is specified, run only those services
616
- if selected_services:
617
- missing_services = [service for service in selected_services if service not in services]
632
+ if not selected_services:
633
+ selected_services = app.services
634
+ else:
635
+ selected_services += CORE_SERVICES
636
+ missing_services = [service for service in selected_services if service not in app.services]
618
637
 
619
- # Remove services that don't exist
620
638
  if missing_services:
639
+ # Warn if an invalid service is provided
621
640
  Logger.instance(LOG_ID).warn(f"Service(s) {','.join(missing_services)} are not found")
622
- selected_services = list(set(selected_services) - set(missing_services))
623
641
 
624
- services = selected_services
642
+ # Remove services that don't exist
643
+ selected_services = list(set(selected_services) - set(missing_services))
625
644
 
626
- services += CORE_SERVICES
645
+ # If without_score is set, filter out CORE_SERVICES
646
+ if kwargs.get('without_core'):
647
+ selected_services = list(set(selected_services) - set(CORE_SERVICES))
627
648
 
628
- services_index = {}
629
- for service in services:
630
- if kwargs.get('without_core') and service in CORE_SERVICES:
631
- continue
632
- services_index[service] = True
633
-
634
- return services_index.keys()
635
-
636
- def __get_workflow_services(app: App, **kwargs):
637
- selected_services = []
638
- if not kwargs['workflow']:
639
- selected_services += __get_services(app.services, service=kwargs['service'], without_core=True)
640
- else:
649
+ # If workflow is set, keep only services in the workflow
650
+ if kwargs.get('workflow'):
651
+ workflow_services = []
641
652
  for workflow_name in kwargs['workflow']:
642
653
  workflow = Workflow(workflow_name, app)
643
- selected_services += __get_services(workflow.services, service=kwargs['service'], without_core=True)
644
- return set(selected_services)
654
+ workflow_services += workflow.services
655
+
656
+ # Intersection
657
+ selected_services = list(filter(lambda x: x in workflow_services, selected_services))
658
+
659
+ return list(set(selected_services))
645
660
 
646
661
  def __print_header(text: str):
647
662
  Logger.instance(LOG_ID).info(f"{bcolors.OKBLUE}{text}{bcolors.ENDC}")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: stoobly-agent
3
- Version: 1.4.1
3
+ Version: 1.4.2
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=WY71ZV8dbTRkfHb3ftjHsgTWeLuG9efgIYp8xc2A8Qk,44
1
+ stoobly_agent/__init__.py,sha256=fihCDP2FvrNTuWxSlgwYRREc1dhd8hCm3TlzVPcHgx4,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
@@ -88,14 +88,14 @@ stoobly_agent/app/cli/scaffold/docker/workflow/build_decorator.py,sha256=vbmME0c
88
88
  stoobly_agent/app/cli/scaffold/docker/workflow/builder.py,sha256=G9zyw_jS0HEHtzl0EvoDQ9MlpTavlyWz0xFpgEZoyVc,6844
89
89
  stoobly_agent/app/cli/scaffold/docker/workflow/decorators_factory.py,sha256=oi0Hkii2W9338IeG7BG2medQxqZUbBp71Cvj-qDunII,987
90
90
  stoobly_agent/app/cli/scaffold/docker/workflow/development_decorator.py,sha256=cs00Cc2DuOYrGD8W9849PjHz6k2xyx0fSizqJlM7yR8,946
91
- stoobly_agent/app/cli/scaffold/docker/workflow/mock_decorator.py,sha256=V9y4RIyEIT8SiGm3U9OcmU1dr22wqpbSbGO_Z2EMYEI,1197
92
- stoobly_agent/app/cli/scaffold/docker/workflow/reverse_proxy_decorator.py,sha256=s1l99Y-2h-sSLVtPhcgaa1YRTbSvb6QdgaUeBLHYc4w,1804
91
+ stoobly_agent/app/cli/scaffold/docker/workflow/mock_decorator.py,sha256=A0MvgT3nTB2SjBVwcpq1_AggWb8gU9HHD64E9JbhpDc,1218
92
+ stoobly_agent/app/cli/scaffold/docker/workflow/reverse_proxy_decorator.py,sha256=eeB1Y7L6xYlD9w7oO7a4Ou0Gvfvvd2znnqrZQQz6IlQ,1825
93
93
  stoobly_agent/app/cli/scaffold/env.py,sha256=e-Ve4p3RUgzFx22B3SIYttvJ_yLuDtA27oDACZ8n-6E,1140
94
94
  stoobly_agent/app/cli/scaffold/hosts_file_manager.py,sha256=FiX1hYEWN4cJiCOV4h6wOOlY7t71uwIwe6t2upS65aQ,5006
95
95
  stoobly_agent/app/cli/scaffold/managed_services_docker_compose.py,sha256=-wLBXUi7DCWsfm5KzZzd_kdJKOTl1NT924XR7dyjbSY,574
96
96
  stoobly_agent/app/cli/scaffold/service.py,sha256=L9K6QE0k5KSEC8_fSwtdwwTSO_DsIpqSPW-AG7Bg76o,501
97
97
  stoobly_agent/app/cli/scaffold/service_command.py,sha256=9kIKiFC5Jo425VWYD4NDvUOdMP-pNyq2D5Ip1ZAPj3A,1054
98
- stoobly_agent/app/cli/scaffold/service_config.py,sha256=SRtBxdLLa4omAd0JaXsPoyAUu9_PdJ4aVxZOiFMMH8o,3275
98
+ stoobly_agent/app/cli/scaffold/service_config.py,sha256=NwJL4gwWQ_9B0fHrit1QekR6rSMg40m1CDizWxUNWCM,3598
99
99
  stoobly_agent/app/cli/scaffold/service_create_command.py,sha256=bmLGgx9qnh-X_i2_XfdWSQIer0gGkaQx6lXZSIzy-LI,2793
100
100
  stoobly_agent/app/cli/scaffold/service_delete_command.py,sha256=_nBDQjm8eL62MQpzSCxgUHlW04ZXKG8MDlN1BXxlqww,986
101
101
  stoobly_agent/app/cli/scaffold/service_docker_compose.py,sha256=OMUN1-ujQYIZXxDvS4XBf5C9wGalQULkwOiBBQPZbHY,820
@@ -103,7 +103,7 @@ stoobly_agent/app/cli/scaffold/service_workflow.py,sha256=sQ_Edy_wGHKMXpD0DmhnOW
103
103
  stoobly_agent/app/cli/scaffold/service_workflow_validate_command.py,sha256=hF3c6cFRaKH01BfwdrCJdX8SEbsfD5CCG8W_yZU4FK4,9948
104
104
  stoobly_agent/app/cli/scaffold/templates/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
105
105
  stoobly_agent/app/cli/scaffold/templates/app/.Dockerfile.context,sha256=PRNYTWYYcLfcyrZ5h5u2I7dAJdeFmmxRFpAj_8243Bw,158
106
- stoobly_agent/app/cli/scaffold/templates/app/.Makefile,sha256=GSghwhsDq4w9UsZuAc_Ozau5hHrOIJSh9B8yhtSOwH4,7649
106
+ stoobly_agent/app/cli/scaffold/templates/app/.Makefile,sha256=F1OIlNw87Vw3HZqWeW908PVEnUtuIWC2gb6Bmivkr5A,8069
107
107
  stoobly_agent/app/cli/scaffold/templates/app/.docker-compose.base.yml,sha256=YblNDTUPndYNxupgZ3X8RP6NS4c0u_QwLklyWrpq_qs,295
108
108
  stoobly_agent/app/cli/scaffold/templates/app/Makefile,sha256=TEmPG7Bf0KZOnmfsgdzza3UdwcVMmM5Lj1YdLc4cgjA,79
109
109
  stoobly_agent/app/cli/scaffold/templates/app/build/.config.yml,sha256=8Wt8ZZ5irvBYYS44xGrR_EWlZDuXH9kyWmquzsh7s8g,19
@@ -195,7 +195,7 @@ stoobly_agent/app/cli/scaffold/workflow_env.py,sha256=x8V5pJmIiklD3f2q2-qq-CORf4
195
195
  stoobly_agent/app/cli/scaffold/workflow_log_command.py,sha256=Bke4lMOMxuDUFuAx9nlXHbKgYMO4KAg9ASHvjz4aVWc,1372
196
196
  stoobly_agent/app/cli/scaffold/workflow_run_command.py,sha256=DJNyhPrvvZgOwFnPKi5Z3VdrAWfaZW_XbGfgFcnh5QM,9608
197
197
  stoobly_agent/app/cli/scaffold/workflow_validate_command.py,sha256=fhHciJXg_u32Wmh8us8LhgQj8D1SxkBADtuBBF4K0FM,4377
198
- stoobly_agent/app/cli/scaffold_cli.py,sha256=T6kunIY8hMjBhvOydYRKWBjrmOs4X5FXcf-blOKGvyM,25977
198
+ stoobly_agent/app/cli/scaffold_cli.py,sha256=1AjgMhHfjt9HEdShmYLVFhruJ0f2VZyUSvpJycTtGdM,26307
199
199
  stoobly_agent/app/cli/scenario_cli.py,sha256=3J1EiJOvunkfWrEkOsanw-XrKkOk78ij_GjBlE9p7CE,8229
200
200
  stoobly_agent/app/cli/snapshot_cli.py,sha256=cpCjxFYBuVwLuq_b2lIUu-5zWqupRlrp4xWgDytirSM,10047
201
201
  stoobly_agent/app/cli/trace_cli.py,sha256=K7E-vx3JUcqEDSWOdIOi_AieKNQz7dBfmRrVvKDkzFI,4605
@@ -730,8 +730,8 @@ stoobly_agent/test/mock_data/scaffold/docker-compose-local-service.yml,sha256=x7
730
730
  stoobly_agent/test/mock_data/scaffold/index.html,sha256=qJwuYajKZ4ihWZrJQ3BNObV5kf1VGnnm_vqlPJzdqLE,258
731
731
  stoobly_agent/test/mock_data/uspto.yaml,sha256=6U5se7C3o-86J4m9xpOk9Npias399f5CbfWzR87WKwE,7835
732
732
  stoobly_agent/test/test_helper.py,sha256=m_oAI7tmRYCNZdKfNqISWhMv3e44tjeYViQ3nTUfnos,1007
733
- stoobly_agent-1.4.1.dist-info/LICENSE,sha256=8QKGyy45eN76Zk52h8gu1DKX2B_gbWgZ3nzDLofEbaE,548
734
- stoobly_agent-1.4.1.dist-info/METADATA,sha256=LSnoRzku6oP5q5Vy9KIfdSOlYldZLc4wlcvuJYHIbWA,3384
735
- stoobly_agent-1.4.1.dist-info/WHEEL,sha256=XbeZDeTWKc1w7CSIyre5aMDU_-PohRwTQceYnisIYYY,88
736
- stoobly_agent-1.4.1.dist-info/entry_points.txt,sha256=aq5wix5oC8MDQtmyPGU0xaFrsjJg7WH28NmXh2sc3Z8,56
737
- stoobly_agent-1.4.1.dist-info/RECORD,,
733
+ stoobly_agent-1.4.2.dist-info/LICENSE,sha256=8QKGyy45eN76Zk52h8gu1DKX2B_gbWgZ3nzDLofEbaE,548
734
+ stoobly_agent-1.4.2.dist-info/METADATA,sha256=s7d8HJFX_n4hI7qcFJ3pFkoF-tmRNMIyOAq-CI59vKQ,3384
735
+ stoobly_agent-1.4.2.dist-info/WHEEL,sha256=XbeZDeTWKc1w7CSIyre5aMDU_-PohRwTQceYnisIYYY,88
736
+ stoobly_agent-1.4.2.dist-info/entry_points.txt,sha256=aq5wix5oC8MDQtmyPGU0xaFrsjJg7WH28NmXh2sc3Z8,56
737
+ stoobly_agent-1.4.2.dist-info/RECORD,,