darian_calendar 0.1.0 → 0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +8 -8
- data/.gitignore +2 -0
- data/.rspec +1 -1
- data/CHANGELOG.md +5 -0
- data/Gemfile +5 -0
- data/README.md +12 -3
- data/lib/darian_calendar.rb +8 -2
- data/lib/darian_calendar/time.rb +63 -34
- data/lib/darian_calendar/version.rb +1 -1
- data/spec/time_spec.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
NGFkYjZjZDk2Y2MwYzA4M2NhNDI4MDczYzEzODJiNjI2ZTk4YmJjNw==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
MmNlMjdmZDQ3ZDk1ZDNmZThmNDM0YjUxY2JhM2U5M2RhOWYyMmJjMQ==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
MzkyNTQ3NmJlNWUyZTEzMzJhYTUzZjBkODcwMDQ3OWYyYWU4ZmY4M2Y0YTgx
|
10
|
+
MWNiODg0MGQ1ZDg3YWM3ZTdjNmM2YjQwNTJkM2RkOGI0YWUxZGZmNDBmMGM4
|
11
|
+
OTcxMTk2M2IwYzI0MWFiN2Q0ZTBjZDNmZTBkNjYxNzQ0MTE0OTU=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
M2EyMmNhZmNmZGViYWY5ZWFmODEzYTUwNTljODAyMjgxNjQxMDExMTFlOWIx
|
14
|
+
YzlmNzFiZTllZTExYmRlMGMwMzcwYmEzMDQ5Y2IzNDgyY2YzOTgzYTI5NTJi
|
15
|
+
Yjg5MzE4OTFkMzAyNDg0YzA4NjgwYjY5YTFlMjQ0YzJmOTgxZGQ=
|
data/.gitignore
CHANGED
data/.rspec
CHANGED
@@ -1 +1 @@
|
|
1
|
-
--
|
1
|
+
--color --format doc
|
data/CHANGELOG.md
CHANGED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -7,7 +7,7 @@ It was created by aerospace engineer and political scientist Thomas Gangale in 1
|
|
7
7
|
|
8
8
|
This Ruby library converts earth time to mars time and back again. You can choose between 5 variants of the Darian calendar system; _Martiana_, _Defrost_, _Areosynchronous_, _Hensel_ and _Aqua_.
|
9
9
|
|
10
|
-
It's based on the [JavaScript Converter] by Thomas Gangale.
|
10
|
+
It's based on the [JavaScript Converter] which was developed by Alan Hensel and Thomas Gangale.
|
11
11
|
|
12
12
|
[Wikipedia]: http://en.wikipedia.org/wiki/Darian_calendar
|
13
13
|
[Darian calendar]: http://en.wikipedia.org/wiki/Darian_calendar
|
@@ -15,8 +15,14 @@ It's based on the [JavaScript Converter] by Thomas Gangale.
|
|
15
15
|
|
16
16
|
## Installation
|
17
17
|
|
18
|
+
In Bundler:
|
18
19
|
```ruby
|
19
|
-
gem
|
20
|
+
gem "darian_calendar"
|
21
|
+
```
|
22
|
+
|
23
|
+
Otherwise:
|
24
|
+
```bash
|
25
|
+
[sudo|rvm] gem install darian_calendar
|
20
26
|
```
|
21
27
|
|
22
28
|
## Usage
|
@@ -82,6 +88,9 @@ Unit tests are provided for all of Darian Calendar's methods:
|
|
82
88
|
bundle exec rspec
|
83
89
|
```
|
84
90
|
|
85
|
-
##
|
91
|
+
## Copyright
|
92
|
+
- _The Darian Calendar Ruby Gem_ is Copyright © 2014 Christian Worreschk, MarSec.
|
93
|
+
- _The Darian System_ is Copyright © 1986-2005 by Thomas Gangale
|
86
94
|
|
95
|
+
## License
|
87
96
|
This Darian Calendar Ruby Gem is released under the [European Union Public Licence V. 1.1](http://opensource.org/licenses/EUPL-1.1).
|
data/lib/darian_calendar.rb
CHANGED
@@ -2,12 +2,18 @@
|
|
2
2
|
|
3
3
|
require 'darian_calendar/time'
|
4
4
|
|
5
|
+
# This Ruby library converts earth time to mars time and back again. You can choose between 5 variants of the Darian calendar system; Martiana, Defrost, Areosynchronous, Hensel and Aqua.
|
6
|
+
# See http://github.com/marsec/darian_calendar for more Information.
|
7
|
+
# It's based on the JavaScript Converter which was developed by Alan Hensel and Thomas Gangale. (http://pweb.jps.net/~tgangale/mars/converter/calendar_clock.htm)
|
5
8
|
module DarianCalendar
|
6
9
|
|
7
10
|
class << self
|
8
11
|
|
9
|
-
|
10
|
-
|
12
|
+
# Returns the current mars time. Shortcut for 'DarianCalendar::Time.now'
|
13
|
+
# @param type [DarianCalendar::CalendarTypes] Calendar type
|
14
|
+
# @return [DarianCalendar::Time] current mars time
|
15
|
+
def now(type=CalendarTypes::MARTIANA)
|
16
|
+
DarianCalendar::Time.now(type)
|
11
17
|
end
|
12
18
|
|
13
19
|
end
|
data/lib/darian_calendar/time.rb
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
module DarianCalendar
|
4
4
|
|
5
|
+
# Variantes of the Darian calendar system
|
5
6
|
module CalendarTypes
|
6
7
|
MARTIANA = :martiana
|
7
8
|
DEFROST = :defrost
|
@@ -10,86 +11,108 @@ module DarianCalendar
|
|
10
11
|
AQUA = :aqua
|
11
12
|
end
|
12
13
|
|
14
|
+
# Timestamp in the Darian calendar system
|
13
15
|
class Time
|
14
16
|
include Comparable
|
15
17
|
|
16
|
-
|
17
|
-
|
18
|
+
# @return [Integer] year
|
18
19
|
attr_reader :year
|
20
|
+
# @return [Integer] month of the year
|
19
21
|
attr_reader :month
|
22
|
+
# @return [Integer] sol of the month
|
20
23
|
attr_reader :sol
|
21
|
-
|
24
|
+
# @return [Integer] hour of the sol
|
22
25
|
attr_reader :hour
|
26
|
+
# @return [Integer] minute of the hour
|
23
27
|
attr_reader :min
|
28
|
+
# @return [Integer] second of the minute
|
24
29
|
attr_reader :sec
|
25
|
-
|
30
|
+
# @return [String] full month name ("Mithuna")
|
26
31
|
attr_reader :month_name
|
32
|
+
# @return [String] full weeksol name ("Sol Jovis")
|
27
33
|
attr_reader :week_sol_name
|
28
|
-
|
34
|
+
# @return [Float] number of sols (with hour, minutes and seconds) since the earth date 0-0-0
|
29
35
|
attr_reader :total_sols
|
36
|
+
# @return [String] sol of the week
|
30
37
|
attr_reader :week_sol
|
38
|
+
# @return [Integer] season of the year
|
31
39
|
attr_reader :season
|
40
|
+
# @return [Integer] sol of the season
|
32
41
|
attr_reader :sol_of_season
|
42
|
+
# @return [Integer] month of the season
|
33
43
|
attr_reader :month_of_season
|
44
|
+
# @return [Integer] sol of the year
|
34
45
|
attr_reader :sol_of_year
|
35
|
-
|
46
|
+
# @return [String] name of the calendar type ("Martiana")
|
36
47
|
attr_reader :calendar_type
|
37
48
|
|
38
49
|
alias :day :sol
|
39
50
|
alias :week_day :week_sol
|
40
51
|
|
41
|
-
#</editor-fold>
|
42
|
-
|
43
|
-
#<editor-fold desc="Constants">
|
44
|
-
|
45
52
|
MARS_TO_EARTH_DAYS = 1.027491251
|
46
53
|
EPOCH_OFFSET = 587744.77817
|
47
54
|
SECONDS_A_DAY = 86400.0
|
48
55
|
ROUND_UP_SECOND = 1/SECONDS_A_DAY;
|
49
56
|
E_DAYS_TIL_UNIX = 719527.0
|
50
57
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
58
|
+
SOL_NAMES = {
|
59
|
+
martiana: ['Sol Solis', 'Sol Lunae', 'Sol Martis', 'Sol Mercurii', 'Sol Jovis', 'Sol Veneris', 'Sol Saturni'],
|
60
|
+
defrost: ['Axatisol', 'Benasol', 'Ciposol', 'Domesol', 'Erjasol', 'Fulisol', 'Gavisol'],
|
61
|
+
areosynchronous: ['Heliosol', 'Phobosol', 'Deimosol', 'Terrasol', 'Venusol', 'Mercurisol', 'Jovisol']
|
62
|
+
}
|
63
|
+
MONTH_NAMES = {
|
64
|
+
martiana: ['Sagittarius', 'Dhanus', 'Capricornus', 'Makara', 'Aquarius', 'Kumbha', 'Pisces', 'Mina', 'Aries', 'Mesha', 'Taurus', 'Rishabha', 'Gemini', 'Mithuna', 'Cancer', 'Karka', 'Leo', 'Simha', 'Virgo', 'Kanya', 'Libra', 'Tula', 'Scorpius', 'Vrishika'],
|
65
|
+
defrost: ['Adir', 'Bora', 'Coan', 'Deti', 'Edal', 'Flo', 'Geor', 'Heliba', 'Idanon', 'Jowani', 'Kireal', 'Larno', 'Medior', 'Neturima', 'Ozulikan', 'Pasurabi', 'Rudiakel', 'Safundo', 'Tiunor', 'Ulasja', 'Vadeun', 'Wakumi', 'Xetual', 'Zungo'],
|
66
|
+
hensel: ['Vernalis', 'Duvernalis', 'Trivernalis', 'Quadrivernalis', 'Pentavernalis', 'Hexavernalis', 'Aestas', 'Duestas', 'Triestas', 'Quadrestas', 'Pentestas', 'Hexestas', 'Autumnus', 'Duautumn', 'Triautumn', 'Quadrautumn', 'Pentautumn', 'Hexautumn', 'Unember', 'Duember', 'Triember', 'Quadrember', 'Pentember', 'Hexember']
|
67
|
+
}
|
68
|
+
|
69
|
+
# Calculates the total number of martian sols for this earth time
|
70
|
+
# @param earth_time [Time] Earth time
|
71
|
+
# @return [Integer] number of sols
|
63
72
|
def self.sols_from_earth_time(earth_time)
|
64
73
|
days = (earth_time.to_f / SECONDS_A_DAY) + E_DAYS_TIL_UNIX
|
65
74
|
sols = (days - EPOCH_OFFSET) / MARS_TO_EARTH_DAYS
|
66
75
|
return sols
|
67
76
|
end
|
68
77
|
|
78
|
+
# Converts a time object to a mars time object
|
79
|
+
# @param earth_time [Time] Earth time
|
80
|
+
# @param type [DarianCalendar::CalendarTypes] Calendar type
|
81
|
+
# @return [DarianCalendar::Time] mars time
|
69
82
|
def self.from_earth(earth_time, type=CalendarTypes::MARTIANA)
|
70
83
|
self.new(self.sols_from_earth_time(earth_time), type)
|
71
84
|
end
|
72
85
|
|
86
|
+
# Parses the given representation of date and time, and converts it to mars time
|
87
|
+
# @param string [String] String with date and time
|
88
|
+
# @param type [DarianCalendar::CalendarTypes] Calendar type
|
89
|
+
# @return [DarianCalendar::Time] mars time
|
73
90
|
def self.parse_earth(string, type=CalendarTypes::MARTIANA)
|
74
91
|
self.from_earth(::Time.parse(string), type)
|
75
92
|
end
|
76
93
|
|
94
|
+
# Returns the current mars time.
|
95
|
+
# @param type [DarianCalendar::CalendarTypes] Calendar type
|
96
|
+
# @return [DarianCalendar::Time] current mars time
|
77
97
|
def self.now(type=CalendarTypes::MARTIANA)
|
78
98
|
self.from_earth(::Time.now, type)
|
79
99
|
end
|
80
100
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
101
|
+
# Compares two times and returns -1, zero, 1 or nil. The other should be a mars time object.
|
102
|
+
# @param another [DarianCalendar::Time]
|
103
|
+
# @return [Integer] Compare result
|
85
104
|
def <=>(another)
|
86
105
|
@total_sols <=> another.total_sols
|
87
106
|
end
|
88
107
|
|
108
|
+
# Return the number of sols in the given year
|
109
|
+
# @return [Integer] Number of sols in the given year
|
89
110
|
def sols_in_year
|
90
111
|
self.leap? ? 669 : 668
|
91
112
|
end
|
92
113
|
|
114
|
+
# Returns true if the given year is a leap year
|
115
|
+
# @return [Boolean] true if the given year is a leap year
|
93
116
|
def leap?
|
94
117
|
return true if (@year % 500) == 0
|
95
118
|
return false if (@year % 100) == 0
|
@@ -98,16 +121,24 @@ module DarianCalendar
|
|
98
121
|
return true
|
99
122
|
end
|
100
123
|
|
124
|
+
# Converts the given mars time to earth time
|
125
|
+
# @return [Time] earth time
|
101
126
|
def to_earth
|
102
127
|
earth_days = (@total_sols * MARS_TO_EARTH_DAYS) + EPOCH_OFFSET + ROUND_UP_SECOND
|
103
128
|
earth_seconds = ((earth_days - E_DAYS_TIL_UNIX) * SECONDS_A_DAY) - 1
|
104
129
|
::Time.at(earth_seconds)
|
105
130
|
end
|
106
131
|
|
132
|
+
# Returns a string in an ISO 8601 format (This method doesn’t use the expanded representations).
|
133
|
+
# @return [String] Time as a string in an ISO 8601 format
|
107
134
|
def to_s
|
108
135
|
sprintf('%d-%02d-%02d %02d:%02d:%02d', @year, @month, @sol, @hour, @min, @sec)
|
109
136
|
end
|
110
137
|
|
138
|
+
# Converts a number of martian sols to mars time.
|
139
|
+
# @param sols optional [Float] Number of martian sols. Default is the number of sols of the the current time.
|
140
|
+
# @param type optional [DarianCalendar::CalendarTypes] calendar type.
|
141
|
+
# @return [DarianCalendar::Time] mars time
|
111
142
|
def initialize(sols=nil, type=CalendarTypes::MARTIANA)
|
112
143
|
@calendar_type = type.to_s.capitalize
|
113
144
|
@total_sols = sols.to_f != 0 ? sols.to_f : self.sols_from_earth_time(::Time.now)
|
@@ -167,17 +198,17 @@ module DarianCalendar
|
|
167
198
|
@week_sol = ((@sol - 1) % 7) + 1 # 1-7
|
168
199
|
|
169
200
|
@week_sol_name = case type
|
170
|
-
when CalendarTypes::MARTIANA, CalendarTypes::HENSEL then
|
171
|
-
when CalendarTypes::DEFROST then
|
172
|
-
when CalendarTypes::AREOSYNCHRONOUS then
|
201
|
+
when CalendarTypes::MARTIANA, CalendarTypes::HENSEL then SOL_NAMES[:martiana][@week_sol-1]
|
202
|
+
when CalendarTypes::DEFROST then SOL_NAMES[:defrost][@week_sol-1]
|
203
|
+
when CalendarTypes::AREOSYNCHRONOUS then SOL_NAMES[:areosynchronous][@week_sol-1]
|
173
204
|
when CalendarTypes::AQUA then @week_sol.to_s
|
174
205
|
else ''
|
175
206
|
end
|
176
207
|
|
177
208
|
@month_name = case type
|
178
|
-
when CalendarTypes::MARTIANA then
|
179
|
-
when CalendarTypes::DEFROST, CalendarTypes::AREOSYNCHRONOUS then
|
180
|
-
when CalendarTypes::HENSEL then
|
209
|
+
when CalendarTypes::MARTIANA then MONTH_NAMES[:martiana][@month-1]
|
210
|
+
when CalendarTypes::DEFROST, CalendarTypes::AREOSYNCHRONOUS then MONTH_NAMES[:defrost][@month-1]
|
211
|
+
when CalendarTypes::HENSEL then MONTH_NAMES[:hensel][@month-1]
|
181
212
|
when CalendarTypes::AQUA then @month.to_s
|
182
213
|
else ''
|
183
214
|
end
|
@@ -191,7 +222,5 @@ module DarianCalendar
|
|
191
222
|
@sec = ((min - min.floor) * 60).floor
|
192
223
|
end
|
193
224
|
|
194
|
-
#</editor-fold>
|
195
|
-
|
196
225
|
end
|
197
226
|
end
|
data/spec/time_spec.rb
CHANGED
@@ -78,7 +78,7 @@ describe DarianCalendar::Time do
|
|
78
78
|
end
|
79
79
|
|
80
80
|
describe '#sols_in_year' do
|
81
|
-
it 'returns the
|
81
|
+
it 'returns the number of sols in a martian year' do
|
82
82
|
leap_mars_time = DarianCalendar::Time.from_earth(Time.utc(2013, 10, 15, 16, 50, 0))
|
83
83
|
leap_mars_time.sols_in_year.should == 669
|
84
84
|
@mars_time.sols_in_year.should == 668
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: darian_calendar
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: '0.2'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Christian Worreschk
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-02-
|
11
|
+
date: 2014-02-08 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: This Ruby library converts earth time to mars time and back again. You
|
14
14
|
can choose between 5 variants of the Darian calendar system; Martiana, Defrost,
|
@@ -63,3 +63,4 @@ specification_version: 4
|
|
63
63
|
summary: Converts earth time to mars time and back again. You can choose between 5
|
64
64
|
variants of the Darian calendar system.
|
65
65
|
test_files: []
|
66
|
+
has_rdoc:
|