whois 2.0.7 → 2.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.rdoc +84 -10
- data/Rakefile +0 -7
- data/lib/core_ext.rb +9 -45
- data/lib/core_ext/array/extract_options.rb +29 -0
- data/lib/core_ext/array/wrap.rb +48 -0
- data/lib/core_ext/class/attribute.rb +115 -0
- data/lib/core_ext/date_time/conversions.rb +15 -0
- data/lib/core_ext/kernel/singleton_class.rb +13 -0
- data/lib/core_ext/module/remove_method.rb +16 -0
- data/lib/whois.rb +0 -4
- data/lib/whois/definitions/tlds.rb +10 -5
- data/lib/whois/record.rb +0 -3
- data/lib/whois/record/parser.rb +3 -3
- data/lib/whois/record/parser/NOTES.txt +15 -8
- data/lib/whois/record/parser/base.rb +12 -35
- data/lib/whois/record/parser/base_afilias.rb +156 -0
- data/lib/whois/record/parser/example.rb +8 -4
- data/lib/whois/record/parser/jobswhois.verisign-grs.com.rb +2 -2
- data/lib/whois/record/parser/scanners/afilias.rb +13 -4
- data/lib/whois/record/parser/{features → scanners}/ast.rb +1 -1
- data/lib/whois/record/parser/scanners/base.rb +9 -0
- data/lib/whois/record/parser/scanners/cnnic.rb +2 -2
- data/lib/whois/record/parser/scanners/{whoisbiz.rb → whois.biz.rb} +2 -8
- data/lib/whois/record/parser/scanners/whois.denic.de.rb +117 -0
- data/lib/whois/record/parser/scanners/whois.nic.hu.rb +187 -0
- data/lib/whois/record/parser/scanners/{whoisit.rb → whois.nic.it.rb} +2 -2
- data/lib/whois/record/parser/scanners/whois.registry.qa.rb +54 -0
- data/lib/whois/record/parser/scanners/whois.tld.ee.rb +41 -0
- data/lib/whois/record/parser/whois.aero.rb +8 -46
- data/lib/whois/record/parser/whois.afilias-grs.info.rb +2 -51
- data/lib/whois/record/parser/whois.afilias.info.rb +2 -126
- data/lib/whois/record/parser/whois.biz.rb +6 -6
- data/lib/whois/record/parser/whois.cnnic.cn.rb +5 -5
- data/lib/whois/record/parser/whois.crsnic.net.rb +2 -2
- data/lib/whois/record/parser/whois.denic.de.rb +8 -105
- data/lib/whois/record/parser/whois.dotmobiregistry.net.rb +2 -51
- data/lib/whois/record/parser/whois.godaddy.com.rb +138 -0
- data/lib/whois/record/parser/whois.iana.org.rb +2 -2
- data/lib/whois/record/parser/whois.markmonitor.com.rb +13 -12
- data/lib/whois/record/parser/whois.meregistry.net.rb +45 -30
- data/lib/whois/record/parser/whois.nic.af.rb +6 -2
- data/lib/whois/record/parser/whois.nic.ag.rb +2 -51
- data/lib/whois/record/parser/whois.nic.asia.rb +47 -38
- data/lib/whois/record/parser/whois.nic.cc.rb +2 -2
- data/lib/whois/record/parser/whois.nic.hu.rb +7 -174
- data/lib/whois/record/parser/whois.nic.it.rb +6 -6
- data/lib/whois/record/parser/whois.nic.name.rb +1 -5
- data/lib/whois/record/parser/whois.nic.travel.rb +4 -12
- data/lib/whois/record/parser/whois.nic.tv.rb +2 -2
- data/lib/whois/record/parser/whois.nic.us.rb +4 -4
- data/lib/whois/record/parser/whois.nic.xxx.rb +5 -112
- data/lib/whois/record/parser/whois.publicinterestregistry.net.rb +8 -168
- data/lib/whois/record/parser/whois.registry.in.rb +2 -60
- data/lib/whois/record/parser/whois.registry.qa.rb +117 -0
- data/lib/whois/record/parser/whois.ripn.net.rb +4 -84
- data/lib/whois/record/parser/whois.sgnic.sg.rb +13 -5
- data/lib/whois/record/parser/whois.tcinet.ru.rb +102 -0
- data/lib/whois/record/parser/whois.tld.ee.rb +5 -26
- data/lib/whois/record/parser/whois.tonic.to.rb +0 -8
- data/lib/whois/server/adapters/base.rb +23 -10
- data/lib/whois/version.rb +2 -2
- data/spec/fixtures/responses/FIND.txt +1 -0
- data/spec/fixtures/responses/whois.aero/status_available.expected +35 -1
- data/spec/fixtures/responses/whois.aero/status_registered.expected +77 -1
- data/spec/fixtures/responses/whois.afilias-grs.info/bz/status_available.expected +34 -0
- data/spec/fixtures/responses/whois.afilias-grs.info/bz/status_registered.expected +39 -2
- data/spec/fixtures/responses/whois.afilias-grs.info/bz/status_registered.txt +2 -82
- data/spec/fixtures/responses/whois.afilias-grs.info/gi/status_available.expected +34 -0
- data/spec/fixtures/responses/whois.afilias-grs.info/gi/status_registered.expected +76 -0
- data/spec/fixtures/responses/whois.afilias-grs.info/hn/status_available.expected +34 -0
- data/spec/fixtures/responses/whois.afilias-grs.info/hn/status_registered.expected +76 -0
- data/spec/fixtures/responses/whois.afilias-grs.info/lc/status_available.expected +34 -0
- data/spec/fixtures/responses/whois.afilias-grs.info/lc/status_registered.expected +76 -0
- data/spec/fixtures/responses/whois.afilias-grs.info/mn/status_available.expected +34 -0
- data/spec/fixtures/responses/whois.afilias-grs.info/mn/status_registered.expected +76 -0
- data/spec/fixtures/responses/whois.afilias-grs.info/sc/status_available.expected +57 -0
- data/spec/fixtures/responses/whois.afilias-grs.info/sc/status_registered.expected +76 -0
- data/spec/fixtures/responses/whois.afilias-grs.info/vc/status_available.expected +34 -0
- data/spec/fixtures/responses/whois.afilias-grs.info/vc/status_registered.expected +76 -0
- data/spec/fixtures/responses/whois.dotmobiregistry.net/status_available.expected +35 -0
- data/spec/fixtures/responses/whois.dotmobiregistry.net/status_available.txt +1 -25
- data/spec/fixtures/responses/whois.dotmobiregistry.net/status_registered.expected +76 -0
- data/spec/fixtures/responses/whois.educause.edu/{properties_updated_on_unknown.expected → property_updated_on_unknown.expected} +0 -0
- data/spec/fixtures/responses/whois.educause.edu/{properties_updated_on_unknown.txt → property_updated_on_unknown.txt} +0 -0
- data/spec/fixtures/responses/whois.godaddy.com/status_registered.expected +87 -0
- data/spec/fixtures/responses/whois.godaddy.com/status_registered.txt +60 -0
- data/spec/fixtures/responses/whois.markmonitor.com/{properties_empty_contacts.expected → property_contacts_are_blank.expected} +0 -0
- data/spec/fixtures/responses/whois.markmonitor.com/{properties_empty_contacts.txt → property_contacts_are_blank.txt} +0 -0
- data/spec/fixtures/responses/whois.meregistry.net/{property_nameservers_is_missing.expected → property_nameservers_is_blank.expected} +0 -0
- data/spec/fixtures/responses/whois.meregistry.net/{property_nameservers_is_missing.txt → property_nameservers_is_blank.txt} +0 -0
- data/spec/fixtures/responses/whois.meregistry.net/status_available.expected +34 -0
- data/spec/fixtures/responses/whois.meregistry.net/status_registered.expected +77 -0
- data/spec/fixtures/responses/whois.meregistry.net/status_registered.txt +1 -1
- data/spec/fixtures/responses/{whois.nic.asia/property_status_client_delete_prohibited.expected → whois.nic.af/property_status_active.expected} +0 -0
- data/spec/fixtures/responses/whois.nic.af/property_status_active.txt +56 -0
- data/spec/fixtures/responses/{whois.nic.asia/property_status_client_transfer_prohibited.expected → whois.nic.af/property_status_delegated.expected} +0 -0
- data/spec/fixtures/responses/whois.nic.af/property_status_delegated.txt +46 -0
- data/spec/fixtures/responses/whois.nic.af/property_status_not_registered.expected +8 -0
- data/spec/fixtures/responses/whois.nic.af/property_status_not_registered.txt +13 -0
- data/spec/fixtures/responses/whois.nic.ag/status_available.expected +34 -0
- data/spec/fixtures/responses/whois.nic.ag/status_registered.expected +76 -0
- data/spec/fixtures/responses/whois.nic.asia/property_status_multiple.expected +8 -0
- data/spec/fixtures/responses/whois.nic.asia/{property_status_client_delete_prohibited.txt → property_status_multiple.txt} +0 -0
- data/spec/fixtures/responses/whois.nic.asia/property_status_single.expected +8 -0
- data/spec/fixtures/responses/whois.nic.asia/{property_status_client_transfer_prohibited.txt → property_status_single.txt} +76 -76
- data/spec/fixtures/responses/whois.nic.asia/status_available.expected +35 -1
- data/spec/fixtures/responses/whois.nic.asia/status_registered.expected +78 -1
- data/spec/fixtures/responses/whois.nic.dz/{status_available.expected → dz/status_available.expected} +0 -0
- data/spec/fixtures/responses/whois.nic.dz/{status_available.txt → dz/status_available.txt} +0 -0
- data/spec/fixtures/responses/whois.nic.dz/{status_registered.expected → dz/status_registered.expected} +0 -0
- data/spec/fixtures/responses/whois.nic.dz/{status_registered.txt → dz/status_registered.txt} +0 -0
- data/spec/fixtures/responses/whois.nic.name/status_available.expected +1 -1
- data/spec/fixtures/responses/whois.nic.name/status_registered.expected +1 -1
- data/spec/fixtures/responses/whois.nic.travel/property_status_multiple.expected +2 -0
- data/spec/fixtures/responses/whois.nic.travel/property_status_multiple.txt +83 -0
- data/spec/fixtures/responses/whois.nic.travel/property_status_single.expected +2 -0
- data/spec/fixtures/responses/whois.nic.travel/property_status_single.txt +75 -0
- data/spec/fixtures/responses/whois.nic.travel/status_available.expected +1 -1
- data/spec/fixtures/responses/whois.nic.travel/status_registered.expected +1 -1
- data/spec/fixtures/responses/whois.nic.xxx/property_updated_on_blank.expected +2 -0
- data/spec/fixtures/responses/whois.nic.xxx/property_updated_on_blank.txt +98 -0
- data/spec/fixtures/responses/whois.nic.xxx/status_registered.expected +45 -46
- data/spec/fixtures/responses/whois.nic.xxx/status_registered.txt +61 -61
- data/spec/fixtures/responses/whois.publicinterestregistry.net/status_available.expected +1 -1
- data/spec/fixtures/responses/whois.publicinterestregistry.net/status_registered.expected +8 -1
- data/spec/fixtures/responses/whois.registry.in/property_status_missing.expected +1 -1
- data/spec/fixtures/responses/whois.registry.in/property_status_multiple.expected +1 -1
- data/spec/fixtures/responses/whois.registry.in/property_status_ok.expected +1 -1
- data/spec/fixtures/responses/whois.registry.in/status_available.expected +31 -1
- data/spec/fixtures/responses/whois.registry.in/status_registered.expected +70 -1
- data/spec/fixtures/responses/whois.registry.qa/qa/status_available.expected +56 -0
- data/spec/fixtures/responses/whois.registry.qa/qa/status_available.txt +1 -0
- data/spec/fixtures/responses/whois.registry.qa/qa/status_registered.expected +91 -0
- data/spec/fixtures/responses/whois.registry.qa/qa/status_registered.txt +23 -0
- data/spec/fixtures/responses/whois.sgnic.sg/property_nameservers_schema_1_with_ip.expected +12 -0
- data/spec/fixtures/responses/whois.sgnic.sg/property_nameservers_schema_1_with_ip.txt +94 -0
- data/spec/fixtures/responses/{whois.ripn.net → whois.tcinet.ru}/ru/property_nameservers_with_ip.expected +0 -0
- data/spec/fixtures/responses/{whois.ripn.net → whois.tcinet.ru}/ru/property_nameservers_with_ip.txt +0 -0
- data/spec/fixtures/responses/{whois.ripn.net → whois.tcinet.ru}/ru/status_available.expected +0 -0
- data/spec/fixtures/responses/{whois.ripn.net → whois.tcinet.ru}/ru/status_available.txt +0 -0
- data/spec/fixtures/responses/{whois.ripn.net → whois.tcinet.ru}/ru/status_registered.expected +0 -0
- data/spec/fixtures/responses/{whois.ripn.net → whois.tcinet.ru}/ru/status_registered.txt +0 -0
- data/spec/fixtures/responses/{whois.ripn.net → whois.tcinet.ru}/su/status_available.expected +0 -0
- data/spec/fixtures/responses/{whois.ripn.net → whois.tcinet.ru}/su/status_available.txt +0 -0
- data/spec/fixtures/responses/{whois.ripn.net → whois.tcinet.ru}/su/status_registered.expected +0 -0
- data/spec/fixtures/responses/{whois.ripn.net → whois.tcinet.ru}/su/status_registered.txt +0 -0
- data/spec/fixtures/responses/{whois.ripn.net → whois.tcinet.ru}/xn--p1ai/status_available.expected +0 -0
- data/spec/fixtures/responses/{whois.ripn.net → whois.tcinet.ru}/xn--p1ai/status_available.txt +0 -0
- data/spec/fixtures/responses/{whois.ripn.net → whois.tcinet.ru}/xn--p1ai/status_registered.expected +0 -0
- data/spec/fixtures/responses/{whois.ripn.net → whois.tcinet.ru}/xn--p1ai/status_registered.txt +0 -0
- data/spec/integration_spec.rb +29 -12
- data/spec/support/helpers/spec_helper.rb +0 -10
- data/spec/tlds +1 -1
- data/spec/whois/record/parser/base_spec.rb +23 -51
- data/spec/whois/record/parser/responses/whois.aero/status_available_spec.rb +49 -1
- data/spec/whois/record/parser/responses/whois.aero/status_registered_spec.rb +91 -1
- data/spec/whois/record/parser/responses/whois.afilias-grs.info/bz/status_available_spec.rb +48 -0
- data/spec/whois/record/parser/responses/whois.afilias-grs.info/bz/status_registered_spec.rb +53 -2
- data/spec/whois/record/parser/responses/whois.afilias-grs.info/gi/status_available_spec.rb +48 -0
- data/spec/whois/record/parser/responses/whois.afilias-grs.info/gi/status_registered_spec.rb +90 -0
- data/spec/whois/record/parser/responses/whois.afilias-grs.info/hn/status_available_spec.rb +48 -0
- data/spec/whois/record/parser/responses/whois.afilias-grs.info/hn/status_registered_spec.rb +90 -0
- data/spec/whois/record/parser/responses/whois.afilias-grs.info/lc/status_available_spec.rb +48 -0
- data/spec/whois/record/parser/responses/whois.afilias-grs.info/lc/status_registered_spec.rb +90 -0
- data/spec/whois/record/parser/responses/whois.afilias-grs.info/mn/status_available_spec.rb +48 -0
- data/spec/whois/record/parser/responses/whois.afilias-grs.info/mn/status_registered_spec.rb +90 -0
- data/spec/whois/record/parser/responses/whois.afilias-grs.info/sc/status_available_spec.rb +48 -0
- data/spec/whois/record/parser/responses/whois.afilias-grs.info/sc/status_registered_spec.rb +90 -0
- data/spec/whois/record/parser/responses/whois.afilias-grs.info/vc/status_available_spec.rb +48 -0
- data/spec/whois/record/parser/responses/whois.afilias-grs.info/vc/status_registered_spec.rb +90 -0
- data/spec/whois/record/parser/responses/whois.dotmobiregistry.net/status_available_spec.rb +48 -0
- data/spec/whois/record/parser/responses/whois.dotmobiregistry.net/status_registered_spec.rb +90 -0
- data/spec/whois/record/parser/responses/whois.educause.edu/{properties_updated_on_unknown_spec.rb → property_updated_on_unknown_spec.rb} +3 -3
- data/spec/whois/record/parser/responses/whois.godaddy.com/status_registered_spec.rb +131 -0
- data/spec/whois/record/parser/responses/whois.markmonitor.com/{properties_empty_contacts_spec.rb → property_contacts_are_blank_spec.rb} +3 -3
- data/spec/whois/record/parser/responses/whois.meregistry.net/{property_nameservers_is_missing_spec.rb → property_nameservers_is_blank_spec.rb} +3 -3
- data/spec/whois/record/parser/responses/whois.meregistry.net/status_available_spec.rb +48 -0
- data/spec/whois/record/parser/responses/whois.meregistry.net/status_registered_spec.rb +91 -0
- data/spec/whois/record/parser/responses/whois.nic.af/property_status_active_spec.rb +39 -0
- data/spec/whois/record/parser/responses/whois.nic.af/property_status_delegated_spec.rb +39 -0
- data/spec/whois/record/parser/responses/whois.nic.af/property_status_not_registered_spec.rb +39 -0
- data/spec/whois/record/parser/responses/whois.nic.ag/status_available_spec.rb +48 -0
- data/spec/whois/record/parser/responses/whois.nic.ag/status_registered_spec.rb +90 -0
- data/spec/whois/record/parser/responses/whois.nic.asia/{property_status_client_delete_prohibited_spec.rb → property_status_multiple_spec.rb} +4 -4
- data/spec/whois/record/parser/responses/whois.nic.asia/{property_status_client_transfer_prohibited_spec.rb → property_status_single_spec.rb} +4 -4
- data/spec/whois/record/parser/responses/whois.nic.asia/status_available_spec.rb +49 -1
- data/spec/whois/record/parser/responses/whois.nic.asia/status_registered_spec.rb +92 -1
- data/spec/whois/record/parser/responses/whois.nic.dz/{status_available_spec.rb → dz/status_available_spec.rb} +2 -2
- data/spec/whois/record/parser/responses/whois.nic.dz/{status_registered_spec.rb → dz/status_registered_spec.rb} +2 -2
- data/spec/whois/record/parser/responses/whois.nic.name/status_available_spec.rb +1 -1
- data/spec/whois/record/parser/responses/whois.nic.name/status_registered_spec.rb +1 -1
- data/spec/whois/record/parser/responses/whois.nic.travel/property_status_multiple_spec.rb +29 -0
- data/spec/whois/record/parser/responses/whois.nic.travel/property_status_single_spec.rb +29 -0
- data/spec/whois/record/parser/responses/whois.nic.travel/status_available_spec.rb +1 -1
- data/spec/whois/record/parser/responses/whois.nic.travel/status_registered_spec.rb +1 -1
- data/spec/whois/record/parser/responses/whois.nic.xxx/property_updated_on_blank_spec.rb +29 -0
- data/spec/whois/record/parser/responses/whois.nic.xxx/status_registered_spec.rb +45 -46
- data/spec/whois/record/parser/responses/whois.publicinterestregistry.net/status_available_spec.rb +1 -1
- data/spec/whois/record/parser/responses/whois.publicinterestregistry.net/status_registered_spec.rb +11 -1
- data/spec/whois/record/parser/responses/whois.registry.in/property_status_missing_spec.rb +1 -1
- data/spec/whois/record/parser/responses/whois.registry.in/property_status_multiple_spec.rb +1 -1
- data/spec/whois/record/parser/responses/whois.registry.in/property_status_ok_spec.rb +1 -1
- data/spec/whois/record/parser/responses/whois.registry.in/status_available_spec.rb +44 -1
- data/spec/whois/record/parser/responses/whois.registry.in/status_registered_spec.rb +83 -1
- data/spec/whois/record/parser/responses/whois.registry.qa/qa/status_available_spec.rb +107 -0
- data/spec/whois/record/parser/responses/whois.registry.qa/qa/status_registered_spec.rb +142 -0
- data/spec/whois/record/parser/responses/whois.sgnic.sg/property_nameservers_schema_1_with_ip_spec.rb +39 -0
- data/spec/whois/record/parser/responses/{whois.ripn.net → whois.tcinet.ru}/ru/property_nameservers_with_ip_spec.rb +4 -4
- data/spec/whois/record/parser/responses/{whois.ripn.net/su → whois.tcinet.ru/ru}/status_available_spec.rb +4 -4
- data/spec/whois/record/parser/responses/{whois.ripn.net → whois.tcinet.ru}/ru/status_registered_spec.rb +4 -4
- data/spec/whois/record/parser/responses/{whois.ripn.net/ru → whois.tcinet.ru/su}/status_available_spec.rb +4 -4
- data/spec/whois/record/parser/responses/{whois.ripn.net → whois.tcinet.ru}/su/status_registered_spec.rb +4 -4
- data/spec/whois/record/parser/responses/{whois.ripn.net → whois.tcinet.ru}/xn--p1ai/status_available_spec.rb +4 -4
- data/spec/whois/record/parser/responses/{whois.ripn.net → whois.tcinet.ru}/xn--p1ai/status_registered_spec.rb +4 -4
- data/spec/whois/record_spec.rb +4 -4
- data/spec/whois/server/adapters/afilias_spec.rb +3 -3
- data/spec/whois/server/adapters/base_spec.rb +50 -10
- data/spec/whois/server/adapters/formatted_spec.rb +4 -4
- data/spec/whois/server/adapters/pir_spec.rb +3 -3
- data/spec/whois/server/adapters/standard_spec.rb +4 -4
- data/spec/whois/server/adapters/verisign_spec.rb +7 -7
- data/whois.gemspec +4 -4
- metadata +101 -57
- data/lib/whois/answer.rb +0 -14
data/CHANGELOG.rdoc
CHANGED
@@ -1,6 +1,68 @@
|
|
1
1
|
= Changelog
|
2
2
|
|
3
3
|
|
4
|
+
== Release 2.1.0
|
5
|
+
|
6
|
+
* SERVER: Added .COM.DE, .GR.COM, .US.ORG TLD definitions.
|
7
|
+
|
8
|
+
* SERVER: Updated .QA and .XN--WGBL6A TLD definitions.
|
9
|
+
|
10
|
+
* SERVER: Updated .SU, .RU and .XN--P1AI TLD definitions (#87).
|
11
|
+
|
12
|
+
* SERVER: Added the following new IDN TLDs:
|
13
|
+
* .XN--LGBBAT1AD8J (.الجزائر, Algeria) (#95)
|
14
|
+
* .XN--MGBC0A9AZCG (.المغرب, Morocco) (#96)
|
15
|
+
|
16
|
+
* NEW: Ability to define inheritable parsers
|
17
|
+
|
18
|
+
class Whois::Record::Parser::Afilias < Whois::Record::Parser::Base
|
19
|
+
end
|
20
|
+
|
21
|
+
class Whois::Record::Parser::WhoisNicXxx < Whois::Record::Parser::Afilias
|
22
|
+
end
|
23
|
+
|
24
|
+
Parsers will inherits all the properties from their parents.
|
25
|
+
|
26
|
+
* NEW: Added the following full parsers:
|
27
|
+
* whois.nic.asia
|
28
|
+
* whois.meregistry.net
|
29
|
+
* whois.dotmobiregistry.net
|
30
|
+
* whois.publicinternetregistry.net
|
31
|
+
* whois.registry.in
|
32
|
+
* whis.nic.ag
|
33
|
+
* whois.afilias-grs.info
|
34
|
+
* whois.aero
|
35
|
+
* whois.nic.xx
|
36
|
+
* whois.afilias.info
|
37
|
+
* whois.registry.qa (#114)
|
38
|
+
* whois.godaddy.com (#105)
|
39
|
+
|
40
|
+
* CHANGED: use the first public .XXX domain to test the whois.nic.xx response format.
|
41
|
+
|
42
|
+
* CHANGED: whois.sgnic.sg changed nameservers response format (again).
|
43
|
+
|
44
|
+
* CHANGED: Extended core_ext section. Since all the extensions belong to ActiveSupport,
|
45
|
+
the library attempts to use ActiveSupport if loaded.
|
46
|
+
|
47
|
+
* CHANGED: Renamed whois.ripn.net to whois.tcinet.ru (#87)
|
48
|
+
|
49
|
+
* FIXED: In a very rare situation the Whois::Client raises a
|
50
|
+
`Errno::EINVAL: Invalid argument - bind(2)' error attempting to connect
|
51
|
+
to a WHOIS server (see #40).
|
52
|
+
|
53
|
+
* FIXED: whois.nic.travel parser must support multiple statuses.
|
54
|
+
|
55
|
+
* FIXED: whois.nic.name parser must support multiple statuses.
|
56
|
+
|
57
|
+
* FIXED: whois.nic.af parser must support `Delegated' status.
|
58
|
+
|
59
|
+
* REMOVED: Removed deprecated Whois::Answer class.
|
60
|
+
|
61
|
+
* REMOVED: Removed deprecated Whois::Record#== behavior.
|
62
|
+
|
63
|
+
* REMOVED: Removed deprecated Whois::Record::Parser::WhoisTonicTo#incomplete_response? method.
|
64
|
+
|
65
|
+
|
4
66
|
== Release 2.0.7
|
5
67
|
|
6
68
|
* CHANGED: whois.dns.pt changed nameservers response format.
|
@@ -35,7 +97,8 @@
|
|
35
97
|
|
36
98
|
* NEW: Added base whois.nic.sm parser (#97).
|
37
99
|
|
38
|
-
* FIXED: whois.meregistry.net parser raises `no time information in ""'
|
100
|
+
* FIXED: whois.meregistry.net parser raises `no time information in ""'
|
101
|
+
when updated_at property is blank.
|
39
102
|
|
40
103
|
* FIXED: whois.nic.it parser must support `NO-PROVIDER' status.
|
41
104
|
|
@@ -45,7 +108,7 @@
|
|
45
108
|
|
46
109
|
* FIXED: whois.nic.cz parser must support `Update prohibited' status.
|
47
110
|
|
48
|
-
* FIXED: The Verisign WHOIS adapter crashes in some rare circumstances
|
111
|
+
* FIXED: The Verisign WHOIS adapter crashes in some rare circumstances
|
49
112
|
when the response from the Verisign database doesn't contain a
|
50
113
|
referral (#103)
|
51
114
|
|
@@ -65,7 +128,8 @@
|
|
65
128
|
|
66
129
|
* FIXED: whois.nic.it parser must support pendingUpdate and pendingTransfer statuses.
|
67
130
|
|
68
|
-
* FIXED: whois.nic-se.se crashes in some cases where the modified:
|
131
|
+
* FIXED: whois.nic-se.se crashes in some cases where the `modified:'
|
132
|
+
attribute is an invalid date.
|
69
133
|
|
70
134
|
|
71
135
|
== Release 2.0.3
|
@@ -167,8 +231,9 @@
|
|
167
231
|
|
168
232
|
* CHANGED: Renamed Whois::Server::Adapters::Base#append_to_buffer to buffer_append.
|
169
233
|
|
170
|
-
* CHANGED: Whois::Answer::Parser::Base#response_throttled? and Whois::Answer::Parser::Base#invalid?
|
171
|
-
|
234
|
+
* CHANGED: Whois::Answer::Parser::Base#response_throttled? and Whois::Answer::Parser::Base#invalid?
|
235
|
+
are not defined by default. Define the method in the implementation,
|
236
|
+
and Whois::Answer::Parser will automatically use it.
|
172
237
|
|
173
238
|
* CHANGED: Removed &block from method definition to avoid creating block objects when yield is used (#66)
|
174
239
|
|
@@ -180,9 +245,12 @@
|
|
180
245
|
|
181
246
|
* CHANGED: Change #nameservers property to return an Array of Nameserver (#76, see #71, see #64).
|
182
247
|
|
183
|
-
* CHANGED: Whois#query no longer raises Errno or SocketError.
|
248
|
+
* CHANGED: Whois#query no longer raises Errno or SocketError.
|
249
|
+
The errors are now rescued and re-raised as Whois::ConnectionError.
|
184
250
|
|
185
|
-
* CHANGED: #admin_contact, #technical_contact and #registrant_contact
|
251
|
+
* CHANGED: #admin_contact, #technical_contact and #registrant_contact
|
252
|
+
have been renamed to #admin_contacts, #technical_contacts and #registrant_contacts
|
253
|
+
and they now returns an array of Contact, instead of a single Contact.
|
186
254
|
|
187
255
|
* CHANGED: Migrated all tests to RSpec.
|
188
256
|
|
@@ -193,7 +261,8 @@
|
|
193
261
|
|
194
262
|
* FIXED: Make sure a warning is issued when #registered? or #available? returns nil.
|
195
263
|
|
196
|
-
* FIXED: Fixed a bug with the whois.crsnic.net parser where the name server
|
264
|
+
* FIXED: Fixed a bug with the whois.crsnic.net parser where the name server
|
265
|
+
contains "no nameserver" instead of a valid host.
|
197
266
|
|
198
267
|
* FIXED: Fixed a bug which prevents a client to be created with nil timeout.
|
199
268
|
|
@@ -236,9 +305,14 @@
|
|
236
305
|
* Whois#query no longer raises Errno::ECONNRESET, Errno::EHOSTUNREACH, Errno::ECONNREFUSED, SocketError.
|
237
306
|
The errors are now rescued and re-raised as Whois::ConnectionError.
|
238
307
|
|
239
|
-
* #admin_contact, #technical_contact and #registrant_contact
|
308
|
+
* #admin_contact, #technical_contact and #registrant_contact
|
309
|
+
have been renamed to #admin_contacts, #technical_contacts and #registrant_contacts
|
310
|
+
and they now returns an array of Contact, instead of a single Contact.
|
311
|
+
#admin_contact, #technical_contact and #registrant_contact still exists
|
312
|
+
in the Answer as a convenient shortcut.
|
240
313
|
|
241
|
-
* Renamed Whois::Answer::Parser::Base.register_property to
|
314
|
+
* Renamed Whois::Answer::Parser::Base.register_property to
|
315
|
+
Whois::Answer::Parser::Base.property_register.
|
242
316
|
|
243
317
|
|
244
318
|
== Release 1.6.6
|
data/Rakefile
CHANGED
@@ -118,13 +118,6 @@ YARD::Rake::YardocTask.new(:yardoc) do |y|
|
|
118
118
|
end
|
119
119
|
|
120
120
|
namespace :yardoc do
|
121
|
-
desc "Publish YARD documentation to the site"
|
122
|
-
task :publish => ["yardoc:clobber", "yardoc"] do
|
123
|
-
ENV["username"] || raise(ArgumentError, "Missing ssh username")
|
124
|
-
sh "rsync -avz --delete yardoc/ #{ENV["username"]}@alamak:/home/#{ENV["username"]}/ruby-whois.org/api"
|
125
|
-
end
|
126
|
-
|
127
|
-
desc "Remove YARD products"
|
128
121
|
task :clobber do
|
129
122
|
rm_r "yardoc" rescue nil
|
130
123
|
end
|
data/lib/core_ext.rb
CHANGED
@@ -1,45 +1,9 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
#
|
11
|
-
# Extracted from ActiveSupport.
|
12
|
-
def to_time
|
13
|
-
self.offset == 0 ? ::Time.utc(year, month, day, hour, min, sec) : self
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
end
|
18
|
-
|
19
|
-
|
20
|
-
class Array
|
21
|
-
|
22
|
-
# Wraps its argument in an array unless it is already an array (or array-like).
|
23
|
-
#
|
24
|
-
# Specifically:
|
25
|
-
#
|
26
|
-
# * If the argument is +nil+ an empty list is returned.
|
27
|
-
# * Otherwise, if the argument responds to +to_ary+ it is invoked, and its result returned.
|
28
|
-
# * Otherwise, returns an array with the argument as its single element.
|
29
|
-
#
|
30
|
-
# Array.wrap(nil) # => []
|
31
|
-
# Array.wrap([1, 2, 3]) # => [1, 2, 3]
|
32
|
-
# Array.wrap(0) # => [0]
|
33
|
-
#
|
34
|
-
# Extracted from ActiveSupport.
|
35
|
-
def self.wrap(object)
|
36
|
-
if object.nil?
|
37
|
-
[]
|
38
|
-
elsif object.respond_to?(:to_ary)
|
39
|
-
object.to_ary
|
40
|
-
else
|
41
|
-
[object]
|
42
|
-
end
|
43
|
-
end unless respond_to?(:wrap)
|
44
|
-
|
45
|
-
end
|
1
|
+
if defined?(ActiveSupport) && ActiveSupport::VERSION::MAJOR == 3
|
2
|
+
require 'active_support/core_ext/array/wrap'
|
3
|
+
require 'active_support/core_ext/date_time/conversions'
|
4
|
+
require 'core_ext/class/attribute'
|
5
|
+
else
|
6
|
+
require 'core_ext/array/wrap'
|
7
|
+
require 'core_ext/date_time/conversions'
|
8
|
+
require 'core_ext/class/attribute'
|
9
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
class Hash
|
2
|
+
# By default, only instances of Hash itself are extractable.
|
3
|
+
# Subclasses of Hash may implement this method and return
|
4
|
+
# true to declare themselves as extractable. If a Hash
|
5
|
+
# is extractable, Array#extract_options! pops it from
|
6
|
+
# the Array when it is the last element of the Array.
|
7
|
+
def extractable_options?
|
8
|
+
instance_of?(Hash)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
class Array
|
13
|
+
# Extracts options from a set of arguments. Removes and returns the last
|
14
|
+
# element in the array if it's a hash, otherwise returns a blank hash.
|
15
|
+
#
|
16
|
+
# def options(*args)
|
17
|
+
# args.extract_options!
|
18
|
+
# end
|
19
|
+
#
|
20
|
+
# options(1, 2) # => {}
|
21
|
+
# options(1, 2, :a => :b) # => {:a=>:b}
|
22
|
+
def extract_options!
|
23
|
+
if last.is_a?(Hash) && last.extractable_options?
|
24
|
+
pop
|
25
|
+
else
|
26
|
+
{}
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
class Array
|
2
|
+
# Wraps its argument in an array unless it is already an array (or array-like).
|
3
|
+
#
|
4
|
+
# Specifically:
|
5
|
+
#
|
6
|
+
# * If the argument is +nil+ an empty list is returned.
|
7
|
+
# * Otherwise, if the argument responds to +to_ary+ it is invoked, and its result returned.
|
8
|
+
# * Otherwise, returns an array with the argument as its single element.
|
9
|
+
#
|
10
|
+
# Array.wrap(nil) # => []
|
11
|
+
# Array.wrap([1, 2, 3]) # => [1, 2, 3]
|
12
|
+
# Array.wrap(0) # => [0]
|
13
|
+
#
|
14
|
+
# This method is similar in purpose to <tt>Kernel#Array</tt>, but there are some differences:
|
15
|
+
#
|
16
|
+
# * If the argument responds to +to_ary+ the method is invoked. <tt>Kernel#Array</tt>
|
17
|
+
# moves on to try +to_a+ if the returned value is +nil+, but <tt>Array.wrap</tt> returns
|
18
|
+
# such a +nil+ right away.
|
19
|
+
# * If the returned value from +to_ary+ is neither +nil+ nor an +Array+ object, <tt>Kernel#Array</tt>
|
20
|
+
# raises an exception, while <tt>Array.wrap</tt> does not, it just returns the value.
|
21
|
+
# * It does not call +to_a+ on the argument, though special-cases +nil+ to return an empty array.
|
22
|
+
#
|
23
|
+
# The last point is particularly worth comparing for some enumerables:
|
24
|
+
#
|
25
|
+
# Array(:foo => :bar) # => [[:foo, :bar]]
|
26
|
+
# Array.wrap(:foo => :bar) # => [{:foo => :bar}]
|
27
|
+
#
|
28
|
+
# Array("foo\nbar") # => ["foo\n", "bar"], in Ruby 1.8
|
29
|
+
# Array.wrap("foo\nbar") # => ["foo\nbar"]
|
30
|
+
#
|
31
|
+
# There's also a related idiom that uses the splat operator:
|
32
|
+
#
|
33
|
+
# [*object]
|
34
|
+
#
|
35
|
+
# which returns <tt>[nil]</tt> for +nil+, and calls to <tt>Array(object)</tt> otherwise.
|
36
|
+
#
|
37
|
+
# Thus, in this case the behavior is different for +nil+, and the differences with
|
38
|
+
# <tt>Kernel#Array</tt> explained above apply to the rest of +object+s.
|
39
|
+
def self.wrap(object)
|
40
|
+
if object.nil?
|
41
|
+
[]
|
42
|
+
elsif object.respond_to?(:to_ary)
|
43
|
+
object.to_ary || [object]
|
44
|
+
else
|
45
|
+
[object]
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,115 @@
|
|
1
|
+
require 'core_ext/kernel/singleton_class'
|
2
|
+
require 'core_ext/module/remove_method'
|
3
|
+
require 'core_ext/array/extract_options'
|
4
|
+
|
5
|
+
class Class
|
6
|
+
# Declare a class-level attribute whose value is inheritable by subclasses.
|
7
|
+
# Subclasses can change their own value and it will not impact parent class.
|
8
|
+
#
|
9
|
+
# class Base
|
10
|
+
# class_attribute :setting
|
11
|
+
# end
|
12
|
+
#
|
13
|
+
# class Subclass < Base
|
14
|
+
# end
|
15
|
+
#
|
16
|
+
# Base.setting = true
|
17
|
+
# Subclass.setting # => true
|
18
|
+
# Subclass.setting = false
|
19
|
+
# Subclass.setting # => false
|
20
|
+
# Base.setting # => true
|
21
|
+
#
|
22
|
+
# In the above case as long as Subclass does not assign a value to setting
|
23
|
+
# by performing <tt>Subclass.setting = _something_ </tt>, <tt>Subclass.setting</tt>
|
24
|
+
# would read value assigned to parent class. Once Subclass assigns a value then
|
25
|
+
# the value assigned by Subclass would be returned.
|
26
|
+
#
|
27
|
+
# This matches normal Ruby method inheritance: think of writing an attribute
|
28
|
+
# on a subclass as overriding the reader method. However, you need to be aware
|
29
|
+
# when using +class_attribute+ with mutable structures as +Array+ or +Hash+.
|
30
|
+
# In such cases, you don't want to do changes in places but use setters:
|
31
|
+
#
|
32
|
+
# Base.setting = []
|
33
|
+
# Base.setting # => []
|
34
|
+
# Subclass.setting # => []
|
35
|
+
#
|
36
|
+
# # Appending in child changes both parent and child because it is the same object:
|
37
|
+
# Subclass.setting << :foo
|
38
|
+
# Base.setting # => [:foo]
|
39
|
+
# Subclass.setting # => [:foo]
|
40
|
+
#
|
41
|
+
# # Use setters to not propagate changes:
|
42
|
+
# Base.setting = []
|
43
|
+
# Subclass.setting += [:foo]
|
44
|
+
# Base.setting # => []
|
45
|
+
# Subclass.setting # => [:foo]
|
46
|
+
#
|
47
|
+
# For convenience, a query method is defined as well:
|
48
|
+
#
|
49
|
+
# Subclass.setting? # => false
|
50
|
+
#
|
51
|
+
# Instances may overwrite the class value in the same way:
|
52
|
+
#
|
53
|
+
# Base.setting = true
|
54
|
+
# object = Base.new
|
55
|
+
# object.setting # => true
|
56
|
+
# object.setting = false
|
57
|
+
# object.setting # => false
|
58
|
+
# Base.setting # => true
|
59
|
+
#
|
60
|
+
# To opt out of the instance reader method, pass :instance_reader => false.
|
61
|
+
#
|
62
|
+
# object.setting # => NoMethodError
|
63
|
+
# object.setting? # => NoMethodError
|
64
|
+
#
|
65
|
+
# To opt out of the instance writer method, pass :instance_writer => false.
|
66
|
+
#
|
67
|
+
# object.setting = false # => NoMethodError
|
68
|
+
def class_attribute(*attrs)
|
69
|
+
options = attrs.extract_options!
|
70
|
+
instance_reader = options.fetch(:instance_reader, true)
|
71
|
+
instance_writer = options.fetch(:instance_writer, true)
|
72
|
+
|
73
|
+
attrs.each do |name|
|
74
|
+
class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
75
|
+
def self.#{name}() nil end
|
76
|
+
def self.#{name}?() !!#{name} end
|
77
|
+
|
78
|
+
def self.#{name}=(val)
|
79
|
+
singleton_class.class_eval do
|
80
|
+
remove_possible_method(:#{name})
|
81
|
+
define_method(:#{name}) { val }
|
82
|
+
end
|
83
|
+
|
84
|
+
if singleton_class?
|
85
|
+
class_eval do
|
86
|
+
remove_possible_method(:#{name})
|
87
|
+
def #{name}
|
88
|
+
defined?(@#{name}) ? @#{name} : singleton_class.#{name}
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
val
|
93
|
+
end
|
94
|
+
|
95
|
+
if instance_reader
|
96
|
+
remove_possible_method :#{name}
|
97
|
+
def #{name}
|
98
|
+
defined?(@#{name}) ? @#{name} : self.class.#{name}
|
99
|
+
end
|
100
|
+
|
101
|
+
def #{name}?
|
102
|
+
!!#{name}
|
103
|
+
end
|
104
|
+
end
|
105
|
+
RUBY
|
106
|
+
|
107
|
+
attr_writer name if instance_writer
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
private
|
112
|
+
def singleton_class?
|
113
|
+
!name || '' == name
|
114
|
+
end
|
115
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'date'
|
2
|
+
|
3
|
+
|
4
|
+
class DateTime
|
5
|
+
# Ruby 1.9 has DateTime#to_time which internally relies on Time. We define our own #to_time which allows
|
6
|
+
# DateTimes outside the range of what can be created with Time.
|
7
|
+
remove_method :to_time if instance_methods.include?(:to_time)
|
8
|
+
|
9
|
+
# Attempts to convert self to a Ruby Time object; returns self if out of range of Ruby Time class.
|
10
|
+
# If self has an offset other than 0, self will just be returned unaltered, since there's no clean way to map it to a Time.
|
11
|
+
def to_time
|
12
|
+
self.offset == 0 ? ::Time.utc(year, month, day, hour, min, sec, sec_fraction * (RUBY_VERSION < '1.9' ? 86400000000 : 1000000)) : self
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Kernel
|
2
|
+
# Returns the object's singleton class.
|
3
|
+
def singleton_class
|
4
|
+
class << self
|
5
|
+
self
|
6
|
+
end
|
7
|
+
end unless respond_to?(:singleton_class) # exists in 1.9.2
|
8
|
+
|
9
|
+
# class_eval on an object acts like singleton_class.class_eval.
|
10
|
+
def class_eval(*args, &block)
|
11
|
+
singleton_class.class_eval(*args, &block)
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
class Module
|
2
|
+
def remove_possible_method(method)
|
3
|
+
if method_defined?(method) || private_method_defined?(method)
|
4
|
+
remove_method(method)
|
5
|
+
end
|
6
|
+
rescue NameError
|
7
|
+
# If the requested method is defined on a superclass or included module,
|
8
|
+
# method_defined? returns true but remove_method throws a NameError.
|
9
|
+
# Ignore this.
|
10
|
+
end
|
11
|
+
|
12
|
+
def redefine_method(method, &block)
|
13
|
+
remove_possible_method(method)
|
14
|
+
define_method(method, &block)
|
15
|
+
end
|
16
|
+
end
|