trailer_vote-api 0.8.4 → 0.9.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 +5 -5
 - data/.gitignore +13 -13
 - data/.rubocop.yml +29 -29
 - data/CHANGELOG.md +56 -56
 - data/Gemfile +6 -6
 - data/Gemfile.lock +10 -11
 - data/README.md +188 -188
 - data/Rakefile +12 -12
 - data/bin/console +15 -15
 - data/bin/setup +8 -8
 - data/lib/trailer_vote/api.rb +43 -43
 - data/lib/trailer_vote/api/autoload.rb +24 -22
 - data/lib/trailer_vote/api/composable/common.rb +91 -91
 - data/lib/trailer_vote/api/composable/get.rb +66 -66
 - data/lib/trailer_vote/api/configuration.rb +71 -71
 - data/lib/trailer_vote/api/errors.rb +115 -115
 - data/lib/trailer_vote/api/fallback_content_types.rb +50 -50
 - data/lib/trailer_vote/api/issue.rb +31 -31
 - data/lib/trailer_vote/api/issue/create.rb +72 -72
 - data/lib/trailer_vote/api/issue/find.rb +42 -42
 - data/lib/trailer_vote/api/links.rb +54 -54
 - data/lib/trailer_vote/api/place.rb +24 -24
 - data/lib/trailer_vote/api/place/children.rb +33 -0
 - data/lib/trailer_vote/api/place/children/urls.rb +67 -0
 - data/lib/trailer_vote/api/place/create.rb +83 -83
 - data/lib/trailer_vote/api/place/find.rb +60 -59
 - data/lib/trailer_vote/api/product.rb +33 -33
 - data/lib/trailer_vote/api/product/create.rb +63 -63
 - data/lib/trailer_vote/api/product/find.rb +55 -55
 - data/lib/trailer_vote/api/product/image.rb +38 -38
 - data/lib/trailer_vote/api/product/image/create.rb +83 -83
 - data/lib/trailer_vote/api/product/image/find.rb +54 -54
 - data/lib/trailer_vote/api/product/image/urls.rb +66 -66
 - data/lib/trailer_vote/api/product/lookup.rb +97 -97
 - data/lib/trailer_vote/api/product/place.rb +40 -40
 - data/lib/trailer_vote/api/product/place/link.rb +75 -75
 - data/lib/trailer_vote/api/product/update.rb +80 -80
 - data/lib/trailer_vote/api/product/video.rb +38 -38
 - data/lib/trailer_vote/api/product/video/create.rb +80 -80
 - data/lib/trailer_vote/api/product/video/find.rb +56 -56
 - data/lib/trailer_vote/api/product/video/urls.rb +66 -66
 - data/lib/trailer_vote/api/type_registry.rb +99 -99
 - data/lib/trailer_vote/api/version.rb +7 -7
 - data/trailer_vote-api.gemspec +45 -45
 - metadata +7 -6
 
| 
         @@ -1,71 +1,71 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            # frozen_string_literal: true
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
            require 'trailer_vote/media_types'
         
     | 
| 
       4 
     | 
    
         
            -
            require 'trailer_vote/api/composable/get'
         
     | 
| 
       5 
     | 
    
         
            -
             
     | 
| 
       6 
     | 
    
         
            -
            module TrailerVote
         
     | 
| 
       7 
     | 
    
         
            -
              module Api
         
     | 
| 
       8 
     | 
    
         
            -
             
     | 
| 
       9 
     | 
    
         
            -
                module_function
         
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
                def configure(url:, key:, secret:)
         
     | 
| 
       12 
     | 
    
         
            -
                  client = Api.default_client(key, secret)
         
     | 
| 
       13 
     | 
    
         
            -
                  Configuration.new(client: client, url: url)
         
     | 
| 
       14 
     | 
    
         
            -
                end
         
     | 
| 
       15 
     | 
    
         
            -
             
     | 
| 
       16 
     | 
    
         
            -
                class Configuration
         
     | 
| 
       17 
     | 
    
         
            -
                  include Composable::Get
         
     | 
| 
       18 
     | 
    
         
            -
             
     | 
| 
       19 
     | 
    
         
            -
                  SUCCESS = MediaTypes::Configuration.to_constructable.version(2)
         
     | 
| 
       20 
     | 
    
         
            -
                  FAILURE = MediaTypes::Errors.to_constructable.version(1)
         
     | 
| 
       21 
     | 
    
         
            -
             
     | 
| 
       22 
     | 
    
         
            -
                  ACCEPT = [SUCCESS.to_s, FAILURE.to_s(0.1)].join(', ').freeze
         
     | 
| 
       23 
     | 
    
         
            -
             
     | 
| 
       24 
     | 
    
         
            -
                  attr_accessor :client
         
     | 
| 
       25 
     | 
    
         
            -
             
     | 
| 
       26 
     | 
    
         
            -
                  def initialize(client:, url: nil, result: nil)
         
     | 
| 
       27 
     | 
    
         
            -
                    self.client = client
         
     | 
| 
       28 
     | 
    
         
            -
                    self.result = result
         
     | 
| 
       29 
     | 
    
         
            -
                    self.url = url
         
     | 
| 
       30 
     | 
    
         
            -
                  end
         
     | 
| 
       31 
     | 
    
         
            -
             
     | 
| 
       32 
     | 
    
         
            -
                  def data
         
     | 
| 
       33 
     | 
    
         
            -
                    to_h[:configuration]
         
     | 
| 
       34 
     | 
    
         
            -
                  end
         
     | 
| 
       35 
     | 
    
         
            -
             
     | 
| 
       36 
     | 
    
         
            -
                  def call(url: resolve_url)
         
     | 
| 
       37 
     | 
    
         
            -
                    return self if ok? || !url
         
     | 
| 
       38 
     | 
    
         
            -
                    guard_network_errors do
         
     | 
| 
       39 
     | 
    
         
            -
                      merge(resolve_client.headers(Headers::ACCEPT => ACCEPT).get(url))
         
     | 
| 
       40 
     | 
    
         
            -
                    end
         
     | 
| 
       41 
     | 
    
         
            -
                  end
         
     | 
| 
       42 
     | 
    
         
            -
             
     | 
| 
       43 
     | 
    
         
            -
                  private
         
     | 
| 
       44 
     | 
    
         
            -
             
     | 
| 
       45 
     | 
    
         
            -
                  attr_accessor :url
         
     | 
| 
       46 
     | 
    
         
            -
             
     | 
| 
       47 
     | 
    
         
            -
                  def ok?
         
     | 
| 
       48 
     | 
    
         
            -
                    result&.status == 200
         
     | 
| 
       49 
     | 
    
         
            -
                  end
         
     | 
| 
       50 
     | 
    
         
            -
             
     | 
| 
       51 
     | 
    
         
            -
                  def redirecting?(result)
         
     | 
| 
       52 
     | 
    
         
            -
                    [301, 302, 303, 307, 308].include?(result.status)
         
     | 
| 
       53 
     | 
    
         
            -
                  end
         
     | 
| 
       54 
     | 
    
         
            -
             
     | 
| 
       55 
     | 
    
         
            -
                  alias resolve_url url
         
     | 
| 
       56 
     | 
    
         
            -
                  alias resolve_client client
         
     | 
| 
       57 
     | 
    
         
            -
             
     | 
| 
       58 
     | 
    
         
            -
                  def merge(result)
         
     | 
| 
       59 
     | 
    
         
            -
                    raise_on_error(result)
         
     | 
| 
       60 
     | 
    
         
            -
                    self.result = redirecting?(result) ? redirect(result).result : result
         
     | 
| 
       61 
     | 
    
         
            -
                    self
         
     | 
| 
       62 
     | 
    
         
            -
                  end
         
     | 
| 
       63 
     | 
    
         
            -
             
     | 
| 
       64 
     | 
    
         
            -
                  def redirect(result)
         
     | 
| 
       65 
     | 
    
         
            -
                    call(url: result['Location'] || result['Content-Location'])
         
     | 
| 
       66 
     | 
    
         
            -
                  end
         
     | 
| 
       67 
     | 
    
         
            -
                end
         
     | 
| 
       68 
     | 
    
         
            -
              end
         
     | 
| 
       69 
     | 
    
         
            -
            end
         
     | 
| 
       70 
     | 
    
         
            -
             
     | 
| 
       71 
     | 
    
         
            -
            TrailerVote::MediaTypes::Configuration.register
         
     | 
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require 'trailer_vote/media_types'
         
     | 
| 
      
 4 
     | 
    
         
            +
            require 'trailer_vote/api/composable/get'
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            module TrailerVote
         
     | 
| 
      
 7 
     | 
    
         
            +
              module Api
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
                module_function
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
                def configure(url:, key:, secret:)
         
     | 
| 
      
 12 
     | 
    
         
            +
                  client = Api.default_client(key, secret)
         
     | 
| 
      
 13 
     | 
    
         
            +
                  Configuration.new(client: client, url: url)
         
     | 
| 
      
 14 
     | 
    
         
            +
                end
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
                class Configuration
         
     | 
| 
      
 17 
     | 
    
         
            +
                  include Composable::Get
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                  SUCCESS = MediaTypes::Configuration.to_constructable.version(2)
         
     | 
| 
      
 20 
     | 
    
         
            +
                  FAILURE = MediaTypes::Errors.to_constructable.version(1)
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
                  ACCEPT = [SUCCESS.to_s, FAILURE.to_s(0.1)].join(', ').freeze
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
                  attr_accessor :client
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
                  def initialize(client:, url: nil, result: nil)
         
     | 
| 
      
 27 
     | 
    
         
            +
                    self.client = client
         
     | 
| 
      
 28 
     | 
    
         
            +
                    self.result = result
         
     | 
| 
      
 29 
     | 
    
         
            +
                    self.url = url
         
     | 
| 
      
 30 
     | 
    
         
            +
                  end
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
      
 32 
     | 
    
         
            +
                  def data
         
     | 
| 
      
 33 
     | 
    
         
            +
                    to_h[:configuration]
         
     | 
| 
      
 34 
     | 
    
         
            +
                  end
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
                  def call(url: resolve_url)
         
     | 
| 
      
 37 
     | 
    
         
            +
                    return self if ok? || !url
         
     | 
| 
      
 38 
     | 
    
         
            +
                    guard_network_errors do
         
     | 
| 
      
 39 
     | 
    
         
            +
                      merge(resolve_client.headers(Headers::ACCEPT => ACCEPT).get(url))
         
     | 
| 
      
 40 
     | 
    
         
            +
                    end
         
     | 
| 
      
 41 
     | 
    
         
            +
                  end
         
     | 
| 
      
 42 
     | 
    
         
            +
             
     | 
| 
      
 43 
     | 
    
         
            +
                  private
         
     | 
| 
      
 44 
     | 
    
         
            +
             
     | 
| 
      
 45 
     | 
    
         
            +
                  attr_accessor :url
         
     | 
| 
      
 46 
     | 
    
         
            +
             
     | 
| 
      
 47 
     | 
    
         
            +
                  def ok?
         
     | 
| 
      
 48 
     | 
    
         
            +
                    result&.status == 200
         
     | 
| 
      
 49 
     | 
    
         
            +
                  end
         
     | 
| 
      
 50 
     | 
    
         
            +
             
     | 
| 
      
 51 
     | 
    
         
            +
                  def redirecting?(result)
         
     | 
| 
      
 52 
     | 
    
         
            +
                    [301, 302, 303, 307, 308].include?(result.status)
         
     | 
| 
      
 53 
     | 
    
         
            +
                  end
         
     | 
| 
      
 54 
     | 
    
         
            +
             
     | 
| 
      
 55 
     | 
    
         
            +
                  alias resolve_url url
         
     | 
| 
      
 56 
     | 
    
         
            +
                  alias resolve_client client
         
     | 
| 
      
 57 
     | 
    
         
            +
             
     | 
| 
      
 58 
     | 
    
         
            +
                  def merge(result)
         
     | 
| 
      
 59 
     | 
    
         
            +
                    raise_on_error(result)
         
     | 
| 
      
 60 
     | 
    
         
            +
                    self.result = redirecting?(result) ? redirect(result).result : result
         
     | 
| 
      
 61 
     | 
    
         
            +
                    self
         
     | 
| 
      
 62 
     | 
    
         
            +
                  end
         
     | 
| 
      
 63 
     | 
    
         
            +
             
     | 
| 
      
 64 
     | 
    
         
            +
                  def redirect(result)
         
     | 
| 
      
 65 
     | 
    
         
            +
                    call(url: result['Location'] || result['Content-Location'])
         
     | 
| 
      
 66 
     | 
    
         
            +
                  end
         
     | 
| 
      
 67 
     | 
    
         
            +
                end
         
     | 
| 
      
 68 
     | 
    
         
            +
              end
         
     | 
| 
      
 69 
     | 
    
         
            +
            end
         
     | 
| 
      
 70 
     | 
    
         
            +
             
     | 
| 
      
 71 
     | 
    
         
            +
            TrailerVote::MediaTypes::Configuration.register
         
     | 
| 
         @@ -1,115 +1,115 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            # frozen_string_literal: true
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
            require 'trailer_vote/media_types'
         
     | 
| 
       4 
     | 
    
         
            -
             
     | 
| 
       5 
     | 
    
         
            -
            module TrailerVote
         
     | 
| 
       6 
     | 
    
         
            -
              module Api
         
     | 
| 
       7 
     | 
    
         
            -
             
     | 
| 
       8 
     | 
    
         
            -
                class Error < RuntimeError; end
         
     | 
| 
       9 
     | 
    
         
            -
                class UnknownMediaType < Error; end
         
     | 
| 
       10 
     | 
    
         
            -
                class NetworkError < Error; end
         
     | 
| 
       11 
     | 
    
         
            -
                class ConnectionError < NetworkError; end
         
     | 
| 
       12 
     | 
    
         
            -
                class TimeoutError < NetworkError; end
         
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
       14 
     | 
    
         
            -
                class EncodeError < Error
         
     | 
| 
       15 
     | 
    
         
            -
                  def initialize(media_type:, source:)
         
     | 
| 
       16 
     | 
    
         
            -
                    super format(
         
     | 
| 
       17 
     | 
    
         
            -
                      'Failed to encode data for %<media_type>s. Reason: %<reason>s',
         
     | 
| 
       18 
     | 
    
         
            -
                      media_type: media_type,
         
     | 
| 
       19 
     | 
    
         
            -
                      reason: source.message
         
     | 
| 
       20 
     | 
    
         
            -
                    )
         
     | 
| 
       21 
     | 
    
         
            -
             
     | 
| 
       22 
     | 
    
         
            -
                    self.source = source
         
     | 
| 
       23 
     | 
    
         
            -
                  end
         
     | 
| 
       24 
     | 
    
         
            -
             
     | 
| 
       25 
     | 
    
         
            -
                  attr_accessor :source
         
     | 
| 
       26 
     | 
    
         
            -
                end
         
     | 
| 
       27 
     | 
    
         
            -
             
     | 
| 
       28 
     | 
    
         
            -
                class DecodeError < Error
         
     | 
| 
       29 
     | 
    
         
            -
                  def initialize(media_type:, source:)
         
     | 
| 
       30 
     | 
    
         
            -
                    super format(
         
     | 
| 
       31 
     | 
    
         
            -
                      'Failed to decode data for %<media_type>s. Reason: %<reason>s',
         
     | 
| 
       32 
     | 
    
         
            -
                      media_type: media_type,
         
     | 
| 
       33 
     | 
    
         
            -
                      reason: source.message
         
     | 
| 
       34 
     | 
    
         
            -
                    )
         
     | 
| 
       35 
     | 
    
         
            -
             
     | 
| 
       36 
     | 
    
         
            -
                    self.source = source
         
     | 
| 
       37 
     | 
    
         
            -
                  end
         
     | 
| 
       38 
     | 
    
         
            -
             
     | 
| 
       39 
     | 
    
         
            -
                  attr_accessor :source
         
     | 
| 
       40 
     | 
    
         
            -
                end
         
     | 
| 
       41 
     | 
    
         
            -
             
     | 
| 
       42 
     | 
    
         
            -
                class ErrorsResponse < Error
         
     | 
| 
       43 
     | 
    
         
            -
                  attr_accessor :result
         
     | 
| 
       44 
     | 
    
         
            -
             
     | 
| 
       45 
     | 
    
         
            -
                  def initialize(result)
         
     | 
| 
       46 
     | 
    
         
            -
                    self.result = result
         
     | 
| 
       47 
     | 
    
         
            -
                    super messages
         
     | 
| 
       48 
     | 
    
         
            -
                  end
         
     | 
| 
       49 
     | 
    
         
            -
             
     | 
| 
       50 
     | 
    
         
            -
                  def messages
         
     | 
| 
       51 
     | 
    
         
            -
                    Array(formatted_data[:errors]).map { |error| error[:message] }.join(', ')
         
     | 
| 
       52 
     | 
    
         
            -
                  end
         
     | 
| 
       53 
     | 
    
         
            -
             
     | 
| 
       54 
     | 
    
         
            -
                  def data
         
     | 
| 
       55 
     | 
    
         
            -
                    @data ||= TrailerVote::Api.decode(result)
         
     | 
| 
       56 
     | 
    
         
            -
                  rescue DecodeError, UnknownMediaType
         
     | 
| 
       57 
     | 
    
         
            -
                    # noinspection RubyStringKeysInHashInspection
         
     | 
| 
       58 
     | 
    
         
            -
                    @data = { errors: [{ message: result.status.reason }] }
         
     | 
| 
       59 
     | 
    
         
            -
                  end
         
     | 
| 
       60 
     | 
    
         
            -
             
     | 
| 
       61 
     | 
    
         
            -
                  def status
         
     | 
| 
       62 
     | 
    
         
            -
                    result.status.to_i
         
     | 
| 
       63 
     | 
    
         
            -
                  end
         
     | 
| 
       64 
     | 
    
         
            -
             
     | 
| 
       65 
     | 
    
         
            -
                  def inspect
         
     | 
| 
       66 
     | 
    
         
            -
                    format('[%<status>s] %<klazz>s' + "\n" + '%<messages>s', status: status, klazz: self.class.name, messages: messages)
         
     | 
| 
       67 
     | 
    
         
            -
                  end
         
     | 
| 
       68 
     | 
    
         
            -
             
     | 
| 
       69 
     | 
    
         
            -
                  alias to_i status
         
     | 
| 
       70 
     | 
    
         
            -
                  alias to_s inspect
         
     | 
| 
       71 
     | 
    
         
            -
             
     | 
| 
       72 
     | 
    
         
            -
                  private
         
     | 
| 
       73 
     | 
    
         
            -
             
     | 
| 
       74 
     | 
    
         
            -
                  def formatted_data
         
     | 
| 
       75 
     | 
    
         
            -
                    return data if data.is_a?(::Hash)
         
     | 
| 
       76 
     | 
    
         
            -
             
     | 
| 
       77 
     | 
    
         
            -
                    { errors: [{ message: String(data) }] }
         
     | 
| 
       78 
     | 
    
         
            -
                  end
         
     | 
| 
       79 
     | 
    
         
            -
                end
         
     | 
| 
       80 
     | 
    
         
            -
             
     | 
| 
       81 
     | 
    
         
            -
                class ClientError < ErrorsResponse; end
         
     | 
| 
       82 
     | 
    
         
            -
                class BadRequest < ClientError; end
         
     | 
| 
       83 
     | 
    
         
            -
                class Unauthorized < ClientError; end
         
     | 
| 
       84 
     | 
    
         
            -
                class Forbidden < ClientError; end
         
     | 
| 
       85 
     | 
    
         
            -
                class NotFound < ClientError; end
         
     | 
| 
       86 
     | 
    
         
            -
                class Conflict < ClientError; end
         
     | 
| 
       87 
     | 
    
         
            -
                class Gone < ClientError; end
         
     | 
| 
       88 
     | 
    
         
            -
                class PreconditionFailed < ClientError; end
         
     | 
| 
       89 
     | 
    
         
            -
                class UnprocessableEntity < ClientError; end
         
     | 
| 
       90 
     | 
    
         
            -
                class TooManyRequests < ClientError; end
         
     | 
| 
       91 
     | 
    
         
            -
             
     | 
| 
       92 
     | 
    
         
            -
                class ServerError < ErrorsResponse; end
         
     | 
| 
       93 
     | 
    
         
            -
             
     | 
| 
       94 
     | 
    
         
            -
                ERROR_MAPPING = Hash.new { |_, key| key < 500 ? ClientError : ServerError }.merge(
         
     | 
| 
       95 
     | 
    
         
            -
                  400 => BadRequest,
         
     | 
| 
       96 
     | 
    
         
            -
                  401 => Unauthorized,
         
     | 
| 
       97 
     | 
    
         
            -
                  403 => Forbidden,
         
     | 
| 
       98 
     | 
    
         
            -
                  404 => NotFound,
         
     | 
| 
       99 
     | 
    
         
            -
                  409 => Conflict,
         
     | 
| 
       100 
     | 
    
         
            -
                  410 => Gone,
         
     | 
| 
       101 
     | 
    
         
            -
                  412 => PreconditionFailed,
         
     | 
| 
       102 
     | 
    
         
            -
                  422 => UnprocessableEntity,
         
     | 
| 
       103 
     | 
    
         
            -
                  429 => TooManyRequests
         
     | 
| 
       104 
     | 
    
         
            -
                ).freeze
         
     | 
| 
       105 
     | 
    
         
            -
             
     | 
| 
       106 
     | 
    
         
            -
                module_function
         
     | 
| 
       107 
     | 
    
         
            -
             
     | 
| 
       108 
     | 
    
         
            -
                def raise_error(result)
         
     | 
| 
       109 
     | 
    
         
            -
                  raise ERROR_MAPPING[result.status], result
         
     | 
| 
       110 
     | 
    
         
            -
                end
         
     | 
| 
       111 
     | 
    
         
            -
             
     | 
| 
       112 
     | 
    
         
            -
              end
         
     | 
| 
       113 
     | 
    
         
            -
            end
         
     | 
| 
       114 
     | 
    
         
            -
             
     | 
| 
       115 
     | 
    
         
            -
            TrailerVote::MediaTypes::Errors.register
         
     | 
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require 'trailer_vote/media_types'
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            module TrailerVote
         
     | 
| 
      
 6 
     | 
    
         
            +
              module Api
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
                class Error < RuntimeError; end
         
     | 
| 
      
 9 
     | 
    
         
            +
                class UnknownMediaType < Error; end
         
     | 
| 
      
 10 
     | 
    
         
            +
                class NetworkError < Error; end
         
     | 
| 
      
 11 
     | 
    
         
            +
                class ConnectionError < NetworkError; end
         
     | 
| 
      
 12 
     | 
    
         
            +
                class TimeoutError < NetworkError; end
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
                class EncodeError < Error
         
     | 
| 
      
 15 
     | 
    
         
            +
                  def initialize(media_type:, source:)
         
     | 
| 
      
 16 
     | 
    
         
            +
                    super format(
         
     | 
| 
      
 17 
     | 
    
         
            +
                      'Failed to encode data for %<media_type>s. Reason: %<reason>s',
         
     | 
| 
      
 18 
     | 
    
         
            +
                      media_type: media_type,
         
     | 
| 
      
 19 
     | 
    
         
            +
                      reason: source.message
         
     | 
| 
      
 20 
     | 
    
         
            +
                    )
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
                    self.source = source
         
     | 
| 
      
 23 
     | 
    
         
            +
                  end
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
                  attr_accessor :source
         
     | 
| 
      
 26 
     | 
    
         
            +
                end
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
                class DecodeError < Error
         
     | 
| 
      
 29 
     | 
    
         
            +
                  def initialize(media_type:, source:)
         
     | 
| 
      
 30 
     | 
    
         
            +
                    super format(
         
     | 
| 
      
 31 
     | 
    
         
            +
                      'Failed to decode data for %<media_type>s. Reason: %<reason>s',
         
     | 
| 
      
 32 
     | 
    
         
            +
                      media_type: media_type,
         
     | 
| 
      
 33 
     | 
    
         
            +
                      reason: source.message
         
     | 
| 
      
 34 
     | 
    
         
            +
                    )
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
                    self.source = source
         
     | 
| 
      
 37 
     | 
    
         
            +
                  end
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
      
 39 
     | 
    
         
            +
                  attr_accessor :source
         
     | 
| 
      
 40 
     | 
    
         
            +
                end
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
                class ErrorsResponse < Error
         
     | 
| 
      
 43 
     | 
    
         
            +
                  attr_accessor :result
         
     | 
| 
      
 44 
     | 
    
         
            +
             
     | 
| 
      
 45 
     | 
    
         
            +
                  def initialize(result)
         
     | 
| 
      
 46 
     | 
    
         
            +
                    self.result = result
         
     | 
| 
      
 47 
     | 
    
         
            +
                    super messages
         
     | 
| 
      
 48 
     | 
    
         
            +
                  end
         
     | 
| 
      
 49 
     | 
    
         
            +
             
     | 
| 
      
 50 
     | 
    
         
            +
                  def messages
         
     | 
| 
      
 51 
     | 
    
         
            +
                    Array(formatted_data[:errors]).map { |error| error[:message] }.join(', ')
         
     | 
| 
      
 52 
     | 
    
         
            +
                  end
         
     | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
      
 54 
     | 
    
         
            +
                  def data
         
     | 
| 
      
 55 
     | 
    
         
            +
                    @data ||= TrailerVote::Api.decode(result)
         
     | 
| 
      
 56 
     | 
    
         
            +
                  rescue DecodeError, UnknownMediaType
         
     | 
| 
      
 57 
     | 
    
         
            +
                    # noinspection RubyStringKeysInHashInspection
         
     | 
| 
      
 58 
     | 
    
         
            +
                    @data = { errors: [{ message: result.status.reason }] }
         
     | 
| 
      
 59 
     | 
    
         
            +
                  end
         
     | 
| 
      
 60 
     | 
    
         
            +
             
     | 
| 
      
 61 
     | 
    
         
            +
                  def status
         
     | 
| 
      
 62 
     | 
    
         
            +
                    result.status.to_i
         
     | 
| 
      
 63 
     | 
    
         
            +
                  end
         
     | 
| 
      
 64 
     | 
    
         
            +
             
     | 
| 
      
 65 
     | 
    
         
            +
                  def inspect
         
     | 
| 
      
 66 
     | 
    
         
            +
                    format('[%<status>s] %<klazz>s' + "\n" + '%<messages>s', status: status, klazz: self.class.name, messages: messages)
         
     | 
| 
      
 67 
     | 
    
         
            +
                  end
         
     | 
| 
      
 68 
     | 
    
         
            +
             
     | 
| 
      
 69 
     | 
    
         
            +
                  alias to_i status
         
     | 
| 
      
 70 
     | 
    
         
            +
                  alias to_s inspect
         
     | 
| 
      
 71 
     | 
    
         
            +
             
     | 
| 
      
 72 
     | 
    
         
            +
                  private
         
     | 
| 
      
 73 
     | 
    
         
            +
             
     | 
| 
      
 74 
     | 
    
         
            +
                  def formatted_data
         
     | 
| 
      
 75 
     | 
    
         
            +
                    return data if data.is_a?(::Hash)
         
     | 
| 
      
 76 
     | 
    
         
            +
             
     | 
| 
      
 77 
     | 
    
         
            +
                    { errors: [{ message: String(data) }] }
         
     | 
| 
      
 78 
     | 
    
         
            +
                  end
         
     | 
| 
      
 79 
     | 
    
         
            +
                end
         
     | 
| 
      
 80 
     | 
    
         
            +
             
     | 
| 
      
 81 
     | 
    
         
            +
                class ClientError < ErrorsResponse; end
         
     | 
| 
      
 82 
     | 
    
         
            +
                class BadRequest < ClientError; end
         
     | 
| 
      
 83 
     | 
    
         
            +
                class Unauthorized < ClientError; end
         
     | 
| 
      
 84 
     | 
    
         
            +
                class Forbidden < ClientError; end
         
     | 
| 
      
 85 
     | 
    
         
            +
                class NotFound < ClientError; end
         
     | 
| 
      
 86 
     | 
    
         
            +
                class Conflict < ClientError; end
         
     | 
| 
      
 87 
     | 
    
         
            +
                class Gone < ClientError; end
         
     | 
| 
      
 88 
     | 
    
         
            +
                class PreconditionFailed < ClientError; end
         
     | 
| 
      
 89 
     | 
    
         
            +
                class UnprocessableEntity < ClientError; end
         
     | 
| 
      
 90 
     | 
    
         
            +
                class TooManyRequests < ClientError; end
         
     | 
| 
      
 91 
     | 
    
         
            +
             
     | 
| 
      
 92 
     | 
    
         
            +
                class ServerError < ErrorsResponse; end
         
     | 
| 
      
 93 
     | 
    
         
            +
             
     | 
| 
      
 94 
     | 
    
         
            +
                ERROR_MAPPING = Hash.new { |_, key| key < 500 ? ClientError : ServerError }.merge(
         
     | 
| 
      
 95 
     | 
    
         
            +
                  400 => BadRequest,
         
     | 
| 
      
 96 
     | 
    
         
            +
                  401 => Unauthorized,
         
     | 
| 
      
 97 
     | 
    
         
            +
                  403 => Forbidden,
         
     | 
| 
      
 98 
     | 
    
         
            +
                  404 => NotFound,
         
     | 
| 
      
 99 
     | 
    
         
            +
                  409 => Conflict,
         
     | 
| 
      
 100 
     | 
    
         
            +
                  410 => Gone,
         
     | 
| 
      
 101 
     | 
    
         
            +
                  412 => PreconditionFailed,
         
     | 
| 
      
 102 
     | 
    
         
            +
                  422 => UnprocessableEntity,
         
     | 
| 
      
 103 
     | 
    
         
            +
                  429 => TooManyRequests
         
     | 
| 
      
 104 
     | 
    
         
            +
                ).freeze
         
     | 
| 
      
 105 
     | 
    
         
            +
             
     | 
| 
      
 106 
     | 
    
         
            +
                module_function
         
     | 
| 
      
 107 
     | 
    
         
            +
             
     | 
| 
      
 108 
     | 
    
         
            +
                def raise_error(result)
         
     | 
| 
      
 109 
     | 
    
         
            +
                  raise ERROR_MAPPING[result.status], result
         
     | 
| 
      
 110 
     | 
    
         
            +
                end
         
     | 
| 
      
 111 
     | 
    
         
            +
             
     | 
| 
      
 112 
     | 
    
         
            +
              end
         
     | 
| 
      
 113 
     | 
    
         
            +
            end
         
     | 
| 
      
 114 
     | 
    
         
            +
             
     | 
| 
      
 115 
     | 
    
         
            +
            TrailerVote::MediaTypes::Errors.register
         
     | 
| 
         @@ -1,50 +1,50 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            # frozen_string_literal: true
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
            require 'oj'
         
     | 
| 
       4 
     | 
    
         
            -
            require 'trailer_vote/api/type_registry'
         
     | 
| 
       5 
     | 
    
         
            -
             
     | 
| 
       6 
     | 
    
         
            -
            module TrailerVote
         
     | 
| 
       7 
     | 
    
         
            -
              module Api
         
     | 
| 
       8 
     | 
    
         
            -
                module JsonTypeAdapter
         
     | 
| 
       9 
     | 
    
         
            -
                  module_function
         
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
                  def encode(obj)
         
     | 
| 
       12 
     | 
    
         
            -
                    Oj.dump(obj, mode: :compat)
         
     | 
| 
       13 
     | 
    
         
            -
                  rescue Oj::Error => err
         
     | 
| 
       14 
     | 
    
         
            -
                    raise EncodeError.new(media_type: 'application/json', source: err)
         
     | 
| 
       15 
     | 
    
         
            -
                  end
         
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
       17 
     | 
    
         
            -
                  def decode(obj)
         
     | 
| 
       18 
     | 
    
         
            -
                    Oj.load(obj, mode: :strict, symbol_keys: true)
         
     | 
| 
       19 
     | 
    
         
            -
                  rescue Oj::Error => err
         
     | 
| 
       20 
     | 
    
         
            -
                    raise DecodeError.new(media_type: 'application/json', source: err)
         
     | 
| 
       21 
     | 
    
         
            -
                  end
         
     | 
| 
       22 
     | 
    
         
            -
                end
         
     | 
| 
       23 
     | 
    
         
            -
              end
         
     | 
| 
       24 
     | 
    
         
            -
            end
         
     | 
| 
       25 
     | 
    
         
            -
             
     | 
| 
       26 
     | 
    
         
            -
            TrailerVote::Api::TypeRegistry['application/json'] = TrailerVote::Api::JsonTypeAdapter
         
     | 
| 
       27 
     | 
    
         
            -
            TrailerVote::Api::TypeRegistry.shortcut('application/json', :json)
         
     | 
| 
       28 
     | 
    
         
            -
            TrailerVote::Api::TypeRegistry.shortcut('application/json', 'text/json')
         
     | 
| 
       29 
     | 
    
         
            -
             
     | 
| 
       30 
     | 
    
         
            -
            module TrailerVote
         
     | 
| 
       31 
     | 
    
         
            -
              module Api
         
     | 
| 
       32 
     | 
    
         
            -
                module HtmlTypeAdapter
         
     | 
| 
       33 
     | 
    
         
            -
                  module_function
         
     | 
| 
       34 
     | 
    
         
            -
             
     | 
| 
       35 
     | 
    
         
            -
                  def encode(obj)
         
     | 
| 
       36 
     | 
    
         
            -
                    return obj if obj.is_a?(String)
         
     | 
| 
       37 
     | 
    
         
            -
                    raise EncodeError.new(
         
     | 
| 
       38 
     | 
    
         
            -
                      media_type: 'text/html',
         
     | 
| 
       39 
     | 
    
         
            -
                      source: ArgumentError.new('HTML must be passed in as a HTML string')
         
     | 
| 
       40 
     | 
    
         
            -
                    )
         
     | 
| 
       41 
     | 
    
         
            -
                  end
         
     | 
| 
       42 
     | 
    
         
            -
             
     | 
| 
       43 
     | 
    
         
            -
                  def decode(str)
         
     | 
| 
       44 
     | 
    
         
            -
                    str
         
     | 
| 
       45 
     | 
    
         
            -
                  end
         
     | 
| 
       46 
     | 
    
         
            -
                end
         
     | 
| 
       47 
     | 
    
         
            -
              end
         
     | 
| 
       48 
     | 
    
         
            -
            end
         
     | 
| 
       49 
     | 
    
         
            -
             
     | 
| 
       50 
     | 
    
         
            -
            TrailerVote::Api::TypeRegistry['text/html'] = TrailerVote::Api::HtmlTypeAdapter
         
     | 
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require 'oj'
         
     | 
| 
      
 4 
     | 
    
         
            +
            require 'trailer_vote/api/type_registry'
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            module TrailerVote
         
     | 
| 
      
 7 
     | 
    
         
            +
              module Api
         
     | 
| 
      
 8 
     | 
    
         
            +
                module JsonTypeAdapter
         
     | 
| 
      
 9 
     | 
    
         
            +
                  module_function
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
                  def encode(obj)
         
     | 
| 
      
 12 
     | 
    
         
            +
                    Oj.dump(obj, mode: :compat)
         
     | 
| 
      
 13 
     | 
    
         
            +
                  rescue Oj::Error => err
         
     | 
| 
      
 14 
     | 
    
         
            +
                    raise EncodeError.new(media_type: 'application/json', source: err)
         
     | 
| 
      
 15 
     | 
    
         
            +
                  end
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
                  def decode(obj)
         
     | 
| 
      
 18 
     | 
    
         
            +
                    Oj.load(obj, mode: :strict, symbol_keys: true)
         
     | 
| 
      
 19 
     | 
    
         
            +
                  rescue Oj::Error => err
         
     | 
| 
      
 20 
     | 
    
         
            +
                    raise DecodeError.new(media_type: 'application/json', source: err)
         
     | 
| 
      
 21 
     | 
    
         
            +
                  end
         
     | 
| 
      
 22 
     | 
    
         
            +
                end
         
     | 
| 
      
 23 
     | 
    
         
            +
              end
         
     | 
| 
      
 24 
     | 
    
         
            +
            end
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
            TrailerVote::Api::TypeRegistry['application/json'] = TrailerVote::Api::JsonTypeAdapter
         
     | 
| 
      
 27 
     | 
    
         
            +
            TrailerVote::Api::TypeRegistry.shortcut('application/json', :json)
         
     | 
| 
      
 28 
     | 
    
         
            +
            TrailerVote::Api::TypeRegistry.shortcut('application/json', 'text/json')
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
            module TrailerVote
         
     | 
| 
      
 31 
     | 
    
         
            +
              module Api
         
     | 
| 
      
 32 
     | 
    
         
            +
                module HtmlTypeAdapter
         
     | 
| 
      
 33 
     | 
    
         
            +
                  module_function
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
                  def encode(obj)
         
     | 
| 
      
 36 
     | 
    
         
            +
                    return obj if obj.is_a?(String)
         
     | 
| 
      
 37 
     | 
    
         
            +
                    raise EncodeError.new(
         
     | 
| 
      
 38 
     | 
    
         
            +
                      media_type: 'text/html',
         
     | 
| 
      
 39 
     | 
    
         
            +
                      source: ArgumentError.new('HTML must be passed in as a HTML string')
         
     | 
| 
      
 40 
     | 
    
         
            +
                    )
         
     | 
| 
      
 41 
     | 
    
         
            +
                  end
         
     | 
| 
      
 42 
     | 
    
         
            +
             
     | 
| 
      
 43 
     | 
    
         
            +
                  def decode(str)
         
     | 
| 
      
 44 
     | 
    
         
            +
                    str
         
     | 
| 
      
 45 
     | 
    
         
            +
                  end
         
     | 
| 
      
 46 
     | 
    
         
            +
                end
         
     | 
| 
      
 47 
     | 
    
         
            +
              end
         
     | 
| 
      
 48 
     | 
    
         
            +
            end
         
     | 
| 
      
 49 
     | 
    
         
            +
             
     | 
| 
      
 50 
     | 
    
         
            +
            TrailerVote::Api::TypeRegistry['text/html'] = TrailerVote::Api::HtmlTypeAdapter
         
     |