yinum 1.6.0 → 1.7.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c53d2bc9cc46a16d364551c488ad35a119fb3c4d
4
- data.tar.gz: 2ac8672e7d86efb82b2ca054c4ed4108b7359d51
3
+ metadata.gz: a6c73933a509d17c611e833780d494509c743d76
4
+ data.tar.gz: 08cbfb277952c6542c39b1dc5ebe9e9e331f2682
5
5
  SHA512:
6
- metadata.gz: 141e86d9162afd39eb923f927084325a4296f321c034572f410d2520c61779b57c97b2b063f28677a3fd779320c3e855be863073059f948a19e54980bef0b111
7
- data.tar.gz: 2dc92e06508922e477382b08c844d102c621a4e2b1ddd6f862783398e553f936b85de1ac31fda44def0d41538ff274f6cd7743324528ca5887c6d92da96193ad
6
+ metadata.gz: 6e2e98a5b4b03df21652b9539da8e29e7a7661fde7df110d155172ef4c05bad87a3e8de61ae042490487139bee7b6a2e46252ddd1739d3cf51ec6a54a568dff1
7
+ data.tar.gz: 467a1640a733bdef9a958c1c8b452cfbe50af55cd913395af3bccceade2b6111ab3eab2224d56cd141eebb6ca389ead9d05b3be52d601082c6e28e1e1ed21766
data/.gitignore CHANGED
@@ -15,3 +15,4 @@ capybara-*.html
15
15
  **.orig
16
16
  rerun.txt
17
17
  pickle-email-*.html
18
+ tags
data/CHANGELOG.md ADDED
@@ -0,0 +1,3 @@
1
+ * `attr_enum` reader always returns an EnumValue.
2
+ * `EnumValue#t` uses `String#titlelize` if it's available and I18n or the
3
+ specific translation are not available.
data/README.md CHANGED
@@ -49,6 +49,12 @@ Getting enum values:
49
49
  => FRUITS.apple
50
50
  FRUITS[1]
51
51
  => FRUITS.apple
52
+ FRUITS['orange']
53
+ => FRUITS.orange
54
+ FRUITS['2']
55
+ => FRUITS.orange
56
+ FRUITS['orange', '1']
57
+ => [FRUITS.orange, FRUITS.apple]
52
58
 
53
59
  Comparing enum values:
54
60
 
@@ -72,6 +78,33 @@ The enum value is actually a delegate to the value with a special inspect and co
72
78
  fruit > FRUITS.apple
73
79
  => true
74
80
 
81
+ Generating enum attribute methods for your class:
82
+
83
+ class Car
84
+ attr_accessor :color
85
+ attr_enum :color, :COLORS, :red => 1, :black => 2
86
+ end
87
+ car = Car.new
88
+ car.color = :red
89
+ car.color
90
+ => Car::COLORS.red
91
+ car.color = "2"
92
+ car.color
93
+ => Car::COLORS.black
94
+ car.color.black?
95
+ => false
96
+
97
+ If this is a defining attribute for the class, add `:qualifier => true` to generate question methods like so:
98
+
99
+ class Car
100
+ attr_accessor :color
101
+ attr_enum :color, :COLORS, { :qualifier => true }, :red => 1, :black => 2
102
+ end
103
+ car = Car.new
104
+ car.color = :red
105
+ car.red?
106
+ => true
107
+
75
108
  How the enum gets along with Rails, assuming the following model:
76
109
 
77
110
  # == Schema Info
@@ -93,7 +126,7 @@ Now the `color` column is always read and written using the enum value feature:
93
126
  Car.last.color.red?
94
127
  => true
95
128
 
96
- This also creates a `validates\_inclusion\_of` with `allow\_nil => true` to prevent having bad values.
129
+ This also creates a `validates_inclusion_of` with `allow_nil => true` to prevent having bad values.
97
130
 
98
131
  Adding a `:scoped => true` option before the enum values allows automatic generation of scopes and question
99
132
  methods on the model as follows:
@@ -106,7 +139,7 @@ methods on the model as follows:
106
139
  Car.last.red?
107
140
  => true
108
141
 
109
- You can also use another class's enum for your class with enum\_column (including generated methods) like so:
142
+ You can also use another class's enum for your class with enum\_column and attr\_enum (including generated methods) like so:
110
143
 
111
144
  class Motorcycle < ActiveRecord::Base
112
145
  enum_column :color, Car::COLORS, { :scoped => true }
@@ -137,10 +170,12 @@ The following will occur:
137
170
  => "Green Apple"
138
171
  FRUITS[2].t
139
172
  => "Orange Color"
140
- Car::COLORS.red
173
+ Car::COLORS.red.t
141
174
  => "Shiny Red"
142
- Car::COLORS.black
175
+ Car::COLORS.black.t
143
176
  => "Actually, white"
177
+ Car::COLORS.options # nice for options_for_select
178
+ => { "Shiny Red" => :red, "Actually, white" => :black }
144
179
 
145
180
  When the enum is given a parent, the class's name is used in the translation.
146
181
  If the translation is missing, it fallbacks to the translation without the class's name.
@@ -152,13 +187,13 @@ All enum names (usually CONSTANT\_LIKE) and parent class names are converted to
152
187
  Since the `===` operator is called on the when value, this syntax cannot be used:
153
188
 
154
189
  case fruit
155
- when :red then "This will never happen!"
190
+ when :apple then "This will never happen!"
156
191
  end
157
192
 
158
193
  The following should be used instead:
159
194
 
160
195
  case fruit
161
- when FRUITS.red then "This is better..."
196
+ when FRUITS.apple then "This is better..."
162
197
  end
163
198
 
164
199
  This is because I had trouble overriding the `===` operator of the Symbol class.
@@ -169,3 +204,12 @@ Another limitation is the following:
169
204
  Car.where(:color => Car::COLORS.red) # good
170
205
 
171
206
  You may use the EnumValue object for anything, but don't get smart using the key.
207
+ If the EnumValue doesn't work in a spot, use #name (in `options_for_select`) or #value (in `update_all`).
208
+
209
+ ## Also
210
+
211
+ EnumValue also works well with [nil_or](https://github.com/toplex/nil_or):
212
+
213
+ fruit = FRUITS.apple
214
+ fruit.nil_or.t
215
+ => "Green Apple"
data/UNLICENSE ADDED
@@ -0,0 +1,24 @@
1
+ This is free and unencumbered software released into the public domain.
2
+
3
+ Anyone is free to copy, modify, publish, use, compile, sell, or
4
+ distribute this software, either in source code form or as a compiled
5
+ binary, for any purpose, commercial or non-commercial, and by any
6
+ means.
7
+
8
+ In jurisdictions that recognize copyright laws, the author or authors
9
+ of this software dedicate any and all copyright interest in the
10
+ software to the public domain. We make this dedication for the benefit
11
+ of the public at large and to the detriment of our heirs and
12
+ successors. We intend this dedication to be an overt act of
13
+ relinquishment in perpetuity of all present and future rights to this
14
+ software under copyright law.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
19
+ IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
20
+ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21
+ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22
+ OTHER DEALINGS IN THE SOFTWARE.
23
+
24
+ For more information, please refer to <http://unlicense.org/>
@@ -1,7 +1,7 @@
1
1
  class Enum::EnumValue < BasicObject
2
2
  attr_reader :enum, :name, :value
3
3
 
4
- def initialize(enum, name, value)
4
+ def initialize(enum, name = nil, value)
5
5
  @enum, @name, @value = enum, name, value
6
6
  end
7
7
 
@@ -10,36 +10,67 @@ class Enum::EnumValue < BasicObject
10
10
  end
11
11
 
12
12
  def inspect
13
+ return @value.inspect if @name.nil?
14
+
13
15
  "#{@enum.to_s}.#{@name}"
14
16
  end
15
17
 
16
18
  def ==(other)
19
+ return @value == other if @name.nil?
20
+
17
21
  @name == other or @value == other
18
22
  end
19
23
 
20
24
  def ===(other)
25
+ return @value === other if @name.nil?
26
+
21
27
  @name === other or @value === other
22
28
  end
23
29
 
24
- def t(options={})
30
+ def t(options = {})
31
+ return @value.t(options) if @name.nil?
32
+ if not defined?(::I18n)
33
+ if @name.to_s.respond_to?(:titleize)
34
+ return @name.to_s.titleize
35
+ else
36
+ raise NotImplementedError, "I18n and String#titleize are not available"
37
+ end
38
+ end
39
+
25
40
  scope_without_klass = "enums.#{const_to_translation(@enum.name)}"
26
41
  if @enum.klass
27
42
  scope_with_klass = "enums.#{const_to_translation(@enum.klass.name)}.#{const_to_translation(@enum.name)}"
28
- return "I18n not available: #{scope_with_klass}.#{@name}" unless defined?(::I18n)
29
43
 
30
- ::I18n.t(@name,
31
- # prefer scope with klass
32
- options.reverse_merge(:scope => scope_with_klass,
33
- :default => ::I18n.t(@name,
34
- # but if not, use without
35
- options.reverse_merge(:scope => scope_without_klass,
36
- # but! if not, return scope with klass error
37
- :default => ::I18n.t(@name,
38
- options.reverse_merge(:scope => scope_with_klass))))))
44
+ ::I18n.t(
45
+ @name,
46
+ # prefer scope with klass
47
+ options.reverse_merge(
48
+ scope: scope_with_klass
49
+ ).merge( # our :default is a priority here
50
+ default: ::I18n.t(
51
+ @name,
52
+ # but if not, use without
53
+ options.reverse_merge(
54
+ scope: scope_without_klass,
55
+ # but! if not, return titleize or scope with klass error
56
+ default: @name.to_s.respond_to?(:titleize) ? @name.to_s.titleize : ::I18n.t(
57
+ @name,
58
+ options.reverse_merge(
59
+ scope: scope_with_klass
60
+ )
61
+ )
62
+ )
63
+ )
64
+ )
65
+ )
39
66
  else
40
- return "I18n not available: #{scope_without_klass}.#{@name}" unless defined?(::I18n)
41
-
42
- ::I18n.t(@name, options.reverse_merge(:scope => scope_without_klass))
67
+ ::I18n.t(
68
+ @name,
69
+ options.reverse_merge(
70
+ scope: scope_without_klass,
71
+ default: (@name.to_s.titleize if @name.to_s.respond_to?(:titleize))
72
+ )
73
+ )
43
74
  end
44
75
  end
45
76
 
@@ -19,7 +19,7 @@ module Enum::Helpers::EnumAttribute
19
19
  e = const_get(name_or_enum)
20
20
  end
21
21
  # attribute reader
22
- define_method(attr) { v = super(); (v.nil? or not e.values.include?(v)) ? v : e[v] }
22
+ define_method(attr) { v = super(); (v.nil? or not e.values.include?(v)) ? Enum::EnumValue.new(e, v) : e[v] }
23
23
  # attribute writer
24
24
  define_method("#{attr}=") { |v| v.nil? ? super(v) : super(e[v]) }
25
25
 
@@ -26,7 +26,7 @@ module Enum::Helpers::EnumColumn
26
26
  end
27
27
  end
28
28
 
29
- if defined?(ActiveRecord)
29
+ if defined?(ActiveRecord::Base)
30
30
  class ActiveRecord::Base
31
31
  extend Enum::Helpers::EnumColumn
32
32
  end
@@ -0,0 +1,3 @@
1
+ class Enum
2
+ VERSION = '1.7.0'
3
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yinum
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.0
4
+ version: 1.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Oded Niv
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-11-18 00:00:00.000000000 Z
11
+ date: 2014-02-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -33,16 +33,19 @@ extensions: []
33
33
  extra_rdoc_files: []
34
34
  files:
35
35
  - .gitignore
36
+ - CHANGELOG.md
36
37
  - Gemfile
37
38
  - Gemfile.lock
38
39
  - README.md
39
40
  - Rakefile
41
+ - UNLICENSE
40
42
  - lib/enum.rb
41
43
  - lib/enum/enum_value.rb
42
44
  - lib/enum/helpers.rb
43
45
  - lib/enum/helpers/enum_attribute.rb
44
46
  - lib/enum/helpers/enum_column.rb
45
47
  - lib/enum/helpers/enum_generator.rb
48
+ - lib/enum/version.rb
46
49
  - lib/yinum.rb
47
50
  - spec/lib/enum/enum_value_spec.rb
48
51
  - spec/lib/enum/helpers/enum_attribute_spec.rb
@@ -75,10 +78,4 @@ rubygems_version: 2.0.3
75
78
  signing_key:
76
79
  specification_version: 4
77
80
  summary: Enum implementation
78
- test_files:
79
- - spec/lib/enum/enum_value_spec.rb
80
- - spec/lib/enum/helpers/enum_attribute_spec.rb
81
- - spec/lib/enum/helpers/enum_column_spec.rb
82
- - spec/lib/enum/helpers/enum_generator_spec.rb
83
- - spec/lib/enum_spec.rb
84
- - spec/spec_helper.rb
81
+ test_files: []