tengai 0.0.1

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.
Files changed (38) hide show
  1. data/.gitignore +3 -0
  2. data/.ruby-gemset +1 -0
  3. data/.ruby-version +1 -0
  4. data/.travis.yml +8 -0
  5. data/Gemfile +3 -0
  6. data/README.md +47 -0
  7. data/Rakefile +52 -0
  8. data/ext/horizons/body_data_sheet_parser.rb +350 -0
  9. data/ext/horizons/body_data_sheet_parser.rl +52 -0
  10. data/ext/horizons/vector_ephemeris_parser.rb +4400 -0
  11. data/ext/horizons/vector_ephemeris_parser.rl +115 -0
  12. data/lib/tengai/body.rb +22 -0
  13. data/lib/tengai/client.rb +34 -0
  14. data/lib/tengai/ephemeris.rb +56 -0
  15. data/lib/tengai/parsers/ephemeris_table_parser.rb +20 -0
  16. data/lib/tengai/requests/ephemeris_request.rb +131 -0
  17. data/lib/tengai/vector_ephemeris_table.rb +36 -0
  18. data/lib/tengai/version.rb +5 -0
  19. data/lib/tengai.rb +27 -0
  20. data/tengai.gemspec +63 -0
  21. data/test/fixtures/bodies/10.txt +23 -0
  22. data/test/fixtures/bodies/399.txt +29 -0
  23. data/test/fixtures/bodies/499.txt +25 -0
  24. data/test/fixtures/bodies/501.txt +13 -0
  25. data/test/fixtures/ephemerides/mars_observed_by_earth_from_2012_12_28_to_29.txt +270 -0
  26. data/test/fixtures/ephemerides/mars_vectors_from_solar_system_center.txt +61 -0
  27. data/test/fixtures/major_bodies.txt +300 -0
  28. data/test/fixtures.rb +21 -0
  29. data/test/integration/body_integration_test.rb +26 -0
  30. data/test/integration/ephemeris_integration_test.rb +32 -0
  31. data/test/test_helper.rb +13 -0
  32. data/test/unit/body_data_sheet_parser_test.rb +25 -0
  33. data/test/unit/body_test.rb +35 -0
  34. data/test/unit/ephemeris_table_parser_test.rb +19 -0
  35. data/test/unit/ephemeris_test.rb +22 -0
  36. data/test/unit/vector_ephemeris_parser_test.rb +47 -0
  37. data/test/unit/vector_ephemeris_table_test.rb +30 -0
  38. metadata +178 -0
data/test/fixtures.rb ADDED
@@ -0,0 +1,21 @@
1
+ module Fixtures
2
+ def self.io
3
+ File.read('test/fixtures/bodies/501.txt')
4
+ end
5
+
6
+ def self.mars
7
+ File.read('test/fixtures/bodies/499.txt')
8
+ end
9
+
10
+ def self.earth
11
+ File.read('test/fixtures/bodies/399.txt')
12
+ end
13
+
14
+ def self.ephemeris
15
+ File.read('test/fixtures/ephemerides/mars_observed_by_earth_from_2012_12_28_to_29.txt')
16
+ end
17
+
18
+ def self.vector_ephemeris
19
+ File.read('test/fixtures/ephemerides/mars_vectors_from_solar_system_center.txt')
20
+ end
21
+ end
@@ -0,0 +1,26 @@
1
+ require 'test_helper'
2
+ require 'fixtures'
3
+
4
+ class BodyIntegrationTest < Test::Unit::TestCase
5
+ def setup
6
+ @client = Client.new
7
+ end
8
+
9
+ def test_find_mars
10
+ body = Body.find(@client, 499)
11
+ assert_equal 499, body.id
12
+ assert_equal 'Mars', body.name
13
+ assert_equal Body.new(BodyDataSheetParser.parse(Fixtures.mars)), body
14
+ end
15
+
16
+ def test_find_earth
17
+ body = Body.find(@client, 399)
18
+ assert_equal 399, body.id
19
+ assert_equal 'Earth', body.name
20
+ assert_equal Body.new(BodyDataSheetParser.parse(Fixtures.earth)), body
21
+ end
22
+
23
+ def teardown
24
+ @client.disconnect
25
+ end
26
+ end
@@ -0,0 +1,32 @@
1
+ require 'test_helper'
2
+
3
+ class EphemerisIntegrationTest < Test::Unit::TestCase
4
+ def setup
5
+ @client = Client.new
6
+ @mars = Body.find(@client, 499)
7
+
8
+ # Limit delta, otherwise the system can take a long time to generate an
9
+ # ephemeris.
10
+ @start_time = Forgery::Date.date(max_delta: 3).to_datetime
11
+ @stop_time = @start_time + 1 + rand(2)
12
+
13
+ @ephemeris = Ephemeris.fetch(
14
+ @client, @mars, start_time: @start_time, stop_time: @stop_time)
15
+ end
16
+
17
+ def test_target_body_id
18
+ assert_equal @mars, @ephemeris.target_body
19
+ end
20
+
21
+ def test_start_time
22
+ assert_equal @start_time, @ephemeris.start_time
23
+ end
24
+
25
+ def test_stop_time
26
+ assert_equal @stop_time, @ephemeris.stop_time
27
+ end
28
+
29
+ def teardown
30
+ @client.disconnect
31
+ end
32
+ end
@@ -0,0 +1,13 @@
1
+ $:.unshift File.dirname(__FILE__)
2
+ require 'simplecov'
3
+ SimpleCov.start do
4
+ add_filter '/test/'
5
+ end
6
+ require 'test/unit'
7
+ require 'mocha/setup'
8
+ require 'forgery'
9
+ require 'pry'
10
+
11
+ require 'tengai'
12
+
13
+ include Tengai
@@ -0,0 +1,25 @@
1
+ require 'test/unit'
2
+ require 'fixtures'
3
+ require_relative '../../ext/horizons/body_data_sheet_parser'
4
+
5
+ class BodyDataSheetParserTest < Test::Unit::TestCase
6
+ def setup
7
+ @parsed_mars_data = Tengai::BodyDataSheetParser.parse(Fixtures.mars)
8
+ @parsed_io_data = Tengai::BodyDataSheetParser.parse(Fixtures.io)
9
+ end
10
+
11
+ def test_revised_on
12
+ assert_equal Date.new(2012, 9, 28), @parsed_mars_data[:revised_on]
13
+ assert_equal Date.new(2004, 1, 8), @parsed_io_data[:revised_on]
14
+ end
15
+
16
+ def test_name
17
+ assert_equal 'Mars', @parsed_mars_data[:name]
18
+ assert_equal 'Io / (Jupiter)', @parsed_io_data[:name]
19
+ end
20
+
21
+ def test_id
22
+ assert_equal 499, @parsed_mars_data[:id]
23
+ assert_equal 501, @parsed_io_data[:id]
24
+ end
25
+ end
@@ -0,0 +1,35 @@
1
+ require 'test/unit'
2
+ require 'mocha/setup'
3
+ require 'fixtures'
4
+ require_relative '../../lib/tengai/body'
5
+
6
+ class BodyTest < Test::Unit::TestCase
7
+ def setup
8
+ @client = mock('Client')
9
+ end
10
+
11
+ def test_find_sends_command_body_id
12
+ client = mock
13
+ client.expects(:cmd).
14
+ with('String' => '499', 'Match' => /<cr>:\s*$/).
15
+ returns(Fixtures.mars)
16
+
17
+ Tengai::Body.find(client, 499, stub_everything)
18
+ end
19
+
20
+ def test_find_invokes_parser
21
+ client = mock
22
+ client.stubs(:cmd).
23
+ with('String' => '499', 'Match' => /<cr>:\s*$/).
24
+ returns(Fixtures.mars)
25
+ parser = mock
26
+ parser.expects(:parse).with(Fixtures.mars)
27
+ Tengai::Body.find(client, 499, parser)
28
+ end
29
+
30
+ def test_equality
31
+ mars_one = Tengai::Body.new(id: 499, name: 'Mars', revised_on: Date.today)
32
+ mars_two = Tengai::Body.new(id: 499, name: 'Mars', revised_on: Date.today)
33
+ assert_equal mars_one, mars_two
34
+ end
35
+ end
@@ -0,0 +1,19 @@
1
+ require 'test/unit'
2
+ require 'mocha/setup'
3
+ require_relative '../../lib/tengai/parsers/ephemeris_table_parser'
4
+
5
+ class EphemerisTableParserTest < Test::Unit::TestCase
6
+ def test_parse_returns_hash_of_table
7
+ table = <<-EOS
8
+ JDCT , , X, Y, Z, VX, VY, VZ, LT, RG, RR,
9
+ 2415023.500000000, A.D. 1900-Jan-04 00:00:00.0000, 4.798942014821934E-01, -1.203536629131559E+00, -5.652327186621962E-01, 1.370915170660907E-02, 5.502275937589785E-03, 2.149502081087562E-03, 8.164317509179321E-03, 1.413607756247767E+00, -8.900751447771002E-04,
10
+ 2451547.500000000, A.D. 2000-Jan-04 00:00:00.0000, 1.384794374160415E+00, 3.326800792581258E-02, -2.208505372473301E-02, 2.951762409660592E-04, 1.380219433765170E-02, 6.322854911310298E-03, 8.001229688088482E-03, 1.385369975369652E+00, 5.257002324522832E-04,
11
+ EOS
12
+
13
+ hashes = [
14
+ {:jdct => '2415023.500000000', :x => '4.798942014821934E-01', :y => '-1.203536629131559E+00', :z => '-5.652327186621962E-01', :vx => '1.370915170660907E-02', :vy => '5.502275937589785E-03', :vz => '2.149502081087562E-03', :lt => '8.164317509179321E-03', :rg => '1.413607756247767E+00', :rr => '-8.900751447771002E-04'},
15
+ {:jdct => '2451547.500000000', :x => '1.384794374160415E+00', :y => '3.326800792581258E-02', :z => '-2.208505372473301E-02', :vx => '2.951762409660592E-04', :vy => '1.380219433765170E-02', :vz => '6.322854911310298E-03', :lt => '8.001229688088482E-03', :rg => '1.385369975369652E+00', :rr => '5.257002324522832E-04'}]
16
+
17
+ assert_equal Tengai::EphemerisTableParser.parse(table), hashes
18
+ end
19
+ end
@@ -0,0 +1,22 @@
1
+ require 'test/unit'
2
+ require 'mocha/setup'
3
+ require_relative '../../lib/tengai/ephemeris'
4
+
5
+ class EphemerisTest < Test::Unit::TestCase
6
+ def test_fetch_should_get_data_from_an_ephemeris_request
7
+ client = mock('Client')
8
+ body = mock('Body', id: 499)
9
+ data_sheet = File.read('test/fixtures/ephemerides/mars_vectors_from_solar_system_center.txt')
10
+ data_hash = mock('Hash')
11
+ request_factory = mock('EphemerisRequest')
12
+ vector_ephemeris_parser = mock('VectorEphemerisParser')
13
+ options = {request: request_factory, parser: vector_ephemeris_parser}
14
+
15
+ request_factory.expects(:fetch).returns(data_sheet)
16
+ vector_ephemeris_parser.expects(:parse).with(data_sheet).returns(data_hash)
17
+
18
+ Tengai::Ephemeris.expects(:new).with(client, data_hash)
19
+
20
+ Tengai::Ephemeris.fetch(client, body, options)
21
+ end
22
+ end
@@ -0,0 +1,47 @@
1
+ require 'test/unit'
2
+ require 'mocha/setup'
3
+ require_relative '../../ext/horizons/vector_ephemeris_parser'
4
+
5
+ class VectorEphemerisParserTest < Test::Unit::TestCase
6
+ def setup
7
+ @table_parser = stub('EphemerisTableParser', parse: nil)
8
+ @data_sheet = File.read('test/fixtures/ephemerides/mars_vectors_from_solar_system_center.txt')
9
+ @parsed_data = Tengai::VectorEphemerisParser.parse(@data_sheet, @table_parser)
10
+ end
11
+
12
+ def test_target_body_id
13
+ assert_equal 499, @parsed_data[:target_body_id]
14
+ end
15
+
16
+ def test_center_body_id
17
+ assert_equal 0, @parsed_data[:center_body_id]
18
+ end
19
+
20
+ def test_start_time
21
+ assert_equal DateTime.parse('1900-01-04T00:00:00+00:00'), @parsed_data[:start_time]
22
+ end
23
+
24
+ def test_stop_time
25
+ assert_equal DateTime.parse('2100-01-03T00:00:00+00:00'), @parsed_data[:stop_time]
26
+ end
27
+
28
+ def test_step_size
29
+ assert_equal '100 calendar years', @parsed_data[:step_size]
30
+ end
31
+
32
+ def test_ephemeris_table
33
+ table = <<-EOS
34
+ JDCT , , X, Y, Z, VX, VY, VZ, LT, RG, RR,
35
+ 2415023.500000000, A.D. 1900-Jan-04 00:00:00.0000, 4.798942014821934E-01, -1.203536629131559E+00, -5.652327186621962E-01, 1.370915170660907E-02, 5.502275937589785E-03, 2.149502081087562E-03, 8.164317509179321E-03, 1.413607756247767E+00, -8.900751447771002E-04,
36
+ 2451547.500000000, A.D. 2000-Jan-04 00:00:00.0000, 1.384794374160415E+00, 3.326800792581258E-02, -2.208505372473301E-02, 2.951762409660592E-04, 1.380219433765170E-02, 6.322854911310298E-03, 8.001229688088482E-03, 1.385369975369652E+00, 5.257002324522832E-04,
37
+ EOS
38
+
39
+ hashes = [
40
+ {:jdct => '2415023.500000000', :x => '4.798942014821934E-01', :y => '-1.203536629131559E+00', :z => '-5.652327186621962E-01', :vx => '1.370915170660907E-02', :vy => '5.502275937589785E-03', :vz => '2.149502081087562E-03', :lt => '8.164317509179321E-03', :rg => '1.413607756247767E+00', :rr => '-8.900751447771002E-04'},
41
+ {:jdct => '2451547.500000000', :x => '1.384794374160415E+00', :y => '3.326800792581258E-02', :z => '-2.208505372473301E-02', :vx => '2.951762409660592E-04', :vy => '1.380219433765170E-02', :vz => '6.322854911310298E-03', :lt => '8.001229688088482E-03', :rg => '1.385369975369652E+00', :rr => '5.257002324522832E-04'}]
42
+
43
+ @table_parser.expects(:parse).with(table).returns(hashes)
44
+ parsed_data = Tengai::VectorEphemerisParser.parse(@data_sheet, @table_parser)
45
+ assert_equal hashes, parsed_data[:ephemeris_table]
46
+ end
47
+ end
@@ -0,0 +1,30 @@
1
+ require 'test/unit'
2
+ require 'mocha/setup'
3
+ require_relative '../../lib/tengai/vector_ephemeris_table'
4
+
5
+ class VectorEphemerisTableTest < Test::Unit::TestCase
6
+ def setup
7
+ @table = <<-EOS
8
+ JDCT , , X, Y, Z, VX, VY, VZ, LT, RG, RR,
9
+ 2415023.500000000, A.D. 1900-Jan-04 00:00:00.0000, 4.798942014821934E-01, -1.203536629131559E+00, -5.652327186621962E-01, 1.370915170660907E-02, 5.502275937589785E-03, 2.149502081087562E-03, 8.164317509179321E-03, 1.413607756247767E+00, -8.900751447771002E-04,
10
+ EOS
11
+ end
12
+
13
+ def test_new_with_table
14
+ row = mock('Row')
15
+ hash = {
16
+ jdct: '2415023.500000000',
17
+ x: '4.798942014821934E-01',
18
+ y: '-1.203536629131559E+00',
19
+ z: '-5.652327186621962E-01',
20
+ vx: '1.370915170660907E-02',
21
+ vy: '5.502275937589785E-03',
22
+ vz: '2.149502081087562E-03',
23
+ lt: '8.164317509179321E-03',
24
+ rg: '1.413607756247767E+00',
25
+ rr: '-8.900751447771002E-04'}
26
+ VectorEphemerisTable::Row.expects(:new).with(hash).returns(row)
27
+ VectorEphemerisTable.expects(:new).with([row])
28
+ VectorEphemerisTable.new_with_table([hash])
29
+ end
30
+ end
metadata ADDED
@@ -0,0 +1,178 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: tengai
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Zac Stewart
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-07-29 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: virtus
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: pry
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: rake
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: mocha
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: simplecov
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ - !ruby/object:Gem::Dependency
95
+ name: forgery
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ description: Ruby wrapper for the NASA HORIZONS telnet system
111
+ email:
112
+ - zgstewart@gmail.com
113
+ executables: []
114
+ extensions: []
115
+ extra_rdoc_files: []
116
+ files:
117
+ - .gitignore
118
+ - .ruby-gemset
119
+ - .ruby-version
120
+ - .travis.yml
121
+ - Gemfile
122
+ - README.md
123
+ - Rakefile
124
+ - ext/horizons/body_data_sheet_parser.rb
125
+ - ext/horizons/body_data_sheet_parser.rl
126
+ - ext/horizons/vector_ephemeris_parser.rb
127
+ - ext/horizons/vector_ephemeris_parser.rl
128
+ - lib/tengai.rb
129
+ - lib/tengai/body.rb
130
+ - lib/tengai/client.rb
131
+ - lib/tengai/ephemeris.rb
132
+ - lib/tengai/parsers/ephemeris_table_parser.rb
133
+ - lib/tengai/requests/ephemeris_request.rb
134
+ - lib/tengai/vector_ephemeris_table.rb
135
+ - lib/tengai/version.rb
136
+ - tengai.gemspec
137
+ - test/fixtures.rb
138
+ - test/fixtures/bodies/10.txt
139
+ - test/fixtures/bodies/399.txt
140
+ - test/fixtures/bodies/499.txt
141
+ - test/fixtures/bodies/501.txt
142
+ - test/fixtures/ephemerides/mars_observed_by_earth_from_2012_12_28_to_29.txt
143
+ - test/fixtures/ephemerides/mars_vectors_from_solar_system_center.txt
144
+ - test/fixtures/major_bodies.txt
145
+ - test/integration/body_integration_test.rb
146
+ - test/integration/ephemeris_integration_test.rb
147
+ - test/test_helper.rb
148
+ - test/unit/body_data_sheet_parser_test.rb
149
+ - test/unit/body_test.rb
150
+ - test/unit/ephemeris_table_parser_test.rb
151
+ - test/unit/ephemeris_test.rb
152
+ - test/unit/vector_ephemeris_parser_test.rb
153
+ - test/unit/vector_ephemeris_table_test.rb
154
+ homepage: http://github.com/zacstewart/tengai
155
+ licenses: []
156
+ post_install_message:
157
+ rdoc_options: []
158
+ require_paths:
159
+ - lib
160
+ required_ruby_version: !ruby/object:Gem::Requirement
161
+ none: false
162
+ requirements:
163
+ - - ! '>='
164
+ - !ruby/object:Gem::Version
165
+ version: '0'
166
+ required_rubygems_version: !ruby/object:Gem::Requirement
167
+ none: false
168
+ requirements:
169
+ - - ! '>='
170
+ - !ruby/object:Gem::Version
171
+ version: '0'
172
+ requirements: []
173
+ rubyforge_project:
174
+ rubygems_version: 1.8.23
175
+ signing_key:
176
+ specification_version: 3
177
+ summary: Ruby wrapper for the NASA HORIZONS telnet system
178
+ test_files: []