* 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:
tenderlove 2012-10-29 01:23:54 +00:00
Родитель 87b248dc4d
Коммит 0f9307914b
4 изменённых файлов: 87 добавлений и 0 удалений

Просмотреть файл

@ -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.

Просмотреть файл

@ -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

Просмотреть файл

@ -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