2525from skyfield .api import Topos , Time
2626from skyfield .vectorlib import VectorSum as SkfPlanet
2727
28- from .core import get_skf_objects , get_timescale
28+ from .core import get_skf_objects
29+ from .enum import MoonPhaseType , EventType
2930from .i18n import _
3031
31- MOON_PHASES = {
32- 'NEW_MOON' : _ ('New Moon' ),
33- 'WAXING_CRESCENT' : _ ('Waxing crescent' ),
34- 'FIRST_QUARTER' : _ ('First Quarter' ),
35- 'WAXING_GIBBOUS' : _ ('Waxing gibbous' ),
36- 'FULL_MOON' : _ ('Full Moon' ),
37- 'WANING_GIBBOUS' : _ ('Waning gibbous' ),
38- 'LAST_QUARTER' : _ ('Last Quarter' ),
39- 'WANING_CRESCENT' : _ ('Waning crescent' ),
40- 'UNKNOWN' : _ ('Unavailable' )
41- }
42-
43- EVENTS = {
44- 'OPPOSITION' : {'message' : _ ('%s is in opposition' )},
45- 'CONJUNCTION' : {'message' : _ ('%s and %s are in conjunction' )},
46- 'OCCULTATION' : {'message' : _ ('%s occults %s' )},
47- 'MAXIMAL_ELONGATION' : {'message' : _ ("%s's largest elongation" )},
48- 'MOON_PERIGEE' : {'message' : _ ("%s is at its perigee" )},
49- 'MOON_APOGEE' : {'message' : _ ("%s is at its apogee" )},
50- }
51-
5232
5333class Serializable (ABC ):
5434 @abstractmethod
@@ -57,40 +37,27 @@ def serialize(self) -> dict:
5737
5838
5939class MoonPhase (Serializable ):
60- def __init__ (self , identifier : str , time : datetime = None , next_phase_date : datetime = None ):
61- if identifier not in MOON_PHASES .keys ():
62- raise ValueError ('identifier parameter must be one of %s (got %s)' % (', ' .join (MOON_PHASES .keys ()),
63- identifier ))
64-
65- self .identifier = identifier
40+ def __init__ (self , phase_type : MoonPhaseType , time : datetime = None , next_phase_date : datetime = None ):
41+ self .phase_type = phase_type
6642 self .time = time
6743 self .next_phase_date = next_phase_date
6844
69- def get_phase (self ):
70- return MOON_PHASES [self .identifier ]
71-
72- def get_next_phase_name (self ):
73- next_identifier = self .get_next_phase ()
74-
75- return MOON_PHASES [next_identifier ]
76-
7745 def get_next_phase (self ):
78- if self .identifier == 'NEW_MOON' or self .identifier == 'WAXING_CRESCENT' :
79- next_identifier = 'FIRST_QUARTER'
80- elif self .identifier == 'FIRST_QUARTER' or self .identifier == 'WAXING_GIBBOUS' :
81- next_identifier = 'FULL_MOON'
82- elif self .identifier == 'FULL_MOON' or self .identifier == 'WANING_GIBBOUS' :
83- next_identifier = 'LAST_QUARTER'
84- else :
85- next_identifier = 'NEW_MOON'
86- return next_identifier
46+ if self .phase_type in [MoonPhaseType .NEW_MOON , MoonPhaseType .WAXING_CRESCENT ]:
47+ return MoonPhaseType .FIRST_QUARTER
48+ if self .phase_type in [MoonPhaseType .FIRST_QUARTER , MoonPhaseType .WAXING_GIBBOUS ]:
49+ return MoonPhaseType .FULL_MOON
50+ if self .phase_type in [MoonPhaseType .FULL_MOON , MoonPhaseType .WANING_GIBBOUS ]:
51+ return MoonPhaseType .LAST_QUARTER
52+
53+ return MoonPhaseType .NEW_MOON
8754
8855 def serialize (self ) -> dict :
8956 return {
90- 'phase' : self .identifier ,
57+ 'phase' : self .phase_type . name ,
9158 'time' : self .time .isoformat () if self .time is not None else None ,
9259 'next' : {
93- 'phase' : self .get_next_phase (),
60+ 'phase' : self .get_next_phase (). name ,
9461 'time' : self .next_phase_date .isoformat ()
9562 }
9663 }
@@ -168,13 +135,8 @@ def get_type(self) -> str:
168135
169136
170137class Event (Serializable ):
171- def __init__ (self , event_type : str , objects : [Object ], start_time : datetime ,
138+ def __init__ (self , event_type : EventType , objects : [Object ], start_time : datetime ,
172139 end_time : Union [datetime , None ] = None , details : str = None ):
173- if event_type not in EVENTS .keys ():
174- accepted_types = ', ' .join (EVENTS .keys ())
175- raise ValueError ('event_type parameter must be one of the following: %s (got %s)' % (accepted_types ,
176- event_type ))
177-
178140 self .event_type = event_type
179141 self .objects = objects
180142 self .start_time = start_time
@@ -189,7 +151,7 @@ def __repr__(self):
189151 self .details )
190152
191153 def get_description (self , show_details : bool = True ) -> str :
192- description = EVENTS [ self .event_type ][ 'message' ] % self ._get_objects_name ()
154+ description = self .event_type . value % self ._get_objects_name ()
193155 if show_details and self .details is not None :
194156 description += ' ({:s})' .format (self .details )
195157 return description
@@ -203,50 +165,13 @@ def _get_objects_name(self):
203165 def serialize (self ) -> dict :
204166 return {
205167 'objects' : [object .serialize () for object in self .objects ],
206- 'event' : self .event_type ,
168+ 'event' : self .event_type . name ,
207169 'starts_at' : self .start_time .isoformat (),
208170 'ends_at' : self .end_time .isoformat () if self .end_time is not None else None ,
209171 'details' : self .details
210172 }
211173
212174
213- def skyfield_to_moon_phase (times : [Time ], vals : [int ], now : Time ) -> Union [MoonPhase , None ]:
214- tomorrow = get_timescale ().utc (now .utc_datetime ().year , now .utc_datetime ().month , now .utc_datetime ().day + 1 )
215-
216- phases = list (MOON_PHASES .keys ())
217- current_phase = None
218- current_phase_time = None
219- next_phase_time = None
220- i = 0
221-
222- if len (times ) == 0 :
223- return None
224-
225- for i , time in enumerate (times ):
226- if now .utc_iso () <= time .utc_iso ():
227- if vals [i ] in [0 , 2 , 4 , 6 ]:
228- if time .utc_datetime () < tomorrow .utc_datetime ():
229- current_phase_time = time
230- current_phase = phases [vals [i ]]
231- else :
232- i -= 1
233- current_phase_time = None
234- current_phase = phases [vals [i ]]
235- else :
236- current_phase = phases [vals [i ]]
237-
238- break
239-
240- for j in range (i + 1 , len (times )):
241- if vals [j ] in [0 , 2 , 4 , 6 ]:
242- next_phase_time = times [j ]
243- break
244-
245- return MoonPhase (current_phase ,
246- current_phase_time .utc_datetime () if current_phase_time is not None else None ,
247- next_phase_time .utc_datetime () if next_phase_time is not None else None )
248-
249-
250175class AsterEphemerides (Serializable ):
251176 def __init__ (self ,
252177 rise_time : Union [datetime , None ],
@@ -267,8 +192,6 @@ def serialize(self) -> dict:
267192 }
268193
269194
270- MONTHS = ['JAN' , 'FEB' , 'MAR' , 'APR' , 'MAY' , 'JUN' , 'JUL' , 'AUG' , 'SEP' , 'OCT' , 'NOV' , 'DEC' ]
271-
272195EARTH = Planet ('Earth' , 'EARTH' )
273196
274197ASTERS = [Star (_ ('Sun' ), 'SUN' , radius = 696342 ),
0 commit comments