iruby 0.2.1 → 0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGES +5 -0
- data/IRuby-Example.ipynb +142 -682
- data/examples/display.ipynb +1 -1
- data/examples/history.ipynb +171 -0
- data/examples/stdout.ipynb +1 -1
- data/examples/table.ipynb +40 -1
- data/lib/iruby/backend.rb +40 -4
- data/lib/iruby/comm.rb +11 -25
- data/lib/iruby/command.rb +2 -2
- data/lib/iruby/formatter.rb +13 -5
- data/lib/iruby/kernel.rb +58 -111
- data/lib/iruby/ostream.rb +1 -1
- data/lib/iruby/session.rb +42 -22
- data/lib/iruby/utils.rb +1 -1
- data/lib/iruby/version.rb +1 -1
- metadata +2 -1
data/lib/iruby/ostream.rb
CHANGED
@@ -27,7 +27,7 @@ module IRuby
|
|
27
27
|
|
28
28
|
def write(s)
|
29
29
|
raise 'I/O operation on closed file' unless @session
|
30
|
-
@session.send(:publish,
|
30
|
+
@session.send(:publish, :stream, name: @name, text: s.to_s)
|
31
31
|
nil
|
32
32
|
end
|
33
33
|
alias_method :<<, :write
|
data/lib/iruby/session.rb
CHANGED
@@ -2,11 +2,28 @@ module IRuby
|
|
2
2
|
class Session
|
3
3
|
DELIM = '<IDS|MSG>'
|
4
4
|
|
5
|
-
def initialize(
|
6
|
-
|
7
|
-
|
5
|
+
def initialize(config)
|
6
|
+
c = ZMQ::Context.new
|
7
|
+
|
8
|
+
connection = "#{config['transport']}://#{config['ip']}:%d"
|
9
|
+
reply_socket = c.socket(:ROUTER)
|
10
|
+
reply_socket.bind(connection % config['shell_port'])
|
11
|
+
|
12
|
+
pub_socket = c.socket(:PUB)
|
13
|
+
pub_socket.bind(connection % config['iopub_port'])
|
14
|
+
|
15
|
+
Thread.new do
|
16
|
+
begin
|
17
|
+
hb_socket = c.socket(:REP)
|
18
|
+
hb_socket.bind(connection % config['hb_port'])
|
19
|
+
ZMQ.proxy(hb_socket, hb_socket)
|
20
|
+
rescue Exception => ex
|
21
|
+
IRuby.logger.fatal "Kernel heartbeat died: #{ex.message}\n#{ex.backtrace.join("\n")}"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
@sockets = { publish: pub_socket, reply: reply_socket }
|
8
26
|
@session = SecureRandom.uuid
|
9
|
-
@msg_id = 0
|
10
27
|
if config['key'] && config['signature_scheme']
|
11
28
|
raise 'Unknown signature scheme' unless config['signature_scheme'] =~ /\Ahmac-(.*)\Z/
|
12
29
|
@hmac = OpenSSL::HMAC.new(config['key'], OpenSSL::Digest.new($1))
|
@@ -14,35 +31,37 @@ module IRuby
|
|
14
31
|
end
|
15
32
|
|
16
33
|
# Build and send a message
|
17
|
-
def send(socket, type, content
|
34
|
+
def send(socket, type, content)
|
35
|
+
idents =
|
36
|
+
if socket == :reply && @last_recvd_msg
|
37
|
+
@last_recvd_msg[:idents]
|
38
|
+
else
|
39
|
+
type == :stream ? "stream.#{content[:name]}" : type
|
40
|
+
end
|
18
41
|
header = {
|
19
42
|
msg_type: type,
|
20
|
-
msg_id:
|
21
|
-
username:
|
43
|
+
msg_id: SecureRandom.uuid,
|
44
|
+
username: 'kernel',
|
22
45
|
session: @session,
|
23
46
|
version: '5.0'
|
24
47
|
}
|
25
|
-
@
|
26
|
-
|
27
|
-
@sockets[socket].send_message(serialize(header, content, ident))
|
48
|
+
@sockets[socket].send_message(serialize(idents, header, content))
|
28
49
|
end
|
29
50
|
|
30
51
|
# Receive a message and decode it
|
31
52
|
def recv(socket)
|
32
|
-
|
33
|
-
@last_received_header = msg[:header]
|
34
|
-
return idents, msg
|
53
|
+
@last_recvd_msg = unserialize(@sockets[socket].recv_message)
|
35
54
|
end
|
36
55
|
|
37
56
|
private
|
38
57
|
|
39
|
-
def serialize(header, content
|
58
|
+
def serialize(idents, header, content)
|
40
59
|
msg = [MultiJson.dump(header),
|
41
|
-
MultiJson.dump(@
|
60
|
+
MultiJson.dump(@last_recvd_msg ? @last_recvd_msg[:header] : {}),
|
42
61
|
'{}',
|
43
62
|
MultiJson.dump(content || {})]
|
44
|
-
#STDERR.puts "SEND #{(([
|
45
|
-
ZMQ::Message(*(([
|
63
|
+
#STDERR.puts "SEND #{(([*idents].compact << DELIM << sign(msg)) + msg).inspect}"
|
64
|
+
ZMQ::Message(*(([*idents].compact.map(&:to_s) << DELIM << sign(msg)) + msg))
|
46
65
|
end
|
47
66
|
|
48
67
|
def unserialize(msg)
|
@@ -60,12 +79,13 @@ module IRuby
|
|
60
79
|
raise 'malformed message, must have at least #{minlen} elements' unless msg_list.length >= minlen
|
61
80
|
s, header, parent_header, metadata, content, buffers = *msg_list
|
62
81
|
raise 'Invalid signature' unless s == sign(msg_list[1..-1])
|
63
|
-
|
64
|
-
|
82
|
+
{
|
83
|
+
idents: idents,
|
84
|
+
header: MultiJson.load(header),
|
65
85
|
parent_header: MultiJson.load(parent_header),
|
66
|
-
metadata:
|
67
|
-
content:
|
68
|
-
buffers:
|
86
|
+
metadata: MultiJson.load(metadata),
|
87
|
+
content: MultiJson.load(content),
|
88
|
+
buffers: buffers
|
69
89
|
}
|
70
90
|
end
|
71
91
|
|
data/lib/iruby/utils.rb
CHANGED
@@ -4,7 +4,7 @@ module IRuby
|
|
4
4
|
end
|
5
5
|
|
6
6
|
def self.display(obj, options = {})
|
7
|
-
Kernel.instance.session.send(:publish,
|
7
|
+
Kernel.instance.session.send(:publish, :display_data, data: Display.display(obj, options), metadata: {}, source: 'ruby') unless obj.nil?
|
8
8
|
end
|
9
9
|
|
10
10
|
def self.table(s, **options)
|
data/lib/iruby/version.rb
CHANGED
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.2.
|
4
|
+
version: 0.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Mendler
|
@@ -114,6 +114,7 @@ files:
|
|
114
114
|
- Rakefile
|
115
115
|
- bin/iruby
|
116
116
|
- examples/display.ipynb
|
117
|
+
- examples/history.ipynb
|
117
118
|
- examples/stdout.ipynb
|
118
119
|
- examples/table.ipynb
|
119
120
|
- iruby.gemspec
|