bn 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,10 @@
1
+ require "bn/helpers/has_attributes"
2
+
3
+ module BN
4
+ module Error
5
+ # The base class for errors.
6
+ class Base < StandardError
7
+ include Helpers::HasAttributes
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,11 @@
1
+ require "bn/error/base"
2
+
3
+ module BN
4
+ module Error
5
+ module Middleware
6
+ # The base class for Middleware errors.
7
+ class Base < Error::Base
8
+ end
9
+ end
10
+ end
11
+ end
@@ -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,9 @@
1
+ module BN
2
+ module Middleware
3
+ # The namespace for Diablo 3 middleware.
4
+ module D3
5
+ end
6
+ end
7
+ end
8
+
9
+ require "bn/middleware/d3/profile"
@@ -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: []