Skip to content
Open
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
14 changes: 14 additions & 0 deletions circle.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@

import math

class Circle:
def __init__(self, radius):
self.radius = radius

def calculate_perimeter(self):
perimeter = 2 * math.pi * self.radius
return round(perimeter, 2)

def calculate_area(self):
area = math.pi * self.radius**2
return round(area, 2)
41 changes: 34 additions & 7 deletions flask_app.py
Original file line number Diff line number Diff line change
@@ -1,25 +1,23 @@
from flask import Flask, render_template, request
# flask_app.py

from flask import Flask, render_template, request
from circle import Circle # Import Circle from the circle module
from helper import perform_calculation, convert_to_float

app = Flask(__name__) # create the instance of the flask class

app = Flask(__name__)

@app.route('/')
@app.route('/home')
def home():
return render_template('home.html')


@app.route('/calculate', methods=['GET', 'POST']) # associating the GET and POST method with this route
@app.route('/calculate', methods=['GET', 'POST'])
def calculate():
if request.method == 'POST':
# using the request method from flask to request the values that were sent to the server through the POST method
value1 = request.form['value1']
value2 = request.form['value2']
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 ['add', 'subtract', 'divide', 'multiply']:
return render_template('calculator.html',
printed_result='Operation must be one of "add", "subtract", "divide", or "multiply".')
Expand All @@ -38,3 +36,32 @@ def calculate():
return render_template('calculator.html', printed_result="You cannot divide by zero")

return render_template('calculator.html')


@app.route('/calculate_perimeter_area', methods=['GET', 'POST'])
def calculate_perimeter_area():
perimeter_result = None
area_result = None

if request.method == 'POST':
radius = request.form['radius']

try:
radius = convert_to_float(radius)
except ValueError:
return render_template('perimeter_calculator.html', printed_result="Please enter a valid number for the radius.")

if radius <= 0:
return render_template('perimeter_calculator.html', printed_result="Radius must be a positive number.")

circle = Circle(radius)
perimeter_result = circle.calculate_perimeter()
area_result = circle.calculate_area()

print("Perimeter Result:", perimeter_result)
print("Area Result:", area_result)

return render_template('perimeter_calculator.html', perimeter_result=perimeter_result, area_result=area_result)

if __name__ == '__main__':
app.run(debug=True)
5 changes: 4 additions & 1 deletion helper.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# create helper functions for calculations



def perform_calculation(value1: float, value2: float, operation: str) -> float:
Expand Down Expand Up @@ -45,3 +45,6 @@ def convert_to_float(value: str) -> float:
float_value = float(value)

return float_value


# helper.py
1 change: 1 addition & 0 deletions templates/layout.html
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ <h1 class="logo"><a href="{{ url_for('home') }}">Home</a></h1>
<strong><nav>
<ul class="menu">
<li><a href="{{ url_for('calculate') }}">General Calculator</a></li>
<li><a href="{{ url_for('calculate_perimeter_area') }}">Perimeter Calculator</a></li>
</ul>
</nav></strong>
</div>
Expand Down
25 changes: 25 additions & 0 deletions templates/perimeter_calculator.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<!-- perimeter_calculator.html -->

{% extends 'layout.html' %}

{% block content %}
<h1>Perimeter and Area Calculator</h1>

<form method="post" action="{{ url_for('calculate_perimeter_area') }}">
<label for="radius">Enter the radius:</label>
<input type="text" name="radius" required>
<button type="submit">Calculate</button>
</form>

{% if perimeter_result is not none or area_result is not none %}
<div class="result-container">
<h3>Results:</h3>
{% if perimeter_result is not none %}
<p><strong>Perimeter:</strong> {{ perimeter_result }} units</p>
{% endif %}
{% if area_result is not none %}
<p><strong>Area:</strong> {{ area_result }} square units</p>
{% endif %}
</div>
{% endif %}
{% endblock %}
17 changes: 17 additions & 0 deletions test_circle.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# test_circle.py

import math
import pytest
from circle import Circle

def test_calculate_perimeter():
# Test the calculate_perimeter method
circle = Circle(radius=5)
expected_perimeter = 2 * math.pi * 5
assert circle.calculate_perimeter() == round(expected_perimeter, 2)

def test_calculate_area():
# Test the calculate_area method
circle = Circle(radius=5)
expected_area = math.pi * 5**2
assert circle.calculate_area() == round(expected_area, 2)