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.
Files changed (59) hide show
  1. data/Gemfile +3 -0
  2. data/README.md +35 -24
  3. data/Rakefile +11 -11
  4. data/lib/rapuncel.rb +9 -17
  5. data/lib/rapuncel/adapters/net_http_adapter.rb +7 -5
  6. data/lib/rapuncel/base_64_string.rb +31 -0
  7. data/lib/rapuncel/client.rb +2 -2
  8. data/lib/rapuncel/connection.rb +35 -58
  9. data/lib/rapuncel/request.rb +1 -38
  10. data/lib/rapuncel/response.rb +17 -30
  11. data/lib/rapuncel/xml_rpc_deserializer.rb +110 -0
  12. data/lib/rapuncel/xml_rpc_serializer.rb +148 -0
  13. data/rapuncel.gemspec +3 -2
  14. data/spec/functional/client_spec.rb +53 -0
  15. data/spec/spec_helper.rb +48 -0
  16. data/{test → spec}/test_server.rb +0 -1
  17. data/spec/unit/array_spec.rb +41 -0
  18. data/spec/unit/base64_spec.rb +30 -0
  19. data/spec/unit/boolean_spec.rb +39 -0
  20. data/spec/unit/connection_spec.rb +22 -0
  21. data/spec/unit/float_spec.rb +38 -0
  22. data/spec/unit/hash_spec.rb +54 -0
  23. data/spec/unit/int_spec.rb +23 -0
  24. data/spec/unit/nil_spec.rb +7 -0
  25. data/spec/unit/object_spec.rb +24 -0
  26. data/spec/unit/proxy_spec.rb +29 -0
  27. data/spec/unit/request_spec.rb +28 -0
  28. data/{test/unit/response_test.rb → spec/unit/response_spec.rb} +29 -44
  29. data/spec/unit/string_spec.rb +35 -0
  30. data/spec/unit/time_spec.rb +20 -0
  31. metadata +77 -104
  32. data/lib/rapuncel/base.rb +0 -7
  33. data/lib/rapuncel/core_ext/array.rb +0 -23
  34. data/lib/rapuncel/core_ext/big_decimal.rb +0 -7
  35. data/lib/rapuncel/core_ext/boolean.rb +0 -29
  36. data/lib/rapuncel/core_ext/float.rb +0 -11
  37. data/lib/rapuncel/core_ext/hash.rb +0 -32
  38. data/lib/rapuncel/core_ext/integer.rb +0 -11
  39. data/lib/rapuncel/core_ext/nil.rb +0 -7
  40. data/lib/rapuncel/core_ext/object.rb +0 -49
  41. data/lib/rapuncel/core_ext/string.rb +0 -12
  42. data/lib/rapuncel/core_ext/symbol.rb +0 -7
  43. data/lib/rapuncel/core_ext/time.rb +0 -14
  44. data/rapuncel-0.0.3.gem +0 -0
  45. data/test/functional/client_test.rb +0 -54
  46. data/test/functional_test_helper.rb +0 -13
  47. data/test/test_helper.rb +0 -38
  48. data/test/unit/array_test.rb +0 -97
  49. data/test/unit/boolean_test.rb +0 -34
  50. data/test/unit/connection_test.rb +0 -29
  51. data/test/unit/float_test.rb +0 -23
  52. data/test/unit/hash_test.rb +0 -54
  53. data/test/unit/int_test.rb +0 -27
  54. data/test/unit/nil_test.rb +0 -16
  55. data/test/unit/object_test.rb +0 -83
  56. data/test/unit/proxy_test.rb +0 -52
  57. data/test/unit/request_test.rb +0 -34
  58. data/test/unit/string_test.rb +0 -40
  59. data/test/unit/time_test.rb +0 -23
@@ -1,7 +0,0 @@
1
- module Rapuncel
2
- BUILDER_OPTIONS = {:encoding => 'UTF-8'}
3
-
4
- def self.get_builder options = {}
5
- Nokogiri::XML::Builder.new options
6
- end
7
- end
@@ -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,7 +0,0 @@
1
- class BigDecimal
2
- def to_xml_rpc b = Rapuncel.get_builder
3
- b.double self.to_s
4
-
5
- b.to_xml
6
- end
7
- 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,11 +0,0 @@
1
- class Float
2
- def self.from_xml_rpc xml_node
3
- xml_node.text.strip.to_f #calling to_float on the text between the (hopefully correct) tags
4
- end
5
-
6
- def to_xml_rpc b = Rapuncel.get_builder
7
- b.double to_s
8
-
9
- b.to_xml
10
- end
11
- 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,11 +0,0 @@
1
- class Integer
2
- def to_xml_rpc b = Rapuncel.get_builder
3
- b.int self.to_s
4
-
5
- b.to_xml
6
- end
7
-
8
- def self.from_xml_rpc xml_node
9
- xml_node.text.strip.to_i #calling to_i on the text between the i4 or int tags
10
- end
11
- end
@@ -1,7 +0,0 @@
1
- class NilClass
2
- def to_xml_rpc b = Rapuncel.get_builder
3
- false.to_xml_rpc b
4
-
5
- b.to_xml
6
- end
7
- 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,7 +0,0 @@
1
- class Symbol
2
- def to_xml_rpc b = Rapuncel.get_builder
3
- b.string to_s
4
-
5
- b.to_xml
6
- end
7
- 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
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
@@ -1,13 +0,0 @@
1
- require 'test_helper'
2
- require 'test_server'
3
-
4
- class FunctionalTest < ActiveSupport::TestCase
5
- def setup
6
- @test_server = TestServer.new
7
- @test_server.start
8
- end
9
-
10
- def teardown
11
- @test_server.stop
12
- end
13
- end
@@ -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
@@ -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
@@ -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