tengai 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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: []