bn 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +22 -0
- data/README.md +202 -0
- data/Rakefile +14 -0
- data/VERSION +1 -0
- data/bn.gemspec +23 -0
- data/lib/bn.rb +9 -0
- data/lib/bn/api.rb +19 -0
- data/lib/bn/api/base.rb +78 -0
- data/lib/bn/api/d3.rb +44 -0
- data/lib/bn/api/sc2.rb +74 -0
- data/lib/bn/api/wow.rb +10 -0
- data/lib/bn/entity.rb +19 -0
- data/lib/bn/entity/base.rb +16 -0
- data/lib/bn/entity/d3/hero.rb +164 -0
- data/lib/bn/entity/d3/profile.rb +185 -0
- data/lib/bn/error/api/base.rb +11 -0
- data/lib/bn/error/api/invalid_key.rb +14 -0
- data/lib/bn/error/api/invalid_locale.rb +16 -0
- data/lib/bn/error/api/invalid_region.rb +14 -0
- data/lib/bn/error/base.rb +10 -0
- data/lib/bn/error/middleware/base.rb +11 -0
- data/lib/bn/error/middleware/invalid_api_request.rb +38 -0
- data/lib/bn/error/middleware/invalid_http_response.rb +26 -0
- data/lib/bn/helpers/has_attributes.rb +45 -0
- data/lib/bn/middleware.rb +13 -0
- data/lib/bn/middleware/api_error.rb +27 -0
- data/lib/bn/middleware/base.rb +21 -0
- data/lib/bn/middleware/d3.rb +9 -0
- data/lib/bn/middleware/d3/profile.rb +39 -0
- data/lib/bn/middleware/http_response.rb +24 -0
- data/lib/bn/middleware/key_converter.rb +28 -0
- metadata +117 -0
@@ -0,0 +1,38 @@
|
|
1
|
+
require "bn/error/middleware/base"
|
2
|
+
|
3
|
+
module BN
|
4
|
+
module Error
|
5
|
+
module Middleware
|
6
|
+
# Raised when the JSON API response was an error.
|
7
|
+
class InvalidAPIRequest < Base
|
8
|
+
# @method code
|
9
|
+
# Get the code for this API error.
|
10
|
+
#
|
11
|
+
# @return [String]
|
12
|
+
|
13
|
+
# @method code=
|
14
|
+
# Set the code for this API error.
|
15
|
+
#
|
16
|
+
# @param [#to_s] value
|
17
|
+
# @return [String]
|
18
|
+
attribute(:code) { |value| value.to_s }
|
19
|
+
|
20
|
+
# @method reason
|
21
|
+
# Get the reason for this API error.
|
22
|
+
#
|
23
|
+
# @return [String]
|
24
|
+
|
25
|
+
# @method reason=
|
26
|
+
# Set the reason for this API error.
|
27
|
+
#
|
28
|
+
# @param [#to_s] value
|
29
|
+
# @return [String]
|
30
|
+
attribute(:reason) { |value| value.to_s }
|
31
|
+
|
32
|
+
def to_s
|
33
|
+
"Invalid API request: #{@reason}."
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require "bn/error/middleware/base"
|
2
|
+
|
3
|
+
module BN
|
4
|
+
module Error
|
5
|
+
module Middleware
|
6
|
+
# Raised when the HTTP response object given is invalid.
|
7
|
+
class InvalidHTTPResponse < Base
|
8
|
+
# @method response
|
9
|
+
# Get the HTTP response.
|
10
|
+
#
|
11
|
+
# @return [#body]
|
12
|
+
|
13
|
+
# @method response=
|
14
|
+
# Set the HTTP response.
|
15
|
+
#
|
16
|
+
# @param [#body] value
|
17
|
+
# @return [#body]
|
18
|
+
attribute(:response)
|
19
|
+
|
20
|
+
def to_s
|
21
|
+
"Invalid HTTP response."
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module BN
|
2
|
+
module Helpers
|
3
|
+
# Adds the `update_attributes` method and `attribute` class method.
|
4
|
+
module HasAttributes
|
5
|
+
# The class methods to be mixed in when included.
|
6
|
+
module ClassMethods
|
7
|
+
def attribute(name, options={}, &block)
|
8
|
+
options = options.to_h
|
9
|
+
|
10
|
+
attr_reader(name)
|
11
|
+
|
12
|
+
define_method("#{name}=") do |value|
|
13
|
+
value = instance_exec(value, options, &block) unless block.nil?
|
14
|
+
|
15
|
+
instance_variable_set("@#{name}", value)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
class << self
|
21
|
+
def included(base)
|
22
|
+
base.extend(ClassMethods)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
# Initialize this object by optionally updating attributes with a Hash.
|
27
|
+
#
|
28
|
+
# @param [#to_h] attributes Attributes to set after initializing.
|
29
|
+
def initialize(attributes={})
|
30
|
+
update_attributes(attributes)
|
31
|
+
end
|
32
|
+
|
33
|
+
# Update any attributes on this object.
|
34
|
+
#
|
35
|
+
# @param [#to_h] attributes
|
36
|
+
# @return [Hash] The attributes.
|
37
|
+
def update_attributes(attributes={})
|
38
|
+
attributes = attributes.to_h
|
39
|
+
attributes.each { |name, value| send("#{name}=", value) }
|
40
|
+
|
41
|
+
attributes
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module BN
|
2
|
+
# The API response middleware.
|
3
|
+
module Middleware
|
4
|
+
class << self
|
5
|
+
def execute(data, *middleware)
|
6
|
+
middleware.each_with_object(data) { |middleware, data| middleware.execute(data, options) }
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
require "bn/middleware/http_response"
|
13
|
+
require "bn/middleware/d3"
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require "bn/error/middleware/invalid_api_request"
|
2
|
+
require "bn/middleware/base"
|
3
|
+
|
4
|
+
module BN
|
5
|
+
module Middleware
|
6
|
+
# Checks the JSON API response to see if it is an error.
|
7
|
+
class APIResponse < Base
|
8
|
+
# Execute the middleware.
|
9
|
+
#
|
10
|
+
# @param [#to_h] data
|
11
|
+
# @return [Hash]
|
12
|
+
def execute(data)
|
13
|
+
data = data.to_h
|
14
|
+
|
15
|
+
raise BN::Error::Middleware::InvalidAPIRequest, data if error?(data)
|
16
|
+
|
17
|
+
data
|
18
|
+
end
|
19
|
+
|
20
|
+
protected
|
21
|
+
|
22
|
+
def error?(data)
|
23
|
+
data.keys.sort == [:code, :reason].sort
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module BN
|
2
|
+
module Middleware
|
3
|
+
# The base class for middleware.
|
4
|
+
class Base
|
5
|
+
class << self
|
6
|
+
def execute(data, options={})
|
7
|
+
new(options).execute(data)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def initialize(options={})
|
12
|
+
@options = options.to_h
|
13
|
+
end
|
14
|
+
|
15
|
+
# Execute the middleware.
|
16
|
+
def execute(_value)
|
17
|
+
raise NotImplementedError
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require "bn/middleware/base"
|
2
|
+
require "bn/entity/d3/profile"
|
3
|
+
|
4
|
+
module BN
|
5
|
+
module Middleware
|
6
|
+
module D3
|
7
|
+
# Transforms a Hash into an Entity::Profile instance.
|
8
|
+
class Profile < Base
|
9
|
+
# Execute the middleware.
|
10
|
+
#
|
11
|
+
# @return [Entity::Profile]
|
12
|
+
def execute(data)
|
13
|
+
convert_heroes(data)
|
14
|
+
convert_time_played(data)
|
15
|
+
|
16
|
+
Entity::D3::Profile.new(data)
|
17
|
+
end
|
18
|
+
|
19
|
+
protected
|
20
|
+
|
21
|
+
def convert_heroes(data)
|
22
|
+
data[:heroes].each do |hero|
|
23
|
+
hero[:hero_class] = hero.delete(:class).tr("-", "_").downcase.to_sym
|
24
|
+
hero[:gender] = hero[:gender] == 0 ? :male : :female
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def convert_time_played(data)
|
29
|
+
data[:time_played].keys.each do |hero_class|
|
30
|
+
value = data[:time_played].delete(hero_class).to_f
|
31
|
+
hero_class = hero_class.tr("-", "_").downcase.to_sym
|
32
|
+
|
33
|
+
hero[hero_class] = value
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require "json"
|
2
|
+
require "httpi"
|
3
|
+
require "bn/error/middleware/invalid_http_response"
|
4
|
+
require "bn/middleware/base"
|
5
|
+
|
6
|
+
module BN
|
7
|
+
module Middleware
|
8
|
+
# Transforms the body of an HTTP request from JSON to Ruby.
|
9
|
+
class HTTPResponse < Base
|
10
|
+
# Execute the middleware.
|
11
|
+
#
|
12
|
+
# @param [#body] response
|
13
|
+
# @return [Hash]
|
14
|
+
def execute(response)
|
15
|
+
raise Error::Middleware::InvalidHTTPResponse, response: response unless response.respond_to?(:body)
|
16
|
+
raise Error::Middleware::InvalidHTTPResponse, response: response unless response.respond_to?(:code) && (200...300).include?(response.code)
|
17
|
+
|
18
|
+
body = response.body.to_s
|
19
|
+
|
20
|
+
::JSON.parse(body)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require "bn/middleware/base"
|
2
|
+
|
3
|
+
module BN
|
4
|
+
module Middleware
|
5
|
+
# Recursively convert all keys in a Hash from camelCase or dashed-delimited Strings into underscore_delimited Symbols.
|
6
|
+
class KeyConverter < Base
|
7
|
+
# Execute the middleware.
|
8
|
+
#
|
9
|
+
# @param [#to_h] value
|
10
|
+
# @return [Hash]
|
11
|
+
def execute(value)
|
12
|
+
convert_keys(value.to_h)
|
13
|
+
end
|
14
|
+
|
15
|
+
protected
|
16
|
+
|
17
|
+
def convert_keys(data)
|
18
|
+
data.keys.each do |key|
|
19
|
+
value = data.delete(key)
|
20
|
+
value = convert_keys(value) if value.is_a?(Hash)
|
21
|
+
key = key.gsub(/([a-z\d])([A-Z])/, "\1_\2").tr("-", "_").downcase.to_sym
|
22
|
+
|
23
|
+
data[key] = value
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
metadata
ADDED
@@ -0,0 +1,117 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: bn
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Ryan Scott Lewis
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-12-27 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: version
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 1.0.0
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 1.0.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: httpi
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 2.4.1
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 2.4.1
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 10.4.2
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 10.4.2
|
55
|
+
description: A Battle.net API adapter and entity mapper.
|
56
|
+
email: ryan@rynet.us
|
57
|
+
executables: []
|
58
|
+
extensions: []
|
59
|
+
extra_rdoc_files: []
|
60
|
+
files:
|
61
|
+
- Gemfile
|
62
|
+
- Gemfile.lock
|
63
|
+
- README.md
|
64
|
+
- Rakefile
|
65
|
+
- VERSION
|
66
|
+
- bn.gemspec
|
67
|
+
- lib/bn.rb
|
68
|
+
- lib/bn/api.rb
|
69
|
+
- lib/bn/api/base.rb
|
70
|
+
- lib/bn/api/d3.rb
|
71
|
+
- lib/bn/api/sc2.rb
|
72
|
+
- lib/bn/api/wow.rb
|
73
|
+
- lib/bn/entity.rb
|
74
|
+
- lib/bn/entity/base.rb
|
75
|
+
- lib/bn/entity/d3/hero.rb
|
76
|
+
- lib/bn/entity/d3/profile.rb
|
77
|
+
- lib/bn/error/api/base.rb
|
78
|
+
- lib/bn/error/api/invalid_key.rb
|
79
|
+
- lib/bn/error/api/invalid_locale.rb
|
80
|
+
- lib/bn/error/api/invalid_region.rb
|
81
|
+
- lib/bn/error/base.rb
|
82
|
+
- lib/bn/error/middleware/base.rb
|
83
|
+
- lib/bn/error/middleware/invalid_api_request.rb
|
84
|
+
- lib/bn/error/middleware/invalid_http_response.rb
|
85
|
+
- lib/bn/helpers/has_attributes.rb
|
86
|
+
- lib/bn/middleware.rb
|
87
|
+
- lib/bn/middleware/api_error.rb
|
88
|
+
- lib/bn/middleware/base.rb
|
89
|
+
- lib/bn/middleware/d3.rb
|
90
|
+
- lib/bn/middleware/d3/profile.rb
|
91
|
+
- lib/bn/middleware/http_response.rb
|
92
|
+
- lib/bn/middleware/key_converter.rb
|
93
|
+
homepage: http://github.com/RyanScottLewis/
|
94
|
+
licenses:
|
95
|
+
- MIT
|
96
|
+
metadata: {}
|
97
|
+
post_install_message:
|
98
|
+
rdoc_options: []
|
99
|
+
require_paths:
|
100
|
+
- lib
|
101
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
102
|
+
requirements:
|
103
|
+
- - ">="
|
104
|
+
- !ruby/object:Gem::Version
|
105
|
+
version: '0'
|
106
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
requirements: []
|
112
|
+
rubyforge_project:
|
113
|
+
rubygems_version: 2.4.5
|
114
|
+
signing_key:
|
115
|
+
specification_version: 4
|
116
|
+
summary: A Battle.net API adapter and entity mapper.
|
117
|
+
test_files: []
|