From 37a525390c985dffdff805291a946a1bad36bc80 Mon Sep 17 00:00:00 2001 From: Danielle Date: Sat, 23 Apr 2022 15:50:44 -0700 Subject: [PATCH 01/23] Get all planets --- app/__init__.py | 3 +++ app/routes.py | 31 ++++++++++++++++++++++++++++++- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/app/__init__.py b/app/__init__.py index 70b4cabfe..b2bd60609 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 planet_bp + app.register_blueprint(planet_bp) + return app diff --git a/app/routes.py b/app/routes.py index 8e9dfe684..4c4b3fa61 100644 --- a/app/routes.py +++ b/app/routes.py @@ -1,2 +1,31 @@ -from flask import Blueprint +from flask import Blueprint, jsonify + +class Planet(): + def __init__(self, id, name, description, size): + self.id = id + self.name = name + self.description = description + self.size = size + + +planets = [ + Planet(1, "Saturn", "Its brownish", 12), + Planet(2, "Earth", "Its where people live", 13), + Planet(3, "Sun", "Its hot", 14) +] + +planet_bp = Blueprint("planets", __name__, url_prefix="/planets") + +# GET ALL +@planet_bp.route("", methods=["GET"]) +def get_all_planets(): + planets_response = [] + for planet in planets: + planets_response.append(dict( + id=planet.id, + name=planet.name, + description=planet.description, + size=planet.size + )) + return jsonify(planets_response) \ No newline at end of file From 6029082c4cf09a2bc8bd2d2e9644371eedd8f822 Mon Sep 17 00:00:00 2001 From: Poppy Meng Date: Sat, 23 Apr 2022 15:50:47 -0700 Subject: [PATCH 02/23] poppy's version wave 1 --- app/__init__.py | 3 ++- app/routes.py | 33 ++++++++++++++++++++++++++++++++- project-directions/wave_01.md | 9 +++------ 3 files changed, 37 insertions(+), 8 deletions(-) diff --git a/app/__init__.py b/app/__init__.py index 70b4cabfe..d0359d955 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -3,5 +3,6 @@ def create_app(test_config=None): app = Flask(__name__) - + from .routes import solar_bp + app.register_blueprint(solar_bp) return app diff --git a/app/routes.py b/app/routes.py index 8e9dfe684..1c6e78236 100644 --- a/app/routes.py +++ b/app/routes.py @@ -1,2 +1,33 @@ -from flask import Blueprint +from flask import Blueprint, jsonify + +class Planet: + def __init__(self, name, id, description, color): + self.name = name + self.id = id + self.description = description + self.color = color + + +planets = [ + Planet("Earth", 3, "Earth is the 3rd planet in solar system", "blue"), + Planet("Mars", 4, "Mars is the 4th planet in solar system", "red"), + Planet("Jupiter", 5, "Jupiter is the 5th planet in solar system", "tan") +] + +# first string is flask blueprint name +# run in localhost need to add/planets at the end +solar_bp = Blueprint("", __name__, url_prefix="/planets") + + +@solar_bp.route("", methods=["GET"]) +def see_planets(): + all_planets = [] + for planet in planets: + all_planets.append( + {"Name": planet.name, + "ID": planet.id, + "Description": planet.description, + "Color": planet.color} + ) + return jsonify(all_planets), 200 diff --git a/project-directions/wave_01.md b/project-directions/wave_01.md index a141cd6e2..17b4229bc 100644 --- a/project-directions/wave_01.md +++ b/project-directions/wave_01.md @@ -1,12 +1,9 @@ # Wave 01: Setup and Read -## Flask Setup -Perform following setup steps for the Solar System API repo to get started on this Flask project: -1. Create a virtual environment and activate it -1. Install the dependencies -1. Define a `Planet` class with the attributes `id`, `name`, and `description`, and one additional attribute -1. Create a list of `Planet` instances + + + ## RESTful Endpoints: Read Create the following endpoint(s), with similar functionality presented in the Hello Books API: From fd60f2edf0c0a8d6e55d2bb4cdbe0a2e5ba8eb3d Mon Sep 17 00:00:00 2001 From: Poppy Meng Date: Sat, 23 Apr 2022 15:59:12 -0700 Subject: [PATCH 03/23] trial --- app/routes.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/routes.py b/app/routes.py index 1c6e78236..3d19946ea 100644 --- a/app/routes.py +++ b/app/routes.py @@ -31,3 +31,9 @@ def see_planets(): "Color": planet.color} ) return jsonify(all_planets), 200 + + + + + +Print("xjaeo aixa8xusxfnidux ip") From b3a981ffbdcabd5e81595358a9fe6615a2f09826 Mon Sep 17 00:00:00 2001 From: Danielle Date: Mon, 25 Apr 2022 11:51:52 -0700 Subject: [PATCH 04/23] Get one planet and add errors if not found or not valid --- app/routes.py | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/app/routes.py b/app/routes.py index 3d19946ea..d3c202aa5 100644 --- a/app/routes.py +++ b/app/routes.py @@ -1,4 +1,4 @@ -from flask import Blueprint, jsonify +from flask import Blueprint, jsonify, abort, make_response class Planet: @@ -7,7 +7,13 @@ def __init__(self, name, id, description, color): self.id = id self.description = description self.color = color - + + def to_json(self): + return {"Name": self.name, + "ID": self.id, + "Description": self.description, + "Color": self.color + } planets = [ Planet("Earth", 3, "Earth is the 3rd planet in solar system", "blue"), @@ -15,6 +21,15 @@ def __init__(self, name, id, description, color): Planet("Jupiter", 5, "Jupiter is the 5th planet in solar system", "tan") ] +def validate_planet(id): + try: + id = int(id) + except: + return abort(make_response({"message": f"planet {id} is invalid"}, 400)) + for planet in planets : + if planet.id == id: + return jsonify(planet.to_json()), 200 + return abort(make_response({"message": f"planet {id} is not found"}, 404)) # first string is flask blueprint name # run in localhost need to add/planets at the end solar_bp = Blueprint("", __name__, url_prefix="/planets") @@ -25,15 +40,20 @@ def see_planets(): all_planets = [] for planet in planets: all_planets.append( - {"Name": planet.name, - "ID": planet.id, - "Description": planet.description, - "Color": planet.color} + planet.to_json() ) return jsonify(all_planets), 200 +#Get one planet +@solar_bp.route("/", methods=["GET"]) +def read_one_planet(id): + planet_response = validate_planet(id) + return planet_response + + + + -Print("xjaeo aixa8xusxfnidux ip") From 421d3d192c2894537d307664e71ed74bb93460c1 Mon Sep 17 00:00:00 2001 From: Poppy Meng Date: Sun, 1 May 2022 13:20:45 -0700 Subject: [PATCH 05/23] slove migrate problem --- app/__init__.py | 15 +++ app/models/__init__.py | 0 app/models/planet.py | 7 ++ app/routes.py | 89 ++++++++++------- migrations/README | 1 + migrations/alembic.ini | 45 +++++++++ migrations/env.py | 96 +++++++++++++++++++ migrations/script.py.mako | 24 +++++ .../versions/a9e13cfaa413_adds_planet.py | 34 +++++++ 9 files changed, 278 insertions(+), 33 deletions(-) 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/a9e13cfaa413_adds_planet.py diff --git a/app/__init__.py b/app/__init__.py index d0359d955..6194c9570 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -1,8 +1,23 @@ 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_development' + + db.init_app(app) + migrate.init_app(app, db) + from app.models.planet import Planet + from .routes import solar_bp app.register_blueprint(solar_bp) + return app + 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..9482d5e6a --- /dev/null +++ b/app/models/planet.py @@ -0,0 +1,7 @@ +from app import db + +class Planet(db.Model): + id = db.Column(db.Integer, primary_key=True, autoincrement=True) + name = db.Column(db.String) + color = db.Column(db.String) + description=db.Column(db.String) diff --git a/app/routes.py b/app/routes.py index 3d19946ea..5a54bbd04 100644 --- a/app/routes.py +++ b/app/routes.py @@ -1,39 +1,62 @@ -from flask import Blueprint, jsonify +from flask import Blueprint, jsonify, request, make_response +from app import solar_system_development +from app.models.planet import Planet +# class Planet: +# def __init__(self, name, id, description, color): +# self.name = name +# self.id = id +# self.description = description +# self.color = color -class Planet: - def __init__(self, name, id, description, color): - self.name = name - self.id = id - self.description = description - self.color = color - -planets = [ - Planet("Earth", 3, "Earth is the 3rd planet in solar system", "blue"), - Planet("Mars", 4, "Mars is the 4th planet in solar system", "red"), - Planet("Jupiter", 5, "Jupiter is the 5th planet in solar system", "tan") -] +# planets = [ +# Planet("Earth", 3, "Earth is the 3rd planet in solar system", "blue"), +# Planet("Mars", 4, "Mars is the 4th planet in solar system", "red"), +# Planet("Jupiter", 5, "Jupiter is the 5th planet in solar system", "tan") +# ] # first string is flask blueprint name # run in localhost need to add/planets at the end -solar_bp = Blueprint("", __name__, url_prefix="/planets") - - -@solar_bp.route("", methods=["GET"]) -def see_planets(): - all_planets = [] - for planet in planets: - all_planets.append( - {"Name": planet.name, - "ID": planet.id, - "Description": planet.description, - "Color": planet.color} - ) - return jsonify(all_planets), 200 - - - - - -Print("xjaeo aixa8xusxfnidux ip") +solar_bp = Blueprint("planets", __name__, url_prefix="/planets") + +# @solar_bp.route("", methods=["GET"]) +# def see_planets(): +# all_planets = [] + # for planet in planets: + # all_planets.append( + # {"Name": planet.name, + # "ID": planet.id, + # "Description": planet.description, + # "Color": planet.color} + # ) + # return jsonify(all_planets), 200 + + +@solar_bp.route("", methods=["POST", "GET"]) +def handle_planets(): + if request.method== "POST": + request_body=request.get_json() + new_planet=Planet( + id=request_body["id"], + name=request_body["name"], + color=request_body["color"], + description=request_body["description"]) + + solar_system_development.session.add(new_planet) + solar_system_development.session.commit() + + return make_response(f"Planet {new_planet.name} successfully created", 201) + + elif request.method== "GET": + planets=Planet.query.all() + planets_response=[] + for planet in planets: + planets_response.append( + {"Name": planet.name, + "ID": planet.id, + "Description": planet.description, + "Color": planet.color}) + return jsonify(planets_response), 200 + + 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/a9e13cfaa413_adds_planet.py b/migrations/versions/a9e13cfaa413_adds_planet.py new file mode 100644 index 000000000..443443fbe --- /dev/null +++ b/migrations/versions/a9e13cfaa413_adds_planet.py @@ -0,0 +1,34 @@ +"""adds Planet + +Revision ID: a9e13cfaa413 +Revises: +Create Date: 2022-04-29 11:10:39.990080 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'a9e13cfaa413' +down_revision = None +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('planet', + sa.Column('id', sa.Integer(), autoincrement=True, nullable=False), + sa.Column('name', sa.String(), nullable=True), + sa.Column('color', sa.String(), nullable=True), + sa.Column('description', sa.String(), nullable=True), + sa.PrimaryKeyConstraint('id') + ) + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table('planet') + # ### end Alembic commands ### From b12b2801f71ea9cf52188e645c5a41df196a5d4d Mon Sep 17 00:00:00 2001 From: Danielle Date: Sun, 1 May 2022 13:25:38 -0700 Subject: [PATCH 06/23] Danielles changes --- app/__init__.py | 13 +++++++++++++ app/models/__init__.py | 0 app/models/planet.py | 14 ++++++++++++++ app/routes.py | 36 ++++++++++++++++++------------------ 4 files changed, 45 insertions(+), 18 deletions(-) create mode 100644 app/models/__init__.py create mode 100644 app/models/planet.py diff --git a/app/__init__.py b/app/__init__.py index d0359d955..aad53cbac 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -1,8 +1,21 @@ 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_development' + + db.init_app(app) + migrate.init_app(app, db) + + from app.models.planet import Planet + from .routes import solar_bp app.register_blueprint(solar_bp) return app 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..464d0fcbe --- /dev/null +++ b/app/models/planet.py @@ -0,0 +1,14 @@ +from app import db + +class Planet(db.Model): + id = db.Column(db.Integer, primary_key=True, autoincrement=True) + name = db.Column(db.String) + description = db.Column(db.String) + color = db.Column(db.String) + + def to_json(self): + return {"ID": self.id, + "Name": self.name, + "Description": self.description, + "Color": self.color + } \ No newline at end of file diff --git a/app/routes.py b/app/routes.py index d3c202aa5..af31301f5 100644 --- a/app/routes.py +++ b/app/routes.py @@ -1,25 +1,25 @@ from flask import Blueprint, jsonify, abort, make_response -class Planet: - def __init__(self, name, id, description, color): - self.name = name - self.id = id - self.description = description - self.color = color +# class Planet: +# def __init__(self, name, id, description, color): +# self.name = name +# self.id = id +# self.description = description +# self.color = color - def to_json(self): - return {"Name": self.name, - "ID": self.id, - "Description": self.description, - "Color": self.color - } - -planets = [ - Planet("Earth", 3, "Earth is the 3rd planet in solar system", "blue"), - Planet("Mars", 4, "Mars is the 4th planet in solar system", "red"), - Planet("Jupiter", 5, "Jupiter is the 5th planet in solar system", "tan") -] +# def to_json(self): +# return {"Name": self.name, +# "ID": self.id, +# "Description": self.description, +# "Color": self.color +# } + +# planets = [ +# Planet("Earth", 3, "Earth is the 3rd planet in solar system", "blue"), +# Planet("Mars", 4, "Mars is the 4th planet in solar system", "red"), +# Planet("Jupiter", 5, "Jupiter is the 5th planet in solar system", "tan") +# ] def validate_planet(id): try: From 89f97cc47f3dfe0fb4c8fa30acc3a99006539408 Mon Sep 17 00:00:00 2001 From: Poppy Meng Date: Sun, 1 May 2022 14:33:11 -0700 Subject: [PATCH 07/23] xxxx --- app/__init__.py | 1 - app/routes.py | 24 ++++++++++++------------ 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/app/__init__.py b/app/__init__.py index 6194c9570..66cddb813 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -5,7 +5,6 @@ db = SQLAlchemy() migrate = Migrate() - def create_app(test_config=None): app = Flask(__name__) diff --git a/app/routes.py b/app/routes.py index d7d907b80..c7e99678c 100644 --- a/app/routes.py +++ b/app/routes.py @@ -1,5 +1,5 @@ from flask import Blueprint, jsonify, request, make_response -from app import solar_system_development +from app import db from app.models.planet import Planet # class Planet: @@ -16,15 +16,15 @@ # Planet("Jupiter", 5, "Jupiter is the 5th planet in solar system", "tan") # ] -def validate_planet(id): - try: - id = int(id) - except: - return abort(make_response({"message": f"planet {id} is invalid"}, 400)) - for planet in planets : - if planet.id == id: - return jsonify(planet.to_json()), 200 - return abort(make_response({"message": f"planet {id} is not found"}, 404)) +# def validate_planet(id): +# try: +# id = int(id) +# except: +# return abort(make_response({"message": f"planet {id} is invalid"}, 400)) +# for planet in planets : +# if planet.id == id: +# return jsonify(planet.to_json()), 200 +# return abort(make_response({"message": f"planet {id} is not found"}, 404)) # first string is flask blueprint name # run in localhost need to add/planets at the end solar_bp = Blueprint("planets", __name__, url_prefix="/planets") @@ -52,8 +52,8 @@ def handle_planets(): color=request_body["color"], description=request_body["description"]) - solar_system_development.session.add(new_planet) - solar_system_development.session.commit() + db.session.add(new_planet) + db.session.commit() return make_response(f"Planet {new_planet.name} successfully created", 201) From 3954ff3df185b92a2ce9d89901190f279312424f Mon Sep 17 00:00:00 2001 From: Danielle Date: Sun, 1 May 2022 15:14:52 -0700 Subject: [PATCH 08/23] get Poppy's changes --- app/__init__.py | 15 +------ app/models/planet.py | 19 ++++----- app/routes.py | 96 +++++++------------------------------------- 3 files changed, 23 insertions(+), 107 deletions(-) diff --git a/app/__init__.py b/app/__init__.py index 99de0dd88..f09d57b5d 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -1,12 +1,7 @@ from flask import Flask from flask_sqlalchemy import SQLAlchemy from flask_migrate import Migrate -<<<<<<< HEAD -======= -db = SQLAlchemy() -migrate = Migrate() ->>>>>>> d5b0ed65df6c5d7d8c660d713c4c1da999dc4699 db = SQLAlchemy() migrate = Migrate() @@ -16,20 +11,12 @@ def create_app(test_config=None): app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql+psycopg2://postgres:postgres@localhost:5432/solar_system_development' -<<<<<<< HEAD db.init_app(app) migrate.init_app(app, db) - - from app.models.planet import Planet -======= - - db.init_app(app) - migrate.init_app(app, db) from app.models.planet import Planet - ->>>>>>> d5b0ed65df6c5d7d8c660d713c4c1da999dc4699 + from .routes import solar_bp app.register_blueprint(solar_bp) diff --git a/app/models/planet.py b/app/models/planet.py index b2cece45e..025d487bb 100644 --- a/app/models/planet.py +++ b/app/models/planet.py @@ -1,19 +1,14 @@ from app import db class Planet(db.Model): - id = db.Column(db.Integer, primary_key=True, autoincrement=True) + # id = db.Column(db.Integer, primary_key=True, autoincrement=True) name = db.Column(db.String) -<<<<<<< HEAD description = db.Column(db.String) color = db.Column(db.String) - def to_json(self): - return {"ID": self.id, - "Name": self.name, - "Description": self.description, - "Color": self.color - } -======= - color = db.Column(db.String) - description=db.Column(db.String) ->>>>>>> d5b0ed65df6c5d7d8c660d713c4c1da999dc4699 + # def to_json(self): + # return {"ID": self.id, + # "Name": self.name, + # "Description": self.description, + # "Color": self.color + # } diff --git a/app/routes.py b/app/routes.py index bb8dbd4a8..e74c67b7f 100644 --- a/app/routes.py +++ b/app/routes.py @@ -1,88 +1,22 @@ -from flask import Blueprint, jsonify, request, make_response -from app import solar_system_development -from app.models.planet import Planet - -# class Planet: -# def __init__(self, name, id, description, color): -# self.name = name -# self.id = id -# self.description = description -# self.color = color - -<<<<<<< HEAD -# class Planet: -# def __init__(self, name, id, description, color): -# self.name = name -# self.id = id -# self.description = description -# self.color = color - -# def to_json(self): -# return {"Name": self.name, -# "ID": self.id, -# "Description": self.description, -# "Color": self.color -# } +from flask import Blueprint, request, make_response +from app import db +from app.models.planet import Planet -======= ->>>>>>> d5b0ed65df6c5d7d8c660d713c4c1da999dc4699 -# planets = [ -# Planet("Earth", 3, "Earth is the 3rd planet in solar system", "blue"), -# Planet("Mars", 4, "Mars is the 4th planet in solar system", "red"), -# Planet("Jupiter", 5, "Jupiter is the 5th planet in solar system", "tan") -# ] -def validate_planet(id): - try: - id = int(id) - except: - return abort(make_response({"message": f"planet {id} is invalid"}, 400)) - for planet in planets : - if planet.id == id: - return jsonify(planet.to_json()), 200 - return abort(make_response({"message": f"planet {id} is not found"}, 404)) -# first string is flask blueprint name -# run in localhost need to add/planets at the end solar_bp = Blueprint("planets", __name__, url_prefix="/planets") -# @solar_bp.route("", methods=["GET"]) -# def see_planets(): -# all_planets = [] - # for planet in planets: - # all_planets.append( - # {"Name": planet.name, - # "ID": planet.id, - # "Description": planet.description, - # "Color": planet.color} - # ) - # return jsonify(all_planets), 200 - - -@solar_bp.route("", methods=["POST", "GET"]) -def handle_planets(): - if request.method== "POST": - request_body=request.get_json() - new_planet=Planet( - id=request_body["id"], - name=request_body["name"], - color=request_body["color"], - description=request_body["description"]) - - solar_system_development.session.add(new_planet) - solar_system_development.session.commit() - - return make_response(f"Planet {new_planet.name} successfully created", 201) +@solar_bp.route("", methods=["POST"]) +def create_planet(): + request_body = request.get_json() + new_planet = Planet(id = request_body['id'], + name = request_body['name'], + description = request_body['description'], + color = request_body['color'] + ) + + db.session.add(new_planet) + db.session.commit() - elif request.method== "GET": - planets=Planet.query.all() - planets_response=[] - for planet in planets: - planets_response.append( - {"Name": planet.name, - "ID": planet.id, - "Description": planet.description, - "Color": planet.color}) - return jsonify(planets_response), 200 + return make_response(f"Planet {new_planet.name} successfully created, 201") - From 61d71001a86ef66052ac412f7764c9080bdd0f7c Mon Sep 17 00:00:00 2001 From: Poppy Meng Date: Sun, 1 May 2022 20:36:11 -0700 Subject: [PATCH 09/23] poppy is debugging --- migrations/versions/c3c886daf020_debugging.py | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 migrations/versions/c3c886daf020_debugging.py diff --git a/migrations/versions/c3c886daf020_debugging.py b/migrations/versions/c3c886daf020_debugging.py new file mode 100644 index 000000000..f0c035d34 --- /dev/null +++ b/migrations/versions/c3c886daf020_debugging.py @@ -0,0 +1,34 @@ +"""debugging + +Revision ID: c3c886daf020 +Revises: a9e13cfaa413 +Create Date: 2022-05-01 20:22:48.382085 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'c3c886daf020' +down_revision = 'a9e13cfaa413' +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('planet', + sa.Column('id', sa.Integer(), autoincrement=True, nullable=False), + sa.Column('name', sa.String(), nullable=True), + sa.Column('description', sa.String(), nullable=True), + sa.Column('color', sa.String(), nullable=True), + sa.PrimaryKeyConstraint('id') + ) + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table('planet') + # ### end Alembic commands ### From 05712cd58d0f214fbb4920c673b1f33898c9d37f Mon Sep 17 00:00:00 2001 From: Danielle Date: Tue, 3 May 2022 10:53:51 -0700 Subject: [PATCH 10/23] Read one, update one, delete one Planet --- app/models/planet.py | 8 ++--- app/routes.py | 80 ++++++++++++++++++++++++++++++-------------- 2 files changed, 58 insertions(+), 30 deletions(-) diff --git a/app/models/planet.py b/app/models/planet.py index 2c12fe960..32ec51743 100644 --- a/app/models/planet.py +++ b/app/models/planet.py @@ -7,8 +7,8 @@ class Planet(db.Model): color = db.Column(db.String) def to_json(self): - return {"ID": self.id, - "Name": self.name, - "Description": self.description, - "Color": self.color + return {"id": self.id, + "name": self.name, + "description": self.description, + "color": self.color } diff --git a/app/routes.py b/app/routes.py index 42adbf077..4943448c6 100644 --- a/app/routes.py +++ b/app/routes.py @@ -1,34 +1,15 @@ -from flask import Blueprint, jsonify, request, make_response +from flask import Blueprint, jsonify, request, make_response, abort from app import db from app.models.planet import Planet - - -# planets = [ -# Planet("Earth", 3, "Earth is the 3rd planet in solar system", "blue"), -# Planet("Mars", 4, "Mars is the 4th planet in solar system", "red"), -# Planet("Jupiter", 5, "Jupiter is the 5th planet in solar system", "tan") -# ] - -# def validate_planet(id): -# try: -# id = int(id) -# except: -# return abort(make_response({"message": f"planet {id} is invalid"}, 400)) -# for planet in planets : -# if planet.id == id: -# return jsonify(planet.to_json()), 200 -# return abort(make_response({"message": f"planet {id} is not found"}, 404)) -# first string is flask blueprint name -# run in localhost need to add/planets at the end solar_bp = Blueprint("planets", __name__, url_prefix="/planets") +# GET ALL and POST planet @solar_bp.route("", methods=["POST", "GET"]) def handle_planets(): if request.method== "POST": request_body=request.get_json() new_planet=Planet( - id=request_body["id"], name=request_body["name"], color=request_body["color"], description=request_body["description"]) @@ -43,10 +24,57 @@ def handle_planets(): planets_response=[] for planet in planets: planets_response.append( - {"Name": planet.name, - "ID": planet.id, - "Description": planet.description, - "Color": planet.color}) + {"id": planet.id, + "name": planet.name, + "description": planet.description, + "color": planet.color}) return jsonify(planets_response), 200 - +# Validate if GET by Planet ID does not exist +def validate_planet(planet_id): + try: + planet_id = int(planet_id) + except: + abort(make_response({"message":f"planet {planet_id} invalid"}, 400)) + + planet = Planet.query.get(planet_id) + + if not planet: + abort(make_response({"message":f"planet {planet_id} not found"}, 404)) + + return planet + +# GET ONE Planet +@solar_bp.route("/", methods=["GET"]) +def read_one_planet(planet_id): + planet = validate_planet(planet_id) + return { + "id": planet.id, + "name": planet.name, + "description": planet.description, + "color": planet.color + } + +# UPDATE Planet +@solar_bp.route("/", methods=["PUT"]) +def update_planet(planet_id): + planet = validate_planet(planet_id) + request_body = request.get_json() + + planet.name = request_body["name"] + planet.description = request_body["description"] + planet.color = request_body["color"] + + db.session.commit() + + return make_response(f"Planet #{planet.id} successfully updated") + +# DELETE Planet +@solar_bp.route("/", methods=["DELETE"]) +def delete_planet(planet_id): + planet = validate_planet(planet_id) + + db.session.delete(planet) + db.session.commit() + + return make_response(f"Planet #{planet.id} successfully deleted") \ No newline at end of file From 3d227478efcd52c4d47a79afdd6160c0ad1e8c97 Mon Sep 17 00:00:00 2001 From: Poppy Meng Date: Wed, 4 May 2022 11:45:05 -0700 Subject: [PATCH 11/23] changes during class --- app/models/helper.py | 0 app/models/planet.py | 16 ++++++++++++++++ app/routes.py | 11 +++++++---- 3 files changed, 23 insertions(+), 4 deletions(-) create mode 100644 app/models/helper.py diff --git a/app/models/helper.py b/app/models/helper.py new file mode 100644 index 000000000..e69de29bb diff --git a/app/models/planet.py b/app/models/planet.py index 32ec51743..9d8c9e7cd 100644 --- a/app/models/planet.py +++ b/app/models/planet.py @@ -12,3 +12,19 @@ def to_json(self): "description": self.description, "color": self.color } + + def update(self, req_body): + + self.name = req_body["name"] + self.description = req_body["description"] + self.color = req_body["color"] + + @classmethod + def create(cls, req_body): + new_planet = cls( + name=req_body['name'], + description=req_body['description'] + color=req_body('color'] + ) + + return new_planet diff --git a/app/routes.py b/app/routes.py index 4943448c6..379e4e9ed 100644 --- a/app/routes.py +++ b/app/routes.py @@ -20,7 +20,11 @@ def handle_planets(): return make_response(f"Planet {new_planet.name} successfully created", 201) elif request.method== "GET": - planets=Planet.query.all() + name_query=request.args.get('name') + if name_query: + planets=Planet.query.filter_by(name=name_query) + else: + planets=Planet.query.all() planets_response=[] for planet in planets: planets_response.append( @@ -30,6 +34,7 @@ def handle_planets(): "color": planet.color}) return jsonify(planets_response), 200 + # Validate if GET by Planet ID does not exist def validate_planet(planet_id): try: @@ -61,9 +66,7 @@ def update_planet(planet_id): planet = validate_planet(planet_id) request_body = request.get_json() - planet.name = request_body["name"] - planet.description = request_body["description"] - planet.color = request_body["color"] + planet.update(request_body) db.session.commit() From 13a75e55f6bc7faa3dcf85fcacd55b24081029ed Mon Sep 17 00:00:00 2001 From: Poppy Meng Date: Wed, 4 May 2022 11:52:56 -0700 Subject: [PATCH 12/23] add helper file --- app/routes.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/app/routes.py b/app/routes.py index 379e4e9ed..cfe10aa8e 100644 --- a/app/routes.py +++ b/app/routes.py @@ -7,12 +7,10 @@ # GET ALL and POST planet @solar_bp.route("", methods=["POST", "GET"]) def handle_planets(): + #create a planet if request.method== "POST": request_body=request.get_json() - new_planet=Planet( - name=request_body["name"], - color=request_body["color"], - description=request_body["description"]) + new_planet=Planet.create(request_body) db.session.add(new_planet) db.session.commit() From f3c0e71d9fdc5df838f7772e6e856f6e2fd2095d Mon Sep 17 00:00:00 2001 From: Poppy Meng Date: Wed, 4 May 2022 14:07:57 -0700 Subject: [PATCH 13/23] wave 05 --- app/helper.py | 17 +++++++++++++++++ app/models/helper.py | 0 app/routes.py | 14 +------------- 3 files changed, 18 insertions(+), 13 deletions(-) create mode 100644 app/helper.py delete mode 100644 app/models/helper.py diff --git a/app/helper.py b/app/helper.py new file mode 100644 index 000000000..9b1afe93d --- /dev/null +++ b/app/helper.py @@ -0,0 +1,17 @@ +# Validate if GET by Planet ID does not exist +from flask import Blueprint, jsonify, request, make_response, abort +from app.models.planet import Planet + + +def validate_planet(planet_id): + try: + planet_id = int(planet_id) + except: + abort(make_response({"message": f"planet {planet_id} invalid"}, 400)) + + planet = Planet.query.get(planet_id) + + if not planet: + abort(make_response({"message": f"planet {planet_id} not found"}, 404)) + + return planet diff --git a/app/models/helper.py b/app/models/helper.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/app/routes.py b/app/routes.py index cfe10aa8e..d6bbeaaa4 100644 --- a/app/routes.py +++ b/app/routes.py @@ -1,7 +1,7 @@ from flask import Blueprint, jsonify, request, make_response, abort from app import db from app.models.planet import Planet - +from .helper import validate_planet solar_bp = Blueprint("planets", __name__, url_prefix="/planets") # GET ALL and POST planet @@ -33,19 +33,7 @@ def handle_planets(): return jsonify(planets_response), 200 -# Validate if GET by Planet ID does not exist -def validate_planet(planet_id): - try: - planet_id = int(planet_id) - except: - abort(make_response({"message":f"planet {planet_id} invalid"}, 400)) - - planet = Planet.query.get(planet_id) - - if not planet: - abort(make_response({"message":f"planet {planet_id} not found"}, 404)) - return planet # GET ONE Planet @solar_bp.route("/", methods=["GET"]) From 59893ad412ec719fe98ca073edc2de84c6514eec Mon Sep 17 00:00:00 2001 From: Danielle Date: Wed, 4 May 2022 14:15:22 -0700 Subject: [PATCH 14/23] Update planet model --- app/models/planet.py | 1 + 1 file changed, 1 insertion(+) diff --git a/app/models/planet.py b/app/models/planet.py index 32ec51743..92a540356 100644 --- a/app/models/planet.py +++ b/app/models/planet.py @@ -12,3 +12,4 @@ def to_json(self): "description": self.description, "color": self.color } + From f860662b4318f956e2c48e302f4d1b15dc245e02 Mon Sep 17 00:00:00 2001 From: Danielle Date: Wed, 4 May 2022 14:19:22 -0700 Subject: [PATCH 15/23] add methods to planet model --- app/models/planet.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/app/models/planet.py b/app/models/planet.py index acdfab419..9d8c9e7cd 100644 --- a/app/models/planet.py +++ b/app/models/planet.py @@ -13,8 +13,6 @@ def to_json(self): "color": self.color } -<<<<<<< HEAD -======= def update(self, req_body): self.name = req_body["name"] @@ -30,4 +28,3 @@ def create(cls, req_body): ) return new_planet ->>>>>>> f3c0e71d9fdc5df838f7772e6e856f6e2fd2095d From ab981c1563271e11936d298233eaab61c30efaf2 Mon Sep 17 00:00:00 2001 From: Danielle Date: Wed, 4 May 2022 16:50:06 -0700 Subject: [PATCH 16/23] fix error in planet method --- app/models/planet.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/models/planet.py b/app/models/planet.py index 9d8c9e7cd..de95476f5 100644 --- a/app/models/planet.py +++ b/app/models/planet.py @@ -23,8 +23,8 @@ def update(self, req_body): def create(cls, req_body): new_planet = cls( name=req_body['name'], - description=req_body['description'] - color=req_body('color'] + description=req_body['description'], + color=req_body['color'] ) return new_planet From 8b06e081762be2ca6aca15247b1af2fac34a6ff7 Mon Sep 17 00:00:00 2001 From: Danielle Date: Thu, 5 May 2022 10:59:27 -0700 Subject: [PATCH 17/23] add test routes and configure testing environment --- app/__init__.py | 10 +++++++++- app/tests/__init__.py | 0 app/tests/conftest.py | 25 +++++++++++++++++++++++++ app/tests/test_routes.py | 0 app/tests/touch | 0 5 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 app/tests/__init__.py create mode 100644 app/tests/conftest.py create mode 100644 app/tests/test_routes.py create mode 100644 app/tests/touch diff --git a/app/__init__.py b/app/__init__.py index 8194a3c9b..21d6f1228 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -1,15 +1,23 @@ 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_development' + if not test_config: + app.config['SQLALCHEMY_DATABASE_URI'] = os.environ.get("SQLALCHEMY_DATABASE_URI") + else: + app.config["TESTING"] = True + app.config["SQLALCHEMY_DATABASE_URI"] = os.environ.get( + "SQLALCHEMY_TEST_DATABASE_URI") db.init_app(app) migrate.init_app(app, db) diff --git a/app/tests/__init__.py b/app/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/app/tests/conftest.py b/app/tests/conftest.py new file mode 100644 index 000000000..ac8a4193b --- /dev/null +++ b/app/tests/conftest.py @@ -0,0 +1,25 @@ +import pytest +from app import create_app +from app import db +from flask.signals import request_finished + + +@pytest.fixture +def app(): + app = create_app({"TESTING": True}) + + @request_finished.connect_via(app) + def expire_session(sender, response, **extra): + db.session.remove() + + 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() \ No newline at end of file diff --git a/app/tests/test_routes.py b/app/tests/test_routes.py new file mode 100644 index 000000000..e69de29bb diff --git a/app/tests/touch b/app/tests/touch new file mode 100644 index 000000000..e69de29bb From 0b12bebc8f8d2c2d33cf2d6cad49b080d9a5bc3a Mon Sep 17 00:00:00 2001 From: Danielle Date: Thu, 5 May 2022 14:54:58 -0700 Subject: [PATCH 18/23] refactor and dry out HTTP methods --- app/routes.py | 21 ++++++--------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/app/routes.py b/app/routes.py index d6bbeaaa4..669067077 100644 --- a/app/routes.py +++ b/app/routes.py @@ -4,10 +4,10 @@ from .helper import validate_planet solar_bp = Blueprint("planets", __name__, url_prefix="/planets") -# GET ALL and POST planet +# GET and POST planets @solar_bp.route("", methods=["POST", "GET"]) def handle_planets(): - #create a planet + # Create a planet if request.method== "POST": request_body=request.get_json() new_planet=Planet.create(request_body) @@ -17,6 +17,7 @@ def handle_planets(): return make_response(f"Planet {new_planet.name} successfully created", 201) + # Get all planets, or filter by planet name elif request.method== "GET": name_query=request.args.get('name') if name_query: @@ -25,26 +26,16 @@ def handle_planets(): planets=Planet.query.all() planets_response=[] for planet in planets: - planets_response.append( - {"id": planet.id, - "name": planet.name, - "description": planet.description, - "color": planet.color}) - return jsonify(planets_response), 200 - + planets_response.append(planet.to_json()) + return jsonify(planets_response), 200 # GET ONE Planet @solar_bp.route("/", methods=["GET"]) def read_one_planet(planet_id): planet = validate_planet(planet_id) - return { - "id": planet.id, - "name": planet.name, - "description": planet.description, - "color": planet.color - } + return jsonify(planet.to_json()), 200 # UPDATE Planet @solar_bp.route("/", methods=["PUT"]) From 8c05d352acd22c53f18b5707f51352a70f43f874 Mon Sep 17 00:00:00 2001 From: Danielle Date: Thu, 5 May 2022 15:48:13 -0700 Subject: [PATCH 19/23] Add planet test data pytest fixture, complete all GET tests --- app/tests/conftest.py | 15 ++++++++++- app/tests/test_routes.py | 54 ++++++++++++++++++++++++++++++++++++++++ app/tests/touch | 0 3 files changed, 68 insertions(+), 1 deletion(-) delete mode 100644 app/tests/touch diff --git a/app/tests/conftest.py b/app/tests/conftest.py index ac8a4193b..bcf0db47d 100644 --- a/app/tests/conftest.py +++ b/app/tests/conftest.py @@ -1,7 +1,9 @@ + import pytest from app import create_app from app import db from flask.signals import request_finished +from app.models.planet import Planet @pytest.fixture @@ -22,4 +24,15 @@ def expire_session(sender, response, **extra): @pytest.fixture def client(app): - return app.test_client() \ No newline at end of file + return app.test_client() + +@pytest.fixture +def two_saved_planets(app): + planet_pluto = Planet(name="Pluto", + description="nobody loves me :(", + color="blue") + planet_sun = Planet(name="Sun", + description="im hot as heck son", + color="fiery red") + db.session.add_all([planet_pluto, planet_sun]) + db.session.commit() diff --git a/app/tests/test_routes.py b/app/tests/test_routes.py index e69de29bb..ab124b3cd 100644 --- a/app/tests/test_routes.py +++ b/app/tests/test_routes.py @@ -0,0 +1,54 @@ + +def test_get_all_planets_with_no_records(client): + # Act + response = client.get("/planets") + response_body = response.get_json() + + # Assert + assert response.status_code == 200 + assert response_body == [] + +def test_get_all_planets(client, two_saved_planets): + # Act + response = client.get("/planets") + response_body = response.get_json() + + # Assert + assert response.status_code == 200 + assert response_body == [ + { + "id": 1, + "name": "Pluto", + "description": "nobody loves me :(", + "color": "blue" + }, + { + "id": 2, + "name": "Sun", + "description": "im hot as heck son", + "color": "fiery red" + } + ] + +def test_get_one_planet(client, two_saved_planets): + # Act + response = client.get("/planets/1") + response_body = response.get_json() + + # Assert + assert response.status_code == 200 + assert response_body == { + "id": 1, + "name": "Pluto", + "description": "nobody loves me :(", + "color": "blue" + } + +def test_get_one_planet_with_no_records(client): + # Act + response = client.get("/planets/1") + response_body = response.get_json() + + # Assert + assert response.status_code == 404 + assert response_body == {"message": "planet 1 not found"} \ No newline at end of file diff --git a/app/tests/touch b/app/tests/touch deleted file mode 100644 index e69de29bb..000000000 From c2c8c5235e78401b17d3e787b2c549f0f37dd442 Mon Sep 17 00:00:00 2001 From: Poppy Meng Date: Fri, 6 May 2022 01:06:33 -0700 Subject: [PATCH 20/23] Co-authored-by: wreckbeck --- app/routes.py | 2 +- app/tests/test_routes.py | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/app/routes.py b/app/routes.py index 669067077..a6dee9353 100644 --- a/app/routes.py +++ b/app/routes.py @@ -15,7 +15,7 @@ def handle_planets(): db.session.add(new_planet) db.session.commit() - return make_response(f"Planet {new_planet.name} successfully created", 201) + return make_response(jsonify(f"Planet {new_planet.name} successfully created"), 201) # Get all planets, or filter by planet name elif request.method== "GET": diff --git a/app/tests/test_routes.py b/app/tests/test_routes.py index ab124b3cd..c434c8e13 100644 --- a/app/tests/test_routes.py +++ b/app/tests/test_routes.py @@ -51,4 +51,18 @@ def test_get_one_planet_with_no_records(client): # Assert assert response.status_code == 404 - assert response_body == {"message": "planet 1 not found"} \ No newline at end of file + assert response_body == {"message": "planet 1 not found"} + + +def test_create_one_planet(client): + # Act + response = client.post("/planets", json={ + "name": "Mars", + "description": "Is Bruno Mars counted as Mars?", + "color": "orange" + }) + response_body = response.get_json() + + # Assert + assert response.status_code == 201 + assert response_body == "Book New Book successfully created" From 739dfc67ddab46379ae4264dca69de0151303cb9 Mon Sep 17 00:00:00 2001 From: Danielle Date: Fri, 6 May 2022 08:31:23 -0700 Subject: [PATCH 21/23] Update POST planets test response body --- app/tests/test_routes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/tests/test_routes.py b/app/tests/test_routes.py index c434c8e13..d1cb4e0b3 100644 --- a/app/tests/test_routes.py +++ b/app/tests/test_routes.py @@ -65,4 +65,4 @@ def test_create_one_planet(client): # Assert assert response.status_code == 201 - assert response_body == "Book New Book successfully created" + assert response_body == "Planet Mars successfully created" From c34fea3f0cbe30f60075248d22222e03cf0bef15 Mon Sep 17 00:00:00 2001 From: Danielle Date: Tue, 10 May 2022 11:03:07 -0700 Subject: [PATCH 22/23] Add moon model and update planet model with reference to moons --- app/models/moons.py | 10 ++++++++++ app/models/planet.py | 1 + 2 files changed, 11 insertions(+) create mode 100644 app/models/moons.py diff --git a/app/models/moons.py b/app/models/moons.py new file mode 100644 index 000000000..551f87d68 --- /dev/null +++ b/app/models/moons.py @@ -0,0 +1,10 @@ +from ctypes import sizeof +from app import db + +class Moon(db.Model): + id = db.Column(db.Integer, primary_key=True, autoincrement=True) + size = db.Column(db.String) + description = db.Column(db.String) + color = db.Column(db.String) + planet_id = db.Column(db.Integer, db.ForeignKey('planet.id')) + planet = db.relationship("Planet", back_populates="moons") \ No newline at end of file diff --git a/app/models/planet.py b/app/models/planet.py index de95476f5..405511a2b 100644 --- a/app/models/planet.py +++ b/app/models/planet.py @@ -5,6 +5,7 @@ class Planet(db.Model): name = db.Column(db.String) description = db.Column(db.String) color = db.Column(db.String) + moons = db.relationship("Moon", back_populates="planet") def to_json(self): return {"id": self.id, From b01f8d86681213db96606a6a4afaf3c4fb65f190 Mon Sep 17 00:00:00 2001 From: Poppy Meng Date: Wed, 11 May 2022 10:32:51 -0700 Subject: [PATCH 23/23] deploy --- Procfile | 1 + app/routes.py | 1 + requirements.txt | 8 ++++++++ 3 files changed, 10 insertions(+) create mode 100644 Procfile diff --git a/Procfile b/Procfile new file mode 100644 index 000000000..066ed31d9 --- /dev/null +++ b/Procfile @@ -0,0 +1 @@ +web: gunicorn 'app:create_app()' diff --git a/app/routes.py b/app/routes.py index a6dee9353..b844ea6ac 100644 --- a/app/routes.py +++ b/app/routes.py @@ -2,6 +2,7 @@ from app import db from app.models.planet import Planet from .helper import validate_planet + solar_bp = Blueprint("planets", __name__, url_prefix="/planets") # GET and POST planets diff --git a/requirements.txt b/requirements.txt index a506b4d12..37b7c1d29 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,19 +1,27 @@ alembic==1.5.4 +attrs==21.4.0 autopep8==1.5.5 blinker==1.4 certifi==2020.12.5 chardet==4.0.0 click==7.1.2 +coverage==6.3.2 Flask==1.1.2 Flask-Migrate==2.6.0 Flask-SQLAlchemy==2.4.4 +gunicorn==20.1.0 idna==2.10 +iniconfig==1.1.1 itsdangerous==1.1.0 Jinja2==2.11.3 Mako==1.1.4 MarkupSafe==1.1.1 +packaging==21.3 +pluggy==0.13.1 psycopg2-binary==2.8.6 +py==1.11.0 pycodestyle==2.6.0 +pyparsing==3.0.8 pytest==6.2.3 pytest-cov==2.12.1 python-dateutil==2.8.1