paper_trail 4.2.0 → 5.0.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/{CONTRIBUTING.md → .github/CONTRIBUTING.md} +28 -9
 - data/.github/ISSUE_TEMPLATE.md +13 -0
 - data/.gitignore +2 -1
 - data/.rubocop.yml +100 -0
 - data/.rubocop_todo.yml +14 -0
 - data/.travis.yml +8 -9
 - data/Appraisals +41 -0
 - data/CHANGELOG.md +49 -9
 - data/Gemfile +1 -1
 - data/README.md +130 -109
 - data/Rakefile +19 -19
 - data/doc/bug_report_template.rb +20 -14
 - data/gemfiles/ar3.gemfile +10 -53
 - data/gemfiles/ar4.gemfile +7 -0
 - data/gemfiles/ar5.gemfile +13 -0
 - data/lib/generators/paper_trail/install_generator.rb +26 -18
 - data/lib/generators/paper_trail/templates/add_object_changes_to_versions.rb +4 -2
 - data/lib/generators/paper_trail/templates/add_transaction_id_column_to_versions.rb +2 -0
 - data/lib/generators/paper_trail/templates/create_version_associations.rb +9 -4
 - data/lib/generators/paper_trail/templates/create_versions.rb +39 -5
 - data/lib/paper_trail.rb +169 -146
 - data/lib/paper_trail/attributes_serialization.rb +89 -17
 - data/lib/paper_trail/cleaner.rb +15 -9
 - data/lib/paper_trail/config.rb +28 -11
 - data/lib/paper_trail/frameworks/active_record.rb +4 -0
 - data/lib/paper_trail/frameworks/active_record/models/paper_trail/version.rb +5 -1
 - data/lib/paper_trail/frameworks/active_record/models/paper_trail/version_association.rb +6 -2
 - data/lib/paper_trail/frameworks/cucumber.rb +1 -0
 - data/lib/paper_trail/frameworks/rails.rb +2 -7
 - data/lib/paper_trail/frameworks/rails/controller.rb +29 -9
 - data/lib/paper_trail/frameworks/rails/engine.rb +7 -1
 - data/lib/paper_trail/frameworks/rspec.rb +5 -5
 - data/lib/paper_trail/frameworks/rspec/helpers.rb +3 -1
 - data/lib/paper_trail/frameworks/sinatra.rb +6 -4
 - data/lib/paper_trail/has_paper_trail.rb +199 -106
 - data/lib/paper_trail/record_history.rb +1 -3
 - data/lib/paper_trail/reifier.rb +297 -118
 - data/lib/paper_trail/serializers/json.rb +3 -3
 - data/lib/paper_trail/serializers/yaml.rb +27 -8
 - data/lib/paper_trail/version_association_concern.rb +3 -1
 - data/lib/paper_trail/version_concern.rb +75 -35
 - data/lib/paper_trail/version_number.rb +6 -9
 - data/paper_trail.gemspec +44 -51
 - data/spec/generators/install_generator_spec.rb +24 -25
 - data/spec/generators/paper_trail/templates/create_versions_spec.rb +51 -0
 - data/spec/models/animal_spec.rb +12 -12
 - data/spec/models/boolit_spec.rb +8 -8
 - data/spec/models/callback_modifier_spec.rb +47 -47
 - data/spec/models/car_spec.rb +13 -0
 - data/spec/models/fluxor_spec.rb +3 -3
 - data/spec/models/gadget_spec.rb +19 -19
 - data/spec/models/joined_version_spec.rb +3 -3
 - data/spec/models/json_version_spec.rb +23 -24
 - data/spec/models/kitchen/banana_spec.rb +3 -3
 - data/spec/models/not_on_update_spec.rb +7 -4
 - data/spec/models/post_with_status_spec.rb +13 -3
 - data/spec/models/skipper_spec.rb +10 -10
 - data/spec/models/thing_spec.rb +4 -4
 - data/spec/models/truck_spec.rb +5 -0
 - data/spec/models/vehicle_spec.rb +5 -0
 - data/spec/models/version_spec.rb +103 -59
 - data/spec/models/widget_spec.rb +82 -52
 - data/spec/modules/paper_trail_spec.rb +2 -2
 - data/spec/modules/version_concern_spec.rb +11 -12
 - data/spec/modules/version_number_spec.rb +2 -4
 - data/spec/paper_trail/config_spec.rb +10 -29
 - data/spec/paper_trail_spec.rb +16 -14
 - data/spec/rails_helper.rb +10 -9
 - data/spec/requests/articles_spec.rb +11 -7
 - data/spec/spec_helper.rb +41 -22
 - data/spec/support/alt_db_init.rb +8 -13
 - data/test/custom_json_serializer.rb +3 -3
 - data/test/dummy/Rakefile +2 -2
 - data/test/dummy/app/controllers/application_controller.rb +21 -8
 - data/test/dummy/app/controllers/articles_controller.rb +11 -8
 - data/test/dummy/app/controllers/widgets_controller.rb +13 -12
 - data/test/dummy/app/models/animal.rb +1 -1
 - data/test/dummy/app/models/article.rb +19 -11
 - data/test/dummy/app/models/authorship.rb +1 -1
 - data/test/dummy/app/models/bar_habtm.rb +4 -0
 - data/test/dummy/app/models/book.rb +4 -4
 - data/test/dummy/app/models/boolit.rb +1 -1
 - data/test/dummy/app/models/callback_modifier.rb +6 -6
 - data/test/dummy/app/models/car.rb +3 -0
 - data/test/dummy/app/models/chapter.rb +4 -4
 - data/test/dummy/app/models/customer.rb +1 -1
 - data/test/dummy/app/models/document.rb +2 -2
 - data/test/dummy/app/models/editor.rb +1 -1
 - data/test/dummy/app/models/foo_habtm.rb +4 -0
 - data/test/dummy/app/models/fruit.rb +2 -2
 - data/test/dummy/app/models/gadget.rb +1 -1
 - data/test/dummy/app/models/kitchen/banana.rb +1 -1
 - data/test/dummy/app/models/legacy_widget.rb +2 -2
 - data/test/dummy/app/models/line_item.rb +1 -1
 - data/test/dummy/app/models/not_on_update.rb +1 -1
 - data/test/dummy/app/models/person.rb +6 -6
 - data/test/dummy/app/models/post.rb +1 -1
 - data/test/dummy/app/models/post_with_status.rb +1 -1
 - data/test/dummy/app/models/quotation.rb +1 -1
 - data/test/dummy/app/models/section.rb +1 -1
 - data/test/dummy/app/models/skipper.rb +2 -2
 - data/test/dummy/app/models/song.rb +13 -4
 - data/test/dummy/app/models/thing.rb +2 -2
 - data/test/dummy/app/models/translation.rb +2 -2
 - data/test/dummy/app/models/truck.rb +4 -0
 - data/test/dummy/app/models/vehicle.rb +4 -0
 - data/test/dummy/app/models/whatchamajigger.rb +1 -1
 - data/test/dummy/app/models/widget.rb +7 -6
 - data/test/dummy/app/versions/joined_version.rb +4 -3
 - data/test/dummy/app/versions/json_version.rb +1 -1
 - data/test/dummy/app/versions/kitchen/banana_version.rb +1 -1
 - data/test/dummy/app/versions/post_version.rb +2 -2
 - data/test/dummy/config.ru +1 -1
 - data/test/dummy/config/application.rb +20 -9
 - data/test/dummy/config/boot.rb +5 -5
 - data/test/dummy/config/environment.rb +1 -1
 - data/test/dummy/config/environments/development.rb +4 -3
 - data/test/dummy/config/environments/production.rb +3 -2
 - data/test/dummy/config/environments/test.rb +15 -5
 - data/test/dummy/config/initializers/backtrace_silencers.rb +4 -2
 - data/test/dummy/config/initializers/paper_trail.rb +1 -2
 - data/test/dummy/config/initializers/secret_token.rb +3 -1
 - data/test/dummy/config/initializers/session_store.rb +1 -1
 - data/test/dummy/config/routes.rb +2 -2
 - data/test/dummy/db/migrate/20110208155312_set_up_test_tables.rb +120 -74
 - data/test/dummy/db/schema.rb +29 -6
 - data/test/dummy/script/rails +6 -4
 - data/test/functional/controller_test.rb +34 -35
 - data/test/functional/enabled_for_controller_test.rb +6 -7
 - data/test/functional/modular_sinatra_test.rb +43 -38
 - data/test/functional/sinatra_test.rb +49 -40
 - data/test/functional/thread_safety_test.rb +4 -6
 - data/test/paper_trail_test.rb +15 -14
 - data/test/test_helper.rb +68 -44
 - data/test/time_travel_helper.rb +1 -15
 - data/test/unit/associations_test.rb +517 -251
 - data/test/unit/cleaner_test.rb +66 -60
 - data/test/unit/inheritance_column_test.rb +17 -17
 - data/test/unit/model_test.rb +611 -504
 - data/test/unit/protected_attrs_test.rb +16 -12
 - data/test/unit/serializer_test.rb +44 -43
 - data/test/unit/serializers/json_test.rb +17 -18
 - data/test/unit/serializers/mixin_json_test.rb +15 -14
 - data/test/unit/serializers/mixin_yaml_test.rb +20 -16
 - data/test/unit/serializers/yaml_test.rb +12 -13
 - data/test/unit/timestamp_test.rb +10 -12
 - data/test/unit/version_test.rb +7 -7
 - metadata +92 -40
 
| 
         @@ -1,7 +1,8 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            require  
     | 
| 
      
 1 
     | 
    
         
            +
            require "active_support/json"
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            module PaperTrail
         
     | 
| 
       4 
4 
     | 
    
         
             
              module Serializers
         
     | 
| 
      
 5 
     | 
    
         
            +
                # An alternate serializer for, e.g. `versions.object`.
         
     | 
| 
       5 
6 
     | 
    
         
             
                module JSON
         
     | 
| 
       6 
7 
     | 
    
         
             
                  extend self # makes all instance methods become module methods as well
         
     | 
| 
       7 
8 
     | 
    
         | 
| 
         @@ -25,8 +26,7 @@ module PaperTrail 
     | 
|
| 
       25 
26 
     | 
    
         
             
                    # 123.
         
     | 
| 
       26 
27 
     | 
    
         
             
                    if value.is_a? Numeric
         
     | 
| 
       27 
28 
     | 
    
         
             
                      arel_field.matches("%\"#{field}\":#{json_value},%").
         
     | 
| 
       28 
     | 
    
         
            -
                        or(
         
     | 
| 
       29 
     | 
    
         
            -
                      arel_field.matches("%\"#{field}\":#{json_value}}%"))
         
     | 
| 
      
 29 
     | 
    
         
            +
                        or(arel_field.matches("%\"#{field}\":#{json_value}}%"))
         
     | 
| 
       30 
30 
     | 
    
         
             
                    else
         
     | 
| 
       31 
31 
     | 
    
         
             
                      arel_field.matches("%\"#{field}\":#{json_value}%")
         
     | 
| 
       32 
32 
     | 
    
         
             
                    end
         
     | 
| 
         @@ -1,7 +1,8 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            require  
     | 
| 
      
 1 
     | 
    
         
            +
            require "yaml"
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            module PaperTrail
         
     | 
| 
       4 
4 
     | 
    
         
             
              module Serializers
         
     | 
| 
      
 5 
     | 
    
         
            +
                # The default serializer for, e.g. `versions.object`.
         
     | 
| 
       5 
6 
     | 
    
         
             
                module YAML
         
     | 
| 
       6 
7 
     | 
    
         
             
                  extend self # makes all instance methods become module methods as well
         
     | 
| 
       7 
8 
     | 
    
         | 
| 
         @@ -23,13 +24,31 @@ module PaperTrail 
     | 
|
| 
       23 
24 
     | 
    
         
             
                  # in the serialized object_changes
         
     | 
| 
       24 
25 
     | 
    
         
             
                  def where_object_changes_condition(arel_field, field, value)
         
     | 
| 
       25 
26 
     | 
    
         
             
                    # Need to check first (before) and secondary (after) fields
         
     | 
| 
       26 
     | 
    
         
            -
                     
     | 
| 
       27 
     | 
    
         
            -
             
     | 
| 
       28 
     | 
    
         
            -
             
     | 
| 
       29 
     | 
    
         
            -
             
     | 
| 
       30 
     | 
    
         
            -
             
     | 
| 
       31 
     | 
    
         
            -
                       
     | 
| 
       32 
     | 
    
         
            -
             
     | 
| 
      
 27 
     | 
    
         
            +
                    m1 = nil
         
     | 
| 
      
 28 
     | 
    
         
            +
                    m2 = nil
         
     | 
| 
      
 29 
     | 
    
         
            +
                    case yaml_engine_id
         
     | 
| 
      
 30 
     | 
    
         
            +
                    when :psych
         
     | 
| 
      
 31 
     | 
    
         
            +
                      m1 = "%\n#{field}:\n- #{value}\n%"
         
     | 
| 
      
 32 
     | 
    
         
            +
                      m2 = "%\n#{field}:\n-%\n- #{value}\n%"
         
     | 
| 
      
 33 
     | 
    
         
            +
                    when :syck
         
     | 
| 
      
 34 
     | 
    
         
            +
                      # Syck adds extra spaces into array dumps
         
     | 
| 
      
 35 
     | 
    
         
            +
                      m1 = "%\n#{field}: \n%- #{value}\n%"
         
     | 
| 
      
 36 
     | 
    
         
            +
                      m2 = "%\n#{field}: \n-%\n- #{value}\n%"
         
     | 
| 
      
 37 
     | 
    
         
            +
                    else
         
     | 
| 
      
 38 
     | 
    
         
            +
                      raise "Unknown yaml engine"
         
     | 
| 
      
 39 
     | 
    
         
            +
                    end
         
     | 
| 
      
 40 
     | 
    
         
            +
                    arel_field.matches(m1).or(arel_field.matches(m2))
         
     | 
| 
      
 41 
     | 
    
         
            +
                  end
         
     | 
| 
      
 42 
     | 
    
         
            +
             
     | 
| 
      
 43 
     | 
    
         
            +
                  # Returns a symbol identifying the YAML engine. Syck was removed from
         
     | 
| 
      
 44 
     | 
    
         
            +
                  # the ruby stdlib in ruby 2.0, but is still available as a gem.
         
     | 
| 
      
 45 
     | 
    
         
            +
                  # @api private
         
     | 
| 
      
 46 
     | 
    
         
            +
                  def yaml_engine_id
         
     | 
| 
      
 47 
     | 
    
         
            +
                    if (defined?(::YAML::ENGINE) && ::YAML::ENGINE.yamler == "psych") ||
         
     | 
| 
      
 48 
     | 
    
         
            +
                        (defined?(::Psych) && ::YAML == ::Psych)
         
     | 
| 
      
 49 
     | 
    
         
            +
                      :psych
         
     | 
| 
      
 50 
     | 
    
         
            +
                    else
         
     | 
| 
      
 51 
     | 
    
         
            +
                      :syck
         
     | 
| 
       33 
52 
     | 
    
         
             
                    end
         
     | 
| 
       34 
53 
     | 
    
         
             
                  end
         
     | 
| 
       35 
54 
     | 
    
         
             
                end
         
     | 
| 
         @@ -1,6 +1,8 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            require  
     | 
| 
      
 1 
     | 
    
         
            +
            require "active_support/concern"
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            module PaperTrail
         
     | 
| 
      
 4 
     | 
    
         
            +
              # Functionality for `PaperTrail::VersionAssociation`. Exists in a module
         
     | 
| 
      
 5 
     | 
    
         
            +
              # for the same reasons outlined in version_concern.rb.
         
     | 
| 
       4 
6 
     | 
    
         
             
              module VersionAssociationConcern
         
     | 
| 
       5 
7 
     | 
    
         
             
                extend ::ActiveSupport::Concern
         
     | 
| 
       6 
8 
     | 
    
         | 
| 
         @@ -1,18 +1,22 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            require  
     | 
| 
      
 1 
     | 
    
         
            +
            require "active_support/concern"
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            module PaperTrail
         
     | 
| 
      
 4 
     | 
    
         
            +
              # Originally, PaperTrail did not provide this module, and all of this
         
     | 
| 
      
 5 
     | 
    
         
            +
              # functionality was in `PaperTrail::Version`. That model still exists (and is
         
     | 
| 
      
 6 
     | 
    
         
            +
              # used by most apps) but by moving the functionality to this module, people
         
     | 
| 
      
 7 
     | 
    
         
            +
              # can include this concern instead of sub-classing the `Version` model.
         
     | 
| 
       4 
8 
     | 
    
         
             
              module VersionConcern
         
     | 
| 
       5 
9 
     | 
    
         
             
                extend ::ActiveSupport::Concern
         
     | 
| 
       6 
10 
     | 
    
         | 
| 
       7 
11 
     | 
    
         
             
                included do
         
     | 
| 
       8 
     | 
    
         
            -
                  belongs_to :item, : 
     | 
| 
      
 12 
     | 
    
         
            +
                  belongs_to :item, polymorphic: true
         
     | 
| 
       9 
13 
     | 
    
         | 
| 
       10 
14 
     | 
    
         
             
                  # Since the test suite has test coverage for this, we want to declare
         
     | 
| 
       11 
15 
     | 
    
         
             
                  # the association when the test suite is running. This makes it pass when
         
     | 
| 
       12 
16 
     | 
    
         
             
                  # DB is not initialized prior to test runs such as when we run on Travis
         
     | 
| 
       13 
17 
     | 
    
         
             
                  # CI (there won't be a db in `test/dummy/db/`).
         
     | 
| 
       14 
18 
     | 
    
         
             
                  if PaperTrail.config.track_associations?
         
     | 
| 
       15 
     | 
    
         
            -
                    has_many :version_associations, : 
     | 
| 
      
 19 
     | 
    
         
            +
                    has_many :version_associations, dependent: :destroy
         
     | 
| 
       16 
20 
     | 
    
         
             
                  end
         
     | 
| 
       17 
21 
     | 
    
         | 
| 
       18 
22 
     | 
    
         
             
                  validates_presence_of :event
         
     | 
| 
         @@ -32,28 +36,29 @@ module PaperTrail 
     | 
|
| 
       32 
36 
     | 
    
         | 
| 
       33 
37 
     | 
    
         
             
                  after_create :enforce_version_limit!
         
     | 
| 
       34 
38 
     | 
    
         | 
| 
       35 
     | 
    
         
            -
                  scope :within_transaction,  
     | 
| 
      
 39 
     | 
    
         
            +
                  scope :within_transaction, ->(id) { where transaction_id: id }
         
     | 
| 
       36 
40 
     | 
    
         
             
                end
         
     | 
| 
       37 
41 
     | 
    
         | 
| 
      
 42 
     | 
    
         
            +
                # :nodoc:
         
     | 
| 
       38 
43 
     | 
    
         
             
                module ClassMethods
         
     | 
| 
       39 
44 
     | 
    
         
             
                  def with_item_keys(item_type, item_id)
         
     | 
| 
       40 
     | 
    
         
            -
                    where : 
     | 
| 
      
 45 
     | 
    
         
            +
                    where item_type: item_type, item_id: item_id
         
     | 
| 
       41 
46 
     | 
    
         
             
                  end
         
     | 
| 
       42 
47 
     | 
    
         | 
| 
       43 
48 
     | 
    
         
             
                  def creates
         
     | 
| 
       44 
     | 
    
         
            -
                    where : 
     | 
| 
      
 49 
     | 
    
         
            +
                    where event: "create"
         
     | 
| 
       45 
50 
     | 
    
         
             
                  end
         
     | 
| 
       46 
51 
     | 
    
         | 
| 
       47 
52 
     | 
    
         
             
                  def updates
         
     | 
| 
       48 
     | 
    
         
            -
                    where : 
     | 
| 
      
 53 
     | 
    
         
            +
                    where event: "update"
         
     | 
| 
       49 
54 
     | 
    
         
             
                  end
         
     | 
| 
       50 
55 
     | 
    
         | 
| 
       51 
56 
     | 
    
         
             
                  def destroys
         
     | 
| 
       52 
     | 
    
         
            -
                    where : 
     | 
| 
      
 57 
     | 
    
         
            +
                    where event: "destroy"
         
     | 
| 
       53 
58 
     | 
    
         
             
                  end
         
     | 
| 
       54 
59 
     | 
    
         | 
| 
       55 
60 
     | 
    
         
             
                  def not_creates
         
     | 
| 
       56 
     | 
    
         
            -
                    where  
     | 
| 
      
 61 
     | 
    
         
            +
                    where "event <> ?", "create"
         
     | 
| 
       57 
62 
     | 
    
         
             
                  end
         
     | 
| 
       58 
63 
     | 
    
         | 
| 
       59 
64 
     | 
    
         
             
                  # Returns versions after `obj`.
         
     | 
| 
         @@ -64,12 +69,12 @@ module PaperTrail 
     | 
|
| 
       64 
69 
     | 
    
         
             
                  # @return `ActiveRecord::Relation`
         
     | 
| 
       65 
70 
     | 
    
         
             
                  # @api public
         
     | 
| 
       66 
71 
     | 
    
         
             
                  def subsequent(obj, timestamp_arg = false)
         
     | 
| 
       67 
     | 
    
         
            -
                    if timestamp_arg != true &&  
     | 
| 
      
 72 
     | 
    
         
            +
                    if timestamp_arg != true && primary_key_is_int?
         
     | 
| 
       68 
73 
     | 
    
         
             
                      return where(arel_table[primary_key].gt(obj.id)).order(arel_table[primary_key].asc)
         
     | 
| 
       69 
74 
     | 
    
         
             
                    end
         
     | 
| 
       70 
75 
     | 
    
         | 
| 
       71 
76 
     | 
    
         
             
                    obj = obj.send(PaperTrail.timestamp_field) if obj.is_a?(self)
         
     | 
| 
       72 
     | 
    
         
            -
                    where(arel_table[PaperTrail.timestamp_field].gt(obj)).order( 
     | 
| 
      
 77 
     | 
    
         
            +
                    where(arel_table[PaperTrail.timestamp_field].gt(obj)).order(timestamp_sort_order)
         
     | 
| 
       73 
78 
     | 
    
         
             
                  end
         
     | 
| 
       74 
79 
     | 
    
         | 
| 
       75 
80 
     | 
    
         
             
                  # Returns versions before `obj`.
         
     | 
| 
         @@ -80,37 +85,38 @@ module PaperTrail 
     | 
|
| 
       80 
85 
     | 
    
         
             
                  # @return `ActiveRecord::Relation`
         
     | 
| 
       81 
86 
     | 
    
         
             
                  # @api public
         
     | 
| 
       82 
87 
     | 
    
         
             
                  def preceding(obj, timestamp_arg = false)
         
     | 
| 
       83 
     | 
    
         
            -
                    if timestamp_arg != true &&  
     | 
| 
      
 88 
     | 
    
         
            +
                    if timestamp_arg != true && primary_key_is_int?
         
     | 
| 
       84 
89 
     | 
    
         
             
                      return where(arel_table[primary_key].lt(obj.id)).order(arel_table[primary_key].desc)
         
     | 
| 
       85 
90 
     | 
    
         
             
                    end
         
     | 
| 
       86 
91 
     | 
    
         | 
| 
       87 
92 
     | 
    
         
             
                    obj = obj.send(PaperTrail.timestamp_field) if obj.is_a?(self)
         
     | 
| 
       88 
     | 
    
         
            -
                    where(arel_table[PaperTrail.timestamp_field].lt(obj)). 
     | 
| 
      
 93 
     | 
    
         
            +
                    where(arel_table[PaperTrail.timestamp_field].lt(obj)).
         
     | 
| 
      
 94 
     | 
    
         
            +
                      order(timestamp_sort_order("desc"))
         
     | 
| 
       89 
95 
     | 
    
         
             
                  end
         
     | 
| 
       90 
96 
     | 
    
         | 
| 
       91 
97 
     | 
    
         
             
                  def between(start_time, end_time)
         
     | 
| 
       92 
98 
     | 
    
         
             
                    where(
         
     | 
| 
       93 
99 
     | 
    
         
             
                      arel_table[PaperTrail.timestamp_field].gt(start_time).
         
     | 
| 
       94 
100 
     | 
    
         
             
                      and(arel_table[PaperTrail.timestamp_field].lt(end_time))
         
     | 
| 
       95 
     | 
    
         
            -
                    ).order( 
     | 
| 
      
 101 
     | 
    
         
            +
                    ).order(timestamp_sort_order)
         
     | 
| 
       96 
102 
     | 
    
         
             
                  end
         
     | 
| 
       97 
103 
     | 
    
         | 
| 
       98 
104 
     | 
    
         
             
                  # Defaults to using the primary key as the secondary sort order if
         
     | 
| 
       99 
105 
     | 
    
         
             
                  # possible.
         
     | 
| 
       100 
     | 
    
         
            -
                  def timestamp_sort_order(direction =  
     | 
| 
      
 106 
     | 
    
         
            +
                  def timestamp_sort_order(direction = "asc")
         
     | 
| 
       101 
107 
     | 
    
         
             
                    [arel_table[PaperTrail.timestamp_field].send(direction.downcase)].tap do |array|
         
     | 
| 
       102 
     | 
    
         
            -
                      array << arel_table[primary_key].send(direction.downcase) if  
     | 
| 
      
 108 
     | 
    
         
            +
                      array << arel_table[primary_key].send(direction.downcase) if primary_key_is_int?
         
     | 
| 
       103 
109 
     | 
    
         
             
                    end
         
     | 
| 
       104 
110 
     | 
    
         
             
                  end
         
     | 
| 
       105 
111 
     | 
    
         | 
| 
       106 
112 
     | 
    
         
             
                  # Performs an attribute search on the serialized object by invoking the
         
     | 
| 
       107 
113 
     | 
    
         
             
                  # identically-named method in the serializer being used.
         
     | 
| 
       108 
114 
     | 
    
         
             
                  def where_object(args = {})
         
     | 
| 
       109 
     | 
    
         
            -
                    raise ArgumentError,  
     | 
| 
      
 115 
     | 
    
         
            +
                    raise ArgumentError, "expected to receive a Hash" unless args.is_a?(Hash)
         
     | 
| 
       110 
116 
     | 
    
         | 
| 
       111 
     | 
    
         
            -
                    if columns_hash[ 
     | 
| 
      
 117 
     | 
    
         
            +
                    if columns_hash["object"].type == :jsonb
         
     | 
| 
       112 
118 
     | 
    
         
             
                      where("object @> ?", args.to_json)
         
     | 
| 
       113 
     | 
    
         
            -
                    elsif columns_hash[ 
     | 
| 
      
 119 
     | 
    
         
            +
                    elsif columns_hash["object"].type == :json
         
     | 
| 
       114 
120 
     | 
    
         
             
                      predicates = []
         
     | 
| 
       115 
121 
     | 
    
         
             
                      values = []
         
     | 
| 
       116 
122 
     | 
    
         
             
                      args.each do |field, value|
         
     | 
| 
         @@ -123,18 +129,19 @@ module PaperTrail 
     | 
|
| 
       123 
129 
     | 
    
         
             
                      arel_field = arel_table[:object]
         
     | 
| 
       124 
130 
     | 
    
         
             
                      where_conditions = args.map { |field, value|
         
     | 
| 
       125 
131 
     | 
    
         
             
                        PaperTrail.serializer.where_object_condition(arel_field, field, value)
         
     | 
| 
       126 
     | 
    
         
            -
                      } 
     | 
| 
      
 132 
     | 
    
         
            +
                      }
         
     | 
| 
      
 133 
     | 
    
         
            +
                      where_conditions = where_conditions.reduce { |a, e| a.and(e) }
         
     | 
| 
       127 
134 
     | 
    
         
             
                      where(where_conditions)
         
     | 
| 
       128 
135 
     | 
    
         
             
                    end
         
     | 
| 
       129 
136 
     | 
    
         
             
                  end
         
     | 
| 
       130 
137 
     | 
    
         | 
| 
       131 
138 
     | 
    
         
             
                  def where_object_changes(args = {})
         
     | 
| 
       132 
     | 
    
         
            -
                    raise ArgumentError,  
     | 
| 
      
 139 
     | 
    
         
            +
                    raise ArgumentError, "expected to receive a Hash" unless args.is_a?(Hash)
         
     | 
| 
       133 
140 
     | 
    
         | 
| 
       134 
     | 
    
         
            -
                    if columns_hash[ 
     | 
| 
      
 141 
     | 
    
         
            +
                    if columns_hash["object_changes"].type == :jsonb
         
     | 
| 
       135 
142 
     | 
    
         
             
                      args.each { |field, value| args[field] = [value] }
         
     | 
| 
       136 
143 
     | 
    
         
             
                      where("object_changes @> ?", args.to_json)
         
     | 
| 
       137 
     | 
    
         
            -
                    elsif columns_hash[ 
     | 
| 
      
 144 
     | 
    
         
            +
                    elsif columns_hash["object"].type == :json
         
     | 
| 
       138 
145 
     | 
    
         
             
                      predicates = []
         
     | 
| 
       139 
146 
     | 
    
         
             
                      values = []
         
     | 
| 
       140 
147 
     | 
    
         
             
                      args.each do |field, value|
         
     | 
| 
         @@ -149,7 +156,8 @@ module PaperTrail 
     | 
|
| 
       149 
156 
     | 
    
         
             
                      arel_field = arel_table[:object_changes]
         
     | 
| 
       150 
157 
     | 
    
         
             
                      where_conditions = args.map { |field, value|
         
     | 
| 
       151 
158 
     | 
    
         
             
                        PaperTrail.serializer.where_object_changes_condition(arel_field, field, value)
         
     | 
| 
       152 
     | 
    
         
            -
                      } 
     | 
| 
      
 159 
     | 
    
         
            +
                      }
         
     | 
| 
      
 160 
     | 
    
         
            +
                      where_conditions = where_conditions.reduce { |a, e| a.and(e) }
         
     | 
| 
       153 
161 
     | 
    
         
             
                      where(where_conditions)
         
     | 
| 
       154 
162 
     | 
    
         
             
                    end
         
     | 
| 
       155 
163 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -163,13 +171,22 @@ module PaperTrail 
     | 
|
| 
       163 
171 
     | 
    
         
             
                  # Returns whether the `object` column is using the `json` type supported
         
     | 
| 
       164 
172 
     | 
    
         
             
                  # by PostgreSQL.
         
     | 
| 
       165 
173 
     | 
    
         
             
                  def object_col_is_json?
         
     | 
| 
       166 
     | 
    
         
            -
                    [:json, :jsonb].include?(columns_hash[ 
     | 
| 
      
 174 
     | 
    
         
            +
                    [:json, :jsonb].include?(columns_hash["object"].type)
         
     | 
| 
       167 
175 
     | 
    
         
             
                  end
         
     | 
| 
       168 
176 
     | 
    
         | 
| 
       169 
177 
     | 
    
         
             
                  # Returns whether the `object_changes` column is using the `json` type
         
     | 
| 
       170 
178 
     | 
    
         
             
                  # supported by PostgreSQL.
         
     | 
| 
       171 
179 
     | 
    
         
             
                  def object_changes_col_is_json?
         
     | 
| 
       172 
     | 
    
         
            -
                    [:json, :jsonb].include?(columns_hash[ 
     | 
| 
      
 180 
     | 
    
         
            +
                    [:json, :jsonb].include?(columns_hash["object_changes"].try(:type))
         
     | 
| 
      
 181 
     | 
    
         
            +
                  end
         
     | 
| 
      
 182 
     | 
    
         
            +
                end
         
     | 
| 
      
 183 
     | 
    
         
            +
             
     | 
| 
      
 184 
     | 
    
         
            +
                # @api private
         
     | 
| 
      
 185 
     | 
    
         
            +
                def object_deserialized
         
     | 
| 
      
 186 
     | 
    
         
            +
                  if self.class.object_col_is_json?
         
     | 
| 
      
 187 
     | 
    
         
            +
                    object
         
     | 
| 
      
 188 
     | 
    
         
            +
                  else
         
     | 
| 
      
 189 
     | 
    
         
            +
                    PaperTrail.serializer.load(object)
         
     | 
| 
       173 
190 
     | 
    
         
             
                  end
         
     | 
| 
       174 
191 
     | 
    
         
             
                end
         
     | 
| 
       175 
192 
     | 
    
         | 
| 
         @@ -211,18 +228,18 @@ module PaperTrail 
     | 
|
| 
       211 
228 
     | 
    
         
             
                # `ActiveModel::Dirty#changes`. returns `nil` if your `versions` table does
         
     | 
| 
       212 
229 
     | 
    
         
             
                # not have an `object_changes` text column.
         
     | 
| 
       213 
230 
     | 
    
         
             
                def changeset
         
     | 
| 
       214 
     | 
    
         
            -
                  return nil unless self.class.column_names.include?  
     | 
| 
      
 231 
     | 
    
         
            +
                  return nil unless self.class.column_names.include? "object_changes"
         
     | 
| 
       215 
232 
     | 
    
         
             
                  @changeset ||= load_changeset
         
     | 
| 
       216 
233 
     | 
    
         
             
                end
         
     | 
| 
       217 
234 
     | 
    
         | 
| 
       218 
235 
     | 
    
         
             
                # Returns who put the item into the state stored in this version.
         
     | 
| 
       219 
236 
     | 
    
         
             
                def paper_trail_originator
         
     | 
| 
       220 
     | 
    
         
            -
                  @paper_trail_originator ||= previous.whodunnit 
     | 
| 
      
 237 
     | 
    
         
            +
                  @paper_trail_originator ||= previous.try(:whodunnit)
         
     | 
| 
       221 
238 
     | 
    
         
             
                end
         
     | 
| 
       222 
239 
     | 
    
         | 
| 
       223 
240 
     | 
    
         
             
                def originator
         
     | 
| 
       224 
241 
     | 
    
         
             
                  ::ActiveSupport::Deprecation.warn "Use paper_trail_originator instead of originator."
         
     | 
| 
       225 
     | 
    
         
            -
                   
     | 
| 
      
 242 
     | 
    
         
            +
                  paper_trail_originator
         
     | 
| 
       226 
243 
     | 
    
         
             
                end
         
     | 
| 
       227 
244 
     | 
    
         | 
| 
       228 
245 
     | 
    
         
             
                # Returns who changed the item from the state it had in this version. This
         
     | 
| 
         @@ -230,7 +247,7 @@ module PaperTrail 
     | 
|
| 
       230 
247 
     | 
    
         
             
                def terminator
         
     | 
| 
       231 
248 
     | 
    
         
             
                  @terminator ||= whodunnit
         
     | 
| 
       232 
249 
     | 
    
         
             
                end
         
     | 
| 
       233 
     | 
    
         
            -
                 
     | 
| 
      
 250 
     | 
    
         
            +
                alias version_author terminator
         
     | 
| 
       234 
251 
     | 
    
         | 
| 
       235 
252 
     | 
    
         
             
                def sibling_versions(reload = false)
         
     | 
| 
       236 
253 
     | 
    
         
             
                  if reload || @sibling_versions.nil?
         
     | 
| 
         @@ -259,19 +276,42 @@ module PaperTrail 
     | 
|
| 
       259 
276 
     | 
    
         | 
| 
       260 
277 
     | 
    
         
             
                # @api private
         
     | 
| 
       261 
278 
     | 
    
         
             
                def load_changeset
         
     | 
| 
      
 279 
     | 
    
         
            +
                  # First, deserialize the `object_changes` column.
         
     | 
| 
       262 
280 
     | 
    
         
             
                  changes = HashWithIndifferentAccess.new(object_changes_deserialized)
         
     | 
| 
       263 
     | 
    
         
            -
             
     | 
| 
      
 281 
     | 
    
         
            +
             
     | 
| 
      
 282 
     | 
    
         
            +
                  # The next step is, perhaps unfortunately, called "un-serialization",
         
     | 
| 
      
 283 
     | 
    
         
            +
                  # and appears to be responsible for custom attribute serializers. For an
         
     | 
| 
      
 284 
     | 
    
         
            +
                  # example of a custom attribute serializer, see
         
     | 
| 
      
 285 
     | 
    
         
            +
                  # `Person::TimeZoneSerializer` in the test suite.
         
     | 
| 
      
 286 
     | 
    
         
            +
                  #
         
     | 
| 
      
 287 
     | 
    
         
            +
                  # Is `item.class` good enough? Does it handle `inheritance_column`
         
     | 
| 
      
 288 
     | 
    
         
            +
                  # as well as `Reifier#version_reification_class`? We were using
         
     | 
| 
      
 289 
     | 
    
         
            +
                  # `item_type.constantize`, but that is problematic when the STI parent
         
     | 
| 
      
 290 
     | 
    
         
            +
                  # is not versioned. (See `Vehicle` and `Car` in the test suite).
         
     | 
| 
      
 291 
     | 
    
         
            +
                  #
         
     | 
| 
      
 292 
     | 
    
         
            +
                  # Note: `item` returns nil if `event` is "destroy".
         
     | 
| 
      
 293 
     | 
    
         
            +
                  unless item.nil?
         
     | 
| 
      
 294 
     | 
    
         
            +
                    item.class.unserialize_attribute_changes_for_paper_trail!(changes)
         
     | 
| 
      
 295 
     | 
    
         
            +
                  end
         
     | 
| 
      
 296 
     | 
    
         
            +
             
     | 
| 
      
 297 
     | 
    
         
            +
                  # Finally, return a Hash mapping each attribute name to
         
     | 
| 
      
 298 
     | 
    
         
            +
                  # a two-element array representing before and after.
         
     | 
| 
       264 
299 
     | 
    
         
             
                  changes
         
     | 
| 
       265 
     | 
    
         
            -
                rescue # TODO: Rescue something specific
         
     | 
| 
       266 
     | 
    
         
            -
                  {}
         
     | 
| 
       267 
300 
     | 
    
         
             
                end
         
     | 
| 
       268 
301 
     | 
    
         | 
| 
      
 302 
     | 
    
         
            +
                # If the `object_changes` column is a Postgres JSON column, then
         
     | 
| 
      
 303 
     | 
    
         
            +
                # ActiveRecord will deserialize it for us. Otherwise, it's a string column
         
     | 
| 
      
 304 
     | 
    
         
            +
                # and we must deserialize it ourselves.
         
     | 
| 
       269 
305 
     | 
    
         
             
                # @api private
         
     | 
| 
       270 
306 
     | 
    
         
             
                def object_changes_deserialized
         
     | 
| 
       271 
307 
     | 
    
         
             
                  if self.class.object_changes_col_is_json?
         
     | 
| 
       272 
308 
     | 
    
         
             
                    object_changes
         
     | 
| 
       273 
309 
     | 
    
         
             
                  else
         
     | 
| 
       274 
     | 
    
         
            -
                     
     | 
| 
      
 310 
     | 
    
         
            +
                    begin
         
     | 
| 
      
 311 
     | 
    
         
            +
                      PaperTrail.serializer.load(object_changes)
         
     | 
| 
      
 312 
     | 
    
         
            +
                    rescue # TODO: Rescue something specific
         
     | 
| 
      
 313 
     | 
    
         
            +
                      {}
         
     | 
| 
      
 314 
     | 
    
         
            +
                    end
         
     | 
| 
       275 
315 
     | 
    
         
             
                  end
         
     | 
| 
       276 
316 
     | 
    
         
             
                end
         
     | 
| 
       277 
317 
     | 
    
         | 
| 
         @@ -282,7 +322,7 @@ module PaperTrail 
     | 
|
| 
       282 
322 
     | 
    
         
             
                  if defined?(::ActiveRecord::IdentityMap) && ::ActiveRecord::IdentityMap.respond_to?(:without)
         
     | 
| 
       283 
323 
     | 
    
         
             
                    ::ActiveRecord::IdentityMap.without(&block)
         
     | 
| 
       284 
324 
     | 
    
         
             
                  else
         
     | 
| 
       285 
     | 
    
         
            -
                     
     | 
| 
      
 325 
     | 
    
         
            +
                    yield
         
     | 
| 
       286 
326 
     | 
    
         
             
                  end
         
     | 
| 
       287 
327 
     | 
    
         
             
                end
         
     | 
| 
       288 
328 
     | 
    
         | 
| 
         @@ -1,18 +1,15 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            module PaperTrail
         
     | 
| 
      
 2 
     | 
    
         
            +
              # :nodoc:
         
     | 
| 
       2 
3 
     | 
    
         
             
              module VERSION
         
     | 
| 
       3 
     | 
    
         
            -
                MAJOR =  
     | 
| 
       4 
     | 
    
         
            -
                MINOR =  
     | 
| 
       5 
     | 
    
         
            -
                TINY 
     | 
| 
       6 
     | 
    
         
            -
                PRE 
     | 
| 
      
 4 
     | 
    
         
            +
                MAJOR = 5
         
     | 
| 
      
 5 
     | 
    
         
            +
                MINOR = 0
         
     | 
| 
      
 6 
     | 
    
         
            +
                TINY = 0
         
     | 
| 
      
 7 
     | 
    
         
            +
                PRE = nil
         
     | 
| 
       7 
8 
     | 
    
         | 
| 
       8 
     | 
    
         
            -
                STRING = [MAJOR, MINOR, TINY, PRE].compact.join( 
     | 
| 
      
 9 
     | 
    
         
            +
                STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".").freeze
         
     | 
| 
       9 
10 
     | 
    
         | 
| 
       10 
11 
     | 
    
         
             
                def self.to_s
         
     | 
| 
       11 
12 
     | 
    
         
             
                  STRING
         
     | 
| 
       12 
13 
     | 
    
         
             
                end
         
     | 
| 
       13 
14 
     | 
    
         
             
              end
         
     | 
| 
       14 
     | 
    
         
            -
             
     | 
| 
       15 
     | 
    
         
            -
              def self.version
         
     | 
| 
       16 
     | 
    
         
            -
                VERSION::STRING
         
     | 
| 
       17 
     | 
    
         
            -
              end
         
     | 
| 
       18 
15 
     | 
    
         
             
            end
         
     | 
    
        data/paper_trail.gemspec
    CHANGED
    
    | 
         @@ -1,59 +1,52 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            $LOAD_PATH.unshift File.expand_path( 
     | 
| 
       2 
     | 
    
         
            -
            require  
     | 
| 
      
 1 
     | 
    
         
            +
            $LOAD_PATH.unshift File.expand_path("../lib", __FILE__)
         
     | 
| 
      
 2 
     | 
    
         
            +
            require "paper_trail/version_number"
         
     | 
| 
       3 
3 
     | 
    
         | 
| 
       4 
4 
     | 
    
         
             
            Gem::Specification.new do |s|
         
     | 
| 
       5 
     | 
    
         
            -
              s.name 
     | 
| 
       6 
     | 
    
         
            -
              s.version 
     | 
| 
       7 
     | 
    
         
            -
              s.platform 
     | 
| 
       8 
     | 
    
         
            -
              s.summary 
     | 
| 
       9 
     | 
    
         
            -
              s.description 
     | 
| 
       10 
     | 
    
         
            -
              s.homepage 
     | 
| 
       11 
     | 
    
         
            -
              s.authors 
     | 
| 
       12 
     | 
    
         
            -
              s.email 
     | 
| 
       13 
     | 
    
         
            -
              s.license 
     | 
| 
       14 
     | 
    
         
            -
             
     | 
| 
       15 
     | 
    
         
            -
              s.files 
     | 
| 
       16 
     | 
    
         
            -
              s.test_files 
     | 
| 
       17 
     | 
    
         
            -
              s.executables 
     | 
| 
       18 
     | 
    
         
            -
              s.require_paths = [ 
     | 
| 
       19 
     | 
    
         
            -
             
     | 
| 
       20 
     | 
    
         
            -
              s.required_rubygems_version =  
     | 
| 
       21 
     | 
    
         
            -
             
     | 
| 
       22 
     | 
    
         
            -
             
     | 
| 
       23 
     | 
    
         
            -
              s.add_dependency  
     | 
| 
       24 
     | 
    
         
            -
              s.add_dependency  
     | 
| 
       25 
     | 
    
         
            -
             
     | 
| 
       26 
     | 
    
         
            -
             
     | 
| 
       27 
     | 
    
         
            -
              s.add_development_dependency  
     | 
| 
       28 
     | 
    
         
            -
               
     | 
| 
       29 
     | 
    
         
            -
              s.add_development_dependency  
     | 
| 
       30 
     | 
    
         
            -
              s.add_development_dependency  
     | 
| 
       31 
     | 
    
         
            -
              s.add_development_dependency  
     | 
| 
       32 
     | 
    
         
            -
              s.add_development_dependency  
     | 
| 
       33 
     | 
    
         
            -
              s.add_development_dependency  
     | 
| 
       34 
     | 
    
         
            -
              s.add_development_dependency  
     | 
| 
       35 
     | 
    
         
            -
              s.add_development_dependency  
     | 
| 
       36 
     | 
    
         
            -
              s.add_development_dependency  
     | 
| 
       37 
     | 
    
         
            -
             
     | 
| 
       38 
     | 
    
         
            -
               
     | 
| 
       39 
     | 
    
         
            -
               
     | 
| 
       40 
     | 
    
         
            -
                s.add_development_dependency 'delorean'
         
     | 
| 
       41 
     | 
    
         
            -
              else
         
     | 
| 
       42 
     | 
    
         
            -
                s.add_development_dependency 'timecop'
         
     | 
| 
       43 
     | 
    
         
            -
              end
         
     | 
| 
      
 5 
     | 
    
         
            +
              s.name = "paper_trail"
         
     | 
| 
      
 6 
     | 
    
         
            +
              s.version = PaperTrail::VERSION::STRING
         
     | 
| 
      
 7 
     | 
    
         
            +
              s.platform = Gem::Platform::RUBY
         
     | 
| 
      
 8 
     | 
    
         
            +
              s.summary = "Track changes to your models' data. Good for auditing or versioning."
         
     | 
| 
      
 9 
     | 
    
         
            +
              s.description = s.summary
         
     | 
| 
      
 10 
     | 
    
         
            +
              s.homepage = "https://github.com/airblade/paper_trail"
         
     | 
| 
      
 11 
     | 
    
         
            +
              s.authors = ["Andy Stewart", "Ben Atkins"]
         
     | 
| 
      
 12 
     | 
    
         
            +
              s.email = "batkinz@gmail.com"
         
     | 
| 
      
 13 
     | 
    
         
            +
              s.license = "MIT"
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
              s.files = `git ls-files`.split("\n")
         
     | 
| 
      
 16 
     | 
    
         
            +
              s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
         
     | 
| 
      
 17 
     | 
    
         
            +
              s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
         
     | 
| 
      
 18 
     | 
    
         
            +
              s.require_paths = ["lib"]
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
              s.required_rubygems_version = ">= 1.3.6"
         
     | 
| 
      
 21 
     | 
    
         
            +
              s.required_ruby_version = ">= 1.9.3"
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
              s.add_dependency "activerecord", [">= 3.0", "< 6.0"]
         
     | 
| 
      
 24 
     | 
    
         
            +
              s.add_dependency "activesupport", [">= 3.0", "< 6.0"]
         
     | 
| 
      
 25 
     | 
    
         
            +
              s.add_dependency "request_store", "~> 1.1"
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
              s.add_development_dependency "appraisal", "~> 2.1"
         
     | 
| 
      
 28 
     | 
    
         
            +
              s.add_development_dependency "rake", "~> 10.4.2"
         
     | 
| 
      
 29 
     | 
    
         
            +
              s.add_development_dependency "shoulda", "~> 3.5.0"
         
     | 
| 
      
 30 
     | 
    
         
            +
              s.add_development_dependency "ffaker", "~> 2.1.0"
         
     | 
| 
      
 31 
     | 
    
         
            +
              s.add_development_dependency "railties", [">= 3.0", "< 6.0"]
         
     | 
| 
      
 32 
     | 
    
         
            +
              s.add_development_dependency "sinatra", "~> 1.4.6"
         
     | 
| 
      
 33 
     | 
    
         
            +
              s.add_development_dependency "rack-test", "~> 0.6.3"
         
     | 
| 
      
 34 
     | 
    
         
            +
              s.add_development_dependency "rspec-rails", "~> 3.4.0"
         
     | 
| 
      
 35 
     | 
    
         
            +
              s.add_development_dependency "generator_spec", "~> 0.9.3"
         
     | 
| 
      
 36 
     | 
    
         
            +
              s.add_development_dependency "database_cleaner", "~> 1.2"
         
     | 
| 
      
 37 
     | 
    
         
            +
              s.add_development_dependency "pry-nav", "~> 0.2.4"
         
     | 
| 
      
 38 
     | 
    
         
            +
              s.add_development_dependency "rubocop", "~> 0.37.2"
         
     | 
| 
      
 39 
     | 
    
         
            +
              s.add_development_dependency "timecop", "~> 0.8.0"
         
     | 
| 
       44 
40 
     | 
    
         | 
| 
       45 
41 
     | 
    
         
             
              if defined?(JRUBY_VERSION)
         
     | 
| 
       46 
     | 
    
         
            -
                s.add_development_dependency  
     | 
| 
       47 
     | 
    
         
            -
                s.add_development_dependency  
     | 
| 
       48 
     | 
    
         
            -
                s.add_development_dependency  
     | 
| 
      
 42 
     | 
    
         
            +
                s.add_development_dependency "activerecord-jdbcsqlite3-adapter", "~> 1.3.15"
         
     | 
| 
      
 43 
     | 
    
         
            +
                s.add_development_dependency "activerecord-jdbcpostgresql-adapter", "~> 1.3.15"
         
     | 
| 
      
 44 
     | 
    
         
            +
                s.add_development_dependency "activerecord-jdbcmysql-adapter", "~> 1.3.15"
         
     | 
| 
       49 
45 
     | 
    
         
             
              else
         
     | 
| 
       50 
     | 
    
         
            -
                s.add_development_dependency  
     | 
| 
       51 
     | 
    
         
            -
             
     | 
| 
       52 
     | 
    
         
            -
                # We would prefer to only constrain mysql2 to '~> 0.3',
         
     | 
| 
       53 
     | 
    
         
            -
                # but a rails bug (https://github.com/rails/rails/issues/21544)
         
     | 
| 
       54 
     | 
    
         
            -
                # requires us to constrain to '~> 0.3.20' for now.
         
     | 
| 
       55 
     | 
    
         
            -
                s.add_development_dependency 'mysql2', '~> 0.3.20'
         
     | 
| 
      
 46 
     | 
    
         
            +
                s.add_development_dependency "sqlite3", "~> 1.2"
         
     | 
| 
      
 47 
     | 
    
         
            +
                s.add_development_dependency "pg", "~> 0.17"
         
     | 
| 
       56 
48 
     | 
    
         | 
| 
       57 
     | 
    
         
            -
                 
     | 
| 
      
 49 
     | 
    
         
            +
                # activerecord >= 4.2.5 may use mysql2 >= 0.4
         
     | 
| 
      
 50 
     | 
    
         
            +
                s.add_development_dependency "mysql2", "~> 0.4.2"
         
     | 
| 
       58 
51 
     | 
    
         
             
              end
         
     | 
| 
       59 
52 
     | 
    
         
             
            end
         
     |