hubris 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +31 -0
- data/.rvmrc +2 -0
- data/Gemfile +11 -0
- data/Haskell/Hubrify.hs +69 -0
- data/Haskell/LICENSE +22 -0
- data/Haskell/Language/Ruby/Foo.hs +20 -0
- data/Haskell/Language/Ruby/Hubris/Binding.hsc +214 -0
- data/Haskell/Language/Ruby/Hubris/GHCBuild.hs +46 -0
- data/Haskell/Language/Ruby/Hubris/Hash.hs +27 -0
- data/Haskell/Language/Ruby/Hubris/Interpolator.hs +22 -0
- data/Haskell/Language/Ruby/Hubris/LibraryBuilder.hs +181 -0
- data/Haskell/Language/Ruby/Hubris/ZCode.hs +68 -0
- data/Haskell/Language/Ruby/Hubris.hs +254 -0
- data/Haskell/Language/Ruby/Wrappers.hs +32 -0
- data/Haskell/Language/Ruby/testLib.hs +9 -0
- data/Haskell/Setup.hs +31 -0
- data/Haskell/cbits/rshim.c +46 -0
- data/Haskell/cbits/rshim.h +50 -0
- data/Haskell/hubris.cabal +53 -0
- data/INSTALL +21 -0
- data/Manifest.txt +22 -0
- data/PostInstall.txt +1 -0
- data/README.markdown +107 -0
- data/Rakefile +46 -43
- data/VERSION +1 -0
- data/doc/CommonErrors.txt +18 -0
- data/doc/CommonErrors.txt~HEAD +18 -0
- data/doc/don_feedback.txt +25 -0
- data/doc/haskell-hubris.tex +242 -0
- data/doc/new_interface.rb +74 -0
- data/doc/ruby-hubris.tex +176 -0
- data/doc/wisdom_of_ancients.txt +55 -0
- data/ext/hubris.rb +4 -0
- data/ext/stub/extconf.rb +5 -0
- data/ext/{HubrisStubLoader.c → stub/stub.c} +1 -1
- data/hubris.gemspec +31 -0
- data/lib/Makefile +181 -0
- data/lib/hubris/version.rb +3 -0
- data/lib/hubris.rb +16 -13
- data/rspec.rake +21 -0
- data/sample/Fibonacci.hs +2 -2
- data/sample/config.ru +3 -1
- data/script/ci.sh +25 -0
- data/script/console +10 -0
- data/spec/hubris_spec.rb +173 -47
- data/tasks/extconf/stub.rake +43 -0
- data/tasks/extconf.rake +13 -0
- metadata +118 -27
- data/ext/extconf.rb +0 -5
data/spec/hubris_spec.rb
CHANGED
@@ -1,27 +1,13 @@
|
|
1
1
|
# encoding: ASCII-8BIT
|
2
2
|
load File.dirname(__FILE__) + '/spec_helper.rb'
|
3
3
|
require "hubris"
|
4
|
-
Hubris.add_packages %w(base)
|
5
|
-
|
6
|
-
# # just want to check it's actually possible to load a library dynamically
|
7
|
-
# describe "dlload" do
|
8
|
-
# it "actually builds and loads a C level dylib stupidly" do
|
9
|
-
# system "cd sample; make"
|
10
|
-
# `cd sample; ruby hsload.rb`.chomp.should eql("144")
|
11
|
-
# end
|
12
|
-
# end
|
13
|
-
|
14
|
-
class Target
|
15
|
-
def foo_local
|
16
|
-
14
|
17
|
-
end
|
18
|
-
end
|
4
|
+
Hubris.add_packages %w(base bytestring)
|
19
5
|
|
20
6
|
Signal.trap("INT", 'EXIT');
|
21
7
|
|
22
|
-
describe "Target" do
|
8
|
+
describe "Target" do
|
23
9
|
it "whines like a little baby when you pass it bad haskell" do
|
24
|
-
lambda{ class Foo; hubris :inline => "broken
|
10
|
+
lambda{ class Foo; hubris :inline => "broken = (1 + \"a string\")"; end}.should raise_error(HaskellError)
|
25
11
|
end
|
26
12
|
|
27
13
|
it "ignores a comment" do
|
@@ -34,13 +20,21 @@ foo False = True"; end
|
|
34
20
|
}.should_not raise_error
|
35
21
|
end
|
36
22
|
|
37
|
-
it "
|
38
|
-
|
39
|
-
# lambda { t.inline("working _ = T_FIXNUM (1+2)", { :no_strict => true }) }.should_not raise_error
|
40
|
-
lambda { class Foo; hubris :inline => "working :: Integer -> Integer; working a = 2*a"; end}.should_not raise_error
|
23
|
+
it "doesn't get fussy about non-exportable stuff" do
|
24
|
+
lambda { class Empty; hubris :inline => "data Foo=Foo; fooerator :: Foo->Foo; fooerator Foo = Foo";end }.should_not raise_error
|
41
25
|
end
|
42
|
-
|
43
|
-
|
26
|
+
|
27
|
+
it "handles booleans" do
|
28
|
+
class Bar
|
29
|
+
hubris :inline => "my_negate True = False;my_negate False = True", :no_strict => true
|
30
|
+
end
|
31
|
+
t = Bar.new
|
32
|
+
# puts t.methods
|
33
|
+
t.my_negate(false).should eql(true)
|
34
|
+
t.my_negate(true).should eql(false)
|
35
|
+
lambda{ t.my_negate("Banana")}.should raise_error
|
36
|
+
end
|
37
|
+
end
|
44
38
|
# it "handles booleans" do
|
45
39
|
# class Bar
|
46
40
|
# hubris :inline => "my_negate True = False;my_negate False = True", :no_strict => true
|
@@ -51,13 +45,16 @@ foo False = True"; end
|
|
51
45
|
# t.my_negate(true).should eql(false)
|
52
46
|
# lambda{ t.my_negate("Banana")}.should raise_error
|
53
47
|
# end
|
54
|
-
|
55
|
-
|
48
|
+
|
49
|
+
|
50
|
+
describe "Floats" do
|
51
|
+
before do
|
56
52
|
class Doubler
|
57
53
|
hubris :inline => "triple :: Double -> Double; triple a = a*3.0", :no_strict => true
|
58
54
|
end
|
55
|
+
end
|
56
|
+
it "handles doubles" do
|
59
57
|
d = Doubler.new
|
60
|
-
|
61
58
|
d.triple(3.4).should eql(10.2)
|
62
59
|
end
|
63
60
|
end
|
@@ -71,14 +68,101 @@ describe "Strings" do
|
|
71
68
|
end
|
72
69
|
end
|
73
70
|
|
71
|
+
describe "tuples" do
|
72
|
+
before do
|
73
|
+
class Tupler
|
74
|
+
hubris :inline => "revTup :: (Integer,Integer) -> (Integer,Integer); revTup (a,b) = (b,a)"
|
75
|
+
hubris :inline => "expand :: (Integer,Integer) -> (Integer,Integer,Integer); expand (a,b) = (b,a,b)"
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
before :each do
|
80
|
+
@t = Tupler.new
|
81
|
+
end
|
82
|
+
|
83
|
+
it 'can call a tuple with an array' do
|
84
|
+
@t.revTup([1,2]).should == [2,1]
|
85
|
+
end
|
86
|
+
|
87
|
+
it 'has no funny array business' do
|
88
|
+
@t.expand([1,2]).should == [2,1,2]
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
74
92
|
describe "BigInt" do
|
75
|
-
|
93
|
+
before do
|
76
94
|
class Bigint
|
77
95
|
hubris :inline => "big_inc :: Integer -> Integer; big_inc i = i + 1"
|
78
96
|
end
|
79
|
-
|
80
|
-
|
81
|
-
|
97
|
+
end
|
98
|
+
|
99
|
+
before(:each) do
|
100
|
+
# pending
|
101
|
+
@b = Bigint.new
|
102
|
+
end
|
103
|
+
|
104
|
+
it "handles smalls" do
|
105
|
+
@b.big_inc(1).should eql(2)
|
106
|
+
end
|
107
|
+
|
108
|
+
|
109
|
+
it 'handles foo' do
|
110
|
+
@b.big_inc(536870912).should == 536870913
|
111
|
+
end
|
112
|
+
|
113
|
+
it 'handles foo' do
|
114
|
+
@b.big_inc(536870913).should == 536870914
|
115
|
+
end
|
116
|
+
|
117
|
+
# it 'tests' do
|
118
|
+
# low = 536870912
|
119
|
+
# high = 1073741825
|
120
|
+
|
121
|
+
# while low != high
|
122
|
+
# mid = (high + low)/2
|
123
|
+
# puts "mid is #{mid}"
|
124
|
+
# if @b.big_inc(mid) == mid + 1
|
125
|
+
# low = mid
|
126
|
+
# else
|
127
|
+
# high = mid
|
128
|
+
# end
|
129
|
+
# end
|
130
|
+
# puts "highest working is #{mid}"
|
131
|
+
# end
|
132
|
+
|
133
|
+
it 'handles 30 bits' do
|
134
|
+
@b.big_inc(1073741822).should == 1073741823
|
135
|
+
end
|
136
|
+
it 'handles > 30 bits' do
|
137
|
+
@b.big_inc(1073741823).should == 1073741824
|
138
|
+
end
|
139
|
+
|
140
|
+
it "handles really big ints" do
|
141
|
+
@b.big_inc(1000000000000000000000000).should eql(1000000000000000000000001)
|
142
|
+
end
|
143
|
+
|
144
|
+
it "handles ints just before the border" do
|
145
|
+
@b.big_inc(2147483647).should == 2147483648
|
146
|
+
end
|
147
|
+
|
148
|
+
it "handles > int but < bigint" do
|
149
|
+
@b.big_inc(2147483648).should == 2147483649
|
150
|
+
end
|
151
|
+
|
152
|
+
end
|
153
|
+
|
154
|
+
describe "BigID" do
|
155
|
+
|
156
|
+
before do
|
157
|
+
class BigId
|
158
|
+
hubris :inline => "big_inc :: Integer -> Integer; big_inc i = i"
|
159
|
+
end
|
160
|
+
@b = BigId.new
|
161
|
+
end
|
162
|
+
|
163
|
+
it 'returns a big fix' do
|
164
|
+
|
165
|
+
@b.big_inc(1073741824).should == 1073741824
|
82
166
|
end
|
83
167
|
end
|
84
168
|
|
@@ -97,10 +181,7 @@ describe 'Multiple' do
|
|
97
181
|
# and it doesn't wipe out other methods on the class
|
98
182
|
t.foo_local.should eql(14)
|
99
183
|
t.incr(3).should eql(4)
|
100
|
-
|
101
|
-
# JHC
|
102
|
-
# lambda { t.mydouble(2.3)}.should raise_error(HaskellError)
|
103
|
-
# Fooclever.mydouble(2.3).should raise_error(RuntimeError)
|
184
|
+
lambda { t.mydouble(2.3)}.should raise_error(HaskellError)
|
104
185
|
end
|
105
186
|
end
|
106
187
|
|
@@ -118,7 +199,7 @@ describe 'Arrays' do
|
|
118
199
|
end
|
119
200
|
t=ArrayTest2.new
|
120
201
|
t.elts(5).should eql([1,2,3,4,5])
|
121
|
-
lambda { t.elts("A Banana")}.should raise_error(HaskellError)
|
202
|
+
lambda { t.elts("A Banana").should == "FOO" }.should raise_error(HaskellError)
|
122
203
|
end
|
123
204
|
it "uses a Haskell array" do
|
124
205
|
class ArrayTest3
|
@@ -148,9 +229,9 @@ describe "MaybeIn" do
|
|
148
229
|
hubris :inline => "foo:: Maybe Int -> Int; foo (Just _) = 1; foo Nothing = 0"
|
149
230
|
end
|
150
231
|
m=MaybeIn.new
|
151
|
-
|
152
|
-
|
153
|
-
|
232
|
+
m.foo(1).should == 2
|
233
|
+
m.foo(20).should == 40
|
234
|
+
m.foo(nil).should == 0
|
154
235
|
lambda{ m.foo("blah") }.should raise_error(HaskellError)
|
155
236
|
# here's a tricky bit: in the previous example, we had to look at the value of the
|
156
237
|
# Maybe, so the exception got triggered.
|
@@ -158,8 +239,8 @@ describe "MaybeIn" do
|
|
158
239
|
# deeply examine the something. Arguably, it would be less surprising if we always looked
|
159
240
|
# deeply into it, but it's up for debate. TODO
|
160
241
|
|
161
|
-
lazy = MaybeLazy.new
|
162
|
-
lazy.foo("blah").should == 1
|
242
|
+
#lazy = MaybeLazy.new
|
243
|
+
#lazy.foo("blah").should == 1
|
163
244
|
end
|
164
245
|
end
|
165
246
|
|
@@ -207,6 +288,7 @@ describe "Overwrite" do
|
|
207
288
|
hubris :inline => "myid::Int -> Int; myid i = i+1"
|
208
289
|
end
|
209
290
|
t=Overlapping.new
|
291
|
+
# puts t.methods
|
210
292
|
t.myid(1).should eql(2)
|
211
293
|
end
|
212
294
|
|
@@ -255,6 +337,7 @@ describe 'Idempotence' do
|
|
255
337
|
end
|
256
338
|
|
257
339
|
it "can insert the same code into two ruby modules" do
|
340
|
+
|
258
341
|
class Foo10
|
259
342
|
hubris :inline => "foobar::Double -> Double;foobar n = n+1.0"
|
260
343
|
end
|
@@ -270,9 +353,9 @@ end
|
|
270
353
|
|
271
354
|
describe 'Realworld' do
|
272
355
|
it "can handle the bytestring lib" do
|
273
|
-
|
356
|
+
# pending "check"
|
274
357
|
class ByteString
|
275
|
-
hubris :module => "Data.ByteString"
|
358
|
+
hubris :module => "Data.ByteString", :no_strict => true
|
276
359
|
end
|
277
360
|
|
278
361
|
b = ByteString.new
|
@@ -280,18 +363,23 @@ describe 'Realworld' do
|
|
280
363
|
end
|
281
364
|
|
282
365
|
it "can import zlib" do
|
283
|
-
|
366
|
+
|
284
367
|
class ZLib
|
285
368
|
hubris :module => 'Codec.Compression.GZip', :packages => ['zlib', 'bytestring']
|
286
369
|
end
|
287
370
|
z=ZLib.new
|
288
371
|
w="osatnoensauhoestnuhoastuhoeatnuhosnueohnsauostneo"
|
289
|
-
|
372
|
+
pending "Not doing the right thing with embedded nulls yet"
|
373
|
+
# for the moment, we're happy if it errors out in a controlled way
|
374
|
+
|
375
|
+
lambda {z.decompress(z.compress(w)).should eql(w)}.should raise_error(HaskellError)
|
376
|
+
|
290
377
|
x=z.compress(w)
|
291
|
-
x.each_byte {|c| print c, '
|
378
|
+
x.each_byte {|c| print c, ':' }
|
292
379
|
puts "length|#{x.length}|"
|
380
|
+
# x.length.should > 5 # probably some shannon thing here
|
293
381
|
puts "second"
|
294
|
-
z.decompress(z.compress(w)).should eql(w)
|
382
|
+
lambda {z.decompress(z.compress(w)).should eql(w)}.should_not raise_error
|
295
383
|
end
|
296
384
|
|
297
385
|
end
|
@@ -304,7 +392,6 @@ describe 'Performance' do
|
|
304
392
|
it "caches its output" do
|
305
393
|
# only relevant for inlining
|
306
394
|
|
307
|
-
t=Target.new
|
308
395
|
class First
|
309
396
|
hubris :inline => "foobar::Int->Int; foobar a = a"
|
310
397
|
end
|
@@ -347,4 +434,43 @@ describe 'Performance' do
|
|
347
434
|
threads.each { |t| t.join }
|
348
435
|
}.should_not raise_error
|
349
436
|
end
|
437
|
+
|
438
|
+
end
|
439
|
+
|
440
|
+
describe "IO" do
|
441
|
+
it "can write a variable" do
|
442
|
+
pending
|
443
|
+
class IOTest
|
444
|
+
hubris :inline =><<EOF
|
445
|
+
import Data.IORef
|
446
|
+
import System.IO.Unsafe
|
447
|
+
ref :: IORef Int
|
448
|
+
ref = unsafePerformIO $ newIORef 10
|
449
|
+
|
450
|
+
readRef :: IO Int
|
451
|
+
readRef = readIORef ref
|
452
|
+
modify :: Int -> IO ()
|
453
|
+
modify n = writeIORef ref n
|
454
|
+
EOF
|
455
|
+
|
456
|
+
end
|
457
|
+
i = IOTest.new
|
458
|
+
i.readRef(nil).should == 10
|
459
|
+
i.modify(20)
|
460
|
+
i.readRef(nil).should == 20
|
461
|
+
|
462
|
+
end
|
463
|
+
end
|
464
|
+
|
465
|
+
describe "multiple arguments" do
|
466
|
+
it "can call a haskell function with multiple arguments" do
|
467
|
+
class Mult
|
468
|
+
hubris :inline => <<EOF
|
469
|
+
add :: Integer -> Integer -> Integer -> Integer
|
470
|
+
add x y z = x+y+z
|
471
|
+
EOF
|
472
|
+
end
|
473
|
+
|
474
|
+
Mult.new.add(1,9,100).should == 110
|
475
|
+
end
|
350
476
|
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
namespace :extconf do
|
2
|
+
extension = File.basename(__FILE__, '.rake')
|
3
|
+
|
4
|
+
ext = "ext/#{extension}"
|
5
|
+
ext_so = "#{ext}/#{extension}.#{Config::CONFIG['DLEXT']}"
|
6
|
+
ext_files = FileList[
|
7
|
+
"#{ext}/*.c",
|
8
|
+
"#{ext}/*.h",
|
9
|
+
"#{ext}/*.rl",
|
10
|
+
"#{ext}/extconf.rb",
|
11
|
+
"#{ext}/Makefile",
|
12
|
+
# "lib"
|
13
|
+
]
|
14
|
+
|
15
|
+
|
16
|
+
task :compile => extension do
|
17
|
+
if Dir.glob("**/#{extension}.{o,so,dll}").length == 0
|
18
|
+
STDERR.puts "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
|
19
|
+
STDERR.puts "Gem actually failed to build. Your system is"
|
20
|
+
STDERR.puts "NOT configured properly to build #{GEM_NAME}."
|
21
|
+
STDERR.puts "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
|
22
|
+
exit(1)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
desc "Builds just the #{extension} extension"
|
27
|
+
task extension.to_sym => ["#{ext}/Makefile", ext_so ]
|
28
|
+
|
29
|
+
file "#{ext}/Makefile" => ["#{ext}/extconf.rb"] do
|
30
|
+
Dir.chdir(ext) do ruby "extconf.rb" end
|
31
|
+
end
|
32
|
+
|
33
|
+
file ext_so => ext_files do
|
34
|
+
Dir.chdir(ext) do
|
35
|
+
sh(PLATFORM =~ /win32/ ? 'nmake' : 'make') do |ok, res|
|
36
|
+
if !ok
|
37
|
+
require "fileutils"
|
38
|
+
FileUtils.rm Dir.glob('*.{so,o,dll,bundle}')
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
data/tasks/extconf.rake
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
namespace :extconf do
|
2
|
+
desc "Compiles the Ruby extension"
|
3
|
+
task :compile
|
4
|
+
end
|
5
|
+
|
6
|
+
task :compile => "extconf:compile"
|
7
|
+
|
8
|
+
task :test => :compile
|
9
|
+
|
10
|
+
BIN = "*.{bundle,jar,so,obj,pdb,lib,def,exp}"
|
11
|
+
$hoe.clean_globs |= ["ext/**/#{BIN}", "lib/**/#{BIN}", 'ext/**/Makefile']
|
12
|
+
$hoe.spec.require_paths = Dir['{lib,ext/*}']
|
13
|
+
$hoe.spec.extensions = FileList["ext/**/extconf.rb"].to_a
|
metadata
CHANGED
@@ -1,7 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hubris
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
hash: 23
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 4
|
10
|
+
version: 0.0.4
|
5
11
|
platform: ruby
|
6
12
|
authors:
|
7
13
|
- Mark Wotton
|
@@ -11,77 +17,162 @@ autorequire:
|
|
11
17
|
bindir: bin
|
12
18
|
cert_chain: []
|
13
19
|
|
14
|
-
date:
|
20
|
+
date: 2011-02-24 00:00:00 +11:00
|
15
21
|
default_executable:
|
16
22
|
dependencies:
|
17
23
|
- !ruby/object:Gem::Dependency
|
18
|
-
name:
|
24
|
+
name: rake-compiler
|
25
|
+
prerelease: false
|
26
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
27
|
+
none: false
|
28
|
+
requirements:
|
29
|
+
- - ">="
|
30
|
+
- !ruby/object:Gem::Version
|
31
|
+
hash: 15
|
32
|
+
segments:
|
33
|
+
- 0
|
34
|
+
- 7
|
35
|
+
- 6
|
36
|
+
version: 0.7.6
|
19
37
|
type: :runtime
|
20
|
-
|
21
|
-
|
38
|
+
version_requirements: *id001
|
39
|
+
- !ruby/object:Gem::Dependency
|
40
|
+
name: rspec
|
41
|
+
prerelease: false
|
42
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
43
|
+
none: false
|
44
|
+
requirements:
|
45
|
+
- - "="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
hash: 31
|
48
|
+
segments:
|
49
|
+
- 2
|
50
|
+
- 4
|
51
|
+
- 0
|
52
|
+
version: 2.4.0
|
53
|
+
type: :development
|
54
|
+
version_requirements: *id002
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rake
|
57
|
+
prerelease: false
|
58
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
59
|
+
none: false
|
22
60
|
requirements:
|
23
61
|
- - ">="
|
24
62
|
- !ruby/object:Gem::Version
|
63
|
+
hash: 3
|
64
|
+
segments:
|
65
|
+
- 0
|
25
66
|
version: "0"
|
26
|
-
|
67
|
+
type: :runtime
|
68
|
+
version_requirements: *id003
|
27
69
|
- !ruby/object:Gem::Dependency
|
28
70
|
name: open4
|
29
|
-
|
30
|
-
|
31
|
-
|
71
|
+
prerelease: false
|
72
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
32
74
|
requirements:
|
33
75
|
- - ">="
|
34
76
|
- !ruby/object:Gem::Version
|
77
|
+
hash: 3
|
78
|
+
segments:
|
79
|
+
- 0
|
35
80
|
version: "0"
|
36
|
-
|
37
|
-
|
38
|
-
|
81
|
+
type: :runtime
|
82
|
+
version_requirements: *id004
|
83
|
+
description: A bridge between Ruby and Haskell
|
84
|
+
email:
|
85
|
+
- mwotton@gmail.com
|
39
86
|
executables: []
|
40
87
|
|
41
88
|
extensions:
|
42
|
-
-
|
89
|
+
- Rakefile
|
43
90
|
extra_rdoc_files: []
|
44
91
|
|
45
92
|
files:
|
93
|
+
- .gitignore
|
94
|
+
- .rvmrc
|
95
|
+
- Gemfile
|
46
96
|
- HISTORY.markdown
|
47
|
-
-
|
48
|
-
-
|
49
|
-
-
|
97
|
+
- Haskell/Hubrify.hs
|
98
|
+
- Haskell/LICENSE
|
99
|
+
- Haskell/Language/Ruby/Foo.hs
|
100
|
+
- Haskell/Language/Ruby/Hubris.hs
|
101
|
+
- Haskell/Language/Ruby/Hubris/Binding.hsc
|
102
|
+
- Haskell/Language/Ruby/Hubris/GHCBuild.hs
|
103
|
+
- Haskell/Language/Ruby/Hubris/Hash.hs
|
104
|
+
- Haskell/Language/Ruby/Hubris/Interpolator.hs
|
105
|
+
- Haskell/Language/Ruby/Hubris/LibraryBuilder.hs
|
106
|
+
- Haskell/Language/Ruby/Hubris/ZCode.hs
|
107
|
+
- Haskell/Language/Ruby/Wrappers.hs
|
108
|
+
- Haskell/Language/Ruby/testLib.hs
|
109
|
+
- Haskell/Setup.hs
|
110
|
+
- Haskell/cbits/rshim.c
|
111
|
+
- Haskell/cbits/rshim.h
|
112
|
+
- Haskell/hubris.cabal
|
113
|
+
- INSTALL
|
114
|
+
- Manifest.txt
|
115
|
+
- PostInstall.txt
|
116
|
+
- README.markdown
|
50
117
|
- Rakefile
|
51
|
-
-
|
118
|
+
- VERSION
|
119
|
+
- doc/CommonErrors.txt
|
120
|
+
- doc/CommonErrors.txt~HEAD
|
121
|
+
- doc/don_feedback.txt
|
122
|
+
- doc/haskell-hubris.tex
|
123
|
+
- doc/new_interface.rb
|
124
|
+
- doc/ruby-hubris.tex
|
125
|
+
- doc/wisdom_of_ancients.txt
|
126
|
+
- ext/hubris.rb
|
127
|
+
- ext/stub/extconf.rb
|
128
|
+
- ext/stub/stub.c
|
129
|
+
- hubris.gemspec
|
130
|
+
- lib/Makefile
|
131
|
+
- lib/hubris.rb
|
132
|
+
- lib/hubris/version.rb
|
133
|
+
- rspec.rake
|
52
134
|
- sample/Fibonacci.hs
|
135
|
+
- sample/config.ru
|
136
|
+
- script/ci.sh
|
137
|
+
- script/console
|
53
138
|
- spec/hubris_spec.rb
|
54
139
|
- spec/spec.opts
|
55
140
|
- spec/spec_helper.rb
|
141
|
+
- tasks/extconf.rake
|
142
|
+
- tasks/extconf/stub.rake
|
56
143
|
has_rdoc: true
|
57
|
-
homepage: http://
|
144
|
+
homepage: http://rubygems.org/gems/hubris
|
58
145
|
licenses: []
|
59
146
|
|
60
147
|
post_install_message:
|
61
|
-
rdoc_options:
|
62
|
-
|
63
|
-
- --charset=UTF-8
|
148
|
+
rdoc_options: []
|
149
|
+
|
64
150
|
require_paths:
|
65
151
|
- lib
|
66
|
-
- ext
|
67
152
|
required_ruby_version: !ruby/object:Gem::Requirement
|
153
|
+
none: false
|
68
154
|
requirements:
|
69
155
|
- - ">="
|
70
156
|
- !ruby/object:Gem::Version
|
157
|
+
hash: 3
|
158
|
+
segments:
|
159
|
+
- 0
|
71
160
|
version: "0"
|
72
|
-
version:
|
73
161
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
162
|
+
none: false
|
74
163
|
requirements:
|
75
164
|
- - ">="
|
76
165
|
- !ruby/object:Gem::Version
|
166
|
+
hash: 3
|
167
|
+
segments:
|
168
|
+
- 0
|
77
169
|
version: "0"
|
78
|
-
version:
|
79
170
|
requirements: []
|
80
171
|
|
81
|
-
rubyforge_project:
|
82
|
-
rubygems_version: 1.3.
|
172
|
+
rubyforge_project: Hubris
|
173
|
+
rubygems_version: 1.3.7
|
83
174
|
signing_key:
|
84
175
|
specification_version: 3
|
85
|
-
summary:
|
176
|
+
summary: A bridge between Ruby and Haskell
|
86
177
|
test_files: []
|
87
178
|
|