searchmetrics_client 0.1.0 → 0.2.0
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.
- checksums.yaml +4 -4
- data/.gitignore +3 -0
- data/.rubocop.yml +3 -0
- data/.travis.yml +2 -0
- data/History.md +11 -0
- data/README.md +40 -7
- data/lib/searchmetrics_client.rb +2 -0
- data/lib/searchmetrics_client/client.rb +21 -10
- data/lib/searchmetrics_client/configuration.rb +5 -5
- data/lib/searchmetrics_client/errors.rb +3 -3
- data/lib/searchmetrics_client/query.rb +1 -1
- data/lib/searchmetrics_client/request.rb +21 -13
- data/lib/searchmetrics_client/response.rb +3 -3
- data/lib/searchmetrics_client/version.rb +1 -1
- data/searchmetrics_client.gemspec +5 -3
- metadata +13 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9b4e23854b017344179dec2d9b4b50352722dba5
|
4
|
+
data.tar.gz: b94fc66dff6c8e53fd7d2322011177dcf2df43f8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5b76222f390257b3b92bc1adf45fb402a865c6e5ced5e19a27bc6c87c9dca926598225480be4a766f97ba5350b685ecdcf061418388c6dd7a8c6dbf9297f6000
|
7
|
+
data.tar.gz: 4fb68b98114838f0f72b07dedb0caf84dcc064ef627c21ce5299aafdfb27b76c97fa6d70a24d66e748e3391c04e435f006d8d60019c0f3252914c3542992d703
|
data/.gitignore
CHANGED
data/.rubocop.yml
CHANGED
data/.travis.yml
CHANGED
data/History.md
ADDED
data/README.md
CHANGED
@@ -31,7 +31,8 @@ SearchmetricsClient.configure do |config|
|
|
31
31
|
end
|
32
32
|
```
|
33
33
|
|
34
|
-
Additionally you can specify `api_version` and `api_url`, which defaults to
|
34
|
+
Additionally you can specify `api_version` and `api_url`, which defaults to
|
35
|
+
`v3` and `http://api.searchmetrics.com` regardless.
|
35
36
|
|
36
37
|
## Usage
|
37
38
|
|
@@ -57,11 +58,22 @@ response = SearchmetricsClient::Request.send_request_from_hash(
|
|
57
58
|
params: { countrycode: 'DE', keyword: 'ruby' }
|
58
59
|
)
|
59
60
|
```
|
61
|
+
|
60
62
|
Returned value can be accessed by `#value` method:
|
61
63
|
|
62
64
|
```ruby
|
63
65
|
response.value
|
64
|
-
|
66
|
+
```
|
67
|
+
|
68
|
+
Response will look like:
|
69
|
+
|
70
|
+
```ruby
|
71
|
+
[{
|
72
|
+
:cpc=>"2.37", :competition=>"3", :search_volume=>"12366",
|
73
|
+
:trend=>"81:100:100:81:81:81:81:66:81:81:81:81",
|
74
|
+
:ad_budget=>"29307.419999999998", :integration=>"images",
|
75
|
+
:advertiser_count=>"0", :keyword=>"ruby", :year_month=>"201510"
|
76
|
+
}]
|
65
77
|
```
|
66
78
|
|
67
79
|
`#endpoint` returns requested type:
|
@@ -73,7 +85,7 @@ response.endpoint # => "ResearchKeywordsGetListKeywordinfo"
|
|
73
85
|
`#url` returns requested url:
|
74
86
|
|
75
87
|
```ruby
|
76
|
-
response.url # => "http://api.searchmetrics.com/
|
88
|
+
response.url # => "http://api.searchmetrics.com/v3/ResearchKeywordsGetListKeywordinfo.json?countrycode=DE&keyword=ruby"
|
77
89
|
```
|
78
90
|
|
79
91
|
Access to raw response is available by methods `#header` and `#body`.
|
@@ -81,15 +93,36 @@ Access to raw response is available by methods `#header` and `#body`.
|
|
81
93
|
|
82
94
|
## Development
|
83
95
|
|
84
|
-
After checking out the repo, run `bin/setup` to install dependencies.
|
96
|
+
After checking out the repo, run `bin/setup` to install dependencies.
|
97
|
+
Then, run `rake spec` to run the tests. You can also run `bin/console` for an
|
98
|
+
interactive prompt that will allow you to experiment.
|
99
|
+
|
100
|
+
To install this gem onto your local machine, run `bundle exec rake install`. To
|
101
|
+
release a new version, update the version number in `version.rb`, and then run
|
102
|
+
`bundle exec rake release`, which will create a git tag for the version, push
|
103
|
+
git commits and tags, and push the `.gem` file to
|
104
|
+
[rubygems.org](https://rubygems.org).
|
85
105
|
|
86
|
-
|
106
|
+
## Testing
|
107
|
+
|
108
|
+
First you need to have API key and secret and put them on
|
109
|
+
`spec/searchmetrics_config.yml`. You can find an example in
|
110
|
+
`spec/searchmetrics_config.yml.example`.
|
111
|
+
|
112
|
+
|
113
|
+
```
|
114
|
+
bundle exec rspec
|
115
|
+
```
|
87
116
|
|
88
117
|
## Contributing
|
89
118
|
|
90
|
-
Bug reports and pull requests are welcome on GitHub at
|
119
|
+
Bug reports and pull requests are welcome on GitHub at
|
120
|
+
https://github.com/[USERNAME]/searchmetrics_client. This project is intended to
|
121
|
+
be a safe, welcoming space for collaboration, and contributors are expected to
|
122
|
+
adhere to the [Contributor Covenant](contributor-covenant.org) code of conduct.
|
91
123
|
|
92
124
|
|
93
125
|
## License
|
94
126
|
|
95
|
-
The gem is available as open source under the terms of the [MIT
|
127
|
+
The gem is available as open source under the terms of the [MIT
|
128
|
+
License](http://opensource.org/licenses/MIT).
|
data/lib/searchmetrics_client.rb
CHANGED
@@ -1,25 +1,36 @@
|
|
1
|
-
require '
|
1
|
+
require 'oauth2'
|
2
2
|
require 'singleton'
|
3
3
|
require 'forwardable'
|
4
4
|
|
5
|
-
module SearchmetricsClient
|
6
|
-
class Client
|
5
|
+
module SearchmetricsClient # :nodoc:
|
6
|
+
class Client # :nodoc:
|
7
7
|
include Singleton
|
8
8
|
extend Forwardable
|
9
9
|
|
10
10
|
def_delegators :access_token, :get, :post
|
11
11
|
|
12
|
+
def access_token
|
13
|
+
@access_token ||= access_token_api_v3
|
14
|
+
end
|
15
|
+
|
12
16
|
private
|
13
17
|
|
14
|
-
def
|
15
|
-
|
18
|
+
def api_url
|
19
|
+
File.join(SearchmetricsClient.configuration.api_base_url,
|
20
|
+
SearchmetricsClient.configuration.api_version)
|
16
21
|
end
|
17
22
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
+
# http://api.searchmetrics.com/v3/documentation/start
|
24
|
+
def access_token_api_v3
|
25
|
+
token_url = File.join(api_url, 'token')
|
26
|
+
client = OAuth2::Client.new(
|
27
|
+
SearchmetricsClient.configuration.api_key,
|
28
|
+
SearchmetricsClient.configuration.api_secret,
|
29
|
+
site: SearchmetricsClient.configuration.api_base_url,
|
30
|
+
token_url: token_url,
|
31
|
+
token_method: :post
|
32
|
+
)
|
33
|
+
client.client_credentials.get_token
|
23
34
|
end
|
24
35
|
end
|
25
36
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
module SearchmetricsClient
|
1
|
+
module SearchmetricsClient # :nodoc:
|
2
2
|
class << self
|
3
3
|
attr_accessor :configuration
|
4
4
|
end
|
@@ -8,12 +8,12 @@ module SearchmetricsClient
|
|
8
8
|
yield(configuration)
|
9
9
|
end
|
10
10
|
|
11
|
-
class Configuration
|
12
|
-
attr_accessor :api_key, :api_secret, :api_version, :
|
11
|
+
class Configuration # :nodoc:
|
12
|
+
attr_accessor :api_key, :api_secret, :api_version, :api_base_url
|
13
13
|
|
14
14
|
def initialize
|
15
|
-
@api_version
|
16
|
-
@
|
15
|
+
@api_version = SearchmetricsClient::API_DEFAULT_VERSION
|
16
|
+
@api_base_url = SearchmetricsClient::API_BASE_URL
|
17
17
|
end
|
18
18
|
end
|
19
19
|
end
|
@@ -1,19 +1,19 @@
|
|
1
1
|
module SearchmetricsClient
|
2
2
|
module Errors
|
3
|
-
class ApiCredentialsNotProvided < StandardError
|
3
|
+
class ApiCredentialsNotProvided < StandardError # :nodoc:
|
4
4
|
def message
|
5
5
|
'You have to configure SearchmetricsClient first.'
|
6
6
|
end
|
7
7
|
end
|
8
8
|
|
9
|
-
class ApiRequestError < StandardError
|
9
|
+
class ApiRequestError < StandardError # :nodoc:
|
10
10
|
def initialize(msg, response)
|
11
11
|
@response = response
|
12
12
|
super(msg)
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
|
-
class WrongMethodError < StandardError
|
16
|
+
class WrongMethodError < StandardError # :nodoc:
|
17
17
|
def message
|
18
18
|
'Cannot determine HTTP method from endpoint name'
|
19
19
|
end
|
@@ -2,7 +2,7 @@ require 'forwardable'
|
|
2
2
|
require 'multi_json'
|
3
3
|
|
4
4
|
module SearchmetricsClient
|
5
|
-
class Request
|
5
|
+
class Request # :nodoc:
|
6
6
|
attr_reader :url, :query, :response
|
7
7
|
|
8
8
|
extend Forwardable
|
@@ -25,8 +25,9 @@ module SearchmetricsClient
|
|
25
25
|
def send_request
|
26
26
|
check_credentials
|
27
27
|
result = Client.instance.public_send(method, url)
|
28
|
-
check_errors(result)
|
29
28
|
@response = SearchmetricsClient::Response.new(self, result)
|
29
|
+
rescue OAuth2::Error => e
|
30
|
+
check_errors(e.response)
|
30
31
|
end
|
31
32
|
|
32
33
|
private
|
@@ -34,29 +35,36 @@ module SearchmetricsClient
|
|
34
35
|
def method
|
35
36
|
return :get if endpoint =~ /Get/
|
36
37
|
return :post if endpoint =~ /Post/
|
37
|
-
|
38
|
+
raise SearchmetricsClient::Errors::WrongMethodError
|
38
39
|
end
|
39
40
|
|
40
41
|
def build_url
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
query.query
|
45
|
-
].join
|
42
|
+
File.join(SearchmetricsClient.configuration.api_base_url,
|
43
|
+
SearchmetricsClient.configuration.api_version,
|
44
|
+
query.query)
|
46
45
|
end
|
47
46
|
|
48
47
|
def check_credentials
|
49
|
-
|
48
|
+
unless credentials_present?
|
49
|
+
raise SearchmetricsClient::Errors::ApiCredentialsNotProvided
|
50
|
+
end
|
50
51
|
end
|
51
52
|
|
52
53
|
def credentials_present?
|
53
|
-
SearchmetricsClient.configuration.api_key &&
|
54
|
+
SearchmetricsClient.configuration.api_key &&
|
55
|
+
SearchmetricsClient.configuration.api_secret
|
56
|
+
end
|
57
|
+
|
58
|
+
def result_success?(result)
|
59
|
+
return true if result.status == 200
|
60
|
+
false
|
54
61
|
end
|
55
62
|
|
56
63
|
def check_errors(result)
|
57
|
-
return if result
|
58
|
-
|
59
|
-
|
64
|
+
return if result_success?(result)
|
65
|
+
body = MultiJson.load(result.body, symbolize_keys: true)
|
66
|
+
message = body[:error_message]
|
67
|
+
raise SearchmetricsClient::Errors::ApiRequestError.new(message, result)
|
60
68
|
end
|
61
69
|
end
|
62
70
|
end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
require 'forwardable'
|
2
2
|
require 'multi_json'
|
3
3
|
|
4
|
-
module SearchmetricsClient
|
5
|
-
class Response
|
4
|
+
module SearchmetricsClient # :nodoc:
|
5
|
+
class Response # :nodoc:
|
6
6
|
attr_reader :request
|
7
7
|
|
8
8
|
extend Forwardable
|
@@ -19,7 +19,7 @@ module SearchmetricsClient
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def status
|
22
|
-
@raw_response.
|
22
|
+
@raw_response.status
|
23
23
|
end
|
24
24
|
end
|
25
25
|
end
|
@@ -10,6 +10,8 @@ Gem::Specification.new do |spec|
|
|
10
10
|
spec.email = ['developers@td-berlin.com']
|
11
11
|
|
12
12
|
spec.summary = 'A thin abstraction over the searchmetrics API'
|
13
|
+
spec.description = 'Client library and thin abstraction over the' \
|
14
|
+
' searchmetrics API'
|
13
15
|
spec.homepage = 'https://github.com/td-berlin/searchmetrics_client'
|
14
16
|
spec.license = 'MIT'
|
15
17
|
|
@@ -20,13 +22,13 @@ Gem::Specification.new do |spec|
|
|
20
22
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
21
23
|
spec.require_paths = ['lib']
|
22
24
|
|
23
|
-
spec.add_dependency '
|
25
|
+
spec.add_dependency 'oauth2', '~> 1.0'
|
24
26
|
spec.add_dependency 'multi_json', '~> 1.0'
|
25
27
|
|
26
28
|
spec.add_development_dependency 'bundler', '~> 1.10'
|
27
29
|
spec.add_development_dependency 'rake', '~> 10.0'
|
28
|
-
spec.add_development_dependency 'rspec'
|
30
|
+
spec.add_development_dependency 'rspec', '~> 3.4'
|
29
31
|
spec.add_development_dependency 'vcr', '~> 3.0'
|
30
32
|
spec.add_development_dependency 'webmock', '~> 1.22'
|
31
|
-
spec.add_development_dependency 'td_critic', '~> 0.
|
33
|
+
spec.add_development_dependency 'td_critic', '~> 0.2'
|
32
34
|
end
|
metadata
CHANGED
@@ -1,29 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: searchmetrics_client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- TD Developers
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-02-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: oauth2
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0
|
19
|
+
version: '1.0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0
|
26
|
+
version: '1.0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: multi_json
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -70,16 +70,16 @@ dependencies:
|
|
70
70
|
name: rspec
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- - "
|
73
|
+
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: '
|
75
|
+
version: '3.4'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- - "
|
80
|
+
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: '
|
82
|
+
version: '3.4'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: vcr
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -114,15 +114,15 @@ dependencies:
|
|
114
114
|
requirements:
|
115
115
|
- - "~>"
|
116
116
|
- !ruby/object:Gem::Version
|
117
|
-
version: '0.
|
117
|
+
version: '0.2'
|
118
118
|
type: :development
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
122
|
- - "~>"
|
123
123
|
- !ruby/object:Gem::Version
|
124
|
-
version: '0.
|
125
|
-
description:
|
124
|
+
version: '0.2'
|
125
|
+
description: Client library and thin abstraction over the searchmetrics API
|
126
126
|
email:
|
127
127
|
- developers@td-berlin.com
|
128
128
|
executables: []
|
@@ -135,6 +135,7 @@ files:
|
|
135
135
|
- ".travis.yml"
|
136
136
|
- CODE_OF_CONDUCT.md
|
137
137
|
- Gemfile
|
138
|
+
- History.md
|
138
139
|
- LICENSE
|
139
140
|
- README.md
|
140
141
|
- Rakefile
|