rom-http 0.5.0 → 0.6.0.rc1
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 +8 -11
- data/CHANGELOG.md +13 -0
- data/README.md +32 -20
- data/examples/repository_with_combine.rb +154 -0
- data/lib/rom/http/commands/create.rb +0 -1
- data/lib/rom/http/commands/update.rb +0 -1
- data/lib/rom/http/dataset.rb +39 -61
- data/lib/rom/http/error.rb +1 -0
- data/lib/rom/http/gateway.rb +2 -2
- data/lib/rom/http/relation.rb +87 -10
- data/lib/rom/http/transformer.rb +16 -0
- data/lib/rom/http/version.rb +1 -1
- data/rom-http.gemspec +5 -4
- data/spec/integration/abstract/commands/create_spec.rb +12 -4
- data/spec/integration/abstract/commands/delete_spec.rb +7 -1
- data/spec/integration/abstract/commands/update_spec.rb +12 -4
- data/spec/integration/abstract/relation_spec.rb +4 -6
- data/spec/shared/users_and_tasks.rb +6 -2
- data/spec/spec_helper.rb +1 -0
- data/spec/unit/rom/http/dataset_spec.rb +80 -121
- data/spec/unit/rom/http/relation_spec.rb +260 -12
- metadata +40 -25
- data/lib/rom/http/dataset/response_transformers/schemad.rb +0 -30
- data/lib/rom/http/dataset/response_transformers/schemaless.rb +0 -25
- data/lib/rom/http/support/transformations.rb +0 -12
- data/spec/unit/rom/http/dataset/response_transformers/schemad_spec.rb +0 -45
- data/spec/unit/rom/http/dataset/response_transformers/schemaless_spec.rb +0 -39
@@ -1,31 +1,279 @@
|
|
1
1
|
RSpec.describe ROM::HTTP::Relation do
|
2
|
+
let(:relation_klass) do
|
3
|
+
Class.new(ROM::HTTP::Relation) do
|
4
|
+
schema do
|
5
|
+
attribute :id, ROM::Types::Strict::Int
|
6
|
+
attribute :name, ROM::Types::Strict::String
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
10
|
+
let(:relation) { relation_klass.new(dataset) }
|
11
|
+
let(:dataset) { ROM::HTTP::Dataset.new({ name: 'test' }, {}) }
|
12
|
+
let(:data) do
|
13
|
+
[
|
14
|
+
{
|
15
|
+
id: 1,
|
16
|
+
name: 'John'
|
17
|
+
},
|
18
|
+
{
|
19
|
+
id: 2,
|
20
|
+
name: 'Jill'
|
21
|
+
}
|
22
|
+
]
|
23
|
+
end
|
24
|
+
|
25
|
+
before do
|
26
|
+
allow(dataset).to receive(:response).and_return(data)
|
27
|
+
end
|
28
|
+
|
2
29
|
describe '#initialize' do
|
3
|
-
|
4
|
-
|
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
|
+
describe '#primary_key' do
|
42
|
+
subject { relation.primary_key }
|
43
|
+
|
44
|
+
context 'with no primary key defined in schema' do
|
45
|
+
it 'defaults to :id' do
|
46
|
+
is_expected.to eq(:id)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
context 'with primary key defined in schema' do
|
51
|
+
context 'without alias' do
|
52
|
+
let(:relation_klass) do
|
53
|
+
Class.new(ROM::HTTP::Relation) do
|
54
|
+
schema do
|
55
|
+
attribute :id, ROM::Types::Strict::Int
|
56
|
+
attribute :name, ROM::Types::Strict::String.meta(primary_key: true)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'returns the attribute name of the primary key' do
|
62
|
+
is_expected.to eq(:name)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
context 'with alias' do
|
67
|
+
let(:relation_klass) do
|
68
|
+
Class.new(ROM::HTTP::Relation) do
|
69
|
+
schema do
|
70
|
+
attribute :id, ROM::Types::Strict::Int.meta(primary_key: true, alias: :ident)
|
71
|
+
attribute :name, ROM::Types::Strict::String
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
it 'returns the attribute name of the primary key' do
|
77
|
+
is_expected.to eq(:ident)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
describe '#project' do
|
84
|
+
subject { relation.project(:id).to_a }
|
85
|
+
|
86
|
+
it 'returns the projected data' do
|
87
|
+
is_expected.to match_array([
|
88
|
+
{ id: 1 },
|
89
|
+
{ id: 2 }
|
90
|
+
])
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
describe '#exclude' do
|
95
|
+
subject { relation.exclude(:id).to_a }
|
96
|
+
|
97
|
+
it 'returns the data with specified keys excluded' do
|
98
|
+
is_expected.to match_array([
|
99
|
+
{ name: 'John' },
|
100
|
+
{ name: 'Jill' }
|
101
|
+
])
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
describe '#rename' do
|
106
|
+
subject { relation.rename(id: :identity).to_a }
|
107
|
+
|
108
|
+
it 'returns the data with keys renamed according to mapping' do
|
109
|
+
is_expected.to match_array([
|
110
|
+
{ name: 'John', identity: 1 },
|
111
|
+
{ name: 'Jill', identity: 2 }
|
112
|
+
])
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
describe '#prefix' do
|
117
|
+
subject { relation.prefix('user').to_a }
|
118
|
+
|
119
|
+
it 'returns the data with prefixed keys' do
|
120
|
+
is_expected.to match_array([
|
121
|
+
{ user_id: 1, user_name: 'John' },
|
122
|
+
{ user_id: 2, user_name: 'Jill' }
|
123
|
+
])
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
describe '#wrap' do
|
128
|
+
context 'when called without a prefix' do
|
129
|
+
subject { relation.wrap.to_a }
|
130
|
+
|
131
|
+
it 'returns the data with keys prefixed by dataset name' do
|
132
|
+
is_expected.to match_array([
|
133
|
+
{ test_id: 1, test_name: 'John' },
|
134
|
+
{ test_id: 2, test_name: 'Jill' }
|
135
|
+
])
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
context 'when called with a prefix' do
|
140
|
+
subject { relation.wrap('user').to_a }
|
5
141
|
|
6
|
-
|
142
|
+
it 'returns the data with keys prefixed by the given prefix' do
|
143
|
+
is_expected.to match_array([
|
144
|
+
{ user_id: 1, user_name: 'John' },
|
145
|
+
{ user_id: 2, user_name: 'Jill' }
|
146
|
+
])
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
describe '#to_a' do
|
152
|
+
subject { relation.to_a }
|
153
|
+
|
154
|
+
context 'with standard schema' do
|
7
155
|
let(:relation_klass) do
|
8
156
|
Class.new(ROM::HTTP::Relation) do
|
9
157
|
schema do
|
10
|
-
attribute
|
158
|
+
attribute :id, ROM::Types::Strict::Int
|
11
159
|
end
|
12
160
|
end
|
13
161
|
end
|
14
162
|
|
15
|
-
it '
|
16
|
-
|
17
|
-
|
163
|
+
it 'applies the schema and returns the materialized results' do
|
164
|
+
is_expected.to match_array([
|
165
|
+
{ id: 1 },
|
166
|
+
{ id: 2 }
|
167
|
+
])
|
18
168
|
end
|
19
169
|
end
|
20
170
|
|
21
|
-
context '
|
171
|
+
context 'with aliased schema' do
|
22
172
|
let(:relation_klass) do
|
23
|
-
Class.new(ROM::HTTP::Relation)
|
173
|
+
Class.new(ROM::HTTP::Relation) do
|
174
|
+
schema do
|
175
|
+
attribute :id, ROM::Types::Strict::Int
|
176
|
+
attribute :name, ROM::Types::Strict::String.meta(alias: :username)
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
it 'applies the schema and returns the materialized results' do
|
182
|
+
is_expected.to match_array([
|
183
|
+
{ id: 1, username: 'John' },
|
184
|
+
{ id: 2, username: 'Jill' }
|
185
|
+
])
|
24
186
|
end
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
190
|
+
%i[insert update].each do |method_name|
|
191
|
+
describe "##{method_name}" do
|
192
|
+
subject { relation.send(method_name, name: 'John') }
|
25
193
|
|
26
|
-
|
27
|
-
|
28
|
-
|
194
|
+
before do
|
195
|
+
allow(dataset).to receive(method_name).and_return(data)
|
196
|
+
end
|
197
|
+
|
198
|
+
context 'with standard schema' do
|
199
|
+
let(:relation_klass) do
|
200
|
+
Class.new(ROM::HTTP::Relation) do
|
201
|
+
schema do
|
202
|
+
attribute :id, ROM::Types::Strict::Int
|
203
|
+
end
|
204
|
+
end
|
205
|
+
end
|
206
|
+
|
207
|
+
context 'when respond with single tuple' do
|
208
|
+
let(:data) { { id: 1, name: 'John' } }
|
209
|
+
|
210
|
+
it 'applies the schema and returns the materialized results' do
|
211
|
+
is_expected.to eq(id: 1)
|
212
|
+
end
|
213
|
+
end
|
214
|
+
|
215
|
+
context 'when respond with multiple tuples' do
|
216
|
+
let(:data) do
|
217
|
+
[
|
218
|
+
{
|
219
|
+
id: 1,
|
220
|
+
name: 'John'
|
221
|
+
},
|
222
|
+
{
|
223
|
+
id: 2,
|
224
|
+
name: 'Jill'
|
225
|
+
}
|
226
|
+
]
|
227
|
+
end
|
228
|
+
|
229
|
+
it 'applies the schema and returns the materialized results' do
|
230
|
+
is_expected.to match_array([
|
231
|
+
{ id: 1 },
|
232
|
+
{ id: 2 }
|
233
|
+
])
|
234
|
+
end
|
235
|
+
end
|
236
|
+
end
|
237
|
+
|
238
|
+
context 'with aliased schema' do
|
239
|
+
let(:relation_klass) do
|
240
|
+
Class.new(ROM::HTTP::Relation) do
|
241
|
+
schema do
|
242
|
+
attribute :id, ROM::Types::Strict::Int
|
243
|
+
attribute :name, ROM::Types::Strict::String.meta(alias: :username)
|
244
|
+
end
|
245
|
+
end
|
246
|
+
end
|
247
|
+
|
248
|
+
context 'when respond with single tuple' do
|
249
|
+
let(:data) { { id: 1, name: 'John' } }
|
250
|
+
|
251
|
+
it 'applies the schema and returns the materialized results' do
|
252
|
+
is_expected.to eq(id: 1, username: 'John')
|
253
|
+
end
|
254
|
+
end
|
255
|
+
|
256
|
+
context 'when respond with multiple tuples' do
|
257
|
+
let(:data) do
|
258
|
+
[
|
259
|
+
{
|
260
|
+
id: 1,
|
261
|
+
name: 'John'
|
262
|
+
},
|
263
|
+
{
|
264
|
+
id: 2,
|
265
|
+
name: 'Jill'
|
266
|
+
}
|
267
|
+
]
|
268
|
+
end
|
269
|
+
|
270
|
+
it 'applies the schema and returns the materialized results' do
|
271
|
+
is_expected.to match_array([
|
272
|
+
{ id: 1, username: 'John' },
|
273
|
+
{ id: 2, username: 'Jill' }
|
274
|
+
])
|
275
|
+
end
|
276
|
+
end
|
29
277
|
end
|
30
278
|
end
|
31
279
|
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.6.0.rc1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Piotr Solnica
|
@@ -10,10 +10,10 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2017-01-28 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
|
-
name:
|
16
|
+
name: concurrent-ruby
|
17
17
|
requirement: !ruby/object:Gem::Requirement
|
18
18
|
requirements:
|
19
19
|
- - ">="
|
@@ -27,47 +27,53 @@ dependencies:
|
|
27
27
|
- !ruby/object:Gem::Version
|
28
28
|
version: '0'
|
29
29
|
- !ruby/object:Gem::Dependency
|
30
|
-
name:
|
30
|
+
name: rom
|
31
31
|
requirement: !ruby/object:Gem::Requirement
|
32
32
|
requirements:
|
33
|
-
- - "
|
33
|
+
- - "~>"
|
34
34
|
- !ruby/object:Gem::Version
|
35
|
-
version:
|
35
|
+
version: 3.0.0.rc
|
36
36
|
type: :runtime
|
37
37
|
prerelease: false
|
38
38
|
version_requirements: !ruby/object:Gem::Requirement
|
39
39
|
requirements:
|
40
|
-
- - "
|
40
|
+
- - "~>"
|
41
41
|
- !ruby/object:Gem::Version
|
42
|
-
version:
|
42
|
+
version: 3.0.0.rc
|
43
43
|
- !ruby/object:Gem::Dependency
|
44
|
-
name:
|
44
|
+
name: dry-core
|
45
45
|
requirement: !ruby/object:Gem::Requirement
|
46
46
|
requirements:
|
47
47
|
- - "~>"
|
48
48
|
- !ruby/object:Gem::Version
|
49
|
-
version: '2
|
49
|
+
version: '0.2'
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: 0.2.3
|
50
53
|
type: :runtime
|
51
54
|
prerelease: false
|
52
55
|
version_requirements: !ruby/object:Gem::Requirement
|
53
56
|
requirements:
|
54
57
|
- - "~>"
|
55
58
|
- !ruby/object:Gem::Version
|
56
|
-
version: '2
|
59
|
+
version: '0.2'
|
60
|
+
- - ">="
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: 0.2.3
|
57
63
|
- !ruby/object:Gem::Dependency
|
58
64
|
name: dry-equalizer
|
59
65
|
requirement: !ruby/object:Gem::Requirement
|
60
66
|
requirements:
|
61
|
-
- - "
|
67
|
+
- - "~>"
|
62
68
|
- !ruby/object:Gem::Version
|
63
|
-
version: '0'
|
69
|
+
version: '0.2'
|
64
70
|
type: :runtime
|
65
71
|
prerelease: false
|
66
72
|
version_requirements: !ruby/object:Gem::Requirement
|
67
73
|
requirements:
|
68
|
-
- - "
|
74
|
+
- - "~>"
|
69
75
|
- !ruby/object:Gem::Version
|
70
|
-
version: '0'
|
76
|
+
version: '0.2'
|
71
77
|
- !ruby/object:Gem::Dependency
|
72
78
|
name: bundler
|
73
79
|
requirement: !ruby/object:Gem::Requirement
|
@@ -96,6 +102,20 @@ dependencies:
|
|
96
102
|
- - "~>"
|
97
103
|
- !ruby/object:Gem::Version
|
98
104
|
version: '3.1'
|
105
|
+
- !ruby/object:Gem::Dependency
|
106
|
+
name: rspec-its
|
107
|
+
requirement: !ruby/object:Gem::Requirement
|
108
|
+
requirements:
|
109
|
+
- - ">="
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: '0'
|
112
|
+
type: :development
|
113
|
+
prerelease: false
|
114
|
+
version_requirements: !ruby/object:Gem::Requirement
|
115
|
+
requirements:
|
116
|
+
- - ">="
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: '0'
|
99
119
|
- !ruby/object:Gem::Dependency
|
100
120
|
name: rake
|
101
121
|
requirement: !ruby/object:Gem::Requirement
|
@@ -129,6 +149,7 @@ files:
|
|
129
149
|
- LICENSE.txt
|
130
150
|
- README.md
|
131
151
|
- Rakefile
|
152
|
+
- examples/repository_with_combine.rb
|
132
153
|
- lib/rom-http.rb
|
133
154
|
- lib/rom/http.rb
|
134
155
|
- lib/rom/http/commands.rb
|
@@ -136,12 +157,10 @@ files:
|
|
136
157
|
- lib/rom/http/commands/delete.rb
|
137
158
|
- lib/rom/http/commands/update.rb
|
138
159
|
- lib/rom/http/dataset.rb
|
139
|
-
- lib/rom/http/dataset/response_transformers/schemad.rb
|
140
|
-
- lib/rom/http/dataset/response_transformers/schemaless.rb
|
141
160
|
- lib/rom/http/error.rb
|
142
161
|
- lib/rom/http/gateway.rb
|
143
162
|
- lib/rom/http/relation.rb
|
144
|
-
- lib/rom/http/
|
163
|
+
- lib/rom/http/transformer.rb
|
145
164
|
- lib/rom/http/version.rb
|
146
165
|
- rakelib/rubocop.rake
|
147
166
|
- rom-http.gemspec
|
@@ -153,8 +172,6 @@ files:
|
|
153
172
|
- spec/shared/users_and_tasks.rb
|
154
173
|
- spec/spec_helper.rb
|
155
174
|
- spec/support/mutant.rb
|
156
|
-
- spec/unit/rom/http/dataset/response_transformers/schemad_spec.rb
|
157
|
-
- spec/unit/rom/http/dataset/response_transformers/schemaless_spec.rb
|
158
175
|
- spec/unit/rom/http/dataset_spec.rb
|
159
176
|
- spec/unit/rom/http/gateway_spec.rb
|
160
177
|
- spec/unit/rom/http/relation_spec.rb
|
@@ -173,12 +190,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
173
190
|
version: '0'
|
174
191
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
175
192
|
requirements:
|
176
|
-
- - "
|
193
|
+
- - ">"
|
177
194
|
- !ruby/object:Gem::Version
|
178
|
-
version:
|
195
|
+
version: 1.3.1
|
179
196
|
requirements: []
|
180
197
|
rubyforge_project:
|
181
|
-
rubygems_version: 2.
|
198
|
+
rubygems_version: 2.5.1
|
182
199
|
signing_key:
|
183
200
|
specification_version: 4
|
184
201
|
summary: HTTP support for ROM
|
@@ -191,8 +208,6 @@ test_files:
|
|
191
208
|
- spec/shared/users_and_tasks.rb
|
192
209
|
- spec/spec_helper.rb
|
193
210
|
- spec/support/mutant.rb
|
194
|
-
- spec/unit/rom/http/dataset/response_transformers/schemad_spec.rb
|
195
|
-
- spec/unit/rom/http/dataset/response_transformers/schemaless_spec.rb
|
196
211
|
- spec/unit/rom/http/dataset_spec.rb
|
197
212
|
- spec/unit/rom/http/gateway_spec.rb
|
198
213
|
- spec/unit/rom/http/relation_spec.rb
|