cucumber-messages 0.0.0 → 1.0.0
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/.github/ISSUE_TEMPLATE.md +5 -0
- data/.github/PULL_REQUEST_TEMPLATE.md +5 -0
- data/.rspec +1 -0
- data/.rsync +4 -0
- data/.subrepo +1 -0
- data/.travis.yml +15 -0
- data/Gemfile +3 -0
- data/LICENSE +21 -0
- data/Makefile +9 -0
- data/README.md +2 -2
- data/Rakefile +23 -0
- data/cucumber-messages.gemspec +34 -0
- data/default.mk +33 -0
- data/lib/cucumber/messages.rb +32 -6
- data/lib/cucumber/messages_pb.rb +242 -0
- data/messages.proto +243 -0
- data/spec/capture_warnings.rb +74 -0
- data/spec/coverage.rb +7 -0
- data/spec/cucumber/messages/messages_spec.rb +23 -0
- metadata +51 -51
- data/VERSION +0 -1
- data/lib/cucumber/messages/id_generator.rb +0 -24
- data/lib/cucumber/messages/message/deserialization.rb +0 -37
- data/lib/cucumber/messages/message/serialization.rb +0 -70
- data/lib/cucumber/messages/message/utils.rb +0 -45
- data/lib/cucumber/messages/message.rb +0 -11
- data/lib/cucumber/messages/ndjson_to_message_enumerator.rb +0 -21
- data/lib/cucumber/messages/time_conversion.rb +0 -33
- data/lib/cucumber/messages.deserializers.rb +0 -1208
- data/lib/cucumber/messages.dtos.rb +0 -1782
data/messages.proto
ADDED
@@ -0,0 +1,243 @@
|
|
1
|
+
syntax = "proto3";
|
2
|
+
import "google/protobuf/timestamp.proto";
|
3
|
+
package io.cucumber.messages;
|
4
|
+
option ruby_package = "Cucumber.Messages";
|
5
|
+
option go_package = "messages";
|
6
|
+
|
7
|
+
// All messages sent between processes must be of type Wrapper
|
8
|
+
message Wrapper {
|
9
|
+
oneof message {
|
10
|
+
Source source = 1;
|
11
|
+
GherkinDocument gherkinDocument = 2;
|
12
|
+
Pickle pickle = 3;
|
13
|
+
Attachment attachment = 4;
|
14
|
+
TestCaseStarted testCaseStarted = 5;
|
15
|
+
TestStepStarted testStepStarted = 6;
|
16
|
+
TestStepFinished testStepFinished = 7;
|
17
|
+
TestCaseFinished testCaseFinished = 8;
|
18
|
+
}
|
19
|
+
}
|
20
|
+
|
21
|
+
////// Source
|
22
|
+
|
23
|
+
message SourceReference {
|
24
|
+
string uri = 1;
|
25
|
+
Location location = 2;
|
26
|
+
}
|
27
|
+
|
28
|
+
message Location {
|
29
|
+
uint32 line = 1;
|
30
|
+
uint32 column = 2;
|
31
|
+
}
|
32
|
+
|
33
|
+
message Attachment {
|
34
|
+
SourceReference source = 1;
|
35
|
+
string data = 2;
|
36
|
+
Media media = 3;
|
37
|
+
}
|
38
|
+
|
39
|
+
message Media {
|
40
|
+
string encoding = 1;
|
41
|
+
string content_type = 2;
|
42
|
+
}
|
43
|
+
|
44
|
+
message Source {
|
45
|
+
string uri = 1;
|
46
|
+
string data = 2;
|
47
|
+
Media media = 3;
|
48
|
+
}
|
49
|
+
|
50
|
+
////// Gherkin
|
51
|
+
|
52
|
+
message GherkinDocument {
|
53
|
+
string uri = 1;
|
54
|
+
Feature feature = 2;
|
55
|
+
repeated Comment comments = 3;
|
56
|
+
}
|
57
|
+
|
58
|
+
message Feature {
|
59
|
+
Location location = 1;
|
60
|
+
repeated Tag tags = 2;
|
61
|
+
string language = 3;
|
62
|
+
string keyword = 4;
|
63
|
+
string name = 5;
|
64
|
+
string description = 6;
|
65
|
+
repeated FeatureChild children = 7;
|
66
|
+
}
|
67
|
+
|
68
|
+
message FeatureChild {
|
69
|
+
oneof value {
|
70
|
+
Rule rule = 1;
|
71
|
+
Background background = 2;
|
72
|
+
Scenario scenario = 3;
|
73
|
+
}
|
74
|
+
}
|
75
|
+
|
76
|
+
message Rule {
|
77
|
+
Location location = 1;
|
78
|
+
string keyword = 2;
|
79
|
+
string name = 3;
|
80
|
+
string description = 4;
|
81
|
+
repeated RuleChild children = 5;
|
82
|
+
}
|
83
|
+
|
84
|
+
message RuleChild {
|
85
|
+
oneof value {
|
86
|
+
Background background = 1;
|
87
|
+
Scenario scenario = 2;
|
88
|
+
}
|
89
|
+
}
|
90
|
+
|
91
|
+
message Background {
|
92
|
+
Location location = 1;
|
93
|
+
string keyword = 2;
|
94
|
+
string name = 3;
|
95
|
+
string description = 4;
|
96
|
+
repeated Step steps = 5;
|
97
|
+
}
|
98
|
+
|
99
|
+
message Scenario {
|
100
|
+
Location location = 1;
|
101
|
+
repeated Tag tags = 2;
|
102
|
+
string keyword = 3;
|
103
|
+
string name = 4;
|
104
|
+
string description = 5;
|
105
|
+
repeated Step steps = 6;
|
106
|
+
repeated Examples examples = 7;
|
107
|
+
}
|
108
|
+
|
109
|
+
message Comment {
|
110
|
+
Location location = 1;
|
111
|
+
string text = 2;
|
112
|
+
}
|
113
|
+
|
114
|
+
message DataTable {
|
115
|
+
Location location = 1;
|
116
|
+
repeated TableRow rows = 2;
|
117
|
+
}
|
118
|
+
|
119
|
+
message DocString {
|
120
|
+
Location location = 1;
|
121
|
+
string content_type = 2;
|
122
|
+
string content = 3;
|
123
|
+
string delimiter = 4;
|
124
|
+
}
|
125
|
+
|
126
|
+
message Examples {
|
127
|
+
Location location = 1;
|
128
|
+
repeated Tag tags = 2;
|
129
|
+
string keyword = 3;
|
130
|
+
string name = 4;
|
131
|
+
string description = 5;
|
132
|
+
TableRow table_header = 6;
|
133
|
+
repeated TableRow table_body = 7;
|
134
|
+
}
|
135
|
+
|
136
|
+
message Step {
|
137
|
+
Location location = 1;
|
138
|
+
string keyword = 2;
|
139
|
+
string text = 3;
|
140
|
+
oneof argument {
|
141
|
+
DocString doc_string = 5;
|
142
|
+
DataTable data_table = 6;
|
143
|
+
}
|
144
|
+
}
|
145
|
+
|
146
|
+
message TableCell {
|
147
|
+
Location location = 1;
|
148
|
+
string value = 2;
|
149
|
+
}
|
150
|
+
|
151
|
+
message TableRow {
|
152
|
+
Location location = 1;
|
153
|
+
repeated TableCell cells = 2;
|
154
|
+
}
|
155
|
+
|
156
|
+
message Tag {
|
157
|
+
Location location = 1;
|
158
|
+
string name = 2;
|
159
|
+
}
|
160
|
+
|
161
|
+
////// Pickles
|
162
|
+
|
163
|
+
message Pickle {
|
164
|
+
string id = 1;
|
165
|
+
string uri = 2;
|
166
|
+
string name = 3;
|
167
|
+
string language = 4;
|
168
|
+
repeated PickleStep steps = 5;
|
169
|
+
repeated PickleTag tags = 6;
|
170
|
+
repeated Location locations = 7;
|
171
|
+
}
|
172
|
+
|
173
|
+
message PickleStep {
|
174
|
+
string text = 1;
|
175
|
+
repeated Location locations = 2;
|
176
|
+
oneof argument {
|
177
|
+
PickleDocString doc_string = 3;
|
178
|
+
PickleTable data_table = 4;
|
179
|
+
}
|
180
|
+
}
|
181
|
+
|
182
|
+
message PickleDocString {
|
183
|
+
Location location = 1;
|
184
|
+
string contentType = 2;
|
185
|
+
string content = 3;
|
186
|
+
}
|
187
|
+
|
188
|
+
message PickleTable {
|
189
|
+
repeated PickleTableRow rows = 1;
|
190
|
+
}
|
191
|
+
|
192
|
+
message PickleTableCell {
|
193
|
+
Location location = 1;
|
194
|
+
string value = 2;
|
195
|
+
}
|
196
|
+
|
197
|
+
message PickleTableRow {
|
198
|
+
repeated PickleTableCell cells = 1;
|
199
|
+
}
|
200
|
+
|
201
|
+
message PickleTag {
|
202
|
+
Location location = 1;
|
203
|
+
string name = 2;
|
204
|
+
}
|
205
|
+
|
206
|
+
////// Results
|
207
|
+
|
208
|
+
message TestCaseStarted {
|
209
|
+
string pickleId = 1;
|
210
|
+
google.protobuf.Timestamp timestamp = 2;
|
211
|
+
}
|
212
|
+
|
213
|
+
message TestCaseFinished {
|
214
|
+
string pickleId = 1;
|
215
|
+
google.protobuf.Timestamp timestamp = 2;
|
216
|
+
}
|
217
|
+
|
218
|
+
message TestStepStarted {
|
219
|
+
string pickleId = 1;
|
220
|
+
uint32 index = 2;
|
221
|
+
google.protobuf.Timestamp timestamp = 3;
|
222
|
+
}
|
223
|
+
|
224
|
+
message TestStepFinished {
|
225
|
+
string pickleId = 1;
|
226
|
+
uint32 index = 2;
|
227
|
+
TestResult testResult = 3;
|
228
|
+
google.protobuf.Timestamp timestamp = 4;
|
229
|
+
}
|
230
|
+
|
231
|
+
message TestResult {
|
232
|
+
Status status = 1;
|
233
|
+
string message = 2;
|
234
|
+
}
|
235
|
+
|
236
|
+
enum Status {
|
237
|
+
AMBIGUOUS = 0;
|
238
|
+
FAILED = 1;
|
239
|
+
PASSED = 2;
|
240
|
+
PENDING = 3;
|
241
|
+
SKIPPED = 4;
|
242
|
+
UNDEFINED = 5;
|
243
|
+
}
|
@@ -0,0 +1,74 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# With thanks to @myronmarston
|
3
|
+
# https://github.com/vcr/vcr/blob/master/spec/capture_warnings.rb
|
4
|
+
|
5
|
+
module CaptureWarnings
|
6
|
+
def report_warnings(&block)
|
7
|
+
current_dir = Dir.pwd
|
8
|
+
warnings, errors = capture_error(&block).partition { |line| line.include?('warning') }
|
9
|
+
project_warnings, other_warnings = warnings.uniq.partition { |line| line.include?(current_dir) }
|
10
|
+
|
11
|
+
if errors.any?
|
12
|
+
puts errors.join("\n")
|
13
|
+
end
|
14
|
+
|
15
|
+
if other_warnings.any?
|
16
|
+
puts "#{ other_warnings.count } warnings detected, set VIEW_OTHER_WARNINGS=true to see them."
|
17
|
+
print_warnings('other', other_warnings) if ENV['VIEW_OTHER_WARNINGS']
|
18
|
+
end
|
19
|
+
|
20
|
+
# Until they fix https://bugs.ruby-lang.org/issues/10661
|
21
|
+
if RUBY_VERSION == "2.2.0"
|
22
|
+
project_warnings = project_warnings.reject { |w| w =~ /warning: possible reference to past scope/ }
|
23
|
+
end
|
24
|
+
|
25
|
+
if project_warnings.any?
|
26
|
+
puts "#{ project_warnings.count } warnings detected"
|
27
|
+
print_warnings('cucumber-expressions', project_warnings)
|
28
|
+
fail "Please remove all cucumber-expressions warnings."
|
29
|
+
end
|
30
|
+
|
31
|
+
ensure_system_exit_if_required
|
32
|
+
end
|
33
|
+
|
34
|
+
def capture_error(&block)
|
35
|
+
old_stderr = STDERR.clone
|
36
|
+
pipe_r, pipe_w = IO.pipe
|
37
|
+
pipe_r.sync = true
|
38
|
+
error = String.new
|
39
|
+
reader = Thread.new do
|
40
|
+
begin
|
41
|
+
loop do
|
42
|
+
error << pipe_r.readpartial(1024)
|
43
|
+
end
|
44
|
+
rescue EOFError
|
45
|
+
end
|
46
|
+
end
|
47
|
+
STDERR.reopen(pipe_w)
|
48
|
+
block.call
|
49
|
+
ensure
|
50
|
+
capture_system_exit
|
51
|
+
STDERR.reopen(old_stderr)
|
52
|
+
pipe_w.close
|
53
|
+
reader.join
|
54
|
+
return error.split("\n")
|
55
|
+
end
|
56
|
+
|
57
|
+
def print_warnings(type, warnings)
|
58
|
+
puts
|
59
|
+
puts "-" * 30 + " #{type} warnings: " + "-" * 30
|
60
|
+
puts
|
61
|
+
puts warnings.join("\n")
|
62
|
+
puts
|
63
|
+
puts "-" * 75
|
64
|
+
puts
|
65
|
+
end
|
66
|
+
|
67
|
+
def ensure_system_exit_if_required
|
68
|
+
raise @system_exit if @system_exit
|
69
|
+
end
|
70
|
+
|
71
|
+
def capture_system_exit
|
72
|
+
@system_exit = $!
|
73
|
+
end
|
74
|
+
end
|
data/spec/coverage.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'cucumber/messages_pb'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
module Cucumber
|
5
|
+
module Messages
|
6
|
+
describe Messages do
|
7
|
+
it "builds a pickle doc string" do
|
8
|
+
location = Location.new(line: 10, column: 20)
|
9
|
+
pickle_doc_tring = PickleDocString.new(
|
10
|
+
location: location,
|
11
|
+
contentType: 'text/plain',
|
12
|
+
content: 'some\ncontent\n'
|
13
|
+
)
|
14
|
+
expect(JSON.parse(PickleDocString.encode_json(pickle_doc_tring)))
|
15
|
+
.to(eq(
|
16
|
+
'location' => { 'line' => 10, 'column' => 20 },
|
17
|
+
'contentType' => 'text/plain',
|
18
|
+
'content' => 'some\ncontent\n'
|
19
|
+
))
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
metadata
CHANGED
@@ -1,118 +1,114 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cucumber-messages
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Aslak Hellesøy
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-09-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: google-protobuf
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - '='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
20
|
-
type: :
|
19
|
+
version: 3.6.1
|
20
|
+
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - '='
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 3.6.1
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "~>"
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '13.0'
|
34
31
|
- - ">="
|
35
32
|
- !ruby/object:Gem::Version
|
36
|
-
version:
|
33
|
+
version: '0'
|
37
34
|
type: :development
|
38
35
|
prerelease: false
|
39
36
|
version_requirements: !ruby/object:Gem::Requirement
|
40
37
|
requirements:
|
41
|
-
- - "~>"
|
42
|
-
- !ruby/object:Gem::Version
|
43
|
-
version: '13.0'
|
44
38
|
- - ">="
|
45
39
|
- !ruby/object:Gem::Version
|
46
|
-
version:
|
40
|
+
version: '0'
|
47
41
|
- !ruby/object:Gem::Dependency
|
48
|
-
name:
|
42
|
+
name: rake
|
49
43
|
requirement: !ruby/object:Gem::Requirement
|
50
44
|
requirements:
|
51
45
|
- - "~>"
|
52
46
|
- !ruby/object:Gem::Version
|
53
|
-
version: '3
|
47
|
+
version: '12.3'
|
54
48
|
type: :development
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
51
|
requirements:
|
58
52
|
- - "~>"
|
59
53
|
- !ruby/object:Gem::Version
|
60
|
-
version: '3
|
54
|
+
version: '12.3'
|
61
55
|
- !ruby/object:Gem::Dependency
|
62
|
-
name:
|
56
|
+
name: rspec
|
63
57
|
requirement: !ruby/object:Gem::Requirement
|
64
58
|
requirements:
|
65
59
|
- - "~>"
|
66
60
|
- !ruby/object:Gem::Version
|
67
|
-
version:
|
61
|
+
version: '3.7'
|
68
62
|
type: :development
|
69
63
|
prerelease: false
|
70
64
|
version_requirements: !ruby/object:Gem::Requirement
|
71
65
|
requirements:
|
72
66
|
- - "~>"
|
73
67
|
- !ruby/object:Gem::Version
|
74
|
-
version:
|
68
|
+
version: '3.7'
|
75
69
|
- !ruby/object:Gem::Dependency
|
76
|
-
name:
|
70
|
+
name: coveralls
|
77
71
|
requirement: !ruby/object:Gem::Requirement
|
78
72
|
requirements:
|
79
|
-
- - "
|
73
|
+
- - ">="
|
80
74
|
- !ruby/object:Gem::Version
|
81
|
-
version:
|
75
|
+
version: '0'
|
82
76
|
type: :development
|
83
77
|
prerelease: false
|
84
78
|
version_requirements: !ruby/object:Gem::Requirement
|
85
79
|
requirements:
|
86
|
-
- - "
|
80
|
+
- - ">="
|
87
81
|
- !ruby/object:Gem::Version
|
88
|
-
version:
|
89
|
-
description:
|
82
|
+
version: '0'
|
83
|
+
description: Protocol Buffer messages for Cucumber's inter-process communication
|
90
84
|
email: cukes@googlegroups.com
|
91
85
|
executables: []
|
92
86
|
extensions: []
|
93
87
|
extra_rdoc_files: []
|
94
88
|
files:
|
89
|
+
- ".github/ISSUE_TEMPLATE.md"
|
90
|
+
- ".github/PULL_REQUEST_TEMPLATE.md"
|
91
|
+
- ".rspec"
|
92
|
+
- ".rsync"
|
93
|
+
- ".subrepo"
|
94
|
+
- ".travis.yml"
|
95
|
+
- Gemfile
|
96
|
+
- LICENSE
|
97
|
+
- Makefile
|
95
98
|
- README.md
|
96
|
-
-
|
97
|
-
-
|
98
|
-
-
|
99
|
+
- Rakefile
|
100
|
+
- cucumber-messages.gemspec
|
101
|
+
- default.mk
|
99
102
|
- lib/cucumber/messages.rb
|
100
|
-
- lib/cucumber/
|
101
|
-
-
|
102
|
-
-
|
103
|
-
-
|
104
|
-
-
|
105
|
-
|
106
|
-
- lib/cucumber/messages/time_conversion.rb
|
107
|
-
homepage: https://github.com/cucumber/messages-ruby#readme
|
103
|
+
- lib/cucumber/messages_pb.rb
|
104
|
+
- messages.proto
|
105
|
+
- spec/capture_warnings.rb
|
106
|
+
- spec/coverage.rb
|
107
|
+
- spec/cucumber/messages/messages_spec.rb
|
108
|
+
homepage: https://github.com/cucumber/cucumber-messages-ruby#readme
|
108
109
|
licenses:
|
109
110
|
- MIT
|
110
|
-
metadata:
|
111
|
-
bug_tracker_uri: https://github.com/cucumber/messages/issues
|
112
|
-
changelog_uri: https://github.com/cucumber/messages/blob/main/CHANGELOG.md
|
113
|
-
documentation_uri: https://www.rubydoc.info/github/cucumber/messages
|
114
|
-
mailing_list_uri: https://groups.google.com/forum/#!forum/cukes
|
115
|
-
source_code_uri: https://github.com/cucumber/messages
|
111
|
+
metadata: {}
|
116
112
|
post_install_message:
|
117
113
|
rdoc_options:
|
118
114
|
- "--charset=UTF-8"
|
@@ -122,15 +118,19 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
122
118
|
requirements:
|
123
119
|
- - ">="
|
124
120
|
- !ruby/object:Gem::Version
|
125
|
-
version:
|
121
|
+
version: 1.9.3
|
126
122
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
127
123
|
requirements:
|
128
124
|
- - ">="
|
129
125
|
- !ruby/object:Gem::Version
|
130
|
-
version:
|
126
|
+
version: '0'
|
131
127
|
requirements: []
|
132
|
-
|
128
|
+
rubyforge_project:
|
129
|
+
rubygems_version: 2.7.6
|
133
130
|
signing_key:
|
134
131
|
specification_version: 4
|
135
|
-
summary: cucumber-messages-
|
136
|
-
test_files:
|
132
|
+
summary: cucumber-messages-1.0.0
|
133
|
+
test_files:
|
134
|
+
- spec/capture_warnings.rb
|
135
|
+
- spec/coverage.rb
|
136
|
+
- spec/cucumber/messages/messages_spec.rb
|
data/VERSION
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
0.0.0
|
@@ -1,24 +0,0 @@
|
|
1
|
-
require 'securerandom'
|
2
|
-
|
3
|
-
module Cucumber
|
4
|
-
module Messages
|
5
|
-
module IdGenerator
|
6
|
-
class Incrementing
|
7
|
-
def initialize
|
8
|
-
@index = -1
|
9
|
-
end
|
10
|
-
|
11
|
-
def new_id
|
12
|
-
@index += 1
|
13
|
-
@index.to_s
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
class UUID
|
18
|
-
def new_id
|
19
|
-
SecureRandom.uuid
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
@@ -1,37 +0,0 @@
|
|
1
|
-
require 'cucumber/messages/message/utils'
|
2
|
-
require 'json'
|
3
|
-
|
4
|
-
module Cucumber
|
5
|
-
module Messages
|
6
|
-
class Message
|
7
|
-
include Cucumber::Messages::Message::Utils
|
8
|
-
|
9
|
-
module Deserialization
|
10
|
-
def self.included(other)
|
11
|
-
other.extend(ClassMethods)
|
12
|
-
end
|
13
|
-
|
14
|
-
module ClassMethods
|
15
|
-
##
|
16
|
-
# Returns a new Message - or messages into an array - deserialized from the given json document.
|
17
|
-
# CamelCased keys are properly converted to snake_cased attributes in the process
|
18
|
-
#
|
19
|
-
# Cucumber::Messages::Duration.from_json('{"seconds":1,"nanos":42}') # => #<Cucumber::Messages::Duration:0x00007efda134c290 @seconds=1, @nanos=42>
|
20
|
-
# Cucumber::Messages::PickleTag.from_json('{"name":"foo","astNodeId":"abc-def"}') # => #<Cucumber::Messages::PickleTag:0x00007efda138cdb8 @name="foo", @ast_node_id="abc-def">
|
21
|
-
#
|
22
|
-
# It is recursive so embedded messages are also processed.
|
23
|
-
#
|
24
|
-
# json_string = { location: { line: 2 }, text: "comment" }.to_json
|
25
|
-
# Cucumber::Messages::Comment.from_json(json_string) # => #<Cucumber::Messages::Comment:0x00007efda6abf888 @location=#<Cucumber::Messages::Location:0x00007efda6abf978 @line=2, @column=nil>, @text="comment">
|
26
|
-
#
|
27
|
-
# json_string = { uri: 'file:///...', comments: [{text: 'text comment'}, {text: 'another comment'}]}.to_json
|
28
|
-
# Cucumber::Messages::GherkinDocument.from_json(json_string) # => #<Cucumber::Messages::GherkinDocument:0x00007efda11e6a90 ... @comments=[#<Cucumber::Messages::Comment:0x00007efda11e6e50 ..., #<Cucumber::Messages::Comment:0x00007efda11e6b58 ...>]>
|
29
|
-
##
|
30
|
-
def from_json(json_string)
|
31
|
-
from_h(JSON.parse(json_string, { symbolize_names: true }))
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
@@ -1,70 +0,0 @@
|
|
1
|
-
require 'cucumber/messages/message/utils'
|
2
|
-
require 'json'
|
3
|
-
|
4
|
-
module Cucumber
|
5
|
-
module Messages
|
6
|
-
class Message
|
7
|
-
include Cucumber::Messages::Message::Utils
|
8
|
-
|
9
|
-
module Serialization
|
10
|
-
##
|
11
|
-
# Returns a new Hash formed from the message attributes
|
12
|
-
# If +camelize:+ keyword parameter is set to true, then keys will be camelized
|
13
|
-
# If +reject_nil_values:+ keyword parameter is set to true, resulting hash won't include nil values
|
14
|
-
#
|
15
|
-
# Cucumber::Messages::Duration.new(seconds: 1, nanos: 42).to_h # => { seconds: 1, nanos: 42 }
|
16
|
-
# Cucumber::Messages::PickleTag.new(name: 'foo', ast_node_id: 'abc-def').to_h(camelize: true) # => { name: 'foo', astNodeId: 'abc-def' }
|
17
|
-
# Cucumber::Messages::PickleTag.new(name: 'foo', ast_node_id: nil).to_h(reject_nil_values: true) # => { name: 'foo' }
|
18
|
-
#
|
19
|
-
# It is recursive so embedded messages are also processed
|
20
|
-
#
|
21
|
-
# location = Cucumber::Messages::Location.new(line: 2)
|
22
|
-
# Cucumber::Messages::Comment.new(location: location, text: 'comment').to_h # => { location: { line: 2, :column: nil }, text: "comment" }
|
23
|
-
##
|
24
|
-
def to_h(camelize: false, reject_nil_values: false)
|
25
|
-
resulting_hash = self.instance_variables.map do |variable_name|
|
26
|
-
h_key = variable_name[1..-1]
|
27
|
-
h_key = Cucumber::Messages::Message.camelize(h_key) if camelize
|
28
|
-
|
29
|
-
h_value = prepare_value(
|
30
|
-
self.instance_variable_get(variable_name),
|
31
|
-
camelize: camelize,
|
32
|
-
reject_nil_values: reject_nil_values
|
33
|
-
)
|
34
|
-
|
35
|
-
[ h_key.to_sym, h_value ]
|
36
|
-
end.to_h
|
37
|
-
|
38
|
-
resulting_hash.reject! { |_, value| value.nil? } if reject_nil_values
|
39
|
-
resulting_hash
|
40
|
-
end
|
41
|
-
|
42
|
-
##
|
43
|
-
# Generates a JSON document from the message.
|
44
|
-
# Keys are camelized during the process. Null values are not part of the json document.
|
45
|
-
#
|
46
|
-
# Cucumber::Messages::Duration.new(seconds: 1, nanos: 42).to_json # => '{"seconds":1,"nanos":42}'
|
47
|
-
# Cucumber::Messages::PickleTag.new(name: 'foo', ast_node_id: 'abc-def').to_json # => '{"name":"foo","astNodeId":"abc-def"}'
|
48
|
-
# Cucumber::Messages::PickleTag.new(name: 'foo', ast_node_id: nil).to_json # => '{"name":"foo"}'
|
49
|
-
#
|
50
|
-
# As #to_h, the method is recursive
|
51
|
-
#
|
52
|
-
# location = Cucumber::Messages::Location.new(line: 2)
|
53
|
-
# Cucumber::Messages::Comment.new(location: location, text: 'comment').to_json # => '{"location":{"line":2,"column":null},"text":"comment"}'
|
54
|
-
##
|
55
|
-
def to_json
|
56
|
-
to_h(camelize: true, reject_nil_values: true).to_json
|
57
|
-
end
|
58
|
-
|
59
|
-
private
|
60
|
-
|
61
|
-
def prepare_value(value, camelize:, reject_nil_values:)
|
62
|
-
return value.to_h(camelize: camelize, reject_nil_values: reject_nil_values) if value.is_a?(Cucumber::Messages::Message)
|
63
|
-
return value.map { |v| prepare_value(v, camelize: camelize, reject_nil_values: reject_nil_values) } if value.is_a?(Array)
|
64
|
-
|
65
|
-
value
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|