symbolize 4.2.0 → 4.3.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 +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
|