Skip to content
Open
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Copy link
Member

Choose a reason for hiding this comment

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

changelog seems weird @phmbressan

Copy link

Choose a reason for hiding this comment

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

Thanks for your feedback. Could you please clarify which part of the changelog seems weird? I want to make sure my addition follows the proper format.

Copy link
Member

Choose a reason for hiding this comment

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

your added line is listed along together other changes that have already been deployed

Copy link
Collaborator

Choose a reason for hiding this comment

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

changelog seems weird @phmbressan

I can double-check later, but this branch might not be up to date with develop (v1.11), which is why the CHANGELOG seems outdated. Could you @C8H10O2 try rebasing this branch with the current develop so that all conflicts are sorted out?

Copy link

Choose a reason for hiding this comment

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

changelog seems weird @phmbressan

I can double-check later, but this branch might not be up to date with develop (v1.11), which is why the CHANGELOG seems outdated. Could you @C8H10O2 try rebasing this branch with the current develop so that all conflicts are sorted out?

Understood, I’ll take care of it. Thanks for pointing it out.

Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
Attention: The newest changes should be on top -->

### Added
- ENH: Custom Exception errors and messages [#285](https://github.com/RocketPy-Team/RocketPy/issues/285)
- ENH: Tank Fluids with Variable Density from Temperature and Pressure [#852](https://github.com/RocketPy-Team/RocketPy/pull/852)
- ENH: Controller (AirBrakes) and Sensors Encoding [#849](https://github.com/RocketPy-Team/RocketPy/pull/849)
- EHN: Addition of ensemble variable to ECMWF dictionaries [#842](https://github.com/RocketPy-Team/RocketPy/pull/842)
Expand Down
29 changes: 29 additions & 0 deletions rocketpy/rocket/rocket.py
Copy link
Member

Choose a reason for hiding this comment

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

a rocket without parachute is something quite common.

Copy link

Choose a reason for hiding this comment

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

Following up on issue #285 and your comment:

#285 (comment)

I wanted to clarify: for rockets without parachutes, should the custom warning be changed to a notice/info message instead, or should it only trigger under specific conditions?

Copy link
Member

Choose a reason for hiding this comment

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

we should never raise an warning for "parachuteless rockets", so to say

Original file line number Diff line number Diff line change
Expand Up @@ -384,6 +384,35 @@ def __init__( # pylint: disable=too-many-statements
self.prints = _RocketPrints(self)
self.plots = _RocketPlots(self)

def _check_missing_components(self):
"""Check if the rocket is missing any essential components and issue a warning.

This method verifies whether the rocket has the following key components:
- motor
- parachute(s)
- aerodynamic surface(s)

If any of these components are missing, a single warning message is issued
listing all missing components. This helps users quickly identify potential
issues before running simulations or analyses.

Notes:
- The warning uses Python's built-in `warnings.warn` function.
"""
missing_components = []
if isinstance(self.motor, EmptyMotor):
missing_components.append("motor")
if not self.parachutes:
missing_components.append("parachutes")
if not self.aerodynamic_surfaces or len(self.aerodynamic_surfaces) == 0:
missing_components.append("aerodynamic surfaces")

if missing_components:
component_list = ", ".join(missing_components)
warnings.warn(
f"[WARNING] Rocket has no {component_list} defined.", UserWarning
)

@property
def nosecones(self):
"""A list containing all the nose cones currently added to the rocket."""
Expand Down
38 changes: 37 additions & 1 deletion tests/unit/test_rocket.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,9 @@


@patch("matplotlib.pyplot.show")
def test_elliptical_fins(mock_show, calisto_robust, calisto_trapezoidal_fins): # pylint: disable=unused-argument
def test_elliptical_fins(
mock_show, calisto_robust, calisto_trapezoidal_fins
): # pylint: disable=unused-argument
test_rocket = calisto_robust
calisto_robust.aerodynamic_surfaces.remove(calisto_trapezoidal_fins)
test_rocket.add_elliptical_fins(4, span=0.100, root_chord=0.120, position=-1.168)
Expand Down Expand Up @@ -370,6 +372,40 @@ def test_add_motor(calisto_motorless, cesaroni_m1670):
assert center_of_mass_motorless is not center_of_mass_with_motor


def test_check_missing_all_components(calisto_motorless):
"""Tests the _check_missing_components method for a Rocket with no components."""
with pytest.warns(UserWarning) as record:
calisto_motorless._check_missing_components()

assert len(record) == 1
msg = str(record[0].message)
assert "motor" in msg
assert "parachutes" in msg
assert "aerodynamic surfaces" in msg


def test_check_missing_some_components(calisto):
"""Tests the _check_missing_components method for a Rocket missing some components."""
calisto.parachutes = []
calisto.aerodynamic_surfaces = []

with pytest.warns(UserWarning) as record:
calisto._check_missing_components()

assert len(record) == 1
msg = str(record[0].message)
assert "parachutes" in msg
assert "aerodynamic surfaces" in msg


def test_check_missing_no_components_missing(calisto_robust):
"""Tests the _check_missing_components method for a complete Rocket."""
# Call directly — no warnings expected
calisto_robust._check_missing_components()
# If any warning occurs, pytest will fail automatically
Copy link
Member

Choose a reason for hiding this comment

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

are you sure?

    # If any warning occurs, pytest will fail automatically

Copy link
Author

Choose a reason for hiding this comment

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

Thank you for the review!You're correct.By default, pytest only displays warnings but doesn't fail.I will updated the test.

assert True


def test_set_rail_button(calisto):
rail_buttons = calisto.set_rail_buttons(0.2, -0.5, 30)
# assert buttons_distance
Expand Down