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/