service_bureau 0.1.0 → 1.0.1
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 +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: {}
|