custom_fields 2.0.0.rc2 → 2.0.0.rc3

Sign up to get free protection for your applications and to get access to all the features.
@@ -7,5 +7,6 @@ en:
7
7
  boolean: Checkbox
8
8
  date: Date
9
9
  file: File
10
- has_one: Has one
11
- has_many: Has many
10
+ belongs_to: Belongs to
11
+ has_many: Has many
12
+ many_to_many: Many To Many
@@ -7,6 +7,9 @@ fr:
7
7
  boolean: Case à cocher
8
8
  date: Date
9
9
  file: Fichier
10
+ belongs_to: Appartient à
11
+ has_many: A plusieurs
12
+ many_to_many: A plusieurs et appartient à
10
13
  text_formatting:
11
14
  none: Aucun
12
15
  html: HTML
@@ -6,7 +6,7 @@ module CustomFields
6
6
  include ::Mongoid::Timestamps
7
7
 
8
8
  ## types ##
9
- %w(default string text date boolean file select).each do |type|
9
+ %w(default string text date boolean file select relationship_default belongs_to has_many many_to_many).each do |type|
10
10
  include "CustomFields::Types::#{type.classify}::Field".constantize
11
11
  end
12
12
 
@@ -7,7 +7,7 @@ module CustomFields
7
7
  included do
8
8
 
9
9
  ## types ##
10
- %w(default string text date boolean file select).each do |type|
10
+ %w(default string text date boolean file select belongs_to has_many many_to_many).each do |type|
11
11
  include "CustomFields::Types::#{type.classify}::Target".constantize
12
12
  end
13
13
 
@@ -34,8 +34,11 @@ module CustomFields
34
34
  # @return [ Class] the anonymous custom klass
35
35
  #
36
36
  def build_klass_with_custom_fields(recipe)
37
- # puts "CREATING new '#{name}' / #{recipe.inspect}" # DEBUG
38
- Class.new(self).tap do |klass|
37
+ name = recipe['name']
38
+
39
+ # puts "CREATING #{name}, #{recipe.inspect}" # DEBUG
40
+
41
+ parent.const_set(name, Class.new(self)).tap do |klass|
39
42
  klass.cattr_accessor :version
40
43
 
41
44
  klass.version = recipe['version']
@@ -71,8 +74,6 @@ module CustomFields
71
74
  parent.send(:remove_const, name) if klass
72
75
 
73
76
  klass = build_klass_with_custom_fields(recipe)
74
-
75
- parent.const_set(name, klass)
76
77
  end
77
78
 
78
79
  klass
@@ -0,0 +1,65 @@
1
+ module CustomFields
2
+
3
+ module Types
4
+
5
+ module BelongsTo
6
+
7
+ module Field
8
+
9
+ extend ActiveSupport::Concern
10
+
11
+ included do
12
+
13
+ def belongs_to_to_recipe
14
+ { 'class_name' => self.class_name }
15
+ end
16
+
17
+ def belongs_to_is_relationship?
18
+ self.type == 'belongs_to'
19
+ end
20
+
21
+ end
22
+
23
+ end
24
+
25
+ module Target
26
+
27
+ extend ActiveSupport::Concern
28
+
29
+ module ClassMethods
30
+
31
+ # Adds a belongs_to relationship between 2 models
32
+ #
33
+ # @param [ Class ] klass The class to modify
34
+ # @param [ Hash ] rule It contains the name of the field and if it is required or not
35
+ #
36
+ def apply_belongs_to_custom_field(klass, rule)
37
+ # puts "#{klass.inspect}.belongs_to #{rule['name'].inspect}, :class_name => #{rule['class_name'].inspect}" # DEBUG
38
+
39
+ position_name = "position_in_#{rule['name'].underscore}"
40
+
41
+ # puts "#{klass.inspect}.field :#{position_name}" # DEBUG
42
+
43
+ klass.field position_name, :type => Integer, :default => 0
44
+
45
+ klass.belongs_to rule['name'].to_sym, :class_name => rule['class_name']
46
+
47
+ if rule['required']
48
+ klass.validates_presence_of rule['name'].to_sym
49
+ end
50
+
51
+ klass.before_create do |object|
52
+ position = (object.class.max(position_name.to_sym) || 0) + 1
53
+ object.send(:"#{position_name}=", position)
54
+ end
55
+ end
56
+
57
+ end
58
+
59
+ end
60
+
61
+ end
62
+
63
+ end
64
+
65
+ end
@@ -0,0 +1,58 @@
1
+ module CustomFields
2
+
3
+ module Types
4
+
5
+ module HasMany
6
+
7
+ module Field
8
+
9
+ extend ActiveSupport::Concern
10
+
11
+ included do
12
+
13
+ def has_many_to_recipe
14
+ { 'class_name' => self.class_name, 'inverse_of' => self.inverse_of }
15
+ end
16
+
17
+ def has_many_to_is_relationship?
18
+ self.type == 'has_many'
19
+ end
20
+
21
+ end
22
+
23
+ end
24
+
25
+ module Target
26
+
27
+ extend ActiveSupport::Concern
28
+
29
+ module ClassMethods
30
+
31
+ # Adds a has_many relationship between 2 mongoid models
32
+ #
33
+ # @param [ Class ] klass The class to modify
34
+ # @param [ Hash ] rule It contains the name of the relation and if it is required or not
35
+ #
36
+ def apply_has_many_custom_field(klass, rule)
37
+ # puts "#{klass.inspect}.has_many #{rule['name'].inspect}, :class_name => #{rule['class_name'].inspect}, :inverse_of => #{rule['inverse_of']}" # DEBUG
38
+
39
+ position_name = "position_in_#{rule['inverse_of']}"
40
+
41
+ klass.has_many rule['name'], :class_name => rule['class_name'], :inverse_of => rule['inverse_of'], :order => position_name.to_sym.asc
42
+
43
+ klass.accepts_nested_attributes_for rule['name'], :allow_destroy => true
44
+
45
+ if rule['required']
46
+ klass.validates_length_of rule['name'], :minimum => 1
47
+ end
48
+ end
49
+
50
+ end
51
+
52
+ end
53
+
54
+ end
55
+
56
+ end
57
+
58
+ end
@@ -0,0 +1,54 @@
1
+ module CustomFields
2
+
3
+ module Types
4
+
5
+ module ManyToMany
6
+
7
+ module Field
8
+
9
+ extend ActiveSupport::Concern
10
+
11
+ included do
12
+
13
+ def many_to_many_to_recipe
14
+ { 'class_name' => self.class_name, 'inverse_of' => self.inverse_of }
15
+ end
16
+
17
+ def many_to_many_is_relationship?
18
+ self.type == 'many_to_many'
19
+ end
20
+
21
+ end
22
+
23
+ end
24
+
25
+ module Target
26
+
27
+ extend ActiveSupport::Concern
28
+
29
+ module ClassMethods
30
+
31
+ # Adds a many_to_many relationship between 2 mongoid models
32
+ #
33
+ # @param [ Class ] klass The class to modify
34
+ # @param [ Hash ] rule It contains the name of the relation and if it is required or not
35
+ #
36
+ def apply_many_to_many_custom_field(klass, rule)
37
+ # puts "#{klass.inspect}.many_to_many #{rule['name'].inspect}, :class_name => #{rule['class_name'].inspect}" # DEBUG
38
+
39
+ klass.has_and_belongs_to_many rule['name'], :class_name => rule['class_name'], :inverse_of => rule['inverse_of']
40
+
41
+ if rule['required']
42
+ klass.validates_length_of rule['name'], :minimum => 1
43
+ end
44
+ end
45
+
46
+ end
47
+
48
+ end
49
+
50
+ end
51
+
52
+ end
53
+
54
+ end
@@ -0,0 +1,43 @@
1
+ module CustomFields
2
+
3
+ module Types
4
+
5
+ module RelationshipDefault
6
+
7
+ module Field
8
+
9
+ extend ActiveSupport::Concern
10
+
11
+ included do
12
+
13
+ field :class_name
14
+ field :inverse_of
15
+
16
+ validates_presence_of :class_name, :if => :is_relationship?
17
+ validate :ensure_class_name_security, :if => :is_relationship?
18
+
19
+ def is_relationship?
20
+ method_name = :"#{self.type}_is_relationship?"
21
+ self.respond_to?(method_name) && self.send(method_name)
22
+ end
23
+
24
+ protected
25
+
26
+ def ensure_class_name_security
27
+ true
28
+ # FIXME: to be overridden in the target application
29
+ end
30
+
31
+ end
32
+
33
+ end
34
+
35
+ end
36
+
37
+ end
38
+
39
+ end
40
+
41
+
42
+
43
+
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
2
  module CustomFields #:nodoc
3
3
 
4
- VERSION = '2.0.0.rc2'
4
+ VERSION = '2.0.0.rc3'
5
5
 
6
6
  end
data/lib/custom_fields.rb CHANGED
@@ -34,6 +34,10 @@ require 'custom_fields/types/date'
34
34
  require 'custom_fields/types/boolean'
35
35
  require 'custom_fields/types/file'
36
36
  require 'custom_fields/types/select'
37
+ require 'custom_fields/types/relationship_default'
38
+ require 'custom_fields/types/belongs_to'
39
+ require 'custom_fields/types/has_many'
40
+ require 'custom_fields/types/many_to_many'
37
41
  require 'custom_fields/field'
38
42
  require 'custom_fields/source'
39
43
  require 'custom_fields/target'
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.rc2
4
+ version: 2.0.0.rc3
5
5
  prerelease: 6
6
6
  platform: ruby
7
7
  authors:
@@ -9,33 +9,33 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-01-26 00:00:00.000000000 Z
12
+ date: 2012-02-03 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: mongoid
16
- requirement: &2157006780 !ruby/object:Gem::Requirement
16
+ requirement: &2157026880 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
20
20
  - !ruby/object:Gem::Version
21
- version: 2.4.2
21
+ version: 2.4.3
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *2157006780
24
+ version_requirements: *2157026880
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: activesupport
27
- requirement: &2157019860 !ruby/object:Gem::Requirement
27
+ requirement: &2157025140 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
31
31
  - !ruby/object:Gem::Version
32
- version: 3.1.3
32
+ version: 3.2.1
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *2157019860
35
+ version_requirements: *2157025140
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: carrierwave-mongoid
38
- requirement: &2157016280 !ruby/object:Gem::Requirement
38
+ requirement: &2157024340 !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: *2157016280
46
+ version_requirements: *2157024340
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: yard
49
- requirement: &2157013880 !ruby/object:Gem::Requirement
49
+ requirement: &2157023280 !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: *2157013880
57
+ version_requirements: *2157023280
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: bson
60
- requirement: &2157012260 !ruby/object:Gem::Requirement
60
+ requirement: &2157022720 !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: *2157012260
68
+ version_requirements: *2157022720
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: mongo
71
- requirement: &2157048080 !ruby/object:Gem::Requirement
71
+ requirement: &2157038420 !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: *2157048080
79
+ version_requirements: *2157038420
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: bson_ext
82
- requirement: &2157046440 !ruby/object:Gem::Requirement
82
+ requirement: &2157037860 !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: *2157046440
90
+ version_requirements: *2157037860
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: mocha
93
- requirement: &2157043280 !ruby/object:Gem::Requirement
93
+ requirement: &2157037360 !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: *2157043280
101
+ version_requirements: *2157037360
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: rspec
104
- requirement: &2157051560 !ruby/object:Gem::Requirement
104
+ requirement: &2157036760 !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: *2157051560
112
+ version_requirements: *2157036760
113
113
  - !ruby/object:Gem::Dependency
114
114
  name: database_cleaner
115
- requirement: &2157070900 !ruby/object:Gem::Requirement
115
+ requirement: &2157036200 !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: *2157070900
123
+ version_requirements: *2157036200
124
124
  - !ruby/object:Gem::Dependency
125
125
  name: RedCloth
126
- requirement: &2157069160 !ruby/object:Gem::Requirement
126
+ requirement: &2157035680 !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: *2157069160
134
+ version_requirements: *2157035680
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,10 +156,14 @@ 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/types/belongs_to.rb
159
160
  - lib/custom_fields/types/boolean.rb
160
161
  - lib/custom_fields/types/date.rb
161
162
  - lib/custom_fields/types/default.rb
162
163
  - lib/custom_fields/types/file.rb
164
+ - lib/custom_fields/types/has_many.rb
165
+ - lib/custom_fields/types/many_to_many.rb
166
+ - lib/custom_fields/types/relationship_default.rb
163
167
  - lib/custom_fields/types/select.rb
164
168
  - lib/custom_fields/types/string.rb
165
169
  - lib/custom_fields/types/text.rb
@@ -183,7 +187,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
183
187
  version: '0'
184
188
  segments:
185
189
  - 0
186
- hash: 2817461240862898588
190
+ hash: -2284291224344609482
187
191
  required_rubygems_version: !ruby/object:Gem::Requirement
188
192
  none: false
189
193
  requirements: