relax 0.0.3 → 0.0.4

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/lib/relax/request.rb CHANGED
@@ -4,21 +4,37 @@ module Relax
4
4
  # Request is intended to be a parent class for requests passed to
5
5
  # Service#call.
6
6
  class Request
7
- def initialize(options = {})
8
- self.class.class_variables.each do |variable|
9
- instance_variable_set(variable.slice(1..-1), self.class.send(:class_variable_get, variable))
10
- end
7
+ @parameters = {}
8
+
9
+ # New takes an optional hash of default parameter values. When passed,
10
+ # the values will be set on the request if the key exists as a valid
11
+ # parameter name.
12
+ def initialize(defaults = {})
13
+ # initialize default parameter values
14
+ self.class.parameters.each do |parameter, options|
15
+ if defaults.has_key?(parameter)
16
+ value = defaults[parameter]
17
+ elsif options[:value]
18
+ value = options[:value]
19
+ end
11
20
 
12
- options.each do |key, value|
13
- instance_variable_set "@#{key}", value
21
+ instance_variable_set("@#{parameter}", value) if value
14
22
  end
15
23
  end
16
24
 
17
25
  # Converts this request into a Query object.
18
26
  def to_query
19
- keys.inject(Query.new) do |parameters, key|
20
- parameters[convert_key(key)] = send(key)
21
- parameters
27
+ self.class.parameters.keys.inject(Query.new) do |query, key|
28
+ value = send(key)
29
+ options = self.class.parameters[key]
30
+ if value && !options[:type]
31
+ query[convert_key(key)] = value if value
32
+ elsif options[:type]
33
+ options[:type].parameters.each do |parameter, options|
34
+ query[convert_complex_key(key, parameter)] = value.send(parameter) if value
35
+ end
36
+ end
37
+ query
22
38
  end
23
39
  end
24
40
 
@@ -27,14 +43,40 @@ module Relax
27
43
  to_query.to_s
28
44
  end
29
45
 
46
+ # Converts a key when the Request is converted to a query. By default, no
47
+ # conversion actually takes place, but this method can be overridden by
48
+ # child classes to perform standard manipulations, such as replacing
49
+ # underscores.
50
+ def convert_key(key)
51
+ key
52
+ end
53
+ protected :convert_key
54
+
55
+ # Converts a complex key (i.e. a parameter with a custom type) when the
56
+ # Request is converted to a query. By default, this means the key name and
57
+ # the parameter name separated by two underscores. This method can be
58
+ # overridden by child classes.
59
+ def convert_complex_key(key, parameter)
60
+ "#{key}.#{parameter}"
61
+ end
62
+ protected :convert_complex_key
63
+
30
64
  class << self
65
+ # Create the parameters hash for the subclass.
66
+ def inherited(subclass) #:nodoc:
67
+ subclass.instance_variable_set('@parameters', {})
68
+ end
69
+
31
70
  # Specifies a parameter to create on the request class.
32
71
  #
33
72
  # Options:
73
+ # - <tt>:type</tt>: An optional custom data type for the parameter.
74
+ # This must be a class that is a descendent of Request.
34
75
  # - <tt>:value</tt>: The default value for this parameter.
35
76
  def parameter(name, options = {})
36
77
  attr_accessor name
37
- class_variable_set("@@#{name}", options.delete(:value)) if options[:value]
78
+ options = @parameters[name].merge(options) if @parameters.has_key?(name)
79
+ @parameters[name] = options
38
80
  end
39
81
 
40
82
  # Adds a template value to a request class. Equivalent to creating a
@@ -42,21 +84,12 @@ module Relax
42
84
  def []=(key, value)
43
85
  parameter(key, {:value => value})
44
86
  end
45
- end
46
-
47
- protected
48
87
 
49
- # Returns an array of the parameter names for this request.
50
- def keys
51
- instance_variables.collect { |v| v.sub('@', '') }
52
- end
53
-
54
- # Converts a key when the Request is converted to a query. By default, no
55
- # conversion actually takes place, but this method can be overridden by
56
- # child classes to perform standard manipulations, such as replacing
57
- # underscores.
58
- def convert_key(key)
59
- key
88
+ # Returns a hash of all of the parameters for this request, including
89
+ # those that are inherited.
90
+ def parameters #:nodoc:
91
+ (superclass.respond_to?(:parameters) ? superclass.parameters : {}).merge(@parameters)
92
+ end
60
93
  end
61
94
  end
62
95
  end
@@ -131,7 +131,7 @@ module Relax
131
131
  end
132
132
 
133
133
  class << self
134
- # When a Response is extended, the superclasses parameters are copied
134
+ # When a Response is extended, the superclass's parameters are copied
135
135
  # into the new class. This behavior has the following side-effect: if
136
136
  # parameters are added to the superclass after it has been extended,
137
137
  # those new paramters won't be passed on to its children. This shouldn't
data/spec/query_spec.rb CHANGED
@@ -11,13 +11,13 @@ describe 'a query' do
11
11
  it 'should convert to a query string' do
12
12
  @query[:action] = 'Search'
13
13
  @query[:query] = 'strings'
14
- @query.to_s.should == 'action=Search&query=strings'
14
+ @query.to_s.should eql('action=Search&query=strings')
15
15
  end
16
16
 
17
17
  it 'should convert its values to strings' do
18
18
  date = Date.today
19
19
  @query[:date] = date
20
- @query.to_s.should == "date=#{date.to_s}"
20
+ @query.to_s.should eql("date=#{date.to_s}")
21
21
  end
22
22
 
23
23
  it 'should escape its values using "+" instead of "%20"' do
@@ -28,18 +28,18 @@ describe 'a query' do
28
28
  @query[:charlie] = 3
29
29
  @query[:alpha] = 1
30
30
  @query[:bravo] = 2
31
- @query.to_s.should == 'alpha=1&bravo=2&charlie=3'
31
+ @query.to_s.should eql('alpha=1&bravo=2&charlie=3')
32
32
  end
33
33
 
34
34
  it 'should encode its parameter values' do
35
35
  @query[:spaces] = 'two words'
36
36
  @query[:url] = 'http://example.com/'
37
- @query.to_s.should == 'spaces=two+words&url=http%3A%2F%2Fexample.com%2F'
37
+ @query.to_s.should eql('spaces=two+words&url=http%3A%2F%2Fexample.com%2F')
38
38
  end
39
39
 
40
40
  it 'should be able to parse query strings' do
41
41
  parsed_query = Relax::Query.parse(@uri)
42
- parsed_query[:action].should == 'search'
43
- parsed_query[:query].should == 'keyword'
42
+ parsed_query[:action].should eql('search')
43
+ parsed_query[:query].should eql('keyword')
44
44
  end
45
45
  end
data/spec/request_spec.rb CHANGED
@@ -2,10 +2,16 @@ require File.dirname(__FILE__) + '/spec_helper'
2
2
 
3
3
  require 'relax/request'
4
4
 
5
+ class Amount < Relax::Request
6
+ parameter :amount
7
+ parameter :currency
8
+ end
9
+
5
10
  class TestRequest < Relax::Request
6
11
  parameter :action
7
12
  parameter :token_id
8
13
  parameter :user_id
14
+ parameter :amount, :type => Amount
9
15
  end
10
16
 
11
17
  class ChildRequest < TestRequest
@@ -30,12 +36,14 @@ describe 'a request that converts to a query', :shared => true do
30
36
  @query[:action].should eql('Search')
31
37
  @query[:token_id].should eql('123')
32
38
  @query[:user_id].should be_nil
39
+ @query[:amount].should be_nil
33
40
  end
34
41
 
35
42
  it 'should only include parameters in the query if they are set' do
36
43
  @query.key?(:action).should be_true
37
44
  @query.key?(:token_id).should be_true
38
45
  @query.key?(:user_id).should be_false
46
+ @query.key?(:amount).should be_false
39
47
  end
40
48
  end
41
49
 
@@ -49,6 +57,7 @@ describe 'a template request' do
49
57
  it_should_behave_like 'an option initialized request'
50
58
 
51
59
  before(:each) do
60
+ # this syntax may need to go away unless we can find a way to make it work
52
61
  TestRequest[:api_key] = '123456'
53
62
  TestRequest[:secret] = 'shhh!'
54
63
  end
@@ -84,3 +93,16 @@ describe 'a template request' do
84
93
  parent.respond_to?(:query).should be_false
85
94
  end
86
95
  end
96
+
97
+ describe 'a request with a custom type' do
98
+ before(:each) do
99
+ request = TestRequest.new(:action => 'Pay', :token_id => 123)
100
+ request.amount = Amount.new(:amount => 3.50, :currency => 'USD')
101
+ @query = request.to_query
102
+ end
103
+
104
+ it 'should add the type parameters to the query' do
105
+ @query.key?(:"amount.amount").should be_true
106
+ @query.key?(:"amount.currency").should be_true
107
+ end
108
+ end
metadata CHANGED
@@ -1,10 +1,10 @@
1
1
  --- !ruby/object:Gem::Specification
2
- rubygems_version: 0.9.0
2
+ rubygems_version: 0.9.4
3
3
  specification_version: 1
4
4
  name: relax
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.0.3
7
- date: 2007-11-01 00:00:00 -04:00
6
+ version: 0.0.4
7
+ date: 2007-11-17 00:00:00 -05:00
8
8
  summary: A simple library for creating REST consumers.
9
9
  require_paths:
10
10
  - lib
@@ -30,12 +30,12 @@ authors:
30
30
  - Tyler Hunt
31
31
  files:
32
32
  - lib/relax
33
- - lib/relax.rb
34
33
  - lib/relax/query.rb
35
34
  - lib/relax/request.rb
36
35
  - lib/relax/response.rb
37
36
  - lib/relax/service.rb
38
37
  - lib/relax/symbolic_hash.rb
38
+ - lib/relax.rb
39
39
  - README
40
40
  - LICENSE
41
41
  test_files: