iruby 0.1.13 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.travis.yml +13 -0
- data/CHANGES +9 -0
- data/CONTRIBUTORS +7 -1
- data/Gemfile +1 -4
- data/IRuby-Example.ipynb +3826 -3240
- data/{LICENSE → LICENSE.txt} +1 -1
- data/README.rdoc +45 -0
- data/Rakefile +2 -0
- data/bin/iruby +0 -1
- data/examples/display.ipynb +116 -106
- data/examples/stdout.ipynb +91 -93
- data/examples/table.ipynb +307 -282
- data/iruby.gemspec +12 -9
- data/lib/iruby.rb +2 -1
- data/lib/iruby/backend.rb +5 -5
- data/lib/iruby/comm.rb +60 -0
- data/lib/iruby/command.rb +68 -53
- data/lib/iruby/display.rb +4 -10
- data/lib/iruby/formatter.rb +11 -13
- data/lib/iruby/kernel.rb +69 -57
- data/lib/iruby/logger.rb +17 -0
- data/lib/iruby/ostream.rb +11 -9
- data/lib/iruby/session.rb +21 -24
- data/lib/iruby/utils.rb +2 -2
- data/lib/iruby/version.rb +1 -1
- data/{lib/iruby/static/base/images → logo}/favicon.ico +0 -0
- data/{lib/iruby/static/base/images/ipynblogo.png → logo/iruby.png} +0 -0
- data/{lib/iruby/static/base/images/src/ipynblogo.svg → logo/iruby.svg} +0 -0
- data/{lib/iruby/static/base/images/src → logo}/ruby.svg +0 -0
- data/test/integration_test.rb +41 -0
- data/test/iruby/multi_logger_test.rb +15 -0
- data/test/test_helper.rb +5 -0
- metadata +51 -35
- data/README.md +0 -24
- data/lib/iruby/static/custom/custom.css +0 -40
- data/lib/iruby/static/custom/custom.js +0 -15
data/lib/iruby/logger.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'logger'
|
2
|
+
|
3
|
+
module IRuby
|
4
|
+
class << self
|
5
|
+
attr_accessor :logger
|
6
|
+
end
|
7
|
+
|
8
|
+
class MultiLogger < BasicObject
|
9
|
+
def initialize(*loggers)
|
10
|
+
@loggers = loggers
|
11
|
+
end
|
12
|
+
|
13
|
+
def method_missing(name, *args, &b)
|
14
|
+
@loggers.map {|x| x.respond_to?(name) && x.public_send(name, *args, &b) }.any?
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
data/lib/iruby/ostream.rb
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
module IRuby
|
2
2
|
# IO-like object that publishes to 0MQ socket.
|
3
3
|
class OStream
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
@name = name
|
4
|
+
attr_accessor :sync
|
5
|
+
|
6
|
+
def initialize(session, name)
|
7
|
+
@session, @name = session, name
|
8
8
|
end
|
9
9
|
|
10
10
|
def close
|
11
|
-
@
|
11
|
+
@session = nil
|
12
12
|
end
|
13
13
|
|
14
14
|
def flush
|
@@ -26,15 +26,17 @@ module IRuby
|
|
26
26
|
alias_method :readline, :read
|
27
27
|
|
28
28
|
def write(s)
|
29
|
-
raise 'I/O operation on closed file' unless @
|
30
|
-
@session.send(
|
29
|
+
raise 'I/O operation on closed file' unless @session
|
30
|
+
@session.send(:publish, 'stream', { name: @name, text: s.to_s })
|
31
31
|
nil
|
32
32
|
end
|
33
33
|
alias_method :<<, :write
|
34
34
|
alias_method :print, :write
|
35
35
|
|
36
|
-
def puts(
|
37
|
-
|
36
|
+
def puts(*lines)
|
37
|
+
lines = [''] if lines.empty?
|
38
|
+
lines.each { |s| write("#{s}\n")}
|
39
|
+
nil
|
38
40
|
end
|
39
41
|
|
40
42
|
def writelines(lines)
|
data/lib/iruby/session.rb
CHANGED
@@ -2,8 +2,9 @@ module IRuby
|
|
2
2
|
class Session
|
3
3
|
DELIM = '<IDS|MSG>'
|
4
4
|
|
5
|
-
def initialize(username, config)
|
5
|
+
def initialize(username, config, sockets)
|
6
6
|
@username = username
|
7
|
+
@sockets = sockets
|
7
8
|
@session = SecureRandom.uuid
|
8
9
|
@msg_id = 0
|
9
10
|
if config['key'] && config['signature_scheme']
|
@@ -18,32 +19,17 @@ module IRuby
|
|
18
19
|
msg_type: type,
|
19
20
|
msg_id: @msg_id,
|
20
21
|
username: @username,
|
21
|
-
session: @session
|
22
|
+
session: @session,
|
23
|
+
version: '5.0'
|
22
24
|
}
|
23
25
|
@msg_id += 1
|
24
26
|
|
25
|
-
|
26
|
-
list.each_with_index do |part, i|
|
27
|
-
socket.send_string(part, i == list.size - 1 ? 0 : ZMQ::SNDMORE)
|
28
|
-
end
|
27
|
+
@sockets[socket].send_message(serialize(header, content, ident))
|
29
28
|
end
|
30
29
|
|
31
30
|
# Receive a message and decode it
|
32
|
-
def recv(socket
|
33
|
-
msg = []
|
34
|
-
while msg.empty? || socket.more_parts?
|
35
|
-
begin
|
36
|
-
frame = ''
|
37
|
-
rc = socket.recv_string(frame, mode)
|
38
|
-
ZMQ::Util.error_check('zmq_msg_send', rc)
|
39
|
-
msg << frame
|
40
|
-
rescue
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
i = msg.index(DELIM)
|
45
|
-
idents, msg_list = msg[0..i-1], msg[i+1..-1]
|
46
|
-
msg = unserialize(msg_list)
|
31
|
+
def recv(socket)
|
32
|
+
idents, msg = unserialize(@sockets[socket].recv_message)
|
47
33
|
@last_received_header = msg[:header]
|
48
34
|
return idents, msg
|
49
35
|
end
|
@@ -55,15 +41,26 @@ module IRuby
|
|
55
41
|
MultiJson.dump(@last_received_header || {}),
|
56
42
|
'{}',
|
57
43
|
MultiJson.dump(content || {})]
|
58
|
-
([ident].flatten.compact << DELIM << sign(msg)) + msg
|
44
|
+
#STDERR.puts "SEND #{(([ident].flatten.compact << DELIM << sign(msg)) + msg).inspect}"
|
45
|
+
ZMQ::Message(*(([ident].flatten.compact << DELIM << sign(msg)) + msg))
|
59
46
|
end
|
60
47
|
|
61
|
-
def unserialize(
|
48
|
+
def unserialize(msg)
|
49
|
+
raise 'no message received' unless msg
|
50
|
+
parts = []
|
51
|
+
while frame = msg.popstr
|
52
|
+
parts << frame
|
53
|
+
end
|
54
|
+
#STDERR.puts "RECV #{parts.inspect}"
|
55
|
+
|
56
|
+
i = parts.index(DELIM)
|
57
|
+
idents, msg_list = parts[0..i-1], parts[i+1..-1]
|
58
|
+
|
62
59
|
minlen = 5
|
63
60
|
raise 'malformed message, must have at least #{minlen} elements' unless msg_list.length >= minlen
|
64
61
|
s, header, parent_header, metadata, content, buffers = *msg_list
|
65
62
|
raise 'Invalid signature' unless s == sign(msg_list[1..-1])
|
66
|
-
{
|
63
|
+
return idents, {
|
67
64
|
header: MultiJson.load(header),
|
68
65
|
parent_header: MultiJson.load(parent_header),
|
69
66
|
metadata: MultiJson.load(metadata),
|
data/lib/iruby/utils.rb
CHANGED
@@ -4,10 +4,10 @@ module IRuby
|
|
4
4
|
end
|
5
5
|
|
6
6
|
def self.display(obj, options = {})
|
7
|
-
Kernel.instance.display(obj, options)
|
7
|
+
Kernel.instance.session.send(:publish, 'display_data', data: Display.display(obj, options), metadata: {}) unless obj.nil?
|
8
8
|
end
|
9
9
|
|
10
|
-
def self.table(s, options
|
10
|
+
def self.table(s, **options)
|
11
11
|
html(HTML.table(s, options))
|
12
12
|
end
|
13
13
|
|
data/lib/iruby/version.rb
CHANGED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'open3'
|
3
|
+
require 'expect'
|
4
|
+
|
5
|
+
class IntegrationTest < IRubyTest
|
6
|
+
def setup
|
7
|
+
@stdin, @stdout, @stderr, @process = Open3.popen3('bin/iruby')
|
8
|
+
expect 'In [', 30
|
9
|
+
expect '1'
|
10
|
+
expect ']:'
|
11
|
+
end
|
12
|
+
|
13
|
+
def teardown
|
14
|
+
@stdin.close
|
15
|
+
@stdout.close
|
16
|
+
@stderr.close
|
17
|
+
@process.kill
|
18
|
+
end
|
19
|
+
|
20
|
+
def write(input)
|
21
|
+
@stdin.puts input
|
22
|
+
end
|
23
|
+
|
24
|
+
def expect(pattern, timeout = 1)
|
25
|
+
assert @stdout.expect(pattern, timeout), "#{pattern} expected"
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_interaction
|
29
|
+
write '"Hello, world!"'
|
30
|
+
expect '"Hello, world!"'
|
31
|
+
|
32
|
+
write 'puts "Hello!"'
|
33
|
+
expect 'Hello!'
|
34
|
+
|
35
|
+
write '12 + 12'
|
36
|
+
expect '24'
|
37
|
+
|
38
|
+
write 'ls'
|
39
|
+
expect 'self.methods'
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'stringio'
|
2
|
+
require 'test_helper'
|
3
|
+
require 'iruby/logger'
|
4
|
+
|
5
|
+
class MultiLoggerTest < IRubyTest
|
6
|
+
def test_multilogger
|
7
|
+
out, err = StringIO.new, StringIO.new
|
8
|
+
logger = IRuby::MultiLogger.new(Logger.new(out), Logger.new(err))
|
9
|
+
logger.warn 'You did a bad thing'
|
10
|
+
assert_match 'WARN', out.string
|
11
|
+
assert_match 'WARN', err.string
|
12
|
+
assert_match 'bad thing', out.string
|
13
|
+
assert_match 'bad thing', err.string
|
14
|
+
end
|
15
|
+
end
|
data/test/test_helper.rb
ADDED
metadata
CHANGED
@@ -1,104 +1,116 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: iruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
- Damián Silvani
|
8
|
-
- Min RK
|
9
|
-
- Martin Sarsale
|
10
|
-
- Josh Adams
|
11
7
|
- Daniel Mendler
|
8
|
+
- The SciRuby developers
|
12
9
|
autorequire:
|
13
10
|
bindir: bin
|
14
11
|
cert_chain: []
|
15
|
-
date:
|
12
|
+
date: 2015-05-25 00:00:00.000000000 Z
|
16
13
|
dependencies:
|
17
14
|
- !ruby/object:Gem::Dependency
|
18
15
|
name: rake
|
19
16
|
requirement: !ruby/object:Gem::Requirement
|
20
17
|
requirements:
|
21
|
-
- - "
|
18
|
+
- - "~>"
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: '10.4'
|
21
|
+
type: :development
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - "~>"
|
22
26
|
- !ruby/object:Gem::Version
|
23
|
-
version: '
|
27
|
+
version: '10.4'
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: minitest
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - "~>"
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '5.6'
|
24
35
|
type: :development
|
25
36
|
prerelease: false
|
26
37
|
version_requirements: !ruby/object:Gem::Requirement
|
27
38
|
requirements:
|
28
|
-
- - "
|
39
|
+
- - "~>"
|
29
40
|
- !ruby/object:Gem::Version
|
30
|
-
version: '
|
41
|
+
version: '5.6'
|
31
42
|
- !ruby/object:Gem::Dependency
|
32
43
|
name: bond
|
33
44
|
requirement: !ruby/object:Gem::Requirement
|
34
45
|
requirements:
|
35
46
|
- - "~>"
|
36
47
|
- !ruby/object:Gem::Version
|
37
|
-
version: 0.5
|
48
|
+
version: '0.5'
|
38
49
|
type: :runtime
|
39
50
|
prerelease: false
|
40
51
|
version_requirements: !ruby/object:Gem::Requirement
|
41
52
|
requirements:
|
42
53
|
- - "~>"
|
43
54
|
- !ruby/object:Gem::Version
|
44
|
-
version: 0.5
|
55
|
+
version: '0.5'
|
45
56
|
- !ruby/object:Gem::Dependency
|
46
|
-
name:
|
57
|
+
name: rbczmq
|
47
58
|
requirement: !ruby/object:Gem::Requirement
|
48
59
|
requirements:
|
49
60
|
- - "~>"
|
50
61
|
- !ruby/object:Gem::Version
|
51
|
-
version: '
|
62
|
+
version: '1.7'
|
52
63
|
type: :runtime
|
53
64
|
prerelease: false
|
54
65
|
version_requirements: !ruby/object:Gem::Requirement
|
55
66
|
requirements:
|
56
67
|
- - "~>"
|
57
68
|
- !ruby/object:Gem::Version
|
58
|
-
version: '
|
69
|
+
version: '1.7'
|
59
70
|
- !ruby/object:Gem::Dependency
|
60
71
|
name: multi_json
|
61
72
|
requirement: !ruby/object:Gem::Requirement
|
62
73
|
requirements:
|
63
74
|
- - "~>"
|
64
75
|
- !ruby/object:Gem::Version
|
65
|
-
version: 1.
|
76
|
+
version: '1.11'
|
66
77
|
type: :runtime
|
67
78
|
prerelease: false
|
68
79
|
version_requirements: !ruby/object:Gem::Requirement
|
69
80
|
requirements:
|
70
81
|
- - "~>"
|
71
82
|
- !ruby/object:Gem::Version
|
72
|
-
version: 1.
|
83
|
+
version: '1.11'
|
73
84
|
- !ruby/object:Gem::Dependency
|
74
85
|
name: mimemagic
|
75
86
|
requirement: !ruby/object:Gem::Requirement
|
76
87
|
requirements:
|
77
88
|
- - "~>"
|
78
89
|
- !ruby/object:Gem::Version
|
79
|
-
version: 0.
|
90
|
+
version: '0.3'
|
80
91
|
type: :runtime
|
81
92
|
prerelease: false
|
82
93
|
version_requirements: !ruby/object:Gem::Requirement
|
83
94
|
requirements:
|
84
95
|
- - "~>"
|
85
96
|
- !ruby/object:Gem::Version
|
86
|
-
version: 0.
|
97
|
+
version: '0.3'
|
87
98
|
description: Ruby Kernel for IPython
|
88
99
|
email:
|
89
|
-
-
|
100
|
+
- mail@daniel-mendler.de
|
90
101
|
executables:
|
91
102
|
- iruby
|
92
103
|
extensions: []
|
93
104
|
extra_rdoc_files: []
|
94
105
|
files:
|
95
106
|
- ".gitignore"
|
107
|
+
- ".travis.yml"
|
96
108
|
- CHANGES
|
97
109
|
- CONTRIBUTORS
|
98
110
|
- Gemfile
|
99
111
|
- IRuby-Example.ipynb
|
100
|
-
- LICENSE
|
101
|
-
- README.
|
112
|
+
- LICENSE.txt
|
113
|
+
- README.rdoc
|
102
114
|
- Rakefile
|
103
115
|
- bin/iruby
|
104
116
|
- examples/display.ipynb
|
@@ -107,22 +119,25 @@ files:
|
|
107
119
|
- iruby.gemspec
|
108
120
|
- lib/iruby.rb
|
109
121
|
- lib/iruby/backend.rb
|
122
|
+
- lib/iruby/comm.rb
|
110
123
|
- lib/iruby/command.rb
|
111
124
|
- lib/iruby/display.rb
|
112
125
|
- lib/iruby/formatter.rb
|
113
126
|
- lib/iruby/kernel.rb
|
127
|
+
- lib/iruby/logger.rb
|
114
128
|
- lib/iruby/ostream.rb
|
115
129
|
- lib/iruby/session.rb
|
116
|
-
- lib/iruby/static/base/images/favicon.ico
|
117
|
-
- lib/iruby/static/base/images/ipynblogo.png
|
118
|
-
- lib/iruby/static/base/images/src/ipynblogo.svg
|
119
|
-
- lib/iruby/static/base/images/src/ruby.svg
|
120
|
-
- lib/iruby/static/custom/custom.css
|
121
|
-
- lib/iruby/static/custom/custom.js
|
122
130
|
- lib/iruby/utils.rb
|
123
131
|
- lib/iruby/version.rb
|
132
|
+
- logo/favicon.ico
|
133
|
+
- logo/iruby.png
|
134
|
+
- logo/iruby.svg
|
135
|
+
- logo/ruby.svg
|
124
136
|
- screenshot.png
|
125
|
-
|
137
|
+
- test/integration_test.rb
|
138
|
+
- test/iruby/multi_logger_test.rb
|
139
|
+
- test/test_helper.rb
|
140
|
+
homepage: https://github.com/SciRuby/iruby
|
126
141
|
licenses:
|
127
142
|
- MIT
|
128
143
|
metadata: {}
|
@@ -131,13 +146,10 @@ post_install_message: |+
|
|
131
146
|
* pry
|
132
147
|
* pry-doc
|
133
148
|
* pry-theme
|
134
|
-
* pry-syntax-hacks
|
135
|
-
* pry-git
|
136
149
|
* awesome_print
|
137
|
-
* gruff
|
138
|
-
* rmagick
|
139
150
|
* gnuplot
|
140
151
|
* rubyvis
|
152
|
+
* nyaplot
|
141
153
|
|
142
154
|
rdoc_options: []
|
143
155
|
require_paths:
|
@@ -146,7 +158,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
146
158
|
requirements:
|
147
159
|
- - ">="
|
148
160
|
- !ruby/object:Gem::Version
|
149
|
-
version:
|
161
|
+
version: 2.0.0
|
150
162
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
151
163
|
requirements:
|
152
164
|
- - ">="
|
@@ -158,4 +170,8 @@ rubygems_version: 2.2.2
|
|
158
170
|
signing_key:
|
159
171
|
specification_version: 4
|
160
172
|
summary: A Ruby kernel for IPython frontends (notebook console, etc.)
|
161
|
-
test_files:
|
173
|
+
test_files:
|
174
|
+
- test/integration_test.rb
|
175
|
+
- test/iruby/multi_logger_test.rb
|
176
|
+
- test/test_helper.rb
|
177
|
+
has_rdoc:
|
data/README.md
DELETED
@@ -1,24 +0,0 @@
|
|
1
|
-
# IRuby
|
2
|
-
|
3
|
-
This is a Ruby kernel for IPython.
|
4
|
-
|
5
|
-
![IRuby Notebook](screenshot.png)
|
6
|
-
|
7
|
-
### Quick start
|
8
|
-
|
9
|
-
At first install the packages `ipython`, `python-jinja`, `python-tornado`, `python-pyzmq` so that you get a working `ipython notebook`.
|
10
|
-
Maybe the packages are called slightly different on your Unix.
|
11
|
-
|
12
|
-
Now install the rubygem using `gem install iruby` and then run `iruby notebook` or `iruby`.
|
13
|
-
|
14
|
-
Take a look at the [Example Notebook](http://nbviewer.ipython.org/urls/raw.github.com/minad/iruby/master/IRuby-Example.ipynb).
|
15
|
-
|
16
|
-
The IRuby notebook requires `ipython` >= 1.2.0. Furthermore we need `libzmq` >= 3.2 to work. Version 2.2.0 will not work. If you're using an old Debian without a new enough version of `libzmq`, you can install [Anaconda](https://store.continuum.io/), a Python distribution with newer versions.
|
17
|
-
|
18
|
-
### Authors
|
19
|
-
|
20
|
-
See the [CONTRIBUTORS](CONTRIBUTORS) file.
|
21
|
-
|
22
|
-
### License
|
23
|
-
|
24
|
-
See the [LICENSE](LICENSE) file.
|