Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make Roboswag executable with -m option #29

Merged
merged 3 commits into from
Aug 13, 2022
Merged
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
88 changes: 2 additions & 86 deletions roboswag/__init__.py
Original file line number Diff line number Diff line change
@@ -1,86 +1,2 @@
from importlib.metadata import version

import requests
import urllib3

from roboswag.auth import TokenHandler
from roboswag.logger import Logger
from roboswag.__main__ import run_roboswag

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)


try:
__version__ = version("roboswag")
except Exception: # pragma: no cover
pass


class APIModel:
def __init__(
self,
base_url,
verify=False,
headers=None,
content_type="application/json",
proxies=None,
allow_redirects=True,
authorization=TokenHandler,
):
# Set headers from init too (or reuse auth)
self.base_url = base_url
self.session = requests.Session()
self.session.verify = verify
self.content_type = content_type
if content_type is not None:
self.session.headers = {"Content-Type": content_type}
self.allow_redirects = allow_redirects
if proxies is not None: # TODO urllib have autodetect proxy - allow to use it
self.session.proxies.update(proxies)
self.authorization = authorization
self.logger = Logger()
if headers is not None:
self.session.headers.update(headers)

def send_request(self, method, url, status=None, headers=None, body=None, query=None, **kwargs):
headers = self.trim_empty(headers)
query = self.trim_empty(query)
# auth = self.authorization(**kwargs) if self.authorization is not None else None
content_type = kwargs.get("content-type", self.content_type)
if content_type is not None:
headers["Content-Type"] = content_type

resp = self.session.request(
method,
url=self.base_url + url,
headers=headers,
json=body,
params=query,
# auth=auth,
allow_redirects=self.allow_redirects,
)
# TODO quiet mode
self.logger.log_request(resp)
self.logger.log_response(resp)
if status is not None:
assert resp.status_code == status, f"Expected return status: {status} but received: {resp.status_code}"
return resp

def post(self, *args, **kwargs):
# TODO handle files upload
return self.send_request("POST", *args, **kwargs)

def get(self, *args, **kwargs):
return self.send_request("GET", *args, **kwargs)

def put(self, *args, **kwargs):
return self.send_request("PUT", *args, **kwargs)

def delete(self, *args, **kwargs):
return self.send_request("DELETE", *args, **kwargs)

@staticmethod
def trim_empty(dictionary):
if dictionary is None:
return {}
return {key: value for key, value in dictionary.items() if value is not None}
from roboswag.cli import run_roboswag
from roboswag.model import APIModel
28 changes: 2 additions & 26 deletions roboswag/__main__.py
Original file line number Diff line number Diff line change
@@ -1,27 +1,3 @@
import argparse
import sys
from importlib.metadata import version
from roboswag import run_roboswag

from roboswag.generate.generate import generate

try:
__version__ = version("roboswag")
except Exception: # pragma: no cover
pass


def generate_cli():
parser = argparse.ArgumentParser()
parser.add_argument("-s", "--spec", metavar="SWAGGER", help="OpenAPI specification file")
parser.add_argument(
"-v", "--version", action="version", version=__version__, help="display Roboswag version and exit"
)
args = parser.parse_args()
if not args.spec:
print("Please provide specification file with '-s' option")
sys.exit(1)
generate(args.spec)


def run_roboswag():
generate_cli()
run_roboswag()
22 changes: 22 additions & 0 deletions roboswag/cli.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import argparse
import sys

from roboswag.version import __version__
from roboswag.generate.generate import generate


def generate_cli():
parser = argparse.ArgumentParser()
parser.add_argument("-s", "--spec", metavar="SWAGGER", help="OpenAPI specification file")
parser.add_argument(
"-v", "--version", action="version", version=__version__, help="display Roboswag version and exit"
)
args = parser.parse_args()
if not args.spec:
print("Please provide specification file with '-s' option")
sys.exit(1)
generate(args.spec)


def run_roboswag():
generate_cli()
2 changes: 1 addition & 1 deletion roboswag/generate/generate.py
Original file line number Diff line number Diff line change
@@ -101,6 +101,6 @@ def generate_schemas(swagger, output_dir):
with open(schema_file, "w") as f:
f.write(json.dumps(schema, indent=4))
f.write("\n")
print(f"Generated '{output_dir}\\{schema_name}.json' file")
print(f"Generated '{schema_file}' file")
schema_files.append(schema_file)
return schema_files
77 changes: 77 additions & 0 deletions roboswag/model.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
import requests
import urllib3

from roboswag.auth import TokenHandler
from roboswag.logger import Logger

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)


class APIModel:
def __init__(
self,
base_url,
verify=False,
headers=None,
content_type="application/json",
proxies=None,
allow_redirects=True,
authorization=TokenHandler,
):
# Set headers from init too (or reuse auth)
self.base_url = base_url
self.session = requests.Session()
self.session.verify = verify
self.content_type = content_type
if content_type is not None:
self.session.headers = {"Content-Type": content_type}
self.allow_redirects = allow_redirects
if proxies is not None: # TODO urllib have autodetect proxy - allow to use it
self.session.proxies.update(proxies)
self.authorization = authorization
self.logger = Logger()
if headers is not None:
self.session.headers.update(headers)

def send_request(self, method, url, status=None, headers=None, body=None, query=None, **kwargs):
headers = self.trim_empty(headers)
query = self.trim_empty(query)
# auth = self.authorization(**kwargs) if self.authorization is not None else None
content_type = kwargs.get("content-type", self.content_type)
if content_type is not None:
headers["Content-Type"] = content_type

resp = self.session.request(
method,
url=self.base_url + url,
headers=headers,
json=body,
params=query,
# auth=auth,
allow_redirects=self.allow_redirects,
)
# TODO quiet mode
self.logger.log_request(resp)
self.logger.log_response(resp)
if status is not None:
assert resp.status_code == status, f"Expected return status: {status} but received: {resp.status_code}"
return resp

def post(self, *args, **kwargs):
# TODO handle files upload
return self.send_request("POST", *args, **kwargs)

def get(self, *args, **kwargs):
return self.send_request("GET", *args, **kwargs)

def put(self, *args, **kwargs):
return self.send_request("PUT", *args, **kwargs)

def delete(self, *args, **kwargs):
return self.send_request("DELETE", *args, **kwargs)

@staticmethod
def trim_empty(dictionary):
if dictionary is None:
return {}
return {key: value for key, value in dictionary.items() if value is not None}
6 changes: 6 additions & 0 deletions roboswag/version.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from importlib.metadata import version

try:
__version__ = version("roboswag")
except Exception: # pragma: no cover
pass