rom-http 0.6.0 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +3 -8
- data/CHANGELOG.md +15 -0
- data/Gemfile +2 -2
- data/README.md +18 -21
- data/lib/rom/http/dataset.rb +55 -23
- data/lib/rom/http/dataset/class_interface.rb +33 -0
- data/lib/rom/http/error.rb +0 -1
- data/lib/rom/http/gateway.rb +2 -0
- data/lib/rom/http/relation.rb +7 -19
- data/lib/rom/http/transformer.rb +1 -0
- data/lib/rom/http/version.rb +1 -1
- data/rom-http.gemspec +3 -1
- data/spec/integration/abstract/commands/create_spec.rb +2 -2
- data/spec/integration/abstract/commands/delete_spec.rb +1 -1
- data/spec/integration/abstract/commands/update_spec.rb +2 -2
- data/spec/integration/abstract/relation_spec.rb +7 -3
- data/spec/spec_helper.rb +3 -0
- data/spec/unit/rom/http/dataset_spec.rb +236 -13
- data/spec/unit/rom/http/relation_spec.rb +0 -12
- metadata +34 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5fd07f83166373c0e0f2bfe8c83f8f68578818dc
|
4
|
+
data.tar.gz: e643299868045661adadfd6ea6881cf59feda4fe
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2a2de5a39a3cf600c2464250809a2e292c7abef3a8e1b2e79232ac035b14992a160a56035c5c7a65414ab60b643093ac375e234ffab952c6a262f3517cd146fd
|
7
|
+
data.tar.gz: 44315f4744aa86c60fb92c801bd1521e2834dbada29fd53a6cfc4a6f35f27fb09cb335719d9bb4b52be5f1bda9c549539f4e98c96fca2344640c2e7b0a096062
|
data/.travis.yml
CHANGED
@@ -5,17 +5,12 @@ cache: bundler
|
|
5
5
|
bundler_args: --without sql benchmarks console tools
|
6
6
|
script: "bundle exec rake ci"
|
7
7
|
rvm:
|
8
|
-
- 2.
|
9
|
-
- 2.
|
10
|
-
-
|
11
|
-
- rbx-3
|
12
|
-
- jruby-9.1.6.0
|
8
|
+
- 2.3.4
|
9
|
+
- 2.4.1
|
10
|
+
- jruby-9.1.13.0
|
13
11
|
env:
|
14
12
|
global:
|
15
13
|
- JRUBY_OPTS='--dev -J-Xmx1024M'
|
16
|
-
matrix:
|
17
|
-
allow_failures:
|
18
|
-
- rvm: rbx-3
|
19
14
|
notifications:
|
20
15
|
webhooks:
|
21
16
|
urls:
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,18 @@
|
|
1
|
+
# v0.7.0 2018-01-11
|
2
|
+
|
3
|
+
### Added
|
4
|
+
- Add Dataset#add_params(AMHOL)
|
5
|
+
|
6
|
+
### Changed
|
7
|
+
- Updated error messages (AMHOL)
|
8
|
+
- updated to depend on ROM 4.0 (maximderbin)
|
9
|
+
- Removed ruby 2.1 support (maximderbin)
|
10
|
+
- Removed rbx-3 support (maximderbin)
|
11
|
+
|
12
|
+
|
13
|
+
|
14
|
+
[Compare v0.5.0...v0.6.0](https://github.com/rom-rb/rom-http/compare/v0.6.0...v0.7.0)
|
15
|
+
|
1
16
|
# v0.6.0 2017-02-06
|
2
17
|
### Changed
|
3
18
|
- Make schemas mandatory and use schema API from ROM core (AMHOL)
|
data/Gemfile
CHANGED
@@ -2,10 +2,10 @@ source 'https://rubygems.org'
|
|
2
2
|
|
3
3
|
gemspec
|
4
4
|
|
5
|
-
gem 'rom-repository',
|
5
|
+
gem 'rom-repository', '~> 2.0'
|
6
6
|
|
7
7
|
group :test do
|
8
|
-
gem 'rom',
|
8
|
+
gem 'rom', '~> 4.0'
|
9
9
|
gem 'faraday'
|
10
10
|
gem 'inflecto'
|
11
11
|
end
|
data/README.md
CHANGED
@@ -52,10 +52,7 @@ require 'net/http'
|
|
52
52
|
|
53
53
|
class RequestHandler
|
54
54
|
def call(dataset)
|
55
|
-
uri =
|
56
|
-
uri.path = dataset.absolute_path
|
57
|
-
uri.query = URI.encode_www_form(dataset.params)
|
58
|
-
|
55
|
+
uri = dataset.uri
|
59
56
|
http = Net::HTTP.new(uri.host, uri.port)
|
60
57
|
request_klass = Net::HTTP.const_get(Inflecto.classify(dataset.request_method))
|
61
58
|
|
@@ -119,27 +116,27 @@ require 'net/http'
|
|
119
116
|
module ROM
|
120
117
|
module MyAdapter
|
121
118
|
class Dataset < ROM::HTTP::Dataset
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
uri.query = URI.encode_www_form(dataset.params)
|
119
|
+
configure do |config|
|
120
|
+
config.default_request_handler = ->(dataset) do
|
121
|
+
uri = dataset.uri
|
126
122
|
|
127
|
-
|
128
|
-
|
123
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
124
|
+
request_klass = Net::HTTP.const_get(Inflecto.classify(dataset.request_method))
|
129
125
|
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
126
|
+
request = request_klass.new(uri.request_uri)
|
127
|
+
dataset.headers.each_with_object(request) do |(header, value), request|
|
128
|
+
request[header.to_s] = value
|
129
|
+
end
|
134
130
|
|
135
|
-
|
136
|
-
|
131
|
+
response = http.request(request)
|
132
|
+
end
|
137
133
|
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
134
|
+
config.default_response_handler = ->(response, dataset) do
|
135
|
+
if %i(post put patch).include?(dataset.request_method)
|
136
|
+
JSON.parse(response.body, symbolize_names: true)
|
137
|
+
else
|
138
|
+
Array([JSON.parse(response.body, symbolize_names: true)]).flatten
|
139
|
+
end
|
143
140
|
end
|
144
141
|
end
|
145
142
|
end
|
data/lib/rom/http/dataset.rb
CHANGED
@@ -1,4 +1,8 @@
|
|
1
|
+
require 'uri'
|
2
|
+
require 'dry-configurable'
|
3
|
+
require 'dry/core/deprecations'
|
1
4
|
require 'rom/initializer'
|
5
|
+
require 'rom/http/dataset/class_interface'
|
2
6
|
|
3
7
|
module ROM
|
4
8
|
module HTTP
|
@@ -9,32 +13,25 @@ module ROM
|
|
9
13
|
# @api public
|
10
14
|
class Dataset
|
11
15
|
PATH_SEPARATOR = '/'.freeze
|
12
|
-
STRIP_PATH = ->(path) { path.sub(%r{\A/}, '') }.freeze
|
13
16
|
|
14
|
-
include Enumerable
|
15
|
-
include Dry::Equalizer(:config, :options)
|
16
17
|
extend ::ROM::Initializer
|
18
|
+
extend ::Dry::Configurable
|
19
|
+
extend ::ROM::HTTP::Dataset::ClassInterface
|
20
|
+
include ::Enumerable
|
21
|
+
include ::Dry::Equalizer(:config, :options)
|
22
|
+
|
23
|
+
setting :default_request_handler
|
24
|
+
setting :default_response_handler
|
25
|
+
setting :param_encoder, ->(params) { URI.encode_www_form(params) }
|
17
26
|
|
18
27
|
param :config
|
19
28
|
|
20
29
|
option :request_method, type: Types::Symbol, default: proc { :get }, reader: true
|
21
30
|
option :base_path, type: Types::String, default: proc { name }
|
22
|
-
option :path, type: Types::String, default: proc { '' }
|
31
|
+
option :path, type: Types::String, default: proc { '' }, reader: false
|
23
32
|
option :params, type: Types::Hash, default: proc { {} }, reader: true
|
24
33
|
option :headers, type: Types::Hash, default: proc { {} }
|
25
34
|
|
26
|
-
class << self
|
27
|
-
def default_request_handler(handler = Undefined)
|
28
|
-
return @default_request_handler if Undefined === handler
|
29
|
-
@default_request_handler = handler
|
30
|
-
end
|
31
|
-
|
32
|
-
def default_response_handler(handler = Undefined)
|
33
|
-
return @default_response_handler if Undefined === handler
|
34
|
-
@default_response_handler = handler
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
35
|
# Return the gateway's URI
|
39
36
|
#
|
40
37
|
# @return [String]
|
@@ -43,7 +40,13 @@ module ROM
|
|
43
40
|
#
|
44
41
|
# @api public
|
45
42
|
def uri
|
46
|
-
config.fetch(:uri) { fail Error, '
|
43
|
+
uri = config.fetch(:uri) { fail Error, '+uri+ configuration missing' }
|
44
|
+
uri = URI(join_path(uri, path))
|
45
|
+
if request_method == :get && params.any?
|
46
|
+
uri.query = self.class.config.param_encoder.call(params)
|
47
|
+
end
|
48
|
+
|
49
|
+
uri
|
47
50
|
end
|
48
51
|
|
49
52
|
# Return request headers
|
@@ -83,7 +86,7 @@ module ROM
|
|
83
86
|
#
|
84
87
|
# @api public
|
85
88
|
def base_path
|
86
|
-
|
89
|
+
strip_path(super)
|
87
90
|
end
|
88
91
|
|
89
92
|
# Return the dataset path
|
@@ -96,7 +99,7 @@ module ROM
|
|
96
99
|
#
|
97
100
|
# @api public
|
98
101
|
def path
|
99
|
-
|
102
|
+
join_path(base_path, strip_path(options[:path].to_s))
|
100
103
|
end
|
101
104
|
|
102
105
|
# Return the dataset path
|
@@ -234,6 +237,25 @@ module ROM
|
|
234
237
|
with_options(params: params)
|
235
238
|
end
|
236
239
|
|
240
|
+
# Return a new dataset with merged request parameters
|
241
|
+
#
|
242
|
+
# @param [Hash] params the new request parameters to add
|
243
|
+
#
|
244
|
+
# @example
|
245
|
+
# users = Dataset.new(config, params: { uid: 33 })
|
246
|
+
# users.add_params(login: 'jdoe').params
|
247
|
+
# # => { uid: 33, :login => 'jdoe' }
|
248
|
+
#
|
249
|
+
# @return [Dataset]
|
250
|
+
#
|
251
|
+
# @api public
|
252
|
+
def add_params(new_params)
|
253
|
+
# TODO: Should we merge arrays?
|
254
|
+
with_options(
|
255
|
+
params: ::ROM::HTTP::Transformer[:deep_merge][params, new_params]
|
256
|
+
)
|
257
|
+
end
|
258
|
+
|
237
259
|
# Iterate over each response value
|
238
260
|
#
|
239
261
|
# @yield [Hash] a dataset tuple
|
@@ -299,14 +321,20 @@ module ROM
|
|
299
321
|
private
|
300
322
|
|
301
323
|
def response_handler
|
302
|
-
response_handler = config.fetch(
|
303
|
-
|
324
|
+
response_handler = config.fetch(
|
325
|
+
:response_handler,
|
326
|
+
self.class.config.default_response_handler
|
327
|
+
)
|
328
|
+
fail Error, '+default_response_handler+ configuration missing' if response_handler.nil?
|
304
329
|
response_handler
|
305
330
|
end
|
306
331
|
|
307
332
|
def request_handler
|
308
|
-
request_handler = config.fetch(
|
309
|
-
|
333
|
+
request_handler = config.fetch(
|
334
|
+
:request_handler,
|
335
|
+
self.class.config.default_request_handler
|
336
|
+
)
|
337
|
+
fail Error, '+default_response_handler+ configuration missing' if request_handler.nil?
|
310
338
|
request_handler
|
311
339
|
end
|
312
340
|
|
@@ -317,6 +345,10 @@ module ROM
|
|
317
345
|
def join_path(*paths)
|
318
346
|
paths.reject(&:empty?).join(PATH_SEPARATOR)
|
319
347
|
end
|
348
|
+
|
349
|
+
def strip_path(path)
|
350
|
+
path.sub(%r{\A/}, '')
|
351
|
+
end
|
320
352
|
end
|
321
353
|
end
|
322
354
|
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module ROM
|
2
|
+
module HTTP
|
3
|
+
# HTTP Dataset
|
4
|
+
#
|
5
|
+
# Represents a specific HTTP collection resource
|
6
|
+
#
|
7
|
+
# @api public
|
8
|
+
class Dataset
|
9
|
+
# @api private
|
10
|
+
module ClassInterface
|
11
|
+
# TODO: Remove in favour of configuration
|
12
|
+
def default_request_handler(handler = Undefined)
|
13
|
+
::Dry::Core::Deprecations.announce(
|
14
|
+
__method__,
|
15
|
+
'use configuration instead'
|
16
|
+
)
|
17
|
+
return config.default_request_handler if Undefined === handler
|
18
|
+
config.default_request_handler = handler
|
19
|
+
end
|
20
|
+
|
21
|
+
# TODO: Remove in favour of configuration
|
22
|
+
def default_response_handler(handler = Undefined)
|
23
|
+
::Dry::Core::Deprecations.announce(
|
24
|
+
__method__,
|
25
|
+
'use configuration instead'
|
26
|
+
)
|
27
|
+
return config.default_response_handler if Undefined === handler
|
28
|
+
config.default_response_handler = handler
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
data/lib/rom/http/error.rb
CHANGED
data/lib/rom/http/gateway.rb
CHANGED
data/lib/rom/http/relation.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
require 'dry/core/cache'
|
2
2
|
require 'rom/initializer'
|
3
|
-
require 'rom/plugins/relation/key_inference'
|
4
3
|
require 'rom/http/transformer'
|
5
4
|
|
6
5
|
module ROM
|
@@ -14,22 +13,11 @@ module ROM
|
|
14
13
|
|
15
14
|
adapter :http
|
16
15
|
|
17
|
-
use :key_inference
|
18
|
-
|
19
16
|
option :transformer, reader: true, default: proc { ::ROM::HTTP::Transformer }
|
20
17
|
|
21
|
-
forward :
|
22
|
-
:
|
23
|
-
|
24
|
-
|
25
|
-
def initialize(*)
|
26
|
-
super
|
27
|
-
|
28
|
-
raise(
|
29
|
-
SchemaNotDefinedError,
|
30
|
-
"You must define a schema for #{self.class.register_as} relation"
|
31
|
-
) unless schema?
|
32
|
-
end
|
18
|
+
forward :with_headers, :add_header, :with_options,
|
19
|
+
:with_base_path, :with_path, :append_path,
|
20
|
+
:with_request_method, :with_params, :add_params
|
33
21
|
|
34
22
|
def primary_key
|
35
23
|
attribute = schema.find(&:primary_key?)
|
@@ -83,8 +71,8 @@ module ROM
|
|
83
71
|
|
84
72
|
private
|
85
73
|
|
86
|
-
def with_transformation
|
87
|
-
tuples =
|
74
|
+
def with_transformation
|
75
|
+
tuples = yield
|
88
76
|
|
89
77
|
transformed = with_schema_proc do |proc|
|
90
78
|
transformer_proc[Array([tuples]).flatten(1).map(&proc.method(:call))]
|
@@ -93,12 +81,12 @@ module ROM
|
|
93
81
|
tuples.kind_of?(Array) ? transformed : transformed.first
|
94
82
|
end
|
95
83
|
|
96
|
-
def with_schema_proc
|
84
|
+
def with_schema_proc
|
97
85
|
schema_proc = fetch_or_store(schema) do
|
98
86
|
Types::Coercible::Hash.schema(schema.to_h)
|
99
87
|
end
|
100
88
|
|
101
|
-
|
89
|
+
yield(schema_proc)
|
102
90
|
end
|
103
91
|
|
104
92
|
def transformer_proc
|
data/lib/rom/http/transformer.rb
CHANGED
@@ -11,6 +11,7 @@ module ROM
|
|
11
11
|
import :identity, from: ::Transproc::Coercions
|
12
12
|
import :map_array, from: ::Transproc::ArrayTransformations
|
13
13
|
import :rename_keys, from: ::Transproc::HashTransformations
|
14
|
+
import :deep_merge, from: ::Transproc::HashTransformations
|
14
15
|
end
|
15
16
|
end
|
16
17
|
end
|
data/lib/rom/http/version.rb
CHANGED
data/rom-http.gemspec
CHANGED
@@ -19,9 +19,11 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.require_paths = ['lib']
|
20
20
|
|
21
21
|
spec.add_runtime_dependency 'concurrent-ruby'
|
22
|
-
spec.add_runtime_dependency '
|
22
|
+
spec.add_runtime_dependency 'addressable'
|
23
|
+
spec.add_runtime_dependency 'rom', '~> 4.0'
|
23
24
|
spec.add_runtime_dependency 'dry-core', '~> 0.2', '>= 0.2.3'
|
24
25
|
spec.add_runtime_dependency 'dry-equalizer', '~> 0.2'
|
26
|
+
spec.add_runtime_dependency 'dry-configurable', '~> 0.6'
|
25
27
|
|
26
28
|
spec.add_development_dependency 'bundler'
|
27
29
|
spec.add_development_dependency 'rspec', '~> 3.1'
|
@@ -47,7 +47,7 @@ RSpec.describe ROM::HTTP::Commands::Create do
|
|
47
47
|
allow(response_handler).to receive(:call).and_return(tuple)
|
48
48
|
end
|
49
49
|
|
50
|
-
subject! { container.
|
50
|
+
subject! { container.commands[:users].create.call(attributes) }
|
51
51
|
|
52
52
|
it do
|
53
53
|
expect(request_handler).to have_received(:call).with(dataset)
|
@@ -106,7 +106,7 @@ RSpec.describe ROM::HTTP::Commands::Create do
|
|
106
106
|
allow(response_handler).to receive(:call).and_return(tuple_1, tuple_2)
|
107
107
|
end
|
108
108
|
|
109
|
-
subject! { container.
|
109
|
+
subject! { container.commands[:users].create.call(attributes) }
|
110
110
|
|
111
111
|
it do
|
112
112
|
expect(request_handler).to have_received(:call).with(dataset_1)
|
@@ -42,7 +42,7 @@ RSpec.describe ROM::HTTP::Commands::Delete do
|
|
42
42
|
allow(response_handler).to receive(:call).and_return(tuples)
|
43
43
|
end
|
44
44
|
|
45
|
-
subject! { container.
|
45
|
+
subject! { container.commands[:users].delete.call }
|
46
46
|
|
47
47
|
it do
|
48
48
|
expect(request_handler).to have_received(:call).with(dataset)
|
@@ -47,7 +47,7 @@ RSpec.describe ROM::HTTP::Commands::Update do
|
|
47
47
|
allow(response_handler).to receive(:call).and_return(tuple)
|
48
48
|
end
|
49
49
|
|
50
|
-
subject! { container.
|
50
|
+
subject! { container.commands[:users].update.call(attributes) }
|
51
51
|
|
52
52
|
it do
|
53
53
|
expect(request_handler).to have_received(:call).with(dataset)
|
@@ -106,7 +106,7 @@ RSpec.describe ROM::HTTP::Commands::Update do
|
|
106
106
|
allow(response_handler).to receive(:call).and_return(tuple_1, tuple_2)
|
107
107
|
end
|
108
108
|
|
109
|
-
subject! { container.
|
109
|
+
subject! { container.commands[:users].update.call(attributes) }
|
110
110
|
|
111
111
|
it do
|
112
112
|
expect(request_handler).to have_received(:call).with(dataset_1)
|
@@ -2,7 +2,7 @@ require 'json'
|
|
2
2
|
require 'rom-repository'
|
3
3
|
|
4
4
|
RSpec.describe ROM::HTTP::Relation do
|
5
|
-
subject(:users) { container.
|
5
|
+
subject(:users) { container.relations[:users].by_id(id).filter(params) }
|
6
6
|
|
7
7
|
include_context 'setup'
|
8
8
|
|
@@ -58,11 +58,15 @@ RSpec.describe ROM::HTTP::Relation do
|
|
58
58
|
|
59
59
|
context 'using a repo' do
|
60
60
|
let(:repo) do
|
61
|
-
Class.new(ROM::Repository)
|
61
|
+
Class.new(ROM::Repository) do
|
62
|
+
def self.to_s
|
63
|
+
'UserRepo'
|
64
|
+
end
|
65
|
+
end.new(container)
|
62
66
|
end
|
63
67
|
|
64
68
|
it 'returns structs' do
|
65
|
-
user = repo.users.by_id(1337).filter(params).
|
69
|
+
user = repo.users.by_id(1337).filter(params).first
|
66
70
|
|
67
71
|
expect(user.id).to be(1337)
|
68
72
|
expect(user.name).to eql('John')
|
data/spec/spec_helper.rb
CHANGED
@@ -13,7 +13,22 @@ RSpec.describe ROM::HTTP::Dataset do
|
|
13
13
|
let(:request_handler) { double(Proc) }
|
14
14
|
let(:response_handler) { double(Proc) }
|
15
15
|
|
16
|
-
it { expect(
|
16
|
+
it { expect(klass).to be_kind_of(::Dry::Configurable) }
|
17
|
+
it { expect(dataset).to be_kind_of(::Enumerable) }
|
18
|
+
|
19
|
+
describe 'settings' do
|
20
|
+
describe 'default_request_handler' do
|
21
|
+
it 'defaults to nil' do
|
22
|
+
expect(klass.config.default_request_handler).to be nil
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe 'default_response_handler' do
|
27
|
+
it 'defaults to nil' do
|
28
|
+
expect(klass.config.default_response_handler).to be nil
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
17
32
|
|
18
33
|
describe 'defaults' do
|
19
34
|
describe '#config' do
|
@@ -57,11 +72,21 @@ RSpec.describe ROM::HTTP::Dataset do
|
|
57
72
|
module Test
|
58
73
|
class Dataset < ROM::HTTP::Dataset; end
|
59
74
|
end
|
75
|
+
|
76
|
+
allow(Dry::Core::Deprecations).to receive(:announce)
|
60
77
|
end
|
61
78
|
|
79
|
+
after { Test::Dataset.reset_config }
|
80
|
+
|
62
81
|
context 'when no default_request_handler set' do
|
82
|
+
subject! { Test::Dataset.default_request_handler }
|
83
|
+
|
63
84
|
it 'returns nil' do
|
64
|
-
expect(
|
85
|
+
expect(Dry::Core::Deprecations).to have_received(:announce).with(
|
86
|
+
:default_request_handler,
|
87
|
+
'use configuration instead'
|
88
|
+
)
|
89
|
+
is_expected.to be nil
|
65
90
|
end
|
66
91
|
end
|
67
92
|
|
@@ -70,8 +95,14 @@ RSpec.describe ROM::HTTP::Dataset do
|
|
70
95
|
Test::Dataset.default_request_handler(request_handler)
|
71
96
|
end
|
72
97
|
|
98
|
+
subject! { Test::Dataset.default_request_handler }
|
99
|
+
|
73
100
|
it 'returns the default request handler' do
|
74
|
-
expect(
|
101
|
+
expect(Dry::Core::Deprecations).to have_received(:announce).with(
|
102
|
+
:default_request_handler,
|
103
|
+
'use configuration instead'
|
104
|
+
).twice
|
105
|
+
is_expected.to eq request_handler
|
75
106
|
end
|
76
107
|
end
|
77
108
|
end
|
@@ -81,11 +112,21 @@ RSpec.describe ROM::HTTP::Dataset do
|
|
81
112
|
module Test
|
82
113
|
class Dataset < ROM::HTTP::Dataset; end
|
83
114
|
end
|
115
|
+
|
116
|
+
allow(Dry::Core::Deprecations).to receive(:announce)
|
84
117
|
end
|
85
118
|
|
119
|
+
after { Test::Dataset.reset_config }
|
120
|
+
|
86
121
|
context 'when no default_response_handler set' do
|
122
|
+
subject! { Test::Dataset.default_response_handler }
|
123
|
+
|
87
124
|
it 'returns nil' do
|
88
|
-
expect(
|
125
|
+
expect(Dry::Core::Deprecations).to have_received(:announce).with(
|
126
|
+
:default_response_handler,
|
127
|
+
'use configuration instead'
|
128
|
+
)
|
129
|
+
is_expected.to be nil
|
89
130
|
end
|
90
131
|
end
|
91
132
|
|
@@ -94,8 +135,14 @@ RSpec.describe ROM::HTTP::Dataset do
|
|
94
135
|
Test::Dataset.default_response_handler(response_handler)
|
95
136
|
end
|
96
137
|
|
138
|
+
subject! { Test::Dataset.default_response_handler }
|
139
|
+
|
97
140
|
it 'returns the default response handler' do
|
98
|
-
expect(
|
141
|
+
expect(Dry::Core::Deprecations).to have_received(:announce).with(
|
142
|
+
:default_response_handler,
|
143
|
+
'use configuration instead'
|
144
|
+
).twice
|
145
|
+
is_expected.to eq response_handler
|
99
146
|
end
|
100
147
|
end
|
101
148
|
end
|
@@ -110,7 +157,107 @@ RSpec.describe ROM::HTTP::Dataset do
|
|
110
157
|
end
|
111
158
|
|
112
159
|
context 'when uri configured' do
|
113
|
-
|
160
|
+
subject! { dataset.uri }
|
161
|
+
|
162
|
+
context 'when request method is GET' do
|
163
|
+
context 'with params' do
|
164
|
+
let(:options) do
|
165
|
+
{
|
166
|
+
params: {
|
167
|
+
username: 'John',
|
168
|
+
role: 'admin'
|
169
|
+
}
|
170
|
+
}
|
171
|
+
end
|
172
|
+
let(:expected_uri) { URI("#{uri}?username=John&role=admin") }
|
173
|
+
|
174
|
+
it { is_expected.to eq(expected_uri) }
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
context 'when request method is not GET' do
|
179
|
+
context 'with params' do
|
180
|
+
let(:options) do
|
181
|
+
{
|
182
|
+
request_method: :post,
|
183
|
+
params: {
|
184
|
+
username: 'John',
|
185
|
+
role: 'admin'
|
186
|
+
}
|
187
|
+
}
|
188
|
+
end
|
189
|
+
let(:expected_uri) { URI(uri) }
|
190
|
+
|
191
|
+
it { is_expected.to eq(expected_uri) }
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
context 'without dataset name' do
|
196
|
+
context 'with no path' do
|
197
|
+
let(:expected_uri) { URI(uri) }
|
198
|
+
|
199
|
+
it { is_expected.to eq(expected_uri) }
|
200
|
+
end
|
201
|
+
|
202
|
+
context 'with path' do
|
203
|
+
context 'without custom base_path' do
|
204
|
+
let(:options) { { path: '/users' } }
|
205
|
+
let(:expected_uri) { URI("#{uri}/users") }
|
206
|
+
|
207
|
+
it { is_expected.to eq(expected_uri) }
|
208
|
+
end
|
209
|
+
|
210
|
+
context 'with custom base_path' do
|
211
|
+
let(:options) { { base_path: '/blog', path: '/users' } }
|
212
|
+
let(:expected_uri) { URI("#{uri}/blog/users") }
|
213
|
+
|
214
|
+
it { is_expected.to eq(expected_uri) }
|
215
|
+
end
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
219
|
+
context 'with dataset name' do
|
220
|
+
let(:config) { super().merge(name: :blog) }
|
221
|
+
|
222
|
+
context 'with no path' do
|
223
|
+
let(:expected_uri) { URI("#{uri}/blog") }
|
224
|
+
|
225
|
+
it { is_expected.to eq(expected_uri) }
|
226
|
+
end
|
227
|
+
|
228
|
+
context 'with path' do
|
229
|
+
context 'without custom base_path' do
|
230
|
+
let(:options) { { path: '/users' } }
|
231
|
+
let(:expected_uri) { URI("#{uri}/blog/users") }
|
232
|
+
|
233
|
+
it { is_expected.to eq(expected_uri) }
|
234
|
+
end
|
235
|
+
|
236
|
+
context 'with custom base_path' do
|
237
|
+
let(:options) { { base_path: '/bloggers', path: '/users' } }
|
238
|
+
let(:expected_uri) { URI("#{uri}/bloggers/users") }
|
239
|
+
|
240
|
+
it { is_expected.to eq(expected_uri) }
|
241
|
+
end
|
242
|
+
end
|
243
|
+
end
|
244
|
+
|
245
|
+
context 'with custom base_path' do
|
246
|
+
let(:config) { super().merge(name: :blog) }
|
247
|
+
|
248
|
+
context 'with no path' do
|
249
|
+
let(:expected_uri) { URI("#{uri}/blog") }
|
250
|
+
|
251
|
+
it { is_expected.to eq(expected_uri) }
|
252
|
+
end
|
253
|
+
|
254
|
+
context 'with path' do
|
255
|
+
let(:options) { { path: '/users' } }
|
256
|
+
let(:expected_uri) { URI("#{uri}/blog/users") }
|
257
|
+
|
258
|
+
it { is_expected.to eq(expected_uri) }
|
259
|
+
end
|
260
|
+
end
|
114
261
|
end
|
115
262
|
end
|
116
263
|
|
@@ -224,24 +371,68 @@ RSpec.describe ROM::HTTP::Dataset do
|
|
224
371
|
subject { dataset.path }
|
225
372
|
|
226
373
|
context 'with no path option' do
|
227
|
-
|
374
|
+
context 'without dataset name' do
|
375
|
+
it { is_expected.to eq('') }
|
376
|
+
end
|
377
|
+
|
378
|
+
context 'with dataset name' do
|
379
|
+
let(:config) { super().merge(name: :users) }
|
380
|
+
it { is_expected.to eq('users') }
|
381
|
+
end
|
382
|
+
|
383
|
+
context 'with base path' do
|
384
|
+
let(:options) { { base_path: '/users' } }
|
385
|
+
it { is_expected.to eq('users') }
|
386
|
+
end
|
228
387
|
end
|
229
388
|
|
230
389
|
context 'with path option' do
|
231
390
|
context 'when path is absolute' do
|
232
391
|
let(:path) { '/users' }
|
233
|
-
let(:options) { { path: path } }
|
234
392
|
|
235
|
-
|
236
|
-
|
393
|
+
context 'without dataset name' do
|
394
|
+
let(:options) { { path: path } }
|
395
|
+
|
396
|
+
it 'removes the leading /' do
|
397
|
+
is_expected.to eq('users')
|
398
|
+
end
|
399
|
+
end
|
400
|
+
|
401
|
+
context 'with dataset name' do
|
402
|
+
let(:config) { super().merge(name: :blog) }
|
403
|
+
let(:options) { { path: path } }
|
404
|
+
|
405
|
+
it { is_expected.to eq('blog/users') }
|
406
|
+
end
|
407
|
+
|
408
|
+
context 'with base path' do
|
409
|
+
let(:options) { { base_path: '/blog', path: path } }
|
410
|
+
|
411
|
+
it { is_expected.to eq('blog/users') }
|
237
412
|
end
|
238
413
|
end
|
239
414
|
|
240
415
|
context 'when path is not absolute' do
|
241
416
|
let(:path) { 'users' }
|
242
|
-
let(:options) { { path: path } }
|
243
417
|
|
244
|
-
|
418
|
+
context 'without dataset name' do
|
419
|
+
let(:options) { { path: path } }
|
420
|
+
|
421
|
+
it { is_expected.to eq(path) }
|
422
|
+
end
|
423
|
+
|
424
|
+
context 'with dataset name' do
|
425
|
+
let(:config) { super().merge(name: :blog) }
|
426
|
+
let(:options) { { path: path } }
|
427
|
+
|
428
|
+
it { is_expected.to eq('blog/users') }
|
429
|
+
end
|
430
|
+
|
431
|
+
context 'with base path' do
|
432
|
+
let(:options) { { base_path: '/blog', path: path } }
|
433
|
+
|
434
|
+
it { is_expected.to eq('blog/users') }
|
435
|
+
end
|
245
436
|
end
|
246
437
|
end
|
247
438
|
end
|
@@ -449,6 +640,36 @@ RSpec.describe ROM::HTTP::Dataset do
|
|
449
640
|
it { is_expected.to eq(new_dataset) }
|
450
641
|
end
|
451
642
|
|
643
|
+
describe '#add_params' do
|
644
|
+
let(:options) do
|
645
|
+
{
|
646
|
+
params: {
|
647
|
+
user: {
|
648
|
+
uid: 3
|
649
|
+
}
|
650
|
+
}
|
651
|
+
}
|
652
|
+
end
|
653
|
+
let(:params) { { user: { name: 'Jack' } } }
|
654
|
+
let(:new_dataset) { double(ROM::HTTP::Dataset) }
|
655
|
+
|
656
|
+
before do
|
657
|
+
allow(dataset).to receive(:with_options).and_return(new_dataset)
|
658
|
+
end
|
659
|
+
|
660
|
+
subject! { dataset.add_params(params) }
|
661
|
+
|
662
|
+
it do
|
663
|
+
expect(dataset).to have_received(:with_options).with(params: {
|
664
|
+
user: {
|
665
|
+
uid: 3,
|
666
|
+
name: 'Jack'
|
667
|
+
}
|
668
|
+
})
|
669
|
+
end
|
670
|
+
it { is_expected.to eq(new_dataset) }
|
671
|
+
end
|
672
|
+
|
452
673
|
describe '#each' do
|
453
674
|
let(:response) { double(Array) }
|
454
675
|
let(:block) { proc {} }
|
@@ -560,7 +781,7 @@ RSpec.describe ROM::HTTP::Dataset do
|
|
560
781
|
end
|
561
782
|
|
562
783
|
context 'when request_handler and response_handler configured' do
|
563
|
-
let(:
|
784
|
+
let(:dataset) { Test::Dataset.new(config, options) }
|
564
785
|
let(:config) { {} }
|
565
786
|
|
566
787
|
before do
|
@@ -575,6 +796,8 @@ RSpec.describe ROM::HTTP::Dataset do
|
|
575
796
|
allow(response_handler).to receive(:call).and_return(result)
|
576
797
|
end
|
577
798
|
|
799
|
+
after { Test::Dataset.reset_config }
|
800
|
+
|
578
801
|
subject! { dataset.response }
|
579
802
|
|
580
803
|
it { expect(request_handler).to have_received(:call).with(dataset) }
|
@@ -26,18 +26,6 @@ RSpec.describe ROM::HTTP::Relation do
|
|
26
26
|
allow(dataset).to receive(:response).and_return(data)
|
27
27
|
end
|
28
28
|
|
29
|
-
describe '#initialize' do
|
30
|
-
context 'when initialized without a schema defined' do
|
31
|
-
let(:relation_klass) do
|
32
|
-
Class.new(ROM::HTTP::Relation)
|
33
|
-
end
|
34
|
-
|
35
|
-
it do
|
36
|
-
expect { relation }.to raise_error(::ROM::HTTP::SchemaNotDefinedError)
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
29
|
describe '#primary_key' do
|
42
30
|
subject { relation.primary_key }
|
43
31
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rom-http
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Piotr Solnica
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2018-01-11 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: concurrent-ruby
|
@@ -26,20 +26,34 @@ dependencies:
|
|
26
26
|
- - ">="
|
27
27
|
- !ruby/object:Gem::Version
|
28
28
|
version: '0'
|
29
|
+
- !ruby/object:Gem::Dependency
|
30
|
+
name: addressable
|
31
|
+
requirement: !ruby/object:Gem::Requirement
|
32
|
+
requirements:
|
33
|
+
- - ">="
|
34
|
+
- !ruby/object:Gem::Version
|
35
|
+
version: '0'
|
36
|
+
type: :runtime
|
37
|
+
prerelease: false
|
38
|
+
version_requirements: !ruby/object:Gem::Requirement
|
39
|
+
requirements:
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: '0'
|
29
43
|
- !ruby/object:Gem::Dependency
|
30
44
|
name: rom
|
31
45
|
requirement: !ruby/object:Gem::Requirement
|
32
46
|
requirements:
|
33
47
|
- - "~>"
|
34
48
|
- !ruby/object:Gem::Version
|
35
|
-
version:
|
49
|
+
version: '4.0'
|
36
50
|
type: :runtime
|
37
51
|
prerelease: false
|
38
52
|
version_requirements: !ruby/object:Gem::Requirement
|
39
53
|
requirements:
|
40
54
|
- - "~>"
|
41
55
|
- !ruby/object:Gem::Version
|
42
|
-
version:
|
56
|
+
version: '4.0'
|
43
57
|
- !ruby/object:Gem::Dependency
|
44
58
|
name: dry-core
|
45
59
|
requirement: !ruby/object:Gem::Requirement
|
@@ -74,6 +88,20 @@ dependencies:
|
|
74
88
|
- - "~>"
|
75
89
|
- !ruby/object:Gem::Version
|
76
90
|
version: '0.2'
|
91
|
+
- !ruby/object:Gem::Dependency
|
92
|
+
name: dry-configurable
|
93
|
+
requirement: !ruby/object:Gem::Requirement
|
94
|
+
requirements:
|
95
|
+
- - "~>"
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
version: '0.6'
|
98
|
+
type: :runtime
|
99
|
+
prerelease: false
|
100
|
+
version_requirements: !ruby/object:Gem::Requirement
|
101
|
+
requirements:
|
102
|
+
- - "~>"
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
version: '0.6'
|
77
105
|
- !ruby/object:Gem::Dependency
|
78
106
|
name: bundler
|
79
107
|
requirement: !ruby/object:Gem::Requirement
|
@@ -157,6 +185,7 @@ files:
|
|
157
185
|
- lib/rom/http/commands/delete.rb
|
158
186
|
- lib/rom/http/commands/update.rb
|
159
187
|
- lib/rom/http/dataset.rb
|
188
|
+
- lib/rom/http/dataset/class_interface.rb
|
160
189
|
- lib/rom/http/error.rb
|
161
190
|
- lib/rom/http/gateway.rb
|
162
191
|
- lib/rom/http/relation.rb
|
@@ -195,7 +224,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
195
224
|
version: '0'
|
196
225
|
requirements: []
|
197
226
|
rubyforge_project:
|
198
|
-
rubygems_version: 2.
|
227
|
+
rubygems_version: 2.6.13
|
199
228
|
signing_key:
|
200
229
|
specification_version: 4
|
201
230
|
summary: HTTP support for ROM
|