custom_fields 2.0.0.rc1 → 2.0.0.rc2

Sign up to get free protection for your applications and to get access to all the features.
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.rc1
4
+ version: 2.0.0.rc2
5
5
  prerelease: 6
6
6
  platform: ruby
7
7
  authors:
@@ -9,22 +9,22 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-01-19 00:00:00.000000000 Z
12
+ date: 2012-01-26 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: mongoid
16
- requirement: &2158024560 !ruby/object:Gem::Requirement
16
+ requirement: &2157006780 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
20
20
  - !ruby/object:Gem::Version
21
- version: 2.4.0
21
+ version: 2.4.2
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *2158024560
24
+ version_requirements: *2157006780
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: activesupport
27
- requirement: &2158023800 !ruby/object:Gem::Requirement
27
+ requirement: &2157019860 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 3.1.3
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *2158023800
35
+ version_requirements: *2157019860
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: carrierwave-mongoid
38
- requirement: &2158023040 !ruby/object:Gem::Requirement
38
+ requirement: &2157016280 !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: *2158023040
46
+ version_requirements: *2157016280
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: yard
49
- requirement: &2158021900 !ruby/object:Gem::Requirement
49
+ requirement: &2157013880 !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: *2158021900
57
+ version_requirements: *2157013880
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: bson
60
- requirement: &2158021300 !ruby/object:Gem::Requirement
60
+ requirement: &2157012260 !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: *2158021300
68
+ version_requirements: *2157012260
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: mongo
71
- requirement: &2158020100 !ruby/object:Gem::Requirement
71
+ requirement: &2157048080 !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: *2158020100
79
+ version_requirements: *2157048080
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: bson_ext
82
- requirement: &2158018640 !ruby/object:Gem::Requirement
82
+ requirement: &2157046440 !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: *2158018640
90
+ version_requirements: *2157046440
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: mocha
93
- requirement: &2158033920 !ruby/object:Gem::Requirement
93
+ requirement: &2157043280 !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: *2158033920
101
+ version_requirements: *2157043280
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: rspec
104
- requirement: &2158032420 !ruby/object:Gem::Requirement
104
+ requirement: &2157051560 !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: *2158032420
112
+ version_requirements: *2157051560
113
113
  - !ruby/object:Gem::Dependency
114
114
  name: database_cleaner
115
- requirement: &2158031400 !ruby/object:Gem::Requirement
115
+ requirement: &2157070900 !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: *2158031400
123
+ version_requirements: *2157070900
124
124
  - !ruby/object:Gem::Dependency
125
125
  name: RedCloth
126
- requirement: &2158029200 !ruby/object:Gem::Requirement
126
+ requirement: &2157069160 !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: *2158029200
134
+ version_requirements: *2157069160
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:
@@ -163,17 +163,6 @@ files:
163
163
  - lib/custom_fields/types/select.rb
164
164
  - lib/custom_fields/types/string.rb
165
165
  - lib/custom_fields/types/text.rb
166
- - lib/custom_fields/types_old/boolean.rb
167
- - lib/custom_fields/types_old/category.rb
168
- - lib/custom_fields/types_old/date.rb
169
- - lib/custom_fields/types_old/default.rb
170
- - lib/custom_fields/types_old/file.rb
171
- - lib/custom_fields/types_old/has_many/proxy_collection.rb
172
- - lib/custom_fields/types_old/has_many/reverse_lookup_proxy_collection.rb
173
- - lib/custom_fields/types_old/has_many.rb
174
- - lib/custom_fields/types_old/has_one.rb
175
- - lib/custom_fields/types_old/string.rb
176
- - lib/custom_fields/types_old/text.rb
177
166
  - lib/custom_fields/version.rb
178
167
  - lib/custom_fields.rb
179
168
  - config/locales/de.yml
@@ -194,7 +183,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
194
183
  version: '0'
195
184
  segments:
196
185
  - 0
197
- hash: 159417792925729594
186
+ hash: 2817461240862898588
198
187
  required_rubygems_version: !ruby/object:Gem::Requirement
199
188
  none: false
200
189
  requirements:
@@ -1,13 +0,0 @@
1
- module CustomFields
2
- module Types
3
- module Boolean
4
-
5
- extend ActiveSupport::Concern
6
-
7
- included do
8
- register_type :boolean, ::Boolean
9
- end
10
-
11
- end
12
- end
13
- end
@@ -1,107 +0,0 @@
1
- module CustomFields
2
- module Types
3
- module Category
4
-
5
- extend ActiveSupport::Concern
6
-
7
- included do
8
- embeds_many :category_items, :class_name => 'CustomFields::Types::Category::Item'
9
-
10
- validates_associated :category_items
11
-
12
- accepts_nested_attributes_for :category_items, :allow_destroy => true
13
-
14
- register_type :category, BSON::ObjectId
15
- end
16
-
17
- module InstanceMethods
18
-
19
- def ordered_category_items
20
- self.category_items.sort { |a, b| (a.position || 0) <=> (b.position || 0) }
21
- end
22
-
23
- def category_names
24
- self.category_items.collect(&:name)
25
- end
26
-
27
- def category_ids
28
- self.category_items.collect(&:_id)
29
- end
30
-
31
- def category_to_hash
32
- { 'category_items' => self.category_items.collect(&:to_hash) }
33
- end
34
-
35
- def apply_category_type(klass)
36
- klass.class_eval <<-EOF
37
-
38
- def self.#{self.safe_alias}_items
39
- self.lookup_custom_field('#{self._name}').ordered_category_items
40
- end
41
-
42
- def self.#{self.safe_alias}_names
43
- self.#{self.safe_alias}_items.collect(&:name)
44
- end
45
-
46
- def self.group_by_#{self.safe_alias}(list_method = nil)
47
- groups = (if self.embedded?
48
- list_method ||= self.association_name
49
- self._parent.send(list_method)
50
- else
51
- list_method ||= :all
52
- self.send(list_method)
53
- end).to_a.group_by(&:#{self._name})
54
-
55
- self.#{self.safe_alias}_items.collect do |category|
56
- {
57
- :name => category.name,
58
- :items => groups[category._id] || []
59
- }.with_indifferent_access
60
- end
61
- end
62
-
63
- def #{self.safe_alias}=(id)
64
- category = self.class.#{self.safe_alias}_items.find { |item| item.name == id || item._id.to_s == id.to_s }
65
- category_id = category ? category._id : nil
66
- self.send(:'#{self._name}=', category_id)
67
- end
68
-
69
- def #{self.safe_alias}
70
- category_id = self.send(:#{self._name})
71
- category = self.class.#{self.safe_alias}_items.find { |item| item._id == category_id }
72
- category ? category.name : nil
73
- end
74
- EOF
75
- end
76
-
77
- end
78
-
79
- class Item
80
-
81
- include Mongoid::Document
82
-
83
- field :name
84
- field :position, :type => Integer, :default => 0
85
-
86
- embedded_in :custom_field, :inverse_of => :category_items
87
-
88
- validates_presence_of :name
89
-
90
- def to_hash(more = {})
91
- self.fields.keys.inject({}) do |memo, meth|
92
- memo[meth] = self.send(meth.to_sym); memo
93
- end.merge({
94
- 'id' => self._id,
95
- 'new_record' => self.new_record?,
96
- 'errors' => self.errors
97
- }).merge(more)
98
- end
99
-
100
- def to_json
101
- ActiveSupport::JSON.encode(self.to_hash)
102
- end
103
-
104
- end
105
- end
106
- end
107
- end
@@ -1,49 +0,0 @@
1
- module CustomFields
2
- module Types
3
- module Date
4
-
5
- extend ActiveSupport::Concern
6
-
7
- included do
8
- register_type :date, ::Date
9
- end
10
-
11
- module InstanceMethods
12
-
13
- def apply_date_type(klass)
14
-
15
- klass.class_eval <<-EOF
16
-
17
- def #{self.safe_alias}
18
- self.#{self._name}
19
- end
20
-
21
- def #{self.safe_alias}=(value)
22
- if value.is_a?(::String) && !value.blank?
23
- date = ::Date._strptime(value, I18n.t('date.formats.default'))
24
- value = ::Date.new(date[:year], date[:mon], date[:mday])
25
- end
26
-
27
- self.#{self._name} = value
28
- end
29
-
30
- def formatted_#{self.safe_alias}
31
- self.#{self._name}.strftime(I18n.t('date.formats.default')) rescue nil
32
- end
33
-
34
- alias formatted_#{self.safe_alias}= #{self.safe_alias}=
35
- EOF
36
-
37
- def add_date_validation(klass)
38
- if self.required?
39
- klass.validates_presence_of self.safe_alias.to_sym, :"formatted_#{self.safe_alias}"
40
- end
41
- end
42
-
43
- end
44
-
45
- end
46
-
47
- end
48
- end
49
- end
@@ -1,44 +0,0 @@
1
- module CustomFields
2
- module Types
3
- module Default
4
- extend ActiveSupport::Concern
5
-
6
- included do
7
- cattr_accessor :field_types
8
- end
9
-
10
- module InstanceMethods
11
-
12
- def apply_default_type(klass)
13
- klass.class_eval <<-EOF
14
- alias :#{self.safe_alias} :#{self._name}
15
- alias :#{self.safe_alias}= :#{self._name}=
16
- EOF
17
- end
18
-
19
- def add_default_validation(klass)
20
- # add validation if required field
21
- if self.required?
22
- klass.validates_presence_of self.safe_alias.to_sym
23
- end
24
- end
25
-
26
- end
27
-
28
- module ClassMethods
29
-
30
- def register_type(kind, klass = ::String)
31
- self.field_types ||= {}
32
- self.field_types[kind.to_sym] = klass unless klass.nil?
33
-
34
- self.class_eval <<-EOF
35
- def #{kind.to_s}?
36
- self.kind.downcase == '#{kind}' rescue false
37
- end
38
- EOF
39
- end
40
-
41
- end
42
- end
43
- end
44
- end
@@ -1,27 +0,0 @@
1
- module CustomFields
2
- module Types
3
- module File
4
-
5
- extend ActiveSupport::Concern
6
-
7
- included do
8
- register_type :file, nil # do not create the default field
9
- end
10
-
11
- module InstanceMethods
12
-
13
- def apply_file_type(klass)
14
-
15
- klass.mount_uploader self._name, FileUploader
16
-
17
- self.apply_default_type(klass)
18
- end
19
-
20
- end
21
-
22
- class FileUploader < ::CarrierWave::Uploader::Base
23
- end
24
-
25
- end
26
- end
27
- end
@@ -1,103 +0,0 @@
1
- module CustomFields
2
- module Types
3
- module HasMany
4
-
5
- class ProxyCollection
6
-
7
- attr_accessor :parent, :target_klass, :field_name, :ids, :values
8
-
9
- def initialize(parent, target_klass, field_name, options = {})
10
- self.parent = parent
11
-
12
- self.target_klass = target_klass
13
-
14
- self.field_name = field_name
15
-
16
- self.ids, self.values = [], []
17
- end
18
-
19
- def find(id)
20
- id = BSON::ObjectId(id) unless id.is_a?(BSON::ObjectId)
21
- self.values.detect { |obj_id| obj_id == id }
22
- end
23
-
24
- def update(values)
25
- values = [] if values.blank? || self.target_klass.nil?
26
-
27
- self.ids = values.collect { |obj| self.id_for_sure(obj) }.compact
28
- self.values = values.collect { |obj| self.object_for_sure(obj) }.compact
29
- end
30
-
31
- # just before the parent gets saved, reflect the changes to the parent object
32
- def store_values
33
- self.parent.write_attribute(self.field_name, self.ids)
34
- end
35
-
36
- # once the parent object gets saved, call this method, kind of hook or callback
37
- def persist
38
- true
39
- end
40
-
41
- def <<(*args)
42
- args.flatten.compact.each do |obj|
43
- self.ids << self.id_for_sure(obj)
44
- self.values << self.object_for_sure(obj)
45
- end
46
- end
47
-
48
- alias :push :<<
49
-
50
- def size
51
- self.values.size
52
- end
53
-
54
- alias :length :size
55
-
56
- def reload
57
- self.collection(true)
58
- self
59
- end
60
-
61
- def method_missing(name, *args, &block)
62
- self.values.send(name, *args, &block)
63
- end
64
-
65
- protected
66
-
67
- def id_for_sure(id_or_object)
68
- id_or_object.respond_to?(:_id) ? id_or_object._id : id_or_object
69
- end
70
-
71
- def object_for_sure(id_or_object)
72
- if id_or_object.respond_to?(:_id)
73
- id_or_object
74
- else
75
- self.collection.find(id_or_object)
76
- end
77
- rescue # target_klass does not exist anymore or the target element has been removed since
78
- nil
79
- end
80
-
81
- def collection(reload_embedded = false)
82
- return [] if self.target_klass.nil?
83
-
84
- if self.target_klass.embedded?
85
- if @embedded_collection.nil? || reload_embedded
86
- parent_target = self.target_klass._parent
87
-
88
- parent_target = parent_target.reload if reload_embedded
89
-
90
- @embedded_collection = parent_target.send(self.target_klass.association_name)
91
- end
92
-
93
- @embedded_collection
94
- else
95
- self.target_klass
96
- end
97
- end
98
-
99
- end
100
-
101
- end
102
- end
103
- end
@@ -1,101 +0,0 @@
1
- module CustomFields
2
- module Types
3
- module HasMany
4
-
5
- class ReverseLookupProxyCollection < ProxyCollection
6
-
7
- attr_accessor :reverse_lookup_field, :previous_state
8
-
9
- def initialize(parent, target_klass, field_name, options = {})
10
- super
11
-
12
- self.reverse_lookup_field = options[:reverse_lookup_field].to_sym
13
-
14
- if self.parent.new_record?
15
- self.previous_state = { :ids => [], :values => [] }
16
- else
17
- self.reload
18
- end
19
- end
20
-
21
- def store_values
22
- true # do nothing
23
- end
24
-
25
- def persist
26
- (self.previous_state[:values] - self.values).each do |object|
27
- self.set_foreign_key_and_position(object, nil)
28
- end
29
-
30
- self.values.each_with_index do |object, position|
31
- self.set_foreign_key_and_position(object, self.parent._id, position)
32
- end
33
-
34
- if self.target_klass.embedded?
35
- self.target_klass._parent.save!(:validate => false)
36
- end
37
-
38
- self.reorder # update positions in the internal collection (self.values)
39
-
40
- self.reset_previous_state
41
- end
42
-
43
- def <<(id_or_object)
44
- object = self.object_for_sure(id_or_object)
45
-
46
- foreign_key = object.send(self.reverse_lookup_field)
47
-
48
- if foreign_key && foreign_key != self.parent._id
49
- raise ArgumentError, "Object #{object} cannot be added: already has a different foreign key"
50
- end
51
-
52
- self.ids << self.id_for_sure(object._id)
53
- self.values << self.object_for_sure(object)
54
- end
55
-
56
- def reload
57
- self.update(self.reverse_collection(true))
58
-
59
- self.reset_previous_state
60
- end
61
-
62
- protected
63
-
64
- def reverse_collection(reload = false)
65
- self.collection(reload).where(self.reverse_lookup_field => self.parent._id).order_by([[:"#{self.reverse_lookup_field}_position", :asc]])
66
- end
67
-
68
- def reorder
69
- self.values.sort! { |a, b| a.send(:"#{self.reverse_lookup_field}_position") <=> b.send(:"#{self.reverse_lookup_field}_position") }
70
- end
71
-
72
- def set_foreign_key_and_position(object, value, position = nil)
73
- objects = [object]
74
-
75
- if self.target_klass.embedded?
76
- # Fixme (Did): objects in self.values are different from the ones in self.collection
77
- objects << self.collection.find(object._id)
78
- end
79
-
80
- objects.each do |o|
81
- o.send("#{self.reverse_lookup_field}=".to_sym, value)
82
- o.send("#{self.reverse_lookup_field}_position=".to_sym, position)
83
- end
84
-
85
- unless self.target_klass.embedded?
86
- object.save(:validate => false)
87
- end
88
- end
89
-
90
- def reset_previous_state
91
- self.previous_state = {
92
- :ids => self.ids.clone,
93
- :values => self.values.clone
94
- }
95
- end
96
-
97
- end
98
-
99
- end
100
- end
101
- end