From a5af997ad3a7b3e80e5fe66d74beb12db3faa797 Mon Sep 17 00:00:00 2001 From: Emmanuel Gomez Date: Tue, 17 May 2011 12:45:49 -0700 Subject: [PATCH 1/4] Move Flags support module into DataMapper::Types::Support. --- lib/dm-types/enum.rb | 2 +- lib/dm-types/flag.rb | 2 +- lib/dm-types/support/flags.rb | 67 ++++++++++++++++++----------------- 3 files changed, 37 insertions(+), 34 deletions(-) diff --git a/lib/dm-types/enum.rb b/lib/dm-types/enum.rb index 3578ed4..5125c2c 100644 --- a/lib/dm-types/enum.rb +++ b/lib/dm-types/enum.rb @@ -5,7 +5,7 @@ module DataMapper class Property class Enum < Integer - include Flags + include Types::Support::Flags def initialize(model, name, options = {}) super diff --git a/lib/dm-types/flag.rb b/lib/dm-types/flag.rb index f9a24d5..43ce396 100644 --- a/lib/dm-types/flag.rb +++ b/lib/dm-types/flag.rb @@ -5,7 +5,7 @@ module DataMapper class Property class Flag < Integer - include Flags + include Types::Support::Flags def initialize(model, name, options = {}) super diff --git a/lib/dm-types/support/flags.rb b/lib/dm-types/support/flags.rb index 1599b85..6ed1b10 100644 --- a/lib/dm-types/support/flags.rb +++ b/lib/dm-types/support/flags.rb @@ -1,41 +1,44 @@ module DataMapper - class Property - module Flags - def self.included(base) - base.class_eval <<-RUBY, __FILE__, __LINE__ + 1 - extend DataMapper::Property::Flags::ClassMethods + module Types + module Support + module Flags + def self.included(base) + base.class_eval <<-RUBY, __FILE__, __LINE__ + 1 + extend DataMapper::Types::Support::Flags::ClassMethods - accept_options :flags - attr_reader :flag_map + accept_options :flags + attr_reader :flag_map - class << self - attr_accessor :generated_classes - end + class << self + attr_accessor :generated_classes + end - self.generated_classes = {} - RUBY - end + self.generated_classes = {} + RUBY + end - def custom? - true - end + def custom? + true + end - module ClassMethods - # TODO: document - # @api public - def [](*values) - if klass = generated_classes[values.flatten] - klass - else - klass = ::Class.new(self) - klass.flags(values) + module ClassMethods + # TODO: document + # @api public + def [](*values) + if klass = generated_classes[values.flatten] + klass + else + klass = ::Class.new(self) + klass.flags(values) - generated_classes[values.flatten] = klass + generated_classes[values.flatten] = klass - klass + klass + end end - end - end - end - end -end + end # module ClassMethods + + end # module Flags + end # module Support + end # module Types +end # module DataMapper From 5e378bfa69f2701c68746932414bcaa16fe6add8 Mon Sep 17 00:00:00 2001 From: Emmanuel Gomez Date: Tue, 17 May 2011 12:56:32 -0700 Subject: [PATCH 2/4] Remove unneeded ancestors check in Enum. This is in the Enum#initialize method, how could this test ever be false? In other words, how could any instance that doesn't inherit from Property::Enum execute the Property::Enum#initialize method? --- lib/dm-types/enum.rb | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/lib/dm-types/enum.rb b/lib/dm-types/enum.rb index 5125c2c..973a4be 100644 --- a/lib/dm-types/enum.rb +++ b/lib/dm-types/enum.rb @@ -19,10 +19,8 @@ def initialize(model, name, options = {}) if defined?(::DataMapper::Validations) unless model.skip_auto_validation_for?(self) - if self.class.ancestors.include?(Property::Enum) - allowed = flag_map.values_at(*flag_map.keys.sort) - model.validates_within name, model.options_with_message({ :set => allowed }, self, :within) - end + allowed = flag_map.values_at(*flag_map.keys.sort) + model.validates_within name, model.options_with_message({ :set => allowed }, self, :within) end end end From 094ec321801fcdef2b3fa3061ad30f33af95f2dd Mon Sep 17 00:00:00 2001 From: Emmanuel Gomez Date: Tue, 17 May 2011 12:50:56 -0700 Subject: [PATCH 3/4] Replace class_eval with method calls in Support::Flags.included. --- lib/dm-types/support/flags.rb | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/lib/dm-types/support/flags.rb b/lib/dm-types/support/flags.rb index 6ed1b10..d912d87 100644 --- a/lib/dm-types/support/flags.rb +++ b/lib/dm-types/support/flags.rb @@ -2,19 +2,15 @@ module DataMapper module Types module Support module Flags - def self.included(base) - base.class_eval <<-RUBY, __FILE__, __LINE__ + 1 - extend DataMapper::Types::Support::Flags::ClassMethods - - accept_options :flags - attr_reader :flag_map - - class << self - attr_accessor :generated_classes - end - - self.generated_classes = {} - RUBY + def self.included(model) + model.extend ClassMethods + model.accept_options :flags + model.__send__ :attr_reader, :flag_map + model.instance_variable_set(:@generated_classes, {}) + + class << model + attr_accessor :generated_classes + end end def custom? From e7c3016b13b60003bf42a28099ed528dce91467b Mon Sep 17 00:00:00 2001 From: Emmanuel Gomez Date: Tue, 17 May 2011 12:53:27 -0700 Subject: [PATCH 4/4] Replace class_eval with method calls in ParanoidBoolean & ParanoidDateTime. --- lib/dm-types/paranoid_boolean.rb | 13 +++++-------- lib/dm-types/paranoid_datetime.rb | 13 +++++-------- 2 files changed, 10 insertions(+), 16 deletions(-) diff --git a/lib/dm-types/paranoid_boolean.rb b/lib/dm-types/paranoid_boolean.rb index b03364e..6c6d4e1 100644 --- a/lib/dm-types/paranoid_boolean.rb +++ b/lib/dm-types/paranoid_boolean.rb @@ -8,15 +8,12 @@ class ParanoidBoolean < Boolean # @api private def bind - property_name = name.inspect + unless model < DataMapper::Types::Paranoid::Base + model.__send__ :include, DataMapper::Types::Paranoid::Base + end - model.class_eval <<-RUBY, __FILE__, __LINE__ + 1 - include DataMapper::Types::Paranoid::Base - - set_paranoid_property(#{property_name}) { true } - - default_scope(#{repository_name.inspect}).update(#{property_name} => false) - RUBY + model.set_paranoid_property(name) { true } + model.default_scope(repository_name).update(name => false) end end # class ParanoidBoolean end # module Property diff --git a/lib/dm-types/paranoid_datetime.rb b/lib/dm-types/paranoid_datetime.rb index e70dafe..6fa0711 100644 --- a/lib/dm-types/paranoid_datetime.rb +++ b/lib/dm-types/paranoid_datetime.rb @@ -7,15 +7,12 @@ class ParanoidDateTime < DateTime # @api private def bind - property_name = name.inspect + unless model < DataMapper::Types::Paranoid::Base + model.__send__ :include, DataMapper::Types::Paranoid::Base + end - model.class_eval <<-RUBY, __FILE__, __LINE__ + 1 - include DataMapper::Types::Paranoid::Base - - set_paranoid_property(#{property_name}) { ::DateTime.now } - - default_scope(#{repository_name.inspect}).update(#{property_name} => nil) - RUBY + model.set_paranoid_property(name) { ::DateTime.now } + model.default_scope(repository_name).update(name => nil) end end # class ParanoidDateTime end # module Property