invisiblehand 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -86,6 +86,10 @@ If the API returns any error information, an `InvisibleHand::Error::APIError` is
86
86
  thrown and the `#message` method of the error object will contain the error
87
87
  output from the API.
88
88
 
89
+ The `InvisibleHand::Error::APIError` object also contains `#url` and
90
+ `#raw_response` methods that give you what URL on the API got hit and what the
91
+ raw response from the server was for debugging purposes.
92
+
89
93
  ### Logging
90
94
 
91
95
  The InvisibleHand gem does have debug logging that goes to an internal `Logger`
@@ -108,6 +112,19 @@ The gem looks for a DEBUG environment variable. If DEBUG is set, debugging
108
112
  information will be printed out to the screen. This includes URL information
109
113
  every time an API call is made.
110
114
 
115
+ Alternately, if you want to do ad-hoc debugging on single API calls you can pass
116
+ in a debugging option:
117
+
118
+ ``` ruby
119
+ require 'invisiblehand'
120
+
121
+ api = InvisibleHand::API.new :app_id => "id", :app_key => "key"
122
+
123
+ api.products query: "nickelback", debug: true
124
+ #=> Result is the same as normal, you'll just get verbose debugging output to
125
+ # the gem's internal logger (which you can override, see Logging above).
126
+ ```
127
+
111
128
  ## Development
112
129
 
113
130
  To run tests, first you will need a valid `invisiblehand.yml` config file inside
@@ -1,11 +1,11 @@
1
1
  :app_id: "your app id here"
2
2
  :app_key: "your app key here"
3
3
 
4
- # The endpoint is the region of the API you would like to hit. The regions are
4
+ # The :region is the region of the API you would like to hit. The regions are
5
5
  # detailed in the developer documentation:
6
6
  #
7
7
  # https://developer.getinvisiblehand.com/documentation#intro
8
8
  #
9
9
  # The option will default to the US if you do not explicitly specify it.
10
10
  #
11
- # :endpoint: us.api.invisiblehand.co.uk
11
+ # :region: us
@@ -44,7 +44,6 @@ module InvisibleHand
44
44
  end
45
45
 
46
46
  @config[:protocol] = @config[:use_ssl] == false ? "http://" : "https://"
47
- @config[:endpoint] ||= "us.api.invisiblehand.co.uk"
48
47
  end
49
48
 
50
49
  def products opts = {}
@@ -69,7 +68,7 @@ module InvisibleHand
69
68
 
70
69
  def api_call method, path, opts = {}
71
70
  query = url_params_from opts
72
- url = "#{@config[:protocol]}#{@config[:endpoint]}#{path}?#{query}"
71
+ url = "#{@config[:protocol]}#{endpoint}#{path}?#{query}"
73
72
 
74
73
  if opts[:debug]
75
74
  debug { api_raw_request method, url }
@@ -80,6 +79,19 @@ module InvisibleHand
80
79
 
81
80
  private
82
81
 
82
+ # Gets the endpoint of the API to hit. Prioritises the :region config
83
+ # parameter over :endpoint. In the event that neither are presents, defaults
84
+ # to the US.
85
+ def endpoint
86
+ if @config[:region]
87
+ "#{@config[:region]}.api.invisiblehand.co.uk"
88
+ elsif @config[:endpoint]
89
+ @config[:endpoint]
90
+ else
91
+ "us.api.invisiblehand.co.uk"
92
+ end
93
+ end
94
+
83
95
  def debug &block
84
96
  old_log_level = logger.level
85
97
  logger.level = ::Logger::DEBUG
@@ -1,5 +1,5 @@
1
1
  module InvisibleHand
2
2
  unless const_defined? :VERSION
3
- VERSION = "0.1.2"
3
+ VERSION = "0.1.3"
4
4
  end
5
5
  end
@@ -5,86 +5,96 @@ describe InvisibleHand::API do
5
5
  # yourself if you wish to run tests.
6
6
  let(:api_config) { File.join(File.dirname(__FILE__), 'invisiblehand.yml') }
7
7
 
8
- let(:api) { InvisibleHand::API.new(api_config) }
9
- let(:product) { api.products["results"].first }
10
- let(:product_id) { product["id"] }
11
- let(:page) { product["best_page"] }
12
-
13
- describe "#products" do
14
- subject { api.products }
15
- it { should be_a Hash }
16
- its(:keys) { should include "results" }
17
- its(:keys) { should include "info" }
18
- end
8
+ ["uk", "us", "ca", "de"].each do |region|
9
+ describe "Region: #{region}" do
10
+ let :api do
11
+ conf = YAML.load_file(api_config)
12
+ conf = conf.merge :region => region
19
13
 
20
- describe "#product" do
21
- subject { product }
22
- it { should_not be_nil }
23
- end
14
+ InvisibleHand::API.new(conf)
15
+ end
24
16
 
25
- describe "#live_price" do
26
- describe "with live price url" do
27
- subject { api.live_price(page["live_price_url"]) }
28
- it { should be_a Float }
29
- end
17
+ let(:product) { api.products["results"].first }
18
+ let(:product_id) { product["id"] }
19
+ let(:page) { product["best_page"] }
30
20
 
31
- describe "with vanilla page url" do
32
- subject { api.live_price(page["original_url"]) }
33
- it { should be_a Float }
34
- end
35
- end
21
+ describe "#products" do
22
+ subject { api.products }
23
+ it { should be_a Hash }
24
+ its(:keys) { should include "results" }
25
+ its(:keys) { should include "info" }
26
+ end
36
27
 
37
- describe "ad-hoc debug flag" do
38
- specify "the debug option to a single call should not break things" do
39
- expect do
40
- api.live_price(page["original_url"], :debug => true)
41
- end.to_not raise_error
42
- end
43
- end
28
+ describe "#product" do
29
+ subject { product }
30
+ it { should_not be_nil }
31
+ end
44
32
 
45
- describe "invalid config" do
46
- specify "no app_id or api_key should throw error" do
47
- expect do
48
- InvisibleHand::API.new
49
- end.to raise_error InvisibleHand::Error::InvalidConfig
50
- end
51
- end
33
+ describe "#live_price" do
34
+ describe "with live price url" do
35
+ subject { api.live_price(page["live_price_url"]) }
36
+ it { should be_a Float }
37
+ end
52
38
 
53
- describe "invalid api calls" do
54
- describe "#product" do
55
- specify "should throw InvisibleHand::Error::APIError on invalid ID" do
56
- expect do
57
- api.product "not a real id at all, lol"
58
- end.to raise_error InvisibleHand::Error::APIError
39
+ describe "with vanilla page url" do
40
+ subject { api.live_price(page["original_url"]) }
41
+ it { should be_a Float }
42
+ end
59
43
  end
60
- end
61
44
 
62
- describe "#live_price" do
63
- specify "should throw InvisibleHand::Error::APIError on invalid URL" do
64
- expect do
65
- api.live_price "not a real url, rofl"
66
- end.to raise_error InvisibleHand::Error::APIError
45
+ describe "ad-hoc debug flag" do
46
+ specify "the debug option to a single call should not break things" do
47
+ expect do
48
+ api.live_price(page["original_url"], :debug => true)
49
+ end.to_not raise_error
50
+ end
67
51
  end
68
- end
69
- end
70
52
 
71
- describe "errors" do
72
- describe InvisibleHand::Error::APIError do
73
- subject do
74
- error = nil
53
+ describe "invalid config" do
54
+ specify "no app_id or api_key should throw error" do
55
+ expect do
56
+ InvisibleHand::API.new
57
+ end.to raise_error InvisibleHand::Error::InvalidConfig
58
+ end
59
+ end
75
60
 
76
- begin
77
- api.live_price "not a real url"
78
- rescue InvisibleHand::Error::APIError => e
79
- error = e
61
+ describe "invalid api calls" do
62
+ describe "#product" do
63
+ specify "should throw InvisibleHand::Error::APIError on invalid ID" do
64
+ expect do
65
+ api.product "not a real id at all, lol"
66
+ end.to raise_error InvisibleHand::Error::APIError
67
+ end
80
68
  end
81
69
 
82
- error
70
+ describe "#live_price" do
71
+ specify "should throw InvisibleHand::Error::APIError on invalid URL" do
72
+ expect do
73
+ api.live_price "not a real url, rofl"
74
+ end.to raise_error InvisibleHand::Error::APIError
75
+ end
76
+ end
83
77
  end
84
78
 
85
- its(:url) { should be_a String }
86
- its(:raw_response) { should be_a String }
87
- its(:message) { should be_a String }
79
+ describe "errors" do
80
+ describe InvisibleHand::Error::APIError do
81
+ subject do
82
+ error = nil
83
+
84
+ begin
85
+ api.live_price "not a real url"
86
+ rescue InvisibleHand::Error::APIError => e
87
+ error = e
88
+ end
89
+
90
+ error
91
+ end
92
+
93
+ its(:url) { should be_a String }
94
+ its(:raw_response) { should be_a String }
95
+ its(:message) { should be_a String }
96
+ end
97
+ end
88
98
  end
89
99
  end
90
100
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: invisiblehand
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-02-21 00:00:00.000000000 Z
12
+ date: 2013-02-26 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rest-client
@@ -110,7 +110,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
110
110
  version: '0'
111
111
  segments:
112
112
  - 0
113
- hash: -3726614589269803000
113
+ hash: 1556147975806628177
114
114
  required_rubygems_version: !ruby/object:Gem::Requirement
115
115
  none: false
116
116
  requirements:
@@ -119,7 +119,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
119
119
  version: '0'
120
120
  segments:
121
121
  - 0
122
- hash: -3726614589269803000
122
+ hash: 1556147975806628177
123
123
  requirements: []
124
124
  rubyforge_project:
125
125
  rubygems_version: 1.8.24