serialist 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +35 -17
- data/TODO.txt +1 -0
- data/VERSION +1 -0
- data/generators/serialist/serialist_generator.rb +18 -0
- data/generators/serialist/templates/USAGE +3 -0
- data/generators/serialist/templates/migrate/serialist_migration.rb.erb +9 -0
- data/installation-template.txt +70 -0
- data/lib/serialist.rb +2 -79
- data/rails/init.rb +1 -0
- data/serialist.gemspec +57 -0
- metadata +9 -1
data/README.rdoc
CHANGED
@@ -5,7 +5,7 @@ Add one serializable field in your table, and let serialist do the rest.
|
|
5
5
|
|
6
6
|
=== Before :
|
7
7
|
|
8
|
-
class Article
|
8
|
+
class Article < ActiveRecord::Base
|
9
9
|
serialize :preferences
|
10
10
|
end
|
11
11
|
|
@@ -17,7 +17,7 @@ Add one serializable field in your table, and let serialist do the rest.
|
|
17
17
|
|
18
18
|
=== After :
|
19
19
|
|
20
|
-
class Article
|
20
|
+
class Article < ActiveRecord::Base
|
21
21
|
serialist :preferences, [:key, :other_key, :yet_another_key]
|
22
22
|
end
|
23
23
|
|
@@ -38,6 +38,24 @@ Add one serializable field in your table, and let serialist do the rest.
|
|
38
38
|
$ ./script/server
|
39
39
|
$ GoTo localhost:3000 and create an article
|
40
40
|
|
41
|
+
== Or generate a migration for your existing programm
|
42
|
+
|
43
|
+
./script/generate serialist SerialistMigration MyModel my_serialist_attribute
|
44
|
+
Ex :
|
45
|
+
|
46
|
+
./script/generate serialist SerialistMigration Article slug
|
47
|
+
|
48
|
+
Then hook Serialist into your ActiveRecord model :
|
49
|
+
|
50
|
+
serialist :my_serialist_attribute, [:foo, :bar]
|
51
|
+
# OR
|
52
|
+
serialist :my_serialist_attribute
|
53
|
+
# See below
|
54
|
+
|
55
|
+
# Add validation as you normally would :
|
56
|
+
validates_presence_of :bar
|
57
|
+
# etc.
|
58
|
+
|
41
59
|
== Serialist comes in 2 flavors:
|
42
60
|
|
43
61
|
=== Specific declaration (safe, use define_method)
|
@@ -58,25 +76,25 @@ Allows you to serialize only the desired keys. ex :
|
|
58
76
|
|
59
77
|
=== Catch-all with method_missing
|
60
78
|
|
61
|
-
|
79
|
+
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 (=== find_all_by_title_and_description kind of magic)
|
62
80
|
|
63
|
-
|
81
|
+
# in your model. my_serializer_attribute is the one you specify in the migration
|
64
82
|
|
65
|
-
|
83
|
+
serialist :my_serializer_attribute
|
66
84
|
|
67
|
-
|
85
|
+
Allows you to serialize anything. ex :
|
68
86
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
87
|
+
$ ./script/console
|
88
|
+
>> a = Article.new
|
89
|
+
=> #<Article id: nil, title: nil, created_at: nil, updated_at: nil, slug: nil>
|
90
|
+
>> a.foo = "hello"
|
91
|
+
=> "hello"
|
92
|
+
>> a.foo?("hello")
|
93
|
+
=> true
|
94
|
+
>> a.foo
|
95
|
+
=> "hello"
|
96
|
+
>> a
|
97
|
+
=> #<Article id: XX, title: nil, created_at: "..", updated_at: "..", slug: {:foo=>"hello"}>
|
80
98
|
|
81
99
|
== Word of caution:
|
82
100
|
|
data/TODO.txt
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
* tests
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.2.0
|
@@ -0,0 +1,18 @@
|
|
1
|
+
class SerialistGenerator < Rails::Generator::NamedBase
|
2
|
+
attr_accessor :class_name, :migration_name, :migrated_table, :serialist_attribute
|
3
|
+
|
4
|
+
def initialize(args, options = {})
|
5
|
+
super
|
6
|
+
@class_name = args[0]
|
7
|
+
@migrated_table = args[1]
|
8
|
+
@serialist_attribute = args[2]
|
9
|
+
end
|
10
|
+
|
11
|
+
def manifest
|
12
|
+
@migration_name = file_name.camelize
|
13
|
+
record do |m|
|
14
|
+
# Migration creation
|
15
|
+
m.migration_template "migrate/serialist_migration.rb.erb", "db/migrate", :migration_file_name => migration_name.underscore
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
class <%= migration_name %> < ActiveRecord::Migration
|
2
|
+
def self.up
|
3
|
+
add_column :<%= migrated_table.to_s.underscore.pluralize %>, :<%= serialist_attribute.to_s %>, :text
|
4
|
+
end
|
5
|
+
|
6
|
+
def self.down
|
7
|
+
remove_column :<%= migrated_table.to_s.underscore.pluralize %>, :<%= serialist_attribute.to_s %>
|
8
|
+
end
|
9
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
gem 'serialist'
|
2
|
+
|
3
|
+
generate :scaffold, "article title:string"
|
4
|
+
generate :serialist, "SerialistMigration", "Article", "slug"
|
5
|
+
|
6
|
+
rake "db:migrate"
|
7
|
+
|
8
|
+
file "app/models/article.rb", <<-END
|
9
|
+
class Article < ActiveRecord::Base
|
10
|
+
serialist :slug, [:required_serialized_value, :another_serialized_value]
|
11
|
+
validates_presence_of :title
|
12
|
+
validates_presence_of :required_serialized_value
|
13
|
+
end
|
14
|
+
END
|
15
|
+
|
16
|
+
file "app/views/articles/edit.html.erb", <<-END
|
17
|
+
<h1>Editing article</h1>
|
18
|
+
<%= render :partial => "form" %>
|
19
|
+
<%= link_to 'Show', @article %> |
|
20
|
+
<%= link_to 'Back', articles_path %>
|
21
|
+
END
|
22
|
+
|
23
|
+
file "app/views/articles/new.html.erb", <<-END
|
24
|
+
<h1>New article</h1>
|
25
|
+
<%= render :partial => "form" %>
|
26
|
+
<%= link_to 'Back', articles_path %>
|
27
|
+
END
|
28
|
+
|
29
|
+
file "app/views/articles/_form.html.erb", <<-END
|
30
|
+
<% form_for(@article) do |f| %>
|
31
|
+
<%= f.error_messages %>
|
32
|
+
<p>
|
33
|
+
<%= f.label :title %><br />
|
34
|
+
<%= f.text_field :title %>
|
35
|
+
</p>
|
36
|
+
<p>
|
37
|
+
<%= f.label :required_serialized_value %><br />
|
38
|
+
<%= f.text_field :required_serialized_value %>
|
39
|
+
</p>
|
40
|
+
<p>
|
41
|
+
<%= f.label :another_serialized_value %><br />
|
42
|
+
<%= f.text_field :another_serialized_value %>
|
43
|
+
</p>
|
44
|
+
<p>
|
45
|
+
<%= f.submit 'Send' %>
|
46
|
+
</p>
|
47
|
+
<% end %>
|
48
|
+
END
|
49
|
+
|
50
|
+
file "app/views/articles/show.html.erb", <<-END
|
51
|
+
<p>
|
52
|
+
<b>Title:</b>
|
53
|
+
<%=h @article.title %>
|
54
|
+
</p>
|
55
|
+
<p>
|
56
|
+
<b>Required serialized value:</b>
|
57
|
+
<%=h @article.required_serialized_value %>
|
58
|
+
</p>
|
59
|
+
<p>
|
60
|
+
<b>Another serialized value:</b>
|
61
|
+
<%=h @article.another_serialized_value %>
|
62
|
+
</p>
|
63
|
+
|
64
|
+
<%= link_to 'Edit', edit_article_path(@article) %> |
|
65
|
+
<%= link_to 'Back', articles_path %>
|
66
|
+
END
|
67
|
+
|
68
|
+
run "rm app/views/layouts/articles.html.erb"
|
69
|
+
run "rm public/index.html"
|
70
|
+
route "map.root :controller => 'articles'"
|
data/lib/serialist.rb
CHANGED
@@ -1,79 +1,2 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
def self.included(base)
|
5
|
-
base.extend ClassMethods
|
6
|
-
end
|
7
|
-
|
8
|
-
module ClassMethods
|
9
|
-
attr_accessor :serialist_options
|
10
|
-
attr_accessor :serialist_field
|
11
|
-
|
12
|
-
def serialist(serialist_field, serialist_options = [])
|
13
|
-
|
14
|
-
|
15
|
-
@serialist_field ||= serialist_field
|
16
|
-
@serialist_options ||= []
|
17
|
-
@serialist_options = (@serialist_options + serialist_options).uniq
|
18
|
-
serialize(@serialist_field, Hash)
|
19
|
-
|
20
|
-
if serialist_options.empty?
|
21
|
-
include Serialist::InstanceMethods
|
22
|
-
else
|
23
|
-
@serialist_options.each do |field|
|
24
|
-
define_method field.to_s do
|
25
|
-
return nil unless (slug = self.send(serialist_field))
|
26
|
-
slug[field]
|
27
|
-
end
|
28
|
-
define_method field.to_s + "?" do |*param|
|
29
|
-
return false unless (slug = self.send(serialist_field))
|
30
|
-
if param.empty?
|
31
|
-
![nil, false, "false", :false].include?(slug[field])
|
32
|
-
else
|
33
|
-
slug[field] == param.first
|
34
|
-
end
|
35
|
-
end
|
36
|
-
define_method field.to_s + "=" do |param|
|
37
|
-
update_attribute(serialist_field, Hash.new) unless self.send(serialist_field)
|
38
|
-
self.send(serialist_field)[field] = param
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
def inherited(subclass)
|
45
|
-
super
|
46
|
-
subclass.instance_variable_set("@serialist_field", @serialist_field)
|
47
|
-
subclass.instance_variable_set("@serialist_options", @serialist_options)
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
module InstanceMethods
|
52
|
-
def method_missing(method, *args, &block)
|
53
|
-
begin
|
54
|
-
super
|
55
|
-
rescue NoMethodError
|
56
|
-
slug = self.send(self.class.serialist_field)
|
57
|
-
|
58
|
-
case method.to_s.last
|
59
|
-
when "?"
|
60
|
-
slug && slug[method.to_s[0..-2].to_sym] == (args && args.first || "true")
|
61
|
-
|
62
|
-
if args.empty?
|
63
|
-
slug && ![nil, false, "false", :false].include?(slug[method.to_s[0..-2].to_sym])
|
64
|
-
else
|
65
|
-
slug && (slug[method.to_s[0..-2].to_sym] == args.first)
|
66
|
-
end
|
67
|
-
|
68
|
-
when "="
|
69
|
-
update_attribute(self.class.serialist_field, Hash.new) unless slug
|
70
|
-
self.send(self.class.serialist_field)[method.to_s[0..-2].to_sym] = args.first
|
71
|
-
else
|
72
|
-
slug && slug[method]
|
73
|
-
end
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
|
1
|
+
require 'serialist/serialist_module'
|
2
|
+
ActiveRecord::Base.send(:include, Serialist)
|
data/rails/init.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'serialist'
|
data/serialist.gemspec
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run `rake gemspec`
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{serialist}
|
8
|
+
s.version = "0.2.0"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Benoit B\303\251n\303\251zech"]
|
12
|
+
s.date = %q{2009-09-09}
|
13
|
+
s.description = %q{Serialize any data, set and fetch it like any column attributes}
|
14
|
+
s.email = %q{benoit.benezech@gmail.com}
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"README.rdoc"
|
17
|
+
]
|
18
|
+
s.files = [
|
19
|
+
"MIT-LICENSE",
|
20
|
+
"README.rdoc",
|
21
|
+
"Rakefile",
|
22
|
+
"TODO.txt",
|
23
|
+
"VERSION",
|
24
|
+
"generators/serialist/serialist_generator.rb",
|
25
|
+
"generators/serialist/templates/USAGE",
|
26
|
+
"generators/serialist/templates/migrate/serialist_migration.rb.erb",
|
27
|
+
"init.rb",
|
28
|
+
"install.rb",
|
29
|
+
"installation-template.txt",
|
30
|
+
"lib/serialist.rb",
|
31
|
+
"rails/init.rb",
|
32
|
+
"serialist.gemspec",
|
33
|
+
"tasks/acts_as_serializable_tasks.rake",
|
34
|
+
"test/acts_as_serializable_test.rb",
|
35
|
+
"test/test_helper.rb",
|
36
|
+
"uninstall.rb"
|
37
|
+
]
|
38
|
+
s.homepage = %q{http://github.com/bbenezech/serialist}
|
39
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
40
|
+
s.require_paths = ["lib"]
|
41
|
+
s.rubygems_version = %q{1.3.4}
|
42
|
+
s.summary = %q{Serialize any data, set and fetch it like any column attributes}
|
43
|
+
s.test_files = [
|
44
|
+
"test/acts_as_serializable_test.rb",
|
45
|
+
"test/test_helper.rb"
|
46
|
+
]
|
47
|
+
|
48
|
+
if s.respond_to? :specification_version then
|
49
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
50
|
+
s.specification_version = 3
|
51
|
+
|
52
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
53
|
+
else
|
54
|
+
end
|
55
|
+
else
|
56
|
+
end
|
57
|
+
end
|
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: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- "Benoit B\xC3\xA9n\xC3\xA9zech"
|
@@ -25,9 +25,17 @@ files:
|
|
25
25
|
- MIT-LICENSE
|
26
26
|
- README.rdoc
|
27
27
|
- Rakefile
|
28
|
+
- TODO.txt
|
29
|
+
- VERSION
|
30
|
+
- generators/serialist/serialist_generator.rb
|
31
|
+
- generators/serialist/templates/USAGE
|
32
|
+
- generators/serialist/templates/migrate/serialist_migration.rb.erb
|
28
33
|
- init.rb
|
29
34
|
- install.rb
|
35
|
+
- installation-template.txt
|
30
36
|
- lib/serialist.rb
|
37
|
+
- rails/init.rb
|
38
|
+
- serialist.gemspec
|
31
39
|
- tasks/acts_as_serializable_tasks.rake
|
32
40
|
- test/acts_as_serializable_test.rb
|
33
41
|
- test/test_helper.rb
|