stoobly-agent 1.6.6__py3-none-any.whl → 1.6.7__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 (42) hide show
  1. stoobly_agent/__init__.py +1 -1
  2. stoobly_agent/app/cli/scaffold/constants.py +1 -0
  3. stoobly_agent/app/cli/scaffold/docker/service/builder.py +98 -13
  4. stoobly_agent/app/cli/scaffold/docker/workflow/builder.py +12 -60
  5. stoobly_agent/app/cli/scaffold/service_create_command.py +1 -1
  6. stoobly_agent/app/cli/scaffold/templates/app/build/.docker-compose.base.yml +4 -2
  7. stoobly_agent/app/cli/scaffold/templates/app/build/mock/.docker-compose.mock.yml +2 -2
  8. stoobly_agent/app/cli/scaffold/templates/app/build/mock/docker-compose.yml +7 -0
  9. stoobly_agent/app/cli/scaffold/templates/app/build/record/.docker-compose.record.yml +2 -2
  10. stoobly_agent/app/cli/scaffold/templates/app/build/record/docker-compose.yml +7 -0
  11. stoobly_agent/app/cli/scaffold/templates/app/build/test/.docker-compose.test.yml +2 -2
  12. stoobly_agent/app/cli/scaffold/templates/app/build/test/docker-compose.yml +7 -0
  13. stoobly_agent/app/cli/scaffold/templates/app/entrypoint/.docker-compose.base.yml +4 -5
  14. stoobly_agent/app/cli/scaffold/templates/app/entrypoint/mock/.docker-compose.mock.yml +2 -8
  15. stoobly_agent/app/cli/scaffold/templates/app/entrypoint/mock/docker-compose.yml +4 -11
  16. stoobly_agent/app/cli/scaffold/templates/app/entrypoint/record/.docker-compose.record.yml +2 -8
  17. stoobly_agent/app/cli/scaffold/templates/app/entrypoint/record/docker-compose.yml +3 -6
  18. stoobly_agent/app/cli/scaffold/templates/app/entrypoint/test/.docker-compose.test.yml +2 -8
  19. stoobly_agent/app/cli/scaffold/templates/app/entrypoint/test/docker-compose.yml +3 -6
  20. stoobly_agent/app/cli/scaffold/templates/build/services/build/mock/.init +1 -1
  21. stoobly_agent/app/cli/scaffold/templates/build/services/build/record/.init +1 -1
  22. stoobly_agent/app/cli/scaffold/templates/build/services/build/test/.init +1 -1
  23. stoobly_agent/app/cli/scaffold/templates/build/services/entrypoint/mock/.init +1 -1
  24. stoobly_agent/app/cli/scaffold/templates/build/services/entrypoint/record/.init +1 -1
  25. stoobly_agent/app/cli/scaffold/templates/build/services/entrypoint/test/.init +1 -1
  26. stoobly_agent/app/cli/scaffold/templates/build/workflows/mock/.init +1 -1
  27. stoobly_agent/app/cli/scaffold/templates/build/workflows/record/.init +1 -1
  28. stoobly_agent/app/cli/scaffold/templates/build/workflows/test/.init +1 -1
  29. stoobly_agent/app/cli/scaffold/templates/workflow/mock/bin/configure +2 -2
  30. stoobly_agent/app/cli/scaffold/templates/workflow/mock/bin/init +3 -1
  31. stoobly_agent/app/cli/scaffold/templates/workflow/record/bin/configure +4 -4
  32. stoobly_agent/app/cli/scaffold/templates/workflow/record/bin/init +3 -1
  33. stoobly_agent/app/cli/scaffold/templates/workflow/test/bin/configure +2 -2
  34. stoobly_agent/app/cli/scaffold/templates/workflow/test/bin/init +3 -1
  35. stoobly_agent/app/cli/scaffold/workflow_create_command.py +4 -2
  36. stoobly_agent/app/cli/scaffold_cli.py +2 -2
  37. stoobly_agent/test/app/models/schemas/.stoobly/db/VERSION +1 -1
  38. {stoobly_agent-1.6.6.dist-info → stoobly_agent-1.6.7.dist-info}/METADATA +1 -1
  39. {stoobly_agent-1.6.6.dist-info → stoobly_agent-1.6.7.dist-info}/RECORD +42 -39
  40. {stoobly_agent-1.6.6.dist-info → stoobly_agent-1.6.7.dist-info}/WHEEL +1 -1
  41. {stoobly_agent-1.6.6.dist-info → stoobly_agent-1.6.7.dist-info}/LICENSE +0 -0
  42. {stoobly_agent-1.6.6.dist-info → stoobly_agent-1.6.7.dist-info}/entry_points.txt +0 -0
stoobly_agent/__init__.py CHANGED
@@ -1,2 +1,2 @@
1
1
  COMMAND = 'stoobly-agent'
2
- VERSION = '1.6.6'
2
+ VERSION = '1.6.7'
@@ -4,6 +4,7 @@ from typing import Literal
4
4
 
5
5
  from stoobly_agent.config.data_dir import CERTS_DIR_NAME, DATA_DIR_NAME
6
6
 
7
+ APP_DIR = '${APP_DIR}'
7
8
  APP_DIR_ENV = 'APP_DIR'
8
9
  APP_NETWORK_ENV = 'APP_NETWORK'
9
10
  APP_NAME_ENV = 'APP_NAME'
@@ -1,8 +1,17 @@
1
1
  import os
2
2
  import pdb
3
3
 
4
+ from typing import List
5
+
6
+ from stoobly_agent.config.data_dir import DATA_DIR_NAME
7
+
4
8
  from ...app_config import AppConfig
5
- from ...constants import WORKFLOW_SCRIPTS, WORKFLOW_TEMPLATE
9
+ from ...constants import (
10
+ APP_DIR, DOCKER_NAMESPACE, SERVICE_NAME, SERVICE_NAME_ENV,
11
+ SERVICE_HOSTNAME, SERVICE_HOSTNAME_ENV, SERVICE_NAME_ENV, SERVICE_PORT, SERVICE_PORT_ENV, SERVICE_SCHEME, SERVICE_SCHEME_ENV,
12
+ STOOBLY_HOME_DIR, STOOBLY_HOME_DIR,
13
+ WORKFLOW_NAME, WORKFLOW_NAME_ENV, WORKFLOW_SCRIPTS, WORKFLOW_TEMPLATE
14
+ )
6
15
  from ...service_config import ServiceConfig
7
16
  from ..app_builder import AppBuilder
8
17
  from ..builder import Builder
@@ -20,16 +29,16 @@ class ServiceBuilder(Builder):
20
29
  self.app_builder = app_builder
21
30
 
22
31
  self.__config = config
32
+ self.__env = [SERVICE_NAME_ENV, WORKFLOW_NAME_ENV]
23
33
  self.__service_name = os.path.basename(service_path)
34
+ self.__working_dir = os.path.join(
35
+ STOOBLY_HOME_DIR, DATA_DIR_NAME, DOCKER_NAMESPACE, SERVICE_NAME, WORKFLOW_NAME
36
+ )
24
37
 
25
38
  @property
26
39
  def app_base(self):
27
40
  return f"{self.service_name}.app_base"
28
41
 
29
- @property
30
- def init_base(self):
31
- return f"{self.service_name}.init_base"
32
-
33
42
  @property
34
43
  def config(self):
35
44
  return self.__config
@@ -49,6 +58,14 @@ class ServiceBuilder(Builder):
49
58
  else:
50
59
  return self.app_builder.context_base
51
60
 
61
+ @property
62
+ def init_base(self):
63
+ return f"{self.service_name}.init_base"
64
+
65
+ @property
66
+ def init_base_service(self):
67
+ return self.services.get(self.init_base)
68
+
52
69
  @property
53
70
  def proxy_base(self):
54
71
  return f"{self.service_name}.proxy_base"
@@ -74,15 +91,45 @@ class ServiceBuilder(Builder):
74
91
  if not self.config.hostname:
75
92
  return
76
93
 
77
- self.with_service(self.proxy_base, {
94
+ environment = { **self.env_dict() }
95
+ volumes = []
96
+
97
+ environment['VIRTUAL_HOST'] = SERVICE_HOSTNAME
98
+ environment['VIRTUAL_PORT'] = SERVICE_PORT
99
+ environment['VIRTUAL_PROTO'] = SERVICE_SCHEME
100
+
101
+ if self.config.detached:
102
+ volumes.append(f"{self.service_name}:{STOOBLY_HOME_DIR}/{DATA_DIR_NAME}")
103
+ volumes.append(f"../..:{STOOBLY_HOME_DIR}/{DATA_DIR_NAME}/{DOCKER_NAMESPACE}")
104
+
105
+ base = {
106
+ 'environment': environment,
78
107
  'extends': {
79
108
  'file': os.path.relpath(self.app_builder.compose_file_path, self.dir_path),
80
109
  'service': self.extends_service
81
110
  },
82
- })
111
+ 'working_dir': self.__working_dir,
112
+ }
113
+
114
+ if len(volumes):
115
+ base['volumes'] = volumes
116
+
117
+ self.with_service(self.proxy_base, base)
83
118
 
84
119
  def build_init_base(self):
85
- environment = {}
120
+ environment = { **self.env_dict() }
121
+ volumes = [f"{APP_DIR}:/app"]
122
+
123
+ if self.config.hostname:
124
+ self.__with_url_environment(environment)
125
+
126
+ if self.config.detached:
127
+ # Mount named volume
128
+ volumes.append(f"{self.service_name}:{STOOBLY_HOME_DIR}/{DATA_DIR_NAME}")
129
+
130
+ # Mount docker folder
131
+ volumes.append(f"../..:{STOOBLY_HOME_DIR}/{DATA_DIR_NAME}/{DOCKER_NAMESPACE}")
132
+
86
133
  self.with_service(self.init_base, {
87
134
  'command': [f"{WORKFLOW_SCRIPTS}/{WORKFLOW_TEMPLATE}/.init", 'bin/init'],
88
135
  'environment': environment,
@@ -90,18 +137,47 @@ class ServiceBuilder(Builder):
90
137
  'file': os.path.relpath(self.app_builder.compose_file_path, self.dir_path),
91
138
  'service': self.extends_service
92
139
  },
140
+ 'volumes': volumes,
141
+ 'working_dir': self.__working_dir,
93
142
  })
94
143
 
95
144
  def build_configure_base(self):
96
- environment = {}
97
- self.with_service(self.configure_base, {
145
+ environment = { **self.env_dict() }
146
+ volumes = []
147
+
148
+ if self.config.hostname:
149
+ self.__with_url_environment(environment)
150
+
151
+ if self.config.detached:
152
+ volumes.append(f"{self.service_name}:{STOOBLY_HOME_DIR}/${DATA_DIR_NAME}")
153
+ volumes.append(f"../..:{STOOBLY_HOME_DIR}/{DATA_DIR_NAME}/{DOCKER_NAMESPACE}")
154
+
155
+ base = {
98
156
  'command': [f"{WORKFLOW_SCRIPTS}/{WORKFLOW_TEMPLATE}/.configure", 'bin/configure'],
99
157
  'environment': environment,
100
158
  'extends': {
101
159
  'file': os.path.relpath(self.app_builder.compose_file_path, self.dir_path),
102
160
  'service': self.extends_service
103
- }
104
- })
161
+ },
162
+ 'working_dir': self.__working_dir,
163
+ }
164
+
165
+ if len(volumes):
166
+ base['volumes'] = volumes
167
+
168
+ self.with_service(self.configure_base, base)
169
+
170
+ def env_dict(self):
171
+ env = {}
172
+ for e in self.__env:
173
+ env[e] = '${' + e + '}'
174
+ return env
175
+
176
+ def with_env(self, v: List[str]):
177
+ if not isinstance(v, list):
178
+ return self
179
+ self.__env += v
180
+ return self
105
181
 
106
182
  def write(self):
107
183
  self.build_init_base()
@@ -117,4 +193,13 @@ class ServiceBuilder(Builder):
117
193
  if self.networks:
118
194
  compose['networks'] = self.networks
119
195
 
120
- super().write(compose)
196
+ super().write(compose)
197
+
198
+ def __with_url_environment(self, environment):
199
+ environment[SERVICE_HOSTNAME_ENV] = SERVICE_HOSTNAME
200
+
201
+ if self.config.scheme:
202
+ environment[SERVICE_SCHEME_ENV] = SERVICE_SCHEME
203
+
204
+ if self.config.port:
205
+ environment[SERVICE_PORT_ENV] = SERVICE_PORT
@@ -1,14 +1,10 @@
1
1
  import os
2
2
  import pdb
3
3
 
4
- from typing import List
5
-
6
- from stoobly_agent.config.data_dir import DATA_DIR_NAME
7
-
8
4
  from ...constants import (
9
- COMPOSE_TEMPLATE, DOCKER_NAMESPACE, STOOBLY_HOME_DIR, SERVICE_HOSTNAME, SERVICE_HOSTNAME_ENV, SERVICE_NAME_ENV,
10
- SERVICE_PORT, SERVICE_PORT_ENV, SERVICE_SCHEME, SERVICE_SCHEME_ENV,
11
- WORKFLOW_CONTAINER_CONFIGURE_TEMPLATE, WORKFLOW_CONTAINER_INIT_TEMPLATE, WORKFLOW_CONTAINER_PROXY_TEMPLATE, WORKFLOW_NAME_ENV
5
+ COMPOSE_TEMPLATE, SERVICE_HOSTNAME,
6
+ SERVICE_HOSTNAME_ENV, SERVICE_NAME_ENV, SERVICE_PORT, SERVICE_PORT_ENV, SERVICE_SCHEME, SERVICE_SCHEME_ENV,
7
+ WORKFLOW_CONTAINER_CONFIGURE_TEMPLATE, WORKFLOW_CONTAINER_INIT_TEMPLATE, WORKFLOW_CONTAINER_PROXY_TEMPLATE, WORKFLOW_NAME, WORKFLOW_NAME_ENV
12
8
  )
13
9
  from ..builder import Builder
14
10
  from ..service.builder import ServiceBuilder
@@ -21,16 +17,13 @@ class WorkflowBuilder(Builder):
21
17
  super().__init__(workflow_path, COMPOSE_TEMPLATE.format(workflow=self.__workflow_name))
22
18
 
23
19
  self.__context = '../'
24
- self.__profiles = [self.__workflow_name]
20
+ self.__profiles = [WORKFLOW_NAME]
25
21
 
26
22
  if not service_builder:
27
23
  service_path = os.path.dirname(workflow_path)
28
24
  service_builder = ServiceBuilder(service_path)
29
25
 
30
26
  self.__service_builder = service_builder
31
- self.__working_dir = os.path.join(
32
- STOOBLY_HOME_DIR, DATA_DIR_NAME, DOCKER_NAMESPACE, self.service_builder.service_name, self.workflow_name
33
- )
34
27
 
35
28
  @property
36
29
  def app(self):
@@ -40,10 +33,6 @@ class WorkflowBuilder(Builder):
40
33
  def base_compose_file_path(self):
41
34
  return os.path.relpath(self.service_builder.compose_file_path, self.dir_path)
42
35
 
43
- @property
44
- def init(self):
45
- return WORKFLOW_CONTAINER_INIT_TEMPLATE.format(service_name=self.namespace)
46
-
47
36
  @property
48
37
  def config(self):
49
38
  return self.service_builder.config
@@ -60,6 +49,10 @@ class WorkflowBuilder(Builder):
60
49
  def context_docker_file_path(self):
61
50
  return os.path.relpath(self.service_builder.app_builder.context_docker_file_path, self.service_path)
62
51
 
52
+ @property
53
+ def init(self):
54
+ return WORKFLOW_CONTAINER_INIT_TEMPLATE.format(service_name=self.namespace)
55
+
63
56
  @property
64
57
  def namespace(self):
65
58
  return f"{self.service_builder.service_name}"
@@ -97,26 +90,16 @@ class WorkflowBuilder(Builder):
97
90
  self.build_proxy() # Depends on configure, must call build_configure first
98
91
 
99
92
  def build_init(self):
100
- environment = { **self.env_dict() }
101
- volumes = []
93
+ # If the init_base service does not exist, we can't extend from it, return
94
+ if not self.service_builder.init_base_service:
95
+ return
102
96
 
97
+ return
103
98
  service = {
104
- 'environment': environment,
105
99
  'extends': self.service_builder.build_extends_init_base(self.dir_path),
106
100
  'profiles': self.profiles,
107
- 'volumes': volumes,
108
- 'working_dir': self.__working_dir,
109
101
  }
110
102
 
111
- if self.config.hostname:
112
- self.__with_url_environment(environment)
113
-
114
- if self.config.detached:
115
- # Mount named volume
116
- volumes.append(f"{self.service_builder.service_name}:{STOOBLY_HOME_DIR}/.stoobly")
117
- # Mount docker folder
118
- volumes.append(f"../..:{STOOBLY_HOME_DIR}/.stoobly/docker")
119
-
120
103
  self.with_service(self.init, service)
121
104
 
122
105
  def build_configure(self):
@@ -125,30 +108,18 @@ class WorkflowBuilder(Builder):
125
108
  return
126
109
 
127
110
  depends_on = {}
128
- environment = { **self.env_dict() }
129
- volumes = []
130
111
 
131
112
  service = {
132
113
  'depends_on': depends_on,
133
- 'environment': environment,
134
114
  'extends': self.service_builder.build_extends_configure_base(self.dir_path),
135
115
  'profiles': self.profiles,
136
- 'volumes': volumes,
137
- 'working_dir': self.__working_dir,
138
116
  }
139
117
 
140
- if self.config.hostname:
141
- self.__with_url_environment(environment)
142
-
143
118
  if self.init in self.services:
144
119
  depends_on[self.init] = {
145
120
  'condition': 'service_completed_successfully',
146
121
  }
147
122
 
148
- if self.config.detached:
149
- volumes.append(f"{self.service_builder.service_name}:{STOOBLY_HOME_DIR}/.stoobly")
150
- volumes.append(f"../..:{STOOBLY_HOME_DIR}/.stoobly/docker")
151
-
152
123
  self.with_service(self.configure, service)
153
124
 
154
125
  def build_proxy(self):
@@ -157,18 +128,13 @@ class WorkflowBuilder(Builder):
157
128
  return
158
129
 
159
130
  depends_on = {}
160
- environment = { **self.env_dict() }
161
131
  networks = {}
162
- volumes = []
163
132
 
164
133
  service = {
165
134
  'depends_on': depends_on,
166
- 'environment': environment,
167
135
  'extends': self.service_builder.build_extends_proxy_base(self.dir_path),
168
136
  'networks': networks,
169
137
  'profiles': self.profiles,
170
- 'volumes': volumes,
171
- 'working_dir': self.__working_dir,
172
138
  }
173
139
 
174
140
  if self.configure in self.services:
@@ -180,18 +146,10 @@ class WorkflowBuilder(Builder):
180
146
  'condition': 'service_completed_successfully',
181
147
  }
182
148
 
183
- environment['VIRTUAL_HOST'] = SERVICE_HOSTNAME
184
- environment['VIRTUAL_PORT'] = SERVICE_PORT
185
- environment['VIRTUAL_PROTO'] = SERVICE_SCHEME
186
-
187
149
  # Expose this container service to the public network
188
150
  # so that it is accessible to other Stoobly services
189
151
  networks[self.egress_network_name] = {}
190
152
 
191
- if self.config.detached:
192
- volumes.append(f"{self.service_builder.service_name}:{STOOBLY_HOME_DIR}/.stoobly")
193
- volumes.append(f"../..:{STOOBLY_HOME_DIR}/.stoobly/docker")
194
-
195
153
  self.with_service(self.proxy, service)
196
154
 
197
155
  def env_dict(self):
@@ -213,12 +171,6 @@ class WorkflowBuilder(Builder):
213
171
 
214
172
  super().write(compose, dest)
215
173
 
216
- def with_env(self, v: List[str]):
217
- if not isinstance(v, list):
218
- return self
219
- self._env += v
220
- return self
221
-
222
174
  def write(self):
223
175
  compose = {
224
176
  'services': self.services,
@@ -27,6 +27,7 @@ class ServiceCreateCommand(ServiceCommand):
27
27
 
28
28
  def build(self):
29
29
  service_builder = ServiceBuilder(self.service_config)
30
+ service_builder.with_env(list(self.env_vars))
30
31
  service_decorators = []
31
32
 
32
33
  for service_decorator in service_decorators:
@@ -36,7 +37,6 @@ class ServiceCreateCommand(ServiceCommand):
36
37
 
37
38
  workflow_kwargs = {
38
39
  'app_dir_path': self.app_dir_path,
39
- 'env': self.env_vars,
40
40
  'namespace': self.namespace,
41
41
  'service_name': self.service_name,
42
42
  }
@@ -6,7 +6,7 @@ services:
6
6
  extends:
7
7
  file: ../.docker-compose.base.yml
8
8
  service: context_base
9
- working_dir: /home/stoobly/.stoobly/docker/build/${WORKFLOW_NAME}
9
+ working_dir: /home/stoobly/.stoobly/docker/${SERVICE_NAME}/${WORKFLOW_NAME}
10
10
  build.init_base:
11
11
  command:
12
12
  - ${SERVICE_SCRIPTS}/${SERVICE_NAME}/${WORKFLOW_TEMPLATE}/.init
@@ -14,4 +14,6 @@ services:
14
14
  extends:
15
15
  file: ../.docker-compose.base.yml
16
16
  service: context_base
17
- working_dir: /home/stoobly/.stoobly/docker/build/${WORKFLOW_NAME}
17
+ volumes:
18
+ - ${APP_DIR}:/app
19
+ working_dir: /home/stoobly/.stoobly/docker/${SERVICE_NAME}/${WORKFLOW_NAME}
@@ -5,7 +5,7 @@ services:
5
5
  service: build.init_base
6
6
  image: stoobly.${USER_ID}
7
7
  profiles:
8
- - mock
8
+ - ${WORKFLOW_NAME}
9
9
  build.configure:
10
10
  depends_on:
11
11
  build.init:
@@ -15,4 +15,4 @@ services:
15
15
  service: build.configure_base
16
16
  image: stoobly.${USER_ID}
17
17
  profiles:
18
- - mock
18
+ - ${WORKFLOW_NAME}
@@ -0,0 +1,7 @@
1
+ # Define services here
2
+ #
3
+ # Container services that are intended to be run as part of a workflow need to have the workflow name added to the 'profiles' property
4
+ # e.g. If we want to run a service as part of the 'mock' workflow, then the following should be added
5
+ # profiles:
6
+ # - mock
7
+ services: {}
@@ -5,7 +5,7 @@ services:
5
5
  service: build.init_base
6
6
  image: stoobly.${USER_ID}
7
7
  profiles:
8
- - record
8
+ - ${WORKFLOW_NAME}
9
9
  build.configure:
10
10
  depends_on:
11
11
  build.init:
@@ -15,4 +15,4 @@ services:
15
15
  service: build.configure_base
16
16
  image: stoobly.${USER_ID}
17
17
  profiles:
18
- - record
18
+ - ${WORKFLOW_NAME}
@@ -0,0 +1,7 @@
1
+ # Define services here
2
+ #
3
+ # Container services that are intended to be run as part of a workflow need to have the workflow name added to the 'profiles' property
4
+ # e.g. If we want to run a service as part of the 'record' workflow, then the following should be added
5
+ # profiles:
6
+ # - record
7
+ services: {}
@@ -5,7 +5,7 @@ services:
5
5
  service: build.init_base
6
6
  image: stoobly.${USER_ID}
7
7
  profiles:
8
- - test
8
+ - ${WORKFLOW_NAME}
9
9
  build.configure:
10
10
  depends_on:
11
11
  build.init:
@@ -15,4 +15,4 @@ services:
15
15
  service: build.configure_base
16
16
  image: stoobly.${USER_ID}
17
17
  profiles:
18
- - test
18
+ - ${WORKFLOW_NAME}
@@ -0,0 +1,7 @@
1
+ # Define services here
2
+ #
3
+ # Container services that are intended to be run as part of a workflow need to have the workflow name added to the 'profiles' property
4
+ # e.g. If we want to run a service as part of the 'test' workflow, then the following should be added
5
+ # profiles:
6
+ # - test
7
+ services: {}
@@ -1,20 +1,19 @@
1
- networks: {}
2
1
  services:
3
2
  entrypoint.configure_base:
4
3
  command:
5
4
  - ${SERVICE_SCRIPTS}/${SERVICE_NAME}/${WORKFLOW_TEMPLATE}/.configure
6
5
  - bin/configure
7
- environment: {}
8
6
  extends:
9
7
  file: ../.docker-compose.base.yml
10
8
  service: context_base
11
- working_dir: /home/stoobly/.stoobly/docker/entrypoint/${WORKFLOW_NAME}
9
+ working_dir: /home/stoobly/.stoobly/docker/${SERVICE_NAME}/${WORKFLOW_NAME}
12
10
  entrypoint.init_base:
13
11
  command:
14
12
  - ${SERVICE_SCRIPTS}/${SERVICE_NAME}/${WORKFLOW_TEMPLATE}/.init
15
13
  - bin/init
16
- environment: {}
17
14
  extends:
18
15
  file: ../.docker-compose.base.yml
19
16
  service: context_base
20
- working_dir: /home/stoobly/.stoobly/docker/entrypoint/${WORKFLOW_NAME}
17
+ volumes:
18
+ - ${APP_DIR}:/app
19
+ working_dir: /home/stoobly/.stoobly/docker/${SERVICE_NAME}/${WORKFLOW_NAME}
@@ -1,25 +1,19 @@
1
- networks:
2
- entrypoint:
3
- name: entrypoint
4
1
  services:
5
2
  entrypoint.configure:
6
3
  depends_on:
7
4
  entrypoint.init:
8
5
  condition: service_completed_successfully
9
- environment: {}
10
6
  extends:
11
7
  file: ../.docker-compose.base.yml
12
8
  service: entrypoint.configure_base
13
9
  image: stoobly.${USER_ID}
14
10
  profiles:
15
- - mock
11
+ - ${WORKFLOW_NAME}
16
12
  volumes: []
17
13
  entrypoint.init:
18
- environment: {}
19
14
  extends:
20
15
  file: ../.docker-compose.base.yml
21
16
  service: entrypoint.init_base
22
17
  image: stoobly.${USER_ID}
23
18
  profiles:
24
- - mock
25
- volumes: {}
19
+ - ${WORKFLOW_NAME}
@@ -1,15 +1,8 @@
1
- # Define custom services here
1
+ # Define services here
2
2
  #
3
- # Container services that need to make request(s) to a Stoobly defined service
4
- # need to have either 'app.ingress' or 'app.egress' added to the 'networks' property
5
- #
6
- # e.g. If we want to make a request by hostname, then the following should be added
7
- # networks:
8
- # - app.ingress
9
- #
10
- # e.g. If we want to make a request by container service name, then the following should be added
11
- # networks:
12
- # - app.egress
3
+ # If a container service needs access to a Stoobly defined service,
4
+ # then the container service needs to add one of the scaffolded networks to the 'networks' property
5
+ # See https://docs.stoobly.com/core-concepts/scaffold
13
6
  #
14
7
  # Container services that are intended to be run as part of a workflow need to have the workflow name added to the 'profiles' property
15
8
  # e.g. If we want to run a service as part of the 'mock' workflow, then the following should be added
@@ -1,25 +1,19 @@
1
- networks:
2
- entrypoint:
3
- name: entrypoint
4
1
  services:
5
2
  entrypoint.configure:
6
3
  depends_on:
7
4
  entrypoint.init:
8
5
  condition: service_completed_successfully
9
- environment: {}
10
6
  extends:
11
7
  file: ../.docker-compose.base.yml
12
8
  service: entrypoint.configure_base
13
9
  image: stoobly.${USER_ID}
14
10
  profiles:
15
- - record
11
+ - ${WORKFLOW_NAME}
16
12
  volumes: []
17
13
  entrypoint.init:
18
- environment: {}
19
14
  extends:
20
15
  file: ../.docker-compose.base.yml
21
16
  service: entrypoint.init_base
22
17
  image: stoobly.${USER_ID}
23
18
  profiles:
24
- - record
25
- volumes: {}
19
+ - ${WORKFLOW_NAME}
@@ -1,14 +1,11 @@
1
- # Define networks and services here
1
+ # Define services here
2
2
  #
3
3
  # If a container service needs access to a Stoobly defined service,
4
- # then the container service needs to add the service name to the 'networks' property
5
- # e.g. If we have defined a 'upstream' service, then the following should be added
6
- # networks:
7
- # - upstream
4
+ # then the container service needs to add one of the scaffolded networks to the 'networks' property
5
+ # See https://docs.stoobly.com/core-concepts/scaffold
8
6
  #
9
7
  # Container services that are intended to be run as part of a workflow need to have the workflow name added to the 'profiles' property
10
8
  # e.g. If we want to run a service as part of the 'record' workflow, then the following should be added
11
9
  # profiles:
12
10
  # - record
13
- networks: {}
14
11
  services: {}
@@ -1,25 +1,19 @@
1
- networks:
2
- entrypoint:
3
- name: entrypoint
4
1
  services:
5
2
  entrypoint.configure:
6
3
  depends_on:
7
4
  entrypoint.init:
8
5
  condition: service_completed_successfully
9
- environment: {}
10
6
  extends:
11
7
  file: ../.docker-compose.base.yml
12
8
  service: entrypoint.configure_base
13
9
  image: stoobly.${USER_ID}
14
10
  profiles:
15
- - test
11
+ - ${WORKFLOW_NAME}
16
12
  volumes: []
17
13
  entrypoint.init:
18
- environment: {}
19
14
  extends:
20
15
  file: ../.docker-compose.base.yml
21
16
  service: entrypoint.init_base
22
17
  image: stoobly.${USER_ID}
23
18
  profiles:
24
- - test
25
- volumes: {}
19
+ - ${WORKFLOW_NAME}
@@ -1,14 +1,11 @@
1
- # Define networks and services here
1
+ # Define services here
2
2
  #
3
3
  # If a container service needs access to a Stoobly defined service,
4
- # then the container service needs to add the service name to the 'networks' property
5
- # e.g. If we have defined a 'upstream' service, then the following should be added
6
- # networks:
7
- # - upstream
4
+ # then the container service needs to add one of the scaffolded networks to the 'networks' property
5
+ # See https://docs.stoobly.com/core-concepts/scaffold
8
6
  #
9
7
  # Container services that are intended to be run as part of a workflow need to have the workflow name added to the 'profiles' property
10
8
  # e.g. If we want to run a service as part of the 'test' workflow, then the following should be added
11
9
  # profiles:
12
10
  # - test
13
- networks: {}
14
11
  services: {}
@@ -8,5 +8,5 @@ stoobly-agent snapshot apply
8
8
  entrypoint=$1
9
9
 
10
10
  if [ -e "$entrypoint" ]; then
11
- "$entrypoint"
11
+ "$entrypoint" /app
12
12
  fi
@@ -8,5 +8,5 @@ stoobly-agent snapshot apply
8
8
  entrypoint=$1
9
9
 
10
10
  if [ -e "$entrypoint" ]; then
11
- "$entrypoint"
11
+ "$entrypoint" /app
12
12
  fi
@@ -8,5 +8,5 @@ stoobly-agent snapshot apply
8
8
  entrypoint=$1
9
9
 
10
10
  if [ -e "$entrypoint" ]; then
11
- "$entrypoint"
11
+ "$entrypoint" /app
12
12
  fi
@@ -6,5 +6,5 @@
6
6
  entrypoint=$1
7
7
 
8
8
  if [ -e "$entrypoint" ]; then
9
- "$entrypoint"
9
+ "$entrypoint" /app
10
10
  fi
@@ -6,5 +6,5 @@
6
6
  entrypoint=$1
7
7
 
8
8
  if [ -e "$entrypoint" ]; then
9
- "$entrypoint"
9
+ "$entrypoint" /app
10
10
  fi
@@ -6,5 +6,5 @@
6
6
  entrypoint=$1
7
7
 
8
8
  if [ -e "$entrypoint" ]; then
9
- "$entrypoint"
9
+ "$entrypoint" /app
10
10
  fi
@@ -9,5 +9,5 @@ fi
9
9
 
10
10
  entrypoint=$1
11
11
  if [ -e "$entrypoint" ]; then
12
- "$entrypoint"
12
+ "$entrypoint" /app
13
13
  fi
@@ -9,5 +9,5 @@ fi
9
9
 
10
10
  entrypoint=$1
11
11
  if [ -e "$entrypoint" ]; then
12
- "$entrypoint"
12
+ "$entrypoint" /app
13
13
  fi
@@ -9,5 +9,5 @@ fi
9
9
 
10
10
  entrypoint=$1
11
11
  if [ -e "$entrypoint" ]; then
12
- "$entrypoint"
12
+ "$entrypoint" /app
13
13
  fi
@@ -6,8 +6,8 @@ scheme=$SERVICE_SCHEME
6
6
  hostname=$SERVICE_HOSTNAME
7
7
  port=$SERVICE_PORT
8
8
 
9
- url="$scheme://$hostname"
9
+ origin="$scheme://$hostname"
10
10
 
11
11
  if [ "$scheme" = 'http' -a "$port" != '80' ] || [ "$scheme" = 'https' -a "$port" != '443' ]; then
12
- url="$url:$port"
12
+ origin="$origin:$port"
13
13
  fi
@@ -1,3 +1,5 @@
1
1
  #! /bin/bash
2
2
 
3
- # Add custom initialization here
3
+ # Add custom initialization here
4
+
5
+ app_path=$1 # Path to application source files
@@ -6,10 +6,10 @@ scheme=$SERVICE_SCHEME
6
6
  hostname=$SERVICE_HOSTNAME
7
7
  port=$SERVICE_PORT
8
8
 
9
- url="$scheme://$hostname"
9
+ origin="$scheme://$hostname"
10
10
 
11
11
  if [ "$scheme" = 'http' -a "$port" != '80' ] || [ "$scheme" = 'https' -a "$port" != '443' ]; then
12
- url="$url:$port"
12
+ origin="$origin:$port"
13
13
  fi
14
14
 
15
15
  # Firewall
@@ -18,7 +18,7 @@ stoobly-agent config firewall set \
18
18
  --action include \
19
19
  --method GET --method POST --method OPTIONS --method PUT --method DELETE \
20
20
  --mode record \
21
- --pattern "$url/.*?"
21
+ --pattern "$origin/?.*?"
22
22
 
23
23
  # Rewrite
24
24
  echo "Configuring rewrite rules..."
@@ -26,6 +26,6 @@ stoobly-agent config rewrite set \
26
26
  --method GET --method POST --method OPTIONS --method PUT --method DELETE \
27
27
  --mode record \
28
28
  --name cookie \
29
- --pattern "$host/?.*?" \
29
+ --pattern "$origin/?.*?" \
30
30
  --type Header \
31
31
  --value '' \
@@ -1,3 +1,5 @@
1
1
  #! /bin/bash
2
2
 
3
- # Add custom initialization here
3
+ # Add custom initialization here
4
+
5
+ app_path=$1 # Path to application source files
@@ -6,8 +6,8 @@ scheme=$SERVICE_SCHEME
6
6
  hostname=$SERVICE_HOSTNAME
7
7
  port=$SERVICE_PORT
8
8
 
9
- url="$scheme://$hostname"
9
+ origin="$scheme://$hostname"
10
10
 
11
11
  if [ "$scheme" = 'http' -a "$port" != '80' ] || [ "$scheme" = 'https' -a "$port" != '443' ]; then
12
- url="$url:$port"
12
+ origin="$origin:$port"
13
13
  fi
@@ -1,3 +1,5 @@
1
1
  #! /bin/bash
2
2
 
3
- # Add custom initialization here
3
+ # Add custom initialization here
4
+
5
+ app_path=$1 # Path to application source files
@@ -79,11 +79,13 @@ class WorkflowCreateCommand(WorkflowCommand):
79
79
 
80
80
  def __write_docker_compose_file(self, **kwargs: BuildOptions):
81
81
  builder_class = kwargs.get('builder_class') or WorkflowBuilder
82
- service_builder = kwargs.get('service_builder') or ServiceBuilder(self.service_config)
82
+ service_builder = kwargs.get('service_builder')
83
+ if not service_builder:
84
+ service_builder = ServiceBuilder(self.service_config)
85
+ service_builder.load()
83
86
  workflow_decorators: List[Union[MockDecorator, ReverseProxyDecorator]] = kwargs.get('workflow_decorators')
84
87
 
85
88
  workflow_builder = builder_class(self.workflow_path, service_builder)
86
- workflow_builder.with_env(list(self.env_vars))
87
89
  workflow_builder.build_all()
88
90
 
89
91
  if isinstance(workflow_decorators, list):
@@ -223,7 +223,6 @@ def update(**kwargs):
223
223
  )
224
224
  @click.option('--app-dir-path', default=current_working_dir, help='Path to application directory.')
225
225
  @click.option('--context-dir-path', default=data_dir.context_dir_path, help='Path to Stoobly data directory.')
226
- @click.option('--env', multiple=True, help='Specify an environment variable.')
227
226
  @click.option('--force', is_flag=True, help='Overwrite maintained scaffolded workflow files.')
228
227
  @click.option('--service', multiple=True, help='Specify the service(s) to create the workflow for.')
229
228
  @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.')
@@ -740,7 +739,8 @@ def __workflow_create(app, **kwargs):
740
739
 
741
740
  service_config = command.service_config
742
741
  workflow_decorators = get_workflow_decorators(kwargs['template'], service_config)
742
+
743
743
  command.build(
744
744
  template=kwargs['template'],
745
745
  workflow_decorators=workflow_decorators
746
- )
746
+ )
@@ -1 +1 @@
1
- 1.6.6
1
+ 1.6.7
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: stoobly-agent
3
- Version: 1.6.6
3
+ Version: 1.6.7
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=ryopjMmwo0h1WRzdE5l_rrULPanQfcjHdwKg8dojjdQ,44
1
+ stoobly_agent/__init__.py,sha256=qAODERPgUB3TSB-LNb9TyckC9zmRfUbQVpVPBVi1GUk,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
@@ -73,7 +73,7 @@ stoobly_agent/app/cli/scaffold/app_config.py,sha256=Gs-BynV1vY7_PpTOenn2mqc7lBIu
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
- stoobly_agent/app/cli/scaffold/constants.py,sha256=s5SBy8Xs4-Lg4tYEVBTiDIzeWwerrnz8qHXbXQtXH5U,2465
76
+ stoobly_agent/app/cli/scaffold/constants.py,sha256=Mc4eaBicnzvXWjt1vqSmJ8csNyFLcAQLBj9uMH8QZ7A,2488
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
@@ -81,12 +81,12 @@ stoobly_agent/app/cli/scaffold/docker/builder.py,sha256=uiGqhxBHEasZAqLzjKUGUs-1
81
81
  stoobly_agent/app/cli/scaffold/docker/constants.py,sha256=1khQdgTaQ89ykGRNdTQh_ejFOdjNFGaZ_3cOGda6y7Y,692
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
- stoobly_agent/app/cli/scaffold/docker/service/builder.py,sha256=AE0tEHKeDM3dDMSjaqUwJA9ZLgzeyr0ErMAhOzNuaSI,3190
84
+ stoobly_agent/app/cli/scaffold/docker/service/builder.py,sha256=T1wE3DU-vLNRipBHiG1uxlVLXcLZ2My7LuFfVU2wY9g,5733
85
85
  stoobly_agent/app/cli/scaffold/docker/service/configure_gateway.py,sha256=bdqY9jESbyGEwPW5cwb51oznYFlzK4MUP770zxxgrds,1701
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
89
- stoobly_agent/app/cli/scaffold/docker/workflow/builder.py,sha256=i2T3TvWlXBT2O4wqwMcwsN55-4VzAblo36dEwCPf8yU,6736
89
+ stoobly_agent/app/cli/scaffold/docker/workflow/builder.py,sha256=WmqH7skXJlsBEhqAMYUEhMRnEjjb-l0CzFOpNOE2ssI,5116
90
90
  stoobly_agent/app/cli/scaffold/docker/workflow/decorators_factory.py,sha256=gU4RfuZ13r_YoB4eLS6FuiB1A4kfuLrWLPmYjZ0EJJw,955
91
91
  stoobly_agent/app/cli/scaffold/docker/workflow/dns_decorator.py,sha256=nlDPbyF1hkVItzFH3bk9KlqfDC8usyFZs353-ibqxvA,938
92
92
  stoobly_agent/app/cli/scaffold/docker/workflow/mock_decorator.py,sha256=DcBnwA8YhE-VdrUiWf2xPcqirEMZEQm3AwssAg9CxLo,1226
@@ -97,7 +97,7 @@ stoobly_agent/app/cli/scaffold/managed_services_docker_compose.py,sha256=-wLBXUi
97
97
  stoobly_agent/app/cli/scaffold/service.py,sha256=L9K6QE0k5KSEC8_fSwtdwwTSO_DsIpqSPW-AG7Bg76o,501
98
98
  stoobly_agent/app/cli/scaffold/service_command.py,sha256=9kIKiFC5Jo425VWYD4NDvUOdMP-pNyq2D5Ip1ZAPj3A,1054
99
99
  stoobly_agent/app/cli/scaffold/service_config.py,sha256=NwJL4gwWQ_9B0fHrit1QekR6rSMg40m1CDizWxUNWCM,3598
100
- stoobly_agent/app/cli/scaffold/service_create_command.py,sha256=bmLGgx9qnh-X_i2_XfdWSQIer0gGkaQx6lXZSIzy-LI,2793
100
+ stoobly_agent/app/cli/scaffold/service_create_command.py,sha256=1B6TK3JDAjouikCV84WDrX7b0crdPMPIo1caMwhi-L8,2815
101
101
  stoobly_agent/app/cli/scaffold/service_delete_command.py,sha256=_nBDQjm8eL62MQpzSCxgUHlW04ZXKG8MDlN1BXxlqww,986
102
102
  stoobly_agent/app/cli/scaffold/service_docker_compose.py,sha256=OMUN1-ujQYIZXxDvS4XBf5C9wGalQULkwOiBBQPZbHY,820
103
103
  stoobly_agent/app/cli/scaffold/service_workflow.py,sha256=sQ_Edy_wGHKMXpD0DmhnOWkGEKz7gSgEGNI8f7aXOdg,444
@@ -109,30 +109,33 @@ stoobly_agent/app/cli/scaffold/templates/app/.docker-compose.base.yml,sha256=6tF
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
111
111
  stoobly_agent/app/cli/scaffold/templates/app/build/.config.yml,sha256=8Wt8ZZ5irvBYYS44xGrR_EWlZDuXH9kyWmquzsh7s8g,19
112
- stoobly_agent/app/cli/scaffold/templates/app/build/.docker-compose.base.yml,sha256=SBjI-5APmzvzQafHzRahH_xcoXEEV9M9GIeEmXSwnAU,559
113
- stoobly_agent/app/cli/scaffold/templates/app/build/mock/.docker-compose.mock.yml,sha256=3DJ8LTq3QScaz0SA_tXQqJ0kljSCeqkPyDbhLOxBJvc,414
112
+ stoobly_agent/app/cli/scaffold/templates/app/build/.docker-compose.base.yml,sha256=ECc2t_85UULEciNYFSuuQW2hdd6nSFEkrlHE-bY5q3E,614
113
+ stoobly_agent/app/cli/scaffold/templates/app/build/mock/.docker-compose.mock.yml,sha256=s-QRSUM44USYt395XR2o4lTjaXPcuIRHjjQ0ALfRj2k,438
114
114
  stoobly_agent/app/cli/scaffold/templates/app/build/mock/bin/configure,sha256=dEOGIKUKJf5kjOwJRdTgZkS0ZjmQHWVuAmKrWUjPij4,44
115
115
  stoobly_agent/app/cli/scaffold/templates/app/build/mock/bin/init,sha256=YxWVVQMEdGarcMtBcE1Sj2kdLgUgwY9kXp3MjPsVcmg,46
116
- stoobly_agent/app/cli/scaffold/templates/app/build/record/.docker-compose.record.yml,sha256=hgPOxIInxGAzGr28-ytB4tVfmsqgpZdPMOpMRbV2R0g,418
116
+ stoobly_agent/app/cli/scaffold/templates/app/build/mock/docker-compose.yml,sha256=DhQzbaBXvnBfojLBRl5ZXdY1yqqq2FIaN9_tXQtfzs0,297
117
+ stoobly_agent/app/cli/scaffold/templates/app/build/record/.docker-compose.record.yml,sha256=s-QRSUM44USYt395XR2o4lTjaXPcuIRHjjQ0ALfRj2k,438
117
118
  stoobly_agent/app/cli/scaffold/templates/app/build/record/bin/configure,sha256=KBgjZlP3-FEhhflopx50EabXhyF98Mv0u_YrfmxMznE,52
118
119
  stoobly_agent/app/cli/scaffold/templates/app/build/record/bin/init,sha256=YxWVVQMEdGarcMtBcE1Sj2kdLgUgwY9kXp3MjPsVcmg,46
119
- stoobly_agent/app/cli/scaffold/templates/app/build/test/.docker-compose.test.yml,sha256=Rn_7qL1MVK1jNlRepSvNHH9_iFrlE86_aRxjwIim0mY,414
120
+ stoobly_agent/app/cli/scaffold/templates/app/build/record/docker-compose.yml,sha256=wQHPL62dqQWBHfMbdXPB9rU9HnBFhQRDSo9T_BNie10,301
121
+ stoobly_agent/app/cli/scaffold/templates/app/build/test/.docker-compose.test.yml,sha256=s-QRSUM44USYt395XR2o4lTjaXPcuIRHjjQ0ALfRj2k,438
120
122
  stoobly_agent/app/cli/scaffold/templates/app/build/test/bin/configure,sha256=dEOGIKUKJf5kjOwJRdTgZkS0ZjmQHWVuAmKrWUjPij4,44
121
123
  stoobly_agent/app/cli/scaffold/templates/app/build/test/bin/init,sha256=YxWVVQMEdGarcMtBcE1Sj2kdLgUgwY9kXp3MjPsVcmg,46
124
+ stoobly_agent/app/cli/scaffold/templates/app/build/test/docker-compose.yml,sha256=HrJwBVx_n4EmC1F1kWXSr7Py9Kx87Cc8x6V0IPKAydo,297
122
125
  stoobly_agent/app/cli/scaffold/templates/app/entrypoint/.config.yml,sha256=T9VQz6OwAQpKdIoFrnfKAxuX_to0c6EhuWRLKM34Sr4,22
123
- stoobly_agent/app/cli/scaffold/templates/app/entrypoint/.docker-compose.base.yml,sha256=Sl_E6IUaHSR_Av_Tm3FzCJ6w5qjtR2LiJfiQJAMZUFI,630
124
- stoobly_agent/app/cli/scaffold/templates/app/entrypoint/mock/.docker-compose.mock.yml,sha256=-YbHd6BrAlBpT8PYg8kOsq0GyDeZ3g_q8IB0B0rGluU,551
126
+ stoobly_agent/app/cli/scaffold/templates/app/entrypoint/.docker-compose.base.yml,sha256=8LLUmoCOvNeVB1uUTKd3TmotM__CmG44z_E_O6zuNQQ,622
127
+ stoobly_agent/app/cli/scaffold/templates/app/entrypoint/mock/.docker-compose.mock.yml,sha256=KFWtuPS1JcQQHKN1yTMJHWHm3_1ihz7UTs_FHEQJfGI,478
125
128
  stoobly_agent/app/cli/scaffold/templates/app/entrypoint/mock/bin/configure,sha256=dEOGIKUKJf5kjOwJRdTgZkS0ZjmQHWVuAmKrWUjPij4,44
126
129
  stoobly_agent/app/cli/scaffold/templates/app/entrypoint/mock/bin/init,sha256=YxWVVQMEdGarcMtBcE1Sj2kdLgUgwY9kXp3MjPsVcmg,46
127
- stoobly_agent/app/cli/scaffold/templates/app/entrypoint/mock/docker-compose.yml,sha256=JZztRTAEd_byGjhBbI_TOrj7CML8l5lV4tYOM2syHUw,717
128
- stoobly_agent/app/cli/scaffold/templates/app/entrypoint/record/.docker-compose.record.yml,sha256=aIcgjelss4V86lxS3-xN8j_2eR-0YkzhtN_b-g3Y0nE,555
130
+ stoobly_agent/app/cli/scaffold/templates/app/entrypoint/mock/docker-compose.yml,sha256=BwPDVngZ9dcXrb3NhthsRUIN2ciuygj4eA7-TYJK1J8,523
131
+ stoobly_agent/app/cli/scaffold/templates/app/entrypoint/record/.docker-compose.record.yml,sha256=KFWtuPS1JcQQHKN1yTMJHWHm3_1ihz7UTs_FHEQJfGI,478
129
132
  stoobly_agent/app/cli/scaffold/templates/app/entrypoint/record/bin/configure,sha256=dEOGIKUKJf5kjOwJRdTgZkS0ZjmQHWVuAmKrWUjPij4,44
130
133
  stoobly_agent/app/cli/scaffold/templates/app/entrypoint/record/bin/init,sha256=YxWVVQMEdGarcMtBcE1Sj2kdLgUgwY9kXp3MjPsVcmg,46
131
- stoobly_agent/app/cli/scaffold/templates/app/entrypoint/record/docker-compose.yml,sha256=5n4bZBHI9MtwBF55ugu1RTdwMy7T6SsYGQ_3sulFUj8,595
132
- stoobly_agent/app/cli/scaffold/templates/app/entrypoint/test/.docker-compose.test.yml,sha256=9-qPnSisun4adnrDcZsJiyeMjhIlCHBJap_cmdzUPVg,552
134
+ stoobly_agent/app/cli/scaffold/templates/app/entrypoint/record/docker-compose.yml,sha256=mgI6XZ8Ql7WxgIrtiFC4PP09Q0bPoMDaAIenJva3JoE,527
135
+ stoobly_agent/app/cli/scaffold/templates/app/entrypoint/test/.docker-compose.test.yml,sha256=KFWtuPS1JcQQHKN1yTMJHWHm3_1ihz7UTs_FHEQJfGI,478
133
136
  stoobly_agent/app/cli/scaffold/templates/app/entrypoint/test/bin/configure,sha256=dEOGIKUKJf5kjOwJRdTgZkS0ZjmQHWVuAmKrWUjPij4,44
134
137
  stoobly_agent/app/cli/scaffold/templates/app/entrypoint/test/bin/init,sha256=YxWVVQMEdGarcMtBcE1Sj2kdLgUgwY9kXp3MjPsVcmg,46
135
- stoobly_agent/app/cli/scaffold/templates/app/entrypoint/test/docker-compose.yml,sha256=E4gGJwHfnZoFo9-0vM17-Qg5LPjx7vIPpcz2K7eiZg0,591
138
+ stoobly_agent/app/cli/scaffold/templates/app/entrypoint/test/docker-compose.yml,sha256=JpWLQrW69EatLD3HPHpmi3Y6n7cjlrUgekYVbJ4ngSY,523
136
139
  stoobly_agent/app/cli/scaffold/templates/app/gateway/.config.yml,sha256=XnLQZMzzMMIwVycjyPN5QXsmRztkTFAna1kIHYuDfJQ,19
137
140
  stoobly_agent/app/cli/scaffold/templates/app/gateway/.docker-compose.base.template.yml,sha256=bgBvyDhyehS75D2ObEi7sl9DLGV6U3c9JhCAncsvjq8,251
138
141
  stoobly_agent/app/cli/scaffold/templates/app/gateway/mock/.docker-compose.mock.yml,sha256=CDL5x18-ues4F_ujqpNef_zJTG6PyDOkQ11cIHBOW5k,136
@@ -144,17 +147,17 @@ stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/exec/.docker-compose.exe
144
147
  stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/mock/.docker-compose.mock.yml,sha256=FnCn64DjxyAiB2P_1JUwFmXslMR961nVZHkYiEXytlg,232
145
148
  stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/record/.docker-compose.record.yml,sha256=t34FNYZboJSfrKnIB2oJ3UuE_mJaW77-hcbSn3sfWec,235
146
149
  stoobly_agent/app/cli/scaffold/templates/build/services/build/mock/.configure,sha256=006exiS9OpKavy4fNWioWo0d8hrulQiWjaB3yXHdGig,212
147
- stoobly_agent/app/cli/scaffold/templates/build/services/build/mock/.init,sha256=HRAXOsnAKhYw2giorsQA2Dvli4J5xJpvv-79yFgSszM,214
150
+ stoobly_agent/app/cli/scaffold/templates/build/services/build/mock/.init,sha256=5eg3Glb3_T-RTwU6tTSerFLQKsL93LtsnmR1B0vRjBw,219
148
151
  stoobly_agent/app/cli/scaffold/templates/build/services/build/record/.configure,sha256=006exiS9OpKavy4fNWioWo0d8hrulQiWjaB3yXHdGig,212
149
- stoobly_agent/app/cli/scaffold/templates/build/services/build/record/.init,sha256=HRAXOsnAKhYw2giorsQA2Dvli4J5xJpvv-79yFgSszM,214
152
+ stoobly_agent/app/cli/scaffold/templates/build/services/build/record/.init,sha256=5eg3Glb3_T-RTwU6tTSerFLQKsL93LtsnmR1B0vRjBw,219
150
153
  stoobly_agent/app/cli/scaffold/templates/build/services/build/test/.configure,sha256=006exiS9OpKavy4fNWioWo0d8hrulQiWjaB3yXHdGig,212
151
- stoobly_agent/app/cli/scaffold/templates/build/services/build/test/.init,sha256=HRAXOsnAKhYw2giorsQA2Dvli4J5xJpvv-79yFgSszM,214
154
+ stoobly_agent/app/cli/scaffold/templates/build/services/build/test/.init,sha256=5eg3Glb3_T-RTwU6tTSerFLQKsL93LtsnmR1B0vRjBw,219
152
155
  stoobly_agent/app/cli/scaffold/templates/build/services/entrypoint/mock/.configure,sha256=SKvht2K_3tW08K24rl8_j0jMYOhq1k-GsVwhoHwjxYA,337
153
- stoobly_agent/app/cli/scaffold/templates/build/services/entrypoint/mock/.init,sha256=xWJGhCKQejtVLFAOEZMWnaCeGAc9tuqEh_WsG3xfA_0,184
156
+ stoobly_agent/app/cli/scaffold/templates/build/services/entrypoint/mock/.init,sha256=AcM6SLUsZa6BOLDjxteDR_AXIco47GZNkWQCGPhPDAY,189
154
157
  stoobly_agent/app/cli/scaffold/templates/build/services/entrypoint/record/.configure,sha256=dnbPZUrYZDCEx0MxhIsrY-lTgH_9tN_Iixy3XrPIW8w,341
155
- stoobly_agent/app/cli/scaffold/templates/build/services/entrypoint/record/.init,sha256=xWJGhCKQejtVLFAOEZMWnaCeGAc9tuqEh_WsG3xfA_0,184
158
+ stoobly_agent/app/cli/scaffold/templates/build/services/entrypoint/record/.init,sha256=AcM6SLUsZa6BOLDjxteDR_AXIco47GZNkWQCGPhPDAY,189
156
159
  stoobly_agent/app/cli/scaffold/templates/build/services/entrypoint/test/.configure,sha256=SKvht2K_3tW08K24rl8_j0jMYOhq1k-GsVwhoHwjxYA,337
157
- stoobly_agent/app/cli/scaffold/templates/build/services/entrypoint/test/.init,sha256=xWJGhCKQejtVLFAOEZMWnaCeGAc9tuqEh_WsG3xfA_0,184
160
+ stoobly_agent/app/cli/scaffold/templates/build/services/entrypoint/test/.init,sha256=AcM6SLUsZa6BOLDjxteDR_AXIco47GZNkWQCGPhPDAY,189
158
161
  stoobly_agent/app/cli/scaffold/templates/build/workflows/exec/.create,sha256=EZe84bLAKB-mrB9PGMx-amyMjp6x-ESUZKC8wxrWdLE,245
159
162
  stoobly_agent/app/cli/scaffold/templates/build/workflows/exec/.delete,sha256=RspRDQ7WT5jpN2o-6qXOlH-A2VpN4981pD4ZJljk9Rw,260
160
163
  stoobly_agent/app/cli/scaffold/templates/build/workflows/exec/.disable,sha256=xVf4Pk1RLvJm7Ff0rbGoWhYHPv0ME5e93fxS2yFqLnE,45
@@ -168,23 +171,23 @@ stoobly_agent/app/cli/scaffold/templates/build/workflows/exec/.services,sha256=s
168
171
  stoobly_agent/app/cli/scaffold/templates/build/workflows/exec/.snapshot,sha256=Kav1QNhKG7f0DBzc4-9dmxZMmmVTxmPqakT_W4kVYKk,241
169
172
  stoobly_agent/app/cli/scaffold/templates/build/workflows/exec/.up,sha256=S88O31UgsabaMvSwkQJjLF9C7mrFkyEk9x6JDE6qSXI,228
170
173
  stoobly_agent/app/cli/scaffold/templates/build/workflows/mock/.configure,sha256=xWJGhCKQejtVLFAOEZMWnaCeGAc9tuqEh_WsG3xfA_0,184
171
- stoobly_agent/app/cli/scaffold/templates/build/workflows/mock/.init,sha256=_gFs--JjDN1G0VpswmPegKYU9ozwLnvWOKj__V_VoB4,307
174
+ stoobly_agent/app/cli/scaffold/templates/build/workflows/mock/.init,sha256=el5LYLY-7P3-EuxZ8dAFgGNU_4zDhyA4D_iS6D4fvps,312
172
175
  stoobly_agent/app/cli/scaffold/templates/build/workflows/record/.configure,sha256=xWJGhCKQejtVLFAOEZMWnaCeGAc9tuqEh_WsG3xfA_0,184
173
- stoobly_agent/app/cli/scaffold/templates/build/workflows/record/.init,sha256=5sH8Ft7N_cyFgTBknJWOjIMd5A2RZexRTeUkhKxSzx0,308
176
+ stoobly_agent/app/cli/scaffold/templates/build/workflows/record/.init,sha256=q2dL6DmIM8re149WwyeZvwttjU6KqBXO2-9zVKKqtM0,313
174
177
  stoobly_agent/app/cli/scaffold/templates/build/workflows/test/.configure,sha256=xWJGhCKQejtVLFAOEZMWnaCeGAc9tuqEh_WsG3xfA_0,184
175
- stoobly_agent/app/cli/scaffold/templates/build/workflows/test/.init,sha256=_gFs--JjDN1G0VpswmPegKYU9ozwLnvWOKj__V_VoB4,307
178
+ stoobly_agent/app/cli/scaffold/templates/build/workflows/test/.init,sha256=el5LYLY-7P3-EuxZ8dAFgGNU_4zDhyA4D_iS6D4fvps,312
176
179
  stoobly_agent/app/cli/scaffold/templates/constants.py,sha256=EXBiBB_gnSINGrIqfXMaJ2w0HEaICw4FxVjwIHPBqYw,1457
177
180
  stoobly_agent/app/cli/scaffold/templates/factory.py,sha256=t7QExf7o22oAiw05XFBWTfoTcuQqK33gQZHo3j1dzTY,1749
178
- stoobly_agent/app/cli/scaffold/templates/workflow/mock/bin/configure,sha256=2cpOVTA0Tm8s8cIhbrFAsYe5A1JXa8vVtGwoPCwVB_g,270
179
- stoobly_agent/app/cli/scaffold/templates/workflow/mock/bin/init,sha256=YxWVVQMEdGarcMtBcE1Sj2kdLgUgwY9kXp3MjPsVcmg,46
181
+ stoobly_agent/app/cli/scaffold/templates/workflow/mock/bin/configure,sha256=GAU7AfSPcyDSI9RJ7mynT83YqgN9r_E9HZYx0RXE1lU,279
182
+ stoobly_agent/app/cli/scaffold/templates/workflow/mock/bin/init,sha256=EaoFDyoJbHc9Ui8ELYKmfweXAycJptVOQblszeh3XTE,94
180
183
  stoobly_agent/app/cli/scaffold/templates/workflow/mock/fixtures.yml,sha256=CJlZ_kugygZpmyqIauBjNZxqk7XyLaa3yl3AWj8KV28,259
181
184
  stoobly_agent/app/cli/scaffold/templates/workflow/mock/lifecycle_hooks.py,sha256=U7mlzT_wBR3uhHSG6CAyt5tBUNAvdIrCw33gdB-F294,467
182
185
  stoobly_agent/app/cli/scaffold/templates/workflow/mock/public/.gitignore,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
183
- stoobly_agent/app/cli/scaffold/templates/workflow/record/bin/configure,sha256=bkMZexceMEfoh5AqybtzpGPBrCGxl7Azn6QbR-qAuWM,750
184
- stoobly_agent/app/cli/scaffold/templates/workflow/record/bin/init,sha256=YxWVVQMEdGarcMtBcE1Sj2kdLgUgwY9kXp3MjPsVcmg,46
186
+ stoobly_agent/app/cli/scaffold/templates/workflow/record/bin/configure,sha256=fBQXJpPZJr5H79zFOmEERM6DpELm8GGC8ATKc2JpKSQ,765
187
+ stoobly_agent/app/cli/scaffold/templates/workflow/record/bin/init,sha256=EaoFDyoJbHc9Ui8ELYKmfweXAycJptVOQblszeh3XTE,94
185
188
  stoobly_agent/app/cli/scaffold/templates/workflow/record/lifecycle_hooks.py,sha256=4vaVc_gnDTCLEqtcZybIk5dcmXrKmGuesF6gc3-_kX8,473
186
- stoobly_agent/app/cli/scaffold/templates/workflow/test/bin/configure,sha256=2cpOVTA0Tm8s8cIhbrFAsYe5A1JXa8vVtGwoPCwVB_g,270
187
- stoobly_agent/app/cli/scaffold/templates/workflow/test/bin/init,sha256=YxWVVQMEdGarcMtBcE1Sj2kdLgUgwY9kXp3MjPsVcmg,46
189
+ stoobly_agent/app/cli/scaffold/templates/workflow/test/bin/configure,sha256=GAU7AfSPcyDSI9RJ7mynT83YqgN9r_E9HZYx0RXE1lU,279
190
+ stoobly_agent/app/cli/scaffold/templates/workflow/test/bin/init,sha256=EaoFDyoJbHc9Ui8ELYKmfweXAycJptVOQblszeh3XTE,94
188
191
  stoobly_agent/app/cli/scaffold/templates/workflow/test/fixtures.yml,sha256=CJlZ_kugygZpmyqIauBjNZxqk7XyLaa3yl3AWj8KV28,259
189
192
  stoobly_agent/app/cli/scaffold/templates/workflow/test/lifecycle_hooks.py,sha256=U7mlzT_wBR3uhHSG6CAyt5tBUNAvdIrCw33gdB-F294,467
190
193
  stoobly_agent/app/cli/scaffold/templates/workflow/test/public/.gitignore,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -194,12 +197,12 @@ stoobly_agent/app/cli/scaffold/workflow.py,sha256=KlbWT9CIo9EpZxKU1WVZtmodhxK7Cp
194
197
  stoobly_agent/app/cli/scaffold/workflow_command.py,sha256=eI9I5LLgO0U3b46QhHusy-4BV2zUDVai6jErcluYCRI,3344
195
198
  stoobly_agent/app/cli/scaffold/workflow_config.py,sha256=ghnbcnCyb6ECdylUJCAJ6A8ulzaFY9bu7RvRuYeiRkk,901
196
199
  stoobly_agent/app/cli/scaffold/workflow_copy_command.py,sha256=R9hh5dWVz7vGld7pENAA_a9gW56EkgG2K35nBQYXwyI,1462
197
- stoobly_agent/app/cli/scaffold/workflow_create_command.py,sha256=WmGKoqJqOkhL40oLCo8PnWhBKdfbY0dO2UtRn1IKynE,3504
200
+ stoobly_agent/app/cli/scaffold/workflow_create_command.py,sha256=R3L1obUTidGngbIaRlVjt_Rjkw9qOPze_p5plHc8JHs,3532
198
201
  stoobly_agent/app/cli/scaffold/workflow_env.py,sha256=x8V5pJmIiklD3f2q2-qq-CORf4YaXYq_r2JpR2MmSwk,416
199
202
  stoobly_agent/app/cli/scaffold/workflow_log_command.py,sha256=Bke4lMOMxuDUFuAx9nlXHbKgYMO4KAg9ASHvjz4aVWc,1372
200
203
  stoobly_agent/app/cli/scaffold/workflow_run_command.py,sha256=eF3aaK4OIZXYuSBEAeBnhAL7EZrS1G4mSYrJbEiXt2o,11082
201
204
  stoobly_agent/app/cli/scaffold/workflow_validate_command.py,sha256=wv1Zrq0GoYO8ryac3oGno0C282c6UjMtniO19mBSyrE,4036
202
- stoobly_agent/app/cli/scaffold_cli.py,sha256=qR1AvPbUFsn9QL_QrWVFxW77n4yMVI7DVwiV2ylRcOM,28686
205
+ stoobly_agent/app/cli/scaffold_cli.py,sha256=kD_2YbtdcMjFzJ2u8lBchL5vo0ey4_a_HXmE3V3Quuw,28607
203
206
  stoobly_agent/app/cli/scenario_cli.py,sha256=3J1EiJOvunkfWrEkOsanw-XrKkOk78ij_GjBlE9p7CE,8229
204
207
  stoobly_agent/app/cli/snapshot_cli.py,sha256=cpCjxFYBuVwLuq_b2lIUu-5zWqupRlrp4xWgDytirSM,10047
205
208
  stoobly_agent/app/cli/trace_cli.py,sha256=K7E-vx3JUcqEDSWOdIOi_AieKNQz7dBfmRrVvKDkzFI,4605
@@ -699,7 +702,7 @@ stoobly_agent/test/app/models/factories/resource/local_db/helpers/log_test.py,sh
699
702
  stoobly_agent/test/app/models/factories/resource/local_db/helpers/tiebreak_scenario_request_test.py,sha256=a1SFLyEyRRLuADvAw6ckQQKORFXvyK1lyrbkaLWx8oU,3399
700
703
  stoobly_agent/test/app/models/factories/resource/local_db/request_adapter_test.py,sha256=Pzq1cBPnP9oSWG-p0c-VoymoHxgp483QmNwmV1b78RA,8453
701
704
  stoobly_agent/test/app/models/factories/resource/local_db/response_adapter_test.py,sha256=9P95EKH5rZGOrmRkRIDlQZqtiLJHk9735og18Ffwpfw,2204
702
- stoobly_agent/test/app/models/schemas/.stoobly/db/VERSION,sha256=uGiTynl24ZAartFJQ0TJAZFa3EBS21MnE-XvhATnY64,5
705
+ stoobly_agent/test/app/models/schemas/.stoobly/db/VERSION,sha256=SJuufShOhhiSZOph-xt0K0zwmxbI8S1OvfGbFa7G5fA,5
703
706
  stoobly_agent/test/app/models/schemas/.stoobly/db/stoobly_agent.sqlite3,sha256=ch8gNx6zIelLKQx65gwFx_LRNqUD3EC5xcHZ0ukIQiU,188416
704
707
  stoobly_agent/test/app/models/schemas/.stoobly/settings.yml,sha256=vLwMjweKOdod6tSLtIlyBefPQuNXq9wio4kBaODKtAU,726
705
708
  stoobly_agent/test/app/models/schemas/.stoobly/tmp/options.json,sha256=OTRzarwus48CTrItedXCrgQttJHSEZonEYc7R_knvYg,2212
@@ -740,8 +743,8 @@ stoobly_agent/test/mock_data/scaffold/docker-compose-local-service.yml,sha256=1W
740
743
  stoobly_agent/test/mock_data/scaffold/index.html,sha256=qJwuYajKZ4ihWZrJQ3BNObV5kf1VGnnm_vqlPJzdqLE,258
741
744
  stoobly_agent/test/mock_data/uspto.yaml,sha256=6U5se7C3o-86J4m9xpOk9Npias399f5CbfWzR87WKwE,7835
742
745
  stoobly_agent/test/test_helper.py,sha256=m_oAI7tmRYCNZdKfNqISWhMv3e44tjeYViQ3nTUfnos,1007
743
- stoobly_agent-1.6.6.dist-info/LICENSE,sha256=o93sj12cdoEOsTCjPaPFsw3Xq0SXs3pPcY-9reE2sEw,548
744
- stoobly_agent-1.6.6.dist-info/METADATA,sha256=Pq3u98yhvcG83VsoM5ng6YTI28e457gUWjKl3B1Nu0s,3087
745
- stoobly_agent-1.6.6.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
746
- stoobly_agent-1.6.6.dist-info/entry_points.txt,sha256=aq5wix5oC8MDQtmyPGU0xaFrsjJg7WH28NmXh2sc3Z8,56
747
- stoobly_agent-1.6.6.dist-info/RECORD,,
746
+ stoobly_agent-1.6.7.dist-info/LICENSE,sha256=o93sj12cdoEOsTCjPaPFsw3Xq0SXs3pPcY-9reE2sEw,548
747
+ stoobly_agent-1.6.7.dist-info/METADATA,sha256=qdGza9KAifMv5H2jjIj-CQGutb0ZIYnMpC20T7thyeU,3087
748
+ stoobly_agent-1.6.7.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
749
+ stoobly_agent-1.6.7.dist-info/entry_points.txt,sha256=aq5wix5oC8MDQtmyPGU0xaFrsjJg7WH28NmXh2sc3Z8,56
750
+ stoobly_agent-1.6.7.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 2.1.2
2
+ Generator: poetry-core 2.1.3
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any