astronoby 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2ab8b9191b1b2452c678389fbc4c1750c4080c8f3cddf55cf7aebad2d99a0da7
4
- data.tar.gz: f823456f556792e1d2ea3747f3665c84442a907c3a08271df5f871204bd09f10
3
+ metadata.gz: 3c65785b0c459ba8add86fcceb906205caa79a80f47b7f33c0b7ee008173fd14
4
+ data.tar.gz: 66478c6055d84e34f560490f225ae3e3d5020972e729b37e8f6f0a6566ae173e
5
5
  SHA512:
6
- metadata.gz: b14d2a19972991fecc5b0a12c15fe18f3a9a07d0e9fc705fe2d984af14e45ae82962332361e65dace20c27b5f6e05e19483385731770abe463a3bf28adcfb354
7
- data.tar.gz: 725810244872e539789b23d2b28ce656781a1f9121fabc76c3e2ebc5c9e6616900bff852290cf8719a10feb7a06afa42f7d02f4e00ac3ba2dadc4dea47d6a24c
6
+ metadata.gz: 4bae651aabaec62d258a768952eb3cd830d99639acf33f02b9f0ab6fd2eeff8215d9a30087a5818736b777c1a86344918f98f33f987f65829a8712cb20477c55
7
+ data.tar.gz: 401659e2d49599246ad2ea1a455a6d60b9797c49e730cacf8a614f4235929263c9318644373a96ea496969fcb814cc93144a8dbfffd0a0318e1628500bb1c8e8
data/CHANGELOG.md CHANGED
@@ -1,5 +1,77 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.4.0 - 2024-04-29
4
+
5
+ _If you are upgrading: please see [UPGRADING.md]._
6
+
7
+ [UPGRADING.md]: https://github.com/rhannequin/astronoby/blob/main/UPGRADING.md
8
+
9
+ ### Bug fixes
10
+
11
+ * Fix ecliptic to equatorial epoch ([#56])
12
+
13
+ [#56]: https://github.com/rhannequin/astronoby/pull/56
14
+
15
+ ### Features
16
+
17
+ * Add twilight times ([#49])
18
+ * Add interpolation method ([#52])
19
+ * Add decimal_hour_to_time util ([#53])
20
+ * Calculate leap seconds for an instant ([#54])
21
+ * Add `Angle#-@` ([#55])
22
+ * Enable equivalence and hash equality to `Observer` ([#57])
23
+ * Twilight events dedicated class ([#61])
24
+
25
+ [#49]: https://github.com/rhannequin/astronoby/pull/49
26
+ [#52]: https://github.com/rhannequin/astronoby/pull/52
27
+ [#53]: https://github.com/rhannequin/astronoby/pull/53
28
+ [#54]: https://github.com/rhannequin/astronoby/pull/54
29
+ [#55]: https://github.com/rhannequin/astronoby/pull/55
30
+ [#57]: https://github.com/rhannequin/astronoby/pull/57
31
+ [#61]: https://github.com/rhannequin/astronoby/pull/61
32
+
33
+ ### Improvements
34
+
35
+ * Upgrade bundler from 2.3.11 to 2.5.7 by @dorianmariecom ([#45])
36
+ * Drop `BigDecimal` ([#46])
37
+ * Bump rake from 13.1.0 to 13.2.0 ([#47])
38
+ * Increase Ruby versions support ([#48])
39
+ * Bump rake from 13.2.0 to 13.2.1 ([#51])
40
+ * Dedicated constants class ([#62])
41
+ * Improve accuracy of equation of time ([#63])
42
+ * Twilight times better accuracy ([#65])
43
+ * Update UPGRADING.md ([#66])
44
+ * release: Bump version to 0.4.0 ([#67])
45
+
46
+ [#45]: https://github.com/rhannequin/astronoby/pull/45
47
+ [#46]: https://github.com/rhannequin/astronoby/pull/46
48
+ [#47]: https://github.com/rhannequin/astronoby/pull/47
49
+ [#48]: https://github.com/rhannequin/astronoby/pull/48
50
+ [#51]: https://github.com/rhannequin/astronoby/pull/51
51
+ [#62]: https://github.com/rhannequin/astronoby/pull/62
52
+ [#63]: https://github.com/rhannequin/astronoby/pull/63
53
+ [#65]: https://github.com/rhannequin/astronoby/pull/65
54
+ [#66]: https://github.com/rhannequin/astronoby/pull/66
55
+ [#67]: https://github.com/rhannequin/astronoby/pull/67
56
+
57
+ ### Backward-incompatible changes
58
+
59
+ * More accurate rising, transit and setting times ([#50])
60
+ * Observation events dedicated and centralized class ([#60])
61
+ * Change `Astronoby::Sun` constructor ([#64])
62
+
63
+ [#50]: https://github.com/rhannequin/astronoby/pull/50
64
+ [#60]: https://github.com/rhannequin/astronoby/pull/60
65
+ [#64]: https://github.com/rhannequin/astronoby/pull/64
66
+
67
+ ### New Contributors
68
+
69
+ * @dorianmariecom made their first contribution in [#45]
70
+
71
+ [#45]: https://github.com/rhannequin/astronoby/pull/45
72
+
73
+ **Full Changelog**: https://github.com/rhannequin/astronoby/compare/v0.3.0...v0.4.0
74
+
3
75
  ## 0.3.0 - 2024-03-29
4
76
 
5
77
  _If you are upgrading: please see [`UPGRADING.md`]._
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- astronoby (0.3.0)
4
+ astronoby (0.4.0)
5
5
  matrix (~> 0.4.2)
6
6
  rake (~> 13.0)
7
7
  rspec (~> 3.0)
@@ -21,7 +21,7 @@ GEM
21
21
  racc
22
22
  racc (1.7.3)
23
23
  rainbow (3.1.1)
24
- rake (13.1.0)
24
+ rake (13.2.1)
25
25
  regexp_parser (2.9.0)
26
26
  rexml (3.2.6)
27
27
  rspec (3.13.0)
@@ -77,4 +77,4 @@ DEPENDENCIES
77
77
  standard (~> 1.3)
78
78
 
79
79
  BUNDLED WITH
80
- 2.3.11
80
+ 2.5.7
data/README.md CHANGED
@@ -32,7 +32,7 @@ major one is released.
32
32
 
33
33
  ```rb
34
34
  angle1 = Astronoby::Angle.from_degrees(90)
35
- angle2 = Astronoby::Angle.from_radians(Astronoby::Angle::PI / 2)
35
+ angle2 = Astronoby::Angle.from_radians(Math::PI / 2)
36
36
  angle3 = Astronoby::Angle.from_hours(12)
37
37
 
38
38
  angle1 == angle2
@@ -71,47 +71,82 @@ horizontal.azimuth.str(:dms)
71
71
 
72
72
  ```rb
73
73
  time = Time.utc(2023, 2, 17, 11, 0, 0)
74
- epoch = Astronoby::Epoch.from_time(time)
75
74
 
76
75
  latitude = Astronoby::Angle.from_degrees(48.8566)
77
76
  longitude = Astronoby::Angle.from_degrees(2.3522)
78
77
 
79
- sun = Astronoby::Sun.new(epoch: epoch)
78
+ sun = Astronoby::Sun.new(time: time)
80
79
 
81
80
  horizontal_coordinates = sun.horizontal_coordinates(
82
81
  latitude: latitude,
83
82
  longitude: longitude
84
83
  )
85
84
 
86
- horizontal_coordinates.altitude.degrees.to_f
87
- # => 27.50008242057459
85
+ horizontal_coordinates.altitude.degrees
86
+ # => 27.500082409271247
88
87
 
89
88
  horizontal_coordinates.altitude.str(:dms)
90
- # => "+27° 30′ 0.2967″"
89
+ # => "+27° 30′ 0.2966″"
91
90
  ```
92
91
 
93
92
  ### Sunrise and sunset times and azimuths
94
93
 
95
94
  ```rb
96
- date = Date.new(2015, 2, 5)
97
- epoch = Astronoby::Epoch.from_time(date)
95
+ time = Time.new(2015, 2, 5)
98
96
  observer = Astronoby::Observer.new(
99
97
  latitude: Astronoby::Angle.from_degrees(38),
100
98
  longitude: Astronoby::Angle.from_degrees(-78)
101
99
  )
102
- sun = Astronoby::Sun.new(epoch: epoch)
100
+ sun = Astronoby::Sun.new(time: time)
101
+ observation_events = sun.observation_events(observer: observer)
103
102
 
104
- sun.rising_time(observer: observer)
105
- # => 2015-02-05 12:13:26 UTC
103
+ observation_events.rising_time
104
+ # => 2015-02-05 12:12:59 UTC
106
105
 
107
- sun.rising_azimuth(observer: observer).str(:dms)
108
- # => "+109° 4122.2585″"
106
+ observation_events.rising_azimuth.str(:dms)
107
+ # => "+109° 4643.145″"
109
108
 
110
- sun.setting_time(observer: observer)
111
- # => 2015-02-05 22:35:12 UTC
109
+ observation_events.transit_time
110
+ # => 2015-02-05 17:25:59 UTC
112
111
 
113
- sun.setting_azimuth(observer: observer).str(:dms)
114
- # => "+250° 1837.7414″"
112
+ observation_events.transit_altitude.str(:dms)
113
+ # => "+36° 815.7638″"
114
+
115
+ observation_events.setting_time
116
+ # => 2015-02-05 22:39:27 UTC
117
+
118
+ observation_events.setting_azimuth.str(:dms)
119
+ # => "+250° 23′ 33.614″"
120
+ ```
121
+
122
+ ### Twilight times
123
+
124
+ ```rb
125
+ time = Time.new(2024, 1, 1)
126
+ sun = Astronoby::Sun.new(time: time)
127
+ observer = Astronoby::Observer.new(
128
+ latitude: Astronoby::Angle.from_degrees(48.8566),
129
+ longitude: Astronoby::Angle.from_degrees(2.3522)
130
+ )
131
+ twilight_events = sun.twilight_events(observer: observer)
132
+
133
+ twilight_events.morning_astronomical_twilight_time
134
+ # => 2024-01-01 05:49:25 UTC
135
+
136
+ twilight_events.morning_nautical_twilight_time
137
+ # => 2024-01-01 06:27:42 UTC
138
+
139
+ twilight_events.morning_civil_twilight_time
140
+ # => 2024-01-01 07:07:50 UTC
141
+
142
+ twilight_events.evening_civil_twilight_time
143
+ # => 2024-01-01 16:40:01 UTC
144
+
145
+ twilight_events.evening_nautical_twilight_time
146
+ # => 2024-01-01 17:20:10 UTC
147
+
148
+ twilight_events.evening_astronomical_twilight_time
149
+ # => 2024-01-01 17:58:26 UTC
115
150
  ```
116
151
 
117
152
  ### Solstice and Equinox times
data/UPGRADING.md CHANGED
@@ -7,6 +7,30 @@ changes to it as long as a major version has not been released.
7
7
  If you are already using Astronoby and wish to follow the changes to its
8
8
  public API, please read the upgrading notes for each release.
9
9
 
10
+ ## Upgrading from 0.3.0 to 0.4.0
11
+
12
+ ### `Body` class removed ([#50])
13
+
14
+ The different behaviors from `Body` have been moved to other classes like
15
+ `Events::ObservationEvents`.
16
+
17
+ [#50]: https://github.com/rhannequin/astronoby/pull/50
18
+
19
+ ### Rising and setting times and azimuths removed from `Sun` ([#60])
20
+
21
+ `#rising_time`, `#rising_azimuth`, `#setting_time` and `#setting_azimuth`
22
+ have been removed from `Astronoby::Sun` and moved to
23
+ `Astronoby::Events::ObservationEvents`.
24
+
25
+ [#60]: https://github.com/rhannequin/astronoby/pull/60
26
+
27
+ ### `Sun` constructor changed ([#64])
28
+
29
+ The `Sun` constructor now doesn't accept the `epoch` key argument anymore,
30
+ but only a new `time` key argument.
31
+
32
+ [#64]: https://github.com/rhannequin/astronoby/pull/64
33
+
10
34
  ## Upgrading from 0.2.0 to 0.3.0
11
35
 
12
36
  ### `Sun#ecliptic_coordinates` method removed (#41)
@@ -2,6 +2,8 @@
2
2
 
3
3
  module Astronoby
4
4
  class Aberration
5
+ MAXIMUM_SHIFT = Angle.from_degrees(20.5)
6
+
5
7
  def self.for_ecliptic_coordinates(coordinates:, epoch:)
6
8
  new(coordinates, epoch).apply
7
9
  end
@@ -18,15 +20,15 @@ module Astronoby
18
20
  # Chapter: 36 - Aberration
19
21
  def apply
20
22
  delta_longitude = Angle.from_degrees(
21
- -20.5 * (
23
+ -MAXIMUM_SHIFT.degrees * (
22
24
  sun_longitude - @coordinates.longitude
23
- ).cos / @coordinates.latitude.cos / 3600
25
+ ).cos / @coordinates.latitude.cos / Constants::SECONDS_PER_DEGREE
24
26
  )
25
27
 
26
28
  delta_latitude = Angle.from_degrees(
27
- -20.5 *
29
+ -MAXIMUM_SHIFT.degrees *
28
30
  (sun_longitude - @coordinates.longitude).sin *
29
- @coordinates.latitude.sin / 3600
31
+ @coordinates.latitude.sin / Constants::SECONDS_PER_DEGREE
30
32
  )
31
33
 
32
34
  Coordinates::Ecliptic.new(
@@ -37,7 +39,7 @@ module Astronoby
37
39
 
38
40
  def sun_longitude
39
41
  @_sun_longitude ||= Sun
40
- .new(epoch: @epoch)
42
+ .new(time: Epoch.to_utc(@epoch))
41
43
  .true_ecliptic_coordinates
42
44
  .longitude
43
45
  end
@@ -1,23 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "bigdecimal/math"
4
-
5
3
  module Astronoby
6
4
  class Angle
7
5
  include Comparable
8
6
 
9
- PRECISION = 14
10
- PI = BigMath.PI(PRECISION)
11
- PI_IN_DEGREES = BigDecimal("180")
12
-
13
- FULL_CIRCLE_IN_RADIANS = (2 * PI)
14
-
15
- RADIAN_PER_HOUR = PI / BigDecimal("12")
16
- MINUTES_PER_DEGREE = BigDecimal("60")
17
- MINUTES_PER_HOUR = BigDecimal("60")
18
- SECONDS_PER_MINUTE = BigDecimal("60")
19
- SECONDS_PER_HOUR = MINUTES_PER_HOUR * SECONDS_PER_MINUTE
20
-
7
+ MIN_PRECISION = 10
21
8
  FORMATS = %i[dms hms].freeze
22
9
 
23
10
  class << self
@@ -26,28 +13,32 @@ module Astronoby
26
13
  end
27
14
 
28
15
  def from_radians(radians)
29
- normalized_radians = radians.remainder(FULL_CIRCLE_IN_RADIANS)
16
+ normalized_radians = radians.remainder(Constants::RADIANS_PER_CIRCLE)
30
17
  new(normalized_radians)
31
18
  end
32
19
 
33
20
  def from_degrees(degrees)
34
- radians = degrees / PI_IN_DEGREES * PI
21
+ radians = degrees / Constants::PI_IN_DEGREES * Math::PI
35
22
  from_radians(radians)
36
23
  end
37
24
 
38
25
  def from_hours(hours)
39
- radians = hours * RADIAN_PER_HOUR
26
+ radians = hours * Constants::RADIAN_PER_HOUR
40
27
  from_radians(radians)
41
28
  end
42
29
 
43
30
  def from_hms(hour, minute, second)
44
- hours = hour + minute / MINUTES_PER_HOUR + second / SECONDS_PER_HOUR
31
+ hours = hour +
32
+ minute / Constants::MINUTES_PER_HOUR +
33
+ second / Constants::SECONDS_PER_HOUR
45
34
  from_hours(hours)
46
35
  end
47
36
 
48
37
  def from_dms(degree, minute, second)
49
38
  sign = degree.negative? ? -1 : 1
50
- degrees = degree.abs + minute / MINUTES_PER_HOUR + second / SECONDS_PER_HOUR
39
+ degrees = degree.abs +
40
+ minute / Constants::MINUTES_PER_HOUR +
41
+ second / Constants::SECONDS_PER_HOUR
51
42
  from_degrees(sign * degrees)
52
43
  end
53
44
 
@@ -70,20 +61,16 @@ module Astronoby
70
61
  attr_reader :radians
71
62
 
72
63
  def initialize(radians)
73
- @radians = if radians.is_a?(Integer) || radians.is_a?(BigDecimal)
74
- BigDecimal(radians)
75
- else
76
- BigDecimal(radians, PRECISION)
77
- end
64
+ @radians = radians
78
65
  freeze
79
66
  end
80
67
 
81
68
  def degrees
82
- @radians * PI_IN_DEGREES / PI
69
+ @radians * Constants::PI_IN_DEGREES / Math::PI
83
70
  end
84
71
 
85
72
  def hours
86
- @radians / RADIAN_PER_HOUR
73
+ @radians / Constants::RADIAN_PER_HOUR
87
74
  end
88
75
 
89
76
  def +(other)
@@ -94,6 +81,10 @@ module Astronoby
94
81
  self.class.from_radians(@radians - other.radians)
95
82
  end
96
83
 
84
+ def -@
85
+ self.class.from_radians(-@radians)
86
+ end
87
+
97
88
  def sin
98
89
  Math.sin(radians)
99
90
  end
@@ -144,31 +135,32 @@ module Astronoby
144
135
  sign = deg.negative? ? "-" : "+"
145
136
  absolute_degrees = deg.abs
146
137
  degrees = absolute_degrees.floor
147
- decimal_minutes = MINUTES_PER_DEGREE * (absolute_degrees - degrees)
138
+ decimal_minutes = Constants::MINUTES_PER_DEGREE *
139
+ (absolute_degrees - degrees)
148
140
  absolute_decimal_minutes = (
149
- MINUTES_PER_DEGREE * (absolute_degrees - degrees)
141
+ Constants::MINUTES_PER_DEGREE * (absolute_degrees - degrees)
150
142
  ).abs
151
143
  minutes = decimal_minutes.floor
152
- seconds = SECONDS_PER_MINUTE * (
144
+ seconds = Constants::SECONDS_PER_MINUTE * (
153
145
  absolute_decimal_minutes - absolute_decimal_minutes.floor
154
146
  )
155
147
 
156
- Dms.new(sign, degrees, minutes, seconds.to_f.floor(4))
148
+ Dms.new(sign, degrees, minutes, seconds.floor(4))
157
149
  end
158
150
 
159
151
  def to_hms(hrs)
160
152
  absolute_hours = hrs.abs
161
153
  hours = absolute_hours.floor
162
- decimal_minutes = MINUTES_PER_HOUR * (absolute_hours - hours)
154
+ decimal_minutes = Constants::MINUTES_PER_HOUR * (absolute_hours - hours)
163
155
  absolute_decimal_minutes = (
164
- MINUTES_PER_HOUR * (absolute_hours - hours)
156
+ Constants::MINUTES_PER_HOUR * (absolute_hours - hours)
165
157
  ).abs
166
158
  minutes = decimal_minutes.floor
167
- seconds = SECONDS_PER_MINUTE * (
159
+ seconds = Constants::SECONDS_PER_MINUTE * (
168
160
  absolute_decimal_minutes - absolute_decimal_minutes.floor
169
161
  )
170
162
 
171
- Hms.new(hours, minutes, seconds.to_f.floor(4))
163
+ Hms.new(hours, minutes, seconds.floor(4))
172
164
  end
173
165
  end
174
166
  end