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 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