Skip to content

Commit

Permalink
* ext/psych/emitter.c (initialize): allow a configuration object to be
Browse files Browse the repository at this point in the history
  passed to the constructor so that mutation isn't required after
  instantiation.

* ext/psych/lib/psych/handler.rb: add configuration object

* ext/psych/lib/psych/visitors/emitter.rb: use configuration object if
  extra configuration is present.
  • Loading branch information
tenderlove committed Jul 19, 2012
1 parent 2e7bdb3 commit e82cf03
Show file tree
Hide file tree
Showing 4 changed files with 62 additions and 8 deletions.
11 changes: 11 additions & 0 deletions CHANGELOG.rdoc
@@ -1,3 +1,14 @@
Thu Jul 19 09:33:46 2012 Aaron Patterson <aaron@tenderlovemaking.com>

* ext/psych/emitter.c (initialize): allow a configuration object to be
passed to the constructor so that mutation isn't required after
instantiation.

* ext/psych/lib/psych/handler.rb: add configuration object

* ext/psych/lib/psych/visitors/emitter.rb: use configuration object if
extra configuration is present.

Fri May 18 01:28:21 2012 Aaron Patterson <aaron@tenderlovemaking.com>

* ext/psych/parser.c (transcode_string): fix encoding index names.
Expand Down
29 changes: 25 additions & 4 deletions ext/psych/emitter.c
Expand Up @@ -2,6 +2,9 @@

VALUE cPsychEmitter;
static ID id_write;
static ID id_line_width;
static ID id_indentation;
static ID id_canonical;

static void emit(yaml_emitter_t * emitter, yaml_event_t * event)
{
Expand Down Expand Up @@ -39,15 +42,30 @@ static VALUE allocate(VALUE klass)
return Data_Wrap_Struct(klass, 0, dealloc, emitter);
}

/* call-seq: Psych::Emitter.new(io)
/* call-seq: Psych::Emitter.new(io, options = Psych::Emitter::OPTIONS)
*
* Create a new Psych::Emitter that writes to +io+.
*/
static VALUE initialize(VALUE self, VALUE io)
static VALUE initialize(int argc, VALUE *argv, VALUE self)
{
yaml_emitter_t * emitter;
VALUE io, options;
VALUE line_width;
VALUE indent;
VALUE canonical;

Data_Get_Struct(self, yaml_emitter_t, emitter);

if (rb_scan_args(argc, argv, "11", &io, &options) == 2) {
line_width = rb_funcall(options, id_line_width, 0);
indent = rb_funcall(options, id_indentation, 0);
canonical = rb_funcall(options, id_canonical, 0);

yaml_emitter_set_width(emitter, NUM2INT(line_width));
yaml_emitter_set_indent(emitter, NUM2INT(indent));
yaml_emitter_set_canonical(emitter, Qtrue == canonical ? 1 : 0);
}

yaml_emitter_set_output(emitter, writer, (void *)io);

return self;
Expand Down Expand Up @@ -494,7 +512,7 @@ void Init_psych_emitter()

rb_define_alloc_func(cPsychEmitter, allocate);

rb_define_method(cPsychEmitter, "initialize", initialize, 1);
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);
Expand All @@ -512,6 +530,9 @@ void Init_psych_emitter()
rb_define_method(cPsychEmitter, "line_width", line_width, 0);
rb_define_method(cPsychEmitter, "line_width=", set_line_width, 1);

id_write = rb_intern("write");
id_write = rb_intern("write");
id_line_width = rb_intern("line_width");
id_indentation = rb_intern("indentation");
id_canonical = rb_intern("canonical");
}
/* vim: set noet sws=4 sw=4: */
15 changes: 15 additions & 0 deletions lib/psych/handler.rb
Expand Up @@ -10,6 +10,21 @@ module Psych
#
# See Psych::Parser for more details
class Handler
###
# Configuration options for dumping YAML.
class DumperOptions
attr_accessor :line_width, :indentation, :canonical

def initialize
@line_width = 0
@indentation = 2
@canonical = false
end
end

# Default dumping options
OPTIONS = DumperOptions.new

###
# Called with +encoding+ when the YAML stream starts. This method is
# called once per stream. A stream may contain multiple documents.
Expand Down
15 changes: 11 additions & 4 deletions lib/psych/visitors/emitter.rb
Expand Up @@ -2,10 +2,17 @@ module Psych
module Visitors
class Emitter < Psych::Visitors::Visitor
def initialize io, options = {}
@handler = Psych::Emitter.new io
@handler.indentation = options[:indentation] if options[:indentation]
@handler.canonical = options[:canonical] if options[:canonical]
@handler.line_width = options[:line_width] if options[:line_width]
opts = [:indentation, :canonical, :line_width].find_all { |opt|
options.key?(opt)
}

if opts.empty?
@handler = Psych::Emitter.new io
else
du = Handler::DumperOptions.new
opts.each { |option| du.send :"#{option}=", options[option] }
@handler = Psych::Emitter.new io, du
end
end

def visit_Psych_Nodes_Stream o
Expand Down

0 comments on commit e82cf03

Please sign in to comment.