services 0.2.2 → 0.2.4
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/lib/services/base.rb +18 -15
- data/lib/services/version.rb +1 -1
- data/spec/services/base_spec.rb +39 -6
- data/spec/support/test_services.rb +49 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 174a80aa11d343dbbbf8a4e44293530534635159
|
4
|
+
data.tar.gz: 733e7d7374a736b8d0d0abe8b6183118015e4539
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 371972b84cd904629577b38de062ce71734d7d22a2ace45ae844e764128eee68648703c6073bb6ec4847d42505af56b36b2dd3554274b8a75847d06ec3ec5266
|
7
|
+
data.tar.gz: ad3c0b04f60a7b35f84f5879db9661ee05040c0dcfc5c5cecdac6c9ad0b022f0d2782f8a739605e976ea3e74b9fe905c3b4647f21b25ec39d11e56c1b6e0a40b
|
data/lib/services/base.rb
CHANGED
@@ -25,28 +25,31 @@ module Services
|
|
25
25
|
|
26
26
|
private
|
27
27
|
|
28
|
-
def
|
28
|
+
def find_objects(ids_or_objects, klass = nil)
|
29
29
|
if klass.nil?
|
30
30
|
klass = self.class.to_s[/Services::([^:]+)/, 1].singularize.constantize rescue nil
|
31
31
|
raise "Could not determine class from #{self.class}" if klass.nil?
|
32
32
|
end
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
33
|
+
ids_or_objects_array = Array(ids_or_objects)
|
34
|
+
ids, objects = ids_or_objects_array.grep(Fixnum), ids_or_objects_array.grep(klass)
|
35
|
+
if ids.size + objects.size < ids_or_objects_array.size
|
36
|
+
raise "All params must be either #{klass.to_s.pluralize} or Fixnums: #{ids_or_objects_array.map(&:class)}"
|
37
|
+
end
|
38
|
+
if ids.any?
|
39
|
+
find_service = "Services::#{klass.to_s.pluralize}::Find"
|
40
|
+
objects_from_ids = find_service.constantize.call(ids)
|
41
|
+
object_ids = if objects_from_ids.respond_to?(:pluck)
|
42
|
+
objects_from_ids.pluck(:id)
|
43
|
+
else
|
44
|
+
objects_from_ids.map(&:id)
|
45
|
+
end
|
46
|
+
missing_ids = ids - object_ids
|
40
47
|
raise self.class::Error, "#{klass.to_s.pluralize(missing_ids)} #{missing_ids.join(', ')} not found." if missing_ids.size > 0
|
41
|
-
|
42
|
-
when Fixnum
|
43
|
-
object = "Services::#{klass.to_s.pluralize}::Find".constantize.call(ids_or_objects).first
|
44
|
-
raise self.class::Error, "#{klass} #{ids_or_objects} not found." if object.nil?
|
45
|
-
return object
|
46
|
-
else
|
47
|
-
raise "Unexpected ids_or_objects class: #{ids_or_objects.class}"
|
48
|
+
objects.concat objects_from_ids
|
48
49
|
end
|
50
|
+
ids_or_objects.is_a?(Array) ? objects : objects.first
|
49
51
|
end
|
52
|
+
alias_method :find_object, :find_objects
|
50
53
|
|
51
54
|
def controller
|
52
55
|
@controller ||= begin
|
data/lib/services/version.rb
CHANGED
data/spec/services/base_spec.rb
CHANGED
@@ -1,18 +1,51 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Services::Base do
|
4
|
-
|
5
|
-
|
6
|
-
|
4
|
+
describe '#find_objects' do
|
5
|
+
let(:objects) { (1..5).to_a.shuffle.map { |id| Model.new(id) } }
|
6
|
+
|
7
|
+
context 'when passing in objects' do
|
8
|
+
it 'returns the same objects' do
|
9
|
+
expect(Services::Models::FindObjectsTest.call(objects)).to eq(objects)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
context 'when passing in IDs' do
|
14
|
+
it 'returns the objects for the IDs' do
|
15
|
+
expect(Services::Models::FindObjectsTest.call(objects.map(&:id))).to eq(objects)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
context 'when passing in objects and IDs' do
|
20
|
+
it 'returns the objects plus the objects for the IDs' do
|
21
|
+
objects_as_objects, objects_as_ids = objects.partition do |object|
|
22
|
+
rand(2) == 1
|
23
|
+
end
|
24
|
+
|
25
|
+
objects_and_ids = objects_as_objects + objects_as_ids.map(&:id)
|
26
|
+
only_objects = objects_as_objects + objects_as_ids
|
27
|
+
|
28
|
+
expect(Services::Models::FindObjectsTest.call(objects_and_ids)).to eq(only_objects)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
context 'when passing in a single object or ID' do
|
33
|
+
it 'returns a single object' do
|
34
|
+
object = objects.sample
|
35
|
+
[object.id, object].each do |id_or_object|
|
36
|
+
expect(Services::Models::FindObjectsTest.call(id_or_object)).to eq(object)
|
37
|
+
end
|
38
|
+
end
|
7
39
|
end
|
8
40
|
end
|
9
|
-
|
41
|
+
|
42
|
+
if StandardError.new.respond_to?(:cause)
|
10
43
|
context 'wrapping exceptions' do
|
11
44
|
it 'does not wrap service errors or subclasses' do
|
12
45
|
expect do
|
13
|
-
|
46
|
+
ErrorService.call
|
14
47
|
end.to raise_error do |error|
|
15
|
-
expect(error).to be_a(
|
48
|
+
expect(error).to be_a(ErrorService::Error)
|
16
49
|
expect(error.message).to eq('I am a service error.')
|
17
50
|
expect(error.cause).to be_nil
|
18
51
|
end
|
@@ -1,3 +1,52 @@
|
|
1
|
+
class Model
|
2
|
+
attr_reader :id
|
3
|
+
|
4
|
+
def initialize(id)
|
5
|
+
@id = id
|
6
|
+
ModelRepository.add self
|
7
|
+
end
|
8
|
+
|
9
|
+
def ==(another_model)
|
10
|
+
self.id == another_model.id
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
class ModelRepository
|
15
|
+
def self.add(model)
|
16
|
+
@models ||= []
|
17
|
+
@models << model
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.find(id)
|
21
|
+
return nil unless defined?(@models)
|
22
|
+
@models.detect do |model|
|
23
|
+
model.id == id
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
module Services
|
29
|
+
module Models
|
30
|
+
class Find < Services::Base
|
31
|
+
def call(ids)
|
32
|
+
ids.map { |id| ModelRepository.find id }.compact
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
class FindObjectsTest < Services::Base
|
37
|
+
def call(ids_or_objects)
|
38
|
+
find_objects ids_or_objects
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
class ErrorService < Services::Base
|
45
|
+
def call
|
46
|
+
raise Error.new('I am a service error.')
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
1
50
|
class UniqueService < Services::Base
|
2
51
|
def call
|
3
52
|
check_uniqueness!
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: services
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Manuel Meurer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-08-
|
11
|
+
date: 2014-08-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|