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 +17 -0
- data/invisiblehand.sample.yml +2 -2
- data/lib/invisiblehand/api.rb +14 -2
- data/lib/invisiblehand/version.rb +1 -1
- data/spec/api_spec.rb +75 -65
- metadata +4 -4
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
|
data/invisiblehand.sample.yml
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
:app_id: "your app id here"
|
2
2
|
:app_key: "your app key here"
|
3
3
|
|
4
|
-
# The
|
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
|
-
# :
|
11
|
+
# :region: us
|
data/lib/invisiblehand/api.rb
CHANGED
@@ -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]}#{
|
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
|
data/spec/api_spec.rb
CHANGED
@@ -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
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
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
|
-
|
21
|
-
|
22
|
-
it { should_not be_nil }
|
23
|
-
end
|
14
|
+
InvisibleHand::API.new(conf)
|
15
|
+
end
|
24
16
|
|
25
|
-
|
26
|
-
|
27
|
-
|
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
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
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
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
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
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
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
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
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
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
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
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
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
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
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
|
-
|
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
|
-
|
86
|
-
|
87
|
-
|
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.
|
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-
|
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:
|
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:
|
122
|
+
hash: 1556147975806628177
|
123
123
|
requirements: []
|
124
124
|
rubyforge_project:
|
125
125
|
rubygems_version: 1.8.24
|