1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* ext/psych/lib/psych/parser.rb (Mark): Adding a class to wrap

marker information
* ext/psych/parser.c (mark): Add a method to return the mark object
  for the parser
* test/psych/test_parser.rb: tests for the Mark class.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@30588 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
tenderlove 2011-01-17 19:44:31 +00:00
parent eacee9d95f
commit 0b38e9bc9d
4 changed files with 93 additions and 3 deletions

View file

@ -1,3 +1,13 @@
Tue Jan 18 04:42:44 2011 Aaron Patterson <aaron@tenderlovemaking.com>
* ext/psych/lib/psych/parser.rb (Mark): Adding a class to wrap
marker information
* ext/psych/parser.c (mark): Add a method to return the mark object
for the parser
* test/psych/test_parser.rb: tests for the Mark class.
Tue Jan 18 02:46:55 2011 Aaron Patterson <aaron@tenderlovemaking.com>
* ext/psych/lib/psych/visitors/json_tree.rb (visit_String): JSON

View file

@ -30,6 +30,9 @@ module Psych
# construct an AST of the parsed YAML document.
class Parser
class Mark < Struct.new(:index, :line, :column)
end
# The handler on which events will be called
attr_accessor :handler

View file

@ -307,6 +307,28 @@ static VALUE set_external_encoding(VALUE self, VALUE encoding)
return encoding;
}
/*
* call-seq:
* parser.mark # => #<Psych::Parser::Mark>
*
* Returns a Psych::Parser::Mark object that contains line, column, and index
* information.
*/
static VALUE mark(VALUE self)
{
VALUE mark_klass;
VALUE args[3];
yaml_parser_t * parser;
Data_Get_Struct(self, yaml_parser_t, parser);
mark_klass = rb_const_get_at(cPsychParser, rb_intern("Mark"));
args[0] = INT2NUM(parser->mark.index);
args[1] = INT2NUM(parser->mark.line);
args[2] = INT2NUM(parser->mark.column);
return rb_class_new_instance(3, args, mark_klass);
}
void Init_psych_parser()
{
#if 0
@ -331,6 +353,7 @@ void Init_psych_parser()
ePsychSyntaxError = rb_define_class_under(mPsych, "SyntaxError", rb_eSyntaxError);
rb_define_method(cPsychParser, "parse", parse, 1);
rb_define_method(cPsychParser, "mark", mark, 0);
rb_define_method(cPsychParser, "external_encoding=", set_external_encoding, 1);
id_read = rb_intern("read");

View file

@ -5,9 +5,12 @@ require_relative 'helper'
module Psych
class TestParser < TestCase
class EventCatcher < Handler
attr_reader :calls
attr_accessor :parser
attr_reader :calls, :marks
def initialize
@calls = []
@parser = nil
@calls = []
@marks = []
end
(Handler.instance_methods(true) -
@ -15,6 +18,7 @@ module Psych
class_eval %{
def #{m} *args
super
@marks << @parser.mark if @parser
@calls << [:#{m}, args]
end
}
@ -23,7 +27,57 @@ module Psych
def setup
super
@parser = Psych::Parser.new EventCatcher.new
@handler = EventCatcher.new
@parser = Psych::Parser.new @handler
@handler.parser = @parser
end
def test_line_numbers
assert_equal 0, @parser.mark.line
@parser.parse "---\n- hello\n- world"
line_calls = @handler.marks.map(&:line).zip(@handler.calls.map(&:first))
assert_equal [[0, :start_stream],
[0, :start_document],
[1, :start_sequence],
[2, :scalar],
[3, :scalar],
[3, :end_sequence],
[3, :end_document],
[3, :end_stream]], line_calls
assert_equal 3, @parser.mark.line
end
def test_column_numbers
assert_equal 0, @parser.mark.column
@parser.parse "---\n- hello\n- world"
col_calls = @handler.marks.map(&:column).zip(@handler.calls.map(&:first))
assert_equal [[0, :start_stream],
[3, :start_document],
[1, :start_sequence],
[0, :scalar],
[0, :scalar],
[0, :end_sequence],
[0, :end_document],
[0, :end_stream]], col_calls
assert_equal 0, @parser.mark.column
end
def test_index_numbers
assert_equal 0, @parser.mark.index
@parser.parse "---\n- hello\n- world"
idx_calls = @handler.marks.map(&:index).zip(@handler.calls.map(&:first))
assert_equal [[0, :start_stream],
[3, :start_document],
[5, :start_sequence],
[12, :scalar],
[19, :scalar],
[19, :end_sequence],
[19, :end_document],
[19, :end_stream]], idx_calls
assert_equal 19, @parser.mark.index
end
def test_set_encoding_twice