custom_fields 1.0.0.beta.14 → 1.0.0.beta.15

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.textile CHANGED
@@ -4,7 +4,7 @@ Manage custom fields to a mongoid document or a collection. This module is one o
4
4
 
5
5
  h2. Requirements
6
6
 
7
- ActiveSupport 3.0.7, MongoDB 1.6 and Mongoid 2.0.1
7
+ ActiveSupport 3.0.7, MongoDB 1.6 and Mongoid 2.0.2
8
8
 
9
9
 
10
10
  h2. Example
@@ -2,8 +2,31 @@ module CustomFields
2
2
 
3
3
  module CustomFieldsFor
4
4
 
5
- def self.included(base)
6
- base.extend(ClassMethods)
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ cattr_accessor :custom_fields
9
+
10
+ self.custom_fields = []
11
+ end
12
+
13
+ module InstanceMethods
14
+
15
+ def custom_fields?(collection_name)
16
+ self.class.custom_fields?(collection_name)
17
+ end
18
+
19
+ def clone_metadata_for_custom_fields(metadata)
20
+ singular_name = metadata.name.to_s.singularize.gsub(/^_/, '')
21
+
22
+ klass = self.send(:"fetch_#{singular_name}_klass")
23
+
24
+ # safer to do that because we are going to modify the metadata klass for next operations
25
+ metadata.clone.tap do |metadata|
26
+ metadata.instance_variable_set(:@klass, klass)
27
+ end
28
+ end
29
+
7
30
  end
8
31
 
9
32
  # Enhance an embedded collection OR the instance itself (by passing self) by providing methods to manage custom fields.
@@ -34,19 +57,15 @@ module CustomFields
34
57
  #
35
58
  module ClassMethods
36
59
 
37
- def custom_fields_for(collection_name)
38
- singular_name = collection_name.to_s.singularize
60
+ def custom_fields?(collection_name)
61
+ self.custom_fields.include?(collection_name.to_s)
62
+ end
39
63
 
40
- # generate the custom field for the couple defined by the class and the collection name
64
+ def custom_fields_for(collection_name)
65
+ singular_name = collection_name.to_s.singularize
41
66
  dynamic_custom_field_class_name = "#{self.name}#{singular_name.camelize}Field"
42
67
 
43
- unless Object.const_defined?(dynamic_custom_field_class_name)
44
- (klass = Class.new(::CustomFields::Field)).class_eval <<-EOF
45
- embedded_in :#{self.name.underscore}, :inverse_of => :#{singular_name}_custom_fields
46
- EOF
47
-
48
- Object.const_set(dynamic_custom_field_class_name, klass)
49
- end
68
+ self.declare_embedded_in_definition_in_custom_field(collection_name)
50
69
 
51
70
  # enhance the class itself
52
71
  if (itself = %w(itself self).include?(collection_name.to_s))
@@ -58,10 +77,12 @@ module CustomFields
58
77
  def safe_#{singular_name}
59
78
  self.#{collection_name} || self.build_#{collection_name}
60
79
  end
61
-
62
80
  EOV
63
81
  end
64
82
 
83
+ # record the collection_name
84
+ self.custom_fields << collection_name.to_s
85
+
65
86
  # common part
66
87
  class_eval <<-EOV
67
88
  field :#{singular_name}_custom_fields_counter, :type => Integer, :default => 0
@@ -141,6 +162,29 @@ module CustomFields
141
162
 
142
163
  end
143
164
 
165
+ protected
166
+
167
+ def dynamic_custom_field_class_name(collection_name)
168
+ "#{self.name}#{collection_name.to_s.singularize.camelize}Field"
169
+ end
170
+
171
+ # An embedded relationship has to be defined on both side in order for it
172
+ # to work properly. But because custom_field can be embedded in different
173
+ # models that it's not aware of, we have to declare manually the definition
174
+ # once we know the target class.
175
+ def declare_embedded_in_definition_in_custom_field(target_collection_name)
176
+ singular_name = target_collection_name.to_s.singularize
177
+ klass_name = self.dynamic_custom_field_class_name(target_collection_name)
178
+
179
+ unless Object.const_defined?(klass_name)
180
+ (klass = Class.new(::CustomFields::Field)).class_eval <<-EOF
181
+ embedded_in :#{self.name.underscore}, :inverse_of => :#{singular_name}_custom_fields
182
+ EOF
183
+
184
+ Object.const_set(klass_name, klass)
185
+ end
186
+ end
187
+
144
188
  end
145
189
 
146
190
  end
@@ -16,31 +16,14 @@ module Mongoid # :nodoc:
16
16
  #
17
17
  # @since 2.0.0.rc.1
18
18
  def create_relation_with_custom_fields(object, metadata)
19
- association_name = metadata.name.to_s.gsub(/^_/, '')
20
-
21
- if custom_fields?(self, association_name)
22
- metadata = metadata.clone # 2 parent instances should not share the exact same option instance
23
-
24
- custom_fields = self.send(:"ordered_#{custom_fields_association_name(association_name)}")
25
-
26
- klass = metadata.klass.to_klass_with_custom_fields(custom_fields, self, association_name)
27
-
28
- metadata.instance_variable_set(:@klass, klass)
19
+ if self.respond_to?(:custom_fields?) && self.custom_fields?(metadata.name)
20
+ metadata = self.clone_metadata_for_custom_fields(metadata)
29
21
  end
30
22
 
31
23
  create_relation_without_custom_fields(object, metadata)
32
24
  end
33
25
 
34
26
  alias_method_chain :create_relation, :custom_fields
35
-
36
- def custom_fields_association_name(association_name)
37
- "#{association_name.to_s.singularize}_custom_fields".to_sym
38
- end
39
-
40
- def custom_fields?(object, association_name)
41
- object.respond_to?(custom_fields_association_name(association_name))
42
- end
43
-
44
27
  end
45
28
 
46
29
  end
@@ -0,0 +1,27 @@
1
+ module Mongoid # :nodoc:
2
+ module Relations #:nodoc:
3
+
4
+ module Builders
5
+ extend ActiveSupport::Concern
6
+
7
+ module ClassMethods #:nodoc:
8
+
9
+ def builder_with_custom_fields(name, metadata)
10
+ tap do
11
+ define_method("build_#{name}") do |*args|
12
+ if self.custom_fields?(metadata.name)
13
+ metadata = self.clone_metadata_for_custom_fields(metadata)
14
+ end
15
+
16
+ document = Factory.build(metadata.klass, args.first || {})
17
+ send("#{name}=", document, :binding => true)
18
+ end
19
+ end
20
+ end
21
+
22
+ alias_method_chain :builder, :custom_fields
23
+
24
+ end
25
+ end
26
+ end
27
+ end
@@ -1,5 +1,5 @@
1
1
  module Mongoid
2
2
  module CustomFields
3
- VERSION = "1.0.0.beta.14"
3
+ VERSION = "1.0.0.beta.15"
4
4
  end
5
5
  end
data/lib/custom_fields.rb CHANGED
@@ -4,24 +4,25 @@ require 'active_support'
4
4
  require 'carrierwave/orm/mongoid'
5
5
 
6
6
  module CustomFields
7
-
7
+
8
8
  @@options = {
9
9
  :reserved_aliases => Mongoid.destructive_fields
10
10
  }
11
-
11
+
12
12
  def self.options=(options)
13
13
  @@options.merge!(options)
14
14
  end
15
-
15
+
16
16
  def self.options
17
17
  @@options
18
18
  end
19
-
19
+
20
20
  end
21
21
 
22
22
  require 'custom_fields/version'
23
23
  require 'custom_fields/extensions/mongoid/document'
24
24
  require 'custom_fields/extensions/mongoid/relations/accessors'
25
+ require 'custom_fields/extensions/mongoid/relations/builders'
25
26
  require 'custom_fields/types/default'
26
27
  require 'custom_fields/types/string'
27
28
  require 'custom_fields/types/text'
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: custom_fields
3
3
  version: !ruby/object:Gem::Version
4
- hash: 62196383
4
+ hash: 62196381
5
5
  prerelease: 6
6
6
  segments:
7
7
  - 1
8
8
  - 0
9
9
  - 0
10
10
  - beta
11
- - 14
12
- version: 1.0.0.beta.14
11
+ - 15
12
+ version: 1.0.0.beta.15
13
13
  platform: ruby
14
14
  authors:
15
15
  - Didier Lafforgue
@@ -17,27 +17,28 @@ autorequire:
17
17
  bindir: bin
18
18
  cert_chain: []
19
19
 
20
- date: 2011-06-04 00:00:00 +02:00
21
- default_executable:
20
+ date: 2011-06-04 00:00:00 Z
22
21
  dependencies:
23
22
  - !ruby/object:Gem::Dependency
23
+ name: mongoid
24
24
  prerelease: false
25
+ type: :runtime
25
26
  version_requirements: &id001 !ruby/object:Gem::Requirement
26
27
  none: false
27
28
  requirements:
28
29
  - - "="
29
30
  - !ruby/object:Gem::Version
30
- hash: 13
31
+ hash: 11
31
32
  segments:
32
33
  - 2
33
34
  - 0
34
- - 1
35
- version: 2.0.1
36
- type: :runtime
35
+ - 2
36
+ version: 2.0.2
37
37
  requirement: *id001
38
- name: mongoid
39
38
  - !ruby/object:Gem::Dependency
39
+ name: activesupport
40
40
  prerelease: false
41
+ type: :runtime
41
42
  version_requirements: &id002 !ruby/object:Gem::Requirement
42
43
  none: false
43
44
  requirements:
@@ -49,11 +50,11 @@ dependencies:
49
50
  - 0
50
51
  - 7
51
52
  version: 3.0.7
52
- type: :runtime
53
53
  requirement: *id002
54
- name: activesupport
55
54
  - !ruby/object:Gem::Dependency
55
+ name: locomotive_carrierwave
56
56
  prerelease: false
57
+ type: :runtime
57
58
  version_requirements: &id003 !ruby/object:Gem::Requirement
58
59
  none: false
59
60
  requirements:
@@ -63,9 +64,7 @@ dependencies:
63
64
  segments:
64
65
  - 0
65
66
  version: "0"
66
- type: :runtime
67
67
  requirement: *id003
68
- name: locomotive_carrierwave
69
68
  description: Manage custom fields to a mongoid document or a collection. This module is one of the core features we implemented in our custom cms named Locomotive.
70
69
  email:
71
70
  - didier@nocoffee.fr
@@ -83,6 +82,7 @@ files:
83
82
  - lib/custom_fields/custom_fields_for.rb
84
83
  - lib/custom_fields/extensions/mongoid/document.rb
85
84
  - lib/custom_fields/extensions/mongoid/relations/accessors.rb
85
+ - lib/custom_fields/extensions/mongoid/relations/builders.rb
86
86
  - lib/custom_fields/field.rb
87
87
  - lib/custom_fields/metadata.rb
88
88
  - lib/custom_fields/proxy_class_enabler.rb
@@ -101,7 +101,6 @@ files:
101
101
  - config/locales/en.yml
102
102
  - config/locales/fr.yml
103
103
  - config/locales/pt-BR.yml
104
- has_rdoc: true
105
104
  homepage: http://github.com/locomotivecms/custom_fields
106
105
  licenses: []
107
106
 
@@ -133,7 +132,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
133
132
  requirements: []
134
133
 
135
134
  rubyforge_project: nowarning
136
- rubygems_version: 1.4.2
135
+ rubygems_version: 1.8.5
137
136
  signing_key:
138
137
  specification_version: 3
139
138
  summary: Custom fields extension for Mongoid