marsdate 1.1.3 → 2.0.0
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 +5 -5
- data/CHANGELOG.md +14 -0
- data/LICENSE.txt +21 -0
- data/README.md +650 -0
- data/bin/marsdate +167 -15
- data/lib/marsdate/calendar.rb +128 -0
- data/lib/marsdate/timescale.rb +314 -0
- data/lib/marsdate/version.rb +3 -0
- data/lib/marsdate.rb +289 -241
- data/marsdate.gemspec +31 -0
- data/test/calendar_test.rb +142 -0
- data/test/cli_test.rb +57 -0
- data/test/test.rb +305 -313
- data/test/timescale_test.rb +124 -0
- metadata +51 -19
- data/bin/marsdate-version +0 -5
- data/bin/mcal.rb +0 -50
- data/bin/meh.html +0 -2941
- data/bin/mkcal.rb +0 -51
- data/bin/mtcon.rb +0 -29
- data/bin/mtoday.rb +0 -5
- data/test/spec/marsdate_spec.rb +0 -382
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# Tests for MarsDateTime::TimeScale (NASA/Allison / Mars24).
|
|
3
|
+
# Run: ruby test/timescale_test.rb
|
|
4
|
+
|
|
5
|
+
require 'minitest/autorun'
|
|
6
|
+
require_relative '../lib/marsdate/timescale'
|
|
7
|
+
require 'date'
|
|
8
|
+
|
|
9
|
+
class TimeScaleTest < Minitest::Test
|
|
10
|
+
TS = MarsDateTime::TimeScale
|
|
11
|
+
|
|
12
|
+
def test_tai_utc_table
|
|
13
|
+
assert_in_delta 10.0, TS.tai_utc(Date.new(1972, 1, 1)), 1e-9
|
|
14
|
+
assert_in_delta 32.0, TS.tai_utc(Date.new(1999, 6, 1)), 1e-9
|
|
15
|
+
assert_in_delta 32.0, TS.tai_utc(Date.new(2000, 1, 6)), 1e-9
|
|
16
|
+
assert_in_delta 37.0, TS.tai_utc(Date.new(2017, 1, 1)), 1e-9
|
|
17
|
+
assert_in_delta 37.0, TS.tai_utc(Date.new(2026, 8, 13)), 1e-9
|
|
18
|
+
assert_in_delta 64.184, TS.tt_utc(Date.new(2000, 1, 6)), 1e-9
|
|
19
|
+
assert_in_delta 69.184, TS.tt_utc(Date.new(2017, 1, 1)), 1e-9
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def test_mars24_2000_jan_6
|
|
23
|
+
# Mars24 worked example: 2000-01-06 00:00:00 UTC → MST 23:59:39
|
|
24
|
+
dt = DateTime.new(2000, 1, 6, 0, 0, 0)
|
|
25
|
+
assert_in_delta 2_451_549.5, TS.jd_ut(dt), 1e-9
|
|
26
|
+
assert_in_delta 2_451_549.500742407, TS.jd_tt(dt), 2e-6
|
|
27
|
+
h, m, s = TS.mtc_hms(dt)
|
|
28
|
+
hours = hms_to_hours(h, m, s)
|
|
29
|
+
assert_in_delta hms_to_hours(23, 59, 39), hours, 1.5 / 3600.0
|
|
30
|
+
assert_equal 23, h
|
|
31
|
+
assert_equal 59, m
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def test_offset_independent
|
|
35
|
+
utc = DateTime.new(2000, 1, 1, 12, 0, 0)
|
|
36
|
+
est = utc.new_offset(Rational(-5, 24))
|
|
37
|
+
assert_in_delta TS.msd(utc), TS.msd(est), 1e-12
|
|
38
|
+
assert_in_delta TS.mtc_hours(utc), TS.mtc_hours(est), 1e-12
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def test_wikipedia_2026_aug_12
|
|
42
|
+
# Wikipedia Timekeeping_on_Mars snapshot: 12 Aug 2026 00:25:08 UTC
|
|
43
|
+
# JDTT = 2461264.51825, MSD = 54251.08514, MTC = 02:02:36
|
|
44
|
+
dt = DateTime.new(2026, 8, 12, 0, 25, 8)
|
|
45
|
+
assert_in_delta 2_461_264.51825, TS.jd_tt(dt), 5e-5
|
|
46
|
+
assert_in_delta 54_251.08514, TS.msd(dt), 5e-5
|
|
47
|
+
h, m, s = TS.mtc_hms(dt)
|
|
48
|
+
assert_in_delta hms_to_hours(2, 2, 36), hms_to_hours(h, m, s), 2.0 / 3600.0
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def test_mxt_vs_mtc
|
|
52
|
+
dt = DateTime.new(2000, 1, 6, 0, 0, 0)
|
|
53
|
+
frac = TS.sol_fraction(dt)
|
|
54
|
+
assert_operator frac, :>=, 0
|
|
55
|
+
assert_operator frac, :<, 1
|
|
56
|
+
si = TS.mxt_si_seconds(dt)
|
|
57
|
+
assert_in_delta frac * TS::SOL_SI_SECONDS, si, 1e-6
|
|
58
|
+
mtc_h = TS.mtc_hours(dt)
|
|
59
|
+
mxt_h = si / 3600.0
|
|
60
|
+
assert_in_delta mtc_h * TS::SOL_DAYS, mxt_h, 1e-6
|
|
61
|
+
assert_includes 88_775.0..88_776.0, TS::SOL_SI_SECONDS
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def test_mtc_rounding_stays_below_24_hours
|
|
65
|
+
h, m, s = TS.hours_to_hms(24.0.prev_float, limit: 24)
|
|
66
|
+
|
|
67
|
+
assert_equal [23, 59], [h, m]
|
|
68
|
+
assert_operator s, :<, 60
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def test_ls_j2000_region
|
|
72
|
+
dt = DateTime.new(2000, 1, 6, 0, 0, 0)
|
|
73
|
+
ls = TS.ls_deg(TS.jd_tt(dt))
|
|
74
|
+
assert_in_delta 277.19, ls, 0.05
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def test_earth_from_msd_round_trip
|
|
78
|
+
dt = DateTime.new(2000, 1, 6, 0, 0, 0)
|
|
79
|
+
back = TS.earth_from_msd(TS.msd(dt))
|
|
80
|
+
assert_in_delta 0, (back - dt).to_f, 1e-9
|
|
81
|
+
|
|
82
|
+
dt = DateTime.new(2026, 8, 13, 0, 6, 56)
|
|
83
|
+
back = TS.earth_from_msd(TS.msd(dt))
|
|
84
|
+
assert_in_delta 0, (back - dt).to_f, 1e-8
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def test_year1_caption_treats_tt_as_ut
|
|
88
|
+
r = TS.epoch_report
|
|
89
|
+
assert_match(/no year-1/, r[:caveat])
|
|
90
|
+
assert_equal(-665773, r[:epoch_msd])
|
|
91
|
+
cap = r[:epoch_earth_if_tt_were_ut]
|
|
92
|
+
assert_equal 1, cap.year
|
|
93
|
+
assert_equal 1, cap.month
|
|
94
|
+
assert_equal 23, cap.day
|
|
95
|
+
assert_equal 13, cap.hour
|
|
96
|
+
assert_equal 40, cap.min
|
|
97
|
+
eq = r[:ls0_earth_if_tt_were_ut]
|
|
98
|
+
assert_equal 1, eq.year
|
|
99
|
+
assert_equal 1, eq.month
|
|
100
|
+
assert_equal 24, eq.day
|
|
101
|
+
assert_equal 5, eq.hour
|
|
102
|
+
assert_equal 53, eq.min
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def test_year1_equinox_sol
|
|
106
|
+
hint = DateTime.new(1, 1, 22, 12, 0, 0)
|
|
107
|
+
eq = TS.vernal_equinox_jd_tt(hint.ajd.to_f)
|
|
108
|
+
ls = TS.ls_deg(eq)
|
|
109
|
+
dist = [ls, (ls - 360).abs].min
|
|
110
|
+
assert_operator dist, :<, 0.01, "year-1 Ls=0 search: Ls=#{ls} at JD_TT=#{eq}"
|
|
111
|
+
m = TS.msd(jd_tt: eq)
|
|
112
|
+
assert_operator m, :<, 0, "year-1 MSD should be before 1873 (got #{m})"
|
|
113
|
+
frac = m % 1.0
|
|
114
|
+
frac += 1 if frac < 0
|
|
115
|
+
assert_operator frac, :>=, 0
|
|
116
|
+
assert_operator frac, :<, 1
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
private
|
|
120
|
+
|
|
121
|
+
def hms_to_hours(h, m, s)
|
|
122
|
+
h + m / 60.0 + s / 3600.0
|
|
123
|
+
end
|
|
124
|
+
end
|
metadata
CHANGED
|
@@ -1,39 +1,73 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: marsdate
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version:
|
|
4
|
+
version: 2.0.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Hal Fulton
|
|
8
|
-
autorequire:
|
|
9
8
|
bindir: bin
|
|
10
9
|
cert_chain: []
|
|
11
|
-
date:
|
|
12
|
-
dependencies:
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
11
|
+
dependencies:
|
|
12
|
+
- !ruby/object:Gem::Dependency
|
|
13
|
+
name: minitest
|
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
|
15
|
+
requirements:
|
|
16
|
+
- - "~>"
|
|
17
|
+
- !ruby/object:Gem::Version
|
|
18
|
+
version: '6.0'
|
|
19
|
+
type: :development
|
|
20
|
+
prerelease: false
|
|
21
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
22
|
+
requirements:
|
|
23
|
+
- - "~>"
|
|
24
|
+
- !ruby/object:Gem::Version
|
|
25
|
+
version: '6.0'
|
|
26
|
+
- !ruby/object:Gem::Dependency
|
|
27
|
+
name: rake
|
|
28
|
+
requirement: !ruby/object:Gem::Requirement
|
|
29
|
+
requirements:
|
|
30
|
+
- - "~>"
|
|
31
|
+
- !ruby/object:Gem::Version
|
|
32
|
+
version: '13.4'
|
|
33
|
+
type: :development
|
|
34
|
+
prerelease: false
|
|
35
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
36
|
+
requirements:
|
|
37
|
+
- - "~>"
|
|
38
|
+
- !ruby/object:Gem::Version
|
|
39
|
+
version: '13.4'
|
|
13
40
|
description: |2
|
|
14
41
|
This is a library for handling dates and times on Mars
|
|
15
42
|
for the Martian Common Era calendar (created by Hal Fulton).
|
|
16
43
|
The functionality closely follows that of Ruby's Time class.
|
|
17
44
|
email: rubyhacker@gmail.com
|
|
18
|
-
executables:
|
|
45
|
+
executables:
|
|
46
|
+
- marsdate
|
|
19
47
|
extensions: []
|
|
20
48
|
extra_rdoc_files: []
|
|
21
49
|
files:
|
|
50
|
+
- CHANGELOG.md
|
|
51
|
+
- LICENSE.txt
|
|
52
|
+
- README.md
|
|
22
53
|
- bin/marsdate
|
|
23
|
-
- bin/marsdate-version
|
|
24
|
-
- bin/mcal.rb
|
|
25
|
-
- bin/meh.html
|
|
26
|
-
- bin/mkcal.rb
|
|
27
|
-
- bin/mtcon.rb
|
|
28
|
-
- bin/mtoday.rb
|
|
29
54
|
- lib/marsdate.rb
|
|
30
|
-
-
|
|
55
|
+
- lib/marsdate/calendar.rb
|
|
56
|
+
- lib/marsdate/timescale.rb
|
|
57
|
+
- lib/marsdate/version.rb
|
|
58
|
+
- marsdate.gemspec
|
|
59
|
+
- test/calendar_test.rb
|
|
60
|
+
- test/cli_test.rb
|
|
31
61
|
- test/test.rb
|
|
62
|
+
- test/timescale_test.rb
|
|
32
63
|
homepage: https://github.com/Hal9000/marsdate
|
|
33
64
|
licenses:
|
|
34
|
-
-
|
|
35
|
-
metadata:
|
|
36
|
-
|
|
65
|
+
- MIT
|
|
66
|
+
metadata:
|
|
67
|
+
bug_tracker_uri: https://github.com/Hal9000/marsdate/issues
|
|
68
|
+
changelog_uri: https://github.com/Hal9000/marsdate/blob/master/CHANGELOG.md
|
|
69
|
+
source_code_uri: https://github.com/Hal9000/marsdate
|
|
70
|
+
post_install_message: "\n Success! Run executable 'marsdate' for help.\n "
|
|
37
71
|
rdoc_options: []
|
|
38
72
|
require_paths:
|
|
39
73
|
- lib
|
|
@@ -41,16 +75,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
41
75
|
requirements:
|
|
42
76
|
- - ">="
|
|
43
77
|
- !ruby/object:Gem::Version
|
|
44
|
-
version: '
|
|
78
|
+
version: '2.7'
|
|
45
79
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
46
80
|
requirements:
|
|
47
81
|
- - ">="
|
|
48
82
|
- !ruby/object:Gem::Version
|
|
49
83
|
version: '0'
|
|
50
84
|
requirements: []
|
|
51
|
-
|
|
52
|
-
rubygems_version: 2.2.2
|
|
53
|
-
signing_key:
|
|
85
|
+
rubygems_version: 3.6.9
|
|
54
86
|
specification_version: 4
|
|
55
87
|
summary: Date/time library for Mars
|
|
56
88
|
test_files: []
|
data/bin/marsdate-version
DELETED
data/bin/mcal.rb
DELETED
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
require 'marsdate'
|
|
2
|
-
|
|
3
|
-
def put_week(week)
|
|
4
|
-
week.each {|x| printf("%3s ",x.to_s) }
|
|
5
|
-
puts
|
|
6
|
-
end
|
|
7
|
-
|
|
8
|
-
mon, yr = ARGV
|
|
9
|
-
# p [mon, yr]
|
|
10
|
-
now = MarsDateTime.now
|
|
11
|
-
mon ||= now.month
|
|
12
|
-
yr ||= now.year
|
|
13
|
-
# p [mon, yr]
|
|
14
|
-
mon = mon.to_i
|
|
15
|
-
yr = yr.to_i
|
|
16
|
-
# p [mon, yr]
|
|
17
|
-
|
|
18
|
-
ftm = MarsDateTime.new(yr, mon, 1)
|
|
19
|
-
|
|
20
|
-
header = %w[Sun Mon Tue Wed Thu Fri Sat]
|
|
21
|
-
|
|
22
|
-
week1 = Array.new(7)
|
|
23
|
-
sol = 0
|
|
24
|
-
ftm.dow.upto(6) do |d|
|
|
25
|
-
week1[d] = (sol += 1)
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
solN = MarsDateTime.sols_in_month(mon, yr)
|
|
29
|
-
remaining = ((sol += 1)..solN).to_a
|
|
30
|
-
|
|
31
|
-
weeks = []
|
|
32
|
-
weeks << header << week1
|
|
33
|
-
|
|
34
|
-
loop do
|
|
35
|
-
week = []
|
|
36
|
-
7.times { week << remaining.shift }
|
|
37
|
-
weeks << week
|
|
38
|
-
break if remaining.empty?
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
label = ftm.month_name + " " + ftm.year.to_s
|
|
42
|
-
spacing = " "*((27 - label.length)/2)
|
|
43
|
-
|
|
44
|
-
puts
|
|
45
|
-
puts spacing + label
|
|
46
|
-
puts
|
|
47
|
-
|
|
48
|
-
weeks.each {|week| put_week(week) }
|
|
49
|
-
|
|
50
|
-
puts
|