-
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
Spruce - Reid and Asha #20
base: main
Are you sure you want to change the base?
Conversation
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.
Great work Reid and Asha! My primary feedback focuses on helper methods and refactoring.
from .routes import planets_bp | ||
app.register_blueprint(planets_bp) | ||
|
||
from app.models.planet import Planet |
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.
The blueprints already import the models so we don't actually need the model import in this file anymore.
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) |
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.
Careful! Using the class as it currently is, we'd be able to make a planet with a null
name, description, and color. When making classes in the future, consider which columns are required (non-nullable).
planets_response = [] | ||
for planet in planets: | ||
planets_response.append( | ||
{ | ||
"id": planet.id, | ||
"name": planet.name, | ||
"description": planet.description, | ||
"color": planet.color | ||
} | ||
) |
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.
We could reduce these lines of code using a helper method to turn the planet object into a dictionary in the Planets class:
planets_response = [] | |
for planet in planets: | |
planets_response.append( | |
{ | |
"id": planet.id, | |
"name": planet.name, | |
"description": planet.description, | |
"color": planet.color | |
} | |
) | |
planets_response = [] | |
for planet in planets: | |
planets_response.append(planet.to_dict()) |
And further refactor using a list comprehension :D
planets_response = [] | |
for planet in planets: | |
planets_response.append( | |
{ | |
"id": planet.id, | |
"name": planet.name, | |
"description": planet.description, | |
"color": planet.color | |
} | |
) | |
planets_response = [ planets_response.append(planet.to_dict()) for planet in planets ] | |
elif request.method == "POST": | ||
request_body = request.get_json() | ||
new_planet = Planet(name=request_body["name"], | ||
description=request_body["description"], | ||
color=request_body["color"] | ||
) |
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.
We should check if request_body
contains falsy values so that a planet isn't created with empty data!
new_planet_response = { | ||
"id": new_planet.id, | ||
"name": new_planet.name, | ||
"description": new_planet.description, | ||
"color": new_planet.color | ||
} | ||
|
||
return jsonify(new_planet_response), 201 |
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.
*** repeats broken record about the Planet dictionary helper method ***
"description": planet.description, | ||
"color": planet.color | ||
}, 200 #testing this | ||
elif request.method == "PUT": |
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.
👍
|
||
return jsonify(f"Planet #{planet.id} successfully updated"), 200 | ||
|
||
elif request.method == "DELETE": |
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.
👍
return jsonify(new_planet_response), 201 | ||
|
||
|
||
@planets_bp.route("/<planet_id>", methods=["GET", "PUT", "DELETE"]) |
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.
Consider separating each request method into its different functions. This makes testing the endpoints much easier to do and follows the single responsibility principle.
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.
The same can be said about the "/planets"
endpoint for GET and POST.
saturn_planet = Planet(name="Saturn", description="Has some rings", color="yellow-brown") | ||
|
||
db.session.add_all([mars_planet, earth_planet, saturn_planet]) | ||
db.session.commit() |
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.
Consider returning [mars_planet, earth_planet, saturn_planet] after this line, so that tests can make use of the attributes of the records (like the id or name of planet)
assert response.status_code == 201 | ||
assert response_body == {"id" : 1, "name" : "Post", "description" :"Posty", "color" : "Postingggg"} |
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.
Great work! In Hello Books, etc. we've typically returned a short message containing the id
of the newly added record. What y'all did (returning the actual record in JSON form) is so much more helpful for tests.
Optionally, we could perform a Planet.query.get
call to retrieve the record from the database to confirm that it was actually added.
No description provided.