mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	* 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. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37378 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
		
							parent
							
								
									87b248dc4d
								
							
						
					
					
						commit
						0f9307914b
					
				
					 4 changed files with 87 additions and 0 deletions
				
			
		
							
								
								
									
										10
									
								
								ChangeLog
									
										
									
									
									
								
							
							
						
						
									
										10
									
								
								ChangeLog
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -1,3 +1,13 @@
 | 
			
		|||
Mon Oct 29 10:22:00 2012  Aaron Patterson <aaron@tenderlovemaking.com>
 | 
			
		||||
 | 
			
		||||
	* 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@marc-andre.ca>
 | 
			
		||||
 | 
			
		||||
	* lib/ostruct.rb: Add [] and []=, base on a patch by Thomas Sawyer.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -25,6 +25,19 @@ module Psych
 | 
			
		|||
    # 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.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										39
									
								
								ext/psych/lib/psych/handlers/recorder.rb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								ext/psych/lib/psych/handlers/recorder.rb
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -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
 | 
			
		||||
							
								
								
									
										25
									
								
								test/psych/handlers/test_recorder.rb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								test/psych/handlers/test_recorder.rb
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -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
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue