stoobly-agent 1.0.0__py3-none-any.whl → 1.0.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.0.0'
2
+ VERSION = '1.0.2'
@@ -1,6 +1,6 @@
1
1
  import pdb
2
2
 
3
- from ...constants import SERVICE_HOSTNAME, SERVICE_PORT, SERVICE_SCHEME
3
+ from ...constants import SERVICE_HOSTNAME, SERVICE_PORT
4
4
  from .builder import WorkflowBuilder
5
5
 
6
6
  class MockDecorator():
@@ -1,5 +1,7 @@
1
1
  import pdb
2
2
 
3
+ from urllib.parse import urlparse
4
+
3
5
  from ...constants import SERVICE_DNS, SERVICE_HOSTNAME, SERVICE_PORT
4
6
  from .builder import WorkflowBuilder
5
7
 
@@ -32,12 +34,24 @@ class ReverseProxyDecorator():
32
34
  proxy_name = self.workflow_builder.proxy
33
35
  proxy_service = services.get(proxy_name) or {}
34
36
 
35
- # proxying forwards requests to the actual service
37
+ additional_properties = { 'command': command }
38
+
39
+ # Proxying forwards requests to the actual service
40
+ # If the destination hostname is the same as the service's hostname, then
36
41
  # If we set the 'hostname' property, this will cause an "infinite loop"
42
+ proxy_mode_toks = config.proxy_mode.split(':', 1)
43
+
44
+ if len(proxy_mode_toks) > 1:
45
+ directed = proxy_mode_toks[0] == 'reverse' or proxy_mode_toks[0] == 'upstream'
46
+ if directed:
47
+ spec = proxy_mode_toks[1]
48
+ uri = urlparse(spec)
49
+ if uri.hostname != self.service_builder.config.hostname:
50
+ additional_properties['hostname'] = f"{SERVICE_HOSTNAME}"
37
51
 
38
52
  service = {
39
53
  **proxy_service,
40
- **{ 'command': command },
54
+ **additional_properties,
41
55
  }
42
56
 
43
57
  # If we are reverse proxying to potentially an external host,
@@ -52,8 +52,8 @@ class ServiceConfig(Config):
52
52
  self.__scheme = kwargs.get('scheme')
53
53
 
54
54
  @property
55
- def detached(self):
56
- return self.__detached
55
+ def detached(self) -> bool:
56
+ return not not self.__detached
57
57
 
58
58
  @detached.setter
59
59
  def detached(self, v):
@@ -69,7 +69,7 @@ class ServiceConfig(Config):
69
69
 
70
70
  @property
71
71
  def hostname(self):
72
- return self.__hostname
72
+ return (self.__hostname or '').strip()
73
73
 
74
74
  @hostname.setter
75
75
  def hostname(self, v):
@@ -99,6 +99,12 @@ class ServiceConfig(Config):
99
99
 
100
100
  @property
101
101
  def port(self):
102
+ if not self.__port:
103
+ if self.scheme == 'https':
104
+ return '443'
105
+ elif self.scheme == 'http':
106
+ return '80'
107
+
102
108
  return self.__port
103
109
 
104
110
  @port.setter
@@ -120,9 +126,9 @@ class ServiceConfig(Config):
120
126
  self.__priority = v
121
127
 
122
128
  @property
123
- def proxy_mode(self):
129
+ def proxy_mode(self) -> str:
124
130
  if self.__proxy_mode:
125
- return self.__proxy_mode
131
+ return (self.__proxy_mode or '').strip()
126
132
 
127
133
  return f"reverse:{self.scheme}://{self.hostname}"
128
134
 
@@ -132,7 +138,7 @@ class ServiceConfig(Config):
132
138
 
133
139
  @property
134
140
  def scheme(self):
135
- return self.__scheme or 'https'
141
+ return (self.__scheme or 'https').strip()
136
142
 
137
143
  @scheme.setter
138
144
  def scheme(self, v):
@@ -1,4 +1,4 @@
1
- FROM stoobly/agent:0.34
1
+ FROM stoobly/agent:1.0
2
2
 
3
3
  ARG USER_ID
4
4
 
@@ -1,4 +1,4 @@
1
- FROM ubuntu:23.10 AS build
1
+ FROM ubuntu:24.04 AS build
2
2
 
3
3
  WORKDIR /tmp
4
4
 
@@ -6,7 +6,7 @@ RUN apt-get update && apt-get install -y curl
6
6
  RUN curl -JLO "https://dl.filippo.io/mkcert/v1.4.4?for=linux/amd64" && \
7
7
  chmod +x mkcert-v1.4.4-linux-amd64
8
8
 
9
- FROM ubuntu:23.10 AS cert
9
+ FROM ubuntu:24.04 AS cert
10
10
 
11
11
  ARG SERVICE_HOSTNAME
12
12
 
@@ -19,14 +19,14 @@ WORKDIR /home/mkcert
19
19
 
20
20
  RUN mkcert $SERVICE_HOSTNAME && mkcert -pkcs12 $SERVICE_HOSTNAME && cat $SERVICE_HOSTNAME.pem >> $SERVICE_HOSTNAME-joined.pem && cat $SERVICE_HOSTNAME-key.pem >> $SERVICE_HOSTNAME-joined.pem
21
21
 
22
- FROM stoobly/agent:0.34
22
+ FROM stoobly/agent:1.0
23
23
 
24
- ARG USER_ID
25
24
  ARG SERVICE_HOSTNAME
25
+ ARG USER_ID
26
26
 
27
27
  # Allow running stoobly on port 443
28
28
  RUN apt-get update && apt-get install -y curl libcap2-bin
29
- RUN setcap 'cap_net_bind_service=+ep' /usr/local/bin/python3.8
29
+ RUN setcap 'cap_net_bind_service=+ep' /usr/local/bin/python3.12
30
30
 
31
31
  # Change user id of stoobly user to that of host's user id
32
32
  RUN if [ -n "$USER_ID" ]; then groupmod -g $USER_ID stoobly; usermod -u $USER_ID stoobly; fi
@@ -274,7 +274,7 @@ def logs(**kwargs):
274
274
  @workflow.command()
275
275
  @click.option('--app-dir-path', default=os.getcwd(), help='Path to application directory.')
276
276
  @click.option('--certs-dir-path', default=DataDir.instance().certs_dir_path, help='Path to certs directory.')
277
- @click.option('--context-dir-path', default=DataDir.instance().path, help='Path to Stoobly data directory.')
277
+ @click.option('--context-dir-path', default=DataDir.instance().context_dir_path, help='Path to Stoobly data directory.')
278
278
  @click.option('--filter', multiple=True, type=click.Choice([WORKFLOW_CUSTOM_FILTER]), help='Select which service groups to run. Defaults to all.')
279
279
  @click.option('--dry-run', default=False, is_flag=True, help='If set, prints commands.')
280
280
  @click.option('--extra-compose-path', help='Path to extra compose configuration files.')
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: stoobly-agent
3
- Version: 1.0.0
3
+ Version: 1.0.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=g07ijCq1Ne99trefCfylko8K4RwfuxTQjI0P3u1lImc,44
1
+ stoobly_agent/__init__.py,sha256=AewfG39HNAz5wMih3ASPkjYwMTZ40BC3bWka806550w,44
2
2
  stoobly_agent/app/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
3
  stoobly_agent/app/api/__init__.py,sha256=FFSlVoTgjPfUNlYPr_7u6-P5Y4WOKyaUfAHtUcB-Xio,810
4
4
  stoobly_agent/app/api/application_http_request_handler.py,sha256=jf4fkqjOiCeI2IM5Ro7ie0v_C6y0-7-5TIE_IKMPOfg,5513
@@ -87,17 +87,17 @@ stoobly_agent/app/cli/scaffold/docker/workflow/__init__.py,sha256=47DEQpj8HBSa-_
87
87
  stoobly_agent/app/cli/scaffold/docker/workflow/build_decorator.py,sha256=vbmME0cbN2EnNRlzQ2umj7Y3L7aZT-EHqEpkBFMfe8U,758
88
88
  stoobly_agent/app/cli/scaffold/docker/workflow/builder.py,sha256=51uGZt9CydBzRwR9aB6uDXuJ2QNm6Iql3AMWv6AtCtw,6919
89
89
  stoobly_agent/app/cli/scaffold/docker/workflow/decorators_factory.py,sha256=Mi6SEFpG2MG9pymPLbPTWBMfosi1ThRAs5DXfjBz4Iw,643
90
- stoobly_agent/app/cli/scaffold/docker/workflow/mock_decorator.py,sha256=-gq0v6iIURWEWCv1eZjLev9ePMAJM21Tlw0NKRpKw9w,1083
91
- stoobly_agent/app/cli/scaffold/docker/workflow/reverse_proxy_decorator.py,sha256=xuM2AABMbSJGywaOUFY9kUG36OL2mJLFAkIDRCsE2fg,1479
90
+ stoobly_agent/app/cli/scaffold/docker/workflow/mock_decorator.py,sha256=pOvyrauHRB1cOB0OKBA3MQnM-Iwfbuwwop2TDSWs_jo,1067
91
+ stoobly_agent/app/cli/scaffold/docker/workflow/reverse_proxy_decorator.py,sha256=RiNOXaCj_TM-NkFVtu-jnZEIeG8HBKPrVqBbnfRNzio,2031
92
92
  stoobly_agent/app/cli/scaffold/env.py,sha256=e-Ve4p3RUgzFx22B3SIYttvJ_yLuDtA27oDACZ8n-6E,1140
93
93
  stoobly_agent/app/cli/scaffold/service.py,sha256=HzYTiQGfReYXEY0Iv4YjGpu5fjCicV61Wst4khmmURs,504
94
94
  stoobly_agent/app/cli/scaffold/service_command.py,sha256=VtXrgiNO6kD4Oi_alHrJWQhkho3oI-yqs1fe8BPDW6M,1055
95
- stoobly_agent/app/cli/scaffold/service_config.py,sha256=L9DtG_IwRs8BbN-YImMY_kzz6VkrKVuBj1L_ICP3LPA,5416
95
+ stoobly_agent/app/cli/scaffold/service_config.py,sha256=nXopRnHHw6o4Qh1ekYIJCT8hLIMY0QBN4PAXTCL4qFI,5615
96
96
  stoobly_agent/app/cli/scaffold/service_create_command.py,sha256=bmLGgx9qnh-X_i2_XfdWSQIer0gGkaQx6lXZSIzy-LI,2793
97
97
  stoobly_agent/app/cli/scaffold/service_workflow.py,sha256=sQ_Edy_wGHKMXpD0DmhnOWkGEKz7gSgEGNI8f7aXOdg,444
98
98
  stoobly_agent/app/cli/scaffold/templates/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
99
- stoobly_agent/app/cli/scaffold/templates/app/.Dockerfile.context,sha256=BOwWLDlabphqEDFYp2qC_1MsBcUzvX3lcANW-OQe25w,194
100
- stoobly_agent/app/cli/scaffold/templates/app/.Dockerfile.proxy,sha256=Lf_lA_izSac50JsOKmU6mGHgj9N4vyXZfynSk1Rpq5c,1047
99
+ stoobly_agent/app/cli/scaffold/templates/app/.Dockerfile.context,sha256=1Zm5_ROKZzFMAkMt8dluEJASI2CBi9d9If_Gch9FMNM,193
100
+ stoobly_agent/app/cli/scaffold/templates/app/.Dockerfile.proxy,sha256=g4FSTh8tlyweisTO29Ci6c1GsPm154RsE1K4EHRgQkg,1047
101
101
  stoobly_agent/app/cli/scaffold/templates/app/.Makefile,sha256=di-KeT_8vHlz86wqJeEx_jwbJrC3bSK_RHgJCGYrlpg,4114
102
102
  stoobly_agent/app/cli/scaffold/templates/app/.docker-compose.base.yml,sha256=jDEG7TkEyHhlt33H5JC-jD0nwdFk2rsDcaS6N9yjYRk,359
103
103
  stoobly_agent/app/cli/scaffold/templates/app/Makefile,sha256=t7xRaCc9q3k7W34S0h9KX02GljSVwGpPnFmiLUvWxsw,80
@@ -182,7 +182,7 @@ stoobly_agent/app/cli/scaffold/workflow_copy_command.py,sha256=R9hh5dWVz7vGld7pE
182
182
  stoobly_agent/app/cli/scaffold/workflow_create_command.py,sha256=5xnRYrVb2KlSDARZFjLGGWeURXRu63OHoRLEhO-EAvw,3401
183
183
  stoobly_agent/app/cli/scaffold/workflow_log_command.py,sha256=FN-XyMVnulbassBuqeB21J_PQnOsr_LNs0Dg2tcDkjg,435
184
184
  stoobly_agent/app/cli/scaffold/workflow_run_command.py,sha256=quPMwahE7TQozbzntIQJRoEhNjv0e_QfpYZnbWQV1iE,4025
185
- stoobly_agent/app/cli/scaffold_cli.py,sha256=YQ3o6dVICigeeLgouyLT9xAsHhqAxHXQrppHXjziHX8,14753
185
+ stoobly_agent/app/cli/scaffold_cli.py,sha256=5facvX1S-SnJWWe644_8bBV4ytLQlj25RYDiiselvcU,14765
186
186
  stoobly_agent/app/cli/scenario_cli.py,sha256=3J1EiJOvunkfWrEkOsanw-XrKkOk78ij_GjBlE9p7CE,8229
187
187
  stoobly_agent/app/cli/snapshot_cli.py,sha256=ngEuNxQPBY9YhoBosPXIQ-vWnZQaivjxeT25ObxJeuI,9951
188
188
  stoobly_agent/app/cli/trace_cli.py,sha256=K7E-vx3JUcqEDSWOdIOi_AieKNQz7dBfmRrVvKDkzFI,4605
@@ -707,8 +707,8 @@ stoobly_agent/test/mock_data/petstore.yaml,sha256=CCdliJky04Az4FIOkFA883uunwFDHL
707
707
  stoobly_agent/test/mock_data/request_show_response.py,sha256=K_a0fP0QT58T8sX9PaM6hqtX1A1depZsqg_GsNPf--k,707
708
708
  stoobly_agent/test/mock_data/uspto.yaml,sha256=6U5se7C3o-86J4m9xpOk9Npias399f5CbfWzR87WKwE,7835
709
709
  stoobly_agent/test/test_helper.py,sha256=m_oAI7tmRYCNZdKfNqISWhMv3e44tjeYViQ3nTUfnos,1007
710
- stoobly_agent-1.0.0.dist-info/LICENSE,sha256=8QKGyy45eN76Zk52h8gu1DKX2B_gbWgZ3nzDLofEbaE,548
711
- stoobly_agent-1.0.0.dist-info/METADATA,sha256=pAJm9wy5Zr4nz3OjofAOO-K_kbhBbkVizMClrkmvvc4,3388
712
- stoobly_agent-1.0.0.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
713
- stoobly_agent-1.0.0.dist-info/entry_points.txt,sha256=aq5wix5oC8MDQtmyPGU0xaFrsjJg7WH28NmXh2sc3Z8,56
714
- stoobly_agent-1.0.0.dist-info/RECORD,,
710
+ stoobly_agent-1.0.2.dist-info/LICENSE,sha256=8QKGyy45eN76Zk52h8gu1DKX2B_gbWgZ3nzDLofEbaE,548
711
+ stoobly_agent-1.0.2.dist-info/METADATA,sha256=4aAEZsGJjZfyGGtfTyuiWVxgKjiB-SdON5oA5Y2RmjU,3388
712
+ stoobly_agent-1.0.2.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
713
+ stoobly_agent-1.0.2.dist-info/entry_points.txt,sha256=aq5wix5oC8MDQtmyPGU0xaFrsjJg7WH28NmXh2sc3Z8,56
714
+ stoobly_agent-1.0.2.dist-info/RECORD,,