From d5dd10813437621a0c2fd755d851d8b41722a725 Mon Sep 17 00:00:00 2001 From: varvarailyina Date: Tue, 12 Mar 2024 12:31:00 +0100 Subject: [PATCH 1/3] complete question 1 by creating a circle calculator --- .DS_Store | Bin 0 -> 6148 bytes circle.py | 15 +++++++++++++++ flask_app.py | 36 +++++++++++++++++++++++++++++++++--- helper.py | 3 +-- static/calculator.jpeg | Bin 0 -> 20290 bytes static/circle_calc.jpeg | Bin 0 -> 11550 bytes static/main.css | 10 +++++----- templates/calculator.html | 10 +++++++++- templates/circle.html | 28 ++++++++++++++++++++++++++++ templates/home.html | 22 +++++++++++++++++++++- templates/layout.html | 5 +++++ test_circle.py | 28 ++++++++++++++++++++++++++++ 12 files changed, 145 insertions(+), 12 deletions(-) create mode 100644 .DS_Store create mode 100644 circle.py create mode 100644 static/calculator.jpeg create mode 100644 static/circle_calc.jpeg create mode 100644 templates/circle.html create mode 100644 test_circle.py diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..d15f3cf474ccf9efb724636b7cdc46442e6fe958 GIT binary patch literal 6148 zcmeHKJ5EC}5S)bw1<|CW^cA>)6@?RU0U!wyQc#c{^snMv9F5rzMR?FeqKRgu_1Nnj zTb|Dcq`~7Z`{d>T<7Z~t{2l@~G zB|}@h;1#>r-eUMZp7+V5fE17dQa}nwfg=>C8alr^f-8y?kOHTzfPWtv-LV&riSg;+ z5G??4#&8(t(Mu4U2Z+6JOk{*+NhK!Ls>QIRGu|q%7mkTZhsDi2r*5|DP%Lg|yhS>! zCu)=eQs7X5^IR^x{@>F7=>HE%T1f#Za8e4`Y<0I<@<~-&Cy(=5+vxXn&-tXgaUK*7 mQI3gGj=Au1d>u)d*L=?XUN|NOo$;U(^)ukQ$fUr3EARzx_8g}G literal 0 HcmV?d00001 diff --git a/circle.py b/circle.py new file mode 100644 index 0000000..c97e181 --- /dev/null +++ b/circle.py @@ -0,0 +1,15 @@ +## create functions for circle calculations + +# import package +import math + +# define class for circle calculations +class Circle: + def __init__(self, radius): + self.radius = radius + + def area(self): + return math.pi * self.radius**2 + + def perimeter(self): + return 2 * math.pi * self.radius diff --git a/flask_app.py b/flask_app.py index 8897fa2..6fc27a9 100644 --- a/flask_app.py +++ b/flask_app.py @@ -1,5 +1,5 @@ from flask import Flask, render_template, request - +from test_circle import circle_calc from helper import perform_calculation, convert_to_float app = Flask(__name__) # create the instance of the flask class @@ -28,13 +28,43 @@ def calculate(): value1 = convert_to_float(value=value1) value2 = convert_to_float(value=value2) except ValueError: - return render_template('calculator.html', printed_result="Cannot perform operation with this input") + return render_template('calculator.html', printed_result="Cannot perform operation with this input.") try: result = perform_calculation(value1=value1, value2=value2, operation=operation) return render_template('calculator.html', printed_result=str(result)) except ZeroDivisionError: - return render_template('calculator.html', printed_result="You cannot divide by zero") + return render_template('calculator.html', printed_result="You cannot divide by zero.") return render_template('calculator.html') + + +@app.route('/circle', methods=['GET', 'POST']) # associating the GET and POST method with this route +def circle(): + if request.method == 'POST': + # use request method from flask + radius = request.form['radius'] + operation = str(request.form['operation']) + + # make sure the input is one of the allowed inputs (not absolutely necessary in the drop-down case) + if operation not in ['area', 'perimeter']: + return render_template('circle.html', + printed_result='Operation must be either "Area" or "Perimeter".') + + # run functions + try: + radius = convert_to_float(value=radius) + except ValueError: + return render_template('circle.html', printed_result="Cannot perform operation with this input.") + + try: + result = circle_calc(radius=radius, operation=operation) + return render_template('circle.html', printed_result=str(result)) + except Exception: + return render_template('circle.html', printed_result=str("An error occurred.")) + + + return render_template('circle.html') + + diff --git a/helper.py b/helper.py index 31e82d6..5b5f982 100644 --- a/helper.py +++ b/helper.py @@ -1,5 +1,4 @@ -# create helper functions for calculations - +# create helper functions for general calculations def perform_calculation(value1: float, value2: float, operation: str) -> float: """ diff --git a/static/calculator.jpeg b/static/calculator.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..4f5f59eede7f5bbcb18e9e3cdb2e2adac8b6dad4 GIT binary patch literal 20290 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 literal 0 HcmV?d00001 diff --git a/static/circle_calc.jpeg b/static/circle_calc.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..5db8242e1159f56681f603a4b07166b47fa79ced GIT binary patch literal 11550 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 +

General Calculator

+
+

Let's crunch some numbers!

+
    +
  1. Enter two values
  2. +
  3. Select an operator you want to use for your calculation
  4. +
  5. Get your result!
  6. +
+
diff --git a/templates/circle.html b/templates/circle.html new file mode 100644 index 0000000..fc0bbef --- /dev/null +++ b/templates/circle.html @@ -0,0 +1,28 @@ +{% extends 'layout.html' %} +{% block content %} +

Circle calculator

+
+

Let's find your circle's area or perimeter!

+
    +
  1. Enter a radius
  2. +
  3. Select an option you want to calculate
  4. +
  5. Get your result!
  6. +
+
+ + + + + + + +
+ +
+ + {{ printed_result }} + +{% endblock %} diff --git a/templates/home.html b/templates/home.html index 6516181..4b25f1d 100644 --- a/templates/home.html +++ b/templates/home.html @@ -1,5 +1,25 @@ {% extends 'layout.html' %} {% block content %}

Welcome!

-

Use the navigation bar, to find the calculator you need.

+

This page was created to help you with your calculations.

+

Use the navigation bar above or the buttons below to find the calculator you need.

+
+
+
+ + +
+
+ + +
+
{% endblock %} \ No newline at end of file diff --git a/templates/layout.html b/templates/layout.html index 8de2e62..b9b6f4a 100644 --- a/templates/layout.html +++ b/templates/layout.html @@ -14,6 +14,11 @@

Home

  • General Calculator
  • +
    diff --git a/test_circle.py b/test_circle.py new file mode 100644 index 0000000..7509981 --- /dev/null +++ b/test_circle.py @@ -0,0 +1,28 @@ +## create helper functions for circle calculations + +# import Circle class from circle.py +from circle import Circle + +def circle_calc(radius: float, operation: str) -> float: + """ + Perform a mathematical operation on two values. + + Parameters: + radius (float): The radius. + operation (str): The operation to perform. Can be 'area' or 'perimeter'. + + Returns: + float: The result of the operation. + """ + + # create Circle object with given radius + my_circle = Circle(radius) + + # check operation and call the appropriate method + if operation == 'area': + result = my_circle.area() + else: + result = my_circle.perimeter() + + # return result + return result From 94746b3d45e0aff492b661dc03d0a0ce61cf8ac3 Mon Sep 17 00:00:00 2001 From: varvarailyina Date: Tue, 12 Mar 2024 18:31:43 +0100 Subject: [PATCH 2/3] Make sure radius input is positive --- circle.py | 10 ++++++---- flask_app.py | 10 ++++++++-- test_circle.py | 8 ++++---- 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/circle.py b/circle.py index c97e181..5d3bea6 100644 --- a/circle.py +++ b/circle.py @@ -1,15 +1,17 @@ ## create functions for circle calculations # import package -import math +from math import pi # define class for circle calculations -class Circle: +class circle_class: def __init__(self, radius): self.radius = radius def area(self): - return math.pi * self.radius**2 + result = pi * self.radius**2 + return f"This circle's area is: {round(result, 4)}" def perimeter(self): - return 2 * math.pi * self.radius + result = 2 * pi * self.radius + return f"This circle's perimeter is: {round(result, 4)}" diff --git a/flask_app.py b/flask_app.py index 6fc27a9..5b3f808 100644 --- a/flask_app.py +++ b/flask_app.py @@ -52,19 +52,25 @@ def circle(): return render_template('circle.html', printed_result='Operation must be either "Area" or "Perimeter".') - # run functions + # convert to float try: radius = convert_to_float(value=radius) except ValueError: return render_template('circle.html', printed_result="Cannot perform operation with this input.") + + # make sure the radius is positive + if radius < 0: + return render_template('circle.html', + printed_result='Radius cannot be negative.') + + # run circle function try: result = circle_calc(radius=radius, operation=operation) return render_template('circle.html', printed_result=str(result)) except Exception: return render_template('circle.html', printed_result=str("An error occurred.")) - return render_template('circle.html') diff --git a/test_circle.py b/test_circle.py index 7509981..dda5326 100644 --- a/test_circle.py +++ b/test_circle.py @@ -1,7 +1,7 @@ ## create helper functions for circle calculations -# import Circle class from circle.py -from circle import Circle +# import circle class from circle.py +from circle import circle_class def circle_calc(radius: float, operation: str) -> float: """ @@ -15,8 +15,8 @@ def circle_calc(radius: float, operation: str) -> float: float: The result of the operation. """ - # create Circle object with given radius - my_circle = Circle(radius) + # create object of circle class with given radius + my_circle = circle_class(radius) # check operation and call the appropriate method if operation == 'area': From e70a2fb1a63dc9fe1efab87935d081a18def5e02 Mon Sep 17 00:00:00 2001 From: varvarailyina Date: Wed, 13 Mar 2024 17:57:35 +0100 Subject: [PATCH 3/3] final changes to flask_app --- circle.py | 4 ++-- flask_app.py | 7 ++++--- test_circle.py | 36 ++++++++++++++---------------------- 3 files changed, 20 insertions(+), 27 deletions(-) diff --git a/circle.py b/circle.py index 5d3bea6..721ee6f 100644 --- a/circle.py +++ b/circle.py @@ -4,7 +4,7 @@ from math import pi # define class for circle calculations -class circle_class: +class Circle: def __init__(self, radius): self.radius = radius @@ -14,4 +14,4 @@ def area(self): def perimeter(self): result = 2 * pi * self.radius - return f"This circle's perimeter is: {round(result, 4)}" + return f"This circle's perimeter is: {round(result, 4)}" \ No newline at end of file diff --git a/flask_app.py b/flask_app.py index 5b3f808..f02b0be 100644 --- a/flask_app.py +++ b/flask_app.py @@ -1,10 +1,11 @@ +## structure and run flask app + from flask import Flask, render_template, request -from test_circle import circle_calc +from circle import Circle from helper import perform_calculation, convert_to_float app = Flask(__name__) # create the instance of the flask class - @app.route('/') @app.route('/home') def home(): @@ -66,7 +67,7 @@ def circle(): # run circle function try: - result = circle_calc(radius=radius, operation=operation) + result = Circle(radius=radius, operation=operation) return render_template('circle.html', printed_result=str(result)) except Exception: return render_template('circle.html', printed_result=str("An error occurred.")) diff --git a/test_circle.py b/test_circle.py index dda5326..269d6f3 100644 --- a/test_circle.py +++ b/test_circle.py @@ -1,28 +1,20 @@ ## create helper functions for circle calculations # import circle class from circle.py -from circle import circle_class +from circle import Circle +from math import pi -def circle_calc(radius: float, operation: str) -> float: - """ - Perform a mathematical operation on two values. +# test area function +def test_area(): + circle = calc_circles(radius = 1) + expected_res = f"This circle's area is: {round(pi * 1 ** 2, 4)}" + actual_res = circle.area("area") + assert actual_res == expected_res - Parameters: - radius (float): The radius. - operation (str): The operation to perform. Can be 'area' or 'perimeter'. - Returns: - float: The result of the operation. - """ - - # create object of circle class with given radius - my_circle = circle_class(radius) - - # check operation and call the appropriate method - if operation == 'area': - result = my_circle.area() - else: - result = my_circle.perimeter() - - # return result - return result +# test area function +def test_perimeter(): + circle = calc_circles(radius = 1) + expected_res = f"This circle's perimeter is: {round(result, 4)}" + actual_res = circle.perimeter("perimeter") + assert actual_res == expected_res