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 +4 -4
- data/CHANGELOG.md +67 -38
- data/README.md +15 -178
- data/lib/rom/http/associations/many_to_many.rb +12 -0
- data/lib/rom/http/associations/many_to_one.rb +20 -0
- data/lib/rom/http/associations/one_to_many.rb +20 -0
- data/lib/rom/http/associations/one_to_one.rb +12 -0
- data/lib/rom/http/associations.rb +14 -0
- data/lib/rom/http/attribute.rb +1 -1
- data/lib/rom/http/commands.rb +4 -4
- data/lib/rom/http/dataset.rb +87 -41
- data/lib/rom/http/gateway.rb +7 -7
- data/lib/rom/http/handlers/json.rb +9 -10
- data/lib/rom/http/handlers.rb +3 -1
- data/lib/rom/http/mapper_compiler.rb +1 -1
- data/lib/rom/http/relation.rb +7 -6
- data/lib/rom/http/schema/dsl.rb +1 -1
- data/lib/rom/http/schema.rb +22 -2
- data/lib/rom/http/types.rb +2 -2
- data/lib/rom/http/version.rb +1 -1
- data/lib/rom/http.rb +7 -6
- data/lib/rom-http.rb +1 -1
- metadata +15 -67
- data/LICENSE.txt +0 -22
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f7be96043fffc0399b99aba04e426d0600b8f88e3a90725b6566fab079476b1f
|
4
|
+
data.tar.gz: a94c64dd5d3091a875e2691c6d2d5380ec056b9667d206b43376022ad37be85f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e89e4e48537fbe0a14b770e4069f931f24d8418357adfc179fb1ee72b933b88a82132b7d9abd8baef42b7dd8d1868b8ada2a74f93dae67c06f6b53f3f4265d4f
|
7
|
+
data.tar.gz: 7fbd7ff1d889affbcc4530af2fd8b08f440af929ba3e1efa99f234c454f04c2fd14fdacdd21be6fb8688c21481f6cff35cdc4c61f3527f899cb23ebd1a131656
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,23 @@
|
|
1
|
-
|
1
|
+
<!--- DO NOT EDIT THIS FILE - IT'S AUTOMATICALLY GENERATED VIA DEVTOOLS --->
|
2
2
|
|
3
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
76
|
-
|
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
|
-
|
83
|
-
|
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
|
-
|
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
|
-
|
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
|
-
[
|
3
|
-
[
|
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
|
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
|
-
[![
|
11
|
-
[![
|
12
|
-
[![
|
13
|
-
[![Inline docs](http://inch-ci.org/github/rom-rb/rom-http.svg?branch=
|
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
|
-
##
|
15
|
+
## Links
|
23
16
|
|
24
|
-
|
17
|
+
* [User documentation](http://rom-rb.org/learn/http)
|
18
|
+
* [API documentation](http://rubydoc.info/gems/rom-http)
|
25
19
|
|
26
|
-
|
27
|
-
gem 'rom-http'
|
28
|
-
```
|
20
|
+
## Supported Ruby versions
|
29
21
|
|
30
|
-
|
22
|
+
This library officially supports the following Ruby versions:
|
31
23
|
|
32
|
-
|
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,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,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
|
data/lib/rom/http/attribute.rb
CHANGED
data/lib/rom/http/commands.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
3
|
+
require "rom/commands"
|
4
|
+
require "rom/http/commands/create"
|
5
|
+
require "rom/http/commands/update"
|
6
|
+
require "rom/http/commands/delete"
|
data/lib/rom/http/dataset.rb
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "uri"
|
4
4
|
|
5
|
-
require
|
6
|
-
require
|
5
|
+
require "dry/configurable"
|
6
|
+
require "dry/core/deprecations"
|
7
7
|
|
8
|
-
require
|
9
|
-
require
|
10
|
-
require
|
11
|
-
require
|
12
|
-
require
|
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 =
|
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.
|
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.
|
68
|
+
# config.query_param_encoder = MyParamEncoder
|
69
69
|
# end
|
70
70
|
# end
|
71
71
|
#
|
72
|
-
# MyDataset.
|
73
|
-
# MyDataset.new(uri: "http://localhost").
|
74
|
-
setting :
|
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]
|
101
|
+
# @!attribute [r] query_params
|
102
102
|
# @return [Hash]
|
103
103
|
# @api public
|
104
|
-
option :
|
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 :
|
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
|
130
|
-
uri.query =
|
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]
|
344
|
+
# @param [Hash] body_params the new request body parameters
|
307
345
|
#
|
308
346
|
# @example
|
309
|
-
# users = Dataset.new(
|
310
|
-
# users.
|
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
|
317
|
-
with_options(
|
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]
|
360
|
+
# @param [Hash] body_params the new request body parameters to add
|
323
361
|
#
|
324
362
|
# @example
|
325
|
-
# users = Dataset.new(
|
326
|
-
# users.
|
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
|
333
|
-
with_options(
|
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
|
-
# @
|
391
|
+
# @param [Hash] attributes the attributes to insert
|
352
392
|
#
|
353
393
|
# @return [Array<Hash>]
|
354
394
|
#
|
355
395
|
# @api public
|
356
|
-
def insert(
|
357
|
-
with_options(
|
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
|
-
# @
|
405
|
+
# @param [Hash] attributes the attributes to update
|
363
406
|
#
|
364
407
|
# @return [Array<Hash>]
|
365
408
|
#
|
366
409
|
# @api public
|
367
|
-
def update(
|
368
|
-
with_options(
|
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
|
data/lib/rom/http/gateway.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "concurrent"
|
4
4
|
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
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) {
|
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(
|
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
|
4
|
-
require
|
5
|
-
require
|
3
|
+
require "uri"
|
4
|
+
require "net/http"
|
5
|
+
require "json"
|
6
6
|
|
7
|
-
require
|
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 =
|
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?(
|
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,
|
58
|
+
def self.call(response, _dataset)
|
60
59
|
Array([JSON.parse(response.body)]).flatten(1)
|
61
60
|
end
|
62
61
|
end
|
data/lib/rom/http/handlers.rb
CHANGED
data/lib/rom/http/relation.rb
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "rom/initializer"
|
4
4
|
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
8
|
-
require
|
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, :
|
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
|
data/lib/rom/http/schema/dsl.rb
CHANGED
data/lib/rom/http/schema.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
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
|
data/lib/rom/http/types.rb
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
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
|
data/lib/rom/http/version.rb
CHANGED
data/lib/rom/http.rb
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
8
|
-
require
|
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
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.
|
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:
|
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
|
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.
|
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.
|
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.
|
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.
|
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.
|