mail_address 1.2.20 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 11efdd5a61a85e9557f4d6b51371aac1aeb222d87e8439b08f65f22283909f23
4
- data.tar.gz: 38c1f50d38c14b688b5839c6203dd2200dd20d4581ed77129bad1f7828c09ef5
3
+ metadata.gz: 6b0a0f8f9570bee5727e30b23812e5e453d134c7b0bd6600bea16d8a77e72d63
4
+ data.tar.gz: aedca5179b75e924bbc4257b51a62e9b0bb9bfaf5568a532006d1c0c327b3201
5
5
  SHA512:
6
- metadata.gz: 45d4af2ecbca6933e76471dd07b2a91a5cb266ce7a9d22f386f0b8ffc0b0f3a5f13fffad028b771accc46a4e3afc052ce71440e2ee82c2205a10d6fda9e81b06
7
- data.tar.gz: fc20c95ea8c293e0375280ce5ed63a857ced78d9b81d3ec991a3cca695bac65a4a31d568dced459ce183de4bc727ce2c6b06cf70ecd88fef66bddae844a78a84
6
+ metadata.gz: ce591ea386c87a8c7118f46db6ba4b503afe150f67ce8f9fd921f4c31470bba81fefba624d1ee377a6a2c46a5087df1ad9174c7abe79bf3702269809f2bbe4ae
7
+ data.tar.gz: e245562580351606d037c41a618629078ff4d89cd5f59deb3e7b10dd67907a7413d8186feb7cfe61beed77932f932cb726d1c630fc6e1fcdffbab7d2bffe30b7
@@ -0,0 +1,34 @@
1
+ name: Test
2
+
3
+ on:
4
+ push:
5
+ branches: [master]
6
+ pull_request:
7
+ branches: [master]
8
+
9
+ jobs:
10
+ test:
11
+ runs-on: ubuntu-latest
12
+ strategy:
13
+ fail-fast: false
14
+ matrix:
15
+ ruby-version: ['2.7', '3.0', '3.1', '3.2', '3.3', '3.4']
16
+
17
+ steps:
18
+ - uses: actions/checkout@v4
19
+
20
+ - name: Set up Ruby ${{ matrix.ruby-version }}
21
+ uses: ruby/setup-ruby@v1
22
+ with:
23
+ ruby-version: ${{ matrix.ruby-version }}
24
+ bundler-cache: true
25
+
26
+ - name: Run tests
27
+ run: bundle exec rake spec
28
+
29
+ - name: Upload coverage to Coveralls
30
+ if: matrix.ruby-version == '3.4'
31
+ uses: coverallsapp/github-action@v2
32
+ with:
33
+ github-token: ${{ secrets.GITHUB_TOKEN }}
34
+ file: coverage/lcov/mail_address.lcov
data/CLAUDE.md ADDED
@@ -0,0 +1,43 @@
1
+ # CLAUDE.md
2
+
3
+ This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
4
+
5
+ ## Project Overview
6
+
7
+ MailAddress は Perl の `Mail::Address` モジュールを Ruby に移植したメールアドレスパーサー gem。RFC非準拠のアドレス(docomo/au などの日本のキャリアメールで使われる `..` や末尾 `.`)もパース可能。ランタイム依存なし(Pure Ruby)。
8
+
9
+ ## Commands
10
+
11
+ ```bash
12
+ # テスト実行(デフォルトの rake タスク)
13
+ bundle exec rake spec
14
+
15
+ # 特定ファイルのテスト
16
+ bundle exec rspec spec/mail_address_spec.rb
17
+
18
+ # 特定行のテスト
19
+ bundle exec rspec spec/mail_address_spec.rb:10
20
+ ```
21
+
22
+ リンターは未設定。
23
+
24
+ ## Architecture
25
+
26
+ ### コア構造
27
+
28
+ - **`lib/mail_address.rb`** — エントリポイント。`MailAddress.parse`, `MailAddress.parse_first`, `MailAddress.parse_simple` を提供
29
+ - **`lib/mail_address/address.rb`** — `MailAddress::Address` クラス。パース結果を保持(`phrase`, `address`, `original`)し、`name`, `host`, `user`, `format` メソッドを提供
30
+ - **`lib/mail_address/mail_address.rb`** — メインのパースロジック。トークン化と複雑なアドレスフォーマットの処理
31
+ - **`lib/mail_address/simple_parser.rb`** — Google Closure Library ベースのシンプルパーサー(スペース/カンマ区切りのアドレス向け)
32
+
33
+ ### パース戦略
34
+
35
+ 2つのパーサーを使い分ける:
36
+ - **メインパーサー** (`parse`) — RFC準拠・非準拠の複雑なフォーマットを処理。括弧コメント、クォート、MIME エンコードなどに対応
37
+ - **シンプルパーサー** (`parse_simple` / `g_parse`) — 空白・カンマ区切りの単純なリスト向け
38
+
39
+ ### コーディング規約
40
+
41
+ - プライベートメソッドは `_` プレフィックス(例: `_tokenize`, `_complete`)
42
+ - 定数は `UPPER_CASE`
43
+ - テストは RSpec 3 の `expect` 構文を使用
data/README.md CHANGED
@@ -1,20 +1,18 @@
1
- # MailAddress [![Build Status](https://travis-ci.org/kizashi1122/mail_address.svg)](https://travis-ci.org/kizashi1122/mail_address) [![Coverage Status](https://coveralls.io/repos/kizashi1122/mail_address/badge.png)](https://coveralls.io/r/kizashi1122/mail_address) [![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/kizashi1122/mail_address/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/kizashi1122/mail_address/?branch=master)
1
+ # MailAddress [![Test](https://github.com/kizashi1122/mail_address/actions/workflows/test.yml/badge.svg)](https://github.com/kizashi1122/mail_address/actions/workflows/test.yml) [![Coverage Status](https://coveralls.io/repos/github/kizashi1122/mail_address/badge.svg?branch=master)](https://coveralls.io/github/kizashi1122/mail_address?branch=master)
2
2
 
3
- MailAddress is a port of Mail::Address from Perl.
4
-
5
- [mail](https://github.com/mikel/mail) is a great gem library. But some email addresses are unparsable with it. In perl, [Mail::Address](http://search.cpan.org/~markov/MailTools-2.14/lib/Mail/Address.pod) is a very common library to parse email addresses. Mail::Address conviniently can parse even non-RFC-compliant email addresses such as:
3
+ MailAddress is a Ruby port of Perl's [Mail::Address](http://search.cpan.org/~markov/MailTools-2.14/lib/Mail/Address.pod), a widely used email address parser. While the [mail](https://github.com/mikel/mail) gem is excellent, it cannot parse certain email addresses. Mail::Address can conveniently parse even non-RFC-compliant email addresses such as:
6
4
 
7
5
  ```rb
8
6
  # mail gem cannot parse the following addresses
9
7
  Ello [Do Not Reply] <do-not-reply@ello.co> # [, ] are not permitted according to RFC5322
10
8
  大阪 太郎<osaka@example.com> # no whitespace just before `<`
11
9
  ```
12
- But Mail::Address(Perl) has some bad points (below). These are fixed in MailAddress.
10
+ However, Mail::Address (Perl) has some limitations that MailAddress addresses:
13
11
 
14
- - if no ending parenthesis in name part, cannot parse correctly.
15
- - Modifications of name part are too much.
12
+ - Fails to parse correctly when the name part has no closing parenthesis.
13
+ - Over-modifies the name part.
16
14
 
17
- Many people copy and paste email addresses from Excel or the other spreadsheets. In this case, addresses are separated by whitespace(tab or space). To enable to parse this, also ported from a parser part of [Google Closure Library](https://github.com/google/closure-library/blob/master/closure/goog/format/emailaddress.js).
15
+ Many people copy and paste email addresses from Excel or other spreadsheets, where addresses are separated by whitespace (tab or space). To handle this, MailAddress also includes a parser ported from the [Google Closure Library](https://github.com/google/closure-library/blob/master/closure/goog/format/emailaddress.js).
18
16
 
19
17
  ## Installation
20
18
 
@@ -34,8 +32,8 @@ Or install it yourself as:
34
32
 
35
33
  ## Usage
36
34
 
37
- It's almost the same as Mail::Address(Perl).
38
- But in this module, removed `comment` property from address class in version v1.0.0. Most people don't realize comment I think.
35
+ The API is almost the same as Mail::Address (Perl).
36
+ Note that the `comment` property was removed from the address class in v1.0.0, since most users are unlikely to need it.
39
37
 
40
38
  ```rb
41
39
  require 'mail_address'
@@ -60,10 +58,10 @@ p addrs[1].user # "osaka"
60
58
  p addrs[1].original # "大阪 太郎 <osaka@example.jp>"
61
59
  ```
62
60
 
63
- `address.name` and `address.phrase` are almost same.
61
+ `address.name` and `address.phrase` are almost the same.
64
62
  `address.phrase` keeps outermost double quotes or parentheses.
65
63
 
66
- if you specify single email address, you can use `parse_first`.
64
+ If you only need a single address, you can use `parse_first`.
67
65
 
68
66
  ```rb
69
67
  line = "John Doe <john@example.com>"
@@ -83,7 +81,7 @@ addrs = MailAddress.parse_simple(line)
83
81
 
84
82
  ## Contributing
85
83
 
86
- 1. Fork it ( https://github.com/[my-github-username]/mail_address/fork )
84
+ 1. Fork it ( https://github.com/kizashi1122/mail_address/fork )
87
85
  2. Create your feature branch (`git checkout -b my-new-feature`)
88
86
  3. Commit your changes (`git commit -am 'Add some feature'`)
89
87
  4. Push to the branch (`git push origin my-new-feature`)
@@ -27,7 +27,7 @@ module MailAddress
27
27
 
28
28
  email_address = enquote ? quoted_address : @address
29
29
 
30
- if !@phrase.nil? && @phrase.length > 0
30
+ if !@phrase.nil? && !@phrase.empty?
31
31
  # if @phrase.match(/\A\(/) && @phrase.match(/\)\z/)
32
32
  # addr.push(email_address) if !@address.nil? && @address.length > 0
33
33
  # addr.push(@phrase)
@@ -35,11 +35,11 @@ module MailAddress
35
35
  addr.push(
36
36
  @phrase.match(/^(?:#{ATEXT})+$/) ? @phrase
37
37
  : @phrase.match(/(?<!\\)"/) ? @phrase
38
- : %Q("#{@phrase}")
38
+ : "\"#{@phrase}\""
39
39
  )
40
- addr.push "<#{email_address}>" if !@address.nil? && @address.length > 0
40
+ addr.push "<#{email_address}>" if !@address.nil? && !@address.empty?
41
41
  # end
42
- elsif !@address.nil? && @address.length > 0
42
+ elsif !@address.nil? && !@address.empty?
43
43
  addr.push(email_address)
44
44
  end
45
45
  addr.join(' ')
@@ -48,19 +48,19 @@ module MailAddress
48
48
  def name
49
49
  phrase = @phrase.dup
50
50
  name = Address._extract_name(phrase)
51
- name.length > 0 ? name : nil
51
+ !name.empty? ? name : nil
52
52
  end
53
53
 
54
54
  def host
55
- addr = @address || '';
55
+ addr = @address || ''
56
56
  i = addr.rindex('@')
57
- i.nil? ? nil : addr[i + 1 .. -1]
57
+ addr[(i + 1)..] if i
58
58
  end
59
59
 
60
60
  def user
61
- addr = @address || '';
61
+ addr = @address || ''
62
62
  i = addr.rindex('@')
63
- i.nil? ? addr : addr[0 ... i]
63
+ i ? addr[0...i] : addr
64
64
  end
65
65
 
66
66
  def quoted_address
@@ -78,18 +78,16 @@ module MailAddress
78
78
  # given a comment, attempt to extract a person's name
79
79
  def self._extract_name(name)
80
80
  # This function can be called as method as well
81
- return '' if name.nil? || name == ''
81
+ return '' if name.nil? || name.empty?
82
82
 
83
83
  # Using encodings, too hard. See Mail::Message::Field::Full.
84
- return '' if name.match(/\=\?.*?\?\=/)
84
+ return '' if name.match?(/\=\?.*?\?\=/)
85
85
 
86
86
  # trim whitespace
87
- name.sub!(/^\s+/, '')
88
- name.sub!(/\s+$/, '')
89
- name.sub!(/\s+/, ' ')
87
+ name = name.strip.gsub(/\s+/, ' ')
90
88
 
91
89
  # Disregard numeric names (e.g. 123456.1234@compuserve.com)
92
- return "" if name.match(/^[\d ]+$/)
90
+ return '' if name.match?(/^[\d ]+$/)
93
91
 
94
92
  name.sub!(/^\((.*)\)$/, '\1') # remove outermost parenthesis
95
93
  name.sub!(/^"(.*)"$/, '\1') # remove outer quotation marks
@@ -10,24 +10,24 @@ module MailAddress
10
10
  line = lines.join('').strip
11
11
 
12
12
  # empty or <> or < or >
13
- if line.empty? || line.match(/\A[<>;, \\]+\z/)
13
+ if line.empty? || line.match?(/\A[<>;, \\]+\z/)
14
14
  return [ MailAddress::Address.new(line, nil, line) ]
15
15
  end
16
16
 
17
17
  # undisclosed-recipient
18
- if line.match(/undisclosed[ \-]recipients?: ?;?/i)
18
+ if line.match?(/undisclosed[ \-]recipients?: ?;?/i)
19
19
  return [ MailAddress::Address.new(line, nil, line) ]
20
20
  end
21
21
 
22
22
  phrase, address, objs = [], [], []
23
- original = ''
23
+ original = ''.dup
24
24
  depth, idx, end_paren_idx = 0, 0, 0
25
25
 
26
26
  tokens = _tokenize lines
27
27
  len = tokens.length
28
28
  _next = _find_next idx, tokens, len
29
29
 
30
- for idx in 0 ... len do
30
+ (0...len).each do |idx|
31
31
 
32
32
  token = tokens[idx]
33
33
  substr = token[0, 1]
@@ -55,7 +55,8 @@ module MailAddress
55
55
  if depth > 0
56
56
  # raise "Unmatched '<>' in line"
57
57
  o = MailAddress::Address.new(original, nil, original)
58
- phrase.clear; address.clear
58
+ phrase.clear
59
+ address.clear
59
60
  else
60
61
  o = _complete(phrase, address, original)
61
62
  end
@@ -63,14 +64,14 @@ module MailAddress
63
64
  objs.push(o) if o
64
65
  depth = 0
65
66
  end_paren_idx = 0
66
- original = ''
67
+ original = ''.dup
67
68
  _next = _find_next idx+1, tokens, len
68
69
  elsif (depth > 0)
69
70
  token.strip!
70
71
  address.push(token)
71
72
  elsif (_next == '<')
72
73
  phrase.push(token)
73
- elsif ( token.match(/^[.\@:;]/) || address.empty? || address[-1].match(/^[.\@:;]/) )
74
+ elsif ( token.match?(/^[.\@:;]/) || address.empty? || address[-1].match?(/^[.\@:;]/) )
74
75
  token.strip!
75
76
  address.push(token)
76
77
  else
@@ -90,10 +91,9 @@ module MailAddress
90
91
  line.sub!(/\A\s+/, '')
91
92
  line.gsub!(/[\r\n]+/,' ')
92
93
 
93
- while (line != '')
94
- tmp = nil
94
+ until line.empty?
95
95
  if (
96
- line.match(/"[^"]+"/) && line.sub!(/\A(\\?"(?:[^"\\]+|\\.)*")(\s*)/, '') || # "..."
96
+ line.match?(/"[^"]+"/) && line.sub!(/\A(\\?"(?:[^"\\]+|\\.)*")(\s*)/, '') || # "..."
97
97
  line.sub!(/\A([^\s()<>\@,;:\\".\[\]]+)(\s*)/, '') ||
98
98
  line.sub!(/\A([()<>\@,;:\\".\[\]])(\s*)/, '')
99
99
  )
@@ -127,7 +127,7 @@ module MailAddress
127
127
  end
128
128
 
129
129
  def self._complete (phrase, address, original)
130
- phrase.length > 0 || address.length > 0 or return nil
130
+ return nil if phrase.empty? && address.empty?
131
131
 
132
132
  name = phrase.join('').strip
133
133
 
@@ -140,7 +140,8 @@ module MailAddress
140
140
  name = name.gsub(ESCAPED_BACKSLASHES_, '\\')
141
141
 
142
142
  new_address = MailAddress::Address.new(name, address.join(''), original)
143
- phrase.clear; address.clear
143
+ phrase.clear
144
+ address.clear
144
145
  new_address
145
146
  end
146
147
 
@@ -20,20 +20,20 @@ module MailAddress
20
20
 
21
21
  def self.parse_simple(str)
22
22
  result = []
23
- email = token = ''
23
+ email = token = ''.dup
24
24
 
25
25
  # Remove non-UNIX-style newlines that would otherwise cause getToken_ to
26
26
  # choke. Remove multiple consecutive whitespace characters for the same
27
27
  # reason.
28
- str = self.collapse_whitespace(str)
28
+ str = collapse_whitespace(str)
29
29
  i = 0
30
- while (i < str.length)
30
+ while i < str.length
31
31
  token = get_token(str, i)
32
- if self.is_address_separator(token) || (token == ' ' && self.is_valid(self.parse_internal(email)))
33
- if !self.is_empty_or_whitespace(email)
34
- result.push(self.parse_internal(email))
32
+ if is_address_separator(token) || (token == ' ' && is_valid(parse_internal(email)))
33
+ if !is_empty_or_whitespace(email)
34
+ result.push(parse_internal(email))
35
35
  end
36
- email = ''
36
+ email = ''.dup
37
37
  i += 1
38
38
  next
39
39
  end
@@ -42,34 +42,34 @@ module MailAddress
42
42
  end
43
43
 
44
44
  # Add the final token.
45
- if (!self.is_empty_or_whitespace(email))
46
- result.push(self.parse_internal(email))
45
+ if !is_empty_or_whitespace(email)
46
+ result.push(parse_internal(email))
47
47
  end
48
- return result
48
+ result
49
49
  end
50
50
 
51
51
  def self.parse_internal(addr)
52
- name = ''
53
- address = ''
52
+ name = ''.dup
53
+ address = ''.dup
54
54
  i = 0
55
- while (i < addr.length)
55
+ while i < addr.length
56
56
  token = get_token(addr, i)
57
- if (token[0] == '<' && token.index('>'))
57
+ if token[0] == '<' && token.index('>')
58
58
  end_i = token.index('>')
59
59
  address = token[1, end_i - 1]
60
- elsif (address == '')
60
+ elsif address == ''
61
61
  name << token
62
62
  end
63
63
  i += token.length
64
64
  end
65
65
 
66
66
  # Check if it's a simple email address of the form "jlim@google.com".
67
- if (address == '' && name.index('@'))
67
+ if address == '' && name.index('@')
68
68
  address = name
69
69
  name = ''
70
70
  end
71
71
 
72
- name = self.collapse_whitespace(name)
72
+ name = collapse_whitespace(name)
73
73
  name = name[1 .. -2] if name.start_with?('\'') && name.end_with?('\'')
74
74
  name = name[1 .. -2] if name.start_with?('"') && name.end_with?('"')
75
75
 
@@ -89,7 +89,7 @@ module MailAddress
89
89
  p = OPENERS_.index(ch)
90
90
  return ch unless p
91
91
 
92
- if (self.is_escaped_dbl_quote(str, pos))
92
+ if is_escaped_dbl_quote(str, pos)
93
93
  # If an opener is an escaped quote we do not treat it as a real opener
94
94
  # and keep accumulating the token.
95
95
  return ch
@@ -99,19 +99,18 @@ module MailAddress
99
99
 
100
100
  # If the closer is a quote we go forward skipping escaped quotes until we
101
101
  # hit the real closing one.
102
- while (end_pos && end_pos >= 0 && self.is_escaped_dbl_quote(str, end_pos))
102
+ while end_pos && end_pos >= 0 && is_escaped_dbl_quote(str, end_pos)
103
103
  end_pos = str.index(closer_char, end_pos + 1)
104
104
  end
105
105
 
106
- token = (end_pos && end_pos >= 0) ? str[pos .. end_pos] : ch
107
- return token
106
+ (end_pos && end_pos >= 0) ? str[pos .. end_pos] : ch
108
107
  end
109
108
 
110
109
  def self.is_escaped_dbl_quote(str, pos)
111
110
  return false if str[pos] != '"'
112
111
  slash_count = 0
113
112
 
114
- for idx in (pos - 1).downto(0)
113
+ (pos - 1).downto(0) do |idx|
115
114
  break unless str[idx] == '\\'
116
115
  slash_count += 1
117
116
  end
@@ -123,7 +122,7 @@ module MailAddress
123
122
  end
124
123
 
125
124
  def self.is_empty_or_whitespace(str)
126
- /\A[\s\xc2\xa0]*\z/ =~ str
125
+ str.match?(/\A[\s\xc2\xa0]*\z/)
127
126
  end
128
127
 
129
128
  def self.is_address_separator(ch)
@@ -1,3 +1,3 @@
1
1
  module MailAddress
2
- VERSION = "1.2.20"
2
+ VERSION = "1.3.1"
3
3
  end
data/lib/mail_address.rb CHANGED
@@ -4,5 +4,4 @@ module MailAddress
4
4
  require "mail_address/address"
5
5
  require "mail_address/mail_address"
6
6
  require "mail_address/simple_parser"
7
- require "mail_address/version"
8
7
  end
data/mail_address.gemspec CHANGED
@@ -1,5 +1,4 @@
1
- # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
1
+ lib = File.expand_path('lib', __dir__)
3
2
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
3
  require 'mail_address/version'
5
4
 
@@ -8,10 +7,11 @@ Gem::Specification.new do |spec|
8
7
  spec.version = MailAddress::VERSION
9
8
  spec.authors = ["Kizashi Nagata"]
10
9
  spec.email = ["kizashi1122@gmail.com"]
11
- spec.summary = %q{Simple Mail Address Parser}
12
- spec.description = %q{A practical mail address parser implemented based on Perl Module Mail::Address.}
10
+ spec.summary = "Simple Mail Address Parser"
11
+ spec.description = "A practical mail address parser implemented based on Perl Module Mail::Address."
13
12
  spec.homepage = "https://github.com/kizashi1122/mail_address"
14
13
  spec.license = "MIT"
14
+ spec.required_ruby_version = '>= 2.7'
15
15
 
16
16
  spec.files = `git ls-files -z`.split("\x0")
17
17
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
@@ -21,5 +21,6 @@ Gem::Specification.new do |spec|
21
21
  spec.add_development_dependency "bundler", "~> 2.1"
22
22
  spec.add_development_dependency "rake", "~> 13.0"
23
23
  spec.add_development_dependency 'rspec', '~> 3.1', '>= 3.1.0'
24
- spec.add_development_dependency "coveralls"
24
+ spec.add_development_dependency "simplecov", "~> 0.22"
25
+ spec.add_development_dependency "simplecov-lcov", "~> 0.8"
25
26
  end
data/spec/spec_helper.rb CHANGED
@@ -1,11 +1,14 @@
1
1
  require 'simplecov'
2
- require 'coveralls'
3
- Coveralls.wear!
4
2
 
5
- SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new([
6
- SimpleCov::Formatter::HTMLFormatter,
7
- Coveralls::SimpleCov::Formatter
8
- ])
3
+ if ENV['CI']
4
+ require 'simplecov-lcov'
5
+ SimpleCov::Formatter::LcovFormatter.config.report_with_single_file = true
6
+ SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new([
7
+ SimpleCov::Formatter::HTMLFormatter,
8
+ SimpleCov::Formatter::LcovFormatter
9
+ ])
10
+ end
11
+
9
12
  SimpleCov.start do
10
13
  add_filter '.bundle/'
11
14
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mail_address
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.20
4
+ version: 1.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kizashi Nagata
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-08-12 00:00:00.000000000 Z
11
+ date: 2026-02-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -59,19 +59,33 @@ dependencies:
59
59
  - !ruby/object:Gem::Version
60
60
  version: 3.1.0
61
61
  - !ruby/object:Gem::Dependency
62
- name: coveralls
62
+ name: simplecov
63
63
  requirement: !ruby/object:Gem::Requirement
64
64
  requirements:
65
- - - ">="
65
+ - - "~>"
66
66
  - !ruby/object:Gem::Version
67
- version: '0'
67
+ version: '0.22'
68
68
  type: :development
69
69
  prerelease: false
70
70
  version_requirements: !ruby/object:Gem::Requirement
71
71
  requirements:
72
- - - ">="
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '0.22'
75
+ - !ruby/object:Gem::Dependency
76
+ name: simplecov-lcov
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '0.8'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
73
87
  - !ruby/object:Gem::Version
74
- version: '0'
88
+ version: '0.8'
75
89
  description: A practical mail address parser implemented based on Perl Module Mail::Address.
76
90
  email:
77
91
  - kizashi1122@gmail.com
@@ -80,9 +94,10 @@ extensions: []
80
94
  extra_rdoc_files: []
81
95
  files:
82
96
  - ".coveralls.yml"
97
+ - ".github/workflows/test.yml"
83
98
  - ".gitignore"
84
99
  - ".rspec"
85
- - ".travis.yml"
100
+ - CLAUDE.md
86
101
  - Gemfile
87
102
  - LICENSE.txt
88
103
  - README.md
@@ -109,14 +124,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
109
124
  requirements:
110
125
  - - ">="
111
126
  - !ruby/object:Gem::Version
112
- version: '0'
127
+ version: '2.7'
113
128
  required_rubygems_version: !ruby/object:Gem::Requirement
114
129
  requirements:
115
130
  - - ">="
116
131
  - !ruby/object:Gem::Version
117
132
  version: '0'
118
133
  requirements: []
119
- rubygems_version: 3.1.2
134
+ rubygems_version: 3.1.6
120
135
  signing_key:
121
136
  specification_version: 4
122
137
  summary: Simple Mail Address Parser
data/.travis.yml DELETED
@@ -1,3 +0,0 @@
1
- language: ruby
2
- rvm:
3
- - 2.0.0