rapuncel 0.0.4 → 0.0.5.RC1
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +3 -0
- data/README.md +35 -24
- data/Rakefile +11 -11
- data/lib/rapuncel.rb +9 -17
- data/lib/rapuncel/adapters/net_http_adapter.rb +7 -5
- data/lib/rapuncel/base_64_string.rb +31 -0
- data/lib/rapuncel/client.rb +2 -2
- data/lib/rapuncel/connection.rb +35 -58
- data/lib/rapuncel/request.rb +1 -38
- data/lib/rapuncel/response.rb +17 -30
- data/lib/rapuncel/xml_rpc_deserializer.rb +110 -0
- data/lib/rapuncel/xml_rpc_serializer.rb +148 -0
- data/rapuncel.gemspec +3 -2
- data/spec/functional/client_spec.rb +53 -0
- data/spec/spec_helper.rb +48 -0
- data/{test → spec}/test_server.rb +0 -1
- data/spec/unit/array_spec.rb +41 -0
- data/spec/unit/base64_spec.rb +30 -0
- data/spec/unit/boolean_spec.rb +39 -0
- data/spec/unit/connection_spec.rb +22 -0
- data/spec/unit/float_spec.rb +38 -0
- data/spec/unit/hash_spec.rb +54 -0
- data/spec/unit/int_spec.rb +23 -0
- data/spec/unit/nil_spec.rb +7 -0
- data/spec/unit/object_spec.rb +24 -0
- data/spec/unit/proxy_spec.rb +29 -0
- data/spec/unit/request_spec.rb +28 -0
- data/{test/unit/response_test.rb → spec/unit/response_spec.rb} +29 -44
- data/spec/unit/string_spec.rb +35 -0
- data/spec/unit/time_spec.rb +20 -0
- metadata +77 -104
- data/lib/rapuncel/base.rb +0 -7
- data/lib/rapuncel/core_ext/array.rb +0 -23
- data/lib/rapuncel/core_ext/big_decimal.rb +0 -7
- data/lib/rapuncel/core_ext/boolean.rb +0 -29
- data/lib/rapuncel/core_ext/float.rb +0 -11
- data/lib/rapuncel/core_ext/hash.rb +0 -32
- data/lib/rapuncel/core_ext/integer.rb +0 -11
- data/lib/rapuncel/core_ext/nil.rb +0 -7
- data/lib/rapuncel/core_ext/object.rb +0 -49
- data/lib/rapuncel/core_ext/string.rb +0 -12
- data/lib/rapuncel/core_ext/symbol.rb +0 -7
- data/lib/rapuncel/core_ext/time.rb +0 -14
- data/rapuncel-0.0.3.gem +0 -0
- data/test/functional/client_test.rb +0 -54
- data/test/functional_test_helper.rb +0 -13
- data/test/test_helper.rb +0 -38
- data/test/unit/array_test.rb +0 -97
- data/test/unit/boolean_test.rb +0 -34
- data/test/unit/connection_test.rb +0 -29
- data/test/unit/float_test.rb +0 -23
- data/test/unit/hash_test.rb +0 -54
- data/test/unit/int_test.rb +0 -27
- data/test/unit/nil_test.rb +0 -16
- data/test/unit/object_test.rb +0 -83
- data/test/unit/proxy_test.rb +0 -52
- data/test/unit/request_test.rb +0 -34
- data/test/unit/string_test.rb +0 -40
- data/test/unit/time_test.rb +0 -23
data/lib/rapuncel/base.rb
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
class Array
|
2
|
-
def to_xml_rpc b = Rapuncel.get_builder
|
3
|
-
b.array do |b|
|
4
|
-
b.data do |b|
|
5
|
-
each do |array_entry|
|
6
|
-
b.value do |b|
|
7
|
-
array_entry.to_xml_rpc b
|
8
|
-
end
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
b.to_xml
|
14
|
-
end
|
15
|
-
|
16
|
-
def self.from_xml_rpc xml_node
|
17
|
-
values = xml_node.first_element_child.element_children
|
18
|
-
|
19
|
-
values.map do |value|
|
20
|
-
Object.from_xml_rpc value.first_element_child
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
@@ -1,29 +0,0 @@
|
|
1
|
-
class TrueClass
|
2
|
-
def to_xml_rpc b = Rapuncel.get_builder
|
3
|
-
b.boolean "1"
|
4
|
-
|
5
|
-
b.to_xml
|
6
|
-
end
|
7
|
-
end
|
8
|
-
|
9
|
-
class FalseClass
|
10
|
-
def to_xml_rpc b = Rapuncel.get_builder
|
11
|
-
b.boolean "0"
|
12
|
-
|
13
|
-
b.to_xml
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
# this is to catch the from_xml_rpc call from Object
|
18
|
-
class Rapuncel::Boolean
|
19
|
-
def self.from_xml_rpc xml_node
|
20
|
-
|
21
|
-
# DISCUSS: need convention here:
|
22
|
-
case xml_node.text.downcase
|
23
|
-
when '1'
|
24
|
-
true
|
25
|
-
else
|
26
|
-
false
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
@@ -1,32 +0,0 @@
|
|
1
|
-
class Hash
|
2
|
-
# Hash will be translated into an XML-RPC "struct" object
|
3
|
-
|
4
|
-
def to_xml_rpc b = Rapuncel.get_builder
|
5
|
-
b.struct do |b|
|
6
|
-
self.each_pair do |key, value|
|
7
|
-
b.member do |b|
|
8
|
-
b.name key.to_s
|
9
|
-
|
10
|
-
b.value do |b|
|
11
|
-
value.to_xml_rpc b
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
b.to_xml
|
18
|
-
end
|
19
|
-
|
20
|
-
def self.from_xml_rpc xml_node
|
21
|
-
keys_and_values = xml_node.element_children
|
22
|
-
|
23
|
-
new.tap do |hash|
|
24
|
-
keys_and_values.each do |kv|
|
25
|
-
key = kv.first_element_child.text.strip.to_sym
|
26
|
-
value = Object.from_xml_rpc kv.last_element_child.first_element_child
|
27
|
-
|
28
|
-
hash[key] = value
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
@@ -1,49 +0,0 @@
|
|
1
|
-
class Object
|
2
|
-
def to_xml_rpc b = Rapuncel.get_builder
|
3
|
-
if respond_to?(:acts_like?) && acts_like?(:time)
|
4
|
-
to_time.to_xml_rpc b
|
5
|
-
else
|
6
|
-
_collect_ivars_in_hash.to_xml_rpc b
|
7
|
-
end
|
8
|
-
|
9
|
-
b.to_xml
|
10
|
-
end
|
11
|
-
|
12
|
-
def self.from_xml_rpc xml_node
|
13
|
-
if xml_node.is_a? String
|
14
|
-
xml_node = Nokogiri::XML.parse(xml_node).root
|
15
|
-
end
|
16
|
-
|
17
|
-
return nil if xml_node.nil?
|
18
|
-
|
19
|
-
case xml_node.name
|
20
|
-
when 'i4', 'int'
|
21
|
-
Integer.from_xml_rpc xml_node
|
22
|
-
when 'array'
|
23
|
-
Array.from_xml_rpc xml_node
|
24
|
-
when 'struct'
|
25
|
-
Hash.from_xml_rpc xml_node
|
26
|
-
when 'double'
|
27
|
-
Float.from_xml_rpc xml_node
|
28
|
-
when 'boolean'
|
29
|
-
Rapuncel::Boolean.from_xml_rpc xml_node
|
30
|
-
when 'string'
|
31
|
-
String.from_xml_rpc xml_node
|
32
|
-
when 'dateTime.iso8601'
|
33
|
-
Time.from_xml_rpc xml_node
|
34
|
-
when 'base64'
|
35
|
-
raise 'Now its time to implement Base64'
|
36
|
-
else
|
37
|
-
raise "What is this? I didn't know #{xml_node.name} was part of the XMLRPC specification? Anyway, the value was: #{xml_node.text.strip}"
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
private
|
42
|
-
def _collect_ivars_in_hash
|
43
|
-
{}.tap do |hsh|
|
44
|
-
instance_variables.each do |ivar|
|
45
|
-
hsh[ivar[1..-1]] = instance_variable_get ivar
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
@@ -1,12 +0,0 @@
|
|
1
|
-
class String
|
2
|
-
def to_xml_rpc b = Rapuncel.get_builder
|
3
|
-
b.string self
|
4
|
-
|
5
|
-
b.to_xml
|
6
|
-
end
|
7
|
-
|
8
|
-
def self.from_xml_rpc xml_node
|
9
|
-
xml_node.text.gsub(/(\r\n|\r)/, "\n") #just give back the string between the 'string' tags
|
10
|
-
# DISCUSS: to strip or not to strip
|
11
|
-
end
|
12
|
-
end
|
@@ -1,14 +0,0 @@
|
|
1
|
-
require 'time'
|
2
|
-
|
3
|
-
class Time
|
4
|
-
|
5
|
-
def to_xml_rpc b=Rapuncel.get_builder
|
6
|
-
b.send "dateTime.iso8601", self.iso8601
|
7
|
-
|
8
|
-
b.to_xml
|
9
|
-
end
|
10
|
-
|
11
|
-
def self.from_xml_rpc xml_node
|
12
|
-
Time.parse xml_node.text.strip #make a Time object of this string which is hopefully in the right format
|
13
|
-
end
|
14
|
-
end
|
data/rapuncel-0.0.3.gem
DELETED
Binary file
|
@@ -1,54 +0,0 @@
|
|
1
|
-
require 'functional_test_helper'
|
2
|
-
|
3
|
-
class FunctionalClientTest < FunctionalTest
|
4
|
-
test "Simple XMLRPC call" do
|
5
|
-
client = Rapuncel::Client.new :port => 9485, :raise_on => :both
|
6
|
-
proxy = client.proxy_for 'num'
|
7
|
-
|
8
|
-
result = proxy.add 40, 2
|
9
|
-
|
10
|
-
assert_equal 42, result
|
11
|
-
end
|
12
|
-
|
13
|
-
test "Fault rpc call without raise" do
|
14
|
-
client = Rapuncel::Client.new :port => 9485
|
15
|
-
proxy = client.proxy_for 'num'
|
16
|
-
|
17
|
-
assert_nothing_raised Rapuncel::Response::Exception do
|
18
|
-
proxy.add 20, 20, 2
|
19
|
-
end
|
20
|
-
|
21
|
-
assert_kind_of Hash, proxy.add(20, 20, 2)
|
22
|
-
end
|
23
|
-
|
24
|
-
test "Fault rpc call" do
|
25
|
-
client = Rapuncel::Client.new :port => 9485, :raise_on => :both
|
26
|
-
proxy = client.proxy_for 'num'
|
27
|
-
|
28
|
-
assert_raise Rapuncel::Response::Fault do
|
29
|
-
proxy.add 20, 20, 2
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
test "Error rpc connection" do
|
34
|
-
client = Rapuncel::Client.new :host => 'www.cice-online.net', :port => 80, :path => '/hullahoobahubbahooo', :raise_on => :both
|
35
|
-
proxy = client.proxy
|
36
|
-
|
37
|
-
assert_raise Rapuncel::Response::Error do
|
38
|
-
proxy.foo :bar, :baz
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
test "Error rpc connection without raise" do
|
43
|
-
client = Rapuncel::Client.new :host => 'www.google.de', :port => 80, :path => '/hullahoobahubbahooo'
|
44
|
-
proxy = client.proxy
|
45
|
-
|
46
|
-
assert_nothing_raised Rapuncel::Response::Error do
|
47
|
-
proxy.foo :bar, :baz
|
48
|
-
end
|
49
|
-
|
50
|
-
err = proxy.foo(:bar, :baz)
|
51
|
-
assert_kind_of Hash, err
|
52
|
-
assert_equal 404, err[:http_code]
|
53
|
-
end
|
54
|
-
end
|
data/test/test_helper.rb
DELETED
@@ -1,38 +0,0 @@
|
|
1
|
-
lib_dir = File.join File.dirname(__FILE__), '..', 'lib'
|
2
|
-
$:.unshift lib_dir
|
3
|
-
|
4
|
-
require 'rubygems'
|
5
|
-
require 'active_support'
|
6
|
-
require 'test/unit'
|
7
|
-
require 'mocha'
|
8
|
-
require 'rapuncel'
|
9
|
-
require 'nokogiri'
|
10
|
-
require 'ruby-debug'
|
11
|
-
|
12
|
-
class ActiveSupport::TestCase
|
13
|
-
def assert_select xml, xpath, eq, count = nil
|
14
|
-
doc = Nokogiri::XML.parse xml, nil, nil, Nokogiri::XML::ParseOptions::STRICT
|
15
|
-
res = doc.xpath xpath
|
16
|
-
|
17
|
-
eq.nil? && assert(res.blank?) && return
|
18
|
-
|
19
|
-
case eq
|
20
|
-
when Integer
|
21
|
-
assert_equal eq, res.size
|
22
|
-
when String
|
23
|
-
eq = eq.strip
|
24
|
-
|
25
|
-
if count
|
26
|
-
assert_equal count, res.to_a.select{ |node|
|
27
|
-
node.text.strip == eq
|
28
|
-
}.size
|
29
|
-
else
|
30
|
-
assert res.to_a.all?{ |node|
|
31
|
-
node.text.strip == eq
|
32
|
-
}
|
33
|
-
end
|
34
|
-
else
|
35
|
-
raise "Third argument should be String or Integer"
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
data/test/unit/array_test.rb
DELETED
@@ -1,97 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
class ArrayTest < ActiveSupport::TestCase
|
4
|
-
|
5
|
-
test "an array of 10 entries should have 10x /array/data/value" do
|
6
|
-
arr = (1..10).to_a.map &:to_s
|
7
|
-
xml = arr.to_xml_rpc
|
8
|
-
|
9
|
-
assert_select xml, '/array/data/value', 10
|
10
|
-
end
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
test "An array, converted to xml and parsed back should be itself" do
|
15
|
-
def test_array_conversion arr
|
16
|
-
xml = arr.to_xml_rpc
|
17
|
-
|
18
|
-
xml_node = Nokogiri::XML(xml).children.first
|
19
|
-
|
20
|
-
reparsed = Array.from_xml_rpc xml_node
|
21
|
-
|
22
|
-
reparsed
|
23
|
-
end
|
24
|
-
|
25
|
-
arr1 = (1..10).to_a
|
26
|
-
arr2 = arr1.map &:to_s
|
27
|
-
|
28
|
-
arr3 = [arr1, arr2]
|
29
|
-
|
30
|
-
arr4 = ["hello", arr3]
|
31
|
-
|
32
|
-
reparsed1 = test_array_conversion arr1
|
33
|
-
reparsed2 = test_array_conversion arr2
|
34
|
-
reparsed3 = test_array_conversion arr3
|
35
|
-
reparsed4 = test_array_conversion arr4
|
36
|
-
|
37
|
-
[reparsed1, reparsed2, reparsed3, reparsed4].zip([arr1, arr2, arr3, arr4]).each do |b|
|
38
|
-
assert_equal *b
|
39
|
-
end
|
40
|
-
|
41
|
-
end
|
42
|
-
|
43
|
-
test "real world repsonse" do
|
44
|
-
response_body = <<-XML
|
45
|
-
<array><data>
|
46
|
-
<value><struct>
|
47
|
-
<member>
|
48
|
-
<name>state</name>
|
49
|
-
<value><string>uninstalled</string></value>
|
50
|
-
</member>
|
51
|
-
<member>
|
52
|
-
<name>name</name>
|
53
|
-
<value><string>account_cancel</string></value>
|
54
|
-
</member>
|
55
|
-
<member>
|
56
|
-
<name>id</name>
|
57
|
-
<value><int>1</int></value>
|
58
|
-
</member>
|
59
|
-
</struct></value>
|
60
|
-
<value><struct>
|
61
|
-
<member>
|
62
|
-
<name>state</name>
|
63
|
-
<value><string>uninstalled</string></value>
|
64
|
-
</member>
|
65
|
-
<member>
|
66
|
-
<name>name</name>
|
67
|
-
<value><string>document_ftp</string></value>
|
68
|
-
</member>
|
69
|
-
<member>
|
70
|
-
<name>id</name>
|
71
|
-
<value><int>3</int></value>
|
72
|
-
</member>
|
73
|
-
</struct></value>
|
74
|
-
<value><struct>
|
75
|
-
<member>
|
76
|
-
<name>state</name>
|
77
|
-
<value><string>uninstalled</string></value>
|
78
|
-
</member>
|
79
|
-
<member>
|
80
|
-
<name>name</name>
|
81
|
-
<value><string>mrp_repair</string></value>
|
82
|
-
</member>
|
83
|
-
<member>
|
84
|
-
<name>id</name>
|
85
|
-
<value><int>2</int></value>
|
86
|
-
</member>
|
87
|
-
</struct></value>
|
88
|
-
</data></array>
|
89
|
-
XML
|
90
|
-
|
91
|
-
arr = Object.from_xml_rpc response_body
|
92
|
-
|
93
|
-
assert_kind_of Array, arr
|
94
|
-
assert_equal 3, arr.size
|
95
|
-
end
|
96
|
-
|
97
|
-
end
|
data/test/unit/boolean_test.rb
DELETED
@@ -1,34 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
class BooleanTest < ActiveSupport::TestCase
|
4
|
-
|
5
|
-
test "true must evaluate to 1" do
|
6
|
-
assert_select true.to_xml_rpc, '/boolean', 1
|
7
|
-
assert_select true.to_xml_rpc, '/boolean', '1'
|
8
|
-
end
|
9
|
-
|
10
|
-
test "false must evaluate to 0" do
|
11
|
-
assert_select false.to_xml_rpc, '/boolean', 1
|
12
|
-
assert_select false.to_xml_rpc, '/boolean', '0'
|
13
|
-
end
|
14
|
-
|
15
|
-
test "true.to_xml_rpc reparsed must be true" do
|
16
|
-
xml=true.to_xml_rpc
|
17
|
-
xml_node = Nokogiri::XML(xml).children.first
|
18
|
-
|
19
|
-
assert Rapuncel::Boolean.from_xml_rpc(xml_node) #I assume assert takes a boolean?
|
20
|
-
assert Rapuncel::Boolean.from_xml_rpc(xml_node) == true #is this different? just in case the other function gives back something non nil/false which is not necessarily true
|
21
|
-
end
|
22
|
-
|
23
|
-
test "false.to_xml_rpc reparsed must be false" do
|
24
|
-
xml=false.to_xml_rpc
|
25
|
-
xml_node = Nokogiri::XML(xml).children.first
|
26
|
-
|
27
|
-
assert !Rapuncel::Boolean.from_xml_rpc(xml_node)
|
28
|
-
end
|
29
|
-
|
30
|
-
test "anything else should evaluate to what now?" do
|
31
|
-
assert true
|
32
|
-
end
|
33
|
-
|
34
|
-
end
|