mongoid-included 0.0.5 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1 @@
1
- require 'mongoid'
2
1
  require 'mongoid-included/document_inclusion'
3
- require 'mongoid-included/embedded_name'
@@ -1,69 +1,72 @@
1
+ require 'mongoid-included/embedded_name'
2
+ require 'mongoid-included/inclusion_errors'
1
3
  module Mongoid
2
4
  module DocumentInclusion
3
5
  extend ActiveSupport::Concern
4
-
5
- class NotMongoidDocument < StandardError; end;
6
- class DocumentAlreadyIncluded < StandardError; end;
7
6
 
8
7
  included do
9
- extend ActiveModel::Naming
10
- cattr_accessor :inclusion_model
8
+ cattr_accessor :included_by
9
+ cattr_accessor :including_many
10
+ cattr_accessor :including_one
11
11
  end
12
12
 
13
13
  module ClassMethods
14
14
  def included_in(_model, args = {})
15
- raise NotMongoidDocument, "Child document must include Mongoid::Document" unless mongoid_document? self
16
- raise NotMongoidDocument, "Parent document must include Mongoid::Document" unless mongoid_document? self.parent
17
- raise DocumentAlreadyIncluded, "Child document already included" if inclusion_model
15
+ raise NotMongoidDocument, "Parent must be Mongoid::Document" unless _mongoid_document? self.parent
16
+ raise DocumentAlreadyIncluded, "Document already included" if included_by.present?
18
17
  embedded_in _model, args
19
- self.inclusion_model = true
18
+
19
+ self.included_by = _model
20
+ self.extend ActiveModel::Naming
21
+ _overwrite_model_name
20
22
  end
21
23
 
22
24
  def includes_many(_model, args = {})
23
- verify_dependencies(_model)
24
- embeds_many _model, args.merge(:class_name => included_klass(_model))
25
- self.inclusion_model = true
25
+ _verify_dependencies(_model)
26
+ embeds_many _model, args.merge(:class_name => _included_klass(_model))
27
+ (self.including_many ||= []) << _model
26
28
  end
27
29
 
28
30
  def includes_one(_model, args = {})
29
- verify_dependencies(_model)
30
- embeds_one _model, args.merge(:class_name => included_klass(_model))
31
- self.inclusion_model = true
31
+ _verify_dependencies(_model)
32
+ embeds_one _model, args.merge(:class_name => _included_klass(_model))
33
+ (self.including_one ||= []) << _model
32
34
  end
33
35
 
34
- def model_name
35
- @_model_name ||=begin
36
- if self.parent != Object
37
- Mongoid::EmbeddedName.new(self, self.parent)
38
- else
39
- super
36
+ private
37
+
38
+ def _overwrite_model_name
39
+ self.class_eval <<-EOF
40
+ @_model_name ||=begin
41
+ if self.parent != Object
42
+ Mongoid::EmbeddedName.new(self, self.parent)
43
+ else
44
+ super
45
+ end
40
46
  end
41
- end
47
+ EOF
42
48
  end
43
49
 
44
- private
45
-
46
- def model_klass_name(_model)
50
+ def _model_klass_name(_model)
47
51
  _model.to_s.classify
48
52
  end
49
53
 
50
- def model_klass(_model)
54
+ def _model_klass(_model)
51
55
  _model.to_s.classify.constantize
52
56
  end
53
57
 
54
- def included_klass(_model)
55
- "#{self}::#{model_klass_name(_model)}"
58
+ def _included_klass(_model)
59
+ "#{self}::#{_model_klass_name(_model)}"
56
60
  end
57
61
 
58
- def mongoid_document?(_model)
62
+ def _mongoid_document?(_model)
59
63
  _model.ancestors.include?(Mongoid::Document)
60
64
  end
61
65
 
62
- def verify_dependencies(_model)
63
- raise NotMongoidDocument, "Parent document must include Mongoid::Document" unless mongoid_document? self
64
- raise NotMongoidDocument, "Child document must include Mongoid::Document" unless mongoid_document? model_klass(included_klass(_model))
66
+ def _verify_dependencies(_model)
67
+ raise NotMongoidDocument, "Child must be Mongoid::Document" unless _mongoid_document? _model_klass(_included_klass(_model))
65
68
  end
66
-
67
69
  end
68
70
  end
69
71
  end
72
+ Mongoid::Document.send(:include, ::Mongoid::DocumentInclusion)
@@ -5,7 +5,6 @@ module Mongoid
5
5
 
6
6
  def initialize(klass, namespace, pluralize_namespace = true)
7
7
  name ||= klass.name
8
- # super(name)
9
8
  @unnamespaced = name.sub(/^#{namespace.name}::/, '') if namespace
10
9
 
11
10
  @klass = klass
@@ -21,5 +20,9 @@ module Mongoid
21
20
  @route_key = ActiveSupport::Inflector.pluralize(@param_key).freeze
22
21
  @i18n_key = name.underscore.to_sym
23
22
  end
23
+
24
+ def _singularize(string, replacement='_')
25
+ ActiveSupport::Inflector.underscore(string).tr('/', replacement)
26
+ end
24
27
  end
25
28
  end
@@ -0,0 +1,6 @@
1
+ module Mongoid
2
+ module DocumentInclusion
3
+ class NotMongoidDocument < StandardError; end;
4
+ class DocumentAlreadyIncluded < StandardError; end;
5
+ end
6
+ end
@@ -1,5 +1,5 @@
1
1
  module Mongoid
2
2
  module Included
3
- VERSION = "0.0.5"
3
+ VERSION = "0.2.0"
4
4
  end
5
5
  end
@@ -19,7 +19,6 @@ Gem::Specification.new do |s|
19
19
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
20
  s.require_paths = ["lib"]
21
21
 
22
- s.add_runtime_dependency("activemodel", ["~> 3.1.0.beta1"])
23
22
  s.add_runtime_dependency(%q<mongoid>, ["~> 2.0"])
24
23
  s.add_development_dependency("rspec", ["~> 2.6.0"])
25
24
  s.add_development_dependency("bson_ext", ["~> 1.3"])
@@ -1,6 +1,6 @@
1
1
  class Invoice
2
2
  include Mongoid::Document
3
- include Mongoid::DocumentInclusion
3
+
4
4
  field :title
5
5
  validates_presence_of :title
6
6
  end
@@ -1,6 +1,5 @@
1
1
  class Invoice::Item
2
2
  include Mongoid::Document
3
- include Mongoid::DocumentInclusion
4
3
 
5
4
  field :name
6
5
  field :test, :default => "ale"
@@ -0,0 +1,3 @@
1
+ class Invoice::NotIncluded
2
+ include Mongoid::Document
3
+ end
@@ -1,6 +1,5 @@
1
1
  class Invoice::User
2
2
  include Mongoid::Document
3
- include Mongoid::DocumentInclusion
4
3
 
5
4
  field :name
6
5
  end
@@ -15,6 +15,7 @@ end
15
15
  require 'models/invoice'
16
16
  require 'models/invoice/item'
17
17
  require 'models/invoice/user'
18
+ require 'models/invoice/not_included'
18
19
  require 'models/inclusion'
19
20
 
20
21
  Mongoid.configure do |config|
@@ -1,115 +1,51 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe "Mongoid::Included" do
4
-
5
- context "when parent class includes a child" do
6
- it "delegates options to mongoid relation macro" do
7
- Invoice.relations["user"].inverse_of.should == :invoice
8
- end
9
-
10
- it "embeds many children with given association name" do
11
- Invoice.relations.keys.include? "items"
12
- Invoice.relations["items"].macro.should == :embeds_many
13
- end
14
-
15
- it "embeds one child with given association name" do
16
- Invoice.relations.keys.include? "item"
17
- Invoice.relations["user"].macro.should == :embeds_one
18
- end
19
-
20
- it "embeds child with given association class" do
21
- Invoice.relations["items"].class_name.should == "Invoice::Item"
22
- end
23
-
24
- it "issues an error if parent is not mongoid document" do
25
- Object.const_set "NonMongoidDocument", Class.new
26
- NonMongoidDocument.send(:include, Mongoid::DocumentInclusion)
27
- NonMongoidDocument.const_set "NonMongoidEmbed", Class.new
28
- begin
29
- NonMongoidDocument.includes_many :non_mongoid_embeds
30
- rescue => e
31
- e.class.should == Mongoid::DocumentInclusion::NotMongoidDocument
32
- e.message.should =~ /Parent document must include Mongoid::Document/
33
- end
34
- end
35
-
36
- it "issues an error if child is not mongoid document" do
37
- Object.const_set "NonMongoidDocument", Class.new
38
- NonMongoidDocument.const_set "NonMongoidEmbed", Class.new
39
- NonMongoidDocument.send(:include, Mongoid::Document)
40
- NonMongoidDocument.send(:include, Mongoid::DocumentInclusion)
41
- begin
42
- NonMongoidDocument.includes_many :non_mongoid_embeds
43
- rescue => e
44
- e.class.should == Mongoid::DocumentInclusion::NotMongoidDocument
45
- e.message.should =~ /Child document must include Mongoid::Document/
46
- end
3
+ describe "Child Model" do
4
+ context "when being included" do
5
+ it "strips namespace from #param_key" do
6
+ Invoice::Item.model_name.param_key.should == "item"
47
7
  end
48
8
 
49
- end
9
+ it "strips namespace from #route_key" do
10
+ Invoice::Item.model_name.route_key.should == "items"
11
+ end
50
12
 
51
- context "when child class is included in parent" do
13
+ it "pluralize namespace in #partial_path" do
14
+ Invoice::Item.model_name.partial_path.should == "invoices/items/item"
15
+ end
52
16
 
53
17
  it "delegates options to mongoid relation macro" do
54
18
  Invoice::User.relations["invoice"].inverse_of.should == :user
55
19
  end
56
-
20
+
57
21
  it "is embedded in parent class" do
58
- Invoice::Item.relations.keys.include? "invoice"
22
+ Invoice::Item.relations.keys.should include "invoice"
59
23
  Invoice::Item.relations["invoice"].macro.should == :embedded_in
60
24
  end
61
-
62
- it "issues an error if child is not mongoid document" do
63
- Object.const_set "NonMongoidDocument", Class.new
64
- NonMongoidDocument.const_set "NonMongoidChild", Class.new
65
- NonMongoidDocument.send(:include, Mongoid::Document)
66
- NonMongoidDocument.send(:include, Mongoid::DocumentInclusion)
67
- NonMongoidDocument::NonMongoidChild.send(:include, Mongoid::DocumentInclusion)
68
- begin
69
- NonMongoidDocument::NonMongoidChild.included_in :invoice
70
- rescue => e
71
- e.class.should == Mongoid::DocumentInclusion::NotMongoidDocument
72
- e.message.should =~ /Child document must include Mongoid::Document/
73
- end
74
- end
75
-
76
- it "issues an error if parent is not mongoid document" do
77
- Object.const_set "NonMongoidDocument", Class.new
78
- NonMongoidDocument.const_set "NonMongoidChild", Class.new
79
- NonMongoidDocument::NonMongoidChild.send(:include, Mongoid::Document)
80
- NonMongoidDocument::NonMongoidChild.send(:include, Mongoid::DocumentInclusion)
81
- begin
82
- NonMongoidDocument::NonMongoidChild.included_in :invoice
83
- rescue => e
84
- e.class.should == Mongoid::DocumentInclusion::NotMongoidDocument
85
- e.message.should =~ /Parent document must include Mongoid::Document/
86
- end
87
- end
88
-
89
- context "when overwriting #model_name" do
90
- it "strips namespace from #param_key" do
91
- Invoice::Item.model_name.param_key.should == "item"
92
- end
93
-
94
- it "strips namespace from #route_key" do
95
- Invoice::Item.model_name.route_key.should == "items"
96
- end
97
-
98
- it "pluralize namespace in #partial_path" do
99
- Invoice::Item.model_name.partial_path.should == "invoices/items/item"
100
- end
25
+ it "#includded_in returns parent model" do
26
+ Invoice::Item.included_by.should == :invoice
101
27
  end
102
-
103
28
  it "forbids inclusion in another parent" do
104
- begin
105
- Invoice::Item.included_in :invoice
106
- rescue => e
107
- e.class.should == Mongoid::DocumentInclusion::DocumentAlreadyIncluded
108
- end
29
+ expect { Invoice::Item.included_in :invoice }.
30
+ to raise_error Mongoid::DocumentInclusion::DocumentAlreadyIncluded, /Document already included/
109
31
  end
110
-
111
-
112
32
  end
113
33
 
34
+ context "when not included" do
35
+ it "should preserve original name" do
36
+ Invoice::NotIncluded.model_name.should == "Invoice::NotIncluded"
37
+ end
38
+ end
39
+
40
+ it "issues an error if parent is not mongoid document" do
41
+ Object.const_set "NonMongoidDocument", Class.new
42
+ NonMongoidDocument.const_set "NonMongoidChild", Class.new
43
+ NonMongoidDocument::NonMongoidChild.send(:include, Mongoid::Document)
44
+ NonMongoidDocument::NonMongoidChild.send(:include, Mongoid::DocumentInclusion)
45
+ expect { NonMongoidDocument::NonMongoidChild.included_in :invoice }.
46
+ to raise_error(Mongoid::DocumentInclusion::NotMongoidDocument, /Parent must be Mongoid::Document/)
47
+ end
48
+
49
+
114
50
  end
115
51
 
@@ -0,0 +1,68 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Parent Model" do
4
+
5
+ let(:parent) { Invoice }
6
+
7
+ describe "#includes_many" do
8
+ context "when including one model" do
9
+ it "#includding_many returns array with one model" do
10
+ parent.including_many.should include(:items)
11
+ end
12
+ it "embeds child with association name" do
13
+ parent.relations.keys.should include "items"
14
+ parent.relations["items"].macro.should == :embeds_many
15
+ end
16
+ it "embeds child with association class" do
17
+ parent.relations["items"].class_name.should == "Invoice::Item"
18
+ end
19
+ end
20
+ context "when including two models" do
21
+ it "#includding_many returns array with two models" do
22
+ parent.includes_many :not_includeds
23
+ parent.including_many.should include(:items, :not_includeds)
24
+ end
25
+ end
26
+ context "when not including with #includes_many" do
27
+ it "#includding_many returns an empty array" do
28
+ Invoice::Item.including_many.should be_blank
29
+ end
30
+ end
31
+ end
32
+
33
+ describe "#includes_one" do
34
+ context "when including one model" do
35
+ it "#including_one returns array with one model" do
36
+ parent.including_one.should include(:user)
37
+ end
38
+ it "delegates options to mongoid relation macro" do
39
+ parent.relations["user"].inverse_of.should == :invoice
40
+ end
41
+ it "embeds one child with given association name" do
42
+ parent.relations.keys.should include "user"
43
+ parent.relations["user"].macro.should == :embeds_one
44
+ end
45
+ end
46
+ context "when including two models" do
47
+ it "#includding_one returns array with two models" do
48
+ parent.includes_one :not_includeds
49
+ parent.including_one.should include(:user, :not_includeds)
50
+ end
51
+ end
52
+ context "when not including with #includes_one" do
53
+ it "#includding_one returns an empty array" do
54
+ Invoice::Item.including_one.should be_blank
55
+ end
56
+ end
57
+ end
58
+
59
+ it "issues an error if child is not mongoid document" do
60
+ Object.const_set "NonMongoidDocument", Class.new
61
+ NonMongoidDocument.const_set "NonMongoidEmbed", Class.new
62
+ NonMongoidDocument.send(:include, Mongoid::Document)
63
+ NonMongoidDocument.send(:include, Mongoid::DocumentInclusion)
64
+ expect {NonMongoidDocument.includes_many :non_mongoid_embeds }.
65
+ to raise_error(Mongoid::DocumentInclusion::NotMongoidDocument, /Child must be Mongoid::Document/)
66
+ end
67
+
68
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mongoid-included
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,23 +9,12 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-07-06 00:00:00.000000000 -03:00
12
+ date: 2011-07-07 00:00:00.000000000 -03:00
13
13
  default_executable:
14
14
  dependencies:
15
- - !ruby/object:Gem::Dependency
16
- name: activemodel
17
- requirement: &2156553760 !ruby/object:Gem::Requirement
18
- none: false
19
- requirements:
20
- - - ~>
21
- - !ruby/object:Gem::Version
22
- version: 3.1.0.beta1
23
- type: :runtime
24
- prerelease: false
25
- version_requirements: *2156553760
26
15
  - !ruby/object:Gem::Dependency
27
16
  name: mongoid
28
- requirement: &2156553220 !ruby/object:Gem::Requirement
17
+ requirement: &2152036440 !ruby/object:Gem::Requirement
29
18
  none: false
30
19
  requirements:
31
20
  - - ~>
@@ -33,10 +22,10 @@ dependencies:
33
22
  version: '2.0'
34
23
  type: :runtime
35
24
  prerelease: false
36
- version_requirements: *2156553220
25
+ version_requirements: *2152036440
37
26
  - !ruby/object:Gem::Dependency
38
27
  name: rspec
39
- requirement: &2156552720 !ruby/object:Gem::Requirement
28
+ requirement: &2152300640 !ruby/object:Gem::Requirement
40
29
  none: false
41
30
  requirements:
42
31
  - - ~>
@@ -44,10 +33,10 @@ dependencies:
44
33
  version: 2.6.0
45
34
  type: :development
46
35
  prerelease: false
47
- version_requirements: *2156552720
36
+ version_requirements: *2152300640
48
37
  - !ruby/object:Gem::Dependency
49
38
  name: bson_ext
50
- requirement: &2156552240 !ruby/object:Gem::Requirement
39
+ requirement: &2152299720 !ruby/object:Gem::Requirement
51
40
  none: false
52
41
  requirements:
53
42
  - - ~>
@@ -55,7 +44,7 @@ dependencies:
55
44
  version: '1.3'
56
45
  type: :development
57
46
  prerelease: false
58
- version_requirements: *2156552240
47
+ version_requirements: *2152299720
59
48
  description: Helper to facilitate inclusion of namespaced documents in another Mongoid
60
49
  Document
61
50
  email: angelim@angelim.com.br
@@ -86,6 +75,7 @@ files:
86
75
  - lib/mongoid-included.rb
87
76
  - lib/mongoid-included/document_inclusion.rb
88
77
  - lib/mongoid-included/embedded_name.rb
78
+ - lib/mongoid-included/inclusion_errors.rb
89
79
  - lib/mongoid-included/version.rb
90
80
  - log/development.log
91
81
  - mongoid-included.gemspec
@@ -94,9 +84,11 @@ files:
94
84
  - spec/models/inclusion.rb
95
85
  - spec/models/invoice.rb
96
86
  - spec/models/invoice/item.rb
87
+ - spec/models/invoice/not_included.rb
97
88
  - spec/models/invoice/user.rb
98
89
  - spec/spec_helper.rb
99
90
  - spec/unit/included_spec.rb
91
+ - spec/unit/including_spec.rb
100
92
  has_rdoc: true
101
93
  homepage: http://github.com/angelim/mongoid-included
102
94
  licenses: []
@@ -128,6 +120,8 @@ test_files:
128
120
  - spec/models/inclusion.rb
129
121
  - spec/models/invoice.rb
130
122
  - spec/models/invoice/item.rb
123
+ - spec/models/invoice/not_included.rb
131
124
  - spec/models/invoice/user.rb
132
125
  - spec/spec_helper.rb
133
126
  - spec/unit/included_spec.rb
127
+ - spec/unit/including_spec.rb