diff --git a/idn-0.0.2.gem b/idn-0.0.2.gem new file mode 100644 index 0000000..576b4b6 Binary files /dev/null and b/idn-0.0.2.gem differ diff --git a/rubygem-idn-0.0.2-Fix-for-ruby-1.9.x.patch b/rubygem-idn-0.0.2-Fix-for-ruby-1.9.x.patch new file mode 100644 index 0000000..f9f8b38 --- /dev/null +++ b/rubygem-idn-0.0.2-Fix-for-ruby-1.9.x.patch @@ -0,0 +1,140 @@ +diff -Nrup ext.bad/idna.c ext/idna.c +--- ext.bad/idna.c 2012-02-13 22:16:33.792135714 -0500 ++++ ext/idna.c 2012-02-13 23:14:43.562413759 -0500 +@@ -24,6 +24,16 @@ + #include + #include "idn.h" + ++#include ++ ++#define ENCODED_STR_NEW2(str, encoding) \ ++ ({ \ ++ VALUE _string = rb_str_new2((const char *)str); \ ++ int _enc = rb_enc_find_index(encoding); \ ++ rb_enc_associate_index(_string, _enc); \ ++ _string; \ ++ }) ++ + /* + * Document-class: IDN::Idna + * The Idna module of LibIDN Ruby Bindings. +@@ -85,7 +95,7 @@ static VALUE toASCII(int argc, VALUE arg + flags = 0x0000; + } + +- rc = idna_to_ascii_8z(RSTRING(str)->ptr, &buf, flags); ++ rc = idna_to_ascii_8z(RSTRING_PTR(str), &buf, flags); + + if (rc != IDNA_SUCCESS) { + xfree(buf); +@@ -93,7 +103,7 @@ static VALUE toASCII(int argc, VALUE arg + return Qnil; + } + +- retv = rb_str_new2(buf); ++ retv = ENCODED_STR_NEW2(buf, "ASCII-8BIT"); + xfree(buf); + return retv; + } +@@ -125,7 +135,7 @@ static VALUE toUnicode(int argc, VALUE a + flags = 0x0000; + } + +- rc = idna_to_unicode_8z8z(RSTRING(str)->ptr, &buf, flags); ++ rc = idna_to_unicode_8z8z(RSTRING_PTR(str), &buf, flags); + + if (rc != IDNA_SUCCESS) { + xfree(buf); +@@ -133,7 +143,7 @@ static VALUE toUnicode(int argc, VALUE a + return Qnil; + } + +- retv = rb_str_new2(buf); ++ retv = ENCODED_STR_NEW2(buf, "UTF-8"); + xfree(buf); + return retv; + } +diff -Nrup ext.bad/punycode.c ext/punycode.c +--- ext.bad/punycode.c 2012-02-13 22:16:33.792135714 -0500 ++++ ext/punycode.c 2012-02-13 23:19:39.499714035 -0500 +@@ -26,6 +26,14 @@ + #include + #include "idn.h" + ++#define ENCODED_STR_NEW(str, len, encoding) \ ++ ({ \ ++ VALUE _string = rb_str_new((const char *)str, (long)len); \ ++ int _enc = rb_enc_find_index(encoding); \ ++ rb_enc_associate_index(_string, _enc); \ ++ _string; \ ++ }) ++ + /* + * Document-class: IDN::Punycode + * The Punycode module of LibIDN Ruby Bindings. +@@ -66,7 +74,7 @@ static VALUE encode(VALUE self, VALUE st + VALUE retv; + + str = rb_check_convert_type(str, T_STRING, "String", "to_s"); +- ustr = stringprep_utf8_to_ucs4(RSTRING(str)->ptr, RSTRING(str)->len, &len); ++ ustr = stringprep_utf8_to_ucs4(RSTRING_PTR(str), RSTRING_LEN(str), &len); + + while (1) { + buf = realloc(buf, buflen); +@@ -116,7 +124,7 @@ static VALUE decode(VALUE self, VALUE st + + str = rb_check_convert_type(str, T_STRING, "String", "to_s"); + +- len = RSTRING(str)->len; ++ len = RSTRING_LEN(str); + ustr = malloc(len * sizeof(punycode_uint)); + + if (ustr == NULL) { +@@ -124,7 +132,7 @@ static VALUE decode(VALUE self, VALUE st + return Qnil; + } + +- rc = punycode_decode(RSTRING(str)->len, RSTRING(str)->ptr, ++ rc = punycode_decode(RSTRING_LEN(str), RSTRING_PTR(str), + &len, ustr, NULL); + + if (rc != PUNYCODE_SUCCESS) { +@@ -134,7 +142,7 @@ static VALUE decode(VALUE self, VALUE st + } + + buf = stringprep_ucs4_to_utf8(ustr, len, NULL, &len); +- retv = rb_str_new(buf, len); ++ retv = ENCODED_STR_NEW(buf, len, "UTF-8"); + xfree(ustr); + xfree(buf); + return retv; +diff -Nrup ext.bad/stringprep.c ext/stringprep.c +--- ext.bad/stringprep.c 2012-02-13 22:16:33.792135714 -0500 ++++ ext/stringprep.c 2012-02-13 22:16:55.618862844 -0500 +@@ -64,7 +64,7 @@ static VALUE stringprep_internal(VALUE s + VALUE retv; + + str = rb_check_convert_type(str, T_STRING, "String", "to_s"); +- rc = stringprep_profile(RSTRING(str)->ptr, &buf, profile, 0); ++ rc = stringprep_profile(RSTRING_PTR(str), &buf, profile, 0); + + if (rc != STRINGPREP_OK) { + rb_raise(eStringprepError, "%s (%d)", stringprep_strerror(rc), rc); +@@ -135,7 +135,7 @@ static VALUE resourceprep(VALUE self, VA + static VALUE with_profile(VALUE self, VALUE str, VALUE profile) + { + profile = rb_check_convert_type(profile, T_STRING, "String", "to_s"); +- return stringprep_internal(str, RSTRING(profile)->ptr); ++ return stringprep_internal(str, RSTRING_PTR(profile)); + } + + /* +@@ -153,7 +153,7 @@ static VALUE nfkc_normalize(VALUE self, + VALUE retv; + + str = rb_check_convert_type(str, T_STRING, "String", "to_s"); +- buf = stringprep_utf8_nfkc_normalize(RSTRING(str)->ptr, RSTRING(str)->len); ++ buf = stringprep_utf8_nfkc_normalize(RSTRING_PTR(str), RSTRING_LEN(str)); + + retv = rb_str_new2(buf); + xfree(buf); diff --git a/rubygem-idn-0.0.2-ruby2-encoding-in-tests-fix.patch b/rubygem-idn-0.0.2-ruby2-encoding-in-tests-fix.patch new file mode 100644 index 0000000..a083a6a --- /dev/null +++ b/rubygem-idn-0.0.2-ruby2-encoding-in-tests-fix.patch @@ -0,0 +1,22 @@ +diff --git a/test/tc_Stringprep.rb b/test/tc_Stringprep.rb +index c7f15cb..bcdd401 100644 +--- a/test/tc_Stringprep.rb ++++ b/test/tc_Stringprep.rb +@@ -60,7 +60,7 @@ class Test_Stringprep < Test::Unit::TestCase + def test_with_profile_STRINGPREP + TESTCASES_STRINGPREP.each do |key, val| + rc = Stringprep.with_profile(val[1], val[0]) +- assert_equal(val[2], rc, "TestCase #{key} failed") ++ assert_equal(val[2].force_encoding('ASCII-8BIT'), rc, "TestCase #{key} failed") + end + end + +@@ -75,7 +75,7 @@ class Test_Stringprep < Test::Unit::TestCase + def test_nfkc_normalize_NFKC + TESTCASES_NFKC.each do |key, val| + rc = Stringprep.nfkc_normalize(val[0]) +- assert_equal(val[1], rc, "TestCase #{key} failed") ++ assert_equal(val[1].force_encoding('ASCII-8BIT'), rc, "TestCase #{key} failed") + end + end + end diff --git a/rubygem-idn.spec b/rubygem-idn.spec new file mode 100644 index 0000000..a7b69c2 --- /dev/null +++ b/rubygem-idn.spec @@ -0,0 +1,64 @@ +%global gem_name idn +Name: rubygem-%{gem_name} +Version: 0.0.2 +Release: 1 +Summary: Ruby Bindings for the GNU LibIDN library +License: ASL 2.0 and LGPLv2+ +URL: https://rubygems.org/gems/idn +Source0: https://rubygems.org/gems/%{gem_name}-%{version}.gem +Patch0: rubygem-idn-0.0.2-Fix-for-ruby-1.9.x.patch +Patch1: rubygem-idn-0.0.2-ruby2-encoding-in-tests-fix.patch +BuildRequires: ruby(release) rubygems-devel ruby-devel gcc libidn-devel rubygem(test-unit) +%description +Ruby Bindings for the GNU LibIDN library, an implementation of the Stringprep, +Punycode and IDNA specifications defined by the IETF Internationalized Domain +Names (IDN) working group. + +%package doc +Summary: Documentation for %{name} +Requires: %{name} = %{version}-%{release} +BuildArch: noarch +%description doc +Documentation for %{name}. + +%prep +%setup -q -n %{gem_name}-%{version} +%patch0 -p0 +%patch1 -p1 + +%build +gem build ../%{gem_name}-%{version}.gemspec +%gem_install + +%install +mkdir -p %{buildroot}%{gem_dir} +cp -a .%{gem_dir}/* \ + %{buildroot}%{gem_dir}/ +mkdir -p %{buildroot}%{gem_extdir_mri} +cp -a .%{gem_extdir_mri}/{gem.build_complete,*.so} %{buildroot}%{gem_extdir_mri}/ +rm -rf %{buildroot}%{gem_instdir}/ext/ + +%check +pushd .%{gem_instdir} +ruby -I$(dirs +1)%{gem_extdir_mri} -e 'Dir.glob "./test/tc_*.rb", &method(:require)' +popd + +%files +%dir %{gem_instdir} +%{gem_extdir_mri} +%license %{gem_instdir}/LICENSE +%exclude %{gem_libdir} +%exclude %{gem_cache} +%{gem_spec} + +%files doc +%doc %{gem_docdir} +%doc %{gem_instdir}/CHANGES +%doc %{gem_instdir}/NOTICE +%doc %{gem_instdir}/README +%{gem_instdir}/Rakefile +%{gem_instdir}/test + +%changelog +* Sat Jul 25 2020 wutao - 0.0.2-1 +- package init diff --git a/rubygem-idn.yaml b/rubygem-idn.yaml new file mode 100644 index 0000000..00bbaf0 --- /dev/null +++ b/rubygem-idn.yaml @@ -0,0 +1,4 @@ +version_control: NA +src_repo: NA +tag_prefix: NA +seperator: NA