epp-client 0.0.3 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +24 -0
  3. data/.simplecov +16 -0
  4. data/.travis.yml +11 -0
  5. data/.yardopts +4 -0
  6. data/Gemfile +20 -0
  7. data/Gemfile.lock +51 -0
  8. data/LICENSE +1 -1
  9. data/README.md +75 -0
  10. data/Rakefile +2 -37
  11. data/epp-client.gemspec +15 -58
  12. data/gemfiles/Gemfile.ruby18 +13 -0
  13. data/lib/epp-client.rb +94 -7
  14. data/lib/epp-client/client.rb +117 -20
  15. data/lib/epp-client/commands/check.rb +11 -0
  16. data/lib/epp-client/commands/command.rb +24 -0
  17. data/lib/epp-client/commands/create.rb +11 -0
  18. data/lib/epp-client/commands/delete.rb +11 -0
  19. data/lib/epp-client/commands/info.rb +11 -0
  20. data/lib/epp-client/commands/login.rb +40 -0
  21. data/lib/epp-client/commands/logout.rb +11 -0
  22. data/lib/epp-client/commands/poll.rb +28 -0
  23. data/lib/epp-client/commands/read_write_command.rb +18 -0
  24. data/lib/epp-client/commands/renew.rb +11 -0
  25. data/lib/epp-client/commands/transfer.rb +25 -0
  26. data/lib/epp-client/commands/update.rb +11 -0
  27. data/lib/epp-client/contact/check.rb +23 -0
  28. data/lib/epp-client/contact/check_response.rb +22 -0
  29. data/lib/epp-client/contact/command.rb +87 -0
  30. data/lib/epp-client/contact/create.rb +34 -0
  31. data/lib/epp-client/contact/create_response.rb +14 -0
  32. data/lib/epp-client/contact/delete.rb +21 -0
  33. data/lib/epp-client/contact/delete_response.rb +9 -0
  34. data/lib/epp-client/contact/info.rb +21 -0
  35. data/lib/epp-client/contact/info_response.rb +74 -0
  36. data/lib/epp-client/contact/response.rb +34 -0
  37. data/lib/epp-client/contact/transfer.rb +21 -0
  38. data/lib/epp-client/contact/transfer_response.rb +26 -0
  39. data/lib/epp-client/contact/update.rb +80 -0
  40. data/lib/epp-client/contact/update_response.rb +9 -0
  41. data/lib/epp-client/domain/check.rb +23 -0
  42. data/lib/epp-client/domain/check_response.rb +22 -0
  43. data/lib/epp-client/domain/command.rb +92 -0
  44. data/lib/epp-client/domain/create.rb +49 -0
  45. data/lib/epp-client/domain/create_response.rb +17 -0
  46. data/lib/epp-client/domain/delete.rb +21 -0
  47. data/lib/epp-client/domain/delete_response.rb +9 -0
  48. data/lib/epp-client/domain/info.rb +21 -0
  49. data/lib/epp-client/domain/info_response.rb +66 -0
  50. data/lib/epp-client/domain/renew.rb +34 -0
  51. data/lib/epp-client/domain/renew_response.rb +14 -0
  52. data/lib/epp-client/domain/response.rb +34 -0
  53. data/lib/epp-client/domain/transfer.rb +27 -0
  54. data/lib/epp-client/domain/transfer_response.rb +29 -0
  55. data/lib/epp-client/domain/update.rb +81 -0
  56. data/lib/epp-client/domain/update_response.rb +9 -0
  57. data/lib/epp-client/host/check.rb +23 -0
  58. data/lib/epp-client/host/check_response.rb +22 -0
  59. data/lib/epp-client/host/command.rb +47 -0
  60. data/lib/epp-client/host/create.rb +24 -0
  61. data/lib/epp-client/host/create_response.rb +14 -0
  62. data/lib/epp-client/host/delete.rb +21 -0
  63. data/lib/epp-client/host/delete_response.rb +9 -0
  64. data/lib/epp-client/host/info.rb +21 -0
  65. data/lib/epp-client/host/info_response.rb +42 -0
  66. data/lib/epp-client/host/response.rb +34 -0
  67. data/lib/epp-client/host/update.rb +76 -0
  68. data/lib/epp-client/host/update_response.rb +9 -0
  69. data/lib/epp-client/request.rb +29 -74
  70. data/lib/epp-client/requests/abstract.rb +30 -0
  71. data/lib/epp-client/requests/command.rb +28 -0
  72. data/lib/epp-client/requests/extension.rb +28 -0
  73. data/lib/epp-client/requests/hello.rb +12 -0
  74. data/lib/epp-client/response.rb +45 -8
  75. data/lib/epp-client/response_helper.rb +25 -0
  76. data/lib/epp-client/server.rb +167 -63
  77. data/lib/epp-client/testing.rb +59 -0
  78. data/lib/epp-client/version.rb +3 -0
  79. data/lib/epp-client/xml_helper.rb +71 -0
  80. data/test/commands/test_check_command.rb +33 -0
  81. data/test/commands/test_create_command.rb +53 -0
  82. data/test/commands/test_delete_command.rb +28 -0
  83. data/test/commands/test_info_command.rb +28 -0
  84. data/test/commands/test_login_command.rb +56 -0
  85. data/test/commands/test_logout_command.rb +22 -0
  86. data/test/commands/test_poll_command.rb +54 -0
  87. data/test/commands/test_renew_command.rb +39 -0
  88. data/test/commands/test_transfer_command.rb +37 -0
  89. data/test/commands/test_update_command.rb +60 -0
  90. data/test/contact/test_contact_check.rb +33 -0
  91. data/test/contact/test_contact_check_response.rb +38 -0
  92. data/test/contact/test_contact_create.rb +70 -0
  93. data/test/contact/test_contact_create_response.rb +33 -0
  94. data/test/contact/test_contact_delete.rb +28 -0
  95. data/test/contact/test_contact_delete_response.rb +23 -0
  96. data/test/contact/test_contact_info.rb +28 -0
  97. data/test/contact/test_contact_info_response.rb +100 -0
  98. data/test/contact/test_contact_transfer.rb +28 -0
  99. data/test/contact/test_contact_transfer_response.rb +100 -0
  100. data/test/contact/test_contact_update.rb +83 -0
  101. data/test/contact/test_contact_update_response.rb +23 -0
  102. data/test/domain/test_domain_check.rb +33 -0
  103. data/test/domain/test_domain_check_response.rb +38 -0
  104. data/test/domain/test_domain_create.rb +53 -0
  105. data/test/domain/test_domain_create_response.rb +39 -0
  106. data/test/domain/test_domain_delete.rb +28 -0
  107. data/test/domain/test_domain_delete_response.rb +23 -0
  108. data/test/domain/test_domain_info.rb +28 -0
  109. data/test/domain/test_domain_info_response.rb +107 -0
  110. data/test/domain/test_domain_renew.rb +39 -0
  111. data/test/domain/test_domain_renew_response.rb +32 -0
  112. data/test/domain/test_domain_transfer.rb +37 -0
  113. data/test/domain/test_domain_transfer_response.rb +112 -0
  114. data/test/domain/test_domain_update.rb +73 -0
  115. data/test/domain/test_domain_update_response.rb +23 -0
  116. data/test/fixtures/responses/contact/check.xml +27 -0
  117. data/test/fixtures/responses/contact/create.xml +19 -0
  118. data/test/fixtures/responses/contact/delete.xml +12 -0
  119. data/test/fixtures/responses/contact/info.xml +49 -0
  120. data/test/fixtures/responses/contact/transfer-query.xml +23 -0
  121. data/test/fixtures/responses/contact/transfer-request.xml +23 -0
  122. data/test/fixtures/responses/contact/update.xml +12 -0
  123. data/test/fixtures/responses/domain/check.xml +27 -0
  124. data/test/fixtures/responses/domain/create.xml +20 -0
  125. data/test/fixtures/responses/domain/delete.xml +12 -0
  126. data/test/fixtures/responses/domain/info-no-exDate.xml +38 -0
  127. data/test/fixtures/responses/domain/info.xml +39 -0
  128. data/test/fixtures/responses/domain/renew.xml +19 -0
  129. data/test/fixtures/responses/domain/transfer-query.xml +24 -0
  130. data/test/fixtures/responses/domain/transfer-request.xml +24 -0
  131. data/test/fixtures/responses/domain/update.xml +12 -0
  132. data/test/fixtures/responses/greeting.xml +25 -0
  133. data/test/fixtures/responses/host/check.xml +27 -0
  134. data/test/fixtures/responses/host/create.xml +19 -0
  135. data/test/fixtures/responses/host/delete.xml +12 -0
  136. data/test/fixtures/responses/host/info.xml +30 -0
  137. data/test/fixtures/responses/host/update.xml +12 -0
  138. data/test/helper.rb +89 -0
  139. data/test/host/test_host_check.rb +33 -0
  140. data/test/host/test_host_check_response.rb +38 -0
  141. data/test/host/test_host_create.rb +37 -0
  142. data/test/host/test_host_create_response.rb +33 -0
  143. data/test/host/test_host_delete.rb +28 -0
  144. data/test/host/test_host_delete_response.rb +23 -0
  145. data/test/host/test_host_info.rb +28 -0
  146. data/test/host/test_host_info_response.rb +72 -0
  147. data/test/host/test_host_update.rb +68 -0
  148. data/test/host/test_host_update_response.rb +23 -0
  149. data/test/requests/test_command_request.rb +16 -0
  150. data/test/requests/test_extension_request.rb +55 -0
  151. data/test/requests/test_hello_request.rb +15 -0
  152. data/test/support/schemas/all.xsd +21 -0
  153. data/test/support/schemas/contact-1.0.xsd +387 -0
  154. data/test/support/schemas/domain-1.0.xsd +432 -0
  155. data/test/support/schemas/epp-1.0.xsd +403 -0
  156. data/test/support/schemas/eppcom-1.0.xsd +93 -0
  157. data/test/support/schemas/host-1.0.xsd +240 -0
  158. data/test/test_client.rb +54 -0
  159. data/test/test_request.rb +15 -0
  160. data/test/test_server.rb +57 -0
  161. metadata +270 -91
  162. data/.document +0 -5
  163. data/README.rdoc +0 -17
  164. data/VERSION +0 -1
  165. data/lib/epp-client/hello_request.rb +0 -9
  166. data/test/test_epp-client.rb +0 -7
@@ -0,0 +1,29 @@
1
+ require File.expand_path('../response', __FILE__)
2
+
3
+ module EPP
4
+ module Domain
5
+ class TransferResponse < Response
6
+ def name
7
+ @name ||= value_for_xpath('//domain:name')
8
+ end
9
+ def status
10
+ @trStatus ||= value_for_xpath('//domain:trStatus')
11
+ end
12
+ def requested_id
13
+ @reID ||= value_for_xpath('//domain:reID')
14
+ end
15
+ def requested_date
16
+ @reDate ||= value_for_xpath('//domain:reDate') && Time.parse(value_for_xpath('//domain:reDate'))
17
+ end
18
+ def expiration_date
19
+ @exDate ||= value_for_xpath('//domain:exDate') && Time.parse(value_for_xpath('//domain:exDate'))
20
+ end
21
+ def action_id
22
+ @acID ||= value_for_xpath('//domain:acID')
23
+ end
24
+ def action_date
25
+ @acDate ||= value_for_xpath('//domain:acDate') && Time.parse(value_for_xpath('//domain:acDate'))
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,81 @@
1
+ require File.expand_path('../command', __FILE__)
2
+
3
+ module EPP
4
+ module Domain
5
+ class Update < Command
6
+ ADD_REM_ORDER = [:ns, :contact, :status]
7
+ CHG_ORDER = [:registrant, :auth_info]
8
+
9
+
10
+ # @option [Hash] :status A Hash of status value to text. Text may optionally be an array in the form ["Text", "lang"] if a custom language value needs to be set.
11
+ def initialize(name, options = {})
12
+ @name = name
13
+ @add = options.delete(:add) || {}
14
+ @rem = options.delete(:rem) || {}
15
+ @chg = options.delete(:chg) || {}
16
+
17
+ @add.delete_if { |k,_| !ADD_REM_ORDER.include?(k) }
18
+ @rem.delete_if { |k,_| !ADD_REM_ORDER.include?(k) }
19
+ @chg.delete_if { |k,_| !CHG_ORDER.include?(k) }
20
+ end
21
+
22
+ def name
23
+ 'update'
24
+ end
25
+
26
+ def to_xml
27
+ node = super
28
+ node << domain_node('name', @name)
29
+
30
+ unless @add.empty?
31
+ node << add = domain_node('add')
32
+ add_rem_to_xml(add, @add)
33
+ end
34
+
35
+ unless @rem.empty?
36
+ node << rem = domain_node('rem')
37
+ add_rem_to_xml(rem, @rem)
38
+ end
39
+
40
+ unless @chg.empty?
41
+ node << chg = domain_node('chg')
42
+ CHG_ORDER.each do |key|
43
+ value = @chg[key]
44
+ next if value.nil?
45
+
46
+ case key
47
+ when :registrant
48
+ chg << domain_node('registrant', value)
49
+ when :auth_info
50
+ chg << auth_info_to_xml(value)
51
+ end
52
+ end
53
+ end
54
+
55
+ node
56
+ end
57
+
58
+ protected
59
+ def add_rem_to_xml(node, hash)
60
+ ADD_REM_ORDER.each do |key|
61
+ value = hash[key]
62
+ next if value.nil? || value.empty?
63
+
64
+ case key
65
+ when :ns
66
+ node << nameservers_to_xml(value)
67
+ when :contact
68
+ contacts_to_xml(node, value)
69
+ when :status
70
+ value.each do |status, text|
71
+ text, lang = Array(text)
72
+ node << s = domain_node('status', text)
73
+ s['lang'] = lang if lang
74
+ s['s'] = status.to_s
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,9 @@
1
+ require File.expand_path('../response', __FILE__)
2
+
3
+ module EPP
4
+ module Domain
5
+ class UpdateResponse < Response
6
+
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,23 @@
1
+ require File.expand_path('../command', __FILE__)
2
+
3
+ module EPP
4
+ module Host
5
+ class Check < Command
6
+ def initialize(*names)
7
+ @names = names.flatten
8
+ end
9
+
10
+ def name
11
+ 'check'
12
+ end
13
+
14
+ def to_xml
15
+ node = super
16
+ @names.each do |name|
17
+ node << host_node('name', name)
18
+ end
19
+ node
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,22 @@
1
+ require File.expand_path('../response', __FILE__)
2
+
3
+ module EPP
4
+ module Host
5
+ class CheckResponse < Response
6
+ def available?(name)
7
+ availability[name]
8
+ end
9
+ def unavailable?(name)
10
+ !available?(name)
11
+ end
12
+
13
+ protected
14
+ def availability
15
+ @availability ||= nodes_for_xpath('//host:name').inject({}) do |hash, node|
16
+ hash[node.content.strip] = node['avail'] == '1'
17
+ hash
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,47 @@
1
+ module EPP
2
+ module Host
3
+ class Command
4
+ include XMLHelpers
5
+ attr_reader :namespaces
6
+
7
+ def set_namespaces(namespaces)
8
+ @namespaces = namespaces
9
+ end
10
+
11
+ def name
12
+ raise NotImplementedError, "#name must be implemented in subclasses"
13
+ end
14
+
15
+ def to_xml
16
+ @namespaces ||= {}
17
+ node = host_node(name)
18
+
19
+ xattr = XML::Attr.new(node, "schemaLocation", SCHEMA_LOCATION)
20
+ xattr.namespaces.namespace = @namespaces['xsi'] || XML::Namespace.new(node, 'xsi', 'http://www.w3.org/2001/XMLSchema-instance')
21
+
22
+ node
23
+ end
24
+
25
+ protected
26
+ def host_node(name, value = nil)
27
+ node = xml_node(name, value)
28
+ node.namespaces.namespace = host_namespace(node)
29
+ node
30
+ end
31
+ def host_namespace(node)
32
+ return @namespaces['host'] if @namespaces.has_key?('host')
33
+ @namespaces['host'] = xml_namespace(node, 'host', NAMESPACE)
34
+ end
35
+
36
+ def addrs_to_xml(node, addrs)
37
+ addrs.each do |key, values|
38
+ ip = key.to_s.sub('ip', '')
39
+ Array(values).each do |value|
40
+ node << addr = host_node('addr', value)
41
+ addr['ip'] = ip
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,24 @@
1
+ require File.expand_path('../command', __FILE__)
2
+
3
+ module EPP
4
+ module Host
5
+ class Create < Command
6
+ def initialize(name, addrs = {})
7
+ @name = name
8
+ @addrs = addrs
9
+ end
10
+
11
+ def name
12
+ 'create'
13
+ end
14
+
15
+ def to_xml
16
+ node = super
17
+ node << host_node('name', @name)
18
+ addrs_to_xml(node, @addrs)
19
+
20
+ node
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,14 @@
1
+ require File.expand_path('../response', __FILE__)
2
+
3
+ module EPP
4
+ module Host
5
+ class CreateResponse < Response
6
+ def name
7
+ @name ||= value_for_xpath('//host:name')
8
+ end
9
+ def creation_date
10
+ @crdate ||= value_for_xpath('//host:crDate') && Time.parse(value_for_xpath('//host:crDate'))
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,21 @@
1
+ require File.expand_path('../command', __FILE__)
2
+
3
+ module EPP
4
+ module Host
5
+ class Delete < Command
6
+ def initialize(name)
7
+ @name = name
8
+ end
9
+
10
+ def name
11
+ 'delete'
12
+ end
13
+
14
+ def to_xml
15
+ node = super
16
+ node << host_node('name', @name)
17
+ node
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,9 @@
1
+ require File.expand_path('../response', __FILE__)
2
+
3
+ module EPP
4
+ module Host
5
+ class DeleteResponse < Response
6
+
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,21 @@
1
+ require File.expand_path('../command', __FILE__)
2
+
3
+ module EPP
4
+ module Host
5
+ class Info < Command
6
+ def initialize(name)
7
+ @name = name
8
+ end
9
+
10
+ def name
11
+ 'info'
12
+ end
13
+
14
+ def to_xml
15
+ node = super
16
+ node << host_node('name', @name)
17
+ node
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,42 @@
1
+ require File.expand_path('../response', __FILE__)
2
+
3
+ module EPP
4
+ module Host
5
+ class InfoResponse < Response
6
+ def name
7
+ @name ||= value_for_xpath('//host:name')
8
+ end
9
+ def roid
10
+ @roid ||= value_for_xpath('//host:roid')
11
+ end
12
+ def status
13
+ @status ||= values_for_xpath('//host:status/@s')
14
+ end
15
+ def addresses
16
+ @addresses ||= nodes_for_xpath('//host:addr').inject({}) do |hash, node|
17
+ hash["ip#{node['ip']}"] ||= Array.new
18
+ hash["ip#{node['ip']}"] << node.content.strip
19
+ hash
20
+ end
21
+ end
22
+ def client_id
23
+ @clid ||= value_for_xpath('//host:clID')
24
+ end
25
+ def creator_id
26
+ @crid ||= value_for_xpath('//host:crID')
27
+ end
28
+ def created_date
29
+ @crdate ||= value_for_xpath('//host:crDate') && Time.parse(value_for_xpath('//host:crDate'))
30
+ end
31
+ def updator_id
32
+ @upid ||= value_for_xpath('//host:upID')
33
+ end
34
+ def updated_date
35
+ @update ||= value_for_xpath('//host:upDate') && Time.parse(value_for_xpath('//host:upDate'))
36
+ end
37
+ def transfer_date
38
+ @trdate ||= value_for_xpath('//host:trDate') && Time.parse(value_for_xpath('//host:trDate'))
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,34 @@
1
+ module EPP
2
+ module Host
3
+ class Response
4
+ include ResponseHelper
5
+
6
+ def initialize(response)
7
+ @response = response
8
+ end
9
+
10
+ def method_missing(meth, *args, &block)
11
+ return super unless @response.respond_to?(meth)
12
+ @response.send(meth, *args, &block)
13
+ end
14
+
15
+ def respond_to_missing?(method, include_private)
16
+ @response.respond_to?(method, include_private)
17
+ end
18
+
19
+ unless RUBY_VERSION >= "1.9.2"
20
+ def respond_to?(method, include_private = false)
21
+ respond_to_missing?(method, include_private) || super
22
+ end
23
+ def method(sym)
24
+ respond_to_missing?(sym, true) ? @response.method(sym) : super
25
+ end
26
+ end
27
+
28
+ protected
29
+ def namespaces
30
+ {'host' => NAMESPACE}
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,76 @@
1
+ require File.expand_path('../command', __FILE__)
2
+
3
+ module EPP
4
+ module Host
5
+ class Update < Command
6
+ ADD_REM_ORDER = [:addr, :status]
7
+ CHG_ORDER = [:name]
8
+
9
+ # @option [Hash] :status A Hash of status value to text. Text may optionally be an array in the form ["Text", "lang"] if a custom language value needs to be set.
10
+ def initialize(name, options = {})
11
+ @name = name
12
+ @add = options.delete(:add) || {}
13
+ @rem = options.delete(:rem) || {}
14
+ @chg = options.delete(:chg) || {}
15
+
16
+ @add.delete_if { |k,_| !ADD_REM_ORDER.include?(k) }
17
+ @rem.delete_if { |k,_| !ADD_REM_ORDER.include?(k) }
18
+ @chg.delete_if { |k,_| !CHG_ORDER.include?(k) }
19
+ end
20
+
21
+ def name
22
+ 'update'
23
+ end
24
+
25
+ def to_xml
26
+ node = super
27
+ node << host_node('name', @name)
28
+
29
+ unless @add.empty?
30
+ node << add = host_node('add')
31
+ add_rem_to_xml(add, @add)
32
+ end
33
+
34
+ unless @rem.empty?
35
+ node << rem = host_node('rem')
36
+ add_rem_to_xml(rem, @rem)
37
+ end
38
+
39
+ unless @chg.empty?
40
+ node << chg = host_node('chg')
41
+ CHG_ORDER.each do |key|
42
+ value = @chg[key]
43
+ next if value.nil?
44
+
45
+ case key
46
+ when :name
47
+ chg << host_node('name', value)
48
+ end
49
+ end
50
+ end
51
+
52
+ node
53
+ end
54
+
55
+ protected
56
+ def add_rem_to_xml(node, hash)
57
+ ADD_REM_ORDER.each do |key|
58
+ value = hash[key]
59
+ next if value.nil? || value.empty?
60
+
61
+ case key
62
+ when :addr
63
+ addrs_to_xml(node, value)
64
+ when :status
65
+ value.each do |status, text|
66
+ text, lang = Array(text)
67
+ node << s = host_node('status', text)
68
+ s['lang'] = lang if lang
69
+ s['s'] = status.to_s
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end