Skip to content

Bump sequel from 5.104.0 to 5.105.0#995

Open
dependabot[bot] wants to merge 1 commit into
mainfrom
dependabot/bundler/sequel-5.105.0
Open

Bump sequel from 5.104.0 to 5.105.0#995
dependabot[bot] wants to merge 1 commit into
mainfrom
dependabot/bundler/sequel-5.105.0

Conversation

@dependabot
Copy link
Copy Markdown
Contributor

@dependabot dependabot Bot commented on behalf of github Jun 3, 2026

Bumps sequel from 5.104.0 to 5.105.0.

Changelog

Sourced from sequel's changelog.

=== 5.105.0 (2026-06-01)

  • Add Plugin.model_instance_variables to set instance variables used by instances of model using a plugin (jeremyevans)

  • Add Model.set_model_instance_variables to set instance variables used by instances of a specific model class (jeremyevans)

  • Support shape-friendly Model instances via Model.shape_friendly = true (jeremyevans)

  • Make connection_expiration extension set expiration time on connections in the pool when it is loaded (cooljacob204, jeremyevans) (#2365, #2366)

Commits
  • ed26b86 Bump version to 5.105.0
  • 3708aff Fix typo in CHANGELOG [ci skip]
  • 4fda8ef Support shape-friendly Model instances via Model.shape_friendly = true
  • 2e33acc Add specs for Sequel::Database::AsyncThreadPool::JobProcessor.run_finalizer
  • b184a7d Switch conditionals in connection_expiration plugin
  • 694ea77 Minor changes to connection_expiration handling of initial connections
  • c52de64 Adds expiration for existing connections when added to a db
  • 6a84e80 Avoid rdoc-ref resolution errors when building plugin/extension rdoc
  • See full diff in compare view

Dependabot compatibility score

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


Dependabot commands and options

You can trigger Dependabot actions by commenting on this PR:

  • @dependabot rebase will rebase this PR
  • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
  • @dependabot show <dependency name> ignore conditions will show all of the ignore conditions of the specified dependency
  • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)

Bumps [sequel](https://github.com/jeremyevans/sequel) from 5.104.0 to 5.105.0.
- [Changelog](https://github.com/jeremyevans/sequel/blob/master/CHANGELOG)
- [Commits](jeremyevans/sequel@5.104.0...5.105.0)

---
updated-dependencies:
- dependency-name: sequel
  dependency-version: 5.105.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
@dependabot dependabot Bot added dependencies ruby Pull requests that update Ruby code labels Jun 3, 2026
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 3, 2026

4 similar comments
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 3, 2026

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 3, 2026

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 3, 2026

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 3, 2026

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 3, 2026

gem compare sequel 5.104.0 5.105.0

Compared versions: ["5.104.0", "5.105.0"]
  DIFFERENT rubygems_version:
    5.104.0: 4.0.3
    5.105.0: 4.0.10
  DIFFERENT version:
    5.104.0: 5.104.0
    5.105.0: 5.105.0
  DIFFERENT files:
    5.104.0->5.105.0:
      * Changed:
            lib/sequel/extensions/connection_expiration.rb +43/-4
            lib/sequel/model.rb +1/-0
            lib/sequel/model/associations.rb +1/-0
            lib/sequel/model/base.rb +95/-8
            lib/sequel/model/plugins.rb +12/-1
            lib/sequel/plugins/accessed_columns.rb +4/-0
            lib/sequel/plugins/active_model.rb +5/-6
            lib/sequel/plugins/association_pks.rb +2/-0
            lib/sequel/plugins/auto_validations.rb +2/-0
            lib/sequel/plugins/columns_updated.rb +4/-0
            lib/sequel/plugins/composition.rb +2/-0
            lib/sequel/plugins/dirty.rb +4/-0
            lib/sequel/plugins/forbid_lazy_load.rb +1/-0
            lib/sequel/plugins/insert_conflict.rb +4/-0
            lib/sequel/plugins/instance_filters.rb +4/-0
            lib/sequel/plugins/instance_hooks.rb +4/-0
            lib/sequel/plugins/json_serializer.rb +2/-0
            lib/sequel/plugins/modification_detection.rb +2/-0
            lib/sequel/plugins/serialization.rb +2/-0
            lib/sequel/plugins/serialization_modification_detection.rb +4/-0
            lib/sequel/plugins/split_values.rb +2/-0
            lib/sequel/plugins/tactical_eager_loading.rb +4/-0
            lib/sequel/plugins/update_primary_key.rb +4/-0
            lib/sequel/plugins/validation_contexts.rb +4/-0
            lib/sequel/version.rb +1/-1

3 similar comments
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 3, 2026

gem compare sequel 5.104.0 5.105.0

Compared versions: ["5.104.0", "5.105.0"]
  DIFFERENT rubygems_version:
    5.104.0: 4.0.3
    5.105.0: 4.0.10
  DIFFERENT version:
    5.104.0: 5.104.0
    5.105.0: 5.105.0
  DIFFERENT files:
    5.104.0->5.105.0:
      * Changed:
            lib/sequel/extensions/connection_expiration.rb +43/-4
            lib/sequel/model.rb +1/-0
            lib/sequel/model/associations.rb +1/-0
            lib/sequel/model/base.rb +95/-8
            lib/sequel/model/plugins.rb +12/-1
            lib/sequel/plugins/accessed_columns.rb +4/-0
            lib/sequel/plugins/active_model.rb +5/-6
            lib/sequel/plugins/association_pks.rb +2/-0
            lib/sequel/plugins/auto_validations.rb +2/-0
            lib/sequel/plugins/columns_updated.rb +4/-0
            lib/sequel/plugins/composition.rb +2/-0
            lib/sequel/plugins/dirty.rb +4/-0
            lib/sequel/plugins/forbid_lazy_load.rb +1/-0
            lib/sequel/plugins/insert_conflict.rb +4/-0
            lib/sequel/plugins/instance_filters.rb +4/-0
            lib/sequel/plugins/instance_hooks.rb +4/-0
            lib/sequel/plugins/json_serializer.rb +2/-0
            lib/sequel/plugins/modification_detection.rb +2/-0
            lib/sequel/plugins/serialization.rb +2/-0
            lib/sequel/plugins/serialization_modification_detection.rb +4/-0
            lib/sequel/plugins/split_values.rb +2/-0
            lib/sequel/plugins/tactical_eager_loading.rb +4/-0
            lib/sequel/plugins/update_primary_key.rb +4/-0
            lib/sequel/plugins/validation_contexts.rb +4/-0
            lib/sequel/version.rb +1/-1

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 3, 2026

gem compare sequel 5.104.0 5.105.0

Compared versions: ["5.104.0", "5.105.0"]
  DIFFERENT rubygems_version:
    5.104.0: 4.0.3
    5.105.0: 4.0.10
  DIFFERENT version:
    5.104.0: 5.104.0
    5.105.0: 5.105.0
  DIFFERENT files:
    5.104.0->5.105.0:
      * Changed:
            lib/sequel/extensions/connection_expiration.rb +43/-4
            lib/sequel/model.rb +1/-0
            lib/sequel/model/associations.rb +1/-0
            lib/sequel/model/base.rb +95/-8
            lib/sequel/model/plugins.rb +12/-1
            lib/sequel/plugins/accessed_columns.rb +4/-0
            lib/sequel/plugins/active_model.rb +5/-6
            lib/sequel/plugins/association_pks.rb +2/-0
            lib/sequel/plugins/auto_validations.rb +2/-0
            lib/sequel/plugins/columns_updated.rb +4/-0
            lib/sequel/plugins/composition.rb +2/-0
            lib/sequel/plugins/dirty.rb +4/-0
            lib/sequel/plugins/forbid_lazy_load.rb +1/-0
            lib/sequel/plugins/insert_conflict.rb +4/-0
            lib/sequel/plugins/instance_filters.rb +4/-0
            lib/sequel/plugins/instance_hooks.rb +4/-0
            lib/sequel/plugins/json_serializer.rb +2/-0
            lib/sequel/plugins/modification_detection.rb +2/-0
            lib/sequel/plugins/serialization.rb +2/-0
            lib/sequel/plugins/serialization_modification_detection.rb +4/-0
            lib/sequel/plugins/split_values.rb +2/-0
            lib/sequel/plugins/tactical_eager_loading.rb +4/-0
            lib/sequel/plugins/update_primary_key.rb +4/-0
            lib/sequel/plugins/validation_contexts.rb +4/-0
            lib/sequel/version.rb +1/-1

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 3, 2026

gem compare sequel 5.104.0 5.105.0

Compared versions: ["5.104.0", "5.105.0"]
  DIFFERENT rubygems_version:
    5.104.0: 4.0.3
    5.105.0: 4.0.10
  DIFFERENT version:
    5.104.0: 5.104.0
    5.105.0: 5.105.0
  DIFFERENT files:
    5.104.0->5.105.0:
      * Changed:
            lib/sequel/extensions/connection_expiration.rb +43/-4
            lib/sequel/model.rb +1/-0
            lib/sequel/model/associations.rb +1/-0
            lib/sequel/model/base.rb +95/-8
            lib/sequel/model/plugins.rb +12/-1
            lib/sequel/plugins/accessed_columns.rb +4/-0
            lib/sequel/plugins/active_model.rb +5/-6
            lib/sequel/plugins/association_pks.rb +2/-0
            lib/sequel/plugins/auto_validations.rb +2/-0
            lib/sequel/plugins/columns_updated.rb +4/-0
            lib/sequel/plugins/composition.rb +2/-0
            lib/sequel/plugins/dirty.rb +4/-0
            lib/sequel/plugins/forbid_lazy_load.rb +1/-0
            lib/sequel/plugins/insert_conflict.rb +4/-0
            lib/sequel/plugins/instance_filters.rb +4/-0
            lib/sequel/plugins/instance_hooks.rb +4/-0
            lib/sequel/plugins/json_serializer.rb +2/-0
            lib/sequel/plugins/modification_detection.rb +2/-0
            lib/sequel/plugins/serialization.rb +2/-0
            lib/sequel/plugins/serialization_modification_detection.rb +4/-0
            lib/sequel/plugins/split_values.rb +2/-0
            lib/sequel/plugins/tactical_eager_loading.rb +4/-0
            lib/sequel/plugins/update_primary_key.rb +4/-0
            lib/sequel/plugins/validation_contexts.rb +4/-0
            lib/sequel/version.rb +1/-1

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 3, 2026

gem compare --diff sequel 5.104.0 5.105.0

Compared versions: ["5.104.0", "5.105.0"]
  DIFFERENT files:
    5.104.0->5.105.0:
      * Changed:
        lib/sequel/extensions/connection_expiration.rb
                --- /tmp/d20260603-1575-2ivqmx/sequel-5.104.0/lib/sequel/extensions/connection_expiration.rb	2026-06-03 20:45:24.894419509 +0000
                +++ /tmp/d20260603-1575-2ivqmx/sequel-5.105.0/lib/sequel/extensions/connection_expiration.rb	2026-06-03 20:45:24.941419904 +0000
                @@ -49,2 +49,4 @@
                -      when :single, :sharded_single
                -        raise Error, "cannot load connection_expiration extension if using single or sharded_single connection pool"
                +      when :threaded, :sharded_threaded, :timed_queue, :sharded_timed_queue
                +        nil
                +      else
                +        raise Error, "cannot load connection_expiration extension if using single or sharded_single connection pool (or other unsupported connection pool)"
                @@ -57,0 +60,33 @@
                +
                +          # Record an expiration timestamp for any connections that already
                +          # exist in the pool, so that a connection opened before the extension
                +          # was loaded (e.g. via Sequel.connect) will eventually be expired.
                +          register = method(:register_connection_expiration_time)
                +
                +          case pool_type
                +          when :timed_queue, :sharded_timed_queue
                +            register_queued_connections = lambda do |queue|
                +              conns = []
                +              while conn = queue.pop(timeout: 0)
                +                conns << conn
                +              end
                +              conns.each do |conn|
                +                queue.push(register_connection_expiration_time(conn))
                +              end
                +            end
                +          end
                +
                +          case pool_type
                +          when :threaded
                +            @available_connections.each(&register)
                +            @allocated.each_value(&register)
                +          when :sharded_threaded
                +            @available_connections.each_value{|conns| conns.each(&register)}
                +            @allocated.each_value{|threads| threads.each_value(&register)}
                +          when :timed_queue
                +            register_queued_connections.call(@queue)
                +            @allocated.each_value(&register)
                +          else # when :sharded_timed_queue
                +            @queues.each_value(&register_queued_connections)
                +            @allocated.each_value{|threads| threads.each_value(&register)}
                +          end
                @@ -72,2 +107,6 @@
                -      conn = super
                -      @connection_expiration_timestamps[conn] = [Sequel.start_timer, @connection_expiration_timeout + (rand * @connection_expiration_random_delay)].freeze
                +      register_connection_expiration_time(super)
                +    end
                +
                +    # Record an expiration entry for a connection, returns the connection.
                +    def register_connection_expiration_time(conn)
                +      @connection_expiration_timestamps[conn] ||= [Sequel.start_timer, @connection_expiration_timeout + (rand * @connection_expiration_random_delay)].freeze
        lib/sequel/model.rb
                --- /tmp/d20260603-1575-2ivqmx/sequel-5.104.0/lib/sequel/model.rb	2026-06-03 20:45:24.907419618 +0000
                +++ /tmp/d20260603-1575-2ivqmx/sequel-5.105.0/lib/sequel/model.rb	2026-06-03 20:45:24.953420005 +0000
                @@ -57,0 +58 @@
                +    @shape_friendly = false
        lib/sequel/model/associations.rb
                --- /tmp/d20260603-1575-2ivqmx/sequel-5.104.0/lib/sequel/model/associations.rb	2026-06-03 20:45:24.908419627 +0000
                +++ /tmp/d20260603-1575-2ivqmx/sequel-5.105.0/lib/sequel/model/associations.rb	2026-06-03 20:45:24.954420013 +0000
                @@ -2176,0 +2177 @@
                +        Plugins.model_instance_variables(self, :@associations, :@set_associated_object_if_same)
        lib/sequel/model/base.rb
                --- /tmp/d20260603-1575-2ivqmx/sequel-5.104.0/lib/sequel/model/base.rb	2026-06-03 20:45:24.909419635 +0000
                +++ /tmp/d20260603-1575-2ivqmx/sequel-5.105.0/lib/sequel/model/base.rb	2026-06-03 20:45:24.955420021 +0000
                @@ -86,0 +87,4 @@
                +      # Whether the model uses a shape friendly design (initializing all potentially
                +      # used instance variables to nil).
                +      attr_reader :shape_friendly
                +
                @@ -224,3 +228 @@
                -        o = allocate
                -        o.instance_variable_set(:@values, values)
                -        o
                +        allocate.initialize_from_db(values)
                @@ -504 +506,7 @@
                -          extend(m::ClassMethods) if m.const_defined?(:ClassMethods, false)
                +          if m.const_defined?(:ClassMethods, false)
                +            class_methods = m::ClassMethods
                +            extend(class_methods)
                +            if class_methods.private_method_defined?(:each_model_instance_variable)
                +              def_initialize_nil_instance_variables
                +            end
                +          end
                @@ -633,0 +642,7 @@
                +      # Set instance variables used by instances of this model class.
                +      # Only has an effect if shape_friendly is true.
                +      def set_model_instance_variables(*ivs)
                +        Plugins.model_instance_variables(singleton_class, *ivs)
                +        def_initialize_nil_instance_variables
                +      end
                +
                @@ -667,0 +683,6 @@
                +      # Set whether the model should be shape friendly.
                +      def shape_friendly=(v)
                +        @shape_friendly = v
                +        def_initialize_nil_instance_variables
                +      end
                +
                @@ -816,0 +838,54 @@
                +      # Defines the private _initialize_nil_instance_variables method.
                +      # If shape_friendly is true, defines a method that initials the
                +      # model's instance variables to nil. If shape_friendly is not
                +      # true, does nothing.
                +      def def_initialize_nil_instance_variables
                +        if @shape_friendly
                +          ivs = []
                +          each_model_instance_variable do |iv|
                +            unless iv.match(/\A@[a-z_][a-z0-9_]*\z/)
                +              raise Error, "invalid model instance variable used"
                +            end
                +
                +            ivs << iv
                +          end
                +          ivs.uniq!
                +          ivs = ivs.reverse.join(" = ")
                +          new_method_content = "#{ivs} = nil"
                +          new_from_db_method_content = "#{ivs} = @new = @modified = nil"
                +        end
                +
                +        class_eval(<<-RUBY, __FILE__, __LINE__+1)
                +          def _initialize_nil_instance_variables
                +            #{new_method_content}
                +          end
                +          def _initialize_from_db_nil_instance_variables
                +            #{new_from_db_method_content}
                +          end
                +        RUBY
                +        private :_initialize_nil_instance_variables, :_initialize_from_db_nil_instance_variables
                +        alias_method :_initialize_nil_instance_variables, :_initialize_nil_instance_variables
                +        alias_method :_initialize_from_db_nil_instance_variables, :_initialize_from_db_nil_instance_variables
                +        nil
                +      end
                +
                +      # Yield the default model instance variables. Designed only for
                +      # use by def_initialize_nil_instance_variables.
                +      def each_model_instance_variable
                +        [
                +          :@changed_columns,
                +          :@errors,
                +          :@raise_on_save_failure,
                +          :@raise_on_typecast_failure,
                +          :@require_modification,
                +          :@server,
                +          :@singleton_setter_added,
                +          :@skip_validation_on_next_save,
                +          :@strict_param_setting,
                +          :@this,
                +          :@typecast_empty_string_to_nil,
                +          :@typecast_on_assignment,
                +          :@use_transactions,
                +        ].each{|iv| yield iv}
                +      end
                +
                @@ -939,0 +1015 @@
                +          :@shape_friendly=>nil,
                @@ -1097 +1173 @@
                -        class_eval("def #{meth}; !defined?(@#{meth}) ? (frozen? ? self.class.#{meth} : (@#{meth} = self.class.#{meth})) : @#{meth} end", __FILE__, __LINE__)
                +        class_eval("def #{meth}; @#{meth}.nil? ? (frozen? ? self.class.#{meth} : (@#{meth} = self.class.#{meth})) : @#{meth} end", __FILE__, __LINE__)
                @@ -1138,2 +1214,3 @@
                -        @new = true
                -        @modified = true
                +        @new = @modified = true
                +        _initialize_nil_instance_variables
                +
                @@ -1144,0 +1222,9 @@
                +      # Initialize a new record using values retrieved from a database.
                +      # This should not be called directly, only via Model.call.
                +      def initialize_from_db(values) # :nodoc:
                +        @values = values
                +        _initialize_from_db_nil_instance_variables
                +
                +        self
                +      end
                +
                @@ -1448 +1534 @@
                -        defined?(@new) ? @new : (@new = false)
                +        @new || false
                @@ -2339,0 +2426 @@
                +    def_initialize_nil_instance_variables
        lib/sequel/model/plugins.rb
                --- /tmp/d20260603-1575-2ivqmx/sequel-5.104.0/lib/sequel/model/plugins.rb	2026-06-03 20:45:24.910419643 +0000
                +++ /tmp/d20260603-1575-2ivqmx/sequel-5.105.0/lib/sequel/model/plugins.rb	2026-06-03 20:45:24.955420021 +0000
                @@ -41 +41,2 @@
                -    # values in this hash.
                +    # values in this hash. These affects how class instance variables will be treated
                +    # during subclassing.
                @@ -46,0 +48,10 @@
                +    end
                +
                +    # Sets the model instance variables used by the plugin. These instance variables
                +    # will be initialized to nil for created model objects.
                +    def self.model_instance_variables(mod, *ivs)
                +      mod.send(:define_method, :each_model_instance_variable) do |&block|
                +        super(&block)
                +        ivs.each(&block)
                +      end
                +      mod.send(:private, :each_model_instance_variable)
        lib/sequel/plugins/accessed_columns.rb
                --- /tmp/d20260603-1575-2ivqmx/sequel-5.104.0/lib/sequel/plugins/accessed_columns.rb	2026-06-03 20:45:24.910419643 +0000
                +++ /tmp/d20260603-1575-2ivqmx/sequel-5.105.0/lib/sequel/plugins/accessed_columns.rb	2026-06-03 20:45:24.956420030 +0000
                @@ -28,0 +29,4 @@
                +      module ClassMethods
                +        Plugins.model_instance_variables(self, :@accessed_columns)
                +      end
                +
        lib/sequel/plugins/active_model.rb
                --- /tmp/d20260603-1575-2ivqmx/sequel-5.104.0/lib/sequel/plugins/active_model.rb	2026-06-03 20:45:24.910419643 +0000
                +++ /tmp/d20260603-1575-2ivqmx/sequel-5.105.0/lib/sequel/plugins/active_model.rb	2026-06-03 20:45:24.956420030 +0000
                @@ -31,0 +32,2 @@
                +        Plugins.model_instance_variables(self, :@destroyed, :@rollback_checker)
                +
                @@ -61,2 +63 @@
                -          return false if new?
                -          return false if defined?(@destroyed)
                +          return false if new? || @destroyed
                @@ -64,4 +65,2 @@
                -          if defined?(@rollback_checker)
                -            if @rollback_checker.call
                -              return false
                -            end
                +          if @rollback_checker && @rollback_checker.call
                +            return false
        lib/sequel/plugins/association_pks.rb
                --- /tmp/d20260603-1575-2ivqmx/sequel-5.104.0/lib/sequel/plugins/association_pks.rb	2026-06-03 20:45:24.911419652 +0000
                +++ /tmp/d20260603-1575-2ivqmx/sequel-5.105.0/lib/sequel/plugins/association_pks.rb	2026-06-03 20:45:24.956420030 +0000
                @@ -69,0 +70,2 @@
                +        Plugins.model_instance_variables(self, :@_association_pks)
                +
        lib/sequel/plugins/auto_validations.rb
                --- /tmp/d20260603-1575-2ivqmx/sequel-5.104.0/lib/sequel/plugins/auto_validations.rb	2026-06-03 20:45:24.911419652 +0000
                +++ /tmp/d20260603-1575-2ivqmx/sequel-5.105.0/lib/sequel/plugins/auto_validations.rb	2026-06-03 20:45:24.957420038 +0000
                @@ -133,0 +134,2 @@
                +        Plugins.model_instance_variables(self, :@_skip_auto_validations)
                +
        lib/sequel/plugins/columns_updated.rb
                --- /tmp/d20260603-1575-2ivqmx/sequel-5.104.0/lib/sequel/plugins/columns_updated.rb	2026-06-03 20:45:24.913419668 +0000
                +++ /tmp/d20260603-1575-2ivqmx/sequel-5.105.0/lib/sequel/plugins/columns_updated.rb	2026-06-03 20:45:24.959420055 +0000
                @@ -17,0 +18,4 @@
                +      module ClassMethods
                +        Plugins.model_instance_variables(self, :@columns_updated)
                +      end
                +
        lib/sequel/plugins/composition.rb
                --- /tmp/d20260603-1575-2ivqmx/sequel-5.104.0/lib/sequel/plugins/composition.rb	2026-06-03 20:45:24.913419668 +0000
                +++ /tmp/d20260603-1575-2ivqmx/sequel-5.105.0/lib/sequel/plugins/composition.rb	2026-06-03 20:45:24.959420055 +0000
                @@ -68,0 +69,2 @@
                +        Plugins.model_instance_variables(self, :@compositions)
                +
        lib/sequel/plugins/dirty.rb
                --- /tmp/d20260603-1575-2ivqmx/sequel-5.104.0/lib/sequel/plugins/dirty.rb	2026-06-03 20:45:24.915419685 +0000
                +++ /tmp/d20260603-1575-2ivqmx/sequel-5.105.0/lib/sequel/plugins/dirty.rb	2026-06-03 20:45:24.960420064 +0000
                @@ -65,0 +66,4 @@
                +      module ClassMethods
                +        Plugins.model_instance_variables(self, :@previous_changes, :@initial_values, :@missing_initial_values)
                +      end
                +
        lib/sequel/plugins/forbid_lazy_load.rb
                --- /tmp/d20260603-1575-2ivqmx/sequel-5.104.0/lib/sequel/plugins/forbid_lazy_load.rb	2026-06-03 20:45:24.916419694 +0000
                +++ /tmp/d20260603-1575-2ivqmx/sequel-5.105.0/lib/sequel/plugins/forbid_lazy_load.rb	2026-06-03 20:45:24.961420072 +0000
                @@ -120,0 +121 @@
                +        Plugins.model_instance_variables(self, :@forbid_lazy_load)
        lib/sequel/plugins/insert_conflict.rb
                --- /tmp/d20260603-1575-2ivqmx/sequel-5.104.0/lib/sequel/plugins/insert_conflict.rb	2026-06-03 20:45:24.916419694 +0000
                +++ /tmp/d20260603-1575-2ivqmx/sequel-5.105.0/lib/sequel/plugins/insert_conflict.rb	2026-06-03 20:45:24.961420072 +0000
                @@ -44,0 +45,4 @@
                +      module ClassMethods
                +        Plugins.model_instance_variables(self, :@insert_conflict_opts)
                +      end
                +
        lib/sequel/plugins/instance_filters.rb
                --- /tmp/d20260603-1575-2ivqmx/sequel-5.104.0/lib/sequel/plugins/instance_filters.rb	2026-06-03 20:45:24.916419694 +0000
                +++ /tmp/d20260603-1575-2ivqmx/sequel-5.105.0/lib/sequel/plugins/instance_filters.rb	2026-06-03 20:45:24.962420080 +0000
                @@ -52,0 +53,4 @@
                +      module ClassMethods
                +        Plugins.model_instance_variables(self, :@instance_filters)
                +      end
                +
        lib/sequel/plugins/instance_hooks.rb
                --- /tmp/d20260603-1575-2ivqmx/sequel-5.104.0/lib/sequel/plugins/instance_hooks.rb	2026-06-03 20:45:24.917419702 +0000
                +++ /tmp/d20260603-1575-2ivqmx/sequel-5.105.0/lib/sequel/plugins/instance_hooks.rb	2026-06-03 20:45:24.962420080 +0000
                @@ -30,0 +31,4 @@
                +      module ClassMethods
                +        Plugins.model_instance_variables(self, :@instance_hooks)
                +      end
                +
        lib/sequel/plugins/json_serializer.rb
                --- /tmp/d20260603-1575-2ivqmx/sequel-5.104.0/lib/sequel/plugins/json_serializer.rb	2026-06-03 20:45:24.917419702 +0000
                +++ /tmp/d20260603-1575-2ivqmx/sequel-5.105.0/lib/sequel/plugins/json_serializer.rb	2026-06-03 20:45:24.962420080 +0000
                @@ -164,0 +165,2 @@
                +        Plugins.model_instance_variables(self, :@json_serializer_opts)
                +
        lib/sequel/plugins/modification_detection.rb
                --- /tmp/d20260603-1575-2ivqmx/sequel-5.104.0/lib/sequel/plugins/modification_detection.rb	2026-06-03 20:45:24.917419702 +0000
                +++ /tmp/d20260603-1575-2ivqmx/sequel-5.105.0/lib/sequel/plugins/modification_detection.rb	2026-06-03 20:45:24.963420089 +0000
                @@ -36,0 +37,2 @@
                +        Plugins.model_instance_variables(self, :@values_hashes)
                +
        lib/sequel/plugins/serialization.rb
                --- /tmp/d20260603-1575-2ivqmx/sequel-5.104.0/lib/sequel/plugins/serialization.rb	2026-06-03 20:45:24.920419727 +0000
                +++ /tmp/d20260603-1575-2ivqmx/sequel-5.105.0/lib/sequel/plugins/serialization.rb	2026-06-03 20:45:24.965420105 +0000
                @@ -115,0 +116,2 @@
                +        Plugins.model_instance_variables(self, :@deserialized_values)
                +
        lib/sequel/plugins/serialization_modification_detection.rb
                --- /tmp/d20260603-1575-2ivqmx/sequel-5.104.0/lib/sequel/plugins/serialization_modification_detection.rb	2026-06-03 20:45:24.920419727 +0000
                +++ /tmp/d20260603-1575-2ivqmx/sequel-5.105.0/lib/sequel/plugins/serialization_modification_detection.rb	2026-06-03 20:45:24.965420105 +0000
                @@ -32,0 +33,4 @@
                +
                +      module ClassMethods
                +        Plugins.model_instance_variables(self, :@original_deserialized_values)
                +      end
        lib/sequel/plugins/split_values.rb
                --- /tmp/d20260603-1575-2ivqmx/sequel-5.104.0/lib/sequel/plugins/split_values.rb	2026-06-03 20:45:24.921419736 +0000
                +++ /tmp/d20260603-1575-2ivqmx/sequel-5.105.0/lib/sequel/plugins/split_values.rb	2026-06-03 20:45:24.966420114 +0000
                @@ -38,0 +39,2 @@
                +        Plugins.model_instance_variables(self, :@noncolumn_values)
                +
        lib/sequel/plugins/tactical_eager_loading.rb
                --- /tmp/d20260603-1575-2ivqmx/sequel-5.104.0/lib/sequel/plugins/tactical_eager_loading.rb	2026-06-03 20:45:24.922419744 +0000
                +++ /tmp/d20260603-1575-2ivqmx/sequel-5.105.0/lib/sequel/plugins/tactical_eager_loading.rb	2026-06-03 20:45:24.967420122 +0000
                @@ -126,0 +127,4 @@
                +      module ClassMethods
                +        Plugins.model_instance_variables(self, :@retrieved_by, :@retrieved_with)
                +      end
                +
        lib/sequel/plugins/update_primary_key.rb
                --- /tmp/d20260603-1575-2ivqmx/sequel-5.104.0/lib/sequel/plugins/update_primary_key.rb	2026-06-03 20:45:24.923419752 +0000
                +++ /tmp/d20260603-1575-2ivqmx/sequel-5.105.0/lib/sequel/plugins/update_primary_key.rb	2026-06-03 20:45:24.968420131 +0000
                @@ -24,0 +25,4 @@
                +      module ClassMethods
                +        Plugins.model_instance_variables(self, :@pk_hash)
                +      end
                +
        lib/sequel/plugins/validation_contexts.rb
                --- /tmp/d20260603-1575-2ivqmx/sequel-5.104.0/lib/sequel/plugins/validation_contexts.rb	2026-06-03 20:45:24.923419752 +0000
                +++ /tmp/d20260603-1575-2ivqmx/sequel-5.105.0/lib/sequel/plugins/validation_contexts.rb	2026-06-03 20:45:24.969420139 +0000
                @@ -31,0 +32,4 @@
                +      module ClassMethods
                +        Plugins.model_instance_variables(self, :@validation_context)
                +      end
                +
        lib/sequel/version.rb
                --- /tmp/d20260603-1575-2ivqmx/sequel-5.104.0/lib/sequel/version.rb	2026-06-03 20:45:24.925419769 +0000
                +++ /tmp/d20260603-1575-2ivqmx/sequel-5.105.0/lib/sequel/version.rb	2026-06-03 20:45:24.970420148 +0000
                @@ -9 +9 @@
                -  MINOR = 104
                +  MINOR = 105

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 3, 2026

gem compare --diff sequel 5.104.0 5.105.0

Compared versions: ["5.104.0", "5.105.0"]
  DIFFERENT files:
    5.104.0->5.105.0:
      * Changed:
        lib/sequel/extensions/connection_expiration.rb
                --- /tmp/d20260603-1535-vajkwh/sequel-5.104.0/lib/sequel/extensions/connection_expiration.rb	2026-06-03 20:45:30.464578939 +0000
                +++ /tmp/d20260603-1535-vajkwh/sequel-5.105.0/lib/sequel/extensions/connection_expiration.rb	2026-06-03 20:45:30.530579138 +0000
                @@ -49,2 +49,4 @@
                -      when :single, :sharded_single
                -        raise Error, "cannot load connection_expiration extension if using single or sharded_single connection pool"
                +      when :threaded, :sharded_threaded, :timed_queue, :sharded_timed_queue
                +        nil
                +      else
                +        raise Error, "cannot load connection_expiration extension if using single or sharded_single connection pool (or other unsupported connection pool)"
                @@ -57,0 +60,33 @@
                +
                +          # Record an expiration timestamp for any connections that already
                +          # exist in the pool, so that a connection opened before the extension
                +          # was loaded (e.g. via Sequel.connect) will eventually be expired.
                +          register = method(:register_connection_expiration_time)
                +
                +          case pool_type
                +          when :timed_queue, :sharded_timed_queue
                +            register_queued_connections = lambda do |queue|
                +              conns = []
                +              while conn = queue.pop(timeout: 0)
                +                conns << conn
                +              end
                +              conns.each do |conn|
                +                queue.push(register_connection_expiration_time(conn))
                +              end
                +            end
                +          end
                +
                +          case pool_type
                +          when :threaded
                +            @available_connections.each(&register)
                +            @allocated.each_value(&register)
                +          when :sharded_threaded
                +            @available_connections.each_value{|conns| conns.each(&register)}
                +            @allocated.each_value{|threads| threads.each_value(&register)}
                +          when :timed_queue
                +            register_queued_connections.call(@queue)
                +            @allocated.each_value(&register)
                +          else # when :sharded_timed_queue
                +            @queues.each_value(&register_queued_connections)
                +            @allocated.each_value{|threads| threads.each_value(&register)}
                +          end
                @@ -72,2 +107,6 @@
                -      conn = super
                -      @connection_expiration_timestamps[conn] = [Sequel.start_timer, @connection_expiration_timeout + (rand * @connection_expiration_random_delay)].freeze
                +      register_connection_expiration_time(super)
                +    end
                +
                +    # Record an expiration entry for a connection, returns the connection.
                +    def register_connection_expiration_time(conn)
                +      @connection_expiration_timestamps[conn] ||= [Sequel.start_timer, @connection_expiration_timeout + (rand * @connection_expiration_random_delay)].freeze
        lib/sequel/model.rb
                --- /tmp/d20260603-1535-vajkwh/sequel-5.104.0/lib/sequel/model.rb	2026-06-03 20:45:30.481578990 +0000
                +++ /tmp/d20260603-1535-vajkwh/sequel-5.105.0/lib/sequel/model.rb	2026-06-03 20:45:30.548579192 +0000
                @@ -57,0 +58 @@
                +    @shape_friendly = false
        lib/sequel/model/associations.rb
                --- /tmp/d20260603-1535-vajkwh/sequel-5.104.0/lib/sequel/model/associations.rb	2026-06-03 20:45:30.482578993 +0000
                +++ /tmp/d20260603-1535-vajkwh/sequel-5.105.0/lib/sequel/model/associations.rb	2026-06-03 20:45:30.550579198 +0000
                @@ -2176,0 +2177 @@
                +        Plugins.model_instance_variables(self, :@associations, :@set_associated_object_if_same)
        lib/sequel/model/base.rb
                --- /tmp/d20260603-1535-vajkwh/sequel-5.104.0/lib/sequel/model/base.rb	2026-06-03 20:45:30.483578997 +0000
                +++ /tmp/d20260603-1535-vajkwh/sequel-5.105.0/lib/sequel/model/base.rb	2026-06-03 20:45:30.552579204 +0000
                @@ -86,0 +87,4 @@
                +      # Whether the model uses a shape friendly design (initializing all potentially
                +      # used instance variables to nil).
                +      attr_reader :shape_friendly
                +
                @@ -224,3 +228 @@
                -        o = allocate
                -        o.instance_variable_set(:@values, values)
                -        o
                +        allocate.initialize_from_db(values)
                @@ -504 +506,7 @@
                -          extend(m::ClassMethods) if m.const_defined?(:ClassMethods, false)
                +          if m.const_defined?(:ClassMethods, false)
                +            class_methods = m::ClassMethods
                +            extend(class_methods)
                +            if class_methods.private_method_defined?(:each_model_instance_variable)
                +              def_initialize_nil_instance_variables
                +            end
                +          end
                @@ -633,0 +642,7 @@
                +      # Set instance variables used by instances of this model class.
                +      # Only has an effect if shape_friendly is true.
                +      def set_model_instance_variables(*ivs)
                +        Plugins.model_instance_variables(singleton_class, *ivs)
                +        def_initialize_nil_instance_variables
                +      end
                +
                @@ -667,0 +683,6 @@
                +      # Set whether the model should be shape friendly.
                +      def shape_friendly=(v)
                +        @shape_friendly = v
                +        def_initialize_nil_instance_variables
                +      end
                +
                @@ -816,0 +838,54 @@
                +      # Defines the private _initialize_nil_instance_variables method.
                +      # If shape_friendly is true, defines a method that initials the
                +      # model's instance variables to nil. If shape_friendly is not
                +      # true, does nothing.
                +      def def_initialize_nil_instance_variables
                +        if @shape_friendly
                +          ivs = []
                +          each_model_instance_variable do |iv|
                +            unless iv.match(/\A@[a-z_][a-z0-9_]*\z/)
                +              raise Error, "invalid model instance variable used"
                +            end
                +
                +            ivs << iv
                +          end
                +          ivs.uniq!
                +          ivs = ivs.reverse.join(" = ")
                +          new_method_content = "#{ivs} = nil"
                +          new_from_db_method_content = "#{ivs} = @new = @modified = nil"
                +        end
                +
                +        class_eval(<<-RUBY, __FILE__, __LINE__+1)
                +          def _initialize_nil_instance_variables
                +            #{new_method_content}
                +          end
                +          def _initialize_from_db_nil_instance_variables
                +            #{new_from_db_method_content}
                +          end
                +        RUBY
                +        private :_initialize_nil_instance_variables, :_initialize_from_db_nil_instance_variables
                +        alias_method :_initialize_nil_instance_variables, :_initialize_nil_instance_variables
                +        alias_method :_initialize_from_db_nil_instance_variables, :_initialize_from_db_nil_instance_variables
                +        nil
                +      end
                +
                +      # Yield the default model instance variables. Designed only for
                +      # use by def_initialize_nil_instance_variables.
                +      def each_model_instance_variable
                +        [
                +          :@changed_columns,
                +          :@errors,
                +          :@raise_on_save_failure,
                +          :@raise_on_typecast_failure,
                +          :@require_modification,
                +          :@server,
                +          :@singleton_setter_added,
                +          :@skip_validation_on_next_save,
                +          :@strict_param_setting,
                +          :@this,
                +          :@typecast_empty_string_to_nil,
                +          :@typecast_on_assignment,
                +          :@use_transactions,
                +        ].each{|iv| yield iv}
                +      end
                +
                @@ -939,0 +1015 @@
                +          :@shape_friendly=>nil,
                @@ -1097 +1173 @@
                -        class_eval("def #{meth}; !defined?(@#{meth}) ? (frozen? ? self.class.#{meth} : (@#{meth} = self.class.#{meth})) : @#{meth} end", __FILE__, __LINE__)
                +        class_eval("def #{meth}; @#{meth}.nil? ? (frozen? ? self.class.#{meth} : (@#{meth} = self.class.#{meth})) : @#{meth} end", __FILE__, __LINE__)
                @@ -1138,2 +1214,3 @@
                -        @new = true
                -        @modified = true
                +        @new = @modified = true
                +        _initialize_nil_instance_variables
                +
                @@ -1144,0 +1222,9 @@
                +      # Initialize a new record using values retrieved from a database.
                +      # This should not be called directly, only via Model.call.
                +      def initialize_from_db(values) # :nodoc:
                +        @values = values
                +        _initialize_from_db_nil_instance_variables
                +
                +        self
                +      end
                +
                @@ -1448 +1534 @@
                -        defined?(@new) ? @new : (@new = false)
                +        @new || false
                @@ -2339,0 +2426 @@
                +    def_initialize_nil_instance_variables
        lib/sequel/model/plugins.rb
                --- /tmp/d20260603-1535-vajkwh/sequel-5.104.0/lib/sequel/model/plugins.rb	2026-06-03 20:45:30.484579000 +0000
                +++ /tmp/d20260603-1535-vajkwh/sequel-5.105.0/lib/sequel/model/plugins.rb	2026-06-03 20:45:30.553579207 +0000
                @@ -41 +41,2 @@
                -    # values in this hash.
                +    # values in this hash. These affects how class instance variables will be treated
                +    # during subclassing.
                @@ -46,0 +48,10 @@
                +    end
                +
                +    # Sets the model instance variables used by the plugin. These instance variables
                +    # will be initialized to nil for created model objects.
                +    def self.model_instance_variables(mod, *ivs)
                +      mod.send(:define_method, :each_model_instance_variable) do |&block|
                +        super(&block)
                +        ivs.each(&block)
                +      end
                +      mod.send(:private, :each_model_instance_variable)
        lib/sequel/plugins/accessed_columns.rb
                --- /tmp/d20260603-1535-vajkwh/sequel-5.104.0/lib/sequel/plugins/accessed_columns.rb	2026-06-03 20:45:30.484579000 +0000
                +++ /tmp/d20260603-1535-vajkwh/sequel-5.105.0/lib/sequel/plugins/accessed_columns.rb	2026-06-03 20:45:30.553579207 +0000
                @@ -28,0 +29,4 @@
                +      module ClassMethods
                +        Plugins.model_instance_variables(self, :@accessed_columns)
                +      end
                +
        lib/sequel/plugins/active_model.rb
                --- /tmp/d20260603-1535-vajkwh/sequel-5.104.0/lib/sequel/plugins/active_model.rb	2026-06-03 20:45:30.484579000 +0000
                +++ /tmp/d20260603-1535-vajkwh/sequel-5.105.0/lib/sequel/plugins/active_model.rb	2026-06-03 20:45:30.553579207 +0000
                @@ -31,0 +32,2 @@
                +        Plugins.model_instance_variables(self, :@destroyed, :@rollback_checker)
                +
                @@ -61,2 +63 @@
                -          return false if new?
                -          return false if defined?(@destroyed)
                +          return false if new? || @destroyed
                @@ -64,4 +65,2 @@
                -          if defined?(@rollback_checker)
                -            if @rollback_checker.call
                -              return false
                -            end
                +          if @rollback_checker && @rollback_checker.call
                +            return false
        lib/sequel/plugins/association_pks.rb
                --- /tmp/d20260603-1535-vajkwh/sequel-5.104.0/lib/sequel/plugins/association_pks.rb	2026-06-03 20:45:30.485579002 +0000
                +++ /tmp/d20260603-1535-vajkwh/sequel-5.105.0/lib/sequel/plugins/association_pks.rb	2026-06-03 20:45:30.555579213 +0000
                @@ -69,0 +70,2 @@
                +        Plugins.model_instance_variables(self, :@_association_pks)
                +
        lib/sequel/plugins/auto_validations.rb
                --- /tmp/d20260603-1535-vajkwh/sequel-5.104.0/lib/sequel/plugins/auto_validations.rb	2026-06-03 20:45:30.486579006 +0000
                +++ /tmp/d20260603-1535-vajkwh/sequel-5.105.0/lib/sequel/plugins/auto_validations.rb	2026-06-03 20:45:30.555579213 +0000
                @@ -133,0 +134,2 @@
                +        Plugins.model_instance_variables(self, :@_skip_auto_validations)
                +
        lib/sequel/plugins/columns_updated.rb
                --- /tmp/d20260603-1535-vajkwh/sequel-5.104.0/lib/sequel/plugins/columns_updated.rb	2026-06-03 20:45:30.488579012 +0000
                +++ /tmp/d20260603-1535-vajkwh/sequel-5.105.0/lib/sequel/plugins/columns_updated.rb	2026-06-03 20:45:30.558579222 +0000
                @@ -17,0 +18,4 @@
                +      module ClassMethods
                +        Plugins.model_instance_variables(self, :@columns_updated)
                +      end
                +
        lib/sequel/plugins/composition.rb
                --- /tmp/d20260603-1535-vajkwh/sequel-5.104.0/lib/sequel/plugins/composition.rb	2026-06-03 20:45:30.488579012 +0000
                +++ /tmp/d20260603-1535-vajkwh/sequel-5.105.0/lib/sequel/plugins/composition.rb	2026-06-03 20:45:30.558579222 +0000
                @@ -68,0 +69,2 @@
                +        Plugins.model_instance_variables(self, :@compositions)
                +
        lib/sequel/plugins/dirty.rb
                --- /tmp/d20260603-1535-vajkwh/sequel-5.104.0/lib/sequel/plugins/dirty.rb	2026-06-03 20:45:30.490579018 +0000
                +++ /tmp/d20260603-1535-vajkwh/sequel-5.105.0/lib/sequel/plugins/dirty.rb	2026-06-03 20:45:30.561579232 +0000
                @@ -65,0 +66,4 @@
                +      module ClassMethods
                +        Plugins.model_instance_variables(self, :@previous_changes, :@initial_values, :@missing_initial_values)
                +      end
                +
        lib/sequel/plugins/forbid_lazy_load.rb
                --- /tmp/d20260603-1535-vajkwh/sequel-5.104.0/lib/sequel/plugins/forbid_lazy_load.rb	2026-06-03 20:45:30.491579021 +0000
                +++ /tmp/d20260603-1535-vajkwh/sequel-5.105.0/lib/sequel/plugins/forbid_lazy_load.rb	2026-06-03 20:45:30.562579234 +0000
                @@ -120,0 +121 @@
                +        Plugins.model_instance_variables(self, :@forbid_lazy_load)
        lib/sequel/plugins/insert_conflict.rb
                --- /tmp/d20260603-1535-vajkwh/sequel-5.104.0/lib/sequel/plugins/insert_conflict.rb	2026-06-03 20:45:30.492579024 +0000
                +++ /tmp/d20260603-1535-vajkwh/sequel-5.105.0/lib/sequel/plugins/insert_conflict.rb	2026-06-03 20:45:30.563579237 +0000
                @@ -44,0 +45,4 @@
                +      module ClassMethods
                +        Plugins.model_instance_variables(self, :@insert_conflict_opts)
                +      end
                +
        lib/sequel/plugins/instance_filters.rb
                --- /tmp/d20260603-1535-vajkwh/sequel-5.104.0/lib/sequel/plugins/instance_filters.rb	2026-06-03 20:45:30.492579024 +0000
                +++ /tmp/d20260603-1535-vajkwh/sequel-5.105.0/lib/sequel/plugins/instance_filters.rb	2026-06-03 20:45:30.563579237 +0000
                @@ -52,0 +53,4 @@
                +      module ClassMethods
                +        Plugins.model_instance_variables(self, :@instance_filters)
                +      end
                +
        lib/sequel/plugins/instance_hooks.rb
                --- /tmp/d20260603-1535-vajkwh/sequel-5.104.0/lib/sequel/plugins/instance_hooks.rb	2026-06-03 20:45:30.492579024 +0000
                +++ /tmp/d20260603-1535-vajkwh/sequel-5.105.0/lib/sequel/plugins/instance_hooks.rb	2026-06-03 20:45:30.564579240 +0000
                @@ -30,0 +31,4 @@
                +      module ClassMethods
                +        Plugins.model_instance_variables(self, :@instance_hooks)
                +      end
                +
        lib/sequel/plugins/json_serializer.rb
                --- /tmp/d20260603-1535-vajkwh/sequel-5.104.0/lib/sequel/plugins/json_serializer.rb	2026-06-03 20:45:30.493579027 +0000
                +++ /tmp/d20260603-1535-vajkwh/sequel-5.105.0/lib/sequel/plugins/json_serializer.rb	2026-06-03 20:45:30.564579240 +0000
                @@ -164,0 +165,2 @@
                +        Plugins.model_instance_variables(self, :@json_serializer_opts)
                +
        lib/sequel/plugins/modification_detection.rb
                --- /tmp/d20260603-1535-vajkwh/sequel-5.104.0/lib/sequel/plugins/modification_detection.rb	2026-06-03 20:45:30.494579030 +0000
                +++ /tmp/d20260603-1535-vajkwh/sequel-5.105.0/lib/sequel/plugins/modification_detection.rb	2026-06-03 20:45:30.565579244 +0000
                @@ -36,0 +37,2 @@
                +        Plugins.model_instance_variables(self, :@values_hashes)
                +
        lib/sequel/plugins/serialization.rb
                --- /tmp/d20260603-1535-vajkwh/sequel-5.104.0/lib/sequel/plugins/serialization.rb	2026-06-03 20:45:30.497579039 +0000
                +++ /tmp/d20260603-1535-vajkwh/sequel-5.105.0/lib/sequel/plugins/serialization.rb	2026-06-03 20:45:30.570579258 +0000
                @@ -115,0 +116,2 @@
                +        Plugins.model_instance_variables(self, :@deserialized_values)
                +
        lib/sequel/plugins/serialization_modification_detection.rb
                --- /tmp/d20260603-1535-vajkwh/sequel-5.104.0/lib/sequel/plugins/serialization_modification_detection.rb	2026-06-03 20:45:30.497579039 +0000
                +++ /tmp/d20260603-1535-vajkwh/sequel-5.105.0/lib/sequel/plugins/serialization_modification_detection.rb	2026-06-03 20:45:30.570579258 +0000
                @@ -32,0 +33,4 @@
                +
                +      module ClassMethods
                +        Plugins.model_instance_variables(self, :@original_deserialized_values)
                +      end
        lib/sequel/plugins/split_values.rb
                --- /tmp/d20260603-1535-vajkwh/sequel-5.104.0/lib/sequel/plugins/split_values.rb	2026-06-03 20:45:30.498579042 +0000
                +++ /tmp/d20260603-1535-vajkwh/sequel-5.105.0/lib/sequel/plugins/split_values.rb	2026-06-03 20:45:30.572579265 +0000
                @@ -38,0 +39,2 @@
                +        Plugins.model_instance_variables(self, :@noncolumn_values)
                +
        lib/sequel/plugins/tactical_eager_loading.rb
                --- /tmp/d20260603-1535-vajkwh/sequel-5.104.0/lib/sequel/plugins/tactical_eager_loading.rb	2026-06-03 20:45:30.500579048 +0000
                +++ /tmp/d20260603-1535-vajkwh/sequel-5.105.0/lib/sequel/plugins/tactical_eager_loading.rb	2026-06-03 20:45:30.574579270 +0000
                @@ -126,0 +127,4 @@
                +      module ClassMethods
                +        Plugins.model_instance_variables(self, :@retrieved_by, :@retrieved_with)
                +      end
                +
        lib/sequel/plugins/update_primary_key.rb
                --- /tmp/d20260603-1535-vajkwh/sequel-5.104.0/lib/sequel/plugins/update_primary_key.rb	2026-06-03 20:45:30.501579051 +0000
                +++ /tmp/d20260603-1535-vajkwh/sequel-5.105.0/lib/sequel/plugins/update_primary_key.rb	2026-06-03 20:45:30.576579277 +0000
                @@ -24,0 +25,4 @@
                +      module ClassMethods
                +        Plugins.model_instance_variables(self, :@pk_hash)
                +      end
                +
        lib/sequel/plugins/validation_contexts.rb
                --- /tmp/d20260603-1535-vajkwh/sequel-5.104.0/lib/sequel/plugins/validation_contexts.rb	2026-06-03 20:45:30.502579054 +0000
                +++ /tmp/d20260603-1535-vajkwh/sequel-5.105.0/lib/sequel/plugins/validation_contexts.rb	2026-06-03 20:45:30.577579279 +0000
                @@ -31,0 +32,4 @@
                +      module ClassMethods
                +        Plugins.model_instance_variables(self, :@validation_context)
                +      end
                +
        lib/sequel/version.rb
                --- /tmp/d20260603-1535-vajkwh/sequel-5.104.0/lib/sequel/version.rb	2026-06-03 20:45:30.504579060 +0000
                +++ /tmp/d20260603-1535-vajkwh/sequel-5.105.0/lib/sequel/version.rb	2026-06-03 20:45:30.579579286 +0000
                @@ -9 +9 @@
                -  MINOR = 104
                +  MINOR = 105

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 3, 2026

gem compare --diff sequel 5.104.0 5.105.0

Compared versions: ["5.104.0", "5.105.0"]
  DIFFERENT files:
    5.104.0->5.105.0:
      * Changed:
        lib/sequel/extensions/connection_expiration.rb
                --- /tmp/d20260603-1590-h7pevt/sequel-5.104.0/lib/sequel/extensions/connection_expiration.rb	2026-06-03 20:45:31.024055966 +0000
                +++ /tmp/d20260603-1590-h7pevt/sequel-5.105.0/lib/sequel/extensions/connection_expiration.rb	2026-06-03 20:45:31.102056150 +0000
                @@ -49,2 +49,4 @@
                -      when :single, :sharded_single
                -        raise Error, "cannot load connection_expiration extension if using single or sharded_single connection pool"
                +      when :threaded, :sharded_threaded, :timed_queue, :sharded_timed_queue
                +        nil
                +      else
                +        raise Error, "cannot load connection_expiration extension if using single or sharded_single connection pool (or other unsupported connection pool)"
                @@ -57,0 +60,33 @@
                +
                +          # Record an expiration timestamp for any connections that already
                +          # exist in the pool, so that a connection opened before the extension
                +          # was loaded (e.g. via Sequel.connect) will eventually be expired.
                +          register = method(:register_connection_expiration_time)
                +
                +          case pool_type
                +          when :timed_queue, :sharded_timed_queue
                +            register_queued_connections = lambda do |queue|
                +              conns = []
                +              while conn = queue.pop(timeout: 0)
                +                conns << conn
                +              end
                +              conns.each do |conn|
                +                queue.push(register_connection_expiration_time(conn))
                +              end
                +            end
                +          end
                +
                +          case pool_type
                +          when :threaded
                +            @available_connections.each(&register)
                +            @allocated.each_value(&register)
                +          when :sharded_threaded
                +            @available_connections.each_value{|conns| conns.each(&register)}
                +            @allocated.each_value{|threads| threads.each_value(&register)}
                +          when :timed_queue
                +            register_queued_connections.call(@queue)
                +            @allocated.each_value(&register)
                +          else # when :sharded_timed_queue
                +            @queues.each_value(&register_queued_connections)
                +            @allocated.each_value{|threads| threads.each_value(&register)}
                +          end
                @@ -72,2 +107,6 @@
                -      conn = super
                -      @connection_expiration_timestamps[conn] = [Sequel.start_timer, @connection_expiration_timeout + (rand * @connection_expiration_random_delay)].freeze
                +      register_connection_expiration_time(super)
                +    end
                +
                +    # Record an expiration entry for a connection, returns the connection.
                +    def register_connection_expiration_time(conn)
                +      @connection_expiration_timestamps[conn] ||= [Sequel.start_timer, @connection_expiration_timeout + (rand * @connection_expiration_random_delay)].freeze
        lib/sequel/model.rb
                --- /tmp/d20260603-1590-h7pevt/sequel-5.104.0/lib/sequel/model.rb	2026-06-03 20:45:31.036055994 +0000
                +++ /tmp/d20260603-1590-h7pevt/sequel-5.105.0/lib/sequel/model.rb	2026-06-03 20:45:31.136056230 +0000
                @@ -57,0 +58 @@
                +    @shape_friendly = false
        lib/sequel/model/associations.rb
                --- /tmp/d20260603-1590-h7pevt/sequel-5.104.0/lib/sequel/model/associations.rb	2026-06-03 20:45:31.037055997 +0000
                +++ /tmp/d20260603-1590-h7pevt/sequel-5.105.0/lib/sequel/model/associations.rb	2026-06-03 20:45:31.137056232 +0000
                @@ -2176,0 +2177 @@
                +        Plugins.model_instance_variables(self, :@associations, :@set_associated_object_if_same)
        lib/sequel/model/base.rb
                --- /tmp/d20260603-1590-h7pevt/sequel-5.104.0/lib/sequel/model/base.rb	2026-06-03 20:45:31.038055999 +0000
                +++ /tmp/d20260603-1590-h7pevt/sequel-5.105.0/lib/sequel/model/base.rb	2026-06-03 20:45:31.138056235 +0000
                @@ -86,0 +87,4 @@
                +      # Whether the model uses a shape friendly design (initializing all potentially
                +      # used instance variables to nil).
                +      attr_reader :shape_friendly
                +
                @@ -224,3 +228 @@
                -        o = allocate
                -        o.instance_variable_set(:@values, values)
                -        o
                +        allocate.initialize_from_db(values)
                @@ -504 +506,7 @@
                -          extend(m::ClassMethods) if m.const_defined?(:ClassMethods, false)
                +          if m.const_defined?(:ClassMethods, false)
                +            class_methods = m::ClassMethods
                +            extend(class_methods)
                +            if class_methods.private_method_defined?(:each_model_instance_variable)
                +              def_initialize_nil_instance_variables
                +            end
                +          end
                @@ -633,0 +642,7 @@
                +      # Set instance variables used by instances of this model class.
                +      # Only has an effect if shape_friendly is true.
                +      def set_model_instance_variables(*ivs)
                +        Plugins.model_instance_variables(singleton_class, *ivs)
                +        def_initialize_nil_instance_variables
                +      end
                +
                @@ -667,0 +683,6 @@
                +      # Set whether the model should be shape friendly.
                +      def shape_friendly=(v)
                +        @shape_friendly = v
                +        def_initialize_nil_instance_variables
                +      end
                +
                @@ -816,0 +838,54 @@
                +      # Defines the private _initialize_nil_instance_variables method.
                +      # If shape_friendly is true, defines a method that initials the
                +      # model's instance variables to nil. If shape_friendly is not
                +      # true, does nothing.
                +      def def_initialize_nil_instance_variables
                +        if @shape_friendly
                +          ivs = []
                +          each_model_instance_variable do |iv|
                +            unless iv.match(/\A@[a-z_][a-z0-9_]*\z/)
                +              raise Error, "invalid model instance variable used"
                +            end
                +
                +            ivs << iv
                +          end
                +          ivs.uniq!
                +          ivs = ivs.reverse.join(" = ")
                +          new_method_content = "#{ivs} = nil"
                +          new_from_db_method_content = "#{ivs} = @new = @modified = nil"
                +        end
                +
                +        class_eval(<<-RUBY, __FILE__, __LINE__+1)
                +          def _initialize_nil_instance_variables
                +            #{new_method_content}
                +          end
                +          def _initialize_from_db_nil_instance_variables
                +            #{new_from_db_method_content}
                +          end
                +        RUBY
                +        private :_initialize_nil_instance_variables, :_initialize_from_db_nil_instance_variables
                +        alias_method :_initialize_nil_instance_variables, :_initialize_nil_instance_variables
                +        alias_method :_initialize_from_db_nil_instance_variables, :_initialize_from_db_nil_instance_variables
                +        nil
                +      end
                +
                +      # Yield the default model instance variables. Designed only for
                +      # use by def_initialize_nil_instance_variables.
                +      def each_model_instance_variable
                +        [
                +          :@changed_columns,
                +          :@errors,
                +          :@raise_on_save_failure,
                +          :@raise_on_typecast_failure,
                +          :@require_modification,
                +          :@server,
                +          :@singleton_setter_added,
                +          :@skip_validation_on_next_save,
                +          :@strict_param_setting,
                +          :@this,
                +          :@typecast_empty_string_to_nil,
                +          :@typecast_on_assignment,
                +          :@use_transactions,
                +        ].each{|iv| yield iv}
                +      end
                +
                @@ -939,0 +1015 @@
                +          :@shape_friendly=>nil,
                @@ -1097 +1173 @@
                -        class_eval("def #{meth}; !defined?(@#{meth}) ? (frozen? ? self.class.#{meth} : (@#{meth} = self.class.#{meth})) : @#{meth} end", __FILE__, __LINE__)
                +        class_eval("def #{meth}; @#{meth}.nil? ? (frozen? ? self.class.#{meth} : (@#{meth} = self.class.#{meth})) : @#{meth} end", __FILE__, __LINE__)
                @@ -1138,2 +1214,3 @@
                -        @new = true
                -        @modified = true
                +        @new = @modified = true
                +        _initialize_nil_instance_variables
                +
                @@ -1144,0 +1222,9 @@
                +      # Initialize a new record using values retrieved from a database.
                +      # This should not be called directly, only via Model.call.
                +      def initialize_from_db(values) # :nodoc:
                +        @values = values
                +        _initialize_from_db_nil_instance_variables
                +
                +        self
                +      end
                +
                @@ -1448 +1534 @@
                -        defined?(@new) ? @new : (@new = false)
                +        @new || false
                @@ -2339,0 +2426 @@
                +    def_initialize_nil_instance_variables
        lib/sequel/model/plugins.rb
                --- /tmp/d20260603-1590-h7pevt/sequel-5.104.0/lib/sequel/model/plugins.rb	2026-06-03 20:45:31.038055999 +0000
                +++ /tmp/d20260603-1590-h7pevt/sequel-5.105.0/lib/sequel/model/plugins.rb	2026-06-03 20:45:31.138056235 +0000
                @@ -41 +41,2 @@
                -    # values in this hash.
                +    # values in this hash. These affects how class instance variables will be treated
                +    # during subclassing.
                @@ -46,0 +48,10 @@
                +    end
                +
                +    # Sets the model instance variables used by the plugin. These instance variables
                +    # will be initialized to nil for created model objects.
                +    def self.model_instance_variables(mod, *ivs)
                +      mod.send(:define_method, :each_model_instance_variable) do |&block|
                +        super(&block)
                +        ivs.each(&block)
                +      end
                +      mod.send(:private, :each_model_instance_variable)
        lib/sequel/plugins/accessed_columns.rb
                --- /tmp/d20260603-1590-h7pevt/sequel-5.104.0/lib/sequel/plugins/accessed_columns.rb	2026-06-03 20:45:31.039056001 +0000
                +++ /tmp/d20260603-1590-h7pevt/sequel-5.105.0/lib/sequel/plugins/accessed_columns.rb	2026-06-03 20:45:31.139056237 +0000
                @@ -28,0 +29,4 @@
                +      module ClassMethods
                +        Plugins.model_instance_variables(self, :@accessed_columns)
                +      end
                +
        lib/sequel/plugins/active_model.rb
                --- /tmp/d20260603-1590-h7pevt/sequel-5.104.0/lib/sequel/plugins/active_model.rb	2026-06-03 20:45:31.039056001 +0000
                +++ /tmp/d20260603-1590-h7pevt/sequel-5.105.0/lib/sequel/plugins/active_model.rb	2026-06-03 20:45:31.139056237 +0000
                @@ -31,0 +32,2 @@
                +        Plugins.model_instance_variables(self, :@destroyed, :@rollback_checker)
                +
                @@ -61,2 +63 @@
                -          return false if new?
                -          return false if defined?(@destroyed)
                +          return false if new? || @destroyed
                @@ -64,4 +65,2 @@
                -          if defined?(@rollback_checker)
                -            if @rollback_checker.call
                -              return false
                -            end
                +          if @rollback_checker && @rollback_checker.call
                +            return false
        lib/sequel/plugins/association_pks.rb
                --- /tmp/d20260603-1590-h7pevt/sequel-5.104.0/lib/sequel/plugins/association_pks.rb	2026-06-03 20:45:31.039056001 +0000
                +++ /tmp/d20260603-1590-h7pevt/sequel-5.105.0/lib/sequel/plugins/association_pks.rb	2026-06-03 20:45:31.139056237 +0000
                @@ -69,0 +70,2 @@
                +        Plugins.model_instance_variables(self, :@_association_pks)
                +
        lib/sequel/plugins/auto_validations.rb
                --- /tmp/d20260603-1590-h7pevt/sequel-5.104.0/lib/sequel/plugins/auto_validations.rb	2026-06-03 20:45:31.040056004 +0000
                +++ /tmp/d20260603-1590-h7pevt/sequel-5.105.0/lib/sequel/plugins/auto_validations.rb	2026-06-03 20:45:31.140056240 +0000
                @@ -133,0 +134,2 @@
                +        Plugins.model_instance_variables(self, :@_skip_auto_validations)
                +
        lib/sequel/plugins/columns_updated.rb
                --- /tmp/d20260603-1590-h7pevt/sequel-5.104.0/lib/sequel/plugins/columns_updated.rb	2026-06-03 20:45:31.042056009 +0000
                +++ /tmp/d20260603-1590-h7pevt/sequel-5.105.0/lib/sequel/plugins/columns_updated.rb	2026-06-03 20:45:31.141056242 +0000
                @@ -17,0 +18,4 @@
                +      module ClassMethods
                +        Plugins.model_instance_variables(self, :@columns_updated)
                +      end
                +
        lib/sequel/plugins/composition.rb
                --- /tmp/d20260603-1590-h7pevt/sequel-5.104.0/lib/sequel/plugins/composition.rb	2026-06-03 20:45:31.042056009 +0000
                +++ /tmp/d20260603-1590-h7pevt/sequel-5.105.0/lib/sequel/plugins/composition.rb	2026-06-03 20:45:31.141056242 +0000
                @@ -68,0 +69,2 @@
                +        Plugins.model_instance_variables(self, :@compositions)
                +
        lib/sequel/plugins/dirty.rb
                --- /tmp/d20260603-1590-h7pevt/sequel-5.104.0/lib/sequel/plugins/dirty.rb	2026-06-03 20:45:31.045056016 +0000
                +++ /tmp/d20260603-1590-h7pevt/sequel-5.105.0/lib/sequel/plugins/dirty.rb	2026-06-03 20:45:31.143056247 +0000
                @@ -65,0 +66,4 @@
                +      module ClassMethods
                +        Plugins.model_instance_variables(self, :@previous_changes, :@initial_values, :@missing_initial_values)
                +      end
                +
        lib/sequel/plugins/forbid_lazy_load.rb
                --- /tmp/d20260603-1590-h7pevt/sequel-5.104.0/lib/sequel/plugins/forbid_lazy_load.rb	2026-06-03 20:45:31.047056020 +0000
                +++ /tmp/d20260603-1590-h7pevt/sequel-5.105.0/lib/sequel/plugins/forbid_lazy_load.rb	2026-06-03 20:45:31.144056249 +0000
                @@ -120,0 +121 @@
                +        Plugins.model_instance_variables(self, :@forbid_lazy_load)
        lib/sequel/plugins/insert_conflict.rb
                --- /tmp/d20260603-1590-h7pevt/sequel-5.104.0/lib/sequel/plugins/insert_conflict.rb	2026-06-03 20:45:31.048056023 +0000
                +++ /tmp/d20260603-1590-h7pevt/sequel-5.105.0/lib/sequel/plugins/insert_conflict.rb	2026-06-03 20:45:31.144056249 +0000
                @@ -44,0 +45,4 @@
                +      module ClassMethods
                +        Plugins.model_instance_variables(self, :@insert_conflict_opts)
                +      end
                +
        lib/sequel/plugins/instance_filters.rb
                --- /tmp/d20260603-1590-h7pevt/sequel-5.104.0/lib/sequel/plugins/instance_filters.rb	2026-06-03 20:45:31.049056025 +0000
                +++ /tmp/d20260603-1590-h7pevt/sequel-5.105.0/lib/sequel/plugins/instance_filters.rb	2026-06-03 20:45:31.144056249 +0000
                @@ -52,0 +53,4 @@
                +      module ClassMethods
                +        Plugins.model_instance_variables(self, :@instance_filters)
                +      end
                +
        lib/sequel/plugins/instance_hooks.rb
                --- /tmp/d20260603-1590-h7pevt/sequel-5.104.0/lib/sequel/plugins/instance_hooks.rb	2026-06-03 20:45:31.049056025 +0000
                +++ /tmp/d20260603-1590-h7pevt/sequel-5.105.0/lib/sequel/plugins/instance_hooks.rb	2026-06-03 20:45:31.144056249 +0000
                @@ -30,0 +31,4 @@
                +      module ClassMethods
                +        Plugins.model_instance_variables(self, :@instance_hooks)
                +      end
                +
        lib/sequel/plugins/json_serializer.rb
                --- /tmp/d20260603-1590-h7pevt/sequel-5.104.0/lib/sequel/plugins/json_serializer.rb	2026-06-03 20:45:31.050056027 +0000
                +++ /tmp/d20260603-1590-h7pevt/sequel-5.105.0/lib/sequel/plugins/json_serializer.rb	2026-06-03 20:45:31.145056251 +0000
                @@ -164,0 +165,2 @@
                +        Plugins.model_instance_variables(self, :@json_serializer_opts)
                +
        lib/sequel/plugins/modification_detection.rb
                --- /tmp/d20260603-1590-h7pevt/sequel-5.104.0/lib/sequel/plugins/modification_detection.rb	2026-06-03 20:45:31.051056030 +0000
                +++ /tmp/d20260603-1590-h7pevt/sequel-5.105.0/lib/sequel/plugins/modification_detection.rb	2026-06-03 20:45:31.145056251 +0000
                @@ -36,0 +37,2 @@
                +        Plugins.model_instance_variables(self, :@values_hashes)
                +
        lib/sequel/plugins/serialization.rb
                --- /tmp/d20260603-1590-h7pevt/sequel-5.104.0/lib/sequel/plugins/serialization.rb	2026-06-03 20:45:31.056056042 +0000
                +++ /tmp/d20260603-1590-h7pevt/sequel-5.105.0/lib/sequel/plugins/serialization.rb	2026-06-03 20:45:31.148056258 +0000
                @@ -115,0 +116,2 @@
                +        Plugins.model_instance_variables(self, :@deserialized_values)
                +
        lib/sequel/plugins/serialization_modification_detection.rb
                --- /tmp/d20260603-1590-h7pevt/sequel-5.104.0/lib/sequel/plugins/serialization_modification_detection.rb	2026-06-03 20:45:31.056056042 +0000
                +++ /tmp/d20260603-1590-h7pevt/sequel-5.105.0/lib/sequel/plugins/serialization_modification_detection.rb	2026-06-03 20:45:31.148056258 +0000
                @@ -32,0 +33,4 @@
                +
                +      module ClassMethods
                +        Plugins.model_instance_variables(self, :@original_deserialized_values)
                +      end
        lib/sequel/plugins/split_values.rb
                --- /tmp/d20260603-1590-h7pevt/sequel-5.104.0/lib/sequel/plugins/split_values.rb	2026-06-03 20:45:31.058056046 +0000
                +++ /tmp/d20260603-1590-h7pevt/sequel-5.105.0/lib/sequel/plugins/split_values.rb	2026-06-03 20:45:31.148056258 +0000
                @@ -38,0 +39,2 @@
                +        Plugins.model_instance_variables(self, :@noncolumn_values)
                +
        lib/sequel/plugins/tactical_eager_loading.rb
                --- /tmp/d20260603-1590-h7pevt/sequel-5.104.0/lib/sequel/plugins/tactical_eager_loading.rb	2026-06-03 20:45:31.060056051 +0000
                +++ /tmp/d20260603-1590-h7pevt/sequel-5.105.0/lib/sequel/plugins/tactical_eager_loading.rb	2026-06-03 20:45:31.150056263 +0000
                @@ -126,0 +127,4 @@
                +      module ClassMethods
                +        Plugins.model_instance_variables(self, :@retrieved_by, :@retrieved_with)
                +      end
                +
        lib/sequel/plugins/update_primary_key.rb
                --- /tmp/d20260603-1590-h7pevt/sequel-5.104.0/lib/sequel/plugins/update_primary_key.rb	2026-06-03 20:45:31.063056058 +0000
                +++ /tmp/d20260603-1590-h7pevt/sequel-5.105.0/lib/sequel/plugins/update_primary_key.rb	2026-06-03 20:45:31.151056266 +0000
                @@ -24,0 +25,4 @@
                +      module ClassMethods
                +        Plugins.model_instance_variables(self, :@pk_hash)
                +      end
                +
        lib/sequel/plugins/validation_contexts.rb
                --- /tmp/d20260603-1590-h7pevt/sequel-5.104.0/lib/sequel/plugins/validation_contexts.rb	2026-06-03 20:45:31.064056060 +0000
                +++ /tmp/d20260603-1590-h7pevt/sequel-5.105.0/lib/sequel/plugins/validation_contexts.rb	2026-06-03 20:45:31.152056268 +0000
                @@ -31,0 +32,4 @@
                +      module ClassMethods
                +        Plugins.model_instance_variables(self, :@validation_context)
                +      end
                +
        lib/sequel/version.rb
                --- /tmp/d20260603-1590-h7pevt/sequel-5.104.0/lib/sequel/version.rb	2026-06-03 20:45:31.067056068 +0000
                +++ /tmp/d20260603-1590-h7pevt/sequel-5.105.0/lib/sequel/version.rb	2026-06-03 20:45:31.153056270 +0000
                @@ -9 +9 @@
                -  MINOR = 104
                +  MINOR = 105

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 3, 2026

gem compare sequel 5.104.0 5.105.0

Compared versions: ["5.104.0", "5.105.0"]
  DIFFERENT rubygems_version:
    5.104.0: 4.0.3
    5.105.0: 4.0.10
  DIFFERENT version:
    5.104.0: 5.104.0
    5.105.0: 5.105.0
  DIFFERENT files:
    5.104.0->5.105.0:
      * Changed:
            lib/sequel/extensions/connection_expiration.rb +43/-4
            lib/sequel/model.rb +1/-0
            lib/sequel/model/associations.rb +1/-0
            lib/sequel/model/base.rb +95/-8
            lib/sequel/model/plugins.rb +12/-1
            lib/sequel/plugins/accessed_columns.rb +4/-0
            lib/sequel/plugins/active_model.rb +5/-6
            lib/sequel/plugins/association_pks.rb +2/-0
            lib/sequel/plugins/auto_validations.rb +2/-0
            lib/sequel/plugins/columns_updated.rb +4/-0
            lib/sequel/plugins/composition.rb +2/-0
            lib/sequel/plugins/dirty.rb +4/-0
            lib/sequel/plugins/forbid_lazy_load.rb +1/-0
            lib/sequel/plugins/insert_conflict.rb +4/-0
            lib/sequel/plugins/instance_filters.rb +4/-0
            lib/sequel/plugins/instance_hooks.rb +4/-0
            lib/sequel/plugins/json_serializer.rb +2/-0
            lib/sequel/plugins/modification_detection.rb +2/-0
            lib/sequel/plugins/serialization.rb +2/-0
            lib/sequel/plugins/serialization_modification_detection.rb +4/-0
            lib/sequel/plugins/split_values.rb +2/-0
            lib/sequel/plugins/tactical_eager_loading.rb +4/-0
            lib/sequel/plugins/update_primary_key.rb +4/-0
            lib/sequel/plugins/validation_contexts.rb +4/-0
            lib/sequel/version.rb +1/-1

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 3, 2026

gem compare --diff sequel 5.104.0 5.105.0

Compared versions: ["5.104.0", "5.105.0"]
  DIFFERENT files:
    5.104.0->5.105.0:
      * Changed:
        lib/sequel/extensions/connection_expiration.rb
                --- /tmp/d20260603-1536-iloz9v/sequel-5.104.0/lib/sequel/extensions/connection_expiration.rb	2026-06-03 20:45:46.027226188 +0000
                +++ /tmp/d20260603-1536-iloz9v/sequel-5.105.0/lib/sequel/extensions/connection_expiration.rb	2026-06-03 20:45:46.114225982 +0000
                @@ -49,2 +49,4 @@
                -      when :single, :sharded_single
                -        raise Error, "cannot load connection_expiration extension if using single or sharded_single connection pool"
                +      when :threaded, :sharded_threaded, :timed_queue, :sharded_timed_queue
                +        nil
                +      else
                +        raise Error, "cannot load connection_expiration extension if using single or sharded_single connection pool (or other unsupported connection pool)"
                @@ -57,0 +60,33 @@
                +
                +          # Record an expiration timestamp for any connections that already
                +          # exist in the pool, so that a connection opened before the extension
                +          # was loaded (e.g. via Sequel.connect) will eventually be expired.
                +          register = method(:register_connection_expiration_time)
                +
                +          case pool_type
                +          when :timed_queue, :sharded_timed_queue
                +            register_queued_connections = lambda do |queue|
                +              conns = []
                +              while conn = queue.pop(timeout: 0)
                +                conns << conn
                +              end
                +              conns.each do |conn|
                +                queue.push(register_connection_expiration_time(conn))
                +              end
                +            end
                +          end
                +
                +          case pool_type
                +          when :threaded
                +            @available_connections.each(&register)
                +            @allocated.each_value(&register)
                +          when :sharded_threaded
                +            @available_connections.each_value{|conns| conns.each(&register)}
                +            @allocated.each_value{|threads| threads.each_value(&register)}
                +          when :timed_queue
                +            register_queued_connections.call(@queue)
                +            @allocated.each_value(&register)
                +          else # when :sharded_timed_queue
                +            @queues.each_value(&register_queued_connections)
                +            @allocated.each_value{|threads| threads.each_value(&register)}
                +          end
                @@ -72,2 +107,6 @@
                -      conn = super
                -      @connection_expiration_timestamps[conn] = [Sequel.start_timer, @connection_expiration_timeout + (rand * @connection_expiration_random_delay)].freeze
                +      register_connection_expiration_time(super)
                +    end
                +
                +    # Record an expiration entry for a connection, returns the connection.
                +    def register_connection_expiration_time(conn)
                +      @connection_expiration_timestamps[conn] ||= [Sequel.start_timer, @connection_expiration_timeout + (rand * @connection_expiration_random_delay)].freeze
        lib/sequel/model.rb
                --- /tmp/d20260603-1536-iloz9v/sequel-5.104.0/lib/sequel/model.rb	2026-06-03 20:45:46.052226129 +0000
                +++ /tmp/d20260603-1536-iloz9v/sequel-5.105.0/lib/sequel/model.rb	2026-06-03 20:45:46.142225916 +0000
                @@ -57,0 +58 @@
                +    @shape_friendly = false
        lib/sequel/model/associations.rb
                --- /tmp/d20260603-1536-iloz9v/sequel-5.104.0/lib/sequel/model/associations.rb	2026-06-03 20:45:46.053226127 +0000
                +++ /tmp/d20260603-1536-iloz9v/sequel-5.105.0/lib/sequel/model/associations.rb	2026-06-03 20:45:46.144225912 +0000
                @@ -2176,0 +2177 @@
                +        Plugins.model_instance_variables(self, :@associations, :@set_associated_object_if_same)
        lib/sequel/model/base.rb
                --- /tmp/d20260603-1536-iloz9v/sequel-5.104.0/lib/sequel/model/base.rb	2026-06-03 20:45:46.054226124 +0000
                +++ /tmp/d20260603-1536-iloz9v/sequel-5.105.0/lib/sequel/model/base.rb	2026-06-03 20:45:46.145225909 +0000
                @@ -86,0 +87,4 @@
                +      # Whether the model uses a shape friendly design (initializing all potentially
                +      # used instance variables to nil).
                +      attr_reader :shape_friendly
                +
                @@ -224,3 +228 @@
                -        o = allocate
                -        o.instance_variable_set(:@values, values)
                -        o
                +        allocate.initialize_from_db(values)
                @@ -504 +506,7 @@
                -          extend(m::ClassMethods) if m.const_defined?(:ClassMethods, false)
                +          if m.const_defined?(:ClassMethods, false)
                +            class_methods = m::ClassMethods
                +            extend(class_methods)
                +            if class_methods.private_method_defined?(:each_model_instance_variable)
                +              def_initialize_nil_instance_variables
                +            end
                +          end
                @@ -633,0 +642,7 @@
                +      # Set instance variables used by instances of this model class.
                +      # Only has an effect if shape_friendly is true.
                +      def set_model_instance_variables(*ivs)
                +        Plugins.model_instance_variables(singleton_class, *ivs)
                +        def_initialize_nil_instance_variables
                +      end
                +
                @@ -667,0 +683,6 @@
                +      # Set whether the model should be shape friendly.
                +      def shape_friendly=(v)
                +        @shape_friendly = v
                +        def_initialize_nil_instance_variables
                +      end
                +
                @@ -816,0 +838,54 @@
                +      # Defines the private _initialize_nil_instance_variables method.
                +      # If shape_friendly is true, defines a method that initials the
                +      # model's instance variables to nil. If shape_friendly is not
                +      # true, does nothing.
                +      def def_initialize_nil_instance_variables
                +        if @shape_friendly
                +          ivs = []
                +          each_model_instance_variable do |iv|
                +            unless iv.match(/\A@[a-z_][a-z0-9_]*\z/)
                +              raise Error, "invalid model instance variable used"
                +            end
                +
                +            ivs << iv
                +          end
                +          ivs.uniq!
                +          ivs = ivs.reverse.join(" = ")
                +          new_method_content = "#{ivs} = nil"
                +          new_from_db_method_content = "#{ivs} = @new = @modified = nil"
                +        end
                +
                +        class_eval(<<-RUBY, __FILE__, __LINE__+1)
                +          def _initialize_nil_instance_variables
                +            #{new_method_content}
                +          end
                +          def _initialize_from_db_nil_instance_variables
                +            #{new_from_db_method_content}
                +          end
                +        RUBY
                +        private :_initialize_nil_instance_variables, :_initialize_from_db_nil_instance_variables
                +        alias_method :_initialize_nil_instance_variables, :_initialize_nil_instance_variables
                +        alias_method :_initialize_from_db_nil_instance_variables, :_initialize_from_db_nil_instance_variables
                +        nil
                +      end
                +
                +      # Yield the default model instance variables. Designed only for
                +      # use by def_initialize_nil_instance_variables.
                +      def each_model_instance_variable
                +        [
                +          :@changed_columns,
                +          :@errors,
                +          :@raise_on_save_failure,
                +          :@raise_on_typecast_failure,
                +          :@require_modification,
                +          :@server,
                +          :@singleton_setter_added,
                +          :@skip_validation_on_next_save,
                +          :@strict_param_setting,
                +          :@this,
                +          :@typecast_empty_string_to_nil,
                +          :@typecast_on_assignment,
                +          :@use_transactions,
                +        ].each{|iv| yield iv}
                +      end
                +
                @@ -939,0 +1015 @@
                +          :@shape_friendly=>nil,
                @@ -1097 +1173 @@
                -        class_eval("def #{meth}; !defined?(@#{meth}) ? (frozen? ? self.class.#{meth} : (@#{meth} = self.class.#{meth})) : @#{meth} end", __FILE__, __LINE__)
                +        class_eval("def #{meth}; @#{meth}.nil? ? (frozen? ? self.class.#{meth} : (@#{meth} = self.class.#{meth})) : @#{meth} end", __FILE__, __LINE__)
                @@ -1138,2 +1214,3 @@
                -        @new = true
                -        @modified = true
                +        @new = @modified = true
                +        _initialize_nil_instance_variables
                +
                @@ -1144,0 +1222,9 @@
                +      # Initialize a new record using values retrieved from a database.
                +      # This should not be called directly, only via Model.call.
                +      def initialize_from_db(values) # :nodoc:
                +        @values = values
                +        _initialize_from_db_nil_instance_variables
                +
                +        self
                +      end
                +
                @@ -1448 +1534 @@
                -        defined?(@new) ? @new : (@new = false)
                +        @new || false
                @@ -2339,0 +2426 @@
                +    def_initialize_nil_instance_variables
        lib/sequel/model/plugins.rb
                --- /tmp/d20260603-1536-iloz9v/sequel-5.104.0/lib/sequel/model/plugins.rb	2026-06-03 20:45:46.055226122 +0000
                +++ /tmp/d20260603-1536-iloz9v/sequel-5.105.0/lib/sequel/model/plugins.rb	2026-06-03 20:45:46.148225902 +0000
                @@ -41 +41,2 @@
                -    # values in this hash.
                +    # values in this hash. These affects how class instance variables will be treated
                +    # during subclassing.
                @@ -46,0 +48,10 @@
                +    end
                +
                +    # Sets the model instance variables used by the plugin. These instance variables
                +    # will be initialized to nil for created model objects.
                +    def self.model_instance_variables(mod, *ivs)
                +      mod.send(:define_method, :each_model_instance_variable) do |&block|
                +        super(&block)
                +        ivs.each(&block)
                +      end
                +      mod.send(:private, :each_model_instance_variable)
        lib/sequel/plugins/accessed_columns.rb
                --- /tmp/d20260603-1536-iloz9v/sequel-5.104.0/lib/sequel/plugins/accessed_columns.rb	2026-06-03 20:45:46.055226122 +0000
                +++ /tmp/d20260603-1536-iloz9v/sequel-5.105.0/lib/sequel/plugins/accessed_columns.rb	2026-06-03 20:45:46.149225900 +0000
                @@ -28,0 +29,4 @@
                +      module ClassMethods
                +        Plugins.model_instance_variables(self, :@accessed_columns)
                +      end
                +
        lib/sequel/plugins/active_model.rb
                --- /tmp/d20260603-1536-iloz9v/sequel-5.104.0/lib/sequel/plugins/active_model.rb	2026-06-03 20:45:46.055226122 +0000
                +++ /tmp/d20260603-1536-iloz9v/sequel-5.105.0/lib/sequel/plugins/active_model.rb	2026-06-03 20:45:46.149225900 +0000
                @@ -31,0 +32,2 @@
                +        Plugins.model_instance_variables(self, :@destroyed, :@rollback_checker)
                +
                @@ -61,2 +63 @@
                -          return false if new?
                -          return false if defined?(@destroyed)
                +          return false if new? || @destroyed
                @@ -64,4 +65,2 @@
                -          if defined?(@rollback_checker)
                -            if @rollback_checker.call
                -              return false
                -            end
                +          if @rollback_checker && @rollback_checker.call
                +            return false
        lib/sequel/plugins/association_pks.rb
                --- /tmp/d20260603-1536-iloz9v/sequel-5.104.0/lib/sequel/plugins/association_pks.rb	2026-06-03 20:45:46.057226117 +0000
                +++ /tmp/d20260603-1536-iloz9v/sequel-5.105.0/lib/sequel/plugins/association_pks.rb	2026-06-03 20:45:46.151225895 +0000
                @@ -69,0 +70,2 @@
                +        Plugins.model_instance_variables(self, :@_association_pks)
                +
        lib/sequel/plugins/auto_validations.rb
                --- /tmp/d20260603-1536-iloz9v/sequel-5.104.0/lib/sequel/plugins/auto_validations.rb	2026-06-03 20:45:46.057226117 +0000
                +++ /tmp/d20260603-1536-iloz9v/sequel-5.105.0/lib/sequel/plugins/auto_validations.rb	2026-06-03 20:45:46.152225893 +0000
                @@ -133,0 +134,2 @@
                +        Plugins.model_instance_variables(self, :@_skip_auto_validations)
                +
        lib/sequel/plugins/columns_updated.rb
                --- /tmp/d20260603-1536-iloz9v/sequel-5.104.0/lib/sequel/plugins/columns_updated.rb	2026-06-03 20:45:46.061226108 +0000
                +++ /tmp/d20260603-1536-iloz9v/sequel-5.105.0/lib/sequel/plugins/columns_updated.rb	2026-06-03 20:45:46.154225888 +0000
                @@ -17,0 +18,4 @@
                +      module ClassMethods
                +        Plugins.model_instance_variables(self, :@columns_updated)
                +      end
                +
        lib/sequel/plugins/composition.rb
                --- /tmp/d20260603-1536-iloz9v/sequel-5.104.0/lib/sequel/plugins/composition.rb	2026-06-03 20:45:46.061226108 +0000
                +++ /tmp/d20260603-1536-iloz9v/sequel-5.105.0/lib/sequel/plugins/composition.rb	2026-06-03 20:45:46.155225886 +0000
                @@ -68,0 +69,2 @@
                +        Plugins.model_instance_variables(self, :@compositions)
                +
        lib/sequel/plugins/dirty.rb
                --- /tmp/d20260603-1536-iloz9v/sequel-5.104.0/lib/sequel/plugins/dirty.rb	2026-06-03 20:45:46.063226103 +0000
                +++ /tmp/d20260603-1536-iloz9v/sequel-5.105.0/lib/sequel/plugins/dirty.rb	2026-06-03 20:45:46.158225878 +0000
                @@ -65,0 +66,4 @@
                +      module ClassMethods
                +        Plugins.model_instance_variables(self, :@previous_changes, :@initial_values, :@missing_initial_values)
                +      end
                +
        lib/sequel/plugins/forbid_lazy_load.rb
                --- /tmp/d20260603-1536-iloz9v/sequel-5.104.0/lib/sequel/plugins/forbid_lazy_load.rb	2026-06-03 20:45:46.067226093 +0000
                +++ /tmp/d20260603-1536-iloz9v/sequel-5.105.0/lib/sequel/plugins/forbid_lazy_load.rb	2026-06-03 20:45:46.161225871 +0000
                @@ -120,0 +121 @@
                +        Plugins.model_instance_variables(self, :@forbid_lazy_load)
        lib/sequel/plugins/insert_conflict.rb
                --- /tmp/d20260603-1536-iloz9v/sequel-5.104.0/lib/sequel/plugins/insert_conflict.rb	2026-06-03 20:45:46.068226091 +0000
                +++ /tmp/d20260603-1536-iloz9v/sequel-5.105.0/lib/sequel/plugins/insert_conflict.rb	2026-06-03 20:45:46.162225869 +0000
                @@ -44,0 +45,4 @@
                +      module ClassMethods
                +        Plugins.model_instance_variables(self, :@insert_conflict_opts)
                +      end
                +
        lib/sequel/plugins/instance_filters.rb
                --- /tmp/d20260603-1536-iloz9v/sequel-5.104.0/lib/sequel/plugins/instance_filters.rb	2026-06-03 20:45:46.068226091 +0000
                +++ /tmp/d20260603-1536-iloz9v/sequel-5.105.0/lib/sequel/plugins/instance_filters.rb	2026-06-03 20:45:46.163225867 +0000
                @@ -52,0 +53,4 @@
                +      module ClassMethods
                +        Plugins.model_instance_variables(self, :@instance_filters)
                +      end
                +
        lib/sequel/plugins/instance_hooks.rb
                --- /tmp/d20260603-1536-iloz9v/sequel-5.104.0/lib/sequel/plugins/instance_hooks.rb	2026-06-03 20:45:46.068226091 +0000
                +++ /tmp/d20260603-1536-iloz9v/sequel-5.105.0/lib/sequel/plugins/instance_hooks.rb	2026-06-03 20:45:46.163225867 +0000
                @@ -30,0 +31,4 @@
                +      module ClassMethods
                +        Plugins.model_instance_variables(self, :@instance_hooks)
                +      end
                +
        lib/sequel/plugins/json_serializer.rb
                --- /tmp/d20260603-1536-iloz9v/sequel-5.104.0/lib/sequel/plugins/json_serializer.rb	2026-06-03 20:45:46.069226089 +0000
                +++ /tmp/d20260603-1536-iloz9v/sequel-5.105.0/lib/sequel/plugins/json_serializer.rb	2026-06-03 20:45:46.164225864 +0000
                @@ -164,0 +165,2 @@
                +        Plugins.model_instance_variables(self, :@json_serializer_opts)
                +
        lib/sequel/plugins/modification_detection.rb
                --- /tmp/d20260603-1536-iloz9v/sequel-5.104.0/lib/sequel/plugins/modification_detection.rb	2026-06-03 20:45:46.070226086 +0000
                +++ /tmp/d20260603-1536-iloz9v/sequel-5.105.0/lib/sequel/plugins/modification_detection.rb	2026-06-03 20:45:46.165225862 +0000
                @@ -36,0 +37,2 @@
                +        Plugins.model_instance_variables(self, :@values_hashes)
                +
        lib/sequel/plugins/serialization.rb
                --- /tmp/d20260603-1536-iloz9v/sequel-5.104.0/lib/sequel/plugins/serialization.rb	2026-06-03 20:45:46.074226077 +0000
                +++ /tmp/d20260603-1536-iloz9v/sequel-5.105.0/lib/sequel/plugins/serialization.rb	2026-06-03 20:45:46.172225845 +0000
                @@ -115,0 +116,2 @@
                +        Plugins.model_instance_variables(self, :@deserialized_values)
                +
        lib/sequel/plugins/serialization_modification_detection.rb
                --- /tmp/d20260603-1536-iloz9v/sequel-5.104.0/lib/sequel/plugins/serialization_modification_detection.rb	2026-06-03 20:45:46.074226077 +0000
                +++ /tmp/d20260603-1536-iloz9v/sequel-5.105.0/lib/sequel/plugins/serialization_modification_detection.rb	2026-06-03 20:45:46.172225845 +0000
                @@ -32,0 +33,4 @@
                +
                +      module ClassMethods
                +        Plugins.model_instance_variables(self, :@original_deserialized_values)
                +      end
        lib/sequel/plugins/split_values.rb
                --- /tmp/d20260603-1536-iloz9v/sequel-5.104.0/lib/sequel/plugins/split_values.rb	2026-06-03 20:45:46.076226072 +0000
                +++ /tmp/d20260603-1536-iloz9v/sequel-5.105.0/lib/sequel/plugins/split_values.rb	2026-06-03 20:45:46.174225841 +0000
                @@ -38,0 +39,2 @@
                +        Plugins.model_instance_variables(self, :@noncolumn_values)
                +
        lib/sequel/plugins/tactical_eager_loading.rb
                --- /tmp/d20260603-1536-iloz9v/sequel-5.104.0/lib/sequel/plugins/tactical_eager_loading.rb	2026-06-03 20:45:46.078226067 +0000
                +++ /tmp/d20260603-1536-iloz9v/sequel-5.105.0/lib/sequel/plugins/tactical_eager_loading.rb	2026-06-03 20:45:46.176225836 +0000
                @@ -126,0 +127,4 @@
                +      module ClassMethods
                +        Plugins.model_instance_variables(self, :@retrieved_by, :@retrieved_with)
                +      end
                +
        lib/sequel/plugins/update_primary_key.rb
                --- /tmp/d20260603-1536-iloz9v/sequel-5.104.0/lib/sequel/plugins/update_primary_key.rb	2026-06-03 20:45:46.080226063 +0000
                +++ /tmp/d20260603-1536-iloz9v/sequel-5.105.0/lib/sequel/plugins/update_primary_key.rb	2026-06-03 20:45:46.179225829 +0000
                @@ -24,0 +25,4 @@
                +      module ClassMethods
                +        Plugins.model_instance_variables(self, :@pk_hash)
                +      end
                +
        lib/sequel/plugins/validation_contexts.rb
                --- /tmp/d20260603-1536-iloz9v/sequel-5.104.0/lib/sequel/plugins/validation_contexts.rb	2026-06-03 20:45:46.082226058 +0000
                +++ /tmp/d20260603-1536-iloz9v/sequel-5.105.0/lib/sequel/plugins/validation_contexts.rb	2026-06-03 20:45:46.181225824 +0000
                @@ -31,0 +32,4 @@
                +      module ClassMethods
                +        Plugins.model_instance_variables(self, :@validation_context)
                +      end
                +
        lib/sequel/version.rb
                --- /tmp/d20260603-1536-iloz9v/sequel-5.104.0/lib/sequel/version.rb	2026-06-03 20:45:46.084226053 +0000
                +++ /tmp/d20260603-1536-iloz9v/sequel-5.105.0/lib/sequel/version.rb	2026-06-03 20:45:46.183225819 +0000
                @@ -9 +9 @@
                -  MINOR = 104
                +  MINOR = 105

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 3, 2026

gem compare --diff sequel 5.104.0 5.105.0

Compared versions: ["5.104.0", "5.105.0"]
  DIFFERENT files:
    5.104.0->5.105.0:
      * Changed:
        lib/sequel/extensions/connection_expiration.rb
                --- /tmp/d20260603-1553-ymp7sj/sequel-5.104.0/lib/sequel/extensions/connection_expiration.rb	2026-06-03 20:45:49.676914483 +0000
                +++ /tmp/d20260603-1553-ymp7sj/sequel-5.105.0/lib/sequel/extensions/connection_expiration.rb	2026-06-03 20:45:49.736915247 +0000
                @@ -49,2 +49,4 @@
                -      when :single, :sharded_single
                -        raise Error, "cannot load connection_expiration extension if using single or sharded_single connection pool"
                +      when :threaded, :sharded_threaded, :timed_queue, :sharded_timed_queue
                +        nil
                +      else
                +        raise Error, "cannot load connection_expiration extension if using single or sharded_single connection pool (or other unsupported connection pool)"
                @@ -57,0 +60,33 @@
                +
                +          # Record an expiration timestamp for any connections that already
                +          # exist in the pool, so that a connection opened before the extension
                +          # was loaded (e.g. via Sequel.connect) will eventually be expired.
                +          register = method(:register_connection_expiration_time)
                +
                +          case pool_type
                +          when :timed_queue, :sharded_timed_queue
                +            register_queued_connections = lambda do |queue|
                +              conns = []
                +              while conn = queue.pop(timeout: 0)
                +                conns << conn
                +              end
                +              conns.each do |conn|
                +                queue.push(register_connection_expiration_time(conn))
                +              end
                +            end
                +          end
                +
                +          case pool_type
                +          when :threaded
                +            @available_connections.each(&register)
                +            @allocated.each_value(&register)
                +          when :sharded_threaded
                +            @available_connections.each_value{|conns| conns.each(&register)}
                +            @allocated.each_value{|threads| threads.each_value(&register)}
                +          when :timed_queue
                +            register_queued_connections.call(@queue)
                +            @allocated.each_value(&register)
                +          else # when :sharded_timed_queue
                +            @queues.each_value(&register_queued_connections)
                +            @allocated.each_value{|threads| threads.each_value(&register)}
                +          end
                @@ -72,2 +107,6 @@
                -      conn = super
                -      @connection_expiration_timestamps[conn] = [Sequel.start_timer, @connection_expiration_timeout + (rand * @connection_expiration_random_delay)].freeze
                +      register_connection_expiration_time(super)
                +    end
                +
                +    # Record an expiration entry for a connection, returns the connection.
                +    def register_connection_expiration_time(conn)
                +      @connection_expiration_timestamps[conn] ||= [Sequel.start_timer, @connection_expiration_timeout + (rand * @connection_expiration_random_delay)].freeze
        lib/sequel/model.rb
                --- /tmp/d20260603-1553-ymp7sj/sequel-5.104.0/lib/sequel/model.rb	2026-06-03 20:45:49.694914712 +0000
                +++ /tmp/d20260603-1553-ymp7sj/sequel-5.105.0/lib/sequel/model.rb	2026-06-03 20:45:49.766915629 +0000
                @@ -57,0 +58 @@
                +    @shape_friendly = false
        lib/sequel/model/associations.rb
                --- /tmp/d20260603-1553-ymp7sj/sequel-5.104.0/lib/sequel/model/associations.rb	2026-06-03 20:45:49.695914725 +0000
                +++ /tmp/d20260603-1553-ymp7sj/sequel-5.105.0/lib/sequel/model/associations.rb	2026-06-03 20:45:49.767915641 +0000
                @@ -2176,0 +2177 @@
                +        Plugins.model_instance_variables(self, :@associations, :@set_associated_object_if_same)
        lib/sequel/model/base.rb
                --- /tmp/d20260603-1553-ymp7sj/sequel-5.104.0/lib/sequel/model/base.rb	2026-06-03 20:45:49.696914738 +0000
                +++ /tmp/d20260603-1553-ymp7sj/sequel-5.105.0/lib/sequel/model/base.rb	2026-06-03 20:45:49.768915654 +0000
                @@ -86,0 +87,4 @@
                +      # Whether the model uses a shape friendly design (initializing all potentially
                +      # used instance variables to nil).
                +      attr_reader :shape_friendly
                +
                @@ -224,3 +228 @@
                -        o = allocate
                -        o.instance_variable_set(:@values, values)
                -        o
                +        allocate.initialize_from_db(values)
                @@ -504 +506,7 @@
                -          extend(m::ClassMethods) if m.const_defined?(:ClassMethods, false)
                +          if m.const_defined?(:ClassMethods, false)
                +            class_methods = m::ClassMethods
                +            extend(class_methods)
                +            if class_methods.private_method_defined?(:each_model_instance_variable)
                +              def_initialize_nil_instance_variables
                +            end
                +          end
                @@ -633,0 +642,7 @@
                +      # Set instance variables used by instances of this model class.
                +      # Only has an effect if shape_friendly is true.
                +      def set_model_instance_variables(*ivs)
                +        Plugins.model_instance_variables(singleton_class, *ivs)
                +        def_initialize_nil_instance_variables
                +      end
                +
                @@ -667,0 +683,6 @@
                +      # Set whether the model should be shape friendly.
                +      def shape_friendly=(v)
                +        @shape_friendly = v
                +        def_initialize_nil_instance_variables
                +      end
                +
                @@ -816,0 +838,54 @@
                +      # Defines the private _initialize_nil_instance_variables method.
                +      # If shape_friendly is true, defines a method that initials the
                +      # model's instance variables to nil. If shape_friendly is not
                +      # true, does nothing.
                +      def def_initialize_nil_instance_variables
                +        if @shape_friendly
                +          ivs = []
                +          each_model_instance_variable do |iv|
                +            unless iv.match(/\A@[a-z_][a-z0-9_]*\z/)
                +              raise Error, "invalid model instance variable used"
                +            end
                +
                +            ivs << iv
                +          end
                +          ivs.uniq!
                +          ivs = ivs.reverse.join(" = ")
                +          new_method_content = "#{ivs} = nil"
                +          new_from_db_method_content = "#{ivs} = @new = @modified = nil"
                +        end
                +
                +        class_eval(<<-RUBY, __FILE__, __LINE__+1)
                +          def _initialize_nil_instance_variables
                +            #{new_method_content}
                +          end
                +          def _initialize_from_db_nil_instance_variables
                +            #{new_from_db_method_content}
                +          end
                +        RUBY
                +        private :_initialize_nil_instance_variables, :_initialize_from_db_nil_instance_variables
                +        alias_method :_initialize_nil_instance_variables, :_initialize_nil_instance_variables
                +        alias_method :_initialize_from_db_nil_instance_variables, :_initialize_from_db_nil_instance_variables
                +        nil
                +      end
                +
                +      # Yield the default model instance variables. Designed only for
                +      # use by def_initialize_nil_instance_variables.
                +      def each_model_instance_variable
                +        [
                +          :@changed_columns,
                +          :@errors,
                +          :@raise_on_save_failure,
                +          :@raise_on_typecast_failure,
                +          :@require_modification,
                +          :@server,
                +          :@singleton_setter_added,
                +          :@skip_validation_on_next_save,
                +          :@strict_param_setting,
                +          :@this,
                +          :@typecast_empty_string_to_nil,
                +          :@typecast_on_assignment,
                +          :@use_transactions,
                +        ].each{|iv| yield iv}
                +      end
                +
                @@ -939,0 +1015 @@
                +          :@shape_friendly=>nil,
                @@ -1097 +1173 @@
                -        class_eval("def #{meth}; !defined?(@#{meth}) ? (frozen? ? self.class.#{meth} : (@#{meth} = self.class.#{meth})) : @#{meth} end", __FILE__, __LINE__)
                +        class_eval("def #{meth}; @#{meth}.nil? ? (frozen? ? self.class.#{meth} : (@#{meth} = self.class.#{meth})) : @#{meth} end", __FILE__, __LINE__)
                @@ -1138,2 +1214,3 @@
                -        @new = true
                -        @modified = true
                +        @new = @modified = true
                +        _initialize_nil_instance_variables
                +
                @@ -1144,0 +1222,9 @@
                +      # Initialize a new record using values retrieved from a database.
                +      # This should not be called directly, only via Model.call.
                +      def initialize_from_db(values) # :nodoc:
                +        @values = values
                +        _initialize_from_db_nil_instance_variables
                +
                +        self
                +      end
                +
                @@ -1448 +1534 @@
                -        defined?(@new) ? @new : (@new = false)
                +        @new || false
                @@ -2339,0 +2426 @@
                +    def_initialize_nil_instance_variables
        lib/sequel/model/plugins.rb
                --- /tmp/d20260603-1553-ymp7sj/sequel-5.104.0/lib/sequel/model/plugins.rb	2026-06-03 20:45:49.697914750 +0000
                +++ /tmp/d20260603-1553-ymp7sj/sequel-5.105.0/lib/sequel/model/plugins.rb	2026-06-03 20:45:49.773915718 +0000
                @@ -41 +41,2 @@
                -    # values in this hash.
                +    # values in this hash. These affects how class instance variables will be treated
                +    # during subclassing.
                @@ -46,0 +48,10 @@
                +    end
                +
                +    # Sets the model instance variables used by the plugin. These instance variables
                +    # will be initialized to nil for created model objects.
                +    def self.model_instance_variables(mod, *ivs)
                +      mod.send(:define_method, :each_model_instance_variable) do |&block|
                +        super(&block)
                +        ivs.each(&block)
                +      end
                +      mod.send(:private, :each_model_instance_variable)
        lib/sequel/plugins/accessed_columns.rb
                --- /tmp/d20260603-1553-ymp7sj/sequel-5.104.0/lib/sequel/plugins/accessed_columns.rb	2026-06-03 20:45:49.697914750 +0000
                +++ /tmp/d20260603-1553-ymp7sj/sequel-5.105.0/lib/sequel/plugins/accessed_columns.rb	2026-06-03 20:45:49.774915731 +0000
                @@ -28,0 +29,4 @@
                +      module ClassMethods
                +        Plugins.model_instance_variables(self, :@accessed_columns)
                +      end
                +
        lib/sequel/plugins/active_model.rb
                --- /tmp/d20260603-1553-ymp7sj/sequel-5.104.0/lib/sequel/plugins/active_model.rb	2026-06-03 20:45:49.697914750 +0000
                +++ /tmp/d20260603-1553-ymp7sj/sequel-5.105.0/lib/sequel/plugins/active_model.rb	2026-06-03 20:45:49.774915731 +0000
                @@ -31,0 +32,2 @@
                +        Plugins.model_instance_variables(self, :@destroyed, :@rollback_checker)
                +
                @@ -61,2 +63 @@
                -          return false if new?
                -          return false if defined?(@destroyed)
                +          return false if new? || @destroyed
                @@ -64,4 +65,2 @@
                -          if defined?(@rollback_checker)
                -            if @rollback_checker.call
                -              return false
                -            end
                +          if @rollback_checker && @rollback_checker.call
                +            return false
        lib/sequel/plugins/association_pks.rb
                --- /tmp/d20260603-1553-ymp7sj/sequel-5.104.0/lib/sequel/plugins/association_pks.rb	2026-06-03 20:45:49.698914763 +0000
                +++ /tmp/d20260603-1553-ymp7sj/sequel-5.105.0/lib/sequel/plugins/association_pks.rb	2026-06-03 20:45:49.775915743 +0000
                @@ -69,0 +70,2 @@
                +        Plugins.model_instance_variables(self, :@_association_pks)
                +
        lib/sequel/plugins/auto_validations.rb
                --- /tmp/d20260603-1553-ymp7sj/sequel-5.104.0/lib/sequel/plugins/auto_validations.rb	2026-06-03 20:45:49.699914776 +0000
                +++ /tmp/d20260603-1553-ymp7sj/sequel-5.105.0/lib/sequel/plugins/auto_validations.rb	2026-06-03 20:45:49.777915769 +0000
                @@ -133,0 +134,2 @@
                +        Plugins.model_instance_variables(self, :@_skip_auto_validations)
                +
        lib/sequel/plugins/columns_updated.rb
                --- /tmp/d20260603-1553-ymp7sj/sequel-5.104.0/lib/sequel/plugins/columns_updated.rb	2026-06-03 20:45:49.701914801 +0000
                +++ /tmp/d20260603-1553-ymp7sj/sequel-5.105.0/lib/sequel/plugins/columns_updated.rb	2026-06-03 20:45:49.779915794 +0000
                @@ -17,0 +18,4 @@
                +      module ClassMethods
                +        Plugins.model_instance_variables(self, :@columns_updated)
                +      end
                +
        lib/sequel/plugins/composition.rb
                --- /tmp/d20260603-1553-ymp7sj/sequel-5.104.0/lib/sequel/plugins/composition.rb	2026-06-03 20:45:49.701914801 +0000
                +++ /tmp/d20260603-1553-ymp7sj/sequel-5.105.0/lib/sequel/plugins/composition.rb	2026-06-03 20:45:49.779915794 +0000
                @@ -68,0 +69,2 @@
                +        Plugins.model_instance_variables(self, :@compositions)
                +
        lib/sequel/plugins/dirty.rb
                --- /tmp/d20260603-1553-ymp7sj/sequel-5.104.0/lib/sequel/plugins/dirty.rb	2026-06-03 20:45:49.703914827 +0000
                +++ /tmp/d20260603-1553-ymp7sj/sequel-5.105.0/lib/sequel/plugins/dirty.rb	2026-06-03 20:45:49.782915832 +0000
                @@ -65,0 +66,4 @@
                +      module ClassMethods
                +        Plugins.model_instance_variables(self, :@previous_changes, :@initial_values, :@missing_initial_values)
                +      end
                +
        lib/sequel/plugins/forbid_lazy_load.rb
                --- /tmp/d20260603-1553-ymp7sj/sequel-5.104.0/lib/sequel/plugins/forbid_lazy_load.rb	2026-06-03 20:45:49.704914839 +0000
                +++ /tmp/d20260603-1553-ymp7sj/sequel-5.105.0/lib/sequel/plugins/forbid_lazy_load.rb	2026-06-03 20:45:49.785915871 +0000
                @@ -120,0 +121 @@
                +        Plugins.model_instance_variables(self, :@forbid_lazy_load)
        lib/sequel/plugins/insert_conflict.rb
                --- /tmp/d20260603-1553-ymp7sj/sequel-5.104.0/lib/sequel/plugins/insert_conflict.rb	2026-06-03 20:45:49.704914839 +0000
                +++ /tmp/d20260603-1553-ymp7sj/sequel-5.105.0/lib/sequel/plugins/insert_conflict.rb	2026-06-03 20:45:49.785915871 +0000
                @@ -44,0 +45,4 @@
                +      module ClassMethods
                +        Plugins.model_instance_variables(self, :@insert_conflict_opts)
                +      end
                +
        lib/sequel/plugins/instance_filters.rb
                --- /tmp/d20260603-1553-ymp7sj/sequel-5.104.0/lib/sequel/plugins/instance_filters.rb	2026-06-03 20:45:49.705914852 +0000
                +++ /tmp/d20260603-1553-ymp7sj/sequel-5.105.0/lib/sequel/plugins/instance_filters.rb	2026-06-03 20:45:49.785915871 +0000
                @@ -52,0 +53,4 @@
                +      module ClassMethods
                +        Plugins.model_instance_variables(self, :@instance_filters)
                +      end
                +
        lib/sequel/plugins/instance_hooks.rb
                --- /tmp/d20260603-1553-ymp7sj/sequel-5.104.0/lib/sequel/plugins/instance_hooks.rb	2026-06-03 20:45:49.705914852 +0000
                +++ /tmp/d20260603-1553-ymp7sj/sequel-5.105.0/lib/sequel/plugins/instance_hooks.rb	2026-06-03 20:45:49.785915871 +0000
                @@ -30,0 +31,4 @@
                +      module ClassMethods
                +        Plugins.model_instance_variables(self, :@instance_hooks)
                +      end
                +
        lib/sequel/plugins/json_serializer.rb
                --- /tmp/d20260603-1553-ymp7sj/sequel-5.104.0/lib/sequel/plugins/json_serializer.rb	2026-06-03 20:45:49.705914852 +0000
                +++ /tmp/d20260603-1553-ymp7sj/sequel-5.105.0/lib/sequel/plugins/json_serializer.rb	2026-06-03 20:45:49.786915883 +0000
                @@ -164,0 +165,2 @@
                +        Plugins.model_instance_variables(self, :@json_serializer_opts)
                +
        lib/sequel/plugins/modification_detection.rb
                --- /tmp/d20260603-1553-ymp7sj/sequel-5.104.0/lib/sequel/plugins/modification_detection.rb	2026-06-03 20:45:49.706914865 +0000
                +++ /tmp/d20260603-1553-ymp7sj/sequel-5.105.0/lib/sequel/plugins/modification_detection.rb	2026-06-03 20:45:49.787915896 +0000
                @@ -36,0 +37,2 @@
                +        Plugins.model_instance_variables(self, :@values_hashes)
                +
        lib/sequel/plugins/serialization.rb
                --- /tmp/d20260603-1553-ymp7sj/sequel-5.104.0/lib/sequel/plugins/serialization.rb	2026-06-03 20:45:49.709914903 +0000
                +++ /tmp/d20260603-1553-ymp7sj/sequel-5.105.0/lib/sequel/plugins/serialization.rb	2026-06-03 20:45:49.791915947 +0000
                @@ -115,0 +116,2 @@
                +        Plugins.model_instance_variables(self, :@deserialized_values)
                +
        lib/sequel/plugins/serialization_modification_detection.rb
                --- /tmp/d20260603-1553-ymp7sj/sequel-5.104.0/lib/sequel/plugins/serialization_modification_detection.rb	2026-06-03 20:45:49.709914903 +0000
                +++ /tmp/d20260603-1553-ymp7sj/sequel-5.105.0/lib/sequel/plugins/serialization_modification_detection.rb	2026-06-03 20:45:49.792915960 +0000
                @@ -32,0 +33,4 @@
                +
                +      module ClassMethods
                +        Plugins.model_instance_variables(self, :@original_deserialized_values)
                +      end
        lib/sequel/plugins/split_values.rb
                --- /tmp/d20260603-1553-ymp7sj/sequel-5.104.0/lib/sequel/plugins/split_values.rb	2026-06-03 20:45:49.710914916 +0000
                +++ /tmp/d20260603-1553-ymp7sj/sequel-5.105.0/lib/sequel/plugins/split_values.rb	2026-06-03 20:45:49.793915972 +0000
                @@ -38,0 +39,2 @@
                +        Plugins.model_instance_variables(self, :@noncolumn_values)
                +
        lib/sequel/plugins/tactical_eager_loading.rb
                --- /tmp/d20260603-1553-ymp7sj/sequel-5.104.0/lib/sequel/plugins/tactical_eager_loading.rb	2026-06-03 20:45:49.711914929 +0000
                +++ /tmp/d20260603-1553-ymp7sj/sequel-5.105.0/lib/sequel/plugins/tactical_eager_loading.rb	2026-06-03 20:45:49.794915985 +0000
                @@ -126,0 +127,4 @@
                +      module ClassMethods
                +        Plugins.model_instance_variables(self, :@retrieved_by, :@retrieved_with)
                +      end
                +
        lib/sequel/plugins/update_primary_key.rb
                --- /tmp/d20260603-1553-ymp7sj/sequel-5.104.0/lib/sequel/plugins/update_primary_key.rb	2026-06-03 20:45:49.713914954 +0000
                +++ /tmp/d20260603-1553-ymp7sj/sequel-5.105.0/lib/sequel/plugins/update_primary_key.rb	2026-06-03 20:45:49.795915998 +0000
                @@ -24,0 +25,4 @@
                +      module ClassMethods
                +        Plugins.model_instance_variables(self, :@pk_hash)
                +      end
                +
        lib/sequel/plugins/validation_contexts.rb
                --- /tmp/d20260603-1553-ymp7sj/sequel-5.104.0/lib/sequel/plugins/validation_contexts.rb	2026-06-03 20:45:49.713914954 +0000
                +++ /tmp/d20260603-1553-ymp7sj/sequel-5.105.0/lib/sequel/plugins/validation_contexts.rb	2026-06-03 20:45:49.797916023 +0000
                @@ -31,0 +32,4 @@
                +      module ClassMethods
                +        Plugins.model_instance_variables(self, :@validation_context)
                +      end
                +
        lib/sequel/version.rb
                --- /tmp/d20260603-1553-ymp7sj/sequel-5.104.0/lib/sequel/version.rb	2026-06-03 20:45:49.716914992 +0000
                +++ /tmp/d20260603-1553-ymp7sj/sequel-5.105.0/lib/sequel/version.rb	2026-06-03 20:45:49.799916049 +0000
                @@ -9 +9 @@
                -  MINOR = 104
                +  MINOR = 105

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies ruby Pull requests that update Ruby code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants