rom-http 0.1.2 → 0.2.0.beta1
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/.travis.yml +1 -1
- data/README.md +18 -8
- data/lib/rom/http/dataset/response_transformers/schemad.rb +37 -0
- data/lib/rom/http/dataset/response_transformers/schemaless.rb +25 -0
- data/lib/rom/http/dataset.rb +17 -25
- data/lib/rom/http/relation.rb +10 -0
- data/lib/rom/http/support/transformations.rb +2 -7
- data/lib/rom/http/version.rb +1 -1
- data/lib/rom/plugins/relation/schema.rb +53 -0
- data/rom-http.gemspec +3 -2
- data/spec/integration/abstract/commands/create_spec.rb +5 -20
- data/spec/integration/abstract/commands/delete_spec.rb +3 -18
- data/spec/integration/abstract/commands/update_spec.rb +5 -20
- data/spec/integration/abstract/relation_spec.rb +2 -17
- data/spec/shared/setup.rb +10 -6
- data/spec/shared/users_and_tasks.rb +20 -4
- data/spec/unit/rom/http/dataset/response_transformers/schemad_spec.rb +52 -0
- data/spec/unit/rom/http/dataset/response_transformers/schemaless_spec.rb +39 -0
- data/spec/unit/rom/http/dataset_spec.rb +34 -0
- data/spec/unit/rom/http/gateway_spec.rb +0 -2
- data/spec/unit/rom/http/relation_spec.rb +32 -0
- data/spec/unit/rom/plugins/relation/schema/schema_spec.rb +30 -0
- metadata +35 -30
- data/spec/shared/command_behaviour.rb +0 -18
- data/spec/unit/rom/http/commands/create_spec.rb +0 -22
- data/spec/unit/rom/http/commands/delete_spec.rb +0 -22
- data/spec/unit/rom/http/commands/update_spec.rb +0 -22
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2a5ebdfa66d4abb9975b77abac585c68188d1871
|
4
|
+
data.tar.gz: f1544da6a74bc90e6a17124215611e02728dfee4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 18d392cdad3557b58474c0b3636a31ab0d49f05706cf09ecf91dbbd7005fe91370c685c60cce4454ec8801c1e9742b31d52d1cc738486d4eb096fcfc9bc6b15c
|
7
|
+
data.tar.gz: 93aee72ead5f1bf0244f1930e36502ac2cb4642348b0a39c8d3577ca55fac3336650eb1bb3c5dc094e63ca56fd2f241c6ee5b0a8b6603d06e6fcd643e24ded1b
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -42,13 +42,24 @@ end
|
|
42
42
|
class Users < ROM::Relation[:http]
|
43
43
|
dataset :users
|
44
44
|
|
45
|
+
# You can also define a schema block
|
46
|
+
# which will use dry-data's Dry::Data['hash']
|
47
|
+
# coercion to pre-process your data
|
48
|
+
schema do
|
49
|
+
attribute 'id', 'strict.int'
|
50
|
+
attribute 'name', 'strict.string'
|
51
|
+
attribute 'username', 'strict.string'
|
52
|
+
attribute 'email', 'strict.string'
|
53
|
+
attribute 'phone', 'strict.string'
|
54
|
+
attribute 'website', 'strict.string'
|
55
|
+
end
|
56
|
+
|
45
57
|
def by_id(id)
|
46
58
|
with_path(id.to_s)
|
47
59
|
end
|
48
60
|
end
|
49
61
|
|
50
|
-
|
51
|
-
rom.setup(:http, {
|
62
|
+
configuration = ROM::Configuration.new(:http, {
|
52
63
|
uri: 'http://jsonplaceholder.typicode.com',
|
53
64
|
headers: {
|
54
65
|
Accept: 'application/json'
|
@@ -56,9 +67,9 @@ rom.setup(:http, {
|
|
56
67
|
request_handler: RequestHandler.new,
|
57
68
|
response_handler: ResponseHandler.new
|
58
69
|
})
|
59
|
-
|
70
|
+
configuration.register_relation(Users)
|
71
|
+
container = ROM.container(configuration)
|
60
72
|
|
61
|
-
container = rom.finalize.env
|
62
73
|
container.relation(:users).by_id(1).to_a
|
63
74
|
# => GET http://jsonplaceholder.typicode.com/users/1 [ Accept: application/json ]
|
64
75
|
```
|
@@ -118,8 +129,7 @@ end
|
|
118
129
|
|
119
130
|
ROM.register_adapter(:my_adapter, ROM::MyAdapter)
|
120
131
|
|
121
|
-
|
122
|
-
rom.setup(:my_adapter, {
|
132
|
+
configuration = ROM::Configuration.new(:my_adapter, {
|
123
133
|
uri: 'http://jsonplaceholder.typicode.com',
|
124
134
|
headers: {
|
125
135
|
Accept: 'application/json'
|
@@ -134,9 +144,9 @@ class Users < ROM::Relation[:my_adapter]
|
|
134
144
|
end
|
135
145
|
end
|
136
146
|
|
137
|
-
|
147
|
+
configuration.register_relation(Users)
|
148
|
+
container = ROM.container(configuration)
|
138
149
|
|
139
|
-
container = rom.finalize.env
|
140
150
|
container.relation(:users).by_id(1).to_a
|
141
151
|
# => GET http://jsonplaceholder.typicode.com/users/1 [ Accept: application/json ]
|
142
152
|
```
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'rom/http/support/transformations'
|
2
|
+
|
3
|
+
module ROM
|
4
|
+
module HTTP
|
5
|
+
class Dataset
|
6
|
+
module ResponseTransformers
|
7
|
+
class Schemad
|
8
|
+
attr_reader :schema
|
9
|
+
|
10
|
+
def initialize(schema)
|
11
|
+
@schema = schema
|
12
|
+
end
|
13
|
+
|
14
|
+
def call(response, dataset)
|
15
|
+
t(:map_array,
|
16
|
+
t(:accept_keys, projections(dataset.projections)) >> ->(tuple) { schema.apply(tuple) }
|
17
|
+
).call(response)
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def t(*args)
|
23
|
+
ROM::HTTP::Support::Transformations[*args]
|
24
|
+
end
|
25
|
+
|
26
|
+
def projections(projections)
|
27
|
+
if projections.empty?
|
28
|
+
schema.attribute_names
|
29
|
+
else
|
30
|
+
projections.reject { |attr| !schema.attribute_names.include?(attr) }
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'rom/http/support/transformations'
|
2
|
+
|
3
|
+
module ROM
|
4
|
+
module HTTP
|
5
|
+
class Dataset
|
6
|
+
module ResponseTransformers
|
7
|
+
class Schemaless
|
8
|
+
def call(response, dataset)
|
9
|
+
if dataset.projections.empty?
|
10
|
+
response
|
11
|
+
else
|
12
|
+
t(:map_array, t(:accept_keys, dataset.projections)).call(response)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def t(*args)
|
19
|
+
ROM::HTTP::Support::Transformations[*args]
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/lib/rom/http/dataset.rb
CHANGED
@@ -1,10 +1,11 @@
|
|
1
|
-
require 'rom/http/
|
1
|
+
require 'rom/http/dataset/response_transformers/schemad'
|
2
|
+
require 'rom/http/dataset/response_transformers/schemaless'
|
2
3
|
|
3
4
|
module ROM
|
4
5
|
module HTTP
|
5
6
|
class Dataset
|
6
7
|
include Enumerable
|
7
|
-
include Equalizer
|
8
|
+
include Dry::Equalizer(:config, :options)
|
8
9
|
include ROM::Options
|
9
10
|
|
10
11
|
attr_reader :config
|
@@ -29,9 +30,15 @@ module ROM
|
|
29
30
|
|
30
31
|
def initialize(config, options = {})
|
31
32
|
@config = config
|
33
|
+
@response_transformer = ResponseTransformers::Schemaless.new
|
32
34
|
super(options)
|
33
35
|
end
|
34
36
|
|
37
|
+
def response_transformer(transformer = Undefined)
|
38
|
+
return @response_transformer if Undefined === transformer
|
39
|
+
@response_transformer = transformer
|
40
|
+
end
|
41
|
+
|
35
42
|
def uri
|
36
43
|
config.fetch(:uri) { fail Error, ':uri configuration missing' }
|
37
44
|
end
|
@@ -115,38 +122,23 @@ module ROM
|
|
115
122
|
|
116
123
|
def response
|
117
124
|
response_transformer.call(
|
118
|
-
response_handler.call(request_handler.call(self), self)
|
125
|
+
response_handler.call(request_handler.call(self), self),
|
126
|
+
self
|
119
127
|
)
|
120
128
|
end
|
121
129
|
|
122
130
|
private
|
123
131
|
|
124
132
|
def response_handler
|
125
|
-
config.fetch(:response_handler, default_response_handler)
|
126
|
-
|
127
|
-
|
133
|
+
response_handler = config.fetch(:response_handler, self.class.default_response_handler)
|
134
|
+
fail Error, ':response_handler configuration missing' if response_handler.nil?
|
135
|
+
response_handler
|
128
136
|
end
|
129
137
|
|
130
138
|
def request_handler
|
131
|
-
config.fetch(:request_handler, default_request_handler)
|
132
|
-
|
133
|
-
|
134
|
-
end
|
135
|
-
|
136
|
-
def default_response_handler
|
137
|
-
self.class.default_response_handler
|
138
|
-
end
|
139
|
-
|
140
|
-
def default_request_handler
|
141
|
-
self.class.default_request_handler
|
142
|
-
end
|
143
|
-
|
144
|
-
def response_transformer
|
145
|
-
if projections.empty?
|
146
|
-
ROM::HTTP::Support::Transformations[:noop]
|
147
|
-
else
|
148
|
-
ROM::HTTP::Support::Transformations[:project, projections]
|
149
|
-
end
|
139
|
+
request_handler = config.fetch(:request_handler, self.class.default_request_handler)
|
140
|
+
fail Error, ':response_handler configuration missing' if request_handler.nil?
|
141
|
+
request_handler
|
150
142
|
end
|
151
143
|
|
152
144
|
def __new__(*args, &block)
|
data/lib/rom/http/relation.rb
CHANGED
@@ -1,13 +1,23 @@
|
|
1
|
+
require 'rom/plugins/relation/schema'
|
2
|
+
|
1
3
|
module ROM
|
2
4
|
module HTTP
|
3
5
|
class Relation < ROM::Relation
|
4
6
|
include Enumerable
|
5
7
|
|
6
8
|
adapter :http
|
9
|
+
use :schema
|
7
10
|
|
8
11
|
forward :with_request_method, :with_path, :append_path, :with_options,
|
9
12
|
:with_params, :clear_params, :project
|
10
13
|
|
14
|
+
def initialize(*)
|
15
|
+
super
|
16
|
+
dataset.response_transformer(
|
17
|
+
Dataset::ResponseTransformers::Schemad.new(self.class.schema)
|
18
|
+
) if self.class.schema
|
19
|
+
end
|
20
|
+
|
11
21
|
def insert(*args)
|
12
22
|
dataset.insert(*args)
|
13
23
|
end
|
@@ -4,13 +4,8 @@ module ROM
|
|
4
4
|
class Transformations
|
5
5
|
extend Transproc::Registry
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
import :identity, from: ::Transproc::Coercions, as: :noop
|
10
|
-
|
11
|
-
def self.project(value, projections)
|
12
|
-
t(:map_array, t(:accept_keys, projections)).call(value)
|
13
|
-
end
|
7
|
+
import :map_array, from: ::Transproc::ArrayTransformations
|
8
|
+
import :accept_keys, from: ::Transproc::HashTransformations
|
14
9
|
end
|
15
10
|
end
|
16
11
|
end
|
data/lib/rom/http/version.rb
CHANGED
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'dry/data'
|
2
|
+
|
3
|
+
module ROM
|
4
|
+
module Plugins
|
5
|
+
module Relation
|
6
|
+
module Schema
|
7
|
+
def self.included(klass)
|
8
|
+
super
|
9
|
+
|
10
|
+
klass.class_eval do
|
11
|
+
def self.schema(&block)
|
12
|
+
@__schema__ = Schema.create(&block) if block_given?
|
13
|
+
@__schema__
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
class Schema
|
19
|
+
attr_reader :schema
|
20
|
+
attr_reader :coercer
|
21
|
+
|
22
|
+
def self.create(&block)
|
23
|
+
new.tap { |schema| schema.instance_eval(&block) }
|
24
|
+
end
|
25
|
+
|
26
|
+
def initialize(schema = {}, coercer = Dry::Data['hash'])
|
27
|
+
@schema = schema
|
28
|
+
@coercer = coercer
|
29
|
+
end
|
30
|
+
|
31
|
+
def attribute_names
|
32
|
+
schema.keys
|
33
|
+
end
|
34
|
+
|
35
|
+
def apply(attributes = {})
|
36
|
+
coercer.schema(schema).call(attributes)
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def attribute(name, type)
|
42
|
+
schema[name] = type
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
|
51
|
+
ROM.plugins do
|
52
|
+
register :schema, ROM::Plugins::Relation::Schema, type: :relation
|
53
|
+
end
|
data/rom-http.gemspec
CHANGED
@@ -18,9 +18,10 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ['lib']
|
20
20
|
|
21
|
-
spec.add_runtime_dependency 'rom', '~> 0.9', '>= 0.9.0'
|
22
|
-
spec.add_runtime_dependency 'equalizer', '~> 0.0', '>= 0.0.9'
|
23
21
|
spec.add_runtime_dependency 'thread_safe'
|
22
|
+
spec.add_runtime_dependency 'dry-data'
|
23
|
+
spec.add_runtime_dependency 'rom', '~> 1.0.0.beta2'
|
24
|
+
spec.add_runtime_dependency 'dry-equalizer'
|
24
25
|
|
25
26
|
spec.add_development_dependency 'bundler'
|
26
27
|
spec.add_development_dependency 'rspec', '~> 3.1'
|
@@ -1,26 +1,11 @@
|
|
1
1
|
RSpec.describe ROM::HTTP::Commands::Create do
|
2
|
-
|
3
|
-
let(:headers) { { accept: 'application/json' } }
|
4
|
-
let(:rom) { ROM::Environment.new }
|
5
|
-
let(:container) { rom.finalize.env }
|
6
|
-
let(:request_handler) { double(Proc, freeze: self) }
|
7
|
-
let(:response_handler) { double(Proc, freeze: self) }
|
2
|
+
include_context 'setup'
|
8
3
|
let(:relation) do
|
9
4
|
Class.new(ROM::HTTP::Relation) do
|
10
5
|
dataset :users
|
11
6
|
end
|
12
7
|
end
|
13
8
|
|
14
|
-
before do
|
15
|
-
rom.setup(
|
16
|
-
:http,
|
17
|
-
uri: uri,
|
18
|
-
headers: headers,
|
19
|
-
request_handler: request_handler,
|
20
|
-
response_handler: response_handler
|
21
|
-
)
|
22
|
-
end
|
23
|
-
|
24
9
|
context 'with single tuple' do
|
25
10
|
let(:response) { double }
|
26
11
|
let(:tuple) { double }
|
@@ -47,8 +32,8 @@ RSpec.describe ROM::HTTP::Commands::Create do
|
|
47
32
|
end
|
48
33
|
|
49
34
|
before do
|
50
|
-
|
51
|
-
|
35
|
+
configuration.register_relation(relation)
|
36
|
+
configuration.register_command(command)
|
52
37
|
|
53
38
|
allow(request_handler).to receive(:call).and_return(response)
|
54
39
|
allow(response_handler).to receive(:call).and_return(tuple)
|
@@ -106,8 +91,8 @@ RSpec.describe ROM::HTTP::Commands::Create do
|
|
106
91
|
end
|
107
92
|
|
108
93
|
before do
|
109
|
-
|
110
|
-
|
94
|
+
configuration.register_relation(relation)
|
95
|
+
configuration.register_command(command)
|
111
96
|
|
112
97
|
allow(request_handler).to receive(:call).and_return(response_1, response_2)
|
113
98
|
allow(response_handler).to receive(:call).and_return(tuple_1, tuple_2)
|
@@ -1,10 +1,5 @@
|
|
1
1
|
RSpec.describe ROM::HTTP::Commands::Delete do
|
2
|
-
|
3
|
-
let(:headers) { { accept: 'application/json' } }
|
4
|
-
let(:rom) { ROM::Environment.new }
|
5
|
-
let(:container) { rom.finalize.env }
|
6
|
-
let(:request_handler) { double(Proc, freeze: self) }
|
7
|
-
let(:response_handler) { double(Proc, freeze: self) }
|
2
|
+
include_context 'setup'
|
8
3
|
let(:relation) do
|
9
4
|
Class.new(ROM::HTTP::Relation) do
|
10
5
|
dataset :users
|
@@ -34,18 +29,8 @@ RSpec.describe ROM::HTTP::Commands::Delete do
|
|
34
29
|
end
|
35
30
|
|
36
31
|
before do
|
37
|
-
|
38
|
-
|
39
|
-
uri: uri,
|
40
|
-
headers: headers,
|
41
|
-
request_handler: request_handler,
|
42
|
-
response_handler: response_handler
|
43
|
-
)
|
44
|
-
end
|
45
|
-
|
46
|
-
before do
|
47
|
-
rom.register_relation(relation)
|
48
|
-
rom.register_command(command)
|
32
|
+
configuration.register_relation(relation)
|
33
|
+
configuration.register_command(command)
|
49
34
|
|
50
35
|
allow(request_handler).to receive(:call).and_return(response)
|
51
36
|
allow(response_handler).to receive(:call).and_return(tuples)
|
@@ -1,26 +1,11 @@
|
|
1
1
|
RSpec.describe ROM::HTTP::Commands::Update do
|
2
|
-
|
3
|
-
let(:headers) { { accept: 'application/json' } }
|
4
|
-
let(:rom) { ROM::Environment.new }
|
5
|
-
let(:container) { rom.finalize.env }
|
6
|
-
let(:request_handler) { double(Proc, freeze: self) }
|
7
|
-
let(:response_handler) { double(Proc, freeze: self) }
|
2
|
+
include_context 'setup'
|
8
3
|
let(:relation) do
|
9
4
|
Class.new(ROM::HTTP::Relation) do
|
10
5
|
dataset :users
|
11
6
|
end
|
12
7
|
end
|
13
8
|
|
14
|
-
before do
|
15
|
-
rom.setup(
|
16
|
-
:http,
|
17
|
-
uri: uri,
|
18
|
-
headers: headers,
|
19
|
-
request_handler: request_handler,
|
20
|
-
response_handler: response_handler
|
21
|
-
)
|
22
|
-
end
|
23
|
-
|
24
9
|
context 'with single tuple' do
|
25
10
|
let(:response) { double }
|
26
11
|
let(:tuple) { double }
|
@@ -47,8 +32,8 @@ RSpec.describe ROM::HTTP::Commands::Update do
|
|
47
32
|
end
|
48
33
|
|
49
34
|
before do
|
50
|
-
|
51
|
-
|
35
|
+
configuration.register_relation(relation)
|
36
|
+
configuration.register_command(command)
|
52
37
|
|
53
38
|
allow(request_handler).to receive(:call).and_return(response)
|
54
39
|
allow(response_handler).to receive(:call).and_return(tuple)
|
@@ -106,8 +91,8 @@ RSpec.describe ROM::HTTP::Commands::Update do
|
|
106
91
|
end
|
107
92
|
|
108
93
|
before do
|
109
|
-
|
110
|
-
|
94
|
+
configuration.register_relation(relation)
|
95
|
+
configuration.register_command(command)
|
111
96
|
|
112
97
|
allow(request_handler).to receive(:call).and_return(response_1, response_2)
|
113
98
|
allow(response_handler).to receive(:call).and_return(tuple_1, tuple_2)
|
@@ -1,10 +1,5 @@
|
|
1
1
|
RSpec.describe ROM::HTTP::Relation do
|
2
|
-
|
3
|
-
let(:headers) { { accept: 'application/json' } }
|
4
|
-
let(:rom) { ROM::Environment.new }
|
5
|
-
let(:container) { rom.finalize.env }
|
6
|
-
let(:request_handler) { double(Proc, freeze: self) }
|
7
|
-
let(:response_handler) { double(Proc, freeze: self) }
|
2
|
+
include_context 'setup'
|
8
3
|
let(:relation) do
|
9
4
|
Class.new(ROM::HTTP::Relation) do
|
10
5
|
dataset :users
|
@@ -38,17 +33,7 @@ RSpec.describe ROM::HTTP::Relation do
|
|
38
33
|
let(:params) { { filters: { first_name: 'John' } } }
|
39
34
|
|
40
35
|
before do
|
41
|
-
|
42
|
-
:http,
|
43
|
-
uri: uri,
|
44
|
-
headers: headers,
|
45
|
-
request_handler: request_handler,
|
46
|
-
response_handler: response_handler
|
47
|
-
)
|
48
|
-
end
|
49
|
-
|
50
|
-
before do
|
51
|
-
rom.register_relation(relation)
|
36
|
+
configuration.register_relation(relation)
|
52
37
|
|
53
38
|
allow(request_handler).to receive(:call).and_return(response)
|
54
39
|
allow(response_handler).to receive(:call).and_return(tuples)
|
data/spec/shared/setup.rb
CHANGED
@@ -1,14 +1,18 @@
|
|
1
1
|
RSpec.shared_context 'setup' do
|
2
|
-
let(:
|
3
|
-
|
4
|
-
env.setup(
|
2
|
+
let(:configuration) do
|
3
|
+
ROM::Configuration.new(
|
5
4
|
:http,
|
6
|
-
uri:
|
5
|
+
uri: uri,
|
7
6
|
request_handler: request_handler,
|
8
|
-
response_handler: response_handler
|
7
|
+
response_handler: response_handler,
|
8
|
+
headers: headers
|
9
9
|
)
|
10
10
|
end
|
11
|
-
let(:
|
11
|
+
let(:container) { ROM.container(configuration) }
|
12
|
+
let(:rom) { container }
|
13
|
+
let(:gateway) { container.gateways.fetch(:default) }
|
14
|
+
let(:uri) { 'http://localhost:3000' }
|
12
15
|
let(:request_handler) { double(Proc, freeze: self) }
|
13
16
|
let(:response_handler) { double(Proc, freeze: self) }
|
17
|
+
let(:headers) { { accept: 'application/json' } }
|
14
18
|
end
|
@@ -1,10 +1,26 @@
|
|
1
1
|
RSpec.shared_context 'users and tasks' do
|
2
2
|
include_context 'setup'
|
3
|
+
let(:users_relation) do
|
4
|
+
Class.new(ROM::HTTP::Relation) do
|
5
|
+
dataset :users
|
3
6
|
|
4
|
-
|
5
|
-
|
7
|
+
def by_id(id)
|
8
|
+
with_params(id: id)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
let(:tasks_relation) do
|
13
|
+
Class.new(ROM::HTTP::Relation) do
|
14
|
+
dataset :tasks
|
6
15
|
|
7
|
-
|
8
|
-
|
16
|
+
def by_id(id)
|
17
|
+
with_params(id: id)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
before do
|
23
|
+
configuration.register_relation(users_relation)
|
24
|
+
configuration.register_relation(tasks_relation)
|
9
25
|
end
|
10
26
|
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
RSpec.describe ROM::HTTP::Dataset::ResponseTransformers::Schemad do
|
2
|
+
let(:transformer) { ROM::HTTP::Dataset::ResponseTransformers::Schemad.new(schema) }
|
3
|
+
let(:schema) do
|
4
|
+
ROM::Plugins::Relation::Schema::Schema.create do
|
5
|
+
attribute :id, 'form.int'
|
6
|
+
attribute :name, 'strict.string'
|
7
|
+
attribute :active, 'form.bool'
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
describe '#call' do
|
12
|
+
let(:response) do
|
13
|
+
[
|
14
|
+
{
|
15
|
+
id: '1',
|
16
|
+
name: 'Jill',
|
17
|
+
email: 'jill@fakemail.com',
|
18
|
+
active: 'true'
|
19
|
+
}
|
20
|
+
]
|
21
|
+
end
|
22
|
+
let(:dataset) do
|
23
|
+
double('ROM::HTTP::Dataset', projections: projections)
|
24
|
+
end
|
25
|
+
|
26
|
+
subject! { transformer.call(response, dataset) }
|
27
|
+
|
28
|
+
context 'with no projections' do
|
29
|
+
let(:projections) { [] }
|
30
|
+
|
31
|
+
it do
|
32
|
+
is_expected.to eq([
|
33
|
+
id: 1,
|
34
|
+
name: 'Jill',
|
35
|
+
active: true
|
36
|
+
])
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
context 'with projections' do
|
41
|
+
let(:projections) { [:id, :name, :active] }
|
42
|
+
|
43
|
+
it do
|
44
|
+
is_expected.to eq([
|
45
|
+
id: 1,
|
46
|
+
name: 'Jill',
|
47
|
+
active: true
|
48
|
+
])
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
RSpec.describe ROM::HTTP::Dataset::ResponseTransformers::Schemaless do
|
2
|
+
let(:transformer) { ROM::HTTP::Dataset::ResponseTransformers::Schemaless.new }
|
3
|
+
|
4
|
+
describe '#call' do
|
5
|
+
let(:response) do
|
6
|
+
[
|
7
|
+
{
|
8
|
+
id: 1,
|
9
|
+
name: 'Jill',
|
10
|
+
email: 'jill@fakemail.com',
|
11
|
+
active: true
|
12
|
+
}
|
13
|
+
]
|
14
|
+
end
|
15
|
+
let(:dataset) do
|
16
|
+
double('ROM::HTTP::Dataset', projections: projections)
|
17
|
+
end
|
18
|
+
|
19
|
+
subject! { transformer.call(response, dataset) }
|
20
|
+
|
21
|
+
context 'with no projections' do
|
22
|
+
let(:projections) { [] }
|
23
|
+
|
24
|
+
it { is_expected.to eq(response) }
|
25
|
+
end
|
26
|
+
|
27
|
+
context 'with projections' do
|
28
|
+
let(:projections) { [:id, :name, :active] }
|
29
|
+
|
30
|
+
it do
|
31
|
+
is_expected.to eq([
|
32
|
+
id: 1,
|
33
|
+
name: 'Jill',
|
34
|
+
active: true
|
35
|
+
])
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -110,6 +110,40 @@ RSpec.describe ROM::HTTP::Dataset do
|
|
110
110
|
end
|
111
111
|
end
|
112
112
|
|
113
|
+
describe '#response_transformer' do
|
114
|
+
context 'with argument' do
|
115
|
+
let(:transformer) { double('ResponseTransformer') }
|
116
|
+
|
117
|
+
subject! { dataset.response_transformer(transformer) }
|
118
|
+
|
119
|
+
it do
|
120
|
+
expect(dataset.instance_variable_get(:@response_transformer))
|
121
|
+
.to eq(transformer)
|
122
|
+
end
|
123
|
+
it { is_expected.to eq(transformer) }
|
124
|
+
end
|
125
|
+
|
126
|
+
context 'without argument' do
|
127
|
+
context 'when transformer not set' do
|
128
|
+
subject! { dataset.response_transformer }
|
129
|
+
|
130
|
+
it { is_expected.to be_a(ROM::HTTP::Dataset::ResponseTransformers::Schemaless) }
|
131
|
+
end
|
132
|
+
|
133
|
+
context 'when transformer set' do
|
134
|
+
let(:transformer) { double('ResponseTransformer') }
|
135
|
+
|
136
|
+
before do
|
137
|
+
dataset.response_transformer(transformer)
|
138
|
+
end
|
139
|
+
|
140
|
+
subject! { dataset.response_transformer }
|
141
|
+
|
142
|
+
it { is_expected.to eq(transformer) }
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
113
147
|
describe '#uri' do
|
114
148
|
context 'when no uri configured' do
|
115
149
|
let(:config) { {} }
|
@@ -0,0 +1,32 @@
|
|
1
|
+
RSpec.describe ROM::HTTP::Relation do
|
2
|
+
describe '#initialize' do
|
3
|
+
let(:relation) { relation_klass.new(dataset) }
|
4
|
+
let(:dataset) { ROM::HTTP::Dataset.new(nil, {}) }
|
5
|
+
|
6
|
+
context 'when relation has schema' do
|
7
|
+
let(:relation_klass) do
|
8
|
+
Class.new(ROM::HTTP::Relation) do
|
9
|
+
schema do
|
10
|
+
attribute 'id', 'strict.int'
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'sets the dataset response transformer' do
|
16
|
+
expect(relation.dataset.response_transformer)
|
17
|
+
.to be_a(ROM::HTTP::Dataset::ResponseTransformers::Schemad)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
context 'when relation does not have schema' do
|
22
|
+
let(:relation_klass) do
|
23
|
+
Class.new(ROM::HTTP::Relation)
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'keeps the default (schemaless) transformer' do
|
27
|
+
expect(relation.dataset.response_transformer)
|
28
|
+
.to be_a(ROM::HTTP::Dataset::ResponseTransformers::Schemaless)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
RSpec.describe ROM::Plugins::Relation::Schema::Schema do
|
2
|
+
let(:klass) { ROM::Plugins::Relation::Schema::Schema }
|
3
|
+
let(:schema) do
|
4
|
+
klass.create do
|
5
|
+
attribute :id, 'form.int'
|
6
|
+
attribute :name, 'strict.string'
|
7
|
+
attribute :active, 'form.bool'
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
describe '#attribute_names' do
|
12
|
+
subject! { schema.attribute_names }
|
13
|
+
|
14
|
+
it { is_expected.to match_array([:id, :name, :active])}
|
15
|
+
end
|
16
|
+
|
17
|
+
describe '#apply' do
|
18
|
+
let(:attributes) do
|
19
|
+
{
|
20
|
+
id: '1',
|
21
|
+
name: 'John',
|
22
|
+
active: 'true'
|
23
|
+
}
|
24
|
+
end
|
25
|
+
|
26
|
+
subject! { schema.apply(attributes) }
|
27
|
+
|
28
|
+
it { is_expected.to eq(id: 1, name: 'John', active: true) }
|
29
|
+
end
|
30
|
+
end
|
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.2.0.beta1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Piotr Solnica
|
@@ -9,50 +9,52 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2015-
|
12
|
+
date: 2015-12-11 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
|
-
name:
|
15
|
+
name: thread_safe
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
requirements:
|
18
|
-
- - "~>"
|
19
|
-
- !ruby/object:Gem::Version
|
20
|
-
version: '0.9'
|
21
18
|
- - ">="
|
22
19
|
- !ruby/object:Gem::Version
|
23
|
-
version: 0
|
20
|
+
version: '0'
|
24
21
|
type: :runtime
|
25
22
|
prerelease: false
|
26
23
|
version_requirements: !ruby/object:Gem::Requirement
|
27
24
|
requirements:
|
28
|
-
- - "~>"
|
29
|
-
- !ruby/object:Gem::Version
|
30
|
-
version: '0.9'
|
31
25
|
- - ">="
|
32
26
|
- !ruby/object:Gem::Version
|
33
|
-
version: 0
|
27
|
+
version: '0'
|
34
28
|
- !ruby/object:Gem::Dependency
|
35
|
-
name:
|
29
|
+
name: dry-data
|
36
30
|
requirement: !ruby/object:Gem::Requirement
|
37
31
|
requirements:
|
38
|
-
- - "~>"
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '0.0'
|
41
32
|
- - ">="
|
42
33
|
- !ruby/object:Gem::Version
|
43
|
-
version: 0
|
34
|
+
version: '0'
|
44
35
|
type: :runtime
|
45
36
|
prerelease: false
|
46
37
|
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '0'
|
42
|
+
- !ruby/object:Gem::Dependency
|
43
|
+
name: rom
|
44
|
+
requirement: !ruby/object:Gem::Requirement
|
47
45
|
requirements:
|
48
46
|
- - "~>"
|
49
47
|
- !ruby/object:Gem::Version
|
50
|
-
version:
|
51
|
-
|
48
|
+
version: 1.0.0.beta2
|
49
|
+
type: :runtime
|
50
|
+
prerelease: false
|
51
|
+
version_requirements: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - "~>"
|
52
54
|
- !ruby/object:Gem::Version
|
53
|
-
version: 0.0.
|
55
|
+
version: 1.0.0.beta2
|
54
56
|
- !ruby/object:Gem::Dependency
|
55
|
-
name:
|
57
|
+
name: dry-equalizer
|
56
58
|
requirement: !ruby/object:Gem::Requirement
|
57
59
|
requirements:
|
58
60
|
- - ">="
|
@@ -132,27 +134,30 @@ files:
|
|
132
134
|
- lib/rom/http/commands/delete.rb
|
133
135
|
- lib/rom/http/commands/update.rb
|
134
136
|
- lib/rom/http/dataset.rb
|
137
|
+
- lib/rom/http/dataset/response_transformers/schemad.rb
|
138
|
+
- lib/rom/http/dataset/response_transformers/schemaless.rb
|
135
139
|
- lib/rom/http/error.rb
|
136
140
|
- lib/rom/http/gateway.rb
|
137
141
|
- lib/rom/http/relation.rb
|
138
142
|
- lib/rom/http/support/transformations.rb
|
139
143
|
- lib/rom/http/version.rb
|
144
|
+
- lib/rom/plugins/relation/schema.rb
|
140
145
|
- rakelib/rubocop.rake
|
141
146
|
- rom-http.gemspec
|
142
147
|
- spec/integration/abstract/commands/create_spec.rb
|
143
148
|
- spec/integration/abstract/commands/delete_spec.rb
|
144
149
|
- spec/integration/abstract/commands/update_spec.rb
|
145
150
|
- spec/integration/abstract/relation_spec.rb
|
146
|
-
- spec/shared/command_behaviour.rb
|
147
151
|
- spec/shared/setup.rb
|
148
152
|
- spec/shared/users_and_tasks.rb
|
149
153
|
- spec/spec_helper.rb
|
150
154
|
- spec/support/mutant.rb
|
151
|
-
- spec/unit/rom/http/
|
152
|
-
- spec/unit/rom/http/
|
153
|
-
- spec/unit/rom/http/commands/update_spec.rb
|
155
|
+
- spec/unit/rom/http/dataset/response_transformers/schemad_spec.rb
|
156
|
+
- spec/unit/rom/http/dataset/response_transformers/schemaless_spec.rb
|
154
157
|
- spec/unit/rom/http/dataset_spec.rb
|
155
158
|
- spec/unit/rom/http/gateway_spec.rb
|
159
|
+
- spec/unit/rom/http/relation_spec.rb
|
160
|
+
- spec/unit/rom/plugins/relation/schema/schema_spec.rb
|
156
161
|
homepage: http://rom-rb.org
|
157
162
|
licenses:
|
158
163
|
- MIT
|
@@ -168,9 +173,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
168
173
|
version: '0'
|
169
174
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
170
175
|
requirements:
|
171
|
-
- - "
|
176
|
+
- - ">"
|
172
177
|
- !ruby/object:Gem::Version
|
173
|
-
version:
|
178
|
+
version: 1.3.1
|
174
179
|
requirements: []
|
175
180
|
rubyforge_project:
|
176
181
|
rubygems_version: 2.4.5.1
|
@@ -182,13 +187,13 @@ test_files:
|
|
182
187
|
- spec/integration/abstract/commands/delete_spec.rb
|
183
188
|
- spec/integration/abstract/commands/update_spec.rb
|
184
189
|
- spec/integration/abstract/relation_spec.rb
|
185
|
-
- spec/shared/command_behaviour.rb
|
186
190
|
- spec/shared/setup.rb
|
187
191
|
- spec/shared/users_and_tasks.rb
|
188
192
|
- spec/spec_helper.rb
|
189
193
|
- spec/support/mutant.rb
|
190
|
-
- spec/unit/rom/http/
|
191
|
-
- spec/unit/rom/http/
|
192
|
-
- spec/unit/rom/http/commands/update_spec.rb
|
194
|
+
- spec/unit/rom/http/dataset/response_transformers/schemad_spec.rb
|
195
|
+
- spec/unit/rom/http/dataset/response_transformers/schemaless_spec.rb
|
193
196
|
- spec/unit/rom/http/dataset_spec.rb
|
194
197
|
- spec/unit/rom/http/gateway_spec.rb
|
198
|
+
- spec/unit/rom/http/relation_spec.rb
|
199
|
+
- spec/unit/rom/plugins/relation/schema/schema_spec.rb
|
@@ -1,18 +0,0 @@
|
|
1
|
-
shared_examples_for 'a command' do
|
2
|
-
describe '#method_missing' do
|
3
|
-
it 'forwards to relation and wraps response if it returned another relation' do
|
4
|
-
new_command = command.with_params({})
|
5
|
-
|
6
|
-
expect(new_command).to be_instance_of(command.class)
|
7
|
-
expect(new_command.relation).to eq(command.with_params({}).relation)
|
8
|
-
end
|
9
|
-
|
10
|
-
it 'returns original response if it was not a relation' do
|
11
|
-
expect(command.name).to eq(command.relation.name)
|
12
|
-
end
|
13
|
-
|
14
|
-
it 'raises error when message is not known' do
|
15
|
-
expect { command.not_here }.to raise_error(NoMethodError, /not_here/)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
@@ -1,22 +0,0 @@
|
|
1
|
-
describe ROM::HTTP::Commands::Create do
|
2
|
-
include_context 'users and tasks'
|
3
|
-
|
4
|
-
subject(:command) { ROM::HTTP::Commands::Create.build(users) }
|
5
|
-
|
6
|
-
let(:users_relation_klass) do
|
7
|
-
Class.new(ROM::HTTP::Relation) do
|
8
|
-
dataset :users
|
9
|
-
|
10
|
-
def by_id(id)
|
11
|
-
with_params(id: id)
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
let(:users) { rom.relations[:users] }
|
16
|
-
|
17
|
-
before do
|
18
|
-
setup.register_relation(users_relation_klass)
|
19
|
-
end
|
20
|
-
|
21
|
-
it_behaves_like 'a command'
|
22
|
-
end
|
@@ -1,22 +0,0 @@
|
|
1
|
-
describe ROM::HTTP::Commands::Delete do
|
2
|
-
include_context 'users and tasks'
|
3
|
-
|
4
|
-
subject(:command) { ROM::HTTP::Commands::Delete.build(users) }
|
5
|
-
|
6
|
-
let(:users_relation_klass) do
|
7
|
-
Class.new(ROM::HTTP::Relation) do
|
8
|
-
dataset :users
|
9
|
-
|
10
|
-
def by_id(id)
|
11
|
-
with_params(id: id)
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
let(:users) { rom.relations[:users] }
|
16
|
-
|
17
|
-
before do
|
18
|
-
setup.register_relation(users_relation_klass)
|
19
|
-
end
|
20
|
-
|
21
|
-
it_behaves_like 'a command'
|
22
|
-
end
|
@@ -1,22 +0,0 @@
|
|
1
|
-
describe ROM::HTTP::Commands::Update do
|
2
|
-
include_context 'users and tasks'
|
3
|
-
|
4
|
-
subject(:command) { ROM::HTTP::Commands::Update.build(users) }
|
5
|
-
|
6
|
-
let(:users_relation_klass) do
|
7
|
-
Class.new(ROM::HTTP::Relation) do
|
8
|
-
dataset :users
|
9
|
-
|
10
|
-
def by_id(id)
|
11
|
-
with_params(id: id)
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
let(:users) { rom.relations[:users] }
|
16
|
-
|
17
|
-
before do
|
18
|
-
setup.register_relation(users_relation_klass)
|
19
|
-
end
|
20
|
-
|
21
|
-
it_behaves_like 'a command'
|
22
|
-
end
|