service_bureau 0.1.0 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/lib/service_bureau.rb +4 -0
- data/lib/service_bureau/locations.rb +23 -0
- data/lib/service_bureau/locator.rb +12 -0
- data/lib/service_bureau/services.rb +20 -0
- data/lib/service_bureau/version.rb +2 -1
- data/service_bureau.gemspec +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
OWI3ZTYwZmU5YTQ5ODZiZWEzZDZmZTAyYTNkNGY4ZGUzNGIyM2NiNQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
ZmI5YWY3Y2UwMDNlYjY1Y2FhMTMwNDc1NzIzZDlmNmNjOGQ3YWE3OA==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
MTcxMjdlZWQzMDdlZDRjMGE1N2FlNzI4NjI3N2JkZDdlZDU5YzEzZTYxYTE4
|
10
|
+
NGI2ZWQ3ZGYwZmIxNmU1ZWYzODI2YTM0NmRmNDhjODYwNmJlODE3NmU4MDQw
|
11
|
+
ZDQwYTVjNDhjNmQwYWFiNTk2ODdjYWY3NWY0Zjg5YmJjMDZjNmM=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
ZDY0ZDRkNTZhMzAyYWNmZTNhMWIwOWM1ZjIxM2U3ODI3ZWUxYWQwMjBmN2Iw
|
14
|
+
ODc3NmYyOWIxZDJhZjE0MmJkMWI1MjRiZDQ1MmI1ZTlhNjRlYjM0YmRjYTI3
|
15
|
+
YmFjMGIxOGI1YWFiYzY1NmQ0ODdjODliMTkxYzU4OWFkZmY3OTM=
|
data/lib/service_bureau.rb
CHANGED
@@ -3,7 +3,11 @@ require "service_bureau/locations"
|
|
3
3
|
require "service_bureau/locator"
|
4
4
|
require "service_bureau/services"
|
5
5
|
|
6
|
+
# Provides easy access to service dependencies, as well
|
7
|
+
# as a way to inject them as dependencies.
|
6
8
|
module ServiceBureau
|
9
|
+
# Raised when a requested service is not configured
|
7
10
|
class UnknownServiceError < StandardError;end
|
11
|
+
# Raised when a requested service cannot be instantiated.
|
8
12
|
class UncallableFactoryError < StandardError;end
|
9
13
|
end
|
@@ -1,18 +1,41 @@
|
|
1
1
|
module ServiceBureau
|
2
|
+
# Stores the factories for all the configured services
|
2
3
|
class Locations
|
3
4
|
class << self
|
5
|
+
# Configures the factories for each service
|
6
|
+
#
|
7
|
+
# Each service should be configured with an
|
8
|
+
# object that responds to 'call'
|
9
|
+
#
|
10
|
+
# @example
|
11
|
+
# ServiceBureau::Locations.configure do |c|
|
12
|
+
# c.my_service MyService.public_method(:new)
|
13
|
+
# c.other_service ->(arg){ OtherService.new(arg) }
|
14
|
+
# end
|
15
|
+
#
|
16
|
+
# @return nothing
|
17
|
+
# @yield ServiceBureau::Locations
|
18
|
+
# @yieldreturn nothing
|
4
19
|
def configure(&block)
|
5
20
|
yield self
|
6
21
|
end
|
7
22
|
|
23
|
+
# @api private
|
24
|
+
# Gets the map of service keys to factories.
|
25
|
+
#
|
26
|
+
# @return [Hash] mapping service keys to factories
|
8
27
|
def factory_map
|
9
28
|
@factory_map ||= {}
|
10
29
|
end
|
11
30
|
|
31
|
+
# Removes all the registered services.
|
32
|
+
#
|
33
|
+
# @return [Hash] the empty factory_map
|
12
34
|
def clear
|
13
35
|
factory_map.clear
|
14
36
|
end
|
15
37
|
|
38
|
+
# @private
|
16
39
|
def method_missing(method_name, *args, &block)
|
17
40
|
if args.size == 1 && !block_given?
|
18
41
|
factory_map[method_name] = args.first
|
@@ -1,14 +1,26 @@
|
|
1
1
|
module ServiceBureau
|
2
|
+
# Finds service factories and instantiates services
|
2
3
|
class Locator
|
4
|
+
# Initializes a new Locator with the mapping of service keys to factories.
|
3
5
|
def initialize
|
4
6
|
@service_factories = ServiceBureau::Locations.factory_map
|
5
7
|
end
|
6
8
|
|
9
|
+
# Finds a factory and instantiates a service
|
10
|
+
#
|
11
|
+
# @param service_key [Symbol] the service to look up
|
12
|
+
# @param args will be passed to the factory's call method.
|
13
|
+
#
|
14
|
+
# @return An instance of the service
|
15
|
+
#
|
16
|
+
# @raise [UnknownServiceError] If a factory cannot be found.
|
17
|
+
# @raise [UncallableFactoryError] If a factory is found, but does not respond to call
|
7
18
|
def self.get_service service_key, *args
|
8
19
|
@instance ||= new
|
9
20
|
@instance.get_service service_key, *args
|
10
21
|
end
|
11
22
|
|
23
|
+
# (see .get_service)
|
12
24
|
def get_service service_key, *args
|
13
25
|
service_factories.fetch(service_key).call *args
|
14
26
|
|
@@ -1,4 +1,24 @@
|
|
1
1
|
module ServiceBureau
|
2
|
+
# When mixed in to a class, it provides a handle for
|
3
|
+
# all configured services.
|
4
|
+
# It also provides an injector method for each service
|
5
|
+
# so that altenative implementations can be easily
|
6
|
+
# injected e.g. for testing.
|
7
|
+
#
|
8
|
+
# @example
|
9
|
+
# ServiceBureau::Locations.configure do |c|
|
10
|
+
# c.my_service MyService.public_method(:new)
|
11
|
+
# end
|
12
|
+
#
|
13
|
+
# Class MyClass
|
14
|
+
# include ServiceBureau::Services
|
15
|
+
# end
|
16
|
+
#
|
17
|
+
# obj = MyClass.new
|
18
|
+
# obj.my_service # => returns the result of: MyService.new
|
19
|
+
#
|
20
|
+
# obj.my_service = double('a fake service')
|
21
|
+
# obj.my_service # => returns the test double
|
2
22
|
module Services
|
3
23
|
def self.included(base)
|
4
24
|
ServiceBureau::Locations.factory_map.keys.each do |service|
|
data/service_bureau.gemspec
CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |spec|
|
|
10
10
|
spec.email = ["mattvanhorn@gmail.com"]
|
11
11
|
spec.description = %q{Something of a cross between a Service Locator and an Abstract Factory to enable easier use of the ServiceObject pattern.}
|
12
12
|
spec.summary = %q{An easy way to provide access to your service classes without creating a lot of coupling}
|
13
|
-
spec.homepage = ""
|
13
|
+
spec.homepage = "https://github.com/mattvanhorn/service_bureau"
|
14
14
|
spec.license = "MIT"
|
15
15
|
|
16
16
|
spec.files = `git ls-files`.split($/)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: service_bureau
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1
|
4
|
+
version: 1.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matt Van Horn
|
@@ -72,7 +72,7 @@ files:
|
|
72
72
|
- lib/service_bureau/version.rb
|
73
73
|
- service_bureau.gemspec
|
74
74
|
- spec/service_bureau_spec.rb
|
75
|
-
homepage:
|
75
|
+
homepage: https://github.com/mattvanhorn/service_bureau
|
76
76
|
licenses:
|
77
77
|
- MIT
|
78
78
|
metadata: {}
|