symbolize 4.2.0 → 4.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +16 -29
- data/lib/symbolize.rb +5 -4
- data/lib/symbolize/active_record.rb +21 -14
- data/lib/symbolize/mongoid.rb +26 -21
- data/lib/symbolize/railtie.rb +8 -12
- data/lib/symbolize/version.rb +1 -1
- data/spec/db/001_create_testing_structure.rb +3 -0
- data/spec/locales/pt.yml +10 -0
- data/spec/spec_helper_ar.rb +3 -0
- data/spec/spec_helper_mongoid.rb +8 -7
- data/spec/symbolize/active_record_spec.rb +134 -76
- data/spec/symbolize/mongoid_spec.rb +33 -8
- metadata +56 -22
- data/spec/symbolize_spec.rb +0 -8
data/README.rdoc
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
= Symbolize attribute values
|
1
|
+
= Symbolize (attribute values)
|
2
2
|
|
3
3
|
This plugin introduces an easy way to use symbols for values of attributes.
|
4
4
|
Symbolized attributes return a ruby symbol (or nil) as their value
|
@@ -11,15 +11,9 @@ and can be set using :symbols or "strings".
|
|
11
11
|
gem install symbolize
|
12
12
|
|
13
13
|
|
14
|
-
===
|
15
|
-
|
16
|
-
gem "symbolize", :require => "symbolize/mongoid"
|
17
|
-
|
18
|
-
|
19
|
-
=== ActiveRecord
|
20
|
-
|
21
|
-
gem "symbolize", :require => "symbolize/active_record"
|
14
|
+
=== Gemfile
|
22
15
|
|
16
|
+
gem "symbolize"
|
23
17
|
|
24
18
|
|
25
19
|
== About
|
@@ -35,22 +29,27 @@ On schema DBs, the attribute should be a string (varchar) column.
|
|
35
29
|
|
36
30
|
ActiveRecord:
|
37
31
|
|
38
|
-
class
|
32
|
+
class Contact < ActiveRecord::Base
|
39
33
|
|
40
|
-
symbolize :
|
34
|
+
symbolize :kind, :in => [:im, :mobile, :email], :scopes => true
|
41
35
|
|
42
|
-
end
|
43
36
|
|
44
37
|
Mongoid:
|
45
38
|
|
46
|
-
|
39
|
+
require 'symbolize/mongoid'
|
47
40
|
|
48
|
-
|
41
|
+
class Contact
|
49
42
|
include Mongoid::Symbolize
|
50
43
|
|
51
|
-
symbolize :
|
44
|
+
symbolize :kind, :in => [:im, :mobile, :email], :scopes => true
|
45
|
+
|
46
|
+
or just
|
47
|
+
|
48
|
+
class Contact
|
49
|
+
include Symbolize::Mongoid
|
50
|
+
|
51
|
+
symbolize :kind, :in => [:im, :mobile, :email], :scopes => true
|
52
52
|
|
53
|
-
end
|
54
53
|
|
55
54
|
Other examples:
|
56
55
|
|
@@ -171,7 +170,7 @@ in new objects automatically. Mongoid only for now.
|
|
171
170
|
|
172
171
|
symbolize :mood, :in => [:happy, :sad, :euphoric], :default => (MarvinDay ? :sad : :happy)
|
173
172
|
|
174
|
-
User.new.
|
173
|
+
User.new.mood # It may print :happy
|
175
174
|
|
176
175
|
|
177
176
|
== Rails Form Example
|
@@ -217,15 +216,3 @@ Run the adapter independently:
|
|
217
216
|
This fork:
|
218
217
|
http://github.com/nofxx/symbolize
|
219
218
|
|
220
|
-
|
221
|
-
Forked from:
|
222
|
-
http://github.com/nuxlli/activerecord_symbolize
|
223
|
-
|
224
|
-
|
225
|
-
Initial work:
|
226
|
-
I've been using this for quite some time and made it a rails plugin now. More
|
227
|
-
background iinformation can be found at
|
228
|
-
http://zargony.com/2007/09/07/symbolize-attribute-values-in-activerecord
|
229
|
-
|
230
|
-
|
231
|
-
Copyright (c) 2007-2008 Andreas Neuhaus, released under the MIT license
|
data/lib/symbolize.rb
CHANGED
@@ -1,7 +1,10 @@
|
|
1
|
+
require 'active_support/concern'
|
2
|
+
|
1
3
|
module Symbolize
|
2
|
-
|
3
|
-
|
4
|
-
|
4
|
+
end
|
5
|
+
|
6
|
+
module Symbolize::ActiveRecord
|
7
|
+
extend ActiveSupport::Concern
|
5
8
|
|
6
9
|
# Symbolize ActiveRecord attributes. Add
|
7
10
|
# symbolize :attr_name
|
@@ -51,7 +54,7 @@ module Symbolize
|
|
51
54
|
configuration.update(attr_names.extract_options!)
|
52
55
|
|
53
56
|
enum = configuration[:in] || configuration[:within]
|
54
|
-
i18n = configuration.delete(:i18n)
|
57
|
+
i18n = configuration.delete(:i18n) || (!enum.instance_of?(Hash) && enum)
|
55
58
|
scopes = configuration.delete :scopes
|
56
59
|
methods = configuration.delete :methods
|
57
60
|
capitalize = configuration.delete :capitalize
|
@@ -59,8 +62,6 @@ module Symbolize
|
|
59
62
|
default_option = configuration.delete :default
|
60
63
|
|
61
64
|
unless enum.nil?
|
62
|
-
# Little monkeypatching, <1.8 Hashes aren't ordered.
|
63
|
-
hsh = RUBY_VERSION > '1.9' || !defined?("ActiveSupport") ? Hash : ActiveSupport::OrderedHash
|
64
65
|
|
65
66
|
attr_names.each do |attr_name|
|
66
67
|
attr_name = attr_name.to_s
|
@@ -68,7 +69,7 @@ module Symbolize
|
|
68
69
|
if enum.is_a?(Hash)
|
69
70
|
values = enum
|
70
71
|
else
|
71
|
-
values =
|
72
|
+
values = ActiveSupport::OrderedHash.new
|
72
73
|
enum.map do |val|
|
73
74
|
key = val.respond_to?(:to_sym) ? val.to_sym : val
|
74
75
|
values[key] = capitalize ? val.to_s.capitalize : val.to_s
|
@@ -85,22 +86,30 @@ module Symbolize
|
|
85
86
|
"def self.get_#{const}; #{const.upcase}.map(&:reverse); end"
|
86
87
|
end
|
87
88
|
class_eval(ev)
|
89
|
+
class_eval "def self.#{attr_name}_enum; self.get_#{const}; end"
|
88
90
|
|
89
91
|
if methods
|
90
92
|
values.each do |value|
|
91
93
|
key = value[0]
|
94
|
+
|
95
|
+
# It's a good idea to test for name collisions here and raise exceptions.
|
96
|
+
# However, the existing software with this kind of errors will start crashing,
|
97
|
+
# so I'd postpone this improvement until the next major version
|
98
|
+
# this way it will not affect those people who use ~> in their Gemfiles
|
99
|
+
|
100
|
+
# raise ArgumentError, "re-defined #{key}? method of #{self.name} class due to 'symbolize'" if method_defined?("#{key}?")
|
101
|
+
|
92
102
|
define_method("#{key}?") do
|
93
|
-
self
|
103
|
+
self.send(attr_name) == key.to_sym
|
94
104
|
end
|
95
105
|
end
|
96
106
|
end
|
97
107
|
|
98
108
|
if scopes
|
99
|
-
scope_comm = lambda { |*args| ActiveRecord::VERSION::MAJOR >= 3 ? scope(*args) : named_scope(*args)}
|
100
109
|
values.each do |value|
|
101
110
|
name = value[0]
|
102
111
|
if name.respond_to?(:to_sym)
|
103
|
-
|
112
|
+
scope name.to_sym, :conditions => { attr_name => name.to_s }
|
104
113
|
# Figure out if this as another option, or default...
|
105
114
|
# scope_comm.call "not_#{attr_name}".to_sym, :conditions => { attr_name != name }
|
106
115
|
end
|
@@ -156,8 +165,8 @@ module Symbolize
|
|
156
165
|
# Return an attribute's i18n
|
157
166
|
def read_i18n_attribute attr_name
|
158
167
|
attr = read_attribute(attr_name)
|
159
|
-
|
160
|
-
|
168
|
+
t = I18n.translate("activerecord.symbolizes.#{self.class.model_name.underscore}.#{attr_name}.#{attr}") #.to_sym rescue nila
|
169
|
+
t.is_a?(Hash) ? nil : t
|
161
170
|
end
|
162
171
|
|
163
172
|
# Write a symbolized value. Watch out for booleans.
|
@@ -168,5 +177,3 @@ module Symbolize
|
|
168
177
|
self[attr_name] = val #.to_s
|
169
178
|
end
|
170
179
|
end
|
171
|
-
|
172
|
-
ActiveRecord::Base.send(:include, Symbolize)
|
data/lib/symbolize/mongoid.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
|
+
require 'active_support/concern'
|
2
|
+
|
1
3
|
module Mongoid
|
2
4
|
module Symbolize
|
3
|
-
|
4
|
-
base.extend(ClassMethods)
|
5
|
-
end
|
5
|
+
extend ActiveSupport::Concern
|
6
6
|
|
7
7
|
# Symbolize Mongoid attributes. Add:
|
8
8
|
# symbolize :attr_name
|
@@ -54,9 +54,10 @@ module Mongoid
|
|
54
54
|
configuration.update(attr_names.extract_options!)
|
55
55
|
|
56
56
|
enum = configuration[:in] || configuration[:within]
|
57
|
-
i18n = configuration.delete(:i18n)
|
58
|
-
|
59
|
-
|
57
|
+
i18n = configuration.delete(:i18n)
|
58
|
+
i18n = (!enum.instance_of?(Hash) && enum) if i18n.nil?
|
59
|
+
scopes = configuration.delete :scopes
|
60
|
+
methods = configuration.delete :methods
|
60
61
|
capitalize = configuration.delete :capitalize
|
61
62
|
validation = configuration.delete(:validate) != false
|
62
63
|
field_type = configuration.delete :type
|
@@ -71,11 +72,11 @@ module Mongoid
|
|
71
72
|
#
|
72
73
|
# Builds Mongoid 'field :name, type: type, :default'
|
73
74
|
#
|
75
|
+
const = "#{attr_name}_values"
|
74
76
|
mongo_opts = ", :type => #{field_type || 'Symbol'}"
|
75
77
|
mongo_opts += ", :default => :#{default_opt}" if default_opt
|
76
78
|
class_eval("field :#{attr_name} #{mongo_opts}")
|
77
79
|
|
78
|
-
const = "#{attr_name}_values"
|
79
80
|
if enum.is_a?(Hash)
|
80
81
|
values = enum
|
81
82
|
else
|
@@ -96,31 +97,32 @@ module Mongoid
|
|
96
97
|
"def self.get_#{const}; #{const.upcase}.map(&:reverse); end"
|
97
98
|
end
|
98
99
|
class_eval(ev)
|
100
|
+
class_eval "def self.#{attr_name}_enum; self.get_#{const}; end"
|
99
101
|
|
100
102
|
if methods
|
101
|
-
values.each do |
|
102
|
-
define_method("#{
|
103
|
-
self.send(attr_name) ==
|
103
|
+
values.each do |k, v|
|
104
|
+
define_method("#{k}?") do
|
105
|
+
self.send(attr_name) == k
|
104
106
|
end
|
105
107
|
end
|
106
108
|
end
|
107
109
|
|
108
110
|
if scopes
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
scope_comm.call value[0].to_sym, where({ attr_name => value[0].to_sym })
|
111
|
+
values.each do |k, v|
|
112
|
+
if k.respond_to?(:to_sym)
|
113
|
+
scope k.to_sym, where({ attr_name => k.to_sym })
|
113
114
|
end
|
114
115
|
end
|
115
116
|
end
|
116
117
|
|
117
118
|
if validation
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
class_eval
|
119
|
+
v = "validates :#{attr_names.join(', :')}"
|
120
|
+
v += ",:inclusion => { :in => #{values.keys.inspect} }"
|
121
|
+
v += ",:allow_nil => true" if configuration[:allow_nil]
|
122
|
+
v += ",:allow_blank => true" if configuration[:allow_blank]
|
123
|
+
class_eval v
|
123
124
|
end
|
125
|
+
|
124
126
|
end
|
125
127
|
end
|
126
128
|
|
@@ -130,8 +132,9 @@ module Mongoid
|
|
130
132
|
attr_names.each do |attr_name|
|
131
133
|
if i18n # memoize call to translate... good idea?
|
132
134
|
define_method "#{attr_name}_text" do
|
133
|
-
|
134
|
-
|
135
|
+
attr = read_attribute(attr_name)
|
136
|
+
return nil if attr.nil?
|
137
|
+
I18n.t("mongoid.symbolizes.#{self.class.model_name.underscore}.#{attr_name}.#{attr}")
|
135
138
|
end
|
136
139
|
elsif enum
|
137
140
|
class_eval("def #{attr_name}_text; #{attr_name.to_s.upcase}_VALUES[#{attr_name}]; end")
|
@@ -145,3 +148,5 @@ module Mongoid
|
|
145
148
|
end # ClassMethods
|
146
149
|
end # Symbolize
|
147
150
|
end # Mongoid
|
151
|
+
|
152
|
+
# Symbolize::Mongoid = Mongoid::Symbolize
|
data/lib/symbolize/railtie.rb
CHANGED
@@ -1,15 +1,11 @@
|
|
1
1
|
# Rails 3 initialization
|
2
2
|
module Symbolize
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
# end
|
12
|
-
# end
|
3
|
+
require 'rails'
|
4
|
+
class Railtie < Rails::Railtie
|
5
|
+
initializer 'symbolize.insert_into_active_record' do
|
6
|
+
ActiveSupport.on_load :active_record do
|
7
|
+
::ActiveRecord::Base.send :include, Symbolize::ActiveRecord
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
13
11
|
end
|
14
|
-
|
15
|
-
|
data/lib/symbolize/version.rb
CHANGED
@@ -8,6 +8,9 @@ class CreateTestingStructure < ActiveRecord::Migration
|
|
8
8
|
t.boolean :sex
|
9
9
|
t.boolean :public
|
10
10
|
t.boolean :cool
|
11
|
+
t.string :role
|
12
|
+
t.string :country, :default => "pt"
|
13
|
+
t.string :some_attr # used in name collision tests
|
11
14
|
end
|
12
15
|
create_table :user_skills do |t|
|
13
16
|
t.references :user
|
data/spec/locales/pt.yml
CHANGED
data/spec/spec_helper_ar.rb
CHANGED
@@ -2,8 +2,11 @@ require File.dirname(__FILE__) + '/spec_helper'
|
|
2
2
|
|
3
3
|
require 'active_record'
|
4
4
|
require 'symbolize/active_record'
|
5
|
+
ActiveRecord::Base.send :include, Symbolize::ActiveRecord # this is normally done by the railtie
|
6
|
+
|
5
7
|
ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:") #'postgresql', :database => 'symbolize_test', :username => 'postgres')
|
6
8
|
|
9
|
+
|
7
10
|
if ActiveRecord::VERSION::STRING >= "3.1"
|
8
11
|
ActiveRecord::Migrator.migrate("spec/db")
|
9
12
|
else
|
data/spec/spec_helper_mongoid.rb
CHANGED
@@ -3,15 +3,16 @@ require 'mongoid'
|
|
3
3
|
require 'mongoid/version'
|
4
4
|
|
5
5
|
Mongoid.configure do |config|
|
6
|
-
config.master = Mongo::Connection.new.db("symbolize_test")
|
7
|
-
|
8
|
-
|
9
|
-
Mongoid.database.collections.each do |collection|
|
10
|
-
unless collection.name =~ /^system\./
|
11
|
-
collection.remove
|
12
|
-
end
|
6
|
+
#config.master = Mongo::Connection.new.db("symbolize_test")
|
7
|
+
config.connect_to('symbolize_test')
|
13
8
|
end
|
14
9
|
|
15
10
|
puts "Running Mongoid #{Mongoid::VERSION}"
|
16
11
|
|
17
12
|
require 'symbolize/mongoid'
|
13
|
+
|
14
|
+
RSpec.configure do |config|
|
15
|
+
config.before(:each) do
|
16
|
+
Mongoid.purge!
|
17
|
+
end
|
18
|
+
end
|
@@ -17,6 +17,9 @@ class User < ActiveRecord::Base
|
|
17
17
|
symbolize :karma, :in => %w{ good bad ugly}, :methods => true, :i18n => false, :allow_nil => true
|
18
18
|
symbolize :cool, :in => [true, false], :scopes => true
|
19
19
|
|
20
|
+
symbolize :role, :in => [:reader, :writer, :some_existing_attr], :i18n => false, :methods => true, :default => :reader
|
21
|
+
symbolize :country, :in => [:us, :gb, :pt, :ru], :capitalize => true, :i18n => false # note: the default value is provided in db migration
|
22
|
+
|
20
23
|
has_many :extras, :dependent => :destroy, :class_name => "UserExtra"
|
21
24
|
has_many :access, :dependent => :destroy, :class_name => "UserAccess"
|
22
25
|
end
|
@@ -52,67 +55,66 @@ describe "Symbolize" do
|
|
52
55
|
it "should have a valid blueprint" do
|
53
56
|
# Test records
|
54
57
|
u = User.create(:name => 'Bob' , :other => :bar,:status => :inactive, :so => :mac, :gui => :gtk, :language => :en, :sex => false, :cool => false)
|
55
|
-
u.errors.messages.should
|
58
|
+
u.errors.messages.should be_blank
|
56
59
|
end
|
57
60
|
|
58
61
|
it "should work nice with default values from active model" do
|
59
62
|
u = User.create(:name => 'Niu' , :other => :bar, :so => :mac, :gui => :gtk, :language => :en, :sex => false, :cool => false)
|
60
|
-
u.errors.messages.should
|
63
|
+
u.errors.messages.should be_blank
|
61
64
|
u.status.should eql(:active)
|
62
65
|
u.should be_active
|
63
66
|
end
|
64
67
|
|
65
68
|
describe "User Instantiated" do
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
69
|
+
subject {
|
70
|
+
User.create(:name => 'Anna', :other => :fo, :status => status, :so => so, :gui => :qt, :language => :pt, :sex => true, :cool => true)
|
71
|
+
}
|
72
|
+
let(:status) { :active }
|
73
|
+
let(:so) { :linux }
|
74
|
+
|
75
|
+
describe "test_symbolize_string" do
|
76
|
+
let(:status) { 'inactive' }
|
77
|
+
its(:status) { should == :inactive }
|
73
78
|
# @user.status_before_type_cast.should eql(:inactive)
|
74
79
|
# @user.read_attribute(:status).should eql('inactive')
|
75
80
|
end
|
76
81
|
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
@user.status_before_type_cast.should eql(:active)
|
82
|
+
describe "test_symbolize_symbol" do
|
83
|
+
its(:status) { should == :active }
|
84
|
+
its(:status_before_type_cast) { should == :active }
|
81
85
|
# @user.read_attribute(:status).should eql('active')
|
82
86
|
end
|
83
87
|
|
84
|
-
|
85
|
-
|
86
|
-
|
88
|
+
describe "should work nice with numbers" do
|
89
|
+
let(:status) { 43 }
|
90
|
+
its(:status) { should be_present }
|
87
91
|
# @user.status_before_type_cast.should be_nil
|
88
92
|
# @user.read_attribute(:status).should be_nil
|
89
93
|
end
|
90
94
|
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
95
|
+
describe "should acts nice with nil" do
|
96
|
+
let(:status) { nil }
|
97
|
+
its(:status) { should be_nil }
|
98
|
+
its(:status_before_type_cast) { should be_nil }
|
99
|
+
it { subject.read_attribute(:status).should be_nil }
|
96
100
|
end
|
97
101
|
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
102
|
+
describe "should acts nice with blank" do
|
103
|
+
let(:status) { "" }
|
104
|
+
its(:status) { should be_nil }
|
105
|
+
its(:status_before_type_cast) { should be_nil }
|
106
|
+
it { subject.read_attribute(:status).should be_nil }
|
103
107
|
end
|
104
108
|
|
105
|
-
|
106
|
-
pending
|
107
|
-
@user.status = :active
|
108
|
-
@user.status.quoted_id.should eql("'active'")
|
109
|
+
describe "test_symbols_quoted_id" do
|
110
|
+
pending { subject.status.quoted_id.should eql("'active'") }
|
109
111
|
end
|
110
112
|
|
111
113
|
it "should not validates other" do
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
114
|
+
subject.other = nil
|
115
|
+
subject.should be_valid
|
116
|
+
subject.other = ""
|
117
|
+
subject.should be_valid
|
116
118
|
end
|
117
119
|
|
118
120
|
it "should get the correct values" do
|
@@ -120,8 +122,12 @@ describe "Symbolize" do
|
|
120
122
|
User::STATUS_VALUES.should eql({:inactive=>"Inactive", :active=>"Active"})
|
121
123
|
end
|
122
124
|
|
123
|
-
it "
|
124
|
-
|
125
|
+
it "should get the values for RailsAdmin" do
|
126
|
+
User.status_enum.should eql([["Active", :active],["Inactive", :inactive]])
|
127
|
+
end
|
128
|
+
|
129
|
+
describe "test_symbolize_humanize" do
|
130
|
+
its(:status_text) { should eql("Active") }
|
125
131
|
end
|
126
132
|
|
127
133
|
it "should get the correct values" do
|
@@ -129,8 +135,8 @@ describe "Symbolize" do
|
|
129
135
|
User::GUI_VALUES.should eql({:cocoa=>"cocoa", :qt=>"qt", :gtk=>"gtk"})
|
130
136
|
end
|
131
137
|
|
132
|
-
|
133
|
-
|
138
|
+
describe "test_symbolize_humanize" do
|
139
|
+
its(:gui_text) { should eql("qt") }
|
134
140
|
end
|
135
141
|
|
136
142
|
it "should get the correct values" do
|
@@ -138,58 +144,58 @@ describe "Symbolize" do
|
|
138
144
|
User::SO_VALUES.should eql({:linux => "Linux", :mac => "Mac OS X", :win => "Videogame"})
|
139
145
|
end
|
140
146
|
|
141
|
-
|
142
|
-
|
147
|
+
describe "test_symbolize_humanize" do
|
148
|
+
its(:so_text) { should eql("Linux") }
|
143
149
|
end
|
144
150
|
|
145
|
-
|
146
|
-
|
147
|
-
|
151
|
+
describe "test_symbolize_humanize" do
|
152
|
+
let(:so) { :mac }
|
153
|
+
its(:so_text) { should eql("Mac OS X") }
|
148
154
|
end
|
149
155
|
|
150
156
|
it "should stringify" do
|
151
|
-
|
152
|
-
|
153
|
-
|
157
|
+
subject.other_text.should eql("fo")
|
158
|
+
subject.other = :foo
|
159
|
+
subject.other_text.should eql("foo")
|
154
160
|
end
|
155
161
|
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
162
|
+
describe "should validate status" do
|
163
|
+
let(:status) { nil }
|
164
|
+
it { should_not be_valid }
|
165
|
+
it { should have(1).errors }
|
160
166
|
end
|
161
167
|
|
162
168
|
it "should not validate so" do
|
163
|
-
|
164
|
-
|
169
|
+
subject.so = nil
|
170
|
+
subject.should be_valid
|
165
171
|
end
|
166
172
|
|
167
173
|
it "test_symbols_with_weird_chars_quoted_id" do
|
168
|
-
|
169
|
-
|
174
|
+
subject.status = :"weird'; chars"
|
175
|
+
subject.status_before_type_cast.should eql(:"weird'; chars")
|
170
176
|
# assert_equal "weird'; chars", @user.read_attribute(:status)
|
171
177
|
# assert_equal "'weird''; chars'", @user.status.quoted_id
|
172
178
|
end
|
173
179
|
|
174
180
|
it "should work fine through relations" do
|
175
|
-
|
181
|
+
subject.extras.create(:key => :one)
|
176
182
|
UserExtra.first.key.should eql(:one)
|
177
183
|
end
|
178
184
|
|
179
185
|
it "should play fine with null db columns" do
|
180
|
-
new_extra =
|
186
|
+
new_extra = subject.extras.build
|
181
187
|
new_extra.should_not be_valid
|
182
188
|
end
|
183
189
|
|
184
190
|
it "should play fine with null db columns" do
|
185
|
-
new_extra =
|
191
|
+
new_extra = subject.extras.build
|
186
192
|
new_extra.should_not be_valid
|
187
193
|
end
|
188
194
|
|
189
195
|
describe "i18n" do
|
190
196
|
|
191
197
|
it "should test i18n ones" do
|
192
|
-
|
198
|
+
subject.language_text.should eql("Português")
|
193
199
|
end
|
194
200
|
|
195
201
|
it "should get the correct values" do
|
@@ -201,9 +207,9 @@ describe "Symbolize" do
|
|
201
207
|
end
|
202
208
|
|
203
209
|
it "should test boolean" do
|
204
|
-
|
205
|
-
|
206
|
-
|
210
|
+
subject.sex_text.should eql("Feminino")
|
211
|
+
subject.sex = false
|
212
|
+
subject.sex_text.should eql('Masculino')
|
207
213
|
end
|
208
214
|
|
209
215
|
it "should get the correct values" do
|
@@ -229,20 +235,20 @@ describe "Symbolize" do
|
|
229
235
|
describe "Methods" do
|
230
236
|
|
231
237
|
it "should play nice with other stuff" do
|
232
|
-
|
238
|
+
subject.karma.should be_nil
|
233
239
|
User::KARMA_VALUES.should eql({:bad => "bad", :ugly => "ugly", :good => "good"})
|
234
240
|
end
|
235
241
|
|
236
242
|
it "should provide a boolean method" do
|
237
|
-
|
238
|
-
|
239
|
-
|
243
|
+
subject.should_not be_good
|
244
|
+
subject.karma = :ugly
|
245
|
+
subject.should be_ugly
|
240
246
|
end
|
241
247
|
|
242
248
|
it "should work" do
|
243
|
-
|
244
|
-
|
245
|
-
|
249
|
+
subject.karma = "good"
|
250
|
+
subject.should be_good
|
251
|
+
subject.should_not be_bad
|
246
252
|
end
|
247
253
|
|
248
254
|
end
|
@@ -250,21 +256,21 @@ describe "Symbolize" do
|
|
250
256
|
describe "Methods" do
|
251
257
|
|
252
258
|
it "is dirty if you change the attribute value" do
|
253
|
-
|
254
|
-
|
259
|
+
subject.language.should == :pt
|
260
|
+
subject.language_changed?.should be_false
|
255
261
|
|
256
|
-
return_value =
|
262
|
+
return_value = subject.language = :en
|
257
263
|
return_value.should == :en
|
258
|
-
|
264
|
+
subject.language_changed?.should be_true
|
259
265
|
end
|
260
266
|
|
261
267
|
it "is not dirty if you set the attribute value to the same value" do
|
262
|
-
|
263
|
-
|
268
|
+
subject.language.should == :pt
|
269
|
+
subject.language_changed?.should be_false
|
264
270
|
|
265
|
-
return_value =
|
271
|
+
return_value = subject.language = :pt
|
266
272
|
return_value.should == :pt
|
267
|
-
|
273
|
+
subject.language_changed?.should be_false
|
268
274
|
end
|
269
275
|
|
270
276
|
end
|
@@ -353,4 +359,56 @@ describe "Symbolize" do
|
|
353
359
|
# end
|
354
360
|
|
355
361
|
end
|
362
|
+
|
363
|
+
|
364
|
+
describe ": Default Value" do
|
365
|
+
before(:each) do
|
366
|
+
@user = User.new(:name => 'Anna', :other => :fo, :status => :active , :so => :linux, :gui => :qt, :language => :pt, :sex => true, :cool => true)
|
367
|
+
end
|
368
|
+
|
369
|
+
it "should be considered during validation" do
|
370
|
+
@user.valid?
|
371
|
+
@user.errors.full_messages.should == []
|
372
|
+
end
|
373
|
+
|
374
|
+
it "should be taken from the DB schema definition" do
|
375
|
+
@user.country.should == :pt
|
376
|
+
@user.country_text.should == "Pt"
|
377
|
+
end
|
378
|
+
|
379
|
+
it "should be applied to new, just saved, and reloaded objects, and also play fine with :methods option" do
|
380
|
+
@user.role.should == :reader
|
381
|
+
@user.role_text.should == "reader"
|
382
|
+
@user.should be_reader
|
383
|
+
@user.save!
|
384
|
+
@user.role.should == :reader
|
385
|
+
@user.should be_reader
|
386
|
+
@user.reload
|
387
|
+
@user.role.should == :reader
|
388
|
+
@user.should be_reader
|
389
|
+
end
|
390
|
+
|
391
|
+
it "should be overridable" do
|
392
|
+
@user.role = :writer
|
393
|
+
@user.role.should == :writer
|
394
|
+
@user.should be_writer
|
395
|
+
@user.save!
|
396
|
+
@user.role.should == :writer
|
397
|
+
@user.should be_writer
|
398
|
+
@user.reload
|
399
|
+
@user.role.should == :writer
|
400
|
+
@user.should be_writer
|
401
|
+
end
|
402
|
+
|
403
|
+
# This feature is for the next major version (b/o the compatibility problem)
|
404
|
+
pending "should detect name collision caused by ':methods => true' option" do
|
405
|
+
lambda {
|
406
|
+
User.class_eval do
|
407
|
+
# 'reader?' method is already defined, so the line below should raise an error
|
408
|
+
symbolize :some_attr, :in => [:reader, :guest], :methods => true
|
409
|
+
end
|
410
|
+
}.should raise_error(ArgumentError)
|
411
|
+
end
|
412
|
+
|
413
|
+
end
|
356
414
|
end
|
@@ -9,8 +9,9 @@ class Person
|
|
9
9
|
include Mongoid::Timestamps
|
10
10
|
|
11
11
|
symbolize :other, :i18n => false
|
12
|
+
|
12
13
|
symbolize :language, :in => [:pt, :en]
|
13
|
-
symbolize :sex, :type => Boolean, :scopes => true
|
14
|
+
symbolize :sex, :type => Boolean, :scopes => true, :i18n => true
|
14
15
|
symbolize :status , :in => [:active, :inactive], :i18n => false, :capitalize => true, :scopes => true
|
15
16
|
symbolize :so, :allow_blank => true, :in => {
|
16
17
|
:linux => 'Linux',
|
@@ -131,6 +132,10 @@ describe "Symbolize" do
|
|
131
132
|
Person::STATUS_VALUES.should eql({ inactive: "Inactive", active: "Active"})
|
132
133
|
end
|
133
134
|
|
135
|
+
it "should get the values for RailsAdmin" do
|
136
|
+
Person.status_enum.should eql([["Active", :active],["Inactive", :inactive]])
|
137
|
+
end
|
138
|
+
|
134
139
|
it "should have a human _text method" do
|
135
140
|
person.status_text.should eql("Active")
|
136
141
|
end
|
@@ -249,6 +254,15 @@ describe "Symbolize" do
|
|
249
254
|
skill.kind_text.should be_nil
|
250
255
|
end
|
251
256
|
|
257
|
+
it "should return the proper 'false' i18n if the attr value is false" do
|
258
|
+
person = Person.new(:sex => false)
|
259
|
+
person.sex_text.should == "Masculino"
|
260
|
+
end
|
261
|
+
|
262
|
+
it "should use i18n if i18n => true" do
|
263
|
+
person.sex_text.should eql("Feminino")
|
264
|
+
end
|
265
|
+
|
252
266
|
end
|
253
267
|
|
254
268
|
describe "Methods" do
|
@@ -276,10 +290,6 @@ describe "Symbolize" do
|
|
276
290
|
|
277
291
|
describe "more tests on Right" do
|
278
292
|
|
279
|
-
it "should use default value on object build" do
|
280
|
-
Right.new.kind.should eql(:perm)
|
281
|
-
end
|
282
|
-
|
283
293
|
it "should not interfer on create" do
|
284
294
|
Right.create!(:name => "p7", :kind => :temp)
|
285
295
|
Right.where(name: "p7").first.kind.should eql(:temp)
|
@@ -293,10 +303,11 @@ describe "Symbolize" do
|
|
293
303
|
|
294
304
|
it "should work on create" do
|
295
305
|
Right.create(:name => "p8")
|
296
|
-
Right.
|
306
|
+
Right.find_by(name: "p8").kind.should eql(:perm)
|
297
307
|
end
|
298
308
|
|
299
309
|
it "should work on edit" do
|
310
|
+
Right.create(:name => "p8")
|
300
311
|
pm = Right.where(name: "p8").first
|
301
312
|
pm.kind = :temp
|
302
313
|
pm.save
|
@@ -305,6 +316,19 @@ describe "Symbolize" do
|
|
305
316
|
|
306
317
|
end
|
307
318
|
|
319
|
+
describe "Default Values" do
|
320
|
+
|
321
|
+
it "should use default value on object build" do
|
322
|
+
Right.new.kind.should eql(:perm)
|
323
|
+
end
|
324
|
+
|
325
|
+
it "should use default value in string" do
|
326
|
+
Project.new.state.should eql('active')
|
327
|
+
end
|
328
|
+
|
329
|
+
end
|
330
|
+
|
331
|
+
|
308
332
|
describe "Scopes" do
|
309
333
|
it "should work under scope" do
|
310
334
|
# Person.with_scope({ :status => :inactive }) do
|
@@ -330,7 +354,9 @@ describe "Symbolize" do
|
|
330
354
|
end
|
331
355
|
|
332
356
|
describe "dirty tracking / changed flag" do
|
357
|
+
|
333
358
|
before do
|
359
|
+
Person.create!(:name => 'Anna', :other => :fo, :status => :active , :so => :linux, :gui => :qt, :language => :pt, :sex => true, :cool => true)
|
334
360
|
@anna = Person.where(name: 'Anna').first
|
335
361
|
end
|
336
362
|
|
@@ -351,10 +377,9 @@ describe "Symbolize" do
|
|
351
377
|
return_value.should == :pt
|
352
378
|
@anna.language_changed?.should be_false
|
353
379
|
end
|
354
|
-
end
|
355
380
|
|
381
|
+
end
|
356
382
|
|
357
383
|
end
|
358
384
|
|
359
385
|
end
|
360
|
-
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: symbolize
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.
|
4
|
+
version: 4.3.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-02-15 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: i18n
|
16
|
-
requirement:
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,15 @@ dependencies:
|
|
21
21
|
version: 0.6.0
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 0.6.0
|
25
30
|
- !ruby/object:Gem::Dependency
|
26
31
|
name: rspec
|
27
|
-
requirement:
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
28
33
|
none: false
|
29
34
|
requirements:
|
30
35
|
- - ~>
|
@@ -32,21 +37,31 @@ dependencies:
|
|
32
37
|
version: 2.8.0
|
33
38
|
type: :development
|
34
39
|
prerelease: false
|
35
|
-
version_requirements:
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 2.8.0
|
36
46
|
- !ruby/object:Gem::Dependency
|
37
47
|
name: mongoid
|
38
|
-
requirement:
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
39
49
|
none: false
|
40
50
|
requirements:
|
41
51
|
- - ~>
|
42
52
|
- !ruby/object:Gem::Version
|
43
|
-
version:
|
53
|
+
version: 3.1.0
|
44
54
|
type: :development
|
45
55
|
prerelease: false
|
46
|
-
version_requirements:
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 3.1.0
|
47
62
|
- !ruby/object:Gem::Dependency
|
48
63
|
name: bson_ext
|
49
|
-
requirement:
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
50
65
|
none: false
|
51
66
|
requirements:
|
52
67
|
- - ~>
|
@@ -54,10 +69,15 @@ dependencies:
|
|
54
69
|
version: 1.5.0
|
55
70
|
type: :development
|
56
71
|
prerelease: false
|
57
|
-
version_requirements:
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ~>
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: 1.5.0
|
58
78
|
- !ruby/object:Gem::Dependency
|
59
79
|
name: sqlite3
|
60
|
-
requirement:
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
61
81
|
none: false
|
62
82
|
requirements:
|
63
83
|
- - ~>
|
@@ -65,10 +85,15 @@ dependencies:
|
|
65
85
|
version: 1.3.0
|
66
86
|
type: :development
|
67
87
|
prerelease: false
|
68
|
-
version_requirements:
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ~>
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: 1.3.0
|
69
94
|
- !ruby/object:Gem::Dependency
|
70
95
|
name: pg
|
71
|
-
requirement:
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
72
97
|
none: false
|
73
98
|
requirements:
|
74
99
|
- - ~>
|
@@ -76,18 +101,28 @@ dependencies:
|
|
76
101
|
version: 0.12.2
|
77
102
|
type: :development
|
78
103
|
prerelease: false
|
79
|
-
version_requirements:
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ~>
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: 0.12.2
|
80
110
|
- !ruby/object:Gem::Dependency
|
81
111
|
name: activerecord
|
82
|
-
requirement:
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
83
113
|
none: false
|
84
114
|
requirements:
|
85
|
-
- -
|
115
|
+
- - ! '>='
|
86
116
|
- !ruby/object:Gem::Version
|
87
|
-
version: 3.1
|
117
|
+
version: 3.2.1
|
88
118
|
type: :development
|
89
119
|
prerelease: false
|
90
|
-
version_requirements:
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ! '>='
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: 3.2.1
|
91
126
|
description: ActiveRecord/Mongoid enums with i18n
|
92
127
|
email: x@nofxx.com
|
93
128
|
executables: []
|
@@ -102,7 +137,6 @@ files:
|
|
102
137
|
- spec/spec_helper_ar.rb
|
103
138
|
- spec/locales/en.yml
|
104
139
|
- spec/locales/pt.yml
|
105
|
-
- spec/symbolize_spec.rb
|
106
140
|
- spec/spec_helper_mongoid.rb
|
107
141
|
- spec/spec_helper.rb
|
108
142
|
- spec/symbolize/mongoid_spec.rb
|
@@ -124,7 +158,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
124
158
|
version: '0'
|
125
159
|
segments:
|
126
160
|
- 0
|
127
|
-
hash:
|
161
|
+
hash: -669350637973584292
|
128
162
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
129
163
|
none: false
|
130
164
|
requirements:
|
@@ -133,7 +167,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
133
167
|
version: '0'
|
134
168
|
requirements: []
|
135
169
|
rubyforge_project:
|
136
|
-
rubygems_version: 1.8.
|
170
|
+
rubygems_version: 1.8.23
|
137
171
|
signing_key:
|
138
172
|
specification_version: 3
|
139
173
|
summary: Object enums with i18n in AR or Mongoid
|