norikra 1.0.8-java → 1.1.0-java
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/norikra/engine.rb +55 -2
- data/lib/norikra/listener.rb +25 -0
- data/lib/norikra/query.rb +32 -1
- data/lib/norikra/rpc/handler.rb +15 -1
- data/lib/norikra/version.rb +1 -1
- data/lib/norikra/webui/handler.rb +20 -1
- data/norikra.gemspec +1 -1
- data/public/css/norikra.css +4 -0
- data/spec/listener_spec.rb +37 -0
- data/spec/query_spec.rb +20 -0
- data/views/index.erb +62 -2
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2ba35f8ca734eabab40ce673fcc67c6ad96bbba4
|
4
|
+
data.tar.gz: ebad6924402dfe676a74e6ee3b97762c30c9f060
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: be637b070e42b213a675aac50e1ec38f180f1aa1dbb5b03e6b68e14d4275466ea4b69b2f5cdfb6a6fe75efa0b04105aeb33f3b8806179e6db47586837409c1ea
|
7
|
+
data.tar.gz: de613937a954073acaf0c8493a16844109148e71584b6aa3730f9e4208326db921f87203e5bf8a6d5b1f13c90216d95d540b92ae7a7192fe85f429f13eaf691b
|
data/lib/norikra/engine.rb
CHANGED
@@ -16,7 +16,7 @@ require 'norikra/typedef_manager'
|
|
16
16
|
|
17
17
|
module Norikra
|
18
18
|
class Engine
|
19
|
-
attr_reader :targets, :queries, :output_pool, :typedef_manager
|
19
|
+
attr_reader :targets, :queries, :suspended_queries, :output_pool, :typedef_manager
|
20
20
|
|
21
21
|
def initialize(output_pool, typedef_manager, opts={})
|
22
22
|
@statistics = {
|
@@ -38,6 +38,7 @@ module Norikra
|
|
38
38
|
|
39
39
|
@targets = []
|
40
40
|
@queries = []
|
41
|
+
@suspended_queries = []
|
41
42
|
|
42
43
|
@waiting_queries = []
|
43
44
|
end
|
@@ -169,6 +170,7 @@ module Norikra
|
|
169
170
|
def register(query)
|
170
171
|
info "registering query", :name => query.name, :targets => query.targets, :expression => query.expression
|
171
172
|
raise Norikra::ClientError, "query name '#{query.name}' already exists" if @queries.select{|q| q.name == query.name }.size > 0
|
173
|
+
raise Norikra::ClientError, "query name '#{query.name}' already exists in suspended" if @suspended_queries.select{|q| q.name == query.name }.size > 0
|
172
174
|
raise Norikra::ClientError, "query '#{query.name}' is invalid query for Norikra" if query.invalid?
|
173
175
|
|
174
176
|
query.targets.each do |target_name|
|
@@ -180,9 +182,43 @@ module Norikra
|
|
180
182
|
def deregister(query_name)
|
181
183
|
info "de-registering query", :name => query_name
|
182
184
|
queries = @queries.select{|q| q.name == query_name }
|
185
|
+
s_queries = @suspended_queries.select{|q| q.name == query_name }
|
186
|
+
|
187
|
+
if queries.size == 1
|
188
|
+
deregister_query(queries.first)
|
189
|
+
elsif s_queries.size == 1
|
190
|
+
@suspended_queries.delete(s_queries.first)
|
191
|
+
true
|
192
|
+
else
|
193
|
+
nil # just ignore for 'not found'
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
def suspend(query_name)
|
198
|
+
info "suspending query", name: query_name
|
199
|
+
queries = @queries.select{|q| q.name == query_name }
|
183
200
|
return nil unless queries.size == 1 # just ignore for 'not found'
|
184
201
|
|
185
|
-
|
202
|
+
suspending_query = queries.first
|
203
|
+
suspended_query = Norikra::SuspendedQuery.new(suspending_query)
|
204
|
+
|
205
|
+
deregister_query(suspending_query)
|
206
|
+
add_suspended_query(suspended_query)
|
207
|
+
end
|
208
|
+
|
209
|
+
def resume(query_name)
|
210
|
+
info "resuming query", name: query_name
|
211
|
+
queries = @suspended_queries.select{|q| q.name == query_name }
|
212
|
+
return nil unless queries.size == 1 # just ignore
|
213
|
+
|
214
|
+
suspended_query = queries.first
|
215
|
+
query = suspended_query.create # suspended query -> query object
|
216
|
+
|
217
|
+
query.targets.each do |target_name|
|
218
|
+
open(target_name) unless @targets.any?{|t| t.name == target_name}
|
219
|
+
end
|
220
|
+
register_query(query)
|
221
|
+
remove_suspended_query(suspended_query)
|
186
222
|
end
|
187
223
|
|
188
224
|
def send(target_name, events)
|
@@ -359,6 +395,21 @@ module Norikra
|
|
359
395
|
true
|
360
396
|
end
|
361
397
|
|
398
|
+
def add_suspended_query(query)
|
399
|
+
@mutex.synchronize do
|
400
|
+
return nil if @suspended_queries.include?(query)
|
401
|
+
@suspended_queries << query
|
402
|
+
end
|
403
|
+
true
|
404
|
+
end
|
405
|
+
|
406
|
+
def remove_suspended_query(query)
|
407
|
+
@mutex.synchronize do
|
408
|
+
@suspended_queries.delete(query)
|
409
|
+
end
|
410
|
+
true
|
411
|
+
end
|
412
|
+
|
362
413
|
def register_waiting_queries
|
363
414
|
ready = []
|
364
415
|
not_ready = []
|
@@ -421,6 +472,8 @@ module Norikra
|
|
421
472
|
|
422
473
|
listener = if Norikra::Query.loopback(query.group)
|
423
474
|
Norikra::LoopbackListener.new(self, query.name, query.group, @statistics[:events])
|
475
|
+
elsif Norikra::Query.stdout?(query.group)
|
476
|
+
Norikra::StdoutListener.new(self, query.name, query.group, @statistics[:events])
|
424
477
|
else
|
425
478
|
Norikra::Listener.new(query.name, query.group, @output_pool, @statistics[:events])
|
426
479
|
end
|
data/lib/norikra/listener.rb
CHANGED
@@ -7,6 +7,8 @@ require 'esper/lib/cglib-nodep-3.1.jar'
|
|
7
7
|
require 'norikra/field'
|
8
8
|
require 'norikra/query'
|
9
9
|
|
10
|
+
require 'json'
|
11
|
+
|
10
12
|
module Norikra
|
11
13
|
class Listener
|
12
14
|
include com.espertech.esper.client.UpdateListener
|
@@ -67,6 +69,29 @@ module Norikra
|
|
67
69
|
end
|
68
70
|
end
|
69
71
|
|
72
|
+
class StdoutListener < Listener
|
73
|
+
def initialize(engine, query_name, query_group, events_statistics)
|
74
|
+
raise "BUG: query group is not 'STDOUT()'" unless query_group == 'STDOUT()'
|
75
|
+
|
76
|
+
@engine = engine
|
77
|
+
@query_name = query_name
|
78
|
+
@query_group = query_group
|
79
|
+
@events_statistics = events_statistics
|
80
|
+
|
81
|
+
@stdout = STDOUT
|
82
|
+
end
|
83
|
+
|
84
|
+
def update(new_events, old_events)
|
85
|
+
event_list = new_events.map{|e| type_convert(e) }
|
86
|
+
trace "stdout event", :query => @query_name, :event => event_list
|
87
|
+
@events_statistics[:output] += event_list.size
|
88
|
+
|
89
|
+
event_list.each do |e|
|
90
|
+
@stdout.puts @query_name + "\t" + JSON.dump(e)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
70
95
|
##### Unmatched events are simply ignored
|
71
96
|
# class UnmatchedListener
|
72
97
|
# include com.espertech.esper.client.UnmatchedListener
|
data/lib/norikra/query.rb
CHANGED
@@ -49,18 +49,26 @@ module Norikra
|
|
49
49
|
group && group =~ /^LOOPBACK\((.+)\)$/ && $1
|
50
50
|
end
|
51
51
|
|
52
|
+
def self.stdout?(group)
|
53
|
+
group && group == "STDOUT()"
|
54
|
+
end
|
55
|
+
|
52
56
|
def dup
|
53
57
|
self.class.new(:name => @name, :group => @group, :expression => @expression.dup)
|
54
58
|
end
|
55
59
|
|
56
60
|
def to_hash
|
57
|
-
{'name' => @name, 'group' => @group, 'expression' => @expression, 'targets' => self.targets}
|
61
|
+
{'name' => @name, 'group' => @group, 'expression' => @expression, 'targets' => self.targets, 'suspended' => false}
|
58
62
|
end
|
59
63
|
|
60
64
|
def dump
|
61
65
|
{name: @name, group: @group, expression: @expression}
|
62
66
|
end
|
63
67
|
|
68
|
+
def suspended?
|
69
|
+
false
|
70
|
+
end
|
71
|
+
|
64
72
|
def invalid?
|
65
73
|
# check query is invalid as Norikra query or not
|
66
74
|
self.ast.listup('selectionListElement').any?{|node| node.children.map(&:name).any?{|name| name == '*' } }
|
@@ -457,4 +465,27 @@ module Norikra
|
|
457
465
|
def dup; self; end
|
458
466
|
def dup_with_stream_name(actual_name); self; end
|
459
467
|
end
|
468
|
+
|
469
|
+
class SuspendedQuery
|
470
|
+
attr_accessor :name, :group, :expression, :targets
|
471
|
+
|
472
|
+
def initialize(query)
|
473
|
+
@name = query.name
|
474
|
+
@group = query.group
|
475
|
+
@expression = query.expression
|
476
|
+
@targets = query.targets
|
477
|
+
end
|
478
|
+
|
479
|
+
def suspended?
|
480
|
+
true
|
481
|
+
end
|
482
|
+
|
483
|
+
def to_hash
|
484
|
+
{'name' => @name, 'group' => @group, 'expression' => @expression, 'targets' => @targets, 'suspended' => true}
|
485
|
+
end
|
486
|
+
|
487
|
+
def create
|
488
|
+
Query.new(name: @name, group: @group, expression: @expression)
|
489
|
+
end
|
490
|
+
end
|
460
491
|
end
|
data/lib/norikra/rpc/handler.rb
CHANGED
@@ -61,7 +61,7 @@ class Norikra::RPC::Handler
|
|
61
61
|
|
62
62
|
def queries
|
63
63
|
logging(:show, :queries){
|
64
|
-
@engine.queries.map(&:to_hash)
|
64
|
+
@engine.queries.map(&:to_hash) + @engine.suspended_queries.map(&:to_hash)
|
65
65
|
}
|
66
66
|
end
|
67
67
|
|
@@ -79,6 +79,20 @@ class Norikra::RPC::Handler
|
|
79
79
|
}
|
80
80
|
end
|
81
81
|
|
82
|
+
def suspend(query_name)
|
83
|
+
logging(:manage, :suspend, [query_name]){
|
84
|
+
r = @engine.suspend(query_name)
|
85
|
+
!!r
|
86
|
+
}
|
87
|
+
end
|
88
|
+
|
89
|
+
def resume(query_name)
|
90
|
+
logging(:manage, :suspend, [query_name]){
|
91
|
+
r = @engine.resume(query_name)
|
92
|
+
!!r
|
93
|
+
}
|
94
|
+
end
|
95
|
+
|
82
96
|
def fields(target)
|
83
97
|
logging(:show, :fields, [target]){
|
84
98
|
@engine.typedef_manager.field_list(target)
|
data/lib/norikra/version.rb
CHANGED
@@ -66,7 +66,7 @@ class Norikra::WebUI::Handler < Sinatra::Base
|
|
66
66
|
|
67
67
|
input_data,session[:input_data] = session[:input_data],nil
|
68
68
|
|
69
|
-
queries = engine.queries.sort
|
69
|
+
queries = engine.queries.sort + engine.suspended_queries.sort
|
70
70
|
pooled_events = Hash[* queries.map{|q| [q.name, engine.output_pool.pool.fetch(q.name, []).size.to_s]}.flatten]
|
71
71
|
|
72
72
|
engine_targets = engine.targets.sort
|
@@ -130,6 +130,22 @@ class Norikra::WebUI::Handler < Sinatra::Base
|
|
130
130
|
end
|
131
131
|
end
|
132
132
|
|
133
|
+
post '/suspend' do
|
134
|
+
query_name = params[:query_name]
|
135
|
+
logging(:manage, :suspend, [query_name]) do
|
136
|
+
engine.suspend(query_name)
|
137
|
+
redirect '/#queries'
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
post '/resume' do
|
142
|
+
query_name = params[:query_name]
|
143
|
+
logging(:manage, :resume, [query_name]) do
|
144
|
+
engine.resume(query_name)
|
145
|
+
redirect '/#queries'
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
133
149
|
get '/logs' do
|
134
150
|
logging(:show, :logs) do
|
135
151
|
json Norikra::Log.logger.buffer
|
@@ -149,6 +165,9 @@ class Norikra::WebUI::Handler < Sinatra::Base
|
|
149
165
|
query_name = params[:name]
|
150
166
|
logging(:show, :json_query, [query_name]) do
|
151
167
|
query = engine.queries.select{|q| q.name == query_name}.first
|
168
|
+
unless query
|
169
|
+
query = engine.suspended_queries.select{|q| q.name == query_name}.first
|
170
|
+
end
|
152
171
|
if query
|
153
172
|
content = {
|
154
173
|
name: query.name,
|
data/norikra.gemspec
CHANGED
@@ -23,7 +23,7 @@ Gem::Specification.new do |spec|
|
|
23
23
|
spec.add_runtime_dependency "rack"
|
24
24
|
spec.add_runtime_dependency "thor"
|
25
25
|
spec.add_runtime_dependency "msgpack-rpc-over-http-jruby", ">= 0.0.6"
|
26
|
-
spec.add_runtime_dependency "norikra-client-jruby", ">= 1.
|
26
|
+
spec.add_runtime_dependency "norikra-client-jruby", ">= 1.1.0"
|
27
27
|
spec.add_runtime_dependency "sinatra"
|
28
28
|
spec.add_runtime_dependency "sinatra-contrib"
|
29
29
|
spec.add_runtime_dependency "erubis"
|
data/public/css/norikra.css
CHANGED
data/spec/listener_spec.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
require_relative './spec_helper'
|
3
3
|
|
4
|
+
require 'json'
|
4
5
|
require 'norikra/listener'
|
5
6
|
|
6
7
|
class DummyOutputPool
|
@@ -161,3 +162,39 @@ describe Norikra::LoopbackListener do
|
|
161
162
|
end
|
162
163
|
end
|
163
164
|
end
|
165
|
+
|
166
|
+
describe Norikra::StdoutListener do
|
167
|
+
it 'should be initialized' do
|
168
|
+
dummy_engine = DummyEngine.new
|
169
|
+
statistics = {output: 0}
|
170
|
+
expect { Norikra::StdoutListener.new(dummy_engine, 'name', 'STDOUT()', statistics) }.not_to raise_error
|
171
|
+
end
|
172
|
+
|
173
|
+
describe '#update' do
|
174
|
+
dummy_engine = DummyEngine.new
|
175
|
+
statistics = {output: 0}
|
176
|
+
listener = Norikra::StdoutListener.new(dummy_engine, 'name', 'STDOUT()', statistics)
|
177
|
+
dummyio = StringIO.new
|
178
|
+
listener.instance_eval{ @stdout = dummyio }
|
179
|
+
|
180
|
+
it 'sends events into engine with target name' do
|
181
|
+
dummyio.truncate(0)
|
182
|
+
|
183
|
+
events1 = [{"n1" => 100, "s" => "string one"}, {"n1" => 101, "s" => "string two"}]
|
184
|
+
listener.update(events1, [])
|
185
|
+
expect(statistics[:output]).to eql(2)
|
186
|
+
|
187
|
+
events2 = [{"n1" => 102, "s" => "string three"}]
|
188
|
+
listener.update(events2, [])
|
189
|
+
expect(statistics[:output]).to eql(3)
|
190
|
+
|
191
|
+
results = []
|
192
|
+
dummyio.string.split("\n").each do |line|
|
193
|
+
query_name, json = line.split("\t")
|
194
|
+
expect(query_name).to eql("name")
|
195
|
+
results << JSON.parse(json) if json && json != ''
|
196
|
+
end
|
197
|
+
expect(results).to eql(events1 + events2)
|
198
|
+
end
|
199
|
+
end
|
200
|
+
end
|
data/spec/query_spec.rb
CHANGED
@@ -338,6 +338,16 @@ describe Norikra::Query do
|
|
338
338
|
end
|
339
339
|
end
|
340
340
|
|
341
|
+
describe '.stdout?' do
|
342
|
+
it 'returns true if group name is "STDOUT()"' do
|
343
|
+
expect(Norikra::Query.stdout?(nil)).to be_false
|
344
|
+
expect(Norikra::Query.stdout?("")).to be_false
|
345
|
+
expect(Norikra::Query.stdout?("foo")).to be_false
|
346
|
+
expect(Norikra::Query.stdout?("STDOUT")).to be_false
|
347
|
+
expect(Norikra::Query.stdout?("STDOUT()")).to be_true
|
348
|
+
end
|
349
|
+
end
|
350
|
+
|
341
351
|
describe '#dup' do
|
342
352
|
context 'for queries without group (default group)' do
|
343
353
|
it 'returns query object with default group' do
|
@@ -362,6 +372,14 @@ describe Norikra::Query do
|
|
362
372
|
end
|
363
373
|
end
|
364
374
|
|
375
|
+
describe '#suspended?' do
|
376
|
+
it 'returns false, always' do
|
377
|
+
e1 = 'SELECT max(num) AS max FROM TestTable1.win:time(5 sec)'
|
378
|
+
q1 = Norikra::Query.new(:name => 'q1', :group => nil, :expression => e1)
|
379
|
+
expect(q1.suspended?).to be_false
|
380
|
+
end
|
381
|
+
end
|
382
|
+
|
365
383
|
describe '.rewrite_event_field_name' do
|
366
384
|
context 'without any container field access' do
|
367
385
|
expression = 'select count(*) as cnt from TestTable.win:time_batch(10 seconds) where path="/" and size>100 and (param.length())>0'
|
@@ -742,3 +760,5 @@ describe Norikra::Query do
|
|
742
760
|
end
|
743
761
|
end
|
744
762
|
end
|
763
|
+
|
764
|
+
#TODO: write specs about Norikra::SuspendedQuery
|
data/views/index.erb
CHANGED
@@ -65,12 +65,15 @@
|
|
65
65
|
|
66
66
|
<% if queries.size > 0 %>
|
67
67
|
<table class="table">
|
68
|
-
<tr><th>Group</th><th>Query name</th><th>Targets</th><th>Query</th><th style="text-align:right;">Events</th><th></th><th></th></tr>
|
69
|
-
<% queries.each_with_index do |query, index| %>
|
70
68
|
<tr>
|
69
|
+
<th>Group</th><th>Query name</th><th>Targets</th><th>Query</th><th style="text-align:right;">Events</th><th></th><th></th><th></th>
|
70
|
+
</tr>
|
71
|
+
<% queries.each_with_index do |query, index| %>
|
72
|
+
<tr class="<%= query.suspended? ? "suspended" : "" %>">
|
71
73
|
<td><%= query.group || "(default)" %></td>
|
72
74
|
<td><%= query.name %></td>
|
73
75
|
<td><%= query.targets.join(", ") %></td>
|
76
|
+
<td><%= query.suspended? ? "suspended" : "" %></td>
|
74
77
|
<td>
|
75
78
|
<button class="btn btn-default btn-xs show-query-expression" data-load="/json/query/<%= query.name %>">show query</button>
|
76
79
|
</td>
|
@@ -82,6 +85,63 @@
|
|
82
85
|
</button>
|
83
86
|
<% end %>
|
84
87
|
</td>
|
88
|
+
<td>
|
89
|
+
<% if query.suspended? %>
|
90
|
+
<a class="btn btn-info btn-xs" data-toggle="modal" href="#resumeQuery<%= index %>">
|
91
|
+
<span class="glyphicon glyphicon-play"></span>
|
92
|
+
</a>
|
93
|
+
<div class="modal fade"
|
94
|
+
id="resumeQuery<%= index %>"
|
95
|
+
tabindex="-1" role="dialog" aria-labelledby="resumeQueryLabel<%= index %>" aria-hidden="true">
|
96
|
+
<div class="modal-dialog">
|
97
|
+
<div class="modal-content">
|
98
|
+
<div class="modal-header">
|
99
|
+
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
|
100
|
+
<h4 class="modal-title">Resume Query <%= query.name %></h4>
|
101
|
+
</div>
|
102
|
+
<div class="modal-body">
|
103
|
+
<p>name: <%= query.name %>, group: <%= query.group || "(default)" %></p>
|
104
|
+
<pre><%= query.expression %></pre>
|
105
|
+
</div>
|
106
|
+
<div class="modal-footer">
|
107
|
+
<form class="form-inline" action="/resume" method="POST">
|
108
|
+
<input type="hidden" name="query_name" value="<%= query.name %>" />
|
109
|
+
<button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
|
110
|
+
<button type="submit" class="btn btn-primary">Resume</button>
|
111
|
+
</form>
|
112
|
+
</div>
|
113
|
+
</div><!-- /.modal-content -->
|
114
|
+
</div><!-- /.modal-dialog -->
|
115
|
+
</div><!-- /.modal -->
|
116
|
+
<% else %>
|
117
|
+
<a class="btn btn-warning btn-xs" data-toggle="modal" href="#suspendQuery<%= index %>">
|
118
|
+
<span class="glyphicon glyphicon-pause"></span>
|
119
|
+
</a>
|
120
|
+
<div class="modal fade"
|
121
|
+
id="suspendQuery<%= index %>"
|
122
|
+
tabindex="-1" role="dialog" aria-labelledby="suspendQueryLabel<%= index %>" aria-hidden="true">
|
123
|
+
<div class="modal-dialog">
|
124
|
+
<div class="modal-content">
|
125
|
+
<div class="modal-header">
|
126
|
+
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
|
127
|
+
<h4 class="modal-title">Suspend Query <%= query.name %></h4>
|
128
|
+
</div>
|
129
|
+
<div class="modal-body">
|
130
|
+
<p>name: <%= query.name %>, group: <%= query.group || "(default)" %></p>
|
131
|
+
<pre><%= query.expression %></pre>
|
132
|
+
</div>
|
133
|
+
<div class="modal-footer">
|
134
|
+
<form class="form-inline" action="/suspend" method="POST">
|
135
|
+
<input type="hidden" name="query_name" value="<%= query.name %>" />
|
136
|
+
<button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
|
137
|
+
<button type="submit" class="btn btn-danger">Suspend</button>
|
138
|
+
</form>
|
139
|
+
</div>
|
140
|
+
</div><!-- /.modal-content -->
|
141
|
+
</div><!-- /.modal-dialog -->
|
142
|
+
</div><!-- /.modal -->
|
143
|
+
<% end %>
|
144
|
+
</td>
|
85
145
|
<td>
|
86
146
|
<a class="btn btn-danger btn-xs" data-toggle="modal" href="#removeQuery<%= index %>">
|
87
147
|
<span class="glyphicon glyphicon-trash"></span>
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: norikra
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: java
|
6
6
|
authors:
|
7
7
|
- TAGOMORI Satoshi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-11-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: mizuno
|
@@ -72,12 +72,12 @@ dependencies:
|
|
72
72
|
requirements:
|
73
73
|
- - '>='
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: 1.
|
75
|
+
version: 1.1.0
|
76
76
|
requirement: !ruby/object:Gem::Requirement
|
77
77
|
requirements:
|
78
78
|
- - '>='
|
79
79
|
- !ruby/object:Gem::Version
|
80
|
-
version: 1.
|
80
|
+
version: 1.1.0
|
81
81
|
prerelease: false
|
82
82
|
type: :runtime
|
83
83
|
- !ruby/object:Gem::Dependency
|