forked from AdaGold/solar-system-api
-
Notifications
You must be signed in to change notification settings - Fork 36
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Cedar - Jacy & Kit #15
Open
jacyyang04
wants to merge
38
commits into
Ada-C16:main
Choose a base branch
from
jacyyang04:main
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from all commits
Commits
Show all changes
38 commits
Select commit
Hold shift + click to select a range
c5a9bfc
Adds class Planet to routes.py
KitSutliff eb71eb6
Add get all functions and registers blueprint class
KitSutliff 3d7bffd
Adds get_planet function to routes.py
KitSutliff 9cf827e
debug adds missing carrots to routes.py
KitSutliff 39c4dd7
fixed bug in routes.py; changed planet_id to planet in get_planet fun…
jacyyang04 6d98074
add comment about local host url
jacyyang04 b42cc8f
add to_json instance method and removed var(planet)
jacyyang04 0b775b2
delete spacing
jacyyang04 45c7886
replaces planet class in app with planet model in app.models.
KitSutliff a29a3af
moves models folder from pycache to app under SOLAR-SYSTEM-API.
KitSutliff 9a0acd4
updates planet.py class in models to do stuff better... like.. with t…
KitSutliff 3c2ff79
we migrated models and updated routes.
KitSutliff 54be1bb
updates routes to fix bug
KitSutliff 7884f06
changed query.all to query.get for get_planet function
jacyyang04 7d7a32f
made request_body local var
jacyyang04 2628ed7
minor space changes
jacyyang04 c737a22
Adds 'update' and 'delete' methods to routes.py
KitSutliff f1e3085
Started refactoring source code
jacyyang04 c673c70
add 404 error code
jacyyang04 778f1ef
refactor all functions
jacyyang04 7caf8d2
update function names
jacyyang04 08d0db3
add error codes for return statements
jacyyang04 9bd9398
add query search routes
jacyyang04 45f4ace
add purge
jacyyang04 edf2bfc
fix bugs in create_planets function
jacyyang04 351d71d
update create_planets function
jacyyang04 8aafbfb
set up environmental vars
jacyyang04 42e0d2c
set up test files
jacyyang04 19ece10
add test routes
jacyyang04 54abab4
update
jacyyang04 49302c3
fix test bugs
jacyyang04 67b3bf4
fix test bugs, update return statement
jacyyang04 9af523e
change error code
jacyyang04 663d89a
finalized comments
jacyyang04 8b5fa84
add procfile
jacyyang04 b54163c
add gunicorn to requirements.txt
jacyyang04 ca7eb00
adds Procfile
KitSutliff 2e2e587
actually adds Procfile, but for real this time
KitSutliff File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
web: gunicorn 'app:create_app()' |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,7 +1,31 @@ | ||
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 | ||
|
||
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) | ||
|
||
#import models | ||
from app.models.planet import Planet | ||
|
||
from .routes import planets_bp | ||
app.register_blueprint(planets_bp) | ||
|
||
return app |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
#"we don't need to do anything" - jacy |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
from app import db | ||
#"This is where we CREATE OUR PLANET! (class)" | ||
|
||
class Planet(db.Model): | ||
id = db.Column(db.Integer, primary_key=True, autoincrement=True) | ||
name = db.Column(db.String) | ||
description = db.Column(db.String) | ||
xenomorphs = db.Column(db.Boolean, default=False) | ||
|
||
def to_json(self): | ||
json_dict = { | ||
"id": self.id, | ||
"name": self.name, | ||
"description": self.description, | ||
"xenomorphs": self.xenomorphs | ||
} | ||
return json_dict |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,97 @@ | ||
from flask import Blueprint | ||
|
||
from flask import Blueprint, jsonify, make_response, request, abort | ||
from app.models.planet import Planet | ||
from app import db | ||
|
||
|
||
# Global Vars | ||
planets_bp = Blueprint("planets_bp", __name__, url_prefix="/planets") | ||
|
||
|
||
# Helper Functions | ||
def get_planet(planet_id): | ||
"""Get planet by planet_id or return 404""" | ||
return Planet.query.get_or_404(planet_id, description="Planet does not exist.") | ||
|
||
|
||
# Routes | ||
@planets_bp.route("", methods=["POST"]) | ||
def create_planets(): | ||
"""Create new planet in database.""" | ||
request_body = request.get_json() | ||
|
||
if request_body is None: | ||
return make_response("Invalid Request", 400) | ||
|
||
if "name" not in request_body or "description" not in request_body or "xenomorphs" not in request_body: | ||
return make_response("Invalid Request", 400) | ||
|
||
new_planet = Planet( | ||
name=request_body['name'], | ||
description=request_body['description'], | ||
xenomorphs=request_body['xenomorphs'] | ||
) | ||
|
||
# add and commit new_planet to database | ||
db.session.add(new_planet) | ||
db.session.commit() | ||
|
||
return make_response(f"Your planet, {new_planet.name}, has been created.", 201) | ||
|
||
|
||
@planets_bp.route("", methods=["GET"]) | ||
def read_all_planets(): | ||
"""Get all planets or get planets with query params""" | ||
name_query = request.args.get("name") | ||
xenomorphs_query = request.args.get("xenomorphs") | ||
|
||
##---partial functionality; would like to discuss---## | ||
if name_query: | ||
planets = Planet.query.filter_by(name=name_query) | ||
elif xenomorphs_query: | ||
planets = Planet.query.filter_by(xenomorphs=xenomorphs_query) | ||
##---END---## | ||
Comment on lines
+48
to
+53
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This might be helpful to look at: https://stackoverflow.com/questions/19699756/flask-sqlalchemy-greater-than-or-equal-to |
||
else: | ||
planets = Planet.query.all() | ||
|
||
planets_response = [] | ||
|
||
for planet in planets: | ||
planets_response.append(planet.to_json()) | ||
|
||
return jsonify(planets_response) | ||
|
||
|
||
@planets_bp.route("/<planet_id>", methods=["GET"]) | ||
def read_a_planet(planet_id): | ||
"""Get planet with planet_id""" | ||
planet = get_planet(planet_id) | ||
return planet.to_json() | ||
|
||
@planets_bp.route("/<planet_id>", methods=["PATCH"]) | ||
def update_a_planet(planet_id): | ||
"""Update data for planet with planet_id in database""" | ||
request_body = request.get_json() | ||
planet = get_planet(planet_id) | ||
|
||
if "id" in request_body: | ||
planet.id = request_body["id"] | ||
if "name" in request_body: | ||
planet.name = request_body["name"] | ||
if "description" in request_body: | ||
planet.description = request_body["description"] | ||
if "xenomorphs" in request_body: | ||
planet.xenomorphs = request_body["xenomorphs"] | ||
|
||
db.session.commit() | ||
return make_response(f"Planet {planet.id} has been updated.", 201) | ||
|
||
|
||
@planets_bp.route("/<planet_id>", methods=["DELETE"]) | ||
def delete_a_planet(planet_id): | ||
"""Delete planet with planet_id in database""" | ||
planet = get_planet(planet_id) | ||
|
||
db.session.delete(planet) | ||
db.session.commit() | ||
return make_response(f"Planet #{planet_id} successfully destroyed.", 200) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
Generic single-database configuration. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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"} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
"""adds planet model | ||
|
||
Revision ID: c888984465f3 | ||
Revises: | ||
Create Date: 2021-10-25 14:35:56.579309 | ||
|
||
""" | ||
from alembic import op | ||
import sqlalchemy as sa | ||
|
||
|
||
# revision identifiers, used by Alembic. | ||
revision = 'c888984465f3' | ||
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('description', sa.String(), nullable=True), | ||
sa.Column('xenomorphs', sa.Boolean(), nullable=True), | ||
sa.PrimaryKeyConstraint('id') | ||
) | ||
# ### end Alembic commands ### | ||
|
||
|
||
def downgrade(): | ||
# ### commands auto generated by Alembic - please adjust! ### | ||
op.drop_table('planet') | ||
# ### end Alembic commands ### |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Empty file.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Oh no!