gauge-ruby 0.2.1 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/code_parser.rb +8 -4
- data/lib/configuration.rb +23 -1
- data/lib/executor.rb +7 -1
- data/lib/gauge.rb +16 -1
- data/lib/gauge_runtime.rb +1 -0
- data/lib/messages.pb.rb +1 -0
- data/lib/method_cache.rb +16 -2
- data/lib/processors/execute_step_request_processor.rb +1 -1
- data/lib/processors/execution_handler.rb +10 -9
- data/lib/processors/refactor_step_request_processor.rb +9 -1
- data/lib/processors/step_validation_request_processor.rb +14 -3
- data/lib/spec.pb.rb +24 -0
- data/lib/table.rb +25 -7
- data/lib/util.rb +37 -0
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3d02594acc904fc72ca2ee33b36d035f16a2f7d6
|
4
|
+
data.tar.gz: 101648409eacd64b386ee67a779676fb4c7e3d34
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4447626f14695ddf0f3ce41562007a4544e4f55451ef0a9d613c83e552f8d1c2c77a04c41021826ae58f31edfb4bbaf18753a4048064d4cb33ed74aabee3012b
|
7
|
+
data.tar.gz: 99a5cf6190e7e4ab33736ee3dfd15c7b568a30d6fee44681341c4123664f0ddc91b0fca511f47fd489ba23d9e9a9d3a5074ee452ee9bee82dd42c5c995e54713
|
data/lib/code_parser.rb
CHANGED
@@ -19,6 +19,7 @@ require 'parser/current'
|
|
19
19
|
require 'method_source'
|
20
20
|
require 'fileutils'
|
21
21
|
require 'tempfile'
|
22
|
+
require 'util'
|
22
23
|
|
23
24
|
module Gauge
|
24
25
|
# @api private
|
@@ -32,9 +33,13 @@ module Gauge
|
|
32
33
|
def self.refactor_args(code, param_positions, new_param_values, new_step_text)
|
33
34
|
new_params = []
|
34
35
|
args = step_args_from_code code
|
35
|
-
param_positions.sort_by!(&:newPosition).each { |e|
|
36
|
+
param_positions.sort_by!(&:newPosition).each.with_index { |e,i|
|
36
37
|
if e.oldPosition == -1
|
37
|
-
|
38
|
+
param = Util.remove_special_chars new_param_values[e.newPosition].downcase.split.join('_')
|
39
|
+
if param == ''
|
40
|
+
param = i
|
41
|
+
end
|
42
|
+
new_params[e.newPosition] = "arg_#{param}"
|
38
43
|
else
|
39
44
|
new_params[e.newPosition] = args[e.oldPosition].children[0]
|
40
45
|
end
|
@@ -58,8 +63,7 @@ module Gauge
|
|
58
63
|
|
59
64
|
def self.refactor(code, param_positions, new_param_values, new_step_text)
|
60
65
|
source_code=code.source
|
61
|
-
|
62
|
-
file, line = code.source_location
|
66
|
+
file, _ = code.source_location
|
63
67
|
refactored_code=refactor_args(source_code, param_positions, new_param_values, new_step_text)
|
64
68
|
tmp_file = Tempfile.new File.basename(file, ".rb")
|
65
69
|
tmp_file.write(File.open(file, "r") { |f| f.read.gsub(source_code, refactored_code)})
|
data/lib/configuration.rb
CHANGED
@@ -22,7 +22,8 @@ module Gauge
|
|
22
22
|
class << self
|
23
23
|
# @api public
|
24
24
|
# Custom configuration for Gauge
|
25
|
-
# Lets you configure modules that need to be included at runtime.
|
25
|
+
# - Lets you configure modules that need to be included at runtime.
|
26
|
+
# - Lets you define a custom screengrabber, which will be invoked to capture screenshot on failure.
|
26
27
|
#
|
27
28
|
# @example
|
28
29
|
# # Given there are two modules defined
|
@@ -37,6 +38,12 @@ module Gauge
|
|
37
38
|
# Gauge.configure do |config|
|
38
39
|
# config.include Foo, Bar
|
39
40
|
# end
|
41
|
+
# @example
|
42
|
+
# # Default behaviour is to capture the active desktop at the point of failure.
|
43
|
+
# # The implementation should return a byte array of the image.
|
44
|
+
# Gauge.configure do |config|
|
45
|
+
# config.screengrabber = -> { return File.binread("/path/to/screenshot")}
|
46
|
+
# end
|
40
47
|
def configure(&block)
|
41
48
|
Configuration.instance.instance_eval &block
|
42
49
|
end
|
@@ -46,6 +53,13 @@ module Gauge
|
|
46
53
|
class Configuration
|
47
54
|
def initialize
|
48
55
|
@includes=[]
|
56
|
+
@screengrabber = -> {
|
57
|
+
file = File.open("#{Dir.tmpdir}/screenshot.png", "w+")
|
58
|
+
`gauge_screenshot #{file.path}`
|
59
|
+
file_content = File.binread(file.path)
|
60
|
+
File.delete file
|
61
|
+
return file_content
|
62
|
+
}
|
49
63
|
end
|
50
64
|
|
51
65
|
def self.instance
|
@@ -60,6 +74,14 @@ module Gauge
|
|
60
74
|
@includes
|
61
75
|
end
|
62
76
|
|
77
|
+
def screengrabber
|
78
|
+
@screengrabber
|
79
|
+
end
|
80
|
+
|
81
|
+
def screengrabber=(block)
|
82
|
+
@screengrabber=block
|
83
|
+
end
|
84
|
+
|
63
85
|
def self.include_configured_modules
|
64
86
|
# include all modules that have been configured
|
65
87
|
# TODO: move this feature to something more specific, ex look at supporting Sandboxed execution.
|
data/lib/executor.rb
CHANGED
@@ -21,7 +21,13 @@ module Gauge
|
|
21
21
|
# @api private
|
22
22
|
module Executor
|
23
23
|
def self.load_steps(steps_implementation_dir)
|
24
|
-
Dir["#{steps_implementation_dir}/**/*.rb"].each { |x|
|
24
|
+
Dir["#{steps_implementation_dir}/**/*.rb"].each { |x|
|
25
|
+
begin
|
26
|
+
require x
|
27
|
+
rescue Exception => e
|
28
|
+
puts "[ERROR] Cannot import #{x}. Reason: #{e.message}"
|
29
|
+
end
|
30
|
+
}
|
25
31
|
end
|
26
32
|
|
27
33
|
def self.execute_step(step, args)
|
data/lib/gauge.rb
CHANGED
@@ -89,13 +89,28 @@ module Kernel
|
|
89
89
|
# puts x.columns.join("|")
|
90
90
|
# x.rows.each { |r| puts r.join("|") }
|
91
91
|
# end
|
92
|
+
# @example
|
93
|
+
# # for a given step say
|
94
|
+
# # setting :continue_on_failure=>true in implementation will not break on failure of this step
|
95
|
+
# # and will continue to execute the next step in the scenario
|
96
|
+
# # * say "hello" to "gauge"
|
97
|
+
# step 'say <what> to <who>', :continue_on_failure => false do |what, who|
|
98
|
+
# puts "say #{what} to #{who}"
|
99
|
+
# raise "Some Failure"
|
100
|
+
# end
|
101
|
+
#
|
92
102
|
# @param step_texts [string, ...] the step text(s)
|
103
|
+
# @param opts [Hash] pass :continue_on_failure => true to tell Gauge not to break on failure for this step
|
93
104
|
# @param block [block] the implementation block for given step.
|
94
|
-
def step(*
|
105
|
+
def step(*args, &block)
|
106
|
+
opts = args.select {|x| x.is_a? Hash}
|
107
|
+
step_texts = args-opts
|
108
|
+
opts = {:continue_on_failure => false}.merge opts.reduce({}, :merge)
|
95
109
|
step_texts.each do |text|
|
96
110
|
parameterized_step_text = Gauge::Connector.step_value(text)
|
97
111
|
Gauge::MethodCache.add_step(parameterized_step_text, &block)
|
98
112
|
Gauge::MethodCache.add_step_text(parameterized_step_text, text)
|
113
|
+
Gauge::MethodCache.set_recoverable(parameterized_step_text) if opts[:continue_on_failure]
|
99
114
|
end
|
100
115
|
Gauge::MethodCache.add_step_alias(*step_texts)
|
101
116
|
end
|
data/lib/gauge_runtime.rb
CHANGED
data/lib/messages.pb.rb
CHANGED
data/lib/method_cache.rb
CHANGED
@@ -34,11 +34,16 @@ module Gauge
|
|
34
34
|
end
|
35
35
|
|
36
36
|
def self.add_step(parameterized_step_text, &block)
|
37
|
-
@@steps_map[parameterized_step_text] =
|
37
|
+
@@steps_map[parameterized_step_text] = @@steps_map[parameterized_step_text] || []
|
38
|
+
@@steps_map[parameterized_step_text].push(block)
|
38
39
|
end
|
39
40
|
|
40
41
|
def self.get_step(parameterized_step_text)
|
41
|
-
@@steps_map[parameterized_step_text]
|
42
|
+
@@steps_map[parameterized_step_text][0]
|
43
|
+
end
|
44
|
+
|
45
|
+
def self.get_steps(parameterized_step_text)
|
46
|
+
@@steps_map[parameterized_step_text] || []
|
42
47
|
end
|
43
48
|
|
44
49
|
def self.add_step_text(parameterized_step_text, step_text)
|
@@ -65,10 +70,19 @@ module Gauge
|
|
65
70
|
@@steps_text_map.values
|
66
71
|
end
|
67
72
|
|
73
|
+
def self.is_recoverable?(parameterized_step_text)
|
74
|
+
@@recoverable_steps.include? parameterized_step_text
|
75
|
+
end
|
76
|
+
|
77
|
+
def self.set_recoverable(parameterized_step_text)
|
78
|
+
@@recoverable_steps.push parameterized_step_text
|
79
|
+
end
|
80
|
+
|
68
81
|
private
|
69
82
|
@@steps_map = Hash.new
|
70
83
|
@@steps_text_map = Hash.new
|
71
84
|
@@steps_with_aliases = []
|
85
|
+
@@recoverable_steps = []
|
72
86
|
@@before_suite_hooks = []
|
73
87
|
@@after_suite_hooks = []
|
74
88
|
@@before_spec_hooks = []
|
@@ -29,7 +29,7 @@ module Gauge
|
|
29
29
|
begin
|
30
30
|
Executor.execute_step step_text, args
|
31
31
|
rescue Exception => e
|
32
|
-
return handle_failure message, e, time_elapsed_since(start_time)
|
32
|
+
return handle_failure message, e, time_elapsed_since(start_time), MethodCache.is_recoverable?(step_text)
|
33
33
|
end
|
34
34
|
handle_pass message, time_elapsed_since(start_time)
|
35
35
|
end
|
@@ -27,7 +27,7 @@ module Gauge
|
|
27
27
|
if execution_error == nil
|
28
28
|
return handle_pass message, time_elapsed_since(start_time)
|
29
29
|
else
|
30
|
-
return handle_failure message, execution_error, time_elapsed_since(start_time)
|
30
|
+
return handle_failure message, execution_error, time_elapsed_since(start_time), false
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
@@ -36,11 +36,11 @@ module Gauge
|
|
36
36
|
Messages::Message.new(:messageType => Messages::Message::MessageType::ExecutionStatusResponse, :messageId => message.messageId, :executionStatusResponse => execution_status_response)
|
37
37
|
end
|
38
38
|
|
39
|
-
def handle_failure(message, exception, execution_time)
|
39
|
+
def handle_failure(message, exception, execution_time, recoverable)
|
40
40
|
execution_status_response =
|
41
41
|
Messages::ExecutionStatusResponse.new(
|
42
42
|
:executionResult => Messages::ProtoExecutionResult.new(:failed => true,
|
43
|
-
:recoverableError =>
|
43
|
+
:recoverableError => recoverable,
|
44
44
|
:errorMessage => exception.message,
|
45
45
|
:stackTrace => exception.backtrace.join("\n")+"\n",
|
46
46
|
:executionTime => execution_time,
|
@@ -51,11 +51,12 @@ module Gauge
|
|
51
51
|
|
52
52
|
def screenshot_bytes
|
53
53
|
return nil if (ENV['screenshot_enabled'] || "").downcase == "false" || which("gauge_screenshot").nil?
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
54
|
+
begin
|
55
|
+
Configuration.instance.screengrabber.call
|
56
|
+
rescue Exception => e
|
57
|
+
puts e
|
58
|
+
return nil
|
59
|
+
end
|
59
60
|
end
|
60
61
|
|
61
62
|
def time_elapsed_since(start_time)
|
@@ -85,7 +86,7 @@ module Gauge
|
|
85
86
|
}
|
86
87
|
end
|
87
88
|
return nil
|
88
|
-
end
|
89
|
+
end
|
89
90
|
end
|
90
91
|
end
|
91
92
|
end
|
@@ -22,15 +22,23 @@ module Gauge
|
|
22
22
|
def refactor_step(message)
|
23
23
|
oldStepValue = message.refactorRequest.oldStepValue.stepValue
|
24
24
|
newStep = message.refactorRequest.newStepValue
|
25
|
-
stepBlock = MethodCache.get_step oldStepValue
|
26
25
|
refactor_response = Messages::RefactorResponse.new(success: true)
|
27
26
|
begin
|
27
|
+
stepBlock = get_step oldStepValue
|
28
28
|
CodeParser.refactor stepBlock, message.refactorRequest.paramPositions, newStep.parameters, newStep.parameterizedStepValue
|
29
|
+
file, _ = stepBlock.source_location
|
30
|
+
refactor_response.filesChanged = [file]
|
29
31
|
rescue Exception => e
|
30
32
|
refactor_response.success=false
|
31
33
|
refactor_response.error=e.message
|
32
34
|
end
|
33
35
|
Messages::Message.new(:messageType => Messages::Message::MessageType::RefactorResponse, :messageId => message.messageId, refactorResponse: refactor_response)
|
34
36
|
end
|
37
|
+
|
38
|
+
def get_step(step_text)
|
39
|
+
blocks = MethodCache.get_steps step_text
|
40
|
+
raise "Multiple step implementations found for => '#{step_text}'" if blocks.length > 1
|
41
|
+
blocks[0]
|
42
|
+
end
|
35
43
|
end
|
36
44
|
end
|
@@ -19,9 +19,20 @@ module Gauge
|
|
19
19
|
module Processors
|
20
20
|
def process_step_validation_request(message)
|
21
21
|
step_validate_request = message.stepValidateRequest
|
22
|
-
is_valid =
|
23
|
-
|
24
|
-
|
22
|
+
is_valid = true
|
23
|
+
msg = ''
|
24
|
+
err_type = nil
|
25
|
+
blocks = MethodCache.get_steps(step_validate_request.stepText)
|
26
|
+
if blocks.length > 1
|
27
|
+
is_valid = false
|
28
|
+
msg = "Multiple step implementations found for => '#{step_validate_request.stepText}'"
|
29
|
+
err_type = Messages::StepValidateResponse::ErrorType::DUPLICATE_STEP_IMPLEMENTATION
|
30
|
+
elsif blocks.length == 0
|
31
|
+
is_valid = false
|
32
|
+
msg = 'Step implementation not found'
|
33
|
+
err_type = Messages::StepValidateResponse::ErrorType::STEP_IMPLEMENTATION_NOT_FOUND
|
34
|
+
end
|
35
|
+
step_validate_response = Messages::StepValidateResponse.new(:isValid => is_valid, :errorMessage => msg, :errorType => err_type)
|
25
36
|
Messages::Message.new(:messageType => Messages::Message::MessageType::StepValidateResponse,
|
26
37
|
:messageId => message.messageId,
|
27
38
|
:stepValidateResponse => step_validate_response)
|
data/lib/spec.pb.rb
CHANGED
@@ -9,6 +9,7 @@ module Gauge
|
|
9
9
|
class ProtoSpec < ::ProtocolBuffers::Message; end
|
10
10
|
class ProtoItem < ::ProtocolBuffers::Message; end
|
11
11
|
class ProtoScenario < ::ProtocolBuffers::Message; end
|
12
|
+
class Span < ::ProtocolBuffers::Message; end
|
12
13
|
class ProtoTableDrivenScenario < ::ProtocolBuffers::Message; end
|
13
14
|
class ProtoStep < ::ProtocolBuffers::Message; end
|
14
15
|
class ProtoConcept < ::ProtocolBuffers::Message; end
|
@@ -80,6 +81,16 @@ module Gauge
|
|
80
81
|
optional :int64, :executionTime, 8
|
81
82
|
required :bool, :skipped, 9
|
82
83
|
repeated :string, :skipErrors, 10
|
84
|
+
optional :string, :ID, 11
|
85
|
+
repeated ::Gauge::Messages::ProtoItem, :tearDownSteps, 12
|
86
|
+
optional ::Gauge::Messages::Span, :span, 13
|
87
|
+
end
|
88
|
+
|
89
|
+
class Span < ::ProtocolBuffers::Message
|
90
|
+
set_fully_qualified_name "gauge.messages.Span"
|
91
|
+
|
92
|
+
required :int64, :start, 1
|
93
|
+
required :int64, :end, 2
|
83
94
|
end
|
84
95
|
|
85
96
|
class ProtoTableDrivenScenario < ::ProtocolBuffers::Message
|
@@ -185,6 +196,18 @@ module Gauge
|
|
185
196
|
end
|
186
197
|
|
187
198
|
class ProtoExecutionResult < ::ProtocolBuffers::Message
|
199
|
+
# forward declarations
|
200
|
+
|
201
|
+
# enums
|
202
|
+
module ErrorType
|
203
|
+
include ::ProtocolBuffers::Enum
|
204
|
+
|
205
|
+
set_fully_qualified_name "gauge.messages.ProtoExecutionResult.ErrorType"
|
206
|
+
|
207
|
+
ASSERTION = 1
|
208
|
+
VERIFICATION = 2
|
209
|
+
end
|
210
|
+
|
188
211
|
set_fully_qualified_name "gauge.messages.ProtoExecutionResult"
|
189
212
|
|
190
213
|
required :bool, :failed, 1
|
@@ -194,6 +217,7 @@ module Gauge
|
|
194
217
|
optional :bytes, :screenShot, 5
|
195
218
|
required :int64, :executionTime, 6
|
196
219
|
repeated :string, :message, 7
|
220
|
+
optional ::Gauge::Messages::ProtoExecutionResult::ErrorType, :errorType, 8, :default => ::Gauge::Messages::ProtoExecutionResult::ErrorType::ASSERTION
|
197
221
|
end
|
198
222
|
|
199
223
|
class ProtoHookFailure < ::ProtocolBuffers::Message
|
data/lib/table.rb
CHANGED
@@ -24,20 +24,18 @@ module Gauge
|
|
24
24
|
@columns = protoTable.headers.cells
|
25
25
|
@rows = []
|
26
26
|
protoTable.rows.each do |row|
|
27
|
-
@rows.push row.cells
|
27
|
+
@rows.push Row.new(@columns, row.cells)
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
31
31
|
# Gets the column headers of the table
|
32
32
|
# @return [string[]]
|
33
|
-
# @deprecated Use [] accessor instead
|
34
33
|
def columns
|
35
34
|
@columns
|
36
35
|
end
|
37
36
|
|
38
37
|
# Gets the rows of the table. The rows are two dimensional arrays.
|
39
38
|
# @return [string[][]]
|
40
|
-
# @deprecated Use {#[]} accessor instead
|
41
39
|
def rows
|
42
40
|
@rows
|
43
41
|
end
|
@@ -53,18 +51,38 @@ module Gauge
|
|
53
51
|
# table["Col1"] => ["Row1.Cell1", "Row1.Cell1", ...]
|
54
52
|
# table["Invalid_Col_Name"] => nil
|
55
53
|
def [](index)
|
56
|
-
return
|
54
|
+
return @rows[index] if index.is_a?(Integer)
|
57
55
|
column_values_as_array(index)
|
58
56
|
end
|
59
57
|
|
60
58
|
private
|
61
|
-
def row_values_as_hash(row)
|
62
|
-
row.nil? ? nil : Hash[@columns.zip(row)]
|
63
|
-
end
|
64
59
|
|
65
60
|
def column_values_as_array(col_name)
|
66
61
|
i = @columns.index col_name
|
67
62
|
i.nil? ? nil : @rows.map { |r| r[i] }
|
68
63
|
end
|
69
64
|
end
|
65
|
+
|
66
|
+
# Holds a row of a table.
|
67
|
+
# @api public
|
68
|
+
class Row
|
69
|
+
# @api private
|
70
|
+
def initialize(columns, values)
|
71
|
+
@values = values
|
72
|
+
@columns = columns
|
73
|
+
end
|
74
|
+
|
75
|
+
# Gets the row cell.
|
76
|
+
# @param index Either cell index, or Column name.
|
77
|
+
# @return [string] value of the row cell
|
78
|
+
# @example
|
79
|
+
# row[0] => 'value'
|
80
|
+
# row['column'] => 'value'
|
81
|
+
# row[i] => nil # when index is out of range
|
82
|
+
def [](index)
|
83
|
+
return @values[index] if index.is_a?(Integer)
|
84
|
+
columns_index = @columns.index(index)
|
85
|
+
columns_index.nil? ? nil : @values[columns_index]
|
86
|
+
end
|
87
|
+
end
|
70
88
|
end
|
data/lib/util.rb
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
# Copyright 2015 ThoughtWorks, Inc.
|
2
|
+
|
3
|
+
# This file is part of Gauge-Ruby.
|
4
|
+
|
5
|
+
# Gauge-Ruby is free software: you can redistribute it and/or modify
|
6
|
+
# it under the terms of the GNU General Public License as published by
|
7
|
+
# the Free Software Foundation, either version 3 of the License, or
|
8
|
+
# (at your option) any later version.
|
9
|
+
|
10
|
+
# Gauge-Ruby is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
# GNU General Public License for more details.
|
14
|
+
|
15
|
+
# You should have received a copy of the GNU General Public License
|
16
|
+
# along with Gauge-Ruby. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
|
18
|
+
module Gauge
|
19
|
+
class Util
|
20
|
+
def self.valid_variable_name?(var_name)
|
21
|
+
Object.new.instance_variable_set ('@'+var_name).to_sym, nil
|
22
|
+
true
|
23
|
+
rescue NameError
|
24
|
+
!!(var_name =~ /^[0-9]+$/)
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.remove_special_chars(param)
|
28
|
+
new_param = ''
|
29
|
+
param.each_char { |c|
|
30
|
+
if valid_variable_name? c
|
31
|
+
new_param += c
|
32
|
+
end
|
33
|
+
}
|
34
|
+
return new_param
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gauge-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gauge Team
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-07-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ruby-protocol-buffers
|
@@ -96,6 +96,7 @@ files:
|
|
96
96
|
- lib/processors/step_validation_request_processor.rb
|
97
97
|
- lib/spec.pb.rb
|
98
98
|
- lib/table.rb
|
99
|
+
- lib/util.rb
|
99
100
|
homepage: http://www.getgauge.io
|
100
101
|
licenses:
|
101
102
|
- GPL-3.0
|
@@ -116,8 +117,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
116
117
|
version: '1.9'
|
117
118
|
requirements: []
|
118
119
|
rubyforge_project:
|
119
|
-
rubygems_version: 2.
|
120
|
+
rubygems_version: 2.5.1
|
120
121
|
signing_key:
|
121
122
|
specification_version: 4
|
122
123
|
summary: Ruby support for Gauge
|
123
124
|
test_files: []
|
125
|
+
has_rdoc: yard
|