orthrus 0.0.1 → 0.0.2

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/.gitignore CHANGED
@@ -1,3 +1,4 @@
1
+ .rvmrc
1
2
  *.gem
2
3
  .bundle
3
4
  Gemfile.lock
@@ -1,4 +1,5 @@
1
1
  require 'orthrus/remote_method'
2
+ require 'orthrus/remote_options'
2
3
 
3
4
  module Orthrus
4
5
  # Include Orthrus functionality in the given class
@@ -8,30 +9,32 @@ module Orthrus
8
9
  end
9
10
 
10
11
  module ClassMethods
12
+ # Getter for remote options
13
+ # @return [RemoteOptions] the remote options for this class
14
+ def remote_options
15
+ @remote_options ||= RemoteOptions.new
16
+ end
11
17
 
12
18
  # Define default settings for the remote connection.
13
19
  # @attribute remote_defaults
14
20
  # @param [Hash] options to be set as default
15
21
  # @return [Hash] the current remote default settings
16
22
  def remote_defaults(options)
17
- @remote_defaults ||= {}
18
- @remote_defaults.merge!(options) if options
19
- @remote_defaults
23
+ remote_options.smart_merge!(options)
20
24
  end
21
25
 
22
26
  # If we get subclassed, make sure that child inherits the remote defaults
23
27
  # of the parent class.
24
28
  def inherited(child)
25
- child.__send__(:remote_defaults, @remote_defaults)
29
+ child.__send__(:remote_defaults, remote_options)
26
30
  end
27
31
 
28
32
  # Declare a remote method and create a class method as wrapper
29
33
  # @param [Symbol] name of the remote method
30
34
  # @param [Hash] options for the remote method
31
35
  def define_remote_method(name, options = {})
32
- remote_options = (@remote_defaults || {}).merge(options)
33
36
  @remote_methods ||= {}
34
- @remote_methods[name] = RemoteMethod.new(remote_options)
37
+ @remote_methods[name] = RemoteMethod.new(remote_options.smart_merge(options))
35
38
 
36
39
  class_eval <<-SRC
37
40
  def self.#{name.to_s}(args = {})
@@ -7,11 +7,11 @@ module Orthrus
7
7
  # @param [Hash] options for the request
8
8
  def initialize(options = {})
9
9
  options[:method] ||= :get
10
- @options = options
11
- @base_uri = options.delete(:base_uri)
12
- @path = options.delete(:path)
13
- @on_success = options[:on_success] || lambda { |response| response }
14
- @on_failure = options[:on_failure] || lambda { |response| response }
10
+ @options = options === RemoteOptions ? options : RemoteOptions.new(options)
11
+ @base_uri = options.delete(:base_uri)
12
+ @path = options.delete(:path)
13
+ @on_success = options[:on_success] || lambda { |response| response }
14
+ @on_failure = options[:on_failure] || lambda { |response| response }
15
15
  end
16
16
 
17
17
  # Perform the request, handle response and return the result
@@ -19,7 +19,7 @@ module Orthrus
19
19
  # @return [Response, Object] the Typhoeus::Response or the result of the on_complete block
20
20
  def run(args = {})
21
21
  url = base_uri + interpolated_path(args)
22
- request = Typhoeus::Request.new(url, @options.merge(args))
22
+ request = Typhoeus::Request.new(url, @options.smart_merge(args))
23
23
  handle_response(request)
24
24
  Typhoeus::Hydra.hydra.queue request
25
25
  Typhoeus::Hydra.hydra.run
@@ -0,0 +1,24 @@
1
+ module Orthrus
2
+ class RemoteOptions < Hash
3
+ # @param [Hash] options to be set as remote options
4
+ def initialize(options = {})
5
+ replace(options)
6
+ end
7
+
8
+ # Merge the given hash and its subhashes.
9
+ # @param [Hash] other_hash to merge against
10
+ # @return [nil, RemoteOptions] the merged options
11
+ def smart_merge(hash)
12
+ return self if hash.nil?
13
+ merge(hash) do |key, o, n|
14
+ o.is_a?(Hash) && n.is_a?(Hash) ? o.merge(n) : n
15
+ end
16
+ end
17
+
18
+ # Perform smart merge and replace the current content
19
+ # @params (@see #deep_merge)
20
+ def smart_merge!(other_hash)
21
+ replace(smart_merge(other_hash))
22
+ end
23
+ end
24
+ end
@@ -1,3 +1,3 @@
1
1
  module Orthrus
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
@@ -0,0 +1,23 @@
1
+ require 'test_helper'
2
+
3
+ class TestClassMethods < Test::Unit::TestCase
4
+
5
+ def test_setting_remote_defaults
6
+ assert_not_nil defaults = Astronomy.instance_variable_get(:@remote_options)
7
+ assert_equal "http://astronomical.test", defaults[:base_uri]
8
+ assert_equal "Basic authentication", defaults[:headers][:authentication]
9
+ assert_equal "json", defaults[:params][:format]
10
+ end
11
+
12
+ def test_overwritting_remote_defaults_in_subclass
13
+ assert_not_nil defaults = Biology.instance_variable_get(:@remote_options)
14
+ assert_equal "http://biological.test", defaults[:base_uri]
15
+ assert_equal "Basic authentication", defaults[:headers][:authentication]
16
+ assert_equal "json", defaults[:params][:format]
17
+ assert_equal false, defaults[:params][:boring]
18
+ end
19
+
20
+ def test_define_remote_method
21
+ assert Astronomy.respond_to? :find
22
+ end
23
+ end
@@ -5,4 +5,31 @@ require 'orthrus'
5
5
  require 'json'
6
6
 
7
7
  class Test::Unit::TestCase
8
+ class Astronomy
9
+ include Orthrus
10
+ remote_defaults :headers => { :authentication => "Basic authentication" },
11
+ :base_uri => "http://astronomical.test",
12
+ :params => { :format => "json" }
13
+
14
+ define_remote_method :find,
15
+ :path => "/planets/:identifier",
16
+ :params => { :include_details => true }
17
+ end
18
+
19
+ class Biology < Astronomy
20
+ remote_defaults :base_uri => "http://biological.test",
21
+ :params => { :boring => false }
22
+ end
23
+
24
+ def setup
25
+ hydra = Typhoeus::Hydra.hydra
26
+ @index_response = Typhoeus::Response.new(:code => 200, :body => '{ "planets" : ["mars", "earth", "venus"] }', :time => 0.3)
27
+ @mars_response = Typhoeus::Response.new(:code => 200, :body => '{ "mars" : { "density" : "3.9335 g/cm3" , "temperature" : "210K" } }', :time => 0.3)
28
+ @error_response = Typhoeus::Response.new(:code => 404, :body => '{ "eris" : "is no planet but a TNO" }', :time => 0.3)
29
+ @put_response = Typhoeus::Response.new(:code => 403, :body => 'Creating planets is not your business!', :time => 0.3)
30
+ hydra.stub(:get, "http://astronomical.test/planets").and_return(@index_response)
31
+ hydra.stub(:get, "http://astronomical.test/planets/mars").and_return(@mars_response)
32
+ hydra.stub(:get, "http://astronomical.test/planets/eris").and_return(@error_response)
33
+ hydra.stub(:put, "http://astronomical.test/planets").and_return(@put_response)
34
+ end
8
35
  end
@@ -1,17 +1,6 @@
1
1
  require 'test_helper'
2
2
 
3
3
  class TestDefineRemoteMethod < Test::Unit::TestCase
4
- def setup
5
- hydra = Typhoeus::Hydra.hydra
6
- @index_response = Typhoeus::Response.new(:code => 200, :body => '{ "planets" : ["mars", "earth", "venus"] }', :time => 0.3)
7
- @show_response = Typhoeus::Response.new(:code => 200, :body => '{ "mars" : { "density" : "3.9335 g/cm3" , "temperature" : "210K" } }', :time => 0.3)
8
- @error_response = Typhoeus::Response.new(:code => 404, :body => '{ "eris" : "is no planet but a TNO" }', :time => 0.3)
9
- @put_response = Typhoeus::Response.new(:code => 403, :body => 'Creating planets is not your business!', :time => 0.3)
10
- hydra.stub(:get, "http://astronomical.joe/planets").and_return(@index_response)
11
- hydra.stub(:get, "http://astronomical.joe/planets/mars").and_return(@show_response)
12
- hydra.stub(:get, "http://astronomical.joe/planets/eris").and_return(@error_response)
13
- hydra.stub(:put, "http://astronomical.joe/planets").and_return(@put_response)
14
- end
15
4
 
16
5
  def test_path_interpolation
17
6
  remote_method = Orthrus::RemoteMethod.new :path => "/some/:id/with/:child"
@@ -23,7 +12,7 @@ class TestDefineRemoteMethod < Test::Unit::TestCase
23
12
 
24
13
  def test_simple_remote_method_get
25
14
  remote_method = Orthrus::RemoteMethod.new(
26
- :base_uri => "http://astronomical.joe",
15
+ :base_uri => "http://astronomical.test",
27
16
  :path => "/planets",
28
17
  :method => :get
29
18
  )
@@ -32,7 +21,7 @@ class TestDefineRemoteMethod < Test::Unit::TestCase
32
21
 
33
22
  def test_simple_remote_method_with_get_as_default
34
23
  remote_method = Orthrus::RemoteMethod.new(
35
- :base_uri => "http://astronomical.joe",
24
+ :base_uri => "http://astronomical.test",
36
25
  :path => "/planets"
37
26
  )
38
27
  assert_equal @index_response.body, remote_method.run.body
@@ -40,16 +29,16 @@ class TestDefineRemoteMethod < Test::Unit::TestCase
40
29
 
41
30
  def test_remote_method_with_interpolation
42
31
  remote_method = Orthrus::RemoteMethod.new(
43
- :base_uri => "http://astronomical.joe",
32
+ :base_uri => "http://astronomical.test",
44
33
  :path => "/planets/:identifier",
45
34
  :method => :get
46
35
  )
47
- assert_equal @show_response.body, remote_method.run(:identifier => :mars).body
36
+ assert_equal @mars_response.body, remote_method.run(:identifier => :mars).body
48
37
  end
49
38
 
50
39
  def test_remote_method_with_success_handler
51
40
  remote_method = Orthrus::RemoteMethod.new(
52
- :base_uri => "http://astronomical.joe",
41
+ :base_uri => "http://astronomical.test",
53
42
  :path => "/planets/:identifier",
54
43
  :on_success => lambda { |response| JSON.parse(response.body) },
55
44
  :method => :get
@@ -61,7 +50,7 @@ class TestDefineRemoteMethod < Test::Unit::TestCase
61
50
 
62
51
  def test_remote_method_with_failure_handler
63
52
  remote_method = Orthrus::RemoteMethod.new(
64
- :base_uri => "http://astronomical.joe",
53
+ :base_uri => "http://astronomical.test",
65
54
  :path => "/planets/:identifier",
66
55
  :on_failure => lambda { |response| JSON.parse(response.body) },
67
56
  :method => :get
@@ -72,11 +61,11 @@ class TestDefineRemoteMethod < Test::Unit::TestCase
72
61
 
73
62
  def test_remote_method_put
74
63
  remote_method = Orthrus::RemoteMethod.new(
75
- :base_uri => "http://astronomical.joe",
64
+ :base_uri => "http://astronomical.test",
76
65
  :path => "/planets",
77
66
  :method => :put
78
67
  )
79
- response = remote_method.run(:body => '{ :planet => :naboo }')
68
+ response = remote_method.run(:body => '{"planet":"naboo"}')
80
69
  assert_equal "Creating planets is not your business!", response.body
81
70
  end
82
71
  end
@@ -0,0 +1,30 @@
1
+ require 'test_helper'
2
+
3
+ class TestRemoteOptions < Test::Unit::TestCase
4
+ def test_remote_options_init
5
+ remote_options = Orthrus::RemoteOptions.new(:base_uri => "http://astronomical.joe", :params => {:format => :json})
6
+ assert_kind_of Hash, remote_options
7
+ assert_equal "http://astronomical.joe", remote_options[:base_uri]
8
+ assert_equal :json, remote_options[:params][:format]
9
+ end
10
+
11
+ def test_remote_options_merge
12
+ remote_options = Orthrus::RemoteOptions.new(:params => {:format => :json})
13
+ remote_options = remote_options.smart_merge(:params => {:planet => :juno})
14
+ assert_equal :json, remote_options[:params][:format]
15
+ assert_equal :juno, remote_options[:params][:planet]
16
+ end
17
+
18
+ def test_remote_options_merge_on_self
19
+ remote_options = Orthrus::RemoteOptions.new(:params => {:format => :json})
20
+ remote_options.smart_merge!(:params => {:planet => :juno})
21
+ assert_equal :json, remote_options[:params][:format]
22
+ assert_equal :juno, remote_options[:params][:planet]
23
+ end
24
+
25
+ def test_remote_options_merge_with_nil
26
+ remote_options = Orthrus::RemoteOptions.new(:params => {:format => :xml})
27
+ remote_options.smart_merge!(nil)
28
+ assert_equal :xml, remote_options[:params][:format]
29
+ end
30
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: orthrus
3
3
  version: !ruby/object:Gem::Version
4
- hash: 29
4
+ hash: 27
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 1
10
- version: 0.0.1
9
+ - 2
10
+ version: 0.0.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - Johannes Opper
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-06-16 00:00:00 +02:00
18
+ date: 2011-06-18 00:00:00 +02:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -74,19 +74,19 @@ extra_rdoc_files: []
74
74
 
75
75
  files:
76
76
  - .gitignore
77
- - .rvmrc
78
77
  - Gemfile
79
78
  - LICENSE
80
79
  - README.markdown
81
80
  - Rakefile
82
81
  - lib/orthrus.rb
83
82
  - lib/orthrus/remote_method.rb
83
+ - lib/orthrus/remote_options.rb
84
84
  - lib/orthrus/version.rb
85
85
  - orthrus.gemspec
86
- - test/test_define_remote_method.rb
86
+ - test/test_class_methods.rb
87
87
  - test/test_helper.rb
88
- - test/test_remote_defaults.rb
89
88
  - test/test_remote_method.rb
89
+ - test/test_remote_options.rb
90
90
  has_rdoc: true
91
91
  homepage: http://github.com/xijo/orthrus
92
92
  licenses: []
@@ -122,7 +122,7 @@ signing_key:
122
122
  specification_version: 3
123
123
  summary: Remote method handling for Typhoeus
124
124
  test_files:
125
- - test/test_define_remote_method.rb
125
+ - test/test_class_methods.rb
126
126
  - test/test_helper.rb
127
- - test/test_remote_defaults.rb
128
127
  - test/test_remote_method.rb
128
+ - test/test_remote_options.rb
data/.rvmrc DELETED
@@ -1 +0,0 @@
1
- rvm use 1.8.7@orthrus
@@ -1,24 +0,0 @@
1
- require 'test_helper'
2
-
3
- class TestDefineRemoteMethod < Test::Unit::TestCase
4
- class A
5
- include Orthrus
6
- define_remote_method :method_on_a,
7
- :path => 'entities',
8
- :base_uri => "http://fancydomain.com"
9
- end
10
-
11
- class B
12
- include Orthrus
13
- remote_defaults :base_uri => "http://superfancy.com"
14
- define_remote_method :method_on_b, :path => "entities/index"
15
- end
16
-
17
- def test_define_remote_method_without_defaults
18
- assert A.respond_to? :method_on_a
19
- end
20
-
21
- def test_define_remote_method_with_remote_defaults
22
- assert B.respond_to? :method_on_b
23
- end
24
- end
@@ -1,26 +0,0 @@
1
- require 'test_helper'
2
-
3
- class TestRemoteDefaults < Test::Unit::TestCase
4
- class A
5
- include Orthrus
6
- remote_defaults :headers => { :authentication => "Basic someting" },
7
- :base_uri => "http://fancydomain.com"
8
- end
9
-
10
- class B < A
11
- remote_defaults :base_uri => "http://superfancy.com"
12
- end
13
-
14
- def test_setting_remote_defaults
15
- assert_not_nil defaults = A.instance_variable_get(:@remote_defaults)
16
- assert_equal "http://fancydomain.com", defaults[:base_uri]
17
- assert_equal "Basic someting", defaults[:headers][:authentication]
18
- end
19
-
20
- def test_overwritting_remote_defaults_in_subclass
21
- assert_not_nil defaults = B.instance_variable_get(:@remote_defaults)
22
- assert_equal "http://superfancy.com", defaults[:base_uri]
23
- assert_equal "Basic someting", defaults[:headers][:authentication]
24
- end
25
-
26
- end