drnbench 1.0.3 → 1.0.4
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/bin/drnbench-publish-subscribe +1 -0
- data/bin/drnbench-request-response +6 -0
- data/doc/text/news.md +10 -1
- data/drnbench.gemspec +2 -0
- data/lib/drnbench/client/http-droonga.rb +2 -2
- data/lib/drnbench/client/http.rb +33 -28
- data/lib/drnbench/request-response/configuration.rb +3 -1
- data/lib/drnbench/request-response/request-pattern.rb +10 -7
- data/lib/drnbench/request-response/result.rb +41 -15
- data/lib/drnbench/request-response/runner.rb +160 -20
- data/lib/drnbench/version.rb +1 -1
- metadata +30 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6f1ededc12c542fd3d9cdd9f908e3488aa4e4e22
|
4
|
+
data.tar.gz: 6c42a7d169c1880cc272e3d652c4cfabe532432b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c611caff29de7e18bee469d17501a6a24570fdb68a464c9d53c2a6e6bf42471d2406f69c52c70f43f340aa99f62f8f946b28fccd92a3625113870344ceba229a
|
7
|
+
data.tar.gz: edd62ed000afc56ea5feb077597859efdbd8026a5f37d75f6137fa0ae6c4c94d8acbcc1c0358ebedbaa91bdcfd9fe55a3b637433d0b77d6c15cda68b99324146
|
@@ -18,6 +18,7 @@
|
|
18
18
|
|
19
19
|
require "drnbench"
|
20
20
|
require "optparse"
|
21
|
+
require "sigdump/setup"
|
21
22
|
|
22
23
|
config = Drnbench::RequestResponse::Configuration.new
|
23
24
|
option_parser = OptionParser.new do |parser|
|
@@ -39,6 +40,11 @@ option_parser = OptionParser.new do |parser|
|
|
39
40
|
"(#{config.n_slow_requests})") do |n_slow_requests|
|
40
41
|
config.n_slow_requests = n_slow_requests
|
41
42
|
end
|
43
|
+
parser.on("--n-fast-requests=N", Integer,
|
44
|
+
"Number of fast requests to be reported.",
|
45
|
+
"(#{config.n_fast_requests})") do |n_fast_requests|
|
46
|
+
config.n_fast_requests = n_fast_requests
|
47
|
+
end
|
42
48
|
|
43
49
|
parser.separator("")
|
44
50
|
parser.separator("Progressive benchmark:")
|
data/doc/text/news.md
CHANGED
@@ -1,6 +1,15 @@
|
|
1
1
|
# News
|
2
2
|
|
3
|
-
## 1.0.
|
3
|
+
## 1.0.4: 2014-11-29
|
4
|
+
|
5
|
+
* `drnbench-request-response`
|
6
|
+
* Not only top slow requests, but top fast requests are also reported.
|
7
|
+
It will help you to detect "strange good" results from invalid queries or something.
|
8
|
+
The number of reported fast requests can be customized via the new `--n-fast-requests` option.
|
9
|
+
* Virtual clients are working with multiple processes.
|
10
|
+
If there are multiple processors in your computer, drnbench uses them more effectively.
|
11
|
+
|
12
|
+
## 1.0.3: 2014-10-07
|
4
13
|
|
5
14
|
* `drnbench-request-response`
|
6
15
|
* Accept multiple hosts as a comma separated list via the `--default-hosts` option.
|
data/drnbench.gemspec
CHANGED
@@ -51,6 +51,8 @@ Gem::Specification.new do |spec|
|
|
51
51
|
spec.add_runtime_dependency("json")
|
52
52
|
spec.add_runtime_dependency("droonga-client")
|
53
53
|
spec.add_runtime_dependency("drntest")
|
54
|
+
spec.add_runtime_dependency("facter")
|
55
|
+
spec.add_runtime_dependency("sigdump")
|
54
56
|
|
55
57
|
spec.add_development_dependency("bundler")
|
56
58
|
spec.add_development_dependency("rake")
|
@@ -19,9 +19,9 @@ module Drnbench
|
|
19
19
|
DEFAULT_COMMAND = "search"
|
20
20
|
DEFAULT_METHOD = "POST"
|
21
21
|
|
22
|
-
def initialize(params
|
22
|
+
def initialize(params)
|
23
23
|
super
|
24
|
-
@command = params[
|
24
|
+
@command = params[:command] || DEFAULT_COMMAND
|
25
25
|
end
|
26
26
|
|
27
27
|
private
|
data/lib/drnbench/client/http.rb
CHANGED
@@ -16,59 +16,68 @@
|
|
16
16
|
require "thread"
|
17
17
|
require "droonga/client"
|
18
18
|
require "json"
|
19
|
+
require "drb"
|
19
20
|
|
20
21
|
module Drnbench
|
21
22
|
class HttpClient
|
22
|
-
attr_reader :
|
23
|
+
attr_reader :runner, :results, :wait
|
23
24
|
|
24
25
|
SUPPORTED_HTTP_METHODS = ["GET", "POST"]
|
25
26
|
|
26
27
|
@@count = 0
|
27
28
|
|
28
|
-
def initialize(params
|
29
|
-
@
|
30
|
-
@
|
31
|
-
@config = config
|
29
|
+
def initialize(params)
|
30
|
+
@runner = params[:runner]
|
31
|
+
@config = params[:config]
|
32
32
|
@count = 0
|
33
33
|
@id = @@count
|
34
34
|
@@count += 1
|
35
|
+
@thread = nil
|
35
36
|
end
|
36
37
|
|
37
38
|
def run
|
38
39
|
@thread = Thread.new do
|
40
|
+
clients = {}
|
41
|
+
start_time = Time.now
|
39
42
|
loop do
|
40
|
-
|
43
|
+
if @runner.empty?
|
44
|
+
puts "WORNING: requests queue becomes empty! (#{Time.now - start_time} sec)"
|
45
|
+
stop
|
46
|
+
break
|
47
|
+
end
|
48
|
+
|
49
|
+
request = @runner.pop_request
|
41
50
|
request = fixup_request(request)
|
42
51
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
52
|
+
client_params = {
|
53
|
+
:protocol => :http,
|
54
|
+
:host => request["host"],
|
55
|
+
:port => request["port"],
|
56
|
+
:timeout => request["timeout"],
|
57
|
+
}
|
58
|
+
client = clients[client_params.to_s] ||= Droonga::Client.new(client_params)
|
59
|
+
|
47
60
|
request["headers"] ||= {}
|
48
61
|
request["headers"]["user-agent"] = "Ruby/#{RUBY_VERSION} Droonga::Benchmark::Runner::HttpClient"
|
49
62
|
start_time = Time.now
|
50
|
-
@last_request = request
|
51
|
-
@last_start_time = start_time
|
52
63
|
begin
|
53
64
|
response = client.request(request)
|
54
|
-
@
|
65
|
+
@runner.push_result(
|
55
66
|
:request => request,
|
56
67
|
:status => response.code,
|
57
68
|
:elapsed_time => Time.now - start_time,
|
58
69
|
:client => @id,
|
59
70
|
:index => @count,
|
60
|
-
|
71
|
+
)
|
61
72
|
rescue Timeout::Error
|
62
|
-
@
|
73
|
+
@runner.push_result(
|
63
74
|
:request => request,
|
64
75
|
:status => "0",
|
65
76
|
:elapsed_time => Time.now - start_time,
|
66
77
|
:client => @id,
|
67
78
|
:index => @count,
|
68
|
-
|
79
|
+
)
|
69
80
|
end
|
70
|
-
@last_request = nil
|
71
|
-
@last_start_time = nil
|
72
81
|
@count += 1
|
73
82
|
sleep @config.wait
|
74
83
|
end
|
@@ -77,18 +86,14 @@ module Drnbench
|
|
77
86
|
end
|
78
87
|
|
79
88
|
def stop
|
89
|
+
return unless @thread
|
90
|
+
|
80
91
|
@thread.exit
|
92
|
+
@thread = nil
|
93
|
+
end
|
81
94
|
|
82
|
-
|
83
|
-
|
84
|
-
:request => @last_request,
|
85
|
-
:status => "0",
|
86
|
-
:elapsed_time => Time.now - @last_start_time,
|
87
|
-
:client => @id,
|
88
|
-
:index => @count,
|
89
|
-
:last => true,
|
90
|
-
}
|
91
|
-
end
|
95
|
+
def running?
|
96
|
+
not @thread.nil?
|
92
97
|
end
|
93
98
|
|
94
99
|
private
|
@@ -19,7 +19,8 @@ module Drnbench
|
|
19
19
|
module RequestResponse
|
20
20
|
class Configuration
|
21
21
|
attr_accessor :duration, :wait, :interval, :request_patterns_file
|
22
|
-
attr_accessor :start_n_clients, :end_n_clients, :step, :n_requests
|
22
|
+
attr_accessor :start_n_clients, :end_n_clients, :step, :n_requests
|
23
|
+
attr_accessor :n_slow_requests, :n_fast_requests
|
23
24
|
attr_accessor :mode
|
24
25
|
attr_reader :default_hosts
|
25
26
|
attr_accessor :default_port, :default_path, :default_method, :default_timeout
|
@@ -38,6 +39,7 @@ module Drnbench
|
|
38
39
|
@n_requests = 1000
|
39
40
|
@mode = :http
|
40
41
|
@n_slow_requests = 5
|
42
|
+
@n_fast_requests = 5
|
41
43
|
|
42
44
|
@default_hosts = ["localhost"]
|
43
45
|
@default_port = 80
|
@@ -66,9 +66,17 @@ module Drnbench
|
|
66
66
|
groups.each do |group|
|
67
67
|
n_requests = @config.n_requests * @config.end_n_clients * group.frequency
|
68
68
|
base_patterns = group.patterns.shuffle
|
69
|
-
n_requests.
|
69
|
+
n_requests.ceil.times do |count|
|
70
70
|
pattern = base_patterns[count % base_patterns.size]
|
71
|
-
|
71
|
+
if @config.default_hosts.size > 1
|
72
|
+
@config.default_hosts.each do |host|
|
73
|
+
request = pattern.to_request
|
74
|
+
request["host"] ||= host
|
75
|
+
requests << request
|
76
|
+
end
|
77
|
+
else
|
78
|
+
requests << pattern.to_request
|
79
|
+
end
|
72
80
|
end
|
73
81
|
end
|
74
82
|
requests
|
@@ -172,11 +180,6 @@ module Drnbench
|
|
172
180
|
end
|
173
181
|
|
174
182
|
def to_request
|
175
|
-
@populated ||= populate
|
176
|
-
end
|
177
|
-
|
178
|
-
private
|
179
|
-
def populate
|
180
183
|
if @source.is_a?(String)
|
181
184
|
request = { "path" => @source }
|
182
185
|
else
|
@@ -16,7 +16,7 @@
|
|
16
16
|
module Drnbench
|
17
17
|
module RequestResponse
|
18
18
|
class Result
|
19
|
-
attr_reader :n_clients, :statuses, :n_slow_requests
|
19
|
+
attr_reader :n_clients, :statuses, :n_slow_requests, :n_fast_requests
|
20
20
|
attr_accessor :duration
|
21
21
|
|
22
22
|
class << self
|
@@ -36,6 +36,7 @@ module Drnbench
|
|
36
36
|
@n_clients = params[:n_clients]
|
37
37
|
@duration = params[:duration]
|
38
38
|
@n_slow_requests = params[:n_slow_requests] || 5
|
39
|
+
@n_fast_requests = params[:n_fast_requests] || 5
|
39
40
|
|
40
41
|
@results = []
|
41
42
|
@total_elapsed_time = 0.0
|
@@ -44,6 +45,10 @@ module Drnbench
|
|
44
45
|
end
|
45
46
|
|
46
47
|
def <<(result)
|
48
|
+
push(result)
|
49
|
+
end
|
50
|
+
|
51
|
+
def push(result)
|
47
52
|
clear_cached_statistics
|
48
53
|
|
49
54
|
@results << result
|
@@ -85,21 +90,31 @@ module Drnbench
|
|
85
90
|
|
86
91
|
def top_slow_requests
|
87
92
|
slow_requests[0..@n_slow_requests-1].collect do |result|
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
93
|
+
format_result_for_request_line(result)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def top_fast_requests
|
98
|
+
fast_requests[0..@n_fast_requests-1].collect do |result|
|
99
|
+
format_result_for_request_line(result)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
def format_result_for_request_line(result)
|
104
|
+
request = result[:request]
|
105
|
+
status = result[:status].to_i
|
106
|
+
if status.zero?
|
107
|
+
status = "#{status}(aborted)"
|
102
108
|
end
|
109
|
+
index = result[:index]
|
110
|
+
index = "#{index}(last)" if result[:last]
|
111
|
+
[
|
112
|
+
"#{result[:elapsed_time]} sec:",
|
113
|
+
request["method"],
|
114
|
+
status,
|
115
|
+
"<#{result[:client]}>#{index}",
|
116
|
+
"http://#{request["host"]}:#{request["port"]}#{request["path"]}",
|
117
|
+
].join(" ")
|
103
118
|
end
|
104
119
|
|
105
120
|
def slow_requests
|
@@ -108,6 +123,12 @@ module Drnbench
|
|
108
123
|
end
|
109
124
|
end
|
110
125
|
|
126
|
+
def fast_requests
|
127
|
+
@results.sort do |a, b|
|
128
|
+
a[:elapsed_time] <=> b[:elapsed_time]
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
111
132
|
def to_s
|
112
133
|
"Total requests: #{total_n_requests} " +
|
113
134
|
"(#{queries_per_second} queries per second)\n" +
|
@@ -119,6 +140,11 @@ module Drnbench
|
|
119
140
|
" min: #{min_elapsed_time} sec\n" +
|
120
141
|
" max: #{max_elapsed_time} sec\n" +
|
121
142
|
" average: #{average_elapsed_time} sec\n" +
|
143
|
+
"Top #{@n_fast_requests} fast requests:\n" +
|
144
|
+
" [time: method status <client>index url]\n" +
|
145
|
+
top_fast_requests.collect do |request|
|
146
|
+
" #{request}"
|
147
|
+
end.join("\n") + "\n" +
|
122
148
|
"Top #{@n_slow_requests} slow requests:\n" +
|
123
149
|
" [time: method status <client>index url]\n" +
|
124
150
|
top_slow_requests.collect do |request|
|
@@ -13,6 +13,7 @@
|
|
13
13
|
# You should have received a copy of the GNU General Public License
|
14
14
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
15
15
|
|
16
|
+
require "facter"
|
16
17
|
require "drnbench/client/http"
|
17
18
|
require "drnbench/client/http-droonga"
|
18
19
|
require "drnbench/request-response/result"
|
@@ -23,6 +24,10 @@ module Drnbench
|
|
23
24
|
class Runner
|
24
25
|
attr_reader :n_clients, :result
|
25
26
|
|
27
|
+
MESSAGE_EXIT = "exit"
|
28
|
+
MESSAGE_START = "start"
|
29
|
+
MESSAGE_COMPLETE = "complete"
|
30
|
+
|
26
31
|
def initialize(n_clients, config)
|
27
32
|
n_clients = 1 if n_clients.zero?
|
28
33
|
@n_clients = n_clients
|
@@ -37,50 +42,185 @@ module Drnbench
|
|
37
42
|
@result
|
38
43
|
end
|
39
44
|
|
45
|
+
def pop_request
|
46
|
+
@requests.pop
|
47
|
+
end
|
48
|
+
|
49
|
+
def push_result(result)
|
50
|
+
@result << result
|
51
|
+
end
|
52
|
+
|
53
|
+
def empty?
|
54
|
+
@requests.empty?
|
55
|
+
end
|
56
|
+
|
40
57
|
private
|
41
58
|
def process_requests
|
59
|
+
@result = Result.new(:n_clients => @n_clients,
|
60
|
+
:duration => @config.duration,
|
61
|
+
:n_fast_requests => @config.n_fast_requests,
|
62
|
+
:n_slow_requests => @config.n_slow_requests)
|
63
|
+
|
64
|
+
setup_child_processes
|
65
|
+
initiate_child_processes
|
66
|
+
wait_for_given_duration
|
67
|
+
kill_child_processes
|
68
|
+
|
69
|
+
@result
|
70
|
+
end
|
71
|
+
|
72
|
+
def setup_child_processes
|
73
|
+
@child_processes = []
|
74
|
+
@total_n_clients = 0
|
75
|
+
n_processes.times.each do |index|
|
76
|
+
setup_child_process
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def setup_child_process
|
81
|
+
n_clients = n_clients_per_process
|
82
|
+
if @total_n_clients + n_clients > @n_clients
|
83
|
+
n_clients = @n_clients - @total_n_clients
|
84
|
+
end
|
85
|
+
return if n_clients <= 0
|
86
|
+
|
87
|
+
# Prepare request queue for child process at first
|
88
|
+
# to reduce needless inter-process communications (IPC) while running!
|
42
89
|
requests_queue = Queue.new
|
43
|
-
@requests.each do |request|
|
90
|
+
@requests.slice!(0..n_requests_per_process).each do |request|
|
44
91
|
requests_queue.push(request)
|
45
92
|
end
|
46
93
|
|
47
|
-
|
48
|
-
|
49
|
-
|
94
|
+
parent_read, child_write = IO.pipe
|
95
|
+
child_read, parent_write = IO.pipe
|
96
|
+
|
97
|
+
pid = fork do
|
98
|
+
|
99
|
+
parent_write.close
|
100
|
+
parent_read.close
|
101
|
+
druby_uri = child_read.gets.chomp
|
102
|
+
@parent = DRbObject.new_with_uri(druby_uri)
|
103
|
+
|
104
|
+
@requests = requests_queue
|
105
|
+
@result = []
|
106
|
+
|
107
|
+
# Because continuous benchmark increases objects,
|
108
|
+
# GC painflly slows down the process.
|
109
|
+
GC.start
|
110
|
+
GC.disable
|
50
111
|
|
51
|
-
|
52
|
-
|
53
|
-
|
112
|
+
clients = setup_clients(n_clients)
|
113
|
+
|
114
|
+
loop do
|
115
|
+
message = child_read.gets
|
116
|
+
if message and message.chomp == MESSAGE_EXIT
|
117
|
+
clients.each(&:stop)
|
118
|
+
# We also should reduce IPC for results.
|
119
|
+
@result.each do |result|
|
120
|
+
@parent.push_result(result)
|
121
|
+
end
|
122
|
+
child_write.puts(MESSAGE_COMPLETE)
|
123
|
+
child_write.close
|
124
|
+
exit!
|
125
|
+
end
|
126
|
+
sleep(3)
|
127
|
+
end
|
128
|
+
end
|
129
|
+
@child_processes << {
|
130
|
+
:pid => pid,
|
131
|
+
:input => parent_read,
|
132
|
+
:output => parent_write,
|
54
133
|
}
|
55
|
-
|
56
|
-
|
134
|
+
|
135
|
+
requests_queue = nil
|
136
|
+
|
137
|
+
child_read.close
|
138
|
+
child_write.close
|
139
|
+
end
|
140
|
+
|
141
|
+
def setup_clients(count)
|
142
|
+
count.times.collect do |index|
|
57
143
|
case @config.mode
|
58
144
|
when :http
|
59
|
-
client = HttpClient.new(
|
145
|
+
client = HttpClient.new(:runner => self,
|
146
|
+
:config => @config)
|
60
147
|
when :http_droonga
|
61
|
-
client = HttpDroongaClient.new(
|
148
|
+
client = HttpDroongaClient.new(:runner => self,
|
149
|
+
:config => @config)
|
62
150
|
else
|
63
151
|
raise ArgumentError.new("Unknown mode: #{@config.mode}")
|
64
152
|
end
|
65
153
|
client.run
|
66
154
|
client
|
67
155
|
end
|
156
|
+
end
|
157
|
+
|
158
|
+
def initiate_child_processes
|
159
|
+
DRb.start_service("druby://localhost:0", self)
|
160
|
+
@child_processes.each do |child|
|
161
|
+
child[:output].puts(DRb.uri)
|
162
|
+
end
|
163
|
+
end
|
68
164
|
|
165
|
+
ONE_MINUTE_IN_SECONDS = 60
|
166
|
+
ONE_HOUR_IN_SECONDS = ONE_MINUTE_IN_SECONDS * 60
|
167
|
+
|
168
|
+
def wait_for_given_duration
|
69
169
|
start_time = Time.now
|
70
|
-
|
170
|
+
last_message = ""
|
171
|
+
loop do
|
71
172
|
sleep 1
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
173
|
+
elapsed_time = (Time.now - start_time).to_i
|
174
|
+
break if elapsed_time >= @config.duration
|
175
|
+
|
176
|
+
remaining_seconds = @config.duration - elapsed_time
|
177
|
+
remaining_hours = (remaining_seconds / ONE_HOUR_IN_SECONDS).floor
|
178
|
+
remaining_seconds -= remaining_hours * ONE_HOUR_IN_SECONDS
|
179
|
+
remaining_minutes = (remaining_seconds / ONE_MINUTE_IN_SECONDS).floor
|
180
|
+
remaining_seconds -= remaining_minutes * ONE_MINUTE_IN_SECONDS
|
181
|
+
remaining_time = sprintf("%02i:%02i:%02i", remaining_hours, remaining_minutes, remaining_seconds)
|
182
|
+
next_message = "#{remaining_time} remaining..."
|
183
|
+
printf("%s", "#{" " * last_message.size}\r")
|
184
|
+
printf("%s", "#{next_message}\r")
|
185
|
+
last_message = next_message
|
77
186
|
end
|
187
|
+
end
|
188
|
+
|
189
|
+
def kill_child_processes
|
190
|
+
puts "Collecting results..."
|
78
191
|
|
79
|
-
@
|
80
|
-
|
192
|
+
@child_processes.each do |child|
|
193
|
+
child[:output].puts(MESSAGE_EXIT)
|
81
194
|
end
|
82
195
|
|
83
|
-
|
196
|
+
loop do
|
197
|
+
@child_processes = @child_processes.reject do |child|
|
198
|
+
message = child[:input].gets
|
199
|
+
if message and message.chomp == MESSAGE_COMPLETE
|
200
|
+
Process.detach(child[:pid])
|
201
|
+
true
|
202
|
+
else
|
203
|
+
false
|
204
|
+
end
|
205
|
+
end
|
206
|
+
break if @child_processes.empty?
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
def n_processes
|
211
|
+
[[@n_clients, 1].max, max_n_processes].min
|
212
|
+
end
|
213
|
+
|
214
|
+
def max_n_processes
|
215
|
+
Facter["processorcount"].value.to_i
|
216
|
+
end
|
217
|
+
|
218
|
+
def n_clients_per_process
|
219
|
+
(@n_clients.to_f / n_processes).ceil
|
220
|
+
end
|
221
|
+
|
222
|
+
def n_requests_per_process
|
223
|
+
(@requests.size.to_f / n_processes).round
|
84
224
|
end
|
85
225
|
end
|
86
226
|
end
|
data/lib/drnbench/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: drnbench
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- YUKI Hiroshi
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-
|
12
|
+
date: 2014-11-28 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: json
|
@@ -53,6 +53,34 @@ dependencies:
|
|
53
53
|
- - '>='
|
54
54
|
- !ruby/object:Gem::Version
|
55
55
|
version: '0'
|
56
|
+
- !ruby/object:Gem::Dependency
|
57
|
+
name: facter
|
58
|
+
requirement: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - '>='
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
63
|
+
type: :runtime
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
- !ruby/object:Gem::Dependency
|
71
|
+
name: sigdump
|
72
|
+
requirement: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - '>='
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
77
|
+
type: :runtime
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - '>='
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: '0'
|
56
84
|
- !ruby/object:Gem::Dependency
|
57
85
|
name: bundler
|
58
86
|
requirement: !ruby/object:Gem::Requirement
|