acts_as_metadata 0.3.9 → 0.4.1
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile.lock +56 -62
- data/lib/metadata/acts_as_metadata.rb +39 -75
- data/lib/metadata/metadata.rb +0 -16
- data/lib/metadata/metadata_type.rb +2 -34
- data/lib/metadata/version.rb +1 -1
- data/spec/acts_as_metadata_spec.rb +35 -24
- data/spec/spec_helper.rb +1 -2
- metadata +3 -3
data/Gemfile.lock
CHANGED
@@ -1,79 +1,67 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
acts_as_metadata (0.3.
|
4
|
+
acts_as_metadata (0.3.9)
|
5
5
|
rails (>= 3.0.0)
|
6
6
|
|
7
7
|
GEM
|
8
8
|
remote: http://rubygems.org/
|
9
9
|
specs:
|
10
|
-
actionmailer (
|
11
|
-
actionpack (=
|
12
|
-
mail (~> 2.
|
13
|
-
actionpack (
|
14
|
-
|
15
|
-
|
16
|
-
builder (~> 3.0.0)
|
10
|
+
actionmailer (4.0.0)
|
11
|
+
actionpack (= 4.0.0)
|
12
|
+
mail (~> 2.5.3)
|
13
|
+
actionpack (4.0.0)
|
14
|
+
activesupport (= 4.0.0)
|
15
|
+
builder (~> 3.1.0)
|
17
16
|
erubis (~> 2.7.0)
|
18
|
-
|
19
|
-
rack (~>
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
builder (3.0.4)
|
17
|
+
rack (~> 1.5.2)
|
18
|
+
rack-test (~> 0.6.2)
|
19
|
+
activemodel (4.0.0)
|
20
|
+
activesupport (= 4.0.0)
|
21
|
+
builder (~> 3.1.0)
|
22
|
+
activerecord (4.0.0)
|
23
|
+
activemodel (= 4.0.0)
|
24
|
+
activerecord-deprecated_finders (~> 1.0.2)
|
25
|
+
activesupport (= 4.0.0)
|
26
|
+
arel (~> 4.0.0)
|
27
|
+
activerecord-deprecated_finders (1.0.3)
|
28
|
+
activesupport (4.0.0)
|
29
|
+
i18n (~> 0.6, >= 0.6.4)
|
30
|
+
minitest (~> 4.2)
|
31
|
+
multi_json (~> 1.3)
|
32
|
+
thread_safe (~> 0.1)
|
33
|
+
tzinfo (~> 0.3.37)
|
34
|
+
arel (4.0.0)
|
35
|
+
atomic (1.1.10)
|
36
|
+
builder (3.1.4)
|
39
37
|
diff-lcs (1.1.3)
|
40
38
|
erubis (2.7.0)
|
41
|
-
hike (1.2.
|
39
|
+
hike (1.2.3)
|
42
40
|
i18n (0.6.4)
|
43
|
-
|
44
|
-
json (1.7.7)
|
45
|
-
mail (2.4.4)
|
46
|
-
i18n (>= 0.4.0)
|
41
|
+
mail (2.5.4)
|
47
42
|
mime-types (~> 1.16)
|
48
43
|
treetop (~> 1.4.8)
|
49
|
-
mime-types (1.
|
50
|
-
|
44
|
+
mime-types (1.23)
|
45
|
+
minitest (4.7.5)
|
46
|
+
multi_json (1.7.7)
|
51
47
|
polyglot (0.3.3)
|
52
|
-
rack (1.
|
53
|
-
rack-cache (1.2)
|
54
|
-
rack (>= 0.4)
|
55
|
-
rack-ssl (1.3.3)
|
56
|
-
rack
|
48
|
+
rack (1.5.2)
|
57
49
|
rack-test (0.6.2)
|
58
50
|
rack (>= 1.0)
|
59
|
-
rails (
|
60
|
-
actionmailer (=
|
61
|
-
actionpack (=
|
62
|
-
activerecord (=
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
railties (
|
68
|
-
actionpack (=
|
69
|
-
activesupport (=
|
70
|
-
rack-ssl (~> 1.3.2)
|
51
|
+
rails (4.0.0)
|
52
|
+
actionmailer (= 4.0.0)
|
53
|
+
actionpack (= 4.0.0)
|
54
|
+
activerecord (= 4.0.0)
|
55
|
+
activesupport (= 4.0.0)
|
56
|
+
bundler (>= 1.3.0, < 2.0)
|
57
|
+
railties (= 4.0.0)
|
58
|
+
sprockets-rails (~> 2.0.0)
|
59
|
+
railties (4.0.0)
|
60
|
+
actionpack (= 4.0.0)
|
61
|
+
activesupport (= 4.0.0)
|
71
62
|
rake (>= 0.8.7)
|
72
|
-
|
73
|
-
|
74
|
-
rake (10.0.3)
|
75
|
-
rdoc (3.12.2)
|
76
|
-
json (~> 1.4)
|
63
|
+
thor (>= 0.18.1, < 2.0)
|
64
|
+
rake (10.1.0)
|
77
65
|
rspec (2.7.0)
|
78
66
|
rspec-core (~> 2.7.0)
|
79
67
|
rspec-expectations (~> 2.7.0)
|
@@ -82,15 +70,21 @@ GEM
|
|
82
70
|
rspec-expectations (2.7.0)
|
83
71
|
diff-lcs (~> 1.1.2)
|
84
72
|
rspec-mocks (2.7.0)
|
85
|
-
sprockets (2.
|
73
|
+
sprockets (2.10.0)
|
86
74
|
hike (~> 1.2)
|
87
75
|
multi_json (~> 1.0)
|
88
76
|
rack (~> 1.0)
|
89
77
|
tilt (~> 1.1, != 1.3.0)
|
78
|
+
sprockets-rails (2.0.0)
|
79
|
+
actionpack (>= 3.0)
|
80
|
+
activesupport (>= 3.0)
|
81
|
+
sprockets (~> 2.8)
|
90
82
|
sqlite3 (1.3.6)
|
91
|
-
thor (0.
|
92
|
-
|
93
|
-
|
83
|
+
thor (0.18.1)
|
84
|
+
thread_safe (0.1.2)
|
85
|
+
atomic
|
86
|
+
tilt (1.4.1)
|
87
|
+
treetop (1.4.14)
|
94
88
|
polyglot
|
95
89
|
polyglot (>= 0.3.1)
|
96
90
|
tzinfo (0.3.37)
|
@@ -1,18 +1,18 @@
|
|
1
1
|
module ActsAsMetadata
|
2
|
-
def acts_as_metadata
|
2
|
+
def acts_as_metadata options={}
|
3
3
|
if options[:scope].is_a?(Symbol) && options[:scope].to_s !~ /_id$/
|
4
4
|
scope = "#{options[:scope]}_id".to_sym
|
5
5
|
else
|
6
6
|
scope = nil
|
7
7
|
end
|
8
8
|
|
9
|
-
MetadataType.class_variable_set
|
10
|
-
class_variable_set
|
9
|
+
MetadataType.class_variable_set "@@metadata_scope", scope
|
10
|
+
class_variable_set "@@metadata_scope", scope
|
11
11
|
class_eval do
|
12
12
|
serialize :metadata_cache
|
13
|
-
has_many :metadata, :as => :model, :dependent => :destroy, :class_name => "Metadata::Metadata"
|
14
|
-
|
15
|
-
|
13
|
+
has_many :metadata, :as => :model, :dependent => :destroy, :class_name => "Metadata::Metadata", autosave: true
|
14
|
+
after_initialize :create_accessors
|
15
|
+
before_save :save_metadata
|
16
16
|
validate :metadata_constraints
|
17
17
|
|
18
18
|
def metadata_constraints
|
@@ -23,13 +23,13 @@ module ActsAsMetadata
|
|
23
23
|
if value.is_a? Array
|
24
24
|
errors.add(type.tag, I18n.t('acts_as_metadata.errors.blank')) if type.mandatory && (value.blank? || value.map(&:blank?).reduce(:&))
|
25
25
|
value.each_with_index do |v, i|
|
26
|
-
errors.add("#{type.tag}_#{i}", I18n.t('acts_as_metadata.errors.format')) if values.blank? && type.format.present? && v.present? && v.to_s !~ Regexp.new("^#{type.format}$")
|
27
|
-
errors.add("#{type.tag}_#{i}", I18n.t('acts_as_metadata.errors.values')) if values.present? && v.present? && !values.include?(v)
|
26
|
+
errors.add("m_#{type.tag}_#{i}", I18n.t('acts_as_metadata.errors.format')) if values.blank? && type.format.present? && v.present? && v.to_s !~ Regexp.new("^#{type.format}$")
|
27
|
+
errors.add("m_#{type.tag}_#{i}", I18n.t('acts_as_metadata.errors.values')) if values.present? && v.present? && !values.include?(v)
|
28
28
|
end
|
29
29
|
else
|
30
|
-
errors.add(type.tag, I18n.t('acts_as_metadata.errors.blank')) if type.mandatory && value.blank?
|
31
|
-
errors.add(type.tag, I18n.t('acts_as_metadata.errors.format')) if values.blank? && type.format.present? && value.present? && value.to_s !~ Regexp.new("^#{type.format}$")
|
32
|
-
errors.add(type.tag, I18n.t('acts_as_metadata.errors.values')) if values.present? && value.present? && !values.include?(value.to_s)
|
30
|
+
errors.add("m_#{type.tag}", I18n.t('acts_as_metadata.errors.blank')) if type.mandatory && value.blank?
|
31
|
+
errors.add("m_#{type.tag}", I18n.t('acts_as_metadata.errors.format')) if values.blank? && type.format.present? && value.present? && value.to_s !~ Regexp.new("^#{type.format}$")
|
32
|
+
errors.add("m_#{type.tag}", I18n.t('acts_as_metadata.errors.values')) if values.present? && value.present? && !values.include?(value.to_s)
|
33
33
|
end
|
34
34
|
end unless @skip_metadata_validation
|
35
35
|
end
|
@@ -39,22 +39,8 @@ module ActsAsMetadata
|
|
39
39
|
end
|
40
40
|
|
41
41
|
|
42
|
-
def mass_assignment_authorizer
|
43
|
-
super + metadata_types
|
44
|
-
end
|
45
|
-
|
46
|
-
def initialize(args=nil, options = {})
|
47
|
-
scope = self.class.class_variable_get('@@metadata_scope') ? args[self.class.class_variable_get('@@metadata_scope')] : nil rescue nil
|
48
|
-
types = MetadataType.model_types(model_name, scope)
|
49
|
-
types.each do |type|
|
50
|
-
create_accessor type
|
51
|
-
end
|
52
|
-
super
|
53
|
-
end
|
54
|
-
|
55
|
-
def update_attributes(attributes)
|
56
|
-
create_accessors
|
57
|
-
super
|
42
|
+
def mass_assignment_authorizer role = :default
|
43
|
+
super + metadata_types.map {|t| "m_#{t}"}
|
58
44
|
end
|
59
45
|
|
60
46
|
def create_accessors
|
@@ -64,76 +50,54 @@ module ActsAsMetadata
|
|
64
50
|
end
|
65
51
|
|
66
52
|
def create_accessor type
|
67
|
-
class_eval "attr_accessor
|
68
|
-
class_eval "def #{type}; get_metadata('#{type}'); end"
|
69
|
-
class_eval "def #{type}=(value); set_metadata('#{type}', value); end"
|
53
|
+
class_eval "attr_accessor :m_#{type}"
|
54
|
+
class_eval "def m_#{type}; get_metadata('#{type}'); end"
|
55
|
+
class_eval "def m_#{type}=(value); set_metadata('#{type}', value); end"
|
70
56
|
end
|
71
|
-
|
72
|
-
def create_accessors_and_save_metadata
|
73
|
-
create_accessors
|
74
|
-
save_metadata
|
75
|
-
end
|
76
|
-
|
77
|
-
def method_missing(meth, *args, &block)
|
78
|
-
begin
|
79
|
-
super
|
80
|
-
rescue NoMethodError
|
81
|
-
name = meth.to_s
|
82
|
-
if name =~ /^(.+)=$/
|
83
|
-
name = name[0..-2]
|
84
|
-
if metadata_types.include?(name)
|
85
|
-
set_metadata(name, args.first)
|
86
|
-
else
|
87
|
-
raise
|
88
|
-
end
|
89
|
-
else
|
90
|
-
if metadata_types.include?(name)
|
91
|
-
get_metadata(name)
|
92
|
-
else
|
93
|
-
raise
|
94
|
-
end
|
95
|
-
end
|
96
|
-
end
|
97
|
-
end
|
98
57
|
|
99
58
|
def metadata_scope
|
100
|
-
self.class.class_variable_get('@@metadata_scope') ?
|
59
|
+
self.class.class_variable_get('@@metadata_scope') ? send(self.class.class_variable_get('@@metadata_scope')) : nil
|
101
60
|
end
|
102
61
|
|
103
62
|
def model_name
|
104
63
|
self.class.name.underscore.to_sym
|
105
64
|
end
|
106
65
|
|
66
|
+
def metadata_type name
|
67
|
+
MetadataType.type name, metadata_scope
|
68
|
+
end
|
69
|
+
|
107
70
|
def metadata_types
|
108
|
-
MetadataType.model_types
|
71
|
+
MetadataType.model_types model_name, metadata_scope
|
109
72
|
end
|
110
73
|
|
111
|
-
def self.metadata_types
|
112
|
-
MetadataType.model_types
|
74
|
+
def self.metadata_types scope=nil
|
75
|
+
MetadataType.model_types name.underscore.to_sym, scope
|
113
76
|
end
|
114
77
|
|
115
|
-
def get_metadata
|
116
|
-
load_metadata unless metadata_cache.is_a?
|
117
|
-
|
78
|
+
def get_metadata name
|
79
|
+
load_metadata unless metadata_cache.is_a? Hash
|
80
|
+
type = metadata_type name
|
81
|
+
metadata_cache[name].blank? ? type.type_cast(type.default) : metadata_cache[name]
|
118
82
|
end
|
119
83
|
|
120
|
-
def set_metadata
|
121
|
-
type =
|
84
|
+
def set_metadata name, value
|
85
|
+
type = metadata_type name
|
122
86
|
raise NoMethodError if type.nil?
|
123
|
-
load_metadata unless metadata_cache.is_a?
|
124
|
-
|
125
|
-
|
126
|
-
|
87
|
+
load_metadata unless metadata_cache.is_a? Hash
|
88
|
+
metadata_cache[name] = type.type_cast(value)
|
89
|
+
metadata_cache[name] = [metadata_cache[name]].compact if type.multiple && !metadata_cache[name].is_a?(Array)
|
90
|
+
metadata_cache[name] = type.type_cast(metadata_cache[name].first) if !type.multiple && metadata_cache[name].is_a?(Array)
|
127
91
|
end
|
128
92
|
|
129
93
|
def save_metadata
|
130
|
-
|
131
|
-
|
132
|
-
value =
|
94
|
+
metadata.map &:mark_for_destruction
|
95
|
+
metadata_types.each do |type_name|
|
96
|
+
value = get_metadata(type_name)
|
133
97
|
if value.is_a? Array
|
134
|
-
value.each {|v|
|
98
|
+
value.each {|v| metadata.build(metadata_type: type_name, value: v) unless v.nil? }
|
135
99
|
else
|
136
|
-
|
100
|
+
metadata.build(metadata_type: type_name, value: value) unless value.nil?
|
137
101
|
end
|
138
102
|
end
|
139
103
|
end
|
data/lib/metadata/metadata.rb
CHANGED
@@ -1,22 +1,6 @@
|
|
1
1
|
module Metadata
|
2
2
|
class Metadata < ActiveRecord::Base
|
3
|
-
default_scope :conditions => {:deleted_at => nil}, :order => 'created_at DESC'
|
4
3
|
before_save :set_search_value
|
5
|
-
|
6
|
-
def undelete
|
7
|
-
self.deleted_at=nil
|
8
|
-
self.save
|
9
|
-
end
|
10
|
-
|
11
|
-
def destroy(real = false)
|
12
|
-
if real
|
13
|
-
Metadata.unscoped.delete_all(:id => self.id)
|
14
|
-
else
|
15
|
-
self.run_callbacks(:destroy)
|
16
|
-
self.update_attribute(:deleted_at, Time.now.utc)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
4
|
protected
|
21
5
|
def set_search_value
|
22
6
|
self.search_value = value.to_s[0,255] rescue nil
|
@@ -15,15 +15,8 @@ class MetadataType < ActiveRecord::Base
|
|
15
15
|
after_create :set_default_values
|
16
16
|
after_update :refresh_metadata
|
17
17
|
before_destroy :refresh_metadata
|
18
|
-
|
19
|
-
attr_accessible :tag, :name, :description, :models, :mandatory,
|
20
|
-
:default, :format, :datatype, :values, :multiple,
|
21
|
-
:models_json, :values_json, :default_json
|
22
|
-
validates :tag, :presence => true, :format => {:with => /^[a-z]+[a-z0-9_]*$/},
|
23
|
-
:exclusion => { :in => %w(format errors callback action categorie accept attributes host key layout notify open render save template type id parent_id lft rgt test select),
|
24
|
-
:message => "this name is reserved"}
|
18
|
+
validates :tag, :presence => true, :format => {:with => /[a-z]+[a-z0-9_]*/}
|
25
19
|
validates :datatype, :presence => true
|
26
|
-
default_scope :conditions => {:deleted_at => nil}, :order => 'created_at DESC'
|
27
20
|
|
28
21
|
def self.default
|
29
22
|
self.new({
|
@@ -40,7 +33,7 @@ class MetadataType < ActiveRecord::Base
|
|
40
33
|
end
|
41
34
|
|
42
35
|
def type_cast(value)
|
43
|
-
return value.map {|x| type_cast x } if value.is_a? Array
|
36
|
+
return value.delete_if(&:blank?).map {|x| type_cast x } if value.is_a? Array
|
44
37
|
return nil if value.nil? && datatype != 'boolean'
|
45
38
|
return value unless value.is_a?(String) || value.nil?
|
46
39
|
|
@@ -58,40 +51,15 @@ class MetadataType < ActiveRecord::Base
|
|
58
51
|
end rescue nil
|
59
52
|
end
|
60
53
|
|
61
|
-
def models_json
|
62
|
-
self.models ? self.models.to_json : [].to_json
|
63
|
-
end
|
64
|
-
|
65
|
-
def models_json=(value)
|
66
|
-
self.models = JSON.parse(value) rescue []
|
67
|
-
end
|
68
|
-
|
69
54
|
def values= value
|
70
55
|
value = value.invert.to_a if value.is_a?(Hash)
|
71
56
|
super
|
72
57
|
end
|
73
58
|
|
74
|
-
def values_json
|
75
|
-
self.values ? self.values.to_a.to_json : [].to_json
|
76
|
-
end
|
77
|
-
|
78
|
-
def values_json=(value)
|
79
|
-
self.values = JSON.parse(value) rescue []
|
80
|
-
values.each {|v| v.is_a?(Array) ? v.each(&:strip!) : v.strip! } if values.is_a? Array
|
81
|
-
end
|
82
|
-
|
83
59
|
def default
|
84
60
|
type_cast(attributes['default'])
|
85
61
|
end
|
86
62
|
|
87
|
-
def default_json
|
88
|
-
self.default.to_json
|
89
|
-
end
|
90
|
-
|
91
|
-
def default_json=(value)
|
92
|
-
self.default = JSON.parse(value) rescue value[/"(.*)"/, 1]
|
93
|
-
end
|
94
|
-
|
95
63
|
def self.scheme_data(scope=nil)
|
96
64
|
Rails.cache.fetch("metadata_scheme_#{@@metadata_scope}#{scope}_data", :expires_in => 60.minutes) do
|
97
65
|
uncached do
|
data/lib/metadata/version.rb
CHANGED
@@ -12,23 +12,23 @@ describe ActsAsMetadata do
|
|
12
12
|
|
13
13
|
it 'has default metadata value' do
|
14
14
|
mymodel = MyModel.create
|
15
|
-
mymodel.
|
15
|
+
mymodel.m_sample.should == 'default'
|
16
16
|
end
|
17
17
|
|
18
18
|
it 'set metadata value' do
|
19
19
|
mymodel = MyModel.new
|
20
|
-
mymodel.
|
20
|
+
mymodel.m_sample = 'test'
|
21
21
|
mymodel.save!
|
22
22
|
mymodel = MyModel.last
|
23
|
-
mymodel.
|
23
|
+
mymodel.m_sample.should == 'test'
|
24
24
|
end
|
25
25
|
|
26
26
|
it 'updates metadata value' do
|
27
27
|
mymodel = MyModel.last
|
28
|
-
mymodel.
|
28
|
+
mymodel.m_sample = 'test2'
|
29
29
|
mymodel.save!
|
30
30
|
mymodel = MyModel.last
|
31
|
-
mymodel.
|
31
|
+
mymodel.m_sample.should == 'test2'
|
32
32
|
end
|
33
33
|
|
34
34
|
it 'detete metadata when model deleted' do
|
@@ -43,8 +43,8 @@ describe ActsAsMetadata do
|
|
43
43
|
mt.save!
|
44
44
|
mymodel = MyModel.new
|
45
45
|
mymodel.save
|
46
|
-
mymodel.errors.include?(:
|
47
|
-
mymodel.
|
46
|
+
mymodel.errors.include?(:m_sample).should == true
|
47
|
+
mymodel.m_sample = 'wqwewew'
|
48
48
|
mymodel.save
|
49
49
|
mymodel.errors.count.should == 0
|
50
50
|
end
|
@@ -55,10 +55,10 @@ describe ActsAsMetadata do
|
|
55
55
|
mt.format = '[a-z]*'
|
56
56
|
mt.save!
|
57
57
|
mymodel = MyModel.new
|
58
|
-
mymodel.
|
58
|
+
mymodel.m_sample = '12323'
|
59
59
|
mymodel.save
|
60
|
-
mymodel.errors.include?(:
|
61
|
-
mymodel.
|
60
|
+
mymodel.errors.include?(:m_sample).should == true
|
61
|
+
mymodel.m_sample = 'wqwewew'
|
62
62
|
mymodel.save
|
63
63
|
mymodel.errors.count.should == 0
|
64
64
|
end
|
@@ -68,10 +68,10 @@ describe ActsAsMetadata do
|
|
68
68
|
mt.values = ['aaa', 'bbb']
|
69
69
|
mt.save!
|
70
70
|
mymodel = MyModel.new
|
71
|
-
mymodel.
|
71
|
+
mymodel.m_sample = 'ccc'
|
72
72
|
mymodel.save
|
73
|
-
mymodel.errors.include?(:
|
74
|
-
mymodel.
|
73
|
+
mymodel.errors.include?(:m_sample).should == true
|
74
|
+
mymodel.m_sample = 'bbb'
|
75
75
|
mymodel.save
|
76
76
|
mymodel.errors.count.should == 0
|
77
77
|
end
|
@@ -84,7 +84,7 @@ describe ActsAsMetadata do
|
|
84
84
|
mt.multiple = true
|
85
85
|
mt.save!
|
86
86
|
mymodel = MyModel.new
|
87
|
-
mymodel.
|
87
|
+
mymodel.m_samplearray = ['aaa', 'bbb', 'ccc']
|
88
88
|
mymodel.save
|
89
89
|
mymodel.errors.count.should == 0
|
90
90
|
mymodel.metadata.count.should == 3
|
@@ -98,20 +98,20 @@ describe ActsAsMetadata do
|
|
98
98
|
mt.multiple = true
|
99
99
|
mt.save!
|
100
100
|
mymodel = MyModel.new
|
101
|
-
mymodel.
|
101
|
+
mymodel.m_samplearray = 'aaa'
|
102
102
|
mymodel.save
|
103
103
|
mymodel.errors.count.should == 0
|
104
104
|
mymodel.metadata.count.should == 1
|
105
|
-
mymodel.
|
105
|
+
mymodel.m_samplearray.should == ['aaa']
|
106
106
|
end
|
107
107
|
|
108
108
|
it 'loads multiple metadata correctly' do
|
109
109
|
mymodel = MyModel.new
|
110
|
-
mymodel.
|
110
|
+
mymodel.m_samplearray = ['aaa', 'bbb', 'ccc']
|
111
111
|
mymodel.save
|
112
112
|
mymodel.errors.count.should == 0
|
113
113
|
mymodel.metadata_cache = nil
|
114
|
-
mymodel.
|
114
|
+
mymodel.m_samplearray.count.should == 3
|
115
115
|
end
|
116
116
|
|
117
117
|
it 'checks presence validation for multiple metadata' do
|
@@ -121,8 +121,8 @@ describe ActsAsMetadata do
|
|
121
121
|
mt.save!
|
122
122
|
mymodel = MyModel.new
|
123
123
|
mymodel.save
|
124
|
-
mymodel.errors.include?(:
|
125
|
-
mymodel.
|
124
|
+
mymodel.errors.include?(:m_samplearray).should == true
|
125
|
+
mymodel.m_samplearray = ['abc']
|
126
126
|
mymodel.save
|
127
127
|
mymodel.errors.count.should == 0
|
128
128
|
end
|
@@ -133,10 +133,10 @@ describe ActsAsMetadata do
|
|
133
133
|
mt.format = '[a-z]*'
|
134
134
|
mt.save!
|
135
135
|
mymodel = MyModel.new
|
136
|
-
mymodel.
|
136
|
+
mymodel.m_samplearray = ['123', '456', 'ccc']
|
137
137
|
mymodel.save
|
138
138
|
mymodel.errors.count.should == 2
|
139
|
-
mymodel.
|
139
|
+
mymodel.m_samplearray = ['aaa', 'bbb', 'ccc']
|
140
140
|
mymodel.save
|
141
141
|
mymodel.errors.count.should == 0
|
142
142
|
end
|
@@ -147,11 +147,22 @@ describe ActsAsMetadata do
|
|
147
147
|
mt.values = ['aaa', 'bbb', 'ccc']
|
148
148
|
mt.save!
|
149
149
|
mymodel = MyModel.new
|
150
|
-
mymodel.
|
150
|
+
mymodel.m_samplearray = ['ddd', 'eee', 'ccc']
|
151
151
|
mymodel.save
|
152
152
|
mymodel.errors.count.should == 2
|
153
|
-
mymodel.
|
153
|
+
mymodel.m_samplearray = ['aaa', 'bbb', 'ccc']
|
154
154
|
mymodel.save
|
155
155
|
mymodel.errors.count.should == 0
|
156
156
|
end
|
157
|
+
|
158
|
+
it 'removes blank values from multiple metadata' do
|
159
|
+
mt = MetadataType.first
|
160
|
+
mt.mandatory = false
|
161
|
+
mt.values = nil
|
162
|
+
mt.save!
|
163
|
+
mymodel = MyModel.new
|
164
|
+
mymodel.m_samplearray = ['aaa', 'bbb', '']
|
165
|
+
mymodel.save
|
166
|
+
mymodel.m_samplearray.count.should == 2
|
167
|
+
end
|
157
168
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -10,7 +10,7 @@ ActiveRecord::Base.establish_connection(
|
|
10
10
|
:database => "#{root}/db/acts_as_metadata.db"
|
11
11
|
)
|
12
12
|
ActionController::Base.cache_store = ActiveSupport::Cache::MemoryStore.new
|
13
|
-
|
13
|
+
Rails.cache = ActionController::Base.cache_store
|
14
14
|
|
15
15
|
RSpec.configure do |config|
|
16
16
|
# some (optional) config here
|
@@ -20,7 +20,6 @@ ActiveRecord::Base.connection.execute("DROP TABLE IF EXISTS 'my_models'")
|
|
20
20
|
ActiveRecord::Base.connection.execute("DROP TABLE IF EXISTS 'metadata'")
|
21
21
|
ActiveRecord::Base.connection.execute("DROP TABLE IF EXISTS 'metadata_types'")
|
22
22
|
ActiveRecord::Base.connection.create_table(:my_models) do |t|
|
23
|
-
t.integer :id
|
24
23
|
t.string :name
|
25
24
|
t.text :description
|
26
25
|
t.text :metadata_cache
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: acts_as_metadata
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-08-29 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
@@ -102,7 +102,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
102
102
|
version: '0'
|
103
103
|
requirements: []
|
104
104
|
rubyforge_project: acts_as_metadata
|
105
|
-
rubygems_version: 1.8.
|
105
|
+
rubygems_version: 1.8.25
|
106
106
|
signing_key:
|
107
107
|
specification_version: 3
|
108
108
|
summary: Additional on-demand fields for ActiveRecord models
|