From 4dce9f05124814710db69781ef7511c16532581c Mon Sep 17 00:00:00 2001 From: Rob Galanakis Date: Sat, 30 Aug 2025 21:16:49 -0700 Subject: [PATCH 1/2] Handle nil ranges better Models that do not initialize their range in their `initialize` method could error if setting their `_end` before `_begin`. This makes sure the plugin works even if the range column is nil. --- lib/sequel/plugins/tstzrange_fields.rb | 5 +++-- spec/sequel/plugins/tstzrange_fields_spec.rb | 17 +++++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/lib/sequel/plugins/tstzrange_fields.rb b/lib/sequel/plugins/tstzrange_fields.rb index 9506744..f4837fb 100644 --- a/lib/sequel/plugins/tstzrange_fields.rb +++ b/lib/sequel/plugins/tstzrange_fields.rb @@ -87,7 +87,7 @@ def self.create_accessors(model, column) when Float::INFINITY range = Sequel::Postgres::PGRange.new(nil, nil, empty: false, db_type: :tstzrange) self[column] = range - when "empty" + when "empty", nil self[column] = Sequel::Postgres::PGRange.empty(:tstzrange) else beg = value.respond_to?(:begin) ? value.begin : (value[:begin] || value["begin"]) @@ -97,7 +97,8 @@ def self.create_accessors(model, column) end model.define_method(get_begin_method) do - send(get_column_method).begin + r = send(get_column_method) + return r&.begin end model.define_method(set_begin_method) do |new_time| diff --git a/spec/sequel/plugins/tstzrange_fields_spec.rb b/spec/sequel/plugins/tstzrange_fields_spec.rb index fa0ae01..3deadb9 100644 --- a/spec/sequel/plugins/tstzrange_fields_spec.rb +++ b/spec/sequel/plugins/tstzrange_fields_spec.rb @@ -174,6 +174,23 @@ def from_now(n, unit) expect(o.range).to be_cover(from_now(30, minute)) end + it "creates an empty range for a nil value" do + o = model_class.create(range: nil) + expect(o.range).to_not be_nil + end + + it "can initialize an instance with a nil range" do + o = model_class.new + o[:range] = nil + expect(o.range).to be_nil + t = Time.now + o.range_end = t + expect(o.range).to have_attributes(begin: nil, end: t) + o[:range] = nil + o.range_begin = t + expect(o.range).to have_attributes(begin: t, end: nil) + end + it "can be assigned to directly with an object with begin/end methods or keys" do early = ago(1, day) late = from_now(2, day) From 39b50a14759545e783df9b69a77cd1e48e2c601e Mon Sep 17 00:00:00 2001 From: Rob Galanakis Date: Sat, 30 Aug 2025 21:19:25 -0700 Subject: [PATCH 2/2] Use Ruby 3.1 as min version --- .github/workflows/pr-checks.yml | 2 +- .rubocop.yml | 18 +++--------------- lib/sequel/plugins/tstzrange_fields.rb | 10 +++++----- lib/sequel_tstzrange_fields/version.rb | 2 +- sequel-tstzrange-fields.gemspec | 2 +- 5 files changed, 11 insertions(+), 23 deletions(-) diff --git a/.github/workflows/pr-checks.yml b/.github/workflows/pr-checks.yml index bc9990a..fb591a4 100644 --- a/.github/workflows/pr-checks.yml +++ b/.github/workflows/pr-checks.yml @@ -22,7 +22,7 @@ jobs: - 18101:5432 strategy: matrix: - ruby-version: ['3.2', '3.1', '3.0', '2.7'] + ruby-version: ['3.3', '3.2', '3.1'] steps: - name: Checkout repo uses: actions/checkout@v2 diff --git a/.rubocop.yml b/.rubocop.yml index a34a875..cc91930 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -1,10 +1,10 @@ -require: +plugins: - rubocop-sequel AllCops: NewCops: enable SuggestExtensions: false - TargetRubyVersion: 2.7 + TargetRubyVersion: 3.1 Gemspec/DevelopmentDependencies: EnforcedStyle: gemspec @@ -66,24 +66,16 @@ Lint/EmptyBlock: Lint/UselessAssignment: Exclude: - 'spec/**/*' -Lint/UnusedMethodArgument: - Exclude: - - 'lib/webhookdb/replicator/base.rb' - - 'spec/support/*.rb' # https://rubocop.readthedocs.io/en/latest/cops_naming/ Naming/AccessorMethodName: Enabled: false -Naming/PredicateName: +Naming/PredicatePrefix: Exclude: - 'spec/**/*' - - 'lib/webhookdb/spec_helpers.rb' - - 'lib/webhookdb/spec_helpers/*.rb' Naming/MethodParameterName: Enabled: false -Sequel/ColumnDefault: - Enabled: false Sequel/ConcurrentIndex: Enabled: false @@ -102,10 +94,6 @@ Style/Documentation: Enabled: false Style/FormatString: EnforcedStyle: percent -Style/NumericPredicate: - AllowedMethods: ['where'] - Exclude: - - 'db/migrations/*' Style/RedundantReturn: Enabled: false Style/RedundantSelf: diff --git a/lib/sequel/plugins/tstzrange_fields.rb b/lib/sequel/plugins/tstzrange_fields.rb index f4837fb..51c582b 100644 --- a/lib/sequel/plugins/tstzrange_fields.rb +++ b/lib/sequel/plugins/tstzrange_fields.rb @@ -70,11 +70,11 @@ def self.setup_model(model) def self.create_accessors(model, column) get_column_method = column.to_sym - set_column_method = "#{column}=".to_sym - get_begin_method = "#{column}_begin".to_sym - set_begin_method = "#{column}_begin=".to_sym - get_end_method = "#{column}_end".to_sym - set_end_method = "#{column}_end=".to_sym + set_column_method = :"#{column}=" + get_begin_method = :"#{column}_begin" + set_begin_method = :"#{column}_begin=" + get_end_method = :"#{column}_end" + set_end_method = :"#{column}_end=" model.define_method(get_column_method) do self[column] diff --git a/lib/sequel_tstzrange_fields/version.rb b/lib/sequel_tstzrange_fields/version.rb index 9af5500..42b7a62 100644 --- a/lib/sequel_tstzrange_fields/version.rb +++ b/lib/sequel_tstzrange_fields/version.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true module SequelTstzrangeFields - VERSION = "0.2.1" + VERSION = "0.2.2" end diff --git a/sequel-tstzrange-fields.gemspec b/sequel-tstzrange-fields.gemspec index 131b732..f9943de 100644 --- a/sequel-tstzrange-fields.gemspec +++ b/sequel-tstzrange-fields.gemspec @@ -10,7 +10,7 @@ Gem::Specification.new do |spec| spec.homepage = "https://github.com/lithictech/sequel-tstzrange-fields" spec.summary = "Gem for enabling time ranges when working with postgres" spec.license = "MIT" - spec.required_ruby_version = Gem::Requirement.new(">= 2.7.0") + spec.required_ruby_version = Gem::Requirement.new(">= 3.1.0") spec.description = <<~DESC Gem for enabling time ranges when working with postgres DESC