Skip to content

Commit

Permalink
* ext/psych/lib/psych/handlers/recorder.rb: added a class for
Browse files Browse the repository at this point in the history
  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.
  • Loading branch information
tenderlove committed Oct 29, 2012
1 parent 1f4812f commit c37649b
Show file tree
Hide file tree
Showing 4 changed files with 87 additions and 0 deletions.
10 changes: 10 additions & 0 deletions CHANGELOG.rdoc
Original file line number Diff line number Diff line change
@@ -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.

Sun Oct 28 10:12:15 2012 Aaron Patterson <aaron@tenderlovemaking.com>

* ext/psych/lib/psych/visitors/yaml_tree.rb: `tree` should return the
Expand Down
13 changes: 13 additions & 0 deletions lib/psych/handler.rb
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,19 @@ def initialize
# 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.
Expand Down
39 changes: 39 additions & 0 deletions lib/psych/handlers/recorder.rb
Original file line number Diff line number Diff line change
@@ -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 changes: 25 additions & 0 deletions test/psych/handlers/test_recorder.rb
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit c37649b

Please sign in to comment.