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>
|
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.
|
* lib/ostruct.rb: Add [] and []=, base on a patch by Thomas Sawyer.
|
||||||
|
|
|
@ -25,6 +25,19 @@ module Psych
|
||||||
# Default dumping options
|
# Default dumping options
|
||||||
OPTIONS = DumperOptions.new
|
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 with +encoding+ when the YAML stream starts. This method is
|
||||||
# called once per stream. A stream may contain multiple documents.
|
# 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