magent 0.1.3 → 0.2

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.rdoc CHANGED
@@ -8,7 +8,7 @@ Simple job queue system based on mongodb
8
8
 
9
9
  == FEATURES/PROBLEMS:
10
10
 
11
- * fast (enough?)
11
+ * fast
12
12
  * simple
13
13
  * scalable
14
14
 
@@ -18,8 +18,8 @@ see examples/
18
18
 
19
19
  == REQUIREMENTS:
20
20
 
21
- * mongodb >= 1.0
22
- * mongo >= 0.15.1 (gem install mongo -s http://gemcutter.org )
21
+ * mongodb >= 1.3
22
+ * mongo >= 0.18.2 (gem install mongo)
23
23
 
24
24
  == INSTALL:
25
25
 
data/Rakefile CHANGED
@@ -12,10 +12,10 @@ Hoe.plugin :newgem
12
12
  # Run 'rake -T' to see list of generated tasks (from gem root directory)
13
13
  $hoe = Hoe.spec 'magent' do
14
14
  self.developer 'David Cuadrado', 'krawek@gmail.com'
15
- self.post_install_message = 'PostInstall.txt'
15
+ self.post_install_message = ''
16
16
  self.rubyforge_name = self.name
17
- self.extra_deps = [['mongo','>= 0.16']]
18
-
17
+ self.extra_deps = [['mongo','>= 0.18.2'],
18
+ ['uuidtools', '>= 2.0.0']]
19
19
  end
20
20
 
21
21
  require 'newgem/tasks'
data/lib/magent.rb CHANGED
@@ -3,6 +3,8 @@ $:.unshift(File.dirname(__FILE__)) unless
3
3
 
4
4
  require 'mongo'
5
5
  require 'set'
6
+ require 'uuidtools'
7
+
6
8
  require 'magent/utils'
7
9
  require 'magent/generic_channel'
8
10
  require 'magent/channel'
@@ -11,7 +13,7 @@ require 'magent/actor'
11
13
  require 'magent/processor'
12
14
 
13
15
  module Magent
14
- VERSION = '0.1.3'
16
+ VERSION = '0.2'
15
17
 
16
18
  def self.connection
17
19
  @@connection ||= Mongo::Connection.new(nil, nil, :auto_reconnect => true)
data/lib/magent/actor.rb CHANGED
@@ -23,8 +23,7 @@ module Magent
23
23
  end
24
24
 
25
25
  def can_handle?(action)
26
- return false if @actions.nil?
27
- @actions.include?(action.to_s)
26
+ actions.include?(action.to_s)
28
27
  end
29
28
 
30
29
  def channel
@@ -5,27 +5,24 @@ module Magent
5
5
  end
6
6
 
7
7
  def failed(info)
8
- error_collection.save(info.merge({:channel_id => @name, :created_at => Time.now.utc}))
8
+ error_collection.save(info.merge({:_id => generate_uid, :channel => @name, :created_at => Time.now.utc}))
9
9
  end
10
10
 
11
11
  def error_count
12
- error_collection.find({:channel_id => @name}).count()
12
+ error_collection.count()
13
13
  end
14
14
 
15
15
  def errors(conds = {})
16
16
  page = conds.delete(:page) || 1
17
17
  per_page = conds.delete(:per_page) || 10
18
18
 
19
- error_collection.find({:channel_id => @name}, {:skip => (page-1)*per_page, :limit => per_page, :sort => [["created_at", "descending"]]})
19
+ error_collection.find({}, {:skip => (page-1)*per_page,
20
+ :limit => per_page,
21
+ :sort => [["created_at", -1]]})
20
22
  end
21
23
 
22
24
  def remove_error(error_id)
23
- object_id = error_id
24
- if error_id.kind_of?(String)
25
- object_id = Mongo::ObjectID.from_string(error_id)
26
- end
27
-
28
- self.error_collection.remove(:_id => object_id, :channel_id => @name)
25
+ self.error_collection.remove(:_id => error_id)
29
26
  end
30
27
 
31
28
  def retry_error(error)
@@ -34,7 +31,7 @@ module Magent
34
31
  end
35
32
 
36
33
  def error_collection
37
- @error_collection ||= Magent.database.collection("errors")
34
+ @error_collection ||= Magent.database.collection("#{@name}-errors")
38
35
  end
39
36
  end # Channel
40
37
  end
@@ -1,64 +1,43 @@
1
1
  module Magent
2
2
  class GenericChannel
3
+ attr_reader :name
4
+
3
5
  def initialize(name)
4
6
  @name = name
5
-
6
- if !collection.find_one({:_id => @name}, {:fields => [:_id]})
7
- collection.save({:_id => @name, :messages => []})
8
- end
9
7
  end
10
8
 
11
9
  def enqueue(message)
12
- collection.update({:_id => @name}, {:$push => {:messages => message}, :$inc => {:message_count => 1}}, :repsert => true)
10
+ collection.save({:_id => generate_uid, :message => message, :priority => 3, :created_at => Time.now.to_i})
13
11
  end
14
12
 
15
13
  def message_count
16
- channel = collection.find({:_id => @name}, :fields => [:message_count]).next_object
17
- if channel
18
- channel["message_count"] || 0
19
- else
20
- 0
21
- end
14
+ collection.count # TODO: number of processed messages (create a collection for stats)
22
15
  end
23
16
 
24
17
  def queue_count
25
- Magent.database.eval(%@
26
- function queue_count() {
27
- var selector = {_id: '#{@name}'};
28
- var q = db.channels.findOne(selector, {messages: 1 });
29
- return q.messages.length;
30
- }
31
- @)
18
+ collection.count
32
19
  end
33
20
 
34
21
  def dequeue
35
- Magent.database.eval(%@
36
- function dequeue() {
37
- var selector = {_id: '#{@name}'};
38
- var q = db.channels.findOne(selector, {messages: 1 });
39
- var m = q.messages[0];
40
- if(m)
41
- db.channels.update(selector, { $pop: { messages : -1 } })
42
- return m;
43
- }
44
- @)
22
+ if m = self.next_message
23
+ m["message"]
24
+ end
45
25
  end
46
26
 
47
- def collection
48
- self.class.collection
27
+ def next_message
28
+ Magent.database.command(OrderedHash[:findandmodify, @name,
29
+ :sort, [{:priority => -1}, {:created_at => 1}],
30
+ :remove, true
31
+ ])["value"]
49
32
  end
50
33
 
51
- def self.collection
52
- @collection ||= Magent.database.collection("channels")
34
+ def collection
35
+ @collection ||= Magent.database.collection(@name)
53
36
  end
54
37
 
55
- def self.all(&block)
56
- cursor = collection.find({}, :fields => [:_id])
57
- if block_given?
58
- cursor.map {|c| name = c["_id"]; yield name; name }
59
- else
60
- cursor.map {|c| c["_id"] }
61
- end
38
+ protected
39
+ def generate_uid
40
+ UUIDTools::UUID.random_create.hexdigest
62
41
  end
63
42
  end # GenericChannel
64
43
  end
@@ -33,7 +33,7 @@ module Magent
33
33
  delay = 0
34
34
  $stderr.puts "#{@actor.class}##{@method}(#{@payload.inspect})"
35
35
  begin
36
- if @actor.class.actions.include?(@method)
36
+ if @actor.class.can_handle?(@method)
37
37
  processed_messages += 1
38
38
  @actor.send(@method, @payload)
39
39
 
data/magent.gemspec CHANGED
@@ -2,11 +2,11 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{magent}
5
- s.version = "0.1.3"
5
+ s.version = "0.2"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["David Cuadrado"]
9
- s.date = %q{2009-11-08}
9
+ s.date = %q{2010-01-06}
10
10
  s.default_executable = %q{magent}
11
11
  s.description = %q{Simple job queue system based on mongodb}
12
12
  s.email = ["krawek@gmail.com"]
@@ -14,7 +14,7 @@ Gem::Specification.new do |s|
14
14
  s.extra_rdoc_files = ["History.txt", "Manifest.txt", "PostInstall.txt"]
15
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
16
  s.homepage = %q{http://github.com/dcu/magent}
17
- s.post_install_message = %q{PostInstall.txt}
17
+ s.post_install_message = %q{}
18
18
  s.rdoc_options = ["--main", "README.rdoc"]
19
19
  s.require_paths = ["lib"]
20
20
  s.rubyforge_project = %q{magent}
@@ -27,14 +27,17 @@ Gem::Specification.new do |s|
27
27
  s.specification_version = 3
28
28
 
29
29
  if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
30
- s.add_runtime_dependency(%q<mongo>, [">= 0.16"])
30
+ s.add_runtime_dependency(%q<mongo>, [">= 0.18.2"])
31
+ s.add_runtime_dependency(%q<uuidtools>, [">= 2.0.0"])
31
32
  s.add_development_dependency(%q<hoe>, [">= 2.3.3"])
32
33
  else
33
- s.add_dependency(%q<mongo>, [">= 0.16"])
34
+ s.add_dependency(%q<mongo>, [">= 0.18.2"])
35
+ s.add_dependency(%q<uuidtools>, [">= 2.0.0"])
34
36
  s.add_dependency(%q<hoe>, [">= 2.3.3"])
35
37
  end
36
38
  else
37
- s.add_dependency(%q<mongo>, [">= 0.16"])
39
+ s.add_dependency(%q<mongo>, [">= 0.18.2"])
40
+ s.add_dependency(%q<uuidtools>, [">= 2.0.0"])
38
41
  s.add_dependency(%q<hoe>, [">= 2.3.3"])
39
42
  end
40
43
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: magent
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: "0.2"
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Cuadrado
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-11-08 00:00:00 -05:00
12
+ date: 2010-01-06 00:00:00 -05:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -20,7 +20,17 @@ dependencies:
20
20
  requirements:
21
21
  - - ">="
22
22
  - !ruby/object:Gem::Version
23
- version: "0.16"
23
+ version: 0.18.2
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: uuidtools
27
+ type: :runtime
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 2.0.0
24
34
  version:
25
35
  - !ruby/object:Gem::Dependency
26
36
  name: hoe
@@ -70,7 +80,7 @@ has_rdoc: true
70
80
  homepage: http://github.com/dcu/magent
71
81
  licenses: []
72
82
 
73
- post_install_message: PostInstall.txt
83
+ post_install_message: ""
74
84
  rdoc_options:
75
85
  - --main
76
86
  - README.rdoc