Skip to content
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

Snow Leopards - Geiselle H. and Justina L. #21

Open
wants to merge 15 commits into
base: main
Choose a base branch
from

Conversation

justinakliu
Copy link

No description provided.

Copy link

@anselrognlie anselrognlie left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Waves 1 and 2 look great! Just a couple of suggestions for going forward.

app/__init__.py Outdated
@@ -4,4 +4,7 @@
def create_app(test_config=None):
app = Flask(__name__)

from .routes import bp
app.register_blueprint(bp)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

app/routes.py Outdated
self.description = description
self.moons = moons

def to_planet_dict(self):

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👀 The live code showed using a name like to_cat_dict, so I can see why you used to_planet_dict here. But it will be more useful going forward to all this simply to_dict going forward. If we have multiple models in our application, we like to have a method with a standardized name across all of them for converting them into a dictionary.

Consider the __str__ method that we overrode in Swap Meet. Each item subclass didn't have a differently name version of __str__ (e.g., __electronics_str__). They had a method with the same name so they could all be treated similarly.

So I'd suggest renaming this to to_dict and leave the type information to be implied by the instance we're calling this on. Most likely, the planet we're working with would be stored in a variable called planet. So with the current name, we end up writing planet.to_planet_dict(), which feels a little redundant. If we rename this to to_dict, it would become simply planet.to_dict().

app/routes.py Outdated
self.moons = moons

def to_planet_dict(self):
return dict(

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍 I like the dict() method for creating new dictionaries as well, since I can leave the quotes off the keys!

app/routes.py Outdated
Planet(3, "Earth", "where we live", 1)
]

def validate_planet(planet_id):

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

app/routes.py Outdated

abort(make_response({"message":f"planet {planet_id} not found"}, 404))

bp = Blueprint("planets", __name__, url_prefix = "/planets")

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

app/routes.py Outdated
Comment on lines 42 to 45
results_list = []

for planet in planets:
results_list.append(planet.to_planet_dict())

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👀 List comprehension opportunity here

app/routes.py Outdated
return jsonify(results_list)

@bp.route("/<planet_id>", methods=["GET"])
def handle_one_planet(planet_id):

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The Learn modules show naming the id matching part of the route with a model prefix. This can be helpful to distinguish among multiple ids in the route if we're working with nested routes.

When there's only a single id parameter in our route, we typically call it simply id as was done in the live code.

Copy link

@anselrognlie anselrognlie left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍 Keep it up for Task List API!


from .routes import planet
from .routes import fictional_caretaker
app.register_blueprint(planet.bp)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

@@ -0,0 +1,16 @@
from app import db

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why "fictional" caretaker? You mean your planets don't have real caretakers? 🙂

Remember that we prefer to have a file containing a class definition to match the name of the class (allowing for differences in capitalization).

db.session.add(new_caretaker)
db.session.commit()

return make_response(f"Caretaker {new_caretaker.name} successfully created", 201)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👀 Make sure to jsonify even plain string responses, otherwise flask will return an HTML response rather than JSON.



@bp.route("/<caretaker_id>/planets", methods=["GET"])
def read_one_planet(caretaker_id):

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

maybe call this get_caretaker_planets?

@@ -0,0 +1,14 @@
from flask import abort, make_response

def validate_model(cls, model_id):

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍 Nice job on the reafactor, and moving it out of the original routes file.


planet_query = Planet.query

if name_query:

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍 Nice multi-value filtering!

Comment on lines +54 to +56
planet.name = request_body["name"]
planet.description = request_body["description"]
planet.moons = request_body["moons"]

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In the same way we made from_dict to centralize knowledge about the needed keys in the model itself, we could add a method like update_from_dict to apply updated values to an instance from a dictionary.

@@ -0,0 +1,36 @@
"""added fictional caretaker

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice to see that you went through a few migrations. Keep in mind that once you've gotten your "final" table layour squared away that it can be helpful to clear out all th old migrations, recreate the empty database, and get 1 nice, clean migration. Not something we'd want to do after having real data in a production database, but it's nice to start without migration clutter.

return app.test_client()

@pytest.fixture
def one_saved_planet(app):

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We would also want fixtures for the caretakers if there had been more time.

response_body = response.get_data(as_text=True)
#Assert
assert response.status_code == 201
assert response_body == "Planet Mars successfully created"

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It would be a good idea to follow this up with a get call to confirm that the planet actually got stored in the database.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants