acts_as_metadata 0.4.1 → 0.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|