Skip to content

Commit 6dc00f3

Browse files
authored
Merge pull request nficano#127 from soapergem/master
combined changes from simon-weber and kmbenitez; will fix nficano#126
2 parents 74d31b4 + 53d1eb1 commit 6dc00f3

File tree

6 files changed

+56
-34
lines changed

6 files changed

+56
-34
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,3 +63,5 @@ target/
6363

6464
# vim swap files
6565
.*.sw?
66+
aws_lambda/.DS_Store
67+
.DS_Store

README.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ With python-lambda and `pytube <https://github.com/nficano/pytube/>`_ both conti
1919
Description
2020
===========
2121

22-
AWS Lambda is a service that allows you to write Python, Java, Node.js, C# or Go code that gets executed in response to events like http requests or files uploaded to S3.
22+
AWS Lambda is a service that allows you to write Python, Java, or Node.js code that gets executed in response to events like http requests or files uploaded to S3.
2323

2424
Working with Lambda is relatively easy, but the process of bundling and deploying your code is not as simple as it could be.
2525

aws_lambda/aws_lambda.py

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,15 @@
1616

1717
import boto3
1818
import botocore
19-
import pip
2019
import yaml
20+
import subprocess
2121

2222
from .helpers import archive
2323
from .helpers import get_environment_variable_value
2424
from .helpers import mkdir
2525
from .helpers import read
2626
from .helpers import timestamp
27+
from .helpers import LambdaContext
2728

2829

2930
ARN_PREFIXES = {
@@ -228,11 +229,14 @@ def invoke(
228229
# into a function we can execute.
229230
fn = get_callable_handler_function(src, handler)
230231

231-
# TODO: look into mocking the ``context`` variable, currently being passed
232-
# as None.
232+
timeout = cfg.get('timeout')
233+
if timeout:
234+
context = LambdaContext(cfg.get('function_name'),timeout)
235+
else:
236+
context = LambdaContext(cfg.get('function_name'))
233237

234238
start = time.time()
235-
results = fn(event, None)
239+
results = fn(event, context)
236240
end = time.time()
237241

238242
print('{0}'.format(results))
@@ -409,12 +413,8 @@ def _filter_blacklist(package):
409413
package = package.replace('-e ', '')
410414

411415
print('Installing {package}'.format(package=package))
412-
pip_major_version = [int(v) for v in pip.__version__.split('.')][0]
413-
if pip_major_version >= 10:
414-
from pip._internal import main
415-
main(['install', package, '-t', path, '--ignore-installed'])
416-
else:
417-
pip.main(['install', package, '-t', path, '--ignore-installed'])
416+
subprocess.check_call([sys.executable, '-m', 'pip', 'install', package, '-t', path, '--ignore-installed'])
417+
print ('Install directory contents are now: {directory}'.format(directory=os.listdir(path)))
418418

419419

420420
def pip_install_to_target(path, requirements=None, local_package=None):
@@ -434,12 +434,8 @@ def pip_install_to_target(path, requirements=None, local_package=None):
434434
packages = []
435435
if not requirements:
436436
print('Gathering pip packages')
437-
pip_major_version = [int(v) for v in pip.__version__.split('.')][0]
438-
if pip_major_version >= 10:
439-
from pip._internal import operations
440-
packages.extend(operations.freeze.freeze())
441-
else:
442-
packages.extend(pip.operations.freeze.freeze())
437+
pkgStr = subprocess.check_call([sys.executable, '-m', 'pip', 'freeze'])
438+
packages.extend(pkgStr.decode('utf-8').splitlines())
443439
else:
444440
if os.path.exists(requirements):
445441
print('Gathering requirement packages')

aws_lambda/helpers.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import datetime as dt
33
import os
44
import re
5+
import time
56
import zipfile
67

78

@@ -41,3 +42,22 @@ def get_environment_variable_value(val):
4142
if match is not None:
4243
env_val = os.environ.get(match.group('environment_key_name'))
4344
return env_val
45+
46+
class LambdaContext:
47+
current_milli_time = lambda x: int(round(time.time() * 1000))
48+
49+
def get_remaining_time_in_millis(self):
50+
return max(0, self.timeout_millis - (self.current_milli_time() - self.start_time_millis))
51+
52+
def __init__(self,function_name, timeoutSeconds = 3):
53+
self.function_name = function_name
54+
self.function_version = None
55+
self.invoked_function_arn = None
56+
self.memory_limit_in_mb = None
57+
self.aws_request_id = None
58+
self.log_group_name = None
59+
self.log_stream_name = None
60+
self.identity = None
61+
self.client_context = None
62+
self.timeout_millis = timeoutSeconds * 1000
63+
self.start_time_millis = self.current_milli_time()

setup.py

Lines changed: 7 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,31 +2,21 @@
22
# -*- coding: utf-8 -*-
33
import sys
44

5-
try: # for pip >= 10
6-
from pip._internal.req import parse_requirements
7-
except ImportError: # for pip <= 9.0.3
8-
from pip.req import parse_requirements
9-
10-
try: # for pip >= 10
11-
from pip._internal import download
12-
except ImportError: # for pip <= 9.0.3
13-
from pip import download
14-
155
from setuptools import find_packages
166
from setuptools import setup
177

188
with open('README.rst') as readme_file:
199
readme = readme_file.read()
2010

21-
requirements = parse_requirements(
22-
'requirements.txt', session=download.PipSession(),
23-
)
24-
25-
pip_requirements = [str(r.req) for r in requirements]
11+
requirements = [
12+
'boto3',
13+
'click',
14+
'PyYAML',
15+
]
2616

2717
# Only install futures package if using a Python version <= 2.7
2818
if sys.version_info < (3, 0):
29-
pip_requirements.append('futures')
19+
requirements.append('futures')
3020

3121
test_requirements = [
3222
# TODO: put package test requirements here
@@ -47,7 +37,7 @@
4737
},
4838
include_package_data=True,
4939
scripts=['scripts/lambda'],
50-
install_requires=pip_requirements,
40+
install_requires=requirements,
5141
license='ISCL',
5242
zip_safe=False,
5343
keywords='python-lambda',

tests/unit/test_LambdaContext.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
from aws_lambda.helpers import LambdaContext
2+
import time
3+
import unittest
4+
5+
class TestLambdaContext(unittest.TestCase):
6+
7+
def test_get_remaining_time_in_millis(self):
8+
context = LambdaContext('function_name',2000)
9+
time.sleep(.5)
10+
self.assertTrue(context.get_remaining_time_in_millis() < 2000)
11+
12+
13+
if __name__ == '__main__':
14+
unittest.main()

0 commit comments

Comments
 (0)