idna 0.1.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.github/workflows/main.yml +32 -0
- data/.ruby-version +1 -0
- data/CHANGELOG.md +19 -0
- data/README.md +10 -6
- data/idna.gemspec +7 -7
- data/lib/idna/client.rb +56 -4
- data/lib/idna/default.rb +1 -1
- data/lib/idna/error.rb +120 -33
- data/lib/idna/version.rb +1 -1
- data/lib/idna.rb +2 -2
- metadata +19 -16
- data/.travis.yml +0 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 722a8d9bdf8bb0e45b7e12c7b3e8bdcedf6a051a66712f009e534569e5eaa9c7
|
4
|
+
data.tar.gz: '08cb5e72935927c5a88057a8f61c07652e77f169b7d5ad09eb1a9d73e7b81e1b'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d6072346c275344fadf16141aaa90731743d009eaf2ea7ead5094be41e2e8937afcfffdc6e938874a03f97ebb59e928c16c0b3f11b763a8eb91d7c492549669b
|
7
|
+
data.tar.gz: 596f8915f73f2780d29938d54e7a418f95091fa4ef473bebe526c72ea013dba29ddf55aa956ea1629af3ff291e5318ee2356d9bbbc256445fc902cb9fac11c57
|
@@ -0,0 +1,32 @@
|
|
1
|
+
name: Ruby
|
2
|
+
|
3
|
+
on:
|
4
|
+
push:
|
5
|
+
branches:
|
6
|
+
- master
|
7
|
+
- feature/libidn2
|
8
|
+
|
9
|
+
pull_request:
|
10
|
+
branches:
|
11
|
+
- master
|
12
|
+
- feature/libidn2
|
13
|
+
|
14
|
+
jobs:
|
15
|
+
build:
|
16
|
+
runs-on: ubuntu-latest
|
17
|
+
strategy:
|
18
|
+
matrix:
|
19
|
+
ruby: ['3.2']
|
20
|
+
|
21
|
+
steps:
|
22
|
+
- uses: actions/checkout@v3
|
23
|
+
- name: Set up Ruby ${{ matrix.ruby }}
|
24
|
+
uses: ruby/setup-ruby@v1
|
25
|
+
with:
|
26
|
+
ruby-version: ${{ matrix.ruby }}
|
27
|
+
- name: Install dependencies
|
28
|
+
run: |
|
29
|
+
bundle install
|
30
|
+
sudo apt-get -yqq install libidn2-0-dev
|
31
|
+
- name: Run tests
|
32
|
+
run: bundle exec rspec
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
3.2.0
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
# Change Log
|
2
|
+
|
3
|
+
## v1.1.0 (2022-01-16)
|
4
|
+
|
5
|
+
- Ensured compatibility with Ruby v3.2.0.
|
6
|
+
|
7
|
+
## v1.0.1 (2021-07-12)
|
8
|
+
|
9
|
+
- Made compatible with Ruby v3.
|
10
|
+
|
11
|
+
## v1.0.0 (2020-10-15)
|
12
|
+
|
13
|
+
- Now uses [libidn2](https://www.gnu.org/software/libidn/#libidn2).
|
14
|
+
- The gem main API is identical, but custom exception classes differ from V1 since the V2 library's error codes have changed. The old classes are maintained via backwards compatibility mappings. You can keep using the V1 exception classes, but ought to update code for the V2 exceptions if you can. See the [C definitions](https://gitlab.com/libidn/libidn2/-/blob/master/lib/idn2.h.in) for details, or look in `lib/idna/error.rb`.
|
15
|
+
- Local development uses Ruby 2.4.10 (was 2.4.1).
|
16
|
+
|
17
|
+
## v0.1.0 (2017-09-24)
|
18
|
+
|
19
|
+
- First release.
|
data/README.md
CHANGED
@@ -1,6 +1,8 @@
|
|
1
|
-
#
|
1
|
+
# IDNA
|
2
2
|
|
3
|
-
|
3
|
+
[Ruby FFI](https://github.com/ffi/ffi) bindings for the [libidn2](https://www.gnu.org/software/libidn/#libidn2) library, providing some simple methods to handle internationalised domain names backed by the GNU library's complete IDNA2008 / TR46 implementation.
|
4
|
+
|
5
|
+
The gem is tested with "latest at last test run" patch versions of Ruby 3.2. It is *believed* to work on Ruby 2.4 or later, but this is no longer automatically tested.
|
4
6
|
|
5
7
|
## Installation
|
6
8
|
|
@@ -22,17 +24,19 @@ Or install it yourself as:
|
|
22
24
|
$ gem install idna
|
23
25
|
```
|
24
26
|
|
27
|
+
You will need to install [libidn2](https://www.gnu.org/software/libidn/#libidn2) separately, if it is not already installed on your system. For example, macOS users with [Homebrew](https://brew.sh) can run `brew install libidn2`.
|
28
|
+
|
25
29
|
## Usage
|
26
30
|
|
27
31
|
### Transform
|
28
32
|
|
29
|
-
* Attach function to `
|
33
|
+
* Attach function to `idn2_to_ascii_8z`:
|
30
34
|
|
31
35
|
```
|
32
36
|
Idna.to_ascii('あいうえお') #xn--l8jegik
|
33
37
|
```
|
34
38
|
|
35
|
-
* Attach function to `
|
39
|
+
* Attach function to `idn2_to_unicode_8z8z`:
|
36
40
|
|
37
41
|
```
|
38
42
|
Idna.to_unicode('xn--l8jegik') #あいうえお
|
@@ -40,11 +44,11 @@ Idna.to_unicode('xn--l8jegik') #あいうえお
|
|
40
44
|
|
41
45
|
### Configure
|
42
46
|
|
43
|
-
*
|
47
|
+
* Custom `libidn2` name:
|
44
48
|
|
45
49
|
```
|
46
50
|
Idna.configure do |config|
|
47
|
-
config.ffi_lib = '
|
51
|
+
config.ffi_lib = 'idn2.so.11'
|
48
52
|
end
|
49
53
|
|
50
54
|
Idna.reload!
|
data/idna.gemspec
CHANGED
@@ -6,11 +6,11 @@ require "idna/version"
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
7
|
spec.name = "idna"
|
8
8
|
spec.version = Idna::VERSION
|
9
|
-
spec.authors = ["ogom"]
|
10
|
-
spec.email = ["ogom@outlook.com"]
|
9
|
+
spec.authors = ["ogom", "RIP Global"]
|
10
|
+
spec.email = ["ogom@outlook.com", "dev@ripglobal.com"]
|
11
11
|
|
12
|
-
spec.summary = %q{
|
13
|
-
spec.description = %q{
|
12
|
+
spec.summary = %q{Ruby FFI bindings for Libidn2.}
|
13
|
+
spec.description = %q{Ruby FFI bindings for Libidn2.}
|
14
14
|
spec.homepage = "https://github.com/ogom/ruby-idna"
|
15
15
|
spec.license = "MIT"
|
16
16
|
|
@@ -23,7 +23,7 @@ Gem::Specification.new do |spec|
|
|
23
23
|
|
24
24
|
spec.add_dependency "ffi"
|
25
25
|
|
26
|
-
spec.add_development_dependency "bundler", "~>
|
27
|
-
spec.add_development_dependency "rake",
|
28
|
-
spec.add_development_dependency "rspec",
|
26
|
+
spec.add_development_dependency "bundler", "~> 2.1"
|
27
|
+
spec.add_development_dependency "rake", "~> 13.0"
|
28
|
+
spec.add_development_dependency "rspec", "~> 3.12"
|
29
29
|
end
|
data/lib/idna/client.rb
CHANGED
@@ -2,13 +2,28 @@ require 'ffi'
|
|
2
2
|
|
3
3
|
module Idna
|
4
4
|
class Client
|
5
|
+
|
6
|
+
# Simple domain matching regexps, validating basic structure:
|
7
|
+
#
|
8
|
+
# * 1-63 ASCII alphanumeric characters, dots, or hyphens, followed by a
|
9
|
+
# TLD specifier consisting of a dot, then 1 or more of any alphabetic
|
10
|
+
# ASCII characters - for full domains (e.g. "subdomain.example.com").
|
11
|
+
#
|
12
|
+
# * As above, but for single domain parts only (e.g. "example") and not
|
13
|
+
# intended for TLDs such as ".com" (character match is too permissive).
|
14
|
+
#
|
15
|
+
# Convert Unicode domains to ASCII before using these. See also #valid?.
|
16
|
+
#
|
17
|
+
ASCII_DOMAIN_FULL_REGEXP = /^[A-Za-z0-9\-\.]{1,63}?\.[A-Za-z]+$/
|
18
|
+
ASCII_DOMAIN_LIGHT_REGEXP = /^[A-Za-z0-9\-]{1,63}?$/
|
19
|
+
|
5
20
|
extend FFI::Library
|
6
21
|
class << self
|
7
22
|
def lib_load!
|
8
23
|
ffi_lib Idna::Configure.ffi_lib
|
9
24
|
|
10
|
-
attach_function :
|
11
|
-
attach_function :
|
25
|
+
attach_function :idn2_to_ascii_8z, %i[string pointer int], :int
|
26
|
+
attach_function :idn2_to_unicode_8z8z, %i[string pointer int], :int
|
12
27
|
end
|
13
28
|
end
|
14
29
|
|
@@ -17,7 +32,7 @@ module Idna
|
|
17
32
|
return string if skip_useless && string.ascii_only?
|
18
33
|
|
19
34
|
pointer = FFI::MemoryPointer.new :pointer
|
20
|
-
int =
|
35
|
+
int = idn2_to_ascii_8z(string, pointer, 0x0001)
|
21
36
|
Idna::Error.handling(int) unless int == 0
|
22
37
|
result = pointer.read_pointer.read_string
|
23
38
|
pointer.free
|
@@ -30,12 +45,49 @@ module Idna
|
|
30
45
|
return string if skip_useless && !string.ascii_only?
|
31
46
|
|
32
47
|
pointer = FFI::MemoryPointer.new :pointer
|
33
|
-
int =
|
48
|
+
int = idn2_to_unicode_8z8z(string, pointer, 0x0001)
|
34
49
|
Idna::Error.handling(int) unless int == 0
|
35
50
|
result = pointer.read_pointer.read_string
|
36
51
|
pointer.free
|
37
52
|
|
38
53
|
result.force_encoding('UTF-8')
|
39
54
|
end
|
55
|
+
|
56
|
+
# Perform simple validation of the given domain, converting to ASCII first.
|
57
|
+
# Returns +true+ if the basic structure looks valid, else +false+. Does not
|
58
|
+
# check to see if e.g. a given TLD is actually a currently defined, allowed
|
59
|
+
# value such as ".com" rather than ".asdfghjk"; it just makes sure the
|
60
|
+
# character ranges used are permitted.
|
61
|
+
#
|
62
|
+
# +string+:: Domain - Unicode or ASCII.
|
63
|
+
#
|
64
|
+
# Options are:
|
65
|
+
#
|
66
|
+
# +components+:: Incorporates multiple components (e.g. "example.com" or
|
67
|
+
# "subdomain.example.com"), in which case the last domain
|
68
|
+
# (in both of these examples, that's ".com") must follow
|
69
|
+
# TLD rules and use alphabetic characters only. Default is
|
70
|
+
# +false+.
|
71
|
+
#
|
72
|
+
def valid?(string, components: false)
|
73
|
+
return false unless string
|
74
|
+
|
75
|
+
# Force conversion to/from UTF-8 (whether or not already in UTF-8 or just
|
76
|
+
# ASCII) to check validity for those operations, then process the ASCII
|
77
|
+
# result through an appropriate regular expression.
|
78
|
+
|
79
|
+
string = to_unicode(string, skip_useless: false)
|
80
|
+
string = to_ascii(string, skip_useless: false)
|
81
|
+
regexp = components ? ASCII_DOMAIN_FULL_REGEXP : ASCII_DOMAIN_LIGHT_REGEXP
|
82
|
+
|
83
|
+
return string.match?(regexp)
|
84
|
+
|
85
|
+
# Although some error conditions might not indicate a lack of valid input,
|
86
|
+
# e.g. "out of memory", most do; this 'rescue' just keeps it simple.
|
87
|
+
#
|
88
|
+
rescue Idna::Error
|
89
|
+
return false
|
90
|
+
|
91
|
+
end
|
40
92
|
end
|
41
93
|
end
|
data/lib/idna/default.rb
CHANGED
data/lib/idna/error.rb
CHANGED
@@ -1,19 +1,43 @@
|
|
1
1
|
module Idna
|
2
|
+
|
3
|
+
# Source:
|
4
|
+
#
|
5
|
+
# https://gitlab.com/libidn/libidn2/-/blob/master/lib/idn2.h.in#L227
|
6
|
+
#
|
2
7
|
class Error < StandardError
|
3
8
|
class << self
|
4
9
|
def handling(int)
|
5
10
|
klass = case int
|
6
|
-
when
|
7
|
-
when
|
8
|
-
when
|
9
|
-
when
|
10
|
-
when
|
11
|
-
when
|
12
|
-
when
|
13
|
-
when
|
14
|
-
when
|
15
|
-
when
|
16
|
-
when
|
11
|
+
when 0 then Idna::Error::IDN2_OK
|
12
|
+
when -100 then Idna::Error::IDN2_MALLOC
|
13
|
+
when -101 then Idna::Error::IDN2_NO_CODESET
|
14
|
+
when -102 then Idna::Error::IDN2_ICONV_FAIL
|
15
|
+
when -200 then Idna::Error::IDN2_ENCODING_ERROR
|
16
|
+
when -201 then Idna::Error::IDN2_NFC
|
17
|
+
when -202 then Idna::Error::IDN2_PUNYCODE_BAD_INPUT
|
18
|
+
when -203 then Idna::Error::IDN2_PUNYCODE_BIG_OUTPUT
|
19
|
+
when -204 then Idna::Error::IDN2_PUNYCODE_OVERFLOW
|
20
|
+
when -205 then Idna::Error::IDN2_TOO_BIG_DOMAIN
|
21
|
+
when -206 then Idna::Error::IDN2_TOO_BIG_LABEL
|
22
|
+
when -207 then Idna::Error::IDN2_INVALID_ALABEL
|
23
|
+
when -208 then Idna::Error::IDN2_UALABEL_MISMATCH
|
24
|
+
when -209 then Idna::Error::IDN2_INVALID_FLAGS
|
25
|
+
when -300 then Idna::Error::IDN2_NOT_NFC
|
26
|
+
when -301 then Idna::Error::IDN2_2HYPHEN
|
27
|
+
when -302 then Idna::Error::IDN2_HYPHEN_STARTEND
|
28
|
+
when -303 then Idna::Error::IDN2_LEADING_COMBINING
|
29
|
+
when -304 then Idna::Error::IDN2_DISALLOWED
|
30
|
+
when -305 then Idna::Error::IDN2_CONTEXTJ
|
31
|
+
when -306 then Idna::Error::IDN2_CONTEXTJ_NO_RULE
|
32
|
+
when -307 then Idna::Error::IDN2_CONTEXTO
|
33
|
+
when -308 then Idna::Error::IDN2_CONTEXTO_NO_RULE
|
34
|
+
when -309 then Idna::Error::IDN2_UNASSIGNED
|
35
|
+
when -310 then Idna::Error::IDN2_BIDI
|
36
|
+
when -311 then Idna::Error::IDN2_DOT_IN_LABEL
|
37
|
+
when -312 then Idna::Error::IDN2_INVALID_TRANSITIONAL
|
38
|
+
when -313 then Idna::Error::IDN2_INVALID_NONTRANSITIONAL
|
39
|
+
when -314 then Idna::Error::IDN2_ALABEL_ROUNDTRIP_FAILED
|
40
|
+
else Idna::Error::UNKNOWN
|
17
41
|
end
|
18
42
|
raise klass.new message(int)
|
19
43
|
end
|
@@ -22,31 +46,94 @@ module Idna
|
|
22
46
|
|
23
47
|
def message(int)
|
24
48
|
case int
|
25
|
-
when
|
26
|
-
when
|
27
|
-
when
|
28
|
-
when
|
29
|
-
when
|
30
|
-
when
|
31
|
-
when
|
32
|
-
when
|
33
|
-
when
|
34
|
-
when
|
35
|
-
when
|
49
|
+
when 0 then 'OK'
|
50
|
+
when -100 then 'Memory allocation error.'
|
51
|
+
when -101 then 'Could not determine locale string encoding format.'
|
52
|
+
when -102 then 'Could not transcode locale string to UTF-8.'
|
53
|
+
when -200 then 'Unicode data encoding error.'
|
54
|
+
when -201 then 'Error normalizing string.'
|
55
|
+
when -202 then 'Punycode invalid input.'
|
56
|
+
when -203 then 'Punycode output buffer too small.'
|
57
|
+
when -204 then 'Punycode conversion would overflow.'
|
58
|
+
when -205 then 'Domain name longer than 255 characters.'
|
59
|
+
when -206 then 'Domain label longer than 63 characters.'
|
60
|
+
when -207 then 'Input A-label is not valid.'
|
61
|
+
when -208 then 'Input A-label and U-label does not match.'
|
62
|
+
when -209 then 'Invalid combination of flags.'
|
63
|
+
when -300 then 'String is not NFC.'
|
64
|
+
when -301 then 'String has forbidden two hyphens.'
|
65
|
+
when -302 then 'String has forbidden starting/ending hyphen.'
|
66
|
+
when -303 then 'String has forbidden leading combining character.'
|
67
|
+
when -304 then 'String has disallowed character.'
|
68
|
+
when -305 then 'String has forbidden context-j character.'
|
69
|
+
when -306 then 'String has context-j character with no rull.'
|
70
|
+
when -307 then 'String has forbidden context-o character.'
|
71
|
+
when -308 then 'String has context-o character with no rull.'
|
72
|
+
when -309 then 'String has forbidden unassigned character.'
|
73
|
+
when -310 then 'String has forbidden bi-directional properties.'
|
74
|
+
when -311 then 'Label has forbidden dot (TR46).'
|
75
|
+
when -312 then 'Label has character forbidden in transitional mode (TR46).'
|
76
|
+
when -313 then 'Label has character forbidden in non-transitional mode (TR46).'
|
77
|
+
when -314 then 'ALabel -> Ulabel -> ALabel result differs from input.'
|
78
|
+
else "Unrecognised Libidn2 error code '#{int}'."
|
36
79
|
end
|
37
80
|
end
|
38
81
|
end
|
39
82
|
end
|
40
83
|
|
41
|
-
class Error::
|
42
|
-
class Error::
|
43
|
-
class Error::
|
44
|
-
class Error::
|
45
|
-
class Error::
|
46
|
-
class Error::
|
47
|
-
class Error::
|
48
|
-
class Error::
|
49
|
-
class Error::
|
50
|
-
class Error::
|
51
|
-
class Error::
|
84
|
+
class Error::IDN2_OK < Idna::Error; end
|
85
|
+
class Error::IDN2_MALLOC < Idna::Error; end
|
86
|
+
class Error::IDN2_NO_CODESET < Idna::Error; end
|
87
|
+
class Error::IDN2_ICONV_FAIL < Idna::Error; end
|
88
|
+
class Error::IDN2_ENCODING_ERROR < Idna::Error; end
|
89
|
+
class Error::IDN2_NFC < Idna::Error; end
|
90
|
+
class Error::IDN2_PUNYCODE_BAD_INPUT < Idna::Error; end
|
91
|
+
class Error::IDN2_PUNYCODE_BIG_OUTPUT < Idna::Error; end
|
92
|
+
class Error::IDN2_PUNYCODE_OVERFLOW < Idna::Error; end
|
93
|
+
class Error::IDN2_TOO_BIG_DOMAIN < Idna::Error; end
|
94
|
+
class Error::IDN2_TOO_BIG_LABEL < Idna::Error; end
|
95
|
+
class Error::IDN2_INVALID_ALABEL < Idna::Error; end
|
96
|
+
class Error::IDN2_UALABEL_MISMATCH < Idna::Error; end
|
97
|
+
class Error::IDN2_INVALID_FLAGS < Idna::Error; end
|
98
|
+
class Error::IDN2_NOT_NFC < Idna::Error; end
|
99
|
+
class Error::IDN2_2HYPHEN < Idna::Error; end
|
100
|
+
class Error::IDN2_HYPHEN_STARTEND < Idna::Error; end
|
101
|
+
class Error::IDN2_LEADING_COMBINING < Idna::Error; end
|
102
|
+
class Error::IDN2_DISALLOWED < Idna::Error; end
|
103
|
+
class Error::IDN2_CONTEXTJ < Idna::Error; end
|
104
|
+
class Error::IDN2_CONTEXTJ_NO_RULE < Idna::Error; end
|
105
|
+
class Error::IDN2_CONTEXTO < Idna::Error; end
|
106
|
+
class Error::IDN2_CONTEXTO_NO_RULE < Idna::Error; end
|
107
|
+
class Error::IDN2_UNASSIGNED < Idna::Error; end
|
108
|
+
class Error::IDN2_BIDI < Idna::Error; end
|
109
|
+
class Error::IDN2_DOT_IN_LABEL < Idna::Error; end
|
110
|
+
class Error::IDN2_INVALID_TRANSITIONAL < Idna::Error; end
|
111
|
+
class Error::IDN2_INVALID_NONTRANSITIONAL < Idna::Error; end
|
112
|
+
class Error::IDN2_ALABEL_ROUNDTRIP_FAILED < Idna::Error; end
|
113
|
+
class Error::UNKNOWN < Idna::Error; end
|
114
|
+
|
115
|
+
# V1 mappings, from:
|
116
|
+
#
|
117
|
+
# https://gitlab.com/libidn/libidn2/-/blob/master/lib/idn2.h.in#L340
|
118
|
+
#
|
119
|
+
# ...with some adjustments to match observed behaviour - e.g. "too long"
|
120
|
+
# should be "too big domain" or "too big input", but the above maps it to
|
121
|
+
# "string has disallowed character", which seems to be incorrect (a bug).
|
122
|
+
#
|
123
|
+
Error::IDNA_STRINGPREP_ERROR = Error::IDN2_ENCODING_ERROR
|
124
|
+
Error::IDNA_PUNYCODE_ERROR = Error::IDN2_PUNYCODE_BAD_INPUT
|
125
|
+
Error::IDNA_CONTAINS_NON_LDH = Error::IDN2_ENCODING_ERROR
|
126
|
+
Error::IDNA_CONTAINS_LDH = Error::IDNA_CONTAINS_NON_LDH
|
127
|
+
Error::IDNA_CONTAINS_MINUS = Error::IDN2_DISALLOWED
|
128
|
+
Error::IDNA_INVALID_LENGTH = Error::IDN2_TOO_BIG_LABEL
|
129
|
+
Error::IDNA_NO_ACE_PREFIX = Error::IDN2_ENCODING_ERROR
|
130
|
+
Error::IDNA_ROUNDTRIP_VERIFY_ERROR = Error::IDN2_ENCODING_ERROR
|
131
|
+
Error::IDNA_CONTAINS_ACE_PREFIX = Error::IDN2_ENCODING_ERROR
|
132
|
+
Error::IDNA_ICONV_ERROR = Error::IDN2_ENCODING_ERROR
|
133
|
+
Error::IDNA_MALLOC_ERROR = Error::IDN2_MALLOC
|
134
|
+
|
135
|
+
# Unmappable V1 error classes.
|
136
|
+
#
|
137
|
+
Error::IDNA_DLOPEN_ERROR = Error::UNKNOWN
|
138
|
+
|
52
139
|
end
|
data/lib/idna/version.rb
CHANGED
data/lib/idna.rb
CHANGED
@@ -26,9 +26,9 @@ module Idna
|
|
26
26
|
true
|
27
27
|
end
|
28
28
|
|
29
|
-
def method_missing(method, *args, &block)
|
29
|
+
def method_missing(method, *args, **kwargs, &block)
|
30
30
|
return super unless client.respond_to?(method)
|
31
|
-
client.send(method, *args, &block)
|
31
|
+
client.send(method, *args, **kwargs, &block)
|
32
32
|
end
|
33
33
|
end
|
34
34
|
end
|
metadata
CHANGED
@@ -1,14 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: idna
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- ogom
|
8
|
-
|
8
|
+
- RIP Global
|
9
|
+
autorequire:
|
9
10
|
bindir: exe
|
10
11
|
cert_chain: []
|
11
|
-
date:
|
12
|
+
date: 2023-01-17 00:00:00.000000000 Z
|
12
13
|
dependencies:
|
13
14
|
- !ruby/object:Gem::Dependency
|
14
15
|
name: ffi
|
@@ -30,52 +31,55 @@ dependencies:
|
|
30
31
|
requirements:
|
31
32
|
- - "~>"
|
32
33
|
- !ruby/object:Gem::Version
|
33
|
-
version: '1
|
34
|
+
version: '2.1'
|
34
35
|
type: :development
|
35
36
|
prerelease: false
|
36
37
|
version_requirements: !ruby/object:Gem::Requirement
|
37
38
|
requirements:
|
38
39
|
- - "~>"
|
39
40
|
- !ruby/object:Gem::Version
|
40
|
-
version: '1
|
41
|
+
version: '2.1'
|
41
42
|
- !ruby/object:Gem::Dependency
|
42
43
|
name: rake
|
43
44
|
requirement: !ruby/object:Gem::Requirement
|
44
45
|
requirements:
|
45
46
|
- - "~>"
|
46
47
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
48
|
+
version: '13.0'
|
48
49
|
type: :development
|
49
50
|
prerelease: false
|
50
51
|
version_requirements: !ruby/object:Gem::Requirement
|
51
52
|
requirements:
|
52
53
|
- - "~>"
|
53
54
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
55
|
+
version: '13.0'
|
55
56
|
- !ruby/object:Gem::Dependency
|
56
57
|
name: rspec
|
57
58
|
requirement: !ruby/object:Gem::Requirement
|
58
59
|
requirements:
|
59
60
|
- - "~>"
|
60
61
|
- !ruby/object:Gem::Version
|
61
|
-
version: '3.
|
62
|
+
version: '3.12'
|
62
63
|
type: :development
|
63
64
|
prerelease: false
|
64
65
|
version_requirements: !ruby/object:Gem::Requirement
|
65
66
|
requirements:
|
66
67
|
- - "~>"
|
67
68
|
- !ruby/object:Gem::Version
|
68
|
-
version: '3.
|
69
|
-
description:
|
69
|
+
version: '3.12'
|
70
|
+
description: Ruby FFI bindings for Libidn2.
|
70
71
|
email:
|
71
72
|
- ogom@outlook.com
|
73
|
+
- dev@ripglobal.com
|
72
74
|
executables: []
|
73
75
|
extensions: []
|
74
76
|
extra_rdoc_files: []
|
75
77
|
files:
|
78
|
+
- ".github/workflows/main.yml"
|
76
79
|
- ".gitignore"
|
77
80
|
- ".rspec"
|
78
|
-
- ".
|
81
|
+
- ".ruby-version"
|
82
|
+
- CHANGELOG.md
|
79
83
|
- Gemfile
|
80
84
|
- LICENSE.txt
|
81
85
|
- README.md
|
@@ -93,7 +97,7 @@ homepage: https://github.com/ogom/ruby-idna
|
|
93
97
|
licenses:
|
94
98
|
- MIT
|
95
99
|
metadata: {}
|
96
|
-
post_install_message:
|
100
|
+
post_install_message:
|
97
101
|
rdoc_options: []
|
98
102
|
require_paths:
|
99
103
|
- lib
|
@@ -108,9 +112,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
108
112
|
- !ruby/object:Gem::Version
|
109
113
|
version: '0'
|
110
114
|
requirements: []
|
111
|
-
|
112
|
-
|
113
|
-
signing_key:
|
115
|
+
rubygems_version: 3.4.1
|
116
|
+
signing_key:
|
114
117
|
specification_version: 4
|
115
|
-
summary:
|
118
|
+
summary: Ruby FFI bindings for Libidn2.
|
116
119
|
test_files: []
|