concierge 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.
- data/README +13 -0
- data/lib/concierge.rb +23 -0
- data/lib/concierge/consumer.rb +24 -0
- data/lib/concierge/loader.rb +29 -0
- data/lib/concierge/provider.rb +28 -0
- data/lib/concierge/registry.rb +30 -0
- data/lib/concierge/test_helper.rb +46 -0
- data/test/unit/consumer_test.rb +21 -0
- data/test/unit/provider_test.rb +50 -0
- data/test/unit/test_helper_test.rb +16 -0
- metadata +55 -0
data/README
ADDED
data/lib/concierge.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'ostruct'
|
2
|
+
require 'rubygems'
|
3
|
+
require 'active_support'
|
4
|
+
|
5
|
+
require 'concierge/registry'
|
6
|
+
require 'concierge/loader'
|
7
|
+
require 'concierge/provider'
|
8
|
+
require 'concierge/consumer'
|
9
|
+
|
10
|
+
|
11
|
+
module CodeRhythm #:nodoc
|
12
|
+
module Concierge #:nodoc
|
13
|
+
def self.included(base)
|
14
|
+
raise "Please don't include CodeRhythm::Concierge directly, choose the Provider or Consumer interface."
|
15
|
+
end
|
16
|
+
|
17
|
+
class MissingServiceError < RuntimeError
|
18
|
+
def initialize(service_name)
|
19
|
+
super "Sorry, couldn't load a service called #{service_name.to_s}."
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module CodeRhythm
|
2
|
+
module Concierge
|
3
|
+
module Consumer
|
4
|
+
class << self
|
5
|
+
def included(base)
|
6
|
+
base.extend ClassMethods
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
module ClassMethods
|
11
|
+
def consumes_service(service_name)
|
12
|
+
require_service! service_name
|
13
|
+
define_method service_name do
|
14
|
+
CodeRhythm::Concierge::Provider.registry[service_name]
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def require_service!(service_name)
|
19
|
+
CodeRhythm::Concierge::Provider.require_service! service_name
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module CodeRhythm
|
2
|
+
module Concierge
|
3
|
+
class Loader
|
4
|
+
cattr_reader :config
|
5
|
+
@@config = OpenStruct.new
|
6
|
+
|
7
|
+
def self.configure(&block)
|
8
|
+
block.call config if block
|
9
|
+
end
|
10
|
+
|
11
|
+
def load!(service_name)
|
12
|
+
begin
|
13
|
+
Dependencies.depend_on service_name.to_s
|
14
|
+
rescue MissingSourceFile
|
15
|
+
raise MissingServiceError.new(service_name.to_s)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def load_config(service_name)
|
20
|
+
config_path = "#{config.service_config_path}/#{service_name}.yml"
|
21
|
+
if File.exists?(config_path)
|
22
|
+
File.open(config_path) do |f|
|
23
|
+
OpenStruct.new(YAML::load(f)[config.env])
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module CodeRhythm
|
2
|
+
module Concierge
|
3
|
+
class Provider
|
4
|
+
cattr_reader :loader
|
5
|
+
@@loader = Loader.new
|
6
|
+
|
7
|
+
cattr_reader :registry
|
8
|
+
@@registry = Registry.new
|
9
|
+
|
10
|
+
class_inheritable_accessor :config
|
11
|
+
|
12
|
+
class << self
|
13
|
+
def provides_service(service_name)
|
14
|
+
registry[service_name] = self
|
15
|
+
self.config = loader.load_config(service_name) || OpenStruct.new
|
16
|
+
end
|
17
|
+
|
18
|
+
def require_service!(service_name)
|
19
|
+
loader.load!(service_name) unless registry.has_a?(service_name)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def config
|
24
|
+
self.class.config
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module CodeRhythm
|
2
|
+
module Concierge
|
3
|
+
class Registry
|
4
|
+
def initialize
|
5
|
+
@services_to_providers = {}
|
6
|
+
end
|
7
|
+
|
8
|
+
def clear
|
9
|
+
@services_to_providers.clear
|
10
|
+
end
|
11
|
+
|
12
|
+
def has_a?(service_name)
|
13
|
+
@services_to_providers[service_name] != nil
|
14
|
+
end
|
15
|
+
alias :have_a? :has_a?
|
16
|
+
|
17
|
+
def size
|
18
|
+
@services_to_providers.size
|
19
|
+
end
|
20
|
+
|
21
|
+
def []=(service_name, provider_class)
|
22
|
+
@services_to_providers[service_name] = provider_class.send(:new)
|
23
|
+
end
|
24
|
+
|
25
|
+
def [](service_name)
|
26
|
+
@services_to_providers[service_name]
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module CodeRhythm
|
2
|
+
module Concierge
|
3
|
+
module TestHelper
|
4
|
+
class << self
|
5
|
+
def included(base)
|
6
|
+
base.send(:include, InstanceMethods)
|
7
|
+
base.send(:alias_method, :run_without_concierge_goodness, :run)
|
8
|
+
base.send(:alias_method, :run, :run_with_concierge_goodness)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
CodeRhythm::Concierge::Provider.registry.instance_variable_set '@stubs', {}
|
13
|
+
class << CodeRhythm::Concierge::Provider.registry
|
14
|
+
def []=(service_name, provider_class)
|
15
|
+
provider_class == Stub ? @stubs[:service_name] = provider_class.new : super
|
16
|
+
end
|
17
|
+
|
18
|
+
def [](service_name)
|
19
|
+
@stubs[:service_name] || super
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
module InstanceMethods
|
24
|
+
def run_with_concierge_goodness(result, &block)
|
25
|
+
begin
|
26
|
+
run_without_concierge_goodness(result) do |channel, value|
|
27
|
+
block.call channel, value
|
28
|
+
end
|
29
|
+
ensure
|
30
|
+
CodeRhythm::Concierge::Provider.registry.instance_variable_get('@stubs').clear
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def stub_service(service_name)
|
35
|
+
CodeRhythm::Concierge::Provider.registry[service_name] = CodeRhythm::Concierge::TestHelper::Stub
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
class Stub
|
40
|
+
def method_missing(method, *args)
|
41
|
+
# This is the bit bucket
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require "#{File.dirname(__FILE__)}/../test_helper"
|
2
|
+
|
3
|
+
class ConsumerTest < Test::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
@guest = ShamGuest.new
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_injection
|
9
|
+
assert_nothing_raised do
|
10
|
+
@guest.ruby_museum_guide_service.show_matz_portrait
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_cant_include_concierge_directly
|
15
|
+
assert_raises(RuntimeError) do
|
16
|
+
Class.new do
|
17
|
+
include CodeRhythm::Concierge
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require "#{File.dirname(__FILE__)}/../test_helper"
|
2
|
+
|
3
|
+
class ProviderTest < Test::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
@registry = CodeRhythm::Concierge::Provider.registry
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_configuration
|
9
|
+
ShamGuest.send :consumes_service, :greeter
|
10
|
+
assert_equal "howdy", ShamGuest.new.greeter.greet
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_duplicate_registration
|
14
|
+
assert @registry[:ruby_museum_guide_service].is_a?(RubyMuseumGuideService)
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_registration
|
18
|
+
assert @registry.has_a?(:ruby_museum_guide_service)
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_discovery
|
22
|
+
assert_difference @registry, :size do
|
23
|
+
ShamGuest.send :consumes_service, :hiding_on_the_disk
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_discovery_service_doesnt_exist
|
28
|
+
assert_raises(CodeRhythm::Concierge::MissingServiceError) do
|
29
|
+
ShamGuest.send :consumes_service, :java_training
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_discovery_namespaced
|
34
|
+
assert_difference @registry, :size do
|
35
|
+
ShamGuest.send :consumes_service, 'example/modular'
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_provider_gets_config_instance_method
|
40
|
+
ShamGuest.send :consumes_service, :greeter
|
41
|
+
assert @registry[:greeter].method(:config)
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_unloading
|
45
|
+
greeter_before = Greeter.new
|
46
|
+
Dependencies.clear
|
47
|
+
greeter_after = Greeter.new
|
48
|
+
assert_not_same greeter_before, greeter_after
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require "#{File.dirname(__FILE__)}/../test_helper"
|
2
|
+
|
3
|
+
class ConciergeTest < Test::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
@guest = ShamGuest.new
|
6
|
+
@registry = CodeRhythm::Concierge::Provider.registry
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_stub_service
|
10
|
+
test = ShamTest.new('test_truth')
|
11
|
+
test.setup
|
12
|
+
assert @guest.ruby_museum_guide_service.is_a?(CodeRhythm::Concierge::TestHelper::Stub)
|
13
|
+
test.run(Test::Unit::TestResult.new) {}
|
14
|
+
assert !@guest.ruby_museum_guide_service.is_a?(CodeRhythm::Concierge::TestHelper::Stub)
|
15
|
+
end
|
16
|
+
end
|
metadata
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
rubygems_version: 0.9.0
|
3
|
+
specification_version: 1
|
4
|
+
name: concierge
|
5
|
+
version: !ruby/object:Gem::Version
|
6
|
+
version: "0.1"
|
7
|
+
date: 2007-06-16 00:00:00 -04:00
|
8
|
+
summary: Concierge is a minimal service discovery and configuration framework.
|
9
|
+
require_paths:
|
10
|
+
- lib
|
11
|
+
email: chris@coderhythm.com
|
12
|
+
homepage: http://concierge.rubyforge.org
|
13
|
+
rubyforge_project:
|
14
|
+
description:
|
15
|
+
autorequire: concierge
|
16
|
+
default_executable:
|
17
|
+
bindir: bin
|
18
|
+
has_rdoc: true
|
19
|
+
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">"
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 0.0.0
|
24
|
+
version:
|
25
|
+
platform: ruby
|
26
|
+
signing_key:
|
27
|
+
cert_chain:
|
28
|
+
post_install_message:
|
29
|
+
authors:
|
30
|
+
- Chris O'Meara
|
31
|
+
files:
|
32
|
+
- lib/concierge
|
33
|
+
- lib/concierge/consumer.rb
|
34
|
+
- lib/concierge/loader.rb
|
35
|
+
- lib/concierge/provider.rb
|
36
|
+
- lib/concierge/registry.rb
|
37
|
+
- lib/concierge/test_helper.rb
|
38
|
+
- lib/concierge.rb
|
39
|
+
- README
|
40
|
+
test_files:
|
41
|
+
- test/unit/consumer_test.rb
|
42
|
+
- test/unit/provider_test.rb
|
43
|
+
- test/unit/test_helper_test.rb
|
44
|
+
rdoc_options: []
|
45
|
+
|
46
|
+
extra_rdoc_files:
|
47
|
+
- README
|
48
|
+
executables: []
|
49
|
+
|
50
|
+
extensions: []
|
51
|
+
|
52
|
+
requirements: []
|
53
|
+
|
54
|
+
dependencies: []
|
55
|
+
|