From 67cc5dfae09a2faf2076d36bab5926aaaa7bed61 Mon Sep 17 00:00:00 2001 From: Karina Date: Mon, 18 Oct 2021 13:18:14 -0700 Subject: [PATCH 01/23] created blueprint and registered in init file --- app/__init__.py | 3 +++ app/routes.py | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/app/__init__.py b/app/__init__.py index 70b4cabfe..ab9eee40e 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -4,4 +4,7 @@ def create_app(test_config=None): app = Flask(__name__) + from .routes import planets_bp + app.register_blueprint(planets_bp) + return app diff --git a/app/routes.py b/app/routes.py index 8e9dfe684..0d051d1c1 100644 --- a/app/routes.py +++ b/app/routes.py @@ -1,2 +1,3 @@ -from flask import Blueprint +from flask import Blueprint, jsonify +planets_bp = Blueprint("planets_bp", __name__,url_prefix="/planets") From 97a70245fb3728183c2b50247dd6e75f34496c9f Mon Sep 17 00:00:00 2001 From: Roslyn Melookaran Date: Mon, 18 Oct 2021 13:30:00 -0700 Subject: [PATCH 02/23] Added Planet class and list of planet instances --- app/routes.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/app/routes.py b/app/routes.py index 0d051d1c1..f59dd0f3a 100644 --- a/app/routes.py +++ b/app/routes.py @@ -1,3 +1,21 @@ from flask import Blueprint, jsonify +class Planet: + def __init__(self, id, title, description, moon): + self.id = id + self.title = title + self.description = description + self.moon = moon + +planets= [ + Planet(1, "Mercury", "Diameter: 3,031 miles (4,878 km)", False), + Planet(2, "Venus", "Diameter: 7,521 miles (12,104 km)", False), + Planet(3, "Earth", "Diameter: 7,926 miles (12,760 km)", True), + Planet(4, "Mars", "Diameter: 4,217 miles (6,787 km)", True), + Planet(5, "Jupiter", "Diameter: 86,881 miles (139,822 km)", True), + Planet(6, "Saturn", "Diameter: 74,900 miles (120,500 km)", True), + Planet(7, "Uranus", "Diameter: 31,763 miles (51,120 km)", True), + Planet(8, "Neptune", "Diameter: 30,775 miles (49,530 km)", True) +] + planets_bp = Blueprint("planets_bp", __name__,url_prefix="/planets") From 63c6c059224f94f7e9cc354e35e17448d6dfc8ea Mon Sep 17 00:00:00 2001 From: Karina Date: Mon, 18 Oct 2021 13:35:47 -0700 Subject: [PATCH 03/23] created endpoint for planets --- app/routes.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/app/routes.py b/app/routes.py index f59dd0f3a..96a7f4c4c 100644 --- a/app/routes.py +++ b/app/routes.py @@ -19,3 +19,17 @@ def __init__(self, id, title, description, moon): ] planets_bp = Blueprint("planets_bp", __name__,url_prefix="/planets") + +@planets_bp.route("", methods = ["GET"]) +def handle_planets(): + planets_response = [] + for planet in planets: + planets_response.append( + { + "id": planet.id, + "title": planet.title, + "description": planet.description, + "moon":planet.moon + } + ) + return jsonify(planets_response) \ No newline at end of file From ee4a36afe1539da2c043d98a8d80ee9b21ac0b7a Mon Sep 17 00:00:00 2001 From: Roslyn Melookaran Date: Mon, 18 Oct 2021 13:39:33 -0700 Subject: [PATCH 04/23] Added route for single planet response --- app/routes.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/app/routes.py b/app/routes.py index 96a7f4c4c..cef47be05 100644 --- a/app/routes.py +++ b/app/routes.py @@ -32,4 +32,17 @@ def handle_planets(): "moon":planet.moon } ) - return jsonify(planets_response) \ No newline at end of file + return jsonify(planets_response) + +@planets_bp.route("/", methods=["GET"]) +def handle_planet(planet_id): + for planet in planets: + if planet.id == int(planet_id): + return { + "id": planet.id, + "title": planet.title, + "description": planet.description, + "moon":planet.moon + } + + \ No newline at end of file From 05f47857e181eef462d36efa8eb6cb10cf0ef4d7 Mon Sep 17 00:00:00 2001 From: Roslyn Melookaran Date: Mon, 18 Oct 2021 13:56:24 -0700 Subject: [PATCH 05/23] Additional picture info added to class --- app/routes.py | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/app/routes.py b/app/routes.py index cef47be05..0d7734a87 100644 --- a/app/routes.py +++ b/app/routes.py @@ -1,21 +1,22 @@ from flask import Blueprint, jsonify class Planet: - def __init__(self, id, title, description, moon): + def __init__(self, id, title, description, moon, picture): self.id = id self.title = title self.description = description self.moon = moon + self.picture = picture planets= [ - Planet(1, "Mercury", "Diameter: 3,031 miles (4,878 km)", False), - Planet(2, "Venus", "Diameter: 7,521 miles (12,104 km)", False), - Planet(3, "Earth", "Diameter: 7,926 miles (12,760 km)", True), - Planet(4, "Mars", "Diameter: 4,217 miles (6,787 km)", True), - Planet(5, "Jupiter", "Diameter: 86,881 miles (139,822 km)", True), - Planet(6, "Saturn", "Diameter: 74,900 miles (120,500 km)", True), - Planet(7, "Uranus", "Diameter: 31,763 miles (51,120 km)", True), - Planet(8, "Neptune", "Diameter: 30,775 miles (49,530 km)", True) + Planet(1, "Mercury", "Diameter: 3,031 miles (4,878 km)", False, "https://cdn.mos.cms.futurecdn.net/oU94fqcyf9HzQc59wJyaHN-970-80.jpg"), + Planet(2, "Venus", "Diameter: 7,521 miles (12,104 km)", False, "https://cdn.mos.cms.futurecdn.net/KhHofvaDG73pypCEzyLuab-970-80.png"), + Planet(3, "Earth", "Diameter: 7,926 miles (12,760 km)", True, "https://cdn.mos.cms.futurecdn.net/4aeTmiqCqpRKuFc8tkDcmm-970-80.jpg"), + Planet(4, "Mars", "Diameter: 4,217 miles (6,787 km)", True, "https://cdn.mos.cms.futurecdn.net/tQUhJUq9GXqMfZXjGYdw8c-970-80.jpg"), + Planet(5, "Jupiter", "Diameter: 86,881 miles (139,822 km)", True, "https://cdn.mos.cms.futurecdn.net/WyxFYsiUAQAgU4peSSoBNZ-970-80.png"), + Planet(6, "Saturn", "Diameter: 74,900 miles (120,500 km)", True, "https://cdn.mos.cms.futurecdn.net/bDVqRSjnbY9jMyVPmStUBY-970-80.png"), + Planet(7, "Uranus", "Diameter: 31,763 miles (51,120 km)", True, "https://cdn.mos.cms.futurecdn.net/kZXxHS85dDgVEAviQrM2KW-970-80.jpg"), + Planet(8, "Neptune", "Diameter: 30,775 miles (49,530 km)", True, "https://cdn.mos.cms.futurecdn.net/KW2AU72GRriUXQvsn5jAbg-970-80.jpg") ] planets_bp = Blueprint("planets_bp", __name__,url_prefix="/planets") @@ -29,7 +30,8 @@ def handle_planets(): "id": planet.id, "title": planet.title, "description": planet.description, - "moon":planet.moon + "moon": planet.moon, + "picture": planet.picture } ) return jsonify(planets_response) @@ -42,7 +44,6 @@ def handle_planet(planet_id): "id": planet.id, "title": planet.title, "description": planet.description, - "moon":planet.moon + "moon":planet.moon, + "picture": planet.picture } - - \ No newline at end of file From c2fbe5f39fc752bdad82b524415875938a2617c5 Mon Sep 17 00:00:00 2001 From: Roslyn Melookaran Date: Mon, 18 Oct 2021 14:50:55 -0700 Subject: [PATCH 06/23] Added picture rendering and html templates --- app/routes.py | 22 +++++++++++++++++++++- app/templates/planet_picture.html | 9 +++++++++ app/templates/planet_summary.html | 15 +++++++++++++++ 3 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 app/templates/planet_picture.html create mode 100644 app/templates/planet_summary.html diff --git a/app/routes.py b/app/routes.py index 0d7734a87..eb697e7a2 100644 --- a/app/routes.py +++ b/app/routes.py @@ -1,4 +1,4 @@ -from flask import Blueprint, jsonify +from flask import Blueprint, jsonify, render_template class Planet: def __init__(self, id, title, description, moon, picture): @@ -47,3 +47,23 @@ def handle_planet(planet_id): "moon":planet.moon, "picture": planet.picture } + +@planets_bp.route("/picture/", methods=["GET"]) +def handle_planet_picture(planet_id): + for planet in planets: + if planet.id == int(planet_id): + return render_template('planet_picture.html', url=planet.picture) + +@planets_bp.route("/picturesummary/", methods=["GET"]) +def handle_planet_summary(planet_id): + for planet in planets: + if planet.id == int(planet_id): + if planet.moon == True: + moon = "Yes" + else: + moon = "No" + return render_template('planet_summary.html', + url=planet.picture, + title=planet.title, + diameter=planet.description, + moon=moon) diff --git a/app/templates/planet_picture.html b/app/templates/planet_picture.html new file mode 100644 index 000000000..d1b9ee572 --- /dev/null +++ b/app/templates/planet_picture.html @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/templates/planet_summary.html b/app/templates/planet_summary.html new file mode 100644 index 000000000..7d6881cfc --- /dev/null +++ b/app/templates/planet_summary.html @@ -0,0 +1,15 @@ + + + + + +

{{title}}

+
+ {{diameter}} +
+ Moon: {{moon}} +
+ + + + \ No newline at end of file From d8224571ae8b42862bc87c3bc9d59bbd2ae1e2da Mon Sep 17 00:00:00 2001 From: Karina Date: Mon, 25 Oct 2021 13:29:35 -0700 Subject: [PATCH 07/23] created model and set up database --- app/__init__.py | 12 ++++ app/models/__init__.py | 0 app/models/planet.py | 9 +++ migrations/README | 1 + migrations/alembic.ini | 45 +++++++++++++ migrations/env.py | 96 ++++++++++++++++++++++++++++ migrations/script.py.mako | 24 +++++++ migrations/versions/0196967f42c9_.py | 35 ++++++++++ 8 files changed, 222 insertions(+) create mode 100644 app/models/__init__.py create mode 100644 app/models/planet.py create mode 100644 migrations/README create mode 100644 migrations/alembic.ini create mode 100644 migrations/env.py create mode 100644 migrations/script.py.mako create mode 100644 migrations/versions/0196967f42c9_.py diff --git a/app/__init__.py b/app/__init__.py index ab9eee40e..f33140538 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -1,8 +1,20 @@ from flask import Flask +from flask_sqlalchemy import SQLAlchemy +from flask_migrate import Migrate +db = SQLAlchemy() +migrate = Migrate() def create_app(test_config=None): app = Flask(__name__) + + app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False + app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql+psycopg2://postgres:postgres@localhost:5432/solar_system' + + from app.models.planet import Planet + + db.init_app(app) + migrate.init_app(app, db) from .routes import planets_bp app.register_blueprint(planets_bp) diff --git a/app/models/__init__.py b/app/models/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/app/models/planet.py b/app/models/planet.py new file mode 100644 index 000000000..f86409d61 --- /dev/null +++ b/app/models/planet.py @@ -0,0 +1,9 @@ +from app import db + +class Planet(db.Model): + __tablename__ = "Planets" + id = db.Column(db.Integer,primary_key=True,autoincrement = True) + name = db.Column(db.String) + diameter = db.Column(db.String) + moons = db.Column(db.Boolean) + picture = db.Column(db.String) \ No newline at end of file diff --git a/migrations/README b/migrations/README new file mode 100644 index 000000000..98e4f9c44 --- /dev/null +++ b/migrations/README @@ -0,0 +1 @@ +Generic single-database configuration. \ No newline at end of file diff --git a/migrations/alembic.ini b/migrations/alembic.ini new file mode 100644 index 000000000..f8ed4801f --- /dev/null +++ b/migrations/alembic.ini @@ -0,0 +1,45 @@ +# A generic, single database configuration. + +[alembic] +# template used to generate migration files +# file_template = %%(rev)s_%%(slug)s + +# set to 'true' to run the environment during +# the 'revision' command, regardless of autogenerate +# revision_environment = false + + +# Logging configuration +[loggers] +keys = root,sqlalchemy,alembic + +[handlers] +keys = console + +[formatters] +keys = generic + +[logger_root] +level = WARN +handlers = console +qualname = + +[logger_sqlalchemy] +level = WARN +handlers = +qualname = sqlalchemy.engine + +[logger_alembic] +level = INFO +handlers = +qualname = alembic + +[handler_console] +class = StreamHandler +args = (sys.stderr,) +level = NOTSET +formatter = generic + +[formatter_generic] +format = %(levelname)-5.5s [%(name)s] %(message)s +datefmt = %H:%M:%S diff --git a/migrations/env.py b/migrations/env.py new file mode 100644 index 000000000..8b3fb3353 --- /dev/null +++ b/migrations/env.py @@ -0,0 +1,96 @@ +from __future__ import with_statement + +import logging +from logging.config import fileConfig + +from sqlalchemy import engine_from_config +from sqlalchemy import pool +from flask import current_app + +from alembic import context + +# this is the Alembic Config object, which provides +# access to the values within the .ini file in use. +config = context.config + +# Interpret the config file for Python logging. +# This line sets up loggers basically. +fileConfig(config.config_file_name) +logger = logging.getLogger('alembic.env') + +# add your model's MetaData object here +# for 'autogenerate' support +# from myapp import mymodel +# target_metadata = mymodel.Base.metadata +config.set_main_option( + 'sqlalchemy.url', + str(current_app.extensions['migrate'].db.engine.url).replace('%', '%%')) +target_metadata = current_app.extensions['migrate'].db.metadata + +# other values from the config, defined by the needs of env.py, +# can be acquired: +# my_important_option = config.get_main_option("my_important_option") +# ... etc. + + +def run_migrations_offline(): + """Run migrations in 'offline' mode. + + This configures the context with just a URL + and not an Engine, though an Engine is acceptable + here as well. By skipping the Engine creation + we don't even need a DBAPI to be available. + + Calls to context.execute() here emit the given string to the + script output. + + """ + url = config.get_main_option("sqlalchemy.url") + context.configure( + url=url, target_metadata=target_metadata, literal_binds=True + ) + + with context.begin_transaction(): + context.run_migrations() + + +def run_migrations_online(): + """Run migrations in 'online' mode. + + In this scenario we need to create an Engine + and associate a connection with the context. + + """ + + # this callback is used to prevent an auto-migration from being generated + # when there are no changes to the schema + # reference: http://alembic.zzzcomputing.com/en/latest/cookbook.html + def process_revision_directives(context, revision, directives): + if getattr(config.cmd_opts, 'autogenerate', False): + script = directives[0] + if script.upgrade_ops.is_empty(): + directives[:] = [] + logger.info('No changes in schema detected.') + + connectable = engine_from_config( + config.get_section(config.config_ini_section), + prefix='sqlalchemy.', + poolclass=pool.NullPool, + ) + + with connectable.connect() as connection: + context.configure( + connection=connection, + target_metadata=target_metadata, + process_revision_directives=process_revision_directives, + **current_app.extensions['migrate'].configure_args + ) + + with context.begin_transaction(): + context.run_migrations() + + +if context.is_offline_mode(): + run_migrations_offline() +else: + run_migrations_online() diff --git a/migrations/script.py.mako b/migrations/script.py.mako new file mode 100644 index 000000000..2c0156303 --- /dev/null +++ b/migrations/script.py.mako @@ -0,0 +1,24 @@ +"""${message} + +Revision ID: ${up_revision} +Revises: ${down_revision | comma,n} +Create Date: ${create_date} + +""" +from alembic import op +import sqlalchemy as sa +${imports if imports else ""} + +# revision identifiers, used by Alembic. +revision = ${repr(up_revision)} +down_revision = ${repr(down_revision)} +branch_labels = ${repr(branch_labels)} +depends_on = ${repr(depends_on)} + + +def upgrade(): + ${upgrades if upgrades else "pass"} + + +def downgrade(): + ${downgrades if downgrades else "pass"} diff --git a/migrations/versions/0196967f42c9_.py b/migrations/versions/0196967f42c9_.py new file mode 100644 index 000000000..e7e898d0c --- /dev/null +++ b/migrations/versions/0196967f42c9_.py @@ -0,0 +1,35 @@ +"""empty message + +Revision ID: 0196967f42c9 +Revises: +Create Date: 2021-10-25 13:28:20.121971 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '0196967f42c9' +down_revision = None +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('Planets', + sa.Column('id', sa.Integer(), autoincrement=True, nullable=False), + sa.Column('name', sa.String(), nullable=True), + sa.Column('diameter', sa.String(), nullable=True), + sa.Column('moons', sa.Boolean(), nullable=True), + sa.Column('picture', sa.String(), nullable=True), + sa.PrimaryKeyConstraint('id') + ) + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table('Planets') + # ### end Alembic commands ### From 73bf7280017ef98605f5f9826d787c0acceee5ce Mon Sep 17 00:00:00 2001 From: Roslyn Melookaran Date: Mon, 25 Oct 2021 13:39:25 -0700 Subject: [PATCH 08/23] Added route for handle plantes --- app/routes.py | 55 ++++++++++++++++++++++++++------------------------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/app/routes.py b/app/routes.py index eb697e7a2..79560a084 100644 --- a/app/routes.py +++ b/app/routes.py @@ -1,40 +1,41 @@ -from flask import Blueprint, jsonify, render_template +from flask import Blueprint, jsonify, render_template, make_response, request +from app import db +from app.models.planet import Planet -class Planet: - def __init__(self, id, title, description, moon, picture): - self.id = id - self.title = title - self.description = description - self.moon = moon - self.picture = picture +# class Planet: +# def __init__(self, id, title, description, moon, picture): +# self.id = id +# self.title = title +# self.description = description +# self.moon = moon +# self.picture = picture -planets= [ - Planet(1, "Mercury", "Diameter: 3,031 miles (4,878 km)", False, "https://cdn.mos.cms.futurecdn.net/oU94fqcyf9HzQc59wJyaHN-970-80.jpg"), - Planet(2, "Venus", "Diameter: 7,521 miles (12,104 km)", False, "https://cdn.mos.cms.futurecdn.net/KhHofvaDG73pypCEzyLuab-970-80.png"), - Planet(3, "Earth", "Diameter: 7,926 miles (12,760 km)", True, "https://cdn.mos.cms.futurecdn.net/4aeTmiqCqpRKuFc8tkDcmm-970-80.jpg"), - Planet(4, "Mars", "Diameter: 4,217 miles (6,787 km)", True, "https://cdn.mos.cms.futurecdn.net/tQUhJUq9GXqMfZXjGYdw8c-970-80.jpg"), - Planet(5, "Jupiter", "Diameter: 86,881 miles (139,822 km)", True, "https://cdn.mos.cms.futurecdn.net/WyxFYsiUAQAgU4peSSoBNZ-970-80.png"), - Planet(6, "Saturn", "Diameter: 74,900 miles (120,500 km)", True, "https://cdn.mos.cms.futurecdn.net/bDVqRSjnbY9jMyVPmStUBY-970-80.png"), - Planet(7, "Uranus", "Diameter: 31,763 miles (51,120 km)", True, "https://cdn.mos.cms.futurecdn.net/kZXxHS85dDgVEAviQrM2KW-970-80.jpg"), - Planet(8, "Neptune", "Diameter: 30,775 miles (49,530 km)", True, "https://cdn.mos.cms.futurecdn.net/KW2AU72GRriUXQvsn5jAbg-970-80.jpg") -] +# planets= [ +# Planet(1, "Mercury", "Diameter: 3,031 miles (4,878 km)", False, "https://cdn.mos.cms.futurecdn.net/oU94fqcyf9HzQc59wJyaHN-970-80.jpg"), +# Planet(2, "Venus", "Diameter: 7,521 miles (12,104 km)", False, "https://cdn.mos.cms.futurecdn.net/KhHofvaDG73pypCEzyLuab-970-80.png"), +# Planet(3, "Earth", "Diameter: 7,926 miles (12,760 km)", True, "https://cdn.mos.cms.futurecdn.net/4aeTmiqCqpRKuFc8tkDcmm-970-80.jpg"), +# Planet(4, "Mars", "Diameter: 4,217 miles (6,787 km)", True, "https://cdn.mos.cms.futurecdn.net/tQUhJUq9GXqMfZXjGYdw8c-970-80.jpg"), +# Planet(5, "Jupiter", "Diameter: 86,881 miles (139,822 km)", True, "https://cdn.mos.cms.futurecdn.net/WyxFYsiUAQAgU4peSSoBNZ-970-80.png"), +# Planet(6, "Saturn", "Diameter: 74,900 miles (120,500 km)", True, "https://cdn.mos.cms.futurecdn.net/bDVqRSjnbY9jMyVPmStUBY-970-80.png"), +# Planet(7, "Uranus", "Diameter: 31,763 miles (51,120 km)", True, "https://cdn.mos.cms.futurecdn.net/kZXxHS85dDgVEAviQrM2KW-970-80.jpg"), +# Planet(8, "Neptune", "Diameter: 30,775 miles (49,530 km)", True, "https://cdn.mos.cms.futurecdn.net/KW2AU72GRriUXQvsn5jAbg-970-80.jpg") +# ] planets_bp = Blueprint("planets_bp", __name__,url_prefix="/planets") @planets_bp.route("", methods = ["GET"]) def handle_planets(): planets_response = [] + planets = Planet.query.all() for planet in planets: planets_response.append( - { - "id": planet.id, - "title": planet.title, - "description": planet.description, - "moon": planet.moon, - "picture": planet.picture - } - ) - return jsonify(planets_response) + {"id": planet.id, + "name": planet.name, + "diameter": planet.diameter, + "moons": planet.moons, + "picture": planet.picture}) + return jsonify(planets_response), 200 + @planets_bp.route("/", methods=["GET"]) def handle_planet(planet_id): From 1799c415d7ee28360474125c0039f6ab77d830d6 Mon Sep 17 00:00:00 2001 From: Karina Date: Mon, 25 Oct 2021 13:52:21 -0700 Subject: [PATCH 09/23] added id specific route --- app/routes.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/app/routes.py b/app/routes.py index 79560a084..da9268979 100644 --- a/app/routes.py +++ b/app/routes.py @@ -36,7 +36,19 @@ def handle_planets(): "picture": planet.picture}) return jsonify(planets_response), 200 +@planets_bp.route("/", methods=["GET"]) +def handle_dog(planet_id): + planet_id = int(planet_id) + planet = Planet.query.get(planet_id) + if planet: + return {"id": planet.id, + "name": planet.name, + "diameter": planet.diameter, + "moons": planet.moons, + "picture": planet.picture},200 + return { "Error": f"Planet {planet_id} was not found"}, 404 + @planets_bp.route("/", methods=["GET"]) def handle_planet(planet_id): for planet in planets: From 25d4594c99e89ab698c6ce4f1a7b69a4d0b9c577 Mon Sep 17 00:00:00 2001 From: Roslyn Melookaran Date: Mon, 25 Oct 2021 14:48:11 -0700 Subject: [PATCH 10/23] Added post planet functionality, and picture routes, and added .txt file with planet info (json format) --- app/models/planet_info.txt | 55 ++++++++++++++++++++++++++++++ app/routes.py | 70 ++++++++++++++++---------------------- 2 files changed, 84 insertions(+), 41 deletions(-) create mode 100644 app/models/planet_info.txt diff --git a/app/models/planet_info.txt b/app/models/planet_info.txt new file mode 100644 index 000000000..d3f729275 --- /dev/null +++ b/app/models/planet_info.txt @@ -0,0 +1,55 @@ +{ + "name": "Mercury", + "diameter":"Diameter: 3,031 miles (4,878 km)", + "moons": false, + "picture":"https://cdn.mos.cms.futurecdn.net/oU94fqcyf9HzQc59wJyaHN-970-80.jpg" +} + +{ + "name": "Venus", + "diameter": "Diameter: 7,521 miles (12,104 km)", + "moons": false, + "picture": "https://cdn.mos.cms.futurecdn.net/KhHofvaDG73pypCEzyLuab-970-80.png" +} + +{ + "name": "Earth", + "diameter": "Diameter: 7,926 miles (12,760 km)", + "moons": true, + "picture": "https://cdn.mos.cms.futurecdn.net/4aeTmiqCqpRKuFc8tkDcmm-970-80.jpg" +} + +{ + "name": "Mars", + "diameter": "Diameter: 4,217 miles (6,787 km)", + "moons": true, + "picture": "https://cdn.mos.cms.futurecdn.net/tQUhJUq9GXqMfZXjGYdw8c-970-80.jpg" +} + +{ + "name": "Jupiter", + "diameter":"Diameter: 86,881 miles (139,822 km)", + "moons": true, + "picture":"https://cdn.mos.cms.futurecdn.net/WyxFYsiUAQAgU4peSSoBNZ-970-80.png" +} + +{ + "name": "Saturn", + "diameter":"Diameter: 74,900 miles (120,500 km)", + "moons": true, + "picture":"https://cdn.mos.cms.futurecdn.net/bDVqRSjnbY9jMyVPmStUBY-970-80.png" +} + +{ + "name": "Uranus", + "diameter":"Diameter: 31,763 miles (51,120 km)", + "moons": true, + "picture":"https://cdn.mos.cms.futurecdn.net/kZXxHS85dDgVEAviQrM2KW-970-80.jpg" +} + +{ + "name": "Neptune", + "diameter":"Diameter: 30,775 miles (49,530 km)", + "moons": true, + "picture":"https://cdn.mos.cms.futurecdn.net/KW2AU72GRriUXQvsn5jAbg-970-80.jpg" +} \ No newline at end of file diff --git a/app/routes.py b/app/routes.py index da9268979..3d44c0fe6 100644 --- a/app/routes.py +++ b/app/routes.py @@ -1,25 +1,9 @@ from flask import Blueprint, jsonify, render_template, make_response, request from app import db from app.models.planet import Planet +from jsonschema import validate +import jsonschema -# class Planet: -# def __init__(self, id, title, description, moon, picture): -# self.id = id -# self.title = title -# self.description = description -# self.moon = moon -# self.picture = picture - -# planets= [ -# Planet(1, "Mercury", "Diameter: 3,031 miles (4,878 km)", False, "https://cdn.mos.cms.futurecdn.net/oU94fqcyf9HzQc59wJyaHN-970-80.jpg"), -# Planet(2, "Venus", "Diameter: 7,521 miles (12,104 km)", False, "https://cdn.mos.cms.futurecdn.net/KhHofvaDG73pypCEzyLuab-970-80.png"), -# Planet(3, "Earth", "Diameter: 7,926 miles (12,760 km)", True, "https://cdn.mos.cms.futurecdn.net/4aeTmiqCqpRKuFc8tkDcmm-970-80.jpg"), -# Planet(4, "Mars", "Diameter: 4,217 miles (6,787 km)", True, "https://cdn.mos.cms.futurecdn.net/tQUhJUq9GXqMfZXjGYdw8c-970-80.jpg"), -# Planet(5, "Jupiter", "Diameter: 86,881 miles (139,822 km)", True, "https://cdn.mos.cms.futurecdn.net/WyxFYsiUAQAgU4peSSoBNZ-970-80.png"), -# Planet(6, "Saturn", "Diameter: 74,900 miles (120,500 km)", True, "https://cdn.mos.cms.futurecdn.net/bDVqRSjnbY9jMyVPmStUBY-970-80.png"), -# Planet(7, "Uranus", "Diameter: 31,763 miles (51,120 km)", True, "https://cdn.mos.cms.futurecdn.net/kZXxHS85dDgVEAviQrM2KW-970-80.jpg"), -# Planet(8, "Neptune", "Diameter: 30,775 miles (49,530 km)", True, "https://cdn.mos.cms.futurecdn.net/KW2AU72GRriUXQvsn5jAbg-970-80.jpg") -# ] planets_bp = Blueprint("planets_bp", __name__,url_prefix="/planets") @@ -49,34 +33,38 @@ def handle_dog(planet_id): "picture": planet.picture},200 return { "Error": f"Planet {planet_id} was not found"}, 404 -@planets_bp.route("/", methods=["GET"]) -def handle_planet(planet_id): - for planet in planets: - if planet.id == int(planet_id): - return { - "id": planet.id, - "title": planet.title, - "description": planet.description, - "moon":planet.moon, - "picture": planet.picture - } +@planets_bp.route("", methods=["POST"]) +def create_planet(): + request_data = request.get_json() + + if "name" not in request_data or "moons" not in request_data \ + or "diameter" not in request_data or "picture" not in request_data: + return jsonify({"message": "Missing data"}), 400 + + new_planet = Planet(name=request_data["name"], diameter=request_data["diameter"], + moons=request_data["moons"], picture=request_data["picture"]) + + db.session.add(new_planet) + db.session.commit() + + return f"Planet {new_planet.name} created", 201 @planets_bp.route("/picture/", methods=["GET"]) def handle_planet_picture(planet_id): - for planet in planets: - if planet.id == int(planet_id): - return render_template('planet_picture.html', url=planet.picture) + planet = Planet.query.get(planet_id) + if planet: + return render_template('planet_picture.html', url=planet.picture) + return jsonify({"message": "Planet does not exist"}), 400 @planets_bp.route("/picturesummary/", methods=["GET"]) def handle_planet_summary(planet_id): - for planet in planets: - if planet.id == int(planet_id): - if planet.moon == True: - moon = "Yes" - else: - moon = "No" - return render_template('planet_summary.html', + planet = Planet.query.get(planet_id) + if planet.moons == True: + moon = "Yes" + else: + moon = "No" + return render_template('planet_summary.html', url=planet.picture, - title=planet.title, - diameter=planet.description, + title=planet.name, + diameter=planet.diameter, moon=moon) From d833244c72da55344114088b57aed4e3a6a19688 Mon Sep 17 00:00:00 2001 From: Roslyn Melookaran Date: Tue, 26 Oct 2021 11:15:36 -0700 Subject: [PATCH 11/23] Added PUT and PATCH functionality to handle_planet() --- app/routes.py | 55 ++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 46 insertions(+), 9 deletions(-) diff --git a/app/routes.py b/app/routes.py index 3d44c0fe6..4c229a584 100644 --- a/app/routes.py +++ b/app/routes.py @@ -20,18 +20,55 @@ def handle_planets(): "picture": planet.picture}) return jsonify(planets_response), 200 -@planets_bp.route("/", methods=["GET"]) -def handle_dog(planet_id): +@planets_bp.route("/", methods=["GET", "PATCH", "PUT"]) +def handle_planet(planet_id): planet_id = int(planet_id) planet = Planet.query.get(planet_id) + if request.method == "GET": + if planet: + return {"id": planet.id, + "name": planet.name, + "diameter": planet.diameter, + "moons": planet.moons, + "picture": planet.picture},200 + return { "Error": f"Planet {planet_id} was not found"}, 404 + elif request.method == "PATCH": + try: + form_data = request.get_json() + except KeyError: + pass + try: + planet.name = form_data["name"] + except KeyError: + pass + try: + planet.diameter = form_data["diameter"] + except KeyError: + pass + try: + planet.moons = form_data["moons"] + except KeyError: + pass + try: + planet.picture = form_data["picture"] + except KeyError: + pass + db.session.commit() + + return make_response(f"Planet #{planet.id} successfully updated") + elif request.method == "PUT": + form_data = request.get_json() + planet.name = form_data["name"] + planet.diameter = form_data["diameter"] + planet.moons = form_data["moons"] + planet.picture = form_data["picture"] + + db.session.commit() + + return make_response(f"Planet #{planet.id} successfully updated") + + - if planet: - return {"id": planet.id, - "name": planet.name, - "diameter": planet.diameter, - "moons": planet.moons, - "picture": planet.picture},200 - return { "Error": f"Planet {planet_id} was not found"}, 404 @planets_bp.route("", methods=["POST"]) def create_planet(): From 80a2f7287329fe73c94f090793783eb7bfdf8187 Mon Sep 17 00:00:00 2001 From: Karina Date: Tue, 26 Oct 2021 11:41:08 -0700 Subject: [PATCH 12/23] added delete request and created helper func to_dict --- app/models/planet.py | 9 ++++++++- app/routes.py | 28 ++++++++++------------------ 2 files changed, 18 insertions(+), 19 deletions(-) diff --git a/app/models/planet.py b/app/models/planet.py index f86409d61..74efb7b27 100644 --- a/app/models/planet.py +++ b/app/models/planet.py @@ -6,4 +6,11 @@ class Planet(db.Model): name = db.Column(db.String) diameter = db.Column(db.String) moons = db.Column(db.Boolean) - picture = db.Column(db.String) \ No newline at end of file + picture = db.Column(db.String) + + def to_dict(self): + return ({"id": self.id, + "name": self.name, + "diameter": self.diameter, + "moons": self.moons, + "picture": self.picture}) \ No newline at end of file diff --git a/app/routes.py b/app/routes.py index 4c229a584..79081cc0d 100644 --- a/app/routes.py +++ b/app/routes.py @@ -1,8 +1,6 @@ from flask import Blueprint, jsonify, render_template, make_response, request from app import db from app.models.planet import Planet -from jsonschema import validate -import jsonschema planets_bp = Blueprint("planets_bp", __name__,url_prefix="/planets") @@ -12,31 +10,19 @@ def handle_planets(): planets_response = [] planets = Planet.query.all() for planet in planets: - planets_response.append( - {"id": planet.id, - "name": planet.name, - "diameter": planet.diameter, - "moons": planet.moons, - "picture": planet.picture}) + planets_response.append(planet.to_dict()) return jsonify(planets_response), 200 -@planets_bp.route("/", methods=["GET", "PATCH", "PUT"]) +@planets_bp.route("/", methods=["GET", "PATCH", "PUT", "DELETE"]) def handle_planet(planet_id): planet_id = int(planet_id) planet = Planet.query.get(planet_id) if request.method == "GET": if planet: - return {"id": planet.id, - "name": planet.name, - "diameter": planet.diameter, - "moons": planet.moons, - "picture": planet.picture},200 + return (planet.to_dict()),200 return { "Error": f"Planet {planet_id} was not found"}, 404 elif request.method == "PATCH": - try: - form_data = request.get_json() - except KeyError: - pass + form_data = request.get_json() try: planet.name = form_data["name"] except KeyError: @@ -66,6 +52,12 @@ def handle_planet(planet_id): db.session.commit() return make_response(f"Planet #{planet.id} successfully updated") + elif request.method == "DELETE": + db.session.delete(planet) + db.session.commit() + return { + "message": f"Book with title {planet.name} has been deleted" + }, 200 From e70a696b8b0f61635b4e10b4ddc89fb198521d29 Mon Sep 17 00:00:00 2001 From: Karina Date: Tue, 26 Oct 2021 11:46:04 -0700 Subject: [PATCH 13/23] typo and added lines for readability --- app/routes.py | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/app/routes.py b/app/routes.py index 79081cc0d..548660b2d 100644 --- a/app/routes.py +++ b/app/routes.py @@ -5,6 +5,7 @@ planets_bp = Blueprint("planets_bp", __name__,url_prefix="/planets") + @planets_bp.route("", methods = ["GET"]) def handle_planets(): planets_response = [] @@ -13,14 +14,18 @@ def handle_planets(): planets_response.append(planet.to_dict()) return jsonify(planets_response), 200 + @planets_bp.route("/", methods=["GET", "PATCH", "PUT", "DELETE"]) def handle_planet(planet_id): planet_id = int(planet_id) planet = Planet.query.get(planet_id) if request.method == "GET": if planet: + return (planet.to_dict()),200 + return { "Error": f"Planet {planet_id} was not found"}, 404 + elif request.method == "PATCH": form_data = request.get_json() try: @@ -42,6 +47,7 @@ def handle_planet(planet_id): db.session.commit() return make_response(f"Planet #{planet.id} successfully updated") + elif request.method == "PUT": form_data = request.get_json() planet.name = form_data["name"] @@ -52,22 +58,23 @@ def handle_planet(planet_id): db.session.commit() return make_response(f"Planet #{planet.id} successfully updated") + elif request.method == "DELETE": db.session.delete(planet) db.session.commit() + return { - "message": f"Book with title {planet.name} has been deleted" + "message": f"Planet with title {planet.name} has been deleted" }, 200 - - @planets_bp.route("", methods=["POST"]) def create_planet(): request_data = request.get_json() if "name" not in request_data or "moons" not in request_data \ or "diameter" not in request_data or "picture" not in request_data: + return jsonify({"message": "Missing data"}), 400 new_planet = Planet(name=request_data["name"], diameter=request_data["diameter"], @@ -78,13 +85,17 @@ def create_planet(): return f"Planet {new_planet.name} created", 201 + @planets_bp.route("/picture/", methods=["GET"]) def handle_planet_picture(planet_id): planet = Planet.query.get(planet_id) if planet: + return render_template('planet_picture.html', url=planet.picture) + return jsonify({"message": "Planet does not exist"}), 400 + @planets_bp.route("/picturesummary/", methods=["GET"]) def handle_planet_summary(planet_id): planet = Planet.query.get(planet_id) @@ -92,6 +103,7 @@ def handle_planet_summary(planet_id): moon = "Yes" else: moon = "No" + return render_template('planet_summary.html', url=planet.picture, title=planet.name, From 03499baefe09905c6341c6191e1d54fce6e49b92 Mon Sep 17 00:00:00 2001 From: Karina Date: Tue, 26 Oct 2021 12:01:33 -0700 Subject: [PATCH 14/23] updated solution for patch --- app/routes.py | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/app/routes.py b/app/routes.py index 548660b2d..f5ddc0fca 100644 --- a/app/routes.py +++ b/app/routes.py @@ -12,6 +12,7 @@ def handle_planets(): planets = Planet.query.all() for planet in planets: planets_response.append(planet.to_dict()) + return jsonify(planets_response), 200 @@ -28,22 +29,15 @@ def handle_planet(planet_id): elif request.method == "PATCH": form_data = request.get_json() - try: - planet.name = form_data["name"] - except KeyError: - pass - try: - planet.diameter = form_data["diameter"] - except KeyError: - pass - try: - planet.moons = form_data["moons"] - except KeyError: - pass - try: - planet.picture = form_data["picture"] - except KeyError: - pass + if 'name' in form_data: + planet.name = request.json['name'] + if 'diameter' in form_data: + planet.diameter = request.json['diameter'] + if 'moons' in form_data: + planet.moons = request.json['moons'] + if 'picture' in form_data: + planet.picture = request.json['picture'] + db.session.commit() return make_response(f"Planet #{planet.id} successfully updated") From fe8ee9ba09a847b63de30f1c8c78dbcf3c99ae9f Mon Sep 17 00:00:00 2001 From: Karina Date: Wed, 27 Oct 2021 11:28:33 -0700 Subject: [PATCH 15/23] sanitize func and 404s updates --- app/routes.py | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/app/routes.py b/app/routes.py index f5ddc0fca..cbbe0fe1a 100644 --- a/app/routes.py +++ b/app/routes.py @@ -1,4 +1,4 @@ -from flask import Blueprint, jsonify, render_template, make_response, request +from flask import Blueprint, jsonify, render_template, make_response, request, abort from app import db from app.models.planet import Planet @@ -18,17 +18,19 @@ def handle_planets(): @planets_bp.route("/", methods=["GET", "PATCH", "PUT", "DELETE"]) def handle_planet(planet_id): + if not planet_id.isnumeric(): + return { "Error": f"{planet_id} must be numeric."}, 404 planet_id = int(planet_id) planet = Planet.query.get(planet_id) - if request.method == "GET": - if planet: - - return (planet.to_dict()),200 - + if not planet: return { "Error": f"Planet {planet_id} was not found"}, 404 + elif request.method == "GET": + return (planet.to_dict()),200 + elif request.method == "PATCH": form_data = request.get_json() + sanitize_data(form_data) if 'name' in form_data: planet.name = request.json['name'] if 'diameter' in form_data: @@ -44,6 +46,7 @@ def handle_planet(planet_id): elif request.method == "PUT": form_data = request.get_json() + sanitize_data(form_data) planet.name = form_data["name"] planet.diameter = form_data["diameter"] planet.moons = form_data["moons"] @@ -65,6 +68,7 @@ def handle_planet(planet_id): @planets_bp.route("", methods=["POST"]) def create_planet(): request_data = request.get_json() + sanitize_data(request_data) if "name" not in request_data or "moons" not in request_data \ or "diameter" not in request_data or "picture" not in request_data: @@ -103,3 +107,16 @@ def handle_planet_summary(planet_id): title=planet.name, diameter=planet.diameter, moon=moon) + + +def sanitize_data(input_data): + data_types = {"name":str, "diameter":str, "moons":bool, "picture":str} + for name, val_type in data_types.items(): + try: + assert val_type==type(input_data[name]) + print(name,type(input_data[name])) + + except Exception as e: + print(e) + abort(400, "Bad Data") + return input_data \ No newline at end of file From 2c8e489e057483787d20568965f34acce0e61d5b Mon Sep 17 00:00:00 2001 From: Roslyn Melookaran Date: Wed, 27 Oct 2021 11:54:29 -0700 Subject: [PATCH 16/23] Updated functions with query params --- app/routes.py | 37 +++++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/app/routes.py b/app/routes.py index cbbe0fe1a..01e70774b 100644 --- a/app/routes.py +++ b/app/routes.py @@ -9,10 +9,15 @@ @planets_bp.route("", methods = ["GET"]) def handle_planets(): planets_response = [] - planets = Planet.query.all() - for planet in planets: - planets_response.append(planet.to_dict()) - + if request.args.get("name"): + planets = Planet.query.filter_by(name=request.args.get("name")) + for planet in planets: + planets_response.append(planet.to_dict()) + else: + planets = Planet.query.all() + for planet in planets: + planets_response.append(planet.to_dict()) + return jsonify(planets_response), 200 @@ -83,16 +88,20 @@ def create_planet(): return f"Planet {new_planet.name} created", 201 - -@planets_bp.route("/picture/", methods=["GET"]) -def handle_planet_picture(planet_id): - planet = Planet.query.get(planet_id) - if planet: - - return render_template('planet_picture.html', url=planet.picture) - - return jsonify({"message": "Planet does not exist"}), 400 - +@planets_bp.route("/picturesummary", methods=["GET"]) +def handle_planet_summary_params(): + if request.args.get("name"): + planets = Planet.query.filter_by(name=request.args.get("name")) + for planet in planets: + if planet.moons == True: + moon = "Yes" + else: + moon = "No" + return render_template('planet_summary.html', + url=planet.picture, + title=planet.name, + diameter=planet.diameter, + moon=moon) @planets_bp.route("/picturesummary/", methods=["GET"]) def handle_planet_summary(planet_id): From de29decf27798332bbe3d561b64ae28fa8b24af3 Mon Sep 17 00:00:00 2001 From: Karina Date: Wed, 27 Oct 2021 12:05:35 -0700 Subject: [PATCH 17/23] added order by and filter by has moons --- app/routes.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/app/routes.py b/app/routes.py index 01e70774b..012bd056d 100644 --- a/app/routes.py +++ b/app/routes.py @@ -9,14 +9,20 @@ @planets_bp.route("", methods = ["GET"]) def handle_planets(): planets_response = [] + if request.args.get("name"): planets = Planet.query.filter_by(name=request.args.get("name")) - for planet in planets: - planets_response.append(planet.to_dict()) + + elif request.args.get("has_moons"): + planets = Planet.query.filter(Planet.moons == request.args.get("has_moons")) + + elif request.args.get("order_by") == "name": + planets = Planet.query.order_by(Planet.name) + else: planets = Planet.query.all() - for planet in planets: - planets_response.append(planet.to_dict()) + for planet in planets: + planets_response.append(planet.to_dict()) return jsonify(planets_response), 200 From 7f6eb6631cf793e5d38d0cfb39f054756a17df0f Mon Sep 17 00:00:00 2001 From: Karina Date: Thu, 28 Oct 2021 12:19:04 -0700 Subject: [PATCH 18/23] added tests --- app/__init__.py | 16 ++++++++--- tests/__init__.py | 0 tests/conftest.py | 39 +++++++++++++++++++++++++++ tests/test_routes.py | 63 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 115 insertions(+), 3 deletions(-) create mode 100644 tests/__init__.py create mode 100644 tests/conftest.py create mode 100644 tests/test_routes.py diff --git a/app/__init__.py b/app/__init__.py index f33140538..a7e95367e 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -1,15 +1,25 @@ from flask import Flask from flask_sqlalchemy import SQLAlchemy from flask_migrate import Migrate +from dotenv import load_dotenv +import os db = SQLAlchemy() migrate = Migrate() +load_dotenv() def create_app(test_config=None): app = Flask(__name__) - - app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False - app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql+psycopg2://postgres:postgres@localhost:5432/solar_system' + + if not test_config: + app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False + app.config['SQLALCHEMY_DATABASE_URI'] = os.environ.get( + "SQLALCHEMY_DATABASE_URI") + else: + app.config["TESTING"] = True + app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False + app.config["SQLALCHEMY_DATABASE_URI"] = os.environ.get( + "SQLALCHEMY_TEST_DATABASE_URI") from app.models.planet import Planet diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 000000000..6469ea727 --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,39 @@ +import pytest +from app import create_app +from app import db +from app.models.planet import Planet + + +@pytest.fixture +def app(): + app = create_app({"TESTING": True}) + + with app.app_context(): + db.create_all() + yield app + + with app.app_context(): + db.drop_all() + + +@pytest.fixture +def client(app): + return app.test_client() + +@pytest.fixture +def two_saved_planets(app): + jupiter_planet = Planet( + name="Jupiter", + diameter="Diameter: 86,881 miles (139,822 km)", + moons=True, + picture="https://cdn.mos.cms.futurecdn.net/WyxFYsiUAQAgU4peSSoBNZ-970-80.png" +) + saturn_planet = Planet(name="Saturn", + diameter="Diameter: 74,900 miles (120,500 km)", + moons=True, + picture="https://cdn.mos.cms.futurecdn.net/bDVqRSjnbY9jMyVPmStUBY-970-80.png" +) + + db.session.add_all([jupiter_planet, saturn_planet]) + + db.session.commit() \ No newline at end of file diff --git a/tests/test_routes.py b/tests/test_routes.py new file mode 100644 index 000000000..f16170cb6 --- /dev/null +++ b/tests/test_routes.py @@ -0,0 +1,63 @@ + +from flask import json +from flask.globals import request +from flask.wrappers import Response + + +def test_get_all_planets_with_no_records(client): + response = client.get('/planets') + response_body = response.get_json() + + assert response.status_code ==200 + assert response_body == [] + +def test_get_planet_by_id(client,two_saved_planets): + response = client.get('/planets/1') + response_body = response.get_json() + + assert response.status_code == 200 + assert response_body == { + "id":1, + "name": "Jupiter", + "diameter":"Diameter: 86,881 miles (139,822 km)", + "moons": True, + "picture":"https://cdn.mos.cms.futurecdn.net/WyxFYsiUAQAgU4peSSoBNZ-970-80.png" +} + +def test_get_by_id_without_data(client): + response = client.get('/planets/1') + response_body = response.get_json() + + assert response.status_code == 404 + +def test_get_all_planets_with_data(client,two_saved_planets): + response = client.get('/planets') + response_body = response.get_json() + saturn = { + "id":2, + "name": "Saturn", + "diameter":"Diameter: 74,900 miles (120,500 km)", + "moons": True, + "picture":"https://cdn.mos.cms.futurecdn.net/bDVqRSjnbY9jMyVPmStUBY-970-80.png" +} + jupiter = { + "id":1, + "name": "Jupiter", + "diameter":"Diameter: 86,881 miles (139,822 km)", + "moons": True, + "picture":"https://cdn.mos.cms.futurecdn.net/WyxFYsiUAQAgU4peSSoBNZ-970-80.png" +} + assert response.status_code ==200 + assert saturn in response_body + assert jupiter in response_body + +def test_post_one_planet(client): + response = client.post('/planets',json= {"id":1, + "name": "Jupiter", + "diameter":"Diameter: 86,881 miles (139,822 km)", + "moons": True, + "picture":"https://cdn.mos.cms.futurecdn.net/WyxFYsiUAQAgU4peSSoBNZ-970-80.png"} +) + response_body = response.get_json() + + assert response.status_code ==201 \ No newline at end of file From 9c878591351ff8d9ee63b136623bb6a1cdf9c891 Mon Sep 17 00:00:00 2001 From: Roslyn Melookaran Date: Wed, 3 Nov 2021 10:56:40 -0700 Subject: [PATCH 19/23] added Procfile --- Procfile | 1 + 1 file changed, 1 insertion(+) create mode 100644 Procfile diff --git a/Procfile b/Procfile new file mode 100644 index 000000000..62e430aca --- /dev/null +++ b/Procfile @@ -0,0 +1 @@ +web: gunicorn 'app:create_app()' \ No newline at end of file From 587834d1198cdd68767da20589a9c6108e7515fd Mon Sep 17 00:00:00 2001 From: Roslyn Melookaran Date: Wed, 3 Nov 2021 11:14:47 -0700 Subject: [PATCH 20/23] added .env file, and new migrations folder --- migrations/versions/{0196967f42c9_.py => c1bef2046609_.py} | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) rename migrations/versions/{0196967f42c9_.py => c1bef2046609_.py} (89%) diff --git a/migrations/versions/0196967f42c9_.py b/migrations/versions/c1bef2046609_.py similarity index 89% rename from migrations/versions/0196967f42c9_.py rename to migrations/versions/c1bef2046609_.py index e7e898d0c..5fceeffdc 100644 --- a/migrations/versions/0196967f42c9_.py +++ b/migrations/versions/c1bef2046609_.py @@ -1,8 +1,8 @@ """empty message -Revision ID: 0196967f42c9 +Revision ID: c1bef2046609 Revises: -Create Date: 2021-10-25 13:28:20.121971 +Create Date: 2021-11-03 11:13:41.073025 """ from alembic import op @@ -10,7 +10,7 @@ # revision identifiers, used by Alembic. -revision = '0196967f42c9' +revision = 'c1bef2046609' down_revision = None branch_labels = None depends_on = None From 7a9eff0cb7ab90da497934616340c1cbeeb3b853 Mon Sep 17 00:00:00 2001 From: Roslyn Melookaran Date: Wed, 3 Nov 2021 11:33:07 -0700 Subject: [PATCH 21/23] updated Procfile --- Procfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Procfile b/Procfile index 62e430aca..744227a59 100644 --- a/Procfile +++ b/Procfile @@ -1 +1 @@ -web: gunicorn 'app:create_app()' \ No newline at end of file +web:gunicorn 'app:create_app()' \ No newline at end of file From cb47a25217ac6e057064d96b22e9cf32c61ee042 Mon Sep 17 00:00:00 2001 From: Roslyn Melookaran Date: Wed, 3 Nov 2021 11:40:25 -0700 Subject: [PATCH 22/23] updated Procfile again --- Procfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Procfile b/Procfile index 744227a59..62e430aca 100644 --- a/Procfile +++ b/Procfile @@ -1 +1 @@ -web:gunicorn 'app:create_app()' \ No newline at end of file +web: gunicorn 'app:create_app()' \ No newline at end of file From fb7edff43d369149d1c58b61bd7375b219b913d7 Mon Sep 17 00:00:00 2001 From: Roslyn Melookaran Date: Wed, 3 Nov 2021 11:47:37 -0700 Subject: [PATCH 23/23] added gunicorn to requirements.txt --- requirements.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/requirements.txt b/requirements.txt index fd90fffa8..a32d6a7c5 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,5 @@ alembic==1.5.4 +attrs==21.2.0 autopep8==1.5.5 certifi==2020.12.5 chardet==4.0.0 @@ -6,13 +7,16 @@ click==7.1.2 Flask==1.1.2 Flask-Migrate==2.6.0 Flask-SQLAlchemy==2.4.4 +gunicorn==20.1.0 idna==2.10 itsdangerous==1.1.0 Jinja2==2.11.3 +jsonschema==4.1.2 Mako==1.1.4 MarkupSafe==1.1.1 psycopg2-binary==2.8.6 pycodestyle==2.6.0 +pyrsistent==0.18.0 python-dateutil==2.8.1 python-dotenv==0.15.0 python-editor==1.0.4