lhs 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile +2 -2
- data/docs/services.md +30 -0
- data/lhs.gemspec +1 -1
- data/lib/lhs.rb +7 -0
- data/lib/lhs/concerns/service/endpoints.rb +10 -0
- data/lib/lhs/concerns/service/request.rb +81 -44
- data/lib/lhs/endpoint.rb +11 -0
- data/lib/lhs/version.rb +1 -1
- data/spec/endpoint/for_url_spec.rb +27 -0
- data/spec/service/endpoints_spec.rb +6 -0
- data/spec/service/includes_spec.rb +60 -26
- data/spec/support/cleanup_endpoints.rb +6 -0
- metadata +9 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0ff25a42028f674f80afd08d6a152b42bf61b08b
|
4
|
+
data.tar.gz: c123d197b870914fcb564ba2ce152293105c81c9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 333cf3687bde474f71b5fcda3ffae1b375ce565fd9c7341888d5fd810d07ae51a137b1b34eb0b31b6d40f5e5d16b94e2330020327df605f3771f3a35224f2bbc
|
7
|
+
data.tar.gz: b43d5f519fa79472617485bbfe21bdc757d97b38ba49b17d2e1d485562f5821e4968d66dd371a3ea5d81a67ae6d071d9610d3d0f14053ff37c378459596918bf
|
data/Gemfile
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
source 'https://rubygems.
|
1
|
+
source 'https://rubygems.org/'
|
2
2
|
|
3
3
|
# Declare your gem's dependencies in lhs.gemspec.
|
4
4
|
# Bundler will treat runtime dependencies like base dependencies, and
|
@@ -8,4 +8,4 @@ gemspec
|
|
8
8
|
# Declare any dependencies that are still in development here instead of in
|
9
9
|
# your gemspec. These might include edge Rails or gems from your path or
|
10
10
|
# Git. Remember to move these dependencies to your gemspec before releasing
|
11
|
-
# your gem to rubygems.org.
|
11
|
+
# your gem to rubygems.org.
|
data/docs/services.md
CHANGED
@@ -5,6 +5,10 @@ A LHS::Service makes data available using multiple endpoints.
|
|
5
5
|
|
6
6
|

|
7
7
|
|
8
|
+
## Convention
|
9
|
+
|
10
|
+
Please store all defined services in `app/services` as they are autoloaded from this directory.
|
11
|
+
|
8
12
|
## Endpoints
|
9
13
|
|
10
14
|
You setup a service by configure one or multiple backend endpoints.
|
@@ -177,6 +181,32 @@ and you should read it to understand this feature in all its glory.
|
|
177
181
|
feedbacks.first.campaign.entry.name # 'Casa Ferlin'
|
178
182
|
```
|
179
183
|
|
184
|
+
### Known services are used to request linked resources
|
185
|
+
|
186
|
+
When including linked resources with `includes`, known/defined services and endpoints are used to make those requests.
|
187
|
+
That also means that options for endpoints of linked resources are applied when requesting those in addition.
|
188
|
+
This enables you to include protected resources (e.g. OAuth) as endpoint options for oauth authentication get applied.
|
189
|
+
|
190
|
+
The [Auth Inteceptor](https://github.com/local-ch/lhc-core-interceptors#auth-interceptor) from [lhc-core-interceptors](https://github.com/local-ch/lhc-core-interceptors) is used to configure the following endpoints.
|
191
|
+
```ruby
|
192
|
+
class Favorite < LHS::Service
|
193
|
+
|
194
|
+
endpoint ':datastore/:user_id/favorites', auth: { bearer: -> { bearer_token } }
|
195
|
+
endpoint ':datastore/:user_id/favorites/:id', auth: { bearer: -> { bearer_token } }
|
196
|
+
|
197
|
+
end
|
198
|
+
|
199
|
+
class Place < LHS::Service
|
200
|
+
|
201
|
+
endpoint ':datastore/v2/places', auth: { bearer: -> { bearer_token } }
|
202
|
+
endpoint ':datastore/v2/places/:id', auth: { bearer: -> { bearer_token } }
|
203
|
+
|
204
|
+
end
|
205
|
+
|
206
|
+
Favorite.includes(:place).where(user_id: current_user.id)
|
207
|
+
# Will include places and applies endpoint options to authenticate the request.
|
208
|
+
```
|
209
|
+
|
180
210
|
## Map data
|
181
211
|
|
182
212
|
To influence how data is accessed/provied, you can use mapping to either map deep nested data or to manipulate data when its accessed:
|
data/lhs.gemspec
CHANGED
@@ -20,7 +20,7 @@ Gem::Specification.new do |s|
|
|
20
20
|
s.requirements << 'Ruby >= 1.9.2'
|
21
21
|
s.required_ruby_version = '>= 1.9.2'
|
22
22
|
|
23
|
-
s.add_dependency 'lhc', '>=
|
23
|
+
s.add_dependency 'lhc', '>= 1.2.0'
|
24
24
|
s.add_dependency 'lhc-core-interceptors', '>= 0.1.0'
|
25
25
|
|
26
26
|
s.add_development_dependency 'rspec-rails', '>= 3.0.0'
|
data/lib/lhs.rb
CHANGED
@@ -4,3 +4,10 @@ module LHS
|
|
4
4
|
end
|
5
5
|
|
6
6
|
Gem.find_files('lhs/**/*.rb').each { |path| require path }
|
7
|
+
|
8
|
+
# Preload all the services that are defined in app/services
|
9
|
+
class Engine < Rails::Engine
|
10
|
+
initializer 'Load all services' do |app|
|
11
|
+
Dir.glob(app.root.join('app/services/**/*.rb')).each {|file| require file }
|
12
|
+
end
|
13
|
+
end
|
@@ -10,6 +10,7 @@ class LHS::Service
|
|
10
10
|
extend ActiveSupport::Concern
|
11
11
|
|
12
12
|
attr_accessor :endpoints
|
13
|
+
mattr_accessor :all
|
13
14
|
|
14
15
|
module ClassMethods
|
15
16
|
|
@@ -18,6 +19,15 @@ class LHS::Service
|
|
18
19
|
endpoint = LHC::Endpoint.new(url, options)
|
19
20
|
instance.sanity_check(endpoint)
|
20
21
|
instance.endpoints.push(endpoint)
|
22
|
+
LHS::Service::Endpoints.all ||= {}
|
23
|
+
LHS::Service::Endpoints.all[url] = instance
|
24
|
+
end
|
25
|
+
|
26
|
+
def for_url(url)
|
27
|
+
template, service = LHS::Service::Endpoints.all.detect do |template, _service|
|
28
|
+
LHC::Endpoint.match?(url, template)
|
29
|
+
end
|
30
|
+
service
|
21
31
|
end
|
22
32
|
end
|
23
33
|
|
@@ -15,38 +15,34 @@ class LHS::Service
|
|
15
15
|
|
16
16
|
private
|
17
17
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
18
|
+
# Convert URLs in options to endpoint templates
|
19
|
+
def convert_options_to_endpoints(options)
|
20
|
+
if options.respond_to?(:map)
|
21
|
+
options.map { |option| convert_option_to_endpoints(option) }
|
22
|
+
else
|
23
|
+
convert_option_to_endpoints(options)
|
24
|
+
end
|
25
25
|
end
|
26
26
|
|
27
|
-
def
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
27
|
+
def convert_option_to_endpoints(option)
|
28
|
+
new_options = option.dup
|
29
|
+
url = option[:url]
|
30
|
+
return unless endpoint = LHS::Endpoint.for_url(url)
|
31
|
+
template = endpoint.url
|
32
|
+
new_options = new_options.merge(params: LHC::Endpoint.values_as_params(template, url))
|
33
|
+
new_options[:url] = template
|
34
|
+
new_options
|
32
35
|
end
|
33
36
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
# Merge explicit params nested in 'params' namespace with original hash.
|
45
|
-
def merge_explicit_params!(params)
|
46
|
-
return true unless params
|
47
|
-
explicit_params = params[:params]
|
48
|
-
params.delete(:params)
|
49
|
-
params.merge!(explicit_params) if explicit_params
|
37
|
+
def extend(data, addition, key)
|
38
|
+
if data._proxy.is_a? LHS::Collection
|
39
|
+
data.each_with_index do |item, i|
|
40
|
+
item = item[i] if item.is_a? LHS::Collection
|
41
|
+
item._raw[key.to_s].merge!(addition[i]._raw)
|
42
|
+
end
|
43
|
+
elsif data._proxy.is_a? LHS::Item
|
44
|
+
data._raw[key.to_s].merge!(addition._raw)
|
45
|
+
end
|
50
46
|
end
|
51
47
|
|
52
48
|
def handle_includes(data)
|
@@ -59,36 +55,77 @@ class LHS::Service
|
|
59
55
|
|
60
56
|
def handle_include(data, key)
|
61
57
|
options = if data._proxy.is_a? LHS::Collection
|
62
|
-
|
58
|
+
options_for_multiple(data, key)
|
63
59
|
else
|
64
|
-
|
60
|
+
url_option_for(data, key)
|
65
61
|
end
|
62
|
+
service = service_for_options(options) || self
|
63
|
+
options = convert_options_to_endpoints(options) if service_for_options(options)
|
66
64
|
addition = if (further_keys = includes.fetch(key, nil) if includes.is_a? Hash)
|
67
|
-
|
65
|
+
service.class.includes(further_keys).instance.request(options)
|
68
66
|
else
|
69
|
-
|
67
|
+
service.class.includes(nil).instance.request(options)
|
70
68
|
end
|
71
69
|
extend(data, addition, key)
|
72
70
|
end
|
73
71
|
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
72
|
+
# Merge explicit params nested in 'params' namespace with original hash.
|
73
|
+
def merge_explicit_params!(params)
|
74
|
+
return true unless params
|
75
|
+
explicit_params = params[:params]
|
76
|
+
params.delete(:params)
|
77
|
+
params.merge!(explicit_params) if explicit_params
|
78
|
+
end
|
79
|
+
|
80
|
+
def multiple_requests(options)
|
81
|
+
options = options.map { |options| process_options(options) }
|
82
|
+
responses = LHC.request(options)
|
83
|
+
data = responses.map{ |response| LHS::Data.new(response.body, nil, self.class, response.request) }
|
84
|
+
data = LHS::Data.new(data, nil, self.class)
|
85
|
+
handle_includes(data) if includes
|
86
|
+
data
|
83
87
|
end
|
84
88
|
|
85
|
-
def
|
89
|
+
def options_for_multiple(data, key)
|
86
90
|
data.map do |item|
|
87
|
-
|
91
|
+
url_option_for(item, key)
|
88
92
|
end
|
89
93
|
end
|
90
94
|
|
91
|
-
|
95
|
+
# Merge explicit params and take configured endpoints options as base
|
96
|
+
def process_options(options)
|
97
|
+
options ||= {}
|
98
|
+
options = options.dup
|
99
|
+
endpoint = find_endpoint(options[:params])
|
100
|
+
options = (endpoint.options || {}).merge(options)
|
101
|
+
options[:url] = compute_url!(options[:params]) unless options.key?(:url)
|
102
|
+
merge_explicit_params!(options[:params])
|
103
|
+
options.delete(:params) if options[:params] && options[:params].empty?
|
104
|
+
options
|
105
|
+
end
|
106
|
+
|
107
|
+
def service_for_options(options)
|
108
|
+
services = []
|
109
|
+
if options.is_a?(Array)
|
110
|
+
options.each do |option|
|
111
|
+
next unless service = LHS::Service.for_url(option[:url])
|
112
|
+
services.push(service)
|
113
|
+
end
|
114
|
+
fail 'Found more than one service that could be used to do the request' if services.uniq.count > 1
|
115
|
+
services.uniq.first
|
116
|
+
else # Hash
|
117
|
+
LHS::Service.for_url(options[:url])
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
def single_request(options)
|
122
|
+
response = LHC.request(process_options(options))
|
123
|
+
data = LHS::Data.new(response.body, nil, self.class, response.request)
|
124
|
+
handle_includes(data) if includes
|
125
|
+
data
|
126
|
+
end
|
127
|
+
|
128
|
+
def url_option_for(item, key)
|
92
129
|
link = item[key]
|
93
130
|
{ url: link.href }
|
94
131
|
end
|
data/lib/lhs/endpoint.rb
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
# An endpoint is used as source to fetch objects
|
2
|
+
class LHS::Endpoint
|
3
|
+
|
4
|
+
def self.for_url(url)
|
5
|
+
template, service = LHS::Service::Endpoints.all.detect do |template, _service|
|
6
|
+
LHC::Endpoint.match?(url, template)
|
7
|
+
end
|
8
|
+
service.endpoints.detect { |endpoint| endpoint.url == template } if service
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
data/lib/lhs/version.rb
CHANGED
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'rails_helper'
|
2
|
+
|
3
|
+
describe LHS::Endpoint do
|
4
|
+
|
5
|
+
context 'for url' do
|
6
|
+
|
7
|
+
before(:each) do
|
8
|
+
class SomeService < LHS::Service
|
9
|
+
endpoint ':datastore/entries/:entry_id/content-ads/:campaign_id/feedbacks'
|
10
|
+
endpoint ':datastore/:campaign_id/feedbacks'
|
11
|
+
endpoint ':datastore/feedbacks'
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'provides the endpoint for a given url' do
|
16
|
+
expect(
|
17
|
+
LHS::Endpoint.for_url('http://datastore.local.ch/v2/entries/123/content-ads/456/feedbacks').url
|
18
|
+
).to eq ':datastore/entries/:entry_id/content-ads/:campaign_id/feedbacks'
|
19
|
+
expect(
|
20
|
+
LHS::Endpoint.for_url('http://datastore.local.ch/123/feedbacks').url
|
21
|
+
).to eq ':datastore/:campaign_id/feedbacks'
|
22
|
+
expect(
|
23
|
+
LHS::Endpoint.for_url('http://datastore.local.ch/feedbacks').url
|
24
|
+
).to eq ':datastore/feedbacks'
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -15,6 +15,12 @@ describe LHS::Service do
|
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
|
+
it 'stores all the endpoints by url' do
|
19
|
+
expect(LHS::Service::Endpoints.all[':datastore/entries/:entry_id/content-ads/:campaign_id/feedbacks']).to be
|
20
|
+
expect(LHS::Service::Endpoints.all[':datastore/:campaign_id/feedbacks']).to be
|
21
|
+
expect(LHS::Service::Endpoints.all[':datastore/feedbacks']).to be
|
22
|
+
end
|
23
|
+
|
18
24
|
it 'stores the endpoints of the service' do
|
19
25
|
expect(SomeService.instance.endpoints.count).to eq 3
|
20
26
|
expect(SomeService.instance.endpoints[0].url).to eq ':datastore/entries/:entry_id/content-ads/:campaign_id/feedbacks'
|
@@ -5,40 +5,40 @@ describe LHS::Service do
|
|
5
5
|
let(:datastore) { 'http://datastore-stg.lb-service.sunrise.intra.local.ch/v2' }
|
6
6
|
before(:each) { LHC.config.placeholder('datastore', datastore) }
|
7
7
|
|
8
|
+
let(:stub_campaign_request) do
|
9
|
+
stub_request(:get, "#{datastore}/content-ads/51dfc5690cf271c375c5a12d")
|
10
|
+
.to_return(body: {
|
11
|
+
'href' => "#{datastore}/content-ads/51dfc5690cf271c375c5a12d",
|
12
|
+
'entry' => { 'href' => "#{datastore}/local-entries/lakj35asdflkj1203va" }
|
13
|
+
}.to_json)
|
14
|
+
end
|
15
|
+
|
16
|
+
let(:stub_entry_request) do
|
17
|
+
stub_request(:get, "#{datastore}/local-entries/lakj35asdflkj1203va")
|
18
|
+
.to_return(body: { 'name' => 'Casa Ferlin' }.to_json)
|
19
|
+
end
|
20
|
+
|
8
21
|
context 'includes' do
|
9
22
|
|
10
23
|
before(:each) do
|
11
24
|
class Feedback < LHS::Service
|
12
25
|
endpoint ':datastore/feedbacks'
|
13
26
|
end
|
14
|
-
|
15
|
-
|
16
|
-
.to_return(status: 200, body: {
|
17
|
-
"href" => "#{datastore}/content-ads/51dfc5690cf271c375c5a12d",
|
18
|
-
"entry" => {
|
19
|
-
"href" => "#{datastore}/local-entries/lakj35asdflkj1203va"
|
20
|
-
}
|
21
|
-
}.to_json)
|
22
|
-
|
23
|
-
stub_request(:get, "#{datastore}/local-entries/lakj35asdflkj1203va")
|
24
|
-
.to_return(status: 200, body: {
|
25
|
-
"name" => 'Casa Ferlin'
|
26
|
-
}.to_json)
|
27
|
+
stub_campaign_request
|
28
|
+
stub_entry_request
|
27
29
|
end
|
28
30
|
|
29
31
|
it 'includes linked resources while fetching multiple resources from one service' do
|
30
32
|
|
31
33
|
stub_request(:get, "#{datastore}/feedbacks?has_reviews=true")
|
32
|
-
|
33
|
-
items:[
|
34
|
+
.to_return(status: 200, body: {
|
35
|
+
items: [
|
34
36
|
{
|
35
|
-
|
36
|
-
|
37
|
-
"href" => "#{datastore}/content-ads/51dfc5690cf271c375c5a12d"
|
38
|
-
}
|
37
|
+
'href' => "#{datastore}/feedbacks/-Sc4_pYNpqfsudzhtivfkA",
|
38
|
+
'campaign' => { 'href' => "#{datastore}/content-ads/51dfc5690cf271c375c5a12d" }
|
39
39
|
}
|
40
40
|
]
|
41
|
-
|
41
|
+
}.to_json)
|
42
42
|
|
43
43
|
feedbacks = Feedback.includes(campaign: :entry).where(has_reviews: true)
|
44
44
|
expect(feedbacks.first.campaign.entry.name).to eq 'Casa Ferlin'
|
@@ -47,15 +47,49 @@ describe LHS::Service do
|
|
47
47
|
it 'includes linked resources while fetching a single resource from one service' do
|
48
48
|
|
49
49
|
stub_request(:get, "#{datastore}/feedbacks/123")
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
}
|
55
|
-
}.to_json)
|
50
|
+
.to_return(status: 200, body: {
|
51
|
+
'href' => "#{datastore}/feedbacks/-Sc4_pYNpqfsudzhtivfkA",
|
52
|
+
'campaign' => { 'href' => "#{datastore}/content-ads/51dfc5690cf271c375c5a12d" }
|
53
|
+
}.to_json)
|
56
54
|
|
57
55
|
feedbacks = Feedback.includes(campaign: :entry).find(123)
|
58
56
|
expect(feedbacks.campaign.entry.name).to eq 'Casa Ferlin'
|
59
57
|
end
|
58
|
+
|
59
|
+
context 'include objects from known services' do
|
60
|
+
|
61
|
+
let(:stub_feedback_request) do
|
62
|
+
stub_request(:get, "#{datastore}/feedbacks")
|
63
|
+
.to_return(status: 200, body: {
|
64
|
+
items: [
|
65
|
+
{
|
66
|
+
'href' => "#{datastore}/feedbacks/-Sc4_pYNpqfsudzhtivfkA",
|
67
|
+
'entry' => {
|
68
|
+
'href' => "#{datastore}/local-entries/lakj35asdflkj1203va"
|
69
|
+
}
|
70
|
+
}
|
71
|
+
]
|
72
|
+
}.to_json)
|
73
|
+
end
|
74
|
+
|
75
|
+
before(:each) do
|
76
|
+
class Entry < LHS::Service
|
77
|
+
endpoint ':datastore/local-entries/:id'
|
78
|
+
end
|
79
|
+
class SomeInterceptor < LHC::Interceptor; end
|
80
|
+
LHC.config.interceptors = [SomeInterceptor]
|
81
|
+
end
|
82
|
+
|
83
|
+
it 'uses interceptors for included links from known services' do
|
84
|
+
stub_feedback_request
|
85
|
+
stub_entry_request
|
86
|
+
|
87
|
+
@called = 0
|
88
|
+
allow_any_instance_of(SomeInterceptor).to receive(:before_request) { @called += 1 }
|
89
|
+
|
90
|
+
expect(Feedback.includes(:entry).where.first.entry.name).to eq 'Casa Ferlin'
|
91
|
+
expect(@called).to eq 2
|
92
|
+
end
|
93
|
+
end
|
60
94
|
end
|
61
95
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lhs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- local.ch
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-10-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: lhc
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 1.2.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 1.2.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: lhc-core-interceptors
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -148,6 +148,7 @@ files:
|
|
148
148
|
- lib/lhs/concerns/service/request.rb
|
149
149
|
- lib/lhs/concerns/service/where.rb
|
150
150
|
- lib/lhs/data.rb
|
151
|
+
- lib/lhs/endpoint.rb
|
151
152
|
- lib/lhs/errors.rb
|
152
153
|
- lib/lhs/item.rb
|
153
154
|
- lib/lhs/proxy.rb
|
@@ -204,6 +205,7 @@ files:
|
|
204
205
|
- spec/dummy/public/422.html
|
205
206
|
- spec/dummy/public/500.html
|
206
207
|
- spec/dummy/public/favicon.ico
|
208
|
+
- spec/endpoint/for_url_spec.rb
|
207
209
|
- spec/item/destroy_spec.rb
|
208
210
|
- spec/item/getter_spec.rb
|
209
211
|
- spec/item/respond_to_spec.rb
|
@@ -232,6 +234,7 @@ files:
|
|
232
234
|
- spec/service/where_spec.rb
|
233
235
|
- spec/spec_helper.rb
|
234
236
|
- spec/support/cleanup_configuration.rb
|
237
|
+
- spec/support/cleanup_endpoints.rb
|
235
238
|
- spec/support/cleanup_services.rb
|
236
239
|
- spec/support/fixtures/json/feedback.json
|
237
240
|
- spec/support/fixtures/json/feedbacks.json
|
@@ -311,6 +314,7 @@ test_files:
|
|
311
314
|
- spec/dummy/public/422.html
|
312
315
|
- spec/dummy/public/500.html
|
313
316
|
- spec/dummy/public/favicon.ico
|
317
|
+
- spec/endpoint/for_url_spec.rb
|
314
318
|
- spec/item/destroy_spec.rb
|
315
319
|
- spec/item/getter_spec.rb
|
316
320
|
- spec/item/respond_to_spec.rb
|
@@ -339,6 +343,7 @@ test_files:
|
|
339
343
|
- spec/service/where_spec.rb
|
340
344
|
- spec/spec_helper.rb
|
341
345
|
- spec/support/cleanup_configuration.rb
|
346
|
+
- spec/support/cleanup_endpoints.rb
|
342
347
|
- spec/support/cleanup_services.rb
|
343
348
|
- spec/support/fixtures/json/feedback.json
|
344
349
|
- spec/support/fixtures/json/feedbacks.json
|