has_metadata 1.2.2 → 1.2.3

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.2 (Aug 10, 2011) |
4
+ | *Version* | 1.2.3 (Jan 23, 2012) |
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,48 +4,39 @@
4
4
  # -*- encoding: utf-8 -*-
5
5
 
6
6
  Gem::Specification.new do |s|
7
- s.name = %q{has_metadata}
8
- s.version = "1.2.2"
7
+ s.name = "has_metadata"
8
+ s.version = "1.2.3"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
- s.authors = [%q{Tim Morgan}]
12
- s.date = %q{2011-08-11}
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}
11
+ s.authors = ["Tim Morgan"]
12
+ s.date = "2012-01-24"
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"
15
15
  s.extra_rdoc_files = [
16
16
  "LICENSE",
17
17
  "README.textile"
18
18
  ]
19
19
  s.files = [
20
- ".document",
21
- ".rspec",
22
- "Gemfile",
23
- "Gemfile.lock",
24
20
  "LICENSE",
25
21
  "README.textile",
26
- "Rakefile",
27
- "VERSION",
28
22
  "has_metadata.gemspec",
29
23
  "lib/has_metadata.rb",
30
24
  "lib/has_metadata/metadata_generator.rb",
31
25
  "lib/has_metadata/model.rb",
32
- "spec/has_metadata_spec.rb",
33
- "spec/metadata_spec.rb",
34
- "spec/spec_helper.rb",
35
26
  "templates/create_metadata.rb",
36
27
  "templates/metadata.rb"
37
28
  ]
38
- s.homepage = %q{http://github.com/riscfuture/has_metadata}
39
- s.require_paths = [%q{lib}]
29
+ s.homepage = "http://github.com/riscfuture/has_metadata"
30
+ s.require_paths = ["lib"]
40
31
  s.required_ruby_version = Gem::Requirement.new(">= 1.9")
41
- s.rubygems_version = %q{1.8.7}
42
- s.summary = %q{Reduce your table width by moving non-indexed columns to a separate metadata table}
32
+ s.rubygems_version = "1.8.15"
33
+ s.summary = "Reduce your table width by moving non-indexed columns to a separate metadata table"
43
34
 
44
35
  if s.respond_to? :specification_version then
45
36
  s.specification_version = 3
46
37
 
47
38
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
48
- s.add_runtime_dependency(%q<rails>, [">= 3.0"])
39
+ s.add_runtime_dependency(%q<rails>, ["< 3.1"])
49
40
  s.add_runtime_dependency(%q<boolean>, [">= 0"])
50
41
  s.add_development_dependency(%q<jeweler>, [">= 0"])
51
42
  s.add_development_dependency(%q<yard>, [">= 0"])
@@ -53,7 +44,7 @@ Gem::Specification.new do |s|
53
44
  s.add_development_dependency(%q<sqlite3>, [">= 0"])
54
45
  s.add_development_dependency(%q<rspec>, [">= 0"])
55
46
  else
56
- s.add_dependency(%q<rails>, [">= 3.0"])
47
+ s.add_dependency(%q<rails>, ["< 3.1"])
57
48
  s.add_dependency(%q<boolean>, [">= 0"])
58
49
  s.add_dependency(%q<jeweler>, [">= 0"])
59
50
  s.add_dependency(%q<yard>, [">= 0"])
@@ -62,7 +53,7 @@ Gem::Specification.new do |s|
62
53
  s.add_dependency(%q<rspec>, [">= 0"])
63
54
  end
64
55
  else
65
- s.add_dependency(%q<rails>, [">= 3.0"])
56
+ s.add_dependency(%q<rails>, ["< 3.1"])
66
57
  s.add_dependency(%q<boolean>, [">= 0"])
67
58
  s.add_dependency(%q<jeweler>, [">= 0"])
68
59
  s.add_dependency(%q<yard>, [">= 0"])
@@ -11,9 +11,6 @@ module HasMetadata
11
11
  after_initialize :initialize_data
12
12
  before_save :nullify_empty_fields
13
13
 
14
- validates :data,
15
- presence: true
16
-
17
14
  # @private
18
15
  def set_fields(fields)
19
16
  return self if @_fields_set
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)
29
+ return Integer(value.sub(/^0+/, '')) # so that it doesn't think it's in octal
30
30
  rescue ArgumentError
31
31
  return value
32
32
  end
@@ -63,14 +63,20 @@ module HasMetadata
63
63
  # has_metadata(optional: true, required: { presence: true }, number: { type: Fixnum })
64
64
 
65
65
  def has_metadata(fields)
66
- belongs_to :metadata, dependent: :destroy
67
- accepts_nested_attributes_for :metadata
68
- after_save :save_metadata, if: :metadata_changed?
69
- class_inheritable_hash :metadata_fields
70
- self.metadata_fields = fields.deep_clone
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?
71
70
 
72
- define_method(:save_metadata) { metadata.save! }
73
- define_method(:metadata_changed?) { metadata.try :changed? }
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
+ else
77
+ raise "Cannot redefine existing metadata fields: #{(fields.keys & self.metadata_fields.keys).to_sentence}" unless (fields.keys & self.metadata_fields.keys).empty?
78
+ self.metadata_fields = self.metadata_fields.merge(fields)
79
+ end
74
80
 
75
81
  fields.each do |name, options|
76
82
  # delegate all attribute methods to the metadata
@@ -78,6 +84,7 @@ module HasMetadata
78
84
 
79
85
  if options.kind_of?(Hash) then
80
86
  type = options.delete(:type)
87
+ type_validate = !options.delete(:skip_type_validation)
81
88
  options.delete :default
82
89
 
83
90
  validate do |obj|
@@ -85,7 +92,7 @@ module HasMetadata
85
92
  errors.add(name, :incorrect_type) unless
86
93
  HasMetadata.metadata_typecast(value, type).kind_of?(type) or
87
94
  ((options[:allow_nil] and value.nil?) or (options[:allow_blank] and value.blank?))
88
- end if type
95
+ end if type && type_validate
89
96
  validates(name, options) unless options.empty? or (options.keys - [ :allow_nil, :allow_blank ]).empty?
90
97
  end
91
98
  end
@@ -96,6 +103,19 @@ module HasMetadata
96
103
 
97
104
  module InstanceMethods
98
105
 
106
+ def as_json(options={})
107
+ options ||= Hash.new # the JSON encoder can sometimes give us nil options?
108
+ options[:except] = Array.wrap(options[:except]) + [ :metadata_id ]
109
+ options[:methods] = Array.wrap(options[:methods]) + metadata_fields.keys - options[:except].map(&:to_sym)
110
+ super options
111
+ end
112
+
113
+ def to_xml(options={})
114
+ options[:except] = Array.wrap(options[:except]) + [ :metadata_id ]
115
+ options[:methods] = Array.wrap(options[:methods]) + metadata_fields.keys - options[:except].map(&:to_sym)
116
+ super options
117
+ end
118
+
99
119
  # @private
100
120
  def assign_multiparameter_attributes(pairs)
101
121
  fake_attributes = pairs.select { |(field, _)| self.class.metadata_fields.include? field[0, field.index('(')].to_sym }
@@ -124,13 +144,17 @@ module HasMetadata
124
144
 
125
145
  # @return [Metadata] An existing associated {Metadata} instance, or new,
126
146
  # saved one if none was found.
127
-
147
+
128
148
  def metadata!
129
149
  if instance_variables.include?(:@metadata) then
130
- metadata.set_fields self.class.metadata_fields
150
+ metadata
131
151
  else
132
- (metadata || Metadata.transaction { metadata || create_metadata }).set_fields self.class.metadata_fields
133
- end
152
+ if new_record? then
153
+ metadata || build_metadata
154
+ else
155
+ metadata || Metadata.transaction { metadata || create_metadata }
156
+ end
157
+ end.set_fields self.class.metadata_fields
134
158
  end
135
159
 
136
160
  # @private
@@ -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, null: false
4
+ t.text :data
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.2
4
+ version: 1.2.3
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: 2011-08-11 00:00:00.000000000Z
12
+ date: 2012-01-24 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
16
- requirement: &2173306580 !ruby/object:Gem::Requirement
16
+ requirement: &70201000005300 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
- - - ! '>='
19
+ - - <
20
20
  - !ruby/object:Gem::Version
21
- version: '3.0'
21
+ version: '3.1'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *2173306580
24
+ version_requirements: *70201000005300
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: boolean
27
- requirement: &2173305900 !ruby/object:Gem::Requirement
27
+ requirement: &70201000004600 !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: *2173305900
35
+ version_requirements: *70201000004600
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: jeweler
38
- requirement: &2173305240 !ruby/object:Gem::Requirement
38
+ requirement: &70201000004040 !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: *2173305240
46
+ version_requirements: *70201000004040
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: yard
49
- requirement: &2173304580 !ruby/object:Gem::Requirement
49
+ requirement: &70201000003480 !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: *2173304580
57
+ version_requirements: *70201000003480
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: RedCloth
60
- requirement: &2173304000 !ruby/object:Gem::Requirement
60
+ requirement: &70201000002860 !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: *2173304000
68
+ version_requirements: *70201000002860
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: sqlite3
71
- requirement: &2173303460 !ruby/object:Gem::Requirement
71
+ requirement: &70201000002280 !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: *2173303460
79
+ version_requirements: *70201000002280
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: rspec
82
- requirement: &2173302840 !ruby/object:Gem::Requirement
82
+ requirement: &70201000001640 !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: *2173302840
90
+ version_requirements: *70201000001640
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.
@@ -98,21 +98,12 @@ extra_rdoc_files:
98
98
  - LICENSE
99
99
  - README.textile
100
100
  files:
101
- - .document
102
- - .rspec
103
- - Gemfile
104
- - Gemfile.lock
105
101
  - LICENSE
106
102
  - README.textile
107
- - Rakefile
108
- - VERSION
109
103
  - has_metadata.gemspec
110
104
  - lib/has_metadata.rb
111
105
  - lib/has_metadata/metadata_generator.rb
112
106
  - lib/has_metadata/model.rb
113
- - spec/has_metadata_spec.rb
114
- - spec/metadata_spec.rb
115
- - spec/spec_helper.rb
116
107
  - templates/create_metadata.rb
117
108
  - templates/metadata.rb
118
109
  homepage: http://github.com/riscfuture/has_metadata
@@ -135,7 +126,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
135
126
  version: '0'
136
127
  requirements: []
137
128
  rubyforge_project:
138
- rubygems_version: 1.8.7
129
+ rubygems_version: 1.8.15
139
130
  signing_key:
140
131
  specification_version: 3
141
132
  summary: Reduce your table width by moving non-indexed columns to a separate metadata
data/.document DELETED
@@ -1,5 +0,0 @@
1
- README.rdoc
2
- lib/**/*.rb
3
- bin/*
4
- features/**/*.feature
5
- LICENSE
data/.rspec DELETED
@@ -1 +0,0 @@
1
- -cfs
data/Gemfile DELETED
@@ -1,12 +0,0 @@
1
- source :rubygems
2
-
3
- gem 'rails', '>= 3.0'
4
- gem 'boolean'
5
-
6
- group :development do
7
- gem 'jeweler'
8
- gem 'yard'
9
- gem 'RedCloth', require: 'redcloth'
10
- gem 'sqlite3'
11
- gem 'rspec'
12
- end
data/Gemfile.lock DELETED
@@ -1,98 +0,0 @@
1
- GEM
2
- remote: http://rubygems.org/
3
- specs:
4
- RedCloth (4.2.7)
5
- abstract (1.0.0)
6
- actionmailer (3.0.9)
7
- actionpack (= 3.0.9)
8
- mail (~> 2.2.19)
9
- actionpack (3.0.9)
10
- activemodel (= 3.0.9)
11
- activesupport (= 3.0.9)
12
- builder (~> 2.1.2)
13
- erubis (~> 2.6.6)
14
- i18n (~> 0.5.0)
15
- rack (~> 1.2.1)
16
- rack-mount (~> 0.6.14)
17
- rack-test (~> 0.5.7)
18
- tzinfo (~> 0.3.23)
19
- activemodel (3.0.9)
20
- activesupport (= 3.0.9)
21
- builder (~> 2.1.2)
22
- i18n (~> 0.5.0)
23
- activerecord (3.0.9)
24
- activemodel (= 3.0.9)
25
- activesupport (= 3.0.9)
26
- arel (~> 2.0.10)
27
- tzinfo (~> 0.3.23)
28
- activeresource (3.0.9)
29
- activemodel (= 3.0.9)
30
- activesupport (= 3.0.9)
31
- activesupport (3.0.9)
32
- arel (2.0.10)
33
- boolean (1.0.1)
34
- builder (2.1.2)
35
- diff-lcs (1.1.2)
36
- erubis (2.6.6)
37
- abstract (>= 1.0.0)
38
- git (1.2.5)
39
- i18n (0.5.0)
40
- jeweler (1.6.4)
41
- bundler (~> 1.0)
42
- git (>= 1.2.5)
43
- rake
44
- mail (2.2.19)
45
- activesupport (>= 2.3.6)
46
- i18n (>= 0.4.0)
47
- mime-types (~> 1.16)
48
- treetop (~> 1.4.8)
49
- mime-types (1.16)
50
- polyglot (0.3.2)
51
- rack (1.2.3)
52
- rack-mount (0.6.14)
53
- rack (>= 1.0.0)
54
- rack-test (0.5.7)
55
- rack (>= 1.0)
56
- rails (3.0.9)
57
- actionmailer (= 3.0.9)
58
- actionpack (= 3.0.9)
59
- activerecord (= 3.0.9)
60
- activeresource (= 3.0.9)
61
- activesupport (= 3.0.9)
62
- bundler (~> 1.0)
63
- railties (= 3.0.9)
64
- railties (3.0.9)
65
- actionpack (= 3.0.9)
66
- activesupport (= 3.0.9)
67
- rake (>= 0.8.7)
68
- rdoc (~> 3.4)
69
- thor (~> 0.14.4)
70
- rake (0.9.2)
71
- rdoc (3.9.1)
72
- rspec (2.6.0)
73
- rspec-core (~> 2.6.0)
74
- rspec-expectations (~> 2.6.0)
75
- rspec-mocks (~> 2.6.0)
76
- rspec-core (2.6.4)
77
- rspec-expectations (2.6.0)
78
- diff-lcs (~> 1.1.2)
79
- rspec-mocks (2.6.0)
80
- sqlite3 (1.3.4)
81
- thor (0.14.6)
82
- treetop (1.4.10)
83
- polyglot
84
- polyglot (>= 0.3.1)
85
- tzinfo (0.3.29)
86
- yard (0.7.2)
87
-
88
- PLATFORMS
89
- ruby
90
-
91
- DEPENDENCIES
92
- RedCloth
93
- boolean
94
- jeweler
95
- rails (>= 3.0)
96
- rspec
97
- sqlite3
98
- yard
data/Rakefile DELETED
@@ -1,38 +0,0 @@
1
- require 'rubygems'
2
- require 'bundler'
3
- begin
4
- Bundler.setup(:default, :development)
5
- rescue Bundler::BundlerError => e
6
- $stderr.puts e.message
7
- $stderr.puts "Run `bundle install` to install missing gems"
8
- exit e.status_code
9
- end
10
- require 'rake'
11
-
12
- require 'jeweler'
13
- Jeweler::Tasks.new do |gem|
14
- gem.name = "has_metadata"
15
- gem.summary = %Q{Reduce your table width by moving non-indexed columns to a separate metadata table}
16
- gem.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.}
17
- gem.email = "git@timothymorgan.info"
18
- gem.homepage = "http://github.com/riscfuture/has_metadata"
19
- gem.authors = [ "Tim Morgan" ]
20
- gem.required_ruby_version = '>= 1.9'
21
- end
22
- Jeweler::RubygemsDotOrgTasks.new
23
-
24
- require 'rspec/core/rake_task'
25
- RSpec::Core::RakeTask.new
26
-
27
- require 'yard'
28
- YARD::Rake::YardocTask.new('doc') do |doc|
29
- doc.options << "-m" << "textile"
30
- doc.options << "--protected"
31
- doc.options << "-r" << "README.textile"
32
- doc.options << "-o" << "doc"
33
- doc.options << "--title" << "has_metadata Documentation"
34
-
35
- doc.files = [ 'lib/**/*', 'README.textile', 'templates/metadata.rb' ]
36
- end
37
-
38
- task(default: :spec)
data/VERSION DELETED
@@ -1 +0,0 @@
1
- 1.2.2
@@ -1,224 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
-
3
- module SpecSupport
4
- class ConstructorTester
5
- attr_reader :args
6
- def initialize(*args) @args = args end
7
- end
8
-
9
- class HasMetadataTester < ActiveRecord::Base
10
- include HasMetadata
11
- set_table_name 'users'
12
- has_metadata({
13
- untyped: {},
14
- can_be_nil: { type: Date, allow_nil: true },
15
- can_be_nil_with_default: { type: Date, allow_nil: true, default: Date.today },
16
- can_be_blank: { type: Date, allow_blank: true },
17
- can_be_blank_with_default: { type: Date, allow_blank: true, default: Date.today },
18
- cannot_be_nil_with_default: { type: Boolean, allow_nil: false, default: false },
19
- number: { type: Fixnum, numericality: true },
20
- boolean: { type: Boolean },
21
- multiparam: { type: SpecSupport::ConstructorTester },
22
- has_default: { default: 'default' }
23
- })
24
- end
25
- end
26
-
27
- describe HasMetadata do
28
- describe "#has_metadata" do
29
- it "should add a :metadata association" do
30
- SpecSupport::HasMetadataTester.reflect_on_association(:metadata).macro.should eql(:belongs_to)
31
- end
32
-
33
- it "should set the model to accept nested attributes for :metadata" do
34
- SpecSupport::HasMetadataTester.nested_attributes_options[:metadata].should_not be_nil
35
- end
36
-
37
- it "should define methods for each field" do
38
- [ :attribute, :attribute_before_type_cast, :attribute= ].each do |meth|
39
- SpecSupport::HasMetadataTester.new.should respond_to(meth.to_s.sub('attribute', 'untyped'))
40
- SpecSupport::HasMetadataTester.new.should respond_to(meth.to_s.sub('attribute', 'multiparam'))
41
- SpecSupport::HasMetadataTester.new.should respond_to(meth.to_s.sub('attribute', 'number'))
42
- end
43
- end
44
-
45
- [ :attribute, :attribute_before_type_cast ].each do |getter|
46
- describe "##{getter}" do
47
- before :each do
48
- @object = SpecSupport::HasMetadataTester.new
49
- @metadata = @object.metadata!
50
- end
51
-
52
- it "should return a field in the metadata object" do
53
- @metadata.data[:untyped] = 'bar'
54
- @object.send(getter.to_s.sub('attribute', 'untyped')).should eql('bar')
55
- end
56
-
57
- it "should return nil if there is no associated metadata" do
58
- @object.stub!(:metadata).and_return(nil)
59
- ivars = @object.instance_variables - [ :@metadata ]
60
- @object.stub!(:instance_variables).and_return(ivars)
61
-
62
- @object.send(getter.to_s.sub('attribute', 'untyped')).should be_nil
63
- end
64
-
65
- it "should return a default if one is specified" do
66
- @object.send(getter.to_s.sub('attribute', 'has_default')).should eql('default')
67
- end
68
-
69
- it "should return nil if nil is stored and the default is not nil" do
70
- @metadata.data[:has_default] = nil
71
- @object.send(getter.to_s.sub('attribute', 'has_default')).should eql(nil)
72
- end
73
- end
74
- end
75
-
76
- describe "#attribute=" do
77
- before :each do
78
- @object = SpecSupport::HasMetadataTester.new
79
- @metadata = @object.metadata!
80
- @object.boolean = false
81
- @object.multiparam = SpecSupport::ConstructorTester.new(1,2,3)
82
- end
83
-
84
- it "should set the value in the metadata object" do
85
- @object.untyped = 'foo'
86
- @metadata.data[:untyped].should eql('foo')
87
- end
88
-
89
- it "should create the metadata object if it doesn't exist" do
90
- @object.stub!(:metadata).and_return(nil)
91
- ivars = @object.instance_variables - [ :@metadata ]
92
- @object.stub!(:instance_variables).and_return(ivars)
93
- Metadata.should_receive(:new).once.and_return(@metadata)
94
-
95
- @object.untyped = 'foo'
96
- @metadata.data[:untyped].should eql('foo')
97
- end
98
-
99
- it "should enforce a type if given" do
100
- @object.multiparam = 'not correct'
101
- @object.should_not be_valid
102
- @object.errors[:multiparam].should_not be_empty
103
- end
104
-
105
- it "should cast a type if possible" do
106
- @object.number = "50"
107
- @object.should be_valid
108
- @object.number.should eql(50)
109
-
110
- @object.boolean = "1"
111
- @object.should be_valid
112
- @object.boolean.should eql(true)
113
-
114
- @object.boolean = "0"
115
- @object.should be_valid
116
- @object.boolean.should eql(false)
117
- end
118
-
119
- it "should not enforce a type if :allow_nil is given" do
120
- @object.can_be_nil = nil
121
- @object.valid? #@object.should be_valid
122
- @object.errors[:can_be_nil].should be_empty
123
- end
124
-
125
- it "should not enforce a type if :allow_blank is given" do
126
- @object.can_be_blank = ""
127
- @object.valid? #@object.should be_valid
128
- @object.errors[:can_be_blank].should be_empty
129
- end
130
-
131
- it "should set to the default if given nil and allow_blank or allow_nil are false" do
132
- @object.can_be_nil_with_default = nil
133
- @object.can_be_nil_with_default.should be_nil
134
-
135
- @object.can_be_blank_with_default = nil
136
- @object.can_be_blank_with_default.should be_nil
137
-
138
- @object.cannot_be_nil_with_default.should eql(false)
139
-
140
- @object.cannot_be_nil_with_default = nil
141
- @object.should_not be_valid
142
- @object.errors[:cannot_be_nil_with_default].should_not be_empty
143
- end
144
-
145
- it "should enforce other validations as given" do
146
- @object.number = 'not number'
147
- @object.should_not be_valid
148
- @object.errors[:number].should_not be_empty
149
- end
150
-
151
- it "should mass-assign a multiparameter attribute" do
152
- @object.attributes = { 'multiparam(1)' => 'foo', 'multiparam(2)' => '1' }
153
- @object.multiparam.args.should eql([ 'foo', '1' ])
154
- end
155
-
156
- it "should compact blank multiparameter parts" do
157
- @object.attributes = { 'multiparam(1)' => '', 'multiparam(2)' => 'foo' }
158
- @object.multiparam.args.should eql([ 'foo' ])
159
- end
160
-
161
- it "should typecast multiparameter parts" do
162
- @object.attributes = { 'multiparam(1i)' => '1982', 'multiparam(2f)' => '10.5' }
163
- @object.multiparam.args.should eql([ 1982, 10.5 ])
164
- end
165
- end
166
-
167
- describe "#attribute?" do
168
- before :each do
169
- @object = SpecSupport::HasMetadataTester.new
170
- @metadata = @object.metadata!
171
- end
172
-
173
- context "untyped field" do
174
- it "should return true if the string is not blank" do
175
- @metadata.data = { untyped: 'foo' }
176
- @object.untyped?.should be_true
177
- end
178
-
179
- it "should return false if the string is blank" do
180
- @metadata.data = { untyped: ' ' }
181
- @object.untyped?.should be_false
182
-
183
- @metadata.data = { untyped: '' }
184
- @object.untyped?.should be_false
185
- end
186
- end
187
-
188
- context "numeric field" do
189
- it "should return true if the number is not zero" do
190
- @metadata.data = { number: 4 }
191
- @object.number?.should be_true
192
- end
193
-
194
- it "should return false if the number is zero" do
195
- @metadata.data = { number: 0 }
196
- @object.number?.should be_false
197
- end
198
- end
199
-
200
- context "typed, non-numeric field" do
201
- it "should return true if the string is not blank" do
202
- @metadata.data = { can_be_nil: Date.today }
203
- @object.can_be_nil?.should be_true
204
- end
205
-
206
- it "should return false if the string is blank" do
207
- @metadata.data = { can_be_nil: nil }
208
- @object.can_be_nil?.should be_false
209
- end
210
- end
211
- end
212
-
213
- context "[association]" do
214
- it "should save the metadata when it is changed" do
215
- object = SpecSupport::HasMetadataTester.new
216
- object.number = 123
217
- object.boolean = true
218
- object.multiparam = SpecSupport::ConstructorTester.new(1,2,3)
219
- object.metadata.should_receive(:save).once.and_return(true)
220
- object.save!
221
- end
222
- end
223
- end
224
- end
@@ -1,21 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
-
3
- describe Metadata do
4
- describe ".new" do
5
- it "should initialize data to an empty hash" do
6
- Metadata.new.data.should eql({})
7
- end
8
-
9
- it "should initialize data to the value given in the initializer" do
10
- Metadata.new(data: { foo: 'bar' }).data.should eql(foo: 'bar')
11
- end
12
-
13
- it "should set empty strings to nil" do
14
- Metadata.create!(data: { foo: '' }).data.should eql(foo: nil)
15
- end
16
-
17
- it "should not set false values to nil" do
18
- Metadata.create!(data: { foo: false }).data.should eql(foo: false)
19
- end
20
- end
21
- end
data/spec/spec_helper.rb DELETED
@@ -1,24 +0,0 @@
1
- require 'bundler'
2
- Bundler.require :default, :development
3
- require 'active_support'
4
- require 'active_record'
5
-
6
- $LOAD_PATH.unshift(File.dirname(__FILE__))
7
- $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
8
-
9
- require 'has_metadata'
10
-
11
- ActiveRecord::Base.establish_connection(
12
- adapter: 'sqlite3',
13
- database: 'test.sqlite'
14
- )
15
- require "#{File.dirname __FILE__}/../templates/metadata"
16
-
17
- RSpec.configure do |config|
18
- config.before(:each) do
19
- Metadata.connection.execute "DROP TABLE IF EXISTS metadata"
20
- Metadata.connection.execute "CREATE TABLE metadata (id INTEGER PRIMARY KEY ASC, data TEXT)"
21
- Metadata.connection.execute "DROP TABLE IF EXISTS users"
22
- Metadata.connection.execute "CREATE TABLE users (id INTEGER PRIMARY KEY ASC)"
23
- end
24
- end