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 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
+