gauge-ruby 0.5.1 → 0.5.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/configuration.rb +5 -5
- data/lib/gauge_messages.rb +3 -3
- data/lib/gauge_screenshot.rb +53 -0
- data/lib/method_cache.rb +16 -1
- data/lib/processors/cache_file_processor.rb +4 -2
- data/lib/processors/execution_handler.rb +14 -2
- data/lib/processors/execution_hook_processors.rb +9 -0
- data/lib/spec_pb.rb +11 -0
- data/lib/static_loader.rb +3 -3
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d082650420924a2bbabb264df5849ebe1ce6eb9d
|
4
|
+
data.tar.gz: 887f18dcb515c433222548583f30bd0342b04f52
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1ccdd5acea8a6f3a89c5939ba88e51028b4032d4c0202ca1d688dc5eb4f75be78b2d1544780062207c8be2af09728c08f28f18da8ab680482dd8f1f0ed6accbe
|
7
|
+
data.tar.gz: 766b7a496aa60f3446914a6126ded77efb71697dd3408cd2101b0638a03373eb093d6330278520757fc9c09ae14c7ea1e1a0c26ba3d59fb0538a60da3935a0e7
|
data/lib/configuration.rb
CHANGED
@@ -55,11 +55,11 @@ module Gauge
|
|
55
55
|
@includes=[]
|
56
56
|
@custom_screengrabber=false
|
57
57
|
@screengrabber = -> {
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
58
|
+
file_name = "#{Dir.tmpdir}/screenshot.png"
|
59
|
+
`gauge_screenshot #{file_name}`
|
60
|
+
file_content = File.binread(file_name)
|
61
|
+
File.delete file_name
|
62
|
+
return file_content
|
63
63
|
}
|
64
64
|
end
|
65
65
|
|
data/lib/gauge_messages.rb
CHANGED
@@ -40,17 +40,17 @@ module Gauge
|
|
40
40
|
end
|
41
41
|
|
42
42
|
def pending_messages()
|
43
|
-
pending_messages = @messages
|
43
|
+
pending_messages = @messages.select { |m| m != nil}
|
44
44
|
@messages = []
|
45
45
|
pending_messages
|
46
|
-
end
|
46
|
+
end
|
47
47
|
|
48
48
|
def write(message)
|
49
49
|
@messages.push(message)
|
50
50
|
end
|
51
51
|
|
52
52
|
def get
|
53
|
-
@messages
|
53
|
+
@messages.select { |m| m != nil}
|
54
54
|
end
|
55
55
|
|
56
56
|
def clear
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# Copyright 2018 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 << self
|
20
|
+
def capture
|
21
|
+
GaugeScreenshot.instance.capture
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
class GaugeScreenshot
|
26
|
+
def initialize
|
27
|
+
@screenshots = []
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.instance
|
31
|
+
@gauge_screenshots ||= GaugeScreenshot.new
|
32
|
+
end
|
33
|
+
|
34
|
+
def capture
|
35
|
+
@screenshots.push(Configuration.instance.screengrabber.call)
|
36
|
+
end
|
37
|
+
|
38
|
+
def pending_screenshot
|
39
|
+
pending_screenshot = @screenshots
|
40
|
+
clear
|
41
|
+
pending_screenshot
|
42
|
+
end
|
43
|
+
|
44
|
+
def get
|
45
|
+
@screenshots
|
46
|
+
end
|
47
|
+
|
48
|
+
def clear
|
49
|
+
@screenshots = []
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|
data/lib/method_cache.rb
CHANGED
@@ -79,13 +79,28 @@ module Gauge
|
|
79
79
|
@@steps_map[step_value][:recoverable]
|
80
80
|
end
|
81
81
|
|
82
|
+
def self.relative_filepath(file)
|
83
|
+
project_root = Pathname.new(ENV['GAUGE_PROJECT_ROOT'])
|
84
|
+
filename = Pathname.new(file).relative_path_from(project_root)
|
85
|
+
return project_root.join(filename.to_s.split(":").first)
|
86
|
+
end
|
87
|
+
|
82
88
|
def self.remove_steps(file)
|
83
89
|
@@steps_map.each_pair do |step, info|
|
84
|
-
l = info[:locations].reject { |loc|
|
90
|
+
l = info[:locations].reject { |loc| relative_filepath(loc[:file]).eql? relative_filepath(file) }
|
85
91
|
l.empty? ? @@steps_map.delete(step) : @@steps_map[step][:locations] = l
|
86
92
|
end
|
87
93
|
end
|
88
94
|
|
95
|
+
def self.is_file_cached(file)
|
96
|
+
@@steps_map.each_pair do |step, info|
|
97
|
+
if info[:locations].any? { |loc| relative_filepath(loc[:file]).eql? relative_filepath(file) }
|
98
|
+
return true
|
99
|
+
end
|
100
|
+
end
|
101
|
+
return false
|
102
|
+
end
|
103
|
+
|
89
104
|
def self.multiple_implementation?(step_value)
|
90
105
|
@@steps_map[step_value][:locations].length > 1
|
91
106
|
end
|
@@ -34,8 +34,10 @@ module Gauge
|
|
34
34
|
ast = CodeParser.code_to_ast(request.content)
|
35
35
|
StaticLoader.reload_steps(f, ast)
|
36
36
|
elsif status == Messages::CacheFileRequest::FileStatus::CREATED
|
37
|
-
|
38
|
-
|
37
|
+
if !Gauge::MethodCache.is_file_cached f
|
38
|
+
ast = CodeParser.code_to_ast File.read(f)
|
39
|
+
StaticLoader.reload_steps(f, ast)
|
40
|
+
end
|
39
41
|
elsif (status == Messages::CacheFileRequest::FileStatus::CLOSED) && File.file?(f)
|
40
42
|
ast = CodeParser.code_to_ast File.read(f)
|
41
43
|
StaticLoader.reload_steps(f, ast)
|
@@ -33,13 +33,20 @@ module Gauge
|
|
33
33
|
|
34
34
|
def handle_pass(message, execution_time)
|
35
35
|
execution_status_response = Messages::ExecutionStatusResponse.new(:executionResult => Messages::ProtoExecutionResult.new(:failed => false, :executionTime => execution_time))
|
36
|
+
execution_status_response.executionResult.screenshots += Gauge::GaugeScreenshot.instance.pending_screenshot
|
37
|
+
execution_status_response.executionResult.message += Gauge::GaugeMessages.instance.pending_messages
|
36
38
|
Messages::Message.new(:messageType => :ExecutionStatusResponse, :messageId => message.messageId, :executionStatusResponse => execution_status_response)
|
37
39
|
end
|
38
40
|
|
41
|
+
def get_filepath(stacktrace)
|
42
|
+
toptrace = stacktrace.split("\n").first
|
43
|
+
return MethodCache.relative_filepath toptrace
|
44
|
+
end
|
45
|
+
|
39
46
|
def handle_failure(message, exception, execution_time, recoverable)
|
40
47
|
project_dir = File.basename(Dir.getwd)
|
41
48
|
stacktrace = exception.backtrace.select {|x| x.match(project_dir) && !x.match(File.join(project_dir, "vendor"))}.join("\n")+"\n"
|
42
|
-
filepath =
|
49
|
+
filepath = get_filepath(stacktrace)
|
43
50
|
line_number = stacktrace.split("\n").first.split("/").last.split(":")[1]
|
44
51
|
code_snippet = "\n" + '> ' + get_code_snippet(filepath, line_number.to_i)
|
45
52
|
execution_status_response =
|
@@ -50,7 +57,12 @@ module Gauge
|
|
50
57
|
:stackTrace => code_snippet + stacktrace,
|
51
58
|
:executionTime => execution_time))
|
52
59
|
screenshot = screenshot_bytes
|
53
|
-
|
60
|
+
if screenshot
|
61
|
+
execution_status_response.executionResult.screenShot = screenshot
|
62
|
+
execution_status_response.executionResult.failureScreenshot = screenshot
|
63
|
+
end
|
64
|
+
execution_status_response.executionResult.screenshots += Gauge::GaugeScreenshot.instance.pending_screenshot
|
65
|
+
execution_status_response.executionResult.message += Gauge::GaugeMessages.instance.pending_messages
|
54
66
|
Messages::Message.new(:messageType => :ExecutionStatusResponse,
|
55
67
|
:messageId => message.messageId, :executionStatusResponse => execution_status_response)
|
56
68
|
end
|
@@ -17,6 +17,7 @@
|
|
17
17
|
|
18
18
|
require_relative "execution_handler"
|
19
19
|
require_relative "../gauge_messages"
|
20
|
+
require_relative "../gauge_screenshot"
|
20
21
|
require_relative "../executor"
|
21
22
|
require_relative "../method_cache"
|
22
23
|
require_relative "../util"
|
@@ -28,30 +29,35 @@ module Gauge
|
|
28
29
|
Gauge::MethodCache.clear
|
29
30
|
Executor.load_steps(Util.get_step_implementation_dir)
|
30
31
|
response = handle_hooks_execution(MethodCache.get_before_suite_hooks, message,message.executionStartingRequest.currentExecutionInfo,false)
|
32
|
+
response.executionStatusResponse.executionResult.screenshots += Gauge::GaugeScreenshot.instance.pending_screenshot
|
31
33
|
response.executionStatusResponse.executionResult.message += Gauge::GaugeMessages.instance.pending_messages
|
32
34
|
return response
|
33
35
|
end
|
34
36
|
|
35
37
|
def process_execution_end_request(message)
|
36
38
|
response = handle_hooks_execution(MethodCache.get_after_suite_hooks, message,message.executionEndingRequest.currentExecutionInfo, false)
|
39
|
+
response.executionStatusResponse.executionResult.screenshots += Gauge::GaugeScreenshot.instance.pending_screenshot
|
37
40
|
response.executionStatusResponse.executionResult.message += Gauge::GaugeMessages.instance.pending_messages
|
38
41
|
return response
|
39
42
|
end
|
40
43
|
|
41
44
|
def process_spec_execution_start_request(message)
|
42
45
|
response = handle_hooks_execution(MethodCache.get_before_spec_hooks, message,message.specExecutionStartingRequest.currentExecutionInfo)
|
46
|
+
response.executionStatusResponse.executionResult.screenshots += Gauge::GaugeScreenshot.instance.pending_screenshot
|
43
47
|
response.executionStatusResponse.executionResult.message += Gauge::GaugeMessages.instance.pending_messages
|
44
48
|
return response
|
45
49
|
end
|
46
50
|
|
47
51
|
def process_spec_execution_end_request(message)
|
48
52
|
response = handle_hooks_execution(MethodCache.get_after_spec_hooks, message,message.specExecutionEndingRequest.currentExecutionInfo)
|
53
|
+
response.executionStatusResponse.executionResult.screenshots += Gauge::GaugeScreenshot.instance.pending_screenshot
|
49
54
|
response.executionStatusResponse.executionResult.message += Gauge::GaugeMessages.instance.pending_messages
|
50
55
|
return response
|
51
56
|
end
|
52
57
|
|
53
58
|
def process_scenario_execution_start_request(message)
|
54
59
|
response = handle_hooks_execution(MethodCache.get_before_scenario_hooks, message,message.scenarioExecutionStartingRequest.currentExecutionInfo)
|
60
|
+
response.executionStatusResponse.executionResult.screenshots += Gauge::GaugeScreenshot.instance.pending_screenshot
|
55
61
|
response.executionStatusResponse.executionResult.message += Gauge::GaugeMessages.instance.pending_messages
|
56
62
|
return response
|
57
63
|
end
|
@@ -59,18 +65,21 @@ module Gauge
|
|
59
65
|
|
60
66
|
def process_scenario_execution_end_request(message)
|
61
67
|
response = handle_hooks_execution(MethodCache.get_after_scenario_hooks, message,message.scenarioExecutionEndingRequest.currentExecutionInfo)
|
68
|
+
response.executionStatusResponse.executionResult.screenshots += Gauge::GaugeScreenshot.instance.pending_screenshot
|
62
69
|
response.executionStatusResponse.executionResult.message += Gauge::GaugeMessages.instance.pending_messages
|
63
70
|
return response
|
64
71
|
end
|
65
72
|
|
66
73
|
def process_step_execution_start_request(message)
|
67
74
|
response = handle_hooks_execution(MethodCache.get_before_step_hooks, message,message.stepExecutionStartingRequest.currentExecutionInfo)
|
75
|
+
response.executionStatusResponse.executionResult.screenshots += Gauge::GaugeScreenshot.instance.pending_screenshot
|
68
76
|
response.executionStatusResponse.executionResult.message += Gauge::GaugeMessages.instance.pending_messages
|
69
77
|
return response
|
70
78
|
end
|
71
79
|
|
72
80
|
def process_step_execution_end_request(message)
|
73
81
|
response = handle_hooks_execution(MethodCache.get_after_step_hooks, message,message.stepExecutionEndingRequest.currentExecutionInfo)
|
82
|
+
response.executionStatusResponse.executionResult.screenshots += Gauge::GaugeScreenshot.instance.pending_screenshot
|
74
83
|
response.executionStatusResponse.executionResult.message += Gauge::GaugeMessages.instance.pending_messages
|
75
84
|
return response
|
76
85
|
end
|
data/lib/spec_pb.rb
CHANGED
@@ -16,6 +16,8 @@ Google::Protobuf::DescriptorPool.generated_pool.build do
|
|
16
16
|
repeated :postHookMessages, :string, 9
|
17
17
|
repeated :preHookMessage, :string, 10
|
18
18
|
repeated :postHookMessage, :string, 11
|
19
|
+
repeated :preHookScreenshots, :bytes, 12
|
20
|
+
repeated :postHookScreenshots, :bytes, 13
|
19
21
|
end
|
20
22
|
add_message "gauge.messages.ProtoItem" do
|
21
23
|
optional :itemType, :enum, 1, "gauge.messages.ProtoItem.ItemType"
|
@@ -55,6 +57,8 @@ Google::Protobuf::DescriptorPool.generated_pool.build do
|
|
55
57
|
repeated :postHookMessages, :string, 16
|
56
58
|
repeated :preHookMessage, :string, 17
|
57
59
|
repeated :postHookMessage, :string, 18
|
60
|
+
repeated :preHookScreenshots, :bytes, 19
|
61
|
+
repeated :postHookScreenshots, :bytes, 20
|
58
62
|
end
|
59
63
|
add_message "gauge.messages.Span" do
|
60
64
|
optional :start, :int64, 1
|
@@ -73,6 +77,8 @@ Google::Protobuf::DescriptorPool.generated_pool.build do
|
|
73
77
|
optional :stepExecutionResult, :message, 4, "gauge.messages.ProtoStepExecutionResult"
|
74
78
|
repeated :preHookMessages, :string, 5
|
75
79
|
repeated :postHookMessages, :string, 6
|
80
|
+
repeated :preHookScreenshots, :bytes, 7
|
81
|
+
repeated :postHookScreenshots, :bytes, 8
|
76
82
|
end
|
77
83
|
add_message "gauge.messages.ProtoConcept" do
|
78
84
|
optional :conceptStep, :message, 1, "gauge.messages.ProtoStep"
|
@@ -130,6 +136,8 @@ Google::Protobuf::DescriptorPool.generated_pool.build do
|
|
130
136
|
optional :executionTime, :int64, 6
|
131
137
|
repeated :message, :string, 7
|
132
138
|
optional :errorType, :enum, 8, "gauge.messages.ProtoExecutionResult.ErrorType"
|
139
|
+
optional :failureScreenshot, :bytes, 9
|
140
|
+
repeated :screenshots, :bytes, 10
|
133
141
|
end
|
134
142
|
add_enum "gauge.messages.ProtoExecutionResult.ErrorType" do
|
135
143
|
value :ASSERTION, 0
|
@@ -140,6 +148,7 @@ Google::Protobuf::DescriptorPool.generated_pool.build do
|
|
140
148
|
optional :errorMessage, :string, 2
|
141
149
|
optional :screenShot, :bytes, 3
|
142
150
|
optional :tableRowIndex, :int32, 4
|
151
|
+
optional :failureScreenshot, :bytes, 5
|
143
152
|
end
|
144
153
|
add_message "gauge.messages.ProtoSuiteResult" do
|
145
154
|
repeated :specResults, :message, 1, "gauge.messages.ProtoSpecResult"
|
@@ -158,6 +167,8 @@ Google::Protobuf::DescriptorPool.generated_pool.build do
|
|
158
167
|
repeated :postHookMessages, :string, 14
|
159
168
|
repeated :preHookMessage, :string, 15
|
160
169
|
repeated :postHookMessage, :string, 16
|
170
|
+
repeated :preHookScreenshots, :bytes, 17
|
171
|
+
repeated :postHookScreenshots, :bytes, 18
|
161
172
|
end
|
162
173
|
add_message "gauge.messages.ProtoSpecResult" do
|
163
174
|
optional :protoSpec, :message, 1, "gauge.messages.ProtoSpec"
|
data/lib/static_loader.rb
CHANGED
@@ -29,10 +29,10 @@ module Gauge
|
|
29
29
|
end
|
30
30
|
|
31
31
|
def self.traverse(ast, &visitor)
|
32
|
-
return if ast.class != Parser::AST::Node
|
33
|
-
if
|
32
|
+
return if !ast || ast.class != Parser::AST::Node
|
33
|
+
if step_node?(ast)
|
34
34
|
visitor.call(ast)
|
35
|
-
elsif ast
|
35
|
+
elsif ast.children
|
36
36
|
ast.children.each {|node|
|
37
37
|
traverse(node, &visitor)
|
38
38
|
}
|
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.5.
|
4
|
+
version: 0.5.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gauge Team
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-01-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ruby-protocol-buffers
|
@@ -164,6 +164,7 @@ files:
|
|
164
164
|
- lib/gauge.rb
|
165
165
|
- lib/gauge_messages.rb
|
166
166
|
- lib/gauge_runtime.rb
|
167
|
+
- lib/gauge_screenshot.rb
|
167
168
|
- lib/log.rb
|
168
169
|
- lib/lsp_pb.rb
|
169
170
|
- lib/lsp_server.rb
|