introspective_grape 0.3.7 → 0.4.2
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/.travis.yml +1 -22
- data/CHANGELOG.md +35 -2
- data/Gemfile +2 -0
- data/README.md +15 -0
- data/gemfiles/Gemfile.rails.5.0.0 +2 -1
- data/gemfiles/Gemfile.rails.5.0.1 +2 -1
- data/gemfiles/Gemfile.rails.5.1.0 +2 -1
- data/gemfiles/Gemfile.rails.5.2.0 +2 -1
- data/gemfiles/Gemfile.rails.master +2 -1
- data/introspective_grape.gemspec +10 -8
- data/lib/introspective_grape.rb +3 -1
- data/lib/introspective_grape/api.rb +8 -4
- data/lib/introspective_grape/camel_snake.rb +1 -1
- data/lib/introspective_grape/configuration.rb +15 -0
- data/lib/introspective_grape/version.rb +1 -1
- data/spec/dummy/Gemfile +3 -2
- data/spec/dummy/app/api/api_helpers.rb +2 -0
- data/spec/dummy/app/api/dummy/company_api.rb +1 -1
- data/spec/dummy/config.ru +12 -0
- data/spec/dummy/db/migrate/20190325231304_add_test_data.rb +5 -0
- data/spec/dummy/db/schema.rb +154 -173
- data/spec/requests/project_api_spec.rb +1 -1
- metadata +32 -32
- data/gemfiles/2.0.0-Gemfile +0 -22
- data/gemfiles/2.2.0-Gemfile +0 -21
- data/gemfiles/Gemfile.rails.3.2.22 +0 -13
- data/gemfiles/Gemfile.rails.4.1.13 +0 -13
- data/gemfiles/Gemfile.rails.4.2.10 +0 -12
- data/gemfiles/Gemfile.rails.4.2.7.1 +0 -14
- data/gemfiles/Gemfile.rails.4.2.7.1.new.swagger +0 -13
- data/gemfiles/Gemfile.rails.4.2.8 +0 -14
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 | 
            -
             | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 2 | 
            +
            SHA256:
         | 
| 3 | 
            +
              metadata.gz: d65a93a41cf1a7afd03d352bd9856daa53d2bcfc4f22fa6674ec7f19bb21251c
         | 
| 4 | 
            +
              data.tar.gz: 907d5178a60e8dedbddc7f9854f8796ba337b4d6eb5c5d0ce99c699bb74535ed
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 43e3835f5f5573a9c896e1189933a7ed7a2ac889fe644e13b6fefedd801fd601ec887e77881224ba9c86055184338521296149460b814970800100fa94400b98
         | 
| 7 | 
            +
              data.tar.gz: 228f587da2205b9895235c1b5803d52e7b1dcb722a89d67ecde525a1253fa79dc1eef20bba4989155f8be8e35ae05899a74c9728f2ab42d337b6af3f6795fbfb
         | 
    
        data/.travis.yml
    CHANGED
    
    | @@ -7,20 +7,12 @@ script: | |
| 7 7 | 
             
              - bundle exec rspec
         | 
| 8 8 |  | 
| 9 9 | 
             
            rvm:
         | 
| 10 | 
            -
              #  - 2.0.0
         | 
| 11 | 
            -
              # - 2.1.0
         | 
| 12 | 
            -
              - 2.2.2
         | 
| 13 10 | 
             
              - 2.3.1
         | 
| 14 11 | 
             
              - 2.4.0
         | 
| 12 | 
            +
              - 2.5.0
         | 
| 15 13 | 
             
              - ruby-head
         | 
| 16 14 | 
             
              - jruby-head
         | 
| 17 15 | 
             
            gemfile:
         | 
| 18 | 
            -
            #  - gemfiles/Gemfile.rails.3.2.22
         | 
| 19 | 
            -
            #  - gemfiles/Gemfile.rails.4.1.13
         | 
| 20 | 
            -
            #  - gemfiles/Gemfile.rails.4.2.7.1
         | 
| 21 | 
            -
            #  - gemfiles/Gemfile.rails.4.2.7.1.new.swagger
         | 
| 22 | 
            -
            #  - gemfiles/Gemfile.rails.4.2.8
         | 
| 23 | 
            -
            #  - gemfiles/Gemfile.rails.5.0.0
         | 
| 24 16 | 
             
              - gemfiles/Gemfile.rails.5.0.1
         | 
| 25 17 | 
             
              - gemfiles/Gemfile.rails.5.1.0
         | 
| 26 18 | 
             
              - gemfiles/Gemfile.rails.5.2.0
         | 
| @@ -28,19 +20,6 @@ gemfile: | |
| 28 20 |  | 
| 29 21 | 
             
            matrix:
         | 
| 30 22 | 
             
              exclude:
         | 
| 31 | 
            -
                # We'll have to back up to grape-swagger 0.11 for earlier rubies.
         | 
| 32 | 
            -
                - rvm: 2.0.0
         | 
| 33 | 
            -
                  gemfile: gemfiles/Gemfile.rails.5.0.1
         | 
| 34 | 
            -
                - rvm: 2.0.0
         | 
| 35 | 
            -
                  gemfile: gemfiles/Gemfile.rails.master
         | 
| 36 | 
            -
                - rvm: 2.1.0
         | 
| 37 | 
            -
                  gemfile: gemfiles/Gemfile.rails.5.0.1
         | 
| 38 | 
            -
                - rvm: 2.1.0
         | 
| 39 | 
            -
                  gemfile: gemfiles/Gemfile.rails.master
         | 
| 40 | 
            -
                - rvm: 2.2.0
         | 
| 41 | 
            -
                  gemfile: gemfiles/Gemfile.rails.5.0.1
         | 
| 42 | 
            -
                - rvm: 2.2.0
         | 
| 43 | 
            -
                  gemfile: gemfiles/Gemfile.rails.master
         | 
| 44 23 | 
             
                - rvm: jruby-9.0.4.0
         | 
| 45 24 | 
             
                  gemfile: gemfiles/Gemfile.rails.5.0.1
         | 
| 46 25 | 
             
                - rvm: jruby-9.0.4.0
         | 
    
        data/CHANGELOG.md
    CHANGED
    
    | @@ -1,9 +1,42 @@ | |
| 1 | 
            +
            0.4.1 10/20/2020
         | 
| 2 | 
            +
            ================
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            We can't expect to ever release a 1.0 if the configuration object doesn't actually persist from the initializer.
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            0.4.0 10/20/2020
         | 
| 7 | 
            +
            ================
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            Add an `IntrospectiveGrape.config.skip_object_reload = true` option.
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            0.3.9 04/01/2019
         | 
| 12 | 
            +
            ================
         | 
| 13 | 
            +
             | 
| 14 | 
            +
            Add a note to the README that pagination will have to be supported via alexey-klimuk's fork of grape-kaminari from years ago because the middleware support gems have stopped being maintained, and rubygems doesn't support targeting github branches when adding dependencies.
         | 
| 15 | 
            +
             | 
| 16 | 
            +
            gem 'grape-kaminari', :github => 'alexey-klimuk/grape-kaminari'
         | 
| 17 | 
            +
             | 
| 18 | 
            +
            Probably we'll just fork it if nobody else can be bothered.
         | 
| 1 19 |  | 
| 2 | 
            -
            0.3. | 
| 20 | 
            +
            0.3.8 03/27/2019
         | 
| 3 21 | 
             
            ================
         | 
| 4 22 |  | 
| 5 | 
            -
             | 
| 23 | 
            +
            Support the latest Grape.
         | 
| 24 | 
            +
             | 
| 25 | 
            +
            0.3.7 03/26/2019
         | 
| 26 | 
            +
            ================
         | 
| 27 | 
            +
             | 
| 28 | 
            +
            Updated to support Grape ~> 1.2.0. Ruby 2.2 no longer supported.
         | 
| 29 | 
            +
             | 
| 30 | 
            +
             | 
| 31 | 
            +
            0.3.7 03/25/2019
         | 
| 32 | 
            +
            ================
         | 
| 33 | 
            +
             | 
| 34 | 
            +
            Updated to support Grape <~ 1.1.0.
         | 
| 35 | 
            +
             | 
| 36 | 
            +
            0.3.6 03/23/2019
         | 
| 37 | 
            +
            ================
         | 
| 6 38 |  | 
| 39 | 
            +
            Updated to support Rails 5+.
         | 
| 7 40 |  | 
| 8 41 |  | 
| 9 42 | 
             
            0.3.5 09/14/2018
         | 
    
        data/Gemfile
    CHANGED
    
    | @@ -5,6 +5,8 @@ source 'https://rubygems.org' | |
| 5 5 | 
             
            # development dependencies will be added by default to the :development group.
         | 
| 6 6 | 
             
            gemspec
         | 
| 7 7 |  | 
| 8 | 
            +
            gem 'grape-kaminari', :github => 'alexey-klimuk/grape-kaminari'
         | 
| 9 | 
            +
             | 
| 8 10 | 
             
            gem 'coveralls', require: false
         | 
| 9 11 |  | 
| 10 12 | 
             
            # Declare any dependencies that are still in development here instead of in
         | 
    
        data/README.md
    CHANGED
    
    | @@ -40,6 +40,7 @@ can speak in their own idioms. | |
| 40 40 | 
             
            In your Gemfile:
         | 
| 41 41 |  | 
| 42 42 | 
             
            ```
         | 
| 43 | 
            +
            gem 'grape-kaminari', :github => 'alexey-klimuk/grape-kaminari' # some middleware has fallen into deep disrepair
         | 
| 43 44 | 
             
            gem 'introspective_grape'
         | 
| 44 45 | 
             
            ```
         | 
| 45 46 |  | 
| @@ -48,6 +49,8 @@ And bundle install. | |
| 48 49 |  | 
| 49 50 | 
             
            ## Grape Configuration
         | 
| 50 51 |  | 
| 52 | 
            +
            ### Camelization
         | 
| 53 | 
            +
             | 
| 51 54 | 
             
            IntrospectiveGrape's default behavior is to camelize all outputs and snake case all inputs. To camel case all your json output you'll need to use its formatter in your API:
         | 
| 52 55 |  | 
| 53 56 | 
             
            ```
         | 
| @@ -60,6 +63,18 @@ You can disable this behavior by setting `IntrospectiveGrape.config.camelize_par | |
| 60 63 |  | 
| 61 64 | 
             
            To include this behavior in your test coverage you need to either access the API's params hash or you can format the response body to `JSON.parse(response.body).with_snake_keys` in a helper method with the `using CamelSnakeKeys` refinement.
         | 
| 62 65 |  | 
| 66 | 
            +
            ### Reloading an object after an update request
         | 
| 67 | 
            +
             | 
| 68 | 
            +
            By default the gem reloads the object instance before presenting the updated model, a lazy but
         | 
| 69 | 
            +
            effective workaround to updates that may not propagate in the working instance due to actions
         | 
| 70 | 
            +
            a user may take in hooks, or some updates to has_many :through associations. We want to put up
         | 
| 71 | 
            +
            APIs with haste rather than digging our way out of tricky minutae that can be handled later as
         | 
| 72 | 
            +
            technical debt.
         | 
| 73 | 
            +
             | 
| 74 | 
            +
            This behavior can be disabled by setting `IntrospectiveGrape.config.skip_object_reload = true`,
         | 
| 75 | 
            +
            when you have time for technical debt you can toggle it and work on fixing broken tests (you
         | 
| 76 | 
            +
            did take the time to write comprehensive test coverage, didn't you?).
         | 
| 77 | 
            +
             | 
| 63 78 | 
             
            ## Authentication and authorization
         | 
| 64 79 |  | 
| 65 80 | 
             
            Authentication and authorization are presently enforced on every endpoint. If you have named the authentication helper method in Grape something other than "authenticate!" or "authorize!" you can set it with:
         | 
    
        data/introspective_grape.gemspec
    CHANGED
    
    | @@ -18,19 +18,21 @@ Gem::Specification.new do |s| | |
| 18 18 | 
             
              s.files         = `git ls-files`.split("\n").sort
         | 
| 19 19 | 
             
              s.test_files    = `git ls-files -- spec/*`.split("\n")
         | 
| 20 20 |  | 
| 21 | 
            -
              s.required_ruby_version = ' | 
| 21 | 
            +
              s.required_ruby_version = '>= 2.3'
         | 
| 22 22 |  | 
| 23 23 | 
             
              s.add_dependency "rails", '> 5.0.0'
         | 
| 24 | 
            +
              # grape < 1.3.0 is incompatible with rack 2.1.0
         | 
| 25 | 
            +
              s.add_dependency "rack", '< 2.0.9'
         | 
| 24 26 |  | 
| 25 27 | 
             
              # grape 1.0.0 breaks the pagination solution
         | 
| 26 | 
            -
              s. | 
| 27 | 
            -
              s. | 
| 28 | 
            -
              s. | 
| 29 | 
            -
              s. | 
| 30 | 
            -
              s.add_dependency 'grape-kaminari'
         | 
| 28 | 
            +
              s.add_runtime_dependency 'grape', ['~> 1.2.0', '< 1.2.5']
         | 
| 29 | 
            +
              s.add_runtime_dependency 'grape-entity'
         | 
| 30 | 
            +
              s.add_runtime_dependency 'grape-swagger'
         | 
| 31 | 
            +
              s.add_runtime_dependency 'kaminari' #, '< 1.0' # version 1.0.0 breaks
         | 
| 32 | 
            +
              #s.add_dependency 'grape-kaminari', :github => 'alexey-klimuk/grape-kaminari'
         | 
| 31 33 | 
             
              # Pundit 2.0 mysteriously made authorize a protected method...
         | 
| 32 | 
            -
              s. | 
| 33 | 
            -
              s. | 
| 34 | 
            +
              s.add_runtime_dependency 'pundit' #, '<2.0'
         | 
| 35 | 
            +
              s.add_runtime_dependency 'camel_snake_keys', '>0.0.4'
         | 
| 34 36 |  | 
| 35 37 | 
             
              if RUBY_PLATFORM == 'java'
         | 
| 36 38 | 
             
                #s.add_development_dependency "jdbc-sqlite3"
         | 
    
        data/lib/introspective_grape.rb
    CHANGED
    
    | @@ -1,6 +1,8 @@ | |
| 1 | 
            +
            require 'introspective_grape/configuration'
         | 
| 1 2 | 
             
            module IntrospectiveGrape
         | 
| 2 3 | 
             
              autoload :API,            'introspective_grape/api'
         | 
| 3 4 | 
             
              autoload :CamelSnake,     'introspective_grape/camel_snake'
         | 
| 5 | 
            +
              autoload :Configure,      'introspective_grape/configuration'
         | 
| 4 6 | 
             
              autoload :CreateHelpers,  'introspective_grape/create_helpers'
         | 
| 5 7 | 
             
              autoload :Doc,            'introspective_grape/doc'
         | 
| 6 8 | 
             
              autoload :Filters,        'introspective_grape/filters'
         | 
| @@ -13,6 +15,6 @@ module IntrospectiveGrape | |
| 13 15 | 
             
              end
         | 
| 14 16 |  | 
| 15 17 | 
             
              def self.config
         | 
| 16 | 
            -
                @config  | 
| 18 | 
            +
                @config ||= Configuration.new
         | 
| 17 19 | 
             
              end
         | 
| 18 20 | 
             
            end
         | 
| @@ -1,4 +1,5 @@ | |
| 1 1 | 
             
            require 'action_controller'
         | 
| 2 | 
            +
            require 'kaminari'
         | 
| 2 3 | 
             
            require 'grape-kaminari'
         | 
| 3 4 | 
             
            require 'introspective_grape/validators'
         | 
| 4 5 |  | 
| @@ -6,7 +7,7 @@ class IntrospectiveGrapeError < StandardError | |
| 6 7 | 
             
            end
         | 
| 7 8 |  | 
| 8 9 | 
             
            module IntrospectiveGrape
         | 
| 9 | 
            -
              class API < Grape::API
         | 
| 10 | 
            +
              class API < Grape::API::Instance
         | 
| 10 11 | 
             
                extend IntrospectiveGrape::Helpers
         | 
| 11 12 | 
             
                extend IntrospectiveGrape::CreateHelpers
         | 
| 12 13 | 
             
                extend IntrospectiveGrape::Filters
         | 
| @@ -247,9 +248,12 @@ module IntrospectiveGrape | |
| 247 248 |  | 
| 248 249 | 
             
                      @model.update_attributes!( safe_params(params).permit(klass.whitelist) )
         | 
| 249 250 |  | 
| 250 | 
            -
                       | 
| 251 | 
            -
             | 
| 252 | 
            -
                       | 
| 251 | 
            +
                      if IntrospectiveGrape.config.skip_object_reload
         | 
| 252 | 
            +
                        present klass.find_leaf(routes, @model, params), with: "#{klass}::#{model}Entity".constantize
         | 
| 253 | 
            +
                      else
         | 
| 254 | 
            +
                        default_includes = routes.first.klass.default_includes(routes.first.model)
         | 
| 255 | 
            +
                        present klass.find_leaf(routes, @model.class.includes(default_includes).find(@model.id), params), with: "#{klass}::#{model}Entity".constantize
         | 
| 256 | 
            +
                      end
         | 
| 253 257 | 
             
                    end
         | 
| 254 258 | 
             
                  end
         | 
| 255 259 |  | 
| @@ -28,7 +28,7 @@ if IntrospectiveGrape.config.camelize_parameters | |
| 28 28 | 
             
                  end
         | 
| 29 29 | 
             
                end
         | 
| 30 30 |  | 
| 31 | 
            -
                Grape::API.singleton_class.send(:prepend, CreateCamelizedDocumentationClass)
         | 
| 31 | 
            +
                Grape::API::Instance.singleton_class.send(:prepend, CreateCamelizedDocumentationClass)
         | 
| 32 32 | 
             
              else
         | 
| 33 33 | 
             
                module CallWithCamelized
         | 
| 34 34 | 
             
                  def call(*args)
         | 
| @@ -0,0 +1,15 @@ | |
| 1 | 
            +
            module IntrospectiveGrape
         | 
| 2 | 
            +
              def self.configure
         | 
| 3 | 
            +
                self.config ||= Configuration.new
         | 
| 4 | 
            +
                yield config
         | 
| 5 | 
            +
              end
         | 
| 6 | 
            +
             | 
| 7 | 
            +
              class Configuration
         | 
| 8 | 
            +
                attr_accessor :camelize_parameters, :skip_object_reload
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                def initialize
         | 
| 11 | 
            +
                  @camelize_parameters = true
         | 
| 12 | 
            +
                  @skip_object_reload  = false
         | 
| 13 | 
            +
                end
         | 
| 14 | 
            +
              end
         | 
| 15 | 
            +
            end
         | 
    
        data/spec/dummy/Gemfile
    CHANGED
    
    | @@ -10,11 +10,12 @@ gem 'delayed_paperclip' | |
| 10 10 |  | 
| 11 11 | 
             
            gem 'grape'
         | 
| 12 12 | 
             
            gem 'grape-entity'
         | 
| 13 | 
            -
            gem 'grape-kaminari' | 
| 13 | 
            +
            gem 'grape-kaminari'
         | 
| 14 14 | 
             
            gem 'grape-swagger'
         | 
| 15 | 
            -
            gem 'introspective_grape', | 
| 15 | 
            +
            gem 'introspective_grape',  git: 'https://github.com/buermann/introspective_grape', branch: 'grape-1.2'
         | 
| 16 16 |  | 
| 17 17 | 
             
            gem 'paperclip'
         | 
| 18 18 | 
             
            gem 'pundit'
         | 
| 19 19 |  | 
| 20 | 
            +
            gem 'rack-cors'
         | 
| 20 21 | 
             
            gem 'sqlite3', '< 1.4.0'
         | 
| @@ -1,6 +1,8 @@ | |
| 1 1 | 
             
            module ApiHelpers
         | 
| 2 2 | 
             
              def current_user
         | 
| 3 3 | 
             
                params[:api_key].present? && @user = User.find_by_authentication_token(params[:api_key])
         | 
| 4 | 
            +
                # for testing in situ
         | 
| 5 | 
            +
                #@user = User.find_or_create_by(email: 'test@test.com', superuser: true, authentication_token: '1234567890', first_name: "First", last_name: "Last")
         | 
| 4 6 | 
             
              end
         | 
| 5 7 |  | 
| 6 8 | 
             
              def authenticate!
         | 
| @@ -5,7 +5,7 @@ class Dummy::CompanyAPI < IntrospectiveGrape::API | |
| 5 5 |  | 
| 6 6 | 
             
                desc "Test default values in an extra endpoint"
         | 
| 7 7 | 
             
                params do
         | 
| 8 | 
            -
                  optional :boolean_default, type: Boolean, default: false
         | 
| 8 | 
            +
                  optional :boolean_default, type: Virtus::Attribute::Boolean, default: false
         | 
| 9 9 | 
             
                  optional :string_default, type: String, default: "foo"
         | 
| 10 10 | 
             
                  optional :integer_default, type: Integer, default: 123
         | 
| 11 11 | 
             
                end
         | 
    
        data/spec/dummy/config.ru
    CHANGED
    
    | @@ -2,3 +2,15 @@ | |
| 2 2 |  | 
| 3 3 | 
             
            require ::File.expand_path('../config/environment', __FILE__)
         | 
| 4 4 | 
             
            run Rails.application
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            require 'rack/cors'
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            use Rack::Cors do
         | 
| 9 | 
            +
              allow do
         | 
| 10 | 
            +
                origins '*'
         | 
| 11 | 
            +
                resource '*',
         | 
| 12 | 
            +
                  :headers => :any,
         | 
| 13 | 
            +
                  :methods => [:get, :post, :delete, :put, :options],
         | 
| 14 | 
            +
                  expose: %w(X-Server-Date X-Server-Epoch)
         | 
| 15 | 
            +
              end
         | 
| 16 | 
            +
            end
         | 
    
        data/spec/dummy/db/schema.rb
    CHANGED
    
    | @@ -1,4 +1,3 @@ | |
| 1 | 
            -
            # encoding: UTF-8
         | 
| 2 1 | 
             
            # This file is auto-generated from the current state of the database. Instead
         | 
| 3 2 | 
             
            # of editing this file, please use the migrations feature of Active Record to
         | 
| 4 3 | 
             
            # incrementally modify your database, and then regenerate this schema definition.
         | 
| @@ -11,269 +10,251 @@ | |
| 11 10 | 
             
            #
         | 
| 12 11 | 
             
            # It's strongly recommended that you check this file into your version control system.
         | 
| 13 12 |  | 
| 14 | 
            -
            ActiveRecord::Schema.define(version:  | 
| 13 | 
            +
            ActiveRecord::Schema.define(version: 2019_03_25_231304) do
         | 
| 15 14 |  | 
| 16 15 | 
             
              create_table "active_admin_comments", force: :cascade do |t|
         | 
| 17 | 
            -
                t.string | 
| 18 | 
            -
                t.text | 
| 19 | 
            -
                t.string | 
| 20 | 
            -
                t.string | 
| 21 | 
            -
                t.integer | 
| 22 | 
            -
                t.string | 
| 23 | 
            -
                t.datetime "created_at", | 
| 24 | 
            -
                t.datetime "updated_at", | 
| 16 | 
            +
                t.string "namespace"
         | 
| 17 | 
            +
                t.text "body"
         | 
| 18 | 
            +
                t.string "resource_id", null: false
         | 
| 19 | 
            +
                t.string "resource_type", null: false
         | 
| 20 | 
            +
                t.integer "author_id"
         | 
| 21 | 
            +
                t.string "author_type"
         | 
| 22 | 
            +
                t.datetime "created_at", null: false
         | 
| 23 | 
            +
                t.datetime "updated_at", null: false
         | 
| 24 | 
            +
                t.index ["author_type", "author_id"], name: "index_active_admin_comments_on_author_type_and_author_id"
         | 
| 25 | 
            +
                t.index ["namespace"], name: "index_active_admin_comments_on_namespace"
         | 
| 26 | 
            +
                t.index ["resource_type", "resource_id"], name: "index_active_admin_comments_on_resource_type_and_resource_id"
         | 
| 25 27 | 
             
              end
         | 
| 26 28 |  | 
| 27 | 
            -
              add_index "active_admin_comments", ["author_type", "author_id"], name: "index_active_admin_comments_on_author_type_and_author_id"
         | 
| 28 | 
            -
              add_index "active_admin_comments", ["namespace"], name: "index_active_admin_comments_on_namespace"
         | 
| 29 | 
            -
              add_index "active_admin_comments", ["resource_type", "resource_id"], name: "index_active_admin_comments_on_resource_type_and_resource_id"
         | 
| 30 | 
            -
             | 
| 31 29 | 
             
              create_table "admin_users", force: :cascade do |t|
         | 
| 32 | 
            -
                t.string | 
| 33 | 
            -
                t.string | 
| 34 | 
            -
                t.string | 
| 30 | 
            +
                t.string "email", default: "", null: false
         | 
| 31 | 
            +
                t.string "encrypted_password", default: "", null: false
         | 
| 32 | 
            +
                t.string "reset_password_token"
         | 
| 35 33 | 
             
                t.datetime "reset_password_sent_at"
         | 
| 36 34 | 
             
                t.datetime "remember_created_at"
         | 
| 37 | 
            -
                t.integer | 
| 35 | 
            +
                t.integer "sign_in_count", default: 0, null: false
         | 
| 38 36 | 
             
                t.datetime "current_sign_in_at"
         | 
| 39 37 | 
             
                t.datetime "last_sign_in_at"
         | 
| 40 | 
            -
                t.string | 
| 41 | 
            -
                t.string | 
| 42 | 
            -
                t.datetime "created_at", | 
| 43 | 
            -
                t.datetime "updated_at", | 
| 38 | 
            +
                t.string "current_sign_in_ip"
         | 
| 39 | 
            +
                t.string "last_sign_in_ip"
         | 
| 40 | 
            +
                t.datetime "created_at", null: false
         | 
| 41 | 
            +
                t.datetime "updated_at", null: false
         | 
| 42 | 
            +
                t.index ["email"], name: "index_admin_users_on_email", unique: true
         | 
| 43 | 
            +
                t.index ["reset_password_token"], name: "index_admin_users_on_reset_password_token", unique: true
         | 
| 44 44 | 
             
              end
         | 
| 45 45 |  | 
| 46 | 
            -
              add_index "admin_users", ["email"], name: "index_admin_users_on_email", unique: true
         | 
| 47 | 
            -
              add_index "admin_users", ["reset_password_token"], name: "index_admin_users_on_reset_password_token", unique: true
         | 
| 48 | 
            -
             | 
| 49 46 | 
             
              create_table "chat_message_users", force: :cascade do |t|
         | 
| 50 | 
            -
                t.integer | 
| 51 | 
            -
                t.integer | 
| 47 | 
            +
                t.integer "chat_message_id"
         | 
| 48 | 
            +
                t.integer "user_id"
         | 
| 52 49 | 
             
                t.datetime "read_at"
         | 
| 53 | 
            -
                t.datetime "created_at", | 
| 54 | 
            -
                t.datetime "updated_at", | 
| 50 | 
            +
                t.datetime "created_at", null: false
         | 
| 51 | 
            +
                t.datetime "updated_at", null: false
         | 
| 52 | 
            +
                t.index ["chat_message_id"], name: "index_chat_message_users_on_chat_message_id"
         | 
| 53 | 
            +
                t.index ["user_id"], name: "index_chat_message_users_on_user_id"
         | 
| 55 54 | 
             
              end
         | 
| 56 55 |  | 
| 57 | 
            -
              add_index "chat_message_users", ["chat_message_id"], name: "index_chat_message_users_on_chat_message_id"
         | 
| 58 | 
            -
              add_index "chat_message_users", ["user_id"], name: "index_chat_message_users_on_user_id"
         | 
| 59 | 
            -
             | 
| 60 56 | 
             
              create_table "chat_messages", force: :cascade do |t|
         | 
| 61 | 
            -
                t.integer | 
| 62 | 
            -
                t.integer | 
| 63 | 
            -
                t.text | 
| 57 | 
            +
                t.integer "chat_id"
         | 
| 58 | 
            +
                t.integer "author_id"
         | 
| 59 | 
            +
                t.text "message"
         | 
| 64 60 | 
             
                t.datetime "created_at", null: false
         | 
| 65 61 | 
             
                t.datetime "updated_at", null: false
         | 
| 62 | 
            +
                t.index ["author_id"], name: "index_chat_messages_on_author_id"
         | 
| 63 | 
            +
                t.index ["chat_id"], name: "index_chat_messages_on_chat_id"
         | 
| 66 64 | 
             
              end
         | 
| 67 65 |  | 
| 68 | 
            -
              add_index "chat_messages", ["author_id"], name: "index_chat_messages_on_author_id"
         | 
| 69 | 
            -
              add_index "chat_messages", ["chat_id"], name: "index_chat_messages_on_chat_id"
         | 
| 70 | 
            -
             | 
| 71 66 | 
             
              create_table "chat_users", force: :cascade do |t|
         | 
| 72 | 
            -
                t.integer | 
| 73 | 
            -
                t.integer | 
| 67 | 
            +
                t.integer "chat_id"
         | 
| 68 | 
            +
                t.integer "user_id"
         | 
| 74 69 | 
             
                t.datetime "departed_at"
         | 
| 75 | 
            -
                t.datetime "created_at", | 
| 76 | 
            -
                t.datetime "updated_at", | 
| 70 | 
            +
                t.datetime "created_at", null: false
         | 
| 71 | 
            +
                t.datetime "updated_at", null: false
         | 
| 72 | 
            +
                t.index ["chat_id"], name: "index_chat_users_on_chat_id"
         | 
| 73 | 
            +
                t.index ["user_id"], name: "index_chat_users_on_user_id"
         | 
| 77 74 | 
             
              end
         | 
| 78 75 |  | 
| 79 | 
            -
              add_index "chat_users", ["chat_id"], name: "index_chat_users_on_chat_id"
         | 
| 80 | 
            -
              add_index "chat_users", ["user_id"], name: "index_chat_users_on_user_id"
         | 
| 81 | 
            -
             | 
| 82 76 | 
             
              create_table "chats", force: :cascade do |t|
         | 
| 83 | 
            -
                t.integer | 
| 77 | 
            +
                t.integer "creator_id"
         | 
| 84 78 | 
             
                t.datetime "created_at", null: false
         | 
| 85 79 | 
             
                t.datetime "updated_at", null: false
         | 
| 86 80 | 
             
              end
         | 
| 87 81 |  | 
| 88 82 | 
             
              create_table "companies", force: :cascade do |t|
         | 
| 89 | 
            -
                t.string | 
| 90 | 
            -
                t.string | 
| 91 | 
            -
                t.datetime "created_at", | 
| 92 | 
            -
                t.datetime "updated_at", | 
| 83 | 
            +
                t.string "name", limit: 256, null: false
         | 
| 84 | 
            +
                t.string "short_name", limit: 10, null: false
         | 
| 85 | 
            +
                t.datetime "created_at", null: false
         | 
| 86 | 
            +
                t.datetime "updated_at", null: false
         | 
| 87 | 
            +
                t.index ["name"], name: "index_companies_on_name", unique: true
         | 
| 93 88 | 
             
              end
         | 
| 94 89 |  | 
| 95 | 
            -
              add_index "companies", ["name"], name: "index_companies_on_name", unique: true
         | 
| 96 | 
            -
             | 
| 97 90 | 
             
              create_table "images", force: :cascade do |t|
         | 
| 98 | 
            -
                t.integer | 
| 99 | 
            -
                t.string | 
| 100 | 
            -
                t.string | 
| 101 | 
            -
                t.string | 
| 102 | 
            -
                t.integer | 
| 91 | 
            +
                t.integer "imageable_id"
         | 
| 92 | 
            +
                t.string "imageable_type"
         | 
| 93 | 
            +
                t.string "file_file_name"
         | 
| 94 | 
            +
                t.string "file_content_type"
         | 
| 95 | 
            +
                t.integer "file_file_size"
         | 
| 103 96 | 
             
                t.datetime "file_updated_at"
         | 
| 104 | 
            -
                t.boolean | 
| 105 | 
            -
                t.text | 
| 106 | 
            -
                t.string | 
| 107 | 
            -
                t.float | 
| 108 | 
            -
                t.float | 
| 97 | 
            +
                t.boolean "file_processing", default: false, null: false
         | 
| 98 | 
            +
                t.text "meta"
         | 
| 99 | 
            +
                t.string "source"
         | 
| 100 | 
            +
                t.float "lat"
         | 
| 101 | 
            +
                t.float "lng"
         | 
| 109 102 | 
             
                t.datetime "taken_at"
         | 
| 110 | 
            -
                t.datetime "created_at", | 
| 111 | 
            -
                t.datetime "updated_at", | 
| 103 | 
            +
                t.datetime "created_at", null: false
         | 
| 104 | 
            +
                t.datetime "updated_at", null: false
         | 
| 112 105 | 
             
              end
         | 
| 113 106 |  | 
| 114 107 | 
             
              create_table "jobs", force: :cascade do |t|
         | 
| 115 | 
            -
                t.string | 
| 108 | 
            +
                t.string "title", null: false
         | 
| 116 109 | 
             
                t.datetime "created_at", null: false
         | 
| 117 110 | 
             
                t.datetime "updated_at", null: false
         | 
| 118 111 | 
             
              end
         | 
| 119 112 |  | 
| 120 113 | 
             
              create_table "locatables", force: :cascade do |t|
         | 
| 121 | 
            -
                t.integer | 
| 122 | 
            -
                t.integer | 
| 123 | 
            -
                t.string | 
| 124 | 
            -
                t.datetime "created_at", | 
| 125 | 
            -
                t.datetime "updated_at", | 
| 114 | 
            +
                t.integer "location_id"
         | 
| 115 | 
            +
                t.integer "locatable_id"
         | 
| 116 | 
            +
                t.string "locatable_type"
         | 
| 117 | 
            +
                t.datetime "created_at", null: false
         | 
| 118 | 
            +
                t.datetime "updated_at", null: false
         | 
| 119 | 
            +
                t.index ["locatable_type", "locatable_id"], name: "index_locatables_on_locatable_type_and_locatable_id"
         | 
| 126 120 | 
             
              end
         | 
| 127 121 |  | 
| 128 | 
            -
              add_index "locatables", ["locatable_type", "locatable_id"], name: "index_locatables_on_locatable_type_and_locatable_id"
         | 
| 129 | 
            -
             | 
| 130 122 | 
             
              create_table "location_beacons", force: :cascade do |t|
         | 
| 131 | 
            -
                t.integer | 
| 132 | 
            -
                t.integer | 
| 133 | 
            -
                t.string | 
| 134 | 
            -
                t.string | 
| 135 | 
            -
                t.integer | 
| 136 | 
            -
                t.integer | 
| 137 | 
            -
                t.datetime "created_at", | 
| 138 | 
            -
                t.datetime "updated_at", | 
| 123 | 
            +
                t.integer "location_id"
         | 
| 124 | 
            +
                t.integer "company_id", null: false
         | 
| 125 | 
            +
                t.string "mac_address", limit: 12
         | 
| 126 | 
            +
                t.string "uuid", limit: 32, null: false
         | 
| 127 | 
            +
                t.integer "major", null: false
         | 
| 128 | 
            +
                t.integer "minor", null: false
         | 
| 129 | 
            +
                t.datetime "created_at", null: false
         | 
| 130 | 
            +
                t.datetime "updated_at", null: false
         | 
| 131 | 
            +
                t.index ["company_id", "uuid", "major", "minor"], name: "index_location_beacons_unique_company_identifier", unique: true
         | 
| 139 132 | 
             
              end
         | 
| 140 133 |  | 
| 141 | 
            -
              add_index "location_beacons", ["company_id", "uuid", "major", "minor"], name: "index_location_beacons_unique_company_identifier", unique: true
         | 
| 142 | 
            -
             | 
| 143 134 | 
             
              create_table "location_gps", force: :cascade do |t|
         | 
| 144 | 
            -
                t.integer | 
| 145 | 
            -
                t.float | 
| 146 | 
            -
                t.float | 
| 147 | 
            -
                t.float | 
| 148 | 
            -
                t.datetime "created_at", | 
| 149 | 
            -
                t.datetime "updated_at", | 
| 135 | 
            +
                t.integer "location_id"
         | 
| 136 | 
            +
                t.float "lat", null: false
         | 
| 137 | 
            +
                t.float "lng", null: false
         | 
| 138 | 
            +
                t.float "alt", default: 0.0
         | 
| 139 | 
            +
                t.datetime "created_at", null: false
         | 
| 140 | 
            +
                t.datetime "updated_at", null: false
         | 
| 141 | 
            +
                t.index ["location_id"], name: "index_location_gps_on_location_id"
         | 
| 150 142 | 
             
              end
         | 
| 151 143 |  | 
| 152 | 
            -
              add_index "location_gps", ["location_id"], name: "index_location_gps_on_location_id"
         | 
| 153 | 
            -
             | 
| 154 144 | 
             
              create_table "locations", force: :cascade do |t|
         | 
| 155 | 
            -
                t.string | 
| 156 | 
            -
                t.string | 
| 157 | 
            -
                t.integer | 
| 158 | 
            -
                t.datetime "created_at", | 
| 159 | 
            -
                t.datetime "updated_at", | 
| 145 | 
            +
                t.string "name", null: false
         | 
| 146 | 
            +
                t.string "kind"
         | 
| 147 | 
            +
                t.integer "parent_location_id"
         | 
| 148 | 
            +
                t.datetime "created_at", null: false
         | 
| 149 | 
            +
                t.datetime "updated_at", null: false
         | 
| 150 | 
            +
                t.index ["parent_location_id", "kind", "name"], name: "index_locations_on_parent_location_id_and_kind_and_name", unique: true
         | 
| 151 | 
            +
                t.index ["parent_location_id"], name: "index_locations_on_parent_location_id"
         | 
| 160 152 | 
             
              end
         | 
| 161 153 |  | 
| 162 | 
            -
              add_index "locations", ["parent_location_id", "kind", "name"], name: "index_locations_on_parent_location_id_and_kind_and_name", unique: true
         | 
| 163 | 
            -
              add_index "locations", ["parent_location_id"], name: "index_locations_on_parent_location_id"
         | 
| 164 | 
            -
             | 
| 165 154 | 
             
              create_table "project_jobs", force: :cascade do |t|
         | 
| 166 | 
            -
                t.integer | 
| 167 | 
            -
                t.integer | 
| 155 | 
            +
                t.integer "project_id", null: false
         | 
| 156 | 
            +
                t.integer "job_id", null: false
         | 
| 168 157 | 
             
                t.datetime "created_at", null: false
         | 
| 169 158 | 
             
                t.datetime "updated_at", null: false
         | 
| 159 | 
            +
                t.index ["job_id"], name: "index_project_jobs_on_job_id"
         | 
| 160 | 
            +
                t.index ["project_id", "job_id"], name: "index_project_jobs_on_project_id_and_job_id", unique: true
         | 
| 161 | 
            +
                t.index ["project_id"], name: "index_project_jobs_on_project_id"
         | 
| 170 162 | 
             
              end
         | 
| 171 163 |  | 
| 172 | 
            -
              add_index "project_jobs", ["job_id"], name: "index_project_jobs_on_job_id"
         | 
| 173 | 
            -
              add_index "project_jobs", ["project_id", "job_id"], name: "index_project_jobs_on_project_id_and_job_id", unique: true
         | 
| 174 | 
            -
              add_index "project_jobs", ["project_id"], name: "index_project_jobs_on_project_id"
         | 
| 175 | 
            -
             | 
| 176 164 | 
             
              create_table "projects", force: :cascade do |t|
         | 
| 177 | 
            -
                t.string | 
| 178 | 
            -
                t.integer | 
| 179 | 
            -
                t.datetime "created_at", | 
| 180 | 
            -
                t.datetime "updated_at", | 
| 181 | 
            -
                t.string | 
| 165 | 
            +
                t.string "name", null: false
         | 
| 166 | 
            +
                t.integer "owner_id"
         | 
| 167 | 
            +
                t.datetime "created_at", null: false
         | 
| 168 | 
            +
                t.datetime "updated_at", null: false
         | 
| 169 | 
            +
                t.string "default_password"
         | 
| 170 | 
            +
                t.index ["owner_id"], name: "index_projects_on_owner_id"
         | 
| 182 171 | 
             
              end
         | 
| 183 172 |  | 
| 184 | 
            -
              add_index "projects", ["owner_id"], name: "index_projects_on_owner_id"
         | 
| 185 | 
            -
             | 
| 186 173 | 
             
              create_table "roles", force: :cascade do |t|
         | 
| 187 | 
            -
                t.integer | 
| 188 | 
            -
                t.integer | 
| 189 | 
            -
                t.string | 
| 190 | 
            -
                t.datetime "created_at", | 
| 191 | 
            -
                t.datetime "updated_at", | 
| 174 | 
            +
                t.integer "user_id", null: false
         | 
| 175 | 
            +
                t.integer "ownable_id"
         | 
| 176 | 
            +
                t.string "ownable_type"
         | 
| 177 | 
            +
                t.datetime "created_at", null: false
         | 
| 178 | 
            +
                t.datetime "updated_at", null: false
         | 
| 179 | 
            +
                t.index ["ownable_type", "ownable_id"], name: "index_roles_on_ownable_type_and_ownable_id"
         | 
| 180 | 
            +
                t.index ["user_id", "ownable_type", "ownable_id"], name: "index_roles_on_user_id_and_ownable_type_and_ownable_id", unique: true
         | 
| 192 181 | 
             
              end
         | 
| 193 182 |  | 
| 194 | 
            -
              add_index "roles", ["ownable_type", "ownable_id"], name: "index_roles_on_ownable_type_and_ownable_id"
         | 
| 195 | 
            -
              add_index "roles", ["user_id", "ownable_type", "ownable_id"], name: "index_roles_on_user_id_and_ownable_type_and_ownable_id", unique: true
         | 
| 196 | 
            -
             | 
| 197 183 | 
             
              create_table "team_users", force: :cascade do |t|
         | 
| 198 | 
            -
                t.integer | 
| 199 | 
            -
                t.integer | 
| 184 | 
            +
                t.integer "user_id"
         | 
| 185 | 
            +
                t.integer "team_id"
         | 
| 200 186 | 
             
                t.datetime "created_at", null: false
         | 
| 201 187 | 
             
                t.datetime "updated_at", null: false
         | 
| 188 | 
            +
                t.index ["team_id"], name: "index_team_users_on_team_id"
         | 
| 189 | 
            +
                t.index ["user_id", "team_id"], name: "index_team_users_on_user_id_and_team_id", unique: true
         | 
| 190 | 
            +
                t.index ["user_id"], name: "index_team_users_on_user_id"
         | 
| 202 191 | 
             
              end
         | 
| 203 192 |  | 
| 204 | 
            -
              add_index "team_users", ["team_id"], name: "index_team_users_on_team_id"
         | 
| 205 | 
            -
              add_index "team_users", ["user_id", "team_id"], name: "index_team_users_on_user_id_and_team_id", unique: true
         | 
| 206 | 
            -
              add_index "team_users", ["user_id"], name: "index_team_users_on_user_id"
         | 
| 207 | 
            -
             | 
| 208 193 | 
             
              create_table "teams", force: :cascade do |t|
         | 
| 209 | 
            -
                t.string | 
| 210 | 
            -
                t.integer | 
| 211 | 
            -
                t.integer | 
| 194 | 
            +
                t.string "name"
         | 
| 195 | 
            +
                t.integer "project_id"
         | 
| 196 | 
            +
                t.integer "creator_id"
         | 
| 212 197 | 
             
                t.datetime "created_at", null: false
         | 
| 213 198 | 
             
                t.datetime "updated_at", null: false
         | 
| 199 | 
            +
                t.index ["creator_id"], name: "index_teams_on_creator_id"
         | 
| 200 | 
            +
                t.index ["project_id"], name: "index_teams_on_project_id"
         | 
| 214 201 | 
             
              end
         | 
| 215 202 |  | 
| 216 | 
            -
              add_index "teams", ["creator_id"], name: "index_teams_on_creator_id"
         | 
| 217 | 
            -
              add_index "teams", ["project_id"], name: "index_teams_on_project_id"
         | 
| 218 | 
            -
             | 
| 219 203 | 
             
              create_table "user_locations", force: :cascade do |t|
         | 
| 220 | 
            -
                t.integer | 
| 221 | 
            -
                t.integer | 
| 222 | 
            -
                t.integer | 
| 223 | 
            -
                t.string | 
| 224 | 
            -
                t.float | 
| 225 | 
            -
                t.float | 
| 226 | 
            -
                t.float | 
| 227 | 
            -
                t.datetime "created_at", | 
| 228 | 
            -
                t.datetime "updated_at", | 
| 204 | 
            +
                t.integer "user_id"
         | 
| 205 | 
            +
                t.integer "location_id"
         | 
| 206 | 
            +
                t.integer "detectable_id"
         | 
| 207 | 
            +
                t.string "detectable_type"
         | 
| 208 | 
            +
                t.float "lat"
         | 
| 209 | 
            +
                t.float "lng"
         | 
| 210 | 
            +
                t.float "alt"
         | 
| 211 | 
            +
                t.datetime "created_at", null: false
         | 
| 212 | 
            +
                t.datetime "updated_at", null: false
         | 
| 213 | 
            +
                t.index ["detectable_type", "detectable_id"], name: "index_user_locations_on_detectable_type_and_detectable_id"
         | 
| 214 | 
            +
                t.index ["location_id"], name: "index_user_locations_on_location_id"
         | 
| 215 | 
            +
                t.index ["user_id"], name: "index_user_locations_on_user_id"
         | 
| 229 216 | 
             
              end
         | 
| 230 217 |  | 
| 231 | 
            -
              add_index "user_locations", ["detectable_type", "detectable_id"], name: "index_user_locations_on_detectable_type_and_detectable_id"
         | 
| 232 | 
            -
              add_index "user_locations", ["location_id"], name: "index_user_locations_on_location_id"
         | 
| 233 | 
            -
              add_index "user_locations", ["user_id"], name: "index_user_locations_on_user_id"
         | 
| 234 | 
            -
             | 
| 235 218 | 
             
              create_table "user_project_jobs", force: :cascade do |t|
         | 
| 236 | 
            -
                t.integer | 
| 237 | 
            -
                t.integer | 
| 238 | 
            -
                t.integer | 
| 219 | 
            +
                t.integer "user_id", null: false
         | 
| 220 | 
            +
                t.integer "project_id", null: false
         | 
| 221 | 
            +
                t.integer "job_id", null: false
         | 
| 239 222 | 
             
                t.datetime "created_at", null: false
         | 
| 240 223 | 
             
                t.datetime "updated_at", null: false
         | 
| 224 | 
            +
                t.index ["job_id"], name: "index_user_project_jobs_on_job_id"
         | 
| 225 | 
            +
                t.index ["project_id"], name: "index_user_project_jobs_on_project_id"
         | 
| 226 | 
            +
                t.index ["user_id", "project_id", "job_id"], name: "index_user_project_jobs_on_user_id_and_project_id_and_job_id", unique: true
         | 
| 227 | 
            +
                t.index ["user_id"], name: "index_user_project_jobs_on_user_id"
         | 
| 241 228 | 
             
              end
         | 
| 242 229 |  | 
| 243 | 
            -
              add_index "user_project_jobs", ["job_id"], name: "index_user_project_jobs_on_job_id"
         | 
| 244 | 
            -
              add_index "user_project_jobs", ["project_id"], name: "index_user_project_jobs_on_project_id"
         | 
| 245 | 
            -
              add_index "user_project_jobs", ["user_id", "project_id", "job_id"], name: "index_user_project_jobs_on_user_id_and_project_id_and_job_id", unique: true
         | 
| 246 | 
            -
              add_index "user_project_jobs", ["user_id"], name: "index_user_project_jobs_on_user_id"
         | 
| 247 | 
            -
             | 
| 248 230 | 
             
              create_table "users", force: :cascade do |t|
         | 
| 249 | 
            -
                t.string | 
| 250 | 
            -
                t.string | 
| 251 | 
            -
                t.string | 
| 231 | 
            +
                t.string "email", default: "", null: false
         | 
| 232 | 
            +
                t.string "encrypted_password", default: "", null: false
         | 
| 233 | 
            +
                t.string "reset_password_token"
         | 
| 252 234 | 
             
                t.datetime "reset_password_sent_at"
         | 
| 253 235 | 
             
                t.datetime "remember_created_at"
         | 
| 254 | 
            -
                t.integer | 
| 236 | 
            +
                t.integer "sign_in_count", default: 0, null: false
         | 
| 255 237 | 
             
                t.datetime "current_sign_in_at"
         | 
| 256 238 | 
             
                t.datetime "last_sign_in_at"
         | 
| 257 | 
            -
                t.string | 
| 258 | 
            -
                t.string | 
| 259 | 
            -
                t.datetime "created_at", | 
| 260 | 
            -
                t.datetime "updated_at", | 
| 261 | 
            -
                t.integer | 
| 262 | 
            -
                t.string | 
| 239 | 
            +
                t.string "current_sign_in_ip"
         | 
| 240 | 
            +
                t.string "last_sign_in_ip"
         | 
| 241 | 
            +
                t.datetime "created_at", null: false
         | 
| 242 | 
            +
                t.datetime "updated_at", null: false
         | 
| 243 | 
            +
                t.integer "failed_attempts", default: 0, null: false
         | 
| 244 | 
            +
                t.string "unlock_token"
         | 
| 263 245 | 
             
                t.datetime "locked_at"
         | 
| 264 | 
            -
                t.boolean | 
| 265 | 
            -
                t.string | 
| 266 | 
            -
                t.string | 
| 246 | 
            +
                t.boolean "superuser", default: false, null: false
         | 
| 247 | 
            +
                t.string "authentication_token"
         | 
| 248 | 
            +
                t.string "confirmation_token"
         | 
| 267 249 | 
             
                t.datetime "confirmed_at"
         | 
| 268 250 | 
             
                t.datetime "confirmation_sent_at"
         | 
| 269 | 
            -
                t.string | 
| 270 | 
            -
                t.string | 
| 271 | 
            -
                t.string | 
| 251 | 
            +
                t.string "unconfirmed_email"
         | 
| 252 | 
            +
                t.string "first_name"
         | 
| 253 | 
            +
                t.string "last_name"
         | 
| 254 | 
            +
                t.index ["authentication_token"], name: "index_users_on_authentication_token", unique: true
         | 
| 255 | 
            +
                t.index ["confirmation_token"], name: "index_users_on_confirmation_token", unique: true
         | 
| 256 | 
            +
                t.index ["email"], name: "index_users_on_email", unique: true
         | 
| 257 | 
            +
                t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true
         | 
| 272 258 | 
             
              end
         | 
| 273 259 |  | 
| 274 | 
            -
              add_index "users", ["authentication_token"], name: "index_users_on_authentication_token", unique: true
         | 
| 275 | 
            -
              add_index "users", ["confirmation_token"], name: "index_users_on_confirmation_token", unique: true
         | 
| 276 | 
            -
              add_index "users", ["email"], name: "index_users_on_email", unique: true
         | 
| 277 | 
            -
              add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true
         | 
| 278 | 
            -
             | 
| 279 260 | 
             
            end
         | 
| @@ -174,7 +174,7 @@ describe Dummy::ProjectAPI, type: :request do | |
| 174 174 | 
             
                it "should respect the maximum number of results" do
         | 
| 175 175 | 
             
                  get '/api/v1/projects', params: { per_page: 20, offset: 0 }
         | 
| 176 176 | 
             
                  response.code.should eq "400"
         | 
| 177 | 
            -
                  json['error'].should eq "per_page must be less than 10"
         | 
| 177 | 
            +
                  json['error'].should eq "per_page must be less than or equal 10"
         | 
| 178 178 | 
             
                end
         | 
| 179 179 | 
             
              end
         | 
| 180 180 |  | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: introspective_grape
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 0.4.2
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Josh Buermann
         | 
| 8 | 
            -
            autorequire: | 
| 8 | 
            +
            autorequire:
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date:  | 
| 11 | 
            +
            date: 2021-07-29 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: rails
         | 
| @@ -25,35 +25,41 @@ dependencies: | |
| 25 25 | 
             
                  - !ruby/object:Gem::Version
         | 
| 26 26 | 
             
                    version: 5.0.0
         | 
| 27 27 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 28 | 
            -
              name:  | 
| 28 | 
            +
              name: rack
         | 
| 29 29 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 30 30 | 
             
                requirements:
         | 
| 31 31 | 
             
                - - "<"
         | 
| 32 32 | 
             
                  - !ruby/object:Gem::Version
         | 
| 33 | 
            -
                    version:  | 
| 33 | 
            +
                    version: 2.0.9
         | 
| 34 34 | 
             
              type: :runtime
         | 
| 35 35 | 
             
              prerelease: false
         | 
| 36 36 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 37 37 | 
             
                requirements:
         | 
| 38 38 | 
             
                - - "<"
         | 
| 39 39 | 
             
                  - !ruby/object:Gem::Version
         | 
| 40 | 
            -
                    version:  | 
| 40 | 
            +
                    version: 2.0.9
         | 
| 41 41 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 42 | 
            -
              name: grape | 
| 42 | 
            +
              name: grape
         | 
| 43 43 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 44 44 | 
             
                requirements:
         | 
| 45 | 
            -
                - - " | 
| 45 | 
            +
                - - "~>"
         | 
| 46 46 | 
             
                  - !ruby/object:Gem::Version
         | 
| 47 | 
            -
                    version:  | 
| 47 | 
            +
                    version: 1.2.0
         | 
| 48 | 
            +
                - - "<"
         | 
| 49 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 50 | 
            +
                    version: 1.2.5
         | 
| 48 51 | 
             
              type: :runtime
         | 
| 49 52 | 
             
              prerelease: false
         | 
| 50 53 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 51 54 | 
             
                requirements:
         | 
| 52 | 
            -
                - - " | 
| 55 | 
            +
                - - "~>"
         | 
| 53 56 | 
             
                  - !ruby/object:Gem::Version
         | 
| 54 | 
            -
                    version:  | 
| 57 | 
            +
                    version: 1.2.0
         | 
| 58 | 
            +
                - - "<"
         | 
| 59 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 60 | 
            +
                    version: 1.2.5
         | 
| 55 61 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 56 | 
            -
              name: grape- | 
| 62 | 
            +
              name: grape-entity
         | 
| 57 63 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 58 64 | 
             
                requirements:
         | 
| 59 65 | 
             
                - - ">="
         | 
| @@ -67,21 +73,21 @@ dependencies: | |
| 67 73 | 
             
                  - !ruby/object:Gem::Version
         | 
| 68 74 | 
             
                    version: '0'
         | 
| 69 75 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 70 | 
            -
              name:  | 
| 76 | 
            +
              name: grape-swagger
         | 
| 71 77 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 72 78 | 
             
                requirements:
         | 
| 73 | 
            -
                - - " | 
| 79 | 
            +
                - - ">="
         | 
| 74 80 | 
             
                  - !ruby/object:Gem::Version
         | 
| 75 | 
            -
                    version: ' | 
| 81 | 
            +
                    version: '0'
         | 
| 76 82 | 
             
              type: :runtime
         | 
| 77 83 | 
             
              prerelease: false
         | 
| 78 84 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 79 85 | 
             
                requirements:
         | 
| 80 | 
            -
                - - " | 
| 86 | 
            +
                - - ">="
         | 
| 81 87 | 
             
                  - !ruby/object:Gem::Version
         | 
| 82 | 
            -
                    version: ' | 
| 88 | 
            +
                    version: '0'
         | 
| 83 89 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 84 | 
            -
              name:  | 
| 90 | 
            +
              name: kaminari
         | 
| 85 91 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 86 92 | 
             
                requirements:
         | 
| 87 93 | 
             
                - - ">="
         | 
| @@ -246,14 +252,6 @@ files: | |
| 246 252 | 
             
            - app/models/.keep
         | 
| 247 253 | 
             
            - app/views/.keep
         | 
| 248 254 | 
             
            - bin/rails
         | 
| 249 | 
            -
            - gemfiles/2.0.0-Gemfile
         | 
| 250 | 
            -
            - gemfiles/2.2.0-Gemfile
         | 
| 251 | 
            -
            - gemfiles/Gemfile.rails.3.2.22
         | 
| 252 | 
            -
            - gemfiles/Gemfile.rails.4.1.13
         | 
| 253 | 
            -
            - gemfiles/Gemfile.rails.4.2.10
         | 
| 254 | 
            -
            - gemfiles/Gemfile.rails.4.2.7.1
         | 
| 255 | 
            -
            - gemfiles/Gemfile.rails.4.2.7.1.new.swagger
         | 
| 256 | 
            -
            - gemfiles/Gemfile.rails.4.2.8
         | 
| 257 255 | 
             
            - gemfiles/Gemfile.rails.5.0.0
         | 
| 258 256 | 
             
            - gemfiles/Gemfile.rails.5.0.1
         | 
| 259 257 | 
             
            - gemfiles/Gemfile.rails.5.1.0
         | 
| @@ -263,6 +261,7 @@ files: | |
| 263 261 | 
             
            - lib/introspective_grape.rb
         | 
| 264 262 | 
             
            - lib/introspective_grape/api.rb
         | 
| 265 263 | 
             
            - lib/introspective_grape/camel_snake.rb
         | 
| 264 | 
            +
            - lib/introspective_grape/configuration.rb
         | 
| 266 265 | 
             
            - lib/introspective_grape/create_helpers.rb
         | 
| 267 266 | 
             
            - lib/introspective_grape/doc.rb
         | 
| 268 267 | 
             
            - lib/introspective_grape/filters.rb
         | 
| @@ -383,6 +382,7 @@ files: | |
| 383 382 | 
             
            - spec/dummy/db/migrate/20150820190524_add_user_names.rb
         | 
| 384 383 | 
             
            - spec/dummy/db/migrate/20150824215701_create_images.rb
         | 
| 385 384 | 
             
            - spec/dummy/db/migrate/20150909225019_add_password_to_project.rb
         | 
| 385 | 
            +
            - spec/dummy/db/migrate/20190325231304_add_test_data.rb
         | 
| 386 386 | 
             
            - spec/dummy/db/schema.rb
         | 
| 387 387 | 
             
            - spec/dummy/lib/assets/.keep
         | 
| 388 388 | 
             
            - spec/dummy/log/.keep
         | 
| @@ -419,24 +419,23 @@ homepage: https://github.com/buermann/introspective_grape | |
| 419 419 | 
             
            licenses:
         | 
| 420 420 | 
             
            - MIT
         | 
| 421 421 | 
             
            metadata: {}
         | 
| 422 | 
            -
            post_install_message: | 
| 422 | 
            +
            post_install_message:
         | 
| 423 423 | 
             
            rdoc_options: []
         | 
| 424 424 | 
             
            require_paths:
         | 
| 425 425 | 
             
            - lib
         | 
| 426 426 | 
             
            required_ruby_version: !ruby/object:Gem::Requirement
         | 
| 427 427 | 
             
              requirements:
         | 
| 428 | 
            -
              - - " | 
| 428 | 
            +
              - - ">="
         | 
| 429 429 | 
             
                - !ruby/object:Gem::Version
         | 
| 430 | 
            -
                  version: '2. | 
| 430 | 
            +
                  version: '2.3'
         | 
| 431 431 | 
             
            required_rubygems_version: !ruby/object:Gem::Requirement
         | 
| 432 432 | 
             
              requirements:
         | 
| 433 433 | 
             
              - - ">="
         | 
| 434 434 | 
             
                - !ruby/object:Gem::Version
         | 
| 435 435 | 
             
                  version: '0'
         | 
| 436 436 | 
             
            requirements: []
         | 
| 437 | 
            -
             | 
| 438 | 
            -
             | 
| 439 | 
            -
            signing_key: 
         | 
| 437 | 
            +
            rubygems_version: 3.1.2
         | 
| 438 | 
            +
            signing_key:
         | 
| 440 439 | 
             
            specification_version: 4
         | 
| 441 440 | 
             
            summary: Introspectively configure deeply nested RESTful Grape APIs for ActiveRecord
         | 
| 442 441 | 
             
              models.
         | 
| @@ -551,6 +550,7 @@ test_files: | |
| 551 550 | 
             
            - spec/dummy/db/migrate/20150820190524_add_user_names.rb
         | 
| 552 551 | 
             
            - spec/dummy/db/migrate/20150824215701_create_images.rb
         | 
| 553 552 | 
             
            - spec/dummy/db/migrate/20150909225019_add_password_to_project.rb
         | 
| 553 | 
            +
            - spec/dummy/db/migrate/20190325231304_add_test_data.rb
         | 
| 554 554 | 
             
            - spec/dummy/db/schema.rb
         | 
| 555 555 | 
             
            - spec/dummy/lib/assets/.keep
         | 
| 556 556 | 
             
            - spec/dummy/log/.keep
         | 
    
        data/gemfiles/2.0.0-Gemfile
    DELETED
    
    | @@ -1,22 +0,0 @@ | |
| 1 | 
            -
            source 'https://rubygems.org'
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            # Declare your gem's dependencies in introspective_grape.gemspec.
         | 
| 4 | 
            -
            # Bundler will treat runtime dependencies like base dependencies, and
         | 
| 5 | 
            -
            # development dependencies will be added by default to the :development group.
         | 
| 6 | 
            -
             | 
| 7 | 
            -
            gemspec :path => '../'
         | 
| 8 | 
            -
             | 
| 9 | 
            -
            gem 'grape', '< 0.17'
         | 
| 10 | 
            -
            gem 'grape-swagger', '< 0.12.0'
         | 
| 11 | 
            -
            gem 'nokogiri', '< 1.6.9'
         | 
| 12 | 
            -
            gem 'coveralls', require: false
         | 
| 13 | 
            -
             | 
| 14 | 
            -
            # Declare any dependencies that are still in development here instead of in
         | 
| 15 | 
            -
            # your gemspec. These might include edge Rails or gems from your path or
         | 
| 16 | 
            -
            # Git. Remember to move these dependencies to your gemspec before releasing
         | 
| 17 | 
            -
            # your gem to rubygems.org.
         | 
| 18 | 
            -
             | 
| 19 | 
            -
            group :development,:test do
         | 
| 20 | 
            -
              gem 'rspec'
         | 
| 21 | 
            -
            #  gem 'byebug'
         | 
| 22 | 
            -
            end
         | 
    
        data/gemfiles/2.2.0-Gemfile
    DELETED
    
    | @@ -1,21 +0,0 @@ | |
| 1 | 
            -
            source 'https://rubygems.org'
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            # Declare your gem's dependencies in introspective_grape.gemspec.
         | 
| 4 | 
            -
            # Bundler will treat runtime dependencies like base dependencies, and
         | 
| 5 | 
            -
            # development dependencies will be added by default to the :development group.
         | 
| 6 | 
            -
             | 
| 7 | 
            -
            gemspec :path => '../'
         | 
| 8 | 
            -
             | 
| 9 | 
            -
            gem 'grape', '< 1.0.0'
         | 
| 10 | 
            -
            gem 'grape-swagger'
         | 
| 11 | 
            -
            gem 'coveralls', require: false
         | 
| 12 | 
            -
             | 
| 13 | 
            -
            #
         | 
| 14 | 
            -
            # Declare any dependencies that are still in development here instead of in
         | 
| 15 | 
            -
            # your gemspec. These might include edge Rails or gems from your path or
         | 
| 16 | 
            -
            # Git. Remember to move these dependencies to your gemspec before releasing
         | 
| 17 | 
            -
            # your gem to rubygems.org.
         | 
| 18 | 
            -
             | 
| 19 | 
            -
            group :development do
         | 
| 20 | 
            -
            #  gem 'byebug'
         | 
| 21 | 
            -
            end
         | 
| @@ -1,13 +0,0 @@ | |
| 1 | 
            -
            source 'https://rubygems.org'
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            gemspec :path => '../'
         | 
| 4 | 
            -
             | 
| 5 | 
            -
            gem 'rails', '3.2.22'
         | 
| 6 | 
            -
            gem 'grape', '< 0.17'
         | 
| 7 | 
            -
            gem 'grape-swagger', '< 0.12.0'
         | 
| 8 | 
            -
            gem 'nokogiri', '< 1.6.9'
         | 
| 9 | 
            -
            gem 'coveralls', require: false
         | 
| 10 | 
            -
             | 
| 11 | 
            -
            group :development,:test do
         | 
| 12 | 
            -
              gem 'rspec'
         | 
| 13 | 
            -
            end
         | 
| @@ -1,13 +0,0 @@ | |
| 1 | 
            -
            source 'https://rubygems.org'
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            gemspec :path => '../'
         | 
| 4 | 
            -
             | 
| 5 | 
            -
            gem 'rails', '4.1.13'
         | 
| 6 | 
            -
            gem 'grape', '< 0.17'
         | 
| 7 | 
            -
            gem 'grape-swagger', '< 0.12.0'
         | 
| 8 | 
            -
            gem 'nokogiri', '< 1.6.9'
         | 
| 9 | 
            -
            gem 'coveralls', require: false
         | 
| 10 | 
            -
             | 
| 11 | 
            -
            group :development,:test do
         | 
| 12 | 
            -
              gem 'rspec'
         | 
| 13 | 
            -
            end
         | 
| @@ -1,14 +0,0 @@ | |
| 1 | 
            -
            source 'https://rubygems.org'
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            gemspec :path => '../'
         | 
| 4 | 
            -
             | 
| 5 | 
            -
            gem 'rails', '4.2.7.1'
         | 
| 6 | 
            -
            gem 'grape', '< 0.17'
         | 
| 7 | 
            -
            gem 'grape-swagger', '< 0.12.0'
         | 
| 8 | 
            -
            gem 'nokogiri', '< 1.6.9'
         | 
| 9 | 
            -
            gem 'machinist'
         | 
| 10 | 
            -
            gem 'coveralls', require: false
         | 
| 11 | 
            -
             | 
| 12 | 
            -
            group :development,:test do
         | 
| 13 | 
            -
              gem 'rspec'
         | 
| 14 | 
            -
            end
         | 
| @@ -1,14 +0,0 @@ | |
| 1 | 
            -
            source 'https://rubygems.org'
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            gemspec :path => '../'
         | 
| 4 | 
            -
             | 
| 5 | 
            -
            gem 'rails', '4.2.8'
         | 
| 6 | 
            -
            gem 'grape', '> 0.17'
         | 
| 7 | 
            -
            gem 'grape-swagger', '> 0.12.0'
         | 
| 8 | 
            -
            gem 'machinist'
         | 
| 9 | 
            -
            gem 'nokogiri', '< 1.10.1'
         | 
| 10 | 
            -
            gem 'coveralls', require: false
         | 
| 11 | 
            -
             | 
| 12 | 
            -
            group :development,:test do
         | 
| 13 | 
            -
              gem 'rspec'
         | 
| 14 | 
            -
            end
         |