serialist 1.0.0 → 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.rdoc +31 -13
- data/VERSION +1 -1
- data/lib/serialist/serialist_module.rb +25 -38
- data/serialist.gemspec +3 -3
- data/test/serialist_test.rb +7 -0
- metadata +3 -3
- data/TODO.txt +0 -1
data/README.rdoc
CHANGED
@@ -1,12 +1,15 @@
|
|
1
1
|
= Serialist
|
2
2
|
|
3
3
|
Serialize anything. Why waste time migrating your table for yet another dumb attribute you won't search on?
|
4
|
-
Add one
|
4
|
+
Add one serialization field in your table, and let serialist do the rest : validate and mass_assign all your serialized stuff, transparently.
|
5
|
+
Now in version 1.0.0, fully tested.
|
5
6
|
|
6
7
|
=== Before!
|
7
8
|
|
8
9
|
class Article < ActiveRecord::Base
|
9
10
|
serialize :preferences
|
11
|
+
# impossible...
|
12
|
+
# validates_presence_of :key
|
10
13
|
end
|
11
14
|
|
12
15
|
>> a = Article.new
|
@@ -14,17 +17,25 @@ Add one serializable field in your table, and let serialist do the rest.
|
|
14
17
|
>> a.preferences[:key] = "value"
|
15
18
|
>> a.preferences[:key]
|
16
19
|
=> "value"
|
20
|
+
>> Article.create({:preferences => {:key => "value"}})
|
21
|
+
=> #<Article id: ##, preferences: {:key=>"value"}>
|
17
22
|
|
18
23
|
=== After!
|
19
24
|
|
20
25
|
class Article < ActiveRecord::Base
|
21
26
|
serialist :preferences, [:key, :other_key, :yet_another_key]
|
27
|
+
validates_presence_of :key
|
22
28
|
end
|
23
29
|
|
24
30
|
>> a = Article.new
|
25
31
|
>> a.key = "value"
|
26
32
|
>> a.key
|
27
33
|
=> "value"
|
34
|
+
>> Article.create!
|
35
|
+
=> "key cannot be blank"
|
36
|
+
>> Article.create({:key => "value"})
|
37
|
+
=> #<Article id: ##, preferences: {:key=>"value"}>
|
38
|
+
|
28
39
|
|
29
40
|
== Install the gem!
|
30
41
|
|
@@ -58,15 +69,21 @@ Then hook Serialist into your ActiveRecord model :
|
|
58
69
|
validates_presence_of :bar
|
59
70
|
# etc.
|
60
71
|
|
61
|
-
== Serialist comes in
|
72
|
+
== Serialist comes in 2 flavors!
|
62
73
|
|
63
|
-
===
|
74
|
+
=== Declarative, use define_method as your model load.
|
64
75
|
|
65
|
-
|
76
|
+
class Article
|
77
|
+
serialist :slug, [:foo, :bar]
|
78
|
+
validates_presence_of :foo
|
79
|
+
end
|
80
|
+
|
66
81
|
|
67
82
|
Allows you to serialize only the desired keys. ex :
|
68
83
|
|
69
84
|
$ ./script/console
|
85
|
+
>> Article.create!
|
86
|
+
=> 'foo cannot be blank'
|
70
87
|
>> a = Article.new
|
71
88
|
=> #<Article id: nil, title: nil, created_at: nil, updated_at: nil, slug: nil>
|
72
89
|
>> a.foo?
|
@@ -82,17 +99,18 @@ Allows you to serialize only the desired keys. ex :
|
|
82
99
|
>> a
|
83
100
|
=> #<Article id: XX, title: nil, created_at: "..", updated_at: "..", slug: {:foo=>"hello"}>
|
84
101
|
|
85
|
-
=== Catch-all
|
86
|
-
|
87
|
-
You should probably choose to load serialist after your other plugins/gems, because ActiveRecord won't fire NoMethodError anymore on Serialisted models, and some plugin may want to catch it to implement their own auto-magic (aka find_all_by_title_and_description magic)
|
102
|
+
=== Catch-all, use define_method lazily at access time (hooked in your model method_missing)
|
88
103
|
|
89
|
-
|
90
|
-
|
91
|
-
|
104
|
+
class Article
|
105
|
+
serialist :slug
|
106
|
+
validates_presence_of :foo
|
107
|
+
end
|
92
108
|
|
93
109
|
Allows you to serialize anything. ex :
|
94
110
|
|
95
111
|
$ ./script/console
|
112
|
+
>> Article.create!
|
113
|
+
=> 'foo cannot be blank'
|
96
114
|
>> a = Article.new
|
97
115
|
=> #<Article id: nil, title: nil, created_at: nil, updated_at: nil, slug: nil>
|
98
116
|
>> a.foo
|
@@ -114,14 +132,14 @@ Allows you to serialize anything. ex :
|
|
114
132
|
>> a
|
115
133
|
=> #<Article id: XX, title: nil, created_at: "..", updated_at: "..", slug: {:foo=>"hello"}>
|
116
134
|
|
117
|
-
|
135
|
+
=== But be aware...
|
118
136
|
|
119
137
|
# Don't use method#2 with Serialist loaded before other ActiveRecord "automagicians" plugins
|
120
138
|
|
121
|
-
# Watch out for conflict with existing attributes and methods!
|
122
|
-
|
123
139
|
# And of course don't serialize attributes you may want to search on, or index on, or use with any other database related stuff.
|
124
140
|
|
141
|
+
# run the tests with your version of ActiveRecord (tested with rails 2.3.4) (go to the unpacked gem and simply run 'rake', watch for errors. Send a bug report if any, specifying you ActiveRecord or rails version, thanks)
|
142
|
+
|
125
143
|
Copyright (c) 2009 Benoit Bénézech, released under the MIT license
|
126
144
|
|
127
145
|
http://rubyonrails.org/images/rails.png
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.
|
1
|
+
1.1.0
|
@@ -20,26 +20,31 @@ module Serialist
|
|
20
20
|
@serialist_options.each do |field|
|
21
21
|
cols = self.columns.map{|c|c.name.to_s}
|
22
22
|
raise Exception.new("Column #{field} already exist for #{self.name}") if cols.include?(field.to_s)
|
23
|
-
|
24
|
-
return nil unless (slug = self.send(serialist_field))
|
25
|
-
slug[field.to_sym]
|
26
|
-
end
|
27
|
-
define_method field.to_s + "?" do |*param|
|
28
|
-
return false unless (slug = self.send(serialist_field))
|
29
|
-
if param.empty?
|
30
|
-
![nil, false, "false", :false].include?(slug[field.to_sym])
|
31
|
-
else
|
32
|
-
slug[field.to_sym] == param.first
|
33
|
-
end
|
34
|
-
end
|
35
|
-
define_method field.to_s + "=" do |param|
|
36
|
-
self.send(serialist_field.to_s + "=", Hash.new) unless self.send(serialist_field)
|
37
|
-
self.send(serialist_field)[field.to_sym] = param
|
38
|
-
end
|
23
|
+
define_access_methods(field)
|
39
24
|
end
|
40
25
|
end
|
41
26
|
end
|
42
27
|
|
28
|
+
def define_access_methods(field)
|
29
|
+
serialist_field = self.serialist_field
|
30
|
+
define_method field.to_s do
|
31
|
+
return nil unless (slug = self.send(serialist_field))
|
32
|
+
slug[field.to_sym]
|
33
|
+
end
|
34
|
+
define_method field.to_s + "?" do |*param|
|
35
|
+
return false unless (slug = self.send(serialist_field))
|
36
|
+
if param.empty?
|
37
|
+
![nil, false, "false", :false, "0"].include?(slug[field.to_sym])
|
38
|
+
else
|
39
|
+
slug[field.to_sym] == param.first
|
40
|
+
end
|
41
|
+
end
|
42
|
+
define_method field.to_s + "=" do |param|
|
43
|
+
self.send(serialist_field.to_s + "=", Hash.new) unless self.send(serialist_field)
|
44
|
+
self.send(serialist_field)[field.to_sym] = param
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
43
48
|
def inherited(subclass)
|
44
49
|
super
|
45
50
|
subclass.instance_variable_set("@serialist_field", @serialist_field)
|
@@ -53,14 +58,8 @@ module Serialist
|
|
53
58
|
attributes = new_attributes.dup
|
54
59
|
attributes.stringify_keys!
|
55
60
|
attributes.each do |k, v|
|
56
|
-
unless k.include?("(") || respond_to?(
|
57
|
-
self.class.
|
58
|
-
self.send(self.class.serialist_field.to_s + "=", Hash.new) unless self.send(self.class.serialist_field)
|
59
|
-
self.send(self.class.serialist_field)[k.to_sym] = param
|
60
|
-
end
|
61
|
-
self.class.send(:define_method, :"#{k}") do
|
62
|
-
self.send(self.class.serialist_field)[k.to_sym]
|
63
|
-
end
|
61
|
+
unless k.include?("(") || respond_to?(k)
|
62
|
+
self.class.define_access_methods(k)
|
64
63
|
end
|
65
64
|
end
|
66
65
|
super
|
@@ -70,20 +69,8 @@ module Serialist
|
|
70
69
|
begin
|
71
70
|
super
|
72
71
|
rescue NoMethodError
|
73
|
-
|
74
|
-
|
75
|
-
when "?"
|
76
|
-
if args.empty?
|
77
|
-
slug && ![nil, false, "false", :false].include?(slug[method.to_s[0..-2].to_sym])
|
78
|
-
else
|
79
|
-
slug && (slug[method.to_s[0..-2].to_sym] == args.first)
|
80
|
-
end
|
81
|
-
when "="
|
82
|
-
self.send(self.class.serialist_field.to_s + "=", Hash.new) unless slug
|
83
|
-
self.send(self.class.serialist_field)[method.to_s[0..-2].to_sym] = args.first
|
84
|
-
else
|
85
|
-
slug && slug[method.to_sym]
|
86
|
-
end
|
72
|
+
self.class.define_access_methods(method.to_s.chomp("=").chomp("?"))
|
73
|
+
self.send(method, *args, &block)
|
87
74
|
end
|
88
75
|
end
|
89
76
|
end
|
data/serialist.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{serialist}
|
8
|
-
s.version = "1.
|
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 = ["Benoit B\303\251n\303\251zech"]
|
12
|
-
s.date = %q{2009-10-
|
12
|
+
s.date = %q{2009-10-29}
|
13
13
|
s.description = %q{Serialize any data, set and fetch it like any column attributes}
|
14
14
|
s.email = %q{benoit.benezech@gmail.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -19,7 +19,6 @@ Gem::Specification.new do |s|
|
|
19
19
|
"MIT-LICENSE",
|
20
20
|
"README.rdoc",
|
21
21
|
"Rakefile",
|
22
|
-
"TODO.txt",
|
23
22
|
"VERSION",
|
24
23
|
"generators/serialist/serialist_generator.rb",
|
25
24
|
"generators/serialist/templates/USAGE",
|
@@ -32,6 +31,7 @@ Gem::Specification.new do |s|
|
|
32
31
|
"rails/init.rb",
|
33
32
|
"serialist.gemspec",
|
34
33
|
"tasks/acts_as_serializable_tasks.rake",
|
34
|
+
"test/serialist_test.rb",
|
35
35
|
"uninstall.rb"
|
36
36
|
]
|
37
37
|
s.homepage = %q{http://github.com/bbenezech/serialist}
|
data/test/serialist_test.rb
CHANGED
@@ -86,6 +86,13 @@ class SerialistTest < Test::Unit::TestCase
|
|
86
86
|
@serialisted.save
|
87
87
|
@serialisted.reload
|
88
88
|
assert_equal @serialisted.foo, "foo2"
|
89
|
+
@serialisted.baz = "baz"
|
90
|
+
@serialisted.save
|
91
|
+
@serialisted.reload
|
92
|
+
assert_equal @serialisted.baz, "baz"
|
93
|
+
assert_equal @serialisted.baz?, true
|
94
|
+
assert_equal @serialisted.baz?("baz"), true
|
95
|
+
assert_equal @serialisted.baz?("bar"), false
|
89
96
|
@serialisted.bar = nil
|
90
97
|
@serialisted.save
|
91
98
|
@serialisted.reload
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: serialist
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- "Benoit B\xC3\xA9n\xC3\xA9zech"
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-10-
|
12
|
+
date: 2009-10-29 00:00:00 +01:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -25,7 +25,6 @@ files:
|
|
25
25
|
- MIT-LICENSE
|
26
26
|
- README.rdoc
|
27
27
|
- Rakefile
|
28
|
-
- TODO.txt
|
29
28
|
- VERSION
|
30
29
|
- generators/serialist/serialist_generator.rb
|
31
30
|
- generators/serialist/templates/USAGE
|
@@ -38,6 +37,7 @@ files:
|
|
38
37
|
- rails/init.rb
|
39
38
|
- serialist.gemspec
|
40
39
|
- tasks/acts_as_serializable_tasks.rake
|
40
|
+
- test/serialist_test.rb
|
41
41
|
- uninstall.rb
|
42
42
|
has_rdoc: true
|
43
43
|
homepage: http://github.com/bbenezech/serialist
|
data/TODO.txt
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
* tests
|