diff options
author | tenderlove <tenderlove@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-10-29 01:23:54 +0000 |
---|---|---|
committer | tenderlove <tenderlove@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-10-29 01:23:54 +0000 |
commit | 0f9307914b08a60102d29cee2260358bd2aaac75 (patch) | |
tree | a1a95d6ff3d4be580f98b6ada33c33c154c11b57 /ext/psych | |
parent | 87b248dc4d4bed790fc402756993d64962ed8595 (diff) |
* 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
Diffstat (limited to 'ext/psych')
-rw-r--r-- | ext/psych/lib/psych/handler.rb | 13 | ||||
-rw-r--r-- | ext/psych/lib/psych/handlers/recorder.rb | 39 |
2 files changed, 52 insertions, 0 deletions
diff --git a/ext/psych/lib/psych/handler.rb b/ext/psych/lib/psych/handler.rb index d3b99636c4..c55afe745f 100644 --- a/ext/psych/lib/psych/handler.rb +++ b/ext/psych/lib/psych/handler.rb @@ -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. diff --git a/ext/psych/lib/psych/handlers/recorder.rb b/ext/psych/lib/psych/handlers/recorder.rb new file mode 100644 index 0000000000..4eae62e5f9 --- /dev/null +++ b/ext/psych/lib/psych/handlers/recorder.rb @@ -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 |