Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -63,3 +63,5 @@ target/

# vim swap files
.*.sw?
aws_lambda/.DS_Store
.DS_Store
2 changes: 1 addition & 1 deletion README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ With python-lambda and `pytube <https://github.com/nficano/pytube/>`_ both conti
Description
===========

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.
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.

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

Expand Down
2 changes: 1 addition & 1 deletion aws_lambda/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
# flake8: noqa
__author__ = 'Nick Ficano'
__email__ = 'nficano@gmail.com'
__version__ = '3.2.3'
__version__ = '3.2.5'

from .aws_lambda import deploy, deploy_s3, invoke, init, build, upload, cleanup_old_versions

Expand Down
28 changes: 12 additions & 16 deletions aws_lambda/aws_lambda.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,15 @@

import boto3
import botocore
import pip
import yaml
import subprocess

from .helpers import archive
from .helpers import get_environment_variable_value
from .helpers import mkdir
from .helpers import read
from .helpers import timestamp
from .helpers import LambdaContext


ARN_PREFIXES = {
Expand Down Expand Up @@ -228,11 +229,14 @@ def invoke(
# into a function we can execute.
fn = get_callable_handler_function(src, handler)

# TODO: look into mocking the ``context`` variable, currently being passed
# as None.
timeout = cfg.get('timeout')
if timeout:
context = LambdaContext(cfg.get('function_name'),timeout)
else:
context = LambdaContext(cfg.get('function_name'))

start = time.time()
results = fn(event, None)
results = fn(event, context)
end = time.time()

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

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


def pip_install_to_target(path, requirements=None, local_package=None):
Expand All @@ -434,12 +434,8 @@ def pip_install_to_target(path, requirements=None, local_package=None):
packages = []
if not requirements:
print('Gathering pip packages')
pip_major_version = [int(v) for v in pip.__version__.split('.')][0]
if pip_major_version >= 10:
from pip._internal import operations
packages.extend(operations.freeze.freeze())
else:
packages.extend(pip.operations.freeze.freeze())
pkgStr = subprocess.check_call([sys.executable, '-m', 'pip', 'freeze'])
packages.extend(pkgStr.decode('utf-8').splitlines())
else:
if os.path.exists(requirements):
print('Gathering requirement packages')
Expand Down
20 changes: 20 additions & 0 deletions aws_lambda/helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
import datetime as dt
import os
import re
import time
import zipfile


Expand Down Expand Up @@ -41,3 +42,22 @@ def get_environment_variable_value(val):
if match is not None:
env_val = os.environ.get(match.group('environment_key_name'))
return env_val

class LambdaContext:
current_milli_time = lambda x: int(round(time.time() * 1000))

def get_remaining_time_in_millis(self):
return max(0, self.timeout_millis - (self.current_milli_time() - self.start_time_millis))

def __init__(self,function_name, timeoutSeconds = 3):
self.function_name = function_name
self.function_version = None
self.invoked_function_arn = None
self.memory_limit_in_mb = None
self.aws_request_id = None
self.log_group_name = None
self.log_stream_name = None
self.identity = None
self.client_context = None
self.timeout_millis = timeoutSeconds * 1000
self.start_time_millis = self.current_milli_time()
2 changes: 1 addition & 1 deletion setup.cfg
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[bumpversion]
commit = True
tag = True
current_version = 3.2.3
current_version = 3.2.5
parse = (?P<major>\d+)\.(?P<minor>\d+)\.(?P<patch>\d+)(\-(?P<release>[a-z]+))?
serialize =
{major}.{minor}.{patch}
Expand Down
26 changes: 8 additions & 18 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,39 +2,29 @@
# -*- coding: utf-8 -*-
import sys

try: # for pip >= 10
from pip._internal.req import parse_requirements
except ImportError: # for pip <= 9.0.3
from pip.req import parse_requirements

try: # for pip >= 10
from pip._internal import download
except ImportError: # for pip <= 9.0.3
from pip import download

from setuptools import find_packages
from setuptools import setup

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

requirements = parse_requirements(
'requirements.txt', session=download.PipSession(),
)

pip_requirements = [str(r.req) for r in requirements]
requirements = [
'boto3',
'click',
'PyYAML',
]

# Only install futures package if using a Python version <= 2.7
if sys.version_info < (3, 0):
pip_requirements.append('futures')
requirements.append('futures')

test_requirements = [
# TODO: put package test requirements here
]

setup(
name='python-lambda',
version='3.2.3',
version='3.2.5',
description='The bare minimum for a Python app running on Amazon Lambda.',
long_description=readme,
author='Nick Ficano',
Expand All @@ -47,7 +37,7 @@
},
include_package_data=True,
scripts=['scripts/lambda'],
install_requires=pip_requirements,
install_requires=requirements,
license='ISCL',
zip_safe=False,
keywords='python-lambda',
Expand Down
14 changes: 14 additions & 0 deletions tests/unit/test_LambdaContext.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
from aws_lambda.helpers import LambdaContext
import time
import unittest

class TestLambdaContext(unittest.TestCase):

def test_get_remaining_time_in_millis(self):
context = LambdaContext('function_name',2000)
time.sleep(.5)
self.assertTrue(context.get_remaining_time_in_millis() < 2000)


if __name__ == '__main__':
unittest.main()