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

ruby-changes:25326

From: tenderlove <ko1@a...>
Date: Mon, 29 Oct 2012 10:25:20 +0900 (JST)
Subject: [ruby-changes:25326] tenderlove:r37378 (trunk): * ext/psych/lib/psych/handlers/recorder.rb: added a class for

tenderlove	2012-10-29 10:23:54 +0900 (Mon, 29 Oct 2012)

  New Revision: 37378

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=37378

  Log:
    * ext/psych/lib/psych/handlers/recorder.rb: added a class for
      recording YAML parse and emit events.
    
    * ext/psych/lib/psych/handler.rb: adding a list of events so that
      handler classes can more easily be meta-programmed.
    
    * test/psych/handlers/test_recorder.rb: tests for the change.

  Added directories:
    trunk/test/psych/handlers/
  Added files:
    trunk/ext/psych/lib/psych/handlers/recorder.rb
    trunk/test/psych/handlers/test_recorder.rb
  Modified files:
    trunk/ChangeLog
    trunk/ext/psych/lib/psych/handler.rb

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 37377)
+++ ChangeLog	(revision 37378)
@@ -1,3 +1,13 @@
+Mon Oct 29 10:22:00 2012  Aaron Patterson <aaron@t...>
+
+	* ext/psych/lib/psych/handlers/recorder.rb: added a class for
+	  recording YAML parse and emit events.
+
+	* ext/psych/lib/psych/handler.rb: adding a list of events so that
+	  handler classes can more easily be meta-programmed.
+
+	* test/psych/handlers/test_recorder.rb: tests for the change.
+
 Mon Oct 29 05:48:52 2012  Marc-Andre Lafortune  <ruby-core@m...>
 
 	* lib/ostruct.rb: Add [] and []=, base on a patch by Thomas Sawyer.
Index: ext/psych/lib/psych/handler.rb
===================================================================
--- ext/psych/lib/psych/handler.rb	(revision 37377)
+++ ext/psych/lib/psych/handler.rb	(revision 37378)
@@ -25,6 +25,19 @@
     # Default dumping options
     OPTIONS = DumperOptions.new
 
+    # Events that a Handler should respond to.
+    EVENTS = [ :alias,
+               :empty,
+               :end_document,
+               :end_mapping,
+               :end_sequence,
+               :end_stream,
+               :scalar,
+               :start_document,
+               :start_mapping,
+               :start_sequence,
+               :start_stream ]
+
     ###
     # Called with +encoding+ when the YAML stream starts.  This method is
     # called once per stream.  A stream may contain multiple documents.
Index: ext/psych/lib/psych/handlers/recorder.rb
===================================================================
--- ext/psych/lib/psych/handlers/recorder.rb	(revision 0)
+++ ext/psych/lib/psych/handlers/recorder.rb	(revision 37378)
@@ -0,0 +1,39 @@
+require 'psych/handler'
+
+module Psych
+  module Handlers
+    ###
+    # This handler will capture an event and record the event.  Recorder events
+    # are available vial Psych::Handlers::Recorder#events.
+    #
+    # For example:
+    #
+    #   recorder = Psych::Handlers::Recorder.new
+    #   parser = Psych::Parser.new recorder
+    #   parser.parse '--- foo'
+    #
+    #   recorder.events # => [list of events]
+    #
+    #   # Replay the events
+    #
+    #   emitter = Psych::Emitter.new $stdout
+    #   recorder.events.each do |m, args|
+    #     emitter.send m, *args
+    #   end
+
+    class Recorder < Psych::Handler
+      attr_reader :events
+
+      def initialize
+        @events = []
+        super
+      end
+
+      EVENTS.each do |event|
+        define_method event do |*args|
+          @events << [event, args]
+        end
+      end
+    end
+  end
+end
Index: test/psych/handlers/test_recorder.rb
===================================================================
--- test/psych/handlers/test_recorder.rb	(revision 0)
+++ test/psych/handlers/test_recorder.rb	(revision 37378)
@@ -0,0 +1,25 @@
+require 'psych/helper'
+require 'psych/handlers/recorder'
+
+module Psych
+  module Handlers
+    class TestRecorder < TestCase
+      def test_replay
+        yaml   = "--- foo\n...\n"
+        output = StringIO.new
+
+        recorder = Psych::Handlers::Recorder.new
+        parser   = Psych::Parser.new recorder
+        parser.parse yaml
+
+        assert_equal 5, recorder.events.length
+
+        emitter = Psych::Emitter.new output
+        recorder.events.each do |m, args|
+          emitter.send m, *args
+        end
+        assert_equal yaml, output.string
+      end
+    end
+  end
+end

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

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