io_shuten 0.1.0.dev7 → 0.1.1.dev1
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +8 -14
- data/Gemfile.lock +42 -58
- data/README.md +148 -24
- data/Rakefile +0 -29
- data/benchmark/viiite-template-redis.rb +75 -0
- data/benchmark/viiite-template.rb +24 -31
- data/benchmarks.sh +7 -46
- data/benchmarks/redis.kvc.rb +8 -0
- data/benchmarks/redis.kvs.rb +8 -0
- data/io_shuten.gemspec +30 -92
- data/lib/io_shuten/redis.rb +1 -1
- data/lib/io_shuten/stores/redis/key_value/collection.rb +15 -3
- data/lib/io_shuten/version.rb +1 -1
- data/spec/lib/redis_spec.rb +5 -5
- data/spec/spec_helper.rb +1 -3
- metadata +109 -131
- data/.rvmrc +0 -71
- data/.simplecov +0 -16
- data/.yardopts +0 -3
- data/doc/IO_3A_3ABuffer.html +0 -198
- data/doc/IO_shuten.html +0 -126
- data/doc/IO_shuten/Base.html +0 -1062
- data/doc/IO_shuten/Base/FileAccessError.html +0 -129
- data/doc/IO_shuten/Base/FileNotFoundError.html +0 -129
- data/doc/IO_shuten/Base/NodeNameError.html +0 -129
- data/doc/IO_shuten/Base/NodeNotFoundError.html +0 -129
- data/doc/IO_shuten/Base/NotYetImplemented.html +0 -129
- data/doc/IO_shuten/Buffer.html +0 -1822
- data/doc/IO_shuten/Errors.html +0 -119
- data/doc/IO_shuten/Errors/FileAccessError.html +0 -129
- data/doc/IO_shuten/Errors/FileNotFoundError.html +0 -129
- data/doc/IO_shuten/Errors/NodeExistsError.html +0 -129
- data/doc/IO_shuten/Errors/NodeNameError.html +0 -129
- data/doc/IO_shuten/Errors/NodeNameExistsError.html +0 -129
- data/doc/IO_shuten/Errors/NodeNotFoundError.html +0 -129
- data/doc/IO_shuten/Errors/NotYetImplemented.html +0 -129
- data/doc/IO_shuten/Memory.html +0 -1778
- data/doc/IO_shuten/Mongo.html +0 -166
- data/doc/IO_shuten/Redis.html +0 -868
- data/doc/IO_shuten/Stores.html +0 -121
- data/doc/IO_shuten/Stores/BaseContainer.html +0 -377
- data/doc/IO_shuten/Stores/Mongo.html +0 -121
- data/doc/IO_shuten/Stores/Mongo/Collection.html +0 -109
- data/doc/IO_shuten/Stores/Mongo/GridFS.html +0 -109
- data/doc/IO_shuten/Stores/Redis.html +0 -123
- data/doc/IO_shuten/Stores/Redis/Container.html +0 -778
- data/doc/IO_shuten/Stores/Redis/KeyValue.html +0 -279
- data/doc/IO_shuten/Stores/Redis/KeyValue/Collection.html +0 -504
- data/doc/IO_shuten/Stores/Redis/KeyValue/Single.html +0 -438
- data/doc/IO_shuten/Stores/Redis/PubSub.html +0 -245
- data/doc/IO_shuten/Zmq.html +0 -166
- data/doc/_index.html +0 -375
- data/doc/class_list.html +0 -47
- data/doc/css/blame.css +0 -11
- data/doc/css/common.css +0 -1
- data/doc/css/full_list.css +0 -55
- data/doc/css/style.css +0 -322
- data/doc/file.README.html +0 -158
- data/doc/file_list.html +0 -49
- data/doc/frames.html +0 -13
- data/doc/index.html +0 -158
- data/doc/js/app.js +0 -205
- data/doc/js/full_list.js +0 -167
- data/doc/js/jquery.js +0 -16
- data/doc/method_list.html +0 -390
- data/doc/top-level-namespace.html +0 -105
data/Gemfile
CHANGED
@@ -1,34 +1,28 @@
|
|
1
1
|
source "https://rubygems.org"
|
2
2
|
|
3
|
-
gem "iobuffer", "~> 1.
|
3
|
+
gem "iobuffer", "~> 1.1.2"
|
4
4
|
|
5
5
|
# REDIS STORE
|
6
|
-
gem "hiredis", "~> 0.4.
|
7
|
-
gem "redis", "~>
|
8
|
-
gem "redis-namespace"
|
6
|
+
gem "hiredis", "~> 0.4.5"
|
7
|
+
gem "redis", "~> 3.0.2", :require => ["redis/connection/hiredis", "redis"]
|
8
|
+
gem "redis-namespace", "~> 1.2.1"
|
9
9
|
|
10
10
|
# MONGO STORE
|
11
11
|
gem "bson_ext", "~> 1.5.2"
|
12
12
|
gem "mongo", "~> 1.5.2"
|
13
13
|
|
14
14
|
# ZMQ "STORE"
|
15
|
-
gem "ffi"
|
16
|
-
gem "ffi-rzmq"
|
15
|
+
gem "ffi", "~> 1.1.5"
|
16
|
+
gem "ffi-rzmq", "~> 0.9.6"
|
17
17
|
|
18
18
|
group :development, :test do
|
19
19
|
gem "rake"
|
20
20
|
gem "jeweler"
|
21
21
|
|
22
|
-
gem "rspec", "~> 2.
|
23
|
-
gem "simplecov", :require => false
|
24
|
-
gem "simplecov-rcov", :require => false
|
25
|
-
gem "simplecov-csv", :require => false
|
26
|
-
|
27
|
-
gem "redcarpet"
|
28
|
-
gem "yard"
|
29
|
-
gem "yard-blame"
|
22
|
+
gem "rspec", "~> 2.11.0"
|
30
23
|
|
31
24
|
gem "pry"
|
25
|
+
gem "pry-doc"
|
32
26
|
|
33
27
|
gem "alf"
|
34
28
|
gem "fastercsv"
|
data/Gemfile.lock
CHANGED
@@ -8,66 +8,55 @@ GEM
|
|
8
8
|
bson (1.5.2)
|
9
9
|
bson_ext (1.5.2)
|
10
10
|
bson (= 1.5.2)
|
11
|
-
coderay (0.
|
11
|
+
coderay (1.0.8)
|
12
12
|
diff-lcs (1.1.3)
|
13
|
-
fastercsv (1.5.
|
14
|
-
ffi (1.
|
15
|
-
ffi-rzmq (0.9.
|
13
|
+
fastercsv (1.5.5)
|
14
|
+
ffi (1.1.5)
|
15
|
+
ffi-rzmq (0.9.6)
|
16
16
|
ffi
|
17
17
|
git (1.2.5)
|
18
18
|
gnuplot (2.3.6)
|
19
|
-
highline (1.6.
|
20
|
-
hiredis (0.4.
|
21
|
-
iobuffer (1.
|
22
|
-
jeweler (1.
|
19
|
+
highline (1.6.15)
|
20
|
+
hiredis (0.4.5)
|
21
|
+
iobuffer (1.1.2)
|
22
|
+
jeweler (1.8.4)
|
23
23
|
bundler (~> 1.0)
|
24
24
|
git (>= 1.2.5)
|
25
25
|
rake
|
26
|
-
|
27
|
-
|
28
|
-
|
26
|
+
rdoc
|
27
|
+
json (1.7.5)
|
28
|
+
method_source (0.8.1)
|
29
29
|
mongo (1.5.2)
|
30
30
|
bson (= 1.5.2)
|
31
|
-
multi_json (1.0.4)
|
32
31
|
myrrha (1.2.2)
|
33
|
-
pry (0.9.
|
34
|
-
coderay (~> 0.
|
35
|
-
method_source (~> 0.
|
36
|
-
|
37
|
-
|
38
|
-
|
32
|
+
pry (0.9.10)
|
33
|
+
coderay (~> 1.0.5)
|
34
|
+
method_source (~> 0.8)
|
35
|
+
slop (~> 3.3.1)
|
36
|
+
pry-doc (0.4.4)
|
37
|
+
pry (>= 0.9.9.6)
|
38
|
+
yard (~> 0.8.1)
|
39
|
+
quickl (0.4.3)
|
39
40
|
rake (0.9.2.2)
|
40
|
-
|
41
|
-
|
42
|
-
redis
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
rspec-
|
47
|
-
rspec-
|
48
|
-
|
49
|
-
rspec-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
sexp_processor (3.0.10)
|
55
|
-
simplecov (0.5.4)
|
56
|
-
multi_json (~> 1.0.3)
|
57
|
-
simplecov-html (~> 0.5.3)
|
58
|
-
simplecov-csv (0.1.3)
|
59
|
-
simplecov
|
60
|
-
simplecov-html (0.5.3)
|
61
|
-
simplecov-rcov (0.2.3)
|
62
|
-
simplecov (>= 0.4.1)
|
63
|
-
slop (2.1.0)
|
41
|
+
rdoc (3.12)
|
42
|
+
json (~> 1.4)
|
43
|
+
redis (3.0.2)
|
44
|
+
redis-namespace (1.2.1)
|
45
|
+
redis (~> 3.0.0)
|
46
|
+
rspec (2.11.0)
|
47
|
+
rspec-core (~> 2.11.0)
|
48
|
+
rspec-expectations (~> 2.11.0)
|
49
|
+
rspec-mocks (~> 2.11.0)
|
50
|
+
rspec-core (2.11.1)
|
51
|
+
rspec-expectations (2.11.3)
|
52
|
+
diff-lcs (~> 1.1.3)
|
53
|
+
rspec-mocks (2.11.3)
|
54
|
+
slop (3.3.3)
|
64
55
|
viiite (0.2.0)
|
65
56
|
alf (~> 0.10.1)
|
66
57
|
gnuplot (~> 2.3.6)
|
67
58
|
json
|
68
|
-
yard (0.
|
69
|
-
yard-blame (0.0.1)
|
70
|
-
yard
|
59
|
+
yard (0.8.3)
|
71
60
|
|
72
61
|
PLATFORMS
|
73
62
|
ruby
|
@@ -76,21 +65,16 @@ DEPENDENCIES
|
|
76
65
|
alf
|
77
66
|
bson_ext (~> 1.5.2)
|
78
67
|
fastercsv
|
79
|
-
ffi
|
80
|
-
ffi-rzmq
|
81
|
-
hiredis (~> 0.4.
|
82
|
-
iobuffer (~> 1.
|
68
|
+
ffi (~> 1.1.5)
|
69
|
+
ffi-rzmq (~> 0.9.6)
|
70
|
+
hiredis (~> 0.4.5)
|
71
|
+
iobuffer (~> 1.1.2)
|
83
72
|
jeweler
|
84
73
|
mongo (~> 1.5.2)
|
85
74
|
pry
|
75
|
+
pry-doc
|
86
76
|
rake
|
87
|
-
|
88
|
-
redis (~>
|
89
|
-
|
90
|
-
rspec (~> 2.8.0)
|
91
|
-
simplecov
|
92
|
-
simplecov-csv
|
93
|
-
simplecov-rcov
|
77
|
+
redis (~> 3.0.2)
|
78
|
+
redis-namespace (~> 1.2.1)
|
79
|
+
rspec (~> 2.11.0)
|
94
80
|
viiite
|
95
|
-
yard
|
96
|
-
yard-blame
|
data/README.md
CHANGED
@@ -2,6 +2,11 @@
|
|
2
2
|
|
3
3
|
Use databases as IO handler like you would do with files and streams.
|
4
4
|
|
5
|
+
Backends are (or will be): Redis, MongoDB.
|
6
|
+
|
7
|
+
Special backend will be: ZeroMQ (not a database but cool message queue backend).
|
8
|
+
|
9
|
+
Wishes? MySQL, Postgres, Sqlite? Other NoSQLs, memcache? Tell me!
|
5
10
|
|
6
11
|
## Motivation
|
7
12
|
|
@@ -9,16 +14,37 @@ One purpose for creating this project is to have an IO like interface to databas
|
|
9
14
|
|
10
15
|
With this gem you should have the possibility to use redis or mongodb as endpoints for IO related tasks like logging.
|
11
16
|
|
12
|
-
|
17
|
+
And logging was my first idea for this project. I want to have the possibility to set my own logger (endpoint) in a Ruby/Rails app.
|
18
|
+
|
19
|
+
Also you could use different logger endpoints in the same app for different purposes but without bloating your app/tmp dir with huge files.
|
20
|
+
|
21
|
+
If you have more cool ideas, what to do with it, tell me (and I will put it in this README).
|
22
|
+
|
23
|
+
### Example
|
13
24
|
|
14
25
|
```ruby
|
15
26
|
require "io_shuten"
|
16
27
|
require "logger"
|
17
28
|
|
18
|
-
|
29
|
+
# use redis namespace to separate and avoid naming conflicts
|
30
|
+
IO_shuten::Redis.redis = Redis::Namespace.new("io_shuten:test", :redis => Redis.new)
|
31
|
+
|
32
|
+
# instantiate logdev and logger
|
33
|
+
logdev = IO_shuten::Redis.new(:app_log, :key_value, :collection)
|
19
34
|
logger = Logger.new(logdev)
|
20
35
|
|
21
|
-
|
36
|
+
# log something
|
37
|
+
logger.info "This message will be stored in redis as a single key."
|
38
|
+
logger.debug "And this message will be also a single key"
|
39
|
+
|
40
|
+
#check
|
41
|
+
puts logdev.read #=> will return both messages as a single string
|
42
|
+
```
|
43
|
+
|
44
|
+
And check in redis for the keys:
|
45
|
+
|
46
|
+
```bash
|
47
|
+
redis-cli KEYS "io_shuten/test"
|
22
48
|
```
|
23
49
|
|
24
50
|
|
@@ -27,44 +53,137 @@ logger.info "This message will be stored in memory."
|
|
27
53
|
In japanese `io` means *500* or *big amount*, `shū・ten` means *endpoint* (train terminus/last stop or mathematical endpoint).
|
28
54
|
|
29
55
|
|
30
|
-
## Types
|
56
|
+
## Storage Types
|
57
|
+
|
58
|
+
|
59
|
+
### IO_shuten::Redis
|
31
60
|
|
61
|
+
Stores content in a redis database.
|
32
62
|
|
33
|
-
### IO_shuten::Memory
|
34
63
|
|
35
|
-
|
64
|
+
#### Backends
|
36
65
|
|
37
|
-
|
66
|
+
The redis storage system provides two different backends: `KeyValue` and `PubSub`.
|
38
67
|
|
39
|
-
Provides all methods of StringIO.
|
40
68
|
|
41
|
-
|
69
|
+
##### KeyValue
|
42
70
|
|
43
|
-
|
44
|
-
(Install it with `gem install iobuffer`.)
|
71
|
+
Has two different storage types: `Single` and `Collection`.
|
45
72
|
|
46
|
-
Performance depends on machine and ruby version. Almost same throughput, on 1.9.3 is the native StringIO better than the IO::Buffer cext.
|
47
73
|
|
48
|
-
|
74
|
+
##### KeyValue::Single
|
49
75
|
|
50
|
-
Stores
|
76
|
+
Stores every message in a single key in redis (like a big document).
|
77
|
+
|
78
|
+
Choose this, if you have only small amount of chunks to store.
|
79
|
+
More reads, less writes.
|
80
|
+
|
81
|
+
```ruby
|
82
|
+
require "io_shuten"
|
83
|
+
IO_shuten::Redis.redis = Redis::Namespace.new("io_shuten:key_value:single:test", :redis => Redis.new)
|
84
|
+
|
85
|
+
io_object = IO_shuten::Redis.new(:my_node, :key_value, :single)
|
86
|
+
|
87
|
+
io_object.write "my awesome data!\n"
|
88
|
+
io_object.write "chunky bacon!!!\n"
|
89
|
+
|
90
|
+
io_object.read
|
91
|
+
```
|
92
|
+
|
93
|
+
After this you will have a single key in redis like:
|
94
|
+
|
95
|
+
```
|
96
|
+
$ redis-cli KEYS "io_shuten:key_value:collection:test:*"
|
97
|
+
1) "io_shuten:key_value:single:test:my_node"
|
98
|
+
```
|
99
|
+
|
100
|
+
The content is a LIST:
|
101
|
+
|
102
|
+
```
|
103
|
+
$ redis-cli LRANGE "io_shuten:key_value:single:test:my_node" 0 -1
|
104
|
+
1) "my awesome data!\n"
|
105
|
+
2) "chunky bacon!!!\n"
|
106
|
+
```
|
51
107
|
|
52
|
-
|
53
|
-
|
108
|
+
##### KeyValue::Collection
|
109
|
+
|
110
|
+
Stores every single message in its own key. The provided node_name acts as namespace.
|
111
|
+
|
112
|
+
Choose this if you have huge amounts of chunks, especially constantly coming in, like logging events.
|
113
|
+
More writes, less reads.
|
114
|
+
|
115
|
+
```ruby
|
116
|
+
require "io_shuten"
|
117
|
+
IO_shuten::Redis.redis = Redis::Namespace.new("io_shuten:key_value:collection:test", :redis => Redis.new)
|
118
|
+
|
119
|
+
io_object = IO_shuten::Redis.new(:my_node, :key_value, :collection)
|
120
|
+
|
121
|
+
io_object.write "my awesome data!\n"
|
122
|
+
io_object.write "chunky bacon!!!\n"
|
123
|
+
|
124
|
+
io_object.read
|
125
|
+
```
|
126
|
+
|
127
|
+
After this you will have two keys in redis like:
|
128
|
+
|
129
|
+
```
|
130
|
+
$ redis-cli KEYS "io_shuten:key_value:collection:test:*"
|
131
|
+
1) "io_shuten:key_value:collection:test:my_node:0000000000000000"
|
132
|
+
2) "io_shuten:key_value:collection:test:my_node:0000000000000001"
|
133
|
+
3) "io_shuten:key_value:collection:test:my_node:0000000000000002"
|
134
|
+
```
|
135
|
+
The first key with 16 zeros is a counter (to avoid long running key searches to get the count).
|
136
|
+
|
137
|
+
Numerical part is a 16 digit number, should be enough for 10 quadrillion (minus 1) messages per node.
|
138
|
+
(The reason is for internal sorting of the keys)
|
139
|
+
|
140
|
+
With messages of an average length of only 16 bytes this would end up in 160 petabytes of raw data.
|
141
|
+
|
142
|
+
|
143
|
+
##### PubSub
|
144
|
+
|
145
|
+
**Not yet implemented!**
|
146
|
+
|
147
|
+
Will have two types: `Publisher` and `Subscriber`.
|
148
|
+
|
149
|
+
As logger backend only the `PubSub::Publisher` will be usable,
|
150
|
+
but you can use a redis subscriber on the other side to receive the messages and do something with them.
|
54
151
|
|
55
152
|
### IO_shuten::Mongo
|
56
153
|
|
57
|
-
|
154
|
+
**Not yet implemented!**
|
58
155
|
|
59
|
-
Provides basic methods like `#read`, `#write` and `#close`.
|
60
|
-
A logger only needs write and close methods of an IO object.
|
61
156
|
|
62
157
|
### IO_shuten::Zmq
|
63
158
|
|
64
|
-
|
159
|
+
**Not yet implemented!**
|
160
|
+
|
161
|
+
|
162
|
+
### IO_shuten::Memory and IO_shuten::Buffer
|
163
|
+
|
164
|
+
**Maybe only useful as temporary storage for a session.**
|
165
|
+
|
166
|
+
_These implementations were the first tests and aren't intended to be used in production._
|
65
167
|
|
66
|
-
|
67
|
-
|
168
|
+
> An in-memory storage system (handles simple StringIO/IOBuffer objects).
|
169
|
+
>
|
170
|
+
> Offers write-to-disk for single instance and all instances.
|
171
|
+
>
|
172
|
+
> Provides all methods of StringIO respectively IOBuffer.
|
173
|
+
>
|
174
|
+
> _IOBuffer usage:_ Install it with `gem install iobuffer` first.
|
175
|
+
>
|
176
|
+
> Performance of both are nearly the same.
|
177
|
+
>
|
178
|
+
> Read the _documentation_ if you really want to use them.
|
179
|
+
|
180
|
+
|
181
|
+
## [Documentation](http://asaaki.github.com/io_shuten/doc/index.html)
|
182
|
+
|
183
|
+
|
184
|
+
## Future Plans
|
185
|
+
|
186
|
+
Maybe a special Logger, especially for Redis (to get benefits of the key search).
|
68
187
|
|
69
188
|
|
70
189
|
## Not for production!
|
@@ -78,15 +197,20 @@ Feel free to contribute, write issues if you want to support me with your ideas
|
|
78
197
|
|
79
198
|
## git flowed
|
80
199
|
|
81
|
-
Development will happen in the `develop` branch
|
200
|
+
Development will happen in the `develop` branch, `master` should be in a deployable state.
|
82
201
|
|
83
|
-
Read more about `git flow` and the
|
202
|
+
Read more about `git flow` and the branching model here:
|
84
203
|
|
85
204
|
* http://nvie.com/posts/a-successful-git-branching-model/
|
86
205
|
* https://github.com/nvie/gitflow
|
87
206
|
|
88
207
|
I like this approach and try to use it whenever possible, also in one-man-development.
|
89
208
|
|
209
|
+
### Contribute
|
210
|
+
|
211
|
+
Fork it, create your feature in a `feature/branch` based on `develop`(!), make a pull request.
|
212
|
+
|
213
|
+
Hotfixes for master can be made out of master branch, of course. ;o)
|
90
214
|
|
91
215
|
## License
|
92
216
|
|
data/Rakefile
CHANGED
@@ -7,18 +7,12 @@ require "jeweler"
|
|
7
7
|
require "rspec"
|
8
8
|
require "rspec/core/rake_task"
|
9
9
|
|
10
|
-
require "yard"
|
11
|
-
|
12
10
|
|
13
11
|
$LOAD_PATH.unshift File.expand_path("../lib", __FILE__)
|
14
12
|
require "io_shuten/version"
|
15
13
|
|
16
|
-
|
17
|
-
|
18
14
|
RUBY_ENGINE = '(no engine)' unless defined? RUBY_ENGINE
|
19
15
|
|
20
|
-
|
21
|
-
|
22
16
|
Jeweler::Tasks.new do |gem|
|
23
17
|
gem.name = "io_shuten"
|
24
18
|
gem.version = IO_shuten::VERSION
|
@@ -31,8 +25,6 @@ Jeweler::Tasks.new do |gem|
|
|
31
25
|
gem.description = "IO::shuten – Use databases as IO handler like you would do with files and streams."
|
32
26
|
end
|
33
27
|
|
34
|
-
|
35
|
-
|
36
28
|
task :gem => :build
|
37
29
|
|
38
30
|
desc "Release current gem version to rubygems.org"
|
@@ -49,21 +41,6 @@ task RSpec::Core::RakeTask.new(:spec) do |t|
|
|
49
41
|
t.verbose = false
|
50
42
|
end
|
51
43
|
|
52
|
-
desc "Run all specs + code coverage"
|
53
|
-
task "spec:cov" do
|
54
|
-
ENV["COV"] = 'true'
|
55
|
-
Rake::Task["spec"].invoke
|
56
|
-
end
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
YARD::Rake::YardocTask.new do |t|
|
61
|
-
t.files = ['lib/**/*.rb']
|
62
|
-
#t.options = ['--any', '--extra', '--opts']
|
63
|
-
end
|
64
|
-
|
65
|
-
|
66
|
-
|
67
44
|
desc "Starts IRB with env"
|
68
45
|
task :irb do
|
69
46
|
sh "irb -I lib -r io_shuten"
|
@@ -74,15 +51,11 @@ task :pry do
|
|
74
51
|
sh "pry -I lib -r io_shuten --no-pager"
|
75
52
|
end
|
76
53
|
|
77
|
-
|
78
|
-
|
79
54
|
desc "Prints current environment"
|
80
55
|
task :envinfo do
|
81
56
|
puts ['RUBY:',RUBY_PLATFORM,RUBY_ENGINE,RUBY_VERSION].join(" ")
|
82
57
|
end
|
83
58
|
|
84
|
-
|
85
|
-
|
86
59
|
desc "RBX ONLY: Clean up rbc and .rbx"
|
87
60
|
task :rbx_clean do
|
88
61
|
Dir["./**/*.rbc","./**/.*.rbc"].each do |f|
|
@@ -91,8 +64,6 @@ task :rbx_clean do
|
|
91
64
|
sh "rm -rf .rbx" if File.exists?(".rbx") && File.directory?(".rbx")
|
92
65
|
end
|
93
66
|
|
94
|
-
|
95
|
-
|
96
67
|
desc "Runs complex viiite benchmark suite"
|
97
68
|
task :benchmark do
|
98
69
|
sh "./benchmarks.sh"
|