mockserver-client 5.3.0 → 6.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.
Files changed (96) hide show
  1. checksums.yaml +5 -5
  2. data/Gemfile +2 -5
  3. data/README.md +88 -96
  4. data/lib/mockserver/client.rb +518 -0
  5. data/lib/mockserver/errors.rb +18 -0
  6. data/lib/mockserver/forward_chain_expectation.rb +117 -0
  7. data/lib/mockserver/models.rb +1507 -0
  8. data/lib/mockserver/version.rb +5 -0
  9. data/lib/mockserver/websocket_client.rb +353 -0
  10. data/lib/mockserver-client.rb +8 -64
  11. data/mockserver-client.gemspec +35 -44
  12. metadata +37 -256
  13. data/Gemfile.lock +0 -79
  14. data/Rakefile +0 -10
  15. data/docs/Body.md +0 -7
  16. data/docs/BodyWithContentType.md +0 -7
  17. data/docs/ConnectionOptions.md +0 -12
  18. data/docs/ControlApi.md +0 -269
  19. data/docs/Delay.md +0 -9
  20. data/docs/Expectation.md +0 -7
  21. data/docs/ExpectationApi.md +0 -51
  22. data/docs/Expectations.md +0 -7
  23. data/docs/HttpClassCallback.md +0 -8
  24. data/docs/HttpError.md +0 -10
  25. data/docs/HttpForward.md +0 -11
  26. data/docs/HttpObjectCallback.md +0 -8
  27. data/docs/HttpOverrideForwardedRequest.md +0 -9
  28. data/docs/HttpRequest.md +0 -15
  29. data/docs/HttpResponse.md +0 -14
  30. data/docs/HttpTemplate.md +0 -10
  31. data/docs/KeyToMultiValue.md +0 -7
  32. data/docs/KeyToValue.md +0 -7
  33. data/docs/Ports.md +0 -8
  34. data/docs/TimeToLive.md +0 -10
  35. data/docs/Times.md +0 -9
  36. data/docs/Verification.md +0 -9
  37. data/docs/VerificationSequence.md +0 -8
  38. data/docs/VerificationTimes.md +0 -9
  39. data/docs/VerifyApi.md +0 -94
  40. data/lib/mockserver-client/api/control_api.rb +0 -316
  41. data/lib/mockserver-client/api/expectation_api.rb +0 -73
  42. data/lib/mockserver-client/api/verify_api.rb +0 -127
  43. data/lib/mockserver-client/api_client.rb +0 -388
  44. data/lib/mockserver-client/api_error.rb +0 -38
  45. data/lib/mockserver-client/configuration.rb +0 -202
  46. data/lib/mockserver-client/models/body.rb +0 -174
  47. data/lib/mockserver-client/models/body_with_content_type.rb +0 -174
  48. data/lib/mockserver-client/models/connection_options.rb +0 -219
  49. data/lib/mockserver-client/models/delay.rb +0 -192
  50. data/lib/mockserver-client/models/expectation.rb +0 -174
  51. data/lib/mockserver-client/models/expectations.rb +0 -174
  52. data/lib/mockserver-client/models/http_class_callback.rb +0 -183
  53. data/lib/mockserver-client/models/http_error.rb +0 -201
  54. data/lib/mockserver-client/models/http_forward.rb +0 -244
  55. data/lib/mockserver-client/models/http_object_callback.rb +0 -183
  56. data/lib/mockserver-client/models/http_override_forwarded_request.rb +0 -192
  57. data/lib/mockserver-client/models/http_request.rb +0 -246
  58. data/lib/mockserver-client/models/http_response.rb +0 -237
  59. data/lib/mockserver-client/models/http_template.rb +0 -235
  60. data/lib/mockserver-client/models/key_to_multi_value.rb +0 -174
  61. data/lib/mockserver-client/models/key_to_value.rb +0 -174
  62. data/lib/mockserver-client/models/ports.rb +0 -185
  63. data/lib/mockserver-client/models/time_to_live.rb +0 -235
  64. data/lib/mockserver-client/models/times.rb +0 -192
  65. data/lib/mockserver-client/models/verification.rb +0 -192
  66. data/lib/mockserver-client/models/verification_sequence.rb +0 -185
  67. data/lib/mockserver-client/models/verification_times.rb +0 -192
  68. data/lib/mockserver-client/version.rb +0 -15
  69. data/spec/api/control_api_spec.rb +0 -102
  70. data/spec/api/expectation_api_spec.rb +0 -46
  71. data/spec/api/verify_api_spec.rb +0 -57
  72. data/spec/api_client_spec.rb +0 -226
  73. data/spec/configuration_spec.rb +0 -42
  74. data/spec/models/body_spec.rb +0 -35
  75. data/spec/models/body_with_content_type_spec.rb +0 -35
  76. data/spec/models/connection_options_spec.rb +0 -65
  77. data/spec/models/delay_spec.rb +0 -47
  78. data/spec/models/expectation_spec.rb +0 -35
  79. data/spec/models/expectations_spec.rb +0 -35
  80. data/spec/models/http_class_callback_spec.rb +0 -41
  81. data/spec/models/http_error_spec.rb +0 -53
  82. data/spec/models/http_forward_spec.rb +0 -63
  83. data/spec/models/http_object_callback_spec.rb +0 -41
  84. data/spec/models/http_override_forwarded_request_spec.rb +0 -47
  85. data/spec/models/http_request_spec.rb +0 -83
  86. data/spec/models/http_response_spec.rb +0 -77
  87. data/spec/models/http_template_spec.rb +0 -57
  88. data/spec/models/key_to_multi_value_spec.rb +0 -35
  89. data/spec/models/key_to_value_spec.rb +0 -35
  90. data/spec/models/ports_spec.rb +0 -41
  91. data/spec/models/time_to_live_spec.rb +0 -57
  92. data/spec/models/times_spec.rb +0 -47
  93. data/spec/models/verification_sequence_spec.rb +0 -41
  94. data/spec/models/verification_spec.rb +0 -47
  95. data/spec/models/verification_times_spec.rb +0 -47
  96. data/spec/spec_helper.rb +0 -111
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module MockServer
4
+ VERSION = '6.0.0'
5
+ end
@@ -0,0 +1,353 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json'
4
+ require 'securerandom'
5
+ require 'logger'
6
+ require 'openssl'
7
+ require 'timeout'
8
+
9
+ module MockServer
10
+ WEB_SOCKET_CORRELATION_ID_HEADER_NAME = 'WebSocketCorrelationId'
11
+ CLIENT_REGISTRATION_ID_HEADER = 'X-CLIENT-REGISTRATION-ID'
12
+
13
+ WEBSOCKET_PATH = '/_mockserver_callback_websocket'
14
+
15
+ TYPE_HTTP_REQUEST = 'org.mockserver.model.HttpRequest'
16
+ TYPE_HTTP_RESPONSE = 'org.mockserver.model.HttpResponse'
17
+ TYPE_HTTP_REQUEST_AND_RESPONSE = 'org.mockserver.model.HttpRequestAndHttpResponse'
18
+ TYPE_CLIENT_ID_DTO = 'org.mockserver.serialization.model.WebSocketClientIdDTO'
19
+ TYPE_ERROR_DTO = 'org.mockserver.serialization.model.WebSocketErrorDTO'
20
+
21
+ MAX_RECONNECT_ATTEMPTS = 3
22
+ REGISTRATION_TIMEOUT = 10
23
+
24
+ def self.extract_correlation_id(request)
25
+ return nil if request.headers.nil?
26
+
27
+ request.headers.each do |header|
28
+ if header.name == WEB_SOCKET_CORRELATION_ID_HEADER_NAME
29
+ return header.values.first if header.values && !header.values.empty?
30
+ end
31
+ end
32
+ nil
33
+ end
34
+
35
+ def self.add_correlation_id_header(message, correlation_id)
36
+ message.headers ||= []
37
+ message.headers.each do |header|
38
+ if header.name == WEB_SOCKET_CORRELATION_ID_HEADER_NAME
39
+ header.values = [correlation_id]
40
+ return message
41
+ end
42
+ end
43
+ message.headers << KeyToMultiValue.new(
44
+ name: WEB_SOCKET_CORRELATION_ID_HEADER_NAME,
45
+ values: [correlation_id]
46
+ )
47
+ message
48
+ end
49
+
50
+ def self.build_ws_message(type_name, value_dict)
51
+ JSON.generate({
52
+ 'type' => type_name,
53
+ 'value' => JSON.generate(value_dict)
54
+ })
55
+ end
56
+
57
+ def self.build_error_message(error_msg, correlation_id)
58
+ JSON.generate({
59
+ 'type' => TYPE_ERROR_DTO,
60
+ 'value' => JSON.generate({
61
+ 'message' => error_msg,
62
+ 'webSocketCorrelationId' => correlation_id
63
+ })
64
+ })
65
+ end
66
+
67
+ # @api private
68
+ def self.clean_context_path(context_path)
69
+ return '' if context_path.nil? || context_path.empty?
70
+ return "/#{context_path}" unless context_path.start_with?('/')
71
+
72
+ context_path
73
+ end
74
+
75
+ class WebSocketClient
76
+ attr_reader :client_id
77
+
78
+ def initialize
79
+ @ws = nil
80
+ @client_id = nil
81
+ @response_callback = nil
82
+ @forward_callback = nil
83
+ @forward_response_callback = nil
84
+ @stopped = false
85
+ @connected = false
86
+ @listen_thread = nil
87
+ @host = ''
88
+ @port = 0
89
+ @context_path = ''
90
+ @secure = false
91
+ @ca_cert_path = nil
92
+ @tls_verify = true
93
+ @logger = Logger.new($stdout)
94
+ @logger.progname = 'MockServer::WebSocketClient'
95
+ @logger.level = Logger::WARN
96
+ @registration_queue = nil
97
+ end
98
+
99
+ def connected?
100
+ @connected && !@stopped
101
+ end
102
+
103
+ def connect(host, port, context_path: '', secure: false,
104
+ ca_cert_path: nil, client_id: nil, tls_verify: true)
105
+ @host = host
106
+ @port = port
107
+ @context_path = context_path
108
+ @secure = secure
109
+ @ca_cert_path = ca_cert_path
110
+ @tls_verify = tls_verify
111
+
112
+ registration_id = client_id || SecureRandom.uuid
113
+
114
+ do_connect(registration_id)
115
+ @client_id
116
+ end
117
+
118
+ def register_response_callback(callback_fn)
119
+ @response_callback = callback_fn
120
+ end
121
+
122
+ def register_forward_callback(forward_fn, response_fn = nil)
123
+ @forward_callback = forward_fn
124
+ @forward_response_callback = response_fn
125
+ end
126
+
127
+ def listen
128
+ @listen_thread = Thread.new { listen_loop }
129
+ @listen_thread.abort_on_exception = false
130
+ end
131
+
132
+ def close
133
+ @stopped = true
134
+ @connected = false
135
+ @ws&.close if @ws
136
+ rescue StandardError
137
+ # ignore close errors
138
+ ensure
139
+ @ws = nil
140
+ @listen_thread&.join(5) if @listen_thread && @listen_thread != Thread.current
141
+ end
142
+
143
+ private
144
+
145
+ def do_connect(registration_id)
146
+ require 'websocket-client-simple'
147
+
148
+ scheme = @secure ? 'wss' : 'ws'
149
+ path = MockServer.clean_context_path(@context_path) + WEBSOCKET_PATH
150
+ uri = "#{scheme}://#{@host}:#{@port}#{path}"
151
+
152
+ headers = { CLIENT_REGISTRATION_ID_HEADER => registration_id }
153
+
154
+ @registration_queue = Queue.new
155
+ @connected = false
156
+ ws_client = self
157
+
158
+ opts = { headers: headers }
159
+
160
+ if @secure
161
+ if @ca_cert_path
162
+ cert_store = OpenSSL::X509::Store.new
163
+ cert_store.set_default_paths
164
+ cert_store.add_file(@ca_cert_path)
165
+ opts[:cert_store] = cert_store
166
+ opts[:verify_mode] = OpenSSL::SSL::VERIFY_PEER
167
+ elsif !@tls_verify
168
+ opts[:verify_mode] = OpenSSL::SSL::VERIFY_NONE
169
+ else
170
+ opts[:verify_mode] = OpenSSL::SSL::VERIFY_PEER
171
+ end
172
+ end
173
+
174
+ @ws = ::WebSocket::Client::Simple.connect(uri, **opts) do |ws|
175
+ ws.on :message do |msg|
176
+ ws_client.send(:handle_raw_message, msg.data)
177
+ end
178
+ ws.on :error do |e|
179
+ ws_client.send(:handle_ws_error, e)
180
+ end
181
+ ws.on :close do |_e|
182
+ ws_client.send(:handle_ws_close)
183
+ end
184
+ ws.on :open do
185
+ ws_client.send(:handle_ws_open)
186
+ end
187
+ end
188
+
189
+ result = nil
190
+ begin
191
+ Timeout.timeout(REGISTRATION_TIMEOUT) do
192
+ result = @registration_queue.pop
193
+ end
194
+ rescue Timeout::Error
195
+ @ws&.close rescue nil
196
+ @ws = nil
197
+ @connected = false
198
+ raise WebSocketError,
199
+ "WebSocket registration timed out after #{REGISTRATION_TIMEOUT}s " \
200
+ "connecting to #{@host}:#{@port}"
201
+ end
202
+
203
+ if result.is_a?(Exception)
204
+ raise result
205
+ end
206
+
207
+ @client_id = result
208
+ end
209
+
210
+ def handle_ws_open
211
+ @connected = true
212
+ end
213
+
214
+ def handle_ws_close
215
+ @connected = false
216
+ end
217
+
218
+ def handle_ws_error(error)
219
+ @connected = false
220
+ if @registration_queue
221
+ ws_error = WebSocketError.new(
222
+ "WebSocket connection error to #{@host}:#{@port}: #{error.message}"
223
+ )
224
+ @registration_queue.push(ws_error)
225
+ end
226
+ end
227
+
228
+ def listen_loop
229
+ reconnect_attempts = 0
230
+ until @stopped
231
+ sleep 0.1
232
+ next if connected?
233
+
234
+ break if @stopped
235
+
236
+ reconnect_attempts += 1
237
+ if reconnect_attempts > MAX_RECONNECT_ATTEMPTS
238
+ @logger.error('Max reconnect attempts reached, giving up')
239
+ break
240
+ end
241
+
242
+ @logger.warn("WebSocket disconnected, reconnecting (attempt #{reconnect_attempts}/#{MAX_RECONNECT_ATTEMPTS})")
243
+ begin
244
+ do_connect(@client_id || SecureRandom.uuid)
245
+ reconnect_attempts = 0
246
+ rescue StandardError => e
247
+ @logger.error("Reconnection failed: #{e.message}")
248
+ sleep [2**reconnect_attempts, 8].min
249
+ end
250
+ end
251
+ end
252
+
253
+ def handle_raw_message(raw_message)
254
+ begin
255
+ parsed = JSON.parse(raw_message)
256
+ rescue JSON::ParserError => e
257
+ @logger.warn("Received unparseable WebSocket message: #{e.message}")
258
+ return
259
+ end
260
+ msg_type = parsed['type']
261
+ msg_value = parsed['value']
262
+
263
+ if msg_type == TYPE_CLIENT_ID_DTO
264
+ value = JSON.parse(msg_value)
265
+ @client_id = value['clientId']
266
+ @registration_queue&.push(@client_id)
267
+ return
268
+ end
269
+
270
+ if msg_type == TYPE_HTTP_REQUEST
271
+ request = HttpRequest.from_hash(JSON.parse(msg_value))
272
+ correlation_id = MockServer.extract_correlation_id(request)
273
+
274
+ if @forward_callback
275
+ handle_forward_request(request, correlation_id)
276
+ elsif @response_callback
277
+ handle_response_request(request, correlation_id)
278
+ else
279
+ @logger.warn("Received HttpRequest callback but no callback registered")
280
+ end
281
+ return
282
+ end
283
+
284
+ if msg_type == TYPE_HTTP_REQUEST_AND_RESPONSE
285
+ req_and_resp = HttpRequestAndHttpResponse.from_hash(JSON.parse(msg_value))
286
+ correlation_id = MockServer.extract_correlation_id(req_and_resp.http_request)
287
+
288
+ if @forward_response_callback
289
+ handle_forward_response(req_and_resp, correlation_id)
290
+ else
291
+ @logger.warn("Received HttpRequestAndHttpResponse callback but no forward_response_callback registered")
292
+ end
293
+ return
294
+ end
295
+
296
+ @logger.warn("Received unhandled WebSocket message type: #{msg_type}")
297
+ end
298
+
299
+ def handle_response_request(request, correlation_id)
300
+ result = @response_callback.call(request)
301
+ unless result.is_a?(HttpResponse)
302
+ raise CallbackError, "Response callback must return HttpResponse, got #{result.class}"
303
+ end
304
+
305
+ MockServer.add_correlation_id_header(result, correlation_id) if correlation_id
306
+ msg = MockServer.build_ws_message(TYPE_HTTP_RESPONSE, result.to_h)
307
+ @ws.send(msg)
308
+ rescue StandardError => exc
309
+ @logger.error("Error in response callback: #{exc.message}")
310
+ if correlation_id
311
+ error_msg = MockServer.build_error_message(exc.message, correlation_id)
312
+ @ws.send(error_msg)
313
+ end
314
+ end
315
+
316
+ def handle_forward_request(request, correlation_id)
317
+ result = @forward_callback.call(request)
318
+ unless result.is_a?(HttpRequest)
319
+ raise CallbackError, "Forward callback must return HttpRequest, got #{result.class}"
320
+ end
321
+
322
+ MockServer.add_correlation_id_header(result, correlation_id) if correlation_id
323
+ msg = MockServer.build_ws_message(TYPE_HTTP_REQUEST, result.to_h)
324
+ @ws.send(msg)
325
+ rescue StandardError => exc
326
+ @logger.error("Error in forward callback: #{exc.message}")
327
+ if correlation_id
328
+ error_msg = MockServer.build_error_message(exc.message, correlation_id)
329
+ @ws.send(error_msg)
330
+ end
331
+ end
332
+
333
+ def handle_forward_response(req_and_resp, correlation_id)
334
+ result = @forward_response_callback.call(
335
+ req_and_resp.http_request,
336
+ req_and_resp.http_response
337
+ )
338
+ unless result.is_a?(HttpResponse)
339
+ raise CallbackError, "Forward response callback must return HttpResponse, got #{result.class}"
340
+ end
341
+
342
+ MockServer.add_correlation_id_header(result, correlation_id) if correlation_id
343
+ msg = MockServer.build_ws_message(TYPE_HTTP_RESPONSE, result.to_h)
344
+ @ws.send(msg)
345
+ rescue StandardError => exc
346
+ @logger.error("Error in forward response callback: #{exc.message}")
347
+ if correlation_id
348
+ error_msg = MockServer.build_error_message(exc.message, correlation_id)
349
+ @ws.send(error_msg)
350
+ end
351
+ end
352
+ end
353
+ end
@@ -1,64 +1,8 @@
1
- =begin
2
- #Mock Server API
3
-
4
- #MockServer enables easy mocking of any system you integrate with via HTTP or HTTPS with clients written in Java, JavaScript and Ruby and a simple REST API (as shown below). MockServer Proxy is a proxy that introspects all proxied traffic including encrypted SSL traffic and supports Port Forwarding, Web Proxying (i.e. HTTP proxy), HTTPS Tunneling Proxying (using HTTP CONNECT) and SOCKS Proxying (i.e. dynamic port forwarding). Both MockServer and the MockServer Proxy record all received requests so that it is possible to verify exactly what requests have been sent by the system under test.
5
-
6
- OpenAPI spec version: 5.3.0
7
-
8
- Generated by: https://openapi-generator.tech
9
- OpenAPI Generator version: 3.3.1
10
-
11
- =end
12
-
13
- # Common files
14
- require 'mockserver-client/api_client'
15
- require 'mockserver-client/api_error'
16
- require 'mockserver-client/version'
17
- require 'mockserver-client/configuration'
18
-
19
- # Models
20
- require 'mockserver-client/models/body'
21
- require 'mockserver-client/models/body_with_content_type'
22
- require 'mockserver-client/models/connection_options'
23
- require 'mockserver-client/models/delay'
24
- require 'mockserver-client/models/expectation'
25
- require 'mockserver-client/models/expectations'
26
- require 'mockserver-client/models/http_class_callback'
27
- require 'mockserver-client/models/http_error'
28
- require 'mockserver-client/models/http_forward'
29
- require 'mockserver-client/models/http_object_callback'
30
- require 'mockserver-client/models/http_override_forwarded_request'
31
- require 'mockserver-client/models/http_request'
32
- require 'mockserver-client/models/http_response'
33
- require 'mockserver-client/models/http_template'
34
- require 'mockserver-client/models/key_to_multi_value'
35
- require 'mockserver-client/models/key_to_value'
36
- require 'mockserver-client/models/ports'
37
- require 'mockserver-client/models/time_to_live'
38
- require 'mockserver-client/models/times'
39
- require 'mockserver-client/models/verification'
40
- require 'mockserver-client/models/verification_sequence'
41
- require 'mockserver-client/models/verification_times'
42
-
43
- # APIs
44
- require 'mockserver-client/api/control_api'
45
- require 'mockserver-client/api/expectation_api'
46
- require 'mockserver-client/api/verify_api'
47
-
48
- module MockServer
49
- class << self
50
- # Customize default settings for the SDK using block.
51
- # MockServer.configure do |config|
52
- # config.username = "xxx"
53
- # config.password = "xxx"
54
- # end
55
- # If no block given, return the default Configuration object.
56
- def configure
57
- if block_given?
58
- yield(Configuration.default)
59
- else
60
- Configuration.default
61
- end
62
- end
63
- end
64
- end
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'mockserver/version'
4
+ require_relative 'mockserver/errors'
5
+ require_relative 'mockserver/models'
6
+ require_relative 'mockserver/websocket_client'
7
+ require_relative 'mockserver/forward_chain_expectation'
8
+ require_relative 'mockserver/client'
@@ -1,45 +1,36 @@
1
- # -*- encoding: utf-8 -*-
2
-
3
- =begin
4
- #Mock Server API
5
-
6
- #MockServer enables easy mocking of any system you integrate with via HTTP or HTTPS with clients written in Java, JavaScript and Ruby and a simple REST API (as shown below). MockServer Proxy is a proxy that introspects all proxied traffic including encrypted SSL traffic and supports Port Forwarding, Web Proxying (i.e. HTTP proxy), HTTPS Tunneling Proxying (using HTTP CONNECT) and SOCKS Proxying (i.e. dynamic port forwarding). Both MockServer and the MockServer Proxy record all received requests so that it is possible to verify exactly what requests have been sent by the system under test.
7
-
8
- OpenAPI spec version: 5.3.0
9
-
10
- Generated by: https://openapi-generator.tech
11
- OpenAPI Generator version: 3.3.1
12
-
13
- =end
14
-
15
- $:.push File.expand_path("../lib", __FILE__)
16
- require "mockserver-client/version"
17
-
18
- Gem::Specification.new do |s|
19
- s.name = "mockserver-client"
20
- s.version = MockServer::VERSION
21
- s.platform = Gem::Platform::RUBY
22
- s.authors = ["James D Bloom"]
23
- s.email = ["jamesdbloom@gmail.com"]
24
- s.homepage = "http://www.mock-server.com"
25
- s.summary = "Mock Server API Ruby Gem"
26
- s.description = "MockServer enables easy mocking of any system you integrate with via HTTP or HTTPS with clients written in Java, JavaScript and Ruby and a simple REST API (as shown below). MockServer Proxy is a proxy that introspects all proxied traffic including encrypted SSL traffic and supports Port Forwarding, Web Proxying (i.e. HTTP proxy), HTTPS Tunneling Proxying (using HTTP CONNECT) and SOCKS Proxying (i.e. dynamic port forwarding). Both MockServer and the MockServer Proxy record all received requests so that it is possible to verify exactly what requests have been sent by the system under test."
27
- s.license = 'Apache-2.0'
28
- s.required_ruby_version = ">= 2.0"
29
-
30
- s.add_runtime_dependency 'typhoeus', '~> 1.0', '>= 1.0.1'
31
- s.add_runtime_dependency 'json', '~> 2.1', '>= 2.1.0'
32
-
33
- s.add_development_dependency 'rspec', '~> 3.6', '>= 3.6.0'
34
- s.add_development_dependency 'vcr', '~> 3.0', '>= 3.0.1'
35
- s.add_development_dependency 'webmock', '~> 1.24', '>= 1.24.3'
36
- s.add_development_dependency 'autotest', '~> 4.4', '>= 4.4.6'
37
- s.add_development_dependency 'autotest-rails-pure', '~> 4.1', '>= 4.1.2'
38
- s.add_development_dependency 'autotest-growl', '~> 0.2', '>= 0.2.16'
39
- s.add_development_dependency 'autotest-fsevent', '~> 0.2', '>= 0.2.12'
40
-
41
- s.files = `find *`.split("\n").uniq.sort.select { |f| !f.empty? }
42
- s.test_files = `find spec/*`.split("\n")
43
- s.executables = []
44
- s.require_paths = ["lib"]
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path('lib', __dir__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+ require 'mockserver/version'
6
+
7
+ Gem::Specification.new do |spec|
8
+ spec.name = 'mockserver-client'
9
+ spec.version = MockServer::VERSION
10
+ spec.authors = ['James Bloom']
11
+ spec.email = ['jamesdbloom@gmail.com']
12
+ spec.summary = 'Official Ruby client for MockServer'
13
+ spec.description = 'Official Ruby client for MockServer — create expectations, verify requests, ' \
14
+ 'and register dynamic callbacks via WebSocket. Includes a fluent builder DSL.'
15
+ spec.homepage = 'https://www.mock-server.com'
16
+ spec.license = 'Apache-2.0'
17
+
18
+ spec.required_ruby_version = '>= 3.0'
19
+
20
+ spec.metadata = {
21
+ 'source_code_uri' => 'https://github.com/mock-server/mockserver-monorepo',
22
+ 'changelog_uri' => 'https://www.mock-server.com/mock_server/changelog.html',
23
+ 'bug_tracker_uri' => 'https://github.com/mock-server/mockserver-monorepo/issues',
24
+ 'documentation_uri' => 'https://www.mock-server.com/mock_server/getting_started.html',
25
+ }
26
+
27
+ spec.files = Dir['lib/**/*.rb'] + %w[README.md Gemfile mockserver-client.gemspec]
28
+ spec.require_paths = ['lib']
29
+
30
+ spec.add_dependency 'logger', '>= 1.0'
31
+ spec.add_dependency 'websocket-client-simple', '~> 0.8'
32
+
33
+ spec.add_development_dependency 'rspec', '~> 3.12'
34
+ spec.add_development_dependency 'rspec_junit_formatter', '~> 0.6'
35
+ spec.add_development_dependency 'webmock', '~> 3.19'
45
36
  end