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.
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