From 2e8cdfc271be71f540f3234a56b78369b58cb9d2 Mon Sep 17 00:00:00 2001 From: Brian Stocco Date: Fri, 13 Jun 2025 11:21:51 -0400 Subject: [PATCH 1/2] step0: add python dependencies --- api/requirements.txt | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 api/requirements.txt diff --git a/api/requirements.txt b/api/requirements.txt new file mode 100644 index 000000000..53482ff4b --- /dev/null +++ b/api/requirements.txt @@ -0,0 +1,34 @@ +awscli==1.40.5 +awscli-local==0.22.0 +blinker==1.9.0 +boto3==1.38.6 +botocore==1.38.6 +click==8.1.8 +colorama==0.4.6 +coverage==7.9.1 +docutils==0.19 +exceptiongroup==1.3.0 +Flask==3.1.1 +importlib_metadata==8.7.0 +iniconfig==2.1.0 +itsdangerous==2.2.0 +Jinja2==3.1.6 +jmespath==1.0.1 +localstack-client==2.10 +MarkupSafe==3.0.2 +packaging==25.0 +pluggy==1.6.0 +pyasn1==0.6.1 +Pygments==2.19.1 +pytest==8.4.0 +pytest-cov==6.2.1 +python-dateutil==2.9.0.post0 +PyYAML==6.0.2 +rsa==4.7.2 +s3transfer==0.12.0 +six==1.17.0 +tomli==2.2.1 +typing_extensions==4.14.0 +urllib3==1.26.20 +Werkzeug==3.1.3 +zipp==3.23.0 From 19bfaf8145121ead2bdd75282c68e1d083f078a6 Mon Sep 17 00:00:00 2001 From: Brian Stocco Date: Fri, 13 Jun 2025 11:32:12 -0400 Subject: [PATCH 2/2] step1: add calculator backend and tests --- api/app.py | 35 +++++++++++++++++++++++++++++++ api/calculator/__init__.py | 0 api/calculator/calculator.py | 14 +++++++++++++ api/calculator/test_calculator.py | 30 ++++++++++++++++++++++++++ 4 files changed, 79 insertions(+) create mode 100644 api/app.py create mode 100644 api/calculator/__init__.py create mode 100644 api/calculator/calculator.py create mode 100644 api/calculator/test_calculator.py diff --git a/api/app.py b/api/app.py new file mode 100644 index 000000000..046e02650 --- /dev/null +++ b/api/app.py @@ -0,0 +1,35 @@ +from flask import ( + Flask, + request, +) + +from calculator.calculator import Calculator + +app = Flask(__name__) + +@app.route('/api/add', methods=['POST']) +def add(): + return operation('add', 2) + +@app.route('/api/subtract', methods=['POST']) +def subtract(): + return operation('subtract', 2) + +@app.route('/api/multiply', methods=['POST']) +def multiply(): + return operation('multiply', 2) + +@app.route('/api/divide', methods=['POST']) +def divide(): + return operation('divide', 2) + +def operation(method, num_factors): + factors = [] + if num_factors == 2: + factors.append(float(request.json.get('x'))) + factors.append(float(request.json.get('y'))) + + return str(getattr(Calculator, method)(*factors)) + + +app.run(host='0.0.0.0', port=8080) diff --git a/api/calculator/__init__.py b/api/calculator/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/api/calculator/calculator.py b/api/calculator/calculator.py new file mode 100644 index 000000000..ab6c338eb --- /dev/null +++ b/api/calculator/calculator.py @@ -0,0 +1,14 @@ +class Calculator: + def add(x, y): + return x + y + + def subtract(x, y): + return x - y + + def multiply(x, y): + return x * y + + def divide(x, y): + if y == 0: + return 'Cannot divide by 0' + return x * 1.0 / y diff --git a/api/calculator/test_calculator.py b/api/calculator/test_calculator.py new file mode 100644 index 000000000..4164beeda --- /dev/null +++ b/api/calculator/test_calculator.py @@ -0,0 +1,30 @@ +from .calculator import Calculator + + +def test_add(): + assert Calculator.add(1, 2) == 3.0 + assert Calculator.add(1.0, 2.0) == 3.0 + assert Calculator.add(0, 2.0) == 2.0 + assert Calculator.add(2.0, 0) == 2.0 + assert Calculator.add(-4, 2.0) == -2.0 + +def test_subtract(): + assert Calculator.subtract(1, 2) == -1.0 + assert Calculator.subtract(2, 1) == 1.0 + assert Calculator.subtract(1.0, 2.0) == -1.0 + assert Calculator.subtract(0, 2.0) == -2.0 + assert Calculator.subtract(2.0, 0.0) == 2.0 + assert Calculator.subtract(-4, 2.0) == -6.0 + +def test_multiply(): + assert Calculator.multiply(1, 2) == 2.0 + assert Calculator.multiply(1.0, 2.0) == 2.0 + assert Calculator.multiply(0, 2.0) == 0.0 + assert Calculator.multiply(2.0, 0.0) == 0.0 + assert Calculator.multiply(-4, 2.0) == -8.0 + +def test_divide(): + assert Calculator.divide(1, 2) == 0.5 + assert Calculator.divide(1.0, 2.0) == 0.5 + assert Calculator.divide(0, 2.0) == 0 + assert Calculator.divide(-4, 2.0) == -2.0