* chore: fix files to commit on tag * fix(ephemerides): fix a bug that made the ephemerides calculations impossible for the Poles (#21) * chore: fix the target branch on Dependabot's config * ci: remove Commitlint workflow (replaced by semantic-pull-request) (#25) * ci: remove Commitlint workflow (replaced by semantic-pull-request) * ci: fix doctests not running correctly on some OS and Python versions * Add season change event in events.py and enum.py * Add minor change in season change event * Add documentation, change enum constants, change output object of _search_earth_season_change * Minor changes to _search_earth_season_change * Update EventType enum, update class of details * Fix minor bugs * docs: Update docs for _search_earth_season_change and _search_conjunction.chore: make minor changes to _search_earth_season_change * Update: minor changes to match Python coding style. * Update: minor changes to match Python coding style. Docs: update docstring of _search_earth_season_change and _search_conjunction * test:update legacy tests for events.py. update: update enum.py and events.py to match black coding style. * Fix some minor issues with Black and Event.details field Co-authored-by: Jérôme Deuchnord <jerome@deuchnord.fr> Co-authored-by: Jérôme Deuchnord <Deuchnord@users.noreply.github.com> BREAKING CHANGE: the `Event.details` field is now a dictionary (was previously a string).pull/22/head
| @@ -7,7 +7,7 @@ updates: | |||||
| interval: daily | interval: daily | ||||
| time: "04:00" | time: "04:00" | ||||
| open-pull-requests-limit: 10 | open-pull-requests-limit: 10 | ||||
| target-branch: master | |||||
| target-branch: main | |||||
| reviewers: | reviewers: | ||||
| - Deuchnord | - Deuchnord | ||||
| commit-message: | commit-message: | ||||
| @@ -1,21 +0,0 @@ | |||||
| name: Commit | |||||
| on: | |||||
| push: | |||||
| branches: [main, features] | |||||
| pull_request: | |||||
| branches: [main, features] | |||||
| jobs: | |||||
| commitlint: | |||||
| name: Message validation | |||||
| runs-on: ubuntu-latest | |||||
| steps: | |||||
| - uses: actions/checkout@v2 | |||||
| with: | |||||
| fetch-depth: 0 | |||||
| - uses: wagoid/commitlint-github-action@v2 | |||||
| with: | |||||
| helpURL: 'https://github.com/Kosmorro/kosmorro/blob/master/CONTRIBUTING.md#commiting' | |||||
| @@ -108,8 +108,8 @@ jobs: | |||||
| run: | | run: | | ||||
| make coverage-doctests | make coverage-doctests | ||||
| - name: Run doc tests | |||||
| if: ${{ matrix.os != 'ubuntu-20.04' && matrix.python_version != '3.9' }} | |||||
| - name: Run doc tests (without coverage) | |||||
| if: ${{ matrix.os != 'ubuntu-20.04' || matrix.python_version != '3.9' }} | |||||
| run: | | run: | | ||||
| make doctests | make doctests | ||||
| @@ -33,7 +33,7 @@ changelog: | |||||
| @echo -e " When everything is good, finish the release with 'make tag'." | @echo -e " When everything is good, finish the release with 'make tag'." | ||||
| tag: env | tag: env | ||||
| git add CHANGELOG.md | |||||
| git add CHANGELOG.md kosmorrolib/__version__.py | |||||
| git commit -m "build: bump version $$RELEASE_NUMBER" | git commit -m "build: bump version $$RELEASE_NUMBER" | ||||
| git tag "v$$RELEASE_NUMBER" | git tag "v$$RELEASE_NUMBER" | ||||
| git checkout features | git checkout features | ||||
| @@ -1,6 +1,6 @@ | |||||
| #!/usr/bin/env python3 | #!/usr/bin/env python3 | ||||
| from enum import Enum, auto | |||||
| from enum import Enum | |||||
| class MoonPhaseType(Enum): | class MoonPhaseType(Enum): | ||||
| @@ -16,6 +16,13 @@ class MoonPhaseType(Enum): | |||||
| WANING_CRESCENT = 8 | WANING_CRESCENT = 8 | ||||
| class SeasonType(Enum): | |||||
| MARCH_EQUINOX = 0 | |||||
| JUNE_SOLSTICE = 1 | |||||
| SEPTEMBER_EQUINOX = 2 | |||||
| DECEMBER_SOLSTICE = 3 | |||||
| class EventType(Enum): | class EventType(Enum): | ||||
| """An enumeration for the supported event types.""" | """An enumeration for the supported event types.""" | ||||
| @@ -25,6 +32,7 @@ class EventType(Enum): | |||||
| MAXIMAL_ELONGATION = 4 | MAXIMAL_ELONGATION = 4 | ||||
| MOON_PERIGEE = 5 | MOON_PERIGEE = 5 | ||||
| MOON_APOGEE = 6 | MOON_APOGEE = 6 | ||||
| SEASON_CHANGE = 7 | |||||
| class ObjectType(Enum): | class ObjectType(Enum): | ||||
| @@ -127,6 +127,22 @@ def get_ephemerides( | |||||
| >>> get_ephemerides(pos, datetime.date(2021, 6, 9), timezone=2) | >>> get_ephemerides(pos, datetime.date(2021, 6, 9), timezone=2) | ||||
| [<AsterEphemerides rise_time=2021-06-09 05:36:00 culmination_time=2021-06-09 13:47:00 set_time=2021-06-09 21:58:00 aster=<Object type=STAR name=SUN />>, <AsterEphemerides rise_time=2021-06-09 04:59:00 culmination_time=2021-06-09 13:02:00 set_time=2021-06-09 21:16:00 aster=<Object type=SATELLITE name=MOON />>, <AsterEphemerides rise_time=2021-06-09 06:06:00 culmination_time=2021-06-09 13:58:00 set_time=2021-06-09 21:49:00 aster=<Object type=PLANET name=MERCURY />>, <AsterEphemerides rise_time=2021-06-09 06:52:00 culmination_time=2021-06-09 15:13:00 set_time=2021-06-09 23:34:00 aster=<Object type=PLANET name=VENUS />>, <AsterEphemerides rise_time=2021-06-09 08:38:00 culmination_time=2021-06-09 16:40:00 set_time=2021-06-09 00:44:00 aster=<Object type=PLANET name=MARS />>, <AsterEphemerides rise_time=2021-06-09 01:47:00 culmination_time=2021-06-09 06:54:00 set_time=2021-06-09 12:01:00 aster=<Object type=PLANET name=JUPITER />>, <AsterEphemerides rise_time=2021-06-09 01:06:00 culmination_time=2021-06-09 05:41:00 set_time=2021-06-09 10:16:00 aster=<Object type=PLANET name=SATURN />>, <AsterEphemerides rise_time=2021-06-09 03:56:00 culmination_time=2021-06-09 11:18:00 set_time=2021-06-09 18:40:00 aster=<Object type=PLANET name=URANUS />>, <AsterEphemerides rise_time=2021-06-09 02:27:00 culmination_time=2021-06-09 08:13:00 set_time=2021-06-09 13:59:00 aster=<Object type=PLANET name=NEPTUNE />>, <AsterEphemerides rise_time=2021-06-09 00:26:00 culmination_time=2021-06-09 04:32:00 set_time=2021-06-09 08:38:00 aster=<Object type=PLANET name=PLUTO />>] | [<AsterEphemerides rise_time=2021-06-09 05:36:00 culmination_time=2021-06-09 13:47:00 set_time=2021-06-09 21:58:00 aster=<Object type=STAR name=SUN />>, <AsterEphemerides rise_time=2021-06-09 04:59:00 culmination_time=2021-06-09 13:02:00 set_time=2021-06-09 21:16:00 aster=<Object type=SATELLITE name=MOON />>, <AsterEphemerides rise_time=2021-06-09 06:06:00 culmination_time=2021-06-09 13:58:00 set_time=2021-06-09 21:49:00 aster=<Object type=PLANET name=MERCURY />>, <AsterEphemerides rise_time=2021-06-09 06:52:00 culmination_time=2021-06-09 15:13:00 set_time=2021-06-09 23:34:00 aster=<Object type=PLANET name=VENUS />>, <AsterEphemerides rise_time=2021-06-09 08:38:00 culmination_time=2021-06-09 16:40:00 set_time=2021-06-09 00:44:00 aster=<Object type=PLANET name=MARS />>, <AsterEphemerides rise_time=2021-06-09 01:47:00 culmination_time=2021-06-09 06:54:00 set_time=2021-06-09 12:01:00 aster=<Object type=PLANET name=JUPITER />>, <AsterEphemerides rise_time=2021-06-09 01:06:00 culmination_time=2021-06-09 05:41:00 set_time=2021-06-09 10:16:00 aster=<Object type=PLANET name=SATURN />>, <AsterEphemerides rise_time=2021-06-09 03:56:00 culmination_time=2021-06-09 11:18:00 set_time=2021-06-09 18:40:00 aster=<Object type=PLANET name=URANUS />>, <AsterEphemerides rise_time=2021-06-09 02:27:00 culmination_time=2021-06-09 08:13:00 set_time=2021-06-09 13:59:00 aster=<Object type=PLANET name=NEPTUNE />>, <AsterEphemerides rise_time=2021-06-09 00:26:00 culmination_time=2021-06-09 04:32:00 set_time=2021-06-09 08:38:00 aster=<Object type=PLANET name=PLUTO />>] | ||||
| If an objet does not rise nor set due to your latitude, then both rise and set will be `None`: | |||||
| >>> north_pole = Position(70, 20) | |||||
| >>> south_pole = Position(-70, 20) | |||||
| >>> get_ephemerides(north_pole, datetime.date(2021, 6, 20)) | |||||
| [<AsterEphemerides rise_time=None culmination_time=2021-06-20 10:42:00 set_time=None aster=<Object type=STAR name=SUN />>, <AsterEphemerides rise_time=2021-06-20 14:30:00 culmination_time=2021-06-20 18:44:00 set_time=2021-06-20 22:53:00 aster=<Object type=SATELLITE name=MOON />>, <AsterEphemerides rise_time=2021-06-20 22:56:00 culmination_time=2021-06-20 09:47:00 set_time=2021-06-20 20:34:00 aster=<Object type=PLANET name=MERCURY />>, <AsterEphemerides rise_time=None culmination_time=2021-06-20 12:20:00 set_time=None aster=<Object type=PLANET name=VENUS />>, <AsterEphemerides rise_time=None culmination_time=2021-06-20 13:17:00 set_time=None aster=<Object type=PLANET name=MARS />>, <AsterEphemerides rise_time=2021-06-20 23:06:00 culmination_time=2021-06-20 03:04:00 set_time=2021-06-20 06:58:00 aster=<Object type=PLANET name=JUPITER />>, <AsterEphemerides rise_time=2021-06-20 23:28:00 culmination_time=2021-06-20 01:48:00 set_time=2021-06-20 04:05:00 aster=<Object type=PLANET name=SATURN />>, <AsterEphemerides rise_time=2021-06-20 21:53:00 culmination_time=2021-06-20 07:29:00 set_time=2021-06-20 17:02:00 aster=<Object type=PLANET name=URANUS />>, <AsterEphemerides rise_time=2021-06-20 22:51:00 culmination_time=2021-06-20 04:22:00 set_time=2021-06-20 09:50:00 aster=<Object type=PLANET name=NEPTUNE />>, <AsterEphemerides rise_time=None culmination_time=2021-06-20 00:40:00 set_time=None aster=<Object type=PLANET name=PLUTO />>] | |||||
| >>> get_ephemerides(north_pole, datetime.date(2021, 12, 21)) | |||||
| [<AsterEphemerides rise_time=None culmination_time=2021-12-21 10:38:00 set_time=None aster=<Object type=STAR name=SUN />>, <AsterEphemerides rise_time=None culmination_time=2021-12-21 00:04:00 set_time=None aster=<Object type=SATELLITE name=MOON />>, <AsterEphemerides rise_time=None culmination_time=2021-12-21 11:33:00 set_time=None aster=<Object type=PLANET name=MERCURY />>, <AsterEphemerides rise_time=2021-12-21 11:58:00 culmination_time=2021-12-21 12:33:00 set_time=2021-12-21 13:08:00 aster=<Object type=PLANET name=VENUS />>, <AsterEphemerides rise_time=None culmination_time=2021-12-21 08:54:00 set_time=None aster=<Object type=PLANET name=MARS />>, <AsterEphemerides rise_time=2021-12-21 11:07:00 culmination_time=2021-12-21 14:43:00 set_time=2021-12-21 18:19:00 aster=<Object type=PLANET name=JUPITER />>, <AsterEphemerides rise_time=2021-12-21 11:32:00 culmination_time=2021-12-21 13:33:00 set_time=2021-12-21 15:33:00 aster=<Object type=PLANET name=SATURN />>, <AsterEphemerides rise_time=2021-12-21 09:54:00 culmination_time=2021-12-21 19:13:00 set_time=2021-12-21 04:37:00 aster=<Object type=PLANET name=URANUS />>, <AsterEphemerides rise_time=2021-12-21 10:49:00 culmination_time=2021-12-21 16:05:00 set_time=2021-12-21 21:21:00 aster=<Object type=PLANET name=NEPTUNE />>, <AsterEphemerides rise_time=None culmination_time=2021-12-21 12:31:00 set_time=None aster=<Object type=PLANET name=PLUTO />>] | |||||
| >>> get_ephemerides(south_pole, datetime.date(2021, 6, 20)) | |||||
| [<AsterEphemerides rise_time=None culmination_time=2021-06-20 10:42:00 set_time=None aster=<Object type=STAR name=SUN />>, <AsterEphemerides rise_time=2021-06-20 11:10:00 culmination_time=2021-06-20 19:06:00 set_time=2021-06-20 01:20:00 aster=<Object type=SATELLITE name=MOON />>, <AsterEphemerides rise_time=2021-06-20 07:47:00 culmination_time=2021-06-20 09:47:00 set_time=2021-06-20 11:48:00 aster=<Object type=PLANET name=MERCURY />>, <AsterEphemerides rise_time=None culmination_time=2021-06-20 12:20:00 set_time=None aster=<Object type=PLANET name=VENUS />>, <AsterEphemerides rise_time=2021-06-20 12:14:00 culmination_time=2021-06-20 13:17:00 set_time=2021-06-20 14:21:00 aster=<Object type=PLANET name=MARS />>, <AsterEphemerides rise_time=2021-06-20 18:32:00 culmination_time=2021-06-20 03:04:00 set_time=2021-06-20 11:32:00 aster=<Object type=PLANET name=JUPITER />>, <AsterEphemerides rise_time=2021-06-20 15:20:00 culmination_time=2021-06-20 01:48:00 set_time=2021-06-20 12:12:00 aster=<Object type=PLANET name=SATURN />>, <AsterEphemerides rise_time=2021-06-20 04:32:00 culmination_time=2021-06-20 07:29:00 set_time=2021-06-20 10:26:00 aster=<Object type=PLANET name=URANUS />>, <AsterEphemerides rise_time=2021-06-20 21:28:00 culmination_time=2021-06-20 04:22:00 set_time=2021-06-20 11:13:00 aster=<Object type=PLANET name=NEPTUNE />>, <AsterEphemerides rise_time=None culmination_time=2021-06-20 00:40:00 set_time=None aster=<Object type=PLANET name=PLUTO />>] | |||||
| >>> get_ephemerides(south_pole, datetime.date(2021, 12, 22)) | |||||
| [<AsterEphemerides rise_time=None culmination_time=2021-12-22 10:39:00 set_time=None aster=<Object type=STAR name=SUN />>, <AsterEphemerides rise_time=None culmination_time=2021-12-22 01:01:00 set_time=None aster=<Object type=SATELLITE name=MOON />>, <AsterEphemerides rise_time=None culmination_time=2021-12-22 11:35:00 set_time=None aster=<Object type=PLANET name=MERCURY />>, <AsterEphemerides rise_time=None culmination_time=2021-12-22 12:27:00 set_time=None aster=<Object type=PLANET name=VENUS />>, <AsterEphemerides rise_time=None culmination_time=2021-12-22 08:53:00 set_time=None aster=<Object type=PLANET name=MARS />>, <AsterEphemerides rise_time=2021-12-22 05:52:00 culmination_time=2021-12-22 14:40:00 set_time=2021-12-22 23:26:00 aster=<Object type=PLANET name=JUPITER />>, <AsterEphemerides rise_time=2021-12-22 02:41:00 culmination_time=2021-12-22 13:29:00 set_time=2021-12-22 00:21:00 aster=<Object type=PLANET name=SATURN />>, <AsterEphemerides rise_time=2021-12-22 16:01:00 culmination_time=2021-12-22 19:09:00 set_time=2021-12-22 22:17:00 aster=<Object type=PLANET name=URANUS />>, <AsterEphemerides rise_time=2021-12-22 08:59:00 culmination_time=2021-12-22 16:01:00 set_time=2021-12-22 23:04:00 aster=<Object type=PLANET name=NEPTUNE />>, <AsterEphemerides rise_time=None culmination_time=2021-12-22 12:27:00 set_time=None aster=<Object type=PLANET name=PLUTO />>] | |||||
| """ | """ | ||||
| ephemerides = [] | ephemerides = [] | ||||
| @@ -173,10 +189,12 @@ def get_ephemerides( | |||||
| except ValueError: | except ValueError: | ||||
| culmination_time = None | culmination_time = None | ||||
| rise_time, set_time = None, None | |||||
| if len(rise_times) == 2: | if len(rise_times) == 2: | ||||
| rise_time = rise_times[0 if arr[0] else 1] | rise_time = rise_times[0 if arr[0] else 1] | ||||
| set_time = rise_times[1 if not arr[1] else 0] | set_time = rise_times[1 if not arr[1] else 0] | ||||
| else: | |||||
| elif len(rise_times) == 1: | |||||
| rise_time = rise_times[0] if arr[0] else None | rise_time = rise_times[0] if arr[0] else None | ||||
| set_time = rise_times[0] if not arr[0] else None | set_time = rise_times[0] if not arr[0] else None | ||||
| @@ -5,16 +5,34 @@ from datetime import date | |||||
| from skyfield.errors import EphemerisRangeError | from skyfield.errors import EphemerisRangeError | ||||
| from skyfield.timelib import Time | from skyfield.timelib import Time | ||||
| from skyfield.searchlib import find_discrete, find_maxima, find_minima | from skyfield.searchlib import find_discrete, find_maxima, find_minima | ||||
| from skyfield import almanac | |||||
| from numpy import pi | from numpy import pi | ||||
| from .model import Event, Star, Planet, ASTERS | |||||
| from .dateutil import translate_to_timezone | |||||
| from .enum import EventType, ObjectIdentifier | |||||
| from .exceptions import OutOfRangeDateError | |||||
| from .core import get_timescale, get_skf_objects, flatten_list | |||||
| from kosmorrolib.model import Event, Star, Planet, ASTERS | |||||
| from kosmorrolib.dateutil import translate_to_timezone | |||||
| from kosmorrolib.enum import EventType, ObjectIdentifier, SeasonType | |||||
| from kosmorrolib.exceptions import OutOfRangeDateError | |||||
| from kosmorrolib.core import get_timescale, get_skf_objects, flatten_list | |||||
| def _search_conjunction(start_time: Time, end_time: Time, timezone: int) -> [Event]: | def _search_conjunction(start_time: Time, end_time: Time, timezone: int) -> [Event]: | ||||
| """Function to search conjunction. | |||||
| **Warning:** this is an internal function, not intended for use by end-developers. | |||||
| Will return MOON and VENUS opposition on 2021-06-12: | |||||
| >>> conjunction = _search_conjunction(get_timescale().utc(2021,6,12),get_timescale().utc(2021,6,13),0) | |||||
| >>> len(conjunction) | |||||
| 1 | |||||
| >>> conjunction[0].objects | |||||
| [<Object type=SATELLITE name=MOON />, <Object type=PLANET name=VENUS />] | |||||
| Will return nothing if no conjunction happens: | |||||
| >>> _search_conjunction(get_timescale().utc(2021,6,17),get_timescale().utc(2021,6,18),0) | |||||
| [] | |||||
| """ | |||||
| earth = get_skf_objects()["earth"] | earth = get_skf_objects()["earth"] | ||||
| aster1 = None | aster1 = None | ||||
| aster2 = None | aster2 = None | ||||
| @@ -177,13 +195,13 @@ def _search_maximal_elongations( | |||||
| ) | ) | ||||
| for i, time in enumerate(times): | for i, time in enumerate(times): | ||||
| elongation = elongations[i] | |||||
| elongation = round(elongations[i], 1) | |||||
| events.append( | events.append( | ||||
| Event( | Event( | ||||
| EventType.MAXIMAL_ELONGATION, | EventType.MAXIMAL_ELONGATION, | ||||
| [aster], | [aster], | ||||
| translate_to_timezone(time.utc_datetime(), timezone), | translate_to_timezone(time.utc_datetime(), timezone), | ||||
| details="{:.3n}°".format(elongation), | |||||
| details={"deg": elongation}, | |||||
| ) | ) | ||||
| ) | ) | ||||
| @@ -245,6 +263,45 @@ def _search_moon_perigee(start_time: Time, end_time: Time, timezone: int) -> [Ev | |||||
| return events | return events | ||||
| def _search_earth_season_change( | |||||
| start_time: Time, end_time: Time, timezone: int | |||||
| ) -> [Event]: | |||||
| """Function to find earth season change event. | |||||
| **Warning:** this is an internal function, not intended for use by end-developers. | |||||
| Will return JUNE SOLSTICE on 2020/06/20: | |||||
| >>> season_change = _search_earth_season_change(get_timescale().utc(2020, 6, 20), get_timescale().utc(2020, 6, 21), 0) | |||||
| >>> len(season_change) | |||||
| 1 | |||||
| >>> season_change[0].event_type | |||||
| <EventType.SEASON_CHANGE: 7> | |||||
| >>> season_change[0].details | |||||
| {'season': <SeasonType.JUNE_SOLSTICE: 1>} | |||||
| Will return nothing if there is no season change event in the period of time being calculated: | |||||
| >>> _search_earth_season_change(get_timescale().utc(2021, 6, 17), get_timescale().utc(2021, 6, 18), 0) | |||||
| [] | |||||
| """ | |||||
| events = [] | |||||
| event_time, event_id = almanac.find_discrete( | |||||
| start_time, end_time, almanac.seasons(get_skf_objects()) | |||||
| ) | |||||
| if len(event_time) == 0: | |||||
| return [] | |||||
| events.append( | |||||
| Event( | |||||
| EventType.SEASON_CHANGE, | |||||
| [], | |||||
| translate_to_timezone(event_time.utc_datetime()[0], timezone), | |||||
| details={"season": SeasonType(event_id[0])}, | |||||
| ) | |||||
| ) | |||||
| return events | |||||
| def get_events(for_date: date = date.today(), timezone: int = 0) -> [Event]: | def get_events(for_date: date = date.today(), timezone: int = 0) -> [Event]: | ||||
| """Calculate and return a list of events for the given date, adjusted to the given timezone if any. | """Calculate and return a list of events for the given date, adjusted to the given timezone if any. | ||||
| @@ -265,7 +322,7 @@ def get_events(for_date: date = date.today(), timezone: int = 0) -> [Event]: | |||||
| If there is no events for the given date, then an empty list is returned: | If there is no events for the given date, then an empty list is returned: | ||||
| >>> get_events(date(2021, 3, 20)) | |||||
| >>> get_events(date(2021, 4, 20)) | |||||
| [] | [] | ||||
| :param for_date: the date for which the events must be calculated | :param for_date: the date for which the events must be calculated | ||||
| @@ -289,6 +346,7 @@ def get_events(for_date: date = date.today(), timezone: int = 0) -> [Event]: | |||||
| _search_maximal_elongations, | _search_maximal_elongations, | ||||
| _search_moon_apogee, | _search_moon_apogee, | ||||
| _search_moon_perigee, | _search_moon_perigee, | ||||
| _search_earth_season_change, | |||||
| ]: | ]: | ||||
| found_events.append(fun(start_time, end_time, timezone)) | found_events.append(fun(start_time, end_time, timezone)) | ||||
| @@ -154,7 +154,7 @@ class Event(Serializable): | |||||
| objects: [Object], | objects: [Object], | ||||
| start_time: datetime, | start_time: datetime, | ||||
| end_time: Union[datetime, None] = None, | end_time: Union[datetime, None] = None, | ||||
| details: str = None, | |||||
| details: {str: any} = None, | |||||
| ): | ): | ||||
| self.event_type = event_type | self.event_type = event_type | ||||
| self.objects = objects | self.objects = objects | ||||
| @@ -74,7 +74,7 @@ EXPECTED_EVENTS = [ | |||||
| EventType.MAXIMAL_ELONGATION, | EventType.MAXIMAL_ELONGATION, | ||||
| [ASTERS[2]], | [ASTERS[2]], | ||||
| datetime(2020, 2, 10, 13, 46), | datetime(2020, 2, 10, 13, 46), | ||||
| details="18.2°", | |||||
| details={"deg": 18.2}, | |||||
| ), | ), | ||||
| Event(EventType.MOON_PERIGEE, [ASTERS[1]], datetime(2020, 2, 10, 20, 34)), | Event(EventType.MOON_PERIGEE, [ASTERS[1]], datetime(2020, 2, 10, 20, 34)), | ||||
| ], | ], | ||||
| @@ -86,14 +86,14 @@ EXPECTED_EVENTS = [ | |||||
| EventType.MAXIMAL_ELONGATION, | EventType.MAXIMAL_ELONGATION, | ||||
| [ASTERS[2]], | [ASTERS[2]], | ||||
| datetime(2020, 3, 24, 1, 56), | datetime(2020, 3, 24, 1, 56), | ||||
| details="27.8°", | |||||
| details={"deg": 27.8}, | |||||
| ), | ), | ||||
| Event(EventType.MOON_APOGEE, [ASTERS[1]], datetime(2020, 3, 24, 15, 39)), | Event(EventType.MOON_APOGEE, [ASTERS[1]], datetime(2020, 3, 24, 15, 39)), | ||||
| Event( | Event( | ||||
| EventType.MAXIMAL_ELONGATION, | EventType.MAXIMAL_ELONGATION, | ||||
| [ASTERS[3]], | [ASTERS[3]], | ||||
| datetime(2020, 3, 24, 21, 58), | datetime(2020, 3, 24, 21, 58), | ||||
| details="46.1°", | |||||
| details={"deg": 46.1}, | |||||
| ), | ), | ||||
| ], | ], | ||||
| ), | ), | ||||