sequel-tstzrange-fields 0.2.0 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2aa09554035af74a589ddd776eff11bf70fa33431c841bb20de3eef9674b4051
4
- data.tar.gz: 824c97bbb6ea48333980f88aa42f6b5b009f3b1d61fefb13646f54d6511eb378
3
+ metadata.gz: c0e3c87a9049d68c12c1c93ed05fce51b7b21ee9f372380caf1ac730efa8ecdd
4
+ data.tar.gz: e4803036826e07f0e439a7c1cfd2bcda5489ddaf632b43bdc5aa6a17729494eb
5
5
  SHA512:
6
- metadata.gz: c2f59a89cb58c004224b1931a3359bacc70c296c322d108f84082488fb225f1866168d3adfc2669cdbe45cb52819bfe42f3b9b8a9801ee3740ab4ec6a21264c6
7
- data.tar.gz: ec010f2605963f1cd27d03a1945854ed2f675b1fd77c9435f640673145cc636f64118ff24babd086689c2940a4656c799163d15c7c7df2466189784cb72076f9
6
+ metadata.gz: 22a76641685df7ec7c305ad0c636f990c3f2d05aa7826d7aeb55197d18e84baa5bb1b724addf51275bd71e5189bf042ecaa4368f39914add720aa55876ab1f6f
7
+ data.tar.gz: 0fb70a25c7f91af94a14db48626e61a025a451fbe2d0b94a0e8c205905aac1bc15d1f57bb8d9250a75e90faf7d4a569aac49ed4f533d0dc7ec4523c3a62713fb
@@ -0,0 +1,121 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "sequel"
4
+ require "sequel/model"
5
+
6
+ require_relative "../../sequel_tstzrange_fields/version"
7
+
8
+ # Plugin for adding methods for working with time ranges.
9
+ #
10
+ # == Example
11
+ #
12
+ # Defining a model class with a timestamptz range:
13
+ #
14
+ # class ACME::Lease < Sequel::Model(:leases)
15
+ # plugin :tstzrange_fields, :active_during
16
+ #
17
+ # And in the schema:
18
+ #
19
+ # create_table(:leases) do
20
+ # primary_key :id
21
+ # tstzrange :active_during
22
+ # end
23
+ #
24
+ # You can use it as follows:
25
+ #
26
+ # lease = ACME::Lease.new
27
+ # lease.active_during_begin = Time.now
28
+ # lease.active_during_end = 1.year.from_now
29
+ # lease.active_during = 1.year.ago..1.year.from_now
30
+ # lease.active_during_end = nil # Unbounded end set
31
+ # lease.active_during = nil # Empty set
32
+ #
33
+ module Sequel
34
+ module Plugins
35
+ module TstzrangeFields
36
+ VERSION = SequelTstzrangeFields::VERSION
37
+
38
+ def self.configure(model, *args)
39
+ unless model.db.schema_type_class(:tstzrange)
40
+ msg = "tstzrange_fields plugin requires pg_range db extension to be installed. " \
41
+ "Use db.extension(:pg_range) after the db = Sequel.connect call."
42
+ raise msg
43
+ end
44
+ args << :period if args.empty?
45
+ args = args.flatten
46
+
47
+ setup_model(model)
48
+
49
+ args.flatten.each do |column|
50
+ create_accessors(model, column)
51
+ end
52
+ end
53
+
54
+ def self.setup_model(model)
55
+ model.class.define_method(:new_tstzrange) do |b, e|
56
+ b = value_to_time(b)
57
+ e = value_to_time(e)
58
+ return Sequel::Postgres::PGRange.empty(:tstzrange) if b.nil? && e.nil?
59
+
60
+ return Sequel::Postgres::PGRange.new(b&.to_time, e&.to_time, db_type: :tstzrange, exclude_end: true)
61
+ end
62
+
63
+ model.class.define_method(:value_to_time) do |v|
64
+ return v if v.nil?
65
+ return v if v.respond_to?(:to_time)
66
+
67
+ return Time.parse(v)
68
+ end
69
+ end
70
+
71
+ def self.create_accessors(model, column)
72
+ get_column_method = column.to_sym
73
+ set_column_method = :"#{column}="
74
+ get_begin_method = :"#{column}_begin"
75
+ set_begin_method = :"#{column}_begin="
76
+ get_end_method = :"#{column}_end"
77
+ set_end_method = :"#{column}_end="
78
+
79
+ model.define_method(get_column_method) do
80
+ self[column]
81
+ end
82
+
83
+ model.define_method(set_column_method) do |value|
84
+ case value
85
+ when Sequel::Postgres::PGRange
86
+ self[column] = value
87
+ when Float::INFINITY
88
+ range = Sequel::Postgres::PGRange.new(nil, nil, empty: false, db_type: :tstzrange)
89
+ self[column] = range
90
+ when "empty", nil
91
+ self[column] = Sequel::Postgres::PGRange.empty(:tstzrange)
92
+ else
93
+ beg = value.respond_to?(:begin) ? value.begin : (value[:begin] || value["begin"])
94
+ en = value.respond_to?(:end) ? value.end : (value[:end] || value["end"])
95
+ self[column] = self.class.new_tstzrange(beg, en)
96
+ end
97
+ end
98
+
99
+ model.define_method(get_begin_method) do
100
+ r = send(get_column_method)
101
+ return r&.begin
102
+ end
103
+
104
+ model.define_method(set_begin_method) do |new_time|
105
+ new_range = self.class.new_tstzrange(new_time, send(get_end_method))
106
+ send(set_column_method, new_range)
107
+ end
108
+
109
+ model.define_method(get_end_method) do
110
+ r = send(get_column_method)
111
+ return r&.end
112
+ end
113
+
114
+ model.define_method(set_end_method) do |new_time|
115
+ new_range = self.class.new_tstzrange(send(get_begin_method), new_time)
116
+ send(set_column_method, new_range)
117
+ end
118
+ end
119
+ end
120
+ end
121
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SequelTstzrangeFields
4
+ VERSION = "0.2.2"
5
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sequel-tstzrange-fields
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lithic Tech
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-04-02 00:00:00.000000000 Z
11
+ date: 2025-08-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pg
@@ -94,14 +94,18 @@ dependencies:
94
94
  - - ">="
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
- description:
97
+ description: 'Gem for enabling time ranges when working with postgres
98
+
99
+ '
98
100
  email:
99
101
  - hello@lithic.tech
100
102
  executables: []
101
103
  extensions: []
102
104
  extra_rdoc_files: []
103
- files: []
104
- homepage:
105
+ files:
106
+ - lib/sequel/plugins/tstzrange_fields.rb
107
+ - lib/sequel_tstzrange_fields/version.rb
108
+ homepage: https://github.com/lithictech/sequel-tstzrange-fields
105
109
  licenses:
106
110
  - MIT
107
111
  metadata:
@@ -114,7 +118,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
114
118
  requirements:
115
119
  - - ">="
116
120
  - !ruby/object:Gem::Version
117
- version: 2.7.0
121
+ version: 3.1.0
118
122
  required_rubygems_version: !ruby/object:Gem::Requirement
119
123
  requirements:
120
124
  - - ">="