markbates-distribunaut 0.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,43 @@
1
+ === Example #1
2
+
3
+ # 'Server' application
4
+ require 'distribunaut'
5
+
6
+ configatron.distribunaut.app_name = :user_app
7
+ configatron.distribunaut.share_objects = true
8
+
9
+ class User
10
+ include Distribunaut::Distributable
11
+
12
+ attr_accessor :username
13
+
14
+ def self.hi
15
+ 'hello!!!'
16
+ end
17
+
18
+ def save
19
+ puts "Saving: #{self.inspect}"
20
+ end
21
+
22
+ end
23
+
24
+ DRb.thread.join
25
+
26
+ # 'Client' application
27
+ require 'distribunaut'
28
+
29
+ puts Distribunaut::Distributed::User.hi
30
+
31
+ User = Distribunaut::Distributed::User
32
+
33
+ puts User.hi
34
+
35
+ user = User.new
36
+
37
+ puts user.inspect
38
+
39
+ user.username = 'markbates'
40
+
41
+ puts user.inspect
42
+
43
+ user.save
@@ -0,0 +1,33 @@
1
+ #!/usr/local/bin/ruby
2
+ # require 'rubygems'
3
+ require 'daemons'
4
+ require 'rinda/ring'
5
+ require 'rinda/tuplespace'
6
+ require 'fileutils'
7
+ require 'optparse'
8
+ require 'optparse/time'
9
+ require 'ostruct'
10
+
11
+ options = OpenStruct.new
12
+ opts = OptionParser.new do |opts|
13
+ opts.banner = <<-BANNER
14
+ Usage: distribunaut_ring_server <command>
15
+ Available commands are:
16
+
17
+ - start
18
+ - stop
19
+ - restart
20
+
21
+ BANNER
22
+ end
23
+
24
+ opts.parse!(ARGV)
25
+
26
+ FileUtils.mkdir_p(File.join("tmp", "pids"))
27
+
28
+ Daemons.run_proc('distribunaut_ring_server', {:dir_mode => :normal, :dir => File.join("tmp", "pids"), :monitor => true, :multiple => false}) do
29
+ puts 'Starting distribunaut_ring_server...'
30
+ DRb.start_service
31
+ Rinda::RingServer.new(Rinda::TupleSpace.new)
32
+ DRb.thread.join
33
+ end
@@ -0,0 +1,65 @@
1
+ module Distribunaut # :nodoc:
2
+ # Include this module into any class it will instantly register that class with
3
+ # the distribunaut_ring_server. The class will be registered with the name of the class
4
+ # and the distribunaut.distributed_app_name configured in your config/configatron/*.rb file.
5
+ # If the distribunaut.distributed_app_name configuration parameter is nil it will raise
6
+ # an Distribunaut::Distributed::Errors::ApplicationNameUndefined exception.
7
+ #
8
+ # Example:
9
+ # class User
10
+ # include Distribunaut::Distributable
11
+ # def name
12
+ # "mark"
13
+ # end
14
+ # end
15
+ #
16
+ # Distribunaut::Distributed::User.new.name # => "mark"
17
+ module Distributable
18
+
19
+ def self.included(base) # :nodoc:
20
+ if configatron.distribunaut.share_objects
21
+ base.class_eval do
22
+ include ::DRbUndumped
23
+ end
24
+ eval %{
25
+ class ::Distribunaut::Distributed::#{base}Proxy
26
+ include Singleton
27
+ include DRbUndumped
28
+
29
+ def method_missing(sym, *args)
30
+ #{base}.send(sym, *args)
31
+ end
32
+
33
+ def inspect
34
+ #{base}.inspect
35
+ end
36
+
37
+ def to_s
38
+ #{base}.to_s
39
+ end
40
+
41
+ end
42
+ }
43
+ raise Distribunaut::Distributed::Errors::ApplicationNameUndefined.new if configatron.distribunaut.app_name.nil?
44
+ Distribunaut::Distributed::Utils::Rinda.register_or_renew(:space => configatron.distribunaut.app_name.to_sym,
45
+ :klass_def => "#{base}".to_sym,
46
+ :object => "Distribunaut::Distributed::#{base}Proxy".constantize.instance)
47
+ end
48
+ end
49
+
50
+ end # Distributable
51
+ end # Distribunaut
52
+
53
+ module DRb # :nodoc:
54
+ class DRbObject # :nodoc:
55
+
56
+ alias_method :_original_inspect, :inspect unless method_defined?(:_original_inspect)
57
+
58
+ def inspect
59
+ "#{_original_inspect}|#{method_missing(:inspect)}"
60
+ end
61
+
62
+ undef :id if method_defined?(:id)
63
+
64
+ end
65
+ end
@@ -0,0 +1,24 @@
1
+ module Distribunaut # :nodoc:
2
+ module Distributed # :nodoc:
3
+
4
+ # Looks up and tries to find the missing constant using the ring server.
5
+ def self.const_missing(const)
6
+ Distribunaut::Distributed::Utils::Rinda.read(:klass_def => "#{const}".to_sym)
7
+ end
8
+
9
+ # Allows for the specific lookup of services on the ring server
10
+ #
11
+ # Examples:
12
+ # Distribunaut::Distributed::Utils::Rinda.register_or_renew(:space => :app_1, :klass_def => :Test, :object => "Hello World!")
13
+ # Distribunaut::Distributed::Utils::Rinda.register_or_renew(:space => :app_2, :klass_def => :Test, :object => "Hello WORLD!")
14
+ # Distribunaut::Distributed.lookup("distributed://app_1/Test") # => "Hello World!"
15
+ # Distribunaut::Distributed.lookup("distributed://app_2/Test") # => "Hello WORLD!"
16
+ def self.lookup(address)
17
+ uri = Addressable::URI.parse(address)
18
+ path = uri.path[1..uri.path.size] # remove the first slash
19
+ host = uri.host
20
+ Distribunaut::Distributed::Utils::Rinda.read(:klass_def => path.to_sym, :space => host.to_sym)
21
+ end
22
+
23
+ end # Distributed
24
+ end # Distribunaut
@@ -0,0 +1,33 @@
1
+ module Distribunaut
2
+ module Distributed # :nodoc:
3
+ module Errors # :nodoc:
4
+
5
+ # Raised when an unknown distributed application is referenced.
6
+ class UnknownApplication < StandardError
7
+ # Takes the application name.
8
+ def initialize(app_name)
9
+ super("APPLICATION: #{app_name} is not a known/registered distributed application.")
10
+ end
11
+ end
12
+
13
+ # Raised when an unknown distributed route name for a distributed application is referenced.
14
+ class UnknownRouteName < StandardError
15
+ # Takes the application name and the route name.
16
+ def initialize(app_name, route_name)
17
+ super("ROUTE_NAME: #{route_name}, is not a known/registered distributed route name for application: #{app_name}.")
18
+ end
19
+ end
20
+
21
+ # Raised when an application doesn't declare it's application name for use in a distributed system.
22
+ class ApplicationNameUndefined < StandardError
23
+ end
24
+
25
+ # Raised when the distributed path is not a well formed addressable format
26
+ class InvalidAddressableURIFormat < StandardError
27
+ def inititalize(msg)
28
+ super("Invalid addressable format: #{msg}")
29
+ end
30
+ end
31
+ end # Errors
32
+ end # Distributed
33
+ end # Distribunaut
@@ -0,0 +1,33 @@
1
+ require 'rinda/ring'
2
+ namespace :distribunaut do
3
+ namespace :ring_server do
4
+
5
+ desc "Start the Rinda ring server"
6
+ task :start do
7
+ `distribunaut_ring_server start`
8
+ end
9
+
10
+ desc "Stop the Rinda ring server"
11
+ task :stop do
12
+ `distribunaut_ring_server stop`
13
+ end
14
+
15
+ namespace :services do
16
+
17
+ desc "Lists all services on the ring server"
18
+ task :list do
19
+ DRb.start_service
20
+ ring_server = Rinda::RingFinger.primary
21
+ services = ring_server.read_all([nil, nil, nil, nil])
22
+ puts "Services on #{ring_server.__drburi}"
23
+ services.each do |service|
24
+ puts "#{service[0]}: #{service[1]} on #{service[2].__drburi} - #{service[3]}"
25
+ end
26
+ end
27
+
28
+ end # services
29
+
30
+ end # ring_server
31
+ end # distribunaut
32
+
33
+ alias_task "distribunaut:ring_server:restart", "distribunaut:ring_server:stop", "distribunaut:ring_server:start"
@@ -0,0 +1,48 @@
1
+ module Distribunaut
2
+ module Distributed
3
+ module Utils # :nodoc:
4
+ module Rinda
5
+
6
+ def self.register_or_renew(options = {})
7
+ options = handle_options(options)
8
+ begin
9
+ ring_server.take([options[:space], options[:klass_def], nil, nil], options[:timeout])
10
+ rescue Exception => e
11
+ # Distribunaut.logger.error(e)
12
+ end
13
+ register(options)
14
+ end
15
+
16
+ def self.register(options = {})
17
+ options = handle_options(options)
18
+ ring_server.write([options[:space],
19
+ options[:klass_def],
20
+ options[:object],
21
+ options[:description]],
22
+ ::Rinda::SimpleRenewer.new)
23
+ end
24
+
25
+ def self.ring_server
26
+ if configatron.distribunaut.retrieve(:acl, nil)
27
+ acl = ACL.new(configatron.distribunaut.acl)
28
+ DRb.install_acl(acl)
29
+ end
30
+ ::DRb.start_service
31
+ rs = ::Rinda::RingFinger.primary
32
+ rs
33
+ end
34
+
35
+ def self.read(options = {})
36
+ options = handle_options(options)
37
+ ring_server.read([options[:space], options[:klass_def], nil, options[:description]], options[:timeout])[2]
38
+ end
39
+
40
+ private
41
+ def self.handle_options(options = {})
42
+ {:space => nil, :klass_def => nil, :object => nil, :description => nil, :timeout => configatron.distribunaut.timeout}.merge(options)
43
+ end
44
+
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,24 @@
1
+ require 'configatron'
2
+ require 'cachetastic'
3
+ require 'drb/drb'
4
+ require 'drb/acl'
5
+ require 'rinda/ring'
6
+ require 'rinda/tuplespace'
7
+ require 'addressable/uri'
8
+ require 'activesupport'
9
+
10
+ base = File.join(File.dirname(__FILE__), 'distribunaut')
11
+
12
+ configatron.distribunaut.set_default(:share_routes, false)
13
+ configatron.distribunaut.set_default(:share_objects, false)
14
+ configatron.distribunaut.set_default(:share_views, false)
15
+ configatron.distribunaut.set_default(:app_name, nil)
16
+ configatron.distribunaut.set_default(:site_domain, nil)
17
+ configatron.distribunaut.set_default(:timeout, 0)
18
+ configatron.distribunaut.set_default(:enable_view_cache, false)
19
+
20
+ # load *.rb files
21
+ Dir.glob(File.join(base, "**", "*.rb")).each do |f|
22
+ require(f)
23
+ end
24
+
@@ -0,0 +1,6 @@
1
+ require File.join(File.dirname(__FILE__), 'gems')
2
+
3
+ # load tasks
4
+ Dir.glob(File.join(File.dirname(__FILE__), 'distribunaut-distributed', 'tasks', '*.rake')).each do |f|
5
+ load(f)
6
+ end
metadata ADDED
@@ -0,0 +1,100 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: markbates-distribunaut
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - markbates
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-04-05 00:00:00 -07:00
13
+ default_executable: distribunaut_ring_server
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: configatron
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: "0"
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: cachetastic
27
+ type: :runtime
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: "0"
34
+ version:
35
+ - !ruby/object:Gem::Dependency
36
+ name: addressable
37
+ type: :runtime
38
+ version_requirement:
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: "0"
44
+ version:
45
+ - !ruby/object:Gem::Dependency
46
+ name: daemons
47
+ type: :runtime
48
+ version_requirement:
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: "0"
54
+ version:
55
+ description: "distribunaut was developed by: markbates"
56
+ email: ""
57
+ executables:
58
+ - distribunaut_ring_server
59
+ extensions: []
60
+
61
+ extra_rdoc_files:
62
+ - README
63
+ files:
64
+ - lib/distribunaut/distributable.rb
65
+ - lib/distribunaut/distributed.rb
66
+ - lib/distribunaut/errors/errors.rb
67
+ - lib/distribunaut/tasks/ring_server_tasks.rake
68
+ - lib/distribunaut/utils/rinda.rb
69
+ - lib/distribunaut.rb
70
+ - lib/distribunaut_tasks.rb
71
+ - README
72
+ - bin/distribunaut_ring_server
73
+ has_rdoc: true
74
+ homepage: ""
75
+ post_install_message:
76
+ rdoc_options: []
77
+
78
+ require_paths:
79
+ - lib
80
+ required_ruby_version: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ version: "0"
85
+ version:
86
+ required_rubygems_version: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: "0"
91
+ version:
92
+ requirements: []
93
+
94
+ rubyforge_project: distribunaut
95
+ rubygems_version: 1.2.0
96
+ signing_key:
97
+ specification_version: 2
98
+ summary: distribunaut
99
+ test_files: []
100
+