diff --git a/README.md b/README.md index 39b34b4..26c2b2c 100644 --- a/README.md +++ b/README.md @@ -21,14 +21,14 @@ $ pip install python-lambda-local This will install the package with name `python-lambda-local` in the virtualenv. Now you can use the command `python-lambda-local` to run your AWS Lambda function written in Python on your own machine. -## Usage +## Usage as a shell command Run `python-lambda-local -h` to see the help. ``` usage: python-lambda-local [-h] [-l LIBRARY_PATH] [-f HANDLER_FUNCTION] [-t TIMEOUT] [-a ARN_STRING] [-v VERSION_NAME] - [--version] + [-e ENVIRONMENT_VARIABLES] [--version] FILE EVENT Run AWS Lambda function written in Python on local machine. @@ -118,16 +118,50 @@ python-lambda-local -l lib/ -f handler -t 5 test.py event.json The output will be like: ``` -[root - INFO - 2017-04-19 12:39:05,512] Event: {u'answer': 42} -[root - INFO - 2017-04-19 12:39:05,512] START RequestId: b918f9ae-0ca1-44af-9937-dd5f9eeedcc1 +[root - INFO - 2018-11-20 17:10:53,352] Event: {'answer': 42} +[root - INFO - 2018-11-20 17:10:53,352] START RequestId: 3c8e6db4-886a-43da-a1c7-5e6f715de531 Version: 0 49 196 441 784 1225 -[root - INFO - 2017-04-19 12:39:05,515] END RequestId: b918f9ae-0ca1-44af-9937-dd5f9eeedcc1 -[root - INFO - 2017-04-19 12:39:05,515] RESULT: +[root - INFO - 2018-11-20 17:10:53,359] END RequestId: 3c8e6db4-886a-43da-a1c7-5e6f715de531 +[root - INFO - 2018-11-20 17:10:53,360] REPORT RequestId: 3c8e6db4-886a-43da-a1c7-5e6f715de531 Duration: 2.17 ms +[root - INFO - 2018-11-20 17:10:53,360] RESULT: None -[root - INFO - 2017-04-19 12:39:05,515] REPORT RequestId: b918f9ae-0ca1-44af-9937-dd5f9eeedcc1 Duration: 2.27 ms +``` + +## Usage as a library + +### API signature + +``` python +call(func, event, context, environment_variables={}) +``` + +Call a handler function `func` with given `event`, `context` and custom `environment_variables`. + +### Sample + +1. Make sure the 3rd party libraries used in the AWS Lambda function can be imported. + +``` bash +pip install rx +``` + +2. To call the lambda function above with your python code: + +``` python +from lambda_local.main import call +from lambda_local.context import Context + +import test + +event = { + "answer": 42 +} +context = Context(5) + +call(test.handler, event, context) ``` diff --git a/README.rst b/README.rst index c85b854..b77f67e 100644 --- a/README.rst +++ b/README.rst @@ -18,43 +18,45 @@ Within virtualenv, run the following command. .. code:: bash - $ pip install python-lambda-local + $ pip install python-lambda-local This will install the package with name ``python-lambda-local`` in the virtualenv. Now you can use the command ``python-lambda-local`` to run your AWS Lambda function written in Python on your own machine. -Usage ------ +Usage as a shell command +------------------------ Run ``python-lambda-local -h`` to see the help. :: - usage: python-lambda-local [-h] [-l LIBRARY_PATH] [-f HANDLER_FUNCTION] - [-t TIMEOUT] [-a ARN_STRING] [-v VERSION_NAME] - [--version] - FILE EVENT - - Run AWS Lambda function written in Python on local machine. - - positional arguments: - FILE lambda function file name - EVENT event data file name - - optional arguments: - -h, --help show this help message and exit - -l LIBRARY_PATH, --library LIBRARY_PATH - path of 3rd party libraries - -f HANDLER_FUNCTION, --function HANDLER_FUNCTION - lambda function handler name, default: "handler" - -t TIMEOUT, --timeout TIMEOUT - seconds until lambda function timeout, default: 3 - -a ARN_STRING, --arn-string ARN_STRING - ARN string for lambda function - -v VERSION_NAME, --version-name VERSION_NAME - lambda function version name - --version print the version of python-lambda-local and exit + usage: python-lambda-local [-h] [-l LIBRARY_PATH] [-f HANDLER_FUNCTION] + [-t TIMEOUT] [-a ARN_STRING] [-v VERSION_NAME] + [-e ENVIRONMENT_VARIABLES] [--version] + FILE EVENT + + Run AWS Lambda function written in Python on local machine. + + positional arguments: + FILE lambda function file name + EVENT event data file name + + optional arguments: + -h, --help show this help message and exit + -l LIBRARY_PATH, --library LIBRARY_PATH + path of 3rd party libraries + -f HANDLER_FUNCTION, --function HANDLER_FUNCTION + lambda function handler name, default: "handler" + -t TIMEOUT, --timeout TIMEOUT + seconds until lambda function timeout, default: 3 + -a ARN_STRING, --arn-string ARN_STRING + ARN string for lambda function + -v VERSION_NAME, --version-name VERSION_NAME + lambda function version name + -e ENVIRONMENT_VARIABLES, --environment-variables ENVIRONMENT_VARIABLES + path to flat json file with environment variables + --version print the version of python-lambda-local and exit Prepare development directory ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -66,25 +68,25 @@ Suppose your project directory is like this: :: - ├── event.json - ├── lib - │   ├── rx - │   │   ├── abstractobserver.py - │   │   ├── ... (package content of rx) - ... - │   │   └── testscheduler.py - │   └── Rx-1.2.3.dist-info - │   ├── DESCRIPTION.rst - │   ├── METADATA - │   ├── metadata.json - │   ├── pbr.json - │   ├── RECORD - │   ├── top_level.txt - │   ├── WHEEL - │   └── zip-safe - └── test.py - -The handler's code is in ``test.py`` and the function name of the + ├── event.json + ├── lib + │   ├── rx + │   │   ├── abstractobserver.py + │   │   ├── ... (package content of rx) + ... + │   │   └── testscheduler.py + │   └── Rx-1.2.3.dist-info + │   ├── DESCRIPTION.rst + │   ├── METADATA + │   ├── metadata.json + │   ├── pbr.json + │   ├── RECORD + │   ├── top_level.txt + │   ├── WHEEL + │   └── zip-safe + └── test.py + +The handler’s code is in ``test.py`` and the function name of the handler is ``handler``. The source depends on 3rd party library ``rx`` and it is installed in the directory ``lib``. The test event in json format is in ``event.json`` file. @@ -94,25 +96,25 @@ Content of ``test.py``: .. code:: python - from __future__ import print_function - from rx import Observable + from __future__ import print_function + from rx import Observable - def handler(event, context): - xs = Observable.from_(range(event['answer'])) - ys = xs.to_blocking() - zs = (x*x for x in ys if x % 7 == 0) - for x in zs: - print(x) + def handler(event, context): + xs = Observable.from_(range(event['answer'])) + ys = xs.to_blocking() + zs = (x*x for x in ys if x % 7 == 0) + for x in zs: + print(x) Content of ``event.json``: ^^^^^^^^^^^^^^^^^^^^^^^^^^ .. code:: json - { - "answer": 42 - } + { + "answer": 42 + } Run the lambda function ^^^^^^^^^^^^^^^^^^^^^^^ @@ -122,24 +124,63 @@ the following command :: - python-lambda-local -l lib/ -f handler -t 5 test.py event.json + python-lambda-local -l lib/ -f handler -t 5 test.py event.json The output will be like: :: - [root - INFO - 2017-04-19 12:39:05,512] Event: {u'answer': 42} - [root - INFO - 2017-04-19 12:39:05,512] START RequestId: b918f9ae-0ca1-44af-9937-dd5f9eeedcc1 - 0 - 49 - 196 - 441 - 784 - 1225 - [root - INFO - 2017-04-19 12:39:05,515] END RequestId: b918f9ae-0ca1-44af-9937-dd5f9eeedcc1 - [root - INFO - 2017-04-19 12:39:05,515] RESULT: - None - [root - INFO - 2017-04-19 12:39:05,515] REPORT RequestId: b918f9ae-0ca1-44af-9937-dd5f9eeedcc1 Duration: 2.27 ms + [root - INFO - 2018-11-20 17:10:53,352] Event: {'answer': 42} + [root - INFO - 2018-11-20 17:10:53,352] START RequestId: 3c8e6db4-886a-43da-a1c7-5e6f715de531 Version: + 0 + 49 + 196 + 441 + 784 + 1225 + [root - INFO - 2018-11-20 17:10:53,359] END RequestId: 3c8e6db4-886a-43da-a1c7-5e6f715de531 + [root - INFO - 2018-11-20 17:10:53,360] REPORT RequestId: 3c8e6db4-886a-43da-a1c7-5e6f715de531 Duration: 2.17 ms + [root - INFO - 2018-11-20 17:10:53,360] RESULT: + None + +Usage as a library +------------------ + +API signature +~~~~~~~~~~~~~ + +.. code:: python + + call(func, event, context, environment_variables={}) + +Call a handler function ``func`` with given ``event``, ``context`` and +custom ``environment_variables``. + +Sample +~~~~~~ + +1. Make sure the 3rd party libraries used in the AWS Lambda function can + be imported. + +.. code:: bash + + pip install rx + +2. To call the lambda function above with your python code: + +.. code:: python + + from lambda_local.main import call + from lambda_local.context import Context + + import test + + event = { + "answer": 42 + } + context = Context(5) + + call(test.handler, event, context) .. |Join the chat at https://gitter.im/HDE/python-lambda-local| image:: https://badges.gitter.im/Join%20Chat.svg :target: https://gitter.im/HDE/python-lambda-local?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge diff --git a/lambda_local/__init__.py b/lambda_local/__init__.py index 1c4381b..45b457b 100644 --- a/lambda_local/__init__.py +++ b/lambda_local/__init__.py @@ -7,13 +7,10 @@ from __future__ import print_function import argparse -import sys -from multiprocessing import Process import pkg_resources from .main import run - __version__ = pkg_resources.require("python-lambda-local")[0].version