-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathgen_lambda.py
63 lines (51 loc) · 2.01 KB
/
gen_lambda.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# Copyright (C) 2018 Ben North
#
# This file is part of 'plausibility argument of concept for compiling
# Python into Amazon Step Function state machine JSON'.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import click
import zipfile
import os
import os.path
from contextlib import closing
package_dir = os.path.split(os.path.split(__file__)[0])[0]
template = """\
import sys
sys.path.insert(0, './inner')
import inner.{code_modulename} as inner_module
def dispatch(event, context):
fun = getattr(inner_module, event['call_descr']['function'])
args = [event['locals'][arg_name]
for arg_name in event['call_descr']['arg_names']]
return fun(*args)
"""
def zinfo(fname):
# https://stackoverflow.com/questions/46076543
zi = zipfile.ZipInfo(fname)
zi.external_attr = 0o777 << 16
return zi
@click.command()
@click.argument('code_filename')
@click.argument('zip_filename')
def compile_zipfile(code_filename, zip_filename):
code_basename = os.path.basename(code_filename)
code_modulename = os.path.splitext(code_basename)[0]
handler_content = template.format(code_modulename=code_modulename)
with closing(zipfile.ZipFile(zip_filename, 'x')) as f_zip:
f_zip.writestr(zinfo('handler.py'), handler_content)
f_zip.write(code_filename, 'inner/{}'.format(code_basename))
f_zip.write(os.path.join(package_dir, 'definition.py'), 'pysfn.py')
if __name__ == '__main__':
compile_zipfile()