symbolize 3.0.3 → 3.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 +19 -1
- data/VERSION +1 -1
- data/lib/symbolize.rb +30 -23
- data/lib/symbolize/railtie.rb +14 -0
- data/lib/{symbolize_helper.rb → symbolize/symbolize_helper.rb} +0 -0
- data/rails/init.rb +1 -1
- data/spec/db/create_testing_structure.rb +11 -1
- data/spec/symbolize_spec.rb +139 -71
- data/symbolize.gemspec +4 -3
- metadata +4 -3
data/README.rdoc
CHANGED
@@ -60,10 +60,21 @@ validates_inclusion_of to restrict the possible values (just like an enum).
|
|
60
60
|
:linux => "Linux",
|
61
61
|
:mac => "Mac OS X"
|
62
62
|
}, :scopes => true
|
63
|
+
|
64
|
+
# Allow blank
|
63
65
|
symbolize :gui, :in => [:gnome, :kde, :xfce], :allow_blank => true
|
66
|
+
|
67
|
+
# Don`t i18n
|
64
68
|
symbolize :browser, :in => [:firefox, :opera], :i18n => false, :methods => true
|
69
|
+
|
70
|
+
# Scopes
|
65
71
|
symbolize :angry, :in => [true, false], :scopes => true
|
72
|
+
|
73
|
+
# Don`t validate
|
66
74
|
symbolize :lang, :in => [:ruby, :c, :erlang], :validate => false
|
75
|
+
|
76
|
+
# Default
|
77
|
+
symbolize :kind, :in => [:admin, :manager, :user], :default => :admin
|
67
78
|
end
|
68
79
|
|
69
80
|
|
@@ -78,7 +89,7 @@ allow_(blank|nil): What you expect.
|
|
78
89
|
|
79
90
|
=== validate
|
80
91
|
|
81
|
-
Set to false to avoid the validation of the input.
|
92
|
+
Set to false to avoid the validation of the input.
|
82
93
|
Useful for a dropdown with an "other" option textfield.
|
83
94
|
|
84
95
|
|
@@ -142,6 +153,13 @@ For boolean colums you can use
|
|
142
153
|
( or with_[attribute] and without_[attribute] )
|
143
154
|
|
144
155
|
|
156
|
+
=== default (BETA)
|
157
|
+
|
158
|
+
As the name suggest, the symbol you choose as default will be set in new objects automatically.
|
159
|
+
|
160
|
+
User.new.kind # Will print :admin
|
161
|
+
|
162
|
+
|
145
163
|
== Examples
|
146
164
|
|
147
165
|
u = User.find_by_name('Anna') # => #<User Anna>
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
3.0
|
1
|
+
3.1.0
|
data/lib/symbolize.rb
CHANGED
@@ -52,10 +52,11 @@ module Symbolize
|
|
52
52
|
configuration.update(attr_names.extract_options!)
|
53
53
|
|
54
54
|
enum = configuration[:in] || configuration[:within]
|
55
|
-
i18n = configuration
|
56
|
-
|
57
|
-
|
58
|
-
validation
|
55
|
+
i18n = configuration.delete(:i18n).nil? && !enum.instance_of?(Hash) && enum ? true : configuration[:i18n]
|
56
|
+
scopes = configuration.delete :scopes
|
57
|
+
methods = configuration.delete :methods
|
58
|
+
validation = configuration.delete(:validation) != false
|
59
|
+
default_option = configuration.delete :default
|
59
60
|
|
60
61
|
unless enum.nil?
|
61
62
|
# Little monkeypatching, <1.8 Hashes aren't ordered.
|
@@ -90,38 +91,44 @@ module Symbolize
|
|
90
91
|
end
|
91
92
|
end
|
92
93
|
|
93
|
-
|
94
94
|
if scopes
|
95
95
|
scope_comm = lambda { |*args| ActiveRecord::VERSION::MAJOR >= 3 ? scope(*args) : named_scope(*args)}
|
96
96
|
values.each do |value|
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
end
|
97
|
+
if value[0].respond_to?(:to_sym)
|
98
|
+
scope_comm.call value[0].to_sym, :conditions => { attr_name => value[0].to_sym }
|
99
|
+
else
|
100
|
+
if value[0] == true || value[0] == false
|
101
|
+
scope_comm.call "with_#{attr_name}", :conditions => { attr_name => true }
|
102
|
+
scope_comm.call "without_#{attr_name}", :conditions => { attr_name => false }
|
103
|
+
|
104
|
+
scope_comm.call attr_name.to_sym, :conditions => { attr_name => true }
|
105
|
+
scope_comm.call "not_#{attr_name}", :conditions => { attr_name => false }
|
107
106
|
end
|
107
|
+
end
|
108
108
|
end
|
109
109
|
end
|
110
110
|
end
|
111
111
|
|
112
112
|
if validation
|
113
|
-
class_eval "validates_inclusion_of :#{attr_names.join(', :')}, configuration"
|
113
|
+
class_eval "validates_inclusion_of :#{attr_names.join(', :')}, #{configuration}"
|
114
114
|
end
|
115
115
|
end
|
116
116
|
|
117
117
|
attr_names.each do |attr_name|
|
118
|
-
|
119
|
-
|
120
|
-
|
118
|
+
|
119
|
+
if default_option
|
120
|
+
class_eval("def #{attr_name}; read_and_symbolize_attribute('#{attr_name}') || :#{default_option}; end")
|
121
|
+
class_eval("def #{attr_name}= (value); write_symbolized_attribute('#{attr_name}', (value && !value.empty? ? value : #{default_option})); end")
|
122
|
+
class_eval("def set_default_for_attr_#{attr_name}; self[:#{attr_name}] ||= :#{default_option}; end")
|
123
|
+
class_eval("before_save :set_default_for_attr_#{attr_name}")
|
124
|
+
else
|
125
|
+
class_eval("def #{attr_name}; read_and_symbolize_attribute('#{attr_name}'); end")
|
126
|
+
class_eval("def #{attr_name}= (value); write_symbolized_attribute('#{attr_name}', value); end")
|
127
|
+
end
|
121
128
|
if i18n
|
122
129
|
class_eval("def #{attr_name}_text; read_i18n_attribute('#{attr_name}'); end")
|
123
130
|
elsif enum
|
124
|
-
class_eval("def #{attr_name}_text; #{attr_name.upcase}_VALUES[#{attr_name}]; end")
|
131
|
+
class_eval("def #{attr_name}_text; #{attr_name.to_s.upcase}_VALUES[#{attr_name}]; end")
|
125
132
|
else
|
126
133
|
class_eval("def #{attr_name}_text; #{attr_name}.to_s; end")
|
127
134
|
end
|
@@ -133,14 +140,14 @@ module Symbolize
|
|
133
140
|
def symbolize_attribute attr
|
134
141
|
case attr
|
135
142
|
when String then attr.empty? ? nil : attr.to_sym
|
136
|
-
when Symbol, TrueClass, FalseClass then attr
|
143
|
+
when Symbol, TrueClass, FalseClass, Numeric then attr
|
137
144
|
else nil
|
138
145
|
end
|
139
146
|
end
|
140
147
|
|
141
148
|
# Return an attribute's value as a symbol or nil
|
142
149
|
def read_and_symbolize_attribute attr_name
|
143
|
-
symbolize_attribute
|
150
|
+
symbolize_attribute self[attr_name]
|
144
151
|
end
|
145
152
|
|
146
153
|
# Return an attribute's i18n
|
@@ -152,7 +159,7 @@ module Symbolize
|
|
152
159
|
def write_symbolized_attribute attr_name, value
|
153
160
|
val = { "true" => true, "false" => false }[value]
|
154
161
|
val = symbolize_attribute(value) if val.nil?
|
155
|
-
|
162
|
+
self[attr_name] = val
|
156
163
|
end
|
157
164
|
end
|
158
165
|
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# Rails 3 initialization
|
2
|
+
module Symbolize
|
3
|
+
if defined? Rails::Railtie
|
4
|
+
require 'rails'
|
5
|
+
class Railtie < Rails::Railtie
|
6
|
+
initializer 'symbolize.insert_into_active_record' do
|
7
|
+
ActiveSupport.on_load :active_record do
|
8
|
+
ActiveRecord::Base.extend(Symbolize::ClassMethods)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
File without changes
|
data/rails/init.rb
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__), '..', "lib", "symbolize_helper")
|
1
|
+
require File.join(File.dirname(__FILE__), '..', "lib", "symbolize", "symbolize_helper")
|
2
2
|
ActiveRecord::Base.send(:include, Symbolize)
|
@@ -1,7 +1,7 @@
|
|
1
1
|
class CreateTestingStructure < ActiveRecord::Migration
|
2
2
|
def self.up
|
3
3
|
create_table :users do |t|
|
4
|
-
t.string :name, :so, :gui, :other, :status, :language
|
4
|
+
t.string :name, :so, :gui, :other, :status, :language, :kind
|
5
5
|
t.string :limited, :limit => 10
|
6
6
|
t.string :karma, :limit => 5
|
7
7
|
t.boolean :sex
|
@@ -9,8 +9,18 @@ class CreateTestingStructure < ActiveRecord::Migration
|
|
9
9
|
t.boolean :cool
|
10
10
|
end
|
11
11
|
create_table :user_skills do |t|
|
12
|
+
t.references :user
|
12
13
|
t.string :kind
|
13
14
|
end
|
15
|
+
create_table :user_extras do |t|
|
16
|
+
t.references :user
|
17
|
+
t.string :key, :null => false
|
18
|
+
end
|
19
|
+
create_table :permissions do |t|
|
20
|
+
t.string :name, :null => false
|
21
|
+
t.string :kind, :null => false
|
22
|
+
t.integer :lvl, :null => false
|
23
|
+
end
|
14
24
|
end
|
15
25
|
|
16
26
|
def self.down
|
data/spec/symbolize_spec.rb
CHANGED
@@ -16,12 +16,25 @@ class User < ActiveRecord::Base
|
|
16
16
|
symbolize :gui, :allow_blank => true, :in => [:cocoa, :qt, :gtk], :i18n => false
|
17
17
|
symbolize :karma, :in => [:good, :bad, :ugly], :methods => true, :i18n => false, :allow_nil => true
|
18
18
|
symbolize :cool, :in => [true, false], :scopes => true
|
19
|
+
|
20
|
+
has_many :extras, :dependent => :destroy, :class_name => "UserExtra"
|
21
|
+
has_many :access, :dependent => :destroy, :class_name => "UserAccess"
|
19
22
|
end
|
20
23
|
|
21
24
|
class UserSkill < ActiveRecord::Base
|
22
25
|
symbolize :kind, :in => [:agility, :magic]
|
23
26
|
end
|
24
27
|
|
28
|
+
class UserExtra < ActiveRecord::Base
|
29
|
+
symbolize :key, :in => [:one, :another]
|
30
|
+
end
|
31
|
+
|
32
|
+
class Permission < ActiveRecord::Base
|
33
|
+
validates_presence_of :name
|
34
|
+
symbolize :kind, :in => [:temp, :perm], :default => :perm
|
35
|
+
symbolize :lvl, :in => (1..9).to_a, :i18n => false#, :default => 1
|
36
|
+
end
|
37
|
+
|
25
38
|
# Make with_scope public-usable for testing
|
26
39
|
#if ActiveRecord::VERSION::MAJOR < 3
|
27
40
|
class << ActiveRecord::Base
|
@@ -40,7 +53,7 @@ describe "Symbolize" do
|
|
40
53
|
ActiveRecord::Base.should respond_to :symbolize
|
41
54
|
end
|
42
55
|
|
43
|
-
describe "Instantiated" do
|
56
|
+
describe "User Instantiated" do
|
44
57
|
before(:each) do
|
45
58
|
@user = User.first
|
46
59
|
end
|
@@ -59,11 +72,11 @@ describe "Symbolize" do
|
|
59
72
|
# @user.read_attribute(:status).should eql('active')
|
60
73
|
end
|
61
74
|
|
62
|
-
it "should
|
75
|
+
it "should work nice with numbers" do
|
63
76
|
@user.status = 43
|
64
|
-
@user.status.
|
65
|
-
@user.status_before_type_cast.should be_nil
|
66
|
-
@user.read_attribute(:status).should be_nil
|
77
|
+
@user.status.should_not be_nil
|
78
|
+
# @user.status_before_type_cast.should be_nil
|
79
|
+
# @user.read_attribute(:status).should be_nil
|
67
80
|
end
|
68
81
|
|
69
82
|
it "should acts nice with nil" do
|
@@ -148,76 +161,22 @@ describe "Symbolize" do
|
|
148
161
|
# assert_equal "'weird''; chars'", @user.status.quoted_id
|
149
162
|
end
|
150
163
|
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
#
|
156
|
-
if ActiveRecord::VERSION::MAJOR < 3
|
157
|
-
|
158
|
-
it "test_symbolized_finder" do
|
159
|
-
User.find(:all, :conditions => { :status => :inactive }).map(&:name).should eql(['Bob'])
|
160
|
-
User.find_all_by_status(:inactive).map(&:name).should eql(['Bob'])
|
161
|
-
end
|
162
|
-
|
163
|
-
it "test_symbolized_with_scope" do
|
164
|
-
User.with_scope(:find => { :conditions => { :status => :inactive }}) do
|
165
|
-
User.find(:all).map(&:name).should eql(['Bob'])
|
166
|
-
end
|
167
|
-
end
|
168
|
-
|
169
|
-
#
|
170
|
-
# ActiveRecord >= 3
|
171
|
-
#
|
172
|
-
else
|
173
|
-
|
174
|
-
it "test_symbolized_finder" do
|
175
|
-
User.where({ :status => :inactive }).all.map(&:name).should eql(['Bob'])
|
176
|
-
User.find_all_by_status(:inactive).map(&:name).should eql(['Bob'])
|
177
|
-
end
|
178
|
-
|
179
|
-
it "test_symbolized_with_scope" do
|
180
|
-
User.with_scope(:find => { :conditions => { :status => :inactive }}) do
|
181
|
-
User.find(:all).map(&:name).should eql(['Bob'])
|
182
|
-
end
|
183
|
-
end
|
184
|
-
|
185
|
-
describe "Named Scopes" do
|
186
|
-
|
187
|
-
before do
|
188
|
-
@anna = User.find_by_name!('Anna')
|
189
|
-
@bob = User.find_by_name!('Bob')
|
190
|
-
end
|
191
|
-
|
192
|
-
it "should have main named scope" do
|
193
|
-
User.inactive.should == [@bob]
|
194
|
-
end
|
195
|
-
|
196
|
-
it "should have other to test better" do
|
197
|
-
User.linux.should == [@anna]
|
198
|
-
end
|
199
|
-
|
200
|
-
it "should have 'with' helper" do
|
201
|
-
User.with_sex.should == [@anna]
|
202
|
-
end
|
203
|
-
|
204
|
-
it "should have 'without' helper" do
|
205
|
-
User.without_sex.should == [@bob]
|
206
|
-
end
|
207
|
-
|
208
|
-
it "should have 'attr_name' helper" do
|
209
|
-
User.cool.should == [@anna]
|
210
|
-
end
|
164
|
+
it "should work fine through relations" do
|
165
|
+
@user.extras.create(:key => :one)
|
166
|
+
UserExtra.first.key.should eql(:one)
|
167
|
+
end
|
211
168
|
|
212
|
-
|
213
|
-
|
214
|
-
|
169
|
+
it "should play fine with null db columns" do
|
170
|
+
new_extra = @user.extras.build
|
171
|
+
new_extra.should_not be_valid
|
172
|
+
end
|
215
173
|
|
216
|
-
|
174
|
+
it "should play fine with null db columns" do
|
175
|
+
new_extra = @user.extras.build
|
176
|
+
new_extra.should_not be_valid
|
177
|
+
end
|
217
178
|
|
218
|
-
end
|
219
179
|
|
220
|
-
end
|
221
180
|
|
222
181
|
describe "View helpers" do
|
223
182
|
include ActionView::Helpers::FormHelper
|
@@ -310,4 +269,113 @@ describe "Symbolize" do
|
|
310
269
|
|
311
270
|
end
|
312
271
|
|
272
|
+
describe "more tests on Permission" do
|
273
|
+
|
274
|
+
it "should use default value on object build" do
|
275
|
+
Permission.new.kind.should eql(:perm)
|
276
|
+
end
|
277
|
+
|
278
|
+
it "should not interfer on create" do
|
279
|
+
Permission.create!(:name => "p7", :kind =>:temp, :lvl => 7)
|
280
|
+
Permission.find_by_name("p7").kind.should eql(:temp)
|
281
|
+
end
|
282
|
+
|
283
|
+
it "should work on create" do
|
284
|
+
pm = Permission.new(:name => "p7", :lvl => 7)
|
285
|
+
pm.should be_valid
|
286
|
+
pm.save.should be_true
|
287
|
+
end
|
288
|
+
|
289
|
+
it "should work on create" do
|
290
|
+
Permission.create!(:name => "p8", :lvl => 9)
|
291
|
+
Permission.find_by_name("p8").kind.should eql(:perm)
|
292
|
+
end
|
293
|
+
|
294
|
+
it "should work on edit" do
|
295
|
+
pm = Permission.find_by_name("p8")
|
296
|
+
pm.kind = :temp
|
297
|
+
pm.save
|
298
|
+
Permission.find_by_name("p8").kind.should eql(:temp)
|
299
|
+
end
|
300
|
+
|
301
|
+
it "should work with default values" do
|
302
|
+
pm = Permission.new(:name => "p9")
|
303
|
+
pm.lvl = 9
|
304
|
+
pm.save
|
305
|
+
Permission.find_by_name("p9").lvl.to_i.should eql(9)
|
306
|
+
end
|
307
|
+
|
308
|
+
end
|
309
|
+
|
310
|
+
describe "ActiveRecord stuff" do
|
311
|
+
|
312
|
+
#
|
313
|
+
# ActiveRecord <= 2
|
314
|
+
#
|
315
|
+
if ActiveRecord::VERSION::MAJOR < 3
|
316
|
+
|
317
|
+
it "test_symbolized_finder" do
|
318
|
+
User.find(:all, :conditions => { :status => :inactive }).map(&:name).should eql(['Bob'])
|
319
|
+
User.find_all_by_status(:inactive).map(&:name).should eql(['Bob'])
|
320
|
+
end
|
321
|
+
|
322
|
+
it "test_symbolized_with_scope" do
|
323
|
+
User.with_scope(:find => { :conditions => { :status => :inactive }}) do
|
324
|
+
User.find(:all).map(&:name).should eql(['Bob'])
|
325
|
+
end
|
326
|
+
end
|
327
|
+
|
328
|
+
#
|
329
|
+
# ActiveRecord >= 3
|
330
|
+
#
|
331
|
+
else
|
332
|
+
|
333
|
+
it "test_symbolized_finder" do
|
334
|
+
User.where({ :status => :inactive }).all.map(&:name).should eql(['Bob'])
|
335
|
+
User.find_all_by_status(:inactive).map(&:name).should eql(['Bob'])
|
336
|
+
end
|
337
|
+
|
338
|
+
it "test_symbolized_with_scope" do
|
339
|
+
User.with_scope(:find => { :conditions => { :status => :inactive }}) do
|
340
|
+
User.find(:all).map(&:name).should eql(['Bob'])
|
341
|
+
end
|
342
|
+
end
|
343
|
+
|
344
|
+
describe "Named Scopes" do
|
345
|
+
|
346
|
+
before do
|
347
|
+
@anna = User.find_by_name!('Anna')
|
348
|
+
@bob = User.find_by_name!('Bob')
|
349
|
+
end
|
350
|
+
|
351
|
+
it "should have main named scope" do
|
352
|
+
User.inactive.should == [@bob]
|
353
|
+
end
|
354
|
+
|
355
|
+
it "should have other to test better" do
|
356
|
+
User.linux.should == [@anna]
|
357
|
+
end
|
358
|
+
|
359
|
+
it "should have 'with' helper" do
|
360
|
+
User.with_sex.should == [@anna]
|
361
|
+
end
|
362
|
+
|
363
|
+
it "should have 'without' helper" do
|
364
|
+
User.without_sex.should == [@bob]
|
365
|
+
end
|
366
|
+
|
367
|
+
it "should have 'attr_name' helper" do
|
368
|
+
User.cool.should == [@anna]
|
369
|
+
end
|
370
|
+
|
371
|
+
it "should have 'not_attr_name' helper" do
|
372
|
+
User.not_cool.should == [@bob]
|
373
|
+
end
|
374
|
+
|
375
|
+
end
|
376
|
+
|
377
|
+
end
|
378
|
+
|
379
|
+
end
|
380
|
+
|
313
381
|
end
|
data/symbolize.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{symbolize}
|
8
|
-
s.version = "3.0
|
8
|
+
s.version = "3.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 = ["Marcos Piccinini"]
|
12
|
-
s.date = %q{2011-03-
|
12
|
+
s.date = %q{2011-03-23}
|
13
13
|
s.description = %q{ActiveRecord enums with i18n}
|
14
14
|
s.email = %q{x@nofxx.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -23,7 +23,8 @@ Gem::Specification.new do |s|
|
|
23
23
|
"VERSION",
|
24
24
|
"init.rb",
|
25
25
|
"lib/symbolize.rb",
|
26
|
-
"lib/
|
26
|
+
"lib/symbolize/railtie.rb",
|
27
|
+
"lib/symbolize/symbolize_helper.rb",
|
27
28
|
"rails/init.rb",
|
28
29
|
"spec/db/create_testing_structure.rb",
|
29
30
|
"spec/locales/en.yml",
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: symbolize
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 3.0
|
5
|
+
version: 3.1.0
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Marcos Piccinini
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-03-
|
13
|
+
date: 2011-03-23 00:00:00 -03:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
@@ -51,7 +51,8 @@ files:
|
|
51
51
|
- VERSION
|
52
52
|
- init.rb
|
53
53
|
- lib/symbolize.rb
|
54
|
-
- lib/
|
54
|
+
- lib/symbolize/railtie.rb
|
55
|
+
- lib/symbolize/symbolize_helper.rb
|
55
56
|
- rails/init.rb
|
56
57
|
- spec/db/create_testing_structure.rb
|
57
58
|
- spec/locales/en.yml
|