my_api_client 0.16.0 → 0.20.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 +4 -4
- data/.circleci/config.yml +95 -135
- data/.gem_comet.yml +13 -2
- data/.rubocop.yml +5 -1
- data/.rubocop_todo.yml +39 -1
- data/CHANGELOG.md +142 -0
- data/Gemfile +0 -3
- data/Gemfile.lock +70 -64
- data/README.jp.md +126 -5
- data/bin/console +4 -0
- data/example/api_clients/application_api_client.rb +2 -2
- data/example/api_clients/my_rest_api_client.rb +9 -3
- data/gemfiles/{rails_4.2.gemfile → rails_6.1.gemfile} +1 -1
- data/lib/generators/rails/USAGE +1 -1
- data/lib/generators/rails/api_client_generator.rb +6 -0
- data/lib/generators/rails/templates/api_client.rb.erb +1 -1
- data/lib/generators/rspec/USAGE +1 -1
- data/lib/generators/rspec/api_client_generator.rb +6 -0
- data/lib/generators/rspec/templates/api_client_spec.rb.erb +23 -16
- data/lib/my_api_client/base.rb +2 -9
- data/lib/my_api_client/error_handling/generator.rb +0 -2
- data/lib/my_api_client/errors.rb +1 -0
- data/lib/my_api_client/integrations/bugsnag.rb +1 -1
- data/lib/my_api_client/params/params.rb +1 -3
- data/lib/my_api_client/request.rb +3 -3
- data/lib/my_api_client/request/basic.rb +1 -3
- data/lib/my_api_client/request/executor.rb +1 -1
- data/lib/my_api_client/rspec/matchers/request_to.rb +1 -1
- data/lib/my_api_client/rspec/stub.rb +30 -9
- data/lib/my_api_client/version.rb +1 -1
- data/my_api/.ruby-version +1 -1
- data/my_api/Gemfile +3 -0
- data/my_api/Gemfile.lock +116 -108
- data/my_api/app/controllers/pagination_controller.rb +2 -2
- data/my_api/spec/controllers/rest_controller_spec.rb +23 -5
- data/my_api_client.gemspec +3 -3
- data/rails_app/rails_5.2/.rspec +3 -0
- data/rails_app/rails_5.2/Gemfile +17 -0
- data/rails_app/rails_5.2/Gemfile.lock +174 -0
- data/rails_app/rails_5.2/README.md +24 -0
- data/rails_app/rails_5.2/Rakefile +8 -0
- data/rails_app/rails_5.2/app/controllers/application_controller.rb +4 -0
- data/rails_app/rails_5.2/app/jobs/application_job.rb +4 -0
- data/rails_app/rails_5.2/bin/bundle +5 -0
- data/rails_app/rails_5.2/bin/rails +6 -0
- data/rails_app/rails_5.2/bin/rake +6 -0
- data/rails_app/rails_5.2/bin/setup +27 -0
- data/rails_app/rails_5.2/bin/update +27 -0
- data/rails_app/rails_5.2/config.ru +7 -0
- data/rails_app/rails_5.2/config/application.rb +37 -0
- data/rails_app/rails_5.2/config/boot.rb +6 -0
- data/rails_app/rails_5.2/config/credentials.yml.enc +1 -0
- data/rails_app/rails_5.2/config/environment.rb +7 -0
- data/rails_app/rails_5.2/config/environments/development.rb +41 -0
- data/rails_app/rails_5.2/config/environments/production.rb +70 -0
- data/rails_app/rails_5.2/config/environments/test.rb +38 -0
- data/rails_app/rails_5.2/config/initializers/application_controller_renderer.rb +9 -0
- data/rails_app/rails_5.2/config/initializers/backtrace_silencers.rb +8 -0
- data/rails_app/rails_5.2/config/initializers/cors.rb +17 -0
- data/rails_app/rails_5.2/config/initializers/filter_parameter_logging.rb +6 -0
- data/rails_app/rails_5.2/config/initializers/inflections.rb +17 -0
- data/rails_app/rails_5.2/config/initializers/mime_types.rb +5 -0
- data/rails_app/rails_5.2/config/initializers/wrap_parameters.rb +11 -0
- data/rails_app/rails_5.2/config/locales/en.yml +33 -0
- data/rails_app/rails_5.2/config/routes.rb +5 -0
- data/rails_app/rails_5.2/config/spring.rb +8 -0
- data/rails_app/rails_5.2/public/robots.txt +1 -0
- data/rails_app/rails_5.2/spec/rails_helper.rb +14 -0
- data/rails_app/rails_5.2/spec/spec_helper.rb +13 -0
- data/rails_app/rails_6.0/.rspec +3 -0
- data/rails_app/rails_6.0/Gemfile +17 -0
- data/rails_app/rails_6.0/Gemfile.lock +190 -0
- data/rails_app/rails_6.0/README.md +24 -0
- data/rails_app/rails_6.0/Rakefile +8 -0
- data/rails_app/rails_6.0/app/controllers/application_controller.rb +4 -0
- data/rails_app/rails_6.0/app/jobs/application_job.rb +9 -0
- data/rails_app/rails_6.0/bin/rails +6 -0
- data/rails_app/rails_6.0/bin/rake +6 -0
- data/rails_app/rails_6.0/bin/setup +27 -0
- data/rails_app/rails_6.0/config.ru +7 -0
- data/rails_app/rails_6.0/config/application.rb +39 -0
- data/rails_app/rails_6.0/config/boot.rb +6 -0
- data/rails_app/rails_6.0/config/credentials.yml.enc +1 -0
- data/rails_app/rails_6.0/config/environment.rb +7 -0
- data/rails_app/rails_6.0/config/environments/development.rb +39 -0
- data/rails_app/rails_6.0/config/environments/production.rb +90 -0
- data/rails_app/rails_6.0/config/environments/test.rb +41 -0
- data/rails_app/rails_6.0/config/initializers/application_controller_renderer.rb +9 -0
- data/rails_app/rails_6.0/config/initializers/backtrace_silencers.rb +8 -0
- data/rails_app/rails_6.0/config/initializers/cors.rb +17 -0
- data/rails_app/rails_6.0/config/initializers/filter_parameter_logging.rb +6 -0
- data/rails_app/rails_6.0/config/initializers/inflections.rb +17 -0
- data/rails_app/rails_6.0/config/initializers/mime_types.rb +5 -0
- data/rails_app/rails_6.0/config/initializers/wrap_parameters.rb +11 -0
- data/rails_app/rails_6.0/config/locales/en.yml +33 -0
- data/rails_app/rails_6.0/config/routes.rb +5 -0
- data/rails_app/rails_6.0/config/spring.rb +8 -0
- data/rails_app/rails_6.0/public/robots.txt +1 -0
- data/rails_app/rails_6.0/spec/rails_helper.rb +14 -0
- data/rails_app/rails_6.0/spec/spec_helper.rb +13 -0
- data/rails_app/rails_6.1/.gitattributes +8 -0
- data/rails_app/rails_6.1/.gitignore +28 -0
- data/rails_app/rails_6.1/.rspec +3 -0
- data/rails_app/rails_6.1/Gemfile +17 -0
- data/rails_app/rails_6.1/Gemfile.lock +197 -0
- data/rails_app/rails_6.1/README.md +24 -0
- data/rails_app/rails_6.1/Rakefile +6 -0
- data/rails_app/rails_6.1/app/controllers/application_controller.rb +4 -0
- data/rails_app/rails_6.1/app/controllers/concerns/.keep +0 -0
- data/rails_app/rails_6.1/app/javascript/.keep +0 -0
- data/rails_app/rails_6.1/app/models/application_record.rb +5 -0
- data/rails_app/rails_6.1/app/models/concerns/.keep +0 -0
- data/rails_app/rails_6.1/bin/bundle +114 -0
- data/rails_app/rails_6.1/bin/rails +4 -0
- data/rails_app/rails_6.1/bin/rake +4 -0
- data/rails_app/rails_6.1/bin/setup +33 -0
- data/rails_app/rails_6.1/config.ru +6 -0
- data/rails_app/rails_6.1/config/application.rb +42 -0
- data/rails_app/rails_6.1/config/boot.rb +5 -0
- data/rails_app/rails_6.1/config/credentials.yml.enc +1 -0
- data/rails_app/rails_6.1/config/database.yml +25 -0
- data/rails_app/rails_6.1/config/environment.rb +7 -0
- data/rails_app/rails_6.1/config/environments/development.rb +59 -0
- data/rails_app/rails_6.1/config/environments/production.rb +97 -0
- data/rails_app/rails_6.1/config/environments/test.rb +51 -0
- data/rails_app/rails_6.1/config/initializers/application_controller_renderer.rb +9 -0
- data/rails_app/rails_6.1/config/initializers/backtrace_silencers.rb +10 -0
- data/rails_app/rails_6.1/config/initializers/cors.rb +17 -0
- data/rails_app/rails_6.1/config/initializers/filter_parameter_logging.rb +8 -0
- data/rails_app/rails_6.1/config/initializers/inflections.rb +17 -0
- data/rails_app/rails_6.1/config/initializers/mime_types.rb +5 -0
- data/rails_app/rails_6.1/config/initializers/wrap_parameters.rb +16 -0
- data/rails_app/rails_6.1/config/locales/en.yml +33 -0
- data/rails_app/rails_6.1/config/routes.rb +5 -0
- data/rails_app/rails_6.1/db/seeds.rb +8 -0
- data/rails_app/rails_6.1/lib/tasks/.keep +0 -0
- data/rails_app/rails_6.1/public/robots.txt +1 -0
- data/rails_app/rails_6.1/spec/rails_helper.rb +14 -0
- data/rails_app/rails_6.1/spec/spec_helper.rb +13 -0
- data/rails_app/rails_6.1/tmp/.keep +0 -0
- data/rails_app/rails_6.1/tmp/pids/.keep +0 -0
- data/rails_app/rails_6.1/vendor/.keep +0 -0
- metadata +115 -9
| @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            # frozen_string_literal: true
         | 
| 2 2 |  | 
| 3 3 | 
             
            class <%= "#{class_name}ApiClient" %> < ::ApplicationApiClient
         | 
| 4 | 
            -
              endpoint ' | 
| 4 | 
            +
              endpoint '<%= options[:endpoint] %>'
         | 
| 5 5 |  | 
| 6 6 | 
             
              # error_handling json: { '$.errors.code': 10 } do |params, logger|
         | 
| 7 7 | 
             
              #   # Behavior when detected an error.
         | 
    
        data/lib/generators/rspec/USAGE
    CHANGED
    
    | @@ -2,7 +2,7 @@ Description: | |
| 2 2 | 
             
                Generate a new api client spec files.
         | 
| 3 3 |  | 
| 4 4 | 
             
            Example:
         | 
| 5 | 
            -
                rails g rspec:api_client path/to/resource get:path/to/resource`
         | 
| 5 | 
            +
                rails g rspec:api_client path/to/resource get:path/to/resource` --endpoint https://example.com
         | 
| 6 6 |  | 
| 7 7 | 
             
                This will create:
         | 
| 8 8 | 
             
                    create  spec/api_clients/path/to/resource_api_client_spec.rb
         | 
| @@ -16,6 +16,12 @@ module Rspec | |
| 16 16 | 
             
                           default: %w[get:path/to/resource post:path/to/resource],
         | 
| 17 17 | 
             
                           banner: '{method}:{path} {method}:{path}'
         | 
| 18 18 |  | 
| 19 | 
            +
                  class_option :endpoint,
         | 
| 20 | 
            +
                               type: :string,
         | 
| 21 | 
            +
                               default: 'https://example.com',
         | 
| 22 | 
            +
                               banner: 'https://example.com',
         | 
| 23 | 
            +
                               desc: 'Common part of the target API endpoint'
         | 
| 24 | 
            +
             | 
| 19 25 | 
             
                  class_option :api_client_specs, type: :boolean, default: true
         | 
| 20 26 |  | 
| 21 27 | 
             
                  def generate_api_client_spec
         | 
| @@ -11,16 +11,28 @@ RSpec.describe <%= "#{class_name}ApiClient" %>, <%= type_metatag(:api_client) %> | |
| 11 11 | 
             
              end
         | 
| 12 12 |  | 
| 13 13 | 
             
              shared_examples 'to handle errors' do
         | 
| 14 | 
            -
                 | 
| 15 | 
            -
                   | 
| 16 | 
            -
                     | 
| 17 | 
            -
             | 
| 14 | 
            +
                context 'when the API returns 200 OK' do
         | 
| 15 | 
            +
                  it do
         | 
| 16 | 
            +
                    expect { api_request }
         | 
| 17 | 
            +
                      .not_to be_handled_as_an_error
         | 
| 18 | 
            +
                      .when_receive(status_code: 200)
         | 
| 19 | 
            +
                  end
         | 
| 18 20 | 
             
                end
         | 
| 19 21 |  | 
| 20 | 
            -
                 | 
| 21 | 
            -
                   | 
| 22 | 
            -
                     | 
| 23 | 
            -
             | 
| 22 | 
            +
                context 'when the API returns 400 Bad Request' do
         | 
| 23 | 
            +
                  it do
         | 
| 24 | 
            +
                    expect { api_request }
         | 
| 25 | 
            +
                      .to be_handled_as_an_error(MyApiClient::ClientError::BadRequest)
         | 
| 26 | 
            +
                      .when_receive(status_code: 400)
         | 
| 27 | 
            +
                  end
         | 
| 28 | 
            +
                end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                context 'when the API returns 500 Internal Server Error' do
         | 
| 31 | 
            +
                  it do
         | 
| 32 | 
            +
                    expect { api_request }
         | 
| 33 | 
            +
                      .to be_handled_as_an_error(MyApiClient::ServerError::InternalServerError)
         | 
| 34 | 
            +
                      .when_receive(status_code: 500)
         | 
| 35 | 
            +
                  end
         | 
| 24 36 | 
             
                end
         | 
| 25 37 | 
             
              end
         | 
| 26 38 | 
             
            <% yeild_request_arguments do |action, http_method, pathname| -%>
         | 
| @@ -28,22 +40,17 @@ RSpec.describe <%= "#{class_name}ApiClient" %>, <%= type_metatag(:api_client) %> | |
| 28 40 | 
             
              describe '#<%= action %>' do
         | 
| 29 41 | 
             
                subject(:api_request) { api_client.<%= action %> }
         | 
| 30 42 |  | 
| 43 | 
            +
                it_behaves_like 'to handle errors'
         | 
| 44 | 
            +
             | 
| 31 45 | 
             
                it do
         | 
| 32 46 | 
             
                  expect { api_request }
         | 
| 33 | 
            -
                    .to request_to(:<%= http_method %>, ' | 
| 47 | 
            +
                    .to request_to(:<%= http_method %>, '<%= options[:endpoint] %>/<%= pathname %>')
         | 
| 34 48 | 
             
            <% if http_method == 'get' -%>
         | 
| 35 49 | 
             
                    .with(headers: headers, query: {})
         | 
| 36 50 | 
             
            <% else -%>
         | 
| 37 51 | 
             
                    .with(headers: headers, body: {})
         | 
| 38 52 | 
             
            <% end -%>
         | 
| 39 53 | 
             
                end
         | 
| 40 | 
            -
             | 
| 41 | 
            -
                it_behaves_like 'to handle errors' do
         | 
| 42 | 
            -
                  it do
         | 
| 43 | 
            -
                    expect { api_request }.not_to be_handled_as_an_error
         | 
| 44 | 
            -
                      .when_receive(status_code: 200, body: nil, headers: nil)
         | 
| 45 | 
            -
                  end
         | 
| 46 | 
            -
                end
         | 
| 47 54 | 
             
              end
         | 
| 48 55 | 
             
            <% end -%>
         | 
| 49 56 | 
             
            end
         | 
    
        data/lib/my_api_client/base.rb
    CHANGED
    
    | @@ -8,15 +8,8 @@ module MyApiClient | |
| 8 8 | 
             
                include MyApiClient::Exceptions
         | 
| 9 9 | 
             
                include MyApiClient::Request
         | 
| 10 10 |  | 
| 11 | 
            -
                 | 
| 12 | 
            -
             | 
| 13 | 
            -
                  class_attribute :error_handlers, instance_writer: false, default: []
         | 
| 14 | 
            -
                else
         | 
| 15 | 
            -
                  class_attribute :logger
         | 
| 16 | 
            -
                  class_attribute :error_handlers
         | 
| 17 | 
            -
                  self.logger = ::Logger.new(STDOUT)
         | 
| 18 | 
            -
                  self.error_handlers = []
         | 
| 19 | 
            -
                end
         | 
| 11 | 
            +
                class_attribute :logger, instance_writer: false, default: ::Logger.new($stdout)
         | 
| 12 | 
            +
                class_attribute :error_handlers, instance_writer: false, default: []
         | 
| 20 13 |  | 
| 21 14 | 
             
                include MyApiClient::DefaultErrorHandlers
         | 
| 22 15 |  | 
| @@ -85,7 +85,6 @@ module MyApiClient | |
| 85 85 | 
             
                    end
         | 
| 86 86 | 
             
                  end
         | 
| 87 87 |  | 
| 88 | 
            -
                  # rubocop:disable Metrics/CyclomaticComplexity
         | 
| 89 88 | 
             
                  def match?(operator, target)
         | 
| 90 89 | 
             
                    case operator
         | 
| 91 90 | 
             
                    when nil
         | 
| @@ -102,7 +101,6 @@ module MyApiClient | |
| 102 101 | 
             
                      raise "Unexpected operator type was given: #{operator.inspect}"
         | 
| 103 102 | 
             
                    end
         | 
| 104 103 | 
             
                  end
         | 
| 105 | 
            -
                  # rubocop:enable Metrics/CyclomaticComplexity
         | 
| 106 104 |  | 
| 107 105 | 
             
                  def match_all?(json, response_body)
         | 
| 108 106 | 
             
                    return true if json.nil?
         | 
    
        data/lib/my_api_client/errors.rb
    CHANGED
    
    
| @@ -40,9 +40,7 @@ module MyApiClient | |
| 40 40 | 
             
                  # @return [Hash] Metadata for bugsnag
         | 
| 41 41 | 
             
                  def request_metadata
         | 
| 42 42 | 
             
                    if request.present?
         | 
| 43 | 
            -
                      request.metadata. | 
| 44 | 
            -
                        memo[:"request_#{key}"] = value
         | 
| 45 | 
            -
                      end
         | 
| 43 | 
            +
                      request.metadata.transform_keys { |key| :"request_#{key}" }
         | 
| 46 44 | 
             
                    else
         | 
| 47 45 | 
             
                      {}
         | 
| 48 46 | 
             
                    end
         | 
| @@ -11,7 +11,7 @@ module MyApiClient | |
| 11 11 | 
             
                # Executes HTTP request with relative URI.
         | 
| 12 12 | 
             
                #
         | 
| 13 13 | 
             
                # @param http_method [Symbol]
         | 
| 14 | 
            -
                #   HTTP method. e.g. `:get`, `:post`, `:patch` and `:delete`.
         | 
| 14 | 
            +
                #   HTTP method. e.g. `:get`, `:post`, `:put`, `:patch` and `:delete`.
         | 
| 15 15 | 
             
                # @param pathname [String]
         | 
| 16 16 | 
             
                #   Pathname of the request target URL.
         | 
| 17 17 | 
             
                #   It's joined with the defined by `endpoint`.
         | 
| @@ -24,7 +24,7 @@ module MyApiClient | |
| 24 24 | 
             
                # @return [Sawyer::Response]
         | 
| 25 25 | 
             
                #   Response instance.
         | 
| 26 26 | 
             
                def _request_with_relative_uri(http_method, pathname, headers, query, body)
         | 
| 27 | 
            -
                  query_strings = query.present? ?  | 
| 27 | 
            +
                  query_strings = query.present? ? "?#{query.to_query}" : ''
         | 
| 28 28 | 
             
                  uri = URI.join(File.join(endpoint, pathname), query_strings)
         | 
| 29 29 | 
             
                  _request_with_absolute_uri(http_method, uri, headers, body)
         | 
| 30 30 | 
             
                end
         | 
| @@ -32,7 +32,7 @@ module MyApiClient | |
| 32 32 | 
             
                # Executes HTTP request with absolute URI.
         | 
| 33 33 | 
             
                #
         | 
| 34 34 | 
             
                # @param http_method [Symbol]
         | 
| 35 | 
            -
                #   HTTP method. e.g. `:get`, `:post`, `:patch` and `:delete`.
         | 
| 35 | 
            +
                #   HTTP method. e.g. `:get`, `:post`, `:put`, `:patch` and `:delete`.
         | 
| 36 36 | 
             
                # @param uri [URI]
         | 
| 37 37 | 
             
                #   Request target URI including query strings.
         | 
| 38 38 | 
             
                # @param headers [Hash, nil]
         | 
| @@ -4,7 +4,7 @@ module MyApiClient | |
| 4 4 | 
             
              module Request
         | 
| 5 5 | 
             
                # Provides basic HTTP request method.
         | 
| 6 6 | 
             
                module Basic
         | 
| 7 | 
            -
                  HTTP_METHODS = %i[get post patch delete].freeze
         | 
| 7 | 
            +
                  HTTP_METHODS = %i[get post put patch delete].freeze
         | 
| 8 8 |  | 
| 9 9 | 
             
                  HTTP_METHODS.each do |http_method|
         | 
| 10 10 | 
             
                    class_eval <<~METHOD, __FILE__, __LINE__ + 1
         | 
| @@ -27,8 +27,6 @@ module MyApiClient | |
| 27 27 | 
             
                      end
         | 
| 28 28 | 
             
                    METHOD
         | 
| 29 29 | 
             
                  end
         | 
| 30 | 
            -
             | 
| 31 | 
            -
                  alias put patch
         | 
| 32 30 | 
             
                end
         | 
| 33 31 | 
             
              end
         | 
| 34 32 | 
             
            end
         | 
| @@ -32,7 +32,7 @@ module MyApiClient | |
| 32 32 | 
             
                  def call
         | 
| 33 33 | 
             
                    request_logger.info('Start')
         | 
| 34 34 | 
             
                    response = api_request
         | 
| 35 | 
            -
                    request_logger.info("Duration #{response.timing}  | 
| 35 | 
            +
                    request_logger.info("Duration #{response.timing.in_milliseconds} msec")
         | 
| 36 36 | 
             
                    verify(response)
         | 
| 37 37 | 
             
                  rescue MyApiClient::Error => e
         | 
| 38 38 | 
             
                    request_logger.warn("Failure (#{e.message})")
         | 
| @@ -50,7 +50,7 @@ RSpec::Matchers.define :request_to do |expected_method, expected_url| | |
| 50 50 | 
             
              end
         | 
| 51 51 |  | 
| 52 52 | 
             
              def request_line(method, url, query = nil)
         | 
| 53 | 
            -
                url +=  | 
| 53 | 
            +
                url += "?#{query.to_query}" if query.present?
         | 
| 54 54 | 
             
                "#{method.upcase} #{url}"
         | 
| 55 55 | 
             
              end
         | 
| 56 56 |  | 
| @@ -18,6 +18,9 @@ module MyApiClient | |
| 18 18 | 
             
                # @example
         | 
| 19 19 | 
             
                #   stub_api_client_all(
         | 
| 20 20 | 
             
                #     ExampleApiClient,
         | 
| 21 | 
            +
                #     get_users: {                                     # Returns an arbitrary pageable response
         | 
| 22 | 
            +
                #       pageable: [ { id: 1 }, { id: 2 }]              # for `#pageable_get`.
         | 
| 23 | 
            +
                #     },
         | 
| 21 24 | 
             
                #     get_user: { response: { id: 1 } },               # Returns an arbitrary response.
         | 
| 22 25 | 
             
                #     post_users: { id: 1 },                           # You can ommit `response` keyword.
         | 
| 23 26 | 
             
                #     patch_user: ->(params) { { id: params[:id] } },  # Returns calculated result as response.
         | 
| @@ -46,6 +49,9 @@ module MyApiClient | |
| 46 49 | 
             
                # @example
         | 
| 47 50 | 
             
                #   api_client = stub_api_client(
         | 
| 48 51 | 
             
                #     ExampleApiClient,
         | 
| 52 | 
            +
                #     get_users: {                                     # Returns an arbitrary pageable response
         | 
| 53 | 
            +
                #       pageable: [ { id: 1 }, { id: 2 }]              # for `#pageable_get`.
         | 
| 54 | 
            +
                #     },
         | 
| 49 55 | 
             
                #     get_user: { response: { id: 1 } },               # Returns an arbitrary response.
         | 
| 50 56 | 
             
                #     post_users: { id: 1 },                           # You can ommit `response` keyword.
         | 
| 51 57 | 
             
                #     patch_user: ->(params) { { id: params[:id] } },  # Returns calculated result as response.
         | 
| @@ -67,25 +73,40 @@ module MyApiClient | |
| 67 73 |  | 
| 68 74 | 
             
                private
         | 
| 69 75 |  | 
| 70 | 
            -
                # rubocop:disable Metrics/AbcSize
         | 
| 71 76 | 
             
                def stubbing(instance, action, options)
         | 
| 77 | 
            +
                  allow(instance).to receive(action) do |*request|
         | 
| 78 | 
            +
                    generate_stubbed_response(options, *request)
         | 
| 79 | 
            +
                  end
         | 
| 80 | 
            +
                end
         | 
| 81 | 
            +
             | 
| 82 | 
            +
                def generate_stubbed_response(options, *request) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
         | 
| 72 83 | 
             
                  case options
         | 
| 73 84 | 
             
                  when Proc
         | 
| 74 | 
            -
                     | 
| 85 | 
            +
                    stub_as_resource(options.call(*request))
         | 
| 75 86 | 
             
                  when Hash
         | 
| 76 | 
            -
                    if options[:raise] | 
| 77 | 
            -
                       | 
| 78 | 
            -
                      allow(instance).to receive(action).and_raise(exception)
         | 
| 87 | 
            +
                    if options[:raise] # rubocop:disable Style/GuardClause
         | 
| 88 | 
            +
                      raise process_raise_option(options[:raise], options[:response])
         | 
| 79 89 | 
             
                    elsif options[:response]
         | 
| 80 | 
            -
                       | 
| 90 | 
            +
                      stub_as_resource(options[:response])
         | 
| 91 | 
            +
                    elsif options[:pageable].is_a?(Enumerable)
         | 
| 92 | 
            +
                      stub_as_pageable_resource(options[:pageable].each, *request)
         | 
| 81 93 | 
             
                    else
         | 
| 82 | 
            -
                       | 
| 94 | 
            +
                      stub_as_resource(options)
         | 
| 83 95 | 
             
                    end
         | 
| 84 96 | 
             
                  else
         | 
| 85 | 
            -
                     | 
| 97 | 
            +
                    stub_as_resource(options)
         | 
| 86 98 | 
             
                  end
         | 
| 87 99 | 
             
                end
         | 
| 88 | 
            -
             | 
| 100 | 
            +
             | 
| 101 | 
            +
                def stub_as_pageable_resource(pager, *request)
         | 
| 102 | 
            +
                  Enumerator.new do |y|
         | 
| 103 | 
            +
                    loop do
         | 
| 104 | 
            +
                      y << generate_stubbed_response(pager.next, *request)
         | 
| 105 | 
            +
                    rescue StopIteration
         | 
| 106 | 
            +
                      break
         | 
| 107 | 
            +
                    end
         | 
| 108 | 
            +
                  end.lazy
         | 
| 109 | 
            +
                end
         | 
| 89 110 |  | 
| 90 111 | 
             
                # Provides a shorthand for `raise` option.
         | 
| 91 112 | 
             
                # `MyApiClient::Error` requires `MyApiClient::Params::Params` instance on
         | 
    
        data/my_api/.ruby-version
    CHANGED
    
    | @@ -1 +1 @@ | |
| 1 | 
            -
            2. | 
| 1 | 
            +
            2.7.2
         | 
    
        data/my_api/Gemfile
    CHANGED
    
    | @@ -6,6 +6,9 @@ gem 'jets' | |
| 6 6 |  | 
| 7 7 | 
             
            gem 'dynomite'
         | 
| 8 8 |  | 
| 9 | 
            +
            # See: https://github.com/boltops-tools/jets/issues/523
         | 
| 10 | 
            +
            gem 'nokogiri', '~> 1.11.0'
         | 
| 11 | 
            +
             | 
| 9 12 | 
             
            # development and test groups are not bundled as part of the deployment
         | 
| 10 13 | 
             
            group :development, :test do
         | 
| 11 14 | 
             
              # Call 'byebug' anywhere in the code to stop execution and get a debugger console
         | 
    
        data/my_api/Gemfile.lock
    CHANGED
    
    | @@ -1,43 +1,44 @@ | |
| 1 1 | 
             
            GEM
         | 
| 2 2 | 
             
              remote: https://rubygems.org/
         | 
| 3 3 | 
             
              specs:
         | 
| 4 | 
            -
                actionmailer (6. | 
| 5 | 
            -
                  actionpack (= 6. | 
| 6 | 
            -
                  actionview (= 6. | 
| 7 | 
            -
                  activejob (= 6. | 
| 4 | 
            +
                actionmailer (6.1.2.1)
         | 
| 5 | 
            +
                  actionpack (= 6.1.2.1)
         | 
| 6 | 
            +
                  actionview (= 6.1.2.1)
         | 
| 7 | 
            +
                  activejob (= 6.1.2.1)
         | 
| 8 | 
            +
                  activesupport (= 6.1.2.1)
         | 
| 8 9 | 
             
                  mail (~> 2.5, >= 2.5.4)
         | 
| 9 10 | 
             
                  rails-dom-testing (~> 2.0)
         | 
| 10 | 
            -
                actionpack (6. | 
| 11 | 
            -
                  actionview (= 6. | 
| 12 | 
            -
                  activesupport (= 6. | 
| 13 | 
            -
                  rack (~> 2.0, >= 2.0. | 
| 11 | 
            +
                actionpack (6.1.2.1)
         | 
| 12 | 
            +
                  actionview (= 6.1.2.1)
         | 
| 13 | 
            +
                  activesupport (= 6.1.2.1)
         | 
| 14 | 
            +
                  rack (~> 2.0, >= 2.0.9)
         | 
| 14 15 | 
             
                  rack-test (>= 0.6.3)
         | 
| 15 16 | 
             
                  rails-dom-testing (~> 2.0)
         | 
| 16 17 | 
             
                  rails-html-sanitizer (~> 1.0, >= 1.2.0)
         | 
| 17 | 
            -
                actionview (6. | 
| 18 | 
            -
                  activesupport (= 6. | 
| 18 | 
            +
                actionview (6.1.2.1)
         | 
| 19 | 
            +
                  activesupport (= 6.1.2.1)
         | 
| 19 20 | 
             
                  builder (~> 3.1)
         | 
| 20 21 | 
             
                  erubi (~> 1.4)
         | 
| 21 22 | 
             
                  rails-dom-testing (~> 2.0)
         | 
| 22 23 | 
             
                  rails-html-sanitizer (~> 1.1, >= 1.2.0)
         | 
| 23 | 
            -
                activejob (6. | 
| 24 | 
            -
                  activesupport (= 6. | 
| 24 | 
            +
                activejob (6.1.2.1)
         | 
| 25 | 
            +
                  activesupport (= 6.1.2.1)
         | 
| 25 26 | 
             
                  globalid (>= 0.3.6)
         | 
| 26 | 
            -
                activemodel (6. | 
| 27 | 
            -
                  activesupport (= 6. | 
| 28 | 
            -
                activerecord (6. | 
| 29 | 
            -
                  activemodel (= 6. | 
| 30 | 
            -
                  activesupport (= 6. | 
| 31 | 
            -
                activesupport (6. | 
| 27 | 
            +
                activemodel (6.1.2.1)
         | 
| 28 | 
            +
                  activesupport (= 6.1.2.1)
         | 
| 29 | 
            +
                activerecord (6.1.2.1)
         | 
| 30 | 
            +
                  activemodel (= 6.1.2.1)
         | 
| 31 | 
            +
                  activesupport (= 6.1.2.1)
         | 
| 32 | 
            +
                activesupport (6.1.2.1)
         | 
| 32 33 | 
             
                  concurrent-ruby (~> 1.0, >= 1.0.2)
         | 
| 33 | 
            -
                  i18n (>=  | 
| 34 | 
            -
                  minitest ( | 
| 35 | 
            -
                  tzinfo (~>  | 
| 36 | 
            -
                  zeitwerk (~> 2. | 
| 34 | 
            +
                  i18n (>= 1.6, < 2)
         | 
| 35 | 
            +
                  minitest (>= 5.1)
         | 
| 36 | 
            +
                  tzinfo (~> 2.0)
         | 
| 37 | 
            +
                  zeitwerk (~> 2.3)
         | 
| 37 38 | 
             
                addressable (2.7.0)
         | 
| 38 39 | 
             
                  public_suffix (>= 2.0.2, < 5.0)
         | 
| 39 | 
            -
                aws-eventstream (1.0 | 
| 40 | 
            -
                aws-mfa-secure (0.4. | 
| 40 | 
            +
                aws-eventstream (1.1.0)
         | 
| 41 | 
            +
                aws-mfa-secure (0.4.3)
         | 
| 41 42 | 
             
                  activesupport
         | 
| 42 43 | 
             
                  aws-sdk-core
         | 
| 43 44 | 
             
                  aws_config
         | 
| @@ -45,85 +46,87 @@ GEM | |
| 45 46 | 
             
                  rainbow
         | 
| 46 47 | 
             
                  thor
         | 
| 47 48 | 
             
                  zeitwerk
         | 
| 48 | 
            -
                aws-partitions (1. | 
| 49 | 
            -
                aws-sdk-apigateway (1. | 
| 50 | 
            -
                  aws-sdk-core (~> 3, >= 3. | 
| 49 | 
            +
                aws-partitions (1.416.0)
         | 
| 50 | 
            +
                aws-sdk-apigateway (1.58.0)
         | 
| 51 | 
            +
                  aws-sdk-core (~> 3, >= 3.109.0)
         | 
| 51 52 | 
             
                  aws-sigv4 (~> 1.1)
         | 
| 52 | 
            -
                aws-sdk-cloudformation (1. | 
| 53 | 
            -
                  aws-sdk-core (~> 3, >= 3. | 
| 53 | 
            +
                aws-sdk-cloudformation (1.46.0)
         | 
| 54 | 
            +
                  aws-sdk-core (~> 3, >= 3.109.0)
         | 
| 54 55 | 
             
                  aws-sigv4 (~> 1.1)
         | 
| 55 | 
            -
                aws-sdk-cloudwatchlogs (1. | 
| 56 | 
            -
                  aws-sdk-core (~> 3, >= 3. | 
| 56 | 
            +
                aws-sdk-cloudwatchlogs (1.38.0)
         | 
| 57 | 
            +
                  aws-sdk-core (~> 3, >= 3.109.0)
         | 
| 57 58 | 
             
                  aws-sigv4 (~> 1.1)
         | 
| 58 | 
            -
                aws-sdk-core (3. | 
| 59 | 
            -
                  aws-eventstream (~> 1 | 
| 59 | 
            +
                aws-sdk-core (3.111.0)
         | 
| 60 | 
            +
                  aws-eventstream (~> 1, >= 1.0.2)
         | 
| 60 61 | 
             
                  aws-partitions (~> 1, >= 1.239.0)
         | 
| 61 62 | 
             
                  aws-sigv4 (~> 1.1)
         | 
| 62 63 | 
             
                  jmespath (~> 1.0)
         | 
| 63 | 
            -
                aws-sdk-dynamodb (1. | 
| 64 | 
            -
                  aws-sdk-core (~> 3, >= 3. | 
| 64 | 
            +
                aws-sdk-dynamodb (1.58.0)
         | 
| 65 | 
            +
                  aws-sdk-core (~> 3, >= 3.109.0)
         | 
| 65 66 | 
             
                  aws-sigv4 (~> 1.1)
         | 
| 66 | 
            -
                aws-sdk-kinesis (1. | 
| 67 | 
            -
                  aws-sdk-core (~> 3, >= 3. | 
| 67 | 
            +
                aws-sdk-kinesis (1.30.0)
         | 
| 68 | 
            +
                  aws-sdk-core (~> 3, >= 3.109.0)
         | 
| 68 69 | 
             
                  aws-sigv4 (~> 1.1)
         | 
| 69 | 
            -
                aws-sdk-kms (1. | 
| 70 | 
            -
                  aws-sdk-core (~> 3, >= 3. | 
| 70 | 
            +
                aws-sdk-kms (1.41.0)
         | 
| 71 | 
            +
                  aws-sdk-core (~> 3, >= 3.109.0)
         | 
| 71 72 | 
             
                  aws-sigv4 (~> 1.1)
         | 
| 72 | 
            -
                aws-sdk-lambda (1. | 
| 73 | 
            -
                  aws-sdk-core (~> 3, >= 3. | 
| 73 | 
            +
                aws-sdk-lambda (1.57.0)
         | 
| 74 | 
            +
                  aws-sdk-core (~> 3, >= 3.109.0)
         | 
| 74 75 | 
             
                  aws-sigv4 (~> 1.1)
         | 
| 75 | 
            -
                aws-sdk-s3 (1. | 
| 76 | 
            -
                  aws-sdk-core (~> 3, >= 3. | 
| 76 | 
            +
                aws-sdk-s3 (1.87.0)
         | 
| 77 | 
            +
                  aws-sdk-core (~> 3, >= 3.109.0)
         | 
| 77 78 | 
             
                  aws-sdk-kms (~> 1)
         | 
| 78 79 | 
             
                  aws-sigv4 (~> 1.1)
         | 
| 79 | 
            -
                aws-sdk-sns (1. | 
| 80 | 
            -
                  aws-sdk-core (~> 3, >= 3. | 
| 80 | 
            +
                aws-sdk-sns (1.36.0)
         | 
| 81 | 
            +
                  aws-sdk-core (~> 3, >= 3.109.0)
         | 
| 81 82 | 
             
                  aws-sigv4 (~> 1.1)
         | 
| 82 | 
            -
                aws-sdk-sqs (1. | 
| 83 | 
            -
                  aws-sdk-core (~> 3, >= 3. | 
| 83 | 
            +
                aws-sdk-sqs (1.35.0)
         | 
| 84 | 
            +
                  aws-sdk-core (~> 3, >= 3.109.0)
         | 
| 84 85 | 
             
                  aws-sigv4 (~> 1.1)
         | 
| 85 | 
            -
                aws-sdk-ssm (1. | 
| 86 | 
            -
                  aws-sdk-core (~> 3, >= 3. | 
| 86 | 
            +
                aws-sdk-ssm (1.101.0)
         | 
| 87 | 
            +
                  aws-sdk-core (~> 3, >= 3.109.0)
         | 
| 87 88 | 
             
                  aws-sigv4 (~> 1.1)
         | 
| 88 | 
            -
                aws-sigv4 (1. | 
| 89 | 
            -
                  aws-eventstream (~> 1 | 
| 89 | 
            +
                aws-sigv4 (1.2.2)
         | 
| 90 | 
            +
                  aws-eventstream (~> 1, >= 1.0.2)
         | 
| 90 91 | 
             
                aws_config (0.1.0)
         | 
| 91 92 | 
             
                builder (3.2.4)
         | 
| 92 | 
            -
                byebug (11.1. | 
| 93 | 
            -
                capybara (3. | 
| 93 | 
            +
                byebug (11.1.3)
         | 
| 94 | 
            +
                capybara (3.35.3)
         | 
| 94 95 | 
             
                  addressable
         | 
| 95 96 | 
             
                  mini_mime (>= 0.1.3)
         | 
| 96 97 | 
             
                  nokogiri (~> 1.8)
         | 
| 97 98 | 
             
                  rack (>= 1.6.0)
         | 
| 98 99 | 
             
                  rack-test (>= 0.6.3)
         | 
| 99 | 
            -
                  regexp_parser ( | 
| 100 | 
            +
                  regexp_parser (>= 1.5, < 3.0)
         | 
| 100 101 | 
             
                  xpath (~> 3.2)
         | 
| 102 | 
            +
                cfn-status (0.4.2)
         | 
| 103 | 
            +
                  aws-sdk-cloudformation
         | 
| 101 104 | 
             
                cfn_camelizer (0.4.9)
         | 
| 102 105 | 
             
                  activesupport
         | 
| 103 106 | 
             
                  memoist
         | 
| 104 107 | 
             
                  rainbow
         | 
| 105 | 
            -
                 | 
| 106 | 
            -
                concurrent-ruby (1.1. | 
| 108 | 
            +
                cfn_response (0.2.0)
         | 
| 109 | 
            +
                concurrent-ruby (1.1.8)
         | 
| 107 110 | 
             
                crass (1.0.6)
         | 
| 108 | 
            -
                diff-lcs (1. | 
| 109 | 
            -
                dotenv (2.7. | 
| 110 | 
            -
                dynomite (1.2. | 
| 111 | 
            +
                diff-lcs (1.4.4)
         | 
| 112 | 
            +
                dotenv (2.7.6)
         | 
| 113 | 
            +
                dynomite (1.2.6)
         | 
| 111 114 | 
             
                  activesupport
         | 
| 112 115 | 
             
                  aws-sdk-dynamodb
         | 
| 113 116 | 
             
                  rainbow
         | 
| 114 | 
            -
                erubi (1. | 
| 117 | 
            +
                erubi (1.10.0)
         | 
| 115 118 | 
             
                gems (1.2.0)
         | 
| 116 119 | 
             
                globalid (0.4.2)
         | 
| 117 120 | 
             
                  activesupport (>= 4.2.0)
         | 
| 118 121 | 
             
                hashie (4.1.0)
         | 
| 119 | 
            -
                i18n (1.8. | 
| 122 | 
            +
                i18n (1.8.8)
         | 
| 120 123 | 
             
                  concurrent-ruby (~> 1.0)
         | 
| 121 | 
            -
                jets ( | 
| 122 | 
            -
                  actionmailer (~> 6. | 
| 123 | 
            -
                  actionpack (~> 6. | 
| 124 | 
            -
                  actionview (~> 6. | 
| 125 | 
            -
                  activerecord (~> 6. | 
| 126 | 
            -
                  activesupport (~> 6. | 
| 124 | 
            +
                jets (3.0.2)
         | 
| 125 | 
            +
                  actionmailer (~> 6.1.0)
         | 
| 126 | 
            +
                  actionpack (~> 6.1.0)
         | 
| 127 | 
            +
                  actionview (~> 6.1.0)
         | 
| 128 | 
            +
                  activerecord (~> 6.1.0)
         | 
| 129 | 
            +
                  activesupport (~> 6.1.0)
         | 
| 127 130 | 
             
                  aws-mfa-secure (~> 0.4.0)
         | 
| 128 131 | 
             
                  aws-sdk-apigateway
         | 
| 129 132 | 
             
                  aws-sdk-cloudformation
         | 
| @@ -135,52 +138,52 @@ GEM | |
| 135 138 | 
             
                  aws-sdk-sns
         | 
| 136 139 | 
             
                  aws-sdk-sqs
         | 
| 137 140 | 
             
                  aws-sdk-ssm
         | 
| 141 | 
            +
                  cfn-status
         | 
| 138 142 | 
             
                  cfn_camelizer (~> 0.4.6)
         | 
| 139 | 
            -
                   | 
| 143 | 
            +
                  cfn_response
         | 
| 140 144 | 
             
                  dotenv
         | 
| 141 145 | 
             
                  gems
         | 
| 142 146 | 
             
                  hashie
         | 
| 143 | 
            -
                  jets-gems
         | 
| 144 147 | 
             
                  jets-html-sanitizer
         | 
| 145 | 
            -
                  json
         | 
| 146 148 | 
             
                  kramdown
         | 
| 147 149 | 
             
                  memoist
         | 
| 148 150 | 
             
                  mimemagic
         | 
| 149 151 | 
             
                  rack
         | 
| 150 | 
            -
                  railties (~> 6. | 
| 152 | 
            +
                  railties (~> 6.1.0)
         | 
| 151 153 | 
             
                  rainbow
         | 
| 152 154 | 
             
                  recursive-open-struct
         | 
| 155 | 
            +
                  serverlessgems (~> 0.1.2)
         | 
| 153 156 | 
             
                  shotgun
         | 
| 154 157 | 
             
                  text-table
         | 
| 155 158 | 
             
                  thor
         | 
| 156 159 | 
             
                  zeitwerk
         | 
| 157 | 
            -
                jets-gems (0.2.2)
         | 
| 158 | 
            -
                  gems
         | 
| 159 160 | 
             
                jets-html-sanitizer (1.0.4)
         | 
| 160 161 | 
             
                  loofah (~> 2.2, >= 2.2.2)
         | 
| 161 162 | 
             
                jmespath (1.4.0)
         | 
| 162 | 
            -
                 | 
| 163 | 
            -
             | 
| 163 | 
            +
                kramdown (2.3.0)
         | 
| 164 | 
            +
                  rexml
         | 
| 164 165 | 
             
                launchy (2.5.0)
         | 
| 165 166 | 
             
                  addressable (~> 2.7)
         | 
| 166 | 
            -
                loofah (2. | 
| 167 | 
            +
                loofah (2.9.0)
         | 
| 167 168 | 
             
                  crass (~> 1.0.2)
         | 
| 168 169 | 
             
                  nokogiri (>= 1.5.9)
         | 
| 169 170 | 
             
                mail (2.7.1)
         | 
| 170 171 | 
             
                  mini_mime (>= 0.1.1)
         | 
| 171 172 | 
             
                memoist (0.16.2)
         | 
| 172 173 | 
             
                method_source (1.0.0)
         | 
| 173 | 
            -
                mimemagic (0.3. | 
| 174 | 
            +
                mimemagic (0.3.5)
         | 
| 174 175 | 
             
                mini_mime (1.0.2)
         | 
| 175 | 
            -
                mini_portile2 (2. | 
| 176 | 
            -
                minitest (5.14. | 
| 177 | 
            -
                nio4r (2.5. | 
| 178 | 
            -
                nokogiri (1. | 
| 179 | 
            -
                  mini_portile2 (~> 2. | 
| 180 | 
            -
             | 
| 181 | 
            -
                 | 
| 176 | 
            +
                mini_portile2 (2.5.0)
         | 
| 177 | 
            +
                minitest (5.14.3)
         | 
| 178 | 
            +
                nio4r (2.5.5)
         | 
| 179 | 
            +
                nokogiri (1.11.0)
         | 
| 180 | 
            +
                  mini_portile2 (~> 2.5.0)
         | 
| 181 | 
            +
                  racc (~> 1.4)
         | 
| 182 | 
            +
                public_suffix (4.0.6)
         | 
| 183 | 
            +
                puma (5.2.2)
         | 
| 182 184 | 
             
                  nio4r (~> 2.0)
         | 
| 183 | 
            -
                 | 
| 185 | 
            +
                racc (1.5.2)
         | 
| 186 | 
            +
                rack (2.2.3)
         | 
| 184 187 | 
             
                rack-test (1.1.0)
         | 
| 185 188 | 
             
                  rack (>= 1.0, < 3)
         | 
| 186 189 | 
             
                rails-dom-testing (2.0.3)
         | 
| @@ -188,41 +191,45 @@ GEM | |
| 188 191 | 
             
                  nokogiri (>= 1.6)
         | 
| 189 192 | 
             
                rails-html-sanitizer (1.3.0)
         | 
| 190 193 | 
             
                  loofah (~> 2.3)
         | 
| 191 | 
            -
                railties (6. | 
| 192 | 
            -
                  actionpack (= 6. | 
| 193 | 
            -
                  activesupport (= 6. | 
| 194 | 
            +
                railties (6.1.2.1)
         | 
| 195 | 
            +
                  actionpack (= 6.1.2.1)
         | 
| 196 | 
            +
                  activesupport (= 6.1.2.1)
         | 
| 194 197 | 
             
                  method_source
         | 
| 195 198 | 
             
                  rake (>= 0.8.7)
         | 
| 196 | 
            -
                  thor ( | 
| 199 | 
            +
                  thor (~> 1.0)
         | 
| 197 200 | 
             
                rainbow (3.0.0)
         | 
| 198 | 
            -
                rake (13.0. | 
| 199 | 
            -
                recursive-open-struct (1.1. | 
| 200 | 
            -
                regexp_parser ( | 
| 201 | 
            -
                 | 
| 202 | 
            -
             | 
| 203 | 
            -
                  rspec- | 
| 204 | 
            -
                  rspec- | 
| 205 | 
            -
             | 
| 206 | 
            -
             | 
| 207 | 
            -
             | 
| 201 | 
            +
                rake (13.0.3)
         | 
| 202 | 
            +
                recursive-open-struct (1.1.3)
         | 
| 203 | 
            +
                regexp_parser (2.0.3)
         | 
| 204 | 
            +
                rexml (3.2.4)
         | 
| 205 | 
            +
                rspec (3.10.0)
         | 
| 206 | 
            +
                  rspec-core (~> 3.10.0)
         | 
| 207 | 
            +
                  rspec-expectations (~> 3.10.0)
         | 
| 208 | 
            +
                  rspec-mocks (~> 3.10.0)
         | 
| 209 | 
            +
                rspec-core (3.10.0)
         | 
| 210 | 
            +
                  rspec-support (~> 3.10.0)
         | 
| 211 | 
            +
                rspec-expectations (3.10.0)
         | 
| 208 212 | 
             
                  diff-lcs (>= 1.2.0, < 2.0)
         | 
| 209 | 
            -
                  rspec-support (~> 3. | 
| 210 | 
            -
                rspec-mocks (3. | 
| 213 | 
            +
                  rspec-support (~> 3.10.0)
         | 
| 214 | 
            +
                rspec-mocks (3.10.0)
         | 
| 211 215 | 
             
                  diff-lcs (>= 1.2.0, < 2.0)
         | 
| 212 | 
            -
                  rspec-support (~> 3. | 
| 213 | 
            -
                rspec-support (3. | 
| 216 | 
            +
                  rspec-support (~> 3.10.0)
         | 
| 217 | 
            +
                rspec-support (3.10.0)
         | 
| 214 218 | 
             
                rspec_junit_formatter (0.4.1)
         | 
| 215 219 | 
             
                  rspec-core (>= 2, < 4, != 2.12.0)
         | 
| 220 | 
            +
                serverlessgems (0.1.2)
         | 
| 221 | 
            +
                  gems
         | 
| 222 | 
            +
                  memoist
         | 
| 223 | 
            +
                  zeitwerk
         | 
| 216 224 | 
             
                shotgun (0.9.2)
         | 
| 217 225 | 
             
                  rack (>= 1.0)
         | 
| 218 226 | 
             
                text-table (1.2.4)
         | 
| 219 | 
            -
                thor (1.0 | 
| 220 | 
            -
                 | 
| 221 | 
            -
             | 
| 222 | 
            -
                  thread_safe (~> 0.1)
         | 
| 227 | 
            +
                thor (1.1.0)
         | 
| 228 | 
            +
                tzinfo (2.0.4)
         | 
| 229 | 
            +
                  concurrent-ruby (~> 1.0)
         | 
| 223 230 | 
             
                xpath (3.2.0)
         | 
| 224 231 | 
             
                  nokogiri (~> 1.8)
         | 
| 225 | 
            -
                zeitwerk (2. | 
| 232 | 
            +
                zeitwerk (2.4.2)
         | 
| 226 233 |  | 
| 227 234 | 
             
            PLATFORMS
         | 
| 228 235 | 
             
              ruby
         | 
| @@ -233,6 +240,7 @@ DEPENDENCIES | |
| 233 240 | 
             
              dynomite
         | 
| 234 241 | 
             
              jets
         | 
| 235 242 | 
             
              launchy
         | 
| 243 | 
            +
              nokogiri (~> 1.11.0)
         | 
| 236 244 | 
             
              puma
         | 
| 237 245 | 
             
              rack
         | 
| 238 246 | 
             
              rspec
         |