gauge-ruby 0.4.3 → 0.5.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/lib/code_parser.rb +52 -41
- data/lib/configuration.rb +37 -26
- data/lib/datastore.rb +6 -18
- data/lib/executor.rb +29 -36
- data/lib/gauge.rb +6 -19
- data/lib/gauge_messages.rb +12 -18
- data/lib/gauge_runtime.rb +14 -66
- data/lib/gauge_screenshot.rb +52 -0
- data/lib/log.rb +34 -28
- data/lib/messages_pb.rb +331 -0
- data/lib/method_cache.rb +21 -18
- data/lib/processors/cache_file_processor.rb +20 -31
- data/lib/processors/datastore_init_processor.rb +23 -30
- data/lib/processors/execute_step_request_processor.rb +11 -23
- data/lib/processors/execution_handler.rb +33 -33
- data/lib/processors/execution_hook_processors.rb +23 -36
- data/lib/processors/implementation_file_list_processor.rb +8 -21
- data/lib/processors/implementation_glob_pattern_processor.rb +15 -0
- data/lib/processors/kill_request_processor.rb +5 -17
- data/lib/processors/refactor_step_request_processor.rb +16 -28
- data/lib/processors/step_name_request_processor.rb +15 -30
- data/lib/processors/step_names_request_processor.rb +8 -22
- data/lib/processors/step_positions_request_processor.rb +9 -22
- data/lib/processors/step_validation_request_processor.rb +23 -37
- data/lib/processors/stub_implementation_processor.rb +10 -22
- data/lib/service_handlers.rb +110 -0
- data/lib/services_pb.rb +15 -0
- data/lib/services_services_pb.rb +165 -0
- data/lib/spec_pb.rb +272 -0
- data/lib/static_loader.rb +10 -22
- data/lib/table.rb +5 -17
- data/lib/util.rb +31 -44
- metadata +80 -21
- data/lib/api.pb.rb +0 -273
- data/lib/connector.rb +0 -45
- data/lib/message_processor.rb +0 -59
- data/lib/messages.pb.rb +0 -413
- data/lib/spec.pb.rb +0 -319
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: a3bcf9ae0d69a23863f652540236e9684432da817c26b989d0c7c07c6e147662
|
4
|
+
data.tar.gz: 6e56286778ec606b7ccd20035e7b58192b6c72c8a398c7ba0619b613cc8fb6b3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 11c74029d398ba60279ae148bd7e5b53a1bec7202ae6730ca19d9e0f48d1bc1108c7f66add8828ed2571e9152616f6421cd571d2f86e82ea373a494474e4f309
|
7
|
+
data.tar.gz: ef8d048a3af560c04777f683c0cd61032e809c1afde5f9acee97171abf435297e54065d11c3f8cbf4900bcff304b0ef5b97df7813005d6f3e0c8f1bd1f9f168e
|
data/lib/code_parser.rb
CHANGED
@@ -1,26 +1,15 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
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
|
-
|
1
|
+
=begin
|
2
|
+
* Copyright (c) ThoughtWorks, Inc.
|
3
|
+
* Licensed under the Apache License, Version 2.0
|
4
|
+
* See LICENSE.txt in the project root for license information.
|
5
|
+
=end
|
18
6
|
require 'parser/current'
|
19
7
|
require 'unparser'
|
20
8
|
require 'method_source'
|
21
9
|
require 'fileutils'
|
22
10
|
require 'tempfile'
|
23
11
|
require 'util'
|
12
|
+
require 'messages_pb'
|
24
13
|
|
25
14
|
module Gauge
|
26
15
|
# @api private
|
@@ -30,21 +19,18 @@ module Gauge
|
|
30
19
|
arg_node.children
|
31
20
|
end
|
32
21
|
|
33
|
-
def self.process_node(node, param_positions,
|
22
|
+
def self.process_node(node, param_positions, _new_param_values, new_step_text)
|
34
23
|
new_params = []
|
35
24
|
args = step_args_from_code node
|
36
|
-
|
25
|
+
old_params = args.map { |arg| Unparser.unparse arg }
|
26
|
+
param_positions.sort_by!(&:newPosition).each.with_index do |e, i|
|
37
27
|
if e.oldPosition == -1
|
38
|
-
|
39
|
-
if param == ''
|
40
|
-
param = i
|
41
|
-
end
|
42
|
-
new_params[e.newPosition] = "arg_#{param}"
|
28
|
+
new_params[e.newPosition] = Util.get_param_name(old_params, i)
|
43
29
|
else
|
44
30
|
new_params[e.newPosition] = args[e.oldPosition].children[0]
|
45
31
|
end
|
46
|
-
|
47
|
-
args = new_params.map {|v| Parser::AST::Node.new(:arg, [v])}
|
32
|
+
end
|
33
|
+
args = new_params.map { |v| Parser::AST::Node.new(:arg, [v]) }
|
48
34
|
step = [node.children[0].children[0], node.children[0].children[1], Parser::AST::Node.new(:str, [new_step_text])]
|
49
35
|
c1 = Parser::AST::Node.new(:send, step)
|
50
36
|
c2 = Parser::AST::Node.new(:args, args)
|
@@ -56,9 +42,9 @@ module Gauge
|
|
56
42
|
if ast && step_node?(ast)
|
57
43
|
visitor.call(ast)
|
58
44
|
else
|
59
|
-
children = ast.children.map
|
45
|
+
children = ast.children.map do |node|
|
60
46
|
replace(node, &visitor)
|
61
|
-
|
47
|
+
end
|
62
48
|
return ast.updated(nil, children, nil)
|
63
49
|
end
|
64
50
|
end
|
@@ -67,37 +53,62 @@ module Gauge
|
|
67
53
|
node.type == :block && node.children[0].children.size > 2 && node.children[0].children[1] == :step
|
68
54
|
end
|
69
55
|
|
56
|
+
def self.create_params_diff(old_node, new_node)
|
57
|
+
params_loc = old_node.children[1].loc
|
58
|
+
text = Unparser.unparse new_node.children[1]
|
59
|
+
if old_node.children[1].children.size > 1
|
60
|
+
span = Messages::Span.new(start: params_loc.begin.line, startChar: params_loc.begin.column + 1,
|
61
|
+
end: params_loc.end.line, endChar: params_loc.end.column)
|
62
|
+
else
|
63
|
+
span = Messages::Span.new(start: old_node.loc.begin.line, startChar: old_node.loc.begin.column,
|
64
|
+
end: old_node.children[2].loc.line, endChar: old_node.children[2].loc.column)
|
65
|
+
text = "do#{text.empty? ? text : " |#{text}|"}\n\t"
|
66
|
+
end
|
67
|
+
Messages::TextDiff.new(content: text, span: span)
|
68
|
+
end
|
69
|
+
|
70
|
+
def self.create_diffs(old_node, new_node)
|
71
|
+
step_loc = old_node.children[0].children[2].loc
|
72
|
+
step_text = new_node.children[0].children[2].children[0]
|
73
|
+
span = Messages::Span.new(start: step_loc.begin.line,
|
74
|
+
end: step_loc.end.line,
|
75
|
+
startChar: step_loc.begin.column + 1,
|
76
|
+
endChar: step_loc.end.column)
|
77
|
+
[Messages::TextDiff.new(content: step_text, span: span), create_params_diff(old_node, new_node)]
|
78
|
+
end
|
79
|
+
|
70
80
|
def self.refactor_args(step_text, ast, param_positions, new_param_values, new_step_text)
|
81
|
+
diffs = nil
|
71
82
|
new_ast = replace ast do |node|
|
72
83
|
if node.children[0].children[2].children[0] == step_text
|
73
|
-
|
74
|
-
|
84
|
+
old_node = node.clone
|
85
|
+
node = process_node(node, param_positions, new_param_values, new_step_text)
|
86
|
+
diffs = create_diffs(old_node, node)
|
87
|
+
end
|
75
88
|
node
|
76
89
|
end
|
90
|
+
code = Unparser.unparse new_ast
|
91
|
+
{ content: code, diffs: diffs }
|
77
92
|
end
|
78
|
-
Unparser.unparse new_ast
|
79
|
-
end
|
80
93
|
|
81
94
|
def self.refactor(step_info, param_positions, new_step)
|
82
95
|
ast = code_to_ast File.read(step_info[:locations][0][:file])
|
83
|
-
refactor_args(step_info[:step_text], ast, param_positions,
|
96
|
+
refactor_args(step_info[:step_text], ast, param_positions,
|
97
|
+
new_step.parameters,
|
98
|
+
new_step.parameterizedStepValue)
|
84
99
|
end
|
85
100
|
|
86
|
-
|
101
|
+
private_class_method
|
87
102
|
|
88
103
|
def self.code_to_ast(code)
|
89
104
|
begin
|
90
105
|
buffer = Parser::Source::Buffer.new '(string)'
|
91
106
|
buffer.source = code
|
92
107
|
parser = Parser::CurrentRuby.new
|
93
|
-
|
108
|
+
parser.parse(buffer)
|
94
109
|
rescue Exception => e
|
95
|
-
|
110
|
+
GaugeLog.error e
|
96
111
|
end
|
97
112
|
end
|
98
|
-
|
99
|
-
def self.include_args(code_string, params)
|
100
|
-
code_string.gsub("do", "do #{params}")
|
101
|
-
end
|
102
113
|
end
|
103
|
-
end
|
114
|
+
end
|
data/lib/configuration.rb
CHANGED
@@ -1,22 +1,8 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
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
|
-
# Gauge runtime for Ruby language. Read more about Gauge: http://getgauge.io
|
19
|
-
|
1
|
+
=begin
|
2
|
+
* Copyright (c) ThoughtWorks, Inc.
|
3
|
+
* Licensed under the Apache License, Version 2.0
|
4
|
+
* See LICENSE.txt in the project root for license information.
|
5
|
+
=end
|
20
6
|
# @api public
|
21
7
|
module Gauge
|
22
8
|
class << self
|
@@ -53,12 +39,12 @@ module Gauge
|
|
53
39
|
class Configuration
|
54
40
|
def initialize
|
55
41
|
@includes=[]
|
42
|
+
@screenshot_writer = true
|
43
|
+
@custom_screengrabber = false
|
56
44
|
@screengrabber = -> {
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
File.delete file
|
61
|
-
return file_content
|
45
|
+
file_name = Util.unique_screenshot_file
|
46
|
+
`gauge_screenshot #{file_name}`
|
47
|
+
return File.basename(file_name)
|
62
48
|
}
|
63
49
|
end
|
64
50
|
|
@@ -79,7 +65,26 @@ module Gauge
|
|
79
65
|
end
|
80
66
|
|
81
67
|
def screengrabber=(block)
|
82
|
-
|
68
|
+
GaugeLog.warning("[DEPRECATED] Use custom_screenshot_writer instead.")
|
69
|
+
@screenshot_writer = false
|
70
|
+
set_screengrabber(block)
|
71
|
+
end
|
72
|
+
|
73
|
+
def custom_screenshot_writer=(block)
|
74
|
+
@screenshot_writer = true
|
75
|
+
set_screengrabber(block)
|
76
|
+
end
|
77
|
+
|
78
|
+
def screenshot_writer?
|
79
|
+
@screenshot_writer
|
80
|
+
end
|
81
|
+
|
82
|
+
def custom_screengrabber?
|
83
|
+
@custom_screengrabber
|
84
|
+
end
|
85
|
+
|
86
|
+
def screenshot_dir
|
87
|
+
ENV['gauge_screenshots_dir']
|
83
88
|
end
|
84
89
|
|
85
90
|
def self.include_configured_modules
|
@@ -88,5 +93,11 @@ module Gauge
|
|
88
93
|
main=TOPLEVEL_BINDING.eval('self')
|
89
94
|
self.instance.includes.each &main.method(:include)
|
90
95
|
end
|
96
|
+
|
97
|
+
private
|
98
|
+
def set_screengrabber(block)
|
99
|
+
@custom_screengrabber = true
|
100
|
+
@screengrabber=block
|
101
|
+
end
|
91
102
|
end
|
92
|
-
end
|
103
|
+
end
|
data/lib/datastore.rb
CHANGED
@@ -1,20 +1,8 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
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
|
-
|
1
|
+
=begin
|
2
|
+
* Copyright (c) ThoughtWorks, Inc.
|
3
|
+
* Licensed under the Apache License, Version 2.0
|
4
|
+
* See LICENSE.txt in the project root for license information.
|
5
|
+
=end
|
18
6
|
module Gauge
|
19
7
|
# @api public
|
20
8
|
class DataStore
|
@@ -81,4 +69,4 @@ module Gauge
|
|
81
69
|
@@spec_datastore = DataStore.new
|
82
70
|
@@scenario_datastore = DataStore.new
|
83
71
|
end
|
84
|
-
end
|
72
|
+
end
|
data/lib/executor.rb
CHANGED
@@ -1,27 +1,16 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
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/>.
|
1
|
+
=begin
|
2
|
+
* Copyright (c) ThoughtWorks, Inc.
|
3
|
+
* Licensed under the Apache License, Version 2.0
|
4
|
+
* See LICENSE.txt in the project root for license information.
|
5
|
+
=end
|
17
6
|
require 'ruby-debug-ide'
|
18
7
|
require_relative 'gauge'
|
19
8
|
|
20
|
-
ATTACH_DEBUGGER_EVENT =
|
9
|
+
ATTACH_DEBUGGER_EVENT = 'Runner Ready for Debugging'
|
21
10
|
|
22
11
|
module Gauge
|
23
12
|
class DebugOptions
|
24
|
-
attr_accessor :host, :port, :notify_dispatcher
|
13
|
+
attr_accessor :host, :port, :notify_dispatcher, :socket_path, :skip_wait_for_start
|
25
14
|
end
|
26
15
|
|
27
16
|
# @api private
|
@@ -30,10 +19,11 @@ module Gauge
|
|
30
19
|
start_debugger
|
31
20
|
Dir["#{dir}/**/*.rb"].each do |x|
|
32
21
|
begin
|
22
|
+
GaugeLog.debug "Loading step implemetations from #{x} dirs"
|
33
23
|
ENV['GAUGE_STEP_FILE'] = x
|
34
24
|
require x
|
35
25
|
rescue Exception => e
|
36
|
-
|
26
|
+
GaugeLog.error "Cannot import #{x}. Reason: #{e.message}"
|
37
27
|
end
|
38
28
|
end
|
39
29
|
end
|
@@ -42,9 +32,10 @@ module Gauge
|
|
42
32
|
if ENV['DEBUGGING']
|
43
33
|
options = DebugOptions.new
|
44
34
|
options.host = '127.0.0.1'
|
45
|
-
options.port = ENV[
|
35
|
+
options.port = ENV['DEBUG_PORT'].to_i
|
46
36
|
options.notify_dispatcher = false
|
47
|
-
|
37
|
+
options.skip_wait_for_start = false
|
38
|
+
GaugeLog.info ATTACH_DEBUGGER_EVENT
|
48
39
|
Debugger.prepare_debugger(options)
|
49
40
|
end
|
50
41
|
end
|
@@ -59,22 +50,24 @@ module Gauge
|
|
59
50
|
end
|
60
51
|
|
61
52
|
def self.execute_hooks(hooks, currentExecutionInfo, should_filter)
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
hook[:block].call(currentExecutionInfo)
|
72
|
-
end
|
53
|
+
hooks.each do |hook|
|
54
|
+
if !should_filter || hook[:options][:tags].empty?
|
55
|
+
next hook[:block].call(currentExecutionInfo)
|
56
|
+
end
|
57
|
+
tags = currentExecutionInfo.currentSpec.tags + get_scenario_tags(currentExecutionInfo)
|
58
|
+
intersection = (tags & hook[:options][:tags])
|
59
|
+
if (hook[:options][:operator] == 'OR' && !intersection.empty?) ||
|
60
|
+
(hook[:options][:operator] == 'AND' && intersection.length == hook[:options][:tags].length)
|
61
|
+
hook[:block].call(currentExecutionInfo)
|
73
62
|
end
|
74
|
-
return nil
|
75
|
-
rescue Exception => e
|
76
|
-
return e
|
77
63
|
end
|
64
|
+
nil
|
65
|
+
rescue Exception => e
|
66
|
+
e
|
67
|
+
end
|
68
|
+
|
69
|
+
def self.get_scenario_tags(info)
|
70
|
+
!info.currentScenario.nil? ? info.currentScenario.tags : []
|
78
71
|
end
|
79
72
|
end
|
80
|
-
end
|
73
|
+
end
|
data/lib/gauge.rb
CHANGED
@@ -1,21 +1,8 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
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
|
-
require_relative 'connector'
|
1
|
+
=begin
|
2
|
+
* Copyright (c) ThoughtWorks, Inc.
|
3
|
+
* Licensed under the Apache License, Version 2.0
|
4
|
+
* See LICENSE.txt in the project root for license information.
|
5
|
+
=end
|
19
6
|
require_relative 'method_cache'
|
20
7
|
require_relative 'configuration'
|
21
8
|
|
@@ -107,7 +94,7 @@ module Kernel
|
|
107
94
|
step_texts = args - opts
|
108
95
|
opts = { continue_on_failure: false }.merge opts.reduce({}, :merge)
|
109
96
|
step_texts.each do |text|
|
110
|
-
step_value = Gauge::
|
97
|
+
step_value = Gauge::Util.step_value(text)
|
111
98
|
si = { location: { file: ENV['GAUGE_STEP_FILE'], span: {} },
|
112
99
|
block: block, step_text: text,
|
113
100
|
recoverable: opts[:continue_on_failure] }
|
data/lib/gauge_messages.rb
CHANGED
@@ -1,20 +1,8 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
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
|
-
|
1
|
+
=begin
|
2
|
+
* Copyright (c) ThoughtWorks, Inc.
|
3
|
+
* Licensed under the Apache License, Version 2.0
|
4
|
+
* See LICENSE.txt in the project root for license information.
|
5
|
+
=end
|
18
6
|
# @api public
|
19
7
|
module Gauge
|
20
8
|
class << self
|
@@ -39,12 +27,18 @@ module Gauge
|
|
39
27
|
@gauge_messages ||= GaugeMessages.new
|
40
28
|
end
|
41
29
|
|
30
|
+
def pending_messages()
|
31
|
+
pending_messages = @messages.select { |m| m != nil}
|
32
|
+
@messages = []
|
33
|
+
pending_messages
|
34
|
+
end
|
35
|
+
|
42
36
|
def write(message)
|
43
37
|
@messages.push(message)
|
44
38
|
end
|
45
39
|
|
46
40
|
def get
|
47
|
-
@messages
|
41
|
+
@messages.select { |m| m != nil}
|
48
42
|
end
|
49
43
|
|
50
44
|
def clear
|