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,87 @@
1
+ module EPP
2
+ module Contact
3
+ class Command
4
+ include XMLHelpers
5
+ attr_reader :namespaces
6
+
7
+ DISCLOSE_ORDER = ['name', 'org', 'addr', 'voice', 'fax', 'email']
8
+
9
+ def set_namespaces(namespaces)
10
+ @namespaces = namespaces
11
+ end
12
+
13
+ def name
14
+ raise NotImplementedError, "#name must be implemented in subclasses"
15
+ end
16
+
17
+ def to_xml
18
+ @namespaces ||= {}
19
+ node = contact_node(name)
20
+
21
+ xattr = XML::Attr.new(node, "schemaLocation", SCHEMA_LOCATION)
22
+ xattr.namespaces.namespace = @namespaces['xsi'] || XML::Namespace.new(node, 'xsi', 'http://www.w3.org/2001/XMLSchema-instance')
23
+
24
+ node
25
+ end
26
+
27
+ protected
28
+ def contact_node(name, value = nil)
29
+ node = xml_node(name, value)
30
+ node.namespaces.namespace = contact_namespace(node)
31
+ node
32
+ end
33
+ def contact_namespace(node)
34
+ return @namespaces['contact'] if @namespaces.has_key?('contact')
35
+ @namespaces['contact'] = xml_namespace(node, 'contact', NAMESPACE)
36
+ end
37
+
38
+ def postal_info_to_xml(postal_info)
39
+ node = contact_node('postalInfo')
40
+ node['type'] = 'loc'
41
+
42
+ node << contact_node('name', postal_info[:name])
43
+ node << contact_node('org', postal_info[:org]) if postal_info[:org]
44
+ node << addr_to_xml(postal_info[:addr])
45
+
46
+ node
47
+ end
48
+ def addr_to_xml(addr)
49
+ node = contact_node('addr')
50
+
51
+ node << contact_node('street', addr[:street]) if addr[:street]
52
+ node << contact_node('city', addr[:city])
53
+ node << contact_node('sp', addr[:sp]) if addr[:sp]
54
+ node << contact_node('pc', addr[:pc]) if addr[:pc]
55
+ node << contact_node('cc', addr[:cc])
56
+
57
+ node
58
+ end
59
+ def disclose_to_xml(disclose)
60
+ flag = disclose.keys.first
61
+ node = contact_node('disclose')
62
+ node['flag'] = flag
63
+
64
+ DISCLOSE_ORDER.each do |name|
65
+ next unless disclose[flag].include?(name)
66
+ node << n = contact_node(name)
67
+ n['type'] = 'loc' if ['name', 'org', 'addr'].include?(name)
68
+ end
69
+
70
+ node
71
+ end
72
+
73
+ def auth_info_to_xml(auth_info)
74
+ a = contact_node('authInfo')
75
+
76
+ if auth_info.has_key?(:pw)
77
+ a << pw = contact_node('pw', auth_info[:pw])
78
+ pw['roid'] = auth_info[:roid] if auth_info.has_key?(:roid)
79
+ elsif auth_info.has_key?(:ext)
80
+ a << contact_node('ext', auth_info[:ext])
81
+ end
82
+
83
+ a
84
+ end
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,34 @@
1
+ require File.expand_path('../command', __FILE__)
2
+
3
+ module EPP
4
+ module Contact
5
+ class Create < Command
6
+ def initialize(id, options = {})
7
+ @id = id
8
+
9
+ @postal_info = options.delete(:postal_info)
10
+ @voice = options.delete(:voice)
11
+ @fax = options.delete(:fax)
12
+ @email = options.delete(:email)
13
+ @auth_info = options.delete(:auth_info)
14
+ @disclose = options.delete(:disclose)
15
+ end
16
+
17
+ def name
18
+ 'create'
19
+ end
20
+
21
+ def to_xml
22
+ node = super
23
+ node << contact_node('id', @id)
24
+ node << postal_info_to_xml(@postal_info)
25
+ node << contact_node('voice', @voice) if @voice
26
+ node << contact_node('fax', @fax) if @fax
27
+ node << contact_node('email', @email)
28
+ node << auth_info_to_xml(@auth_info)
29
+ node << disclose_to_xml(@disclose) if @disclose
30
+ node
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,14 @@
1
+ require File.expand_path('../response', __FILE__)
2
+
3
+ module EPP
4
+ module Contact
5
+ class CreateResponse < Response
6
+ def id
7
+ @id ||= value_for_xpath('//contact:id')
8
+ end
9
+ def creation_date
10
+ @crdate ||= value_for_xpath('//contact:crDate') && Time.parse(value_for_xpath('//contact: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 Contact
5
+ class Delete < Command
6
+ def initialize(id)
7
+ @id = id
8
+ end
9
+
10
+ def name
11
+ 'delete'
12
+ end
13
+
14
+ def to_xml
15
+ node = super
16
+ node << contact_node('id', @id)
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 Contact
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 Contact
5
+ class Info < Command
6
+ def initialize(id)
7
+ @id = id
8
+ end
9
+
10
+ def name
11
+ 'info'
12
+ end
13
+
14
+ def to_xml
15
+ node = super
16
+ node << contact_node('id', @id)
17
+ node
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,74 @@
1
+ require File.expand_path('../response', __FILE__)
2
+
3
+ module EPP
4
+ module Contact
5
+ class InfoResponse < Response
6
+ def id
7
+ @id ||= value_for_xpath('//contact:id')
8
+ end
9
+ def roid
10
+ @roid ||= value_for_xpath('//contact:roid')
11
+ end
12
+ def status
13
+ @status ||= values_for_xpath('//contact:status/@s')
14
+ end
15
+ def email
16
+ @email ||= value_for_xpath('//contact:email')
17
+ end
18
+ def fax
19
+ @fax ||= value_for_xpath('//contact:fax') do |node|
20
+ [node.content.strip, node['x']].compact.join(".")
21
+ end
22
+ end
23
+ def voice
24
+ @voice ||= value_for_xpath('//contact:voice') do |node|
25
+ [node.content.strip, node['x']].compact.join(".")
26
+ end
27
+ end
28
+ def postal_info
29
+ @postal_info ||= {
30
+ :name => value_for_xpath('//contact:postalInfo/contact:name'),
31
+ :org => value_for_xpath('//contact:postalInfo/contact:org'),
32
+ :addr => {
33
+ :street => values_for_xpath('//contact:postalInfo/contact:addr/contact:street').join("\n"),
34
+ :city => value_for_xpath('//contact:postalInfo/contact:addr/contact:city'),
35
+ :sp => value_for_xpath('//contact:postalInfo/contact:addr/contact:sp'),
36
+ :pc => value_for_xpath('//contact:postalInfo/contact:addr/contact:pc'),
37
+ :cc => value_for_xpath('//contact:postalInfo/contact:addr/contact:cc')
38
+ }
39
+ }
40
+ end
41
+ def client_id
42
+ @clid ||= value_for_xpath('//contact:clID')
43
+ end
44
+ def creator_id
45
+ @crid ||= value_for_xpath('//contact:crID')
46
+ end
47
+ def created_date
48
+ @crdate ||= value_for_xpath('//contact:crDate') && Time.parse(value_for_xpath('//contact:crDate'))
49
+ end
50
+ def updator_id
51
+ @upid ||= value_for_xpath('//contact:upID')
52
+ end
53
+ def updated_date
54
+ @update ||= value_for_xpath('//contact:upDate') && Time.parse(value_for_xpath('//contact:upDate'))
55
+ end
56
+ def transfer_date
57
+ @trdate ||= value_for_xpath('//contact:trDate') && Time.parse(value_for_xpath('//contact:trDate'))
58
+ end
59
+ def auth_info
60
+ @auth_info ||= begin
61
+ { 'pw' => value_for_xpath('//contact:authInfo/contact:pw') }
62
+ end
63
+ end
64
+ def disclose
65
+ @disclose ||= begin
66
+ nodes_for_xpath('//contact:disclose').inject({}) do |hash, node|
67
+ hash[node['flag'].to_s] = node.children.reject{|n| n.empty?}.map { |child| child.name }
68
+ hash
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,34 @@
1
+ module EPP
2
+ module Contact
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
+ {'contact' => NAMESPACE}
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,21 @@
1
+ require File.expand_path('../command', __FILE__)
2
+
3
+ module EPP
4
+ module Contact
5
+ class Transfer < Command
6
+ def initialize(id)
7
+ @id = id
8
+ end
9
+
10
+ def name
11
+ 'transfer'
12
+ end
13
+
14
+ def to_xml
15
+ node = super
16
+ node << contact_node('id', @id)
17
+ node
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,26 @@
1
+ require File.expand_path('../response', __FILE__)
2
+
3
+ module EPP
4
+ module Contact
5
+ class TransferResponse < Response
6
+ def id
7
+ @id ||= value_for_xpath('//contact:id')
8
+ end
9
+ def status
10
+ @trStatus ||= value_for_xpath('//contact:trStatus')
11
+ end
12
+ def requested_id
13
+ @reID ||= value_for_xpath('//contact:reID')
14
+ end
15
+ def requested_date
16
+ @reDate ||= value_for_xpath('//contact:reDate') && Time.parse(value_for_xpath('//contact:reDate'))
17
+ end
18
+ def action_id
19
+ @acID ||= value_for_xpath('//contact:acID')
20
+ end
21
+ def action_date
22
+ @acDate ||= value_for_xpath('//contact:acDate') && Time.parse(value_for_xpath('//contact:acDate'))
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,80 @@
1
+ require File.expand_path('../command', __FILE__)
2
+
3
+ module EPP
4
+ module Contact
5
+ class Update < Command
6
+ ADD_REM_ORDER = [:status]
7
+ CHG_ORDER = [:postal_info, :voice, :fax, :email, :auth_info, :disclose]
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(id, options = {})
11
+ @id = id
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 << contact_node('id', @id)
28
+
29
+ unless @add.empty?
30
+ node << add = contact_node('add')
31
+ add_rem_to_xml(add, @add)
32
+ end
33
+
34
+ unless @rem.empty?
35
+ node << rem = contact_node('rem')
36
+ add_rem_to_xml(rem, @rem)
37
+ end
38
+
39
+ unless @chg.empty?
40
+ node << chg = contact_node('chg')
41
+ CHG_ORDER.each do |key|
42
+ value = @chg[key]
43
+ next if value.nil? || value.empty?
44
+
45
+ case key
46
+ when :postal_info
47
+ chg << postal_info_to_xml(value)
48
+ when :auth_info
49
+ chg << auth_info_to_xml(value)
50
+ when :disclose
51
+ chg << disclose_to_xml(value)
52
+ when :voice, :fax, :email
53
+ chg << contact_node(key.to_s, value)
54
+ end
55
+ end
56
+ end
57
+
58
+ node
59
+ end
60
+
61
+ protected
62
+ def add_rem_to_xml(node, hash)
63
+ ADD_REM_ORDER.each do |key|
64
+ value = hash[key]
65
+ next if value.nil? || value.empty?
66
+
67
+ case key
68
+ when :status
69
+ value.each do |status, text|
70
+ text, lang = Array(text)
71
+ node << s = contact_node('status', text)
72
+ s['lang'] = lang if lang
73
+ s['s'] = status.to_s
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,9 @@
1
+ require File.expand_path('../response', __FILE__)
2
+
3
+ module EPP
4
+ module Contact
5
+ class UpdateResponse < Response
6
+
7
+ end
8
+ end
9
+ end