iruby 0.1.0 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +0 -4
- data/CHANGES +12 -0
- data/CONTRIBUTORS +7 -0
- data/Gemfile +10 -0
- data/LICENSE +1 -1
- data/README.md +9 -1
- data/iruby.gemspec +5 -1
- data/lib/iruby.rb +1 -1
- data/lib/iruby/backend.rb +38 -0
- data/lib/iruby/command.rb +4 -0
- data/lib/iruby/kernel.rb +22 -14
- data/lib/iruby/version.rb +1 -1
- data/static/base/images/ipynblogo.png +0 -0
- data/static/base/images/src/ipynblogo.svg +41 -41
- metadata +16 -9
- data/attic/output/html.rb +0 -217
- data/attic/test/helper.rb +0 -5
- data/attic/test/html_test.rb +0 -17
- data/attic/test/output_maps_test.rb +0 -110
- data/lib/iruby/completer.rb +0 -19
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3fab1cec7d0a5e74c19716faa6124965d7df2cae
|
4
|
+
data.tar.gz: 77fbf988545d97e186be8fa011bb4e3012b5bf5b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 372f05475b489d7df770c51bb26051676c2771d644204ef5cd7cf6f7d278547346a7dff1b9608dade8a740efa1fda7c43ce3274a60d71c78c28311f32a454caa
|
7
|
+
data.tar.gz: d60912f4d5dd18fa0d1990a63266bfb8eb39ea8671c58d90f6d561e5021ccc2fcfbfbc35999353cd38d5a98cb7d2dc6c67880a174ebd30e788d617849c0a71a9
|
data/.gitignore
CHANGED
data/CHANGES
ADDED
data/CONTRIBUTORS
ADDED
data/Gemfile
CHANGED
data/LICENSE
CHANGED
data/README.md
CHANGED
@@ -4,4 +4,12 @@ This is a Ruby kernel for IPython.
|
|
4
4
|
|
5
5
|
### Usage
|
6
6
|
|
7
|
-
Install the rubygem using `gem install iruby` and then run `iruby notebook`.
|
7
|
+
Install the rubygem using `gem install iruby` and then run `iruby notebook` or `iruby`.
|
8
|
+
|
9
|
+
### Authors
|
10
|
+
|
11
|
+
See the [CONTRIBUTORS](CONTRIBUTORS) file.
|
12
|
+
|
13
|
+
### License
|
14
|
+
|
15
|
+
See the [LICENSE](LICENSE) file.
|
data/iruby.gemspec
CHANGED
@@ -6,7 +6,7 @@ Gem::Specification.new do |s|
|
|
6
6
|
s.name = 'iruby'
|
7
7
|
s.date = Date.today.to_s
|
8
8
|
s.version = IRuby::VERSION
|
9
|
-
s.authors = ['Damián Silvani', 'Min RK', '
|
9
|
+
s.authors = ['Damián Silvani', 'Min RK', 'Martin Sarsale', 'Josh Adams', 'Daniel Mendler']
|
10
10
|
s.email = ['benjaminrk@gmail.com']
|
11
11
|
s.description = 'Ruby Kernel for IPython'
|
12
12
|
s.summary = 'A Ruby kernel for IPython frontends (notebook console, etc.)'
|
@@ -18,6 +18,10 @@ Gem::Specification.new do |s|
|
|
18
18
|
s.test_files = s.files.grep(%r{^test/})
|
19
19
|
s.require_paths = %w(lib)
|
20
20
|
|
21
|
+
m = "Consider installing the optional dependencies to get additional functionality:\n"
|
22
|
+
File.read('Gemfile').scan(/gem\s+'(.*?)'/) { m << " * #{$1}\n" }
|
23
|
+
s.post_install_message = m << "\n"
|
24
|
+
|
21
25
|
s.add_development_dependency 'rake'
|
22
26
|
|
23
27
|
s.add_runtime_dependency 'bond'
|
data/lib/iruby.rb
CHANGED
@@ -0,0 +1,38 @@
|
|
1
|
+
module IRuby
|
2
|
+
class PlainBackend
|
3
|
+
def initialize
|
4
|
+
Bond.start(debug: true)
|
5
|
+
end
|
6
|
+
|
7
|
+
def eval(code)
|
8
|
+
TOPLEVEL_BINDING.eval(code)
|
9
|
+
end
|
10
|
+
|
11
|
+
def complete(line, text)
|
12
|
+
Bond.agent.call(line, line)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
class PryBackend
|
17
|
+
def initialize
|
18
|
+
# Monkey patching the Pry bond completer
|
19
|
+
::Pry::BondCompleter.module_eval do
|
20
|
+
def self.call(input, options)
|
21
|
+
Pry.current[:pry] = options[:pry]
|
22
|
+
Bond.agent.call(input, input)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
@pry = Pry.new(output: File.open(File::NULL, 'w'), target: TOPLEVEL_BINDING, commands: Pry.commands)
|
26
|
+
end
|
27
|
+
|
28
|
+
def eval(code)
|
29
|
+
@pry.eval(code)
|
30
|
+
raise @pry.last_exception if @pry.last_result_is_exception?
|
31
|
+
@pry.last_result
|
32
|
+
end
|
33
|
+
|
34
|
+
def complete(line, text)
|
35
|
+
@pry.complete(line)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
data/lib/iruby/command.rb
CHANGED
data/lib/iruby/kernel.rb
CHANGED
@@ -7,8 +7,9 @@ module IRuby
|
|
7
7
|
def initialize(config_file)
|
8
8
|
config = MultiJson.load(File.read(config_file))
|
9
9
|
|
10
|
-
puts 'Starting the kernel'
|
11
|
-
puts config
|
10
|
+
#puts 'Starting the kernel'
|
11
|
+
#puts config
|
12
|
+
#puts 'Use Ctrl-\\ (NOT Ctrl-C!) to terminate.'
|
12
13
|
|
13
14
|
c = ZMQ::Context.new
|
14
15
|
|
@@ -25,15 +26,18 @@ module IRuby
|
|
25
26
|
ZMQ::Device.new(ZMQ::FORWARDER, hb_socket, hb_socket)
|
26
27
|
end
|
27
28
|
|
28
|
-
puts 'Use Ctrl-\\ (NOT Ctrl-C!) to terminate.'
|
29
|
-
|
30
29
|
@session = Session.new('kernel', config['key'], config['signature_scheme'])
|
31
30
|
|
32
31
|
$stdout = OStream.new(@session, @pub_socket, 'stdout')
|
33
32
|
$stderr = OStream.new(@session, @pub_socket, 'stderr')
|
34
33
|
|
35
34
|
@execution_count = 0
|
36
|
-
|
35
|
+
begin
|
36
|
+
require 'pry'
|
37
|
+
@backend = PryBackend.new
|
38
|
+
rescue LoadError
|
39
|
+
@backend = PlainBackend.new
|
40
|
+
end
|
37
41
|
end
|
38
42
|
|
39
43
|
def run
|
@@ -89,34 +93,38 @@ module IRuby
|
|
89
93
|
@execution_count += 1 unless msg[:content].fetch('silent', false)
|
90
94
|
send_status('busy')
|
91
95
|
@session.send(@pub_socket, 'pyin', code: code)
|
92
|
-
|
93
|
-
status: 'ok',
|
94
|
-
payload: [],
|
95
|
-
user_variables: {},
|
96
|
-
user_expressions: {},
|
97
|
-
}
|
96
|
+
|
98
97
|
result = nil
|
99
98
|
begin
|
100
|
-
result =
|
99
|
+
result = @backend.eval(code)
|
101
100
|
rescue Exception => e
|
102
101
|
content = {
|
103
102
|
ename: e.class.to_s,
|
104
103
|
evalue: e.message,
|
105
104
|
etype: e.class.to_s,
|
105
|
+
status: 'error',
|
106
106
|
traceback: ["#{RED}#{e.class}#{RESET}: #{e.message}", *e.backtrace.map { |l| "#{WHITE}#{l}#{RESET}" }],
|
107
|
+
execution_count: @execution_count
|
107
108
|
}
|
108
109
|
@session.send(@pub_socket, 'pyerr', content)
|
109
110
|
end
|
110
|
-
content[:execution_count] = @execution_count
|
111
111
|
|
112
|
+
content = {
|
113
|
+
status: 'ok',
|
114
|
+
payload: [],
|
115
|
+
user_variables: {},
|
116
|
+
user_expressions: {},
|
117
|
+
execution_count: @execution_count
|
118
|
+
}
|
112
119
|
@session.send(@reply_socket, 'execute_reply', content, ident)
|
120
|
+
|
113
121
|
display(result) if result && !msg[:content]['silent']
|
114
122
|
send_status('idle')
|
115
123
|
end
|
116
124
|
|
117
125
|
def complete_request(ident, msg)
|
118
126
|
content = {
|
119
|
-
matches: @
|
127
|
+
matches: @backend.complete(msg[:content]['line'], msg[:content]['text']),
|
120
128
|
status: 'ok',
|
121
129
|
matched_text: msg[:content]['line'],
|
122
130
|
}
|
data/lib/iruby/version.rb
CHANGED
Binary file
|
@@ -9,10 +9,10 @@
|
|
9
9
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
10
10
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
11
11
|
xml:space="preserve"
|
12
|
-
width="1408.
|
13
|
-
height="
|
12
|
+
width="1408.3536"
|
13
|
+
height="150.04994"
|
14
14
|
style="fill-rule:evenodd"
|
15
|
-
viewBox="0 0 1408.
|
15
|
+
viewBox="0 0 1408.3537 150.04844"
|
16
16
|
id="svg2"
|
17
17
|
version="1.1"
|
18
18
|
inkscape:version="0.48.4 r9939"
|
@@ -22,7 +22,7 @@
|
|
22
22
|
inkscape:export-ydpi="39.83239"><metadata
|
23
23
|
id="metadata121"><rdf:RDF><cc:Work
|
24
24
|
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
25
|
-
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title
|
25
|
+
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><sodipodi:namedview
|
26
26
|
pagecolor="#ffffff"
|
27
27
|
bordercolor="#666666"
|
28
28
|
borderopacity="1"
|
@@ -37,9 +37,9 @@
|
|
37
37
|
showgrid="false"
|
38
38
|
showguides="true"
|
39
39
|
inkscape:guide-bbox="true"
|
40
|
-
inkscape:zoom="0.
|
40
|
+
inkscape:zoom="0.5245883"
|
41
41
|
inkscape:cx="822.946"
|
42
|
-
inkscape:cy="63.
|
42
|
+
inkscape:cy="63.61063"
|
43
43
|
inkscape:window-x="0"
|
44
44
|
inkscape:window-y="14"
|
45
45
|
inkscape:window-maximized="0"
|
@@ -550,7 +550,7 @@
|
|
550
550
|
y1="155.10451"
|
551
551
|
x2="135.0152"
|
552
552
|
y2="-2.8092999"
|
553
|
-
gradientTransform="matrix(0.72787016,0,0,0.72787016,0,-
|
553
|
+
gradientTransform="matrix(0.72787016,0,0,0.72787016,0,-7.4312307e-4)" /><linearGradient
|
554
554
|
inkscape:collect="always"
|
555
555
|
xlink:href="#XMLID_26_-2"
|
556
556
|
id="linearGradient6481"
|
@@ -559,7 +559,7 @@
|
|
559
559
|
y1="171.0332"
|
560
560
|
x2="52.817699"
|
561
561
|
y2="159.61659"
|
562
|
-
gradientTransform="matrix(0.72787016,0,0,0.72787016,0,-
|
562
|
+
gradientTransform="matrix(0.72787016,0,0,0.72787016,0,-7.4312307e-4)" /><linearGradient
|
563
563
|
inkscape:collect="always"
|
564
564
|
xlink:href="#XMLID_27_-1"
|
565
565
|
id="linearGradient6483"
|
@@ -568,7 +568,7 @@
|
|
568
568
|
y1="115.5146"
|
569
569
|
x2="137.43269"
|
570
570
|
y2="78.683998"
|
571
|
-
gradientTransform="matrix(0.72787016,0,0,0.72787016,0,-
|
571
|
+
gradientTransform="matrix(0.72787016,0,0,0.72787016,0,-7.4312307e-4)" /><linearGradient
|
572
572
|
inkscape:collect="always"
|
573
573
|
xlink:href="#XMLID_28_-1"
|
574
574
|
id="linearGradient6485"
|
@@ -577,7 +577,7 @@
|
|
577
577
|
y1="47.937"
|
578
578
|
x2="173.15421"
|
579
579
|
y2="26.053801"
|
580
|
-
gradientTransform="matrix(0.72787016,0,0,0.72787016,0,-
|
580
|
+
gradientTransform="matrix(0.72787016,0,0,0.72787016,0,-7.4312307e-4)" /><radialGradient
|
581
581
|
inkscape:collect="always"
|
582
582
|
xlink:href="#XMLID_29_-4"
|
583
583
|
id="radialGradient6487"
|
@@ -585,7 +585,7 @@
|
|
585
585
|
cx="143.8315"
|
586
586
|
cy="79.388199"
|
587
587
|
r="50.357601"
|
588
|
-
gradientTransform="matrix(0.72787016,0,0,0.72787016,0,-
|
588
|
+
gradientTransform="matrix(0.72787016,0,0,0.72787016,0,-7.4312307e-4)" /><radialGradient
|
589
589
|
inkscape:collect="always"
|
590
590
|
xlink:href="#XMLID_30_-6"
|
591
591
|
id="radialGradient6489"
|
@@ -593,7 +593,7 @@
|
|
593
593
|
cx="74.0923"
|
594
594
|
cy="145.75101"
|
595
595
|
r="66.943703"
|
596
|
-
gradientTransform="matrix(0.72787016,0,0,0.72787016,0,-
|
596
|
+
gradientTransform="matrix(0.72787016,0,0,0.72787016,0,-7.4312307e-4)" /><linearGradient
|
597
597
|
inkscape:collect="always"
|
598
598
|
xlink:href="#XMLID_31_-6"
|
599
599
|
id="linearGradient6491"
|
@@ -602,7 +602,7 @@
|
|
602
602
|
y1="197.33591"
|
603
603
|
x2="9.9886999"
|
604
604
|
y2="140.742"
|
605
|
-
gradientTransform="matrix(0.72787016,0,0,0.72787016,0,-
|
605
|
+
gradientTransform="matrix(0.72787016,0,0,0.72787016,0,-7.4312307e-4)" /><linearGradient
|
606
606
|
inkscape:collect="always"
|
607
607
|
xlink:href="#XMLID_32_-0"
|
608
608
|
id="linearGradient6493"
|
@@ -611,7 +611,7 @@
|
|
611
611
|
y1="9.7979002"
|
612
612
|
x2="192.039"
|
613
613
|
y2="26.305901"
|
614
|
-
gradientTransform="matrix(0.72787016,0,0,0.72787016,0,-
|
614
|
+
gradientTransform="matrix(0.72787016,0,0,0.72787016,0,-7.4312307e-4)" /><linearGradient
|
615
615
|
inkscape:collect="always"
|
616
616
|
xlink:href="#XMLID_18_-7"
|
617
617
|
id="linearGradient6495"
|
@@ -671,98 +671,98 @@
|
|
671
671
|
style="font-size:150px;font-weight:normal;fill:#000000;font-family:Droid Sans Mono"
|
672
672
|
id="text109"
|
673
673
|
class="fil2 fnt2"
|
674
|
-
y="
|
674
|
+
y="118.84803"
|
675
675
|
x="179.64279">IRuby: <tspan
|
676
676
|
style="fill:#800000"
|
677
677
|
id="tspan6534">Notebook</tspan></text>
|
678
678
|
<polygon
|
679
679
|
style="fill:url(#linearGradient6236);fill-rule:evenodd"
|
680
680
|
clip-rule="evenodd"
|
681
|
-
points="198.13,39.95 153.5,130.41
|
681
|
+
points="40.38,197.58 186.849,187.641 198.13,39.95 153.5,130.41 "
|
682
682
|
id="polygon3282"
|
683
|
-
transform="matrix(0.72787016,0,0,0.72787016,0,-
|
683
|
+
transform="matrix(0.72787016,0,0,0.72787016,0,-7.4312307e-4)" /><polygon
|
684
684
|
style="fill:url(#linearGradient6495);fill-rule:evenodd"
|
685
685
|
clip-rule="evenodd"
|
686
|
-
points="
|
686
|
+
points="140.209,145.93 187.089,187.54 174.5,100.65 "
|
687
687
|
id="polygon3293"
|
688
|
-
transform="matrix(0.72787016,0,0,0.72787016,0,-
|
688
|
+
transform="matrix(0.72787016,0,0,0.72787016,0,-7.4312307e-4)" /><polygon
|
689
689
|
style="fill:url(#linearGradient6497);fill-rule:evenodd"
|
690
690
|
clip-rule="evenodd"
|
691
|
-
points="
|
691
|
+
points="40.87,197.391 187.259,187.54 95.03,180.3 "
|
692
692
|
id="polygon3304"
|
693
|
-
transform="matrix(0.72787016,0,0,0.72787016,0,-
|
693
|
+
transform="matrix(0.72787016,0,0,0.72787016,0,-7.4312307e-4)" /><polygon
|
694
694
|
style="fill:url(#linearGradient6499);fill-rule:evenodd"
|
695
695
|
clip-rule="evenodd"
|
696
|
-
points="
|
696
|
+
points="13.34,132.771 41,197.41 64.04,121.93 "
|
697
697
|
id="polygon3319"
|
698
|
-
transform="matrix(0.72787016,0,0,0.72787016,0,-
|
698
|
+
transform="matrix(0.72787016,0,0,0.72787016,0,-7.4312307e-4)" /><polygon
|
699
699
|
style="fill:url(#linearGradient6501);fill-rule:evenodd"
|
700
700
|
clip-rule="evenodd"
|
701
|
-
points="
|
701
|
+
points="58.33,120.01 140.2,146.18 119,63.14 "
|
702
702
|
id="polygon3334"
|
703
|
-
transform="matrix(0.72787016,0,0,0.72787016,0,-
|
703
|
+
transform="matrix(0.72787016,0,0,0.72787016,0,-7.4312307e-4)" /><polygon
|
704
704
|
style="fill:url(#linearGradient6503);fill-rule:evenodd"
|
705
705
|
clip-rule="evenodd"
|
706
|
-
points="
|
706
|
+
points="120,69.1 193.32,64.31 135.97,17.47 "
|
707
707
|
id="polygon3349"
|
708
|
-
transform="matrix(0.72787016,0,0,0.72787016,0,-
|
708
|
+
transform="matrix(0.72787016,0,0,0.72787016,0,-7.4312307e-4)" /><polygon
|
709
709
|
style="fill:url(#linearGradient6505);fill-rule:evenodd"
|
710
710
|
clip-rule="evenodd"
|
711
|
-
points="
|
711
|
+
points="111.49,0.52 166.5,0.77 132.77,19.41 "
|
712
712
|
id="polygon3362"
|
713
|
-
transform="matrix(0.72787016,0,0,0.72787016,0,-
|
713
|
+
transform="matrix(0.72787016,0,0,0.72787016,0,-7.4312307e-4)" /><polygon
|
714
714
|
style="fill:url(#linearGradient6507);fill-rule:evenodd"
|
715
715
|
clip-rule="evenodd"
|
716
|
-
points="
|
716
|
+
points="2.7,101.62 0,158.09 14.13,132.32 "
|
717
717
|
id="polygon3375"
|
718
|
-
transform="matrix(0.72787016,0,0,0.72787016,0,-
|
718
|
+
transform="matrix(0.72787016,0,0,0.72787016,0,-7.4312307e-4)" /><path
|
719
719
|
style="fill:#ffffff;fill-rule:evenodd"
|
720
720
|
inkscape:connector-curvature="0"
|
721
721
|
clip-rule="evenodd"
|
722
|
-
d="M 1.41207,73.
|
722
|
+
d="M 1.41207,73.259384 9.78257,97.002516 46.15425,88.842356 87.67923,50.250686 99.39795,13.028137 80.94572,-7.4312307e-4 49.57451,11.739798 c -9.88375,9.193 -29.06313,27.382481 -29.7546,27.724581 -0.6842,0.34938 -12.66495,22.993412 -18.40784,33.795005 z"
|
723
723
|
id="path3377" /><path
|
724
724
|
style="fill:url(#linearGradient6479);fill-rule:evenodd"
|
725
725
|
inkscape:connector-curvature="0"
|
726
726
|
clip-rule="evenodd"
|
727
|
-
d="M 30.80346,30.
|
727
|
+
d="M 30.80346,30.606202 C 52.22469,9.3669409 79.84008,-3.1815357 90.43786,7.5108789 101.02911,18.203295 89.79734,44.188259 68.37612,65.42023 46.95491,86.652196 19.68161,99.892156 9.0911,89.199736 -1.50669,78.514606 9.38224,51.838172 30.80346,30.606202 z"
|
728
728
|
id="path3400" /><path
|
729
729
|
style="fill:url(#linearGradient6481);fill-rule:evenodd"
|
730
730
|
inkscape:connector-curvature="0"
|
731
731
|
clip-rule="evenodd"
|
732
|
-
d="
|
732
|
+
d="M 29.84268,143.66628 46.48178,88.551946 101.74169,106.3047 C 81.76166,125.04007 59.53978,140.87853 29.84268,143.66628 z"
|
733
733
|
id="path3413" /><path
|
734
734
|
style="fill:url(#linearGradient6483);fill-rule:evenodd"
|
735
735
|
inkscape:connector-curvature="0"
|
736
736
|
clip-rule="evenodd"
|
737
|
-
d="m 87.75203,50.
|
737
|
+
d="m 87.75203,50.142226 14.18618,56.191584 c 16.69007,-17.548954 31.66963,-36.415346 39.00584,-59.750858 l -53.19202,3.559274 z"
|
738
738
|
id="path3424" /><path
|
739
739
|
style="fill:url(#linearGradient6485);fill-rule:evenodd"
|
740
740
|
inkscape:connector-curvature="0"
|
741
741
|
clip-rule="evenodd"
|
742
|
-
d="M 140.7992,46.
|
742
|
+
d="M 140.7992,46.866813 C 146.47659,29.732748 147.78676,5.1525789 121.01496,0.58882588 L 99.04784,12.722429 140.7992,46.866813 z"
|
743
743
|
id="path3435" /><path
|
744
744
|
style="fill:#9e1209;fill-rule:evenodd"
|
745
745
|
inkscape:connector-curvature="0"
|
746
746
|
clip-rule="evenodd"
|
747
|
-
d="m 0,114.
|
747
|
+
d="m 0,114.82077 c 0.7861,28.27849 21.1883,28.69992 29.87907,28.94813 L 9.80442,96.886046 0,114.82077 z"
|
748
748
|
id="path3437" /><path
|
749
749
|
style="fill:url(#radialGradient6487);fill-rule:evenodd"
|
750
750
|
inkscape:connector-curvature="0"
|
751
751
|
clip-rule="evenodd"
|
752
|
-
d="m 87.83136,50.
|
752
|
+
d="m 87.83136,50.22958 c 12.82508,7.882825 38.67248,23.714005 39.19654,24.005157 0.81449,0.458556 11.14369,-17.417938 13.48744,-27.520772 L 87.83136,50.22958 z"
|
753
753
|
id="path3448" /><path
|
754
754
|
style="fill:url(#radialGradient6489);fill-rule:evenodd"
|
755
755
|
inkscape:connector-curvature="0"
|
756
756
|
clip-rule="evenodd"
|
757
|
-
d="m 46.45995,88.
|
757
|
+
d="m 46.45995,88.551946 22.24371,42.915224 c 13.15262,-7.13313 23.45198,-15.82391 32.88517,-25.13336 L 46.45995,88.551946 z"
|
758
758
|
id="path3459" /><path
|
759
759
|
style="fill:url(#linearGradient6491);fill-rule:evenodd"
|
760
760
|
inkscape:connector-curvature="0"
|
761
761
|
clip-rule="evenodd"
|
762
|
-
d="M 9.71706,96.
|
762
|
+
d="M 9.71706,96.944286 6.56538,134.47328 c 5.9467,8.12302 14.12797,8.82906 22.70955,8.19581 C 23.06621,127.2164 10.6633,96.318316 9.71706,96.944286 z"
|
763
763
|
id="path3472" /><path
|
764
764
|
style="fill:url(#linearGradient6493);fill-rule:evenodd"
|
765
765
|
inkscape:connector-curvature="0"
|
766
766
|
clip-rule="evenodd"
|
767
|
-
d="m 98.91756,12.
|
767
|
+
d="m 98.91756,12.817049 44.18899,6.20146 C 140.74825,9.0248519 133.50594,2.5759119 121.16126,0.55971188 L 98.91756,12.817049 z"
|
768
768
|
id="path3485" /></svg>
|
metadata
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: iruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Damián Silvani
|
8
8
|
- Min RK
|
9
|
-
-
|
9
|
+
- Martin Sarsale
|
10
10
|
- Josh Adams
|
11
11
|
- Daniel Mendler
|
12
12
|
autorequire:
|
@@ -79,20 +79,18 @@ extensions: []
|
|
79
79
|
extra_rdoc_files: []
|
80
80
|
files:
|
81
81
|
- .gitignore
|
82
|
+
- CHANGES
|
83
|
+
- CONTRIBUTORS
|
82
84
|
- Gemfile
|
83
85
|
- LICENSE
|
84
86
|
- README.md
|
85
87
|
- Rakefile
|
86
88
|
- Ruby Notebook.ipynb
|
87
|
-
- attic/output/html.rb
|
88
|
-
- attic/test/helper.rb
|
89
|
-
- attic/test/html_test.rb
|
90
|
-
- attic/test/output_maps_test.rb
|
91
89
|
- bin/iruby
|
92
90
|
- iruby.gemspec
|
93
91
|
- lib/iruby.rb
|
92
|
+
- lib/iruby/backend.rb
|
94
93
|
- lib/iruby/command.rb
|
95
|
-
- lib/iruby/completer.rb
|
96
94
|
- lib/iruby/kernel.rb
|
97
95
|
- lib/iruby/ostream.rb
|
98
96
|
- lib/iruby/session.rb
|
@@ -107,7 +105,16 @@ homepage: https://github.com/minad/iruby
|
|
107
105
|
licenses:
|
108
106
|
- MIT
|
109
107
|
metadata: {}
|
110
|
-
post_install_message:
|
108
|
+
post_install_message: |+
|
109
|
+
Consider installing the optional dependencies to get additional functionality:
|
110
|
+
* pry
|
111
|
+
* pry-doc
|
112
|
+
* pry-theme
|
113
|
+
* pry-syntax-hacks
|
114
|
+
* pry-git
|
115
|
+
* awesome_print
|
116
|
+
* hirb
|
117
|
+
|
111
118
|
rdoc_options: []
|
112
119
|
require_paths:
|
113
120
|
- lib
|
@@ -123,7 +130,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
123
130
|
version: '0'
|
124
131
|
requirements: []
|
125
132
|
rubyforge_project:
|
126
|
-
rubygems_version: 2.0.
|
133
|
+
rubygems_version: 2.0.0
|
127
134
|
signing_key:
|
128
135
|
specification_version: 4
|
129
136
|
summary: A Ruby kernel for IPython frontends (notebook console, etc.)
|
data/attic/output/html.rb
DELETED
@@ -1,217 +0,0 @@
|
|
1
|
-
module IRuby
|
2
|
-
module Output
|
3
|
-
module HTML
|
4
|
-
def self.table(data)
|
5
|
-
#
|
6
|
-
# data = {a: 1, b:2}
|
7
|
-
|
8
|
-
if data.respond_to?(:keys)
|
9
|
-
d = data
|
10
|
-
else
|
11
|
-
d = data
|
12
|
-
end
|
13
|
-
|
14
|
-
r = "<table>"
|
15
|
-
if d.respond_to?(:keys) # hash
|
16
|
-
columns = [0,1]
|
17
|
-
elsif d.first.respond_to?(:keys) # array of hashes
|
18
|
-
columns = d.first.keys
|
19
|
-
r << "<tr>#{columns.map{|c| "<th>#{c.to_s}</th>"}.join}</tr>"
|
20
|
-
else # array
|
21
|
-
columns = (0 .. d.first.length)
|
22
|
-
end
|
23
|
-
d.each{|row|
|
24
|
-
r << "<tr>"
|
25
|
-
columns.each{|column|
|
26
|
-
r << "<td>#{row[column].to_s}</td>"
|
27
|
-
}
|
28
|
-
r << "</tr>"
|
29
|
-
}
|
30
|
-
r << "</table>"
|
31
|
-
r
|
32
|
-
end
|
33
|
-
|
34
|
-
def self.image(image)
|
35
|
-
data = image.respond_to?(:to_blob) ? image.to_blob : image
|
36
|
-
"<img src='data:image/png;base64,#{Base64.encode64(data)}'>"
|
37
|
-
end
|
38
|
-
|
39
|
-
def self.chart_pie(o)
|
40
|
-
data=o.delete(:data)
|
41
|
-
title=o.delete(:title)
|
42
|
-
size=o.delete(:size) || 300
|
43
|
-
g = Gruff::Pie.new(size)
|
44
|
-
g.title = title if title
|
45
|
-
data.each do |data|
|
46
|
-
label = data[0].strip
|
47
|
-
label = "?" if label == ''
|
48
|
-
g.data(label, data[1])
|
49
|
-
end
|
50
|
-
image(g.to_blob)
|
51
|
-
end
|
52
|
-
|
53
|
-
def self.chart_bar(o)
|
54
|
-
data=o.delete(:data)
|
55
|
-
title=o.delete(:title)
|
56
|
-
size=o.delete(:size) || 300
|
57
|
-
|
58
|
-
klass = o.delete(:stacked) ? Gruff::StackedBar : Gruff::Bar
|
59
|
-
g = klass.new(size)
|
60
|
-
|
61
|
-
if labels=o.delete(:labels)
|
62
|
-
if ! labels.respond_to?(:keys)
|
63
|
-
labels = Hash[labels.map.with_index{|v,k| [k,v]}]
|
64
|
-
end
|
65
|
-
g.labels = labels
|
66
|
-
end
|
67
|
-
|
68
|
-
g.title = title if title
|
69
|
-
data.each do |data|
|
70
|
-
g.data(data[0], data[1])
|
71
|
-
end
|
72
|
-
image(g.to_blob)
|
73
|
-
|
74
|
-
end
|
75
|
-
|
76
|
-
module Gmaps
|
77
|
-
def self.points2latlng(points)
|
78
|
-
"[" + points.reject{|p| not p.lat or not p.lon}.map{|p|
|
79
|
-
icon_url = nil
|
80
|
-
icon_url = p.icon_url if p.respond_to?(:icon_url)
|
81
|
-
icon_url = "http://www.google.com/intl/en_us/mapfiles/ms/micons/#{p.icon}-dot.png"if p.respond_to?(:icon)
|
82
|
-
"{" + [
|
83
|
-
"location: new google.maps.LatLng(#{p.lat.to_f}, #{p.lon.to_f})",
|
84
|
-
p.respond_to?(:weight) && p.weight && "weight: #{p.weight.to_i} ",
|
85
|
-
p.respond_to?(:label) && "label: #{p.label.to_s.to_json}",
|
86
|
-
p.respond_to?(:z_index) && "z_index: #{p.z_index.to_json}",
|
87
|
-
icon_url && "icon_url: #{icon_url.to_json}",
|
88
|
-
].reject{|x| ! x}
|
89
|
-
.join(",") + "}"
|
90
|
-
}.join(',') + "]"
|
91
|
-
end
|
92
|
-
def self.base_map(o)
|
93
|
-
zoom = o.delete(:zoom)
|
94
|
-
center = o.delete(:center)
|
95
|
-
map_type = o.delete(:map_type)
|
96
|
-
width = o.delete(:width) || "500px"
|
97
|
-
height = o.delete(:height) || "500px"
|
98
|
-
r = <<E
|
99
|
-
<div id='map-canvas' style='width: #{width}; height: #{height};'></div>
|
100
|
-
<script src="https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false&libraries=visualization&callback=initialize"></script>
|
101
|
-
|
102
|
-
<script>
|
103
|
-
function initialize() {
|
104
|
-
var latlngbounds = new google.maps.LatLngBounds();
|
105
|
-
var zoom = #{zoom.to_json};
|
106
|
-
var center = #{center.to_json};
|
107
|
-
var map_type = #{map_type.to_json} || google.maps.MapTypeId.SATELLITE;
|
108
|
-
|
109
|
-
var mapOptions = {
|
110
|
-
mapTypeId: map_type
|
111
|
-
};
|
112
|
-
|
113
|
-
if (zoom){
|
114
|
-
mapOptions.zoom = zoom
|
115
|
-
}
|
116
|
-
if (center){
|
117
|
-
mapOptions.center = new google.maps.LatLng(center.lat, center.lon)
|
118
|
-
}
|
119
|
-
|
120
|
-
map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions);
|
121
|
-
|
122
|
-
#{yield}
|
123
|
-
}
|
124
|
-
</script>
|
125
|
-
E
|
126
|
-
r
|
127
|
-
|
128
|
-
end
|
129
|
-
def self.heatmap(o)
|
130
|
-
data = o.delete(:points)
|
131
|
-
points = points2latlng(data)
|
132
|
-
radius = o.delete(:radius)
|
133
|
-
raise "Missing :points parameter" if not data
|
134
|
-
base_map(o){<<E
|
135
|
-
var points = #{points};
|
136
|
-
if (! zoom){
|
137
|
-
for (var i = 0; i < points.length; i++) {
|
138
|
-
latlngbounds.extend(points[i].location);
|
139
|
-
}
|
140
|
-
map.fitBounds(latlngbounds);
|
141
|
-
}
|
142
|
-
|
143
|
-
|
144
|
-
var pointArray = new google.maps.MVCArray(points);
|
145
|
-
|
146
|
-
heatmap = new google.maps.visualization.HeatmapLayer({
|
147
|
-
radius: #{radius.to_json} || 10,
|
148
|
-
data: pointArray
|
149
|
-
});
|
150
|
-
|
151
|
-
heatmap.setMap(map);
|
152
|
-
E
|
153
|
-
}
|
154
|
-
|
155
|
-
end
|
156
|
-
def self.markers(o)
|
157
|
-
data = o.delete(:points)
|
158
|
-
points = points2latlng(data)
|
159
|
-
radius = o.delete(:radius)
|
160
|
-
raise "Missing :points parameter" if not data
|
161
|
-
base_map(o){<<E
|
162
|
-
var points = #{points};
|
163
|
-
if (! zoom){
|
164
|
-
for (var i = 0; i < points.length; i++) {
|
165
|
-
latlngbounds.extend(points[i].location);
|
166
|
-
}
|
167
|
-
map.fitBounds(latlngbounds);
|
168
|
-
}
|
169
|
-
|
170
|
-
for (var i=0; i<points.length; i++){
|
171
|
-
var marker = new google.maps.Marker({
|
172
|
-
position: points[i].location,
|
173
|
-
map: map,
|
174
|
-
icon: points[i].icon_url,
|
175
|
-
zIndex: points[i].z_index,
|
176
|
-
title: points[i].label
|
177
|
-
});
|
178
|
-
}
|
179
|
-
|
180
|
-
E
|
181
|
-
}
|
182
|
-
|
183
|
-
end
|
184
|
-
end
|
185
|
-
#stolen from https://github.com/Bantik/heatmap/blob/master/lib/heatmap.rb
|
186
|
-
module WordCloud
|
187
|
-
|
188
|
-
def self.wordcloud(histogram={})
|
189
|
-
html = %{<div class="wordcloud">}
|
190
|
-
histogram.keys.sort{|a,b| histogram[a] <=> histogram[b]}.reverse.each do |k|
|
191
|
-
next if histogram[k] < 1
|
192
|
-
_max = histogram_max(histogram) * 2
|
193
|
-
_size = element_size(histogram, k)
|
194
|
-
_heat = element_heat(histogram[k], _max)
|
195
|
-
html << %{
|
196
|
-
<span class="wordcloud_element" style="color: ##{_heat}#{_heat}#{_heat}; font-size: #{_size}px;">#{k}</span>
|
197
|
-
}
|
198
|
-
end
|
199
|
-
html << %{<br style="clear: both;" /></div>}
|
200
|
-
end
|
201
|
-
|
202
|
-
def self.histogram_max(histogram)
|
203
|
-
histogram.map{|k,v| histogram[k]}.max
|
204
|
-
end
|
205
|
-
|
206
|
-
def self.element_size(histogram, key)
|
207
|
-
(((histogram[key] / histogram.map{|k,v| histogram[k]}.reduce(&:+).to_f) * 100) + 5).to_i
|
208
|
-
end
|
209
|
-
|
210
|
-
def self.element_heat(val, max)
|
211
|
-
sprintf("%02x" % (200 - ((200.0 / max) * val)))
|
212
|
-
end
|
213
|
-
|
214
|
-
end
|
215
|
-
end
|
216
|
-
end
|
217
|
-
end
|
data/attic/test/helper.rb
DELETED
data/attic/test/html_test.rb
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
require 'helper'
|
2
|
-
|
3
|
-
class TestHTML < Minitest::Unit::TestCase
|
4
|
-
def test_table
|
5
|
-
hash = {a: 1, b:2}
|
6
|
-
expected = '<table><tr><td>a</td><td>1</td></tr><tr><td>b</td><td>2</td></tr></table>'
|
7
|
-
assert_equal expected.strip, IRuby::Output::HTML.table(hash).strip
|
8
|
-
|
9
|
-
hash = [{a: 1, b:2}, {a: 2, b:4}]
|
10
|
-
expected = '<table><tr><th>a</th><th>b</th></tr><tr><td>1</td><td>2</td></tr><tr><td>2</td><td>4</td></tr></table>'
|
11
|
-
assert_equal expected.strip, IRuby::Output::HTML.table(hash).strip
|
12
|
-
|
13
|
-
array = [[1,2],[2,4]]
|
14
|
-
expected = '<table><tr><td>1</td><td>2</td><td></td></tr><tr><td>2</td><td>4</td><td></td></tr></table>'
|
15
|
-
assert_equal expected.strip, IRuby::Output::HTML.table(array).strip
|
16
|
-
end
|
17
|
-
end
|
@@ -1,110 +0,0 @@
|
|
1
|
-
require 'helper'
|
2
|
-
|
3
|
-
class TestOutputMaps < Minitest::Unit::TestCase
|
4
|
-
def test_heatmap
|
5
|
-
points=[
|
6
|
-
OpenStruct.new({lat: 33.1, lon: 34.1}),
|
7
|
-
OpenStruct.new({lat: 33.2, lon: 34.2}),
|
8
|
-
OpenStruct.new({lat: 33.3, lon: 34.3}),
|
9
|
-
]
|
10
|
-
expected = <<Z
|
11
|
-
<div id='map-canvas' style='width: 500px; height: 500px;'></div>
|
12
|
-
<script src=\"https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false&libraries=visualization&callback=initialize\"></script>
|
13
|
-
|
14
|
-
<script>
|
15
|
-
function initialize() {
|
16
|
-
var latlngbounds = new google.maps.LatLngBounds();
|
17
|
-
var zoom = null;
|
18
|
-
var center = null;
|
19
|
-
var map_type = null || google.maps.MapTypeId.SATELLITE;
|
20
|
-
|
21
|
-
var mapOptions = {
|
22
|
-
mapTypeId: map_type
|
23
|
-
};
|
24
|
-
|
25
|
-
if (zoom){
|
26
|
-
mapOptions.zoom = zoom
|
27
|
-
}
|
28
|
-
if (center){
|
29
|
-
mapOptions.center = new google.maps.LatLng(center.lat, center.lon)
|
30
|
-
}
|
31
|
-
|
32
|
-
map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions);
|
33
|
-
|
34
|
-
var points = [{location: new google.maps.LatLng(33.1, 34.1)},{location: new google.maps.LatLng(33.2, 34.2)},{location: new google.maps.LatLng(33.3, 34.3)}];
|
35
|
-
if (! zoom){
|
36
|
-
for (var i = 0; i < points.length; i++) {
|
37
|
-
latlngbounds.extend(points[i].location);
|
38
|
-
}
|
39
|
-
map.fitBounds(latlngbounds);
|
40
|
-
}
|
41
|
-
|
42
|
-
|
43
|
-
var pointArray = new google.maps.MVCArray(points);
|
44
|
-
|
45
|
-
heatmap = new google.maps.visualization.HeatmapLayer({
|
46
|
-
radius: null || 10,
|
47
|
-
data: pointArray
|
48
|
-
});
|
49
|
-
|
50
|
-
heatmap.setMap(map);
|
51
|
-
|
52
|
-
}
|
53
|
-
</script>
|
54
|
-
Z
|
55
|
-
assert_equal expected.strip, IRuby::Output::HTML::Gmaps.heatmap(points: points).strip
|
56
|
-
end
|
57
|
-
def test_markers
|
58
|
-
points=[
|
59
|
-
OpenStruct.new({lat: 33.1, lon: 34.1, label: "f1"}),
|
60
|
-
OpenStruct.new({lat: 33.2, lon: 34.2, label: "f2"}),
|
61
|
-
OpenStruct.new({lat: 33.3, lon: 34.3, label: "f3"}),
|
62
|
-
]
|
63
|
-
expected = <<Z
|
64
|
-
<div id='map-canvas' style='width: 500px; height: 500px;'></div>
|
65
|
-
<script src=\"https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false&libraries=visualization&callback=initialize\"></script>
|
66
|
-
|
67
|
-
<script>
|
68
|
-
function initialize() {
|
69
|
-
var latlngbounds = new google.maps.LatLngBounds();
|
70
|
-
var zoom = null;
|
71
|
-
var center = null;
|
72
|
-
var map_type = null || google.maps.MapTypeId.SATELLITE;
|
73
|
-
|
74
|
-
var mapOptions = {
|
75
|
-
mapTypeId: map_type
|
76
|
-
};
|
77
|
-
|
78
|
-
if (zoom){
|
79
|
-
mapOptions.zoom = zoom
|
80
|
-
}
|
81
|
-
if (center){
|
82
|
-
mapOptions.center = new google.maps.LatLng(center.lat, center.lon)
|
83
|
-
}
|
84
|
-
|
85
|
-
map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions);
|
86
|
-
|
87
|
-
var points = [{location: new google.maps.LatLng(33.1, 34.1),label: "f1"},{location: new google.maps.LatLng(33.2, 34.2),label: "f2"},{location: new google.maps.LatLng(33.3, 34.3),label: "f3"} ];
|
88
|
-
if (! zoom){
|
89
|
-
for (var i = 0; i < points.length; i++) {
|
90
|
-
latlngbounds.extend(points[i].location);
|
91
|
-
}
|
92
|
-
map.fitBounds(latlngbounds);
|
93
|
-
}
|
94
|
-
|
95
|
-
for (var i=0; i<points.length; i++){
|
96
|
-
var marker = new google.maps.Marker({
|
97
|
-
position: points[i].location,
|
98
|
-
map: map,
|
99
|
-
title: points[i].label
|
100
|
-
});
|
101
|
-
}
|
102
|
-
|
103
|
-
|
104
|
-
}
|
105
|
-
</script>
|
106
|
-
Z
|
107
|
-
assert_equal expected.strip, IRuby::Output::HTML::Gmaps.markers(points: points).strip
|
108
|
-
end
|
109
|
-
|
110
|
-
end
|
data/lib/iruby/completer.rb
DELETED
@@ -1,19 +0,0 @@
|
|
1
|
-
module IRuby
|
2
|
-
class Completer
|
3
|
-
module Readline
|
4
|
-
class<< self
|
5
|
-
attr_accessor :line_buffer
|
6
|
-
def setup(arg); end
|
7
|
-
end
|
8
|
-
end
|
9
|
-
|
10
|
-
def initialize
|
11
|
-
Bond.start(readline: Readline, debug: true)
|
12
|
-
end
|
13
|
-
|
14
|
-
def complete(line, text)
|
15
|
-
Readline.line_buffer = line
|
16
|
-
Bond.agent.call(line)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|