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,64 +7,15 @@
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.dotmobiregistry.net parser
19
- #
20
17
  # Parser for the whois.dotmobiregistry.net 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 WhoisDotmobiregistryNet < Base
29
-
30
- property_supported :status do
31
- content_for_scanner.scan(/Status:(.*?)\n/).flatten
32
- end
33
-
34
- property_supported :available? do
35
- !!(content_for_scanner =~ /Not found:/)
36
- end
37
-
38
- property_supported :registered? do
39
- !available?
40
- end
41
-
42
-
43
- property_supported :created_on do
44
- if content_for_scanner =~ /Created On:(.*?)\n/
45
- Time.parse($1)
46
- end
47
- end
48
-
49
- property_supported :updated_on do
50
- if content_for_scanner =~ /Last Updated On:(.*?)\n/
51
- Time.parse($1)
52
- end
53
- end
54
-
55
- property_supported :expires_on do
56
- if content_for_scanner =~ /Expiration Date:(.*?)\n/
57
- Time.parse($1)
58
- end
59
- end
60
-
61
-
62
- property_supported :nameservers do
63
- content_for_scanner.scan(/Name Server:([^\s]+)\n/).flatten.map do |name|
64
- Record::Nameserver.new(name.downcase)
65
- end
66
- end
67
-
18
+ class WhoisDotmobiregistryNet < BaseAfilias
68
19
  end
69
20
 
70
21
  end
@@ -0,0 +1,138 @@
1
+ #--
2
+ # Ruby Whois
3
+ #
4
+ # An intelligent pure Ruby WHOIS client and parser.
5
+ #
6
+ # Copyright (c) 2009-2011 Simone Carletti <weppos@weppos.net>
7
+ #++
8
+
9
+
10
+ require 'whois/record/parser/base'
11
+
12
+
13
+ module Whois
14
+ class Record
15
+ class Parser
16
+
17
+ # Parser for the whois.godaddy.com server.
18
+ #
19
+ # @note This parser is just a stub and provides only a few basic methods
20
+ # to check for domain availability and get domain status.
21
+ # Please consider to contribute implementing missing methods.
22
+ #
23
+ # @see Whois::Record::Parser::Example
24
+ # The Example parser for the list of all available methods.
25
+ #
26
+ # @author Simone Carletti
27
+ # @author Tom Nicholls <tom.nicholls@oii.ox.ac.uk>
28
+ # @since 2.1.0
29
+ class WhoisGodaddyCom < Base
30
+
31
+ property_not_supported :status
32
+
33
+ # The server seems to provide only linesrmation for registered domains
34
+ property_supported :available? do
35
+ false
36
+ end
37
+
38
+ property_supported :registered? do
39
+ !available?
40
+ end
41
+
42
+
43
+ property_supported :created_on do
44
+ if content_for_scanner =~ /Created on: (.+)\n/
45
+ Time.parse($1)
46
+ end
47
+ end
48
+
49
+ property_supported :updated_on do
50
+ if content_for_scanner =~ /Last Updated on: (.+)\n/
51
+ Time.parse($1)
52
+ end
53
+ end
54
+
55
+ property_supported :expires_on do
56
+ if content_for_scanner =~ /Expires on: (.+)\n/
57
+ Time.parse($1)
58
+ end
59
+ end
60
+
61
+
62
+ property_supported :registrar do
63
+ Record::Registrar.new(
64
+ :name => content_for_scanner[/Registered through: (.+) \(/, 1],
65
+ :url => content_for_scanner[/Registered through: .*\((.+)\)\n/, 1]
66
+ )
67
+ end
68
+
69
+ property_supported :registrant_contacts do
70
+ contact('Registrant:', Record::Contact::TYPE_REGISTRANT)
71
+ end
72
+
73
+ property_supported :admin_contacts do
74
+ contact('Administrative Contact:', Record::Contact::TYPE_ADMIN)
75
+ end
76
+
77
+ property_supported :technical_contacts do
78
+ contact('Technical Contact:', Record::Contact::TYPE_TECHNICAL)
79
+ end
80
+
81
+
82
+ property_supported :nameservers do
83
+ if content_for_scanner =~ /Domain servers in listed order:\n((.+\n)+)\n/
84
+ $1.split("\n").map do |line|
85
+ Record::Nameserver.new(line.strip)
86
+ end
87
+ end
88
+ end
89
+
90
+
91
+ private
92
+
93
+
94
+ def contact(element, type)
95
+ match = content_for_scanner.slice(/#{element}\n((.+\n)+)\n/, 1)
96
+ return unless match
97
+
98
+ lines = $1.split("\n").map(&:strip)
99
+
100
+ # Lines 1 and 5 may be absent, depending on the record.
101
+ # The parser attempts to correct for this, but may be a bit flaky
102
+ # on non-standard data.
103
+ #
104
+ # 0 GoDaddy.com, Inc., GoDaddy.com, Inc. dns@jomax.net
105
+ # 1 GoDaddy.com, Inc.
106
+ # 2 14455 N Hayden Rd Suite 219
107
+ # 3 Scottsdale, Arizona 85260
108
+ # 4 United States
109
+ # 5 +1.4805058800 Fax -- +1.4805058844
110
+ phone = nil
111
+ fax = nil
112
+ if lines[-1].to_s =~ /Fax --/
113
+ phone, fax = lines.delete_at(-1).to_s.scan(/^(.*) Fax --(.*)$/).first
114
+ phone = phone.strip
115
+ fax = fax.strip
116
+ end
117
+
118
+ Record::Contact.new(
119
+ :type => type,
120
+ :id => nil,
121
+ :name => lines[0].to_s.gsub(/\s\S+@[^\.].*\.[a-z]{2,}\s?\)?$/, "").strip,
122
+ :organization => lines.length >= 5 ? lines[-4] : "",
123
+ :address => lines.length >= 4 ? lines[-3] : "",
124
+ :city => lines.length >= 4 ? lines[-2].to_s.partition(",")[0] : "",
125
+ :zip => lines.length >= 4 ? lines[-2].to_s.rpartition(" ")[2] : "",
126
+ :state => lines.length >= 4 ? lines[-2].to_s.partition(",")[2].rpartition(" ")[0].to_s.strip : "",
127
+ :country => lines.length >= 4 ? lines[-1] : "",
128
+ :phone => phone,
129
+ :fax => fax,
130
+ :email => lines[0].to_s.scan(/[^\s]\S+@[^\.].*\.[a-z]{2,}[^\s\)\n]/).first
131
+ )
132
+ end
133
+
134
+ end
135
+
136
+ end
137
+ end
138
+ end
@@ -21,7 +21,7 @@ module Whois
21
21
  # Parser for the whois.iana.org server.
22
22
  #
23
23
  class WhoisIanaOrg < Base
24
- include Features::Ast
24
+ include Scanners::Ast
25
25
 
26
26
  property_supported :status do
27
27
  if available?
@@ -76,7 +76,7 @@ module Whois
76
76
 
77
77
 
78
78
  # Initializes a new {Scanners::Iana} instance
79
- # passing the {Whois::Record::Parser::Base#content_for_scanner}
79
+ # passing the {#content_for_scanner}
80
80
  # and calls +parse+ on it.
81
81
  #
82
82
  # @return [Hash]
@@ -29,8 +29,7 @@ module Whois
29
29
 
30
30
  property_not_supported :status
31
31
 
32
-
33
- # The server seems to provide only information for registered domains
32
+ # The server seems to provide only linesrmation for registered domains
34
33
  property_supported :available? do
35
34
  false
36
35
  end
@@ -66,7 +65,6 @@ module Whois
66
65
  )
67
66
  end
68
67
 
69
-
70
68
  property_supported :registrant_contacts do
71
69
  contact('Registrant:', Record::Contact::TYPE_REGISTRANT)
72
70
  end
@@ -81,8 +79,10 @@ module Whois
81
79
 
82
80
 
83
81
  property_supported :nameservers do
84
- content_for_scanner.slice(/Domain servers in listed order:\n\n((?:\s*[^\s\n]+\n)+)/, 1).split("\n").map do |line|
85
- Record::Nameserver.new(line.strip)
82
+ if content_for_scanner =~ /Domain servers in listed order:\n\n((?:\s*[^\s\n]+\n)+)/
83
+ $1.split("\n").map do |line|
84
+ Record::Nameserver.new(line.strip)
85
+ end
86
86
  end
87
87
  end
88
88
 
@@ -93,24 +93,25 @@ module Whois
93
93
  match = content_for_scanner.slice(/#{element}\n((.+\n){6})/, 1)
94
94
  return unless match
95
95
 
96
- info = match.split("\n").map(&:strip)
96
+ lines = match.split("\n").map(&:strip)
97
+
97
98
  # 0 DNS Admin
98
99
  # 1 Google Inc.
99
100
  # 2 1600 Amphitheatre Parkway
100
101
  # 3 Mountain View CA 94043
101
102
  # 4 US
102
103
  # 5 dns-admin@google.com +1.6506234000 Fax: +1.6506188571
103
- city, state, zip = info[3].scan(/^(.+) ([A-Z]{2}) ([0-9]+)$/).first
104
- email, phone, fax = info[5].scan(/^(.+) (.+) Fax: (.+)$/).first
104
+ city, state, zip = lines[3].scan(/^(.+) ([A-Z]{2}) ([0-9]+)$/).first
105
+ email, phone, fax = lines[5].scan(/^(.+) (.+) Fax: (.+)$/).first
105
106
  Record::Contact.new(
106
107
  :type => type,
107
- :name => info[0],
108
- :organization => info[1],
109
- :address => info[2],
108
+ :name => lines[0],
109
+ :organization => lines[1],
110
+ :address => lines[2],
110
111
  :city => city,
111
112
  :state => state,
112
113
  :zip => zip,
113
- :country_code => info[4],
114
+ :country_code => lines[4],
114
115
  :email => email,
115
116
  :phone => phone,
116
117
  :fax => fax
@@ -7,64 +7,79 @@
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.meregistry.net parser
19
- #
20
- # Parser for the whois.meregistry.net 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 WhoisMeregistryNet < Base
17
+ # Parser for the whois.dotmobiregistry.net server.
18
+ class WhoisMeregistryNet < BaseAfilias
29
19
 
30
20
  property_supported :status do
31
- content_for_scanner.scan(/Domain Status:(.*?)\n/).flatten
32
- end
33
-
34
- property_supported :available? do
35
- (content_for_scanner.strip == "NOT FOUND")
36
- end
37
-
38
- property_supported :registered? do
39
- !available?
21
+ Array.wrap(node("Domain Status"))
40
22
  end
41
23
 
42
24
 
43
25
  property_supported :created_on do
44
- if content_for_scanner =~ /Domain Create Date:(.+)\n/
45
- Time.parse($1)
26
+ node("Domain Create Date") do |value|
27
+ Time.parse(value)
46
28
  end
47
29
  end
48
30
 
49
31
  property_supported :updated_on do
50
- if content_for_scanner =~ /Domain Last Updated Date:(.+)\n/
51
- Time.parse($1)
32
+ node("Domain Last Updated Date") do |value|
33
+ Time.parse(value) unless value.empty?
52
34
  end
53
35
  end
54
36
 
55
37
  property_supported :expires_on do
56
- if content_for_scanner =~ /Domain Expiration Date:(.+)\n/
57
- Time.parse($1)
38
+ node("Domain Expiration Date") do |value|
39
+ Time.parse(value)
58
40
  end
59
41
  end
60
42
 
61
43
 
62
44
  property_supported :nameservers do
63
- content_for_scanner.scan(/Nameservers:([^\s]+)\n/).flatten.map do |name|
64
- Record::Nameserver.new(name.downcase)
45
+ Array.wrap(node("Nameservers")).reject(&:empty?).map do |name|
46
+ Nameserver.new(name.downcase)
65
47
  end
66
48
  end
67
49
 
50
+
51
+ private
52
+
53
+ def contact(element, type)
54
+ node("#{element} ID") do
55
+ address = ["", "2", "3"].
56
+ map { |i| node("#{element} Address#{i}") }.
57
+ delete_if(&:empty?).
58
+ join("\n")
59
+
60
+ Record::Contact.new(
61
+ :type => type,
62
+ :id => node("#{element} ID"),
63
+ :name => node("#{element} Name"),
64
+ :organization => node("#{element} Organization"),
65
+ :address => address,
66
+ :city => node("#{element} City"),
67
+ :zip => node("#{element} Postal Code"),
68
+ :state => node("#{element} State/Province"),
69
+ :country_code => node("#{element} Country/Economy"),
70
+ :phone => node("#{element} Phone"),
71
+ :fax => node("#{element} FAX"),
72
+ :email => node("#{element} E-mail")
73
+ )
74
+ end
75
+ end
76
+
77
+ def decompose_registrar(value)
78
+ if value =~ /^(.+?) ([^\s]+)$/
79
+ [$2, $1]
80
+ end
81
+ end
82
+
68
83
  end
69
84
 
70
85
  end
@@ -30,8 +30,12 @@ module Whois
30
30
  property_supported :status do
31
31
  if content_for_scanner =~ /Status:\s+(.+?)\n/
32
32
  case $1.downcase
33
- when "active" then :registered
34
- when "not registered" then :available
33
+ when "active"
34
+ :registered
35
+ when "delegated"
36
+ :registered
37
+ when "not registered"
38
+ :available
35
39
  else
36
40
  Whois.bug!(ParserError, "Unknown status `#{$1}'.")
37
41
  end
@@ -7,64 +7,15 @@
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.ag parser
19
- #
20
17
  # Parser for the whois.nic.ag 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 WhoisNicAg < Base
29
-
30
- property_supported :status do
31
- content_for_scanner.scan(/Status:(.+?)\n+/).flatten
32
- end
33
-
34
- property_supported :available? do
35
- (content_for_scanner.strip == "NOT FOUND")
36
- end
37
-
38
- property_supported :registered? do
39
- !available?
40
- end
41
-
42
-
43
- property_supported :created_on do
44
- if content_for_scanner =~ /Created On:(.*?)\n/
45
- Time.parse($1)
46
- end
47
- end
48
-
49
- property_supported :updated_on do
50
- if content_for_scanner =~ /Last Updated On:(.*?)\n/
51
- Time.parse($1)
52
- end
53
- end
54
-
55
- property_supported :expires_on do
56
- if content_for_scanner =~ /Expiration Date:(.*?)\n/
57
- Time.parse($1)
58
- end
59
- end
60
-
61
-
62
- property_supported :nameservers do
63
- content_for_scanner.scan(/Name Server:([^\s]+)\n/).flatten.map do |name|
64
- Record::Nameserver.new(name.downcase)
65
- end
66
- end
67
-
18
+ class WhoisNicAg < BaseAfilias
68
19
  end
69
20
 
70
21
  end