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.
@@ -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: 1.1.3
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: 2019-07-27 00:00:00.000000000 Z
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
- - test/spec/marsdate_spec.rb
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
- - Ruby
35
- metadata: {}
36
- post_install_message:
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: '0'
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
- rubyforge_project:
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
@@ -1,5 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require './lib/marsdate'
4
- puts MarsDateTime::VERSION
5
-
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