active_mongo 0.1.2 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.textile CHANGED
@@ -11,8 +11,8 @@ h2. Installation
11
11
  # Add to your Rails application Gemfile
12
12
  # Run gem bundle
13
13
  # Load gem. For example, create initializer that says "require 'active_mongo'"
14
- # Create config/mongo.yml. Format is the same as database.yml. Database, host and port are required
15
- # Create a model, which is a subclass of ActiveMonog::Base
14
+ # Create config/mongo.yml. Format is the same as database.yml. Database, host and port are required. User and password are optional
15
+ # Create a model, which is a subclass of ActiveMongo::Base
16
16
 
17
17
  h2. Usage
18
18
 
@@ -78,13 +78,45 @@ You can limit what may be assigned by passing a hash to #new or #update_attribut
78
78
  attr_accessible :attribute
79
79
  </code></pre>
80
80
 
81
+ h3. Do not save specific field to database
82
+
83
+ <pre><code>
84
+ attr_clear :attribute
85
+ </code></pre>
86
+
87
+ h3. Indexes
88
+
89
+ <pre><code>
90
+ ensure_index :attribute
91
+ ensure_index :attribute, :unique => true
92
+ ensure_index [ [:attribute, Mongo::ASCENDING] ], :unique => true # takes mongo-driver syntax
93
+ </code></pre>
94
+
95
+ h3. Callbacks
96
+
97
+ after initialize and before/after/around create, update and save callbacks are supported
98
+
99
+ <pre><code>
100
+ after_save :method
101
+ </code></pre>
102
+
103
+ h4. Named Scopes
104
+
105
+ <pre><code>
106
+ #in model
107
+ named_scope :with_value, :attribute => :value #all mongo_driver find() parameters accepted
108
+
109
+ #in code
110
+ Model.with_value #returns scoped class
111
+ Model.with_value.find() #run find with scope
112
+ Model.with_value.new() #initialize an object with scope
113
+ </code></pre>
114
+
81
115
  h2. Coming soon
82
116
 
83
- * Named scopes
84
- * Callbacks
85
- * Tests
86
- * Mongo authentication support
87
117
  * Documentation
118
+ * Tests
119
+ * Even more goodies
88
120
 
89
121
  h2. License
90
122
 
data/Rakefile CHANGED
@@ -10,7 +10,7 @@ begin
10
10
  gem.email = "mantas@idev.lt"
11
11
  gem.homepage = "http://github.com/mantas/ActiveMongo"
12
12
  gem.authors = ["Mantas Masalskis"]
13
- gem.add_development_dependency "thoughtbot-shoulda", ">= 0"
13
+ #gem.add_development_dependency "thoughtbot-shoulda", ">= 0"
14
14
  # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
15
15
  end
16
16
  Jeweler::GemcutterTasks.new
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.2
1
+ 0.2.0
data/active_mongo.gemspec CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{active_mongo}
8
- s.version = "0.1.2"
8
+ s.version = "0.2.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Mantas Masalskis"]
@@ -24,11 +24,13 @@ Gem::Specification.new do |s|
24
24
  "Rakefile",
25
25
  "VERSION",
26
26
  "active_mongo.gemspec",
27
- "lib/README",
28
27
  "lib/active_mongo.rb",
28
+ "lib/active_mongo_attr_accessible.rb",
29
29
  "lib/active_mongo_collection.rb",
30
30
  "lib/active_mongo_has_many.rb",
31
+ "lib/active_mongo_indexes.rb",
31
32
  "lib/active_mongo_instance.rb",
33
+ "lib/active_mongo_named_scopes.rb",
32
34
  "lib/active_mongo_scope.rb",
33
35
  "lib/active_mongo_uniquenesss.rb",
34
36
  "test/helper.rb",
@@ -49,12 +51,9 @@ Gem::Specification.new do |s|
49
51
  s.specification_version = 3
50
52
 
51
53
  if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
52
- s.add_development_dependency(%q<thoughtbot-shoulda>, [">= 0"])
53
54
  else
54
- s.add_dependency(%q<thoughtbot-shoulda>, [">= 0"])
55
55
  end
56
56
  else
57
- s.add_dependency(%q<thoughtbot-shoulda>, [">= 0"])
58
57
  end
59
58
  end
60
59
 
data/lib/active_mongo.rb CHANGED
@@ -7,16 +7,33 @@ config = YAML::load(File.open("#{RAILS_ROOT}/config/mongo.yml"))[Rails.env]
7
7
  $mongo_conn = Connection.new(config["host"], config["port"], :pool_size => 5, :timeout => 5)
8
8
  $mongo_db = $mongo_conn.db(config["database"])
9
9
 
10
+ if config["user"]
11
+ if !$mongo_db.authenticate(config["user"], config["password"])
12
+ puts "Wrong MongoDB user and/or password!!!"
13
+ end
14
+ end
15
+
10
16
  require 'active_mongo_has_many'
17
+ require 'active_mongo_attr_accessible'
18
+ require 'active_mongo_indexes'
19
+ require 'active_mongo_named_scopes'
11
20
 
12
21
  module ActiveMongo
13
22
 
14
23
  class Base
15
24
  include ActiveModel::Conversion
16
25
  include ActiveModel::Validations
26
+ include ActiveModel::Callbacks
27
+ extend ActiveModel::Callbacks
28
+ extend ActiveMongo::Indexes::ClassMethods
29
+ extend ActiveMongo::AttrAccessible::ClassMethods
30
+ extend ActiveMongo::NamedScopes::ClassMethods
17
31
  extend ActiveMongo::HasMany::ClassMethods
18
32
  include ActiveMongo::HasMany::InstanceMethods
19
33
 
34
+ define_model_callbacks :create, :save, :update
35
+ define_model_callbacks :initializer, :only => :after
36
+
20
37
  class << self; attr_accessor :scope; end
21
38
 
22
39
  def self.extended(klass)
@@ -0,0 +1,34 @@
1
+ module ActiveMongo
2
+ module AttrAccessible
3
+ module ClassMethods
4
+ def attr_accessible(*input)
5
+ @@internal_attr_accessible = []
6
+
7
+ input.each do |field|
8
+ @@internal_attr_accessible.push(field.to_sym).uniq!
9
+ end
10
+ end
11
+
12
+ def attr_accessible_get
13
+ @@internal_attr_accessible || []
14
+ end
15
+
16
+ def attr_clear(*input)
17
+ @@internal_attr_clear = []
18
+
19
+ input.each do |field|
20
+ @@internal_attr_clear.push(field.to_sym).uniq!
21
+ end
22
+ end
23
+
24
+ def attr_accessible_get
25
+ @@internal_attr_accessible || []
26
+ end
27
+
28
+ def attr_clear_get
29
+ @@internal_attr_clear || []
30
+ end
31
+
32
+ end
33
+ end
34
+ end
@@ -29,10 +29,18 @@ ActiveMongo::Base.class_eval do
29
29
  end
30
30
 
31
31
  def self.find(attrs = {})
32
- if attrs.class == String
33
- id = Mongo::ObjectID.from_string(attrs[0])
32
+ if attrs.class == String || attrs.class == Mongo::ObjectID
33
+ id = Mongo::ObjectID.from_string(attrs) if attrs.class == String
34
34
 
35
- return self.collection.find_one(id)
35
+ id ||= attrs
36
+
37
+ obj = self.collection.find_one(id)
38
+
39
+ model = eval(self.name || @name).new
40
+
41
+ obj.each {|key, value| model.set_var(key, value) }
42
+
43
+ return model
36
44
  else
37
45
  attrs = self.scope.merge(attrs) if self.scope
38
46
 
@@ -61,11 +69,14 @@ ActiveMongo::Base.class_eval do
61
69
  def self.new(*attrs)
62
70
  attrs = attrs[0]
63
71
 
64
- # if self.scope
65
- # attrs ||= {}
66
- # attrs.merge!(self.scope)
67
- # end
68
-
69
72
  eval(self.name || @name).__old_new(attrs, :scope => self.scope)
70
73
  end
74
+
75
+ def self.method_missing(m, *attrs, &block)
76
+ if self.internal_named_scopes_get(m)
77
+ return self.named_scope_hit(m)
78
+ end
79
+
80
+ super
81
+ end
71
82
  end
@@ -5,14 +5,6 @@ module ActiveMongo
5
5
  internal_has_manies_set(name, attrs)
6
6
  end
7
7
 
8
- def attr_accessible(*input)
9
- @@internal_attr_accessible = []
10
-
11
- input.each do |field|
12
- @@internal_attr_accessible.push(field.to_sym).uniq!
13
- end
14
- end
15
-
16
8
  def internal_has_manies_set(name, attrs)
17
9
  @@internal_has_manies ||= {}
18
10
 
@@ -25,11 +17,6 @@ module ActiveMongo
25
17
  @@internal_has_manies[name.to_sym]
26
18
  end
27
19
 
28
-
29
- def attr_accessible_get
30
- @@internal_attr_accessible || []
31
- end
32
-
33
20
  end
34
21
 
35
22
  module InstanceMethods
@@ -0,0 +1,17 @@
1
+ module ActiveMongo
2
+ module Indexes
3
+ module ClassMethods
4
+ def ensure_index(*attr)
5
+ fields = attr[0]
6
+
7
+ options = attr[1]
8
+ unique = options[:unique] if options.class == Hash
9
+
10
+ unique ||= false
11
+
12
+ self.collection.create_index fields, :unique => unique
13
+ end
14
+
15
+ end
16
+ end
17
+ end
@@ -13,6 +13,8 @@ ActiveMongo::Base.class_eval do
13
13
  attrs.each do |key, value|
14
14
  self.set_var(key, value)
15
15
  end
16
+
17
+ _run_initializer_callbacks :after
16
18
  end
17
19
 
18
20
  def to_json
@@ -30,11 +32,51 @@ ActiveMongo::Base.class_eval do
30
32
  end
31
33
 
32
34
  def save(do_validate = true)
33
- return false if do_validate && !self.valid?
34
35
 
35
- id = self.class.collection.save(self.to_hash)
36
+ def do_save
37
+ hash = self.to_hash
38
+
39
+ if self.class.attr_clear_get.any?
40
+ hash.delete_if {|key, value| self.class.attr_clear_get.include?(key.to_sym) }
41
+ end
42
+
43
+ id = self.class.collection.save(hash)
44
+
45
+ self.set_var("_id", id) if self._id.nil?
46
+ end
36
47
 
37
- self.set_var("_id", id) if self._id.nil?
48
+ if self.new_record?
49
+
50
+ _run_create_callbacks do
51
+ _run_save_callbacks do
52
+
53
+ if !do_validate || self.valid?
54
+
55
+ do_save
56
+
57
+ else
58
+ return false
59
+ end
60
+ end
61
+ end
62
+
63
+ else
64
+
65
+ _run_update_callbacks do
66
+ _run_save_callbacks do
67
+
68
+ if !do_validate || self.valid?
69
+
70
+ do_save
71
+
72
+ else
73
+ return false
74
+ end
75
+ end
76
+ end
77
+
78
+
79
+ end
38
80
 
39
81
  return true
40
82
  end
@@ -0,0 +1,25 @@
1
+ module ActiveMongo
2
+ module NamedScopes
3
+ module ClassMethods
4
+ def named_scope(name, attrs = {})
5
+ internal_named_scopes_set(name, attrs)
6
+ end
7
+
8
+ def internal_named_scopes_set(name, attrs)
9
+ @@internal_named_scopes ||= {}
10
+
11
+ @@internal_named_scopes[name.to_sym] = attrs if @@internal_named_scopes[name].nil?
12
+ end
13
+
14
+ def internal_named_scopes_get(name)
15
+ @@internal_named_scopes ||= {}
16
+
17
+ @@internal_named_scopes[name.to_sym]
18
+ end
19
+
20
+ def named_scope_hit(name)
21
+ return eval(self.name).with_scope( @@internal_named_scopes[name] )
22
+ end
23
+ end
24
+ end
25
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_mongo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mantas Masalskis
@@ -11,17 +11,8 @@ cert_chain: []
11
11
 
12
12
  date: 2010-01-10 00:00:00 +00:00
13
13
  default_executable:
14
- dependencies:
15
- - !ruby/object:Gem::Dependency
16
- name: thoughtbot-shoulda
17
- type: :development
18
- version_requirement:
19
- version_requirements: !ruby/object:Gem::Requirement
20
- requirements:
21
- - - ">="
22
- - !ruby/object:Gem::Version
23
- version: "0"
24
- version:
14
+ dependencies: []
15
+
25
16
  description: Schemaless Mongo ORM for Rails 3.0
26
17
  email: mantas@idev.lt
27
18
  executables: []
@@ -39,11 +30,13 @@ files:
39
30
  - Rakefile
40
31
  - VERSION
41
32
  - active_mongo.gemspec
42
- - lib/README
43
33
  - lib/active_mongo.rb
34
+ - lib/active_mongo_attr_accessible.rb
44
35
  - lib/active_mongo_collection.rb
45
36
  - lib/active_mongo_has_many.rb
37
+ - lib/active_mongo_indexes.rb
46
38
  - lib/active_mongo_instance.rb
39
+ - lib/active_mongo_named_scopes.rb
47
40
  - lib/active_mongo_scope.rb
48
41
  - lib/active_mongo_uniquenesss.rb
49
42
  - test/helper.rb
data/lib/README DELETED
@@ -1,3 +0,0 @@
1
- ActiveMongo is a Ruby on Rails 3.0 and Ruby 1.9 compatible totally schemaless ORM.
2
-
3
- It's currently in pre-Alpha state. Feel free to try it if you feel adventurous!