Skip to content

Commit 1651dc9

Browse files
authored
Merge pull request #7 from tpiperatgod/issue-6
add new ut cases
2 parents 5e5d8da + 3c16227 commit 1651dc9

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

67 files changed

+268
-3503
lines changed

setup.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@
5858
"dapr>=1.10.0",
5959
"aiohttp==3.8.4",
6060
"dapr-ext-grpc>=1.10.0",
61-
"dapr-ext-fastapi>=1.10.0"
61+
"dapr-ext-fastapi>=1.10.0",
6262
],
6363
entry_points={
6464
"console_scripts": [

src/functions_framework/_cli.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
@click.option("--dry-run", envvar="DRY_RUN", is_flag=True)
2727
def _cli(target, source, host, port, debug, dry_run):
2828
# fetch the context
29-
context = _function_registry.get_openfunction_context('')
29+
context = _function_registry.get_openfunction_context("")
3030

3131
runner = Runner(context, target, source, host, port, debug, dry_run)
3232
runner.run()
@@ -35,4 +35,4 @@ def _cli(target, source, host, port, debug, dry_run):
3535
def run_dry(target, host, port):
3636
click.echo("Function: {}".format(target))
3737
click.echo("URL: http://{}:{}/".format(host, port))
38-
click.echo("Dry run successful, shutting down.")
38+
click.echo("Dry run successful, shutting down.")

src/functions_framework/_function_registry.py

+7-7
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,11 @@ def get_user_function(source, source_module, target):
7171
raise InvalidFunctionSignatureException(
7272
"The function defined in file {source} as {target} needs to be of "
7373
"function signature {signature}, but got {target_signature}".format(
74-
source=source, target=target, signature=FUNCTION_SIGNATURE_RULE,
75-
target_signature=inspect.signature(function))
74+
source=source,
75+
target=target,
76+
signature=FUNCTION_SIGNATURE_RULE,
77+
target_signature=inspect.signature(function),
78+
)
7679
)
7780

7881
return function
@@ -142,13 +145,10 @@ def get_func_signature_type(func_name: str, signature_type: str) -> str:
142145

143146
def get_openfunction_context(func_context: str) -> FunctionContext:
144147
"""Get openfunction context"""
145-
context_str = (
146-
func_context
147-
or os.environ.get(FUNC_CONTEXT)
148-
)
148+
context_str = func_context or os.environ.get(FUNC_CONTEXT)
149149

150150
if context_str:
151151
context = FunctionContext.from_json(json.loads(context_str))
152152
return context
153-
153+
154154
return None

src/functions_framework/context/function_context.py

+66-37
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,20 @@
1717
class FunctionContext(object):
1818
"""OpenFunction's serving context."""
1919

20-
def __init__(self, name="", version="", dapr_triggers=None, http_trigger=None,
21-
inputs=None, outputs=None, states=None,
22-
pre_hooks=None, post_hooks=None, tracing=None, port=0):
20+
def __init__(
21+
self,
22+
name="",
23+
version="",
24+
dapr_triggers=None,
25+
http_trigger=None,
26+
inputs=None,
27+
outputs=None,
28+
states=None,
29+
pre_hooks=None,
30+
post_hooks=None,
31+
tracing=None,
32+
port=0,
33+
):
2334
self.name = name
2435
self.version = version
2536
self.dapr_triggers = dapr_triggers
@@ -34,17 +45,17 @@ def __init__(self, name="", version="", dapr_triggers=None, http_trigger=None,
3445

3546
@staticmethod
3647
def from_json(json_dct):
37-
name = json_dct.get('name')
38-
version = json_dct.get('version')
39-
inputs_map = json_dct.get('inputs')
40-
outputs_map = json_dct.get('outputs')
41-
_dapr_triggers = json_dct.get('triggers', {}).get('dapr', [])
42-
http_trigger = json_dct.get('triggers', {}).get('http', None)
43-
states = json_dct.get('states', {})
44-
pre_hooks = json_dct.get('pre_hooks', [])
45-
post_hooks = json_dct.get('post_hooks', [])
46-
tracing = json_dct.get('tracing', {})
47-
port = json_dct.get('port', 0)
48+
name = json_dct.get("name")
49+
version = json_dct.get("version")
50+
inputs_map = json_dct.get("inputs")
51+
outputs_map = json_dct.get("outputs")
52+
_dapr_triggers = json_dct.get("triggers", {}).get("dapr", [])
53+
http_trigger = json_dct.get("triggers", {}).get("http", None)
54+
states = json_dct.get("states", {})
55+
pre_hooks = json_dct.get("pre_hooks", [])
56+
post_hooks = json_dct.get("post_hooks", [])
57+
tracing = json_dct.get("tracing", {})
58+
port = json_dct.get("port", 0)
4859

4960
inputs = None
5061
if inputs_map:
@@ -67,14 +78,32 @@ def from_json(json_dct):
6778
if http_trigger:
6879
http_trigger = HTTPRoute.from_json(http_trigger)
6980

70-
return FunctionContext(name, version, dapr_triggers, http_trigger,
71-
inputs, outputs, states, pre_hooks, post_hooks, tracing, port)
81+
return FunctionContext(
82+
name,
83+
version,
84+
dapr_triggers,
85+
http_trigger,
86+
inputs,
87+
outputs,
88+
states,
89+
pre_hooks,
90+
post_hooks,
91+
tracing,
92+
port,
93+
)
7294

7395

7496
class Component(object):
7597
"""Components for inputs and outputs."""
7698

77-
def __init__(self, component_name="", component_type="", topic="", metadata=None, operation=""):
99+
def __init__(
100+
self,
101+
component_name="",
102+
component_type="",
103+
topic="",
104+
metadata=None,
105+
operation="",
106+
):
78107
self.topic = topic
79108
self.component_name = component_name
80109
self.component_type = component_type
@@ -91,21 +120,24 @@ def get_type(self):
91120
return ""
92121

93122
def __str__(self):
94-
return "{component_name: %s, component_type: %s, topic: %s, metadata: %s, operation: %s}" % (
95-
self.component_name,
96-
self.component_type,
97-
self.topic,
98-
self.metadata,
99-
self.operation
123+
return (
124+
"{component_name: %s, component_type: %s, topic: %s, metadata: %s, operation: %s}"
125+
% (
126+
self.component_name,
127+
self.component_type,
128+
self.topic,
129+
self.metadata,
130+
self.operation,
131+
)
100132
)
101133

102134
@staticmethod
103135
def from_json(json_dct):
104-
topic = json_dct.get('topic', '')
105-
component_name = json_dct.get('componentName', '')
106-
metadata = json_dct.get('metadata')
107-
component_type = json_dct.get('componentType', '')
108-
operation = json_dct.get('operation', '')
136+
topic = json_dct.get("topic", "")
137+
component_name = json_dct.get("componentName", "")
138+
metadata = json_dct.get("metadata")
139+
component_type = json_dct.get("componentType", "")
140+
operation = json_dct.get("operation", "")
109141
return Component(component_name, component_type, topic, metadata, operation)
110142

111143

@@ -116,18 +148,15 @@ def __init__(self, port=""):
116148
self.port = port
117149

118150
def __str__(self):
119-
return "{port: %s}" % (
120-
self.port
121-
)
151+
return "{port: %s}" % (self.port)
122152

123153
@staticmethod
124154
def from_json(json_dct):
125-
port = json_dct.get('port', '')
155+
port = json_dct.get("port", "")
126156
return HTTPRoute(port)
127157

128158

129159
class DaprTrigger(object):
130-
131160
def __init__(self, name, component_type, topic):
132161
self.name = name
133162
self.component_type = component_type
@@ -137,12 +166,12 @@ def __str__(self):
137166
return "{name: %s, component_type: %s, topic: %s}" % (
138167
self.name,
139168
self.component_type,
140-
self.topic
169+
self.topic,
141170
)
142171

143172
@staticmethod
144173
def from_json(json_dct):
145-
name = json_dct.get('name', '')
146-
component_type = json_dct.get('type', '')
147-
topic = json_dct.get('topic')
174+
name = json_dct.get("name", "")
175+
component_type = json_dct.get("type", "")
176+
topic = json_dct.get("topic")
148177
return DaprTrigger(name, component_type, topic)

src/functions_framework/context/user_context.py

+17-5
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,14 @@
2525
class UserContext(object):
2626
"""Context for user."""
2727

28-
def __init__(self, runtime_context: RuntimeContext = None,
29-
binding_request=None, topic_event=None, http_request=None, logger=None):
28+
def __init__(
29+
self,
30+
runtime_context: RuntimeContext = None,
31+
binding_request=None,
32+
topic_event=None,
33+
http_request=None,
34+
logger=None,
35+
):
3036
self.runtime_context = runtime_context
3137
self.logger = logger
3238
self.out = FunctionOut(0, None, "", {})
@@ -73,11 +79,17 @@ def send(self, output_name, data):
7379

7480
target = outputs[output_name]
7581
if target.component_type.startswith(constants.DAPR_BINDING_TYPE):
76-
resp = self.dapr_client.invoke_binding(target.component_name, target.operation, data, target.metadata)
82+
resp = self.dapr_client.invoke_binding(
83+
target.component_name, target.operation, data, target.metadata
84+
)
7785
elif target.component_type.startswith(constants.DAPR_PUBSUB_TYPE):
7886
data = json.dumps(data)
7987
resp = self.dapr_client.publish_event(
80-
target.component_name, target.topic, data,
81-
data_content_type=constants.DEFAULT_DATA_CONTENT_TYPE, publish_metadata=target.metadata)
88+
target.component_name,
89+
target.topic,
90+
data,
91+
data_content_type=constants.DEFAULT_DATA_CONTENT_TYPE,
92+
publish_metadata=target.metadata,
93+
)
8294

8395
return resp

src/functions_framework/log.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,9 @@ def initialize_logger(name=None, level=logging.DEBUG):
3131
console_handler.setLevel(level)
3232

3333
# create formatter
34-
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
34+
formatter = logging.Formatter(
35+
"%(asctime)s - %(name)s - %(levelname)s - %(message)s"
36+
)
3537

3638
# add formatter to handlers
3739
file_handler.setFormatter(formatter)

src/functions_framework/runner.py

+23-5
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,16 @@
2525

2626

2727
class Runner:
28-
def __init__(self, context: FunctionContext, target=None, source=None,
29-
host=None, port=None, debug=None, dry_run=None):
28+
def __init__(
29+
self,
30+
context: FunctionContext,
31+
target=None,
32+
source=None,
33+
host=None,
34+
port=None,
35+
debug=None,
36+
dry_run=None,
37+
):
3038
self.target = target
3139
self.source = source
3240
self.context = context
@@ -54,7 +62,9 @@ def load_user_function(self):
5462
source_module, spec = _function_registry.load_function_module(_source)
5563
spec.loader.exec_module(source_module)
5664

57-
self.user_function = _function_registry.get_user_function(_source, source_module, _target)
65+
self.user_function = _function_registry.get_user_function(
66+
_source, source_module, _target
67+
)
5868

5969
def init_logger(self):
6070
level = logging.INFO
@@ -68,10 +78,18 @@ def run(self):
6878

6979
_trigger = runtime_context.get_http_trigger()
7080
if _trigger:
71-
http_trigger = HTTPTriggerHandler(self.context.port, _trigger, self.source, self.target, self.user_function)
81+
http_trigger = HTTPTriggerHandler(
82+
self.context.port,
83+
_trigger,
84+
self.source,
85+
self.target,
86+
self.user_function,
87+
)
7288
http_trigger.start(runtime_context, logger=self.logger)
7389

7490
_triggers = runtime_context.get_dapr_triggers()
7591
if _triggers:
76-
dapr_trigger = DaprTriggerHandler(self.context.port, _triggers, self.user_function)
92+
dapr_trigger = DaprTriggerHandler(
93+
self.context.port, _triggers, self.user_function
94+
)
7795
dapr_trigger.start(runtime_context, logger=self.logger)

src/functions_framework/triggers/dapr_trigger/dapr.py

+9-2
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525

2626
class DaprTriggerHandler(TriggerHandler):
2727
"""Handle dapr trigger."""
28+
2829
def __init__(self, port, triggers: [DaprTrigger] = None, user_function=None):
2930
self.port = port
3031
self.triggers = triggers
@@ -39,17 +40,23 @@ def start(self, context: RuntimeContext, logger=None):
3940

4041
for trigger in self.triggers:
4142
if trigger.component_type.startswith("bindings"):
43+
4244
@self.app.binding(trigger.name)
4345
def binding_handler(request: BindingRequest):
4446
rt_ctx = deepcopy(context)
45-
user_ctx = UserContext(runtime_context=rt_ctx, binding_request=request, logger=logger)
47+
user_ctx = UserContext(
48+
runtime_context=rt_ctx, binding_request=request, logger=logger
49+
)
4650
self.user_function(user_ctx)
4751

4852
if trigger.component_type.startswith("pubsub"):
53+
4954
@self.app.subscribe(pubsub_name=trigger.name, topic=trigger.topic)
5055
def topic_handler(event: v1.Event):
5156
rt_ctx = deepcopy(context)
52-
user_ctx = UserContext(runtime_context=rt_ctx, topic_event=event, logger=logger)
57+
user_ctx = UserContext(
58+
runtime_context=rt_ctx, topic_event=event, logger=logger
59+
)
5360
self.user_function(user_ctx)
5461

5562
self.app.run(self.port)

src/functions_framework/triggers/http_trigger/__init__.py

+9-3
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,9 @@ def _http_view_func_wrapper(function, runtime_context: RuntimeContext, request,
8989
@functools.wraps(function)
9090
def view_func(path):
9191
rt_ctx = deepcopy(runtime_context)
92-
user_ctx = UserContext(runtime_context=rt_ctx, http_request=request, logger=logger)
92+
user_ctx = UserContext(
93+
runtime_context=rt_ctx, http_request=request, logger=logger
94+
)
9395
return function(user_ctx)
9496

9597
return view_func
@@ -102,7 +104,9 @@ def _configure_app(wsgi_app, runtime_context: RuntimeContext, function, logger):
102104
wsgi_app.url_map.add(werkzeug.routing.Rule("/robots.txt", endpoint="error"))
103105
wsgi_app.url_map.add(werkzeug.routing.Rule("/favicon.ico", endpoint="error"))
104106
wsgi_app.url_map.add(werkzeug.routing.Rule("/<path:path>", endpoint="run"))
105-
wsgi_app.view_functions["run"] = _http_view_func_wrapper(function, runtime_context, flask.request, logger)
107+
wsgi_app.view_functions["run"] = _http_view_func_wrapper(
108+
function, runtime_context, flask.request, logger
109+
)
106110
wsgi_app.view_functions["error"] = lambda: flask.abort(404, description="Not Found")
107111
wsgi_app.after_request(read_request)
108112

@@ -127,7 +131,9 @@ def crash_handler(e):
127131
return str(e), 500, {_FUNCTION_STATUS_HEADER_FIELD: _CRASH}
128132

129133

130-
def create_app(runtime_context: RuntimeContext = None, target=None, source=None, logger=None):
134+
def create_app(
135+
runtime_context: RuntimeContext = None, target=None, source=None, logger=None
136+
):
131137
_target = _function_registry.get_function_target(target)
132138
_source = _function_registry.get_function_source(source)
133139

src/functions_framework/triggers/http_trigger/_http/__init__.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,4 +40,4 @@ def run(self, host, port):
4040

4141

4242
def create_server(wsgi_app, debug, **options):
43-
return HTTPServer(wsgi_app, debug, **options)
43+
return HTTPServer(wsgi_app, debug, **options)

src/functions_framework/triggers/http_trigger/_http/flask.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,4 @@ def __init__(self, app, host, port, debug, **options):
2222
self.options = options
2323

2424
def run(self):
25-
self.app.run(self.host, self.port, debug=self.debug, **self.options)
25+
self.app.run(self.host, self.port, debug=self.debug, **self.options)

0 commit comments

Comments
 (0)