daikini-octave-ruby 1.0.9

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 (40) hide show
  1. data/History.txt +54 -0
  2. data/LICENSE.txt +674 -0
  3. data/Manifest.txt +39 -0
  4. data/README.txt +58 -0
  5. data/Rakefile +18 -0
  6. data/ext/octave_api/MANIFEST +4 -0
  7. data/ext/octave_api/Makefile +149 -0
  8. data/ext/octave_api/extconf.rb +30 -0
  9. data/ext/octave_api/octave-includes.h +11 -0
  10. data/ext/octave_api/octave-ruby.cpp +62 -0
  11. data/ext/octave_api/octave-ruby.h +18 -0
  12. data/ext/octave_api/octave_api.c +22 -0
  13. data/ext/octave_api/octave_api.h +13 -0
  14. data/ext/octave_api/or-array.cpp +56 -0
  15. data/ext/octave_api/or-array.h +20 -0
  16. data/ext/octave_api/or-boolean_matrix.cpp +61 -0
  17. data/ext/octave_api/or-boolean_matrix.h +20 -0
  18. data/ext/octave_api/or-cell_matrix.cpp +66 -0
  19. data/ext/octave_api/or-cell_matrix.h +22 -0
  20. data/ext/octave_api/or-hash.cpp +23 -0
  21. data/ext/octave_api/or-hash.h +19 -0
  22. data/ext/octave_api/or-matrix.cpp +89 -0
  23. data/ext/octave_api/or-matrix.h +22 -0
  24. data/ext/octave_api/or-string.cpp +13 -0
  25. data/ext/octave_api/or-string.h +22 -0
  26. data/ext/octave_api/or-struct_matrix.cpp +88 -0
  27. data/ext/octave_api/or-struct_matrix.h +22 -0
  28. data/ext/octave_api/or-variable.cpp +58 -0
  29. data/ext/octave_api/or-variable.h +22 -0
  30. data/lib/octave.rb +5 -0
  31. data/lib/octave/driver/native/driver.rb +26 -0
  32. data/lib/octave/engine.rb +75 -0
  33. data/lib/octave/matrix.rb +84 -0
  34. data/lib/octave/version.rb +14 -0
  35. data/octave-ruby.gemspec +21 -0
  36. data/setup.rb +1333 -0
  37. data/test/driver/native/test_conversions.rb +203 -0
  38. data/test/driver/native/test_driver.rb +32 -0
  39. data/test/test_engine.rb +50 -0
  40. metadata +99 -0
@@ -0,0 +1,203 @@
1
+ $:.unshift File.dirname(__FILE__) + "/../../../lib"
2
+ require 'test/unit'
3
+ require 'octave'
4
+ require 'octave/driver/native/driver'
5
+ require 'rubygems'
6
+ require 'mocha'
7
+ require 'yaml'
8
+
9
+ class ConversionsTest < Test::Unit::TestCase
10
+ def setup
11
+ @driver = Octave::Driver::Native::Driver.new
12
+ @driver.feval "eval", "function r = to_octave(val); r = val; endfunction"
13
+ end
14
+
15
+ def to_octave_to_ruby(value)
16
+ @driver.feval "to_octave", value
17
+ end
18
+
19
+ def assert_octave_and_ruby_equal(value)
20
+ result = to_octave_to_ruby(value)
21
+ assert_equal value, result
22
+ assert_equal value.class, result.class
23
+ end
24
+
25
+ def test_should_convert_string
26
+ assert_octave_and_ruby_equal "foo"
27
+ end
28
+
29
+ def test_should_convert_true
30
+ assert_octave_and_ruby_equal true
31
+ end
32
+
33
+ def test_should_convert_false
34
+ assert_octave_and_ruby_equal false
35
+ end
36
+
37
+ def test_should_convert_nil
38
+ assert_octave_and_ruby_equal nil
39
+ end
40
+
41
+ def test_should_convert_float
42
+ assert_octave_and_ruby_equal 12.345
43
+ end
44
+
45
+ def test_should_convert_fixnum
46
+ # Fixnums are sent to and returned from Octave as Float
47
+ result = to_octave_to_ruby(12345)
48
+ assert_equal 12345.0, result
49
+ assert_instance_of Float, result
50
+ end
51
+
52
+ def test_should_convert_array_from_and_to
53
+ assert_octave_and_ruby_equal [1, nil, 3.0]
54
+ assert_octave_and_ruby_equal [1, "2", false, ["foo", "bar", "baz"]]
55
+ end
56
+
57
+ def test_should_convert_hash_from_and_to
58
+ assert_octave_and_ruby_equal "foo" => "bar"
59
+ assert_octave_and_ruby_equal "foo" => [1,2,3]
60
+ assert_octave_and_ruby_equal "foo" => { "bar" => [1,2,3, [4,5,6]] }
61
+ assert_octave_and_ruby_equal "foo" => { "bar" => [1,2,3, [4,5,6]], "baz" => "buz", "bob" => [7,8,9] }
62
+ end
63
+
64
+ def test_should_be_able_to_reference_structure_fields_from_hash
65
+ hash = { "foo" => { "bar" => [1,2,3, [4,5,6]] }, "baz" => { "buz" => [7,8,9] } }
66
+ @driver.put_variable "hash", hash
67
+ assert_equal hash["foo"]["bar"], @driver.feval("eval", "hash.foo.bar")
68
+ assert_equal hash["baz"]["buz"], @driver.feval("eval", "hash.baz.buz")
69
+ end
70
+
71
+ def test_should_be_able_to_reference_structure_fields_from_octave_struct_matrix
72
+ bar_matrix = Octave::StructMatrix.new(1, 1, "bar")
73
+ bar_matrix[0,0]["bar"] = [1,2,3, [4,5,6]]
74
+
75
+ struct_matrix = Octave::StructMatrix.new(1, 1, "foo")
76
+ struct_matrix[0,0]["foo"] = bar_matrix
77
+
78
+ @driver.put_variable "struct_matrix", struct_matrix
79
+ assert_equal [1,2,3, [4,5,6]], @driver.feval("eval", "struct_matrix.foo.bar")
80
+ end
81
+
82
+ def test_should_convert_octave_matrix
83
+ matrix = Octave::Matrix.new(3, 3)
84
+ 3.times { |m| 3.times { |n| matrix[m, n] = rand } }
85
+ matrix[1, 1] = nil
86
+
87
+ assert_octave_and_ruby_equal matrix
88
+ end
89
+
90
+ def test_should_convert_a_0x0_octave_matrix_to_an_empty_array
91
+ matrix = Octave::Matrix.new(0, 0)
92
+
93
+ expected_array = []
94
+ result = to_octave_to_ruby(matrix)
95
+
96
+ assert_equal expected_array, result
97
+ assert_instance_of Array, result
98
+ end
99
+
100
+ def test_should_convert_an_empty_ruby_array
101
+ assert_octave_and_ruby_equal []
102
+ end
103
+
104
+ def test_should_convert_a_1xn_octave_matrix_to_an_octave_matrix
105
+ matrix = Octave::Matrix.new(1, 3)
106
+ matrix[0, 0] = 1
107
+ matrix[0, 1] = 2
108
+ matrix[0, 2] = 3
109
+
110
+ result = @driver.put_variable "octave_matrix", matrix
111
+
112
+ assert_instance_of Octave::Matrix, result
113
+ assert_equal matrix, result
114
+ assert_equal 1, @driver.feval("rows", result)
115
+ assert_equal 3, @driver.feval("columns", result)
116
+ end
117
+
118
+ def test_should_convert_an_nx1_octave_matrix_to_an_array
119
+ matrix = Octave::Matrix.new(3, 1)
120
+ matrix[0, 0] = 1
121
+ matrix[1, 0] = 2
122
+ matrix[2, 0] = 3
123
+
124
+ expected_array = [1,2,3]
125
+ result = to_octave_to_ruby(matrix)
126
+
127
+ assert_equal expected_array, result
128
+ assert_instance_of Array, result
129
+ assert_equal 3, @driver.feval("rows", result)
130
+ assert_equal 1, @driver.feval("columns", result)
131
+ end
132
+
133
+ def test_should_convert_octave_struct_matrix
134
+ struct_matrix = Octave::StructMatrix.new(17, 2, "name", "age", "married", "cats", "car")
135
+ 17.times do |m|
136
+ 2.times do |n|
137
+ struct_matrix[m, n]["name"] = "Bob #{m}.#{n}"
138
+ struct_matrix[m, n]["age"] = (rand * 100).to_i
139
+ struct_matrix[m, n]["married"] = (rand > 0.5)
140
+ struct_matrix[m, n]["cats"] = { "name" => "Kitty #{m}.#{n}" }
141
+ struct_matrix[m, n]["car"] = nil
142
+ end
143
+ end
144
+
145
+ assert_octave_and_ruby_equal struct_matrix
146
+ end
147
+
148
+ def test_should_convert_a_1x1_struct_matrix_to_a_hash
149
+ struct_matrix = Octave::StructMatrix.new(1, 1, "foo")
150
+ struct_matrix[0,0]["foo"] = { "bar" => [1,2,3] }
151
+
152
+ expected_hash = { "foo" => { "bar" => [1,2,3] } }
153
+ result = to_octave_to_ruby(struct_matrix)
154
+
155
+ assert_equal expected_hash, result
156
+ assert_instance_of Hash, result
157
+ end
158
+
159
+ def test_should_convert_octave_cell_matrix
160
+ cell_matrix = Octave::CellMatrix.new(3, 3)
161
+ cell_matrix[0, 0] = 1
162
+ cell_matrix[1, 0] = "2"
163
+ cell_matrix[2, 0] = false
164
+
165
+ assert_octave_and_ruby_equal cell_matrix
166
+ end
167
+
168
+ def test_should_convert_a_1x1_cell_matrix_to_value
169
+ cell_matrix = Octave::CellMatrix.new(1, 1)
170
+ cell_matrix[0,0] = [1, 2, 3]
171
+
172
+ assert_equal [1, 2, 3], to_octave_to_ruby(cell_matrix)
173
+ end
174
+
175
+ def test_should_convert_a_1xn_cell_matrix_to_an_octave_cell_matrix
176
+ cell_matrix = Octave::CellMatrix.new(1, 3)
177
+ cell_matrix[0,0] = "foo"
178
+ cell_matrix[0,1] = "bar"
179
+ cell_matrix[0,2] = "baz"
180
+
181
+ result = @driver.put_variable "octave_cell_matrix", cell_matrix
182
+
183
+ assert_instance_of Octave::CellMatrix, result
184
+ assert_equal cell_matrix, result
185
+ assert_equal 1, @driver.feval("rows", result)
186
+ assert_equal 3, @driver.feval("columns", result)
187
+ end
188
+
189
+ def test_should_convert_a_nx1_cell_matrix_to_an_array
190
+ cell_matrix = Octave::CellMatrix.new(3, 1)
191
+ cell_matrix[0,0] = "foo"
192
+ cell_matrix[1,0] = "bar"
193
+ cell_matrix[2,0] = "baz"
194
+
195
+ assert_equal %w(foo bar baz), to_octave_to_ruby(cell_matrix)
196
+ end
197
+
198
+ def test_should_convert_boolean_matrix
199
+ assert_octave_and_ruby_equal [true, false, true]
200
+ boolean_matrix = @driver.feval "eval", "x = [1,2]; (x > 2 | x < 2)"
201
+ assert_equal [true, false], boolean_matrix
202
+ end
203
+ end
@@ -0,0 +1,32 @@
1
+ $:.unshift "../../../lib"
2
+ require 'test/unit'
3
+ require 'octave'
4
+ require 'octave/driver/native/driver'
5
+ require 'rubygems'
6
+ require 'mocha'
7
+
8
+ class DriverTest < Test::Unit::TestCase
9
+ include Octave::Driver::Native
10
+
11
+ def setup
12
+ @driver = Driver.new
13
+ end
14
+
15
+ def test_feval
16
+ API.expects(:feval).with("some_function_name", ["argument 1", "argument 2"])
17
+ @driver.feval("some_function_name", "argument 1", "argument 2")
18
+ end
19
+
20
+ def test_put_and_get_variable
21
+ assert_equal "some_value", @driver.put_variable("some_variable_name", "some_value")
22
+ assert_equal "some_value", @driver.get_variable("some_variable_name")
23
+ end
24
+
25
+ def test_putting_variable_with_same_name_multiple_times
26
+ assert_equal "foo", @driver.put_variable("some_variable_name", "foo")
27
+ assert_equal "bar", @driver.put_variable("some_variable_name", "bar")
28
+ assert_equal "baz", @driver.put_variable("some_variable_name", "baz")
29
+
30
+ assert_equal "baz", @driver.get_variable("some_variable_name")
31
+ end
32
+ end
@@ -0,0 +1,50 @@
1
+ require 'test/unit'
2
+ require 'octave'
3
+ require 'octave/engine'
4
+ require 'rubygems'
5
+ require 'mocha'
6
+
7
+ class Driver
8
+ end
9
+
10
+ class EngineTest_Init < Test::Unit::TestCase
11
+ def test_new
12
+ driver = mock()
13
+ Driver.expects(:new).returns(driver)
14
+
15
+ engine = Octave::Engine.new(:driver => Driver)
16
+ end
17
+
18
+ def test_new_with_invalid_driver
19
+ exception = assert_raise(LoadError) do
20
+ engine = Octave::Engine.new(:driver => "foo")
21
+ end
22
+ assert_equal "no such file to load -- octave/driver/foo/driver", exception.message
23
+
24
+ exception = assert_raise(LoadError) do
25
+ engine = Octave::Engine.new(:driver => :bar)
26
+ end
27
+ assert_equal "no such file to load -- octave/driver/bar/driver", exception.message
28
+ end
29
+
30
+ def test_new_with_native_driver
31
+ assert_nothing_raised do
32
+ engine = Octave::Engine.new
33
+ end
34
+ end
35
+ end
36
+
37
+ class EngineTest < Test::Unit::TestCase
38
+ def setup
39
+ @driver = mock()
40
+ @handle = mock()
41
+ Driver.expects(:new).returns(@driver)
42
+
43
+ @engine = Octave::Engine.new(:driver => Driver)
44
+ end
45
+
46
+ def test_method_missing
47
+ @driver.expects(:feval).with("some_method_name", "argument 1", "argument 2")
48
+ @engine.some_method_name("argument 1", "argument 2")
49
+ end
50
+ end
metadata ADDED
@@ -0,0 +1,99 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: daikini-octave-ruby
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.9
5
+ platform: ruby
6
+ authors:
7
+ - Jonathan Younger
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-12-30 00:00:00 -08:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description: "== USAGE: require 'octave' engine = Octave::Engine.new engine.eval \"123.456 * 789.101112\" engine.rand(10) matrix = Octave::Matrix.new(20, 400) 20.times { |m| 400.times { |n| matrix[m, n] = rand } } engine.put_variable(\"m\", matrix) engine.save \"/tmp/20_x_400_matrix\" == REQUIREMENTS: * Octave * GCC or some other compiler to build the included extension * Mocha (For testing only)"
17
+ email:
18
+ - jonathan@daikini.com
19
+ executables: []
20
+
21
+ extensions:
22
+ - ext/octave_api/extconf.rb
23
+ extra_rdoc_files:
24
+ - History.txt
25
+ - LICENSE.txt
26
+ - Manifest.txt
27
+ - README.txt
28
+ files:
29
+ - History.txt
30
+ - LICENSE.txt
31
+ - Manifest.txt
32
+ - README.txt
33
+ - Rakefile
34
+ - ext/octave_api/MANIFEST
35
+ - ext/octave_api/Makefile
36
+ - ext/octave_api/extconf.rb
37
+ - ext/octave_api/octave-includes.h
38
+ - ext/octave_api/octave-ruby.cpp
39
+ - ext/octave_api/octave-ruby.h
40
+ - ext/octave_api/octave_api.c
41
+ - ext/octave_api/octave_api.h
42
+ - ext/octave_api/or-array.cpp
43
+ - ext/octave_api/or-array.h
44
+ - ext/octave_api/or-boolean_matrix.cpp
45
+ - ext/octave_api/or-boolean_matrix.h
46
+ - ext/octave_api/or-cell_matrix.cpp
47
+ - ext/octave_api/or-cell_matrix.h
48
+ - ext/octave_api/or-hash.cpp
49
+ - ext/octave_api/or-hash.h
50
+ - ext/octave_api/or-matrix.cpp
51
+ - ext/octave_api/or-matrix.h
52
+ - ext/octave_api/or-string.cpp
53
+ - ext/octave_api/or-string.h
54
+ - ext/octave_api/or-struct_matrix.cpp
55
+ - ext/octave_api/or-struct_matrix.h
56
+ - ext/octave_api/or-variable.cpp
57
+ - ext/octave_api/or-variable.h
58
+ - lib/octave.rb
59
+ - lib/octave/driver/native/driver.rb
60
+ - lib/octave/engine.rb
61
+ - lib/octave/matrix.rb
62
+ - lib/octave/version.rb
63
+ - octave-ruby.gemspec
64
+ - setup.rb
65
+ - test/driver/native/test_conversions.rb
66
+ - test/driver/native/test_driver.rb
67
+ - test/test_engine.rb
68
+ has_rdoc: true
69
+ homepage: http://octave-ruby.rubyforge.org/
70
+ post_install_message:
71
+ rdoc_options:
72
+ - --main
73
+ - README.txt
74
+ require_paths:
75
+ - lib
76
+ - ext
77
+ required_ruby_version: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: "0"
82
+ version:
83
+ required_rubygems_version: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - ">="
86
+ - !ruby/object:Gem::Version
87
+ version: "0"
88
+ version:
89
+ requirements: []
90
+
91
+ rubyforge_project: octave-ruby
92
+ rubygems_version: 1.2.0
93
+ signing_key:
94
+ specification_version: 2
95
+ summary: A Ruby interface to the Octave interpreted language.
96
+ test_files:
97
+ - test/driver/native/test_conversions.rb
98
+ - test/driver/native/test_driver.rb
99
+ - test/test_engine.rb