whois-parser-next 0.4.3 → 0.4.4

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: c58e47a473ff8911ebe65e7a94e538d557585d23196f8116cbeb9720a45f4421
4
- data.tar.gz: b2e930eecc35340b1812c7a6e351d87e22adf67f1a9a1efaa48c53d736452382
3
+ metadata.gz: f4c96a0a74b64788109bc1bf2d100571089e9bbbd49668c8146e175567b0f08c
4
+ data.tar.gz: e9e721292aaad948280edebea47d502ce309c1db903be8da692bfb50bf4e6e00
5
5
  SHA512:
6
- metadata.gz: eb08e46591a409452ee668eb3087b02221afaeec040bba662654e26f8b3b5ea2e02213efe68a7bad508d5cf9a74686534af72394bad0207b4c6ec784111eeeb9
7
- data.tar.gz: 632d2fe08d217051da515695dedec0f62f41bc145aad9cca96429adc7a822361c886a3b8414d99c517e71df6d56518a26528f96f72caf819d130cbcde1ffbdfb
6
+ metadata.gz: daf6ebf45111891d95f5c3bd6bc0bc57d5be7a0e641fd8054cdb359bf5bc64a2406db5cc4aeb9cf02e195e65a740abc15260b5f092f3c23b75a1c6927bc3a56a
7
+ data.tar.gz: 87849973634827aa16cc8ecad6e78031cf348ee01351709217bcfc9580cf9603a7943824d87df9a0222d76bf7940db020b4dc5928f2141f225390dfffc07e639
data/CHANGELOG.md CHANGED
@@ -2,6 +2,29 @@
2
2
 
3
3
  This project uses [Semantic Versioning 2.0.0](http://semver.org/).
4
4
 
5
+ #### Release 0.4.4 (2026-10-18)
6
+
7
+ - ADDED: Added parsers for the current `.gh` and `.do` CoCCA WHOIS response
8
+ shapes, including exact EPP registration states and `No Object Found`
9
+ absence responses. Added `.vu` handling for registered records and the exact
10
+ GoDaddy `No Data Found` response. Domain identity checks remain strict, and
11
+ mixed or ambiguous replies remain unknown.
12
+ - FIXED: Scope JWhois `NO OBJECT FOUND!` blocks to the named object. Missing
13
+ contact objects no longer make a domain with registered record data appear
14
+ available; absence requires one exact domain-object response. Malformed or
15
+ mixed domain absence remains unknown. Added two regression examples.
16
+ - EVIDENCE: IANA lists `whois.nic.gh`, `whois.nic.do`, and `whois.dnrs.vu`
17
+ for [`.gh`](https://www.iana.org/domains/root/db/gh.html),
18
+ [`.do`](https://www.iana.org/domains/root/db/do.html), and
19
+ [`.vu`](https://www.iana.org/domains/root/db/vu.html). IANA lists
20
+ `whois.mediaserv.net` for [`.mq`](https://www.iana.org/domains/root/db/mq.html).
21
+ The `.gh`, `.do`, and `.vu` fixtures are minimal synthetic shape controls;
22
+ the `.mq` regression uses an inline synthetic response. Live response
23
+ originals and personal contact details are not included.
24
+ - TESTED: The full suite passes 7,054 examples with 0 failures on Ruby 3.2.2
25
+ and 3.4.5. Package smoke passes on both versions. The supported-Ruby CI
26
+ matrix is the release gate.
27
+
5
28
  #### Release 0.4.3 (2026-10-18)
6
29
 
7
30
  - ADDED: Add the official `.ls` WHOIS parser for the registered `domain`,
@@ -1,6 +1,6 @@
1
1
  module Whois
2
2
  class Parser
3
3
  # The current library version.
4
- VERSION = "0.4.3".freeze
4
+ VERSION = "0.4.4".freeze
5
5
  end
6
6
  end
@@ -14,17 +14,25 @@ module Whois
14
14
  end
15
15
 
16
16
  property_supported :status do
17
- if available?
18
- :available
19
- elsif registered_evidence?
20
- :registered
17
+ text = content_for_scanner
18
+ domains = text.scan(/^domain:[ \t]*(\S+)[ \t]*\r?$/i).flatten
19
+ missing = text.scan(/^NO OBJECT FOUND![ \t]*\r?\nobject:[ \t]*(\S+)[ \t]*\r?\ntype:[ \t]*([^\r\n]+)$/i)
20
+ markers = text.scan(/^NO OBJECT FOUND![ \t]*\r?$/i).length
21
+ return :unknown unless markers == missing.length
22
+
23
+ if domains.empty?
24
+ missing.one? && missing.first.last.strip.casecmp('domain').zero? &&
25
+ missing.first.first.match?(/\A(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+(?:gf|mq)\z/i) ? :available : :unknown
26
+ elsif domains.one? && domains.first.match?(/\A(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+(?:gf|mq)\z/i) && registered_evidence?
27
+ # Referenced person objects may be absent while the domain exists.
28
+ missing.all? { |name, type| type.strip.casecmp('person').zero? && !name.casecmp(domains.first).zero? } ? :registered : :unknown
21
29
  else
22
30
  :unknown
23
31
  end
24
32
  end
25
33
 
26
34
  property_supported :available? do
27
- content_for_scanner.match?(/^NO OBJECT FOUND!\s*$/i)
35
+ status == :available
28
36
  end
29
37
 
30
38
  property_supported :registered? do
@@ -0,0 +1,26 @@
1
+ require_relative 'whois.biz'
2
+ require_relative 'registry_response_safety'
3
+
4
+ module Whois
5
+ class Parsers
6
+ class WhoisDnrsVu < WhoisBiz
7
+ include RegistryResponseSafety
8
+
9
+ property_supported :status do
10
+ text = content_for_scanner
11
+ absence = text.scan(/^No Data Found[ \t]*\r?$/i)
12
+ record = text.match?(/^(?:Domain Name|Registry Domain ID|Creation Date|Registry Expiry Date|Registrar|Domain Status|Name Server):[ \t]*\S/i)
13
+ if absence.any?
14
+ absence.one? && !record ? :available : :unknown
15
+ else
16
+ names = text.scan(/^Domain Name:[ \t]*([^\r\n]+)$/i).flatten.map(&:strip)
17
+ details = text.match?(/^(?:Registry Domain ID|Creation Date|Registry Expiry Date|Registrar):[ \t]*\S/i)
18
+ names.one? && names.first.match?(/\A(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+vu\z/i) && details ? :registered : :unknown
19
+ end
20
+ end
21
+
22
+ property_supported(:available?) { status == :available }
23
+ property_supported(:registered?) { status == :registered }
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,15 @@
1
+ require_relative 'base_cocca2'
2
+ require_relative 'cocca_epp_status'
3
+
4
+ module Whois
5
+ class Parsers
6
+ class WhoisNicDo < BaseCocca2
7
+ include CoccaEppStatus
8
+ CURRENT_COCCA_SUFFIX = "do".freeze
9
+
10
+ property_supported(:status) { current_cocca_status || :unknown }
11
+ property_supported(:available?) { status == :available }
12
+ property_supported(:registered?) { status == :registered }
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ require_relative 'base_cocca2'
2
+ require_relative 'cocca_epp_status'
3
+
4
+ module Whois
5
+ class Parsers
6
+ class WhoisNicGh < BaseCocca2
7
+ include CoccaEppStatus
8
+ CURRENT_COCCA_SUFFIX = "gh".freeze
9
+
10
+ property_supported(:status) { current_cocca_status || :unknown }
11
+ property_supported(:available?) { status == :available }
12
+ property_supported(:registered?) { status == :registered }
13
+ end
14
+ end
15
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: whois-parser-next
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.3
4
+ version: 0.4.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Simone Carletti
@@ -237,6 +237,7 @@ files:
237
237
  - lib/whois/parsers/whois.corporatedomains.com.rb
238
238
  - lib/whois/parsers/whois.denic.de.rb
239
239
  - lib/whois/parsers/whois.dk-hostmaster.dk.rb
240
+ - lib/whois/parsers/whois.dnrs.vu.rb
240
241
  - lib/whois/parsers/whois.dns.be.rb
241
242
  - lib/whois/parsers/whois.dns.hr.rb
242
243
  - lib/whois/parsers/whois.dns.lu.rb
@@ -399,6 +400,7 @@ files:
399
400
  - lib/whois/parsers/whois.nic.direct.rb
400
401
  - lib/whois/parsers/whois.nic.directory.rb
401
402
  - lib/whois/parsers/whois.nic.dm.rb
403
+ - lib/whois/parsers/whois.nic.do.rb
402
404
  - lib/whois/parsers/whois.nic.doctor.rb
403
405
  - lib/whois/parsers/whois.nic.dog.rb
404
406
  - lib/whois/parsers/whois.nic.domains.rb
@@ -442,6 +444,7 @@ files:
442
444
  - lib/whois/parsers/whois.nic.gd.rb
443
445
  - lib/whois/parsers/whois.nic.ge.rb
444
446
  - lib/whois/parsers/whois.nic.gent.rb
447
+ - lib/whois/parsers/whois.nic.gh.rb
445
448
  - lib/whois/parsers/whois.nic.gifts.rb
446
449
  - lib/whois/parsers/whois.nic.gives.rb
447
450
  - lib/whois/parsers/whois.nic.giving.rb