concierge 0.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
|