concierge 0.1

Sign up to get free protection for your applications and to get access to all the features.
data/README ADDED
@@ -0,0 +1,13 @@
1
+ Concierge
2
+ =========
3
+
4
+ Introduction goes here.
5
+
6
+
7
+ Example
8
+ =======
9
+
10
+ Example goes here.
11
+
12
+
13
+ Copyright (c) 2007 [name of plugin creator], released under the MIT license
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
+