has_metadata_column 1.0.3 → 1.1.0
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/README.md +2 -2
- data/has_metadata_column.gemspec +6 -6
- data/lib/has_metadata_column.rb +20 -19
- metadata +5 -5
data/README.md
CHANGED
@@ -4,7 +4,7 @@ Has Metadata Column -- Keep your tables narrow
|
|
4
4
|
| | |
|
5
5
|
|:------------|:--------------------------------|
|
6
6
|
| **Author** | Tim Morgan |
|
7
|
-
| **Version** | 1.0
|
7
|
+
| **Version** | 1.1.0 (Jul 9, 2013) |
|
8
8
|
| **License** | Released under the MIT License. |
|
9
9
|
|
10
10
|
About
|
@@ -32,7 +32,7 @@ does not get its little fingers all up in ActiveRecord's business.
|
|
32
32
|
|
33
33
|
h2. Installation
|
34
34
|
|
35
|
-
**Important Note:** This gem is only compatible with Ruby 1.9 and Rails
|
35
|
+
**Important Note:** This gem is only compatible with Ruby 1.9 and Rails 4.0.
|
36
36
|
|
37
37
|
Merely add the gem to your Rails project's `Gemfile`:
|
38
38
|
|
data/has_metadata_column.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "has_metadata_column"
|
8
|
-
s.version = "1.0
|
8
|
+
s.version = "1.1.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Tim Morgan"]
|
12
|
-
s.date = "
|
12
|
+
s.date = "2013-07-09"
|
13
13
|
s.description = "Reduce your table width and migration overhead by moving non-indexed columns to a separate metadata column."
|
14
14
|
s.email = "git@timothymorgan.info"
|
15
15
|
s.extra_rdoc_files = [
|
@@ -25,14 +25,14 @@ Gem::Specification.new do |s|
|
|
25
25
|
s.licenses = ["MIT"]
|
26
26
|
s.require_paths = ["lib"]
|
27
27
|
s.required_ruby_version = Gem::Requirement.new(">= 1.9")
|
28
|
-
s.rubygems_version = "1.8.
|
28
|
+
s.rubygems_version = "1.8.25"
|
29
29
|
s.summary = "Schemaless metadata using JSON columns"
|
30
30
|
|
31
31
|
if s.respond_to? :specification_version then
|
32
32
|
s.specification_version = 3
|
33
33
|
|
34
34
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
35
|
-
s.add_runtime_dependency(%q<rails>, [">=
|
35
|
+
s.add_runtime_dependency(%q<rails>, [">= 4.0"])
|
36
36
|
s.add_runtime_dependency(%q<boolean>, [">= 0"])
|
37
37
|
s.add_development_dependency(%q<rspec>, [">= 0"])
|
38
38
|
s.add_development_dependency(%q<sqlite3>, [">= 0"])
|
@@ -40,7 +40,7 @@ Gem::Specification.new do |s|
|
|
40
40
|
s.add_development_dependency(%q<redcarpet>, [">= 0"])
|
41
41
|
s.add_development_dependency(%q<jeweler>, [">= 0"])
|
42
42
|
else
|
43
|
-
s.add_dependency(%q<rails>, [">=
|
43
|
+
s.add_dependency(%q<rails>, [">= 4.0"])
|
44
44
|
s.add_dependency(%q<boolean>, [">= 0"])
|
45
45
|
s.add_dependency(%q<rspec>, [">= 0"])
|
46
46
|
s.add_dependency(%q<sqlite3>, [">= 0"])
|
@@ -49,7 +49,7 @@ Gem::Specification.new do |s|
|
|
49
49
|
s.add_dependency(%q<jeweler>, [">= 0"])
|
50
50
|
end
|
51
51
|
else
|
52
|
-
s.add_dependency(%q<rails>, [">=
|
52
|
+
s.add_dependency(%q<rails>, [">= 4.0"])
|
53
53
|
s.add_dependency(%q<boolean>, [">= 0"])
|
54
54
|
s.add_dependency(%q<rspec>, [">= 0"])
|
55
55
|
s.add_dependency(%q<sqlite3>, [">= 0"])
|
data/lib/has_metadata_column.rb
CHANGED
@@ -20,7 +20,7 @@ module HasMetadataColumn
|
|
20
20
|
extend ActiveSupport::Concern
|
21
21
|
|
22
22
|
# Valid values for the `:type` option.
|
23
|
-
TYPES = [
|
23
|
+
TYPES = [String, Fixnum, Integer, Float, Hash, Array, TrueClass, FalseClass, Boolean, NilClass, Date, Time]
|
24
24
|
|
25
25
|
# @private
|
26
26
|
def self.metadata_typecast(value, type=nil)
|
@@ -110,7 +110,6 @@ module HasMetadataColumn
|
|
110
110
|
alias_method_chain :attribute_method?, :metadata
|
111
111
|
alias_method_chain :attribute, :metadata
|
112
112
|
alias_method_chain :attribute_before_type_cast, :metadata
|
113
|
-
alias_method_chain :_attribute, :metadata
|
114
113
|
alias_method_chain :attribute=, :metadata
|
115
114
|
alias_method_chain :query_attribute, :metadata
|
116
115
|
alias_method_chain :reload, :metadata
|
@@ -130,31 +129,35 @@ module HasMetadataColumn
|
|
130
129
|
|
131
130
|
validate do |obj|
|
132
131
|
value = obj.send(name)
|
133
|
-
|
134
|
-
|
135
|
-
|
132
|
+
if !HasMetadataColumn.metadata_typecast(value, type).kind_of?(type) &&
|
133
|
+
(!options[:allow_nil] || (options[:allow_nil] && !value.nil?)) &&
|
134
|
+
(!options[:allow_blank] || (options[:allow_blank] && !value.blank?))
|
135
|
+
errors.add(name, :incorrect_type)
|
136
|
+
end
|
136
137
|
end if type && type_validate
|
137
138
|
validates(name, options) unless options.empty? or (options.keys - [:allow_nil, :allow_blank]).empty?
|
138
139
|
end
|
139
140
|
end
|
140
141
|
|
141
142
|
if !respond_to?(:define_attribute_methods_with_metadata) && !superclass.respond_to?(:define_attribute_methods_with_metadata) &&
|
142
|
-
|
143
|
+
!respond_to?(:define_method_attribute_with_metadata) && !superclass.respond_to?(:define_method_attribute_with_metadata)
|
143
144
|
class << self
|
144
145
|
def define_attribute_methods_with_metadata
|
145
146
|
define_attribute_methods_without_metadata
|
146
147
|
metadata_column_fields.keys.each { |field| define_attribute_method field }
|
147
148
|
end
|
149
|
+
|
148
150
|
alias_method_chain :define_attribute_methods, :metadata
|
149
151
|
|
150
152
|
def define_method_attribute_with_metadata(attr_name)
|
151
153
|
return define_method_attribute_without_metadata(attr_name) unless metadata_column_fields.include?(attr_name.to_sym)
|
152
154
|
attribute_method_matchers.each do |matcher|
|
153
155
|
method_name = matcher.method_name(attr_name)
|
154
|
-
|
156
|
+
define_proxy_call true, generated_attribute_methods, method_name, matcher.method_missing_target, attr_name.to_s
|
155
157
|
attribute_method_matchers_cache.clear
|
156
158
|
end
|
157
159
|
end
|
160
|
+
|
158
161
|
alias_method_chain :define_method_attribute, :metadata
|
159
162
|
end
|
160
163
|
end
|
@@ -163,10 +166,10 @@ module HasMetadataColumn
|
|
163
166
|
|
164
167
|
# @private
|
165
168
|
def as_json(options={})
|
166
|
-
options
|
167
|
-
options[:except]
|
168
|
-
metadata
|
169
|
-
metadata
|
169
|
+
options ||= Hash.new # the JSON encoder can sometimes give us nil options?
|
170
|
+
options[:except] = Array.wrap(options[:except]) + [self.class.metadata_column]
|
171
|
+
metadata = self.class.metadata_column_fields.keys
|
172
|
+
metadata &= Array.wrap(options[:only]) if options[:only]
|
170
173
|
metadata -= Array.wrap(options[:except])
|
171
174
|
options[:methods] = Array.wrap(options[:methods]) + metadata
|
172
175
|
super options
|
@@ -174,9 +177,9 @@ module HasMetadataColumn
|
|
174
177
|
|
175
178
|
# @private
|
176
179
|
def to_xml(options={})
|
177
|
-
options[:except]
|
178
|
-
metadata
|
179
|
-
metadata
|
180
|
+
options[:except] = Array.wrap(options[:except]) + [self.class.metadata_column]
|
181
|
+
metadata = self.class.metadata_column_fields.keys
|
182
|
+
metadata &= Array.wrap(options[:only]) if options[:only]
|
180
183
|
metadata -= Array.wrap(options[:except])
|
181
184
|
options[:methods] = Array.wrap(options[:methods]) + metadata
|
182
185
|
super options
|
@@ -214,7 +217,7 @@ module HasMetadataColumn
|
|
214
217
|
|
215
218
|
# @private
|
216
219
|
def inspect
|
217
|
-
"#<#{self.class.to_s} #{attributes.except(self.class.metadata_column.to_s).merge(_metadata_hash.try(:stringify_keys) || {}).map { |k, v| "#{k}: #{v.inspect}" }.join(', ')}>"
|
220
|
+
"#<#{self.class.to_s} #{attributes.except(self.class.metadata_column.to_s).merge(_metadata_hash.try!(:stringify_keys) || {}).map { |k, v| "#{k}: #{v.inspect}" }.join(', ')}>"
|
218
221
|
end
|
219
222
|
|
220
223
|
# @private
|
@@ -275,11 +278,9 @@ module HasMetadataColumn
|
|
275
278
|
def attribute_with_metadata=(attr, value)
|
276
279
|
return send(:attribute_without_metadata=, attr, value) unless self.class.metadata_column_fields.include?(attr.to_sym)
|
277
280
|
|
278
|
-
options = self.class.metadata_column_fields[attr.to_sym] || {}
|
279
281
|
attribute_will_change! attr
|
280
|
-
|
281
|
-
|
282
|
-
send :"#{self.class.metadata_column}=", @_metadata_hash.merge(attr.to_s => value).to_json
|
282
|
+
old = _metadata_hash[attr.to_s]
|
283
|
+
send :"#{self.class.metadata_column}=", _metadata_hash.merge(attr.to_s => value).to_json
|
283
284
|
@_metadata_hash = nil
|
284
285
|
@_changed_metadata[attr] = old
|
285
286
|
value
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: has_metadata_column
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
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:
|
12
|
+
date: 2013-07-09 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
@@ -18,7 +18,7 @@ dependencies:
|
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: '
|
21
|
+
version: '4.0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -26,7 +26,7 @@ dependencies:
|
|
26
26
|
requirements:
|
27
27
|
- - ! '>='
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version: '
|
29
|
+
version: '4.0'
|
30
30
|
- !ruby/object:Gem::Dependency
|
31
31
|
name: boolean
|
32
32
|
requirement: !ruby/object:Gem::Requirement
|
@@ -157,7 +157,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
157
157
|
version: '0'
|
158
158
|
requirements: []
|
159
159
|
rubyforge_project:
|
160
|
-
rubygems_version: 1.8.
|
160
|
+
rubygems_version: 1.8.25
|
161
161
|
signing_key:
|
162
162
|
specification_version: 3
|
163
163
|
summary: Schemaless metadata using JSON columns
|