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

Major API refactoring #25

Merged
merged 9 commits into from
Sep 15, 2024
Merged

Major API refactoring #25

merged 9 commits into from
Sep 15, 2024

Conversation

GabrielBarberini
Copy link
Collaborator

@GabrielBarberini GabrielBarberini commented Sep 11, 2024

  • provide service layer to remove rocketpy lib interfacing from controllers
  • introduce database connection pools
  • migrate from jsonpickle to dill binaries
  • fix summary routes
  • start using mongoDB ObjectID instead of custom id hashs
  • instrument app with Open telemetry
  • Closes [BUG] Unable to generate simulations #21

Summary by CodeRabbit

Summary by CodeRabbit

  • New Features

    • Introduced a new Makefile for streamlined code formatting, linting, and Docker management.
    • Added new attributes and classes in data models for better representation of rocket components, including AirBrakes and FinsKinds.
    • Introduced RocketService and FlightService classes for enhanced management of rocket and flight data within the simulation framework.
    • Enhanced FlightSummary and MotorSummary classes with additional attributes for detailed data representation.
  • Bug Fixes

    • Improved validation mechanisms for parachute triggers and component configurations.
  • Documentation

    • Updated documentation to reflect new model attributes and service functionalities.
  • Refactor

    • Restructured data models to allow for mutable instances and clearer component definitions.

This comment was marked as spam.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 5

Outside diff range, codebase verification and nitpick comments (1)
lib/views/flight.py (1)

8-156: LGTM, but consider improving type hints and addressing TODO comments.

The FlightSummary class combines functionalities from RocketSummary and EnvSummary, which promotes a modular design. The numerous optional attributes provide flexibility in representing flight data. The code changes are approved.

However, consider the following improvements:

  • Replace Any type hints with more specific types where possible to enhance type safety and readability.
  • Address the TODO comments to improve the functionality of the class, such as implementing the mentioned summary routes and handling the Callable case for Any type hints.
Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between 49a629b and 6015453.

Files ignored due to path filters (2)
  • lib/data/calisto/powerOffDragCurve.csv is excluded by !**/*.csv
  • lib/data/calisto/powerOnDragCurve.csv is excluded by !**/*.csv
Files selected for processing (35)
  • Dockerfile (2 hunks)
  • README.md (6 hunks)
  • lib/init.py (1 hunks)
  • lib/main.py (1 hunks)
  • lib/api.py (3 hunks)
  • lib/controllers/environment.py (13 hunks)
  • lib/controllers/flight.py (16 hunks)
  • lib/controllers/motor.py (13 hunks)
  • lib/controllers/rocket.py (14 hunks)
  • lib/models/aerosurfaces.py (1 hunks)
  • lib/models/environment.py (2 hunks)
  • lib/models/flight.py (1 hunks)
  • lib/models/motor.py (1 hunks)
  • lib/models/rocket.py (1 hunks)
  • lib/repositories/environment.py (5 hunks)
  • lib/repositories/flight.py (5 hunks)
  • lib/repositories/motor.py (5 hunks)
  • lib/repositories/repo.py (3 hunks)
  • lib/repositories/rocket.py (4 hunks)
  • lib/routes/environment.py (2 hunks)
  • lib/routes/flight.py (5 hunks)
  • lib/routes/motor.py (3 hunks)
  • lib/routes/rocket.py (4 hunks)
  • lib/services/environment.py (1 hunks)
  • lib/services/flight.py (1 hunks)
  • lib/services/motor.py (1 hunks)
  • lib/services/rocket.py (1 hunks)
  • lib/settings/gunicorn.py (1 hunks)
  • lib/utils.py (1 hunks)
  • lib/views/environment.py (2 hunks)
  • lib/views/flight.py (2 hunks)
  • lib/views/motor.py (2 hunks)
  • lib/views/rocket.py (2 hunks)
  • pyproject.toml (2 hunks)
  • requirements.txt (1 hunks)
Files skipped from review due to trivial changes (1)
  • lib/main.py
Additional context used
Ruff
lib/__init__.py

28-28: lib.api.app imported but unused; consider removing, adding to __all__, or using a redundant alias

(F401)

lib/services/rocket.py

243-243: Within an except clause, raise exceptions with raise ... from err or raise ... from None to distinguish them from errors in exception handling

(B904)


271-273: Within an except clause, raise exceptions with raise ... from err or raise ... from None to distinguish them from errors in exception handling

(B904)

Additional comments not posted (139)
requirements.txt (3)

2-2: LGTM!

The addition of the dill package aligns with the PR objective of migrating from jsonpickle to dill binaries for serialization. It's a reasonable change.


5-5: LGTM!

Specifying the exact version of pydantic helps ensure compatibility and reproducibility across different environments. It's a good practice.


13-13: Please provide more context on the added packages.

The addition of opentelemetry.instrumentation.requests and tenacity suggests an expansion of the project's capabilities, possibly for enhanced observability and retry mechanisms.

However, more information is needed to determine if these packages are necessary and how they will be utilized in the codebase.

Could you please provide more context on the purpose and planned usage of these packages?

Also applies to: 16-16

lib/models/flight.py (2)

6-6: Justify the decision to make Flight instances mutable.

The removal of the frozen=True parameter from the Flight class is a significant change that affects the immutability of Flight instances. It allows for modifications to instance attributes after creation, which could lead to unintended consequences and make the code more error-prone.

Please provide a justification for making Flight instances mutable. What are the specific use cases that require this change?

Also, consider the potential risks and ensure that appropriate safeguards are in place to prevent unintended modifications to Flight instances throughout the codebase.


Line range hint 6-12: Clarify the handling of unique identifiers for Flight instances.

The removal of the flight_id property method eliminates the built-in way to retrieve a unique identifier for Flight instances. This could impact functionality that relies on unique identifiers for tracking, comparison, or other purposes.

Please clarify how unique identifiers for Flight instances will be handled after removing the flight_id property. Are there alternative mechanisms in place to generate and manage unique identifiers for Flight instances?

Ensure that the removal of this property does not break any existing functionality that depends on unique identifiers.

lib/models/environment.py (2)

6-6: Justify the decision to make Env instances mutable.

The removal of the frozen=True parameter from the Env class is a significant change that affects the immutability of Env instances. It allows for modifications to instance attributes after creation, which could lead to unintended consequences and make the code more error-prone.

Please provide a justification for making Env instances mutable. What are the specific use cases that require this change?

Also, consider the potential risks and ensure that appropriate safeguards are in place to prevent unintended modifications to Env instances throughout the codebase.


Line range hint 6-17: Clarify the handling of unique identifiers for Env instances.

The removal of the env_id property method eliminates the built-in way to retrieve a unique identifier for Env instances. This could impact functionality that relies on unique identifiers for tracking, comparison, or other purposes.

Please clarify how unique identifiers for Env instances will be handled after removing the env_id property. Are there alternative mechanisms in place to generate and manage unique identifiers for Env instances?

Ensure that the removal of this property does not break any existing functionality that depends on unique identifiers.

lib/settings/gunicorn.py (1)

10-10: LGTM!

The service version update from "1.2.0" to "2.0.0" is approved.

Dockerfile (2)

1-1: LGTM!

The Python version upgrade from 3.11 to 3.12.5 is approved.


19-19: Verify if the timeout increase aligns with the application's requirements.

The timeout parameter has been increased from 30 to 35 seconds. While this change allows for longer processing times, it's important to ensure that it aligns with the expected response times of the application.

Please confirm that the increased timeout value is suitable for the application's workload and does not introduce any unintended consequences.

lib/__init__.py (1)

25-25: LGTM!

The change in the error message format is approved.

lib/models/aerosurfaces.py (4)

5-9: LGTM!

The changes to the RailButtons class are approved:

  • Removing frozen=True to allow mutable instances.
  • Adding the name attribute to enhance the descriptive capabilities.

12-18: LGTM!

The changes to the NoseCone class are approved:

  • Removing frozen=True to allow mutable instances.
  • Adding the name attribute to enhance the descriptive capabilities.
  • Removing the default values to require explicit values upon instantiation.

21-23: LGTM!

The addition of the FinsKinds class is approved. It introduces a more structured way to categorize fins, enhancing the model's functionality.


26-36: LGTM!

The changes to the Fins class are approved:

  • Removing frozen=True to allow mutable instances.
  • Adding the name attribute to enhance the descriptive capabilities.
  • Removing the default values to require explicit values upon instantiation.
  • Adding the fins_kind attribute to introduce a more structured way to categorize fins.
pyproject.toml (2)

10-10: Verify the version bump.

The version has been bumped from "1.2.0" to "2.0.0", which indicates a major release that may include breaking changes or substantial new features.

Ensure that the changes in this PR justify a major version bump and that the necessary documentation and migration guides are provided.


47-53: Verify the pylint configuration changes.

The list of disabled pylint checks has been altered:

  • Checks such as line-too-long, duplicate-code, and too-many-instance-attributes have been reintroduced.
  • Checks like missing-module-docstring, missing-function-docstring, and too-many-public-methods remain disabled.

Ensure that the changes align with the project's coding standards and priorities.

lib/views/rocket.py (3)

45-45: LGTM!

Renaming the attribute from new_rocket_id to a more generic rocket_id is approved. It simplifies the interface and may improve consistency across the codebase.


50-50: LGTM!

Renaming the attribute from deleted_rocket_id to a more generic rocket_id is approved. It simplifies the interface and may improve consistency across the codebase.


54-55: LGTM!

The addition of the RocketView class is approved:

  • It indicates a further refinement in how rocket and motor data are represented and accessed.
  • Inheriting from Rocket suggests that RocketView is a specialized view of a rocket.
  • Including the motor attribute of type MotorView indicates a composition relationship between RocketView and MotorView.
lib/services/environment.py (4)

14-15: LGTM!

The code changes are approved.


17-34: LGTM!

The code changes are approved.


44-54: LGTM!

The code changes are approved.


56-63: LGTM!

The code changes are approved.

lib/views/environment.py (3)

55-56: LGTM!

The code changes are approved.


60-61: LGTM!

The code changes are approved.


6-46: Verify the usage of Any and dill binary objects.

The TODO comment indicates that Any is used to bypass Pydantic parsing and expects a dill binary object. Please ensure this aligns with the intended behavior and doesn't introduce any potential issues.

LGTM for the addition of new optional attributes!

The addition of new optional attributes enhances the flexibility of the EnvSummary model.

lib/services/flight.py (4)

17-18: LGTM!

The code changes are approved.


20-39: LGTM!

The code changes are approved.


49-58: LGTM!

The code changes are approved.


60-67: LGTM!

The code changes are approved.

lib/models/rocket.py (2)

14-16: LGTM!

The code changes are approved.


28-85: LGTM!

The code changes are approved.

The changes enhance the flexibility of the Rocket class by allowing for multiple parachutes and detailed configurations for each component. The changes reflect a shift towards a more modular and configurable design for the Rocket class, enhancing its usability and adaptability for different rocket configurations.

lib/routes/environment.py (3)

69-97: LGTM!

The code changes are approved.

The function enhances the API's capability to handle different types of environment data, specifically by allowing users to download a binary file.


100-109: LGTM!

The code changes are approved.

The function now utilizes a different controller method to fetch the simulation data, aligning with the updated logic.


112-121: LGTM!

The code changes are approved.

lib/views/motor.py (4)

6-69: LGTM!

The code changes are approved.

The changes reflect a substantial enhancement in the data model related to motors, providing a more detailed and flexible structure for representing motor characteristics and behaviors.


76-79: LGTM!

The code changes are approved.

The attribute name change standardizes the naming convention across these classes, aligning them with the new structure introduced in MotorSummary.


82-84: LGTM!

The code changes are approved.

The attribute name change standardizes the naming convention across these classes, aligning them with the new structure introduced in MotorSummary.


87-88: LGTM!

The code changes are approved.

The addition suggests an enhancement in the way motor types are managed or displayed, potentially allowing for more specific interactions with different motor kinds.

lib/routes/motor.py (5)

40-41: LGTM!

The code changes are approved.


45-45: LGTM!

The code changes are approved.


70-71: LGTM!

The code changes are approved.


74-103: LGTM!

The code changes are approved.


105-106: LGTM!

The code changes are approved.

lib/routes/rocket.py (6)

Line range hint 34-44: LGTM!

The code changes are approved.


48-48: LGTM!

The code changes are approved.


70-76: LGTM!

The code changes are approved.


79-106: LGTM!

The code changes are approved.


110-116: LGTM!

The code changes are approved.


122-131: LGTM!

The code changes are approved.

lib/api.py (3)

Line range hint 44-69: LGTM!

The code changes are approved.


11-13: LGTM!

The code changes are approved.


37-39: LGTM!

The code changes are approved.

lib/models/motor.py (5)

9-9: LGTM!

The addition of the GENERIC enum value to MotorKinds is approved.


20-22: LGTM!

The addition of the CoordinateSystemOrientation enum class is approved.


25-25: LGTM!

The removal of the frozen=True attribute from TankFluids is approved.


30-30: LGTM!

The changes to the MotorTank class are approved:

  • The removal of the frozen=True attribute.
  • The default values for gas and liquid attributes.
  • The change of flux_time from a list to a tuple.
  • The initialization of gas_mass_flow_rate_in and liquid_mass_flow_rate_in to 0.0.

Also applies to: 36-38, 50-52


69-69: LGTM!

The changes to the Motor class are approved:

  • The change of thrust_source from MotorEngines to List[List[float]].
  • The addition of new parameters related to the chamber dimensions and propellant mass.
  • The update of coordinate_system_orientation to use the new CoordinateSystemOrientation enum.
  • The simplification of the constructor by removing the motor kind parameter and introducing a set_motor_kind method.
  • The initialization of _motor_kind with a default value of MotorKinds.SOLID.

Also applies to: 77-81, 100-102, 106-106, 112-113

lib/repositories/environment.py (4)

17-17: LGTM!

The changes to the __init__ method are approved:

  • The addition of an optional environment parameter of type Env.
  • The direct initialization of the _env attribute using the environment parameter.

Also applies to: 19-19


81-81: LGTM!

The changes to the get_env_by_id method are approved:

  • The update to the return type to Self.
  • The refinement of error handling to catch specific exceptions PyMongoError and RepositoryNotInitializedException.

Also applies to: 92-95


123-142: LGTM!

The addition of the update_env_by_id method is approved:

  • It allows for updating an existing environment in the database, enhancing the functionality of the EnvRepository class.
  • It follows a consistent error handling pattern, catching specific exceptions PyMongoError and RepositoryNotInitializedException.

39-57: LGTM!

The remaining changes in the file are approved:

  • The refactoring of the insert_env, find_env, and delete_env methods to utilize a get_collection method.
  • The capture of the inserted document's ID in the insert_env method and assigning it to self.env_id.
  • The refinement of error handling in the create_env and delete_env_by_id methods to catch specific exceptions PyMongoError and RepositoryNotInitializedException.

Also applies to: 41-41, 70-73, 112-115

lib/routes/flight.py (2)

36-36: LGTM!

The changes to the create_flight function are approved:

  • The removal of the rocket_option parameter.
  • The direct setting of the motor kind on the flight's rocket object.

Also applies to: 45-45


50-50: LGTM!

The change to the read_flight function is approved:

  • The update to the return type from Flight to FlightView.
lib/repositories/motor.py (12)

1-1: LGTM!

The import is necessary for using the Self type hint in the file.


2-2: LGTM!

The import is necessary for using the ObjectId type in the file.


3-3: LGTM!

The import is necessary for handling PyMongoError exceptions in the file.


17-17: LGTM!

The change to the __init__ method to accept an optional motor parameter is a good improvement as it allows initializing the repository with a specific motor instance.


19-19: LGTM!

The change to set the _motor attribute to the value of the motor parameter is necessary to store the motor instance in the repository.


32-32: LGTM!

The change to return the string representation of the _motor_id attribute is necessary to ensure that the motor_id property returns a string.


39-43: LGTM!

The refactoring of the insert_motor method to use the get_collection method and directly capture the inserted ID improves the code readability and maintainability.


44-49: LGTM!

The addition of the update_motor method to update a motor in the database is a good improvement to the repository. The method follows a similar structure to the existing methods.


52-53: LGTM!

The refactoring of the find_motor method to use the get_collection method improves the code readability and maintainability.


56-58: LGTM!

The refactoring of the delete_motor method to use the get_collection method improves the code readability and maintainability.


60-77: LGTM!

The simplification of the create_motor method to remove the motor_kind argument and directly use the motor_kind from the motor instance enhances the clarity of the method. The improved error handling to specifically catch PyMongoError and RepositoryNotInitializedException exceptions is also a good change.


Line range hint 82-148: LGTM!

The changes to the get_motor_by_id method to return Self instead of Motor and improve the error handling by specifically catching PyMongoError and RepositoryNotInitializedException exceptions are good improvements. The addition of the update_motor_by_id method to update a motor in the database by ID is also a good addition to the repository and follows a similar structure to the existing methods.

lib/utils.py (2)

10-31: LGTM!

The RocketPyGZipMiddleware class is well-structured and based on a proven implementation from the Starlette framework. The code changes are approved.


34-124: LGTM!

The GZipResponder class is well-structured and based on a proven implementation from the Starlette framework. The code changes are approved.

lib/repositories/repo.py (3)

18-23: LGTM!

The RepositoryNotInitializedException class is well-structured and provides a clear error message. The code changes are approved.


26-40: LGTM!

The RepoInstances class is well-structured and encapsulates related data and behavior. The code changes are approved.


Line range hint 48-166: LGTM, but verify the repository initialization and accessibility.

The changes to the Repository class improve thread safety and initialization handling. The refactored code is more modular and easier to understand. The new properties and methods provide a cleaner interface for accessing the MongoDB client and collection. The code changes are approved.

However, ensure that the repository is properly initialized and accessible before using it in the application.

Run the following script to verify the repository initialization and accessibility:

lib/views/flight.py (3)

165-166: LGTM!

The change to standardize the naming of the flight_id attribute improves clarity and consistency. The code changes are approved.


170-171: LGTM!

The change to standardize the naming of the flight_id attribute improves clarity and consistency. The code changes are approved.


174-175: LGTM!

The FlightView class provides a useful abstraction layer that encapsulates rocket-specific details within the flight context. This promotes a cleaner separation of concerns and improves code organization. The code changes are approved.

lib/services/motor.py (4)

25-26: LGTM!

The __init__ method is correctly implemented and follows best practices.


28-129: LGTM!

The from_motor_model method correctly converts the Motor model to the corresponding RocketPyMotor object. It handles the different motor kinds and their specific attributes. The code is well-structured and readable.


131-137: LGTM!

The motor property and setter methods are correctly implemented and follow best practices.


139-148: LGTM!

The get_motor_summary method is correctly implemented and provides a convenient way to get the summary of the motor.

lib/repositories/flight.py (10)

18-20: LGTM!

The change to the constructor facilitates better state management within the repository by allowing initialization with a specific flight instance.


33-33: LGTM!

The change to the flight_id property ensures that the flight_id is always returned as a string.


40-43: LGTM!

The change to the insert_flight method enhances the integrity of the flight data by setting the flight_id based on the actual inserted document's ID.


45-50: LGTM!

The update_flight method is correctly implemented and follows best practices for updating documents in MongoDB. It uses the ObjectId to ensure proper identification of the flight record during the update.


52-57: LGTM!

The update_env method is correctly implemented and follows best practices for updating documents in MongoDB. It uses the ObjectId to ensure proper identification of the flight record during the update.


59-64: LGTM!

The update_rocket method is correctly implemented and follows best practices for updating documents in MongoDB. It uses the ObjectId to ensure proper identification of the flight record during the update.


67-68: LGTM!

The change to the find_flight method aligns with MongoDB's best practices for document identification by using the _id field instead of the flight_id.


71-72: LGTM!

The change to the delete_flight method aligns with MongoDB's best practices for document identification by using the _id field instead of the flight_id.


75-97: LGTM!

The changes to the create_flight method improve its robustness and readability. The method has been simplified, unnecessary parameters have been removed, and specific exceptions are now caught and re-raised. The enhanced logging statements provide clearer insights into the operations being performed.


Line range hint 99-123: LGTM!

The changes to the get_flight_by_id method enhance clarity, reduce potential errors, and improve its usability. The method now directly returns the flight object fetched from the repository, catches specific exceptions, and provides enhanced logging. The return type change to Self allows for method chaining.

lib/controllers/environment.py (2)

Line range hint 49-72: LGTM!

The changes to the create_env method improve error handling by catching PyMongoError exceptions and logging errors more effectively. Retrieving the environment ID from the repository after creating an environment ensures that the correct ID is returned.


Line range hint 92-120: LGTM!

The changes to the get_env_by_id method enhance clarity by directly returning the environment object fetched from the repository. The improved error handling, including catching PyMongoError exceptions and more effective logging, makes the method more robust.

lib/controllers/motor.py (6)

3-3: LGTM!

The code changes are approved.


7-7: LGTM!

The code changes are approved.


14-14: LGTM!

The code changes are approved.


29-30: LGTM!

The code changes are approved.


42-46: LGTM!

The code changes are approved.


62-69: LGTM!

The code changes are approved.

Also applies to: 80-80, 87-89, 105-113, 124-128, 139-144, 156-157, 170-170, 173-173, 192-201, 210-210, 235-242, 251-251

lib/controllers/rocket.py (8)

4-4: LGTM!

The code changes are approved.


7-8: LGTM!

The code changes are approved.


11-11: LGTM!

The code changes are approved.


17-17: LGTM!

The code changes are approved.


36-36: LGTM!

The code changes are approved.

Also applies to: 47-49


59-66: LGTM!

The code changes are approved.

Also applies to: 77-77, 80-80, 86-86, 102-113, 121-131, 142-144, 158-159, 172-172, 175-175, 194-201, 212-212, 237-242, 253-253


277-279: LGTM!

The code changes are approved.


1-1: Verify the impact of removing methods.

Several methods related to the creation of rocket components (like nose cones, fins, and parachutes) have been removed from the RocketController class. This indicates a potential shift in how these components are managed or instantiated, possibly moving to a service-oriented architecture.

Please ensure that the removal of these methods does not break any existing functionality in the codebase. Consider running the following script to search for any potential usage of these methods:

Verification successful

Methods have been moved, not removed.

The methods get_rocketpy_nose, get_rocketpy_finset, get_rocketpy_tail, get_rocketpy_parachute, and check_parachute_trigger have been relocated to lib/services/rocket.py and are still in use. This indicates a restructuring of the codebase rather than a removal of functionality. The existing functionality should remain unaffected.

  • lib/services/rocket.py: Contains the relocated methods.
  • lib/views/rocket.py: References check_parachute_trigger.
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Search for potential usage of removed methods.

# Test: Search for the method names in the codebase.
# Expect: No occurrences of the method names.
methods=(
  "get_rocketpy_nose"
  "get_rocketpy_finset"
  "get_rocketpy_tail"
  "get_rocketpy_parachute"
  "check_parachute_trigger"
)

for method in "${methods[@]}"; do
  echo "Searching for $method..."
  rg --type python "$method"
done

Length of output: 1058


Script:

#!/bin/bash
# Description: Search for potential usage of removed methods without specifying file type.

# Test: Search for the method names in the codebase.
# Expect: No occurrences of the method names.
methods=(
  "get_rocketpy_nose"
  "get_rocketpy_finset"
  "get_rocketpy_tail"
  "get_rocketpy_parachute"
  "check_parachute_trigger"
)

for method in "${methods[@]}"; do
  echo "Searching for $method..."
  rg "$method"
done

Length of output: 1760

lib/services/rocket.py (1)

1-285: LGTM!

The implementation of the RocketService class is well-structured and follows best practices for error handling and logging. The class encapsulates the logic for creating and managing rocket components, which improves the modularity and maintainability of the codebase. The code is also well-documented with docstrings and comments, making it easier to understand and maintain.

Tools
Ruff

243-243: Within an except clause, raise exceptions with raise ... from err or raise ... from None to distinguish them from errors in exception handling

(B904)


271-273: Within an except clause, raise exceptions with raise ... from err or raise ... from None to distinguish them from errors in exception handling

(B904)

lib/controllers/flight.py (8)

3-3: LGTM!

The new import statements are necessary for the refactored code and are approved.

Also applies to: 7-12


46-47: LGTM!

The changes to the __init__ method, including the removal of unnecessary parameters and the addition of the guard method, are approved. These changes improve the code by reducing complexity and enhancing validation.


58-59: LGTM!

The new guard method is a valuable addition to the FlightController class. It ensures the integrity of the flight object by validating the associated rocket, which is a good practice to prevent potential issues.


69-78: LGTM!

The modifications to the create_flight method are approved. The changes, including the direct use of the FlightRepository, the simplified return value, and the enhanced error handling, improve the code by reducing complexity, potential errors, and improving robustness.

Also applies to: 87-87, 90-90


94-96: LGTM!

The updates to the get_flight_by_id method are approved. The changes, including returning a FlightView object, enhanced error handling, and the construction of the FlightView object, improve the code by providing a more structured response format, improving robustness, and providing a cleaner and more consistent way of returning flight data.

Also applies to: 112-122, 131-144


155-158: LGTM!

The refactoring of the get_rocketpy_flight_binary method is approved. The changes, including the rename, the shift from JSON to binary format, and the use of the FlightService for generating the binary representation, improve the separation of concerns and encapsulate the logic within the service layer. This aligns with the broader architectural improvements in the codebase.

Also applies to: 160-160, 166-166, 172-173, 179-179, 186-186, 189-189


208-217: LGTM!

The refactoring of the update_flight_by_id, update_env_by_flight_id, and update_rocket_by_flight_id methods is approved. The changes, including streamlining operations, focusing on updating the flight object directly, utilizing the repository for database interactions, consistent return values, and enhanced error handling, improve the code by reducing redundancy, improving error handling, clarifying responsibilities, providing cleaner and more predictable responses, and improving robustness.

Also applies to: 226-226, 250-261, 272-272, 280-280, 296-307, 318-318


383-385: LGTM!

The updates to the simulate_flight method are approved. The changes, including the use of the FlightService for generating flight summaries and the retrieval of the flight using the get_flight_by_id method, align with the broader architectural improvements in the codebase. This improves the separation of concerns and encapsulates the logic within the service layer.

lib/repositories/rocket.py (10)

18-21: LGTM!

The changes to the constructor are approved. Allowing initialization with a specific Rocket instance can be beneficial in certain use cases.


33-33: LGTM!

The change to the rocket_id property is approved. Returning a string representation ensures type consistency.


40-44: LGTM!

The changes to the insert_rocket method are approved. Using the get_collection method improves code readability, and capturing the inserted ID directly from the result is a cleaner approach.


45-49: LGTM!

The changes to the update_rocket method are approved. Using the get_collection method improves code readability, and using ObjectId ensures proper matching of the rocket_id in the database.


53-54: LGTM!

The changes to the find_rocket method are approved. Using the get_collection method improves code readability, and using ObjectId ensures proper matching of the rocket_id in the database.


57-58: LGTM!

The changes to the delete_rocket method are approved. Using the get_collection method improves code readability, and using ObjectId ensures proper matching of the rocket_id in the database.


61-79: LGTM!

The changes to the create_rocket method are approved. Using the insert_rocket method simplifies the code and improves readability. Explicitly catching and raising specific exceptions improves error handling and propagation.


Line range hint 85-109: LGTM!

The changes to the get_rocket_by_id method are approved. Using the find_rocket method simplifies the code and improves readability. Explicitly catching and raising specific exceptions improves error handling and propagation. Assigning the parsed rocket to the rocket attribute allows easy access to the retrieved rocket.


120-123: LGTM!

The changes to the exception handling in the delete_rocket_by_id method are approved. Explicitly catching and raising specific exceptions improves error handling and propagation.


131-153: LGTM!

The new update_rocket_by_id method is approved. It provides a convenient way to update a rocket by its ID, using the existing update_rocket method for consistency. Explicitly catching and raising specific exceptions improves error handling and propagation.

README.md (5)

12-16: LGTM!

The addition of the "Development" section is approved. It provides clear instructions for code formatting and linting, which helps maintain a consistent code style and improves code quality. The specified tools (black, pylint, and flake8) are widely used in Python projects.


26-26: LGTM!

The renaming of the "Standard" section to "Standalone" is approved. The new name is more descriptive and clearly conveys that the server can be run independently.


46-51: LGTM!

The addition of the "services" directory to the file structure is approved. Having a dedicated directory for services can improve code organization and maintainability by better separating concerns and functionalities.


90-93: LGTM!

The renaming of the test files in the "test_controllers" directory is approved. Including "controller" in the file names improves clarity and maintainability by making it clear which tests correspond to the controller components. The consistent naming convention enhances readability.


95-99: LGTM!

The addition of the "test_services" directory and its test files is approved. Having a dedicated directory for service tests improves code organization and maintainability. The consistent naming convention of the test files makes it clear which tests correspond to which service components.

lib/models/aerosurfaces.py Show resolved Hide resolved
lib/views/rocket.py Show resolved Hide resolved
lib/controllers/motor.py Show resolved Hide resolved
lib/services/rocket.py Outdated Show resolved Hide resolved
extends opentelemetry instrumentation

properly threat mongo db errors

refactors environment summary serialization

Minor refactoring
- Enhances error handling and logging
- Fine tune hybrid locks on main repository initialization and finalization

refactor repositories accesses

fine tunes db config

turn off db connection close

fixes repo name

fixes get environment call on flight route
- wipe business logic from controllers
- turn off entities deletion
- replace hash ids by ObjectIds

disables simulation routes

exposes motor tank property and disable fronzen instances
fixes summary routes

migrates from jsonpickle to dill binary

pin pydantic version to ensure compatibility; upgrades python base image

implements generic motor; removes rocket_options; fixes binary output

addresses PR review

increases response timeout; minor refactor on importing statements; fix parachute trigger evaluation context

fixes pylint issues

Updates pylint python version
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 3

Outside diff range and nitpick comments (4)
pyproject.toml (1)

47-53: Approve: Pylint configuration changes reflect updated code quality standards.

The changes to the pylint configuration align with the project's updated code quality standards and priorities. Enabling checks like line-too-long, duplicate-code, and too-many-instance-attributes will help maintain code consistency and readability.

However, consider the following suggestions:

  1. Re-enable the missing-module-docstring and missing-function-docstring checks to ensure proper documentation of modules and functions.
  2. Review the disabled too-many-public-methods check and consider refactoring classes with too many public methods to improve code organization and maintainability.
lib/models/rocket.py (1)

28-85: LGTM, with a minor suggestion.

The code changes are approved. The changes enhance the flexibility and modularity of the Rocket class by allowing for multiple parachutes and detailed configurations for each component.

One minor suggestion:

Consider adding type hints for the power_off_drag and power_on_drag attributes to improve code readability and maintainability. For example:

power_off_drag: List[Tuple[float, float]] = [
    (0.0, 0.0),
    (0.1, 0.1),
    (0.2, 0.2),
]
power_on_drag: List[Tuple[float, float]] = [
    (0.0, 0.0),
    (0.1, 0.1),
    (0.2, 0.2),
]
lib/views/motor.py (2)

8-69: Comprehensive motor data representation!

The addition of the extensive set of optional attributes in the MotorSummary class provides a comprehensive representation of motor data, allowing for flexibility in handling missing data.

However, consider using more specific types instead of Any for the attributes where possible. This will improve type safety, code clarity, and help avoid potential issues with serialization and deserialization.


87-88: New MotorView class for motor kind management!

The addition of the MotorView class, which extends the Motor class and introduces the selected_motor_kind attribute of type MotorKinds, suggests an enhancement in the management or display of motor types, potentially allowing for more specific interactions with different motor kinds.

To improve code clarity and maintainability, consider adding a docstring to the MotorView class to explain its purpose and usage.

Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between 3cf0b68 and 57d0a69.

Files ignored due to path filters (2)
  • lib/data/calisto/powerOffDragCurve.csv is excluded by !**/*.csv
  • lib/data/calisto/powerOnDragCurve.csv is excluded by !**/*.csv
Files selected for processing (36)
  • .github/workflows/pylint.yml (1 hunks)
  • Dockerfile (2 hunks)
  • README.md (6 hunks)
  • lib/init.py (1 hunks)
  • lib/main.py (1 hunks)
  • lib/api.py (3 hunks)
  • lib/controllers/environment.py (13 hunks)
  • lib/controllers/flight.py (16 hunks)
  • lib/controllers/motor.py (13 hunks)
  • lib/controllers/rocket.py (14 hunks)
  • lib/models/aerosurfaces.py (1 hunks)
  • lib/models/environment.py (2 hunks)
  • lib/models/flight.py (1 hunks)
  • lib/models/motor.py (1 hunks)
  • lib/models/rocket.py (1 hunks)
  • lib/repositories/environment.py (5 hunks)
  • lib/repositories/flight.py (5 hunks)
  • lib/repositories/motor.py (5 hunks)
  • lib/repositories/repo.py (3 hunks)
  • lib/repositories/rocket.py (4 hunks)
  • lib/routes/environment.py (2 hunks)
  • lib/routes/flight.py (5 hunks)
  • lib/routes/motor.py (3 hunks)
  • lib/routes/rocket.py (4 hunks)
  • lib/services/environment.py (1 hunks)
  • lib/services/flight.py (1 hunks)
  • lib/services/motor.py (1 hunks)
  • lib/services/rocket.py (1 hunks)
  • lib/settings/gunicorn.py (1 hunks)
  • lib/utils.py (1 hunks)
  • lib/views/environment.py (2 hunks)
  • lib/views/flight.py (2 hunks)
  • lib/views/motor.py (2 hunks)
  • lib/views/rocket.py (2 hunks)
  • pyproject.toml (2 hunks)
  • requirements.txt (1 hunks)
Files skipped from review due to trivial changes (2)
  • .github/workflows/pylint.yml
  • lib/settings/gunicorn.py
Files skipped from review as they are similar to previous changes (17)
  • Dockerfile
  • lib/main.py
  • lib/api.py
  • lib/controllers/environment.py
  • lib/controllers/flight.py
  • lib/controllers/rocket.py
  • lib/models/environment.py
  • lib/models/flight.py
  • lib/repositories/motor.py
  • lib/routes/motor.py
  • lib/routes/rocket.py
  • lib/services/environment.py
  • lib/services/flight.py
  • lib/services/motor.py
  • lib/services/rocket.py
  • lib/utils.py
  • requirements.txt
Additional context used
Ruff
lib/__init__.py

28-28: lib.api.app imported but unused; consider removing, adding to __all__, or using a redundant alias

(F401)

Additional comments not posted (88)
lib/__init__.py (1)

25-25: Verify the impact of the error message format change.

The change to the parse_error function alters the format of the returned error message by removing the word "exception". This may affect how error messages are logged or displayed.

Please ensure this change is thoroughly tested to confirm it behaves as expected and does not negatively impact error handling or debugging processes. Consider searching the codebase for usage of the parse_error function to assess the scope of impact.

Run the following script to verify the parse_error function usage:

lib/models/aerosurfaces.py (5)

5-9: LGTM!

The RailButtons class looks good. It follows the Pydantic model structure and captures the essential properties of rail buttons.


12-18: LGTM!

The NoseCone class looks good. It follows the Pydantic model structure and captures the essential properties of nose cones.


21-23: LGTM!

The FinsKinds enumeration class provides a structured way to categorize fins, enhancing the model's functionality. It follows the Python enum structure.


26-36: LGTM!

The Fins class looks good. It follows the Pydantic model structure and captures the essential properties of fins. The inclusion of the fins_kind attribute enhances the model's functionality by categorizing the fins.


44-50: LGTM!

The Tail class looks good. It follows the Pydantic model structure and captures the essential properties of tails.

pyproject.toml (1)

10-10: LGTM: Version bump to 2.0.0 for major API refactoring.

The version change from 1.2.0 to 2.0.0 aligns with the significant changes introduced in this PR, such as the API refactoring, database connection pooling, and migration to MongoDB's ObjectID.

lib/views/rocket.py (5)

7-36: The TODO comment was already flagged in the previous review and an issue was opened to track its resolution. Skipping the generation of a duplicate comment.


Line range hint 38-40: LGTM!

The code changes are approved.


43-46: LGTM!

The code changes are approved. The attribute name change from new_rocket_id to rocket_id improves consistency.


49-51: LGTM!

The code changes are approved. The attribute name change from deleted_rocket_id to rocket_id improves consistency.


54-55: LGTM!

The code changes are approved. The inheritance from Rocket and the motor attribute of type MotorView indicate a refinement in how rocket and motor data are represented and accessed.

lib/views/environment.py (4)

5-46: Comprehensive and flexible data model.

The EnvSummary class provides a detailed and flexible data model for environmental summaries by defining a wide range of optional attributes. This allows for partial data and accommodates various environmental parameters.


54-56: LGTM!

The changes to the EnvUpdated class are approved as they simplify the interface for updating environments and ensure consistency by standardizing the naming of the env_id field.


59-61: LGTM!

The changes to the EnvDeleted class are approved as they simplify the interface for deleting environments and ensure consistency by standardizing the naming of the env_id field.


6-6: Verify the usage of Any type for Callable objects.

The TODO comment suggests that Any type might be used for Callable objects, which could lead to unexpected behavior. This requires further investigation and verification.

To verify the usage of Any type for Callable objects, run the following script:

lib/models/rocket.py (2)

14-16: LGTM!

The code changes are approved.


19-26: LGTM!

The code changes are approved.

lib/routes/environment.py (3)

80-97: LGTM!

The new read_rocketpy_env function is implemented correctly and follows best practices for returning a binary response. It uses the EnvController.get_rocketpy_env_binary method to fetch the binary data, which is a good separation of concerns. The function is also instrumented with OpenTelemetry for tracing.


101-109: LGTM!

The renamed simulate_env function is implemented correctly and follows the existing pattern of using the EnvController to fetch data. The function is also instrumented with OpenTelemetry for tracing.


113-121: LGTM!

The renamed delete_env function is implemented correctly and follows the existing pattern of using the EnvController to perform operations. The function is also instrumented with OpenTelemetry for tracing.

lib/views/motor.py (3)

Line range hint 72-74:


78-78: Improved naming consistency!

The renaming of the attribute from new_motor_id to motor_id in the MotorUpdated class aligns the naming convention with the MotorDeleted class, improving consistency across the codebase.


83-83: Improved naming consistency!

The renaming of the attribute from deleted_motor_id to motor_id in the MotorDeleted class aligns the naming convention with the MotorUpdated class, improving consistency across the codebase.

lib/models/motor.py (5)

9-9: LGTM!

The code changes are approved.


20-22: LGTM!

The code changes are approved.


25-27: Verify the removal of the frozen attribute.

The removal of the frozen attribute is a significant change that allows for mutable instances of the class. This change should be carefully reviewed to ensure that it aligns with the intended design and does not introduce any unintended side effects or bugs.

Please provide more context on the reasoning behind this change and confirm that it has been thoroughly tested to ensure that it behaves as expected.


30-64: Verify the removal of the frozen attribute and confirm the default values.

  1. The removal of the frozen attribute is a significant change that allows for mutable instances of the class. This change should be carefully reviewed to ensure that it aligns with the intended design and does not introduce any unintended side effects or bugs.

Please provide more context on the reasoning behind this change and confirm that it has been thoroughly tested to ensure that it behaves as expected.

  1. Changing flux_time from a list to a tuple is a good change as it enforces immutability for this attribute.

  2. The default values for gas, liquid, gas_mass_flow_rate_in, and liquid_mass_flow_rate_in should be confirmed to ensure they are appropriate for the intended use case.

Please confirm that these default values align with the expected behavior of the tank's fluid dynamics.


67-113: Verify the changes to thrust_source and test the constructor changes.

  1. Changing thrust_source from MotorEngines to List[List[float]] suggests a more generalized approach to thrust source representation. This change should be reviewed to ensure that it is compatible with the rest of the codebase and does not break any existing functionality.

Please provide more context on the reasoning behind this change and confirm that it has been thoroughly tested to ensure compatibility with the rest of the codebase.

  1. Updating coordinate_system_orientation to use the new CoordinateSystemOrientation enum improves type safety and clarity, which is a positive change.

  2. Simplifying the constructor and introducing the set_motor_kind method provides a more dynamic way to manage the motor kind, but the implications of this change should be thoroughly tested.

Please confirm that these changes have been thoroughly tested to ensure that they behave as expected and do not introduce any unintended side effects or bugs.

  1. Initializing _motor_kind with a default value ensures that every motor instance has a defined type, which is a good practice.
lib/repositories/environment.py (5)

17-19: LGTM!

The changes to the constructor are approved. Initializing the _env attribute directly with the optional environment parameter streamlines the object creation process.


39-42: LGTM!

The changes to the insert_env method are approved:

  • Utilizing the get_collection method improves code readability and maintainability.
  • Capturing the inserted document's ID enhances the tracking of the environment's identity.
  • The refined error handling allows for more precise error management.

52-53: LGTM!

The changes to the find_env method are approved:

  • Utilizing the get_collection method improves code readability and maintainability.
  • The refined error handling allows for more precise error management.

56-57: LGTM!

The changes to the delete_env method are approved:

  • Utilizing the get_collection method improves code readability and maintainability.
  • The refined error handling allows for more precise error management.

123-142: LGTM!

The new update_env_by_id method is approved:

  • It enhances the functionality of the EnvRepository class by allowing for updates to existing environments.
  • The error handling ensures consistency in how exceptions are managed.
lib/routes/flight.py (7)

Line range hint 36-46: LGTM!

The changes to the create_flight function are approved:

  • Removing the rocket_option parameter simplifies the function signature and logic.
  • Setting the motor kind directly on the flight's rocket object encapsulates the motor kind setting within the flight object, which can enhance clarity and maintainability.

110-129: LGTM!

The changes to the update_flight_rocket function are approved:

  • Removing the rocket_option parameter simplifies the function signature and logic.
  • Setting the motor kind directly on the rocket object aligns with the changes made in the create_flight function.

132-149: LGTM!

The changes to the update_flight function are approved:

  • Removing the rocket_option parameter simplifies the function signature and logic.
  • Setting the motor kind directly on the flight's rocket object aligns with the changes made in the create_flight function.

164-173: LGTM!

The changes to the delete_flight function are approved:

  • Moving the function to a new endpoint is a minor modification and does not affect the functionality.

152-161: LGTM, but verify the simulation functionality.

The addition of the simulate_flight function is approved.

However, ensure that the simulation functionality is thoroughly tested to confirm that it correctly simulates a flight based on the provided flight ID and returns the expected FlightSummary object.

Run the following script to verify the simulation functionality:


50-55: LGTM, but verify the return type change.

The changes to the read_flight function are approved.

However, ensure that the change in the return type from Flight to FlightView is thoroughly tested to confirm that it provides the expected user-friendly or structured response to the client.

Run the following script to verify the return type change:

Verification successful

Return type change verified and consistent across the codebase.

The change in the return type of the read_flight function from Flight to FlightView has been verified. The FlightView class is correctly used in the codebase, ensuring that the change is integrated properly.

  • read_flight function is defined to return FlightView in lib/routes/flight.py.
  • FlightView is a subclass of Flight, providing extended functionality.
  • Usage in lib/repositories/flight.py and lib/controllers/flight.py confirms correct handling of the return type.
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the return type change from `Flight` to `FlightView`.

# Test: Search for the function usage. Expect: Only occurrences of the new return type.
rg --type python -A 5 $'read_flight'

Length of output: 66


Script:

#!/bin/bash
# Correct the file type and verify the return type change from `Flight` to `FlightView`.

# Find the definition of `read_flight` to confirm the return type.
ast-grep --lang python --pattern $'async def read_flight($_) -> FlightView:'

# Search for all usages of `read_flight` in the codebase.
rg 'read_flight' --type py -A 5

# Check for any documentation or comments related to `FlightView`.
rg 'FlightView' --type py -A 5

Length of output: 3025


72-88: LGTM, but verify the binary file download functionality.

The changes to the read_rocketpy_flight function are approved.

However, ensure that the binary file download functionality is thoroughly tested to confirm that it serves the correct binary file with the appropriate content disposition header.

Run the following script to verify the binary file download functionality:

lib/repositories/rocket.py (6)

18-21: LGTM!

The changes to the constructor are approved. Accepting an optional Rocket instance and setting the _rocket attribute accordingly improves the initialization of the repository.


33-33: LGTM!

The change to the rocket_id property is approved. Returning a string representation of _rocket_id ensures type consistency.


40-43: LGTM!

The refactoring of the insert_rocket method is approved. Using the get_collection method improves code readability and maintainability. Capturing the inserted ID directly from the result is the correct approach.


53-54: LGTM!

The refactoring of the find_rocket method is approved. Using the get_collection method improves code readability and maintainability.


57-58: LGTM!

The refactoring of the delete_rocket method is approved. Using the get_collection method improves code readability and maintainability.


131-153: LGTM!

The addition of the update_rocket_by_id method is approved. It follows the established patterns in the class and enhances the functionality of the repository by allowing updates to a rocket's details.

README.md (9)

12-15: LGTM!

The addition of the "Development" section with commands for code formatting and linting is a great improvement. It will help maintain a consistent code style and catch potential issues early in the development process.


26-26: Looks good!

The renaming of the "Standard" section to "Standalone" is acceptable. It doesn't have any significant impact on the documentation.


46-51: Great addition!

The introduction of the "services" directory in the file structure is a positive change. It suggests a better separation of concerns and aligns with the common practice of having a dedicated layer for business logic and services in the application architecture. This reorganization can improve the maintainability and readability of the codebase.


90-93: Excellent renaming!

The renaming of the test files in the "test_controllers" directory to include "controller" in their names is a great improvement. It enhances the readability and maintainability of the test suite by clearly indicating which tests correspond to which components. The consistent naming convention makes it easier to understand the purpose of each test file at a glance.


95-99: Great addition of test files for services!

The introduction of the "test_services" directory and its corresponding test files is a valuable addition to the test suite. It aligns with the newly added "services" directory in the main codebase and demonstrates a commitment to maintaining a comprehensive set of tests. Having dedicated test files for service components is crucial for ensuring the correctness and reliability of the service layer.


102-105: Great renaming of route test files!

The renaming of the test files in the "test_routes" directory to include "route" in their names is a positive change. It improves the readability and maintainability of the test suite by clearly indicating which tests are associated with the route components. The consistent naming convention across different test directories makes it easier to navigate and understand the purpose of each test file.


108-111: Excellent renaming of repository test files!

The renaming of the test files in the "test_repositories" directory to include "repo" in their names is a great improvement. It aligns with the renaming pattern applied to other test directories and enhances the clarity and maintainability of the test suite. The consistent naming convention across different test components makes it straightforward to identify which tests are related to the repository layer of the application.


114-117: Great renaming of model test files!

The renaming of the test files in the "test_models" directory to include "model" in their names is a positive change. It adheres to the consistent naming convention applied throughout the test suite and enhances the readability and maintainability of the tests. The clear indication of which tests are associated with the model components of the application makes it easier to navigate and understand the purpose of each test file.


120-123: Excellent renaming of view test files!

The renaming of the test files in the "test_views" directory to include "view" in their names is a great improvement. It aligns with the consistent naming convention applied throughout the test suite and enhances the readability and maintainability of the tests. The clear indication of which tests are associated with the view components of the application makes it easier to navigate and understand the purpose of each test file.

lib/repositories/repo.py (7)

18-23: LGTM!

The new RepositoryNotInitializedException class provides a clear and specific error for cases when the repository is not initialized. This improves error handling and messaging in the codebase.


26-40: LGTM!

The new RepoInstances class is used to track repository instances and their prospecting counts. This is part of the changes to improve thread safety in the singleton pattern implementation of the Repository class.


48-61: LGTM!

The changes to the __new__ method improve thread safety in the singleton pattern implementation of the Repository class:

  • The use of a global thread lock ensures that only one thread can create or access an instance at a time.
  • The _global_instances dictionary now holds RepoInstances objects, which track both the instance and its prospecting count.

74-79: LGTM!

The changes to the constructor of the Repository class:

  • Allow for customization of the maximum pool size for the MongoDB client through the new optional max_pool_size parameter.
  • Introduce a new instance variable _initialized_event, which is an asyncio.Event, and call a new method _initialize() at the end of the constructor. These changes are part of handling asynchronous initialization of the repository.

100-107: LGTM!

The new _initialize() method handles the asynchronous initialization of the repository based on the state of the event loop:

  • If the event loop is not running, it runs the initialization directly using asyncio.run().
  • If the event loop is running, it creates a new task to run the initialization and adds a done callback to handle the completion of the initialization.

Line range hint 123-133: LGTM!

The changes to the _initialize_connection method adjust the connection parameters for the MongoDB client:

  • maxIdleTimeMS is increased to 30000 to allow idle connections to remain in the pool for a longer time before being closed.
  • minPoolSize is set to 10 to maintain a minimum number of connections in the pool.
  • maxPoolSize is set to the value of self._max_pool_size, which is provided in the constructor, to limit the maximum number of connections in the pool.
  • serverSelectionTimeoutMS is set to 60000 to allow more time for server selection before timing out.
    These changes can help optimize connection management and performance.

163-166: LGTM!

The new get_collection method provides a way to access the MongoDB collection associated with the repository:

  • It checks if the repository is initialized before returning the collection.
  • It raises a RepositoryNotInitializedException if the repository is not initialized.
    This ensures that the collection is only accessed after the repository has been properly initialized.
lib/views/flight.py (5)

Line range hint 158-161: LGTM!

The code changes are approved.


163-167: LGTM!

The code changes are approved. The attribute renaming improves consistency.


169-172: LGTM!

The code changes are approved. The attribute renaming improves consistency.


174-175: LGTM!

The code changes are approved. The class follows the naming convention of using the View suffix for classes that represent a view of an entity.


8-156: Verify the inheritance hierarchy, use more specific types, and address missing implementations.

  1. Inheritance: The FlightSummary class inherits from RocketSummary and EnvSummary. Verify that this inheritance hierarchy aligns with the intended design and does not introduce any unintended side effects or conflicts.
  2. Attribute Types: Many attributes are declared as Optional[Any], which essentially disables type checking for those attributes. While this provides flexibility, it can make the code more prone to runtime errors and harder to maintain. Consider using more specific types where possible.
  3. Missing Implementations: Address the missing implementations indicated by the todo comments to ensure the completeness and correctness of the class.

Run the following script to verify the usage of the FlightSummary class and its attributes:

lib/repositories/flight.py (14)

18-20: LGTM!

The code changes are approved.


33-33: LGTM!

The code changes are approved.


40-43: LGTM!

The code changes are approved.


45-50: LGTM!

The code changes are approved.


52-57: LGTM!

The code changes are approved.


59-64: LGTM!

The code changes are approved.


67-68: LGTM!

The code changes are approved.


71-72: LGTM!

The code changes are approved.


75-97: LGTM!

The code changes are approved.


Line range hint 99-123: LGTM!

The code changes are approved.


134-143: LGTM!

The code changes are approved.


145-167: LGTM!

The code changes are approved.


169-188: LGTM!

The code changes are approved.


190-212: LGTM!

The code changes are approved.

lib/controllers/motor.py (6)

29-31: LGTM!

The code changes are approved.


42-46: LGTM!

The code changes are approved.


Line range hint 55-83: LGTM!

The code changes are approved.


Line range hint 87-137: LGTM!

The code changes are approved.


139-174: LGTM!

The code changes are approved.


Line range hint 176-214: LGTM!

The code changes are approved.

lib/__init__.py Show resolved Hide resolved
README.md Show resolved Hide resolved
Copy link

@luimot luimot left a comment

Choose a reason for hiding this comment

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

I see the Postman collection was removed on the tests directory, do we plan to use Postman again or the requests that can be made on /docs/ are enough?

@GabrielBarberini
Copy link
Collaborator Author

GabrielBarberini commented Sep 12, 2024

I see the Postman collection was removed on the tests directory, do we plan to use Postman again or the requests that can be made on /docs/ are enough?

Yes!

Since Postman limits collection availability I thought It would be better to get away from it. For now we can stick with /docs for smoke testing.

This PR finally formalizes the structure we'll stick with for this project. Which opens the large window for implementing unit tests -which I was avoiding while we were experimenting since requirements were not yet clear/fixed.

Copy link
Member

@Gui-FernandesBR Gui-FernandesBR left a comment

Choose a reason for hiding this comment

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

Looking good to me.

Impossible to read all the files, but I hope you can find my comments useful.

Comment on lines +13 to +15
- black ./lib
- pylint --extension-pkg-whitelist='pydantic' ./lib/*
- flake8 --ignore E501,E402,F401,W503 ./lib
Copy link
Member

Choose a reason for hiding this comment

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

Suggestion to create a Makefile with these commands.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

patched in 470eb1e

name: str
n: int
root_chord: float
tip_chord: float
Copy link
Member

Choose a reason for hiding this comment

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

just in case... don't forget the elliptical fins object doesn't have a "tip_chord" attribute. this attribute is exclusive to the trapezoidal.

the future FreeFormFins will also not have this attribute.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Nice catch!
thank you

Patched along with eace9ee

@@ -3,13 +3,9 @@
from lib.models.environment import Env


class Flight(BaseModel, frozen=True):
class Flight(BaseModel):
Copy link
Member

Choose a reason for hiding this comment

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

There are more arguments in the Flight class constructor, maybe in the future we could implement a few of them in here,

Copy link
Collaborator Author

@GabrielBarberini GabrielBarberini Sep 15, 2024

Choose a reason for hiding this comment

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

Thanks for raising this!

I've included a few more that were easy and didn't break the binary generation here: 749a4ea

I think now only initial_solution is missing, I'll create a github issue to address it in the future

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

@coderabbitai , can you please create the github issue to address the TODO: implementing initial_solution init parameter for the flight class ?

Copy link
Contributor

Choose a reason for hiding this comment

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

@GabrielBarberini, the GitHub issue has been successfully created: #29.

Analysis chain

@GabrielBarberini, I've created the GitHub issue to address the TODO.

Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Create a GitHub issue to implement the 'initial_solution' init parameter for the 'Flight' class

gh issue create \
  --title "Implement 'initial_solution' parameter in Flight class" \
  --body $'We need to implement the `initial_solution` init parameter for the `Flight` class, as noted in the TODO comment in `lib/models/flight.py`.\n\nReference PR: https://github.com/RocketPy-Team/Infinity-API/pull/25\nReference comment: https://github.com/RocketPy-Team/Infinity-API/pull/25#discussion_r1753076737\n\nRequested by @GabrielBarberini.' \
  --assignee GabrielBarberini

Length of output: 518

from pydantic import BaseModel, PrivateAttr


class MotorKinds(str, Enum):
HYBRID: str = "HYBRID"
SOLID: str = "SOLID"
GENERIC: str = "GENERIC"
Copy link
Member

Choose a reason for hiding this comment

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

we also have the "EmptyMotor", which btw is a bit odd, but works sometimes,

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Thanks for raising awareness.
This one I prefer to address in the next version.

@coderabbitai can you please create a github issue for us?

Copy link
Contributor

Choose a reason for hiding this comment

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

@GabrielBarberini, the GitHub issue has been created: #30.

Analysis chain

@GabrielBarberini, I've created a GitHub issue as requested.

Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Create a GitHub issue to address the 'EmptyMotor' in the next version
gh issue create \
  --title "Address 'EmptyMotor' in next version" \
  --body "As discussed in PR https://github.com/RocketPy-Team/Infinity-API/pull/25 and comment https://github.com/RocketPy-Team/Infinity-API/pull/25#discussion_r1753077078, we need to address the 'EmptyMotor' in the next version. Requested by @GabrielBarberini." \
  --assignee "GabrielBarberini"

Length of output: 421

cd_s: float = 10
sampling_rate: int = 105
lag: float = 1.5
trigger: str = "lambda p, h, y: y[5] < 0 and h < 800"
Copy link
Member

Choose a reason for hiding this comment

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

I really prefer triggers as strings or number...

setting "apogee" would be really nice.

Copy link
Collaborator Author

@GabrielBarberini GabrielBarberini Sep 15, 2024

Choose a reason for hiding this comment

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

patched in e323123

one can now insert:

  • lambda expressions as strings matching arity, scope and syntax three verified under check_parachute_trigger
  • ints or floats as strings (will get evaluated as int/floats, respectivelly)
  • "apogee"
  • floats
  • ints

propellant_I_22: Optional[Any]
propellant_I_23: Optional[Any]
propellant_I_33: Optional[Any]
clip_thrust: Optional[Any]
Copy link
Member

Choose a reason for hiding this comment

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

This is a method

Suggested change
clip_thrust: Optional[Any]

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

patched in 0f0cbd5

out_of_rail_time: Optional[float]
out_of_rail_time_index: Optional[int]
parachute_cd_s: Optional[float]
post_processed: Optional[bool]
Copy link
Member

Choose a reason for hiding this comment

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

This is legacy code

Suggested change
post_processed: Optional[bool]

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

patched in 0f0cbd5

rocket_radius=fins.radius,
airfoil=fins.airfoil,
)
case _:
Copy link
Member

Choose a reason for hiding this comment

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

why have you repeated the code for trapezoidal? suggestion to simply remove the first match condition

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Good point. I prefer to keep the good matches explicit tho, will raise an ValueError in case of default.

Patched in eace9ee

Comment on lines 240 to 241
class InvalidParachuteTrigger(Exception):
pass
Copy link
Member

Choose a reason for hiding this comment

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

Define this class out of this method, possibly in a different file.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

patched in e323123

Comment on lines +25 to +34
rocketpy_env = RocketPyEnvironment(
latitude=env.latitude,
longitude=env.longitude,
elevation=env.elevation,
date=env.date,
)
rocketpy_env.set_atmospheric_model(
type=env.atmospheric_model_type, file=env.atmospheric_model_file
)
return cls(environment=rocketpy_env)
Copy link
Member

Choose a reason for hiding this comment

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

Just take in mind that the set_atmospheric_model may not work if you use Forecast models for dates in the past.

In other words, the same code may generate different results depending on the time you execute it, this is due to the env.date attribute.

For example, you can only use Forecast/GFS model for dates in the future.

Copy link
Collaborator Author

@GabrielBarberini GabrielBarberini Sep 15, 2024

Choose a reason for hiding this comment

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

Noted!

I think this sums up to a large list of scenarios where simulation would fail due to invalid input, even if in this particular case the input was valid at some point in time.

Although I don't see env.date joining the list so soon, I've discussed with @phmbressan around such issues and we agreed that it would be great to safe-guard some of the inputs to reduce errors like that. There is a github issue to handle that in the future #26

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

Outside diff range and nitpick comments (1)
Makefile (1)

6-7: LGTM!

The flake8 target correctly runs the Flake8 linter on the code in the ./lib directory while ignoring specific error codes.

Consider adding a comment to document the ignored error codes and the rationale behind ignoring them. This will help maintain consistency and make it easier for other developers to understand the linting configuration.

Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between eace9ee and 749a4ea.

Files selected for processing (3)
  • Makefile (1 hunks)
  • lib/models/flight.py (1 hunks)
  • lib/services/flight.py (1 hunks)
Files skipped from review as they are similar to previous changes (1)
  • lib/services/flight.py
Additional comments not posted (10)
Makefile (6)

1-2: LGTM!

The black target correctly uses the Black code formatter to format the code in the ./lib directory.


4-4: LGTM!

The lint target is a good practice to ensure comprehensive linting by running both flake8 and pylint targets.


9-10: LGTM!

The pylint target correctly runs the Pylint linter on all Python files in the ./lib directory while including the pydantic package in its checks.


12-13: LGTM!

The dev target correctly starts a development server using Uvicorn on port 3000 with live reload enabled.


15-18: LGTM!

The clean target correctly stops and removes the infinity-api Docker container and prunes unused Docker objects.


20-21: LGTM!

The build target correctly builds a Docker image named infinity-api without using the cache.

lib/models/flight.py (4)

1-2: LGTM!

The new imports for Enum and Optional are valid and follow the correct syntax. They align with the changes introduced in the file.


8-10: LGTM!

The new EquationsOfMotion enum is correctly defined and follows the best practices. The choice of string values for the enum is valid and appropriate.


13-31: Great work on enhancing the Flight class!

The removal of frozen=True and the addition of new optional attributes align with the goal of making the Flight class more configurable and flexible. The default values for the new attributes seem reasonable.

The changes also address the past review comments by adding more constructor arguments, as discussed.


18-19: LGTM!

The modifications to inclination and heading attributes, making them optional floats with default values, provide more flexibility and align with the overall enhancements to the Flight class. The chosen default values seem reasonable.

lib/models/flight.py Show resolved Hide resolved
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between 749a4ea and 0f0cbd5.

Files selected for processing (2)
  • lib/views/flight.py (2 hunks)
  • lib/views/motor.py (2 hunks)
Additional comments not posted (9)
lib/views/motor.py (4)

8-68: LGTM! The addition of optional attributes enhances the motor data model.

The expanded set of optional attributes in the MotorSummary class provides a more comprehensive and flexible representation of motor data. The use of Optional aligns with best practices for handling potentially missing data.


77-77: LGTM! The attribute renaming aligns the naming convention.

The renaming of new_motor_id to motor_id in the MotorUpdated class aligns the naming convention with other classes like MotorDeleted. This improves consistency and readability without introducing any functional changes.


82-82: LGTM! The attribute renaming aligns the naming convention.

The renaming of deleted_motor_id to motor_id in the MotorDeleted class aligns the naming convention with other classes like MotorUpdated. This improves consistency and readability without introducing any functional changes.


86-87: LGTM! The new MotorView class enhances motor-related functionality.

The addition of the MotorView class, which extends the Motor class, provides a specialized view for motors. The selected_motor_kind attribute allows for tracking or displaying the currently selected motor type, potentially enabling more specific interactions with different motor kinds. This enhancement aligns with the overall motor-related functionality in the codebase.

lib/views/flight.py (5)

8-155: The FlightSummary class looks good with its modular design and flexible attributes.

The class inherits from RocketSummary and EnvSummary, which promotes code reuse and modularity. The numerous optional attributes provide flexibility in representing flight data, allowing for handling incomplete or partial data.

Please consider addressing the TODO comments in future iterations to further enhance the functionality and usability of the class.


Line range hint 158-160:


163-166: LGTM!

The attribute renaming from new_flight_id to flight_id improves consistency with other classes.


168-171: Looks good!

Renaming the attribute from deleted_flight_id to flight_id enhances consistency across the codebase.


173-174: The new FlightView class looks good!

Extending the Flight class and incorporating the rocket attribute of type RocketView provides a useful abstraction layer to encapsulate rocket-specific details within the flight context. This enhances the modularity and organization of the codebase.

lib/views/motor.py Show resolved Hide resolved
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

Outside diff range and nitpick comments (1)
lib/models/rocket.py (1)

19-26: Approve the Parachute class with a suggestion for the trigger attribute.

The new Parachute class effectively encapsulates the properties of a parachute. The attributes are appropriately typed and have default values, enhancing the usability of the class.

However, consider defining the trigger condition as a separate function instead of using a string representation of a lambda function. This can improve code readability and maintainability.

def default_parachute_trigger(p, h, y):
    return y[5] < 0 and h < 800

class Parachute(BaseModel):
    ...
    trigger: Union[str, float] = default_parachute_trigger
    ...
Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between 0f0cbd5 and e323123.

Files selected for processing (2)
  • lib/models/rocket.py (1 hunks)
  • lib/services/rocket.py (1 hunks)
Files skipped from review as they are similar to previous changes (1)
  • lib/services/rocket.py
Additional comments not posted (3)
lib/models/rocket.py (3)

14-16: LGTM!

The new CoordinateSystemOrientation enum provides a clear and structured way to define the orientation of the rocket's coordinate system. The enum values are self-explanatory and improve code readability.


28-85: Approve the Rocket class restructuring with a request for verification.

The restructuring of the Rocket class enhances its flexibility and usability by allowing for multiple parachutes and detailed configurations for each component. The initialization logic has been simplified, and the coordinate_system_orientation attribute now uses the new CoordinateSystemOrientation enum, improving code clarity and structure.

However, please verify the impact of the changes made to the default values of power_off_drag and power_on_drag on the drag calculation logic and ensure that the modifications align with the intended behavior.


19-26: Duplicate comment: Prefer strings or numbers for the trigger attribute.

The existing comment by Gui-FernandesBR is still valid and applicable to the current code changes. The suggestion to use strings or numbers for the trigger attribute aligns with the current implementation.

Additionally, the comment about setting "apogee" as a nice option is a valid suggestion for enhancing the usability of the Parachute class. Consider adding "apogee" as a predefined trigger option to simplify the configuration of parachute deployment.

@GabrielBarberini
Copy link
Collaborator Author

@coderabbitai, can you please also make sure to bind this PR with #21 as well? The refactoring here also solves the issue brought by @Gui-FernandesBR on it.

Copy link
Contributor

coderabbitai bot commented Sep 15, 2024

Tip

For best results, initiate chat on the files or code changes.

@GabrielBarberini, certainly! To bind this PR with issue #21, you can add "Closes #21" to the PR description. This will automatically close the issue when the PR is merged. Let me know if you need any assistance with this!

Copy link

@aasitvora99 aasitvora99 left a comment

Choose a reason for hiding this comment

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

Did some smoke testing by running the API locally and found no blockers. Go ahead and merge it.

@GabrielBarberini GabrielBarberini merged commit e3c389c into master Sep 15, 2024
3 checks passed
@GabrielBarberini GabrielBarberini deleted the refactor branch September 25, 2024 17:14
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.

[BUG] Unable to generate simulations
4 participants