Skip to content

Commit

Permalink
Fix: url renamed to path, Purge: mockupserver.
Browse files Browse the repository at this point in the history
  • Loading branch information
pylover committed Aug 31, 2024
1 parent 7052b3b commit 8b71433
Show file tree
Hide file tree
Showing 24 changed files with 124 additions and 180 deletions.
12 changes: 2 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ def wsgi_application(environ, start_response):
with Given(
wsgi_application,
title='Quickstart!',
url='/books/id: 1',
path='/books/id: 1',
as_='visitor') as story:

assert status == 200
Expand Down Expand Up @@ -105,7 +105,7 @@ base_call:
foo: bar
status: 200 OK
title: Posting a book
url: /books/:id
path: /books/:id
path_parameters:
id: '1'
verb: GET
Expand Down Expand Up @@ -221,11 +221,3 @@ Add this into your `.bashrc` and or `$VIRTUAL_ENV/bin/postactivate`.
```bash
eval "$(register-python-argcomplete bddrest)"
```

### Mockup server

When you want serve the server for special yaml file using like below.

```bash
bddrest mockupserver yamlfilename
```
2 changes: 1 addition & 1 deletion bddrest/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,4 @@
from .exceptions import InvalidUrlParametersError, CallVerifyError


__version__ = '6.0.0dev'
__version__ = '6.0.1'
2 changes: 0 additions & 2 deletions bddrest/cli.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,13 @@
from easycli import Root

from .documentary import DocumentaryLauncher
from .mockupserver import MockupServer


class BDDRESTCommand(Root):
__help__ = 'bddrest'
__completion__ = True
__arguments__ = [
DocumentaryLauncher,
MockupServer,
]


Expand Down
18 changes: 9 additions & 9 deletions bddrest/connectors.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ def write(self, data):


class Connector(metaclass=abc.ABCMeta):
def request(self, verb='GET', url='/', form=None, multipart=None,
def request(self, verb='GET', path='/', form=None, multipart=None,
json=None, environ=None, headers=None, body=None,
content_type=None, content_length=None, **kw):
headers = headers or []
Expand Down Expand Up @@ -53,10 +53,10 @@ def request(self, verb='GET', url='/', form=None, multipart=None,
if content_length is not None:
headers.append(('Content-Length', str(content_length)))

return self._send_request(verb, url, environ, headers, body, **kw)
return self._send_request(verb, path, environ, headers, body, **kw)

@abc.abstractmethod
def _send_request(self, verb, url, environ, headers, body=None, **kw):
def _send_request(self, verb, path, environ, headers, body=None, **kw):
pass


Expand All @@ -65,7 +65,7 @@ def __init__(self, application, environ=None):
self.application = application
self.environ = environ

def _prepare_environ(self, verb, url, headers, payload=None,
def _prepare_environ(self, verb, path, headers, payload=None,
extra_environ=None, https=False):
if isinstance(payload, io.BytesIO):
input_file = payload
Expand Down Expand Up @@ -95,11 +95,11 @@ def _prepare_environ(self, verb, url, headers, payload=None,
if https:
environ['HTTPS'] = 'yes'

if '?' in url:
url, query = url.split('?', 1)
if '?' in path:
path, query = path.split('?', 1)
environ['QUERY_STRING'] = query

environ['PATH_INFO'] = unquote(url, 'iso-8859-1')
environ['PATH_INFO'] = unquote(path, 'iso-8859-1')

if extra_environ:
environ.update(extra_environ)
Expand All @@ -112,9 +112,9 @@ def _prepare_environ(self, verb, url, headers, payload=None,

return environ

def _send_request(self, verb, url, environ, headers, body=None,
def _send_request(self, verb, path, environ, headers, body=None,
https=False, **kw):
environ_ = self._prepare_environ(verb, url, headers, body, environ,
environ_ = self._prepare_environ(verb, path, headers, body, environ,
https)
response = None

Expand Down
12 changes: 6 additions & 6 deletions bddrest/documentary/curl.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@

class CURL:

def __init__(self, url, form, query, authorization, verb='GET',
def __init__(self, path, form, query, authorization, verb='GET',
content_type='text/plain', headers=[], nerds_readable=None,
multipart=None, json=None):

self._url = url
self._path = path
self._query = query
self._form = form
self._headers = headers
Expand Down Expand Up @@ -75,7 +75,7 @@ def query(self):
@property
def full_path(self):
query = f'?{self.query}' if self.query else ''
return f'"{self._url}{query}"'
return f'"{self._path}{query}"'

@property
def parts(self):
Expand Down Expand Up @@ -114,7 +114,7 @@ def parts(self):
@classmethod
def from_call(cls, call):
return cls(
url=cls.serialize_url(call.url, call.path_parameters),
path=cls.serialize_path(call.path, call.path_parameters),
query=call.query,
form=call.form,
verb=call.verb,
Expand All @@ -126,10 +126,10 @@ def from_call(cls, call):
)

@classmethod
def serialize_url(cls, url, path_parameters):
def serialize_path(cls, path, path_parameters):
path_part = []

for part in url.split('/'):
for part in path.split('/'):
if part.startswith(':'):
part = path_parameters[part[1:]]

Expand Down
2 changes: 1 addition & 1 deletion bddrest/documentary/documenter.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ def write_curl(self, formatter, content):
formatter.write_codeblock('bash', content)

def write_call(self, basecall, call, formatter):
formatter.write_header(f'{call.verb} {call.url}', 3)
formatter.write_header(f'{call.verb} {call.path}', 3)

if self.onstory:
_, fieldsinfo = self.onstory(basecall)
Expand Down
45 changes: 0 additions & 45 deletions bddrest/mockupserver/__init__.py

This file was deleted.

20 changes: 10 additions & 10 deletions bddrest/specification/alteredcall.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ class Unchanged:


class AlteredCall(Call):
def __init__(self, base_call, url=UNCHANGED, verb=UNCHANGED,
def __init__(self, base_call, path=UNCHANGED, verb=UNCHANGED,
path_parameters=UNCHANGED, form=UNCHANGED, json=UNCHANGED,
multipart=UNCHANGED, content_type=UNCHANGED,
headers=UNCHANGED, as_=UNCHANGED, query=UNCHANGED, title=None,
Expand All @@ -26,7 +26,7 @@ def __init__(self, base_call, url=UNCHANGED, verb=UNCHANGED,
response=response
)

self.url = url
self.path = path
if path_parameters is not UNCHANGED:
self.path_parameters = path_parameters

Expand Down Expand Up @@ -71,18 +71,18 @@ def update_diff(self, key, value):
self.diff[key] = value

@property
def url(self):
return self.diff.get('url', self.base_call.url)
def path(self):
return self.diff.get('path', self.base_call.path)

@url.setter
def url(self, value):
@path.setter
def path(self, value):
if value is UNCHANGED:
self.diff.pop('url', None)
self.diff.pop('path', None)
return

url, path_parameters, query = self.extract_path_parameters(value)
if url and url != self.base_call.url:
self.diff['url'] = url
path, path_parameters, query = self.extract_path_parameters(value)
if path and path != self.base_call.path:
self.diff['path'] = path
self.path_parameters = path_parameters
self.query = query

Expand Down
43 changes: 22 additions & 21 deletions bddrest/specification/call.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ def __init__(self, title=None, description=None, response=None):
def to_dict(self):
result = dict(
title=self.title,
url=self.url,
path=self.path,
verb=self.verb,
)
if self.path_parameters is not None:
Expand Down Expand Up @@ -63,10 +63,10 @@ def to_dict(self):
return result

def validate_path_parameters(self):
# i[1:].strip() for i in re.findall(r':[ \w]+', self.url))
# i[1:].strip() for i in re.findall(r':[ \w]+', self.path))
required_parameters = set(
i[1:] for i in re.findall(
fr':\s?{URL_PARAMETER_VALUE_PATTERN}', self.url)
fr':\s?{URL_PARAMETER_VALUE_PATTERN}', self.path)
)

if not required_parameters and self.path_parameters is None:
Expand All @@ -88,28 +88,28 @@ def validate(self):
self.validate_path_parameters()

@staticmethod
def extract_path_parameters(url):
def extract_path_parameters(path):
path_parameters = {}
query = None
parsedurl = urlparse(url)
parsedpath = urlparse(path)

if url is None:
if path is None:
return None, None, None

# Parsing the querystrings if available
if parsedurl.query:
query = querystring_parse(parsedurl.query)
if parsedpath.query:
query = querystring_parse(parsedpath.query)

url = parsedurl.path
if URL_PARAMETER_PATTERN.search(url):
for k, v in URL_PARAMETER_PATTERN.findall(url):
path = parsedpath.path
if URL_PARAMETER_PATTERN.search(path):
for k, v in URL_PARAMETER_PATTERN.findall(path):
path_parameters[k] = v
url = re.sub(
path = re.sub(
rf'{k}:\s?{URL_PARAMETER_VALUE_PATTERN}', rf':{k}',
url
path
)

return url, path_parameters if path_parameters else None, query
return path, path_parameters if path_parameters else None, query

def add_header_if_not_exists(self, headers, key, value):
for k, v in headers:
Expand All @@ -118,12 +118,13 @@ def add_header_if_not_exists(self, headers, key, value):
headers.append((key, value))

def invoke(self, application) -> Response:
url = self.url
path = self.path
if self.path_parameters:
for k, v in self.path_parameters.items():
url = url.replace(f':{k}', str(v))
path = path.replace(f':{k}', str(v))

url = f'{url}?{querystring_encode(self.query)}' if self.query else url
path = f'{path}?{querystring_encode(self.query)}' if self.query \
else path

headers = self.headers.copy() if self.headers else []
if self.content_type:
Expand Down Expand Up @@ -157,7 +158,7 @@ def invoke(self, application) -> Response:

response = WSGIConnector(application).request(
self.verb,
url,
path,
**request_params
)

Expand Down Expand Up @@ -193,12 +194,12 @@ def verb(self, value): # pragma: no cover

@property
@abstractmethod
def url(self) -> str: # pragma: no cover
def path(self) -> str: # pragma: no cover
pass

@url.setter
@path.setter
@abstractmethod
def url(self, value): # pragma: no cover
def path(self, value): # pragma: no cover
pass

@property
Expand Down
Loading

0 comments on commit 8b71433

Please sign in to comment.