iruby 0.4.0 → 0.7.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.
- checksums.yaml +4 -4
- data/.github/workflows/ubuntu.yml +69 -0
- data/CHANGES.md +219 -0
- data/Gemfile +0 -2
- data/LICENSE +1 -1
- data/README.md +81 -62
- data/Rakefile +10 -10
- data/ci/Dockerfile.main.erb +1 -3
- data/iruby.gemspec +13 -19
- data/lib/iruby.rb +6 -6
- data/lib/iruby/backend.rb +38 -10
- data/lib/iruby/command.rb +2 -6
- data/lib/iruby/display.rb +216 -81
- data/lib/iruby/event_manager.rb +40 -0
- data/lib/iruby/formatter.rb +3 -3
- data/lib/iruby/input.rb +6 -6
- data/lib/iruby/input/autoload.rb +1 -1
- data/lib/iruby/input/builder.rb +4 -4
- data/lib/iruby/input/button.rb +2 -2
- data/lib/iruby/input/cancel.rb +1 -1
- data/lib/iruby/input/checkbox.rb +3 -3
- data/lib/iruby/input/date.rb +3 -3
- data/lib/iruby/input/field.rb +2 -2
- data/lib/iruby/input/file.rb +3 -3
- data/lib/iruby/input/form.rb +6 -6
- data/lib/iruby/input/label.rb +4 -4
- data/lib/iruby/input/multiple.rb +10 -10
- data/lib/iruby/input/popup.rb +2 -2
- data/lib/iruby/input/radio.rb +6 -6
- data/lib/iruby/input/select.rb +8 -8
- data/lib/iruby/input/textarea.rb +1 -1
- data/lib/iruby/input/widget.rb +2 -2
- data/lib/iruby/jupyter.rb +1 -0
- data/lib/iruby/kernel.rb +157 -29
- data/lib/iruby/ostream.rb +27 -10
- data/lib/iruby/session.rb +1 -0
- data/lib/iruby/session_adapter.rb +7 -3
- data/lib/iruby/session_adapter/pyzmq_adapter.rb +11 -10
- data/lib/iruby/session_adapter/test_adapter.rb +49 -0
- data/lib/iruby/utils.rb +15 -0
- data/lib/iruby/version.rb +1 -1
- data/run-test.sh +1 -1
- data/test/helper.rb +136 -0
- data/test/integration_test.rb +1 -2
- data/test/iruby/backend_test.rb +37 -0
- data/test/iruby/command_test.rb +0 -1
- data/test/iruby/display_test.rb +188 -0
- data/test/iruby/event_manager_test.rb +92 -0
- data/test/iruby/jupyter_test.rb +0 -1
- data/test/iruby/kernel_test.rb +185 -0
- data/test/iruby/mime_test.rb +50 -0
- data/test/iruby/multi_logger_test.rb +0 -4
- data/test/iruby/session_adapter/cztop_adapter_test.rb +1 -1
- data/test/iruby/session_adapter/ffirzmq_adapter_test.rb +1 -1
- data/test/iruby/session_adapter/session_adapter_test_base.rb +1 -3
- data/test/iruby/session_adapter_test.rb +42 -67
- data/test/iruby/session_test.rb +10 -15
- data/test/run-test.rb +19 -0
- metadata +74 -62
- data/.travis.yml +0 -41
- data/CHANGES +0 -143
- data/CONTRIBUTORS +0 -19
- data/lib/iruby/session/rbczmq.rb +0 -72
- data/lib/iruby/session_adapter/rbczmq_adapter.rb +0 -33
- data/test/iruby/session_adapter/rbczmq_adapter_test.rb +0 -37
- data/test/test_helper.rb +0 -48
@@ -0,0 +1,40 @@
|
|
1
|
+
module IRuby
|
2
|
+
class EventManager
|
3
|
+
def initialize(available_events)
|
4
|
+
@available_events = available_events.dup.freeze
|
5
|
+
@callbacks = available_events.map {|n| [n, []] }.to_h
|
6
|
+
end
|
7
|
+
|
8
|
+
attr_reader :available_events
|
9
|
+
|
10
|
+
def register(event, &block)
|
11
|
+
check_available_event(event)
|
12
|
+
@callbacks[event] << block unless block.nil?
|
13
|
+
block
|
14
|
+
end
|
15
|
+
|
16
|
+
def unregister(event, callback)
|
17
|
+
check_available_event(event)
|
18
|
+
val = @callbacks[event].delete(callback)
|
19
|
+
unless val
|
20
|
+
raise ArgumentError,
|
21
|
+
"Given callable object #{callback} is not registered as a #{event} callback"
|
22
|
+
end
|
23
|
+
val
|
24
|
+
end
|
25
|
+
|
26
|
+
def trigger(event, *args, **kwargs)
|
27
|
+
check_available_event(event)
|
28
|
+
@callbacks[event].each do |fn|
|
29
|
+
fn.call(*args, **kwargs)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def check_available_event(event)
|
36
|
+
return if @callbacks.key?(event)
|
37
|
+
raise ArgumentError, "Unknown event name: #{event}", caller
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
data/lib/iruby/formatter.rb
CHANGED
@@ -78,16 +78,16 @@ module IRuby
|
|
78
78
|
|
79
79
|
if maxcols && keys.size > maxcols
|
80
80
|
keys1 = keys[0...maxcols / 2]
|
81
|
-
keys2 = keys[-maxcols / 2
|
81
|
+
keys2 = keys[-maxcols / 2 + 1..-1]
|
82
82
|
if header
|
83
83
|
header1 = header[0...maxcols / 2]
|
84
|
-
header2 = header[-maxcols / 2
|
84
|
+
header2 = header[-maxcols / 2 + 1..-1]
|
85
85
|
end
|
86
86
|
end
|
87
87
|
|
88
88
|
if maxrows && rows.size > maxrows
|
89
89
|
rows1 = rows[0...maxrows / 2]
|
90
|
-
rows2 = rows[-maxrows / 2
|
90
|
+
rows2 = rows[-maxrows / 2 + 1..-1]
|
91
91
|
end
|
92
92
|
|
93
93
|
table = '<table>'
|
data/lib/iruby/input.rb
CHANGED
@@ -15,21 +15,21 @@ module IRuby
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def form &block
|
18
|
-
builder = Builder.new
|
18
|
+
builder = Builder.new(&block)
|
19
19
|
form = InputForm.new(
|
20
|
-
fields: builder.fields,
|
20
|
+
fields: builder.fields,
|
21
21
|
buttons: builder.buttons
|
22
22
|
)
|
23
23
|
form.widget_display
|
24
24
|
builder.process_result form.submit
|
25
25
|
end
|
26
|
-
|
26
|
+
|
27
27
|
def popup title='Input', &block
|
28
|
-
builder = Builder.new
|
28
|
+
builder = Builder.new(&block)
|
29
29
|
form = InputForm.new fields: builder.fields
|
30
30
|
popup = Popup.new(
|
31
|
-
title: title,
|
32
|
-
form: form,
|
31
|
+
title: title,
|
32
|
+
form: form,
|
33
33
|
buttons: builder.buttons
|
34
34
|
)
|
35
35
|
popup.widget_display
|
data/lib/iruby/input/autoload.rb
CHANGED
data/lib/iruby/input/builder.rb
CHANGED
@@ -21,7 +21,7 @@ module IRuby
|
|
21
21
|
def html &block
|
22
22
|
add_field Class.new(Widget) {
|
23
23
|
define_method(:widget_html) { instance_eval &block }
|
24
|
-
}.new
|
24
|
+
}.new
|
25
25
|
end
|
26
26
|
|
27
27
|
def text string
|
@@ -44,7 +44,7 @@ module IRuby
|
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
47
|
-
private
|
47
|
+
private
|
48
48
|
|
49
49
|
def process key, &block
|
50
50
|
@processors[key.to_s] = block
|
@@ -52,14 +52,14 @@ module IRuby
|
|
52
52
|
|
53
53
|
def unique_key key
|
54
54
|
@keys ||= []
|
55
|
-
|
55
|
+
|
56
56
|
if @keys.include? key
|
57
57
|
(2..Float::INFINITY).each do |i|
|
58
58
|
test = "#{key}#{i}"
|
59
59
|
break key = test unless @keys.include? test
|
60
60
|
end
|
61
61
|
end
|
62
|
-
|
62
|
+
|
63
63
|
@keys << key; key
|
64
64
|
end
|
65
65
|
end
|
data/lib/iruby/input/button.rb
CHANGED
@@ -10,7 +10,7 @@ module IRuby
|
|
10
10
|
green: 'success',
|
11
11
|
aqua: 'info',
|
12
12
|
orange: 'warning',
|
13
|
-
red: 'danger',
|
13
|
+
red: 'danger',
|
14
14
|
none: 'link'
|
15
15
|
}
|
16
16
|
|
@@ -37,7 +37,7 @@ module IRuby
|
|
37
37
|
def widget_html
|
38
38
|
button(
|
39
39
|
@label || to_label(@key),
|
40
|
-
type: 'button',
|
40
|
+
type: 'button',
|
41
41
|
:'data-iruby-key' => @key,
|
42
42
|
class: "btn btn-#{COLORS[@color]} pull-right #{@js_class}"
|
43
43
|
)
|
data/lib/iruby/input/cancel.rb
CHANGED
data/lib/iruby/input/checkbox.rb
CHANGED
@@ -56,10 +56,10 @@ module IRuby
|
|
56
56
|
widget_label do
|
57
57
|
div **params do
|
58
58
|
@options.each do |option|
|
59
|
-
label class: 'checkbox-inline' do
|
59
|
+
label class: 'checkbox-inline' do
|
60
60
|
input(
|
61
|
-
name: @key,
|
62
|
-
value: option,
|
61
|
+
name: @key,
|
62
|
+
value: option,
|
63
63
|
type: 'checkbox',
|
64
64
|
checked: @default.include?(option)
|
65
65
|
)
|
data/lib/iruby/input/date.rb
CHANGED
@@ -6,7 +6,7 @@ module IRuby
|
|
6
6
|
builder :date do |key='date', **params|
|
7
7
|
params[:default] ||= false
|
8
8
|
params[:key] = unique_key key
|
9
|
-
|
9
|
+
|
10
10
|
if params[:default].is_a? Time
|
11
11
|
params[:default] = params[:default].strftime('%m/%d/%Y')
|
12
12
|
end
|
@@ -22,13 +22,13 @@ module IRuby
|
|
22
22
|
'#ui-datepicker-div { z-index: 2000 !important; }'
|
23
23
|
end
|
24
24
|
|
25
|
-
def widget_js
|
25
|
+
def widget_js
|
26
26
|
<<-JS
|
27
27
|
$('.iruby-date').datepicker({
|
28
28
|
dateFormat: 'mm/dd/yy',
|
29
29
|
onClose: function(date) {
|
30
30
|
$(this).data('iruby-value', date);
|
31
|
-
}
|
31
|
+
}
|
32
32
|
});
|
33
33
|
JS
|
34
34
|
end
|
data/lib/iruby/input/field.rb
CHANGED
data/lib/iruby/input/file.rb
CHANGED
@@ -13,10 +13,10 @@ module IRuby
|
|
13
13
|
|
14
14
|
# get rid of Chrome's silly path
|
15
15
|
name = value['name'].sub('C:\\fakepath\\','')
|
16
|
-
|
16
|
+
|
17
17
|
result[key.to_sym] = {
|
18
18
|
name: name,
|
19
|
-
data: uri.data,
|
19
|
+
data: uri.data,
|
20
20
|
content_type: uri.content_type
|
21
21
|
}
|
22
22
|
end
|
@@ -46,7 +46,7 @@ module IRuby
|
|
46
46
|
def widget_html
|
47
47
|
widget_label do
|
48
48
|
input(
|
49
|
-
type: 'file',
|
49
|
+
type: 'file',
|
50
50
|
:'data-iruby-key' => @key,
|
51
51
|
class: 'form-control iruby-file'
|
52
52
|
)
|
data/lib/iruby/input/form.rb
CHANGED
@@ -5,7 +5,7 @@ module IRuby
|
|
5
5
|
class InputForm < Widget
|
6
6
|
needs :fields, buttons: []
|
7
7
|
|
8
|
-
def widget_js
|
8
|
+
def widget_js
|
9
9
|
javascript = <<-JS
|
10
10
|
var remove = function () {
|
11
11
|
Jupyter.notebook.kernel.send_input_reply(
|
@@ -14,7 +14,7 @@ module IRuby
|
|
14
14
|
})
|
15
15
|
);
|
16
16
|
};
|
17
|
-
|
17
|
+
|
18
18
|
$("#iruby-form").on("remove", remove);
|
19
19
|
|
20
20
|
$('#iruby-form').submit(function() {
|
@@ -33,16 +33,16 @@ module IRuby
|
|
33
33
|
Jupyter.notebook.kernel.send_input_reply(
|
34
34
|
JSON.stringify({'#{@id}': result})
|
35
35
|
);
|
36
|
-
|
36
|
+
|
37
37
|
$(this).remove();
|
38
38
|
return false;
|
39
39
|
});
|
40
40
|
|
41
41
|
$('#iruby-form').keydown(function(event) {
|
42
|
-
if (event.keyCode == 13 && !event.shiftKey) {
|
42
|
+
if (event.keyCode == 13 && !event.shiftKey) {
|
43
43
|
$('#iruby-form').submit();
|
44
|
-
} else if (event.keyCode == 27) {
|
45
|
-
$('#iruby-form').remove();
|
44
|
+
} else if (event.keyCode == 27) {
|
45
|
+
$('#iruby-form').remove();
|
46
46
|
}
|
47
47
|
});
|
48
48
|
JS
|
data/lib/iruby/input/label.rb
CHANGED
@@ -4,13 +4,13 @@ module IRuby
|
|
4
4
|
needs label: nil, icon: nil
|
5
5
|
|
6
6
|
def widget_label
|
7
|
-
div class: 'iruby-label input-group' do
|
8
|
-
span class: 'input-group-addon' do
|
7
|
+
div class: 'iruby-label input-group' do
|
8
|
+
span class: 'input-group-addon' do
|
9
9
|
text @label || to_label(@key)
|
10
10
|
end
|
11
|
-
|
11
|
+
|
12
12
|
yield
|
13
|
-
|
13
|
+
|
14
14
|
if @icon
|
15
15
|
span @icon, class: "input-group-addon"
|
16
16
|
end
|
data/lib/iruby/input/multiple.rb
CHANGED
@@ -9,7 +9,7 @@ module IRuby
|
|
9
9
|
|
10
10
|
params[:key] = unique_key(key)
|
11
11
|
params[:options] = args
|
12
|
-
|
12
|
+
|
13
13
|
params[:default] = case params[:default]
|
14
14
|
when false, nil
|
15
15
|
[]
|
@@ -24,12 +24,12 @@ module IRuby
|
|
24
24
|
|
25
25
|
def widget_css
|
26
26
|
<<-CSS
|
27
|
-
.iruby-multiple {
|
27
|
+
.iruby-multiple {
|
28
28
|
display: table;
|
29
29
|
min-width: 25%;
|
30
30
|
}
|
31
|
-
.form-control.iruby-multiple-container {
|
32
|
-
display: table;
|
31
|
+
.form-control.iruby-multiple-container {
|
32
|
+
display: table;
|
33
33
|
}
|
34
34
|
CSS
|
35
35
|
end
|
@@ -54,17 +54,17 @@ module IRuby
|
|
54
54
|
end
|
55
55
|
|
56
56
|
def widget_html
|
57
|
-
widget_label do
|
58
|
-
div class: 'form-control iruby-multiple-container' do
|
57
|
+
widget_label do
|
58
|
+
div class: 'form-control iruby-multiple-container' do
|
59
59
|
params = {
|
60
60
|
size: @size,
|
61
61
|
multiple: true,
|
62
|
-
class: 'iruby-multiple',
|
62
|
+
class: 'iruby-multiple',
|
63
63
|
:'data-iruby-key' => @key
|
64
64
|
}
|
65
|
-
|
66
|
-
select **params do
|
67
|
-
@options.each do |o|
|
65
|
+
|
66
|
+
select **params do
|
67
|
+
@options.each do |o|
|
68
68
|
option o, selected: @default.include?(o)
|
69
69
|
end
|
70
70
|
end
|
data/lib/iruby/input/popup.rb
CHANGED
data/lib/iruby/input/radio.rb
CHANGED
@@ -6,7 +6,7 @@ module IRuby
|
|
6
6
|
builder :radio do |*args, **params|
|
7
7
|
key = :radio
|
8
8
|
key, *args = args if args.first.is_a? Symbol
|
9
|
-
|
9
|
+
|
10
10
|
params[:key] = unique_key(key)
|
11
11
|
params[:options] = args
|
12
12
|
params[:default] ||= false
|
@@ -24,7 +24,7 @@ module IRuby
|
|
24
24
|
<<-JS
|
25
25
|
$('.iruby-radio input').change(function(){
|
26
26
|
var parent = $(this).closest('.iruby-radio');
|
27
|
-
$(parent).data('iruby-value',
|
27
|
+
$(parent).data('iruby-value',
|
28
28
|
$(parent).find(':checked').val()
|
29
29
|
);
|
30
30
|
});
|
@@ -38,13 +38,13 @@ module IRuby
|
|
38
38
|
:'data-iruby-value' => @options.first,
|
39
39
|
class: 'iruby-radio form-control'
|
40
40
|
}
|
41
|
-
widget_label do
|
41
|
+
widget_label do
|
42
42
|
div **params do
|
43
43
|
@options.each do |option|
|
44
|
-
label class: 'radio-inline' do
|
44
|
+
label class: 'radio-inline' do
|
45
45
|
input(
|
46
|
-
name: @key,
|
47
|
-
value: option,
|
46
|
+
name: @key,
|
47
|
+
value: option,
|
48
48
|
type: 'radio',
|
49
49
|
checked: @default == option
|
50
50
|
)
|
data/lib/iruby/input/select.rb
CHANGED
@@ -20,7 +20,7 @@ module IRuby
|
|
20
20
|
|
21
21
|
def widget_css
|
22
22
|
<<-CSS
|
23
|
-
.iruby-select {
|
23
|
+
.iruby-select {
|
24
24
|
min-width: 25%;
|
25
25
|
margin-left: 0 !important;
|
26
26
|
}
|
@@ -30,7 +30,7 @@ module IRuby
|
|
30
30
|
def widget_js
|
31
31
|
<<-JS
|
32
32
|
$('.iruby-select').change(function(){
|
33
|
-
$(this).data('iruby-value',
|
33
|
+
$(this).data('iruby-value',
|
34
34
|
$(this).find('option:selected').text()
|
35
35
|
);
|
36
36
|
});
|
@@ -38,16 +38,16 @@ module IRuby
|
|
38
38
|
end
|
39
39
|
|
40
40
|
def widget_html
|
41
|
-
widget_label do
|
42
|
-
div class: 'form-control' do
|
41
|
+
widget_label do
|
42
|
+
div class: 'form-control' do
|
43
43
|
params = {
|
44
|
-
class: 'iruby-select',
|
44
|
+
class: 'iruby-select',
|
45
45
|
:'data-iruby-key' => @key,
|
46
46
|
:'data-iruby-value' => @default
|
47
47
|
}
|
48
|
-
|
49
|
-
select **params do
|
50
|
-
@options.each do |o|
|
48
|
+
|
49
|
+
select **params do
|
50
|
+
@options.each do |o|
|
51
51
|
option o, selected: @default == o
|
52
52
|
end
|
53
53
|
end
|