rom-http 0.7.0 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/CHANGELOG.md +26 -2
- data/LICENSE.txt +1 -1
- data/README.md +12 -15
- data/lib/rom-http.rb +2 -0
- data/lib/rom/http.rb +2 -0
- data/lib/rom/http/attribute.rb +10 -0
- data/lib/rom/http/commands.rb +2 -0
- data/lib/rom/http/commands/create.rb +2 -0
- data/lib/rom/http/commands/delete.rb +2 -0
- data/lib/rom/http/commands/update.rb +2 -0
- data/lib/rom/http/dataset.rb +152 -101
- data/lib/rom/http/error.rb +2 -0
- data/lib/rom/http/gateway.rb +44 -3
- data/lib/rom/http/handlers.rb +14 -0
- data/lib/rom/http/handlers/json.rb +65 -0
- data/lib/rom/http/mapper_compiler.rb +11 -0
- data/lib/rom/http/relation.rb +19 -64
- data/lib/rom/http/schema.rb +20 -0
- data/lib/rom/http/schema/dsl.rb +12 -0
- data/lib/rom/http/transformer.rb +2 -0
- data/lib/rom/http/types.rb +13 -0
- data/lib/rom/http/version.rb +3 -1
- metadata +32 -59
- data/.gitignore +0 -16
- data/.rspec +0 -3
- data/.rubocop.yml +0 -22
- data/.rubocop_todo.yml +0 -12
- data/.travis.yml +0 -20
- data/Gemfile +0 -24
- data/Rakefile +0 -24
- data/examples/repository_with_combine.rb +0 -154
- data/lib/rom/http/dataset/class_interface.rb +0 -33
- data/rakelib/rubocop.rake +0 -18
- data/rom-http.gemspec +0 -32
- data/spec/integration/abstract/commands/create_spec.rb +0 -119
- data/spec/integration/abstract/commands/delete_spec.rb +0 -52
- data/spec/integration/abstract/commands/update_spec.rb +0 -119
- data/spec/integration/abstract/relation_spec.rb +0 -78
- data/spec/shared/setup.rb +0 -18
- data/spec/shared/users_and_tasks.rb +0 -30
- data/spec/spec_helper.rb +0 -19
- data/spec/support/mutant.rb +0 -10
- data/spec/unit/rom/http/dataset_spec.rb +0 -824
- data/spec/unit/rom/http/gateway_spec.rb +0 -69
- data/spec/unit/rom/http/relation_spec.rb +0 -268
data/lib/rom/http/error.rb
CHANGED
data/lib/rom/http/gateway.rb
CHANGED
@@ -1,5 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'concurrent'
|
4
|
+
|
2
5
|
require 'rom/http/dataset'
|
6
|
+
require 'rom/http/handlers'
|
7
|
+
require 'rom/http/mapper_compiler'
|
3
8
|
|
4
9
|
module ROM
|
5
10
|
module HTTP
|
@@ -19,7 +24,6 @@ module ROM
|
|
19
24
|
adapter :http
|
20
25
|
|
21
26
|
attr_reader :datasets, :config
|
22
|
-
private :datasets, :config
|
23
27
|
|
24
28
|
# HTTP gateway interface
|
25
29
|
#
|
@@ -54,8 +58,7 @@ module ROM
|
|
54
58
|
#
|
55
59
|
# @api public
|
56
60
|
def dataset(name)
|
57
|
-
|
58
|
-
datasets[name] = dataset_klass.new(config.merge(name: name))
|
61
|
+
datasets[name] = dataset_class.new(dataset_options(name))
|
59
62
|
end
|
60
63
|
|
61
64
|
# Check if dataset exists
|
@@ -69,6 +72,44 @@ module ROM
|
|
69
72
|
|
70
73
|
private
|
71
74
|
|
75
|
+
# Return Dataset class
|
76
|
+
#
|
77
|
+
# @return [Class]
|
78
|
+
#
|
79
|
+
# @api private
|
80
|
+
def dataset_class
|
81
|
+
namespace.const_defined?(:Dataset) ? namespace.const_get(:Dataset) : Dataset
|
82
|
+
end
|
83
|
+
|
84
|
+
# Return Dataset options
|
85
|
+
#
|
86
|
+
# @return [Class]
|
87
|
+
#
|
88
|
+
# @api private
|
89
|
+
def dataset_options(name)
|
90
|
+
config.merge(uri: uri, base_path: name, **default_handlers)
|
91
|
+
end
|
92
|
+
|
93
|
+
# Return default handlers registered in Handlers registry
|
94
|
+
#
|
95
|
+
# @return [Hash]
|
96
|
+
#
|
97
|
+
# @api private
|
98
|
+
def default_handlers
|
99
|
+
if handlers_key = config[:handlers]
|
100
|
+
Handlers[handlers_key]
|
101
|
+
.map { |key, value| [:"#{key}_handler", value] }.to_h
|
102
|
+
else
|
103
|
+
EMPTY_HASH
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
# @api private
|
108
|
+
def uri
|
109
|
+
config.fetch(:uri) { fail Error, '+uri+ configuration missing' }
|
110
|
+
end
|
111
|
+
|
112
|
+
# @api private
|
72
113
|
def namespace
|
73
114
|
self.class.to_s[/(.*)(?=::)/].split('::').inject(::Object) do |constant, const_name|
|
74
115
|
constant.const_get(const_name)
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'rom/http/handlers/json'
|
2
|
+
|
3
|
+
module ROM
|
4
|
+
module HTTP
|
5
|
+
# Request/response handler registry
|
6
|
+
#
|
7
|
+
# @api public
|
8
|
+
class Handlers
|
9
|
+
extend Dry::Container::Mixin
|
10
|
+
|
11
|
+
register(:json, request: JSONRequest, response: JSONResponse)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'uri'
|
4
|
+
require 'net/http'
|
5
|
+
require 'json'
|
6
|
+
|
7
|
+
require 'rom/support/inflector'
|
8
|
+
|
9
|
+
module ROM
|
10
|
+
module HTTP
|
11
|
+
# Default request/response handlers
|
12
|
+
#
|
13
|
+
# @api public
|
14
|
+
class Handlers
|
15
|
+
# Default handler for JSON requests
|
16
|
+
#
|
17
|
+
# @api public
|
18
|
+
class JSONRequest
|
19
|
+
# Handle JSON request for the provided dataset
|
20
|
+
#
|
21
|
+
# @param [Dataset] dataset
|
22
|
+
#
|
23
|
+
# @return [Array<Hash>]
|
24
|
+
#
|
25
|
+
# @api public
|
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)
|
31
|
+
|
32
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
33
|
+
http.use_ssl = true if uri.scheme.eql?('https')
|
34
|
+
|
35
|
+
request_class = Net::HTTP.const_get(ROM::Inflector.classify(dataset.request_method))
|
36
|
+
|
37
|
+
request = request_class.new(uri.request_uri)
|
38
|
+
|
39
|
+
dataset.headers.each_with_object(request) do |(header, value), request|
|
40
|
+
request[header.to_s] = value
|
41
|
+
end
|
42
|
+
|
43
|
+
http.request(request)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
# Default handler for JSON responses
|
48
|
+
#
|
49
|
+
# @api public
|
50
|
+
class JSONResponse
|
51
|
+
# Handle JSON responses
|
52
|
+
#
|
53
|
+
# @param [Net::HTTP::Response] response
|
54
|
+
# @param [Dataset] dataset
|
55
|
+
#
|
56
|
+
# @return [Array<Hash>]
|
57
|
+
#
|
58
|
+
# @api public
|
59
|
+
def self.call(response, dataset)
|
60
|
+
Array([JSON.parse(response.body)]).flatten(1)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
data/lib/rom/http/relation.rb
CHANGED
@@ -1,32 +1,33 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'rom/initializer'
|
3
|
-
|
4
|
+
|
5
|
+
require 'rom/http/types'
|
6
|
+
require 'rom/http/attribute'
|
7
|
+
require 'rom/http/schema'
|
8
|
+
require 'rom/http/schema/dsl'
|
4
9
|
|
5
10
|
module ROM
|
6
11
|
module HTTP
|
7
12
|
# HTTP-specific relation extensions
|
8
13
|
#
|
9
14
|
class Relation < ROM::Relation
|
10
|
-
|
11
|
-
extend ::ROM::Initializer
|
12
|
-
include Enumerable
|
15
|
+
include ROM::HTTP
|
13
16
|
|
14
17
|
adapter :http
|
15
18
|
|
16
|
-
|
19
|
+
schema_class HTTP::Schema
|
20
|
+
schema_dsl HTTP::Schema::DSL
|
21
|
+
schema_attr_class HTTP::Attribute
|
22
|
+
|
23
|
+
option :output_schema, default: -> { schema.to_output_hash }
|
17
24
|
|
18
25
|
forward :with_headers, :add_header, :with_options,
|
19
26
|
:with_base_path, :with_path, :append_path,
|
20
27
|
:with_request_method, :with_params, :add_params
|
21
28
|
|
22
29
|
def primary_key
|
23
|
-
|
24
|
-
|
25
|
-
if attribute
|
26
|
-
attribute.alias || attribute.name
|
27
|
-
else
|
28
|
-
:id
|
29
|
-
end
|
30
|
+
schema.primary_key_name
|
30
31
|
end
|
31
32
|
|
32
33
|
def project(*names)
|
@@ -34,7 +35,7 @@ module ROM
|
|
34
35
|
end
|
35
36
|
|
36
37
|
def exclude(*names)
|
37
|
-
with(schema: schema.exclude(*names
|
38
|
+
with(schema: schema.exclude(*names))
|
38
39
|
end
|
39
40
|
|
40
41
|
def rename(mapping)
|
@@ -45,67 +46,21 @@ module ROM
|
|
45
46
|
with(schema: schema.prefix(prefix))
|
46
47
|
end
|
47
48
|
|
48
|
-
def wrap(prefix = dataset.name)
|
49
|
-
with(schema: schema.wrap(prefix))
|
50
|
-
end
|
51
|
-
|
52
|
-
def to_a
|
53
|
-
with_transformation { super }
|
54
|
-
end
|
55
|
-
|
56
49
|
# @see Dataset#insert
|
57
|
-
def insert(*
|
58
|
-
|
50
|
+
def insert(*tuples)
|
51
|
+
dataset.insert(*tuples.map { |t| input_schema[t] })
|
59
52
|
end
|
60
53
|
alias_method :<<, :insert
|
61
54
|
|
62
55
|
# @see Dataset#update
|
63
|
-
def update(*
|
64
|
-
|
56
|
+
def update(*tuples)
|
57
|
+
dataset.update(*tuples.map { |t| input_schema[t] })
|
65
58
|
end
|
66
59
|
|
67
60
|
# @see Dataset#delete
|
68
61
|
def delete
|
69
62
|
dataset.delete
|
70
63
|
end
|
71
|
-
|
72
|
-
private
|
73
|
-
|
74
|
-
def with_transformation
|
75
|
-
tuples = yield
|
76
|
-
|
77
|
-
transformed = with_schema_proc do |proc|
|
78
|
-
transformer_proc[Array([tuples]).flatten(1).map(&proc.method(:call))]
|
79
|
-
end
|
80
|
-
|
81
|
-
tuples.kind_of?(Array) ? transformed : transformed.first
|
82
|
-
end
|
83
|
-
|
84
|
-
def with_schema_proc
|
85
|
-
schema_proc = fetch_or_store(schema) do
|
86
|
-
Types::Coercible::Hash.schema(schema.to_h)
|
87
|
-
end
|
88
|
-
|
89
|
-
yield(schema_proc)
|
90
|
-
end
|
91
|
-
|
92
|
-
def transformer_proc
|
93
|
-
if mapped?
|
94
|
-
transformer[:map_array, transformer[:rename_keys, mapping]]
|
95
|
-
else
|
96
|
-
transformer[:identity]
|
97
|
-
end
|
98
|
-
end
|
99
|
-
|
100
|
-
def mapped?
|
101
|
-
mapping.any?
|
102
|
-
end
|
103
|
-
|
104
|
-
def mapping
|
105
|
-
schema.each_with_object({}) do |attr, mapping|
|
106
|
-
mapping[attr.name] = attr.alias if attr.alias
|
107
|
-
end
|
108
|
-
end
|
109
64
|
end
|
110
65
|
end
|
111
66
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rom/schema'
|
4
|
+
require 'rom/http/types'
|
5
|
+
|
6
|
+
module ROM
|
7
|
+
module HTTP
|
8
|
+
class Schema < ROM::Schema
|
9
|
+
# Customized output hash constructor which symbolizes keys
|
10
|
+
# and optionally applies custom read-type coercions
|
11
|
+
#
|
12
|
+
# @api private
|
13
|
+
def to_output_hash
|
14
|
+
Types::Hash
|
15
|
+
.schema(map { |attr| [attr.key, attr.to_read_type] }.to_h)
|
16
|
+
.with_key_transform(&:to_sym)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/lib/rom/http/transformer.rb
CHANGED
data/lib/rom/http/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rom-http
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Piotr Solnica
|
@@ -10,70 +10,70 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2019-04-29 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: concurrent-ruby
|
17
17
|
requirement: !ruby/object:Gem::Requirement
|
18
18
|
requirements:
|
19
|
-
- - "
|
19
|
+
- - "~>"
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: '
|
21
|
+
version: '1.1'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
25
|
requirements:
|
26
|
-
- - "
|
26
|
+
- - "~>"
|
27
27
|
- !ruby/object:Gem::Version
|
28
|
-
version: '
|
28
|
+
version: '1.1'
|
29
29
|
- !ruby/object:Gem::Dependency
|
30
30
|
name: addressable
|
31
31
|
requirement: !ruby/object:Gem::Requirement
|
32
32
|
requirements:
|
33
|
-
- - "
|
33
|
+
- - "~>"
|
34
34
|
- !ruby/object:Gem::Version
|
35
|
-
version: '
|
35
|
+
version: '2.6'
|
36
36
|
type: :runtime
|
37
37
|
prerelease: false
|
38
38
|
version_requirements: !ruby/object:Gem::Requirement
|
39
39
|
requirements:
|
40
|
-
- - "
|
40
|
+
- - "~>"
|
41
41
|
- !ruby/object:Gem::Version
|
42
|
-
version: '
|
42
|
+
version: '2.6'
|
43
43
|
- !ruby/object:Gem::Dependency
|
44
|
-
name: rom
|
44
|
+
name: rom-core
|
45
45
|
requirement: !ruby/object:Gem::Requirement
|
46
46
|
requirements:
|
47
47
|
- - "~>"
|
48
48
|
- !ruby/object:Gem::Version
|
49
|
-
version: '
|
49
|
+
version: '5.0'
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: 5.0.1
|
50
53
|
type: :runtime
|
51
54
|
prerelease: false
|
52
55
|
version_requirements: !ruby/object:Gem::Requirement
|
53
56
|
requirements:
|
54
57
|
- - "~>"
|
55
58
|
- !ruby/object:Gem::Version
|
56
|
-
version: '
|
59
|
+
version: '5.0'
|
60
|
+
- - ">="
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: 5.0.1
|
57
63
|
- !ruby/object:Gem::Dependency
|
58
64
|
name: dry-core
|
59
65
|
requirement: !ruby/object:Gem::Requirement
|
60
66
|
requirements:
|
61
67
|
- - "~>"
|
62
68
|
- !ruby/object:Gem::Version
|
63
|
-
version: '0.
|
64
|
-
- - ">="
|
65
|
-
- !ruby/object:Gem::Version
|
66
|
-
version: 0.2.3
|
69
|
+
version: '0.4'
|
67
70
|
type: :runtime
|
68
71
|
prerelease: false
|
69
72
|
version_requirements: !ruby/object:Gem::Requirement
|
70
73
|
requirements:
|
71
74
|
- - "~>"
|
72
75
|
- !ruby/object:Gem::Version
|
73
|
-
version: '0.
|
74
|
-
- - ">="
|
75
|
-
- !ruby/object:Gem::Version
|
76
|
-
version: 0.2.3
|
76
|
+
version: '0.4'
|
77
77
|
- !ruby/object:Gem::Dependency
|
78
78
|
name: dry-equalizer
|
79
79
|
requirement: !ruby/object:Gem::Requirement
|
@@ -167,44 +167,29 @@ executables: []
|
|
167
167
|
extensions: []
|
168
168
|
extra_rdoc_files: []
|
169
169
|
files:
|
170
|
-
- ".gitignore"
|
171
|
-
- ".rspec"
|
172
|
-
- ".rubocop.yml"
|
173
|
-
- ".rubocop_todo.yml"
|
174
|
-
- ".travis.yml"
|
175
170
|
- CHANGELOG.md
|
176
|
-
- Gemfile
|
177
171
|
- LICENSE.txt
|
178
172
|
- README.md
|
179
|
-
- Rakefile
|
180
|
-
- examples/repository_with_combine.rb
|
181
173
|
- lib/rom-http.rb
|
182
174
|
- lib/rom/http.rb
|
175
|
+
- lib/rom/http/attribute.rb
|
183
176
|
- lib/rom/http/commands.rb
|
184
177
|
- lib/rom/http/commands/create.rb
|
185
178
|
- lib/rom/http/commands/delete.rb
|
186
179
|
- lib/rom/http/commands/update.rb
|
187
180
|
- lib/rom/http/dataset.rb
|
188
|
-
- lib/rom/http/dataset/class_interface.rb
|
189
181
|
- lib/rom/http/error.rb
|
190
182
|
- lib/rom/http/gateway.rb
|
183
|
+
- lib/rom/http/handlers.rb
|
184
|
+
- lib/rom/http/handlers/json.rb
|
185
|
+
- lib/rom/http/mapper_compiler.rb
|
191
186
|
- lib/rom/http/relation.rb
|
187
|
+
- lib/rom/http/schema.rb
|
188
|
+
- lib/rom/http/schema/dsl.rb
|
192
189
|
- lib/rom/http/transformer.rb
|
190
|
+
- lib/rom/http/types.rb
|
193
191
|
- lib/rom/http/version.rb
|
194
|
-
-
|
195
|
-
- rom-http.gemspec
|
196
|
-
- spec/integration/abstract/commands/create_spec.rb
|
197
|
-
- spec/integration/abstract/commands/delete_spec.rb
|
198
|
-
- spec/integration/abstract/commands/update_spec.rb
|
199
|
-
- spec/integration/abstract/relation_spec.rb
|
200
|
-
- spec/shared/setup.rb
|
201
|
-
- spec/shared/users_and_tasks.rb
|
202
|
-
- spec/spec_helper.rb
|
203
|
-
- spec/support/mutant.rb
|
204
|
-
- spec/unit/rom/http/dataset_spec.rb
|
205
|
-
- spec/unit/rom/http/gateway_spec.rb
|
206
|
-
- spec/unit/rom/http/relation_spec.rb
|
207
|
-
homepage: http://rom-rb.org
|
192
|
+
homepage: https://rom-rb.org
|
208
193
|
licenses:
|
209
194
|
- MIT
|
210
195
|
metadata: {}
|
@@ -216,27 +201,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
216
201
|
requirements:
|
217
202
|
- - ">="
|
218
203
|
- !ruby/object:Gem::Version
|
219
|
-
version:
|
204
|
+
version: 2.4.0
|
220
205
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
221
206
|
requirements:
|
222
207
|
- - ">="
|
223
208
|
- !ruby/object:Gem::Version
|
224
209
|
version: '0'
|
225
210
|
requirements: []
|
226
|
-
|
227
|
-
rubygems_version: 2.6.13
|
211
|
+
rubygems_version: 3.0.3
|
228
212
|
signing_key:
|
229
213
|
specification_version: 4
|
230
214
|
summary: HTTP support for ROM
|
231
|
-
test_files:
|
232
|
-
- spec/integration/abstract/commands/create_spec.rb
|
233
|
-
- spec/integration/abstract/commands/delete_spec.rb
|
234
|
-
- spec/integration/abstract/commands/update_spec.rb
|
235
|
-
- spec/integration/abstract/relation_spec.rb
|
236
|
-
- spec/shared/setup.rb
|
237
|
-
- spec/shared/users_and_tasks.rb
|
238
|
-
- spec/spec_helper.rb
|
239
|
-
- spec/support/mutant.rb
|
240
|
-
- spec/unit/rom/http/dataset_spec.rb
|
241
|
-
- spec/unit/rom/http/gateway_spec.rb
|
242
|
-
- spec/unit/rom/http/relation_spec.rb
|
215
|
+
test_files: []
|