acts_as_metadata 0.4.1 → 0.4.2
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile.lock +4 -4
- data/README.md +1 -1
- data/lib/metadata/acts_as_metadata.rb +41 -15
- data/lib/metadata/metadata_type.rb +23 -67
- data/lib/metadata/version.rb +1 -1
- data/spec/acts_as_metadata_spec.rb +2 -1
- metadata +2 -2
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
acts_as_metadata (0.
|
4
|
+
acts_as_metadata (0.4.1)
|
5
5
|
rails (>= 3.0.0)
|
6
6
|
|
7
7
|
GEM
|
@@ -41,9 +41,9 @@ GEM
|
|
41
41
|
mail (2.5.4)
|
42
42
|
mime-types (~> 1.16)
|
43
43
|
treetop (~> 1.4.8)
|
44
|
-
mime-types (1.
|
44
|
+
mime-types (1.24)
|
45
45
|
minitest (4.7.5)
|
46
|
-
multi_json (1.7.
|
46
|
+
multi_json (1.7.9)
|
47
47
|
polyglot (0.3.3)
|
48
48
|
rack (1.5.2)
|
49
49
|
rack-test (0.6.2)
|
@@ -84,7 +84,7 @@ GEM
|
|
84
84
|
thread_safe (0.1.2)
|
85
85
|
atomic
|
86
86
|
tilt (1.4.1)
|
87
|
-
treetop (1.4.
|
87
|
+
treetop (1.4.15)
|
88
88
|
polyglot
|
89
89
|
polyglot (>= 0.3.1)
|
90
90
|
tzinfo (0.3.37)
|
data/README.md
CHANGED
@@ -1,13 +1,11 @@
|
|
1
1
|
module ActsAsMetadata
|
2
2
|
def acts_as_metadata options={}
|
3
3
|
if options[:scope].is_a?(Symbol) && options[:scope].to_s !~ /_id$/
|
4
|
-
|
4
|
+
@metadata_scope = "#{options[:scope]}_id".to_sym
|
5
5
|
else
|
6
|
-
|
6
|
+
@metadata_scope = nil
|
7
7
|
end
|
8
|
-
|
9
|
-
MetadataType.class_variable_set "@@metadata_scope", scope
|
10
|
-
class_variable_set "@@metadata_scope", scope
|
8
|
+
|
11
9
|
class_eval do
|
12
10
|
serialize :metadata_cache
|
13
11
|
has_many :metadata, :as => :model, :dependent => :destroy, :class_name => "Metadata::Metadata", autosave: true
|
@@ -17,7 +15,7 @@ module ActsAsMetadata
|
|
17
15
|
|
18
16
|
def metadata_constraints
|
19
17
|
metadata_types.each do |type_name|
|
20
|
-
type =
|
18
|
+
type = metadata_type type_name
|
21
19
|
value = get_metadata(type.tag)
|
22
20
|
values = type.values.map {|v| v.is_a?(Array) ? v[1].to_s : v.to_s } rescue []
|
23
21
|
if value.is_a? Array
|
@@ -37,7 +35,6 @@ module ActsAsMetadata
|
|
37
35
|
def skip_metadata_validation!
|
38
36
|
@skip_metadata_validation = true
|
39
37
|
end
|
40
|
-
|
41
38
|
|
42
39
|
def mass_assignment_authorizer role = :default
|
43
40
|
super + metadata_types.map {|t| "m_#{t}"}
|
@@ -56,25 +53,54 @@ module ActsAsMetadata
|
|
56
53
|
end
|
57
54
|
|
58
55
|
def metadata_scope
|
59
|
-
self.class.
|
56
|
+
self.class.metadata_scope
|
57
|
+
end
|
58
|
+
|
59
|
+
def self.metadata_scope
|
60
|
+
@metadata_scope
|
60
61
|
end
|
61
62
|
|
62
|
-
def model_name
|
63
|
-
self.class.name.underscore.to_sym
|
64
|
-
end
|
65
|
-
|
66
63
|
def metadata_type name
|
67
|
-
|
64
|
+
self.class.metadata_scheme(metadata_scope)[name]
|
68
65
|
end
|
69
66
|
|
70
67
|
def metadata_types
|
71
|
-
|
68
|
+
self.class.metadata_types metadata_scope
|
72
69
|
end
|
73
70
|
|
74
71
|
def self.metadata_types scope=nil
|
75
|
-
|
72
|
+
model = name.underscore.to_sym
|
73
|
+
types = Rails.cache.fetch("metadata_scheme_#{metadata_scope}#{scope}_modeltypes", expires_in: 60.minutes) do
|
74
|
+
res = { :any => [] }
|
75
|
+
metadata_scheme(scope).each do |tag, type|
|
76
|
+
type.models.each do |model|
|
77
|
+
res[model] = [] if res[model].blank?
|
78
|
+
res[model] << tag
|
79
|
+
end if type.models
|
80
|
+
end
|
81
|
+
res
|
82
|
+
end
|
83
|
+
types[model] ? (types[model] | types[:any]).uniq : types[:any]
|
76
84
|
end
|
85
|
+
|
86
|
+
def self.metadata_scheme_data(scope=nil)
|
87
|
+
Rails.cache.fetch("metadata_scheme_#{metadata_scope}#{scope}_data", expires_in: 60.minutes) do
|
88
|
+
uncached do
|
89
|
+
scope.blank? ? MetadataType.all : MetadataType.where(metadata_scope => scope)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
77
93
|
|
94
|
+
def self.metadata_scheme(scope=nil)
|
95
|
+
Rails.cache.fetch("metadata_scheme_#{metadata_scope}#{scope}_types", expires_in: 60.minutes) do
|
96
|
+
res = {}
|
97
|
+
metadata_scheme_data(scope).each do |type|
|
98
|
+
res[type.tag] = type
|
99
|
+
end
|
100
|
+
res
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
78
104
|
def get_metadata name
|
79
105
|
load_metadata unless metadata_cache.is_a? Hash
|
80
106
|
type = metadata_type name
|
@@ -12,7 +12,8 @@ class MetadataType < ActiveRecord::Base
|
|
12
12
|
serialize :default
|
13
13
|
serialize :values
|
14
14
|
serialize :models
|
15
|
-
|
15
|
+
before_save :set_correct_values
|
16
|
+
after_create :refresh_metadata
|
16
17
|
after_update :refresh_metadata
|
17
18
|
before_destroy :refresh_metadata
|
18
19
|
validates :tag, :presence => true, :format => {:with => /[a-z]+[a-z0-9_]*/}
|
@@ -52,78 +53,33 @@ class MetadataType < ActiveRecord::Base
|
|
52
53
|
end
|
53
54
|
|
54
55
|
def values= value
|
55
|
-
value =
|
56
|
+
value = value.invert.to_a if value.is_a?(Hash)
|
56
57
|
super
|
57
58
|
end
|
58
|
-
|
59
|
-
def default
|
60
|
-
type_cast(attributes['default'])
|
61
|
-
end
|
62
|
-
|
63
|
-
def self.scheme_data(scope=nil)
|
64
|
-
Rails.cache.fetch("metadata_scheme_#{@@metadata_scope}#{scope}_data", :expires_in => 60.minutes) do
|
65
|
-
uncached do
|
66
|
-
scheme_data = scope.blank? ? self.all : self.where(@@metadata_scope => scope).all
|
67
|
-
if scheme_data.count > 0
|
68
|
-
scheme_data
|
69
|
-
else
|
70
|
-
[]
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
def self.scheme(scope=nil)
|
77
|
-
Rails.cache.fetch("metadata_scheme_#{@@metadata_scope}#{scope}_types", :expires_in => 60.minutes) do
|
78
|
-
res = {}
|
79
|
-
self.scheme_data(scope).each do |type|
|
80
|
-
res[type.tag] = type
|
81
|
-
end
|
82
|
-
res
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
def self.model_types(model, scope=nil)
|
87
|
-
types = Rails.cache.fetch("metadata_scheme_#{@@metadata_scope}#{scope}_modeltypes", :expires_in => 60.minutes) do
|
88
|
-
res = { :any => [] }
|
89
|
-
self.scheme(scope).each do |tag, type|
|
90
|
-
type.models.each do |model|
|
91
|
-
res[model] = [] if res[model].blank?
|
92
|
-
res[model] << tag
|
93
|
-
end if type.models
|
94
|
-
end
|
95
|
-
res
|
96
|
-
end
|
97
|
-
types[model] ? (types[model] | types[:any]).uniq : types[:any]
|
98
|
-
end
|
99
|
-
|
100
|
-
def self.type(name, scope=nil)
|
101
|
-
self.scheme(scope)[name]
|
102
|
-
end
|
103
|
-
|
104
|
-
def self.drop_cache(scope=nil)
|
105
|
-
Rails.cache.delete("metadata_scheme_#{@@metadata_scope}#{scope}_data")
|
106
|
-
Rails.cache.delete("metadata_scheme_#{@@metadata_scope}#{scope}_types")
|
107
|
-
Rails.cache.delete("metadata_scheme_#{@@metadata_scope}#{scope}_modeltypes")
|
108
|
-
end
|
109
59
|
|
110
60
|
private
|
111
|
-
def
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
61
|
+
def drop_metadata_scheme_cache scope_column=nil, scope_value=nil
|
62
|
+
Rails.cache.delete("metadata_scheme_#{scope_column}#{scope_value}_data")
|
63
|
+
Rails.cache.delete("metadata_scheme_#{scope_column}#{scope_value}_types")
|
64
|
+
Rails.cache.delete("metadata_scheme_#{scope_column}#{scope_value}_modeltypes")
|
65
|
+
end
|
66
|
+
|
67
|
+
def set_correct_values
|
68
|
+
self.models = (models || []).map(&:to_sym).uniq.keep_if {|model| Kernel.const_defined?(model.capitalize) || model == :any }
|
69
|
+
self.values = (values || []).uniq
|
70
|
+
self.default = type_cast default
|
71
|
+
end
|
121
72
|
|
122
73
|
def refresh_metadata
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
74
|
+
drop_metadata_scheme_cache
|
75
|
+
model_classes = models.include?(:any) ? ObjectSpace.each_object(Class).select {|klass| klass < ActiveRecord::Base } : models.map {|model| Kernel.const_get model }
|
76
|
+
scope_columns = []
|
77
|
+
model_classes.each do |model|
|
78
|
+
model
|
79
|
+
scope_columns << model.metadata_scope if model.respond_to? :metadata_scope
|
80
|
+
end
|
81
|
+
scope_columns.uniq.compact.each do |scope_column|
|
82
|
+
drop_metadata_scheme_cache scope_column, send(scope_column)
|
127
83
|
end
|
128
84
|
end
|
129
85
|
end
|
data/lib/metadata/version.rb
CHANGED
@@ -7,7 +7,8 @@ end
|
|
7
7
|
describe ActsAsMetadata do
|
8
8
|
it 'creates metadata_type' do
|
9
9
|
MetadataType.default.save!
|
10
|
-
|
10
|
+
MyModel.metadata_scheme_data.count.should == 1
|
11
|
+
MyModel.new.metadata_types.count.should == 1
|
11
12
|
end
|
12
13
|
|
13
14
|
it 'has default metadata value' do
|
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.
|
4
|
+
version: 0.4.2
|
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-09-03 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|