simple_enum 1.6.9 → 2.0.0.rc1

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.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +3 -0
  3. data/LICENSE +1 -1
  4. data/README.md +248 -0
  5. data/Rakefile +4 -21
  6. data/lib/simple_enum/accessors/accessor.rb +55 -0
  7. data/lib/simple_enum/accessors/ignore_accessor.rb +11 -0
  8. data/lib/simple_enum/accessors/whiny_accessor.rb +12 -0
  9. data/lib/simple_enum/accessors.rb +18 -0
  10. data/lib/simple_enum/attribute.rb +77 -0
  11. data/lib/simple_enum/enum.rb +37 -0
  12. data/lib/simple_enum/hasher.rb +26 -0
  13. data/lib/simple_enum/mongoid.rb +11 -15
  14. data/lib/simple_enum/translation.rb +17 -0
  15. data/lib/simple_enum/version.rb +2 -2
  16. data/lib/simple_enum.rb +19 -276
  17. data/simple_enum.gemspec +9 -9
  18. data/spec/simple_enum/accessors_spec.rb +212 -0
  19. data/spec/simple_enum/attribute_spec.rb +208 -0
  20. data/spec/simple_enum/enum_spec.rb +96 -0
  21. data/spec/simple_enum/hasher_spec.rb +63 -0
  22. data/spec/simple_enum/mongoid_spec.rb +44 -0
  23. data/spec/simple_enum/translation_spec.rb +66 -0
  24. data/spec/spec_helper.rb +27 -0
  25. data/spec/support/active_record_support.rb +23 -0
  26. data/spec/support/i18n_support.rb +12 -0
  27. data/spec/support/model_support.rb +47 -0
  28. data/spec/support/mongoid_support.rb +21 -0
  29. metadata +50 -56
  30. data/README.rdoc +0 -293
  31. data/lib/simple_enum/enum_hash.rb +0 -64
  32. data/lib/simple_enum/validation.rb +0 -58
  33. data/locales/en.yml +0 -10
  34. data/test/array_conversions_test.rb +0 -21
  35. data/test/class_methods_test.rb +0 -114
  36. data/test/dirty_attributes_test.rb +0 -37
  37. data/test/enum_hash_test.rb +0 -73
  38. data/test/finders_test.rb +0 -45
  39. data/test/locales.yml +0 -25
  40. data/test/mongoid_test.rb +0 -66
  41. data/test/object_backed_test.rb +0 -61
  42. data/test/orm/active_record.rb +0 -114
  43. data/test/orm/common.rb +0 -23
  44. data/test/orm/mongoid.rb +0 -114
  45. data/test/poro_test.rb +0 -20
  46. data/test/prefixes_test.rb +0 -36
  47. data/test/simple_enum_test.rb +0 -314
  48. data/test/test_helper.rb +0 -40
  49. data/test/without_shortcuts_test.rb +0 -39
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 18d5bbe70d30e114c220f17681c172597163bfd0
4
- data.tar.gz: e9ae250d080b7f6efa78928005df4b9f36ca9ffb
3
+ metadata.gz: 665f3d1039443aa384654770a39563ac3d784060
4
+ data.tar.gz: 44d521782b6390f95dc6b11f3d1c2f6bb570c811
5
5
  SHA512:
6
- metadata.gz: 9150ad6487da910c1b6319030102a2e8504f0775e995f2e4cc8ca09e6198e91176e08d6fa8b9aca468aa0de43cdb5a4168d7b802c0ca159d2a98b860810666a7
7
- data.tar.gz: 14577d002d9996148f4e321624ecaba8cf705de2ff8162f06c5aca7940b620dfbf1cda88c3c182aa10eed11ce8257d129e4cc4f870a77f123c0b996a86f97205
6
+ metadata.gz: 200d1e0d6e1367f7f7c66ccd3380452052b3b16547e461d6050d163e1bd7416c4413139284cf4971c1d18439f6ac816a70571fc2b116ab9bbfe52c753bb7fe50
7
+ data.tar.gz: 0d1238c44c50cd1b2b98d74d68d97a3e9bf4d265b35f9360cd4da59bcaace4eaa2529fa5874a614d3565b5ea5702841499864f6864ea1e1bca424fe7af81625c
data/Gemfile CHANGED
@@ -9,3 +9,6 @@ gem 'mongo', '~> 1.9.0', :platform => :jruby
9
9
  gem 'activerecord-jdbcsqlite3-adapter', :platform => :jruby
10
10
  gem 'sqlite3', :platform => :ruby
11
11
  gem 'bson_ext', :platform => :ruby
12
+
13
+ # Code coverage on CI only
14
+ gem "codeclimate-test-reporter", group: :test, require: nil
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2013 Lukas Westermann (Zurich, Switzerland)
1
+ Copyright (c) 2014 Lukas Westermann (Zurich, Switzerland)
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README.md ADDED
@@ -0,0 +1,248 @@
1
+ SimpleEnum
2
+ ==========
3
+
4
+ [![Build Status](https://travis-ci.org/lwe/simple_enum.svg)](https://travis-ci.org/lwe/simple_enum)
5
+ [![Code Climate](https://codeclimate.com/github/lwe/simple_enum.png)](https://codeclimate.com/github/lwe/simple_enum)
6
+
7
+ Unobtrusive enum-like fields for ActiveRecord and Ruby, brings enums functionality
8
+ to ActiveRecord and Mongoid models (built for Rails 4+).
9
+
10
+ Since version 2.0, simple_enum is no longer compatible with Rails 3.x or Ruby 1.8,
11
+ use version 1.6 instead: https://github.com/lwe/simple_enum/tree/legacy-1.x
12
+
13
+ *Note*: a recent search on github for `enum` turned out, that there are many,
14
+ many similar solutions. In fact starting with Rails 4.1, there's `ActiveRecord::Enum`
15
+ which provides **some** of the functionality, but is IMHO pretty limited and too
16
+ strict in the defaults it provides.
17
+
18
+ ActiveRecord Quick start
19
+ ------------------------
20
+
21
+ Add this to a model:
22
+
23
+ ```ruby
24
+ class User < ActiveRecord::Base
25
+ as_enum :gender, female: 1, male: 0
26
+ end
27
+ ```
28
+
29
+ Then create the required `gender_cd` column using migrations:
30
+
31
+ ```ruby
32
+ class AddGenderColumnToUser < ActiveRecord::Migration
33
+ def self.up
34
+ add_column :users, :gender_cd, :integer
35
+ end
36
+
37
+ def self.down
38
+ remove_column :users, :gender_cd
39
+ end
40
+ end
41
+ ```
42
+
43
+ Mongoid Quick start
44
+ -------------------
45
+
46
+ Due to the dependency on ActiveModel 4.x, the Mongoid integration is only
47
+ available for mongoid 4.0.0 (which is at beta1 at the moment). If you intend
48
+ to use simple_enum with another version of mongoid, use version 1.6 instead.
49
+
50
+ Load mongoid support in the `Gemfile`:
51
+
52
+ ```ruby
53
+ gem 'simple_enum', '2.0.0.rc1' , require: 'simple_enum/mongoid'
54
+ ```
55
+
56
+ Add this to a model:
57
+
58
+ ```ruby
59
+ class User
60
+ include Mongoid::Document
61
+ include SimpleEnum::Mongoid
62
+
63
+ as_enum :gender, female: 1, male: 0
64
+ end
65
+ ```
66
+
67
+ The primary difference between AR and mongoid is, that additionaly a field is
68
+ added to mongoid automatically, the field can be customized by setting `field:`
69
+ option, or disabled by setting `field: false`.
70
+
71
+ Working with enums
72
+ ------------------
73
+
74
+ Now it's possible to pull some neat tricks on the new column, yet the original
75
+ db column (`gender_cd`) is still intact and not touched by anything.
76
+
77
+ ```ruby
78
+ jane = User.new
79
+ jane.gender = :female
80
+ jane.female? # => true
81
+ jane.male? # => false
82
+ jane.gender # => :female
83
+ jane.gender_cd # => 1
84
+ ```
85
+
86
+ Easily switch to another value using the bang methods, this does not save
87
+ the record, only switch the value.
88
+
89
+ ```ruby
90
+ joe = User.new
91
+ joe.male! # => :male
92
+ joe.gender # => :male
93
+ joe.gender_cd # => 0
94
+ ```
95
+
96
+ Accessing actual enum values is possible at the class level:
97
+
98
+ ```ruby
99
+ User.genders # => #<SimpleEnum::Enum:0x0....>
100
+ User.genders[:male] # => 0
101
+ User.female # => #<ActiveRecord::Relation:0x0.....> (WHERE gender_cd = 1)
102
+ ```
103
+
104
+ ### Wait, there's more!
105
+
106
+ - Too tired of always adding the integer values? Try:
107
+
108
+ ```ruby
109
+ class User < ActiveRecord::Base
110
+ as_enum :status, %i{deleted active disabled}
111
+ # translates to: { deleted: 0, active: 1, disabled: 2 }
112
+ end
113
+ ```
114
+
115
+ **Disclaimer**: if you _ever_ decide to reorder this array, beaware that any
116
+ previous mapping is lost. So it's recommended to create mappings (that might
117
+ change) using hashes instead of arrays. For stuff like gender it might be
118
+ probably perfectly fine to use arrays though.
119
+ - You can store as string values instead of integer values if your database column
120
+ has the type `string` or `text`:
121
+
122
+ ```ruby
123
+ class User < ActiveRecord::Base
124
+ as_enum :status, [:deleted, :active, :disabled], map: :string
125
+ end
126
+
127
+ User.create!(status: :active) #=> #<User id: 1, status_cd: "active">
128
+ ```
129
+ - Want to use `SimpleEnum` in an ActiveModel, or other class, just add:
130
+
131
+ ```ruby
132
+ class MyModel
133
+ extend SimpleEnum::Attribute
134
+ attr_accessor :gender_cd
135
+ as_enum :gender, [:male, :female]
136
+ end
137
+ ```
138
+ - Maybe you've columns named differently than the proposed `{column}_cd` naming scheme, feel free to use any column name
139
+ by providing an option:
140
+
141
+ ```ruby
142
+ class User < ActiveRecord::Base
143
+ as_enum :gender, [:male, :female], source: :sex
144
+ end
145
+ ```
146
+
147
+ Starting with 2.0 it's possible to use the same source name as column name.
148
+ - By default ActiveRecord dirty methods are generated:
149
+
150
+ ```ruby
151
+ user = User.male.first
152
+ user.gender = :female
153
+ user.gender_was
154
+ # => :male
155
+ ```
156
+ - Need to provide custom options for the mongoid field, or skip the automatically generated field?
157
+
158
+ ```ruby
159
+ # skip field generation
160
+ field :gender_cd # <- create field manually (!)
161
+ as_enum :gender, [:male, :female], field: false
162
+
163
+ # custom field options (directly passed to Mongoid::Document#field)
164
+ as_enum :gender, [:male, :female], field: { :type => Integer, :default => 1 }
165
+ ```
166
+ - To validate enum values simply make use of a `validates :gender, presence: true` validation.
167
+ If an invalid value is assigned, the gender is set to `nil` by default.
168
+ - If the shortcut methods (like `female?`, `female!` or `User.male`) conflict with something in your class, it's possible to
169
+ define a prefix:
170
+
171
+ class User < ActiveRecord::Base
172
+ as_enum :gender, %w{male female}, prefix: true
173
+ end
174
+
175
+ jane = User.new gender: :female
176
+ jane.gender_female? # => true
177
+ User.gender_female # => <ActiveRecord::Relation...WHERE gender_cd = 1.>
178
+
179
+ The `:prefix` option not only takes a boolean value as an argument, but instead can also be supplied a custom
180
+ prefix, so with `prefix: 'foo'` all shortcut methods would look like: `foo_<symbol>`
181
+ - To define which methods are generated it's possible to set `with:` option, by
182
+ default `with:` is set to `[:attribute, :dirty, :scope]`.
183
+
184
+ 1. `:attribute` - generates the `male?` and `male!` accessor methods
185
+ 2. `:dirty` - adds the `gender_was` and `gender_changed?` dirty methods
186
+ 3. `:scope` - adds the class level scopes, **if** the `scope` method is present
187
+
188
+ - By default the value is set to `nil` when the user sets an invalid value,
189
+ this behavior can be changed by setting the `accessor:` option. At the moment
190
+ there are three different behaviors:
191
+
192
+ 1. `:default` - which sets the value simply to `nil`
193
+ 2. `:whiny` - raises an ArgumentError when trying to set an invalid value
194
+ 3. `:ignore` - keeps the existing value
195
+
196
+ ```ruby
197
+ class User < ActiveRecord::Base
198
+ as_enum :gender, %w{male female}, accessor: :whiny
199
+ end
200
+ User.new(gender: "dunno") # => raises ArgumentError
201
+ ```
202
+
203
+ See `lib/simple_enum/accessors/*` for more.
204
+
205
+ - To define any option globally, e.g. never generating dirty methods, create
206
+ an initializer and add:
207
+
208
+ ```ruby
209
+ # See lib/simple_enum.rb for other options
210
+ SimpleEnum.with = [:accessor, :scope]
211
+ ```
212
+
213
+ ## Best practices
214
+
215
+ Do not use values named after existing, or well known method names, like `new`, `create` etc.
216
+
217
+ ```ruby
218
+ # BAD, conflicts with Rails ActiveRecord Methods (!)
219
+ as_enum :handle, [:new, :create, :update]
220
+
221
+ # GOOD, prefixes all methods
222
+ as_enum :handle, [:new, :create, :update], :prefix => true
223
+ ```
224
+
225
+ Searching for certain values by using the finder methods:
226
+
227
+ ```ruby
228
+ User.female # => returns an ActiveRecord::Relation
229
+ ```
230
+
231
+ Contributors
232
+ ------------
233
+
234
+ * @dmitry - bugfixes and other improvements
235
+ * @tarsolya - implemented all the ruby 1.9 and rails 3 goodness!
236
+ * @dbalatero - rails 2.3.5 bugfix & validator fixes
237
+ * @johnthethird - feature for <tt>_for_select</tt> to return the values
238
+ * @sinsiliux - ruby 1.9 fixes and removed AR dependency
239
+ * @sled - mongoid support
240
+ * @abrom - <tt>find_by_...</tt> method
241
+ * @mhuggins - translations fixes
242
+ * @patbenatar - for helping move towards 2.0 (scopes et all)
243
+ * and all others: https://github.com/lwe/simple_enum/graphs/contributors thanks
244
+
245
+ License & Copyright
246
+ -------------------
247
+
248
+ Copyright (c) 2011-2014 by Lukas Westermann, Licensed under MIT Licence (see LICENSE file)
data/Rakefile CHANGED
@@ -5,30 +5,13 @@ require 'rake/testtask'
5
5
  Bundler::GemHelper.install_tasks
6
6
 
7
7
  desc 'Default: run all unit tests for both ActiveRecord & Mongoid.'
8
- task :default => :test
8
+ task :default => :spec
9
9
 
10
- namespace :test do
11
- Rake::TestTask.new(:units) do |t|
12
- t.libs << "test"
13
- t.test_files = Dir['test/*_test.rb']
14
- t.verbose = true
15
- end
16
-
17
- desc 'Run all unit tests for ActiveRecord'
18
- task :activerecord do |t|
19
- ENV['SIMPLE_ENUM_TEST_ORM'] = 'active_record'
20
- Rake::Task['test:units'].execute
21
- end
22
-
23
- desc 'Run all unit tests for Mongoid'
24
- task :mongoid do |t|
25
- ENV['SIMPLE_ENUM_TEST_ORM'] = 'mongoid'
26
- Rake::Task['test:units'].execute
27
- end
10
+ desc 'Run rspec test suite'
11
+ task :spec do
12
+ sh 'bundle exec rspec spec/'
28
13
  end
29
14
 
30
- task :test => [:'test:activerecord', :'test:mongoid']
31
-
32
15
  # Mongodb
33
16
  directory "tmp/mongodb.data"
34
17
  desc 'Run mongodb in tmp/'
@@ -0,0 +1,55 @@
1
+ module SimpleEnum
2
+ module Accessors
3
+ class Accessor
4
+ attr_reader :name, :enum, :source
5
+
6
+ def initialize(name, enum, source = nil, prefix = nil)
7
+ @name = name.to_s
8
+ @enum = enum
9
+ @source = source.to_s.presence || "#{name}#{SimpleEnum.suffix}"
10
+ @prefix = prefix
11
+ end
12
+
13
+ def prefix
14
+ @cached_prefix ||= @prefix && "#{@prefix == true ? name : @prefix}_" || ""
15
+ end
16
+
17
+ def read(object)
18
+ enum.key(read_before_type_cast(object))
19
+ end
20
+
21
+ def write(object, key)
22
+ write_after_type_cast(object, enum[key]) && key
23
+ end
24
+
25
+ def selected?(object, key = nil)
26
+ current = read_before_type_cast(object)
27
+ return current && current == enum[key] if key
28
+ current
29
+ end
30
+
31
+ def changed?(object)
32
+ object.attribute_changed?(source)
33
+ end
34
+
35
+ def was(object)
36
+ enum.key(object.attribute_was(source))
37
+ end
38
+
39
+ def to_s
40
+ name
41
+ end
42
+
43
+ private
44
+
45
+ def read_before_type_cast(object)
46
+ source == name ? object[source] : object.send(source)
47
+ end
48
+
49
+ def write_after_type_cast(object, value)
50
+ source == name ? object[source] = value : object.send("#{source}=", value)
51
+ value
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,11 @@
1
+ require 'simple_enum/accessors/accessor'
2
+
3
+ module SimpleEnum
4
+ module Accessors
5
+ class IgnoreAccessor < Accessor
6
+ def write(object, key)
7
+ super if !key || enum.include?(key)
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,12 @@
1
+ require 'simple_enum/accessors/accessor'
2
+
3
+ module SimpleEnum
4
+ module Accessors
5
+ class WhinyAccessor < Accessor
6
+ def write(object, key)
7
+ raise ArgumentError, "#{key} is not a valid enum value for #{enum}" if key && !enum.include?(key)
8
+ super
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,18 @@
1
+ require 'simple_enum/accessors/accessor'
2
+ require 'simple_enum/accessors/ignore_accessor'
3
+ require 'simple_enum/accessors/whiny_accessor'
4
+
5
+ module SimpleEnum
6
+ module Accessors
7
+ ACCESSORS = {
8
+ ignore: IgnoreAccessor,
9
+ whiny: WhinyAccessor
10
+ }
11
+
12
+ def self.accessor(name, enum, options = {})
13
+ access = options.fetch(:accessor, SimpleEnum.accessor)
14
+ klass = ACCESSORS[access] || Accessor
15
+ klass.new(name, enum, options[:source], options[:prefix])
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,77 @@
1
+ require 'active_support/core_ext/array'
2
+
3
+ require 'simple_enum/enum'
4
+ require 'simple_enum/hasher'
5
+ require 'simple_enum/accessors'
6
+
7
+ module SimpleEnum
8
+
9
+ # SimpleEnum::Attribute is the base class to be included in objects to get
10
+ # the #as_enum functionality. All the including class needs to provide is
11
+ # a setter and getter for `source`, by default the `source` is `<enum>_cd`.
12
+ # This is similar to how relations work in Rails, the idea is not taint the
13
+ # original method.
14
+ #
15
+ module Attribute
16
+ def as_enum(name, values, options = {})
17
+ options.assert_valid_keys(:source, :prefix, :with, :accessor, :map)
18
+
19
+ hash = SimpleEnum::Hasher.map(values, options)
20
+ enum = SimpleEnum::Enum.new(name, hash)
21
+ accessor = SimpleEnum::Accessors.accessor(name, enum, options)
22
+
23
+ generate_enum_class_accessors_for(enum, accessor)
24
+ generate_enum_instance_accessors_for(enum, accessor)
25
+
26
+ Array.wrap(options.fetch(:with, SimpleEnum.with)).each do |feature|
27
+ send "generate_enum_#{feature}_methods_for", enum, accessor
28
+ end
29
+
30
+ enum
31
+ end
32
+
33
+ private
34
+
35
+ def simple_enum_module
36
+ @simple_enum_module ||= Module.new.tap { |mod| include mod }
37
+ end
38
+
39
+ def generate_enum_class_accessors_for(enum, accessor)
40
+ name = accessor.name.pluralize
41
+ singleton_class.send(:define_method, name) { enum }
42
+ singleton_class.send(:define_method, "#{name}_accessor") { accessor }
43
+ end
44
+
45
+ def generate_enum_instance_accessors_for(enum, accessor)
46
+ simple_enum_module.module_eval do
47
+ define_method("#{accessor}") { accessor.read(self) }
48
+ define_method("#{accessor}=") { |value| accessor.write(self, value) }
49
+ end
50
+ end
51
+
52
+ def generate_enum_dirty_methods_for(enum, accessor)
53
+ simple_enum_module.module_eval do
54
+ define_method("#{accessor}_changed?") { accessor.changed?(self) }
55
+ define_method("#{accessor}_was") { accessor.was(self) }
56
+ end
57
+ end
58
+
59
+ def generate_enum_attribute_methods_for(enum, accessor)
60
+ simple_enum_module.module_eval do
61
+ define_method("#{accessor}?") { |value = nil| accessor.selected?(self, value) }
62
+ enum.each_pair do |key, value|
63
+ define_method("#{accessor.prefix}#{key}?") { accessor.selected?(self, key) }
64
+ define_method("#{accessor.prefix}#{key}!") { accessor.write(self, key) }
65
+ end
66
+ end
67
+ end
68
+
69
+ def generate_enum_scope_methods_for(enum, accessor)
70
+ return unless respond_to?(:scope)
71
+
72
+ enum.each_pair do |key, value|
73
+ scope "#{accessor.prefix}#{key}", -> { where(accessor.source => value) }
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,37 @@
1
+ require 'active_support/core_ext/string'
2
+
3
+ module SimpleEnum
4
+ class Enum
5
+ attr_reader :name, :hash
6
+
7
+ def initialize(name, hash)
8
+ @name = name.to_s
9
+ @hash = hash
10
+ end
11
+
12
+ def include?(key)
13
+ hash.key?(key.to_s) || hash.value?(key)
14
+ end
15
+
16
+ def key(value)
17
+ key = hash.key(value)
18
+ key.to_sym if key
19
+ end
20
+
21
+ def value(key)
22
+ value = hash[key.to_s]
23
+ value = key if hash.value?(key)
24
+ value
25
+ end
26
+ alias_method :[], :value
27
+
28
+ def each_pair(&block)
29
+ hash.each_pair(&block)
30
+ end
31
+ alias_method :each, :each_pair
32
+
33
+ def to_s
34
+ name
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,26 @@
1
+ module SimpleEnum
2
+ module Hasher
3
+ DefaultHasher = ->(values) {
4
+ Hash.new.tap do |enum_hash|
5
+ pairs = values.respond_to?(:each_pair) ? values.each_pair : values.each_with_index
6
+ pairs.each { |name, value| enum_hash[name.to_s] = value }
7
+ end
8
+ }
9
+
10
+ StringHasher = ->(values) {
11
+ Hash.new.tap do |enum_hash|
12
+ values.each { |name, *args| enum_hash[name.to_s] = name.to_s }
13
+ end
14
+ }
15
+
16
+ HASHERS = {
17
+ string: StringHasher
18
+ }
19
+
20
+ def self.map(values, options = {})
21
+ mapper = options.fetch(:map, SimpleEnum.builder)
22
+ mapper = HASHERS[mapper] || DefaultHasher unless mapper.respond_to?(:call)
23
+ mapper.call(values).freeze
24
+ end
25
+ end
26
+ end
@@ -23,29 +23,25 @@ module SimpleEnum
23
23
  # as_enum :gender, [:female, :male], :field => { :type => Integer }
24
24
  #
25
25
  module Mongoid
26
- extend ActiveSupport::Concern
27
-
28
- included do
29
- # create class level methods
30
- class_attribute :simple_enum_definitions, :instance_writer => false, :instance_reader => false
26
+ def self.included(base)
27
+ base.extend SimpleEnum::Attribute
28
+ base.extend SimpleEnum::Translation
29
+ base.extend SimpleEnum::Mongoid::ClassMethods
31
30
  end
32
31
 
33
32
  module ClassMethods
34
- include SimpleEnum::ClassMethods
35
-
36
33
  # Wrap method chain to create mongoid field and additional
37
34
  # column options
38
- def as_enum_with_mongoid(enum_cd, values, options = {})
39
- options = SimpleEnum.default_options.merge({ :column => "#{enum_cd}_cd" }).deep_merge(options)
40
-
41
- # forward custom field options
35
+ def as_enum(name, values, options = {})
36
+ source = options[:source].to_s.presence || "#{name}#{SimpleEnum.suffix}"
42
37
  field_options = options.delete(:field)
43
- field(options[:column], field_options.is_a?(Hash) ? field_options : {}) unless field_options === false
38
+ unless field_options === false
39
+ field_options ||= SimpleEnum.field
40
+ field(source, field_options) if field_options
41
+ end
44
42
 
45
- # call original as_enum method
46
- as_enum_without_mongoid(enum_cd, values, options)
43
+ super
47
44
  end
48
- alias_method_chain :as_enum, :mongoid
49
45
  end
50
46
  end
51
47
  end
@@ -0,0 +1,17 @@
1
+ module SimpleEnum
2
+ module Translation
3
+ def human_enum_name(enum, key, options = {})
4
+ defaults = lookup_ancestors.map do |klass|
5
+ :"#{self.i18n_scope}.enums.#{klass.model_name.i18n_key}.#{enum}.#{key}"
6
+ end
7
+
8
+ defaults << :"enums.#{self.model_name.i18n_key}.#{enum}.#{key}"
9
+ defaults << :"enums.#{enum}.#{key}"
10
+ defaults << options.delete(:default) if options[:default]
11
+ defaults << key.to_s.humanize
12
+
13
+ options.reverse_merge! :count => 1, :default => defaults
14
+ I18n.translate(defaults.shift, options)
15
+ end
16
+ end
17
+ end
@@ -1,5 +1,5 @@
1
1
  module SimpleEnum
2
2
 
3
- # +SimpleEnum+ version string.
4
- VERSION = "1.6.9"
3
+ # The current `SimpleEnum` version.
4
+ VERSION = "2.0.0.rc1"
5
5
  end