sealights-rspec-agent 2.0.4 → 2.0.5
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/agent/config.rb +6 -6
- data/agent/dependencies/faraday-0.17.0/LICENSE.md +20 -0
- data/agent/dependencies/faraday-0.17.0/README.md +384 -0
- data/agent/dependencies/faraday-0.17.0/lib/faraday.rb +248 -0
- data/agent/dependencies/faraday-0.17.0/lib/faraday/adapter.rb +55 -0
- data/agent/dependencies/faraday-0.17.0/lib/faraday/adapter/em_http.rb +243 -0
- data/agent/dependencies/faraday-0.17.0/lib/faraday/adapter/em_synchrony.rb +106 -0
- data/agent/dependencies/faraday-0.17.0/lib/faraday/adapter/em_synchrony/parallel_manager.rb +66 -0
- data/agent/dependencies/faraday-0.17.0/lib/faraday/adapter/excon.rb +82 -0
- data/agent/dependencies/faraday-0.17.0/lib/faraday/adapter/httpclient.rb +128 -0
- data/agent/dependencies/faraday-0.17.0/lib/faraday/adapter/net_http.rb +152 -0
- data/agent/dependencies/faraday-0.17.0/lib/faraday/adapter/net_http_persistent.rb +68 -0
- data/agent/dependencies/faraday-0.17.0/lib/faraday/adapter/patron.rb +95 -0
- data/agent/dependencies/faraday-0.17.0/lib/faraday/adapter/rack.rb +58 -0
- data/agent/dependencies/faraday-0.17.0/lib/faraday/adapter/sl_em_http_ssl_patch.rb +56 -0
- data/agent/dependencies/faraday-0.17.0/lib/faraday/adapter/test.rb +213 -0
- data/agent/dependencies/faraday-0.17.0/lib/faraday/adapter/typhoeus.rb +12 -0
- data/agent/dependencies/faraday-0.17.0/lib/faraday/autoload.rb +84 -0
- data/agent/dependencies/faraday-0.17.0/lib/faraday/connection.rb +484 -0
- data/agent/dependencies/faraday-0.17.0/lib/faraday/error.rb +66 -0
- data/agent/dependencies/faraday-0.17.0/lib/faraday/middleware.rb +37 -0
- data/agent/dependencies/faraday-0.17.0/lib/faraday/options.rb +373 -0
- data/agent/dependencies/faraday-0.17.0/lib/faraday/parameters.rb +198 -0
- data/agent/dependencies/faraday-0.17.0/lib/faraday/rack_builder.rb +237 -0
- data/agent/dependencies/faraday-0.17.0/lib/faraday/request.rb +114 -0
- data/agent/dependencies/faraday-0.17.0/lib/faraday/request/authorization.rb +41 -0
- data/agent/dependencies/faraday-0.17.0/lib/faraday/request/basic_authentication.rb +13 -0
- data/agent/dependencies/faraday-0.17.0/lib/faraday/request/instrumentation.rb +36 -0
- data/agent/dependencies/faraday-0.17.0/lib/faraday/request/multipart.rb +68 -0
- data/agent/dependencies/faraday-0.17.0/lib/faraday/request/retry.rb +212 -0
- data/agent/dependencies/faraday-0.17.0/lib/faraday/request/token_authentication.rb +15 -0
- data/agent/dependencies/faraday-0.17.0/lib/faraday/request/url_encoded.rb +36 -0
- data/agent/dependencies/faraday-0.17.0/lib/faraday/response.rb +97 -0
- data/agent/dependencies/faraday-0.17.0/lib/faraday/response/logger.rb +80 -0
- data/agent/dependencies/faraday-0.17.0/lib/faraday/response/raise_error.rb +21 -0
- data/agent/dependencies/faraday-0.17.0/lib/faraday/upload_io.rb +67 -0
- data/agent/dependencies/faraday-0.17.0/lib/faraday/utils.rb +326 -0
- data/agent/dependencies/jwt-2.2.1/AUTHORS +84 -0
- data/agent/dependencies/jwt-2.2.1/Appraisals +14 -0
- data/agent/dependencies/jwt-2.2.1/CHANGELOG.md +570 -0
- data/agent/dependencies/jwt-2.2.1/Gemfile +3 -0
- data/agent/dependencies/jwt-2.2.1/LICENSE +7 -0
- data/agent/dependencies/jwt-2.2.1/README.md +489 -0
- data/agent/dependencies/jwt-2.2.1/Rakefile +11 -0
- data/agent/dependencies/jwt-2.2.1/lib/jwt.rb +30 -0
- data/agent/dependencies/jwt-2.2.1/lib/jwt/algos/ecdsa.rb +35 -0
- data/agent/dependencies/jwt-2.2.1/lib/jwt/algos/eddsa.rb +23 -0
- data/agent/dependencies/jwt-2.2.1/lib/jwt/algos/hmac.rb +33 -0
- data/agent/dependencies/jwt-2.2.1/lib/jwt/algos/ps.rb +43 -0
- data/agent/dependencies/jwt-2.2.1/lib/jwt/algos/rsa.rb +19 -0
- data/agent/dependencies/jwt-2.2.1/lib/jwt/algos/unsupported.rb +16 -0
- data/agent/dependencies/jwt-2.2.1/lib/jwt/base64.rb +19 -0
- data/agent/dependencies/jwt-2.2.1/lib/jwt/claims_validator.rb +33 -0
- data/agent/dependencies/jwt-2.2.1/lib/jwt/decode.rb +100 -0
- data/agent/dependencies/jwt-2.2.1/lib/jwt/default_options.rb +15 -0
- data/agent/dependencies/jwt-2.2.1/lib/jwt/encode.rb +68 -0
- data/agent/dependencies/jwt-2.2.1/lib/jwt/error.rb +20 -0
- data/agent/dependencies/jwt-2.2.1/lib/jwt/json.rb +18 -0
- data/agent/dependencies/jwt-2.2.1/lib/jwt/jwk.rb +31 -0
- data/agent/dependencies/jwt-2.2.1/lib/jwt/jwk/key_finder.rb +57 -0
- data/agent/dependencies/jwt-2.2.1/lib/jwt/jwk/rsa.rb +47 -0
- data/agent/dependencies/jwt-2.2.1/lib/jwt/security_utils.rb +57 -0
- data/agent/dependencies/jwt-2.2.1/lib/jwt/signature.rb +52 -0
- data/agent/dependencies/jwt-2.2.1/lib/jwt/verify.rb +98 -0
- data/agent/dependencies/jwt-2.2.1/lib/jwt/version.rb +24 -0
- data/agent/dependencies/jwt-2.2.1/ruby-jwt.gemspec +34 -0
- data/agent/dependencies/multipart-post-2.1.1/Gemfile +6 -0
- data/agent/dependencies/multipart-post-2.1.1/History.txt +64 -0
- data/agent/dependencies/multipart-post-2.1.1/LICENSE +21 -0
- data/agent/dependencies/multipart-post-2.1.1/Manifest.txt +9 -0
- data/agent/dependencies/multipart-post-2.1.1/README.md +127 -0
- data/agent/dependencies/multipart-post-2.1.1/Rakefile +6 -0
- data/agent/dependencies/multipart-post-2.1.1/lib/composite_io.rb +108 -0
- data/agent/dependencies/multipart-post-2.1.1/lib/multipart_post.rb +9 -0
- data/agent/dependencies/multipart-post-2.1.1/lib/multipartable.rb +48 -0
- data/agent/dependencies/multipart-post-2.1.1/lib/net/http/post/multipart.rb +28 -0
- data/agent/dependencies/multipart-post-2.1.1/lib/parts.rb +126 -0
- data/agent/dependencies/multipart-post-2.1.1/multipart-post.gemspec +23 -0
- data/agent/http_client.rb +46 -0
- data/agent/listener.rb +1 -1
- data/agent/sealights-rspec-agent.rb +2 -2
- data/agent/tia.rb +5 -1
- metadata +80 -3
- data/agent/rest-client-wrapper.rb +0 -27
@@ -0,0 +1,66 @@
|
|
1
|
+
module SLFaraday
|
2
|
+
class Error < StandardError; end
|
3
|
+
|
4
|
+
class ClientError < Error
|
5
|
+
attr_reader :response, :wrapped_exception
|
6
|
+
|
7
|
+
def initialize(ex, response = nil)
|
8
|
+
@wrapped_exception = nil
|
9
|
+
@response = response
|
10
|
+
|
11
|
+
if ex.respond_to?(:backtrace)
|
12
|
+
super(ex.message)
|
13
|
+
@wrapped_exception = ex
|
14
|
+
elsif ex.respond_to?(:each_key)
|
15
|
+
super("the server responded with status #{ex[:status]}")
|
16
|
+
@response = ex
|
17
|
+
else
|
18
|
+
super(ex.to_s)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def backtrace
|
23
|
+
if @wrapped_exception
|
24
|
+
@wrapped_exception.backtrace
|
25
|
+
else
|
26
|
+
super
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def inspect
|
31
|
+
inner = ''
|
32
|
+
if @wrapped_exception
|
33
|
+
inner << " wrapped=#{@wrapped_exception.inspect}"
|
34
|
+
end
|
35
|
+
if @response
|
36
|
+
inner << " response=#{@response.inspect}"
|
37
|
+
end
|
38
|
+
if inner.empty?
|
39
|
+
inner << " #{super}"
|
40
|
+
end
|
41
|
+
%(#<#{self.class}#{inner}>)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
class ConnectionFailed < ClientError; end
|
46
|
+
class ResourceNotFound < ClientError; end
|
47
|
+
class ParsingError < ClientError; end
|
48
|
+
|
49
|
+
class TimeoutError < ClientError
|
50
|
+
def initialize(ex = nil)
|
51
|
+
super(ex || "timeout")
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
class SSLError < ClientError
|
56
|
+
end
|
57
|
+
|
58
|
+
class RetriableResponse < ClientError; end
|
59
|
+
|
60
|
+
[:ClientError, :ConnectionFailed, :ResourceNotFound,
|
61
|
+
:ParsingError, :TimeoutError, :SSLError, :RetriableResponse].each do |const|
|
62
|
+
Error.const_set(const, SLFaraday.const_get(const))
|
63
|
+
end
|
64
|
+
|
65
|
+
|
66
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module SLFaraday
|
2
|
+
class Middleware
|
3
|
+
extend MiddlewareRegistry
|
4
|
+
|
5
|
+
class << self
|
6
|
+
attr_accessor :load_error
|
7
|
+
private :load_error=
|
8
|
+
end
|
9
|
+
|
10
|
+
self.load_error = nil
|
11
|
+
|
12
|
+
# Executes a block which should try to require and reference dependent libraries
|
13
|
+
def self.dependency(lib = nil)
|
14
|
+
lib ? require(lib) : yield
|
15
|
+
rescue LoadError, NameError => error
|
16
|
+
self.load_error = error
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.new(*)
|
20
|
+
raise "missing dependency for #{self}: #{load_error.message}" unless loaded?
|
21
|
+
super
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.loaded?
|
25
|
+
load_error.nil?
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.inherited(subclass)
|
29
|
+
super
|
30
|
+
subclass.send(:load_error=, self.load_error)
|
31
|
+
end
|
32
|
+
|
33
|
+
def initialize(app = nil)
|
34
|
+
@app = app
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,373 @@
|
|
1
|
+
module SLFaraday
|
2
|
+
# Subclasses Struct with some special helpers for converting from a Hash to
|
3
|
+
# a Struct.
|
4
|
+
class Options < Struct
|
5
|
+
# Public
|
6
|
+
def self.from(value)
|
7
|
+
value ? new.update(value) : new
|
8
|
+
end
|
9
|
+
|
10
|
+
# Public
|
11
|
+
def each
|
12
|
+
return to_enum(:each) unless block_given?
|
13
|
+
members.each do |key|
|
14
|
+
yield(key.to_sym, send(key))
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
# Public
|
19
|
+
def update(obj)
|
20
|
+
obj.each do |key, value|
|
21
|
+
sub_options = self.class.options_for(key)
|
22
|
+
if sub_options
|
23
|
+
new_value = sub_options.from(value) if value
|
24
|
+
elsif value.is_a?(Hash)
|
25
|
+
new_value = value.dup
|
26
|
+
else
|
27
|
+
new_value = value
|
28
|
+
end
|
29
|
+
|
30
|
+
self.send("#{key}=", new_value) unless new_value.nil?
|
31
|
+
end
|
32
|
+
self
|
33
|
+
end
|
34
|
+
|
35
|
+
# Public
|
36
|
+
def delete(key)
|
37
|
+
value = send(key)
|
38
|
+
send("#{key}=", nil)
|
39
|
+
value
|
40
|
+
end
|
41
|
+
|
42
|
+
# Public
|
43
|
+
def clear
|
44
|
+
members.each { |member| delete(member) }
|
45
|
+
end
|
46
|
+
|
47
|
+
# Public
|
48
|
+
def merge!(other)
|
49
|
+
other.each do |key, other_value|
|
50
|
+
self_value = self.send(key)
|
51
|
+
sub_options = self.class.options_for(key)
|
52
|
+
new_value = (self_value && sub_options && other_value) ? self_value.merge(other_value) : other_value
|
53
|
+
self.send("#{key}=", new_value) unless new_value.nil?
|
54
|
+
end
|
55
|
+
self
|
56
|
+
end
|
57
|
+
|
58
|
+
# Public
|
59
|
+
def merge(other)
|
60
|
+
dup.merge!(other)
|
61
|
+
end
|
62
|
+
|
63
|
+
# Public
|
64
|
+
def deep_dup
|
65
|
+
self.class.from(self)
|
66
|
+
end
|
67
|
+
|
68
|
+
# Public
|
69
|
+
def fetch(key, *args)
|
70
|
+
unless symbolized_key_set.include?(key.to_sym)
|
71
|
+
key_setter = "#{key}="
|
72
|
+
if args.size > 0
|
73
|
+
send(key_setter, args.first)
|
74
|
+
elsif block_given?
|
75
|
+
send(key_setter, Proc.new.call(key))
|
76
|
+
else
|
77
|
+
raise self.class.fetch_error_class, "key not found: #{key.inspect}"
|
78
|
+
end
|
79
|
+
end
|
80
|
+
send(key)
|
81
|
+
end
|
82
|
+
|
83
|
+
# Public
|
84
|
+
def values_at(*keys)
|
85
|
+
keys.map { |key| send(key) }
|
86
|
+
end
|
87
|
+
|
88
|
+
# Public
|
89
|
+
def keys
|
90
|
+
members.reject { |member| send(member).nil? }
|
91
|
+
end
|
92
|
+
|
93
|
+
# Public
|
94
|
+
def empty?
|
95
|
+
keys.empty?
|
96
|
+
end
|
97
|
+
|
98
|
+
# Public
|
99
|
+
def each_key
|
100
|
+
return to_enum(:each_key) unless block_given?
|
101
|
+
keys.each do |key|
|
102
|
+
yield(key)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
# Public
|
107
|
+
def key?(key)
|
108
|
+
keys.include?(key)
|
109
|
+
end
|
110
|
+
|
111
|
+
alias has_key? key?
|
112
|
+
|
113
|
+
# Public
|
114
|
+
def each_value
|
115
|
+
return to_enum(:each_value) unless block_given?
|
116
|
+
values.each do |value|
|
117
|
+
yield(value)
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
# Public
|
122
|
+
def value?(value)
|
123
|
+
values.include?(value)
|
124
|
+
end
|
125
|
+
|
126
|
+
alias has_value? value?
|
127
|
+
|
128
|
+
# Public
|
129
|
+
def to_hash
|
130
|
+
hash = {}
|
131
|
+
members.each do |key|
|
132
|
+
value = send(key)
|
133
|
+
hash[key.to_sym] = value unless value.nil?
|
134
|
+
end
|
135
|
+
hash
|
136
|
+
end
|
137
|
+
|
138
|
+
# Internal
|
139
|
+
def inspect
|
140
|
+
values = []
|
141
|
+
members.each do |member|
|
142
|
+
value = send(member)
|
143
|
+
values << "#{member}=#{value.inspect}" if value
|
144
|
+
end
|
145
|
+
values = values.empty? ? ' (empty)' : (' ' << values.join(", "))
|
146
|
+
|
147
|
+
%(#<#{self.class}#{values}>)
|
148
|
+
end
|
149
|
+
|
150
|
+
# Internal
|
151
|
+
def self.options(mapping)
|
152
|
+
attribute_options.update(mapping)
|
153
|
+
end
|
154
|
+
|
155
|
+
# Internal
|
156
|
+
def self.options_for(key)
|
157
|
+
attribute_options[key]
|
158
|
+
end
|
159
|
+
|
160
|
+
# Internal
|
161
|
+
def self.attribute_options
|
162
|
+
@attribute_options ||= {}
|
163
|
+
end
|
164
|
+
|
165
|
+
def self.memoized(key)
|
166
|
+
memoized_attributes[key.to_sym] = Proc.new
|
167
|
+
class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
168
|
+
def #{key}() self[:#{key}]; end
|
169
|
+
RUBY
|
170
|
+
end
|
171
|
+
|
172
|
+
def self.memoized_attributes
|
173
|
+
@memoized_attributes ||= {}
|
174
|
+
end
|
175
|
+
|
176
|
+
def [](key)
|
177
|
+
key = key.to_sym
|
178
|
+
if method = self.class.memoized_attributes[key]
|
179
|
+
super(key) || (self[key] = instance_eval(&method))
|
180
|
+
else
|
181
|
+
super
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
def symbolized_key_set
|
186
|
+
@symbolized_key_set ||= Set.new(keys.map { |k| k.to_sym })
|
187
|
+
end
|
188
|
+
|
189
|
+
def self.inherited(subclass)
|
190
|
+
super
|
191
|
+
subclass.attribute_options.update(attribute_options)
|
192
|
+
subclass.memoized_attributes.update(memoized_attributes)
|
193
|
+
end
|
194
|
+
|
195
|
+
def self.fetch_error_class
|
196
|
+
@fetch_error_class ||= if Object.const_defined?(:KeyError)
|
197
|
+
::KeyError
|
198
|
+
else
|
199
|
+
::IndexError
|
200
|
+
end
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
class RequestOptions < Options.new(:params_encoder, :proxy, :bind,
|
205
|
+
:timeout, :open_timeout, :write_timeout, :boundary, :oauth, :context)
|
206
|
+
|
207
|
+
def []=(key, value)
|
208
|
+
if key && key.to_sym == :proxy
|
209
|
+
super(key, value ? ProxyOptions.from(value) : nil)
|
210
|
+
else
|
211
|
+
super(key, value)
|
212
|
+
end
|
213
|
+
end
|
214
|
+
end
|
215
|
+
|
216
|
+
class SSLOptions < Options.new(:verify, :ca_file, :ca_path, :verify_mode,
|
217
|
+
:cert_store, :client_cert, :client_key, :certificate, :private_key, :verify_depth,
|
218
|
+
:version, :min_version, :max_version)
|
219
|
+
|
220
|
+
def verify?
|
221
|
+
verify != false
|
222
|
+
end
|
223
|
+
|
224
|
+
def disable?
|
225
|
+
!verify?
|
226
|
+
end
|
227
|
+
end
|
228
|
+
|
229
|
+
class ProxyOptions < Options.new(:uri, :user, :password)
|
230
|
+
extend Forwardable
|
231
|
+
def_delegators :uri, :scheme, :scheme=, :host, :host=, :port, :port=, :path, :path=
|
232
|
+
|
233
|
+
def self.from(value)
|
234
|
+
case value
|
235
|
+
when String
|
236
|
+
value = {:uri => Utils.URI(value)}
|
237
|
+
when URI
|
238
|
+
value = {:uri => value}
|
239
|
+
when Hash, Options
|
240
|
+
if uri = value.delete(:uri)
|
241
|
+
value[:uri] = Utils.URI(uri)
|
242
|
+
end
|
243
|
+
end
|
244
|
+
super(value)
|
245
|
+
end
|
246
|
+
|
247
|
+
memoized(:user) { uri && uri.user && Utils.unescape(uri.user) }
|
248
|
+
memoized(:password) { uri && uri.password && Utils.unescape(uri.password) }
|
249
|
+
end
|
250
|
+
|
251
|
+
class ConnectionOptions < Options.new(:request, :proxy, :ssl, :builder, :url,
|
252
|
+
:parallel_manager, :params, :headers, :builder_class)
|
253
|
+
|
254
|
+
options :request => RequestOptions, :ssl => SSLOptions
|
255
|
+
|
256
|
+
memoized(:request) { self.class.options_for(:request).new }
|
257
|
+
|
258
|
+
memoized(:ssl) { self.class.options_for(:ssl).new }
|
259
|
+
|
260
|
+
memoized(:builder_class) { RackBuilder }
|
261
|
+
|
262
|
+
def new_builder(block)
|
263
|
+
builder_class.new(&block)
|
264
|
+
end
|
265
|
+
end
|
266
|
+
|
267
|
+
class Env < Options.new(:method, :body, :url, :request, :request_headers,
|
268
|
+
:ssl, :parallel_manager, :params, :response, :response_headers, :status,
|
269
|
+
:reason_phrase)
|
270
|
+
|
271
|
+
ContentLength = 'Content-Length'.freeze
|
272
|
+
StatusesWithoutBody = Set.new [204, 304]
|
273
|
+
SuccessfulStatuses = 200..299
|
274
|
+
|
275
|
+
# A Set of HTTP verbs that typically send a body. If no body is set for
|
276
|
+
# these requests, the Content-Length header is set to 0.
|
277
|
+
MethodsWithBodies = Set.new [:post, :put, :patch, :options]
|
278
|
+
|
279
|
+
options :request => RequestOptions,
|
280
|
+
:request_headers => Utils::Headers, :response_headers => Utils::Headers
|
281
|
+
|
282
|
+
extend Forwardable
|
283
|
+
|
284
|
+
def_delegators :request, :params_encoder
|
285
|
+
|
286
|
+
# Public
|
287
|
+
def self.from(value)
|
288
|
+
env = super(value)
|
289
|
+
if value.respond_to?(:custom_members)
|
290
|
+
env.custom_members.update(value.custom_members)
|
291
|
+
end
|
292
|
+
env
|
293
|
+
end
|
294
|
+
|
295
|
+
# Public
|
296
|
+
def [](key)
|
297
|
+
if in_member_set?(key)
|
298
|
+
super(key)
|
299
|
+
else
|
300
|
+
custom_members[key]
|
301
|
+
end
|
302
|
+
end
|
303
|
+
|
304
|
+
# Public
|
305
|
+
def []=(key, value)
|
306
|
+
if in_member_set?(key)
|
307
|
+
super(key, value)
|
308
|
+
else
|
309
|
+
custom_members[key] = value
|
310
|
+
end
|
311
|
+
end
|
312
|
+
|
313
|
+
# Public
|
314
|
+
def success?
|
315
|
+
SuccessfulStatuses.include?(status)
|
316
|
+
end
|
317
|
+
|
318
|
+
# Public
|
319
|
+
def needs_body?
|
320
|
+
!body && MethodsWithBodies.include?(method)
|
321
|
+
end
|
322
|
+
|
323
|
+
# Public
|
324
|
+
def clear_body
|
325
|
+
request_headers[ContentLength] = '0'
|
326
|
+
self.body = ''
|
327
|
+
end
|
328
|
+
|
329
|
+
# Public
|
330
|
+
def parse_body?
|
331
|
+
!StatusesWithoutBody.include?(status)
|
332
|
+
end
|
333
|
+
|
334
|
+
# Public
|
335
|
+
def parallel?
|
336
|
+
!!parallel_manager
|
337
|
+
end
|
338
|
+
|
339
|
+
def inspect
|
340
|
+
attrs = [nil]
|
341
|
+
members.each do |mem|
|
342
|
+
if value = send(mem)
|
343
|
+
attrs << "@#{mem}=#{value.inspect}"
|
344
|
+
end
|
345
|
+
end
|
346
|
+
if !custom_members.empty?
|
347
|
+
attrs << "@custom=#{custom_members.inspect}"
|
348
|
+
end
|
349
|
+
%(#<#{self.class}#{attrs.join(" ")}>)
|
350
|
+
end
|
351
|
+
|
352
|
+
# Internal
|
353
|
+
def custom_members
|
354
|
+
@custom_members ||= {}
|
355
|
+
end
|
356
|
+
|
357
|
+
# Internal
|
358
|
+
if members.first.is_a?(Symbol)
|
359
|
+
def in_member_set?(key)
|
360
|
+
self.class.member_set.include?(key.to_sym)
|
361
|
+
end
|
362
|
+
else
|
363
|
+
def in_member_set?(key)
|
364
|
+
self.class.member_set.include?(key.to_s)
|
365
|
+
end
|
366
|
+
end
|
367
|
+
|
368
|
+
# Internal
|
369
|
+
def self.member_set
|
370
|
+
@member_set ||= Set.new(members)
|
371
|
+
end
|
372
|
+
end
|
373
|
+
end
|