Merge pull request #5 from thetron/update/cleanup

Quest for the 4.0 GPA
This commit is contained in:
Nicholas Bruning 2014-03-18 00:08:59 +11:00
commit 8b5b23bb45
3 changed files with 55 additions and 22 deletions

View File

@ -1,14 +1,15 @@
script: "bundle exec rspec spec"
language: ruby
rvm:
- 1.9.3
- 2.0.0
- 2.1.1
- jruby-19mode
- rbx-19mode
gemfile:
- Gemfile
notifications:
recipients:
- nicholas@bruning.com.au
services:
- mongodb

View File

@ -2,6 +2,7 @@
[![Build
Status](https://travis-ci.org/thetron/mongoid-enum.png)](https://travis-ci.org/thetron/mongoid-enum)
[![Code Climate](https://codeclimate.com/github/thetron/mongoid-enum.png)](https://codeclimate.com/github/thetron/mongoid-enum)
Heavily inspired by [DHH's
ActiveRecord::Enum](https://github.com/rails/rails/commit/db41eb8a6ea88b854bf5cd11070ea4245e1639c5), this little library is

View File

@ -5,38 +5,69 @@ module Mongoid
module Enum
extend ActiveSupport::Concern
module ClassMethods
def enum(name, values, options = {})
field_name = :"_#{name}"
const_name = name.to_s.upcase
multiple = options[:multiple] || false
default = options[:default].nil? && values.first || options[:default]
required = options[:required].nil? || options[:required]
validate = options[:validate].nil? || options[:validate]
options = default_options(values).merge(options)
const_set const_name, values
set_values_constant name, values
type = multiple && Array || Symbol
field field_name, :type => type, :default => default
create_field field_name, options
alias_attribute name, field_name
if multiple && validate
validates field_name, :'mongoid/enum/validators/multiple' => { :in => values, :allow_nil => !required }
elsif validate
validates field_name, :inclusion => {:in => values}, :allow_nil => !required
end
create_validations field_name, values, options
define_value_scopes_and_accessors field_name, values, options
end
private
def default_options(values)
{
:multiple => false,
:default => values.first,
:required => true,
:validate => true
}
end
def set_values_constant(name, values)
const_name = name.to_s.upcase
const_set const_name, values
end
def create_field(field_name, options)
type = options[:multiple] && Array || Symbol
field field_name, :type => type, :default => options[:default]
end
def create_validations(field_name, values, options)
if options[:multiple] && options[:validate]
validates field_name, :'mongoid/enum/validators/multiple' => { :in => values, :allow_nil => !options[:required] }
elsif validate
validates field_name, :inclusion => {:in => values}, :allow_nil => !options[:required]
end
end
def define_value_scopes_and_accessors(field_name, values, options)
values.each do |value|
scope value, where(field_name => value)
if multiple
class_eval "def #{value}?() self.#{field_name}.include?(:#{value}) end"
class_eval "def #{value}!() update_attributes! :#{field_name} => (self.#{field_name} || []) + [:#{value}] end"
if options[:multiple]
define_array_accessor(field_name, value)
else
class_eval "def #{value}?() self.#{field_name} == :#{value} end"
class_eval "def #{value}!() update_attributes! :#{field_name} => :#{value} end"
define_string_accessor(field_name, value)
end
end
end
def define_array_accessor(field_name, value)
class_eval "def #{value}?() self.#{field_name}.include?(:#{value}) end"
class_eval "def #{value}!() update_attributes! :#{field_name} => (self.#{field_name} || []) + [:#{value}] end"
end
def define_string_accessor(field_name, value)
class_eval "def #{value}?() self.#{field_name} == :#{value} end"
class_eval "def #{value}!() update_attributes! :#{field_name} => :#{value} end"
end
end
end
end