зеркало из https://github.com/github/ruby.git
* 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:
Родитель
87b248dc4d
Коммит
0f9307914b
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.
|
||||
|
|
|
@ -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
|
Загрузка…
Ссылка в новой задаче