iruby 0.3 → 0.4.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.
Files changed (41) hide show
  1. checksums.yaml +5 -5
  2. data/.travis.yml +35 -10
  3. data/Gemfile +4 -0
  4. data/README.md +115 -84
  5. data/Rakefile +26 -0
  6. data/ci/Dockerfile.base.erb +41 -0
  7. data/ci/Dockerfile.main.erb +9 -0
  8. data/ci/requirements.txt +1 -0
  9. data/docker/setup.sh +15 -0
  10. data/docker/test.sh +7 -0
  11. data/iruby.gemspec +4 -2
  12. data/lib/iruby.rb +13 -7
  13. data/lib/iruby/command.rb +67 -11
  14. data/lib/iruby/input/README.md +299 -0
  15. data/lib/iruby/jupyter.rb +76 -0
  16. data/lib/iruby/kernel.rb +49 -9
  17. data/lib/iruby/ostream.rb +4 -0
  18. data/lib/iruby/session.rb +116 -0
  19. data/lib/iruby/session/cztop.rb +4 -0
  20. data/lib/iruby/session/rbczmq.rb +5 -1
  21. data/lib/iruby/session_adapter.rb +68 -0
  22. data/lib/iruby/session_adapter/cztop_adapter.rb +45 -0
  23. data/lib/iruby/session_adapter/ffirzmq_adapter.rb +55 -0
  24. data/lib/iruby/session_adapter/pyzmq_adapter.rb +76 -0
  25. data/lib/iruby/session_adapter/rbczmq_adapter.rb +33 -0
  26. data/lib/iruby/utils.rb +1 -2
  27. data/lib/iruby/version.rb +1 -1
  28. data/run-test.sh +12 -0
  29. data/tasks/ci.rake +65 -0
  30. data/test/integration_test.rb +22 -10
  31. data/test/iruby/command_test.rb +208 -0
  32. data/test/iruby/jupyter_test.rb +28 -0
  33. data/test/iruby/multi_logger_test.rb +1 -1
  34. data/test/iruby/session_adapter/cztop_adapter_test.rb +20 -0
  35. data/test/iruby/session_adapter/ffirzmq_adapter_test.rb +20 -0
  36. data/test/iruby/session_adapter/rbczmq_adapter_test.rb +37 -0
  37. data/test/iruby/session_adapter/session_adapter_test_base.rb +29 -0
  38. data/test/iruby/session_adapter_test.rb +116 -0
  39. data/test/iruby/session_test.rb +53 -0
  40. data/test/test_helper.rb +44 -1
  41. metadata +72 -12
@@ -0,0 +1,28 @@
1
+ require 'test_helper'
2
+ require 'iruby/jupyter'
3
+
4
+ module IRubyTest
5
+ class JupyterDefaultKernelSpecDirectoryTest < TestBase
6
+ def setup
7
+ @kernel_spec = IRuby::Jupyter.kernelspec_dir
8
+ end
9
+
10
+ def test_default_windows
11
+ windows_only
12
+ appdata = IRuby::Jupyter.send :windows_user_appdata
13
+ assert_equal(File.join(appdata, 'jupyter/kernels'), @kernel_spec)
14
+ end
15
+
16
+ def test_default_apple
17
+ apple_only
18
+ assert_equal(File.expand_path('~/Library/Jupyter/kernels'), @kernel_spec)
19
+ end
20
+
21
+ def test_default_unix
22
+ unix_only
23
+ with_env('XDG_DATA_HOME' => nil) do
24
+ assert_equal(File.expand_path('~/.local/share/jupyter/kernels'), @kernel_spec)
25
+ end
26
+ end
27
+ end
28
+ end
@@ -2,7 +2,7 @@ require 'stringio'
2
2
  require 'test_helper'
3
3
  require 'iruby/logger'
4
4
 
5
- class MultiLoggerTest < IRubyTest
5
+ class IRubyTest::MultiLoggerTest < IRubyTest::TestBase
6
6
  def test_multilogger
7
7
  out, err = StringIO.new, StringIO.new
8
8
  logger = IRuby::MultiLogger.new(Logger.new(out), Logger.new(err))
@@ -0,0 +1,20 @@
1
+ require_relative 'session_adapter_test_base'
2
+ require 'iruby'
3
+
4
+ module IRubyTest
5
+ if ENV['IRUBY_TEST_SESSION_ADAPTER_NAME'] == 'cztop'
6
+ class CztopAdapterTest < SessionAdapterTestBase
7
+ def adapter_class
8
+ IRuby::SessionAdapter::CztopAdapter
9
+ end
10
+
11
+ def test_send
12
+ assert(adapter_class.available?)
13
+ end
14
+
15
+ def test_recv
16
+ skip
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,20 @@
1
+ require_relative 'session_adapter_test_base'
2
+ require 'iruby'
3
+
4
+ module IRubyTest
5
+ if ENV['IRUBY_TEST_SESSION_ADAPTER_NAME'] == 'ffi-rzmq'
6
+ class FfirzmqAdapterTest < SessionAdapterTestBase
7
+ def adapter_class
8
+ IRuby::SessionAdapter::FfirzmqAdapter
9
+ end
10
+
11
+ def test_send
12
+ assert(adapter_class.available?)
13
+ end
14
+
15
+ def test_recv
16
+ skip
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,37 @@
1
+ require_relative 'session_adapter_test_base'
2
+ require 'iruby'
3
+
4
+ module IRubyTest
5
+ if ENV['IRUBY_TEST_SESSION_ADAPTER_NAME'] == 'rbczmq'
6
+ class RbczmqAdapterTest < SessionAdapterTestBase
7
+ def adapter_class
8
+ IRuby::SessionAdapter::RbczmqAdapter
9
+ end
10
+
11
+ def test_send
12
+ dummy_message = MiniTest::Mock.new.expect(:called!, true)
13
+
14
+ dummy_socket = MiniTest::Mock.new.expect(:send_message, nil, [dummy_message])
15
+
16
+ ZMQ.stub(:Message, ->(message) { message.called!; message }) do
17
+ @session_adapter.send(dummy_socket, dummy_message)
18
+ end
19
+
20
+ assert(dummy_message.verify)
21
+ assert(dummy_socket.verify)
22
+ end
23
+
24
+ def test_recv
25
+ dummy_message = MiniTest::Mock.new
26
+ dummy_message.expect(:equal?, true, [dummy_message])
27
+
28
+ dummy_socket = MiniTest::Mock.new.expect(:recv_message, dummy_message)
29
+
30
+ assert_same(dummy_message, @session_adapter.recv(dummy_socket))
31
+
32
+ assert(dummy_message.verify)
33
+ assert(dummy_socket.verify)
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,29 @@
1
+ require 'test_helper'
2
+
3
+ module IRubyTest
4
+ class SessionAdapterTestBase < TestBase
5
+ # https://jupyter-client.readthedocs.io/en/stable/kernels.html#connection-files
6
+ def make_connection_config
7
+ {
8
+ "control_port" => 50160,
9
+ "shell_port" => 57503,
10
+ "transport" => "tcp",
11
+ "signature_scheme" => "hmac-sha256",
12
+ "stdin_port" => 52597,
13
+ "hb_port" => 42540,
14
+ "ip" => "127.0.0.1",
15
+ "iopub_port" => 40885,
16
+ "key" => "a0436f6c-1916-498b-8eb9-e81ab9368e84"
17
+ }
18
+ end
19
+
20
+ def setup
21
+ @config = make_connection_config
22
+ @session_adapter = adapter_class.new(@config)
23
+
24
+ unless adapter_class.available?
25
+ skip "#{@session_adapter.name} is unavailable"
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,116 @@
1
+ require 'test_helper'
2
+
3
+ module IRubyTest
4
+ class SessionAdapterTest < TestBase
5
+ def test_available_p_return_false_when_load_error
6
+ subclass = Class.new(IRuby::SessionAdapter::BaseAdapter)
7
+ class << subclass
8
+ def load_requirements
9
+ raise LoadError
10
+ end
11
+ end
12
+ refute subclass.available?
13
+ end
14
+
15
+ def test_select_adapter_class_with_rbczmq
16
+ IRuby::SessionAdapter::RbczmqAdapter.stub :available?, true do
17
+ IRuby::SessionAdapter::CztopAdapter.stub :available?, false do
18
+ IRuby::SessionAdapter::FfirzmqAdapter.stub :available?, false do
19
+ IRuby::SessionAdapter::PyzmqAdapter.stub :available?, false do
20
+ cls = IRuby::SessionAdapter.select_adapter_class
21
+ assert_equal IRuby::SessionAdapter::RbczmqAdapter, cls
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+
28
+ def test_select_adapter_class_with_cztop
29
+ IRuby::SessionAdapter::CztopAdapter.stub :available?, true do
30
+ IRuby::SessionAdapter::RbczmqAdapter.stub :available?, false do
31
+ IRuby::SessionAdapter::FfirzmqAdapter.stub :available?, false do
32
+ IRuby::SessionAdapter::PyzmqAdapter.stub :available?, false do
33
+ cls = IRuby::SessionAdapter.select_adapter_class
34
+ assert_equal IRuby::SessionAdapter::CztopAdapter, cls
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
40
+
41
+ def test_select_adapter_class_with_ffirzmq
42
+ IRuby::SessionAdapter::FfirzmqAdapter.stub :available?, true do
43
+ IRuby::SessionAdapter::RbczmqAdapter.stub :available?, false do
44
+ IRuby::SessionAdapter::CztopAdapter.stub :available?, false do
45
+ IRuby::SessionAdapter::PyzmqAdapter.stub :available?, false do
46
+ cls = IRuby::SessionAdapter.select_adapter_class
47
+ assert_equal IRuby::SessionAdapter::FfirzmqAdapter, cls
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
53
+
54
+ def test_select_adapter_class_with_pyzmq
55
+ IRuby::SessionAdapter::PyzmqAdapter.stub :available?, true do
56
+ IRuby::SessionAdapter::RbczmqAdapter.stub :available?, false do
57
+ IRuby::SessionAdapter::CztopAdapter.stub :available?, false do
58
+ IRuby::SessionAdapter::FfirzmqAdapter.stub :available?, false do
59
+ cls = IRuby::SessionAdapter.select_adapter_class
60
+ assert_equal IRuby::SessionAdapter::PyzmqAdapter, cls
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
66
+ def test_select_adapter_class_with_env
67
+ with_env('IRUBY_SESSION_ADAPTER' => 'rbczmq') do
68
+ IRuby::SessionAdapter::RbczmqAdapter.stub :available?, true do
69
+ assert_equal IRuby::SessionAdapter::RbczmqAdapter, IRuby::SessionAdapter.select_adapter_class
70
+ end
71
+
72
+ IRuby::SessionAdapter::RbczmqAdapter.stub :available?, false do
73
+ assert_raises IRuby::SessionAdapterNotFound do
74
+ IRuby::SessionAdapter.select_adapter_class
75
+ end
76
+ end
77
+ end
78
+
79
+ with_env('IRUBY_SESSION_ADAPTER' => 'cztop') do
80
+ IRuby::SessionAdapter::CztopAdapter.stub :available?, true do
81
+ assert_equal IRuby::SessionAdapter::CztopAdapter, IRuby::SessionAdapter.select_adapter_class
82
+ end
83
+
84
+ IRuby::SessionAdapter::CztopAdapter.stub :available?, false do
85
+ assert_raises IRuby::SessionAdapterNotFound do
86
+ IRuby::SessionAdapter.select_adapter_class
87
+ end
88
+ end
89
+ end
90
+
91
+ with_env('IRUBY_SESSION_ADAPTER' => 'ffi-rzmq') do
92
+ IRuby::SessionAdapter::FfirzmqAdapter.stub :available?, true do
93
+ assert_equal IRuby::SessionAdapter::FfirzmqAdapter, IRuby::SessionAdapter.select_adapter_class
94
+ end
95
+
96
+ IRuby::SessionAdapter::FfirzmqAdapter.stub :available?, false do
97
+ assert_raises IRuby::SessionAdapterNotFound do
98
+ IRuby::SessionAdapter.select_adapter_class
99
+ end
100
+ end
101
+ end
102
+
103
+ with_env('IRUBY_SESSION_ADAPTER' => 'pyzmq') do
104
+ IRuby::SessionAdapter::PyzmqAdapter.stub :available?, true do
105
+ assert_equal IRuby::SessionAdapter::PyzmqAdapter, IRuby::SessionAdapter.select_adapter_class
106
+ end
107
+
108
+ IRuby::SessionAdapter::PyzmqAdapter.stub :available?, false do
109
+ assert_raises IRuby::SessionAdapterNotFound do
110
+ IRuby::SessionAdapter.select_adapter_class
111
+ end
112
+ end
113
+ end
114
+ end
115
+ end
116
+ end
@@ -0,0 +1,53 @@
1
+ require 'test_helper'
2
+
3
+ module IRubyTest
4
+ class SessionAdapterSelectionTest < TestBase
5
+ def setup
6
+ # https://jupyter-client.readthedocs.io/en/stable/kernels.html#connection-files
7
+ @session_config = {
8
+ "control_port" => 0,
9
+ "shell_port" => 0,
10
+ "transport" => "tcp",
11
+ "signature_scheme" => "hmac-sha256",
12
+ "stdin_port" => 0,
13
+ "hb_port" => 0,
14
+ "ip" => "127.0.0.1",
15
+ "iopub_port" => 0,
16
+ "key" => "a0436f6c-1916-498b-8eb9-e81ab9368e84"
17
+ }
18
+ end
19
+
20
+ def test_new_with_session_adapter
21
+ adapter_name = ENV['IRUBY_TEST_SESSION_ADAPTER_NAME']
22
+ adapter_class = case adapter_name
23
+ when 'cztop'
24
+ IRuby::SessionAdapter::CztopAdapter
25
+ when 'rbczmq'
26
+ IRuby::SessionAdapter::RbczmqAdapter
27
+ when 'ffi-rzmq'
28
+ IRuby::SessionAdapter::FfirzmqAdapter
29
+ when 'pyzmq'
30
+ IRuby::SessionAdapter::PyzmqAdapter
31
+ else
32
+ flunk "Unknown session adapter: #{adapter_name}"
33
+ end
34
+
35
+ session = IRuby::Session.new(@session_config, adapter_name)
36
+ assert_kind_of(adapter_class, session.adapter)
37
+ end
38
+
39
+ def test_without_any_session_adapter
40
+ IRuby::SessionAdapter::CztopAdapter.stub :available?, false do
41
+ IRuby::SessionAdapter::RbczmqAdapter.stub :available?, false do
42
+ IRuby::SessionAdapter::FfirzmqAdapter.stub :available?, false do
43
+ IRuby::SessionAdapter::PyzmqAdapter.stub :available?, false do
44
+ assert_raises IRuby::SessionAdapterNotFound do
45
+ IRuby::Session.new(@session_config)
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -1,5 +1,48 @@
1
1
  require 'iruby'
2
+ require 'tmpdir'
2
3
  require 'minitest/autorun'
3
4
 
4
- class IRubyTest < Minitest::Test
5
+ module IRubyTest
6
+ class TestBase < Minitest::Test
7
+ private
8
+
9
+ def ignore_warning
10
+ saved, $VERBOSE = $VERBOSE , nil
11
+ yield
12
+ ensure
13
+ $VERBOSE = saved
14
+ end
15
+ def with_env(env)
16
+ keys = env.keys
17
+ saved_values = ENV.values_at(*keys)
18
+ ENV.update(env)
19
+ yield
20
+ ensure
21
+ if keys && saved_values
22
+ keys.zip(saved_values) do |k, v|
23
+ ENV[k] = v
24
+ end
25
+ end
26
+ end
27
+
28
+ def windows_only
29
+ skip('windows only test') unless windows?
30
+ end
31
+
32
+ def apple_only
33
+ skip('apple only test') unless windows?
34
+ end
35
+
36
+ def unix_only
37
+ skip('unix only test') if windows? || apple?
38
+ end
39
+
40
+ def windows?
41
+ /mingw|mswin/ =~ RUBY_PLATFORM
42
+ end
43
+
44
+ def apple?
45
+ /darwin/ =~ RUBY_PLATFORM
46
+ end
47
+ end
5
48
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: iruby
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.3'
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Mendler
@@ -9,36 +9,64 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2017-03-26 00:00:00.000000000 Z
12
+ date: 2019-07-31 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  requirements:
18
- - - "~>"
18
+ - - ">="
19
19
  - !ruby/object:Gem::Version
20
- version: '10.4'
20
+ version: '0'
21
21
  type: :development
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
- - - "~>"
25
+ - - ">="
26
26
  - !ruby/object:Gem::Version
27
- version: '10.4'
27
+ version: '0'
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: minitest
30
30
  requirement: !ruby/object:Gem::Requirement
31
31
  requirements:
32
- - - "~>"
32
+ - - ">="
33
33
  - !ruby/object:Gem::Version
34
- version: '5.6'
34
+ version: '0'
35
35
  type: :development
36
36
  prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
- - - "~>"
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ - !ruby/object:Gem::Dependency
43
+ name: ffi-rzmq
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ - !ruby/object:Gem::Dependency
57
+ name: pycall
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: 1.2.1
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
40
68
  - !ruby/object:Gem::Version
41
- version: '5.6'
69
+ version: 1.2.1
42
70
  - !ruby/object:Gem::Dependency
43
71
  name: bond
44
72
  requirement: !ruby/object:Gem::Requirement
@@ -113,6 +141,11 @@ files:
113
141
  - README.md
114
142
  - Rakefile
115
143
  - bin/iruby
144
+ - ci/Dockerfile.base.erb
145
+ - ci/Dockerfile.main.erb
146
+ - ci/requirements.txt
147
+ - docker/setup.sh
148
+ - docker/test.sh
116
149
  - iruby.gemspec
117
150
  - lib/iruby.rb
118
151
  - lib/iruby/assets/kernel.css
@@ -126,6 +159,7 @@ files:
126
159
  - lib/iruby/formatter.rb
127
160
  - lib/iruby/input.rb
128
161
  - lib/iruby/input/README.ipynb
162
+ - lib/iruby/input/README.md
129
163
  - lib/iruby/input/autoload.rb
130
164
  - lib/iruby/input/builder.rb
131
165
  - lib/iruby/input/button.rb
@@ -142,20 +176,37 @@ files:
142
176
  - lib/iruby/input/select.rb
143
177
  - lib/iruby/input/textarea.rb
144
178
  - lib/iruby/input/widget.rb
179
+ - lib/iruby/jupyter.rb
145
180
  - lib/iruby/kernel.rb
146
181
  - lib/iruby/logger.rb
147
182
  - lib/iruby/ostream.rb
183
+ - lib/iruby/session.rb
148
184
  - lib/iruby/session/cztop.rb
149
185
  - lib/iruby/session/ffi_rzmq.rb
150
186
  - lib/iruby/session/mixin.rb
151
187
  - lib/iruby/session/rbczmq.rb
188
+ - lib/iruby/session_adapter.rb
189
+ - lib/iruby/session_adapter/cztop_adapter.rb
190
+ - lib/iruby/session_adapter/ffirzmq_adapter.rb
191
+ - lib/iruby/session_adapter/pyzmq_adapter.rb
192
+ - lib/iruby/session_adapter/rbczmq_adapter.rb
152
193
  - lib/iruby/utils.rb
153
194
  - lib/iruby/version.rb
154
195
  - logo/logo-32x32.png
155
196
  - logo/logo-64x64.png
156
197
  - logo/ruby.svg
198
+ - run-test.sh
199
+ - tasks/ci.rake
157
200
  - test/integration_test.rb
201
+ - test/iruby/command_test.rb
202
+ - test/iruby/jupyter_test.rb
158
203
  - test/iruby/multi_logger_test.rb
204
+ - test/iruby/session_adapter/cztop_adapter_test.rb
205
+ - test/iruby/session_adapter/ffirzmq_adapter_test.rb
206
+ - test/iruby/session_adapter/rbczmq_adapter_test.rb
207
+ - test/iruby/session_adapter/session_adapter_test_base.rb
208
+ - test/iruby/session_adapter_test.rb
209
+ - test/iruby/session_test.rb
159
210
  - test/test_helper.rb
160
211
  homepage: https://github.com/SciRuby/iruby
161
212
  licenses:
@@ -169,6 +220,8 @@ post_install_message: |+
169
220
  * gnuplot
170
221
  * rubyvis
171
222
  * nyaplot
223
+ * cztop
224
+ * rbczmq
172
225
 
173
226
  rdoc_options: []
174
227
  require_paths:
@@ -184,12 +237,19 @@ required_rubygems_version: !ruby/object:Gem::Requirement
184
237
  - !ruby/object:Gem::Version
185
238
  version: '0'
186
239
  requirements: []
187
- rubyforge_project:
188
- rubygems_version: 2.5.2
240
+ rubygems_version: 3.0.4
189
241
  signing_key:
190
242
  specification_version: 4
191
243
  summary: Ruby Kernel for Jupyter/IPython
192
244
  test_files:
193
245
  - test/integration_test.rb
246
+ - test/iruby/command_test.rb
247
+ - test/iruby/jupyter_test.rb
194
248
  - test/iruby/multi_logger_test.rb
249
+ - test/iruby/session_adapter/cztop_adapter_test.rb
250
+ - test/iruby/session_adapter/ffirzmq_adapter_test.rb
251
+ - test/iruby/session_adapter/rbczmq_adapter_test.rb
252
+ - test/iruby/session_adapter/session_adapter_test_base.rb
253
+ - test/iruby/session_adapter_test.rb
254
+ - test/iruby/session_test.rb
195
255
  - test/test_helper.rb