rom-http 0.4.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 12032c20947dc7c752e3afe0c1a3338ce1cee4ac
4
- data.tar.gz: 458cdb7db2296850a6f923daba522bceda50b3c2
3
+ metadata.gz: 940c73eee8219c8b80aa2ec5914549291be5e99d
4
+ data.tar.gz: 0e852b96a95edb10991aefa9d5bcffa78e5211b4
5
5
  SHA512:
6
- metadata.gz: 8b630af42d8381136077b960d0487f3485cbd6552c7495f913612f7da4727232bcb76fbb267b50e1e72c43c6e83f30d52bfb99aad49b45ab372abe126f993fd1
7
- data.tar.gz: fac806ebecb59d17c05df17483daac37795da8b56525b29923de784db59c93f4e40ee69df0962ea35b768992276d04634103a1e528a85140c88bcb20599ff1a2
6
+ metadata.gz: 3db2d4a662ae4ae76138119946b71253e36e0be5653fda789a17083f6915f7630357b0680e297690c56fab85da363ffaee1cc03412d568b2c16bd61421f080db
7
+ data.tar.gz: 8738e9b3524917c5e74535a2ae6b1ef9e23c82a98871fac7079f507321e40da86185a811f54f1b47468b9b6a56a485891c86f5377f15d13c7246f86703c41fbb
@@ -4,11 +4,11 @@ cache: bundler
4
4
  bundler_args: --without sql benchmarks console tools
5
5
  script: "bundle exec rake ci"
6
6
  rvm:
7
- - 2.0
8
7
  - 2.1
9
8
  - 2.2
9
+ - 2.3.1
10
10
  - rbx-2
11
- - jruby-9000
11
+ - jruby-9.0.5.0
12
12
  - ruby-head
13
13
  - jruby-head
14
14
  env:
@@ -1,3 +1,11 @@
1
+ # v0.5.0 2016-08-08
2
+ ### Changed
3
+ - Removed ruby 2.0 support
4
+ - Use `schema` API from ROM::Core. Replaces old schema (solnic)
5
+ - Now works out of the box with `rom-repository` (solnic)
6
+
7
+ [Compare v0.4.0...v0.5.0](https://github.com/rom-rb/rom-http/compare/v0.4.0...v0.5.0)
8
+
1
9
  # v0.4.0 2016-04-30
2
10
  ### Changed
3
11
  - updated to depend on the forthcoming rom 2.0 (cflipse)
data/Gemfile CHANGED
@@ -2,6 +2,8 @@ source 'https://rubygems.org'
2
2
 
3
3
  gemspec
4
4
 
5
+ gem 'rom-repository', github: 'rom-rb/rom-repository', branch: 'master'
6
+
5
7
  group :test do
6
8
  gem 'rom', github: 'rom-rb/rom', branch: 'master'
7
9
  gem 'rom-support', github: 'rom-rb/rom-support', branch: 'master'
@@ -10,6 +12,7 @@ group :test do
10
12
  end
11
13
 
12
14
  group :tools do
15
+ gem 'byebug'
13
16
  gem 'guard'
14
17
  gem 'guard-rspec'
15
18
  gem 'guard-rubocop'
data/README.md CHANGED
@@ -1,14 +1,48 @@
1
- # rom-http <a href="https://gitter.im/rom-rb/chat" target="_blank">![Join the chat at https://gitter.im/rom-rb/chat](https://badges.gitter.im/Join%20Chat.svg)</a>
1
+ [gem]: https://rubygems.org/gems/rom-http
2
+ [travis]: https://travis-ci.org/rom-rb/rom-http
3
+ [gemnasium]: https://gemnasium.com/rom-rb/rom-http
4
+ [codeclimate]: https://codeclimate.com/github/rom-rb/rom-http
5
+ [inchpages]: http://inch-ci.org/github/rom-rb/rom-http
6
+ [gitter]: https://gitter.im/rom-rb/chat
7
+ [rom]: https://github.com/rom-rb/rom
2
8
 
3
- <a href="https://rubygems.org/gems/rom-http" target="_blank">![Gem Version](https://badge.fury.io/rb/rom-http.svg)</a>
4
- <a href="https://travis-ci.org/rom-rb/rom-http" target="_blank">![Build Status](https://travis-ci.org/rom-rb/rom-http.svg?branch=master)</a>
5
- <a href="https://gemnasium.com/rom-rb/rom-http" target="_blank">![Dependency Status](https://gemnasium.com/rom-rb/rom-http.svg)</a>
6
- <a href="https://codeclimate.com/github/rom-rb/rom-http" target="_blank">![Code Climate](https://codeclimate.com/github/rom-rb/rom-http/badges/gpa.svg)</a>
7
- <a href="http://inch-ci.org/github/rom-rb/rom-http" target="_blank">![Documentation Status](http://inch-ci.org/github/rom-rb/rom-http.svg?branch=master&style=flat)</a>
8
9
 
9
- HTTP adapter for ROM
10
+ # ROM-http [![Gitter chat](https://badges.gitter.im/rom-rb/chat.svg)][gitter]
10
11
 
11
- ### Synopsis
12
+ [![Gem Version](https://badge.fury.io/rb/rom-http.svg)][gem]
13
+ [![Build Status](https://travis-ci.org/rom-rb/rom-http.svg?branch=master)][travis]
14
+ [![Dependency Status](https://gemnasium.com/rom-rb/rom-http.svg)][gemnasium]
15
+ [![Code Climate](https://codeclimate.com/github/rom-rb/rom-http/badges/gpa.svg)][codeclimate]
16
+ [![Documentation Status](http://inch-ci.org/github/rom-rb/rom-http.svg?branch=master&style=flat)][inchpages]
17
+
18
+ HTTP adapter for [Ruby Object Mapper][rom]
19
+
20
+ ## Installation
21
+
22
+ Add this line to your application's Gemfile:
23
+
24
+ ```ruby
25
+ gem 'rom-http'
26
+ ```
27
+
28
+ And then execute:
29
+
30
+ $ bundle
31
+
32
+ Or install it yourself as:
33
+
34
+ $ gem install rom-http
35
+
36
+ ## ROADMAP
37
+
38
+ For details please refer to [issues](https://github.com/rom-rb/rom-http/issues).
39
+
40
+
41
+ ## License
42
+
43
+ See `LICENSE` file.
44
+
45
+ ## Synopsis
12
46
 
13
47
  ```ruby
14
48
  require 'json'
@@ -1,9 +1,15 @@
1
1
  module ROM
2
2
  module HTTP
3
3
  module Commands
4
+ # HTTP Create command
5
+ #
6
+ # @api public
4
7
  class Create < ROM::Commands::Create
5
8
  adapter :http
6
9
 
10
+ # Submits each of the provided tuples over HTTP post
11
+ #
12
+ # @api public
7
13
  def execute(tuples)
8
14
  Array([tuples]).flatten.map do |tuple|
9
15
  attributes = input[tuple]
@@ -1,9 +1,15 @@
1
1
  module ROM
2
2
  module HTTP
3
3
  module Commands
4
+ # HTTP Delete command
5
+ #
6
+ # @api public
4
7
  class Delete < ROM::Commands::Delete
5
8
  adapter :http
6
9
 
10
+ # Sends an HTTP delete to the dataset path
11
+ #
12
+ # @api public
7
13
  def execute
8
14
  relation.delete
9
15
  end
@@ -1,9 +1,15 @@
1
1
  module ROM
2
2
  module HTTP
3
3
  module Commands
4
+ # HTTP update command
5
+ #
6
+ # @api public
4
7
  class Update < ROM::Commands::Update
5
8
  adapter :http
6
9
 
10
+ # Submits each of the provided tuples via HTTP put
11
+ #
12
+ # @api public
7
13
  def execute(tuples)
8
14
  Array([tuples]).flatten.map do |tuple|
9
15
  attributes = input[tuple]
@@ -3,6 +3,11 @@ require 'rom/http/dataset/response_transformers/schemaless'
3
3
 
4
4
  module ROM
5
5
  module HTTP
6
+ # HTTP Dataset
7
+ #
8
+ # Represents a specific HTTP collection resource
9
+ #
10
+ # @api public
6
11
  class Dataset
7
12
  include Enumerable
8
13
  include Dry::Equalizer(:config, :options)
@@ -28,49 +33,162 @@ module ROM
28
33
  end
29
34
  end
30
35
 
36
+
37
+ # HTTP Dataset interface
38
+ #
39
+ # @param [Hash] config the Gateway's HTTP server configuration
40
+ #
41
+ # @param [Hash] options dataset configuration options
42
+ # @option options [Symbol] :request_method (:get) The HTTP verb to use
43
+ # @option options [Array] :projections ([]) Keys to select from response tuple
44
+ # @option options [String] :path ('') URI request path
45
+ # @option options [Hash] :headers ({}) Additional request headers
46
+ # @option options [Hash] :params ({}) HTTP request parameters
47
+ #
48
+ # @api public
31
49
  def initialize(config, options = {})
32
50
  @config = config
33
51
  @response_transformer = ResponseTransformers::Schemaless.new
34
52
  super(options)
35
53
  end
36
54
 
55
+ # @overload response_transformer
56
+ # Return the current response transformer
57
+ #
58
+ # @overload response_transformer(transformer)
59
+ # Set a new response transformer
60
+ #
61
+ # @param transformer [#call] The new response transformer
62
+ #
63
+ # @api private
37
64
  def response_transformer(transformer = Undefined)
38
65
  return @response_transformer if Undefined === transformer
39
66
  @response_transformer = transformer
40
67
  end
41
68
 
69
+ # Return the gateway's URI
70
+ #
71
+ # @return [String]
72
+ #
73
+ # @raise [Error] if the configuration does not contain a URI
74
+ #
75
+ # @api public
42
76
  def uri
43
77
  config.fetch(:uri) { fail Error, ':uri configuration missing' }
44
78
  end
45
79
 
80
+ # Return request headers
81
+ #
82
+ # Merges default headers from the Gateway configuration and the
83
+ # current Dataset
84
+ #
85
+ # @example
86
+ # config = { Accepts: 'application/json' }
87
+ # users = Dataset.new(config, headers: { 'Cache-Control': 'no-cache' }
88
+ # users.headers
89
+ # # => {:Accepts => "application/json", :'Cache-Control' => 'no-cache'}
90
+ #
91
+ # @return [Hash]
92
+ #
93
+ # @api public
46
94
  def headers
47
95
  config.fetch(:headers, {}).merge(options.fetch(:headers, {}))
48
96
  end
49
97
 
98
+ # Return the dataset name
99
+ #
100
+ # @return [String]
101
+ #
102
+ # @api public
50
103
  def name
51
104
  config[:name].to_s
52
105
  end
53
106
 
107
+ # Return the dataset path
108
+ #
109
+ # @example
110
+ # Dataset.new(config, path: '/users').path
111
+ # # => 'users'
112
+ #
113
+ # @return [String] the dataset path, without a leading slash
114
+ #
115
+ # @api public
54
116
  def path
55
117
  options[:path].to_s.sub(%r{\A/}, '')
56
118
  end
57
119
 
120
+ # Return the dataset path
121
+ #
122
+ # @example
123
+ # Dataset.new(config, path: '/users').path
124
+ # # => '/users'
125
+ #
126
+ # @return [string] the dataset path, with leading slash
127
+ #
128
+ # @api public
58
129
  def absolute_path
59
130
  '/' + path
60
131
  end
61
132
 
133
+ # Return a new dataset with given headers
134
+ #
135
+ # @param headers [Hash] The new headers
136
+ #
137
+ # @note this _replaces_ the dataset's currently configured headers.
138
+ # To non-destructively add a new header, use `#add_header`
139
+ #
140
+ # @example
141
+ # users = Dataset.new(config, headers: { Accept: 'application/json' })
142
+ # users.with_headers(:'X-Api-Key' => '1234').headers
143
+ # # => { :'X-Api-Key' => '1234' }
144
+ #
145
+ # @return [Dataset]
146
+ #
147
+ # @api public
62
148
  def with_headers(headers)
63
149
  __new__(config, options.merge(headers: headers))
64
150
  end
65
151
 
152
+ # Return a new dataset with additional header
153
+ #
154
+ # @param header [Symbol] the HTTP header to add
155
+ # @param value [String] the header value
156
+ #
157
+ # @example
158
+ # users = Dataset.new(config, headers: { Accept: 'application/json' })
159
+ # users.add_header(:'X-Api-Key', '1234').headers
160
+ # # => { :Accept => 'application/json', :'X-Api-Key' => '1234' }
161
+ #
162
+ # @return [Dataset]
163
+ #
164
+ # @api public
66
165
  def add_header(header, value)
67
166
  with_headers(headers.merge(header => value))
68
167
  end
69
168
 
169
+ # Return a new dataset with additional options
170
+ #
171
+ # @param opts [Hash] the new options to add
172
+ #
173
+ # @return [Dataset]
174
+ #
175
+ # @api public
70
176
  def with_options(opts)
71
177
  __new__(config, options.merge(opts))
72
178
  end
73
179
 
180
+ # Add a new set projection to the result set
181
+ #
182
+ # @param [Array, *args] projections the keys to add to the projections
183
+ #
184
+ # @example
185
+ # users = Dataset.new(config, projections: [:login])
186
+ # users.project(:email, :name).projections
187
+ # # => [:login, :email, :name]
188
+ #
189
+ # @return [Dataset]
190
+ #
191
+ # @api public
74
192
  def project(*args)
75
193
  projections = args.first.is_a?(::Array) ? args.first : args
76
194
 
@@ -79,27 +197,86 @@ module ROM
79
197
  )
80
198
  end
81
199
 
200
+ # Return a new dataset with a different path
201
+ #
202
+ # @param path [String] the new request path
203
+ #
204
+ # @example
205
+ # users.with_path('/profiles').path
206
+ # # => 'profiles'
207
+ #
208
+ # @return [Dataset]
209
+ #
210
+ # @api public
82
211
  def with_path(path)
83
212
  with_options(path: path)
84
213
  end
85
214
 
215
+ # Return a new dataset with a modified path
216
+ #
217
+ # @param path [String] new path fragment
218
+ #
219
+ # @example
220
+ # users.append_path('profiles').path
221
+ # # => users/profiles
222
+ #
223
+ # @return [Dataset]
224
+ #
225
+ # @api public
86
226
  def append_path(path)
87
227
  with_options(path: options[:path] + '/' + path)
88
228
  end
89
229
 
230
+ # Return a new dataset with a different request method
231
+ #
232
+ # @param [Symbol] request_method the new HTTP verb
233
+ #
234
+ # @example
235
+ # users.request_method(:put)
236
+ #
237
+ # @return [Dataset]
238
+ #
239
+ # @api public
90
240
  def with_request_method(request_method)
91
241
  with_options(request_method: request_method)
92
242
  end
93
243
 
244
+ # Return a new dataset with replaced request parameters
245
+ #
246
+ # @param [Hash] params the new request parameters
247
+ #
248
+ # @example
249
+ # users = Dataset.new(config, params: { uid: 33 })
250
+ # users.with_params(login: 'jdoe').params
251
+ # # => { :login => 'jdoe' }
252
+ #
253
+ # @return [Dataset]
254
+ #
255
+ # @api public
94
256
  def with_params(params)
95
257
  with_options(params: params)
96
258
  end
97
259
 
260
+ # Iterate over each response value
261
+ #
262
+ # @yield [Hash] a dataset tuple
263
+ #
264
+ # @return [Enumerator] if no block is given
265
+ # @return [Array<Hash>]
266
+ #
267
+ # @api public
98
268
  def each(&block)
99
269
  return to_enum unless block_given?
100
270
  response.each(&block)
101
271
  end
102
272
 
273
+ # Perform an insert over HTTP Post
274
+ #
275
+ # @params [Hash] params The request parameters to send
276
+ #
277
+ # @return [Array<Hash>]
278
+ #
279
+ # @api public
103
280
  def insert(params)
104
281
  with_options(
105
282
  request_method: :post,
@@ -107,6 +284,13 @@ module ROM
107
284
  ).response
108
285
  end
109
286
 
287
+ # Perform an update over HTTP Put
288
+ #
289
+ # @params [Hash] params The request parameters to send
290
+ #
291
+ # @return [Array<Hash>]
292
+ #
293
+ # @api public
110
294
  def update(params)
111
295
  with_options(
112
296
  request_method: :put,
@@ -114,12 +298,23 @@ module ROM
114
298
  ).response
115
299
  end
116
300
 
301
+ # Perform an delete over HTTP Delete
302
+ #
303
+ #
304
+ # @return [Array<Hash>]
305
+ #
306
+ # @api public
117
307
  def delete
118
308
  with_options(
119
309
  request_method: :delete
120
310
  ).response
121
311
  end
122
312
 
313
+ # Execute the current dataset
314
+ #
315
+ # @return [Array<hash>]
316
+ #
317
+ # @api public
123
318
  def response
124
319
  response_transformer.call(
125
320
  response_handler.call(request_handler.call(self), self),
@@ -1,4 +1,4 @@
1
- require 'rom/http/support/transformations'
1
+ require 'rom/types'
2
2
 
3
3
  module ROM
4
4
  module HTTP
@@ -8,26 +8,19 @@ module ROM
8
8
  attr_reader :schema
9
9
 
10
10
  def initialize(schema)
11
- @schema = schema
11
+ @schema = Types::Hash.schema(schema)
12
12
  end
13
13
 
14
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
15
+ projections = dataset.projections
25
16
 
26
- def projections(projections)
27
- if projections.empty?
28
- schema.attribute_names
17
+ if projections.size > 0 && schema.member_types.keys != projections
18
+ projected_schema = Types::Hash.schema(
19
+ schema.member_types.select { |k, _| projections.include?(k) }
20
+ )
21
+ projected_schema[response]
29
22
  else
30
- projections.reject { |attr| !schema.attribute_names.include?(attr) }
23
+ response.map { |tuple| schema[tuple] }
31
24
  end
32
25
  end
33
26
  end
@@ -3,24 +3,64 @@ require 'rom/http/dataset'
3
3
 
4
4
  module ROM
5
5
  module HTTP
6
+ # HTTP gateway
7
+ #
8
+ # @example
9
+ # config = {
10
+ # uri: 'http://jsonplaceholder.typicode.com',
11
+ # headers: { Accept: 'applicaiton/json' }
12
+ # }
13
+ #
14
+ # gateway = ROM::HTTP::Gateway.new(config)
15
+ # users = gateway.dataset(:users)
16
+ #
17
+ # @api public
6
18
  class Gateway < ROM::Gateway
7
19
  attr_reader :datasets, :config
8
20
  private :datasets, :config
9
21
 
22
+ # HTTP gateway interface
23
+ #
24
+ # @param [Hash] config configuration options
25
+ # @option config [String] :uri The base API for the HTTP service
26
+ # @option config [Hash] :headers Default request headers
27
+ #
28
+ # @see Dataset
29
+ #
30
+ # @api public
10
31
  def initialize(config)
11
32
  @datasets = ThreadSafe::Cache.new
12
33
  @config = config
13
34
  end
14
35
 
36
+ # Retrieve dataset with the given name
37
+ #
38
+ # @param [String] name dataaset name
39
+ #
40
+ # @return [Dataset]
41
+ #
42
+ # @api public
15
43
  def [](name)
16
44
  datasets.fetch(name)
17
45
  end
18
46
 
47
+ # Build dataset with the given name
48
+ #
49
+ # @param [String] name dataaset name
50
+ #
51
+ # @return [Dataset]
52
+ #
53
+ # @api public
19
54
  def dataset(name)
20
55
  dataset_klass = namespace.const_defined?(:Dataset) ? namespace.const_get(:Dataset) : Dataset
21
56
  datasets[name] = dataset_klass.new(config.merge(name: name))
22
57
  end
23
58
 
59
+ # Check if dataset exists
60
+ #
61
+ # @param [String] name dataset name
62
+ #
63
+ # @api public
24
64
  def dataset?(name)
25
65
  datasets.key?(name)
26
66
  end
@@ -1,32 +1,43 @@
1
- require 'rom/plugins/relation/schema'
1
+ require 'rom/plugins/relation/view'
2
+ require 'rom/plugins/relation/key_inference'
2
3
 
3
4
  module ROM
4
5
  module HTTP
6
+ # HTTP-specific relation extensions
7
+ #
5
8
  class Relation < ROM::Relation
6
9
  include Enumerable
7
10
 
8
11
  adapter :http
9
- use :schema
12
+
13
+ use :view
14
+ use :key_inference
10
15
 
11
16
  forward :with_request_method, :with_path, :append_path, :with_options,
12
17
  :with_params, :clear_params, :project
13
18
 
19
+ # @api private
14
20
  def initialize(*)
15
21
  super
16
- dataset.response_transformer(
17
- Dataset::ResponseTransformers::Schemad.new(self.class.schema)
18
- ) if self.class.schema
22
+ if schema?
23
+ dataset.response_transformer(
24
+ Dataset::ResponseTransformers::Schemad.new(schema.to_h)
25
+ )
26
+ end
19
27
  end
20
28
 
29
+ # @see Dataset#insert
21
30
  def insert(*args)
22
31
  dataset.insert(*args)
23
32
  end
24
33
  alias_method :<<, :insert
25
34
 
35
+ # @see Dataset#update
26
36
  def update(*args)
27
37
  dataset.update(*args)
28
38
  end
29
39
 
40
+ # @see Dataset#delete
30
41
  def delete
31
42
  dataset.delete
32
43
  end
@@ -1,5 +1,5 @@
1
1
  module ROM
2
2
  module HTTP
3
- VERSION = '0.4.0'.freeze
3
+ VERSION = '0.5.0'.freeze
4
4
  end
5
5
  end
@@ -1,9 +1,19 @@
1
+ require 'json'
2
+ require 'rom-repository'
3
+
1
4
  RSpec.describe ROM::HTTP::Relation do
5
+ subject(:users) { container.relation(:users).by_id(id).filter(params) }
6
+
2
7
  include_context 'setup'
8
+
3
9
  let(:relation) do
4
10
  Class.new(ROM::HTTP::Relation) do
5
11
  dataset :users
6
12
 
13
+ view :base, [:id, :name] do
14
+ self
15
+ end
16
+
7
17
  def by_id(id)
8
18
  append_path(id.to_s)
9
19
  end
@@ -13,8 +23,12 @@ RSpec.describe ROM::HTTP::Relation do
13
23
  end
14
24
  end
15
25
  end
16
- let(:response) { double }
17
- let(:tuples) { [] }
26
+
27
+ let(:response) { tuples.to_json }
28
+ let(:tuples) { [{ id: 1337, name: 'John' }] }
29
+ let(:id) { 1337 }
30
+ let(:params) { { filters: { first_name: 'John' } } }
31
+
18
32
  let(:dataset) do
19
33
  ROM::HTTP::Dataset.new(
20
34
  {
@@ -29,8 +43,6 @@ RSpec.describe ROM::HTTP::Relation do
29
43
  params: params
30
44
  )
31
45
  end
32
- let(:id) { 1337 }
33
- let(:params) { { filters: { first_name: 'John' } } }
34
46
 
35
47
  before do
36
48
  configuration.register_relation(relation)
@@ -39,11 +51,26 @@ RSpec.describe ROM::HTTP::Relation do
39
51
  allow(response_handler).to receive(:call).and_return(tuples)
40
52
  end
41
53
 
42
- subject! { container.relation(:users).by_id(id).filter(params).to_a }
54
+ it 'returns relation tuples' do
55
+ expect(users.to_a).to eql(tuples)
43
56
 
44
- it do
45
57
  expect(request_handler).to have_received(:call).with(dataset).once
46
58
  expect(response_handler).to have_received(:call).with(response, dataset).once
47
- is_expected.to eq(tuples)
59
+ end
60
+
61
+ context 'using a repo' do
62
+ let(:repo) do
63
+ Class.new(ROM::Repository) { relations :users }.new(container)
64
+ end
65
+
66
+ it 'returns structs' do
67
+ user = repo.users.by_id(1337).filter(params).one
68
+
69
+ expect(user.id).to be(1337)
70
+ expect(user.name).to eql('John')
71
+
72
+ expect(request_handler).to have_received(:call).with(dataset).once
73
+ expect(response_handler).to have_received(:call).with(response, dataset).once
74
+ end
48
75
  end
49
76
  end
@@ -5,6 +5,10 @@ Bundler.setup
5
5
 
6
6
  require 'rom-http'
7
7
 
8
+ begin
9
+ require 'byebug'
10
+ rescue LoadError; end
11
+
8
12
  root = Pathname(__FILE__).dirname
9
13
 
10
14
  Dir[root.join('support/**/*.rb').to_s].each { |file| require file }
@@ -1,11 +1,10 @@
1
1
  RSpec.describe ROM::HTTP::Dataset::ResponseTransformers::Schemad do
2
- let(:transformer) { ROM::HTTP::Dataset::ResponseTransformers::Schemad.new(schema) }
2
+ subject(:transformer) { ROM::HTTP::Dataset::ResponseTransformers::Schemad.new(schema) }
3
+
3
4
  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
5
+ { id: ROM::Types::Form::Int,
6
+ name: ROM::Types::Strict::String,
7
+ active: ROM::Types::Form::Bool }
9
8
  end
10
9
 
11
10
  describe '#call' do
@@ -23,29 +22,23 @@ RSpec.describe ROM::HTTP::Dataset::ResponseTransformers::Schemad do
23
22
  double('ROM::HTTP::Dataset', projections: projections)
24
23
  end
25
24
 
26
- subject! { transformer.call(response, dataset) }
27
-
28
25
  context 'with no projections' do
29
26
  let(:projections) { [] }
30
27
 
31
- it do
32
- is_expected.to eq([
33
- id: 1,
34
- name: 'Jill',
35
- active: true
36
- ])
28
+ it 'returns original tuples' do
29
+ result = transformer.call(response, dataset)
30
+
31
+ expect(result).to eql([id: 1, name: 'Jill', active: true])
37
32
  end
38
33
  end
39
34
 
40
35
  context 'with projections' do
41
36
  let(:projections) { [:id, :name, :active] }
42
37
 
43
- it do
44
- is_expected.to eq([
45
- id: 1,
46
- name: 'Jill',
47
- active: true
48
- ])
38
+ it 'returns projected relation tuples' do
39
+ result = transformer.call(response, dataset)
40
+
41
+ expect(result).to eql([id: 1, name: 'Jill', active: true])
49
42
  end
50
43
  end
51
44
  end
@@ -7,7 +7,7 @@ RSpec.describe ROM::HTTP::Relation do
7
7
  let(:relation_klass) do
8
8
  Class.new(ROM::HTTP::Relation) do
9
9
  schema do
10
- attribute 'id', 'strict.int'
10
+ attribute 'id', ROM::Types::Strict::Int
11
11
  end
12
12
  end
13
13
  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.0
4
+ version: 0.5.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: 2016-04-30 00:00:00.000000000 Z
13
+ date: 2016-08-08 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: thread_safe
@@ -143,7 +143,6 @@ files:
143
143
  - lib/rom/http/relation.rb
144
144
  - lib/rom/http/support/transformations.rb
145
145
  - lib/rom/http/version.rb
146
- - lib/rom/plugins/relation/schema.rb
147
146
  - rakelib/rubocop.rake
148
147
  - rom-http.gemspec
149
148
  - spec/integration/abstract/commands/create_spec.rb
@@ -159,7 +158,6 @@ files:
159
158
  - spec/unit/rom/http/dataset_spec.rb
160
159
  - spec/unit/rom/http/gateway_spec.rb
161
160
  - spec/unit/rom/http/relation_spec.rb
162
- - spec/unit/rom/plugins/relation/schema/schema_spec.rb
163
161
  homepage: http://rom-rb.org
164
162
  licenses:
165
163
  - MIT
@@ -180,7 +178,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
180
178
  version: '0'
181
179
  requirements: []
182
180
  rubyforge_project:
183
- rubygems_version: 2.5.1
181
+ rubygems_version: 2.6.3
184
182
  signing_key:
185
183
  specification_version: 4
186
184
  summary: HTTP support for ROM
@@ -198,5 +196,3 @@ test_files:
198
196
  - spec/unit/rom/http/dataset_spec.rb
199
197
  - spec/unit/rom/http/gateway_spec.rb
200
198
  - spec/unit/rom/http/relation_spec.rb
201
- - spec/unit/rom/plugins/relation/schema/schema_spec.rb
202
- has_rdoc:
@@ -1,53 +0,0 @@
1
- require 'dry/types'
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::Types['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
@@ -1,30 +0,0 @@
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