rom-http 0.8.0 → 0.9.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
  SHA256:
3
- metadata.gz: d88086baa2e0dccb6c7917f2e0a5ccf3ec268fa722f1648283b66ea9feb839e2
4
- data.tar.gz: 3c4385179232ad49adc12214a00ecd690663828eaf1defb05d7af042a3e85d8e
3
+ metadata.gz: f7be96043fffc0399b99aba04e426d0600b8f88e3a90725b6566fab079476b1f
4
+ data.tar.gz: a94c64dd5d3091a875e2691c6d2d5380ec056b9667d206b43376022ad37be85f
5
5
  SHA512:
6
- metadata.gz: 2a9ff4446983f2b2a996e8ea488b2f8212a16aaaeac1165244169c6d914df3bb8decdc8eb7ecef4c5afec98c0f29162d923dd288146770de8f10b4ff5335ba32
7
- data.tar.gz: e0078237b342b0578adad5a8741fa80ad2798d9d5038d30eb4eef329e440486e028f98084ffac936948e1bb94d27552c81ecca56a83b98ec67980598e8a2761f
6
+ metadata.gz: e89e4e48537fbe0a14b770e4069f931f24d8418357adfc179fb1ee72b933b88a82132b7d9abd8baef42b7dd8d1868b8ada2a74f93dae67c06f6b53f3f4265d4f
7
+ data.tar.gz: 7fbd7ff1d889affbcc4530af2fd8b08f440af929ba3e1efa99f234c454f04c2fd14fdacdd21be6fb8688c21481f6cff35cdc4c61f3527f899cb23ebd1a131656
data/CHANGELOG.md CHANGED
@@ -1,6 +1,23 @@
1
- # v0.8.0 2019-04-29
1
+ <!--- DO NOT EDIT THIS FILE - IT'S AUTOMATICALLY GENERATED VIA DEVTOOLS --->
2
2
 
3
- This is a major overhaul of the gem which brings it closer to 1.0.0. Custom data mapping was replaced by core APIs that leverage schemas and their attributes. Custom `MapperCompiler` was added that rejects keys that are not specified in the schemas, and can be extended further to meet any future requirements.
3
+ ## 0.9.0 2022-09-27
4
+
5
+ ### Added
6
+
7
+ - Support for associations :tada: (@ianks)
8
+ - Support for ruby 3 (@AMHOL)
9
+
10
+ ### Changed
11
+ - Request params separated into query_params and body_params (@AMHOL in [#44](https://github.com/rom-rb/rom-http/pull/44))
12
+ - Minimal ruby version is set to 2.7 (@flash-gordon)
13
+
14
+ ### Fixed
15
+
16
+ - Warning message from dry-configurable (@gkostin1966)
17
+
18
+ [Compare v0.8.0...v0.9.0](https://github.com/rom-rb/rom-http/compare/v0.8.0...v0.9.0)
19
+
20
+ ## 0.8.0 2019-04-29
4
21
 
5
22
  As a consequence of these changes, with this release you can easily use `rom-http` along with repositories and changesets.
6
23
 
@@ -12,33 +29,17 @@ As a consequence of these changes, with this release you can easily use `rom-htt
12
29
  - Built-in `JSON` handlers that you can set via `handlers: :json` gateway option (solnic)
13
30
  - Convenient request method predicates `Dataset#{get?,post?,delete?,put?}` (solnic)
14
31
 
15
- ### Changed
16
-
17
- - Updated to work with `rom ~> 5.0` (parndt)
18
- - Input/output data are now handled by core functionality using schema's `input_schema` and `output_schema` (solnic)
19
- - `Dataset#name` was removed in favor of `Dataset#base_path`
20
-
21
32
  ### Fixed
22
33
 
23
34
  - `Relation#append_path` no longer duplicates `base_path` (solnic)
24
35
 
25
- [Compare v0.7.0...v0.8.0](https://github.com/rom-rb/rom-http/compare/v0.7.0...v0.8.0)
26
-
27
- # v0.7.0 2018-01-11
28
-
29
- ### Added
30
36
  - Add Dataset#add_params(AMHOL)
31
37
 
32
- ### Changed
33
38
  - Updated error messages (AMHOL)
34
39
  - updated to depend on ROM 4.0 (maximderbin)
35
40
  - Removed ruby 2.1 support (maximderbin)
36
41
  - Removed rbx-3 support (maximderbin)
37
42
 
38
- [Compare v0.5.0...v0.6.0](https://github.com/rom-rb/rom-http/compare/v0.6.0...v0.7.0)
39
-
40
- # v0.6.0 2017-02-06
41
- ### Changed
42
43
  - Make schemas mandatory and use schema API from ROM core (AMHOL)
43
44
  - Generate transformer using schema (AMHOL)
44
45
  - Removed rbx-2 support (solnic)
@@ -49,47 +50,75 @@ As a consequence of these changes, with this release you can easily use `rom-htt
49
50
  - Transform keys on insert and update (maximderbin)
50
51
  - Remove `rom-support` dependency (maximderbin)
51
52
 
52
- [Compare v0.5.0...v0.6.0](https://github.com/rom-rb/rom-http/compare/v0.5.0...v0.6.0)
53
-
54
- # v0.5.0 2016-08-08
55
- ### Changed
56
53
  - Removed ruby 2.0 support
57
54
  - Use `schema` API from ROM::Core. Replaces old schema (solnic)
58
55
  - Now works out of the box with `rom-repository` (solnic)
59
56
 
60
- [Compare v0.4.0...v0.5.0](https://github.com/rom-rb/rom-http/compare/v0.4.0...v0.5.0)
57
+ - updated to depend on the forthcoming rom 2.0 (cflipse)
58
+
59
+ - replaced dry-data with dry-types (Nikita Shilnikov <ns@latera.ru>)
60
+
61
+
62
+ - schema support using `dry-data` (AMHOL)
63
+
64
+
65
+ - Projections (`container.relation(:users).project(:id, :name)`) (AMHOL)
66
+
67
+
68
+ - `ROM::HTTP::Dataset` macros for setting `default_request_handler` and `default_response_handler` (AMHOL)
61
69
 
62
- # v0.4.0 2016-04-30
63
70
  ### Changed
64
- - updated to depend on the forthcoming rom 2.0 (cflipse)
71
+
72
+ - Updated to work with `rom ~> 5.0` (parndt)
73
+ - Input/output data are now handled by core functionality using schema's `input_schema` and `output_schema` (solnic)
74
+ - `Dataset#name` was removed in favor of `Dataset#base_path`
75
+
76
+ [Compare v0.7.0...v0.8.0](https://github.com/rom-rb/rom-http/compare/v0.7.0...v0.8.0)
77
+
78
+ ## 0.7.0 2018-01-11
79
+
80
+
81
+
82
+ [Compare v0.6.0...v0.7.0](https://github.com/rom-rb/rom-http/compare/v0.6.0...v0.7.0)
83
+
84
+ ## 0.6.0 2017-02-06
85
+
86
+
87
+
88
+ [Compare v0.5.0...v0.6.0](https://github.com/rom-rb/rom-http/compare/v0.5.0...v0.6.0)
89
+
90
+ ## 0.5.0 2016-08-08
91
+
92
+
93
+
94
+ [Compare v0.4.0...v0.5.0](https://github.com/rom-rb/rom-http/compare/v0.4.0...v0.5.0)
95
+
96
+ ## 0.4.0 2016-04-30
97
+
98
+
65
99
 
66
100
  [Compare v0.3.0...v0.4.0](https://github.com/rom-rb/rom-http/compare/v0.3.0...v0.4.0)
67
101
 
68
- # v0.3.0 2016-03-17
102
+ ## 0.3.0 2016-03-17
103
+
69
104
 
70
- ### Changed
71
- - replaced dry-data with dry-types (Nikita Shilnikov <ns@latera.ru>)
72
105
 
73
106
  [Compare v0.2.0...v0.3.0](https://github.com/rom-rb/rom-http/compare/v0.2.0...v0.3.0)
74
107
 
75
- # v0.2.0 2016-01-30
76
- ### Added
108
+ ## 0.2.0 2016-01-30
109
+
77
110
 
78
- - schema support using `dry-data` (AMHOL)
79
111
 
80
112
  [Compare v0.1.2...v0.2.0](https://github.com/rom-rb/rom-http/compare/v0.1.2...v0.2.0)
81
113
 
82
- # v0.1.2 2015-09-16
83
- ### Added
114
+ ## 0.1.2 2015-09-16
115
+
84
116
 
85
- - Projections (`container.relation(:users).project(:id, :name)`) (AMHOL)
86
117
 
87
118
  [Compare v0.1.1...v0.1.2](https://github.com/rom-rb/rom-http/compare/v0.1.1...v0.1.2)
88
119
 
89
- # v0.1.1 2015-09-03
90
- ### Added
120
+ ## 0.1.1 2015-09-03
91
121
 
92
- - `ROM::HTTP::Dataset` macros for setting `default_request_handler` and `default_response_handler` (AMHOL)
93
122
 
94
123
  ### Changed
95
124
 
@@ -99,6 +128,6 @@ As a consequence of these changes, with this release you can easily use `rom-htt
99
128
 
100
129
  [Compare v0.1.0...v0.1.1](https://github.com/rom-rb/rom-http/compare/v0.1.0...v0.1.1)
101
130
 
102
- # v0.1.0 2015-08-19
131
+ ## 0.1.0 2015-08-19
103
132
 
104
133
  First public release \o/
data/README.md CHANGED
@@ -1,192 +1,29 @@
1
1
  [gem]: https://rubygems.org/gems/rom-http
2
- [travis]: https://travis-ci.org/rom-rb/rom-http
3
- [codeclimate]: https://codeclimate.com/github/rom-rb/rom-http
4
- [inchpages]: http://inch-ci.org/github/rom-rb/rom-http
2
+ [actions]: https://github.com/rom-rb/rom-http/actions
3
+ [codacy]: https://www.codacy.com/gh/rom-rb/rom-http
5
4
  [chat]: https://rom-rb.zulipchat.com
5
+ [inchpages]: http://inch-ci.org/github/rom-rb/rom-http
6
6
 
7
- # rom-http [![Join the chat at https://rom-rb.zulipchat.com](https://img.shields.io/badge/rom--rb-join%20chat-942283.svg)][chat]
7
+ # rom-http [![Join the chat at https://rom-rb.zulipchat.com](https://img.shields.io/badge/rom--rb-join%20chat-%23346b7a.svg)][chat]
8
8
 
9
9
  [![Gem Version](https://badge.fury.io/rb/rom-http.svg)][gem]
10
- [![Build Status](https://travis-ci.org/rom-rb/rom-http.svg?branch=master)][travis]
11
- [![Code Climate](https://codeclimate.com/github/rom-rb/rom-http/badges/gpa.svg)][codeclimate]
12
- [![Test Coverage](https://codeclimate.com/github/rom-rb/rom-http/badges/coverage.svg)][codeclimate]
13
- [![Inline docs](http://inch-ci.org/github/rom-rb/rom-http.svg?branch=master)][inchpages]
14
-
15
- HTTP adapter for [rom-rb](https://github.com/rom-rb/rom).
16
-
17
- Resources:
18
-
19
- - [User Documentation](http://rom-rb.org/learn/http/)
20
- - [API Documentation](http://rubydoc.info/gems/rom-http)
10
+ [![CI Status](https://github.com/rom-rb/rom-http/workflows/ci/badge.svg)][actions]
11
+ [![RuboCop](https://github.com/rom-rb/rom-http/actions/workflows/rubocop.yml/badge.svg)](https://github.com/rom-rb/rom-http/actions/workflows/rubocop.yml)
12
+ [![Codacy Badge](https://api.codacy.com/project/badge/Coverage/d37d66bb711d4aeebf5e1c1650aee261)][codacy]
13
+ [![Inline docs](http://inch-ci.org/github/rom-rb/rom-http.svg?branch=main)][inchpages]
21
14
 
22
- ## Installation
15
+ ## Links
23
16
 
24
- Add this line to your application's Gemfile:
17
+ * [User documentation](http://rom-rb.org/learn/http)
18
+ * [API documentation](http://rubydoc.info/gems/rom-http)
25
19
 
26
- ```ruby
27
- gem 'rom-http'
28
- ```
20
+ ## Supported Ruby versions
29
21
 
30
- And then execute:
22
+ This library officially supports the following Ruby versions:
31
23
 
32
- $ bundle
33
-
34
- Or install it yourself as:
35
-
36
- $ gem install rom-http
24
+ * MRI >= `2.7`
25
+ * ~jruby >= `9.3`~ (awaits Ruby 2.7 compatibility)
37
26
 
38
27
  ## License
39
28
 
40
29
  See `LICENSE` file.
41
-
42
- ## Synopsis
43
-
44
- ```ruby
45
- require 'inflecto'
46
- require 'json'
47
- require 'uri'
48
- require 'net/http'
49
-
50
- class RequestHandler
51
- def call(dataset)
52
- uri = dataset.uri
53
- http = Net::HTTP.new(uri.host, uri.port)
54
- request_klass = Net::HTTP.const_get(Inflecto.classify(dataset.request_method))
55
-
56
- request = request_klass.new(uri.request_uri)
57
- dataset.headers.each_with_object(request) do |(header, value), request|
58
- request[header.to_s] = value
59
- end
60
-
61
- response = http.request(request)
62
- end
63
- end
64
-
65
- class ResponseHandler
66
- def call(response, dataset)
67
- if %i(post put patch).include?(dataset.request_method)
68
- JSON.parse(response.body, symbolize_names: true)
69
- else
70
- Array([JSON.parse(response.body, symbolize_names: true)]).flatten
71
- end
72
- end
73
- end
74
-
75
- class Users < ROM::Relation[:http]
76
- schema(:users) do
77
- attribute :id, ROM::Types::Integer
78
- attribute :name, ROM::Types::String
79
- attribute :username, ROM::Types::String
80
- attribute :email, ROM::Types::String
81
- attribute :phone, ROM::Types::String
82
- attribute :website, ROM::Types::String
83
- end
84
-
85
- def by_id(id)
86
- with_path(id.to_s)
87
- end
88
- end
89
-
90
- configuration = ROM::Configuration.new(:http, {
91
- uri: 'http://jsonplaceholder.typicode.com',
92
- headers: {
93
- Accept: 'application/json'
94
- },
95
- request_handler: RequestHandler.new,
96
- response_handler: ResponseHandler.new
97
- })
98
- configuration.register_relation(Users)
99
- container = ROM.container(configuration)
100
-
101
- container.relation(:users).by_id(1).to_a
102
- # => GET http://jsonplaceholder.typicode.com/users/1 [ Accept: application/json ]
103
- ```
104
-
105
- ### Extending
106
-
107
- ```ruby
108
- require 'inflecto'
109
- require 'json'
110
- require 'uri'
111
- require 'net/http'
112
-
113
- module ROM
114
- module MyAdapter
115
- class Dataset < ROM::HTTP::Dataset
116
- configure do |config|
117
- config.default_request_handler = ->(dataset) do
118
- uri = dataset.uri
119
-
120
- http = Net::HTTP.new(uri.host, uri.port)
121
- request_klass = Net::HTTP.const_get(Inflecto.classify(dataset.request_method))
122
-
123
- request = request_klass.new(uri.request_uri)
124
- dataset.headers.each_with_object(request) do |(header, value), request|
125
- request[header.to_s] = value
126
- end
127
-
128
- response = http.request(request)
129
- end
130
-
131
- config.default_response_handler = ->(response, dataset) do
132
- if %i(post put patch).include?(dataset.request_method)
133
- JSON.parse(response.body, symbolize_names: true)
134
- else
135
- Array([JSON.parse(response.body, symbolize_names: true)]).flatten
136
- end
137
- end
138
- end
139
- end
140
-
141
- class Gateway < ROM::HTTP::Gateway; end
142
-
143
- class Relation < ROM::HTTP::Relation
144
- adapter :my_adapter
145
- end
146
-
147
- module Commands
148
- class Create < ROM::HTTP::Commands::Create
149
- adapter :my_adapter
150
- end
151
-
152
- class Update < ROM::HTTP::Commands::Update
153
- adapter :my_adapter
154
- end
155
-
156
- class Delete < ROM::HTTP::Commands::Delete
157
- adapter :my_adapter
158
- end
159
- end
160
- end
161
- end
162
-
163
- ROM.register_adapter(:my_adapter, ROM::MyAdapter)
164
-
165
- configuration = ROM::Configuration.new(:my_adapter, {
166
- uri: 'http://jsonplaceholder.typicode.com',
167
- headers: {
168
- Accept: 'application/json'
169
- }
170
- })
171
-
172
- class Users < ROM::Relation[:my_adapter]
173
- schema(:users) do
174
- attribute :id, ROM::Types::Integer
175
- attribute :name, ROM::Types::String
176
- attribute :username, ROM::Types::String
177
- attribute :email, ROM::Types::String
178
- attribute :phone, ROM::Types::String
179
- attribute :website, ROM::Types::String
180
- end
181
-
182
- def by_id(id)
183
- with_path(id.to_s)
184
- end
185
- end
186
-
187
- configuration.register_relation(Users)
188
- container = ROM.container(configuration)
189
-
190
- container.relation(:users).by_id(1).to_a
191
- # => GET http://jsonplaceholder.typicode.com/users/1 [ Accept: application/json ]
192
- ```
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rom/associations/many_to_many"
4
+
5
+ module ROM
6
+ module HTTP
7
+ module Associations
8
+ class ManyToMany < ROM::Associations::ManyToMany
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rom/associations/many_to_one"
4
+
5
+ module ROM
6
+ module HTTP
7
+ module Associations
8
+ # ManyToOne implementation
9
+ class ManyToOne < ROM::Associations::ManyToOne
10
+ def call(target: self.target)
11
+ raise MissingAssociationViewError, "must override view" unless view
12
+
13
+ schema = target.schema.qualified
14
+ relation = target
15
+ apply_view(schema, relation)
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rom/associations/one_to_many"
4
+
5
+ module ROM
6
+ module HTTP
7
+ module Associations
8
+ # OneToMany implementation
9
+ class OneToMany < ROM::Associations::OneToMany
10
+ def call(target: self.target)
11
+ raise MissingAssociationViewError, "must override view" unless view
12
+
13
+ schema = target.schema.qualified
14
+ relation = target
15
+ apply_view(schema, relation)
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rom/http/associations/one_to_many"
4
+
5
+ module ROM
6
+ module HTTP
7
+ module Associations
8
+ class OneToOne < OneToMany
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rom/http/associations/many_to_many"
4
+ require "rom/http/associations/one_to_many"
5
+ require "rom/http/associations/many_to_one"
6
+ require "rom/http/associations/one_to_one"
7
+
8
+ module ROM
9
+ module HTTP
10
+ module Associations
11
+ class MissingAssociationViewError < Error; end
12
+ end
13
+ end
14
+ end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'rom/attribute'
3
+ require "rom/attribute"
4
4
 
5
5
  module ROM
6
6
  module HTTP
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'rom/commands'
4
- require 'rom/http/commands/create'
5
- require 'rom/http/commands/update'
6
- require 'rom/http/commands/delete'
3
+ require "rom/commands"
4
+ require "rom/http/commands/create"
5
+ require "rom/http/commands/update"
6
+ require "rom/http/commands/delete"
@@ -1,15 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'uri'
3
+ require "uri"
4
4
 
5
- require 'dry/configurable'
6
- require 'dry/core/deprecations'
5
+ require "dry/configurable"
6
+ require "dry/core/deprecations"
7
7
 
8
- require 'rom/support/memoizable'
9
- require 'rom/constants'
10
- require 'rom/initializer'
11
- require 'rom/http/types'
12
- require 'rom/http/transformer'
8
+ require "rom/support/memoizable"
9
+ require "rom/constants"
10
+ require "rom/initializer"
11
+ require "rom/http/types"
12
+ require "rom/http/transformer"
13
13
 
14
14
  module ROM
15
15
  module HTTP
@@ -22,7 +22,7 @@ module ROM
22
22
  #
23
23
  # @api public
24
24
  class Dataset
25
- PATH_SEPARATOR = '/'.freeze
25
+ PATH_SEPARATOR = "/"
26
26
 
27
27
  extend Dry::Configurable
28
28
  extend ROM::Initializer
@@ -59,19 +59,19 @@ module ROM
59
59
  # MyDataset.new(uri: "http://localhost").response_handler # MyResponseHandler
60
60
  setting :default_response_handler, reader: true
61
61
 
62
- # @!method self.param_encoder
63
- # Return configured param encoder
62
+ # @!method self.query_param_encoder
63
+ # Return configured query param encoder
64
64
  #
65
65
  # @example
66
66
  # class MyDataset < ROM::HTTP::Dataset
67
67
  # configure do |config|
68
- # config.param_encoder = MyParamEncoder
68
+ # config.query_param_encoder = MyParamEncoder
69
69
  # end
70
70
  # end
71
71
  #
72
- # MyDataset.param_encoder # MyParamEncoder
73
- # MyDataset.new(uri: "http://localhost").param_encoder # MyParamEncoder
74
- setting :param_encoder, URI.method(:encode_www_form), reader: true
72
+ # MyDataset.query_param_encoder # MyParamEncoder
73
+ # MyDataset.new(uri: "http://localhost").query_param_encoder # MyParamEncoder
74
+ setting :query_param_encoder, default: URI.method(:encode_www_form), reader: true
75
75
 
76
76
  # @!attribute [r] request_handler
77
77
  # @return [Object]
@@ -98,10 +98,15 @@ module ROM
98
98
  # @api public
99
99
  option :path, type: Types::Path, default: proc { EMPTY_STRING }
100
100
 
101
- # @!attribute [r] params
101
+ # @!attribute [r] query_params
102
102
  # @return [Hash]
103
103
  # @api public
104
- option :params, type: Types::Hash, default: proc { EMPTY_HASH }
104
+ option :query_params, type: Types::Hash, default: proc { EMPTY_HASH }
105
+
106
+ # @!attribute [r] body_params
107
+ # @return [Hash]
108
+ # @api public
109
+ option :body_params, type: Types::Hash, default: proc { EMPTY_HASH }
105
110
 
106
111
  # @!attribute [r] headers
107
112
  # @return [Hash]
@@ -111,7 +116,7 @@ module ROM
111
116
  # @!attribute [r] headers
112
117
  # @return [Hash]
113
118
  # @api public
114
- option :param_encoder, default: proc { self.class.param_encoder }
119
+ option :query_param_encoder, default: proc { self.class.query_param_encoder }
115
120
 
116
121
  # @!attribute [r] uri
117
122
  # @return [String]
@@ -126,8 +131,8 @@ module ROM
126
131
  def uri
127
132
  uri = URI(join_path(super, path))
128
133
 
129
- if get? && params.any?
130
- uri.query = param_encoder.call(params)
134
+ if query_params.any?
135
+ uri.query = query_param_encoder.call(query_params)
131
136
  end
132
137
 
133
138
  uri
@@ -239,7 +244,7 @@ module ROM
239
244
  #
240
245
  # @api public
241
246
  def with_options(opts)
242
- __new__(options.merge(opts))
247
+ __new__(**options.merge(opts))
243
248
  end
244
249
 
245
250
  # Return a new dataset with a different base path
@@ -301,36 +306,70 @@ module ROM
301
306
  with_options(request_method: request_method)
302
307
  end
303
308
 
304
- # Return a new dataset with replaced request parameters
309
+ # Return a new dataset with replaced request query parameters
310
+ #
311
+ # @param [Hash] query_params the new request query parameters
312
+ #
313
+ # @example
314
+ # users = Dataset.new(query_params: { uid: 33 })
315
+ # users.with_query_params(login: 'jdoe').query_params
316
+ # # => { :login => 'jdoe' }
317
+ #
318
+ # @return [Dataset]
319
+ #
320
+ # @api public
321
+ def with_query_params(query_params)
322
+ with_options(query_params: query_params)
323
+ end
324
+
325
+ # Return a new dataset with merged request query parameters
326
+ #
327
+ # @param [Hash] query_params the new request query parameters to add
328
+ #
329
+ # @example
330
+ # users = Dataset.new(query_params: { uid: 33 })
331
+ # users.add_query_params(login: 'jdoe').query_params
332
+ # # => { uid: 33, :login => 'jdoe' }
333
+ #
334
+ # @return [Dataset]
335
+ #
336
+ # @api public
337
+ def add_query_params(new_query_params)
338
+ with_options(query_params: ::ROM::HTTP::Transformer[:deep_merge][query_params,
339
+ new_query_params])
340
+ end
341
+
342
+ # Return a new dataset with replaced request body parameters
305
343
  #
306
- # @param [Hash] params the new request parameters
344
+ # @param [Hash] body_params the new request body parameters
307
345
  #
308
346
  # @example
309
- # users = Dataset.new(params: { uid: 33 })
310
- # users.with_params(login: 'jdoe').params
347
+ # users = Dataset.new(body_params: { uid: 33 })
348
+ # users.with_body_params(login: 'jdoe').body_params
311
349
  # # => { :login => 'jdoe' }
312
350
  #
313
351
  # @return [Dataset]
314
352
  #
315
353
  # @api public
316
- def with_params(params)
317
- with_options(params: params)
354
+ def with_body_params(body_params)
355
+ with_options(body_params: body_params)
318
356
  end
319
357
 
320
- # Return a new dataset with merged request parameters
358
+ # Return a new dataset with merged request body parameters
321
359
  #
322
- # @param [Hash] params the new request parameters to add
360
+ # @param [Hash] body_params the new request body parameters to add
323
361
  #
324
362
  # @example
325
- # users = Dataset.new(params: { uid: 33 })
326
- # users.add_params(login: 'jdoe').params
363
+ # users = Dataset.new(body_params: { uid: 33 })
364
+ # users.add_body_params(login: 'jdoe').body_params
327
365
  # # => { uid: 33, :login => 'jdoe' }
328
366
  #
329
367
  # @return [Dataset]
330
368
  #
331
369
  # @api public
332
- def add_params(new_params)
333
- with_options(params: ::ROM::HTTP::Transformer[:deep_merge][params, new_params])
370
+ def add_body_params(new_body_params)
371
+ with_options(body_params: ::ROM::HTTP::Transformer[:deep_merge][body_params,
372
+ new_body_params])
334
373
  end
335
374
 
336
375
  # Iterate over each response value
@@ -343,29 +382,36 @@ module ROM
343
382
  # @api public
344
383
  def each(&block)
345
384
  return to_enum unless block_given?
385
+
346
386
  response.each(&block)
347
387
  end
348
388
 
349
389
  # Perform an insert over HTTP Post
350
390
  #
351
- # @params [Hash] params The request parameters to send
391
+ # @param [Hash] attributes the attributes to insert
352
392
  #
353
393
  # @return [Array<Hash>]
354
394
  #
355
395
  # @api public
356
- def insert(params)
357
- with_options(request_method: :post, params: params).response
396
+ def insert(attributes)
397
+ with_options(
398
+ request_method: :post,
399
+ body_params: attributes
400
+ ).response
358
401
  end
359
402
 
360
403
  # Perform an update over HTTP Put
361
404
  #
362
- # @params [Hash] params The request parameters to send
405
+ # @param [Hash] attributes the attributes to update
363
406
  #
364
407
  # @return [Array<Hash>]
365
408
  #
366
409
  # @api public
367
- def update(params)
368
- with_options(request_method: :put, params: params).response
410
+ def update(attributes)
411
+ with_options(
412
+ request_method: :put,
413
+ body_params: attributes
414
+ ).response
369
415
  end
370
416
 
371
417
  # Perform an delete over HTTP Delete
@@ -392,8 +438,8 @@ module ROM
392
438
  private
393
439
 
394
440
  # @api private
395
- def __new__(*args, &block)
396
- self.class.new(*args, &block)
441
+ def __new__(*args, **kwargs, &block)
442
+ self.class.new(*args, **kwargs, &block)
397
443
  end
398
444
 
399
445
  # @api private
@@ -1,10 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'concurrent'
3
+ require "concurrent"
4
4
 
5
- require 'rom/http/dataset'
6
- require 'rom/http/handlers'
7
- require 'rom/http/mapper_compiler'
5
+ require "rom/http/dataset"
6
+ require "rom/http/handlers"
7
+ require "rom/http/mapper_compiler"
8
8
 
9
9
  module ROM
10
10
  module HTTP
@@ -58,7 +58,7 @@ module ROM
58
58
  #
59
59
  # @api public
60
60
  def dataset(name)
61
- datasets[name] = dataset_class.new(dataset_options(name))
61
+ datasets[name] = dataset_class.new(**dataset_options(name))
62
62
  end
63
63
 
64
64
  # Check if dataset exists
@@ -106,12 +106,12 @@ module ROM
106
106
 
107
107
  # @api private
108
108
  def uri
109
- config.fetch(:uri) { fail Error, '+uri+ configuration missing' }
109
+ config.fetch(:uri) { raise Error, "+uri+ configuration missing" }
110
110
  end
111
111
 
112
112
  # @api private
113
113
  def namespace
114
- self.class.to_s[/(.*)(?=::)/].split('::').inject(::Object) do |constant, const_name|
114
+ self.class.to_s[/(.*)(?=::)/].split("::").inject(::Object) do |constant, const_name|
115
115
  constant.const_get(const_name)
116
116
  end
117
117
  end
@@ -1,10 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'uri'
4
- require 'net/http'
5
- require 'json'
3
+ require "uri"
4
+ require "net/http"
5
+ require "json"
6
6
 
7
- require 'rom/support/inflector'
7
+ require "rom/support/inflector"
8
8
 
9
9
  module ROM
10
10
  module HTTP
@@ -24,13 +24,10 @@ module ROM
24
24
  #
25
25
  # @api public
26
26
  def self.call(dataset)
27
- uri = URI(dataset.uri)
28
-
29
- uri.path = dataset.absolute_path
30
- uri.query = URI.encode_www_form(dataset.params)
27
+ uri = dataset.uri
31
28
 
32
29
  http = Net::HTTP.new(uri.host, uri.port)
33
- http.use_ssl = true if uri.scheme.eql?('https')
30
+ http.use_ssl = true if uri.scheme.eql?("https")
34
31
 
35
32
  request_class = Net::HTTP.const_get(ROM::Inflector.classify(dataset.request_method))
36
33
 
@@ -40,6 +37,8 @@ module ROM
40
37
  request[header.to_s] = value
41
38
  end
42
39
 
40
+ request.body = JSON.dump(dataset.body_params) if dataset.body_params.any?
41
+
43
42
  http.request(request)
44
43
  end
45
44
  end
@@ -56,7 +55,7 @@ module ROM
56
55
  # @return [Array<Hash>]
57
56
  #
58
57
  # @api public
59
- def self.call(response, dataset)
58
+ def self.call(response, _dataset)
60
59
  Array([JSON.parse(response.body)]).flatten(1)
61
60
  end
62
61
  end
@@ -1,4 +1,6 @@
1
- require 'rom/http/handlers/json'
1
+ # frozen_string_literal: true
2
+
3
+ require "rom/http/handlers/json"
2
4
 
3
5
  module ROM
4
6
  module HTTP
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'rom/mapper_compiler'
3
+ require "rom/mapper_compiler"
4
4
 
5
5
  module ROM
6
6
  module HTTP
@@ -1,11 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'rom/initializer'
3
+ require "rom/initializer"
4
4
 
5
- require 'rom/http/types'
6
- require 'rom/http/attribute'
7
- require 'rom/http/schema'
8
- require 'rom/http/schema/dsl'
5
+ require "rom/http/types"
6
+ require "rom/http/attribute"
7
+ require "rom/http/schema"
8
+ require "rom/http/schema/dsl"
9
9
 
10
10
  module ROM
11
11
  module HTTP
@@ -24,7 +24,8 @@ module ROM
24
24
 
25
25
  forward :with_headers, :add_header, :with_options,
26
26
  :with_base_path, :with_path, :append_path,
27
- :with_request_method, :with_params, :add_params
27
+ :with_request_method, :with_query_params, :add_query_params,
28
+ :with_body_params, :add_body_params
28
29
 
29
30
  def primary_key
30
31
  schema.primary_key_name
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'rom/schema/dsl'
3
+ require "rom/schema/dsl"
4
4
 
5
5
  module ROM
6
6
  module HTTP
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'rom/schema'
4
- require 'rom/http/types'
3
+ require "rom/schema"
4
+ require "rom/http/types"
5
5
 
6
6
  module ROM
7
7
  module HTTP
@@ -15,6 +15,26 @@ module ROM
15
15
  .schema(map { |attr| [attr.key, attr.to_read_type] }.to_h)
16
16
  .with_key_transform(&:to_sym)
17
17
  end
18
+
19
+ # To maintain compatibility with other adapters
20
+ #
21
+ # @api private
22
+ def qualified
23
+ self
24
+ end
25
+
26
+ # Internal hook used during setup process
27
+ #
28
+ # @see Schema#finalize_associations!
29
+ #
30
+ # @api private
31
+ def finalize_associations!(relations:)
32
+ super do
33
+ associations.map do |definition|
34
+ HTTP::Associations.const_get(definition.type).new(definition, relations)
35
+ end
36
+ end
37
+ end
18
38
  end
19
39
  end
20
40
  end
@@ -1,13 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'rom/types'
3
+ require "rom/types"
4
4
 
5
5
  module ROM
6
6
  module HTTP
7
7
  module Types
8
8
  include ROM::Types
9
9
 
10
- Path = Coercible::String.constructor { |s| s.sub(%r{\A/}, '') }
10
+ Path = Coercible::String.constructor { |s| s.sub(%r{\A/}, "") }
11
11
  end
12
12
  end
13
13
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module ROM
4
4
  module HTTP
5
- VERSION = '0.8.0'.freeze
5
+ VERSION = "0.9.0"
6
6
  end
7
7
  end
data/lib/rom/http.rb CHANGED
@@ -1,10 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'rom'
4
- require 'rom/http/error'
5
- require 'rom/http/commands'
6
- require 'rom/http/gateway'
7
- require 'rom/http/relation'
8
- require 'rom/http/version'
3
+ require "rom"
4
+ require "rom/http/error"
5
+ require "rom/http/commands"
6
+ require "rom/http/associations"
7
+ require "rom/http/gateway"
8
+ require "rom/http/relation"
9
+ require "rom/http/version"
9
10
 
10
11
  ROM.register_adapter(:http, ROM::HTTP)
data/lib/rom-http.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'rom/http'
3
+ require "rom/http"
metadata CHANGED
@@ -1,16 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rom-http
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.0
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Piotr Solnica
8
8
  - Andy Holland
9
9
  - Chris Flipse
10
- autorequire:
10
+ autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2019-04-29 00:00:00.000000000 Z
13
+ date: 2022-09-27 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: concurrent-ruby
@@ -41,7 +41,7 @@ dependencies:
41
41
  - !ruby/object:Gem::Version
42
42
  version: '2.6'
43
43
  - !ruby/object:Gem::Dependency
44
- name: rom-core
44
+ name: rom
45
45
  requirement: !ruby/object:Gem::Requirement
46
46
  requirements:
47
47
  - - "~>"
@@ -94,70 +94,14 @@ dependencies:
94
94
  requirements:
95
95
  - - "~>"
96
96
  - !ruby/object:Gem::Version
97
- version: '0.6'
97
+ version: '0.13'
98
98
  type: :runtime
99
99
  prerelease: false
100
100
  version_requirements: !ruby/object:Gem::Requirement
101
101
  requirements:
102
102
  - - "~>"
103
103
  - !ruby/object:Gem::Version
104
- version: '0.6'
105
- - !ruby/object:Gem::Dependency
106
- name: bundler
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'
119
- - !ruby/object:Gem::Dependency
120
- name: rspec
121
- requirement: !ruby/object:Gem::Requirement
122
- requirements:
123
- - - "~>"
124
- - !ruby/object:Gem::Version
125
- version: '3.1'
126
- type: :development
127
- prerelease: false
128
- version_requirements: !ruby/object:Gem::Requirement
129
- requirements:
130
- - - "~>"
131
- - !ruby/object:Gem::Version
132
- version: '3.1'
133
- - !ruby/object:Gem::Dependency
134
- name: rspec-its
135
- requirement: !ruby/object:Gem::Requirement
136
- requirements:
137
- - - ">="
138
- - !ruby/object:Gem::Version
139
- version: '0'
140
- type: :development
141
- prerelease: false
142
- version_requirements: !ruby/object:Gem::Requirement
143
- requirements:
144
- - - ">="
145
- - !ruby/object:Gem::Version
146
- version: '0'
147
- - !ruby/object:Gem::Dependency
148
- name: rake
149
- requirement: !ruby/object:Gem::Requirement
150
- requirements:
151
- - - "~>"
152
- - !ruby/object:Gem::Version
153
- version: '10.0'
154
- type: :development
155
- prerelease: false
156
- version_requirements: !ruby/object:Gem::Requirement
157
- requirements:
158
- - - "~>"
159
- - !ruby/object:Gem::Version
160
- version: '10.0'
104
+ version: '0.13'
161
105
  description: HTTP support for ROM
162
106
  email:
163
107
  - piotr.solnica@gmail.com
@@ -168,10 +112,14 @@ extensions: []
168
112
  extra_rdoc_files: []
169
113
  files:
170
114
  - CHANGELOG.md
171
- - LICENSE.txt
172
115
  - README.md
173
116
  - lib/rom-http.rb
174
117
  - lib/rom/http.rb
118
+ - lib/rom/http/associations.rb
119
+ - lib/rom/http/associations/many_to_many.rb
120
+ - lib/rom/http/associations/many_to_one.rb
121
+ - lib/rom/http/associations/one_to_many.rb
122
+ - lib/rom/http/associations/one_to_one.rb
175
123
  - lib/rom/http/attribute.rb
176
124
  - lib/rom/http/commands.rb
177
125
  - lib/rom/http/commands/create.rb
@@ -193,7 +141,7 @@ homepage: https://rom-rb.org
193
141
  licenses:
194
142
  - MIT
195
143
  metadata: {}
196
- post_install_message:
144
+ post_install_message:
197
145
  rdoc_options: []
198
146
  require_paths:
199
147
  - lib
@@ -201,15 +149,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
201
149
  requirements:
202
150
  - - ">="
203
151
  - !ruby/object:Gem::Version
204
- version: 2.4.0
152
+ version: 2.7.0
205
153
  required_rubygems_version: !ruby/object:Gem::Requirement
206
154
  requirements:
207
155
  - - ">="
208
156
  - !ruby/object:Gem::Version
209
157
  version: '0'
210
158
  requirements: []
211
- rubygems_version: 3.0.3
212
- signing_key:
159
+ rubygems_version: 3.1.2
160
+ signing_key:
213
161
  specification_version: 4
214
162
  summary: HTTP support for ROM
215
163
  test_files: []
data/LICENSE.txt DELETED
@@ -1,22 +0,0 @@
1
- Copyright (c) 2015-2019 rom-rb team
2
-
3
- MIT License
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining
6
- a copy of this software and associated documentation files (the
7
- "Software"), to deal in the Software without restriction, including
8
- without limitation the rights to use, copy, modify, merge, publish,
9
- distribute, sublicense, and/or sell copies of the Software, and to
10
- permit persons to whom the Software is furnished to do so, subject to
11
- the following conditions:
12
-
13
- The above copyright notice and this permission notice shall be
14
- included in all copies or substantial portions of the Software.
15
-
16
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.