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 CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- acts_as_metadata (0.3.9)
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.23)
44
+ mime-types (1.24)
45
45
  minitest (4.7.5)
46
- multi_json (1.7.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.14)
87
+ treetop (1.4.15)
88
88
  polyglot
89
89
  polyglot (>= 0.3.1)
90
90
  tzinfo (0.3.37)
data/README.md CHANGED
@@ -39,7 +39,7 @@ Create metadata types in your database:
39
39
  Its ready to use:
40
40
 
41
41
  m = MyModel.new
42
- m.sample = 'some string'
42
+ m.m_sample = 'some string'
43
43
  m.save!
44
44
 
45
45
  Add some validations or default value if you need:
@@ -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
- scope = "#{options[:scope]}_id".to_sym
4
+ @metadata_scope = "#{options[:scope]}_id".to_sym
5
5
  else
6
- scope = nil
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 = MetadataType.type(type_name, metadata_scope)
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.class_variable_get('@@metadata_scope') ? send(self.class.class_variable_get('@@metadata_scope')) : nil
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
- MetadataType.type name, metadata_scope
64
+ self.class.metadata_scheme(metadata_scope)[name]
68
65
  end
69
66
 
70
67
  def metadata_types
71
- MetadataType.model_types model_name, metadata_scope
68
+ self.class.metadata_types metadata_scope
72
69
  end
73
70
 
74
71
  def self.metadata_types scope=nil
75
- MetadataType.model_types name.underscore.to_sym, scope
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
- after_create :set_default_values
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 = value.invert.to_a if value.is_a?(Hash)
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 set_default_values
112
- self.models = [] if self.models.nil?
113
- self.values = [] if self.values.nil?
114
- self.save
115
- if @@metadata_scope
116
- MetadataType.drop_cache(self.send(@@metadata_scope))
117
- else
118
- MetadataType.drop_cache
119
- end
120
- end
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
- if @@metadata_scope
124
- MetadataType.drop_cache(self.send(@@metadata_scope))
125
- else
126
- MetadataType.drop_cache
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
@@ -1,3 +1,3 @@
1
1
  module ActsAsMetadata
2
- VERSION = "0.4.1"
2
+ VERSION = "0.4.2"
3
3
  end
@@ -7,7 +7,8 @@ end
7
7
  describe ActsAsMetadata do
8
8
  it 'creates metadata_type' do
9
9
  MetadataType.default.save!
10
- MetadataType.scheme_data.count.should == 1
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.1
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-08-29 00:00:00.000000000 Z
12
+ date: 2013-09-03 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails