From 4c0b83d24e7af673eed0f151666031ea0b864325 Mon Sep 17 00:00:00 2001 From: Mark Dodwell Date: Sun, 12 Sep 2010 23:23:51 -0700 Subject: [PATCH] add boolean_attr_accessor to Module core extensions --- .../lib/active_support/core_ext/module.rb | 1 + .../core_ext/module/boolean_attr_accessor.rb | 20 +++++++++++ .../core_ext/module/boolean_attr_accessor_test.rb | 34 ++++++++++++++++++++ 3 files changed, 55 insertions(+), 0 deletions(-) create mode 100644 activesupport/lib/active_support/core_ext/module/boolean_attr_accessor.rb create mode 100644 activesupport/test/core_ext/module/boolean_attr_accessor_test.rb diff --git a/activesupport/lib/active_support/core_ext/module.rb b/activesupport/lib/active_support/core_ext/module.rb index f59fcd1..1a4c687 100644 --- a/activesupport/lib/active_support/core_ext/module.rb +++ b/activesupport/lib/active_support/core_ext/module.rb @@ -5,6 +5,7 @@ require 'active_support/core_ext/module/reachable' require 'active_support/core_ext/module/attribute_accessors' require 'active_support/core_ext/module/attr_internal' require 'active_support/core_ext/module/attr_accessor_with_default' +require 'active_support/core_ext/module/boolean_attr_accessor' require 'active_support/core_ext/module/delegation' require 'active_support/core_ext/module/synchronization' require 'active_support/core_ext/module/deprecation' diff --git a/activesupport/lib/active_support/core_ext/module/boolean_attr_accessor.rb b/activesupport/lib/active_support/core_ext/module/boolean_attr_accessor.rb new file mode 100644 index 0000000..eb9e02d --- /dev/null +++ b/activesupport/lib/active_support/core_ext/module/boolean_attr_accessor.rb @@ -0,0 +1,20 @@ +class Module + + def boolean_attr_accessor(*names) + names.each do |name| + module_eval(<<-EVAL, __FILE__, __LINE__ + 1) + def #{name}=(v) + @#{name} = begin + v == true || + v.is_a?(String) && (v == "1" || v == "true") || + v.is_a?(Integer) && v == 1 + end + end + + attr_reader :#{name} + alias_method :#{name}?, :#{name} + EVAL + end + end + +end diff --git a/activesupport/test/core_ext/module/boolean_attr_accessor_test.rb b/activesupport/test/core_ext/module/boolean_attr_accessor_test.rb new file mode 100644 index 0000000..f72736b --- /dev/null +++ b/activesupport/test/core_ext/module/boolean_attr_accessor_test.rb @@ -0,0 +1,34 @@ +require "abstract_unit" +require "active_support/core_ext/module/boolean_attr_accessor" + +class BooleanAttrAccessorTest < Test::Unit::TestCase + def setup + @target = Class.new do + boolean_attr_accessor :foo + end + @instance = @target.new + end + + EXAMPLES = { + true => true, + false => false, + "true" => true, + "false" => false, + "0" => false, + "1" => true, + 0 => false, + 1 => true, + 3.142 => false, + Object.new => false, + [1,2,3] => false, + "blAh!" => false + } + + def test_boolean_examples + EXAMPLES.each do |input, expected| + @instance.foo = input + assert_equal expected, @instance.foo? + assert_equal expected, @instance.foo + end + end +end -- 1.7.1