bwapi 1.0.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 +7 -0
- data/.gitignore +21 -0
- data/.travis.yml +10 -0
- data/Gemfile +6 -0
- data/LICENCE.md +20 -0
- data/README.md +15 -0
- data/bin/bwapi +2 -0
- data/bwapi.gemspec +26 -0
- data/lib/bwapi.rb +28 -0
- data/lib/bwapi/authentication.rb +42 -0
- data/lib/bwapi/client.rb +54 -0
- data/lib/bwapi/client/admin.rb +35 -0
- data/lib/bwapi/client/admin/become.rb +21 -0
- data/lib/bwapi/client/admin/search.rb +41 -0
- data/lib/bwapi/client/admin/sub_clients.rb +109 -0
- data/lib/bwapi/client/admin/users.rb +95 -0
- data/lib/bwapi/client/admin/users/sharing.rb +35 -0
- data/lib/bwapi/client/brandwatch.rb +33 -0
- data/lib/bwapi/client/brandwatch/become.rb +19 -0
- data/lib/bwapi/client/brandwatch/client_modules.rb +26 -0
- data/lib/bwapi/client/client.rb +22 -0
- data/lib/bwapi/client/error_codes.rb +14 -0
- data/lib/bwapi/client/filters.rb +14 -0
- data/lib/bwapi/client/logout.rb +24 -0
- data/lib/bwapi/client/me.rb +42 -0
- data/lib/bwapi/client/oauth.rb +78 -0
- data/lib/bwapi/client/ping.rb +42 -0
- data/lib/bwapi/client/projects.rb +94 -0
- data/lib/bwapi/client/projects/categories.rb +70 -0
- data/lib/bwapi/client/projects/data.rb +62 -0
- data/lib/bwapi/client/projects/data_download.rb +49 -0
- data/lib/bwapi/client/projects/facebook_queries.rb +55 -0
- data/lib/bwapi/client/projects/queries.rb +99 -0
- data/lib/bwapi/client/projects/queries/backfill.rb +63 -0
- data/lib/bwapi/client/projects/queries/date_range.rb +67 -0
- data/lib/bwapi/client/projects/queries/mentions.rb +53 -0
- data/lib/bwapi/client/projects/query_groups.rb +70 -0
- data/lib/bwapi/client/projects/sharing.rb +57 -0
- data/lib/bwapi/client/projects/signals.rb +39 -0
- data/lib/bwapi/client/projects/summary.rb +21 -0
- data/lib/bwapi/client/projects/tags.rb +61 -0
- data/lib/bwapi/client/projects/users.rb +17 -0
- data/lib/bwapi/client/projects/workflow.rb +17 -0
- data/lib/bwapi/client/query_validation.rb +27 -0
- data/lib/bwapi/client/sso.rb +18 -0
- data/lib/bwapi/client/test_search.rb +14 -0
- data/lib/bwapi/client/user.rb +58 -0
- data/lib/bwapi/client/user/notifications.rb +36 -0
- data/lib/bwapi/configuration.rb +59 -0
- data/lib/bwapi/connection.rb +33 -0
- data/lib/bwapi/error.rb +42 -0
- data/lib/bwapi/request.rb +93 -0
- data/lib/bwapi/version.rb +3 -0
- data/lib/faraday/response/brandwatch_error.rb +25 -0
- data/lib/faraday/utils/utils.rb +25 -0
- data/spec/bwapi/authentication_spec.rb +57 -0
- data/spec/bwapi/client_spec.rb +205 -0
- data/spec/bwapi_spec.rb +23 -0
- data/spec/fixtures/.netrc +3 -0
- data/spec/helper.rb +12 -0
- metadata +178 -0
@@ -0,0 +1,14 @@
|
|
1
|
+
module BWAPI
|
2
|
+
class Client
|
3
|
+
module TestSearch
|
4
|
+
|
5
|
+
# TODO: Uncomment once the endpoint has been fixed
|
6
|
+
# Retrieve full text for a given url
|
7
|
+
#def test_search_content opts
|
8
|
+
# get "testsearch/content", opts
|
9
|
+
#end
|
10
|
+
#alias :test_search :test_search_content
|
11
|
+
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'bwapi/client/user/notifications'
|
2
|
+
|
3
|
+
module BWAPI
|
4
|
+
class Client
|
5
|
+
module User
|
6
|
+
|
7
|
+
# Get the current user
|
8
|
+
#
|
9
|
+
# @return [Hashie::Mash] User information
|
10
|
+
def user
|
11
|
+
get "user"
|
12
|
+
end
|
13
|
+
|
14
|
+
# Update the current user
|
15
|
+
#
|
16
|
+
# @param opts [Hash] options Hash of parameters
|
17
|
+
# @option opts [Integer] id Id of the user
|
18
|
+
# @option opts [Hash] tags The users assigned tags
|
19
|
+
# @option opts [String] passwordConfirmation The confirmed password
|
20
|
+
# @option opts [Boolean] enabled The status of the user
|
21
|
+
# @option opts [String] lastName The last name of the user
|
22
|
+
# @option opts [String] phone The users phone number
|
23
|
+
# @option opts [String] department The users department
|
24
|
+
# @option opts [String] job The users job
|
25
|
+
# @option opts [String] messenger The users IM details
|
26
|
+
# @option opts [String] password The password of the user
|
27
|
+
# @option opts [Integer] clientId The users client id
|
28
|
+
# @option opts [String] username The users username
|
29
|
+
# @option opts [String] address The users address
|
30
|
+
# @option opts [String] uiRole The users ui role
|
31
|
+
# @option opts [Array] apiRole The users api role
|
32
|
+
# @option opts [String] firstName The users first name
|
33
|
+
# @option opts [String] mobile The users mobile number
|
34
|
+
# @option opts [Date] creationDate Date the user was created on
|
35
|
+
# @return [Hashie::Mash] Updated user information
|
36
|
+
def update_user opts
|
37
|
+
put "user", opts
|
38
|
+
end
|
39
|
+
|
40
|
+
# Get users api role
|
41
|
+
#
|
42
|
+
# @return [String] Users api role
|
43
|
+
def api_role
|
44
|
+
user.apiRole
|
45
|
+
end
|
46
|
+
|
47
|
+
# Get users ui role
|
48
|
+
#
|
49
|
+
# @return [String] Users ui role
|
50
|
+
def ui_role
|
51
|
+
user.uiRole
|
52
|
+
end
|
53
|
+
|
54
|
+
include BWAPI::Client::User::Notifications
|
55
|
+
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module BWAPI
|
2
|
+
class Client
|
3
|
+
module User
|
4
|
+
module Notifications
|
5
|
+
|
6
|
+
# Get the current user notifications
|
7
|
+
#
|
8
|
+
# @param opts [Hash] options hash of parameters
|
9
|
+
# @option opts [Integer] page Page of projects to retrieve
|
10
|
+
# @option opts [Integer] pageSize Results per page of results
|
11
|
+
# @return [Hashie::Mash] User notifications
|
12
|
+
def notifications opts={}
|
13
|
+
get "user/notifications", opts
|
14
|
+
end
|
15
|
+
|
16
|
+
# Update users existing notifications
|
17
|
+
#
|
18
|
+
# @param opts [Hash] options Hash of parameters
|
19
|
+
# @option opts [Array] list User notifications to be edited
|
20
|
+
# @return [Hashie::Mash] Updated user notifications
|
21
|
+
def update_notification opts
|
22
|
+
put "user/notifications", opts
|
23
|
+
end
|
24
|
+
|
25
|
+
# Delete a users existing notification
|
26
|
+
#
|
27
|
+
# @param notification_id [Integer] Id of notification
|
28
|
+
# @return [Hashie::Mash] Deleted user notifications
|
29
|
+
def delete_notification notification_id
|
30
|
+
delete "user/notifications/#{notification_id}"
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
|
3
|
+
module BWAPI
|
4
|
+
module Configuration
|
5
|
+
|
6
|
+
OPTION_KEYS = [
|
7
|
+
:api_endpoint,
|
8
|
+
:user_agent,
|
9
|
+
:adapter,
|
10
|
+
:username,
|
11
|
+
:password,
|
12
|
+
:grant_type,
|
13
|
+
:access_token,
|
14
|
+
:refresh_token,
|
15
|
+
:expires_in,
|
16
|
+
:client_id,
|
17
|
+
:client_secret,
|
18
|
+
:netrc,
|
19
|
+
:netrc_file
|
20
|
+
].freeze
|
21
|
+
|
22
|
+
DEFAULT_ADAPTER = Faraday.default_adapter
|
23
|
+
DEFAULT_API_ENDPOINT = ENV['BWAPI_API_ENDPOINT'] || 'http://newapi.brandwatch.com/'
|
24
|
+
DEFAULT_CLIENT_ID = 'brandwatch-api-client'
|
25
|
+
DEFAULT_USER_AGENT = "BWAPI Ruby Gem #{BWAPI::VERSION}".freeze
|
26
|
+
DEFAULT_NETRC_FILE = File.join(ENV['HOME'], '.netrc')
|
27
|
+
|
28
|
+
attr_accessor *OPTION_KEYS
|
29
|
+
|
30
|
+
# Extend hook
|
31
|
+
def self.extended(base)
|
32
|
+
base.reset
|
33
|
+
end
|
34
|
+
|
35
|
+
def configure
|
36
|
+
yield self
|
37
|
+
end
|
38
|
+
|
39
|
+
# Convert option_keys to hash and return
|
40
|
+
def options
|
41
|
+
OPTION_KEYS.inject({}){|o,k|o.merge!(k => send(k))}
|
42
|
+
end
|
43
|
+
|
44
|
+
def reset
|
45
|
+
self.adapter = DEFAULT_ADAPTER
|
46
|
+
self.user_agent = DEFAULT_USER_AGENT
|
47
|
+
self.api_endpoint = DEFAULT_API_ENDPOINT
|
48
|
+
self.username = nil
|
49
|
+
self.password = nil
|
50
|
+
self.grant_type = nil
|
51
|
+
self.access_token = nil
|
52
|
+
self.refresh_token = nil
|
53
|
+
self.client_id = DEFAULT_CLIENT_ID
|
54
|
+
self.client_secret = nil
|
55
|
+
self.netrc = false
|
56
|
+
self.netrc_file = DEFAULT_NETRC_FILE
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'faraday_middleware'
|
2
|
+
require 'faraday/response/brandwatch_error'
|
3
|
+
require 'faraday/utils/utils'
|
4
|
+
|
5
|
+
module BWAPI
|
6
|
+
module Connection
|
7
|
+
private
|
8
|
+
|
9
|
+
# Create a connection to send request
|
10
|
+
def connection opts={}
|
11
|
+
connection = Faraday.new(opts) do |conn|
|
12
|
+
|
13
|
+
if opts[:force_urlencoded]
|
14
|
+
conn.request :url_encoded
|
15
|
+
else
|
16
|
+
conn.request :json
|
17
|
+
end
|
18
|
+
|
19
|
+
conn.request :json
|
20
|
+
conn.use Faraday::Response::BrandwatchError
|
21
|
+
conn.use FaradayMiddleware::FollowRedirects
|
22
|
+
conn.use FaradayMiddleware::Mashify
|
23
|
+
conn.use FaradayMiddleware::ParseJson, :content_type => /\bjson$/
|
24
|
+
conn.adapter adapter
|
25
|
+
end
|
26
|
+
|
27
|
+
connection.headers[:user_agent] = user_agent
|
28
|
+
|
29
|
+
connection
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
data/lib/bwapi/error.rb
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
module BWAPI
|
2
|
+
|
3
|
+
# BW error class to capture BWAPI error responses
|
4
|
+
class BWError < StandardError
|
5
|
+
def initialize(response=nil)
|
6
|
+
super()
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
# Raised when Brandwatch returns a 400 HTTP status code
|
11
|
+
class BadRequest < BWError; end
|
12
|
+
|
13
|
+
# Raised when Brandwatch returns a 401 HTTP status code
|
14
|
+
class Unauthorized < BWError; end
|
15
|
+
|
16
|
+
# Raised when Brandwatch returns a 403 HTTP status code
|
17
|
+
class Forbidden < BWError; end
|
18
|
+
|
19
|
+
# Raised when Brandwatch returns a 404 HTTP status code
|
20
|
+
class NotFound < BWError; end
|
21
|
+
|
22
|
+
# Raised when Brandwatch returns a 406 HTTP status code
|
23
|
+
class NotAcceptable < BWError; end
|
24
|
+
|
25
|
+
# Raised when Brandwatch returns a 422 HTTP status code
|
26
|
+
class UnprocessableEntity < BWError; end
|
27
|
+
|
28
|
+
# Raised when Brandwatch returns a 429 HTTP status code
|
29
|
+
class TooManyRequests < BWError; end
|
30
|
+
|
31
|
+
# Raised when Brandwatch returns a 500 HTTP status code
|
32
|
+
class InternalServerError < BWError; end
|
33
|
+
|
34
|
+
# Raised when Brandwatch returns a 501 HTTP status code
|
35
|
+
class NotImplemented < BWError; end
|
36
|
+
|
37
|
+
# Raised when Brandwatch returns a 502 HTTP status code
|
38
|
+
class BadGateway < BWError; end
|
39
|
+
|
40
|
+
# Raised when Brandwatch returns a 503 HTTP status code
|
41
|
+
class ServiceUnavailable < BWError; end
|
42
|
+
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
require 'multi_json'
|
2
|
+
|
3
|
+
module BWAPI
|
4
|
+
module Request
|
5
|
+
|
6
|
+
# Perform a get request
|
7
|
+
#
|
8
|
+
# @param path [String] URL path to send request
|
9
|
+
# @param opts [Hash] Request parameters
|
10
|
+
# @return [Hashie::Mash] Response body
|
11
|
+
def get path, opts={}
|
12
|
+
request(:get, path, opts).body
|
13
|
+
end
|
14
|
+
|
15
|
+
# Perform a delete request
|
16
|
+
#
|
17
|
+
# @param path [String] URL path to send request
|
18
|
+
# @param opts [Hash] Request parameters
|
19
|
+
# @return [Hashie::Mash] Response body
|
20
|
+
def delete path, opts={}
|
21
|
+
request(:delete, path, opts).body
|
22
|
+
end
|
23
|
+
|
24
|
+
# Perform a post request
|
25
|
+
#
|
26
|
+
# @param path [String] URL path to send request
|
27
|
+
# @param opts [Hash] Request parameters
|
28
|
+
# @return [Hashie::Mash] Response body
|
29
|
+
def post path, opts={}
|
30
|
+
request(:post, path, opts).body
|
31
|
+
end
|
32
|
+
|
33
|
+
# Perform a put request
|
34
|
+
#
|
35
|
+
# @param path [String] URL path to send request
|
36
|
+
# @param opts [Hash] Request parameters
|
37
|
+
# @return [Hashie::Mash] Response body
|
38
|
+
def put path, opts={}
|
39
|
+
request(:put, path, opts).body
|
40
|
+
end
|
41
|
+
|
42
|
+
# Perform a patch request
|
43
|
+
#
|
44
|
+
# @param path [String] URL path to send request
|
45
|
+
# @param opts [Hash] Request parameters
|
46
|
+
# @return [Hashie::Mash] Response body
|
47
|
+
def patch path, opts={}
|
48
|
+
request(:patch, path, opts).body
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
# Perform a request
|
54
|
+
#
|
55
|
+
# @param method [String] Type of request path
|
56
|
+
# @param path [String] URL path to send request
|
57
|
+
# @param opts [Hash] Request parameters
|
58
|
+
# @return [Hashie::Mash] Response
|
59
|
+
def request method, path, opts={}
|
60
|
+
token = access_token
|
61
|
+
|
62
|
+
force_urlencoded = opts.delete(:force_urlencoded) || false
|
63
|
+
|
64
|
+
conn_opts = {
|
65
|
+
:force_urlencoded => force_urlencoded,
|
66
|
+
:url => api_endpoint
|
67
|
+
}
|
68
|
+
|
69
|
+
response = connection(conn_opts).send(method) do |request|
|
70
|
+
# Add token to the header
|
71
|
+
if token
|
72
|
+
request.headers[:authorization] = "bearer #{token}"
|
73
|
+
end
|
74
|
+
|
75
|
+
case method
|
76
|
+
when :get
|
77
|
+
request.url path, opts
|
78
|
+
when :delete
|
79
|
+
request.url path, opts
|
80
|
+
when :patch, :post, :put
|
81
|
+
if force_urlencoded
|
82
|
+
request.url path, opts
|
83
|
+
else
|
84
|
+
request.path = path
|
85
|
+
request.body = MultiJson.dump(opts) unless opts.empty?
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
response
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
require 'multi_json'
|
3
|
+
|
4
|
+
module Faraday
|
5
|
+
class Response::BrandwatchError < Response::Middleware
|
6
|
+
ERROR_MAP = {
|
7
|
+
400 => BWAPI::BadRequest,
|
8
|
+
401 => BWAPI::Unauthorized,
|
9
|
+
403 => BWAPI::Forbidden,
|
10
|
+
404 => BWAPI::NotFound,
|
11
|
+
406 => BWAPI::NotAcceptable,
|
12
|
+
422 => BWAPI::UnprocessableEntity,
|
13
|
+
429 => BWAPI::TooManyRequests,
|
14
|
+
500 => BWAPI::InternalServerError,
|
15
|
+
501 => BWAPI::NotImplemented,
|
16
|
+
502 => BWAPI::BadGateway,
|
17
|
+
503 => BWAPI::ServiceUnavailable
|
18
|
+
}
|
19
|
+
|
20
|
+
def on_complete(response)
|
21
|
+
key = response[:status].to_i
|
22
|
+
raise ERROR_MAP[key].new(response) if ERROR_MAP.has_key? key
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
|
3
|
+
# TODO: Remove this patch once latest faraday rc has been released
|
4
|
+
# https://github.com/lostisland/faraday/issues/182#issuecomment-19518167
|
5
|
+
module Faraday
|
6
|
+
module Utils
|
7
|
+
def build_nested_query(value, prefix = nil)
|
8
|
+
case value
|
9
|
+
when Array
|
10
|
+
value.map { |v| build_nested_query(v, "#{prefix}") }.join("&")
|
11
|
+
#value.map { |v| build_nested_query(v, "#{prefix}%5B%5D") }.join("&")
|
12
|
+
when Hash
|
13
|
+
value.map { |k, v|
|
14
|
+
build_nested_query(v, prefix ? "#{prefix}#{escape(k)}" : escape(k))
|
15
|
+
#build_nested_query(v, prefix ? "#{prefix}%5B#{escape(k)}%5D" : escape(k))
|
16
|
+
}.join("&")
|
17
|
+
when NilClass
|
18
|
+
prefix
|
19
|
+
else
|
20
|
+
raise ArgumentError, "value must be a Hash" if prefix.nil?
|
21
|
+
"#{prefix}=#{escape(value)}"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
describe BWAPI::Authentication do
|
4
|
+
|
5
|
+
before do
|
6
|
+
BWAPI.reset
|
7
|
+
end
|
8
|
+
|
9
|
+
describe '.authenticated?' do
|
10
|
+
it 'returns true when authenticated' do
|
11
|
+
expect(BWAPI::Client.new.authenticated?).to eql(false)
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'returns false when not authenticated' do
|
15
|
+
bw = BWAPI::Client.new :access_token => 'abcdef-ghijkl-123456-789012'
|
16
|
+
expect(bw.authenticated?).to eql(true)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe '.application_client?' do
|
21
|
+
it 'returns true when client is a brandwatch-application-client' do
|
22
|
+
bw = BWAPI::Client.new :client_id => 'brandwatch-application-client'
|
23
|
+
expect(bw.application_client?).to eql(true)
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'returns false when a client is not a brandwatch-application-client' do
|
27
|
+
expect(BWAPI::Client.new.application_client?).to eql(false)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe '.api_client?' do
|
32
|
+
it 'returns true when client is a brandwatch-api-client' do
|
33
|
+
bw = BWAPI::Client.new :client_id => 'brandwatch-api-client'
|
34
|
+
expect(bw.api_client?).to eql(true)
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'returns false when a client is not a brandwatch-api-client' do
|
38
|
+
bw = BWAPI::Client.new :client_id => 'brandwatch-application-client'
|
39
|
+
expect(bw.api_client?).to eql(false)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe '.netrc_credentials' do
|
44
|
+
it 'returns nil when netrc is false' do
|
45
|
+
bw = BWAPI::Client.new
|
46
|
+
expect(bw.netrc_credentials).to eql(nil)
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'returns credentials when netrc is true' do
|
50
|
+
bw = BWAPI::Client.new :netrc => true, :netrc_file => File.join(fixture_path, '.netrc')
|
51
|
+
bw.netrc_credentials
|
52
|
+
expect(bw.username).to eql('testuser@brandwatch.com')
|
53
|
+
expect(bw.password).to eql('password')
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
end
|