Browse Source

typen der DB für Null-Objekt übernehmen

hmt 10 years ago
parent
commit
a94775aec2
3 changed files with 30 additions and 9 deletions
  1. 10 4
      lib/schild.rb
  2. 1 1
      lib/schild/version.rb
  3. 19 4
      specs/type_safe_spec.rb

+ 10 - 4
lib/schild.rb

@@ -1,6 +1,7 @@
 require 'schild/version'
 require 'sequel'
 
+# erst Ruby 2.1.0 macht include zu einer public-Methode
 if Module.private_method_defined? :include
   class Module
     public :include
@@ -36,13 +37,18 @@ module SchildTypeSaver
   def self.included(klass)
     klass.columns.each do  |column|
       name = column.snake_case
-      define_method(name) { public_send(column) || Null.new("")}
+      define_method(name) { public_send(column) || create_null_object(klass, column)}
     end
   end
 
-  class Null < String
-    def strftime(args)
-      Time.new("1899").strftime(args)
+  def create_null_object(klass, column)
+    k = DB.schema_type_class(klass.db_schema[column][:type])
+    if k.class == Array
+      # Sequel stellt :datetime als [Time, DateTime] dar
+      DateTime.new(1899)
+    else
+      # alle anderen types werden als Klasse zurückgegeben
+      k.new
     end
   end
 end

+ 1 - 1
lib/schild/version.rb

@@ -1,3 +1,3 @@
 module Schild
-  VERSION = "0.3.1"
+  VERSION = "0.3.2"
 end

+ 19 - 4
specs/type_safe_spec.rb

@@ -1,12 +1,27 @@
 require "#{File.dirname(__FILE__)}/spec_helper"
 
 describe Schueler do
-  describe 'typen sicherheit von objekten' do
-  before do
-    # lade einen Standardschueler
-    @sm = Schueler.where(:Status => 2, :Geloescht => "-", :Gesperrt => "-").first
+  describe 'null-Objekte passen sich den DB-Typen an' do
+    before do
+      # lade einen Standardschueler
+      @sm = Schueler.where(:Status => 2, :Geloescht => "-", :Gesperrt => "-").first
+    end
+
+    it 'gibt ein DateTime bei Daten zurück' do
+      @sm.geburtsdatum.must_be_instance_of DateTime
+    end
+
+    it 'gibt String für Text zurück' do
+      @sm.bemerkungen.must_be_instance_of String
+    end
   end
 
+  describe 'null-Objekte geben immer etwas zurück' do
+    before do
+      # lade einen Standardschueler
+      @sm = Schueler.where(:Status => 2, :Geloescht => "-", :Gesperrt => "-").first
+    end
+
     it 'gibt nil zurück, wenn leer' do
       @sm.Bemerkungen.must_equal nil
     end