rom-http 0.5.0 → 0.6.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +8 -11
- data/CHANGELOG.md +13 -0
- data/README.md +32 -20
- data/examples/repository_with_combine.rb +154 -0
- data/lib/rom/http/commands/create.rb +0 -1
- data/lib/rom/http/commands/update.rb +0 -1
- data/lib/rom/http/dataset.rb +39 -61
- data/lib/rom/http/error.rb +1 -0
- data/lib/rom/http/gateway.rb +2 -2
- data/lib/rom/http/relation.rb +87 -10
- data/lib/rom/http/transformer.rb +16 -0
- data/lib/rom/http/version.rb +1 -1
- data/rom-http.gemspec +5 -4
- data/spec/integration/abstract/commands/create_spec.rb +12 -4
- data/spec/integration/abstract/commands/delete_spec.rb +7 -1
- data/spec/integration/abstract/commands/update_spec.rb +12 -4
- data/spec/integration/abstract/relation_spec.rb +4 -6
- data/spec/shared/users_and_tasks.rb +6 -2
- data/spec/spec_helper.rb +1 -0
- data/spec/unit/rom/http/dataset_spec.rb +80 -121
- data/spec/unit/rom/http/relation_spec.rb +260 -12
- metadata +40 -25
- data/lib/rom/http/dataset/response_transformers/schemad.rb +0 -30
- data/lib/rom/http/dataset/response_transformers/schemaless.rb +0 -25
- data/lib/rom/http/support/transformations.rb +0 -12
- data/spec/unit/rom/http/dataset/response_transformers/schemad_spec.rb +0 -45
- data/spec/unit/rom/http/dataset/response_transformers/schemaless_spec.rb +0 -39
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e61d4626a34ea84673dc4632b6f1bbdd668e0b8c
|
4
|
+
data.tar.gz: 859e9539a8127ad7c8b7cc2fd6d0904cb734e404
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fd492be4654b12a16194c74f2e0ae3db44f4a456b6d8edf85ead74a8f3581ac3bca6bd2d436a67370502c10d416f75692388832249a0e2e53dc4dc05b238cca6
|
7
|
+
data.tar.gz: 666263147a7e6f534d602d6aa904ae8ed28a35c2307799bd871b8312276419750457d5dce5d92218b0c578cf7c7e3f3bea06a4e0b85b034944d2345a28728131
|
data/.travis.yml
CHANGED
@@ -1,24 +1,21 @@
|
|
1
1
|
language: ruby
|
2
|
-
|
2
|
+
dist: trusty
|
3
|
+
sudo: required
|
3
4
|
cache: bundler
|
4
5
|
bundler_args: --without sql benchmarks console tools
|
5
6
|
script: "bundle exec rake ci"
|
6
7
|
rvm:
|
7
|
-
- 2.
|
8
|
-
- 2.
|
9
|
-
- 2.
|
10
|
-
- rbx-
|
11
|
-
- jruby-9.
|
12
|
-
- ruby-head
|
13
|
-
- jruby-head
|
8
|
+
- 2.2.6
|
9
|
+
- 2.3.3
|
10
|
+
- 2.4.0
|
11
|
+
- rbx-3
|
12
|
+
- jruby-9.1.6.0
|
14
13
|
env:
|
15
14
|
global:
|
16
15
|
- JRUBY_OPTS='--dev -J-Xmx1024M'
|
17
16
|
matrix:
|
18
17
|
allow_failures:
|
19
|
-
- rvm:
|
20
|
-
- rvm: jruby-head
|
21
|
-
- rvm: rbx-2
|
18
|
+
- rvm: rbx-3
|
22
19
|
notifications:
|
23
20
|
webhooks:
|
24
21
|
urls:
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,16 @@
|
|
1
|
+
# v0.6.0 to-be-released
|
2
|
+
# Changed
|
3
|
+
- Make schemas mandatory and use schema API from ROM core (AMHOL)
|
4
|
+
- Generate transformer using schema (AMHOL)
|
5
|
+
- Removed rbx-2 support (solnic)
|
6
|
+
- Add Dataset#base_path and Relation#primary_key (AMHOL)
|
7
|
+
- Updated to work with ROM 3.0.beta (maximderbin)
|
8
|
+
- Removed ruby 2.1 support (maximderbin)
|
9
|
+
- Fix Relation#primary_key when schema defines alias (AMHOL)
|
10
|
+
- Transform keys on insert and update (maximderbin)
|
11
|
+
|
12
|
+
[Compare v0.5.0...v0.6.0](https://github.com/rom-rb/rom-http/compare/v0.5.0...master)
|
13
|
+
|
1
14
|
# v0.5.0 2016-08-08
|
2
15
|
### Changed
|
3
16
|
- Removed ruby 2.0 support
|
data/README.md
CHANGED
@@ -7,7 +7,7 @@
|
|
7
7
|
[rom]: https://github.com/rom-rb/rom
|
8
8
|
|
9
9
|
|
10
|
-
#
|
10
|
+
# rom-http [![Gitter chat](https://badges.gitter.im/rom-rb/chat.svg)][gitter]
|
11
11
|
|
12
12
|
[![Gem Version](https://badge.fury.io/rb/rom-http.svg)][gem]
|
13
13
|
[![Build Status](https://travis-ci.org/rom-rb/rom-http.svg?branch=master)][travis]
|
@@ -45,6 +45,7 @@ See `LICENSE` file.
|
|
45
45
|
## Synopsis
|
46
46
|
|
47
47
|
```ruby
|
48
|
+
require 'inflecto'
|
48
49
|
require 'json'
|
49
50
|
require 'uri'
|
50
51
|
require 'net/http'
|
@@ -52,11 +53,11 @@ require 'net/http'
|
|
52
53
|
class RequestHandler
|
53
54
|
def call(dataset)
|
54
55
|
uri = URI(dataset.uri)
|
55
|
-
uri.path =
|
56
|
+
uri.path = dataset.absolute_path
|
56
57
|
uri.query = URI.encode_www_form(dataset.params)
|
57
58
|
|
58
59
|
http = Net::HTTP.new(uri.host, uri.port)
|
59
|
-
request_klass = Net::HTTP.const_get(
|
60
|
+
request_klass = Net::HTTP.const_get(Inflecto.classify(dataset.request_method))
|
60
61
|
|
61
62
|
request = request_klass.new(uri.request_uri)
|
62
63
|
dataset.headers.each_with_object(request) do |(header, value), request|
|
@@ -69,23 +70,22 @@ end
|
|
69
70
|
|
70
71
|
class ResponseHandler
|
71
72
|
def call(response, dataset)
|
72
|
-
|
73
|
+
if %i(post put patch).include?(dataset.request_method)
|
74
|
+
JSON.parse(response.body, symbolize_names: true)
|
75
|
+
else
|
76
|
+
Array([JSON.parse(response.body, symbolize_names: true)]).flatten
|
77
|
+
end
|
73
78
|
end
|
74
79
|
end
|
75
80
|
|
76
81
|
class Users < ROM::Relation[:http]
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
attribute
|
84
|
-
attribute 'name', 'strict.string'
|
85
|
-
attribute 'username', 'strict.string'
|
86
|
-
attribute 'email', 'strict.string'
|
87
|
-
attribute 'phone', 'strict.string'
|
88
|
-
attribute 'website', 'strict.string'
|
82
|
+
schema(:users) do
|
83
|
+
attribute :id, ROM::Types::Int
|
84
|
+
attribute :name, ROM::Types::String
|
85
|
+
attribute :username, ROM::Types::String
|
86
|
+
attribute :email, ROM::Types::String
|
87
|
+
attribute :phone, ROM::Types::String
|
88
|
+
attribute :website, ROM::Types::String
|
89
89
|
end
|
90
90
|
|
91
91
|
def by_id(id)
|
@@ -111,6 +111,7 @@ container.relation(:users).by_id(1).to_a
|
|
111
111
|
### Extending
|
112
112
|
|
113
113
|
```ruby
|
114
|
+
require 'inflecto'
|
114
115
|
require 'json'
|
115
116
|
require 'uri'
|
116
117
|
require 'net/http'
|
@@ -120,11 +121,11 @@ module ROM
|
|
120
121
|
class Dataset < ROM::HTTP::Dataset
|
121
122
|
default_request_handler ->(dataset) do
|
122
123
|
uri = URI(dataset.uri)
|
123
|
-
uri.path =
|
124
|
+
uri.path = dataset.absolute_path
|
124
125
|
uri.query = URI.encode_www_form(dataset.params)
|
125
126
|
|
126
127
|
http = Net::HTTP.new(uri.host, uri.port)
|
127
|
-
request_klass = Net::HTTP.const_get(
|
128
|
+
request_klass = Net::HTTP.const_get(Inflecto.classify(dataset.request_method))
|
128
129
|
|
129
130
|
request = request_klass.new(uri.request_uri)
|
130
131
|
dataset.headers.each_with_object(request) do |(header, value), request|
|
@@ -135,7 +136,11 @@ module ROM
|
|
135
136
|
end
|
136
137
|
|
137
138
|
default_response_handler ->(response, dataset) do
|
138
|
-
|
139
|
+
if %i(post put patch).include?(dataset.request_method)
|
140
|
+
JSON.parse(response.body, symbolize_names: true)
|
141
|
+
else
|
142
|
+
Array([JSON.parse(response.body, symbolize_names: true)]).flatten
|
143
|
+
end
|
139
144
|
end
|
140
145
|
end
|
141
146
|
|
@@ -171,7 +176,14 @@ configuration = ROM::Configuration.new(:my_adapter, {
|
|
171
176
|
})
|
172
177
|
|
173
178
|
class Users < ROM::Relation[:my_adapter]
|
174
|
-
|
179
|
+
schema(:users) do
|
180
|
+
attribute :id, ROM::Types::Int
|
181
|
+
attribute :name, ROM::Types::String
|
182
|
+
attribute :username, ROM::Types::String
|
183
|
+
attribute :email, ROM::Types::String
|
184
|
+
attribute :phone, ROM::Types::String
|
185
|
+
attribute :website, ROM::Types::String
|
186
|
+
end
|
175
187
|
|
176
188
|
def by_id(id)
|
177
189
|
with_path(id.to_s)
|
@@ -0,0 +1,154 @@
|
|
1
|
+
require 'inflecto'
|
2
|
+
require 'json'
|
3
|
+
require 'uri'
|
4
|
+
require 'net/http'
|
5
|
+
require 'rom-repository'
|
6
|
+
|
7
|
+
class RequestHandler
|
8
|
+
def call(dataset)
|
9
|
+
uri = URI(dataset.uri)
|
10
|
+
uri.path = dataset.absolute_path
|
11
|
+
uri.query = URI.encode_www_form(dataset.params)
|
12
|
+
|
13
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
14
|
+
request_klass = Net::HTTP.const_get(Inflecto.classify(dataset.request_method))
|
15
|
+
|
16
|
+
request = request_klass.new(uri.request_uri)
|
17
|
+
dataset.headers.each_with_object(request) do |(header, value), request|
|
18
|
+
request[header.to_s] = value
|
19
|
+
end
|
20
|
+
|
21
|
+
response = http.request(request)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
class ResponseHandler
|
26
|
+
def call(response, dataset)
|
27
|
+
if %i(post put patch).include?(dataset.request_method)
|
28
|
+
JSON.parse(response.body, symbolize_names: true)
|
29
|
+
else
|
30
|
+
Array([JSON.parse(response.body, symbolize_names: true)]).flatten
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
class Users < ROM::Relation[:http]
|
36
|
+
schema(:users) do
|
37
|
+
attribute :id, ROM::Types::Int.meta(primary_key: true)
|
38
|
+
attribute :name, ROM::Types::String
|
39
|
+
attribute :username, ROM::Types::String
|
40
|
+
attribute :email, ROM::Types::String
|
41
|
+
attribute :phone, ROM::Types::String
|
42
|
+
attribute :website, ROM::Types::String
|
43
|
+
end
|
44
|
+
|
45
|
+
def by_id(id)
|
46
|
+
with_path(id.to_s)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
class Posts < ROM::Relation[:http]
|
51
|
+
schema(:posts) do
|
52
|
+
attribute :id, ROM::Types::Int.meta(primary_key: true)
|
53
|
+
attribute :userId, ROM::Types::Int.meta(alias: :user_id)
|
54
|
+
attribute :title, ROM::Types::String
|
55
|
+
attribute :body, ROM::Types::String
|
56
|
+
end
|
57
|
+
|
58
|
+
def by_id(id)
|
59
|
+
with_path(id.to_s)
|
60
|
+
end
|
61
|
+
|
62
|
+
def for_user(user)
|
63
|
+
with_options(
|
64
|
+
base_path: 'users',
|
65
|
+
path: "#{user.first[:id]}/posts"
|
66
|
+
)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
class UserRepository < ROM::Repository[:users]
|
71
|
+
relations :posts
|
72
|
+
|
73
|
+
def find(id)
|
74
|
+
users.by_id(id).first
|
75
|
+
end
|
76
|
+
|
77
|
+
def find_with_posts(user_id)
|
78
|
+
users.by_id(user_id).combine_children(many: posts.for_user).first
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
configuration = ROM::Configuration.new(:http, {
|
83
|
+
uri: 'http://jsonplaceholder.typicode.com',
|
84
|
+
headers: {
|
85
|
+
Accept: 'application/json'
|
86
|
+
},
|
87
|
+
request_handler: RequestHandler.new,
|
88
|
+
response_handler: ResponseHandler.new
|
89
|
+
})
|
90
|
+
configuration.register_relation(Users)
|
91
|
+
configuration.register_relation(Posts)
|
92
|
+
container = ROM.container(configuration)
|
93
|
+
|
94
|
+
UserRepository.new(container).find_with_posts(1)
|
95
|
+
# =>
|
96
|
+
# #<ROM::Struct[User]
|
97
|
+
# id=1
|
98
|
+
# name="Leanne Graham"
|
99
|
+
# username="Bret"
|
100
|
+
# email="Sincere@april.biz"
|
101
|
+
# phone="1-770-736-8031 x56442"
|
102
|
+
# website="hildegard.org"
|
103
|
+
# posts=[
|
104
|
+
# #<ROM::Struct[Post]
|
105
|
+
# id=1
|
106
|
+
# user_id=1
|
107
|
+
# title="sunt aut facere repellat provident occaecati excepturi optio reprehenderit"
|
108
|
+
# body="quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto">,
|
109
|
+
# #<ROM::Struct[Post]
|
110
|
+
# id=2
|
111
|
+
# user_id=1
|
112
|
+
# title="qui est esse"
|
113
|
+
# body="est rerum tempore vitae\nsequi sint nihil reprehenderit dolor beatae ea dolores neque\nfugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis\nqui aperiam non debitis possimus qui neque nisi nulla">,
|
114
|
+
# #<ROM::Struct[Post]
|
115
|
+
# id=3
|
116
|
+
# user_id=1
|
117
|
+
# title="ea molestias quasi exercitationem repellat qui ipsa sit aut"
|
118
|
+
# body="et iusto sed quo iure\nvoluptatem occaecati omnis eligendi aut ad\nvoluptatem doloribus vel accusantium quis pariatur\nmolestiae porro eius odio et labore et velit aut">,
|
119
|
+
# #<ROM::Struct[Post]
|
120
|
+
# id=4
|
121
|
+
# user_id=1
|
122
|
+
# title="eum et est occaecati"
|
123
|
+
# body="ullam et saepe reiciendis voluptatem adipisci\nsit amet autem assumenda provident rerum culpa\nquis hic commodi nesciunt rem tenetur doloremque ipsam iure\nquis sunt voluptatem rerum illo velit">,
|
124
|
+
# #<ROM::Struct[Post]
|
125
|
+
# id=5
|
126
|
+
# user_id=1
|
127
|
+
# title="nesciunt quas odio"
|
128
|
+
# body="repudiandae veniam quaerat sunt sed\nalias aut fugiat sit autem sed est\nvoluptatem omnis possimus esse voluptatibus quis\nest aut tenetur dolor neque">,
|
129
|
+
# #<ROM::Struct[Post]
|
130
|
+
# id=6
|
131
|
+
# user_id=1
|
132
|
+
# title="dolorem eum magni eos aperiam quia"
|
133
|
+
# body="ut aspernatur corporis harum nihil quis provident sequi\nmollitia nobis aliquid molestiae\nperspiciatis et ea nemo ab reprehenderit accusantium quas\nvoluptate dolores velit et doloremque molestiae">,
|
134
|
+
# #<ROM::Struct[Post]
|
135
|
+
# id=7
|
136
|
+
# user_id=1
|
137
|
+
# title="magnam facilis autem"
|
138
|
+
# body="dolore placeat quibusdam ea quo vitae\nmagni quis enim qui quis quo nemo aut saepe\nquidem repellat excepturi ut quia\nsunt ut sequi eos ea sed quas">,
|
139
|
+
# #<ROM::Struct[Post]
|
140
|
+
# id=8
|
141
|
+
# user_id=1
|
142
|
+
# title="dolorem dolore est ipsam"
|
143
|
+
# body="dignissimos aperiam dolorem qui eum\nfacilis quibusdam animi sint suscipit qui sint possimus cum\nquaerat magni maiores excepturi\nipsam ut commodi dolor voluptatum modi aut vitae">,
|
144
|
+
# #<ROM::Struct[Post]
|
145
|
+
# id=9
|
146
|
+
# user_id=1
|
147
|
+
# title="nesciunt iure omnis dolorem tempora et accusantium"
|
148
|
+
# body="consectetur animi nesciunt iure dolore\nenim quia ad\nveniam autem ut quam aut nobis\net est aut quod aut provident voluptas autem voluptas">,
|
149
|
+
# #<ROM::Struct[Post]
|
150
|
+
# id=10
|
151
|
+
# user_id=1
|
152
|
+
# title="optio molestias id quia eum"
|
153
|
+
# body="quo et expedita modi cum officia vel magni\ndoloribus qui repudiandae\nvero nisi sit\nquos veniam quod sed accusamus veritatis error">
|
154
|
+
# ]>
|
data/lib/rom/http/dataset.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
|
-
require 'rom/
|
2
|
-
require 'rom/http/dataset/response_transformers/schemaless'
|
1
|
+
require 'rom/initializer'
|
3
2
|
|
4
3
|
module ROM
|
5
4
|
module HTTP
|
@@ -9,17 +8,20 @@ module ROM
|
|
9
8
|
#
|
10
9
|
# @api public
|
11
10
|
class Dataset
|
11
|
+
PATH_SEPARATOR = '/'.freeze
|
12
|
+
STRIP_PATH = ->(path) { path.sub(%r{\A/}, '') }.freeze
|
13
|
+
|
12
14
|
include Enumerable
|
13
15
|
include Dry::Equalizer(:config, :options)
|
14
|
-
|
16
|
+
extend ::ROM::Initializer
|
15
17
|
|
16
|
-
|
18
|
+
param :config
|
17
19
|
|
18
|
-
option :
|
19
|
-
option :
|
20
|
-
option :path, type: ::String, default: ''
|
21
|
-
option :params, type: ::Hash, default: {}, reader: true
|
22
|
-
option :headers, type: ::Hash, default: {}
|
20
|
+
option :request_method, type: Types::Symbol, default: proc { :get }, reader: true
|
21
|
+
option :base_path, type: Types::String, default: proc { name }
|
22
|
+
option :path, type: Types::String, default: proc { '' }
|
23
|
+
option :params, type: Types::Hash, default: proc { {} }, reader: true
|
24
|
+
option :headers, type: Types::Hash, default: proc { {} }
|
23
25
|
|
24
26
|
class << self
|
25
27
|
def default_request_handler(handler = Undefined)
|
@@ -33,39 +35,6 @@ module ROM
|
|
33
35
|
end
|
34
36
|
end
|
35
37
|
|
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
|
49
|
-
def initialize(config, options = {})
|
50
|
-
@config = config
|
51
|
-
@response_transformer = ResponseTransformers::Schemaless.new
|
52
|
-
super(options)
|
53
|
-
end
|
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
|
64
|
-
def response_transformer(transformer = Undefined)
|
65
|
-
return @response_transformer if Undefined === transformer
|
66
|
-
@response_transformer = transformer
|
67
|
-
end
|
68
|
-
|
69
38
|
# Return the gateway's URI
|
70
39
|
#
|
71
40
|
# @return [String]
|
@@ -104,6 +73,19 @@ module ROM
|
|
104
73
|
config[:name].to_s
|
105
74
|
end
|
106
75
|
|
76
|
+
# Return the base path
|
77
|
+
#
|
78
|
+
# @example
|
79
|
+
# Dataset.new(config, base_path: '/users').base_path
|
80
|
+
# # => 'users'
|
81
|
+
#
|
82
|
+
# @return [String] the dataset path, without a leading slash
|
83
|
+
#
|
84
|
+
# @api public
|
85
|
+
def base_path
|
86
|
+
STRIP_PATH.call(super)
|
87
|
+
end
|
88
|
+
|
107
89
|
# Return the dataset path
|
108
90
|
#
|
109
91
|
# @example
|
@@ -114,7 +96,7 @@ module ROM
|
|
114
96
|
#
|
115
97
|
# @api public
|
116
98
|
def path
|
117
|
-
|
99
|
+
STRIP_PATH.call(join_path(base_path, super))
|
118
100
|
end
|
119
101
|
|
120
102
|
# Return the dataset path
|
@@ -127,7 +109,7 @@ module ROM
|
|
127
109
|
#
|
128
110
|
# @api public
|
129
111
|
def absolute_path
|
130
|
-
|
112
|
+
PATH_SEPARATOR + path
|
131
113
|
end
|
132
114
|
|
133
115
|
# Return a new dataset with given headers
|
@@ -177,24 +159,19 @@ module ROM
|
|
177
159
|
__new__(config, options.merge(opts))
|
178
160
|
end
|
179
161
|
|
180
|
-
#
|
162
|
+
# Return a new dataset with a different base path
|
181
163
|
#
|
182
|
-
# @param [
|
164
|
+
# @param base_path [String] the new base request path
|
183
165
|
#
|
184
166
|
# @example
|
185
|
-
# users
|
186
|
-
#
|
187
|
-
# # => [:login, :email, :name]
|
167
|
+
# users.with_base_path('/profiles').base_path
|
168
|
+
# # => 'profiles'
|
188
169
|
#
|
189
170
|
# @return [Dataset]
|
190
171
|
#
|
191
172
|
# @api public
|
192
|
-
def
|
193
|
-
|
194
|
-
|
195
|
-
with_options(
|
196
|
-
projections: (self.projections + projections)
|
197
|
-
)
|
173
|
+
def with_base_path(base_path)
|
174
|
+
with_options(base_path: base_path)
|
198
175
|
end
|
199
176
|
|
200
177
|
# Return a new dataset with a different path
|
@@ -223,8 +200,8 @@ module ROM
|
|
223
200
|
# @return [Dataset]
|
224
201
|
#
|
225
202
|
# @api public
|
226
|
-
def append_path(
|
227
|
-
with_options(path:
|
203
|
+
def append_path(append_path)
|
204
|
+
with_options(path: join_path(path, append_path))
|
228
205
|
end
|
229
206
|
|
230
207
|
# Return a new dataset with a different request method
|
@@ -316,10 +293,7 @@ module ROM
|
|
316
293
|
#
|
317
294
|
# @api public
|
318
295
|
def response
|
319
|
-
|
320
|
-
response_handler.call(request_handler.call(self), self),
|
321
|
-
self
|
322
|
-
)
|
296
|
+
response_handler.call(request_handler.call(self), self)
|
323
297
|
end
|
324
298
|
|
325
299
|
private
|
@@ -339,6 +313,10 @@ module ROM
|
|
339
313
|
def __new__(*args, &block)
|
340
314
|
self.class.new(*args, &block)
|
341
315
|
end
|
316
|
+
|
317
|
+
def join_path(*paths)
|
318
|
+
paths.reject(&:empty?).join(PATH_SEPARATOR)
|
319
|
+
end
|
342
320
|
end
|
343
321
|
end
|
344
322
|
end
|