bn 0.0.1

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.
@@ -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: []