summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAaron Patterson <aaron.patterson@gmail.com>2009-09-28 20:53:06 -0700
committerAaron Patterson <aaron.patterson@gmail.com>2009-09-28 20:53:06 -0700
commit780b789a2fb985ac8ae24eab21eb939293524542 (patch)
tree4eb755e1731e8773edf521fd3f5175aff15048a1
parentb8e82a04568ec154154af68614f077d7a754bf8a (diff)
downloadpsych-780b789a2fb985ac8ae24eab21eb939293524542.zip
adding emitter codes
-rw-r--r--ext/psych/emitter.c59
-rw-r--r--lib/psych/visitors/emitter.rb6
-rw-r--r--test/visitors/test_emitter.rb26
3 files changed, 91 insertions, 0 deletions
diff --git a/ext/psych/emitter.c b/ext/psych/emitter.c
index c48a8b5..1199a31 100644
--- a/ext/psych/emitter.c
+++ b/ext/psych/emitter.c
@@ -40,6 +40,62 @@ static VALUE start_stream(VALUE self, VALUE encoding)
yaml_event_t event;
yaml_stream_start_event_initialize(&event, NUM2INT(encoding));
+ yaml_emitter_emit(emitter, &event);
+ return self;
+}
+
+static VALUE end_stream(VALUE self)
+{
+ yaml_emitter_t * emitter;
+ Data_Get_Struct(self, yaml_emitter_t, emitter);
+
+ yaml_event_t event;
+ yaml_stream_end_event_initialize(&event);
+ yaml_emitter_emit(emitter, &event);
+ return self;
+}
+
+static VALUE start_document(VALUE self, VALUE version, VALUE tags, VALUE imp)
+{
+ yaml_emitter_t * emitter;
+ Data_Get_Struct(self, yaml_emitter_t, emitter);
+
+ yaml_version_directive_t version_directive;
+
+ if(RARRAY_LEN(version) > 0) {
+ VALUE major = rb_ary_entry(version, 0);
+ VALUE minor = rb_ary_entry(version, 1);
+
+ version_directive.major = NUM2INT(major);
+ version_directive.minor = NUM2INT(minor);
+ }
+
+ yaml_event_t event;
+ yaml_document_start_event_initialize(
+ &event,
+ &version_directive,
+ NULL,
+ NULL,
+ imp == Qtrue ? 1 : 0
+ );
+
+ yaml_emitter_emit(emitter, &event);
+
+ return self;
+}
+
+static VALUE end_document(VALUE self, VALUE imp)
+{
+ yaml_emitter_t * emitter;
+ Data_Get_Struct(self, yaml_emitter_t, emitter);
+
+ yaml_version_directive_t version_directive;
+
+ yaml_event_t event;
+ yaml_document_end_event_initialize(&event, imp == Qtrue ? 1 : 0);
+
+ yaml_emitter_emit(emitter, &event);
+
return self;
}
@@ -53,4 +109,7 @@ void Init_psych_emitter()
rb_define_method(cPsychEmitter, "initialize", initialize, 1);
rb_define_method(cPsychEmitter, "start_stream", start_stream, 1);
+ rb_define_method(cPsychEmitter, "end_stream", end_stream, 0);
+ rb_define_method(cPsychEmitter, "start_document", start_document, 3);
+ rb_define_method(cPsychEmitter, "end_document", end_document, 1);
}
diff --git a/lib/psych/visitors/emitter.rb b/lib/psych/visitors/emitter.rb
index ff3832b..d71ce2a 100644
--- a/lib/psych/visitors/emitter.rb
+++ b/lib/psych/visitors/emitter.rb
@@ -10,6 +10,12 @@ module Psych
o.children.each { |c| c.accept self }
@handler.end_stream
end
+
+ visitor_for(Nodes::Document) do |o|
+ @handler.start_document o.version, o.tag_directives, o.implicit
+ o.children.each { |c| c.accept self }
+ @handler.end_document o.implicit
+ end
end
end
end
diff --git a/test/visitors/test_emitter.rb b/test/visitors/test_emitter.rb
new file mode 100644
index 0000000..a6b8f25
--- /dev/null
+++ b/test/visitors/test_emitter.rb
@@ -0,0 +1,26 @@
+require 'minitest/autorun'
+require 'psych'
+
+module Psych
+ module Visitors
+ class TestEmitter < MiniTest::Unit::TestCase
+ def setup
+ @io = StringIO.new
+ @visitor = Visitors::Emitter.new @io
+ end
+
+ def test_stream
+ s = Nodes::Stream.new
+ @visitor.accept s
+ assert_equal '', @io.string
+ end
+
+ def test_document
+ s = Nodes::Stream.new
+ s.children << Nodes::Document.new([1,1])
+ @visitor.accept s
+ assert_equal '', @io.string
+ end
+ end
+ end
+end