bw_status_board_api 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/.editorconfig +11 -0
- data/.gitignore +35 -0
- data/.rubocop.yml +2 -0
- data/CHANGELOG.md +2 -0
- data/CONTRIBUTING.md +0 -0
- data/Gemfile +6 -0
- data/README.md +4 -0
- data/bin/bw_status_board_api +2 -0
- data/bw_status_board_api.gemspec +28 -0
- data/lib/bw_status_board_api/client/environments/services.rb +16 -0
- data/lib/bw_status_board_api/client/environments.rb +17 -0
- data/lib/bw_status_board_api/client.rb +49 -0
- data/lib/bw_status_board_api/configuration.rb +43 -0
- data/lib/bw_status_board_api/connection.rb +44 -0
- data/lib/bw_status_board_api/default.rb +61 -0
- data/lib/bw_status_board_api/error.rb +103 -0
- data/lib/bw_status_board_api/performance.rb +39 -0
- data/lib/bw_status_board_api/request.rb +77 -0
- data/lib/bw_status_board_api/response/error.rb +30 -0
- data/lib/bw_status_board_api/response/logger.rb +37 -0
- data/lib/bw_status_board_api/response/performance.rb +33 -0
- data/lib/bw_status_board_api/version.rb +4 -0
- data/lib/bw_status_board_api.rb +31 -0
- data/spec/bw_status_board_api_spec.rb +21 -0
- data/spec/helper.rb +14 -0
- metadata +170 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: e7a1e9c2a8acbfad568be87a78aa676467242a54
|
4
|
+
data.tar.gz: 63971a8dc5f39ed3ad74b2b5762acbcd4c1cf10d
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 710438c0fe8a4cb2a8291d67b3443b945aa3ff6828db60828d25add6995d4eab26dd300f9292299c56b3c704cbd0bd88ad682f38c047ce636bd2a9d8d509d90f
|
7
|
+
data.tar.gz: 92d2910299f3463bfc56ab8dec51b0c3ec952c232acf903b99c180b7ecf5cf8728d32147f4e48f0400c78255fa7d89b3b39d8d2ad14ea31b02283381aa44f654
|
data/.editorconfig
ADDED
data/.gitignore
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
*.gem
|
2
|
+
*.rbc
|
3
|
+
/.config
|
4
|
+
/coverage/
|
5
|
+
/InstalledFiles
|
6
|
+
/pkg/
|
7
|
+
/spec/reports/
|
8
|
+
/test/tmp/
|
9
|
+
/test/version_tmp/
|
10
|
+
/tmp/
|
11
|
+
.DS_Store
|
12
|
+
|
13
|
+
## Specific to RubyMotion:
|
14
|
+
.dat*
|
15
|
+
.repl_history
|
16
|
+
build/
|
17
|
+
|
18
|
+
## Documentation cache and generated files:
|
19
|
+
/.yardoc/
|
20
|
+
/_yardoc/
|
21
|
+
/doc/
|
22
|
+
/rdoc/
|
23
|
+
|
24
|
+
## Environment normalisation:
|
25
|
+
/.bundle/
|
26
|
+
/lib/bundler/man/
|
27
|
+
|
28
|
+
# for a library or gem, you might want to ignore these files since the code is
|
29
|
+
# intended to run in multiple environments; otherwise, check them in:
|
30
|
+
# Gemfile.lock
|
31
|
+
# .ruby-version
|
32
|
+
# .ruby-gemset
|
33
|
+
|
34
|
+
# unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
|
35
|
+
.rvmrc
|
data/.rubocop.yml
ADDED
data/CHANGELOG.md
ADDED
data/CONTRIBUTING.md
ADDED
File without changes
|
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/lib/bw_status_board_api/version'
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = 'bw_status_board_api'
|
5
|
+
s.version = BWStatusBoardAPI::VERSION
|
6
|
+
s.date = '2014-09-04'
|
7
|
+
s.summary = 'Brandwatch Status Board API Wrapper'
|
8
|
+
s.description = 'A Ruby wrapper for the Brandwatch Status Board'
|
9
|
+
s.author = 'Jonathan Chrisp'
|
10
|
+
s.email = 'jonathan@brandwatch.com'
|
11
|
+
s.license = 'MIT'
|
12
|
+
s.homepage = 'https://gite.brandwatch.com/jonathan/bw_status_board_api'
|
13
|
+
s.required_ruby_version = '>= 1.9.2'
|
14
|
+
|
15
|
+
s.add_development_dependency 'rspec', '~> 3.0.0'
|
16
|
+
s.add_development_dependency 'rubocop', '~> 0.24.1'
|
17
|
+
|
18
|
+
s.add_runtime_dependency 'allotment', '~> 1.1.0'
|
19
|
+
s.add_runtime_dependency 'faraday', '~> 0.9.0'
|
20
|
+
s.add_runtime_dependency 'faraday_middleware', '~> 0.9.1'
|
21
|
+
s.add_runtime_dependency 'faraday_middleware-parse_oj', '~> 0.3.0'
|
22
|
+
s.add_runtime_dependency 'oj', '~> 2.10.2'
|
23
|
+
|
24
|
+
s.files = `git ls-files`.split("\n")
|
25
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
|
26
|
+
s.test_files = `git ls-files -- spec/*`.split("\n")
|
27
|
+
s.require_paths = ['lib']
|
28
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module BWStatusBoardAPI
|
2
|
+
class Client
|
3
|
+
module Environments
|
4
|
+
# Services module for environment services endpoints
|
5
|
+
module Services
|
6
|
+
# Get environment services
|
7
|
+
#
|
8
|
+
# @param environment_id [Integer] Id of the existing environment
|
9
|
+
# @return [Hash] the services stored
|
10
|
+
def services(environment_id)
|
11
|
+
get "environments/#{environment_id}/services"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'bw_status_board_api/client/environments/services'
|
2
|
+
|
3
|
+
module BWStatusBoardAPI
|
4
|
+
class Client
|
5
|
+
# Environments module for environments endpoints
|
6
|
+
module Environments
|
7
|
+
include BWStatusBoardAPI::Client::Environments::Services
|
8
|
+
|
9
|
+
# Get environments stored
|
10
|
+
#
|
11
|
+
# @return [Hash] the environments stored
|
12
|
+
def environments
|
13
|
+
get 'environments'
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'bw_status_board_api/configuration'
|
2
|
+
require 'bw_status_board_api/connection'
|
3
|
+
require 'bw_status_board_api/request'
|
4
|
+
require 'bw_status_board_api/performance'
|
5
|
+
|
6
|
+
require 'bw_status_board_api/client/environments'
|
7
|
+
|
8
|
+
require 'faraday'
|
9
|
+
|
10
|
+
module BWStatusBoardAPI
|
11
|
+
# Client class to create BWStatusBoardAPI instances
|
12
|
+
class Client
|
13
|
+
include BWStatusBoardAPI::Configuration
|
14
|
+
include BWStatusBoardAPI::Connection
|
15
|
+
include BWStatusBoardAPI::Request
|
16
|
+
include BWStatusBoardAPI::Performance
|
17
|
+
|
18
|
+
include BWStatusBoardAPI::Client::Environments
|
19
|
+
|
20
|
+
# Initializes Client
|
21
|
+
#
|
22
|
+
# @params options [Hash] the configuration options
|
23
|
+
def initialize(options = {})
|
24
|
+
BWStatusBoardAPI::Configuration.keys.each do |key|
|
25
|
+
instance_variable_set(:"@#{key}", options[key] || BWStatusBoardAPI.instance_variable_get(:"@#{key}"))
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def api_endpoint=(value)
|
30
|
+
reset_connection
|
31
|
+
@api_endpoint = value
|
32
|
+
end
|
33
|
+
|
34
|
+
def connection_options=(value)
|
35
|
+
reset_connection
|
36
|
+
@connection_options = value
|
37
|
+
end
|
38
|
+
|
39
|
+
def debug=(value)
|
40
|
+
reset_connection
|
41
|
+
@debug = value
|
42
|
+
end
|
43
|
+
|
44
|
+
def logger=(value)
|
45
|
+
reset_connection
|
46
|
+
@logger = value
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module BWStatusBoardAPI
|
2
|
+
# Configuration module
|
3
|
+
module Configuration
|
4
|
+
attr_accessor :adapter, :api_endpoint, :debug, :logger, :performance, :user_agent, :verify_ssl
|
5
|
+
|
6
|
+
class << self
|
7
|
+
# Configuration keys
|
8
|
+
def keys
|
9
|
+
@keys ||= [
|
10
|
+
:adapter,
|
11
|
+
:api_endpoint,
|
12
|
+
:connection_options,
|
13
|
+
:debug,
|
14
|
+
:logger,
|
15
|
+
:performance,
|
16
|
+
:user_agent,
|
17
|
+
:verify_ssl
|
18
|
+
]
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
# Set configuration options using a block
|
23
|
+
def configure
|
24
|
+
yield self
|
25
|
+
end
|
26
|
+
|
27
|
+
def reset
|
28
|
+
BWStatusBoardAPI::Configuration.keys.each { |key| instance_variable_set(:"@#{key}", BWStatusBoardAPI::Default.options[key]) }
|
29
|
+
self
|
30
|
+
end
|
31
|
+
|
32
|
+
def destroy
|
33
|
+
BWStatusBoardAPI::Configuration.keys.each { |key| instance_variable_set(:"@#{key}", nil) }
|
34
|
+
self
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def options
|
40
|
+
Hash[BWStatusBoardAPI::Configuration.keys.map { |key| [key, instance_variable_get(:"@#{key}")] }]
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'bw_status_board_api/response/error'
|
2
|
+
require 'bw_status_board_api/response/logger'
|
3
|
+
require 'bw_status_board_api/response/performance'
|
4
|
+
require 'faraday_middleware'
|
5
|
+
require 'faraday_middleware/parse_oj'
|
6
|
+
|
7
|
+
module BWStatusBoardAPI
|
8
|
+
# Connection module
|
9
|
+
module Connection
|
10
|
+
RACK_BUILDER_CLASS = defined?(Faraday::RackBuilder) ? Faraday::RackBuilder : Faraday::Builder
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def connection
|
15
|
+
@connection ||= Faraday.new(faraday_options)
|
16
|
+
end
|
17
|
+
|
18
|
+
def reset_connection
|
19
|
+
@connection = nil
|
20
|
+
end
|
21
|
+
|
22
|
+
def faraday_options
|
23
|
+
opts = @connection_options
|
24
|
+
opts[:builder] = middleware
|
25
|
+
opts[:ssl] = { verify: @verify_ssl }
|
26
|
+
opts[:url] = @api_endpoint
|
27
|
+
opts
|
28
|
+
end
|
29
|
+
|
30
|
+
def middleware
|
31
|
+
RACK_BUILDER_CLASS.new do |builder|
|
32
|
+
builder.request :json
|
33
|
+
|
34
|
+
builder.response :performance, self if debug
|
35
|
+
builder.response :error
|
36
|
+
builder.response :logger, self if debug
|
37
|
+
|
38
|
+
builder.response :oj
|
39
|
+
builder.response :follow_redirects
|
40
|
+
builder.adapter Faraday.default_adapter
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'bw_status_board_api/version'
|
2
|
+
require 'bw_status_board_api/configuration'
|
3
|
+
|
4
|
+
require 'allotment'
|
5
|
+
require 'faraday'
|
6
|
+
|
7
|
+
module BWStatusBoardAPI
|
8
|
+
# Default module
|
9
|
+
module Default
|
10
|
+
ADAPTER = Faraday.default_adapter
|
11
|
+
|
12
|
+
API_ENDPOINT = 'http://argus:3000/api/'
|
13
|
+
|
14
|
+
USER_AGENT = "BWStatusBoardAPI Ruby Gem #{BWStatusBoardAPI::VERSION}".freeze
|
15
|
+
|
16
|
+
class << self
|
17
|
+
def options
|
18
|
+
Hash[BWStatusBoardAPI::Configuration.keys.map { |key| [key, send(key)] }]
|
19
|
+
end
|
20
|
+
|
21
|
+
def adapter
|
22
|
+
ENV['BWStatusBoardAPI_ADAPTER'] || ADAPTER
|
23
|
+
end
|
24
|
+
|
25
|
+
def api_endpoint
|
26
|
+
ENV['BWStatusBoardAPI_API_ENDPOINT'] || API_ENDPOINT
|
27
|
+
end
|
28
|
+
|
29
|
+
def connection_options
|
30
|
+
{
|
31
|
+
headers: {
|
32
|
+
user_agent: user_agent
|
33
|
+
},
|
34
|
+
request: {
|
35
|
+
params_encoder: Faraday::FlatParamsEncoder
|
36
|
+
}
|
37
|
+
}
|
38
|
+
end
|
39
|
+
|
40
|
+
def debug
|
41
|
+
ENV['BWStatusBoardAPI_DEBUG'] || false
|
42
|
+
end
|
43
|
+
|
44
|
+
def logger
|
45
|
+
nil
|
46
|
+
end
|
47
|
+
|
48
|
+
def performance
|
49
|
+
Allotment.results
|
50
|
+
end
|
51
|
+
|
52
|
+
def user_agent
|
53
|
+
ENV['BWStatusBoardAPI_USER_AGENT'] || USER_AGENT
|
54
|
+
end
|
55
|
+
|
56
|
+
def verify_ssl
|
57
|
+
ENV['BWStatusBoardAPI_VERIFY_SSL'] || false
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
module BWStatusBoardAPI
|
2
|
+
# BWStatusBoardAPI error class
|
3
|
+
class BWStatusBoardAPIError < StandardError
|
4
|
+
def initialize(response = nil)
|
5
|
+
@errors = []
|
6
|
+
valid_response?(response)
|
7
|
+
@errors.empty? ? super() : super(@errors.join(', '))
|
8
|
+
end
|
9
|
+
|
10
|
+
# Check if response is valid
|
11
|
+
#
|
12
|
+
# @param object [Object] response object to check for errors
|
13
|
+
def valid_response?(response)
|
14
|
+
return nil if response.nil?
|
15
|
+
return nil unless response.body.is_a?(Object) && response.respond_to?(:body)
|
16
|
+
return nil unless response.body.is_a?(Hash)
|
17
|
+
parse_errors(errors_keys?(response.body)) unless response.body.nil?
|
18
|
+
end
|
19
|
+
|
20
|
+
# Check if response has known errors keys
|
21
|
+
#
|
22
|
+
# @param object [Object] response object to process for errors
|
23
|
+
def errors_keys?(body)
|
24
|
+
if body.key?('error') && body.key?('error_description')
|
25
|
+
body
|
26
|
+
elsif body.key?('errors')
|
27
|
+
body['errors']
|
28
|
+
else
|
29
|
+
nil
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# Parses errors based on error body passed
|
34
|
+
#
|
35
|
+
# @param body [Hash] errors
|
36
|
+
def parse_errors(body)
|
37
|
+
verify_type body
|
38
|
+
end
|
39
|
+
|
40
|
+
# Verifies type
|
41
|
+
#
|
42
|
+
# @param object [Object] type to determine
|
43
|
+
def verify_type(type)
|
44
|
+
case type
|
45
|
+
when Array
|
46
|
+
split_array_errors(type)
|
47
|
+
when Hash
|
48
|
+
split_hash_errors(type)
|
49
|
+
when String
|
50
|
+
@errors << type
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# Iterates through errors in array
|
55
|
+
#
|
56
|
+
# @param array [Array] array to iterate
|
57
|
+
def split_array_errors(array)
|
58
|
+
array.each_with_index { |_e, i| verify_type array[i] }
|
59
|
+
end
|
60
|
+
|
61
|
+
# Iterates through errors in hash
|
62
|
+
#
|
63
|
+
# @param hash [Hash] hash to iterate
|
64
|
+
def split_hash_errors(hash)
|
65
|
+
message = []
|
66
|
+
hash.each { |k, v| message << "#{k}: #{v}" }
|
67
|
+
@errors << message.flatten.join(' with ')
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
# Raised when Brandwatch returns a 400 HTTP status code
|
72
|
+
class BadRequest < BWStatusBoardAPIError; end
|
73
|
+
|
74
|
+
# Raised when Brandwatch returns a 401 HTTP status code
|
75
|
+
class Unauthorized < BWStatusBoardAPIError; end
|
76
|
+
|
77
|
+
# Raised when Brandwatch returns a 403 HTTP status code
|
78
|
+
class Forbidden < BWStatusBoardAPIError; end
|
79
|
+
|
80
|
+
# Raised when Brandwatch returns a 404 HTTP status code
|
81
|
+
class NotFound < BWStatusBoardAPIError; end
|
82
|
+
|
83
|
+
# Raised when Brandwatch returns a 406 HTTP status code
|
84
|
+
class NotAcceptable < BWStatusBoardAPIError; end
|
85
|
+
|
86
|
+
# Raised when Brandwatch returns a 422 HTTP status code
|
87
|
+
class UnprocessableEntity < BWStatusBoardAPIError; end
|
88
|
+
|
89
|
+
# Raised when Brandwatch returns a 429 HTTP status code
|
90
|
+
class TooManyRequests < BWStatusBoardAPIError; end
|
91
|
+
|
92
|
+
# Raised when Brandwatch returns a 500 HTTP status code
|
93
|
+
class InternalServerError < BWStatusBoardAPIError; end
|
94
|
+
|
95
|
+
# Raised when Brandwatch returns a 501 HTTP status code
|
96
|
+
class NotImplemented < BWStatusBoardAPIError; end
|
97
|
+
|
98
|
+
# Raised when Brandwatch returns a 502 HTTP status code
|
99
|
+
class BadGateway < BWStatusBoardAPIError; end
|
100
|
+
|
101
|
+
# Raised when Brandwatch returns a 503 HTTP status code
|
102
|
+
class ServiceUnavailable < BWStatusBoardAPIError; end
|
103
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'allotment'
|
2
|
+
require 'hashie'
|
3
|
+
|
4
|
+
module BWStatusBoardAPI
|
5
|
+
# Performance module
|
6
|
+
module Performance
|
7
|
+
def average_response_time
|
8
|
+
averages = []
|
9
|
+
performance.each_key { |key| averages << Allotment.results[key].average }
|
10
|
+
averages.average
|
11
|
+
end
|
12
|
+
|
13
|
+
def average_response_time_breakdown
|
14
|
+
results = []
|
15
|
+
performance.each do |key, value|
|
16
|
+
results << Hashie::Mash.new(path: key, average: Allotment.results[key].average, count: value.size)
|
17
|
+
end
|
18
|
+
results
|
19
|
+
end
|
20
|
+
|
21
|
+
def fastest_response
|
22
|
+
average_response_time_breakdown.sort_by { |result| result[:average] }.first
|
23
|
+
end
|
24
|
+
|
25
|
+
def response_paths
|
26
|
+
performance.keys
|
27
|
+
end
|
28
|
+
|
29
|
+
def slowest_response
|
30
|
+
average_response_time_breakdown.sort_by { |result| result[:average] }.reverse.first
|
31
|
+
end
|
32
|
+
|
33
|
+
def total_responses
|
34
|
+
responses = 0
|
35
|
+
performance.each_value { |value| responses += value.size }
|
36
|
+
responses
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
|
3
|
+
module BWStatusBoardAPI
|
4
|
+
# Request module
|
5
|
+
module Request
|
6
|
+
# Perform a get request
|
7
|
+
#
|
8
|
+
# @param path [String] URL path to send request
|
9
|
+
# @param opts [Hash] Request parameters
|
10
|
+
# @return [Hash] 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 [Hash] 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 [Hash] 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 [Hash] 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 [Hash] 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
|
56
|
+
# @param path [String] URL path to send request
|
57
|
+
# @param opts [Hash] Request parameters
|
58
|
+
# @return [Hash] Response
|
59
|
+
def request(method, path, opts = {})
|
60
|
+
response = connection.send(method) do |r|
|
61
|
+
case method
|
62
|
+
when :get, :delete
|
63
|
+
r.url path, opts
|
64
|
+
when :patch, :post, :put
|
65
|
+
if opts.is_a?(Hash) && opts.key?(:force_urlencoded)
|
66
|
+
opts.delete(:force_urlencoded)
|
67
|
+
r.url path, opts
|
68
|
+
else
|
69
|
+
r.path = path
|
70
|
+
r.body = opts
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
response
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'bw_status_board_api/error'
|
2
|
+
require 'faraday'
|
3
|
+
|
4
|
+
module BWStatusBoardAPI
|
5
|
+
module Response
|
6
|
+
# Brandwatch Status Board API response middleware to handle errors
|
7
|
+
class Error < Faraday::Response::Middleware
|
8
|
+
ERROR_MAP = {
|
9
|
+
400 => BWStatusBoardAPI::BadRequest,
|
10
|
+
401 => BWStatusBoardAPI::Unauthorized,
|
11
|
+
403 => BWStatusBoardAPI::Forbidden,
|
12
|
+
404 => BWStatusBoardAPI::NotFound,
|
13
|
+
406 => BWStatusBoardAPI::NotAcceptable,
|
14
|
+
422 => BWStatusBoardAPI::UnprocessableEntity,
|
15
|
+
429 => BWStatusBoardAPI::TooManyRequests,
|
16
|
+
500 => BWStatusBoardAPI::InternalServerError,
|
17
|
+
501 => BWStatusBoardAPI::NotImplemented,
|
18
|
+
502 => BWStatusBoardAPI::BadGateway,
|
19
|
+
503 => BWStatusBoardAPI::ServiceUnavailable
|
20
|
+
}
|
21
|
+
|
22
|
+
def on_complete(response)
|
23
|
+
key = response[:status].to_i
|
24
|
+
fail ERROR_MAP[key].new(response) if ERROR_MAP.key? key
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
Faraday::Response.register_middleware error: BWStatusBoardAPI::Response::Error
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
|
3
|
+
module BWStatusBoardAPI
|
4
|
+
module Response
|
5
|
+
# Brandwatch Status Board API response middleware to handle logging
|
6
|
+
class Logger < Faraday::Response::Middleware
|
7
|
+
def initialize(app, client)
|
8
|
+
super(app)
|
9
|
+
@client = client
|
10
|
+
end
|
11
|
+
|
12
|
+
def logger
|
13
|
+
@logger = @client.logger || begin
|
14
|
+
require 'logger'
|
15
|
+
::Logger.new(STDOUT)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def call(env)
|
20
|
+
logger.info("Request: #{env.method.upcase} - #{env.url}")
|
21
|
+
logger.debug("Request headers: #{dump_output(env.request_headers)}")
|
22
|
+
super
|
23
|
+
end
|
24
|
+
|
25
|
+
def on_complete(env)
|
26
|
+
logger.info("Response Status: #{env.status}")
|
27
|
+
logger.debug("Response headers: #{dump_output(env.response_headers)}")
|
28
|
+
end
|
29
|
+
|
30
|
+
def dump_output(object)
|
31
|
+
object.map { |key, value| "#{key}: #{value.inspect}" }.join(', ')
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
Faraday::Response.register_middleware logger: BWStatusBoardAPI::Response::Logger
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
require 'allotment'
|
3
|
+
|
4
|
+
module BWStatusBoardAPI
|
5
|
+
module Response
|
6
|
+
# Brandwatch Status Board API response middleware to monitor performance
|
7
|
+
class Performance < Faraday::Response::Middleware
|
8
|
+
def initialize(app, client)
|
9
|
+
super(app)
|
10
|
+
@client = client
|
11
|
+
end
|
12
|
+
|
13
|
+
def logger
|
14
|
+
@logger = @client.logger || begin
|
15
|
+
require 'logger'
|
16
|
+
::Logger.new(STDOUT)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def call(env)
|
21
|
+
@recording = ("#{env.method}#{env.url.path}").gsub!('/', '_')
|
22
|
+
Allotment.start(@recording)
|
23
|
+
super
|
24
|
+
end
|
25
|
+
|
26
|
+
def on_complete(_env)
|
27
|
+
logger.info "Response time: #{Allotment.stop(@recording)} seconds"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
Faraday::Response.register_middleware performance: BWStatusBoardAPI::Response::Performance
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'bw_status_board_api/client'
|
2
|
+
require 'bw_status_board_api/default'
|
3
|
+
|
4
|
+
# Ruby wrapper for the Brandwatch API
|
5
|
+
module BWStatusBoardAPI
|
6
|
+
class << self
|
7
|
+
include BWStatusBoardAPI::Configuration
|
8
|
+
|
9
|
+
# Alias for BWStatusBoardAPI::Client.new
|
10
|
+
#
|
11
|
+
# @return [BWStatusBoardAPI::Client]
|
12
|
+
def new(opts = {})
|
13
|
+
BWStatusBoardAPI::Client.new(opts)
|
14
|
+
end
|
15
|
+
|
16
|
+
# Check BWStatusBoardAPI::Client.new responds
|
17
|
+
def respond_to?(method_name, include_private = false)
|
18
|
+
new.respond_to?(method_name, include_private) || super
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
# Delegate to BWStatusBoardAPI::Client.new
|
24
|
+
def method_missing(method_name, *args, &block)
|
25
|
+
return super unless client.respond_to?(method_name)
|
26
|
+
new.send(method_name, *args, &block)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
BWStatusBoardAPI.reset
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
describe BWStatusBoardAPI do
|
4
|
+
describe 'when called' do
|
5
|
+
it 'should be an instance of Module' do
|
6
|
+
expect(BWStatusBoardAPI).to be_an_instance_of Module
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
describe '.new' do
|
11
|
+
it 'is a BWStatusBoardAPI::Client' do
|
12
|
+
expect(BWStatusBoardAPI.new).to be_a BWStatusBoardAPI::Client
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe '.respond_to?' do
|
17
|
+
it 'returns true if new method exists' do
|
18
|
+
expect(BWStatusBoardAPI.respond_to?(:new, true)).to eq(true)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/spec/helper.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'simplecov'
|
2
|
+
require 'coveralls'
|
3
|
+
|
4
|
+
SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
|
5
|
+
Coveralls::SimpleCov::Formatter,
|
6
|
+
SimpleCov::Formatter::HTMLFormatter,
|
7
|
+
]
|
8
|
+
|
9
|
+
SimpleCov.start
|
10
|
+
require 'bw_status_board_api'
|
11
|
+
|
12
|
+
RSpec.configure do |config|
|
13
|
+
config.color = true
|
14
|
+
end
|
metadata
ADDED
@@ -0,0 +1,170 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: bw_status_board_api
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Jonathan Chrisp
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-09-04 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rspec
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ~>
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 3.0.0
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 3.0.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rubocop
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.24.1
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ~>
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.24.1
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: allotment
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ~>
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 1.1.0
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 1.1.0
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: faraday
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.9.0
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ~>
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 0.9.0
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: faraday_middleware
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ~>
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 0.9.1
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ~>
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 0.9.1
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: faraday_middleware-parse_oj
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ~>
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 0.3.0
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ~>
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 0.3.0
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: oj
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ~>
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: 2.10.2
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ~>
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: 2.10.2
|
111
|
+
description: A Ruby wrapper for the Brandwatch Status Board
|
112
|
+
email: jonathan@brandwatch.com
|
113
|
+
executables:
|
114
|
+
- bw_status_board_api
|
115
|
+
extensions: []
|
116
|
+
extra_rdoc_files: []
|
117
|
+
files:
|
118
|
+
- .editorconfig
|
119
|
+
- .gitignore
|
120
|
+
- .rubocop.yml
|
121
|
+
- CHANGELOG.md
|
122
|
+
- CONTRIBUTING.md
|
123
|
+
- Gemfile
|
124
|
+
- README.md
|
125
|
+
- bin/bw_status_board_api
|
126
|
+
- bw_status_board_api.gemspec
|
127
|
+
- lib/bw_status_board_api.rb
|
128
|
+
- lib/bw_status_board_api/client.rb
|
129
|
+
- lib/bw_status_board_api/client/environments.rb
|
130
|
+
- lib/bw_status_board_api/client/environments/services.rb
|
131
|
+
- lib/bw_status_board_api/configuration.rb
|
132
|
+
- lib/bw_status_board_api/connection.rb
|
133
|
+
- lib/bw_status_board_api/default.rb
|
134
|
+
- lib/bw_status_board_api/error.rb
|
135
|
+
- lib/bw_status_board_api/performance.rb
|
136
|
+
- lib/bw_status_board_api/request.rb
|
137
|
+
- lib/bw_status_board_api/response/error.rb
|
138
|
+
- lib/bw_status_board_api/response/logger.rb
|
139
|
+
- lib/bw_status_board_api/response/performance.rb
|
140
|
+
- lib/bw_status_board_api/version.rb
|
141
|
+
- spec/bw_status_board_api_spec.rb
|
142
|
+
- spec/helper.rb
|
143
|
+
homepage: https://gite.brandwatch.com/jonathan/bw_status_board_api
|
144
|
+
licenses:
|
145
|
+
- MIT
|
146
|
+
metadata: {}
|
147
|
+
post_install_message:
|
148
|
+
rdoc_options: []
|
149
|
+
require_paths:
|
150
|
+
- lib
|
151
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
152
|
+
requirements:
|
153
|
+
- - '>='
|
154
|
+
- !ruby/object:Gem::Version
|
155
|
+
version: 1.9.2
|
156
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
157
|
+
requirements:
|
158
|
+
- - '>='
|
159
|
+
- !ruby/object:Gem::Version
|
160
|
+
version: '0'
|
161
|
+
requirements: []
|
162
|
+
rubyforge_project:
|
163
|
+
rubygems_version: 2.4.1
|
164
|
+
signing_key:
|
165
|
+
specification_version: 4
|
166
|
+
summary: Brandwatch Status Board API Wrapper
|
167
|
+
test_files:
|
168
|
+
- spec/bw_status_board_api_spec.rb
|
169
|
+
- spec/helper.rb
|
170
|
+
has_rdoc:
|