Skip to content

Commit

Permalink
Refactorrrrrrrrrrrrr
Browse files Browse the repository at this point in the history
  • Loading branch information
caedes committed Jun 7, 2013
1 parent bd5e1b2 commit fc63ef0
Show file tree
Hide file tree
Showing 3 changed files with 102 additions and 98 deletions.
2 changes: 2 additions & 0 deletions act_as_enumerable.gemspec
Expand Up @@ -13,6 +13,8 @@ Gem::Specification.new do |s|

s.require_path = 'lib'

s.add_dependency 'activesupport', '~> 3.2'

s.add_development_dependency 'rake'
s.add_development_dependency 'rspec', '~> 2.13'
s.add_development_dependency 'coveralls', '~> 0.6'
Expand Down
97 changes: 52 additions & 45 deletions lib/act_as_enumerable/base.rb
@@ -1,52 +1,59 @@
unless String.methods.include? 'underscore'
class String
def underscore
self.gsub(/::/, '/').
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
gsub(/([a-z\d])([A-Z])/,'\1_\2').
tr("-", "_").
downcase
require 'active_support/core_ext/string'

module ActAsEnumerable

def self.included(base)
base.define_singleton_method(:enum) do |name, enumeration|
ActAsEnumerable.enum_method base, name, enumeration
end
end
end

class Object
def self.enum name, enumeration
name = name.to_s
class_eval "
attr_accessor :#{name}
def self.#{name}_values
#{enumeration}
end
def self.#{name}_captions
#{enumeration}.map do |value|
humanize_#{name} value
end
end"
enumeration.each do |value|
value = value.to_s
eval "
def #{value}?
self.#{name} == '#{value}'
end
def #{value}!
self.#{name} = '#{value}'
end"
protected

def self.enum_method(base, name, enumeration)
ActAsEnumerable.enum_getter_method base, name, enumeration
end

def self.enum_getter_method(base, name, enumeration)
base.define_singleton_method("#{name}_values") do
enumeration
end
eval "
def humanize_#{name} value
value = value.to_s
begin
Required::Module::const_get 'I18n'
::I18n.t \"enum.#{self.to_s.underscore}.#{name}.#{'#{value}'}\"
rescue NameError
value
end
base.define_singleton_method("#{name}_captions") do
enumeration.map do |value|
value.to_s.humanize
end
def #{name}_caption
self.#{name}.nil? ? self.#{name} : humanize_#{name}(self.#{name})
end"

# validates_inclusion_of name.to_sym, { allow_nil: true, in: enumeration } if self.ancestors.include? 'ActiveRecord::Base'
end
end
end

# class Object
# def self.enum name, enumeration
# name = name.to_s

# enumeration.each do |value|
# value = value.to_s
# eval "
# def #{value}?
# self.#{name} == '#{value}'
# end
# def #{value}!
# self.#{name} = '#{value}'
# end"
# end
# eval "
# def humanize_#{name} value
# value = value.to_s
# begin
# Required::Module::const_get 'I18n'
# ::I18n.t \"enum.#{self.to_s.underscore}.#{name}.#{'#{value}'}\"
# rescue NameError
# value
# end
# end
# def #{name}_caption
# self.#{name}.nil? ? self.#{name} : humanize_#{name}(self.#{name})
# end"

# # validates_inclusion_of name.to_sym, { allow_nil: true, in: enumeration } if self.ancestors.include? 'ActiveRecord::Base'
# end
# end
101 changes: 48 additions & 53 deletions spec/lib/act_as_enumerable_spec.rb
@@ -1,15 +1,10 @@
require_relative '../spec_helper'

class EmptyTestModel
end
class GenderTestModel
include ActAsEnumerable

describe EmptyTestModel do
it 'defines enum class method' do
EmptyTestModel.singleton_methods.should include(:enum)
end
end
attr_accessor :gender

class GenderTestModel
enum :gender, %w(male female)
end

Expand All @@ -24,65 +19,65 @@ class GenderTestModel

it 'defines gender_caption class method' do
GenderTestModel.singleton_methods.should include(:gender_captions)
GenderTestModel.gender_captions.should == %w(male female)
GenderTestModel.gender_captions.should == %w(Male Female)
end

it 'defines humanize_gender instance method' do
subject.methods.should include(:humanize_gender)
%w(male female).each do |value|
%w(Male Female).each do |value|
subject.humanize_gender(value.to_sym).should == value
end
end

describe 'without setting :gender' do
it 'defines gender_caption instance method' do
subject.methods.should include(:gender_caption)
subject.gender_caption.should be_nil
end
# describe 'without setting :gender' do
# it 'defines gender_caption instance method' do
# subject.methods.should include(:gender_caption)
# subject.gender_caption.should be_nil
# end

%w(male female).each do |value|
it "defines #{value}? instance method" do
subject.methods.should include("#{value}?".to_sym)
end
end
# %w(male female).each do |value|
# it "defines #{value}? instance method" do
# subject.methods.should include("#{value}?".to_sym)
# end
# end

%w(male female).each do |value|
describe "#{value}?" do
it 'returns false' do
subject.send("#{value}?".to_sym).should be_false
end
end
end
end
# %w(male female).each do |value|
# describe "#{value}?" do
# it 'returns false' do
# subject.send("#{value}?".to_sym).should be_false
# end
# end
# end
# end

describe 'with setting :gender' do
before do
@gender_value = 'male'
subject.gender = @gender_value
end
# describe 'with setting :gender' do
# before do
# @gender_value = 'male'
# subject.gender = @gender_value
# end

it 'defines gender_caption instance method' do
subject.methods.should include(:gender_caption)
subject.gender_caption.should == 'male'
end
# it 'defines gender_caption instance method' do
# subject.methods.should include(:gender_caption)
# subject.gender_caption.should == 'male'
# end

%w(male female).each do |value|
it "defines #{value}? instance method" do
subject.methods.should include("#{value}?".to_sym)
end
end
# %w(male female).each do |value|
# it "defines #{value}? instance method" do
# subject.methods.should include("#{value}?".to_sym)
# end
# end

describe 'male?' do
it 'returns true' do
subject.male?.should be_true
end
end
# describe 'male?' do
# it 'returns true' do
# subject.male?.should be_true
# end
# end

describe 'female?' do
it 'returns false' do
subject.female?.should be_false
end
end
end
# describe 'female?' do
# it 'returns false' do
# subject.female?.should be_false
# end
# end
# end
end
end

0 comments on commit fc63ef0

Please sign in to comment.