From: Tilman Sauerbeck Date: Thu, 7 Sep 2006 16:08:25 +0000 (+0200) Subject: Relaxed rules for Ogg::Vorbis::Comments#merge!. X-Git-Tag: ruby-vorbistagger-0.0.1~1 X-Git-Url: http://git.code-monkey.de/?p=ruby-vorbistagger.git;a=commitdiff_plain;h=c623a45b47d3061c47eac5abd4867913c9230b36 Relaxed rules for Ogg::Vorbis::Comments#merge!. The method now supports any argument whose each method yields a key-value pair (array). --- diff --git a/Rakefile b/Rakefile index e83733c..4aa62fc 100644 --- a/Rakefile +++ b/Rakefile @@ -35,9 +35,6 @@ task :extension => [:install, :clobber] config = Rake::ConfigureTask.new do |t| t.tests << Rake::ConfigureTask:: PkgConfigTest.new("vorbis", :is_critical => true) - t.tests << Rake::ConfigureTask:: - HaveFuncTest.new("rb_hash_foreach", "ruby.h", - :is_critical => true) t.tests << Rake::ConfigureTask::Gcc4Test.new("gcc4") end diff --git a/ext/comments.c b/ext/comments.c index fb3ae82..03a237b 100644 --- a/ext/comments.c +++ b/ext/comments.c @@ -24,7 +24,7 @@ #include "vcedit.h" -static ID id_casecmp, id_replace, id_compare; +static ID id_casecmp, id_replace, id_each, id_compare; void comments_init (VALUE self, vcedit_state *state) @@ -345,27 +345,34 @@ c_has_key (VALUE self, VALUE key) return Qfalse; } -static int -merge_cb (VALUE key, VALUE value, VALUE self) +static VALUE +merge_cb (VALUE ar, VALUE self) { - c_aset (self, key, value); + struct RArray *pair = RARRAY (ar); + + c_aset (self, pair->ptr[0], pair->ptr[1]); - return ST_CONTINUE; + return Qnil; } /* * call-seq: - * object.merge!(hash) -> object + * object.merge!(arg) -> object * - * Adds the key-value pairs from *hash* to *object*, overwriting existing + * Adds the key-value pairs from *arg* to *object*, overwriting existing * values if a key already existed in *object*. + * + * Note that *arg*'s each method needs to yield key-value pairs for this + * to work. This means that e.g. hashes and Ogg::Vorbis::Comments objects + * are supported as arguments. */ static VALUE -c_merge (VALUE self, VALUE hash) +c_merge (VALUE self, VALUE arg) { - Check_Type (hash, T_HASH); + if (!rb_respond_to (arg, id_each)) + rb_raise (rb_eArgError, "invalid argument"); - rb_hash_foreach (hash, merge_cb, self); + rb_iterate (rb_each, arg, merge_cb, self); return self; } @@ -536,6 +543,7 @@ Init_Comments (VALUE mVorbis) id_casecmp = rb_intern ("casecmp"); id_replace = rb_intern ("replace"); + id_each = rb_intern ("each"); id_compare = rb_intern ("<=>"); return c; diff --git a/test/test_main.rb b/test/test_main.rb index 817b59f..fe622e6 100644 --- a/test/test_main.rb +++ b/test/test_main.rb @@ -250,6 +250,14 @@ EOF end end + def test_merge_bad_arg + Ogg::Vorbis::Tagger.open(OGG_FILE) do |t| + assert_raises(ArgumentError) do + t.comments.merge!(42) + end + end + end + def test_shift Ogg::Vorbis::Tagger.open(OGG_FILE) do |t| assert_equal(["artist", "Bolt Thrower"], t.comments.shift)