thirtysixthspan-magent 0.4.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.
@@ -0,0 +1,4 @@
1
+ === 0.0.1 2009-10-02
2
+
3
+ * 1 major enhancement:
4
+ * Initial release
@@ -0,0 +1,22 @@
1
+ History.txt
2
+ Manifest.txt
3
+ PostInstall.txt
4
+ README.rdoc
5
+ Rakefile
6
+ bin/magent
7
+ examples/comm/run.rb
8
+ examples/comm/worker.rb
9
+ examples/error/error.rb
10
+ examples/simple/bot.rb
11
+ examples/stats/stats.rb
12
+ lib/magent.rb
13
+ lib/magent/actor.rb
14
+ lib/magent/channel.rb
15
+ lib/magent/generic_channel.rb
16
+ lib/magent/processor.rb
17
+ lib/magent/push.rb
18
+ lib/magent/utils.rb
19
+ magent.gemspec
20
+ script/console
21
+ test/test_helper.rb
22
+ test/test_magent.rb
File without changes
@@ -0,0 +1,53 @@
1
+ = magent
2
+
3
+ * http://github.com/dcu/magent
4
+
5
+ == DESCRIPTION:
6
+
7
+ Simple job queue system based on mongodb
8
+
9
+ == FEATURES/PROBLEMS:
10
+
11
+ * fast
12
+ * simple
13
+ * scalable
14
+
15
+ == SYNOPSIS:
16
+
17
+ see examples/
18
+
19
+ == REQUIREMENTS:
20
+
21
+ * mongodb >= 1.4
22
+ * mongo >= 1.0.0 (gem install mongo)
23
+
24
+ == INSTALL:
25
+
26
+ * rake gem
27
+ * sudo gem install pkg/*.gem
28
+
29
+ == LICENSE:
30
+
31
+ (The MIT License)
32
+
33
+ Copyright (c) 2009 David Cuadrado
34
+
35
+ Permission is hereby granted, free of charge, to any person obtaining
36
+ a copy of this software and associated documentation files (the
37
+ 'Software'), to deal in the Software without restriction, including
38
+ without limitation the rights to use, copy, modify, merge, publish,
39
+ distribute, sublicense, and/or sell copies of the Software, and to
40
+ permit persons to whom the Software is furnished to do so, subject to
41
+ the following conditions:
42
+
43
+ The above copyright notice and this permission notice shall be
44
+ included in all copies or substantial portions of the Software.
45
+
46
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
47
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
48
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
49
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
50
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
51
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
52
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
53
+
@@ -0,0 +1,27 @@
1
+ require 'rubygems'
2
+ gem 'hoe', '>= 2.1.0'
3
+ require 'hoe'
4
+ require 'fileutils'
5
+ require './lib/magent'
6
+
7
+ Hoe.plugin :newgem
8
+ # Hoe.plugin :website
9
+ # Hoe.plugin :cucumberfeatures
10
+
11
+ # Generate all the Rake tasks
12
+ # Run 'rake -T' to see list of generated tasks (from gem root directory)
13
+ $hoe = Hoe.spec 'magent' do
14
+ self.developer 'David Cuadrado', 'krawek@gmail.com'
15
+ self.post_install_message = ''
16
+ self.rubyforge_name = self.name
17
+ self.extra_deps = [['mongo','>= 0.1.0'],
18
+ ['uuidtools', '>= 2.0.0']]
19
+ end
20
+
21
+ require 'newgem/tasks'
22
+ Dir['tasks/**/*.rake'].each { |t| load t }
23
+
24
+ # TODO - want other tests/tasks run by default? Add them to the list
25
+ # remove_task :default
26
+ # task :default => [:spec, :features]
27
+
@@ -0,0 +1,139 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $:.unshift File.dirname(__FILE__)+"/../lib/"
4
+ require 'magent'
5
+ require 'optparse'
6
+ require 'fileutils'
7
+
8
+ def usage(option_parser, error = nil)
9
+ $stderr.puts error if error
10
+ $stderr.puts option_parser
11
+ exit 1
12
+ end
13
+
14
+ options = {}
15
+
16
+ optparser = OptionParser.new do |opts|
17
+ opts.banner = "Usage: #{$0} [options] <start|stop|restart>\n\nExample: magent -t carl1 -a /path/to/agent.rb -d -P /tmp restart\n\nOptions:"
18
+
19
+ opts.on("-a PATH", "--agent=PATH", "Path to agent") do |o|
20
+ options[:agent] = o
21
+ end
22
+
23
+ opts.on("-t ID", "--identifier=ID", "Identifier") do |o|
24
+ options[:identifier] = o
25
+ end
26
+
27
+ opts.on("-d", "--daemonize", "Run agent as a daemon") do |o|
28
+ options[:daemonize] = true
29
+ end
30
+
31
+ opts.on("-l", "--log-path=PATH", "Log path") do |o|
32
+ options[:log_path] = o
33
+ end
34
+
35
+ opts.on("-P", "--piddir=PATH", "PID dir to use (if daemonized)", "Default: #{options[:piddir]}") do |o|
36
+ options[:piddir] = o
37
+ end
38
+
39
+ opts.on_tail("-h", "--help", "Show this help message.") do
40
+ puts opts
41
+ exit
42
+ end
43
+ end
44
+
45
+ args = []
46
+ begin
47
+ args = optparser.parse!
48
+ rescue => e
49
+ $stderr.puts e
50
+ $stderr.puts optparser
51
+ exit 0
52
+ end
53
+
54
+ if !options[:agent]
55
+ usage(optparser, "Error: --agent is required")
56
+ end
57
+
58
+ load options[:agent]
59
+
60
+ if Magent.current_actor.nil?
61
+ usage(optparser, "Use Magent.register(YourActor.new) to register an actor")
62
+ end
63
+
64
+ class Controller
65
+ def initialize(actor, opts)
66
+ @options = opts
67
+ @actor = actor
68
+
69
+ @options[:log_path] ||= Dir.getwd
70
+
71
+ @identity = @options[:identifier] || Magent::Utils.underscore(actor.class.to_s)
72
+ @identity << "-#{Socket.gethostname.split('.')[0]}"
73
+ end
74
+
75
+ def start
76
+ if @options[:daemonize] && @options[:piddir]
77
+ run_as_daemon
78
+ else
79
+ Magent::Processor.new(@actor).run!
80
+ end
81
+ end
82
+
83
+ def stop
84
+ begin
85
+ pid = File.read(pid_file).to_i
86
+ Process.kill("TERM", pid)
87
+ Process.kill(0, pid)
88
+ Process.wait
89
+ rescue Errno::ECHILD, Errno::ESRCH => e
90
+ $stdout.puts "Process #{pid} has stopped"
91
+ rescue Errno::ENOENT => e
92
+ $stdout.puts "Warning: #{e}"
93
+ ensure
94
+ File.unlink(pid_file) if File.exist?(pid_file)
95
+ end
96
+ end
97
+
98
+ def restart
99
+ begin
100
+ stop
101
+ rescue => e
102
+ $stderr.puts "Warning: #{e}"
103
+ end
104
+ start
105
+ end
106
+
107
+ private
108
+ def run_as_daemon
109
+ daemonize
110
+
111
+ FileUtils.mkpath(@options[:piddir])
112
+ if @options[:piddir]
113
+ File.open(pid_file, "w") do |f|
114
+ f.write(Process.pid)
115
+ end
116
+ end
117
+
118
+ Magent::Processor.new(@actor).run!
119
+ end
120
+
121
+ def pid_file
122
+ @pid_file ||= File.join(@options[:piddir], "magent.#{@identity}.pid")
123
+ end
124
+
125
+ def daemonize
126
+ exit if fork
127
+ Process.setsid
128
+ exit if fork
129
+
130
+ STDIN.reopen "/dev/null"
131
+ STDOUT.reopen "#{@options[:log_path]}/magent.#{@identity}.out", "a"
132
+ STDERR.reopen "#{@options[:log_path]}/magent.#{@identity}.err", "a"
133
+
134
+ STDERR.sync = true
135
+ STDOUT.sync = true
136
+ end
137
+ end
138
+
139
+ Controller.new(Magent.current_actor, options).send(args.shift)
@@ -0,0 +1,22 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $:.unshift File.dirname(__FILE__)+"/../../lib/"
4
+ require 'magent'
5
+
6
+ id = "#{rand(16)}#{rand(16)}#{rand(16)}#{rand(16)}"
7
+
8
+ values = (1..5).to_a.map { rand(10) }
9
+ puts values.join(" + ")
10
+ Magent.push("workers", :sum, id, *values)
11
+
12
+ channel = Magent::GenericChannel.new("+#{id}")
13
+
14
+ loop do
15
+ v = channel.dequeue;
16
+ if v
17
+ $stdout.puts v.inspect
18
+ break
19
+ end
20
+ sleep 0.1
21
+ end
22
+
@@ -0,0 +1,30 @@
1
+ $:.unshift File.dirname(__FILE__)+"/../../lib/"
2
+ require 'magent'
3
+
4
+ # Use: magent /path/to/this/file
5
+
6
+ class Worker
7
+ include Magent::Actor
8
+ channel_name "workers"
9
+ expose :sum
10
+
11
+ def sum(payload)
12
+ id, *args = payload
13
+
14
+ s = args.inject(0) { |v, a| a += v }
15
+ send_to_client(id, {:method => :sum, :result => s})
16
+ end
17
+
18
+ private
19
+ def send_to_client(id, message)
20
+ c = Magent::GenericChannel.new("+#{id}")
21
+ c.enqueue(message)
22
+ end
23
+ end
24
+
25
+ Magent.register(Worker.new)
26
+
27
+ if $0 == __FILE__
28
+ Magent::Processor.new(Magent.current_actor).run!
29
+ end
30
+
@@ -0,0 +1,33 @@
1
+ $:.unshift File.dirname(__FILE__)+"/../../lib/"
2
+ require 'magent'
3
+
4
+ Magent.push("errors", :fail, "this is a fail")
5
+
6
+ class Error
7
+ include Magent::Actor
8
+
9
+ channel_name "errors"
10
+ expose :fail
11
+
12
+ def fail(payload)
13
+ @count ||= 0
14
+ errors = self.class.channel.errors
15
+
16
+ errors.each do |error|
17
+ @count += 1
18
+ $stderr.puts "Retrying: #{error["method"]}(#{error["payload"].inspect})"
19
+ self.class.channel.retry_error(error)
20
+ end
21
+
22
+ if @count == 0
23
+ raise payload.inspect
24
+ end
25
+ end
26
+ end
27
+
28
+ Magent.register(Error.new)
29
+
30
+ if $0 == __FILE__
31
+ Magent::Processor.new(Magent.current_actor).run!
32
+ end
33
+
@@ -0,0 +1,37 @@
1
+ $:.unshift File.dirname(__FILE__)+"/../../lib/"
2
+ require 'magent'
3
+
4
+ # Use: magent /path/to/this/file
5
+
6
+ Magent.push("bots", :echo, "hello, world")
7
+ Magent.push("bots", :do_task, "File", :exist?, "/etc/passwd")
8
+ Magent.push("bots", :echo, "Press ctrl+c to close")
9
+ Magent.push("bots", :do_not_exist, "you should not see this message")
10
+
11
+ class Bot
12
+ include Magent::Actor
13
+ channel_name "bots"
14
+ expose :echo, :do_task
15
+
16
+ def echo(payload)
17
+ $stderr.puts payload.inspect
18
+ end
19
+
20
+ def do_task(payload)
21
+ klass, *args = payload
22
+
23
+ result = Object.module_eval(klass).send(*args)
24
+ $stderr.puts "RESULT: #{result}"
25
+ end
26
+
27
+ at_least_every 15 do
28
+ puts "Hi there!, you'll see this message again in ~15 seconds"
29
+ end
30
+ end
31
+
32
+ Magent.register(Bot.new)
33
+
34
+ if $0 == __FILE__
35
+ Magent::Processor.new(Magent.current_actor).run!
36
+ end
37
+
@@ -0,0 +1,27 @@
1
+ $:.unshift File.dirname(__FILE__)+"/../../lib/"
2
+ require 'magent'
3
+
4
+ Magent.push("stats", :calc)
5
+ Magent.push("stats", :calc)
6
+ Magent.push("stats", :calc)
7
+ Magent.push("stats", :calc)
8
+
9
+ class Stats
10
+ include Magent::Actor
11
+
12
+ channel_name "stats"
13
+ expose :calc
14
+
15
+ def calc(payload)
16
+ $stderr.puts "messages in queue: #{self.class.channel.queue_count}"
17
+ $stderr.puts "total messages count: #{self.class.channel.message_count}"
18
+ $stderr.puts "total errors: #{self.class.channel.error_count}"
19
+ end
20
+ end
21
+
22
+ Magent.register(Stats.new)
23
+
24
+ if $0 == __FILE__
25
+ Magent::Processor.new(Magent.current_actor).run!
26
+ end
27
+
@@ -0,0 +1,57 @@
1
+ $:.unshift(File.dirname(__FILE__)) unless
2
+ $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
+
4
+ require 'mongo'
5
+ require 'set'
6
+ require 'uuidtools'
7
+
8
+ require 'magent/utils'
9
+ require 'magent/generic_channel'
10
+ require 'magent/channel'
11
+ require 'magent/push'
12
+ require 'magent/actor'
13
+ require 'magent/processor'
14
+
15
+ module Magent
16
+ VERSION = '0.4.1'
17
+
18
+ @@db_name = 'magent'
19
+ @@host = 'localhost'
20
+ @@port = '27017'
21
+ @@username = ''
22
+ @@password = ''
23
+
24
+ def self.host(host,port)
25
+ @@host = host
26
+ @@port = port
27
+ end
28
+
29
+ def self.auth(username,password)
30
+ @@username = username
31
+ @@password = password
32
+ end
33
+
34
+ def self.db_name(db_name)
35
+ @@db_name = db_name
36
+ end
37
+
38
+ def self.connection
39
+ return @@connection if defined? @@connection
40
+ @@connection = Mongo::Connection.new(@@host, @@port, :auto_reconnect => true)
41
+ @@connection.add_auth(@@db_name, @@username, @@password) if @@username!='' && @@password!=''
42
+ return @@connection
43
+ end
44
+
45
+ def self.connection=(new_connection)
46
+ @@connection = new_connection
47
+ end
48
+
49
+ def self.database=(name)
50
+ @@database = Magent.connection.db(name)
51
+ end
52
+
53
+ def self.database
54
+ @@database ||= Magent.connection.db(@@db_name)
55
+ end
56
+ end
57
+
@@ -0,0 +1,78 @@
1
+ module Magent
2
+ module Actor
3
+ def self.included(klass)
4
+ klass.class_eval do
5
+ extend Actor::ClassMethods
6
+ include Actor::InstanceMethods
7
+ end
8
+ end
9
+
10
+ module ClassMethods
11
+ def expose(*methods)
12
+ methods.each do |m|
13
+ actions << m.to_s
14
+ end
15
+ end
16
+
17
+ def channel_name(name = nil)
18
+ @channel_name ||= (name || Magent::Utils.underscore(self.name)).to_s
19
+ end
20
+
21
+ def actions
22
+ @actions ||= Set.new
23
+ end
24
+
25
+ def can_handle?(action)
26
+ actions.include?(action.to_s)
27
+ end
28
+
29
+ def channel
30
+ @channel ||= begin
31
+ Channel.new(self.channel_name)
32
+ end
33
+ end
34
+
35
+ def tasks
36
+ @tasks ||= []
37
+ end
38
+
39
+ def at_least_every(seconds, &block)
40
+ tasks << {:every => seconds, :last_time => Time.now, :block => block}
41
+ end
42
+ end
43
+
44
+ module InstanceMethods
45
+ def _run_tasks
46
+ tasks = self.class.tasks
47
+
48
+ return false if tasks.empty?
49
+ performed = false
50
+
51
+ tasks.each do |task|
52
+ delta = Time.now - task[:last_time]
53
+
54
+ if delta >= task[:every]
55
+ task[:last_time] = Time.now
56
+ begin
57
+ instance_eval(&task[:block])
58
+ rescue Exception => e
59
+ $stderr.puts "Failed periodical task: #{e.message}"
60
+ $stderr.puts e.backtrace.join("\n\t")
61
+ end
62
+ performed = true
63
+ end
64
+ end
65
+
66
+ performed
67
+ end
68
+ end
69
+ end # Actor
70
+
71
+ def self.register(actor)
72
+ @current_actor = actor
73
+ end
74
+
75
+ def self.current_actor
76
+ @current_actor
77
+ end
78
+ end
@@ -0,0 +1,37 @@
1
+ module Magent
2
+ class Channel < GenericChannel
3
+ def enqueue(message, args)
4
+ super([message, args])
5
+ end
6
+
7
+ def failed(info)
8
+ error_collection.save(info.merge({:_id => generate_uid, :channel => @name, :created_at => Time.now.utc}))
9
+ end
10
+
11
+ def error_count
12
+ error_collection.count()
13
+ end
14
+
15
+ def errors(conds = {})
16
+ page = conds.delete(:page) || 1
17
+ per_page = conds.delete(:per_page) || 10
18
+
19
+ error_collection.find({}, {:skip => (page-1)*per_page,
20
+ :limit => per_page,
21
+ :sort => [["created_at", -1]]})
22
+ end
23
+
24
+ def remove_error(error_id)
25
+ self.error_collection.remove(:_id => error_id)
26
+ end
27
+
28
+ def retry_error(error)
29
+ remove_error(error["_id"])
30
+ enqueue(error["method"], error["payload"])
31
+ end
32
+
33
+ def error_collection
34
+ @error_collection ||= Magent.database.collection("#{@name}-errors")
35
+ end
36
+ end # Channel
37
+ end
@@ -0,0 +1,43 @@
1
+ module Magent
2
+ class GenericChannel
3
+ attr_reader :name
4
+
5
+ def initialize(name)
6
+ @name = name
7
+ end
8
+
9
+ def enqueue(message)
10
+ collection.save({:_id => generate_uid, :message => message, :priority => 3, :created_at => Time.now.to_i})
11
+ end
12
+
13
+ def message_count
14
+ collection.count # TODO: number of processed messages (create a collection for stats)
15
+ end
16
+
17
+ def queue_count
18
+ collection.count
19
+ end
20
+
21
+ def dequeue
22
+ if m = self.next_message
23
+ m["message"]
24
+ end
25
+ end
26
+
27
+ def next_message
28
+ Magent.database.command(BSON::OrderedHash[:findandmodify, @name,
29
+ :sort, [{:priority => -1}, {:created_at => 1}],
30
+ :remove, true
31
+ ])["value"]
32
+ end
33
+
34
+ def collection
35
+ @collection ||= Magent.database.collection(@name)
36
+ end
37
+
38
+ protected
39
+ def generate_uid
40
+ UUIDTools::UUID.random_create.hexdigest
41
+ end
42
+ end # GenericChannel
43
+ end
@@ -0,0 +1,68 @@
1
+ module Magent
2
+ class Processor
3
+ attr_reader :actor
4
+
5
+ def initialize(actor)
6
+ @actor = actor
7
+ @shutdown = false
8
+
9
+ @actor.class.actions.each do |action|
10
+ if !@actor.respond_to?(action)
11
+ raise ArgumentError, "action '#{action}' is not defined"
12
+ end
13
+ end
14
+ end
15
+
16
+ def run!
17
+ processed_messages = 0
18
+ delay = 0
19
+
20
+ trap('TERM') { shutdown!; exit 0 }
21
+ trap('SIGINT') { shutdown!; exit 0 }
22
+
23
+ loop do
24
+ break if @shutdown
25
+
26
+ delay = 0 if @actor._run_tasks
27
+
28
+ @method, @payload = @actor.class.channel.dequeue
29
+
30
+ if @method.nil?
31
+ delay += 0.1 if delay <= 5
32
+ else
33
+ delay = 0
34
+ $stderr.puts "#{@actor.class}##{@method}(#{@payload.inspect})"
35
+ begin
36
+ if @actor.class.can_handle?(@method)
37
+ processed_messages += 1
38
+ @actor.send(@method, @payload)
39
+
40
+ if processed_messages > 20
41
+ processed_messages = 0
42
+ GC.start
43
+ end
44
+ else
45
+ $stderr.puts "Unknown action: #{@method} (payload=#{@payload.inspect})"
46
+ end
47
+ rescue SystemExit
48
+ rescue Exception => e
49
+ $stderr.puts "Error while executing #{@method.inspect} #{@payload.inspect}"
50
+ $stderr.puts "#{e.to_s}\n#{e.backtrace.join("\t\n")}"
51
+ @actor.class.channel.failed(:message => e.message, :method => @method, :payload => @payload, :backtrace => e.backtrace, :date => Time.now.utc)
52
+ ensure
53
+ @method, @payload = nil
54
+ end
55
+ end
56
+ sleep delay
57
+ end
58
+ end
59
+
60
+ def shutdown!
61
+ @shutdown = true
62
+ $stderr.puts "Shutting down..."
63
+ if @method
64
+ @actor.class.channel.enqueue(@method, @payload)
65
+ end
66
+ end
67
+ end #Processor
68
+ end
@@ -0,0 +1,13 @@
1
+ module Magent
2
+ def self.push(channel_name, method, *args)
3
+ self.channel(channel_name.to_s).enqueue(method, args)
4
+ end
5
+
6
+ def self.channel(name)
7
+ self.channels[name] ||= Channel.new(name)
8
+ end
9
+
10
+ def self.channels
11
+ @channels ||= {}
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ module Magent
2
+ module Utils
3
+ def self.underscore(word)
4
+ word.to_s.gsub(/::/, '.').
5
+ gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
6
+ gsub(/([a-z\d])([A-Z])/,'\1_\2').tr("-", "_").downcase
7
+ end
8
+
9
+ def self.camelize(word)
10
+ word.to_s.gsub(/\.(.?)/) { "::#{$1.upcase}" }.gsub(/(?:^|_)(.)/) { $1.upcase }
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,46 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = %q{thirtysixthspan-magent}
5
+ s.version = "0.4.1"
6
+
7
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
+ s.authors = ["David Cuadrado"]
9
+ s.date = %q{2010-05-10}
10
+ s.default_executable = %q{magent}
11
+ s.description = %q{Simple job queue system based on mongodb}
12
+ s.email = ["krawek@gmail.com"]
13
+ s.executables = ["magent"]
14
+ s.extra_rdoc_files = ["History.txt", "Manifest.txt", "PostInstall.txt"]
15
+ s.files = ["History.txt", "Manifest.txt", "PostInstall.txt", "README.rdoc", "Rakefile", "bin/magent", "examples/comm/run.rb", "examples/comm/worker.rb", "examples/error/error.rb", "examples/simple/bot.rb", "examples/stats/stats.rb", "lib/magent.rb", "lib/magent/actor.rb", "lib/magent/channel.rb", "lib/magent/generic_channel.rb", "lib/magent/processor.rb", "lib/magent/push.rb", "lib/magent/utils.rb", "magent.gemspec", "script/console", "test/test_helper.rb", "test/test_magent.rb"]
16
+ s.homepage = %q{http://github.com/dcu/magent}
17
+ s.post_install_message = %q{}
18
+ s.rdoc_options = ["--main", "README.rdoc"]
19
+ s.require_paths = ["lib"]
20
+ s.rubyforge_project = %q{magent}
21
+ s.rubygems_version = %q{1.3.6}
22
+ s.summary = %q{Simple job queue system based on mongodb}
23
+ s.test_files = ["test/test_helper.rb", "test/test_magent.rb"]
24
+
25
+ if s.respond_to? :specification_version then
26
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
27
+ s.specification_version = 3
28
+
29
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
30
+ s.add_runtime_dependency(%q<mongo>, [">= 0.1.0"])
31
+ s.add_runtime_dependency(%q<uuidtools>, [">= 2.0.0"])
32
+ s.add_development_dependency(%q<rubyforge>, [">= 2.0.4"])
33
+ s.add_development_dependency(%q<hoe>, [">= 2.6.0"])
34
+ else
35
+ s.add_dependency(%q<mongo>, [">= 0.1.0"])
36
+ s.add_dependency(%q<uuidtools>, [">= 2.0.0"])
37
+ s.add_dependency(%q<rubyforge>, [">= 2.0.4"])
38
+ s.add_dependency(%q<hoe>, [">= 2.6.0"])
39
+ end
40
+ else
41
+ s.add_dependency(%q<mongo>, [">= 0.1.0"])
42
+ s.add_dependency(%q<uuidtools>, [">= 2.0.0"])
43
+ s.add_dependency(%q<rubyforge>, [">= 2.0.4"])
44
+ s.add_dependency(%q<hoe>, [">= 2.6.0"])
45
+ end
46
+ end
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env ruby
2
+ # File: script/console
3
+ irb = RUBY_PLATFORM =~ /(:?mswin|mingw)/ ? 'irb.bat' : 'irb'
4
+
5
+ libs = " -r irb/completion"
6
+ #libs << " -r #{File.dirname(__FILE__) + '/../lib/console_lib/init.rb'}"
7
+ libs << " -r #{File.dirname(__FILE__) + '/../lib/magent.rb'}"
8
+ puts "Loading magent gem"
9
+ exec "#{irb} #{libs} --simple-prompt"
@@ -0,0 +1,3 @@
1
+ require 'stringio'
2
+ require 'test/unit'
3
+ require File.dirname(__FILE__) + '/../lib/magent'
@@ -0,0 +1,11 @@
1
+ require File.dirname(__FILE__) + '/test_helper.rb'
2
+
3
+ class TestMagent < Test::Unit::TestCase
4
+
5
+ def setup
6
+ end
7
+
8
+ def test_truth
9
+ assert true
10
+ end
11
+ end
metadata ADDED
@@ -0,0 +1,149 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: thirtysixthspan-magent
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 4
8
+ - 1
9
+ version: 0.4.1
10
+ platform: ruby
11
+ authors:
12
+ - David Cuadrado
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2010-05-10 00:00:00 -05:00
18
+ default_executable: magent
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: mongo
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ segments:
29
+ - 0
30
+ - 1
31
+ - 0
32
+ version: 0.1.0
33
+ type: :runtime
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: uuidtools
37
+ prerelease: false
38
+ requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ segments:
44
+ - 2
45
+ - 0
46
+ - 0
47
+ version: 2.0.0
48
+ type: :runtime
49
+ version_requirements: *id002
50
+ - !ruby/object:Gem::Dependency
51
+ name: rubyforge
52
+ prerelease: false
53
+ requirement: &id003 !ruby/object:Gem::Requirement
54
+ none: false
55
+ requirements:
56
+ - - ">="
57
+ - !ruby/object:Gem::Version
58
+ segments:
59
+ - 2
60
+ - 0
61
+ - 4
62
+ version: 2.0.4
63
+ type: :development
64
+ version_requirements: *id003
65
+ - !ruby/object:Gem::Dependency
66
+ name: hoe
67
+ prerelease: false
68
+ requirement: &id004 !ruby/object:Gem::Requirement
69
+ none: false
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ segments:
74
+ - 2
75
+ - 6
76
+ - 0
77
+ version: 2.6.0
78
+ type: :development
79
+ version_requirements: *id004
80
+ description: Simple job queue system based on mongodb
81
+ email:
82
+ - krawek@gmail.com
83
+ executables:
84
+ - magent
85
+ extensions: []
86
+
87
+ extra_rdoc_files:
88
+ - History.txt
89
+ - Manifest.txt
90
+ - PostInstall.txt
91
+ files:
92
+ - History.txt
93
+ - Manifest.txt
94
+ - PostInstall.txt
95
+ - README.rdoc
96
+ - Rakefile
97
+ - bin/magent
98
+ - examples/comm/run.rb
99
+ - examples/comm/worker.rb
100
+ - examples/error/error.rb
101
+ - examples/simple/bot.rb
102
+ - examples/stats/stats.rb
103
+ - lib/magent.rb
104
+ - lib/magent/actor.rb
105
+ - lib/magent/channel.rb
106
+ - lib/magent/generic_channel.rb
107
+ - lib/magent/processor.rb
108
+ - lib/magent/push.rb
109
+ - lib/magent/utils.rb
110
+ - magent.gemspec
111
+ - script/console
112
+ - test/test_helper.rb
113
+ - test/test_magent.rb
114
+ has_rdoc: true
115
+ homepage: http://github.com/dcu/magent
116
+ licenses: []
117
+
118
+ post_install_message: ""
119
+ rdoc_options:
120
+ - --main
121
+ - README.rdoc
122
+ require_paths:
123
+ - lib
124
+ required_ruby_version: !ruby/object:Gem::Requirement
125
+ none: false
126
+ requirements:
127
+ - - ">="
128
+ - !ruby/object:Gem::Version
129
+ segments:
130
+ - 0
131
+ version: "0"
132
+ required_rubygems_version: !ruby/object:Gem::Requirement
133
+ none: false
134
+ requirements:
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ segments:
138
+ - 0
139
+ version: "0"
140
+ requirements: []
141
+
142
+ rubyforge_project: magent
143
+ rubygems_version: 1.3.7
144
+ signing_key:
145
+ specification_version: 3
146
+ summary: Simple job queue system based on mongodb
147
+ test_files:
148
+ - test/test_helper.rb
149
+ - test/test_magent.rb