yamlrpc 0.1.080624130617 → 0.1.080630154212

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.
@@ -1,27 +1,43 @@
1
1
 
2
- # Simple RPC client on YAML.
2
+ # Simple RPC client on YAML
3
+ #
4
+ # Exacmple:
5
+ #
6
+ # yaml_rpc = YamlRpc.new('http://my.com/yaml_api/')
7
+ # yaml_rpc.invoice( :invoice_id => '123' )
8
+ #
9
+ # will POST { :invoice_id => YAML::dump('123') } value to http://my.com/yaml_api/invoice
10
+ #
11
+ # On the server side you can use YamlRpc.decode(params, [:invoice_id]) (in Ruby on Rails) to get decoded values.
3
12
  module YamlRpc
4
13
 
5
14
  class Client
6
15
 
7
16
  attr_accessor :url
17
+ attr_accessor :form_data_root
8
18
 
9
- def initialize(url)
19
+ # * <tt>url</tt> Root url, ie. "http://my.com/something/"; YamlRpc#some_method(:foo => 'bar') will POST to http://my.com/something/some_method with { :foo => 'bar' } params
20
+ # * <tt>options</tt>
21
+ # * <tt>:form_data_root</tt> Default to nil; if you want all params to have single root, ie. 'yaml', set :form_data_root => :yaml
22
+ def initialize(url, options = {})
10
23
  @url = url
24
+ @form_data_root = options[:form_data_root]
11
25
  end
12
26
 
27
+ # * <tt>method</tt> Method name
28
+ # * <tt>args</tt> Arguments, should always be a Hash
13
29
  def method_missing(method, args)
14
30
  post(method, args)
15
31
  end
16
32
 
17
33
  protected
18
34
 
19
- # * <tt>url</tt> Url
20
- # * <tt>data</tt> Data to be passed as POST form field 'yaml', ie: { :status => 'SUCCESS', :message => 'All ok' }
21
- def post(url, data = {})
22
- url = URI.parse("#{@url}#{url}")
35
+ # * <tt>add_url</tt> Path to be added to the YamlRpc#url (usually it's the method name), ie :invoice)
36
+ # * <tt>args</tt> Data to be passed as POST fields, ie: { :status => 'SUCCESS', :message => 'All ok' }
37
+ def post(add_url, args = {})
38
+ url = URI.parse("#{@url}#{add_url}")
23
39
  req = Net::HTTP::Post.new(url.path)
24
- req.set_form_data({ :yaml => YAML::dump(data) }, ';')
40
+ req.set_form_data(args_to_form_data(args), ';')
25
41
  res = Net::HTTP.new(url.host, url.port).start { |http| http.request(req) }
26
42
  case res
27
43
  when Net::HTTPSuccess
@@ -30,6 +46,19 @@ module YamlRpc
30
46
  res.error!
31
47
  end
32
48
  end
49
+
50
+ # POST form data can be passed in two ways:
51
+ # 1) with common root (set YamlRpc#form_data_root to ie. :my_root)
52
+ # 2) without common root, each key is at the root of POST
53
+ def args_to_form_data(args)
54
+ r = {}
55
+ if @form_data_root
56
+ r[@form_data_root.to_sym] = YAML::dump(args)
57
+ else
58
+ args.each { |k, v| r[k.to_sym] = YAML::dump(v) }
59
+ end
60
+ r
61
+ end
33
62
 
34
63
  end
35
64
 
@@ -0,0 +1,35 @@
1
+
2
+ module YamlRpc
3
+
4
+ class <<self
5
+
6
+ # Helper method to decode passed arguments on the server side.
7
+ #
8
+ # Please note this is trivial task and you don't have to use this helper function to decode POST data on the server.
9
+ # You can even use different language to parse YAML, like PHP.
10
+ #
11
+ # * <tt>params</tt> Hash
12
+ # * <tt>fields</tt> If nil, will decode all passed params; otherwise only passed list of keys
13
+ def decode(params, fields = nil)
14
+ r = {}
15
+ fields = params.keys unless fields
16
+ fields.each { |k| r[k] = YAML::load(params[k] || "--- \n" ) }
17
+ r
18
+ end
19
+
20
+ # Helper method to decode arguments on the server side.
21
+ #
22
+ # Returns a list of decoded values so you can use:
23
+ #
24
+ # image, description, keywords = YamlRpc.decode_to_ary(params, [:image, :description, :keywords])
25
+ #
26
+ # * <tt>params</tt> Hash
27
+ # * <tt>fields</tt> Optional, single field name or array of field names, ie. [:foo, :bar]
28
+ def decode_to_ary(params, fields)
29
+ fields = fields.is_a?(Array) ? fields : [ fields ]
30
+ fields.map { |k| YAML::load(params[k] || "--- \n") }
31
+ end
32
+
33
+ end
34
+
35
+ end
data/lib/yamlrpc.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require 'yaml'
2
2
  require 'net/http'
3
3
 
4
+ require 'yamlrpc/helpers'
4
5
  require 'yamlrpc/client'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yamlrpc
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.080624130617
4
+ version: 0.1.080630154212
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mirek Rusin
@@ -9,7 +9,7 @@ autorequire: yamlrpc
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-06-24 00:00:00 +01:00
12
+ date: 2008-06-30 00:00:00 +01:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -24,6 +24,7 @@ extra_rdoc_files:
24
24
  files:
25
25
  - lib/yamlrpc
26
26
  - lib/yamlrpc/client.rb
27
+ - lib/yamlrpc/helpers.rb
27
28
  - lib/yamlrpc.rb
28
29
  - README
29
30
  has_rdoc: true