epp-client 0.0.3 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +24 -0
- data/.simplecov +16 -0
- data/.travis.yml +11 -0
- data/.yardopts +4 -0
- data/Gemfile +20 -0
- data/Gemfile.lock +51 -0
- data/LICENSE +1 -1
- data/README.md +75 -0
- data/Rakefile +2 -37
- data/epp-client.gemspec +15 -58
- data/gemfiles/Gemfile.ruby18 +13 -0
- data/lib/epp-client.rb +94 -7
- data/lib/epp-client/client.rb +117 -20
- data/lib/epp-client/commands/check.rb +11 -0
- data/lib/epp-client/commands/command.rb +24 -0
- data/lib/epp-client/commands/create.rb +11 -0
- data/lib/epp-client/commands/delete.rb +11 -0
- data/lib/epp-client/commands/info.rb +11 -0
- data/lib/epp-client/commands/login.rb +40 -0
- data/lib/epp-client/commands/logout.rb +11 -0
- data/lib/epp-client/commands/poll.rb +28 -0
- data/lib/epp-client/commands/read_write_command.rb +18 -0
- data/lib/epp-client/commands/renew.rb +11 -0
- data/lib/epp-client/commands/transfer.rb +25 -0
- data/lib/epp-client/commands/update.rb +11 -0
- data/lib/epp-client/contact/check.rb +23 -0
- data/lib/epp-client/contact/check_response.rb +22 -0
- data/lib/epp-client/contact/command.rb +87 -0
- data/lib/epp-client/contact/create.rb +34 -0
- data/lib/epp-client/contact/create_response.rb +14 -0
- data/lib/epp-client/contact/delete.rb +21 -0
- data/lib/epp-client/contact/delete_response.rb +9 -0
- data/lib/epp-client/contact/info.rb +21 -0
- data/lib/epp-client/contact/info_response.rb +74 -0
- data/lib/epp-client/contact/response.rb +34 -0
- data/lib/epp-client/contact/transfer.rb +21 -0
- data/lib/epp-client/contact/transfer_response.rb +26 -0
- data/lib/epp-client/contact/update.rb +80 -0
- data/lib/epp-client/contact/update_response.rb +9 -0
- data/lib/epp-client/domain/check.rb +23 -0
- data/lib/epp-client/domain/check_response.rb +22 -0
- data/lib/epp-client/domain/command.rb +92 -0
- data/lib/epp-client/domain/create.rb +49 -0
- data/lib/epp-client/domain/create_response.rb +17 -0
- data/lib/epp-client/domain/delete.rb +21 -0
- data/lib/epp-client/domain/delete_response.rb +9 -0
- data/lib/epp-client/domain/info.rb +21 -0
- data/lib/epp-client/domain/info_response.rb +66 -0
- data/lib/epp-client/domain/renew.rb +34 -0
- data/lib/epp-client/domain/renew_response.rb +14 -0
- data/lib/epp-client/domain/response.rb +34 -0
- data/lib/epp-client/domain/transfer.rb +27 -0
- data/lib/epp-client/domain/transfer_response.rb +29 -0
- data/lib/epp-client/domain/update.rb +81 -0
- data/lib/epp-client/domain/update_response.rb +9 -0
- data/lib/epp-client/host/check.rb +23 -0
- data/lib/epp-client/host/check_response.rb +22 -0
- data/lib/epp-client/host/command.rb +47 -0
- data/lib/epp-client/host/create.rb +24 -0
- data/lib/epp-client/host/create_response.rb +14 -0
- data/lib/epp-client/host/delete.rb +21 -0
- data/lib/epp-client/host/delete_response.rb +9 -0
- data/lib/epp-client/host/info.rb +21 -0
- data/lib/epp-client/host/info_response.rb +42 -0
- data/lib/epp-client/host/response.rb +34 -0
- data/lib/epp-client/host/update.rb +76 -0
- data/lib/epp-client/host/update_response.rb +9 -0
- data/lib/epp-client/request.rb +29 -74
- data/lib/epp-client/requests/abstract.rb +30 -0
- data/lib/epp-client/requests/command.rb +28 -0
- data/lib/epp-client/requests/extension.rb +28 -0
- data/lib/epp-client/requests/hello.rb +12 -0
- data/lib/epp-client/response.rb +45 -8
- data/lib/epp-client/response_helper.rb +25 -0
- data/lib/epp-client/server.rb +167 -63
- data/lib/epp-client/testing.rb +59 -0
- data/lib/epp-client/version.rb +3 -0
- data/lib/epp-client/xml_helper.rb +71 -0
- data/test/commands/test_check_command.rb +33 -0
- data/test/commands/test_create_command.rb +53 -0
- data/test/commands/test_delete_command.rb +28 -0
- data/test/commands/test_info_command.rb +28 -0
- data/test/commands/test_login_command.rb +56 -0
- data/test/commands/test_logout_command.rb +22 -0
- data/test/commands/test_poll_command.rb +54 -0
- data/test/commands/test_renew_command.rb +39 -0
- data/test/commands/test_transfer_command.rb +37 -0
- data/test/commands/test_update_command.rb +60 -0
- data/test/contact/test_contact_check.rb +33 -0
- data/test/contact/test_contact_check_response.rb +38 -0
- data/test/contact/test_contact_create.rb +70 -0
- data/test/contact/test_contact_create_response.rb +33 -0
- data/test/contact/test_contact_delete.rb +28 -0
- data/test/contact/test_contact_delete_response.rb +23 -0
- data/test/contact/test_contact_info.rb +28 -0
- data/test/contact/test_contact_info_response.rb +100 -0
- data/test/contact/test_contact_transfer.rb +28 -0
- data/test/contact/test_contact_transfer_response.rb +100 -0
- data/test/contact/test_contact_update.rb +83 -0
- data/test/contact/test_contact_update_response.rb +23 -0
- data/test/domain/test_domain_check.rb +33 -0
- data/test/domain/test_domain_check_response.rb +38 -0
- data/test/domain/test_domain_create.rb +53 -0
- data/test/domain/test_domain_create_response.rb +39 -0
- data/test/domain/test_domain_delete.rb +28 -0
- data/test/domain/test_domain_delete_response.rb +23 -0
- data/test/domain/test_domain_info.rb +28 -0
- data/test/domain/test_domain_info_response.rb +107 -0
- data/test/domain/test_domain_renew.rb +39 -0
- data/test/domain/test_domain_renew_response.rb +32 -0
- data/test/domain/test_domain_transfer.rb +37 -0
- data/test/domain/test_domain_transfer_response.rb +112 -0
- data/test/domain/test_domain_update.rb +73 -0
- data/test/domain/test_domain_update_response.rb +23 -0
- data/test/fixtures/responses/contact/check.xml +27 -0
- data/test/fixtures/responses/contact/create.xml +19 -0
- data/test/fixtures/responses/contact/delete.xml +12 -0
- data/test/fixtures/responses/contact/info.xml +49 -0
- data/test/fixtures/responses/contact/transfer-query.xml +23 -0
- data/test/fixtures/responses/contact/transfer-request.xml +23 -0
- data/test/fixtures/responses/contact/update.xml +12 -0
- data/test/fixtures/responses/domain/check.xml +27 -0
- data/test/fixtures/responses/domain/create.xml +20 -0
- data/test/fixtures/responses/domain/delete.xml +12 -0
- data/test/fixtures/responses/domain/info-no-exDate.xml +38 -0
- data/test/fixtures/responses/domain/info.xml +39 -0
- data/test/fixtures/responses/domain/renew.xml +19 -0
- data/test/fixtures/responses/domain/transfer-query.xml +24 -0
- data/test/fixtures/responses/domain/transfer-request.xml +24 -0
- data/test/fixtures/responses/domain/update.xml +12 -0
- data/test/fixtures/responses/greeting.xml +25 -0
- data/test/fixtures/responses/host/check.xml +27 -0
- data/test/fixtures/responses/host/create.xml +19 -0
- data/test/fixtures/responses/host/delete.xml +12 -0
- data/test/fixtures/responses/host/info.xml +30 -0
- data/test/fixtures/responses/host/update.xml +12 -0
- data/test/helper.rb +89 -0
- data/test/host/test_host_check.rb +33 -0
- data/test/host/test_host_check_response.rb +38 -0
- data/test/host/test_host_create.rb +37 -0
- data/test/host/test_host_create_response.rb +33 -0
- data/test/host/test_host_delete.rb +28 -0
- data/test/host/test_host_delete_response.rb +23 -0
- data/test/host/test_host_info.rb +28 -0
- data/test/host/test_host_info_response.rb +72 -0
- data/test/host/test_host_update.rb +68 -0
- data/test/host/test_host_update_response.rb +23 -0
- data/test/requests/test_command_request.rb +16 -0
- data/test/requests/test_extension_request.rb +55 -0
- data/test/requests/test_hello_request.rb +15 -0
- data/test/support/schemas/all.xsd +21 -0
- data/test/support/schemas/contact-1.0.xsd +387 -0
- data/test/support/schemas/domain-1.0.xsd +432 -0
- data/test/support/schemas/epp-1.0.xsd +403 -0
- data/test/support/schemas/eppcom-1.0.xsd +93 -0
- data/test/support/schemas/host-1.0.xsd +240 -0
- data/test/test_client.rb +54 -0
- data/test/test_request.rb +15 -0
- data/test/test_server.rb +57 -0
- metadata +270 -91
- data/.document +0 -5
- data/README.rdoc +0 -17
- data/VERSION +0 -1
- data/lib/epp-client/hello_request.rb +0 -9
- 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,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
|