[前][次][番号順一覧][スレッド一覧]

ruby-changes:4478

From: ko1@a...
Date: Fri, 11 Apr 2008 16:43:57 +0900 (JST)
Subject: [ruby-changes:4478] matz - Ruby:r15970 (trunk): * lib/yaml/store.rb (YAML::load): modified to support empty

matz	2008-04-11 16:43:31 +0900 (Fri, 11 Apr 2008)

  New Revision: 15970

  Added files:
    trunk/test/yaml/test_yamlstore.rb
  Modified files:
    trunk/ChangeLog
    trunk/lib/pstore.rb
    trunk/lib/yaml/store.rb

  Log:
    * lib/yaml/store.rb (YAML::load): modified to support empty
      database.

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/test/yaml/test_yamlstore.rb?revision=15970&view=markup
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=15970&r2=15969&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/lib/yaml/store.rb?r1=15970&r2=15969&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/lib/pstore.rb?r1=15970&r2=15969&diff_format=u

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 15969)
+++ ChangeLog	(revision 15970)
@@ -1,3 +1,8 @@
+Fri Apr 11 16:42:33 2008  Yukihiro Matsumoto  <matz@r...>
+
+	* lib/yaml/store.rb (YAML::load): modified to support empty
+	  database.
+
 Fri Apr 11 08:05:12 2008  Yukihiro Matsumoto  <matz@r...>
 
 	* marshal.c (w_object): add volatile to avoid potential GC bug.  a
Index: lib/pstore.rb
===================================================================
--- lib/pstore.rb	(revision 15969)
+++ lib/pstore.rb	(revision 15970)
@@ -413,8 +413,8 @@
       if data.empty?
         # This seems to be a newly-created file.
         table = {}
-        checksum = EMPTY_MARSHAL_CHECKSUM
-        size = EMPTY_MARSHAL_DATA.size
+        checksum = empty_marshal_checksum
+        size = empty_marshal_data.size
       else
         table = load(data)
         checksum = Digest::MD5.digest(data)
@@ -511,6 +511,13 @@
   def load(content)  # :nodoc:
     Marshal::load(content)
   end
+
+  def empty_marshal_data
+    EMPTY_MARSHAL_DATA
+  end
+  def empty_marshal_checksum
+    EMPTY_MARSHAL_CHECKSUM
+  end
 end
 
 # :enddoc:
Index: lib/yaml/store.rb
===================================================================
--- lib/yaml/store.rb	(revision 15969)
+++ lib/yaml/store.rb	(revision 15970)
@@ -20,10 +20,24 @@
   end
 
   def load(content)
-    YAML::load(content)
+    table = YAML::load(content)
+    if table == false
+      {}
+    else
+      table
+    end
   end
 
   def marshal_dump_supports_canonical_option?
     false
   end
+
+  EMPTY_MARSHAL_DATA = {}.to_yaml
+  EMPTY_MARSHAL_CHECKSUM = Digest::MD5.digest(EMPTY_MARSHAL_DATA)
+  def empty_marshal_data
+    EMPTY_MARSHAL_DATA
+  end
+  def empty_marshal_checksum
+    EMPTY_MARSHAL_CHECKSUM
+  end
 end
Index: test/yaml/test_yamlstore.rb
===================================================================
--- test/yaml/test_yamlstore.rb	(revision 0)
+++ test/yaml/test_yamlstore.rb	(revision 15970)
@@ -0,0 +1,74 @@
+require 'test/unit'
+require 'yaml/store'
+
+class YAMLStoreTest < Test::Unit::TestCase
+  def setup
+    @yamlstore_file = "yamlstore.tmp.#{Process.pid}"
+    @yamlstore = YAML::Store.new(@yamlstore_file)
+  end
+
+  def teardown
+    File.unlink(@yamlstore_file) rescue nil
+  end
+
+  def test_opening_new_file_in_readonly_mode_should_result_in_empty_values
+    @yamlstore.transaction(true) do
+      assert_nil @yamlstore[:foo]
+      assert_nil @yamlstore[:bar]
+    end
+  end
+  
+  def test_opening_new_file_in_readwrite_mode_should_result_in_empty_values
+    @yamlstore.transaction do
+      assert_nil @yamlstore[:foo]
+      assert_nil @yamlstore[:bar]
+    end
+  end
+  
+  def test_data_should_be_loaded_correctly_when_in_readonly_mode
+    @yamlstore.transaction do
+      @yamlstore[:foo] = "bar"
+    end
+    @yamlstore.transaction(true) do
+      assert_equal "bar", @yamlstore[:foo]
+    end
+  end
+  
+  def test_data_should_be_loaded_correctly_when_in_readwrite_mode
+    @yamlstore.transaction do
+      @yamlstore[:foo] = "bar"
+    end
+    @yamlstore.transaction do
+      assert_equal "bar", @yamlstore[:foo]
+    end
+  end
+  
+  def test_changes_after_commit_are_discarded
+    @yamlstore.transaction do
+      @yamlstore[:foo] = "bar"
+      @yamlstore.commit
+      @yamlstore[:foo] = "baz"
+    end
+    @yamlstore.transaction(true) do
+      assert_equal "bar", @yamlstore[:foo]
+    end
+  end
+  
+  def test_changes_are_not_written_on_abort
+    @yamlstore.transaction do
+      @yamlstore[:foo] = "bar"
+      @yamlstore.abort
+    end
+    @yamlstore.transaction(true) do
+      assert_nil @yamlstore[:foo]
+    end
+  end
+  
+  def test_writing_inside_readonly_transaction_raises_error
+    assert_raise(PStore::Error) do
+      @yamlstore.transaction(true) do
+        @yamlstore[:foo] = "bar"
+      end
+    end
+  end
+end

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]