custom_fields 2.0.0.rc3 → 2.0.0.rc4

Sign up to get free protection for your applications and to get access to all the features.
@@ -11,6 +11,8 @@ module CustomFields
11
11
  include "CustomFields::Types::#{type.classify}::Target".constantize
12
12
  end
13
13
 
14
+ include ::CustomFields::TargetHelpers
15
+
14
16
  ## fields ##
15
17
  field :custom_fields_recipe, :type => Hash
16
18
 
@@ -44,7 +46,8 @@ module CustomFields
44
46
  klass.version = recipe['version']
45
47
 
46
48
  # copy scopes from the parent class (scopes does not inherit automatically from the parents in mongoid)
47
- # klass.write_inheritable_attribute(:scopes, self.scopes) # not needed it
49
+ # FIXME (Did): not needed anymore ?
50
+ # klass.write_inheritable_attribute(:scopes, self.scopes)
48
51
 
49
52
  recipe['rules'].each do |rule|
50
53
  self.send(:"apply_#{rule['type']}_custom_field", klass, rule)
@@ -0,0 +1,124 @@
1
+ module CustomFields
2
+
3
+ module TargetHelpers
4
+
5
+ # Returns the list of the getters dynamically based on the
6
+ # custom_fields recipe in order to get the formatted values
7
+ # of the custom fields.
8
+ # If a block is passed, then the list will be filtered accordingly with
9
+ # the following logic. If the block is evaluated as true, then the method
10
+ # will be kept in the list, otherwise it will be removed.
11
+ #
12
+ # @example
13
+ # # keep all the methods except for the field named 'foo'
14
+ # project.custom_fields_methods do |rule|
15
+ # rule['name] != 'foo'
16
+ # end
17
+ #
18
+ # @returns [ List ] a list of method names (string)
19
+ #
20
+ def custom_fields_methods(&filter)
21
+ self.custom_fields_recipe['rules'].map do |rule|
22
+ method = self.custom_fields_getters_for rule['name'], rule['type']
23
+ if block_given?
24
+ filter.call(rule) ? method : nil
25
+ else
26
+ method
27
+ end
28
+ end.compact.flatten
29
+ end
30
+
31
+ # Lists all the attributes that are used by the custom_fields
32
+ # in order to get updated thru a html form for instance.
33
+ #
34
+ # @returns [ List ] a list of attributes (string)
35
+ #
36
+ def custom_fields_safe_attributes
37
+ self.custom_fields_recipe['rules'].map do |rule|
38
+ case rule['type'].to_sym
39
+ when :date then "formatted_#{rule['name']}"
40
+ when :file then [rule['name'], "remove_#{rule['name']}"]
41
+ when :select, :belongs_to then ["#{rule['name']}_id", "position_in_#{rule['name']}"]
42
+ when :has_many, :many_to_many then nil
43
+ else
44
+ rule['name']
45
+ end
46
+ end.compact.flatten
47
+ end
48
+
49
+ # Determines if the rule defined by the name is a "many" relationship kind.
50
+ # A "many" relationship includes "has_many" and "many_to_many"
51
+ #
52
+ # @params [ String ] name The name of the rule
53
+ #
54
+ # @returns [ Boolean ] True if the rule is a "many" relationship kind.
55
+ #
56
+ def is_a_custom_field_many_relationship?(name)
57
+ rule = self.custom_fields_recipe['rules'].detect do |rule|
58
+ rule['name'] == name && _custom_field_many_relationship?(rule['type'])
59
+ end
60
+ end
61
+
62
+ # Returns the names of all the file custom_fields of this object
63
+ #
64
+ # @returns [ Array ] List of names
65
+ #
66
+ def file_custom_fields
67
+ group_custom_fields 'file'
68
+ end
69
+
70
+ # Returns the names of all the has_many custom_fields of this object
71
+ #
72
+ # @returns [ Array ] Array of array [name, inverse_of]
73
+ #
74
+ def has_many_custom_fields
75
+ group_custom_fields('has_many') { |rule| [rule['name'], rule['inverse_of']] }
76
+ end
77
+
78
+ # Returns the names of all the many_to_many custom_fields of this object.
79
+ # It also adds the property used to set/get the target ids.
80
+ #
81
+ # @returns [ Array ] Array of array [name, <name in singular>_ids]
82
+ #
83
+ def many_to_many_custom_fields
84
+ group_custom_fields('many_to_many') { |rule| [rule['name'], "#{rule['name'].singularize}_ids"] }
85
+ end
86
+
87
+ protected
88
+
89
+ # Gets the names of the getter methods for a field.
90
+ # The names depend on the field type.
91
+ #
92
+ # @params [ String ] name Name of the field
93
+ # @params [ String ] type Type of the field
94
+ #
95
+ # @returns [ Object ] A string or an array of names
96
+ #
97
+ def custom_fields_getters_for(name, type)
98
+ case type.to_sym
99
+ when :select then [name, "#{name}_id"]
100
+ when :date then "formatted_#{name}"
101
+ when :file then "#{name}_url"
102
+ when :belongs_to then "#{name}_id"
103
+ else
104
+ name
105
+ end
106
+ end
107
+
108
+ #:nodoc:
109
+ def _custom_field_many_relationship?(type)
110
+ %w(has_many many_to_many).include?(type)
111
+ end
112
+
113
+ #:nodoc:
114
+ def group_custom_fields(type, &block)
115
+ unless block_given?
116
+ block = lambda { |rule| rule['name'] }
117
+ end
118
+
119
+ self.custom_fields_recipe['rules'].find_all { |rule| rule['type'] == type }.map(&block)
120
+ end
121
+
122
+ end
123
+
124
+ end
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
2
  module CustomFields #:nodoc
3
3
 
4
- VERSION = '2.0.0.rc3'
4
+ VERSION = '2.0.0.rc4'
5
5
 
6
6
  end
data/lib/custom_fields.rb CHANGED
@@ -40,6 +40,7 @@ require 'custom_fields/types/has_many'
40
40
  require 'custom_fields/types/many_to_many'
41
41
  require 'custom_fields/field'
42
42
  require 'custom_fields/source'
43
+ require 'custom_fields/target_helpers'
43
44
  require 'custom_fields/target'
44
45
 
45
46
  # Load all the translation files
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: custom_fields
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0.rc3
4
+ version: 2.0.0.rc4
5
5
  prerelease: 6
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-02-03 00:00:00.000000000 Z
12
+ date: 2012-02-07 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: mongoid
16
- requirement: &2157026880 !ruby/object:Gem::Requirement
16
+ requirement: &2157299580 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 2.4.3
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *2157026880
24
+ version_requirements: *2157299580
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: activesupport
27
- requirement: &2157025140 !ruby/object:Gem::Requirement
27
+ requirement: &2157299000 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 3.2.1
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *2157025140
35
+ version_requirements: *2157299000
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: carrierwave-mongoid
38
- requirement: &2157024340 !ruby/object:Gem::Requirement
38
+ requirement: &2157298380 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: 0.1.3
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *2157024340
46
+ version_requirements: *2157298380
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: yard
49
- requirement: &2157023280 !ruby/object:Gem::Requirement
49
+ requirement: &2157313620 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: 0.7.3
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *2157023280
57
+ version_requirements: *2157313620
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: bson
60
- requirement: &2157022720 !ruby/object:Gem::Requirement
60
+ requirement: &2157312440 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ~>
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: 1.3.1
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *2157022720
68
+ version_requirements: *2157312440
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: mongo
71
- requirement: &2157038420 !ruby/object:Gem::Requirement
71
+ requirement: &2157311920 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ~>
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: 1.3.1
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *2157038420
79
+ version_requirements: *2157311920
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: bson_ext
82
- requirement: &2157037860 !ruby/object:Gem::Requirement
82
+ requirement: &2157311340 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ~>
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: 1.3.1
88
88
  type: :development
89
89
  prerelease: false
90
- version_requirements: *2157037860
90
+ version_requirements: *2157311340
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: mocha
93
- requirement: &2157037360 !ruby/object:Gem::Requirement
93
+ requirement: &2157310860 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ~>
@@ -98,10 +98,10 @@ dependencies:
98
98
  version: 0.9.12
99
99
  type: :development
100
100
  prerelease: false
101
- version_requirements: *2157037360
101
+ version_requirements: *2157310860
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: rspec
104
- requirement: &2157036760 !ruby/object:Gem::Requirement
104
+ requirement: &2157310360 !ruby/object:Gem::Requirement
105
105
  none: false
106
106
  requirements:
107
107
  - - ~>
@@ -109,10 +109,10 @@ dependencies:
109
109
  version: '2.6'
110
110
  type: :development
111
111
  prerelease: false
112
- version_requirements: *2157036760
112
+ version_requirements: *2157310360
113
113
  - !ruby/object:Gem::Dependency
114
114
  name: database_cleaner
115
- requirement: &2157036200 !ruby/object:Gem::Requirement
115
+ requirement: &2157309800 !ruby/object:Gem::Requirement
116
116
  none: false
117
117
  requirements:
118
118
  - - ~>
@@ -120,10 +120,10 @@ dependencies:
120
120
  version: 0.6.7
121
121
  type: :development
122
122
  prerelease: false
123
- version_requirements: *2157036200
123
+ version_requirements: *2157309800
124
124
  - !ruby/object:Gem::Dependency
125
125
  name: RedCloth
126
- requirement: &2157035680 !ruby/object:Gem::Requirement
126
+ requirement: &2157309220 !ruby/object:Gem::Requirement
127
127
  none: false
128
128
  requirements:
129
129
  - - ~>
@@ -131,7 +131,7 @@ dependencies:
131
131
  version: 4.2.8
132
132
  type: :development
133
133
  prerelease: false
134
- version_requirements: *2157035680
134
+ version_requirements: *2157309220
135
135
  description: Manage custom fields to a mongoid document or a collection. This module
136
136
  is one of the core features we implemented in our custom cms named Locomotive.
137
137
  email:
@@ -156,6 +156,7 @@ files:
156
156
  - lib/custom_fields/field.rb
157
157
  - lib/custom_fields/source.rb
158
158
  - lib/custom_fields/target.rb
159
+ - lib/custom_fields/target_helpers.rb
159
160
  - lib/custom_fields/types/belongs_to.rb
160
161
  - lib/custom_fields/types/boolean.rb
161
162
  - lib/custom_fields/types/date.rb
@@ -187,7 +188,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
187
188
  version: '0'
188
189
  segments:
189
190
  - 0
190
- hash: -2284291224344609482
191
+ hash: 3101050019055810117
191
192
  required_rubygems_version: !ruby/object:Gem::Requirement
192
193
  none: false
193
194
  requirements:
@@ -196,7 +197,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
196
197
  version: 1.3.6
197
198
  requirements: []
198
199
  rubyforge_project: nowarning
199
- rubygems_version: 1.8.10
200
+ rubygems_version: 1.8.15
200
201
  signing_key:
201
202
  specification_version: 3
202
203
  summary: Custom fields extension for Mongoid