Skip to content

Commit f04c7de

Browse files
committed
Merge branch 'master' into task/updated-documentation
2 parents 633a5f8 + 09fad2e commit f04c7de

File tree

15 files changed

+249
-173
lines changed

15 files changed

+249
-173
lines changed

Pipfile

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,14 @@ pyyaml = ">=5.1.2"
1010
anyconfig = ">=0.9.8"
1111
swagger-ui-bundle = ">=0.0.2"
1212
connexion = {extras = ["swagger-ui"],version = "==2.4.0"}
13-
jaeger-client = "==4.1.0"
13+
jaeger-client = "==4.2.0"
1414
flask-opentracing = "*"
1515
opentracing = ">=2.1"
1616
opentracing-instrumentation = "==3.2.1"
1717
prometheus_client = ">=0.7.1"
1818
[dev-packages]
1919
requests-mock = "*"
20-
coverage = "==4.4.0"
20+
coverage = "==4.5.4"
2121
pytest = "*"
2222
pytest-cov = "*"
2323
pylint = "*"
@@ -26,7 +26,7 @@ tox = "*"
2626
safety = "*"
2727
bandit = "*"
2828
mkdocs = "*"
29-
lightstep = "==4.1.0"
29+
lightstep = "==4.3.0"
3030

3131
[requires]
3232
python_version = "3.6"

Pipfile.lock

Lines changed: 98 additions & 100 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

examples/microservice_configuration/config.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ pyms:
44
swagger:
55
path: ""
66
file: "swagger.yaml"
7-
my-configure-microservice:
7+
ms:
88
DEBUG: true
99
TESTING: false
1010
APP_NAME: "Python Microservice"

examples/microservice_swagger/config.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ pyms:
22
swagger:
33
path: ""
44
file: "swagger.yaml"
5+
url: "ws-doc/"
56
my-ms:
67
DEBUG: true
78
TESTING: false

pyms/config/confile.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,6 @@ def __init__(self, *args, **kwargs):
3131
else:
3232
raise ConfigDoesNotFoundException("Configuration file not found")
3333

34-
logger.debug("[CONF] INIT: Settings {kwargs}".format(
35-
kwargs=kwargs,
36-
))
37-
3834
config = dict(self.normalize_config(config))
3935
_ = [setattr(self, k, v) for k, v in config.items()]
4036
super(ConfFile, self).__init__(config)

pyms/flask/app/create_app.py

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
import os
33
from typing import Text
44

5-
import connexion
65
from flask import Flask
76
from flask_opentracing import FlaskTracing
87

@@ -50,7 +49,7 @@ def __init__(self, *args, **kwargs):
5049

5150
def init_services(self):
5251
service_manager = ServicesManager()
53-
for service_name, service in service_manager.get_services():
52+
for service_name, service in service_manager.get_services(memoize=self._singleton):
5453
setattr(self, service_name, service)
5554

5655
def init_libs(self):
@@ -81,17 +80,7 @@ def init_logger(self):
8180

8281
def init_app(self) -> Flask:
8382
if self._exists_service("swagger"):
84-
check_package_exists("connexion")
85-
app = connexion.App(__name__, specification_dir=os.path.join(self.path, self.swagger.path))
86-
app.add_api(
87-
self.swagger.file,
88-
arguments={'title': self.config.APP_NAME},
89-
base_path=self.config.APPLICATION_ROOT
90-
)
91-
92-
# Invert the objects, instead connexion with a Flask object, a Flask object with
93-
application = app.app
94-
application.connexion_app = app
83+
application = self.swagger.init_app(config=self.config, path=self.path)
9584
else:
9685
check_package_exists("flask")
9786
application = Flask(__name__, static_folder=os.path.join(self.path, 'static'),

pyms/flask/services/driver.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ class DriverService:
1313

1414
def __init__(self, service, *args, **kwargs):
1515
self.service = ".".join([service, self.service])
16-
self.config = get_conf(service=self.service, empty_init=True)
16+
self.config = get_conf(service=self.service, empty_init=True, memoize=kwargs.get("memoize", True))
1717

1818
def __getattr__(self, attr, *args, **kwargs):
1919
config_attribute = getattr(self.config, attr)
@@ -31,8 +31,8 @@ def __init__(self, service=None):
3131
self.service = (service if service else SERVICE_BASE)
3232
self.config = get_conf(service=self.service, empty_init=True, memoize=False)
3333

34-
def get_services(self):
35-
return ((k, self.get_service(k)) for k in self.config.__dict__.keys() if k not in ['empty_init', ])
34+
def get_services(self, memoize):
35+
return ((k, self.get_service(k, memoize=memoize)) for k in self.config.__dict__.keys() if k not in ['empty_init', ])
3636

3737
def get_service(self, service, *args, **kwargs):
3838
service_object = import_from("pyms.flask.services.{}".format(service), "Service")

pyms/flask/services/requests.py

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515

1616
DEFAULT_RETRIES = 3
1717

18-
DEFAULTstatus_retries = (500, 502, 504)
18+
DEFAULT_STATUS_RETRIES = (500, 502, 504)
1919

2020

2121
def retry(f):
@@ -41,20 +41,12 @@ def wrapper(*args, **kwargs):
4141
class Service(DriverService):
4242
service = "requests"
4343
default_values = {
44-
"data": ""
44+
"data": "",
45+
"retries": DEFAULT_RETRIES,
46+
"status_retries": DEFAULT_STATUS_RETRIES,
47+
"propagate_headers": False,
4548
}
4649
tracer = None
47-
retries = DEFAULT_RETRIES
48-
status_retries = DEFAULTstatus_retries
49-
_propagate_headers = False
50-
51-
def __init__(self, service, *args, **kwargs):
52-
"""Initialization for trace headers propagation"""
53-
super().__init__(service, *args, **kwargs)
54-
if self.exists_config():
55-
self.retries = self.config.retries or DEFAULT_RETRIES
56-
self.status_retries = self.config.status_retries or DEFAULTstatus_retries
57-
self._propagate_headers = self.config.propagate_headers
5850

5951
def requests(self, session: requests.Session):
6052
"""
@@ -94,7 +86,7 @@ def insert_trace_headers(headers: dict) -> dict:
9486
return headers
9587

9688
@staticmethod
97-
def propagate_headers(headers: dict) -> dict:
89+
def set_propagate_headers(headers: dict) -> dict:
9890
for k, v in request.headers:
9991
if not headers.get(k):
10092
headers.update({k: v})
@@ -112,7 +104,7 @@ def _get_headers(self, headers, propagate_headers=False):
112104
headers = {}
113105

114106
if self._propagate_headers or propagate_headers:
115-
headers = self.propagate_headers(headers)
107+
headers = self.set_propagate_headers(headers)
116108
return headers
117109

118110
@staticmethod
@@ -137,8 +129,8 @@ def parse_response(self, response):
137129

138130
try:
139131
data = response.json()
140-
if self.config.data:
141-
data = data.get(self.config.data, {})
132+
if self.data:
133+
data = data.get(self.data, {})
142134
return data
143135
except ValueError:
144136
logger.warning("Response.content is not a valid json {}".format(response.content))

pyms/flask/services/swagger.py

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,38 @@
1+
import os
2+
3+
import connexion
4+
from connexion.resolver import RestyResolver
5+
16
from pyms.flask.services.driver import DriverService
7+
from pyms.utils import check_package_exists
28

39
SWAGGER_PATH = "swagger"
410
SWAGGER_FILE = "swagger.yaml"
11+
SWAGGER_URL = "ui/"
12+
PROJECT_DIR = "project"
513

614

715
class Service(DriverService):
816
service = "swagger"
917
default_values = {
1018
"path": SWAGGER_PATH,
11-
"file": SWAGGER_FILE
19+
"file": SWAGGER_FILE,
20+
"url": SWAGGER_URL,
21+
"project_dir": PROJECT_DIR
1222
}
23+
24+
def init_app(self, config, path):
25+
check_package_exists("connexion")
26+
app = connexion.App(__name__,
27+
specification_dir=os.path.join(path, self.path),
28+
resolver=RestyResolver(self.project_dir))
29+
app.add_api(
30+
self.file,
31+
arguments={'title': config.APP_NAME},
32+
base_path=config.APPLICATION_ROOT,
33+
options={"swagger_url": self.url}
34+
)
35+
# Invert the objects, instead connexion with a Flask object, a Flask object with
36+
application = app.app
37+
application.connexion_app = app
38+
return application

tests/common.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
from pyms.flask.app import Microservice
2+
3+
class MyMicroserviceNoSingleton(Microservice):
4+
_singleton = False
5+
6+
7+
class MyMicroservice(Microservice):
8+
pass

0 commit comments

Comments
 (0)