iruby 0.7.4 → 0.8.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.
metadata CHANGED
@@ -1,15 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: iruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.4
4
+ version: 0.8.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Mendler
8
8
  - The SciRuby developers
9
- autorequire:
10
- bindir: bin
9
+ bindir: exe
11
10
  cert_chain: []
12
- date: 2021-08-17 00:00:00.000000000 Z
11
+ date: 2025-02-16 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: data_uri
@@ -53,6 +52,20 @@ dependencies:
53
52
  - - ">="
54
53
  - !ruby/object:Gem::Version
55
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: logger
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
56
69
  - !ruby/object:Gem::Dependency
57
70
  name: mime-types
58
71
  requirement: !ruby/object:Gem::Requirement
@@ -167,23 +180,24 @@ files:
167
180
  - LICENSE
168
181
  - README.md
169
182
  - Rakefile
170
- - bin/iruby
171
183
  - ci/Dockerfile.base.erb
172
184
  - ci/Dockerfile.main.erb
173
185
  - ci/requirements.txt
174
186
  - docker/setup.sh
175
187
  - docker/test.sh
188
+ - exe/iruby
176
189
  - ext/Rakefile
177
190
  - iruby.gemspec
178
191
  - lib/iruby.rb
192
+ - lib/iruby/application.rb
179
193
  - lib/iruby/assets/kernel.css
180
194
  - lib/iruby/assets/kernel.js
181
195
  - lib/iruby/assets/logo-32x32.png
182
196
  - lib/iruby/assets/logo-64x64.png
183
197
  - lib/iruby/backend.rb
184
198
  - lib/iruby/comm.rb
185
- - lib/iruby/command.rb
186
199
  - lib/iruby/display.rb
200
+ - lib/iruby/error.rb
187
201
  - lib/iruby/event_manager.rb
188
202
  - lib/iruby/formatter.rb
189
203
  - lib/iruby/input.rb
@@ -207,6 +221,7 @@ files:
207
221
  - lib/iruby/input/widget.rb
208
222
  - lib/iruby/jupyter.rb
209
223
  - lib/iruby/kernel.rb
224
+ - lib/iruby/kernel_app.rb
210
225
  - lib/iruby/logger.rb
211
226
  - lib/iruby/ostream.rb
212
227
  - lib/iruby/session.rb
@@ -226,8 +241,13 @@ files:
226
241
  - tasks/ci.rake
227
242
  - test/helper.rb
228
243
  - test/integration_test.rb
244
+ - test/iruby/application/application_test.rb
245
+ - test/iruby/application/console_test.rb
246
+ - test/iruby/application/helper.rb
247
+ - test/iruby/application/kernel_test.rb
248
+ - test/iruby/application/register_test.rb
249
+ - test/iruby/application/unregister_test.rb
229
250
  - test/iruby/backend_test.rb
230
- - test/iruby/command_test.rb
231
251
  - test/iruby/display_test.rb
232
252
  - test/iruby/event_manager_test.rb
233
253
  - test/iruby/jupyter_test.rb
@@ -246,7 +266,6 @@ licenses:
246
266
  - MIT
247
267
  metadata:
248
268
  msys2_mingw_dependencies: zeromq
249
- post_install_message:
250
269
  rdoc_options: []
251
270
  require_paths:
252
271
  - lib
@@ -261,15 +280,19 @@ required_rubygems_version: !ruby/object:Gem::Requirement
261
280
  - !ruby/object:Gem::Version
262
281
  version: '0'
263
282
  requirements: []
264
- rubygems_version: 3.2.23
265
- signing_key:
283
+ rubygems_version: 3.6.2
266
284
  specification_version: 4
267
285
  summary: Ruby Kernel for Jupyter
268
286
  test_files:
269
287
  - test/helper.rb
270
288
  - test/integration_test.rb
289
+ - test/iruby/application/application_test.rb
290
+ - test/iruby/application/console_test.rb
291
+ - test/iruby/application/helper.rb
292
+ - test/iruby/application/kernel_test.rb
293
+ - test/iruby/application/register_test.rb
294
+ - test/iruby/application/unregister_test.rb
271
295
  - test/iruby/backend_test.rb
272
- - test/iruby/command_test.rb
273
296
  - test/iruby/display_test.rb
274
297
  - test/iruby/event_manager_test.rb
275
298
  - test/iruby/jupyter_test.rb
data/bin/iruby DELETED
@@ -1,5 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- $:.unshift File.expand_path(__dir__ + '/../lib')
4
- require 'iruby/command'
5
- IRuby::Command.new(ARGV).run
data/lib/iruby/command.rb DELETED
@@ -1,190 +0,0 @@
1
- require 'iruby'
2
-
3
- module IRuby
4
- class Command
5
- def initialize(args)
6
- @args = args
7
-
8
- @ipython_dir = File.expand_path("~/.ipython")
9
- @kernel_dir = resolve_kernelspec_dir.freeze
10
- @kernel_file = File.join(@kernel_dir, 'kernel.json').freeze
11
- @iruby_path = File.expand_path $0
12
- end
13
-
14
- attr_reader :ipython_dir, :kernel_dir, :kernel_file
15
-
16
- def ipython_kernel_dir
17
- File.join(File.expand_path(@ipython_dir), 'kernels', 'ruby')
18
- end
19
-
20
- def run
21
- case @args.first
22
- when 'version', '-v', '--version'
23
- require 'iruby/version'
24
- puts "IRuby #{IRuby::VERSION}, Ruby #{RUBY_VERSION}"
25
- when 'help', '-h', '--help'
26
- print_help
27
- when 'register'
28
- force_p = @args.include?('--force')
29
- if registered_iruby_path && !force_p
30
- STDERR.puts "#{@kernel_file} already exists!\nUse --force to force a register."
31
- exit 1
32
- end
33
- register_kernel(force_p)
34
- when 'unregister'
35
- unregister_kernel
36
- when 'kernel'
37
- run_kernel
38
- else
39
- run_ipython
40
- end
41
- end
42
-
43
- private
44
-
45
- def resolve_kernelspec_dir
46
- if ENV.has_key?('JUPYTER_DATA_DIR')
47
- if ENV.has_key?('IPYTHONDIR')
48
- warn 'both JUPYTER_DATA_DIR and IPYTHONDIR are supplied; IPYTHONDIR is ignored.'
49
- end
50
- if @args.find {|x| /\A--ipython-dir=/ =~ x }
51
- warn 'both JUPYTER_DATA_DIR and --ipython-dir are supplied; --ipython-dir is ignored.'
52
- end
53
- jupyter_data_dir = ENV['JUPYTER_DATA_DIR']
54
- return File.join(jupyter_data_dir, 'kernels', 'ruby')
55
- end
56
-
57
- if ENV.has_key?('IPYTHONDIR')
58
- warn 'IPYTHONDIR is deprecated. Use JUPYTER_DATA_DIR instead.'
59
- ipython_dir = ENV['IPYTHONDIR']
60
- end
61
-
62
- @args.each do |arg|
63
- next unless /\A--ipython-dir=(.*)\Z/ =~ arg
64
- ipython_dir = Regexp.last_match[1]
65
- warn '--ipython-dir is deprecated. Use JUPYTER_DATA_DIR environment variable instead.'
66
- break
67
- end
68
-
69
- if ipython_dir
70
- @ipython_dir = ipython_dir
71
- ipython_kernel_dir
72
- else
73
- File.join(Jupyter.kernelspec_dir, 'ruby')
74
- end
75
- end
76
-
77
- def print_help
78
- puts %{
79
- Usage:
80
- iruby register Register IRuby kernel in #{@kernel_file}.
81
- iruby unregister Unregister IRuby kernel.
82
- iruby console Launch the IRuby terminal-based console.
83
- iruby notebook Launch the IRuby HTML notebook server.
84
- ... Same as IPython.
85
-
86
- Please note that IRuby accepts the same parameters as IPython.
87
- Try `ipython help` for more information.
88
- }
89
- end
90
-
91
- def run_kernel
92
- IRuby.logger = MultiLogger.new(*Logger.new(STDOUT))
93
- STDOUT.sync = true # FIXME: This can make the integration test.
94
-
95
- @args.reject! {|arg| arg =~ /\A--log=(.*)\Z/ && IRuby.logger.loggers << Logger.new($1) }
96
- IRuby.logger.level = @args.delete('--debug') ? Logger::DEBUG : Logger::INFO
97
-
98
- raise(ArgumentError, 'Not enough arguments to the kernel') if @args.size < 2 || @args.size > 4
99
- config_file, boot_file, working_dir = @args[1..-1]
100
- Dir.chdir(working_dir) if working_dir
101
-
102
- require boot_file if boot_file
103
- check_bundler {|e| IRuby.logger.warn "Could not load bundler: #{e.message}" }
104
-
105
- require 'iruby'
106
- Kernel.new(config_file).run
107
- rescue Exception => e
108
- IRuby.logger.fatal "Kernel died: #{e.message}\n#{e.backtrace.join("\n")}"
109
- raise
110
- end
111
-
112
- def check_version
113
- required = '3.0.0'
114
- version = `ipython --version`.chomp
115
- if version < required
116
- STDERR.puts "Your IPython version #{version} is too old, at least #{required} is required"
117
- exit 1
118
- end
119
- end
120
-
121
- def run_ipython
122
- # If no command is given, we use the console to launch the whole 0MQ-client-server stack
123
- @args = %w(console) + @args if @args.first.to_s !~ /\A\w/
124
- @args += %w(--kernel ruby) if %w(console qtconsole).include? @args.first
125
-
126
- check_version
127
- check_registered_kernel
128
- check_bundler {|e| STDERR.puts "Could not load bundler: #{e.message}" }
129
-
130
- Process.exec('ipython', *@args)
131
- end
132
-
133
- def check_registered_kernel
134
- if (kernel = registered_iruby_path)
135
- STDERR.puts "#{@iruby_path} differs from registered path #{registered_iruby_path}.
136
- This might not work. Run 'iruby register --force' to fix it." if @iruby_path != kernel
137
- else
138
- register_kernel
139
- end
140
- end
141
-
142
- def check_bundler
143
- require 'bundler'
144
- raise %q{iruby is missing from Gemfile. This might not work.
145
- Add `gem 'iruby'` to your Gemfile to fix it.} unless Bundler.definition.specs.any? {|s| s.name == 'iruby' }
146
- Bundler.setup
147
- rescue LoadError
148
- rescue Exception => e
149
- yield(e)
150
- end
151
-
152
- def register_kernel(force_p=false)
153
- if force_p
154
- unregister_kernel_in_ipython_dir
155
- else
156
- return unless check_existing_kernel_in_ipython_dir
157
- end
158
- FileUtils.mkpath(@kernel_dir)
159
- unless RUBY_PLATFORM =~ /mswin(?!ce)|mingw|cygwin/
160
- File.write(@kernel_file, MultiJson.dump(argv: [ @iruby_path, 'kernel', '{connection_file}' ],
161
- display_name: "Ruby #{RUBY_VERSION}", language: 'ruby'))
162
- else
163
- ruby_path, iruby_path = [RbConfig.ruby, @iruby_path].map{|path| path.gsub('/', '\\\\')}
164
- File.write(@kernel_file, MultiJson.dump(argv: [ ruby_path, iruby_path, 'kernel', '{connection_file}' ],
165
- display_name: "Ruby #{RUBY_VERSION}", language: 'ruby'))
166
- end
167
-
168
- FileUtils.copy(Dir[File.join(__dir__, 'assets', '*')], @kernel_dir) rescue nil
169
- end
170
-
171
- def check_existing_kernel_in_ipython_dir
172
- return true unless File.file?(File.join(ipython_kernel_dir, 'kernel.json'))
173
- warn "IRuby kernel file already exists in the deprecated IPython's data directory."
174
- warn "Using --force, you can replace the old kernel file with the new one in Jupyter's data directory."
175
- false
176
- end
177
-
178
- def registered_iruby_path
179
- File.exist?(@kernel_file) && MultiJson.load(File.read(@kernel_file))['argv'].first
180
- end
181
-
182
- def unregister_kernel
183
- FileUtils.rm_rf(@kernel_dir)
184
- end
185
-
186
- def unregister_kernel_in_ipython_dir
187
- FileUtils.rm_rf(ipython_kernel_dir)
188
- end
189
- end
190
- end
@@ -1,207 +0,0 @@
1
- require 'iruby/command'
2
-
3
- module IRubyTest
4
- class CommandTest < TestBase
5
- def test_with_empty_argv
6
- with_env('JUPYTER_DATA_DIR' => nil,
7
- 'IPYTHONDIR' => nil) do
8
- assert_output(nil, /\A\z/) do
9
- @command = IRuby::Command.new([])
10
- kernel_dir = File.join(IRuby::Jupyter.kernelspec_dir, 'ruby')
11
- assert_equal(kernel_dir, @command.kernel_dir)
12
- assert_equal(File.join(kernel_dir, 'kernel.json'), @command.kernel_file)
13
- end
14
- end
15
- end
16
-
17
- def test_with_JUPYTER_DATA_DIR
18
- Dir.mktmpdir do |tmpdir|
19
- with_env('JUPYTER_DATA_DIR' => tmpdir,
20
- 'IPYTHONDIR' => nil) do
21
- assert_output(nil, /\A\z/) do
22
- @command = IRuby::Command.new([])
23
- kernel_dir = File.join(tmpdir, 'kernels', 'ruby')
24
- assert_equal(kernel_dir, @command.kernel_dir)
25
- assert_equal(File.join(kernel_dir, 'kernel.json'), @command.kernel_file)
26
- end
27
- end
28
- end
29
- end
30
-
31
- def test_with_IPYTHONDIR
32
- Dir.mktmpdir do |tmpdir|
33
- with_env('JUPYTER_DATA_DIR' => nil,
34
- 'IPYTHONDIR' => tmpdir) do
35
- assert_output(nil, /IPYTHONDIR is deprecated\. Use JUPYTER_DATA_DIR instead\./) do
36
- @command = IRuby::Command.new([])
37
- kernel_dir = File.join(tmpdir, 'kernels', 'ruby')
38
- assert_equal(kernel_dir, @command.kernel_dir)
39
- assert_equal(File.join(kernel_dir, 'kernel.json'), @command.kernel_file)
40
- end
41
- end
42
- end
43
- end
44
-
45
- def test_with_JUPYTER_DATA_DIR_and_IPYTHONDIR
46
- Dir.mktmpdir do |tmpdir|
47
- Dir.mktmpdir do |tmpdir2|
48
- with_env('JUPYTER_DATA_DIR' => tmpdir,
49
- 'IPYTHONDIR' => tmpdir2) do
50
- assert_output(nil, /both JUPYTER_DATA_DIR and IPYTHONDIR are supplied; IPYTHONDIR is ignored\./) do
51
- @command = IRuby::Command.new([])
52
- kernel_dir = File.join(tmpdir, 'kernels', 'ruby')
53
- assert_equal(kernel_dir, @command.kernel_dir)
54
- assert_equal(File.join(kernel_dir, 'kernel.json'), @command.kernel_file)
55
- end
56
- end
57
- end
58
- end
59
- end
60
-
61
- def test_with_ipython_dir_option
62
- Dir.mktmpdir do |tmpdir|
63
- with_env('JUPYTER_DATA_DIR' => nil,
64
- 'IPYTHONDIR' => nil) do
65
- assert_output(nil, /--ipython-dir is deprecated\. Use JUPYTER_DATA_DIR environment variable instead\./) do
66
- @command = IRuby::Command.new(%W[--ipython-dir=#{tmpdir}])
67
- kernel_dir = File.join(tmpdir, 'kernels', 'ruby')
68
- assert_equal(kernel_dir, @command.kernel_dir)
69
- assert_equal(File.join(kernel_dir, 'kernel.json'), @command.kernel_file)
70
- end
71
- end
72
- end
73
- end
74
-
75
- def test_with_JUPYTER_DATA_DIR_and_ipython_dir_option
76
- Dir.mktmpdir do |tmpdir|
77
- Dir.mktmpdir do |tmpdir2|
78
- with_env('JUPYTER_DATA_DIR' => tmpdir,
79
- 'IPYTHONDIR' => nil) do
80
- assert_output(nil, /both JUPYTER_DATA_DIR and --ipython-dir are supplied; --ipython-dir is ignored\./) do
81
- @command = IRuby::Command.new(%W[--ipython-dir=#{tmpdir2}])
82
- kernel_dir = File.join(tmpdir, 'kernels', 'ruby')
83
- assert_equal(kernel_dir, @command.kernel_dir)
84
- assert_equal(File.join(kernel_dir, 'kernel.json'), @command.kernel_file)
85
- end
86
- end
87
- end
88
- end
89
- end
90
-
91
- def test_register_when_there_is_kernel_in_ipython_dir
92
- Dir.mktmpdir do |tmpdir|
93
- Dir.mktmpdir do |tmpdir2|
94
- with_env('JUPYTER_DATA_DIR' => nil,
95
- 'IPYTHONDIR' => nil,
96
- 'HOME' => tmpdir2) do
97
- ignore_warning do
98
- @command = IRuby::Command.new(["register", "--ipython-dir=~/.ipython"])
99
- assert_equal("#{tmpdir2}/.ipython/kernels/ruby/kernel.json", @command.kernel_file)
100
- @command.run
101
- assert(File.file?("#{tmpdir2}/.ipython/kernels/ruby/kernel.json"))
102
- end
103
- end
104
-
105
- with_env('JUPYTER_DATA_DIR' => nil,
106
- 'IPYTHONDIR' => nil,
107
- 'HOME' => tmpdir2) do
108
- @command = IRuby::Command.new(["register"])
109
- assert_output(nil, /IRuby kernel file already exists in the deprecated IPython's data directory\.\nUsing --force, you can replace the old kernel file with the new one in Jupyter's data directory\./) do
110
- @command.run
111
- end
112
- assert(File.file?(File.join(@command.ipython_kernel_dir, 'kernel.json')))
113
- refute(File.file?(@command.kernel_file))
114
-
115
- @command = IRuby::Command.new(["register", "--force"])
116
- assert_output(nil, nil) do
117
- @command.run
118
- end
119
- refute(File.exist?(@command.ipython_kernel_dir))
120
- assert(File.file?(@command.kernel_file))
121
- end
122
- end
123
- end
124
- end
125
-
126
- def test_register_and_unregister_with_JUPYTER_DATA_DIR
127
- Dir.mktmpdir do |tmpdir|
128
- Dir.mktmpdir do |tmpdir2|
129
- with_env('JUPYTER_DATA_DIR' => tmpdir,
130
- 'IPYTHONDIR' => nil,
131
- 'HOME' => tmpdir2) do
132
- assert_output(nil, nil) do
133
- @command = IRuby::Command.new(['register'])
134
- kernel_dir = File.join(tmpdir, 'kernels', 'ruby')
135
- kernel_file = File.join(kernel_dir, 'kernel.json')
136
- assert(!File.file?(kernel_file))
137
-
138
- @command.run
139
- assert(File.file?(kernel_file))
140
-
141
- @command = IRuby::Command.new(['unregister'])
142
- @command.run
143
- assert(!File.file?(kernel_file))
144
- end
145
- end
146
- end
147
- end
148
- end
149
-
150
- def test_register_and_unregister_with_JUPYTER_DATA_DIR_when_there_is_kernel_in_ipython_dir
151
- Dir.mktmpdir do |tmpdir|
152
- Dir.mktmpdir do |tmpdir2|
153
- with_env('HOME' => tmpdir2) do
154
- ignore_warning do
155
- @command = IRuby::Command.new(["register", "--ipython-dir=~/.ipython"])
156
- assert_equal("#{tmpdir2}/.ipython/kernels/ruby/kernel.json", @command.kernel_file)
157
- @command.run
158
- assert(File.file?("#{tmpdir2}/.ipython/kernels/ruby/kernel.json"))
159
- end
160
- end
161
-
162
- with_env('JUPYTER_DATA_DIR' => tmpdir,
163
- 'IPYTHONDIR' => nil,
164
- 'HOME' => tmpdir2) do
165
- @command = IRuby::Command.new(["register"])
166
- assert_output(nil, /IRuby kernel file already exists in the deprecated IPython's data directory\.\nUsing --force, you can replace the old kernel file with the new one in Jupyter's data directory\./) do
167
- @command.run
168
- end
169
- assert(File.file?(File.join(@command.ipython_kernel_dir, 'kernel.json')))
170
- refute(File.file?(@command.kernel_file))
171
-
172
- @command = IRuby::Command.new(["register", "--force"])
173
- assert_output(nil, nil) do
174
- @command.run
175
- end
176
- refute(File.file?(File.join(@command.ipython_kernel_dir, 'kernel.json')))
177
- assert(File.file?(@command.kernel_file))
178
- end
179
- end
180
- end
181
- end
182
-
183
- def test_register_and_unregister_with_IPYTHONDIR
184
- Dir.mktmpdir do |tmpdir|
185
- Dir.mktmpdir do |tmpdir2|
186
- with_env('JUPYTER_DATA_DIR' => nil,
187
- 'IPYTHONDIR' => tmpdir,
188
- 'HOME' => tmpdir2) do
189
- ignore_warning do
190
- @command = IRuby::Command.new(['register'])
191
- kernel_dir = File.join(tmpdir, 'kernels', 'ruby')
192
- kernel_file = File.join(kernel_dir, 'kernel.json')
193
- assert(!File.file?(kernel_file))
194
-
195
- @command.run
196
- assert(File.file?(kernel_file))
197
-
198
- @command = IRuby::Command.new(['unregister'])
199
- @command.run
200
- assert(!File.file?(kernel_file))
201
- end
202
- end
203
- end
204
- end
205
- end
206
- end
207
- end