Skip to content

Commit c6aae27

Browse files
Merge pull request #35 from random-element/direct_calls
Support for direct calls to execute lambda functions and return their output (for py.tests)
2 parents ebb6357 + 45ffcdc commit c6aae27

File tree

4 files changed

+83
-7
lines changed

4 files changed

+83
-7
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,3 +58,6 @@ target/
5858

5959
# Python environment
6060
.python-version
61+
62+
# Vitual Environments
63+
venv/

lambda_local/environment_variables.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@
22
import os
33

44

5+
def export_variables(environment_variables):
6+
for env_name, env_value in environment_variables.items():
7+
os.environ[str(env_name)] = str(env_value)
8+
9+
510
def set_environment_variables(json_file_path):
611
"""
712
Read and set environment variables from a flat json file.
@@ -25,5 +30,4 @@ def set_environment_variables(json_file_path):
2530
with open(json_file_path) as json_file:
2631
env_vars = json.loads(json_file.read())
2732

28-
for env_name, env_value in env_vars.items():
29-
os.environ[str(env_name)] = str(env_value)
33+
export_variables(env_vars)

lambda_local/main.py

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

1616
from . import event
1717
from . import context
18-
from .environment_variables import set_environment_variables
18+
from .environment_variables import set_environment_variables, export_variables
1919
from .timeout import time_limit
2020
from .timeout import TimeoutException
2121

@@ -31,6 +31,17 @@
3131
EXITCODE_ERR = 1
3232

3333

34+
def call(func, event, timeout, environment_variables={}, arn_string="", version_name="", library=None):
35+
export_variables(environment_variables)
36+
e = json.loads(event)
37+
c = context.Context(timeout, arn_string, version_name)
38+
if library is not None:
39+
load_lib(library)
40+
request_id = uuid.uuid4()
41+
42+
return _runner(request_id, e, c, func)
43+
44+
3445
def run(args):
3546
# set env vars if path to json file was given
3647
set_environment_variables(args.environment_variables)
@@ -41,16 +52,23 @@ def run(args):
4152
load_lib(args.library)
4253
request_id = uuid.uuid4()
4354
func = load(request_id, args.file, args.function)
55+
56+
(result, err_type) = _runner(request_id, e, c, func)
57+
58+
if err_type is not None:
59+
sys.exit(EXITCODE_ERR)
60+
4461

62+
def _runner(request_id, event, context, func):
4563
logger = logging.getLogger()
4664
result = None
4765

48-
logger.info("Event: {}".format(e))
66+
logger.info("Event: {}".format(event))
4967

5068
logger.info("START RequestId: {}".format(request_id))
5169

5270
start_time = timeit.default_timer()
53-
result, err_type = execute(func, e, c)
71+
result, err_type = execute(func, event, context)
5472
end_time = timeit.default_timer()
5573

5674
logger.info("END RequestId: {}".format(request_id))
@@ -64,8 +82,7 @@ def run(args):
6482
logger.info("REPORT RequestId: {}\tDuration: {}".format(
6583
request_id, duration))
6684

67-
if err_type is not None:
68-
sys.exit(EXITCODE_ERR)
85+
return (result, err_type)
6986

7087

7188
def load_lib(path):

tests/test_direct_invocations.py

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
'''
2+
python-lambda-local: Test Direct Inovactions
3+
(command-line and direct).
4+
5+
Meant for use with py.test.
6+
7+
Copyright 2015 HDE, Inc.
8+
Licensed under MIT
9+
'''
10+
import json
11+
import argparse
12+
from multiprocessing import Process
13+
import os
14+
from lambda_local.main import run as lambda_run
15+
from lambda_local.main import call as lambda_call
16+
17+
18+
def my_lambda_function(event, context):
19+
print("Hello World from My Lambda Function!")
20+
return 42
21+
22+
def test_function_call_for_pytest():
23+
request = json.dumps({})
24+
(result, error_type) = lambda_call(func=my_lambda_function, event=request, timeout=1)
25+
26+
assert error_type is None
27+
28+
assert result == 42
29+
30+
31+
def test_check_command_line():
32+
request = json.dumps({})
33+
request_file = 'check_command_line_event.json'
34+
with open (request_file, "w") as f:
35+
f.write(request)
36+
37+
args = argparse.Namespace(event=request_file,
38+
file='tests/test_direct_invocations.py',
39+
function='my_lambda_function',
40+
timeout=1,
41+
environment_variables='',
42+
library=None,
43+
version_name='',
44+
arn_string=''
45+
)
46+
p = Process(target=lambda_run, args=(args,))
47+
p.start()
48+
p.join()
49+
50+
os.remove(request_file)
51+
assert p.exitcode == 0
52+

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy