tableless_model 0.0.1 → 0.0.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 +4 -20
- data/README.rdoc +37 -3
- data/lib/tableless_model/class_methods.rb +7 -6
- data/lib/tableless_model/version.rb +1 -1
- data/spec/tableless_model_spec.rb +88 -3
- data/tableless_model.gemspec +3 -3
- metadata +8 -22
data/Gemfile.lock
CHANGED
@@ -1,9 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
tableless_model (0.0.1)
|
5
|
-
activerecord
|
6
|
-
hashie
|
4
|
+
vitobotta/tableless_model (0.0.1)
|
7
5
|
validatable
|
8
6
|
|
9
7
|
GEM
|
@@ -21,20 +19,8 @@ GEM
|
|
21
19
|
activesupport (3.0.3)
|
22
20
|
arel (2.0.6)
|
23
21
|
builder (2.1.2)
|
24
|
-
diff-lcs (1.1.2)
|
25
|
-
hashie (0.4.0)
|
26
22
|
i18n (0.5.0)
|
27
|
-
|
28
|
-
rake
|
29
|
-
rake (0.8.7)
|
30
|
-
rspec (2.3.0)
|
31
|
-
rspec-core (~> 2.3.0)
|
32
|
-
rspec-expectations (~> 2.3.0)
|
33
|
-
rspec-mocks (~> 2.3.0)
|
34
|
-
rspec-core (2.3.1)
|
35
|
-
rspec-expectations (2.3.0)
|
36
|
-
diff-lcs (~> 1.1.2)
|
37
|
-
rspec-mocks (2.3.0)
|
23
|
+
minitest (2.0.2)
|
38
24
|
tzinfo (0.3.23)
|
39
25
|
validatable (1.6.7)
|
40
26
|
|
@@ -43,8 +29,6 @@ PLATFORMS
|
|
43
29
|
|
44
30
|
DEPENDENCIES
|
45
31
|
activerecord
|
46
|
-
|
47
|
-
mocha
|
48
|
-
rspec
|
49
|
-
tableless_model!
|
32
|
+
minitest
|
50
33
|
validatable
|
34
|
+
vitobotta/tableless_model!
|
data/README.rdoc
CHANGED
@@ -64,7 +64,7 @@ Using Tableless Model, we could remove the association and the table seo_options
|
|
64
64
|
|
65
65
|
class SeoOptions < ActiveRecord::TablelessModel
|
66
66
|
|
67
|
-
attribute :title_tag, :type => :string, :default => ""
|
67
|
+
attribute :title_tag, :type => :string, :default => "default title tag"
|
68
68
|
attribute :meta_description, :type => :string, :default => ""
|
69
69
|
attribute :meta_keywords, :type => :string, :default => ""
|
70
70
|
attribute :noindex, :type => :boolean, :default => false
|
@@ -74,14 +74,48 @@ Using Tableless Model, we could remove the association and the table seo_options
|
|
74
74
|
end
|
75
75
|
|
76
76
|
|
77
|
-
That's it.
|
77
|
+
That's it.
|
78
|
+
|
79
|
+
When you now create an instance of SeoOptions, you can get and set its attributes as you would do with a normal model:
|
80
|
+
|
81
|
+
seo_options = SeoOptions.new
|
82
|
+
=> <#SeoOptions meta_description="" meta_keywords="" noarchive=false nofollow=false noindex=false
|
83
|
+
title_tag="default title tag">
|
84
|
+
|
85
|
+
seo_options.title_tag
|
86
|
+
=> "default title tag"
|
87
|
+
|
88
|
+
seo_options.title_tag = "new title tag"
|
89
|
+
=> "new title tag"
|
90
|
+
|
91
|
+
Note that inspect shows the properties of the Tableless Model in the same way it does for ActiveRecord models.
|
92
|
+
Of course, you can also override the default values for the attributes when creating a new instance:
|
93
|
+
|
94
|
+
seo_options = SeoOptions.new( :title_tag => "a different title tag" )
|
95
|
+
=> <#SeoOptions meta_description="" meta_keywords="" noarchive=false nofollow=false noindex=false
|
96
|
+
title_tag="a different title tag">
|
97
|
+
|
98
|
+
Now, if you have used the has_tabless macro in the parent class, Page, each instance of Page will store directly its YAML-serialized SEO settings in the column named "seo".
|
99
|
+
|
100
|
+
page = Page.new
|
101
|
+
|
102
|
+
page.seo
|
103
|
+
=> <#SeoOptions meta_description="" meta_keywords="" noarchive=false nofollow=false noindex=false
|
104
|
+
title_tag="default title tag">
|
105
|
+
|
106
|
+
page.seo.title_tag = "changed title tag"
|
107
|
+
=> <#SeoOptions meta_description="" meta_keywords="" noarchive=false nofollow=false noindex=false
|
108
|
+
title_tag="changed title tag">
|
109
|
+
|
110
|
+
|
111
|
+
And this is how the content of the serialized column would look like in the database if you saved the changes as in the example
|
78
112
|
|
79
113
|
--- !map:SeoOptions
|
80
114
|
noarchive: false
|
81
115
|
meta_description:
|
82
116
|
meta_keywords:
|
83
117
|
nofollow: false
|
84
|
-
title_tag:
|
118
|
+
title_tag: "changed title tag"
|
85
119
|
noindex: false
|
86
120
|
|
87
121
|
|
@@ -62,20 +62,21 @@ module Tableless
|
|
62
62
|
begin
|
63
63
|
case type
|
64
64
|
when :string then (value.is_a?(String) ? value : String(value))
|
65
|
-
when :integer then (value.is_a?(Integer) ? value :
|
66
|
-
when :float then (value.is_a?(Float) ? value :
|
67
|
-
when :decimal then (value.is_a?(
|
65
|
+
when :integer then (value.is_a?(Integer) ? value : value.to_s.to_i)
|
66
|
+
when :float then (value.is_a?(Float) ? value : value.to_s.to_f)
|
67
|
+
when :decimal then (value.is_a?(BigDecimal) ? value : BigDecimal(value.to_s))
|
68
68
|
when :time then (value.is_a?(Time) ? value : Time.parse(value))
|
69
69
|
when :date then (value.is_a?(Date) ? value : Date.parse(value))
|
70
70
|
when :datetime then (value.is_a?(DateTime) ? value : DateTime.parse(value))
|
71
|
-
when :boolean then (
|
71
|
+
when :boolean then (["true", "1"].include?(value.to_s))
|
72
72
|
else value
|
73
73
|
end
|
74
74
|
rescue Exception => e
|
75
|
-
raise StandardError, "Invalid value
|
75
|
+
raise StandardError, "Invalid value #{value.inspect} for attribute #{attribute_name} - expected data type is #{type.to_s.capitalize} but value is a #{value.class} (Exception details: #{e})"
|
76
76
|
value
|
77
77
|
end
|
78
78
|
end
|
79
79
|
|
80
80
|
end
|
81
|
-
end
|
81
|
+
end
|
82
|
+
|
@@ -1,8 +1,93 @@
|
|
1
|
+
require "rubygems"
|
2
|
+
require "active_record"
|
1
3
|
require "lib/tableless_model"
|
4
|
+
require 'minitest/autorun'
|
2
5
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
+
class TestTablelessModel < ActiveRecord::TablelessModel
|
7
|
+
end
|
8
|
+
|
9
|
+
|
10
|
+
describe TestTablelessModel do
|
11
|
+
it "has the accessor 'attributes', originally an empty hash" do
|
12
|
+
TestTablelessModel.must_respond_to("attributes")
|
13
|
+
TestTablelessModel.attributes.must_be_kind_of Hash
|
14
|
+
TestTablelessModel.attributes.must_be_empty
|
6
15
|
end
|
7
16
|
|
17
|
+
it "responds to 'attribute'" do
|
18
|
+
TestTablelessModel.must_respond_to "attribute"
|
19
|
+
end
|
20
|
+
|
21
|
+
it "responds to 'attribute', 'cast'" do
|
22
|
+
TestTablelessModel.must_respond_to "attribute"
|
23
|
+
TestTablelessModel.must_respond_to "cast"
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "'attribute' macro" do
|
27
|
+
before do
|
28
|
+
TestTablelessModel.class_eval do
|
29
|
+
attribute :test_attribute
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
it "adds a key-value pair to the attributes accessor" do
|
34
|
+
TestTablelessModel.attributes.wont_be_empty
|
35
|
+
TestTablelessModel.attributes.key?("test_attribute").must_equal true, "An attribute named 'test_attribute' should have been defined"
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe "An instance of TablelessModel" do
|
40
|
+
before do
|
41
|
+
TestTablelessModel.class_eval do
|
42
|
+
attribute :test_attribute
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
it "tries to enforce type casting if a type has been specified for an attribute" do
|
47
|
+
|
48
|
+
test_values = [ "test", 1234, true, "1234.12", "2011-01-02 15:23" ]
|
49
|
+
|
50
|
+
[ :string, :integer, :float, :decimal, :time, :date, :datetime, :boolean ].each do |type|
|
51
|
+
|
52
|
+
# temporarily changing type
|
53
|
+
TestTablelessModel.attributes["test_attribute"][:type] = type
|
54
|
+
|
55
|
+
instance = TestTablelessModel.new
|
56
|
+
|
57
|
+
# instance.must_respond_to "test_attribute", "Getter for test_attribute should have been defined"
|
58
|
+
# instance.must_respond_to "test_attribute=", "Setter for test_attribute should have been defined"
|
59
|
+
|
60
|
+
type_name = case type
|
61
|
+
when :datetime then :date_time
|
62
|
+
when :decimal then :big_decimal
|
63
|
+
else type
|
64
|
+
end
|
65
|
+
|
66
|
+
|
67
|
+
# excluding some test values that would always faild depending on the type
|
68
|
+
exclude_test_values = case type
|
69
|
+
when :decimal then [ "test", true ]
|
70
|
+
when :time then [ 1234, true ]
|
71
|
+
when :date then [ "test", 1234, true, "1234.12" ]
|
72
|
+
when :datetime then [ "test", 1234, true ]
|
73
|
+
else []
|
74
|
+
end
|
75
|
+
|
76
|
+
|
77
|
+
(test_values - exclude_test_values).each do |value|
|
78
|
+
|
79
|
+
instance.test_attribute = value
|
80
|
+
|
81
|
+
if type == :boolean
|
82
|
+
[true, false].include?(instance.test_attribute).must_equal true, "Expected #{instance.test_attribute.inspect} to be boolean, not #{type.class}"
|
83
|
+
else
|
84
|
+
instance.test_attribute.must_be_kind_of type_name.to_s.classify.constantize
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
8
93
|
end
|
data/tableless_model.gemspec
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
2
|
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
|
3
4
|
require "tableless_model/version"
|
4
5
|
|
5
6
|
Gem::Specification.new do |s|
|
@@ -12,11 +13,10 @@ Gem::Specification.new do |s|
|
|
12
13
|
s.summary = %q{A serialisable and validatable table-less model with support for associations, useful to store settings, options, etc in a serialized form in a parent object}
|
13
14
|
s.description = %q{A serialisable and validatable table-less model with support for associations, useful to store settings, options, etc in a serialized form in a parent object}
|
14
15
|
|
15
|
-
s.add_dependency "hashie"
|
16
16
|
s.add_dependency "validatable"
|
17
17
|
|
18
|
-
s.add_development_dependency "
|
19
|
-
s.add_development_dependency "
|
18
|
+
s.add_development_dependency "activerecord"
|
19
|
+
s.add_development_dependency "minitest"
|
20
20
|
|
21
21
|
s.rubyforge_project = "tableless_model"
|
22
22
|
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tableless_model
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 27
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 2
|
10
|
+
version: 0.0.2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Vito Botta
|
@@ -15,11 +15,11 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-01-
|
18
|
+
date: 2011-01-03 00:00:00 +00:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
22
|
-
name:
|
22
|
+
name: validatable
|
23
23
|
prerelease: false
|
24
24
|
requirement: &id001 !ruby/object:Gem::Requirement
|
25
25
|
none: false
|
@@ -33,7 +33,7 @@ dependencies:
|
|
33
33
|
type: :runtime
|
34
34
|
version_requirements: *id001
|
35
35
|
- !ruby/object:Gem::Dependency
|
36
|
-
name:
|
36
|
+
name: activerecord
|
37
37
|
prerelease: false
|
38
38
|
requirement: &id002 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
@@ -44,10 +44,10 @@ dependencies:
|
|
44
44
|
segments:
|
45
45
|
- 0
|
46
46
|
version: "0"
|
47
|
-
type: :
|
47
|
+
type: :development
|
48
48
|
version_requirements: *id002
|
49
49
|
- !ruby/object:Gem::Dependency
|
50
|
-
name:
|
50
|
+
name: minitest
|
51
51
|
prerelease: false
|
52
52
|
requirement: &id003 !ruby/object:Gem::Requirement
|
53
53
|
none: false
|
@@ -60,20 +60,6 @@ dependencies:
|
|
60
60
|
version: "0"
|
61
61
|
type: :development
|
62
62
|
version_requirements: *id003
|
63
|
-
- !ruby/object:Gem::Dependency
|
64
|
-
name: mocha
|
65
|
-
prerelease: false
|
66
|
-
requirement: &id004 !ruby/object:Gem::Requirement
|
67
|
-
none: false
|
68
|
-
requirements:
|
69
|
-
- - ">="
|
70
|
-
- !ruby/object:Gem::Version
|
71
|
-
hash: 3
|
72
|
-
segments:
|
73
|
-
- 0
|
74
|
-
version: "0"
|
75
|
-
type: :development
|
76
|
-
version_requirements: *id004
|
77
63
|
description: A serialisable and validatable table-less model with support for associations, useful to store settings, options, etc in a serialized form in a parent object
|
78
64
|
email:
|
79
65
|
- vito@botta.name
|