rapuncel 0.0.4 → 0.0.5.RC1
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.
- 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
|