has_metadata 1.2.4 → 1.3.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.textile CHANGED
@@ -1,7 +1,7 @@
1
1
  h1. has_metadata -- Keep your tables narrow
2
2
 
3
3
  | *Author* | Tim Morgan |
4
- | *Version* | 1.2.4 (Jan 24, 2012) |
4
+ | *Version* | 1.3 (Aug 30, 2011) |
5
5
  | *License* | Released under the MIT License. |
6
6
 
7
7
  h2. Important note for those upgrading from 1.0 to 1.1
data/has_metadata.gemspec CHANGED
@@ -4,14 +4,14 @@
4
4
  # -*- encoding: utf-8 -*-
5
5
 
6
6
  Gem::Specification.new do |s|
7
- s.name = "has_metadata"
8
- s.version = "1.2.4"
7
+ s.name = %q{has_metadata}
8
+ s.version = "1.3.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
- s.authors = ["Tim Morgan"]
12
- s.date = "2012-01-25"
13
- s.description = "has_metadata lets you move non-indexed and weighty columns off of your big tables by creating a separate metadata table to store all this extra information. Works with Ruby 1.9. and Rails 3.0."
14
- s.email = "git@timothymorgan.info"
11
+ s.authors = [%q{Tim Morgan}]
12
+ s.date = %q{2011-08-31}
13
+ s.description = %q{has_metadata lets you move non-indexed and weighty columns off of your big tables by creating a separate metadata table to store all this extra information. Works with Ruby 1.9. and Rails 3.0.}
14
+ s.email = %q{git@timothymorgan.info}
15
15
  s.extra_rdoc_files = [
16
16
  "LICENSE",
17
17
  "README.textile"
@@ -26,17 +26,17 @@ Gem::Specification.new do |s|
26
26
  "templates/create_metadata.rb",
27
27
  "templates/metadata.rb"
28
28
  ]
29
- s.homepage = "http://github.com/riscfuture/has_metadata"
30
- s.require_paths = ["lib"]
29
+ s.homepage = %q{http://github.com/riscfuture/has_metadata}
30
+ s.require_paths = [%q{lib}]
31
31
  s.required_ruby_version = Gem::Requirement.new(">= 1.9")
32
- s.rubygems_version = "1.8.15"
33
- s.summary = "Reduce your table width by moving non-indexed columns to a separate metadata table"
32
+ s.rubygems_version = %q{1.8.9}
33
+ s.summary = %q{Reduce your table width by moving non-indexed columns to a separate metadata table}
34
34
 
35
35
  if s.respond_to? :specification_version then
36
36
  s.specification_version = 3
37
37
 
38
38
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
39
- s.add_runtime_dependency(%q<rails>, ["< 3.1"])
39
+ s.add_runtime_dependency(%q<rails>, [">= 3.1"])
40
40
  s.add_runtime_dependency(%q<boolean>, [">= 0"])
41
41
  s.add_development_dependency(%q<jeweler>, [">= 0"])
42
42
  s.add_development_dependency(%q<yard>, [">= 0"])
@@ -44,7 +44,7 @@ Gem::Specification.new do |s|
44
44
  s.add_development_dependency(%q<sqlite3>, [">= 0"])
45
45
  s.add_development_dependency(%q<rspec>, [">= 0"])
46
46
  else
47
- s.add_dependency(%q<rails>, ["< 3.1"])
47
+ s.add_dependency(%q<rails>, [">= 3.1"])
48
48
  s.add_dependency(%q<boolean>, [">= 0"])
49
49
  s.add_dependency(%q<jeweler>, [">= 0"])
50
50
  s.add_dependency(%q<yard>, [">= 0"])
@@ -53,7 +53,7 @@ Gem::Specification.new do |s|
53
53
  s.add_dependency(%q<rspec>, [">= 0"])
54
54
  end
55
55
  else
56
- s.add_dependency(%q<rails>, ["< 3.1"])
56
+ s.add_dependency(%q<rails>, [">= 3.1"])
57
57
  s.add_dependency(%q<boolean>, [">= 0"])
58
58
  s.add_dependency(%q<jeweler>, [">= 0"])
59
59
  s.add_dependency(%q<yard>, [">= 0"])
@@ -11,6 +11,9 @@ module HasMetadata
11
11
  after_initialize :initialize_data
12
12
  before_save :nullify_empty_fields
13
13
 
14
+ validates :data,
15
+ presence: true
16
+
14
17
  # @private
15
18
  def set_fields(fields)
16
19
  return self if @_fields_set
@@ -56,19 +59,12 @@ module HasMetadata
56
59
 
57
60
  options = fields[name] || {}
58
61
  data_will_change!
59
- attribute_will_change! name.to_s
60
62
  data[name] = HasMetadata.metadata_typecast(value, options[:type])
61
63
  end
62
64
 
63
65
  self
64
66
  end
65
67
 
66
- # @return [Hash<String, Object>] A hash of metadata fields that have been
67
- # altered.
68
- def changed_metadata
69
- changed_attributes.except(*attribute_names)
70
- end
71
-
72
68
  private
73
69
 
74
70
  def initialize_data
data/lib/has_metadata.rb CHANGED
@@ -26,7 +26,7 @@ module HasMetadata
26
26
  if value.kind_of?(String) then
27
27
  if type == Integer or type == Fixnum then
28
28
  begin
29
- return Integer(value.sub(/^0+/, '')) # so that it doesn't think it's in octal
29
+ return Integer(value)
30
30
  rescue ArgumentError
31
31
  return value
32
32
  end
@@ -63,23 +63,14 @@ module HasMetadata
63
63
  # has_metadata(optional: true, required: { presence: true }, number: { type: Fixnum })
64
64
 
65
65
  def has_metadata(fields)
66
- if !respond_to?(:metadata_fields) then
67
- belongs_to :metadata, dependent: :destroy
68
- accepts_nested_attributes_for :metadata
69
- after_save :save_metadata, if: :metadata_changed?
66
+ belongs_to :metadata, dependent: :destroy
67
+ accepts_nested_attributes_for :metadata
68
+ after_save :save_metadata, if: :metadata_changed?
69
+ class_attribute :metadata_fields
70
+ self.metadata_fields = fields.deep_clone
70
71
 
71
- class_inheritable_hash :metadata_fields
72
- self.metadata_fields = fields.deep_clone
73
-
74
- define_method(:save_metadata) { metadata.save! }
75
- define_method(:metadata_changed?) { metadata.try :changed? }
76
-
77
- alias_method_chain :changed_attributes, :metadata
78
- alias_method_chain :attribute_will_change!, :metadata
79
- else
80
- raise "Cannot redefine existing metadata fields: #{(fields.keys & self.metadata_fields.keys).to_sentence}" unless (fields.keys & self.metadata_fields.keys).empty?
81
- self.metadata_fields = self.metadata_fields.merge(fields)
82
- end
72
+ define_method(:save_metadata) { metadata.save! }
73
+ define_method(:metadata_changed?) { metadata.try :changed? }
83
74
 
84
75
  fields.each do |name, options|
85
76
  # delegate all attribute methods to the metadata
@@ -87,7 +78,6 @@ module HasMetadata
87
78
 
88
79
  if options.kind_of?(Hash) then
89
80
  type = options.delete(:type)
90
- type_validate = !options.delete(:skip_type_validation)
91
81
  options.delete :default
92
82
 
93
83
  validate do |obj|
@@ -95,7 +85,7 @@ module HasMetadata
95
85
  errors.add(name, :incorrect_type) unless
96
86
  HasMetadata.metadata_typecast(value, type).kind_of?(type) or
97
87
  ((options[:allow_nil] and value.nil?) or (options[:allow_blank] and value.blank?))
98
- end if type && type_validate
88
+ end if type
99
89
  validates(name, options) unless options.empty? or (options.keys - [ :allow_nil, :allow_blank ]).empty?
100
90
  end
101
91
  end
@@ -106,19 +96,6 @@ module HasMetadata
106
96
 
107
97
  module InstanceMethods
108
98
 
109
- def as_json(options={})
110
- options ||= Hash.new # the JSON encoder can sometimes give us nil options?
111
- options[:except] = Array.wrap(options[:except]) + [ :metadata_id ]
112
- options[:methods] = Array.wrap(options[:methods]) + metadata_fields.keys - options[:except].map(&:to_sym)
113
- super options
114
- end
115
-
116
- def to_xml(options={})
117
- options[:except] = Array.wrap(options[:except]) + [ :metadata_id ]
118
- options[:methods] = Array.wrap(options[:methods]) + metadata_fields.keys - options[:except].map(&:to_sym)
119
- super options
120
- end
121
-
122
99
  # @private
123
100
  def assign_multiparameter_attributes(pairs)
124
101
  fake_attributes = pairs.select { |(field, _)| self.class.metadata_fields.include? field[0, field.index('(')].to_sym }
@@ -147,17 +124,13 @@ module HasMetadata
147
124
 
148
125
  # @return [Metadata] An existing associated {Metadata} instance, or new,
149
126
  # saved one if none was found.
150
-
127
+
151
128
  def metadata!
152
- if instance_variables.include?(:@metadata) && metadata then
153
- metadata
129
+ if instance_variables.include?(:@metadata) then
130
+ metadata.set_fields self.class.metadata_fields
154
131
  else
155
- if new_record? then
156
- metadata || build_metadata
157
- else
158
- metadata || Metadata.transaction { metadata || create_metadata }
159
- end
160
- end.set_fields self.class.metadata_fields
132
+ (metadata || Metadata.transaction { metadata || create_metadata }).set_fields self.class.metadata_fields
133
+ end
161
134
  end
162
135
 
163
136
  # @private
@@ -165,18 +138,4 @@ module HasMetadata
165
138
  "#<#{self.class.to_s} #{attributes.merge(metadata.try(:data).try(:stringify_keys) || {}).map { |k,v| "#{k}: #{v.inspect}" }.join(', ')}>"
166
139
  end
167
140
  end
168
-
169
- # @private
170
- def changed_attributes_with_metadata
171
- changed_attributes_without_metadata.merge(metadata.try(:changed_metadata) || {})
172
- end
173
-
174
- # @private
175
- def attribute_will_change_with_metadata!(attr)
176
- if attribute_names.include?(attr) then
177
- attribute_will_change_without_metadata! attr
178
- else
179
- metadata!.send :attribute_will_change!, attr
180
- end
181
- end
182
141
  end
@@ -1,7 +1,7 @@
1
1
  class CreateMetadata < ActiveRecord::Migration
2
2
  def self.up
3
3
  create_table :metadata do |t|
4
- t.text :data
4
+ t.text :data, null: false
5
5
  end
6
6
  end
7
7
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: has_metadata
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.4
4
+ version: 1.3.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,22 +9,22 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-01-25 00:00:00.000000000 Z
12
+ date: 2011-08-31 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
16
- requirement: &70328104605200 !ruby/object:Gem::Requirement
16
+ requirement: &2173498820 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
- - - <
19
+ - - ! '>='
20
20
  - !ruby/object:Gem::Version
21
21
  version: '3.1'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70328104605200
24
+ version_requirements: *2173498820
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: boolean
27
- requirement: &70328104604620 !ruby/object:Gem::Requirement
27
+ requirement: &2173498260 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70328104604620
35
+ version_requirements: *2173498260
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: jeweler
38
- requirement: &70328104604020 !ruby/object:Gem::Requirement
38
+ requirement: &2173358180 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *70328104604020
46
+ version_requirements: *2173358180
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: yard
49
- requirement: &70328104603440 !ruby/object:Gem::Requirement
49
+ requirement: &2173357580 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '0'
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *70328104603440
57
+ version_requirements: *2173357580
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: RedCloth
60
- requirement: &70328104602820 !ruby/object:Gem::Requirement
60
+ requirement: &2173356920 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: '0'
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *70328104602820
68
+ version_requirements: *2173356920
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: sqlite3
71
- requirement: &70328104602260 !ruby/object:Gem::Requirement
71
+ requirement: &2173356440 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: '0'
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *70328104602260
79
+ version_requirements: *2173356440
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: rspec
82
- requirement: &70328104601540 !ruby/object:Gem::Requirement
82
+ requirement: &2173355920 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ! '>='
@@ -87,7 +87,7 @@ dependencies:
87
87
  version: '0'
88
88
  type: :development
89
89
  prerelease: false
90
- version_requirements: *70328104601540
90
+ version_requirements: *2173355920
91
91
  description: has_metadata lets you move non-indexed and weighty columns off of your
92
92
  big tables by creating a separate metadata table to store all this extra information.
93
93
  Works with Ruby 1.9. and Rails 3.0.
@@ -126,7 +126,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
126
126
  version: '0'
127
127
  requirements: []
128
128
  rubyforge_project:
129
- rubygems_version: 1.8.15
129
+ rubygems_version: 1.8.9
130
130
  signing_key:
131
131
  specification_version: 3
132
132
  summary: Reduce your table width by moving non-indexed columns to a separate metadata