darian_calendar 0.2 → 1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/.travis.yml +2 -2
- data/CHANGELOG.md +6 -3
- data/README.md +4 -1
- data/lib/darian_calendar.rb +47 -0
- data/lib/darian_calendar/date.rb +213 -0
- data/lib/darian_calendar/time.rb +16 -158
- data/lib/darian_calendar/version.rb +1 -1
- data/spec/darian_calendar_spec.rb +31 -2
- data/spec/date_spec.rb +202 -0
- data/spec/spec_helper.rb +1 -0
- data/spec/time_spec.rb +39 -6
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
MmY2MWYxMTY4NGFjODBhZjE4MTJjZTljMzQ5NDVkNGNlOGQ5ZDI3NA==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
NTY0MWU1OWUzOWVkNDcyM2EyM2E1OGUyNTZhMmE4ODJjZGQxZDM2NA==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
NTI4M2QwYmQzZDY1ZTE3ZmU4MmVkYjE0ODI2OTNiYzcyYTgyMTZiZGI2NjQw
|
10
|
+
YzhmNWNiOGEwYzk3N2Q2NTFhM2IwYWNjYzUyZTc0MTg1ZjA2MDdhNDdjYWRl
|
11
|
+
YzkxZTQyMGZmYzczYzEwOTcwN2ZlMmQwZDQ4MTE0YjU2ZDhjM2M=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
YmUxYWIwYTBlNWY4OWYyM2JkZmI0YWFkMzZjODZkZmMxZGQ0MGZiODdhMTEz
|
14
|
+
MmYwYTMwMzJlYmQ2MWIzMmVmZmIyMTBkZTg5NzZjZjYzM2Y5ZGIyYTE5ZTFm
|
15
|
+
ZDdlNzhjNWJkNGQzODcwNjQ4NDBmZWNhY2E0YTM2MzMzNWZjNWU=
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,12 +1,15 @@
|
|
1
|
-
## 0
|
1
|
+
## 1.0
|
2
|
+
- JSON support
|
3
|
+
- Martian date object
|
4
|
+
- Bugfixes
|
5
|
+
- Optimizations
|
2
6
|
|
7
|
+
## 0.2
|
3
8
|
- Documentation with Yard
|
4
9
|
- Minor optimization
|
5
10
|
|
6
11
|
## 0.1.0
|
7
|
-
|
8
12
|
- Working version of the darian calender converter
|
9
13
|
|
10
14
|
## 0.0.1
|
11
|
-
|
12
15
|
- Initial release
|
data/README.md
CHANGED
@@ -43,6 +43,9 @@ mars_time = DarianCalendar::Time.from_earth(Time.utc(2012, 10, 15, 16, 50, 0), D
|
|
43
43
|
|
44
44
|
mars_time = DarianCalendar::Time.parse_earth('2012-10-15 16:50:00 UTC')
|
45
45
|
mars_time = DarianCalendar::Time.parse_earth('2012-10-15 16:50:00 UTC', DarianCalendar::CalendarTypes::MARTIANA)
|
46
|
+
|
47
|
+
mars_date = DarianCalendar::Date.today
|
48
|
+
mars_date = DarianCalendar::Time.now.to_date
|
46
49
|
```
|
47
50
|
|
48
51
|
```ruby
|
@@ -89,7 +92,7 @@ bundle exec rspec
|
|
89
92
|
```
|
90
93
|
|
91
94
|
## Copyright
|
92
|
-
- _The Darian Calendar Ruby Gem_ is Copyright © 2014 Christian Worreschk, MarSec.
|
95
|
+
- _The Darian Calendar Ruby Gem_ is Copyright © 2014 by Christian Worreschk, MarSec.
|
93
96
|
- _The Darian System_ is Copyright © 1986-2005 by Thomas Gangale
|
94
97
|
|
95
98
|
## License
|
data/lib/darian_calendar.rb
CHANGED
@@ -1,5 +1,9 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
|
+
require 'date'
|
4
|
+
require 'time'
|
5
|
+
require 'json'
|
6
|
+
require 'darian_calendar/date'
|
3
7
|
require 'darian_calendar/time'
|
4
8
|
|
5
9
|
# 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.
|
@@ -7,8 +11,44 @@ require 'darian_calendar/time'
|
|
7
11
|
# 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)
|
8
12
|
module DarianCalendar
|
9
13
|
|
14
|
+
# Variantes of the Darian calendar system (Different sol and month names)
|
15
|
+
module CalendarTypes
|
16
|
+
MARTIANA = :martiana
|
17
|
+
DEFROST = :defrost
|
18
|
+
AREOSYNCHRONOUS = :areosynchronous
|
19
|
+
HENSEL = :hensel
|
20
|
+
AQUA = :aqua
|
21
|
+
end
|
22
|
+
|
23
|
+
MARS_TO_EARTH_DAYS = 1.027491251
|
24
|
+
EPOCH_OFFSET = 587744.77817
|
25
|
+
SECONDS_A_DAY = 86400.0
|
26
|
+
ROUND_UP_SECOND = 1/SECONDS_A_DAY;
|
27
|
+
E_DAYS_TIL_UNIX = 719527.0
|
28
|
+
|
29
|
+
SOL_NAMES = {
|
30
|
+
martiana: ['Sol Solis', 'Sol Lunae', 'Sol Martis', 'Sol Mercurii', 'Sol Jovis', 'Sol Veneris', 'Sol Saturni'],
|
31
|
+
defrost: ['Axatisol', 'Benasol', 'Ciposol', 'Domesol', 'Erjasol', 'Fulisol', 'Gavisol'],
|
32
|
+
areosynchronous: ['Heliosol', 'Phobosol', 'Deimosol', 'Terrasol', 'Venusol', 'Mercurisol', 'Jovisol']
|
33
|
+
}
|
34
|
+
MONTH_NAMES = {
|
35
|
+
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'],
|
36
|
+
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'],
|
37
|
+
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']
|
38
|
+
}
|
39
|
+
|
10
40
|
class << self
|
11
41
|
|
42
|
+
# Returns the total number of martian sols for an earth date or time
|
43
|
+
# @param earth_date_time [Date/Time] Earth date or time
|
44
|
+
# @return [Float] number of sols
|
45
|
+
def sols_from_earth(earth_date_time)
|
46
|
+
seconds = earth_date_time.is_a?(::Date) ? earth_date_time.strftime("%s").to_f : earth_date_time.to_f
|
47
|
+
days = (seconds / SECONDS_A_DAY) + E_DAYS_TIL_UNIX
|
48
|
+
sols = (days - EPOCH_OFFSET) / MARS_TO_EARTH_DAYS
|
49
|
+
return sols
|
50
|
+
end
|
51
|
+
|
12
52
|
# Returns the current mars time. Shortcut for 'DarianCalendar::Time.now'
|
13
53
|
# @param type [DarianCalendar::CalendarTypes] Calendar type
|
14
54
|
# @return [DarianCalendar::Time] current mars time
|
@@ -16,6 +56,13 @@ module DarianCalendar
|
|
16
56
|
DarianCalendar::Time.now(type)
|
17
57
|
end
|
18
58
|
|
59
|
+
# Returns the current mars time. Shortcut for 'DarianCalendar::Time.now'
|
60
|
+
# @param type [DarianCalendar::CalendarTypes] Calendar type
|
61
|
+
# @return [DarianCalendar::Time] current mars time
|
62
|
+
def today(type=CalendarTypes::MARTIANA)
|
63
|
+
DarianCalendar::Date.today(type)
|
64
|
+
end
|
65
|
+
|
19
66
|
end
|
20
67
|
|
21
68
|
end
|
@@ -0,0 +1,213 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module DarianCalendar
|
4
|
+
|
5
|
+
# The date is a particular day of a Darian calendar year
|
6
|
+
class Date
|
7
|
+
include Comparable
|
8
|
+
|
9
|
+
# @return [Integer] year
|
10
|
+
attr_reader :year
|
11
|
+
# @return [Integer] month of the year
|
12
|
+
attr_reader :month
|
13
|
+
# @return [Integer] sol of the month
|
14
|
+
attr_reader :sol
|
15
|
+
# @return [String] full month name ("Mithuna")
|
16
|
+
attr_reader :month_name
|
17
|
+
# @return [String] full weeksol name ("Sol Jovis")
|
18
|
+
attr_reader :week_sol_name
|
19
|
+
# @return [Integer] number of sols since the earth date 0-0-0
|
20
|
+
attr_reader :total_sols
|
21
|
+
# @return [String] sol of the week
|
22
|
+
attr_reader :week_sol
|
23
|
+
# @return [Integer] season of the year
|
24
|
+
attr_reader :season
|
25
|
+
# @return [Integer] sol of the season
|
26
|
+
attr_reader :sol_of_season
|
27
|
+
# @return [Integer] month of the season
|
28
|
+
attr_reader :month_of_season
|
29
|
+
# @return [Integer] sol of the year
|
30
|
+
attr_reader :sol_of_year
|
31
|
+
# @return [String] name of the calendar type ("Martiana")
|
32
|
+
attr_reader :calendar_type
|
33
|
+
|
34
|
+
alias :day :sol
|
35
|
+
alias :week_day :week_sol
|
36
|
+
|
37
|
+
protected
|
38
|
+
|
39
|
+
def set_attributes(total_sols, type)
|
40
|
+
@calendar_type = type.to_s.capitalize
|
41
|
+
@total_sols = total_sols
|
42
|
+
|
43
|
+
sD = (@total_sols / 334296).floor
|
44
|
+
doD = (@total_sols - (sD * 334296)).floor
|
45
|
+
|
46
|
+
sC = 0
|
47
|
+
doC = doD
|
48
|
+
sC = ((doD - 1) / 66859).floor if doD != 0
|
49
|
+
doC -= ((sC * 66859) + 1) if sC != 0
|
50
|
+
|
51
|
+
sX = 0
|
52
|
+
doX = doC
|
53
|
+
if sC != 0 # century that does not begin with leap day
|
54
|
+
sX = ((doC + 1) / 6686).floor
|
55
|
+
doX -= ((sX * 6686) - 1) if sX != 0
|
56
|
+
else
|
57
|
+
sX = (doC / 6686).floor
|
58
|
+
doX -= (sX * 6686) if sX != 0
|
59
|
+
end
|
60
|
+
|
61
|
+
sII = 0
|
62
|
+
doII = doX
|
63
|
+
if (sC != 0) && (sX == 0) # decade that does not begin with leap day
|
64
|
+
sII = (doX / 1337).floor
|
65
|
+
doII -= (sII * 1337) if sII != 0
|
66
|
+
else # 1338, 1337, 1337, 1337 ...
|
67
|
+
sII = ((doX - 1) / 1337) if doX != 0
|
68
|
+
doII -= ((sII * 1337) + 1) if sII != 0
|
69
|
+
end
|
70
|
+
|
71
|
+
sI = 0
|
72
|
+
doI= doII
|
73
|
+
if (sII == 0) && ((sX != 0) || ((sX == 0) && (sC == 0)))
|
74
|
+
sI = (doII / 669).floor
|
75
|
+
doI -= 669 if sI != 0
|
76
|
+
else # 668, 669
|
77
|
+
sI = ((doII + 1) / 669).floor
|
78
|
+
doI -= 668 if sI != 0
|
79
|
+
end
|
80
|
+
|
81
|
+
@year = (500 * sD) + (100 * sC) + (10 * sX) + (2 * sII) + sI
|
82
|
+
@season = case true # 0-3
|
83
|
+
when (doI < 167) then 0
|
84
|
+
when (doI < 334) then 1
|
85
|
+
when (doI < 501) then 2
|
86
|
+
else 3
|
87
|
+
end
|
88
|
+
|
89
|
+
@sol_of_season = doI - 167 * @season # 0-167
|
90
|
+
@month_of_season = (@sol_of_season / 28).floor # 0-5
|
91
|
+
@sol_of_year = doI
|
92
|
+
|
93
|
+
@month = @month_of_season + (6 * @season) + 1 # 1-24
|
94
|
+
@sol = doI - (((@month - 1) * 28) - @season) + 1 # 1-28
|
95
|
+
@week_sol = ((@sol - 1) % 7) + 1 # 1-7
|
96
|
+
|
97
|
+
@week_sol_name = case type
|
98
|
+
when DarianCalendar::CalendarTypes::MARTIANA, CalendarTypes::HENSEL then DarianCalendar::SOL_NAMES[:martiana][@week_sol-1]
|
99
|
+
when DarianCalendar::CalendarTypes::DEFROST then DarianCalendar::SOL_NAMES[:defrost][@week_sol-1]
|
100
|
+
when DarianCalendar::CalendarTypes::AREOSYNCHRONOUS then DarianCalendar::SOL_NAMES[:areosynchronous][@week_sol-1]
|
101
|
+
when DarianCalendar::CalendarTypes::AQUA then @week_sol.to_s
|
102
|
+
else ''
|
103
|
+
end
|
104
|
+
|
105
|
+
@month_name = case type
|
106
|
+
when DarianCalendar::CalendarTypes::MARTIANA then DarianCalendar::MONTH_NAMES[:martiana][@month-1]
|
107
|
+
when DarianCalendar::CalendarTypes::DEFROST, DarianCalendar::CalendarTypes::AREOSYNCHRONOUS then DarianCalendar::MONTH_NAMES[:defrost][@month-1]
|
108
|
+
when DarianCalendar::CalendarTypes::HENSEL then DarianCalendar::MONTH_NAMES[:hensel][@month-1]
|
109
|
+
when DarianCalendar::CalendarTypes::AQUA then @month.to_s
|
110
|
+
else ''
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
public
|
115
|
+
|
116
|
+
# Converts a date object to a mars date object
|
117
|
+
# @param earth_date [::Date] Earth date
|
118
|
+
# @param type [DarianCalendar::CalendarTypes] Calendar type
|
119
|
+
# @return [DarianCalendar::Date] mars date
|
120
|
+
def self.from_earth(earth_date, type=DarianCalendar::CalendarTypes::MARTIANA)
|
121
|
+
self.new(DarianCalendar.sols_from_earth(earth_date), type)
|
122
|
+
end
|
123
|
+
|
124
|
+
# Parses the given representation of a date, and converts it to a mars date
|
125
|
+
# @param string [String] String with a date
|
126
|
+
# @param type [DarianCalendar::CalendarTypes] Calendar type
|
127
|
+
# @return [DarianCalendar::Date] mars date
|
128
|
+
def self.parse_earth(string, type=DarianCalendar::CalendarTypes::MARTIANA)
|
129
|
+
self.from_earth(::Date.parse(string), type)
|
130
|
+
end
|
131
|
+
|
132
|
+
# Creates a date object denoting the present mars day.
|
133
|
+
# @param type [DarianCalendar::CalendarTypes] Calendar type
|
134
|
+
# @return [DarianCalendar::Date] current mars date
|
135
|
+
def self.today(type=DarianCalendar::CalendarTypes::MARTIANA)
|
136
|
+
self.from_earth(::Date.today, type)
|
137
|
+
end
|
138
|
+
|
139
|
+
# Sets the model attributes from a JSON string. Returns self.
|
140
|
+
# @param json [String] JSON string
|
141
|
+
# @return [DarianCalendar::Date] mars date
|
142
|
+
def self.from_json(string)
|
143
|
+
json = JSON::parse(string)
|
144
|
+
type = json['calendar_type'].to_s.downcase.to_sym rescue nil
|
145
|
+
self.new(json['total_sols'].to_f, type)
|
146
|
+
end
|
147
|
+
|
148
|
+
# Compares two dates and returns -1, zero, 1 or nil. The other should be a mars date object.
|
149
|
+
# @param another [DarianCalendar::Date]
|
150
|
+
# @return [Integer] Compare result
|
151
|
+
def <=>(another)
|
152
|
+
@total_sols.floor <=> another.total_sols.floor
|
153
|
+
end
|
154
|
+
|
155
|
+
# Return the number of sols in the given year
|
156
|
+
# @return [Integer] Number of sols in the given year
|
157
|
+
def sols_in_year
|
158
|
+
self.leap? ? 669 : 668
|
159
|
+
end
|
160
|
+
|
161
|
+
# Returns true if the given year is a leap year
|
162
|
+
# @return [Boolean] true if the given year is a leap year
|
163
|
+
def leap?
|
164
|
+
return true if (@year % 500) == 0
|
165
|
+
return false if (@year % 100) == 0
|
166
|
+
return true if (@year % 10) == 0
|
167
|
+
return false if (@year % 2) == 0
|
168
|
+
return true
|
169
|
+
end
|
170
|
+
|
171
|
+
# Converts the given mars date to earth date
|
172
|
+
# @return [Date] earth date
|
173
|
+
def to_earth
|
174
|
+
earth_days = (@total_sols * DarianCalendar::MARS_TO_EARTH_DAYS) + DarianCalendar::EPOCH_OFFSET + DarianCalendar::ROUND_UP_SECOND
|
175
|
+
earth_seconds = ((earth_days - DarianCalendar::E_DAYS_TIL_UNIX) * DarianCalendar::SECONDS_A_DAY) - 1
|
176
|
+
::Time.at(earth_seconds).to_date
|
177
|
+
end
|
178
|
+
|
179
|
+
# Returns a string in an ISO 8601 format (This method doesn’t use the expanded representations).
|
180
|
+
# @return [String] Date as a string in an ISO 8601 format
|
181
|
+
def to_s
|
182
|
+
sprintf('%d-%02d-%02d', @year, @month, @sol)
|
183
|
+
end
|
184
|
+
|
185
|
+
# Returns a JSON string representing the model.
|
186
|
+
# @return Returns a JSON string representing the model.
|
187
|
+
def to_json
|
188
|
+
self.as_json.to_json
|
189
|
+
end
|
190
|
+
|
191
|
+
# Returns a hash representing the model.
|
192
|
+
# @return Returns a hash representing the model.
|
193
|
+
def as_json
|
194
|
+
json = {}
|
195
|
+
self.instance_variables.sort.each do |attr|
|
196
|
+
field = attr.to_s.gsub('@', '')
|
197
|
+
json[field] = self.send(field)
|
198
|
+
end
|
199
|
+
return json
|
200
|
+
end
|
201
|
+
|
202
|
+
# Converts a number of martian sols to mars date.
|
203
|
+
# @param sols optional [Float] Number of martian sols. Default is the number of sols of the the current date.
|
204
|
+
# @param type optional [DarianCalendar::CalendarTypes] calendar type.
|
205
|
+
# @return [DarianCalendar::Date] mars date
|
206
|
+
def initialize(sols=nil, type=DarianCalendar::CalendarTypes::MARTIANA)
|
207
|
+
total_sols = sols.to_f != 0 ? sols.to_f : DarianCalendar.sols_from_earth(::Date.today)
|
208
|
+
self.set_attributes(total_sols, type)
|
209
|
+
end
|
210
|
+
|
211
|
+
end
|
212
|
+
|
213
|
+
end
|
data/lib/darian_calendar/time.rb
CHANGED
@@ -2,99 +2,36 @@
|
|
2
2
|
|
3
3
|
module DarianCalendar
|
4
4
|
|
5
|
-
# Variantes of the Darian calendar system
|
6
|
-
module CalendarTypes
|
7
|
-
MARTIANA = :martiana
|
8
|
-
DEFROST = :defrost
|
9
|
-
AREOSYNCHRONOUS = :areosynchronous
|
10
|
-
HENSEL = :hensel
|
11
|
-
AQUA = :aqua
|
12
|
-
end
|
13
|
-
|
14
5
|
# Timestamp in the Darian calendar system
|
15
|
-
class Time
|
16
|
-
include Comparable
|
6
|
+
class Time < DarianCalendar::Date
|
17
7
|
|
18
|
-
# @return [Integer] year
|
19
|
-
attr_reader :year
|
20
|
-
# @return [Integer] month of the year
|
21
|
-
attr_reader :month
|
22
|
-
# @return [Integer] sol of the month
|
23
|
-
attr_reader :sol
|
24
8
|
# @return [Integer] hour of the sol
|
25
9
|
attr_reader :hour
|
26
10
|
# @return [Integer] minute of the hour
|
27
11
|
attr_reader :min
|
28
12
|
# @return [Integer] second of the minute
|
29
13
|
attr_reader :sec
|
30
|
-
# @return [String] full month name ("Mithuna")
|
31
|
-
attr_reader :month_name
|
32
|
-
# @return [String] full weeksol name ("Sol Jovis")
|
33
|
-
attr_reader :week_sol_name
|
34
|
-
# @return [Float] number of sols (with hour, minutes and seconds) since the earth date 0-0-0
|
35
|
-
attr_reader :total_sols
|
36
|
-
# @return [String] sol of the week
|
37
|
-
attr_reader :week_sol
|
38
|
-
# @return [Integer] season of the year
|
39
|
-
attr_reader :season
|
40
|
-
# @return [Integer] sol of the season
|
41
|
-
attr_reader :sol_of_season
|
42
|
-
# @return [Integer] month of the season
|
43
|
-
attr_reader :month_of_season
|
44
|
-
# @return [Integer] sol of the year
|
45
|
-
attr_reader :sol_of_year
|
46
|
-
# @return [String] name of the calendar type ("Martiana")
|
47
|
-
attr_reader :calendar_type
|
48
|
-
|
49
|
-
alias :day :sol
|
50
|
-
alias :week_day :week_sol
|
51
|
-
|
52
|
-
MARS_TO_EARTH_DAYS = 1.027491251
|
53
|
-
EPOCH_OFFSET = 587744.77817
|
54
|
-
SECONDS_A_DAY = 86400.0
|
55
|
-
ROUND_UP_SECOND = 1/SECONDS_A_DAY;
|
56
|
-
E_DAYS_TIL_UNIX = 719527.0
|
57
|
-
|
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
|
72
|
-
def self.sols_from_earth_time(earth_time)
|
73
|
-
days = (earth_time.to_f / SECONDS_A_DAY) + E_DAYS_TIL_UNIX
|
74
|
-
sols = (days - EPOCH_OFFSET) / MARS_TO_EARTH_DAYS
|
75
|
-
return sols
|
76
|
-
end
|
77
14
|
|
78
15
|
# Converts a time object to a mars time object
|
79
16
|
# @param earth_time [Time] Earth time
|
80
17
|
# @param type [DarianCalendar::CalendarTypes] Calendar type
|
81
18
|
# @return [DarianCalendar::Time] mars time
|
82
|
-
def self.from_earth(earth_time, type=CalendarTypes::MARTIANA)
|
83
|
-
self.new(
|
19
|
+
def self.from_earth(earth_time, type=DarianCalendar::CalendarTypes::MARTIANA)
|
20
|
+
self.new(DarianCalendar.sols_from_earth(earth_time), type)
|
84
21
|
end
|
85
22
|
|
86
23
|
# Parses the given representation of date and time, and converts it to mars time
|
87
24
|
# @param string [String] String with date and time
|
88
25
|
# @param type [DarianCalendar::CalendarTypes] Calendar type
|
89
26
|
# @return [DarianCalendar::Time] mars time
|
90
|
-
def self.parse_earth(string, type=CalendarTypes::MARTIANA)
|
27
|
+
def self.parse_earth(string, type=DarianCalendar::CalendarTypes::MARTIANA)
|
91
28
|
self.from_earth(::Time.parse(string), type)
|
92
29
|
end
|
93
30
|
|
94
31
|
# Returns the current mars time.
|
95
32
|
# @param type [DarianCalendar::CalendarTypes] Calendar type
|
96
33
|
# @return [DarianCalendar::Time] current mars time
|
97
|
-
def self.now(type=CalendarTypes::MARTIANA)
|
34
|
+
def self.now(type=DarianCalendar::CalendarTypes::MARTIANA)
|
98
35
|
self.from_earth(::Time.now, type)
|
99
36
|
end
|
100
37
|
|
@@ -105,27 +42,11 @@ module DarianCalendar
|
|
105
42
|
@total_sols <=> another.total_sols
|
106
43
|
end
|
107
44
|
|
108
|
-
# Return the number of sols in the given year
|
109
|
-
# @return [Integer] Number of sols in the given year
|
110
|
-
def sols_in_year
|
111
|
-
self.leap? ? 669 : 668
|
112
|
-
end
|
113
|
-
|
114
|
-
# Returns true if the given year is a leap year
|
115
|
-
# @return [Boolean] true if the given year is a leap year
|
116
|
-
def leap?
|
117
|
-
return true if (@year % 500) == 0
|
118
|
-
return false if (@year % 100) == 0
|
119
|
-
return true if (@year % 10) == 0
|
120
|
-
return false if (@year % 2) == 0
|
121
|
-
return true
|
122
|
-
end
|
123
|
-
|
124
45
|
# Converts the given mars time to earth time
|
125
46
|
# @return [Time] earth time
|
126
47
|
def to_earth
|
127
|
-
earth_days = (@total_sols * MARS_TO_EARTH_DAYS) + EPOCH_OFFSET + ROUND_UP_SECOND
|
128
|
-
earth_seconds = ((earth_days - E_DAYS_TIL_UNIX) * SECONDS_A_DAY) - 1
|
48
|
+
earth_days = (@total_sols * DarianCalendar::MARS_TO_EARTH_DAYS) + DarianCalendar::EPOCH_OFFSET + DarianCalendar::ROUND_UP_SECOND
|
49
|
+
earth_seconds = ((earth_days - DarianCalendar::E_DAYS_TIL_UNIX) * DarianCalendar::SECONDS_A_DAY) - 1
|
129
50
|
::Time.at(earth_seconds)
|
130
51
|
end
|
131
52
|
|
@@ -135,83 +56,20 @@ module DarianCalendar
|
|
135
56
|
sprintf('%d-%02d-%02d %02d:%02d:%02d', @year, @month, @sol, @hour, @min, @sec)
|
136
57
|
end
|
137
58
|
|
59
|
+
# Returns the date of the given mars time
|
60
|
+
# @return [DarianCalendar::Date] mars date
|
61
|
+
def to_date
|
62
|
+
DarianCalendar::Date.new(self.total_sols)
|
63
|
+
end
|
64
|
+
|
138
65
|
# Converts a number of martian sols to mars time.
|
139
66
|
# @param sols optional [Float] Number of martian sols. Default is the number of sols of the the current time.
|
140
67
|
# @param type optional [DarianCalendar::CalendarTypes] calendar type.
|
141
68
|
# @return [DarianCalendar::Time] mars time
|
142
|
-
def initialize(sols=nil, type=CalendarTypes::MARTIANA)
|
143
|
-
|
144
|
-
@total_sols = sols.to_f != 0 ? sols.to_f : self.sols_from_earth_time(::Time.now)
|
145
|
-
|
146
|
-
sD = (@total_sols / 334296).floor
|
147
|
-
doD = (@total_sols - (sD * 334296)).floor
|
148
|
-
|
149
|
-
sC = 0
|
150
|
-
doC = doD
|
151
|
-
sC = ((doD - 1) / 66859).floor if doD != 0
|
152
|
-
doC -= ((sC * 66859) + 1) if sC != 0
|
153
|
-
|
154
|
-
sX = 0
|
155
|
-
doX = doC
|
156
|
-
if sC != 0 # century that does not begin with leap day
|
157
|
-
sX = ((doC + 1) / 6686).floor
|
158
|
-
doX -= ((sX * 6686) - 1) if sX != 0
|
159
|
-
else
|
160
|
-
sX = (doC / 6686).floor
|
161
|
-
doX -= (sX * 6686) if sX != 0
|
162
|
-
end
|
163
|
-
|
164
|
-
sII = 0
|
165
|
-
doII = doX
|
166
|
-
if (sC != 0) && (sX == 0) # decade that does not begin with leap day
|
167
|
-
sII = (doX / 1337).floor
|
168
|
-
doII -= (sII * 1337) if sII != 0
|
169
|
-
else # 1338, 1337, 1337, 1337 ...
|
170
|
-
sII = ((doX - 1) / 1337) if doX != 0
|
171
|
-
doII -= ((sII * 1337) + 1) if sII != 0
|
172
|
-
end
|
173
|
-
|
174
|
-
sI = 0
|
175
|
-
doI= doII
|
176
|
-
if (sII == 0) && ((sX != 0) || ((sX == 0) && (sC == 0)))
|
177
|
-
sI = (doII / 669).floor
|
178
|
-
doI -= 669 if sI != 0
|
179
|
-
else # 668, 669
|
180
|
-
sI = ((doII + 1) / 669).floor
|
181
|
-
doI -= 668 if sI != 0
|
182
|
-
end
|
183
|
-
|
184
|
-
@year = (500 * sD) + (100 * sC) + (10 * sX) + (2 * sII) + sI
|
185
|
-
@season = case true # 0-3
|
186
|
-
when (doI < 167) then 0
|
187
|
-
when (doI < 334) then 1
|
188
|
-
when (doI < 501) then 2
|
189
|
-
else 3
|
190
|
-
end
|
191
|
-
|
192
|
-
@sol_of_season = doI - 167 * @season # 0-167
|
193
|
-
@month_of_season = (@sol_of_season / 28).floor # 0-5
|
194
|
-
@sol_of_year = doI
|
195
|
-
|
196
|
-
@month = @month_of_season + (6 * @season) + 1 # 1-24
|
197
|
-
@sol = doI - (((@month - 1) * 28) - @season) + 1 # 1-28
|
198
|
-
@week_sol = ((@sol - 1) % 7) + 1 # 1-7
|
199
|
-
|
200
|
-
@week_sol_name = case type
|
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]
|
204
|
-
when CalendarTypes::AQUA then @week_sol.to_s
|
205
|
-
else ''
|
206
|
-
end
|
69
|
+
def initialize(sols=nil, type=DarianCalendar::CalendarTypes::MARTIANA)
|
70
|
+
total_sols = sols.to_f != 0 ? sols.to_f : DarianCalendar.sols_from_earth(::Time.now)
|
207
71
|
|
208
|
-
|
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]
|
212
|
-
when CalendarTypes::AQUA then @month.to_s
|
213
|
-
else ''
|
214
|
-
end
|
72
|
+
self.set_attributes(total_sols, type)
|
215
73
|
|
216
74
|
partial_sol = @total_sols - @total_sols.floor
|
217
75
|
hour = partial_sol* 24
|
@@ -6,13 +6,42 @@ describe DarianCalendar do
|
|
6
6
|
|
7
7
|
describe 'class methods' do
|
8
8
|
|
9
|
+
#def sols_from_earth(earth_date_time)
|
10
|
+
# seconds = earth_date_time.is_a?(::Date) ? earth_date_time.strftime("%s").to_f : earth_date_time.to_f
|
11
|
+
# days = (seconds / SECONDS_A_DAY) + E_DAYS_TIL_UNIX
|
12
|
+
# sols = (days - EPOCH_OFFSET) / MARS_TO_EARTH_DAYS
|
13
|
+
# return sols
|
14
|
+
#end
|
15
|
+
describe '#sols_from_earth' do
|
16
|
+
context 'parameter is a date object' do
|
17
|
+
it 'returns the total number of martian sols' do
|
18
|
+
earth = ::Date.new(2012, 10, 15)
|
19
|
+
DarianCalendar.sols_from_earth(earth).should == 143466.15767923463
|
20
|
+
end
|
21
|
+
end
|
22
|
+
context 'parameter is a time object' do
|
23
|
+
it 'returns the total number of martian sols' do
|
24
|
+
earth = ::Time.utc(2012, 10, 15, 16, 50, 0)
|
25
|
+
DarianCalendar.sols_from_earth(earth).should == 143466.84030197054
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
9
30
|
describe '#now' do
|
10
31
|
it 'returns current mars time' do
|
11
|
-
earth = Time.utc(2012, 10, 15, 16, 50, 0)
|
12
|
-
Time.should_receive(:now).and_return(earth)
|
32
|
+
earth = ::Time.utc(2012, 10, 15, 16, 50, 0)
|
33
|
+
::Time.should_receive(:now).and_return(earth)
|
13
34
|
DarianCalendar.now.should == DarianCalendar::Time.from_earth(earth)
|
14
35
|
end
|
15
36
|
end
|
37
|
+
|
38
|
+
describe '#today' do
|
39
|
+
it 'returns current mars date' do
|
40
|
+
earth = ::Date.new(2012, 10, 15)
|
41
|
+
::Date.should_receive(:today).and_return(earth)
|
42
|
+
DarianCalendar.today.should == DarianCalendar::Date.from_earth(earth)
|
43
|
+
end
|
44
|
+
end
|
16
45
|
end
|
17
46
|
|
18
47
|
end
|
data/spec/date_spec.rb
ADDED
@@ -0,0 +1,202 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe DarianCalendar::Date do
|
6
|
+
|
7
|
+
before do
|
8
|
+
@earth_date = ::Date.new(2012, 10, 15)
|
9
|
+
@mars_date = DarianCalendar::Date.from_earth(@earth_date)
|
10
|
+
@mars_date_json = '{"calendar_type":"Martiana","month":14,"month_name":"Mithuna","month_of_season":1,"season":2,"sol":26,"sol_of_season":53,"sol_of_year":387,"total_sols":143466.15767923463,"week_sol":5,"week_sol_name":"Sol Jovis","year":214}'
|
11
|
+
end
|
12
|
+
|
13
|
+
describe 'attributes' do
|
14
|
+
|
15
|
+
it 'aliases day to sol and week day to week sol' do
|
16
|
+
@mars_date.day.should == @mars_date.sol
|
17
|
+
@mars_date.week_day.should == @mars_date.week_sol
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
describe 'initialize method' do
|
23
|
+
it 'converts earth date to mars date' do
|
24
|
+
@mars_date.year.should == 214
|
25
|
+
@mars_date.month.should == 14
|
26
|
+
@mars_date.sol.should == 26
|
27
|
+
|
28
|
+
@mars_date.total_sols.should == 143466.15767923463
|
29
|
+
@mars_date.season.should == 2
|
30
|
+
@mars_date.sol_of_season.should == 53
|
31
|
+
@mars_date.month_of_season.should == 1
|
32
|
+
@mars_date.sol_of_year.should == 387
|
33
|
+
@mars_date.week_sol.should == 5
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe 'class methods' do
|
38
|
+
|
39
|
+
describe '.from_earth' do
|
40
|
+
it 'converts an earth date to a mars date' do
|
41
|
+
DarianCalendar::Date.from_earth(@earth_date).should == @mars_date
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe '.parse_earth' do
|
46
|
+
it 'parses earth date and converts it to mars date' do
|
47
|
+
DarianCalendar::Date.parse_earth('2012-10-15').should == @mars_date
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe '.today' do
|
52
|
+
it 'returns current mars date' do
|
53
|
+
::Date.should_receive(:today).and_return(@earth_date)
|
54
|
+
DarianCalendar::Date.today.should == DarianCalendar::Date.from_earth(@earth_date)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
describe '.from_json' do
|
59
|
+
it 'parses a json string and creates a mars date' do
|
60
|
+
DarianCalendar::Date.from_json(@mars_date_json).should == @mars_date
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
|
66
|
+
describe 'instance methods' do
|
67
|
+
|
68
|
+
describe '#<=>' do
|
69
|
+
it 'compares mars date objects' do
|
70
|
+
same_date = DarianCalendar::Date.from_earth(Date.new(2012, 10, 15))
|
71
|
+
past_date = DarianCalendar::Date.from_earth(Date.new(2012, 10, 14))
|
72
|
+
future_date = DarianCalendar::Date.from_earth(Date.new(2012, 10, 16))
|
73
|
+
|
74
|
+
@mars_date.should == same_date
|
75
|
+
@mars_date.should > past_date
|
76
|
+
@mars_date.should < future_date
|
77
|
+
|
78
|
+
@mars_date.should_not < past_date
|
79
|
+
@mars_date.should_not > future_date
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
describe '#sols_in_year' do
|
84
|
+
it 'returns the number of sols in a martian year' do
|
85
|
+
leap_mars_date = DarianCalendar::Date.from_earth(Date.new(2013, 10, 15))
|
86
|
+
leap_mars_date.sols_in_year.should == 669
|
87
|
+
@mars_date.sols_in_year.should == 668
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
describe '#leap?' do
|
92
|
+
it 'returns if year is a leap year' do
|
93
|
+
leap_mars_date = DarianCalendar::Date.from_earth(Date.new(2013, 10, 15))
|
94
|
+
leap_mars_date.leap?.should == true
|
95
|
+
@mars_date.leap?.should == false
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
describe '#to_earth' do
|
100
|
+
it 'converts mars date to earth date' do
|
101
|
+
@earth_date == @mars_date.to_earth
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
describe '#to_s' do
|
106
|
+
it 'converts mars date to string' do
|
107
|
+
@mars_date.to_s.should == '214-14-26'
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
describe '#to_json' do
|
112
|
+
it 'converts mars date to a json string' do
|
113
|
+
@mars_date.to_json.should == @mars_date_json
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
describe '#as_json' do
|
118
|
+
it 'converts mars date to json' do
|
119
|
+
@mars_date.as_json.should == JSON::parse(@mars_date_json)
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
describe '#week_sol_name' do
|
124
|
+
context 'calendar type is not set' do
|
125
|
+
it 'returns "Sol Jovis"' do
|
126
|
+
@mars_date.week_sol_name.should == 'Sol Jovis'
|
127
|
+
end
|
128
|
+
end
|
129
|
+
context 'calendar type is "Martina"' do
|
130
|
+
it 'returns "Sol Jovis"' do
|
131
|
+
mars_date = DarianCalendar::Date.from_earth(@earth_date, DarianCalendar::CalendarTypes::MARTIANA)
|
132
|
+
mars_date.week_sol_name.should == 'Sol Jovis'
|
133
|
+
end
|
134
|
+
end
|
135
|
+
context 'calendar type is "Defrost"' do
|
136
|
+
it 'returns "Erjasol"' do
|
137
|
+
mars_date = DarianCalendar::Date.from_earth(@earth_date, DarianCalendar::CalendarTypes::DEFROST)
|
138
|
+
mars_date.week_sol_name.should == 'Erjasol'
|
139
|
+
end
|
140
|
+
end
|
141
|
+
context 'calendar type is "Areosynchronous"' do
|
142
|
+
it 'returns "Venusol"' do
|
143
|
+
mars_date = DarianCalendar::Date.from_earth(@earth_date, DarianCalendar::CalendarTypes::AREOSYNCHRONOUS)
|
144
|
+
mars_date.week_sol_name.should == 'Venusol'
|
145
|
+
end
|
146
|
+
end
|
147
|
+
context 'calendar type is "Hensel"' do
|
148
|
+
it 'returns "Sol Jovis"' do
|
149
|
+
mars_date = DarianCalendar::Date.from_earth(@earth_date, DarianCalendar::CalendarTypes::HENSEL)
|
150
|
+
mars_date.week_sol_name.should == 'Sol Jovis'
|
151
|
+
end
|
152
|
+
end
|
153
|
+
context 'calendar type is "Aqua"' do
|
154
|
+
it 'returns "5"' do
|
155
|
+
mars_date = DarianCalendar::Date.from_earth(@earth_date, DarianCalendar::CalendarTypes::AQUA)
|
156
|
+
mars_date.week_sol_name.should == '5'
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
describe '#month_name' do
|
162
|
+
context 'calendar type is not set' do
|
163
|
+
it 'returns "Mithuna"' do
|
164
|
+
@mars_date.month_name.should == 'Mithuna'
|
165
|
+
end
|
166
|
+
end
|
167
|
+
context 'calendar type is "Martina"' do
|
168
|
+
it 'returns "Mithuna"' do
|
169
|
+
mars_date = DarianCalendar::Date.from_earth(@earth_date, DarianCalendar::CalendarTypes::MARTIANA)
|
170
|
+
mars_date.month_name.should == 'Mithuna'
|
171
|
+
end
|
172
|
+
end
|
173
|
+
context 'calendar type is "Defrost"' do
|
174
|
+
it 'returns "Neturima"' do
|
175
|
+
mars_date = DarianCalendar::Date.from_earth(@earth_date, DarianCalendar::CalendarTypes::DEFROST)
|
176
|
+
mars_date.month_name.should == 'Neturima'
|
177
|
+
end
|
178
|
+
end
|
179
|
+
context 'calendar type is "Areosynchronous"' do
|
180
|
+
it 'returns "Neturima"' do
|
181
|
+
mars_date = DarianCalendar::Date.from_earth(@earth_date, DarianCalendar::CalendarTypes::AREOSYNCHRONOUS)
|
182
|
+
mars_date.month_name.should == 'Neturima'
|
183
|
+
end
|
184
|
+
end
|
185
|
+
context 'calendar type is "Hensel"' do
|
186
|
+
it 'returns "Duautumn"' do
|
187
|
+
mars_date = DarianCalendar::Date.from_earth(@earth_date, DarianCalendar::CalendarTypes::HENSEL)
|
188
|
+
mars_date.month_name.should == 'Duautumn'
|
189
|
+
end
|
190
|
+
end
|
191
|
+
context 'calendar type is "Aqua"' do
|
192
|
+
it 'returns "14"' do
|
193
|
+
mars_date = DarianCalendar::Date.from_earth(@earth_date, DarianCalendar::CalendarTypes::AQUA)
|
194
|
+
mars_date.month_name.should == '14'
|
195
|
+
end
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
199
|
+
end
|
200
|
+
|
201
|
+
end
|
202
|
+
|
data/spec/spec_helper.rb
CHANGED
data/spec/time_spec.rb
CHANGED
@@ -5,8 +5,11 @@ require 'spec_helper'
|
|
5
5
|
describe DarianCalendar::Time do
|
6
6
|
|
7
7
|
before do
|
8
|
-
@
|
8
|
+
@earth_date = ::Date.new(2012, 10, 15)
|
9
|
+
@earth_time = ::Time.utc(2012, 10, 15, 16, 50, 0)
|
10
|
+
@mars_date = DarianCalendar::Date.from_earth(@earth_date)
|
9
11
|
@mars_time = DarianCalendar::Time.from_earth(@earth_time)
|
12
|
+
@mars_time_json = '{"calendar_type":"Martiana","hour":20,"min":10,"month":14,"month_name":"Mithuna","month_of_season":1,"season":2,"sec":2,"sol":26,"sol_of_season":53,"sol_of_year":387,"total_sols":143466.84030197054,"week_sol":5,"week_sol_name":"Sol Jovis","year":214}'
|
10
13
|
end
|
11
14
|
|
12
15
|
describe 'attributes' do
|
@@ -38,10 +41,9 @@ describe DarianCalendar::Time do
|
|
38
41
|
|
39
42
|
describe 'class methods' do
|
40
43
|
|
41
|
-
describe '.
|
42
|
-
it '
|
43
|
-
|
44
|
-
sols.should == @mars_time.total_sols
|
44
|
+
describe '.from_earth' do
|
45
|
+
it 'converts an earth time to a mars time' do
|
46
|
+
DarianCalendar::Date.from_earth(@earth_time).should == @mars_time
|
45
47
|
end
|
46
48
|
end
|
47
49
|
|
@@ -51,13 +53,26 @@ describe DarianCalendar::Time do
|
|
51
53
|
end
|
52
54
|
end
|
53
55
|
|
56
|
+
describe '.today' do
|
57
|
+
it 'returns current mars date' do
|
58
|
+
::Date.should_receive(:today).and_return(@earth_date)
|
59
|
+
DarianCalendar::Time.today.should == DarianCalendar::Date.from_earth(@earth_date)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
54
63
|
describe '.now' do
|
55
64
|
it 'returns current mars time' do
|
56
|
-
Time.should_receive(:now).and_return(@earth_time)
|
65
|
+
::Time.should_receive(:now).and_return(@earth_time)
|
57
66
|
DarianCalendar.now.should == DarianCalendar::Time.from_earth(@earth_time)
|
58
67
|
end
|
59
68
|
end
|
60
69
|
|
70
|
+
describe '.from_json' do
|
71
|
+
it 'parses a json string and creates a mars date' do
|
72
|
+
DarianCalendar::Time.from_json(@mars_time_json).should == @mars_time
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
61
76
|
end
|
62
77
|
|
63
78
|
describe 'instance methods' do
|
@@ -105,6 +120,24 @@ describe DarianCalendar::Time do
|
|
105
120
|
end
|
106
121
|
end
|
107
122
|
|
123
|
+
describe '#to_date' do
|
124
|
+
it 'returns the date of the mars time' do
|
125
|
+
@mars_time.to_date.should == @mars_date
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
describe '#to_json' do
|
130
|
+
it 'converts mars time to a json string' do
|
131
|
+
@mars_time.to_json.should == @mars_time_json
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
describe '#as_json' do
|
136
|
+
it 'converts mars time to json' do
|
137
|
+
@mars_time.as_json.should == JSON::parse(@mars_time_json)
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
108
141
|
describe '#week_sol_name' do
|
109
142
|
context 'calendar type is not set' do
|
110
143
|
it 'returns "Sol Jovis"' do
|
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: '1.0'
|
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-13 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,
|
@@ -32,9 +32,11 @@ files:
|
|
32
32
|
- Rakefile
|
33
33
|
- darian_calendar.gemspec
|
34
34
|
- lib/darian_calendar.rb
|
35
|
+
- lib/darian_calendar/date.rb
|
35
36
|
- lib/darian_calendar/time.rb
|
36
37
|
- lib/darian_calendar/version.rb
|
37
38
|
- spec/darian_calendar_spec.rb
|
39
|
+
- spec/date_spec.rb
|
38
40
|
- spec/spec_helper.rb
|
39
41
|
- spec/time_spec.rb
|
40
42
|
homepage: http://github.com/marsec/darian_calendar
|