whois 2.0.7 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (224) hide show
  1. data/CHANGELOG.rdoc +84 -10
  2. data/Rakefile +0 -7
  3. data/lib/core_ext.rb +9 -45
  4. data/lib/core_ext/array/extract_options.rb +29 -0
  5. data/lib/core_ext/array/wrap.rb +48 -0
  6. data/lib/core_ext/class/attribute.rb +115 -0
  7. data/lib/core_ext/date_time/conversions.rb +15 -0
  8. data/lib/core_ext/kernel/singleton_class.rb +13 -0
  9. data/lib/core_ext/module/remove_method.rb +16 -0
  10. data/lib/whois.rb +0 -4
  11. data/lib/whois/definitions/tlds.rb +10 -5
  12. data/lib/whois/record.rb +0 -3
  13. data/lib/whois/record/parser.rb +3 -3
  14. data/lib/whois/record/parser/NOTES.txt +15 -8
  15. data/lib/whois/record/parser/base.rb +12 -35
  16. data/lib/whois/record/parser/base_afilias.rb +156 -0
  17. data/lib/whois/record/parser/example.rb +8 -4
  18. data/lib/whois/record/parser/jobswhois.verisign-grs.com.rb +2 -2
  19. data/lib/whois/record/parser/scanners/afilias.rb +13 -4
  20. data/lib/whois/record/parser/{features → scanners}/ast.rb +1 -1
  21. data/lib/whois/record/parser/scanners/base.rb +9 -0
  22. data/lib/whois/record/parser/scanners/cnnic.rb +2 -2
  23. data/lib/whois/record/parser/scanners/{whoisbiz.rb → whois.biz.rb} +2 -8
  24. data/lib/whois/record/parser/scanners/whois.denic.de.rb +117 -0
  25. data/lib/whois/record/parser/scanners/whois.nic.hu.rb +187 -0
  26. data/lib/whois/record/parser/scanners/{whoisit.rb → whois.nic.it.rb} +2 -2
  27. data/lib/whois/record/parser/scanners/whois.registry.qa.rb +54 -0
  28. data/lib/whois/record/parser/scanners/whois.tld.ee.rb +41 -0
  29. data/lib/whois/record/parser/whois.aero.rb +8 -46
  30. data/lib/whois/record/parser/whois.afilias-grs.info.rb +2 -51
  31. data/lib/whois/record/parser/whois.afilias.info.rb +2 -126
  32. data/lib/whois/record/parser/whois.biz.rb +6 -6
  33. data/lib/whois/record/parser/whois.cnnic.cn.rb +5 -5
  34. data/lib/whois/record/parser/whois.crsnic.net.rb +2 -2
  35. data/lib/whois/record/parser/whois.denic.de.rb +8 -105
  36. data/lib/whois/record/parser/whois.dotmobiregistry.net.rb +2 -51
  37. data/lib/whois/record/parser/whois.godaddy.com.rb +138 -0
  38. data/lib/whois/record/parser/whois.iana.org.rb +2 -2
  39. data/lib/whois/record/parser/whois.markmonitor.com.rb +13 -12
  40. data/lib/whois/record/parser/whois.meregistry.net.rb +45 -30
  41. data/lib/whois/record/parser/whois.nic.af.rb +6 -2
  42. data/lib/whois/record/parser/whois.nic.ag.rb +2 -51
  43. data/lib/whois/record/parser/whois.nic.asia.rb +47 -38
  44. data/lib/whois/record/parser/whois.nic.cc.rb +2 -2
  45. data/lib/whois/record/parser/whois.nic.hu.rb +7 -174
  46. data/lib/whois/record/parser/whois.nic.it.rb +6 -6
  47. data/lib/whois/record/parser/whois.nic.name.rb +1 -5
  48. data/lib/whois/record/parser/whois.nic.travel.rb +4 -12
  49. data/lib/whois/record/parser/whois.nic.tv.rb +2 -2
  50. data/lib/whois/record/parser/whois.nic.us.rb +4 -4
  51. data/lib/whois/record/parser/whois.nic.xxx.rb +5 -112
  52. data/lib/whois/record/parser/whois.publicinterestregistry.net.rb +8 -168
  53. data/lib/whois/record/parser/whois.registry.in.rb +2 -60
  54. data/lib/whois/record/parser/whois.registry.qa.rb +117 -0
  55. data/lib/whois/record/parser/whois.ripn.net.rb +4 -84
  56. data/lib/whois/record/parser/whois.sgnic.sg.rb +13 -5
  57. data/lib/whois/record/parser/whois.tcinet.ru.rb +102 -0
  58. data/lib/whois/record/parser/whois.tld.ee.rb +5 -26
  59. data/lib/whois/record/parser/whois.tonic.to.rb +0 -8
  60. data/lib/whois/server/adapters/base.rb +23 -10
  61. data/lib/whois/version.rb +2 -2
  62. data/spec/fixtures/responses/FIND.txt +1 -0
  63. data/spec/fixtures/responses/whois.aero/status_available.expected +35 -1
  64. data/spec/fixtures/responses/whois.aero/status_registered.expected +77 -1
  65. data/spec/fixtures/responses/whois.afilias-grs.info/bz/status_available.expected +34 -0
  66. data/spec/fixtures/responses/whois.afilias-grs.info/bz/status_registered.expected +39 -2
  67. data/spec/fixtures/responses/whois.afilias-grs.info/bz/status_registered.txt +2 -82
  68. data/spec/fixtures/responses/whois.afilias-grs.info/gi/status_available.expected +34 -0
  69. data/spec/fixtures/responses/whois.afilias-grs.info/gi/status_registered.expected +76 -0
  70. data/spec/fixtures/responses/whois.afilias-grs.info/hn/status_available.expected +34 -0
  71. data/spec/fixtures/responses/whois.afilias-grs.info/hn/status_registered.expected +76 -0
  72. data/spec/fixtures/responses/whois.afilias-grs.info/lc/status_available.expected +34 -0
  73. data/spec/fixtures/responses/whois.afilias-grs.info/lc/status_registered.expected +76 -0
  74. data/spec/fixtures/responses/whois.afilias-grs.info/mn/status_available.expected +34 -0
  75. data/spec/fixtures/responses/whois.afilias-grs.info/mn/status_registered.expected +76 -0
  76. data/spec/fixtures/responses/whois.afilias-grs.info/sc/status_available.expected +57 -0
  77. data/spec/fixtures/responses/whois.afilias-grs.info/sc/status_registered.expected +76 -0
  78. data/spec/fixtures/responses/whois.afilias-grs.info/vc/status_available.expected +34 -0
  79. data/spec/fixtures/responses/whois.afilias-grs.info/vc/status_registered.expected +76 -0
  80. data/spec/fixtures/responses/whois.dotmobiregistry.net/status_available.expected +35 -0
  81. data/spec/fixtures/responses/whois.dotmobiregistry.net/status_available.txt +1 -25
  82. data/spec/fixtures/responses/whois.dotmobiregistry.net/status_registered.expected +76 -0
  83. data/spec/fixtures/responses/whois.educause.edu/{properties_updated_on_unknown.expected → property_updated_on_unknown.expected} +0 -0
  84. data/spec/fixtures/responses/whois.educause.edu/{properties_updated_on_unknown.txt → property_updated_on_unknown.txt} +0 -0
  85. data/spec/fixtures/responses/whois.godaddy.com/status_registered.expected +87 -0
  86. data/spec/fixtures/responses/whois.godaddy.com/status_registered.txt +60 -0
  87. data/spec/fixtures/responses/whois.markmonitor.com/{properties_empty_contacts.expected → property_contacts_are_blank.expected} +0 -0
  88. data/spec/fixtures/responses/whois.markmonitor.com/{properties_empty_contacts.txt → property_contacts_are_blank.txt} +0 -0
  89. data/spec/fixtures/responses/whois.meregistry.net/{property_nameservers_is_missing.expected → property_nameservers_is_blank.expected} +0 -0
  90. data/spec/fixtures/responses/whois.meregistry.net/{property_nameservers_is_missing.txt → property_nameservers_is_blank.txt} +0 -0
  91. data/spec/fixtures/responses/whois.meregistry.net/status_available.expected +34 -0
  92. data/spec/fixtures/responses/whois.meregistry.net/status_registered.expected +77 -0
  93. data/spec/fixtures/responses/whois.meregistry.net/status_registered.txt +1 -1
  94. data/spec/fixtures/responses/{whois.nic.asia/property_status_client_delete_prohibited.expected → whois.nic.af/property_status_active.expected} +0 -0
  95. data/spec/fixtures/responses/whois.nic.af/property_status_active.txt +56 -0
  96. data/spec/fixtures/responses/{whois.nic.asia/property_status_client_transfer_prohibited.expected → whois.nic.af/property_status_delegated.expected} +0 -0
  97. data/spec/fixtures/responses/whois.nic.af/property_status_delegated.txt +46 -0
  98. data/spec/fixtures/responses/whois.nic.af/property_status_not_registered.expected +8 -0
  99. data/spec/fixtures/responses/whois.nic.af/property_status_not_registered.txt +13 -0
  100. data/spec/fixtures/responses/whois.nic.ag/status_available.expected +34 -0
  101. data/spec/fixtures/responses/whois.nic.ag/status_registered.expected +76 -0
  102. data/spec/fixtures/responses/whois.nic.asia/property_status_multiple.expected +8 -0
  103. data/spec/fixtures/responses/whois.nic.asia/{property_status_client_delete_prohibited.txt → property_status_multiple.txt} +0 -0
  104. data/spec/fixtures/responses/whois.nic.asia/property_status_single.expected +8 -0
  105. data/spec/fixtures/responses/whois.nic.asia/{property_status_client_transfer_prohibited.txt → property_status_single.txt} +76 -76
  106. data/spec/fixtures/responses/whois.nic.asia/status_available.expected +35 -1
  107. data/spec/fixtures/responses/whois.nic.asia/status_registered.expected +78 -1
  108. data/spec/fixtures/responses/whois.nic.dz/{status_available.expected → dz/status_available.expected} +0 -0
  109. data/spec/fixtures/responses/whois.nic.dz/{status_available.txt → dz/status_available.txt} +0 -0
  110. data/spec/fixtures/responses/whois.nic.dz/{status_registered.expected → dz/status_registered.expected} +0 -0
  111. data/spec/fixtures/responses/whois.nic.dz/{status_registered.txt → dz/status_registered.txt} +0 -0
  112. data/spec/fixtures/responses/whois.nic.name/status_available.expected +1 -1
  113. data/spec/fixtures/responses/whois.nic.name/status_registered.expected +1 -1
  114. data/spec/fixtures/responses/whois.nic.travel/property_status_multiple.expected +2 -0
  115. data/spec/fixtures/responses/whois.nic.travel/property_status_multiple.txt +83 -0
  116. data/spec/fixtures/responses/whois.nic.travel/property_status_single.expected +2 -0
  117. data/spec/fixtures/responses/whois.nic.travel/property_status_single.txt +75 -0
  118. data/spec/fixtures/responses/whois.nic.travel/status_available.expected +1 -1
  119. data/spec/fixtures/responses/whois.nic.travel/status_registered.expected +1 -1
  120. data/spec/fixtures/responses/whois.nic.xxx/property_updated_on_blank.expected +2 -0
  121. data/spec/fixtures/responses/whois.nic.xxx/property_updated_on_blank.txt +98 -0
  122. data/spec/fixtures/responses/whois.nic.xxx/status_registered.expected +45 -46
  123. data/spec/fixtures/responses/whois.nic.xxx/status_registered.txt +61 -61
  124. data/spec/fixtures/responses/whois.publicinterestregistry.net/status_available.expected +1 -1
  125. data/spec/fixtures/responses/whois.publicinterestregistry.net/status_registered.expected +8 -1
  126. data/spec/fixtures/responses/whois.registry.in/property_status_missing.expected +1 -1
  127. data/spec/fixtures/responses/whois.registry.in/property_status_multiple.expected +1 -1
  128. data/spec/fixtures/responses/whois.registry.in/property_status_ok.expected +1 -1
  129. data/spec/fixtures/responses/whois.registry.in/status_available.expected +31 -1
  130. data/spec/fixtures/responses/whois.registry.in/status_registered.expected +70 -1
  131. data/spec/fixtures/responses/whois.registry.qa/qa/status_available.expected +56 -0
  132. data/spec/fixtures/responses/whois.registry.qa/qa/status_available.txt +1 -0
  133. data/spec/fixtures/responses/whois.registry.qa/qa/status_registered.expected +91 -0
  134. data/spec/fixtures/responses/whois.registry.qa/qa/status_registered.txt +23 -0
  135. data/spec/fixtures/responses/whois.sgnic.sg/property_nameservers_schema_1_with_ip.expected +12 -0
  136. data/spec/fixtures/responses/whois.sgnic.sg/property_nameservers_schema_1_with_ip.txt +94 -0
  137. data/spec/fixtures/responses/{whois.ripn.net → whois.tcinet.ru}/ru/property_nameservers_with_ip.expected +0 -0
  138. data/spec/fixtures/responses/{whois.ripn.net → whois.tcinet.ru}/ru/property_nameservers_with_ip.txt +0 -0
  139. data/spec/fixtures/responses/{whois.ripn.net → whois.tcinet.ru}/ru/status_available.expected +0 -0
  140. data/spec/fixtures/responses/{whois.ripn.net → whois.tcinet.ru}/ru/status_available.txt +0 -0
  141. data/spec/fixtures/responses/{whois.ripn.net → whois.tcinet.ru}/ru/status_registered.expected +0 -0
  142. data/spec/fixtures/responses/{whois.ripn.net → whois.tcinet.ru}/ru/status_registered.txt +0 -0
  143. data/spec/fixtures/responses/{whois.ripn.net → whois.tcinet.ru}/su/status_available.expected +0 -0
  144. data/spec/fixtures/responses/{whois.ripn.net → whois.tcinet.ru}/su/status_available.txt +0 -0
  145. data/spec/fixtures/responses/{whois.ripn.net → whois.tcinet.ru}/su/status_registered.expected +0 -0
  146. data/spec/fixtures/responses/{whois.ripn.net → whois.tcinet.ru}/su/status_registered.txt +0 -0
  147. data/spec/fixtures/responses/{whois.ripn.net → whois.tcinet.ru}/xn--p1ai/status_available.expected +0 -0
  148. data/spec/fixtures/responses/{whois.ripn.net → whois.tcinet.ru}/xn--p1ai/status_available.txt +0 -0
  149. data/spec/fixtures/responses/{whois.ripn.net → whois.tcinet.ru}/xn--p1ai/status_registered.expected +0 -0
  150. data/spec/fixtures/responses/{whois.ripn.net → whois.tcinet.ru}/xn--p1ai/status_registered.txt +0 -0
  151. data/spec/integration_spec.rb +29 -12
  152. data/spec/support/helpers/spec_helper.rb +0 -10
  153. data/spec/tlds +1 -1
  154. data/spec/whois/record/parser/base_spec.rb +23 -51
  155. data/spec/whois/record/parser/responses/whois.aero/status_available_spec.rb +49 -1
  156. data/spec/whois/record/parser/responses/whois.aero/status_registered_spec.rb +91 -1
  157. data/spec/whois/record/parser/responses/whois.afilias-grs.info/bz/status_available_spec.rb +48 -0
  158. data/spec/whois/record/parser/responses/whois.afilias-grs.info/bz/status_registered_spec.rb +53 -2
  159. data/spec/whois/record/parser/responses/whois.afilias-grs.info/gi/status_available_spec.rb +48 -0
  160. data/spec/whois/record/parser/responses/whois.afilias-grs.info/gi/status_registered_spec.rb +90 -0
  161. data/spec/whois/record/parser/responses/whois.afilias-grs.info/hn/status_available_spec.rb +48 -0
  162. data/spec/whois/record/parser/responses/whois.afilias-grs.info/hn/status_registered_spec.rb +90 -0
  163. data/spec/whois/record/parser/responses/whois.afilias-grs.info/lc/status_available_spec.rb +48 -0
  164. data/spec/whois/record/parser/responses/whois.afilias-grs.info/lc/status_registered_spec.rb +90 -0
  165. data/spec/whois/record/parser/responses/whois.afilias-grs.info/mn/status_available_spec.rb +48 -0
  166. data/spec/whois/record/parser/responses/whois.afilias-grs.info/mn/status_registered_spec.rb +90 -0
  167. data/spec/whois/record/parser/responses/whois.afilias-grs.info/sc/status_available_spec.rb +48 -0
  168. data/spec/whois/record/parser/responses/whois.afilias-grs.info/sc/status_registered_spec.rb +90 -0
  169. data/spec/whois/record/parser/responses/whois.afilias-grs.info/vc/status_available_spec.rb +48 -0
  170. data/spec/whois/record/parser/responses/whois.afilias-grs.info/vc/status_registered_spec.rb +90 -0
  171. data/spec/whois/record/parser/responses/whois.dotmobiregistry.net/status_available_spec.rb +48 -0
  172. data/spec/whois/record/parser/responses/whois.dotmobiregistry.net/status_registered_spec.rb +90 -0
  173. data/spec/whois/record/parser/responses/whois.educause.edu/{properties_updated_on_unknown_spec.rb → property_updated_on_unknown_spec.rb} +3 -3
  174. data/spec/whois/record/parser/responses/whois.godaddy.com/status_registered_spec.rb +131 -0
  175. data/spec/whois/record/parser/responses/whois.markmonitor.com/{properties_empty_contacts_spec.rb → property_contacts_are_blank_spec.rb} +3 -3
  176. data/spec/whois/record/parser/responses/whois.meregistry.net/{property_nameservers_is_missing_spec.rb → property_nameservers_is_blank_spec.rb} +3 -3
  177. data/spec/whois/record/parser/responses/whois.meregistry.net/status_available_spec.rb +48 -0
  178. data/spec/whois/record/parser/responses/whois.meregistry.net/status_registered_spec.rb +91 -0
  179. data/spec/whois/record/parser/responses/whois.nic.af/property_status_active_spec.rb +39 -0
  180. data/spec/whois/record/parser/responses/whois.nic.af/property_status_delegated_spec.rb +39 -0
  181. data/spec/whois/record/parser/responses/whois.nic.af/property_status_not_registered_spec.rb +39 -0
  182. data/spec/whois/record/parser/responses/whois.nic.ag/status_available_spec.rb +48 -0
  183. data/spec/whois/record/parser/responses/whois.nic.ag/status_registered_spec.rb +90 -0
  184. data/spec/whois/record/parser/responses/whois.nic.asia/{property_status_client_delete_prohibited_spec.rb → property_status_multiple_spec.rb} +4 -4
  185. data/spec/whois/record/parser/responses/whois.nic.asia/{property_status_client_transfer_prohibited_spec.rb → property_status_single_spec.rb} +4 -4
  186. data/spec/whois/record/parser/responses/whois.nic.asia/status_available_spec.rb +49 -1
  187. data/spec/whois/record/parser/responses/whois.nic.asia/status_registered_spec.rb +92 -1
  188. data/spec/whois/record/parser/responses/whois.nic.dz/{status_available_spec.rb → dz/status_available_spec.rb} +2 -2
  189. data/spec/whois/record/parser/responses/whois.nic.dz/{status_registered_spec.rb → dz/status_registered_spec.rb} +2 -2
  190. data/spec/whois/record/parser/responses/whois.nic.name/status_available_spec.rb +1 -1
  191. data/spec/whois/record/parser/responses/whois.nic.name/status_registered_spec.rb +1 -1
  192. data/spec/whois/record/parser/responses/whois.nic.travel/property_status_multiple_spec.rb +29 -0
  193. data/spec/whois/record/parser/responses/whois.nic.travel/property_status_single_spec.rb +29 -0
  194. data/spec/whois/record/parser/responses/whois.nic.travel/status_available_spec.rb +1 -1
  195. data/spec/whois/record/parser/responses/whois.nic.travel/status_registered_spec.rb +1 -1
  196. data/spec/whois/record/parser/responses/whois.nic.xxx/property_updated_on_blank_spec.rb +29 -0
  197. data/spec/whois/record/parser/responses/whois.nic.xxx/status_registered_spec.rb +45 -46
  198. data/spec/whois/record/parser/responses/whois.publicinterestregistry.net/status_available_spec.rb +1 -1
  199. data/spec/whois/record/parser/responses/whois.publicinterestregistry.net/status_registered_spec.rb +11 -1
  200. data/spec/whois/record/parser/responses/whois.registry.in/property_status_missing_spec.rb +1 -1
  201. data/spec/whois/record/parser/responses/whois.registry.in/property_status_multiple_spec.rb +1 -1
  202. data/spec/whois/record/parser/responses/whois.registry.in/property_status_ok_spec.rb +1 -1
  203. data/spec/whois/record/parser/responses/whois.registry.in/status_available_spec.rb +44 -1
  204. data/spec/whois/record/parser/responses/whois.registry.in/status_registered_spec.rb +83 -1
  205. data/spec/whois/record/parser/responses/whois.registry.qa/qa/status_available_spec.rb +107 -0
  206. data/spec/whois/record/parser/responses/whois.registry.qa/qa/status_registered_spec.rb +142 -0
  207. data/spec/whois/record/parser/responses/whois.sgnic.sg/property_nameservers_schema_1_with_ip_spec.rb +39 -0
  208. data/spec/whois/record/parser/responses/{whois.ripn.net → whois.tcinet.ru}/ru/property_nameservers_with_ip_spec.rb +4 -4
  209. data/spec/whois/record/parser/responses/{whois.ripn.net/su → whois.tcinet.ru/ru}/status_available_spec.rb +4 -4
  210. data/spec/whois/record/parser/responses/{whois.ripn.net → whois.tcinet.ru}/ru/status_registered_spec.rb +4 -4
  211. data/spec/whois/record/parser/responses/{whois.ripn.net/ru → whois.tcinet.ru/su}/status_available_spec.rb +4 -4
  212. data/spec/whois/record/parser/responses/{whois.ripn.net → whois.tcinet.ru}/su/status_registered_spec.rb +4 -4
  213. data/spec/whois/record/parser/responses/{whois.ripn.net → whois.tcinet.ru}/xn--p1ai/status_available_spec.rb +4 -4
  214. data/spec/whois/record/parser/responses/{whois.ripn.net → whois.tcinet.ru}/xn--p1ai/status_registered_spec.rb +4 -4
  215. data/spec/whois/record_spec.rb +4 -4
  216. data/spec/whois/server/adapters/afilias_spec.rb +3 -3
  217. data/spec/whois/server/adapters/base_spec.rb +50 -10
  218. data/spec/whois/server/adapters/formatted_spec.rb +4 -4
  219. data/spec/whois/server/adapters/pir_spec.rb +3 -3
  220. data/spec/whois/server/adapters/standard_spec.rb +4 -4
  221. data/spec/whois/server/adapters/verisign_spec.rb +7 -7
  222. data/whois.gemspec +4 -4
  223. metadata +101 -57
  224. data/lib/whois/answer.rb +0 -14
@@ -7,73 +7,82 @@
7
7
  #++
8
8
 
9
9
 
10
- require 'whois/record/parser/base'
10
+ require 'whois/record/parser/base_afilias'
11
11
 
12
12
 
13
13
  module Whois
14
14
  class Record
15
15
  class Parser
16
16
 
17
- #
18
- # = whois.nic.asia parser
19
- #
20
17
  # Parser for the whois.nic.asia server.
21
- #
22
- # NOTE: This parser is just a stub and provides only a few basic methods
23
- # to check for domain availability and get domain status.
24
- # Please consider to contribute implementing missing methods.
25
- # See WhoisNicIt parser for an explanation of all available methods
26
- # and examples.
27
- #
28
- class WhoisNicAsia < Base
18
+ class WhoisNicAsia < BaseAfilias
29
19
 
30
20
  property_supported :status do
31
- if content_for_scanner =~ /Domain Status:(.+?)\n/
32
- case $1.downcase
33
- when /^ok/, /\bclient/
34
- :registered
35
- else
36
- Whois.bug!(ParserError, "Unknown status `#{$1}'.")
37
- end
38
- else
39
- :available
40
- end
41
- end
42
-
43
- property_supported :available? do
44
- (content_for_scanner.strip == "NOT FOUND")
45
- end
46
-
47
- property_supported :registered? do
48
- !available?
21
+ Array.wrap(node("Domain Status"))
49
22
  end
50
23
 
51
24
 
52
25
  property_supported :created_on do
53
- if content_for_scanner =~ /Domain Create Date:(.*?)\n/
54
- Time.parse($1)
26
+ node("Domain Create Date") do |value|
27
+ Time.parse(value)
55
28
  end
56
29
  end
57
30
 
58
31
  property_supported :updated_on do
59
- if content_for_scanner =~ /Domain Last Updated Date:(.*?)\n/
60
- Time.parse($1)
32
+ node("Domain Last Updated Date") do |value|
33
+ Time.parse(value)
61
34
  end
62
35
  end
63
36
 
64
37
  property_supported :expires_on do
65
- if content_for_scanner =~ /Domain Expiration Date:(.*?)\n/
66
- Time.parse($1)
38
+ node("Domain Expiration Date") do |value|
39
+ Time.parse(value)
67
40
  end
68
41
  end
69
42
 
70
43
 
44
+ property_supported :admin_contacts do
45
+ contact("Administrative", Whois::Record::Contact::TYPE_ADMIN)
46
+ end
47
+
48
+ property_supported :technical_contacts do
49
+ contact("Technical", Whois::Record::Contact::TYPE_TECHNICAL)
50
+ end
51
+
52
+
71
53
  property_supported :nameservers do
72
- content_for_scanner.scan(/Nameservers:([^\s]+)\n/).flatten.map do |name|
73
- Record::Nameserver.new(name.downcase)
54
+ Array.wrap(node("Nameservers")).reject(&:empty?).map do |name|
55
+ Nameserver.new(name.downcase)
74
56
  end
75
57
  end
76
58
 
59
+
60
+ private
61
+
62
+ def contact(element, type)
63
+ node("#{element} ID") do
64
+ address = ["", "2", "3"].
65
+ map { |i| node("#{element} Address#{i}") }.
66
+ delete_if(&:empty?).
67
+ join("\n")
68
+
69
+ Record::Contact.new(
70
+ :type => type,
71
+ :id => node("#{element} ID"),
72
+ :name => node("#{element} Name"),
73
+ :organization => node("#{element} Organization"),
74
+ :address => address,
75
+ :city => node("#{element} City"),
76
+ :zip => node("#{element} Postal Code"),
77
+ :state => node("#{element} State/Province"),
78
+ :country_code => node("#{element} Country/Economy"),
79
+ :phone => node("#{element} Phone"),
80
+ :fax => node("#{element} FAX"),
81
+ :email => node("#{element} E-mail")
82
+ )
83
+ end
84
+ end
85
+
77
86
  end
78
87
 
79
88
  end
@@ -21,7 +21,7 @@ module Whois
21
21
  # Parser for the whois.nic.cc server.
22
22
  #
23
23
  class WhoisNicCc < Base
24
- include Features::Ast
24
+ include Scanners::Ast
25
25
 
26
26
  property_supported :disclaimer do
27
27
  node("Disclaimer")
@@ -85,7 +85,7 @@ module Whois
85
85
 
86
86
 
87
87
  # Initializes a new {Scanners::Verisign} instance
88
- # passing the {Whois::Record::Parser::Base#content_for_scanner}
88
+ # passing the {#content_for_scanner}
89
89
  # and calls +parse+ on it.
90
90
  #
91
91
  # @return [Hash]
@@ -8,7 +8,7 @@
8
8
 
9
9
 
10
10
  require 'whois/record/parser/base'
11
- require 'whois/record/parser/scanners/base'
11
+ require 'whois/record/parser/scanners/whois.nic.hu.rb'
12
12
 
13
13
 
14
14
  module Whois
@@ -24,7 +24,7 @@ module Whois
24
24
  # @author Gábor Vészi <veszig@done.hu>
25
25
  #
26
26
  class WhoisNicHu < Base
27
- include Features::Ast
27
+ include Scanners::Ast
28
28
 
29
29
  property_supported :disclaimer do
30
30
  node("disclaimer")
@@ -41,9 +41,9 @@ module Whois
41
41
 
42
42
 
43
43
  property_supported :status do
44
- if node("status-available")
44
+ if node("status:available")
45
45
  :available
46
- elsif node("status-inprogress")
46
+ elsif node("status:inprogress")
47
47
  :registered
48
48
  else
49
49
  :registered
@@ -129,13 +129,13 @@ module Whois
129
129
  end
130
130
 
131
131
 
132
- # Initializes a new {Scanner} instance
133
- # passing the {Whois::Record::Parser::Base#content_for_scanner}
132
+ # Initializes a new {Scanners::WhoisNicHu} instance
133
+ # passing the {#content_for_scanner}
134
134
  # and calls +parse+ on it.
135
135
  #
136
136
  # @return [Hash]
137
137
  def parse
138
- Scanner.new(content_for_scanner).parse
138
+ Scanners::WhoisNicHu.new(content_for_scanner).parse
139
139
  end
140
140
 
141
141
 
@@ -165,173 +165,6 @@ module Whois
165
165
  [address, city, zip, country_code]
166
166
  end
167
167
 
168
-
169
- class Scanner < Scanners::Base
170
-
171
- def parse_content
172
- parse_version ||
173
- parse_disclaimer ||
174
- parse_domain ||
175
- parse_available ||
176
- parse_in_progress ||
177
-
178
- # v2.0
179
- parse_moreinfo ||
180
-
181
- # v1.99
182
- parse_domain_data ||
183
- parse_contacts ||
184
-
185
- trim_empty_line ||
186
- error!("Unexpected token")
187
- end
188
-
189
-
190
- def parse_version
191
- if @input.match?(/% Whois server .*\n/)
192
- p("whois.nic.hu: parse_version") if 1 == 2 || $DEBUG
193
- @input.scan(/% Whois server ([\w\d\.]*).*?\n/)
194
- @ast["version"] = @input[1]
195
- end
196
- end
197
-
198
- # FIXME: Requires UTF-8 Encoding (see #11)
199
- def parse_moreinfo
200
- if @input.match?(/Tov.* ld\.:\n/)
201
- p("whois.nic.hu: parse_moreinfo") if 1 == 2 || $DEBUG
202
- @ast["moreinfo"] = @input.scan_until(/^\n/)
203
- end
204
- end
205
-
206
- def parse_disclaimer
207
- if @input.match?(/^Rights.*\n/)
208
- p("whois.nic.hu: parse_disclaimer") if 1 == 2 || $DEBUG
209
- lines = @input.scan_until(/^\n/)
210
- @ast["disclaimer"] = lines.strip
211
- end
212
- end
213
-
214
- def parse_domain
215
- if @input.match?(/^domain:\s+(.*)\n/) && @input.scan(/^domain:\s+(.*?)\n/)
216
- p("whois.nic.hu: parse_domain") if 1 == 2 || $DEBUG
217
- @ast["domain"] = @input[1].strip
218
- end
219
- end
220
-
221
- # FIXME: Requires UTF-8 Encoding (see #11)
222
- def parse_available
223
- if @input.match?(/Nincs (.*?) \/ No match\n/)
224
- p("whois.nic.hu: parse_not_found") if 1 == 2 || $DEBUG
225
- @input.scan(/Nincs (.*?) \/ No match\n/)
226
- @ast["status-available"] = true
227
- end
228
- end
229
-
230
- # FIXME: Requires UTF-8 Encoding (see #11)
231
- def parse_in_progress
232
- if @input.match?(/(.*?) folyamatban \/ Registration in progress\n/)
233
- p("whois.nic.hu: parse_in_progress") if 1 == 2 || $DEBUG
234
- @input.scan(/(.*?) folyamatban \/ Registration in progress\n/)
235
- @ast["status-inprogress"] = true
236
- end
237
- end
238
-
239
- def parse_domain_data
240
- if @input.match?(/(.+?):\s+(.*)\n/)
241
- p("whois.nic.hu: parse_domain_data") if 1 == 2 || $DEBUG
242
- while @input.scan(/(.+?):\s+(.*)\n/)
243
- key, value = @input[1].strip, @input[2].strip
244
- if key == 'person'
245
- @ast['name'] = value
246
- elsif key == 'org'
247
- if value =~ /org_name_hun:\s+(.*)\Z/
248
- @ast['name'] = $1
249
- elsif value =~ /org_name_eng:\s+(.*)\Z/
250
- @ast['org'] = $1
251
- elsif value != 'Private person'
252
- contact['org'] = value
253
- end
254
- elsif @ast[key].nil?
255
- @ast[key] = value
256
- elsif @ast[key].is_a? Array
257
- @ast[key] << value
258
- else
259
- @ast[key] = [@ast[key], value].flatten
260
- end
261
- end
262
- true
263
- end
264
- end
265
-
266
- def parse_contacts
267
- if @input.match?(/\n(person|org):/)
268
- p("whois.nic.hu: parse_contacts") if 1 == 2 || $DEBUG
269
- @input.scan(/\n/)
270
- while @input.match?(/(.+?):\s+(.*)\n/)
271
- parse_contact
272
- end
273
- true
274
- end
275
- end
276
-
277
- def parse_contact
278
- contact ||= {}
279
- p("whois.nic.hu: parse_contact") if 1 == 2 || $DEBUG
280
- while @input.scan(/(.+?):\s+(.*)\n/)
281
- key, value = @input[1].strip, @input[2].strip
282
- if key == 'hun-id'
283
- a1 = contact['address'][1].split(/\s/)
284
- zip = a1.shift
285
- city = a1.join(' ')
286
- # we should keep the old values if this is an already
287
- # defined contact
288
- if @ast[value].nil?
289
- @ast[value] = {
290
- "id" => value,
291
- "name" => contact['name'],
292
- "organization" => contact['org'],
293
- "address" => contact['address'][0],
294
- "city" => city,
295
- "zip" => zip,
296
- "country_code" => contact['address'][2],
297
- "phone" => contact['phone'],
298
- "fax" => contact['fax-no'],
299
- "email" => contact['e-mail']
300
- }
301
- else
302
- @ast[value]["id"] ||= value
303
- @ast[value]["name"] ||= contact['name']
304
- @ast[value]["organization"] ||= contact['org']
305
- @ast[value]["address"] ||= contact['address'][0]
306
- @ast[value]["city"] ||= city
307
- @ast[value]["zip"] ||= zip
308
- @ast[value]["country_code"] ||= contact['address'][2]
309
- @ast[value]["phone"] ||= contact['phone']
310
- @ast[value]["fax"] ||= contact['fax-no']
311
- @ast[value]["email"] ||= contact['e-mail']
312
- end
313
- contact = {}
314
- elsif key == 'person'
315
- contact['name'] = value
316
- elsif key == 'org'
317
- if value =~ /org_name_hun:\s+(.*)\Z/
318
- contact['name'] = $1
319
- elsif value =~ /org_name_eng:\s+(.*)\Z/
320
- contact['org'] = $1
321
- else
322
- contact['org'] = value
323
- end
324
- elsif key == 'address' && !contact['address'].nil?
325
- contact['address'] = [contact['address'], value].flatten
326
- else
327
- contact[key] = value
328
- end
329
- end
330
- true
331
- end
332
-
333
- end
334
-
335
168
  end
336
169
 
337
170
  end
@@ -8,7 +8,7 @@
8
8
 
9
9
 
10
10
  require 'whois/record/parser/base'
11
- require 'whois/record/parser/scanners/whoisit'
11
+ require 'whois/record/parser/scanners/whois.nic.it.rb'
12
12
 
13
13
 
14
14
  module Whois
@@ -21,7 +21,7 @@ module Whois
21
21
  # Parser for the whois.nic.it server.
22
22
  #
23
23
  class WhoisNicIt < Base
24
- include Features::Ast
24
+ include Scanners::Ast
25
25
 
26
26
 
27
27
  property_supported :disclaimer do
@@ -121,16 +121,16 @@ module Whois
121
121
  #
122
122
  # @return [Boolean]
123
123
  def response_unavailable?
124
- !!node("status-unavailable")
124
+ !!node("status:unavailable")
125
125
  end
126
126
 
127
- # Initializes a new {Scanner} instance
128
- # passing the {Whois::Record::Parser::Base#content_for_scanner}
127
+ # Initializes a new {Scanners::WhoisIt} instance
128
+ # passing the {#content_for_scanner}
129
129
  # and calls +parse+ on it.
130
130
  #
131
131
  # @return [Hash]
132
132
  def parse
133
- Scanners::Whoisit.new(content_for_scanner).parse
133
+ Scanners::WhoisNicIt.new(content_for_scanner).parse
134
134
  end
135
135
 
136
136
 
@@ -28,11 +28,7 @@ module Whois
28
28
  class WhoisNicName < Base
29
29
 
30
30
  property_supported :status do
31
- if available?
32
- :available
33
- else
34
- :registered
35
- end
31
+ content_for_scanner.scan(/Domain Status:\s+(.+?)\n/).flatten
36
32
  end
37
33
 
38
34
  property_supported :available? do
@@ -28,15 +28,7 @@ module Whois
28
28
  class WhoisNicTravel < Base
29
29
 
30
30
  property_supported :status do
31
- if content_for_scanner =~ /Domain Status:\s+(.+?)\n/
32
- case $1.downcase
33
- when "ok" then :registered
34
- else
35
- Whois.bug!(ParserError, "Unknown status `#{$1}'.")
36
- end
37
- else
38
- :available
39
- end
31
+ content_for_scanner.scan(/Domain Status:\s+(.+?)\n/).flatten
40
32
  end
41
33
 
42
34
  property_supported :available? do
@@ -49,19 +41,19 @@ module Whois
49
41
 
50
42
 
51
43
  property_supported :created_on do
52
- if content_for_scanner =~ /Domain Registration Date:\s+(.*)\n/
44
+ if content_for_scanner =~ /Domain Registration Date:\s+(.+?)\n/
53
45
  Time.parse($1)
54
46
  end
55
47
  end
56
48
 
57
49
  property_supported :updated_on do
58
- if content_for_scanner =~ /Domain Last Updated Date:\s+(.*)\n/
50
+ if content_for_scanner =~ /Domain Last Updated Date:\s+(.+?)\n/
59
51
  Time.parse($1)
60
52
  end
61
53
  end
62
54
 
63
55
  property_supported :expires_on do
64
- if content_for_scanner =~ /Domain Expiration Date:\s+(.*)\n/
56
+ if content_for_scanner =~ /Domain Expiration Date:\s+(.+?)\n/
65
57
  Time.parse($1)
66
58
  end
67
59
  end