sequel-sequence 0.4.1 → 0.4.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 749ea113ce41f1f7f70f620d5aa70deac470a76491cdb36b4bd8e5c739487a07
4
- data.tar.gz: 9628bc8f57ad5a1ead78d82eaa8348963876c93a6be40df0d8c9dabfab928f76
3
+ metadata.gz: a027c577de1ee27127880328c29208456a26635c9ea18b1c5eb3c1cb0dbbd5fc
4
+ data.tar.gz: 71764d6ec16bf3425ba3d3bfb4ac47c04dd2a6f7001342c0ae35ebec63af293d
5
5
  SHA512:
6
- metadata.gz: d0dbf107132dad0bcd23bcf5da23cb9fb121119dafb109865978a6bf26fe8465985875fd6d33b72422cd57e1d5b74b54fce065ba7a2fdf21b0d76f032b7c149e
7
- data.tar.gz: bd1bbeaf56ddcd37b4bc86b6b83ad06e85212c7f09bb32db03004bfc9599dd240b141ea6c6130d64fe8b85471c3e6bb7cd8537714b7b6f34f744142b117ce606
6
+ metadata.gz: 5ce8091d3c644545cecff05c0f85a6252bdd8de015710770a861bfea81793fc50c5b96d19ce304fc2158cd40fc8bfde72f88309e0dc6dea468e2a977a533f980
7
+ data.tar.gz: a80404a67e51b77a1dd6ac40fe8ebbd93329b170e25855024f325e965f76ec9ad723ea2698fc4f699edad9cd7eb8555c5f6b28d870eb6c2f0355c44686904b19
data/.ci.gemfile ADDED
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ gem 'bundler', '>= 2.2.4'
6
+ gem 'minitest-utils', '~> 0.4.6'
7
+ gem 'pry-byebug', '~> 3.10.1'
8
+ gem 'rake', '~> 13.0.2'
9
+ gem 'rubocop', '~> 1.56.3'
10
+ gem 'sequel', '>= 5.28', '<6.0'
11
+ gem 'simplecov', '~> 0.22.0'
12
+
13
+ # MRI/Rubinius Adapter Dependencies
14
+ platform :ruby do
15
+ gem 'mysql2', '~> 0.5.3'
16
+ gem 'pg', '~> 1.5.4'
17
+ gem 'sqlite3', '~> 1.6.0'
18
+ end
19
+
20
+ # JRuby Adapter Dependencies
21
+ platform :jruby do
22
+ gem 'jdbc-mysql', '~> 8.0.17'
23
+ gem 'jdbc-postgres', '~> 42.2.14'
24
+ gem 'jdbc-sqlite3', '~> 3.42'
25
+ end
@@ -16,7 +16,6 @@ jobs:
16
16
  os: ['ubuntu-latest']
17
17
  sequel: ['~>5.28']
18
18
  ruby: ['3.2', '3.1', '3.0', '2.7']
19
- gemfile: ['Gemfile']
20
19
  runs-on: ${{ matrix.os }}
21
20
  name: Tests with Ruby ${{ matrix.ruby }}
22
21
 
@@ -58,7 +57,7 @@ jobs:
58
57
 
59
58
  env:
60
59
  SEQUEL: ${{ matrix.sequel }}
61
- BUNDLE_GEMFILE: ${{ matrix.gemfile }}
60
+ BUNDLE_GEMFILE: .ci.gemfile
62
61
  steps:
63
62
  - uses: actions/checkout@v4
64
63
 
data/CHANGELOG.md CHANGED
@@ -11,6 +11,17 @@ Prefix your message with one of the following:
11
11
  - [Security] in case of vulnerabilities.
12
12
  -->
13
13
 
14
+ ## v0.4.2 - 2023-10-03
15
+
16
+ - [Added] Additions into README.md.
17
+ - [Added] Exclusion of dependence on the Postgresql constraint for "PG::The object is not in the required state P: ERROR: currval of sequence "name_of_sequence" is not yet defined in this session".
18
+ - [Added] `custom_sequence?` method for MariaDB and SQLite.
19
+ - [Fixed] Dependencies on gems by moving them from .gemspec to Gemfile
20
+ - [Fixed] `currval` for initial state of sequence in Postgresql
21
+ - [Fixed] `lastval` for initial state of sequence in MariaDB
22
+ - [Changed] The default action `setval` for MariaDB to invoke `setval` if necessary
23
+ - [Changed] The class initialization algorithm in `sequence.rb` depending on the gems included in the user project.
24
+
14
25
  ## v0.4.1 - 2023-09-28
15
26
 
16
27
  - [Added] Important notice to README.md.
data/CONTRIBUTING.md CHANGED
@@ -33,13 +33,14 @@ your contribution is according to how this project works.
33
33
 
34
34
  1. [Fork](https://help.github.com/forking/) sequel-sequence
35
35
  2. Create a topic branch - `git checkout -b my_branch`
36
- 3. Make your changes using [descriptive commit messages](#commit-messages)
37
- 4. Update CHANGELOG.md describing your changes by adding an entry to the
36
+ 3. Unlock gem dependencies in `sequel-sequence.gemspec`
37
+ 4. Make your changes using [descriptive commit messages](#commit-messages)
38
+ 5. Update CHANGELOG.md describing your changes by adding an entry to the
38
39
  "Unreleased" section. If this section is not available, create one right
39
40
  before the last version.
40
- 5. Push to your branch - `git push origin my_branch`
41
- 6. [Create a pull request](https://docs.github.com/articles/creating-a-pull-request)
42
- 7. That's it!
41
+ 6. Push to your branch - `git push origin my_branch`
42
+ 7. [Create a pull request](https://docs.github.com/articles/creating-a-pull-request)
43
+ 8. That's it!
43
44
 
44
45
  ## Styleguides
45
46
 
@@ -237,3 +238,12 @@ $ bundle exec rake TEST=test/sequel/mysql_sequence_test.rb
237
238
  $ bundle exec rake TEST=test/sequel/sqlite_sequence_test.rb
238
239
  $ bundle exec rake TEST=test/sequel/mock_sequence_test.rb
239
240
  ```
241
+
242
+ Short command:
243
+ ```bash
244
+ $ bundle exec rake postgresql
245
+ $ bundle exec rake mariadb
246
+ $ bundle exec rake mysql
247
+ $ bundle exec rake sqlite
248
+ $ bundle exec rake mock
249
+ ```
data/README.md CHANGED
@@ -16,7 +16,7 @@ gem install sequel-sequence
16
16
  Or add the following line to your project's Gemfile:
17
17
 
18
18
  ```ruby
19
- gem "sequel-sequence"
19
+ gem 'sequel-sequence'
20
20
  ```
21
21
 
22
22
  ## Usage with PostgreSQL and MariaDB
@@ -24,6 +24,8 @@ gem "sequel-sequence"
24
24
  To create and delete a `SEQUENCE`, simply use the `create_sequence` and `drop_sequence` methods.
25
25
 
26
26
  ```ruby
27
+ require: 'sequel-sequence'
28
+
27
29
  Sequel.migration do
28
30
  up do
29
31
  create_sequence :position, if_exists: false
@@ -37,6 +39,8 @@ end
37
39
 
38
40
  It would also be correct to write:
39
41
  ```ruby
42
+ require: 'sequel-sequence'
43
+
40
44
  Sequel.migration do
41
45
  up do
42
46
  create_sequence :position
@@ -95,7 +99,7 @@ DB.currval("position")
95
99
  DB.lastval("position")
96
100
  # Both options are acceptable in PostgreSQL and MySQL.
97
101
 
98
- # Set sequence's current value. It must be greater than lastval or currval.
102
+ # Set a new sequence value. It must be greater than lastval or currval. Only PostgreSQL allows setting a lower value.
99
103
  DB.setval("position", 1234)
100
104
  ```
101
105
 
@@ -122,7 +126,14 @@ Otherwise, the operation of this gem for SQLite and MySQL is similar to the ways
122
126
 
123
127
  ## Known issues you may encounter
124
128
 
125
- This solution does not allow you to simultaneously work with MySQL and MariaDB databases from one application. If such a need arises, move the data processing functionality to different microservices.
129
+ - This solution does not allow you to simultaneously work with MySQL and MariaDB databases from one application. If such a need arises, move the data processing functionality to different microservices.
130
+ - When you start with a new database in SQLite, you'll receive an error message - "`SQLite3::SQLException: no such table: sqlite_sequence`". `sqlite_sequence` table is not created, until you define at least one autoincrement and primary key column in your schema.
131
+
132
+ ## Additional handy functions
133
+
134
+ To discover a database information about `SEQUENCE`s you could take advantage of `check_sequences` and `custom_sequence?` methods.
135
+ - `custom_sequence?(:sequence_name)` allows you to instantly find out the availability of the called `SEQUENCE`.
136
+ - `check_sequences` provides complete information about known `SEQUENCE`s in the datebase. The output data depends on RDBMS.
126
137
 
127
138
  ## Maintainer
128
139
 
@@ -65,12 +65,21 @@ module Sequel
65
65
 
66
66
  # for Postgres
67
67
  def currval(name)
68
- name = quote(name.to_s)
68
+ quoted_name = quote(name.to_s)
69
69
  out = nil
70
- fetch("SELECT currval(#{name})") do |row|
70
+ fetch("SELECT currval(#{quoted_name})") do |row|
71
71
  out = row[:currval]
72
72
  end
73
73
  out
74
+ rescue Sequel::DatabaseError => e
75
+ # We exclude dependence on the postgresql constraint.
76
+ if e.message =~ /\APG::ObjectNotInPrerequisiteState:(.)*is not yet defined in this session\n\z/
77
+ return nextval(name)
78
+ end
79
+
80
+ # :nocov:
81
+ raise e
82
+ # :nocov:
74
83
  end
75
84
 
76
85
  # for MariaDB
@@ -86,11 +95,12 @@ module Sequel
86
95
  end
87
96
 
88
97
  def set_column_default_nextval(table, column, sequence)
89
- table = table.to_s
90
- column = column.to_s
91
- sequence = quote(sequence.to_s)
92
- run "ALTER TABLE IF EXISTS #{table} " \
93
- "ALTER COLUMN #{column} SET DEFAULT nextval(#{sequence}::regclass)"
98
+ sql = %(
99
+ ALTER TABLE IF EXISTS #{table}
100
+ ALTER COLUMN #{quote_name(column.to_s)}
101
+ SET DEFAULT nextval(#{quote(sequence.to_s)}::regclass)
102
+ ).strip
103
+ run sql
94
104
  end
95
105
  end
96
106
  end
@@ -13,6 +13,14 @@ module Sequel
13
13
  "`#{name.gsub(/[`"']/, '')}`"
14
14
  end
15
15
 
16
+ def custom_sequence?(sequence_name)
17
+ db = name_of_current_database
18
+ return false if db.empty?
19
+
20
+ sql = "SHOW FULL TABLES WHERE Table_type = 'SEQUENCE' and Tables_in_#{db} = '#{sequence_name}';"
21
+ fetch(sql).all.size.positive?
22
+ end
23
+
16
24
  def check_sequences
17
25
  fetch("SHOW FULL TABLES WHERE Table_type = 'SEQUENCE';").all.to_a
18
26
  end
@@ -46,31 +54,48 @@ module Sequel
46
54
  end
47
55
 
48
56
  def lastval(name)
49
- name = quote(name.to_s)
57
+ quoted_name = quote(name.to_s)
50
58
  out = nil
51
- fetch("SELECT lastval(#{name});") do |row|
52
- out = row["lastval(#{name})".to_sym]
59
+ fetch("SELECT lastval(#{quoted_name});") do |row|
60
+ out = row["lastval(#{quoted_name})".to_sym]
53
61
  end
62
+ return nextval(name) if out.nil?
63
+
54
64
  out
55
65
  end
56
66
 
57
67
  alias currval lastval
58
68
 
59
69
  def setval(name, value)
60
- name = quote(name.to_s)
61
- out = nil
62
- fetch("SELECT setval(#{name}, #{value});") do |row|
63
- out = row["setval(#{name}, #{value})".to_sym]
70
+ current = lastval(name)
71
+ if value <= current
72
+ log_info Sequel::Database::DANGER_OPT_ID if value < current
73
+ value = current
74
+ else
75
+ quoted_name = quote(name.to_s)
76
+ value -= 1
77
+ out = nil
78
+ fetch("SELECT setval(#{quoted_name}, #{value});") do |row|
79
+ out = row["setval(#{quoted_name}, #{value})".to_sym]
80
+ end
81
+ value = nextval(name)
64
82
  end
65
- out
83
+ value
66
84
  end
67
85
 
68
86
  def set_column_default_nextval(table, column, sequence)
69
- table = table.to_s
70
- column = column.to_s
71
- sequence = quote(sequence.to_s)
72
- run "ALTER TABLE IF EXISTS #{table} " \
73
- "ALTER COLUMN #{column} SET DEFAULT nextval(#{sequence});"
87
+ sql = %(
88
+ ALTER TABLE IF EXISTS #{quote(table.to_s)}
89
+ ALTER COLUMN #{quote_name(column.to_s)}
90
+ SET DEFAULT nextval(#{quote(sequence.to_s)})
91
+ ).strip
92
+ run sql
93
+ end
94
+
95
+ private
96
+
97
+ def name_of_current_database
98
+ fetch('SELECT DATABASE() AS db;').first[:db]
74
99
  end
75
100
  end
76
101
  end
@@ -60,7 +60,7 @@ module Sequel
60
60
  alias currval lastval
61
61
 
62
62
  def setval(name, value)
63
- current = lastval(stringify(name))
63
+ current = lastval(name)
64
64
  if current.nil?
65
65
  create_sequence(stringify(name), { start: value })
66
66
  elsif value < current
@@ -6,6 +6,11 @@ module Sequel
6
6
  module Sequence
7
7
  module Database
8
8
  module SQLite
9
+ def custom_sequence?(sequence_name)
10
+ sql = "SELECT * FROM `sqlite_sequence` WHERE name = '#{stringify(sequence_name)}';"
11
+ fetch(sql).all.size.positive?
12
+ end
13
+
9
14
  def check_sequences
10
15
  fetch('SELECT * FROM `sqlite_sequence`;').all.to_a
11
16
  end
@@ -44,11 +49,11 @@ module Sequel
44
49
  alias currval lastval
45
50
 
46
51
  def setval(name, value)
47
- current = lastval(stringify(name))
52
+ current = lastval(name)
48
53
  if current.nil?
49
54
  create_sequence(stringify(name), { start: value })
50
55
  elsif value < current
51
- log_info DANGER_OPT_ID
56
+ log_info Sequel::Database::DANGER_OPT_ID
52
57
  value = current
53
58
  else
54
59
  run(update_sqlite_sequence(stringify(name), value))
@@ -79,7 +84,7 @@ module Sequel
79
84
 
80
85
  def create_sequence_table(name, if_exists = nil)
81
86
  %(
82
- CREATE TABLE #{if_exists || IF_NOT_EXISTS} #{name}
87
+ CREATE TABLE #{if_exists || Sequel::Database::IF_NOT_EXISTS} #{name}
83
88
  (id integer primary key autoincrement, fiction integer);
84
89
  )
85
90
  end
@@ -101,7 +106,7 @@ module Sequel
101
106
  end
102
107
 
103
108
  def drop_sequence_table(name, if_exists = nil)
104
- "DROP TABLE #{if_exists || IF_EXISTS} #{name};"
109
+ "DROP TABLE #{if_exists || Sequel::Database::IF_EXISTS} #{name};"
105
110
  end
106
111
 
107
112
  def select_max_seq(name)
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Sequel
4
4
  module Sequence
5
- VERSION = '0.4.1'
5
+ VERSION = '0.4.2'
6
6
  end
7
7
  end
@@ -1,29 +1,61 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'sequel/database'
4
- require 'sequel/adapters/postgres'
5
- require 'sequel/adapters/mysql2'
6
- require 'sequel/adapters/sqlite'
7
4
  require 'sequel/error'
8
5
  require 'sequel/sequence/database_ext_connection'
9
6
 
10
7
  module Sequel
11
8
  module Sequence
12
9
  require 'sequel/sequence/database'
13
-
14
- module Database
15
- require 'sequel/sequence/database/postgresql'
16
- require 'sequel/sequence/database/sqlite'
17
- end
18
10
  end
19
11
  end
20
12
 
21
13
  Sequel::Database.include(
22
14
  Sequel::Sequence::Database
23
15
  )
24
- Sequel::Postgres::Database.include(
25
- Sequel::Sequence::Database::PostgreSQL
26
- )
27
- Sequel::SQLite::Database.include(
28
- Sequel::Sequence::Database::SQLite
29
- )
16
+
17
+ begin
18
+ if Gem::Specification.find_by_name('pg')
19
+ require 'sequel/adapters/postgres'
20
+
21
+ module Sequel
22
+ module Sequence
23
+ module Database
24
+ require 'sequel/sequence/database/postgresql'
25
+ end
26
+ end
27
+ end
28
+
29
+ Sequel::Postgres::Database.include(
30
+ Sequel::Sequence::Database::PostgreSQL
31
+ )
32
+ end
33
+ rescue Gem::LoadError
34
+ # do nothing
35
+ end
36
+
37
+ begin
38
+ require 'sequel/adapters/mysql2' if Gem::Specification.find_by_name('mysql2')
39
+ rescue Gem::LoadError
40
+ # do nothing
41
+ end
42
+
43
+ begin
44
+ if Gem::Specification.find_by_name('sqlite3')
45
+ require 'sequel/adapters/sqlite'
46
+
47
+ module Sequel
48
+ module Sequence
49
+ module Database
50
+ require 'sequel/sequence/database/sqlite'
51
+ end
52
+ end
53
+ end
54
+
55
+ Sequel::SQLite::Database.include(
56
+ Sequel::Sequence::Database::SQLite
57
+ )
58
+ end
59
+ rescue Gem::LoadError
60
+ # do nothing
61
+ end
@@ -9,7 +9,7 @@ Gem::Specification.new do |spec|
9
9
  spec.summary = \
10
10
  'Adds SEQUENCE support to Sequel for migrations to PostgreSQL, MariaDB, MySQL and SQLite.'
11
11
  spec.description = <<-DES
12
- This gem provides a single interface for SEQUENCE functionality
12
+ This gem provides a single user-friendly interface for SEQUENCE functionality
13
13
  in Postgresql and MariaDB DBMS within the Sequel ORM.
14
14
  It also models the Sequences to meet the needs of SQLite and MySQL users.
15
15
  DES
@@ -27,22 +27,22 @@ Gem::Specification.new do |spec|
27
27
  spec.platform = Gem::Platform::RUBY
28
28
  spec.required_ruby_version = '>= 2.7.0'
29
29
 
30
- spec.add_dependency 'sequel', '>= 5.28', '<5.73'
30
+ spec.add_dependency 'sequel', '>= 5.28', '<6.0'
31
31
  spec.add_development_dependency 'bundler', '>= 2.2.4'
32
32
  spec.add_development_dependency 'minitest-utils', '~> 0.4.6'
33
33
  spec.add_development_dependency 'pry-byebug', '~> 3.10.1'
34
34
  spec.add_development_dependency 'rake', '~> 13.0.2'
35
35
  spec.add_development_dependency 'rubocop', '~> 1.56.3'
36
36
  spec.add_development_dependency 'simplecov', '~> 0.22.0'
37
- if RUBY_ENGINE == 'jruby'
38
- # JRuby Adapter Dependencies
39
- spec.add_development_dependency 'jdbc-mysql', '~> 8.0.17'
40
- spec.add_development_dependency 'jdbc-postgres', '~> 42.2.14'
41
- spec.add_development_dependency 'jdbc-sqlite3', '~> 3.42'
42
- else
43
- # MRI/Rubinius Adapter Dependencies
44
- spec.add_development_dependency 'mysql2', '~> 0.5.3'
45
- spec.add_development_dependency 'pg', '~> 1.5.4'
46
- spec.add_development_dependency 'sqlite3', '~> 1.6.0'
47
- end
37
+ # if RUBY_ENGINE == 'jruby'
38
+ # # JRuby Adapter Dependencies
39
+ # spec.add_development_dependency 'jdbc-mysql', '~> 8.0.17'
40
+ # spec.add_development_dependency 'jdbc-postgres', '~> 42.2.14'
41
+ # spec.add_development_dependency 'jdbc-sqlite3', '~> 3.42'
42
+ # else
43
+ # # MRI/Rubinius Adapter Dependencies
44
+ # spec.add_development_dependency 'mysql2', '~> 0.5.3'
45
+ # spec.add_development_dependency 'pg', '~> 1.5.4'
46
+ # spec.add_development_dependency 'sqlite3', '~> 1.6.0'
47
+ # end
48
48
  end
@@ -13,7 +13,9 @@ MariaDB = Sequel.connect(
13
13
 
14
14
  module MariadbTestHelper
15
15
  def recreate_table
16
+ MariaDB.run 'DROP TABLE IF EXISTS builders'
16
17
  MariaDB.run 'DROP SEQUENCE IF EXISTS position'
18
+ MariaDB.run 'DROP SEQUENCE IF EXISTS position_id'
17
19
  MariaDB.run 'DROP TABLE IF EXISTS wares'
18
20
  MariaDB.run 'DROP SEQUENCE IF EXISTS a'
19
21
  MariaDB.run 'DROP SEQUENCE IF EXISTS b'
@@ -13,8 +13,10 @@ PostgresqlDB = Sequel.connect(
13
13
 
14
14
  module PostgresqlTestHelper
15
15
  def recreate_table
16
- PostgresqlDB.run 'DROP TABLE IF EXISTS things'
16
+ PostgresqlDB.run 'DROP TABLE IF EXISTS masters'
17
17
  PostgresqlDB.run 'DROP SEQUENCE IF EXISTS position'
18
+ PostgresqlDB.run 'DROP SEQUENCE IF EXISTS position_id'
19
+ PostgresqlDB.run 'DROP TABLE IF EXISTS things'
18
20
  PostgresqlDB.run 'DROP SEQUENCE IF EXISTS a'
19
21
  PostgresqlDB.run 'DROP SEQUENCE IF EXISTS b'
20
22
  PostgresqlDB.run 'DROP SEQUENCE IF EXISTS c'
@@ -72,40 +72,77 @@ class MariadbSequenceTest < Minitest::Test
72
72
  assert_equal 3, MariaDB.nextval(:position)
73
73
  end
74
74
 
75
- test "returns current/last sequence value, which doesn't increase by itself" do
75
+ test %( returns current/last sequence value, which doesn't increase by itself
76
+ for migration WITHOUT 'start' or 'increment' values ) do
76
77
  with_migration do
77
78
  def up
78
79
  create_sequence :position
79
80
  end
80
81
  end.up
81
82
 
82
- MariaDB.nextval(:position)
83
-
84
- assert_equal 1, MariaDB.currval(:position)
85
- assert_equal 1, MariaDB.lastval(:position)
86
83
  assert_equal 1, MariaDB.currval(:position)
87
84
  assert_equal 1, MariaDB.lastval(:position)
85
+
86
+ MariaDB.nextval(:position)
87
+
88
+ assert_equal 2, MariaDB.currval(:position)
89
+ assert_equal 2, MariaDB.lastval(:position)
88
90
  end
89
91
 
90
- test 'sets sequence value' do
92
+ test %( returns current/last sequence value, which doesn't increase by itself
93
+ for migration WITH 'start' and 'increment' values ) do
91
94
  with_migration do
92
95
  def up
93
- create_sequence :position
96
+ create_sequence :position, start: 2, increment: 3
94
97
  end
95
98
  end.up
96
99
 
100
+ assert_equal 2, MariaDB.currval(:position)
101
+ assert_equal 2, MariaDB.lastval(:position)
102
+
97
103
  MariaDB.nextval(:position)
104
+
105
+ assert_equal 5, MariaDB.currval(:position)
106
+ assert_equal 5, MariaDB.lastval(:position)
107
+ end
108
+
109
+ test 'sets a new sequence value greater than the current one' do
110
+ with_migration do
111
+ def up
112
+ create_sequence :position
113
+ end
114
+ end.up
115
+
98
116
  assert_equal MariaDB.currval(:position), 1
99
117
 
100
118
  MariaDB.setval(:position, 101)
101
- # in MariaDB, 'lastval' only works after 'nextval' rather than 'setval'
102
- assert_equal 1, MariaDB.lastval(:position)
119
+ # assert_equal 1, MariaDB.lastval(:position)
120
+ # we observe the modified behavior of the method
121
+ assert_equal 101, MariaDB.lastval(:position)
103
122
 
104
123
  MariaDB.nextval(:position)
105
- # now the value is correct
124
+ # the value is correct in any case
106
125
  assert_equal 102, MariaDB.lastval(:position)
107
126
  end
108
127
 
128
+ test 'sets a new sequence value less than the current one (does not change the value)' do
129
+ with_migration do
130
+ def up
131
+ create_sequence :position, start: 100
132
+ end
133
+ end.up
134
+
135
+ assert_equal MariaDB.currval(:position), 100
136
+
137
+ MariaDB.nextval(:position)
138
+ assert_equal MariaDB.currval(:position), 101
139
+
140
+ MariaDB.setval(:position, 1)
141
+ assert_equal 101, MariaDB.lastval(:position)
142
+
143
+ assert_equal 102, MariaDB.nextval(:position)
144
+ end
145
+
109
146
  test 'drops sequence and check_sequences' do
110
147
  with_migration do
111
148
  def up
@@ -125,14 +162,18 @@ class MariadbSequenceTest < Minitest::Test
125
162
  end
126
163
  end.down
127
164
 
128
- sequence = MariaDB.check_sequences.find do |seq|
129
- seq[:Tables_in_test] == 'position'
130
- end
165
+ sequence = MariaDB.check_sequences
131
166
 
132
- assert_nil sequence
167
+ assert_equal 0, sequence.size
133
168
  end
134
169
 
135
170
  test 'orders sequences' do
171
+ with_migration do
172
+ def up
173
+ drop_table :wares, if_exists: true
174
+ end
175
+ end.up
176
+
136
177
  list = MariaDB.check_sequences.map { |s| s[:Tables_in_test] }
137
178
  assert !list.include?('a')
138
179
  assert !list.include?('b')
@@ -140,7 +181,6 @@ class MariadbSequenceTest < Minitest::Test
140
181
 
141
182
  with_migration do
142
183
  def up
143
- drop_table :things, if_exists: true
144
184
  create_sequence :c
145
185
  create_sequence :a
146
186
  create_sequence :b
@@ -153,10 +193,21 @@ class MariadbSequenceTest < Minitest::Test
153
193
  assert list.include?('c')
154
194
  end
155
195
 
196
+ test 'checks custom sequence generated from code' do
197
+ assert_equal MariaDB.custom_sequence?(:c), false
198
+
199
+ with_migration do
200
+ def up
201
+ create_sequence :c
202
+ end
203
+ end.up
204
+
205
+ assert_equal MariaDB.custom_sequence?(:c), true
206
+ end
207
+
156
208
  test 'creates table that references sequence' do
157
209
  with_migration do
158
210
  def up
159
- drop_table :builders, if_exists: true
160
211
  create_sequence :position_id, if_exists: false, start: 1
161
212
  create_table :builders do
162
213
  primary_key :id
@@ -91,20 +91,41 @@ class MysqlSequenceTest < Minitest::Test
91
91
  assert_operator (2 + @step), :>, MysqlDB.nextval(:position)
92
92
  end
93
93
 
94
- test "returns current/last sequence value, which doesn't increase by itself" do
94
+ test %( returns current/last sequence value, which doesn't increase by itself
95
+ for migration WITHOUT 'start' or 'increment' values ) do
95
96
  with_migration do
96
97
  def up
97
98
  create_sequence :position
98
99
  end
99
100
  end.up
100
101
 
102
+ # catch the 'start' value 'by default
103
+ assert_equal 1, MysqlDB.currval(:position)
104
+ assert_equal 1, MysqlDB.lastval(:position)
105
+
101
106
  MysqlDB.nextval(:position)
102
- # changed value (=2) after default one (=1)
103
107
 
104
108
  assert_equal 2, MysqlDB.currval(:position)
105
109
  assert_equal 2, MysqlDB.lastval(:position)
110
+ end
111
+
112
+ test %( returns current/last sequence value, which doesn't increase by itself
113
+ for migration WITH 'start' and 'increment' values ) do
114
+ with_migration do
115
+ def up
116
+ create_sequence :position, start: 2, increment: 3
117
+ end
118
+ end.up
119
+
120
+ # catch the 'start' value
106
121
  assert_equal 2, MysqlDB.currval(:position)
107
122
  assert_equal 2, MysqlDB.lastval(:position)
123
+
124
+ MysqlDB.nextval(:position)
125
+
126
+ # Doesn't support 'increment' value
127
+ assert_equal 3, MysqlDB.currval(:position)
128
+ assert_equal 3, MysqlDB.lastval(:position)
108
129
  end
109
130
 
110
131
  test 'sets a new sequence value greater than the current one' do
@@ -125,7 +146,7 @@ class MysqlSequenceTest < Minitest::Test
125
146
  assert_equal 102, MysqlDB.nextval(:position)
126
147
  end
127
148
 
128
- test 'sets a new sequence value less than the current one' do
149
+ test 'sets a new sequence value less than the current one (does not change the value)' do
129
150
  with_migration do
130
151
  def up
131
152
  create_sequence :position, start: 100
@@ -215,6 +236,12 @@ class MysqlSequenceTest < Minitest::Test
215
236
  end
216
237
 
217
238
  test 'orders sequences' do
239
+ with_migration do
240
+ def up
241
+ drop_table :stuffs, if_exists: true
242
+ end
243
+ end.up
244
+
218
245
  list = MysqlDB.check_sequences.map { |s| s[:name] }
219
246
  assert !list.include?('a')
220
247
  assert !list.include?('b')
@@ -222,7 +249,6 @@ class MysqlSequenceTest < Minitest::Test
222
249
 
223
250
  with_migration do
224
251
  def up
225
- drop_table :things, if_exists: true
226
252
  create_sequence :c, { start: 1 }
227
253
  create_sequence :a, { start: 3 }
228
254
  create_sequence :b
@@ -235,18 +261,6 @@ class MysqlSequenceTest < Minitest::Test
235
261
  assert list.include?('c')
236
262
  end
237
263
 
238
- test 'checks custom sequence generated from code' do
239
- assert_equal MysqlDB.custom_sequence?(:c), false
240
-
241
- with_migration do
242
- def up
243
- create_sequence :c
244
- end
245
- end.up
246
-
247
- assert_equal MysqlDB.custom_sequence?(:c), true
248
- end
249
-
250
264
  test 'recreates the same sequence with the same start value' do
251
265
  with_migration do
252
266
  def up
@@ -353,6 +367,18 @@ class MysqlSequenceTest < Minitest::Test
353
367
  assert_equal pos4 - pos2, 2
354
368
  end
355
369
 
370
+ test 'checks custom sequence generated from code' do
371
+ assert_equal MysqlDB.custom_sequence?(:c), false
372
+
373
+ with_migration do
374
+ def up
375
+ create_sequence :c
376
+ end
377
+ end.up
378
+
379
+ assert_equal MysqlDB.custom_sequence?(:c), true
380
+ end
381
+
356
382
  test "catches a Mysql2::Error: «Table mysql_sequence doesn't exist»" do
357
383
  assert !sequence_table_exists?('position')
358
384
 
@@ -72,33 +72,80 @@ class PostgresqlSequenceTest < Minitest::Test
72
72
  assert_equal 3, PostgresqlDB.nextval(:position)
73
73
  end
74
74
 
75
- test "returns current/last sequence value, which doesn't increase by itself" do
75
+ test %( returns current/last sequence value, which doesn't increase by itself
76
+ for migration WITHOUT 'start' or 'increment' values ) do
76
77
  with_migration do
77
78
  def up
78
- create_sequence :position, start: 2, increment: 2
79
+ create_sequence :position
79
80
  end
80
81
  end.up
81
82
 
83
+ # catch the 'start' value
84
+ assert_equal 1, PostgresqlDB.currval(:position)
85
+ # is the same value
86
+ assert_equal 1, PostgresqlDB.lastval(:position)
87
+
82
88
  PostgresqlDB.nextval(:position)
83
89
 
84
90
  assert_equal 2, PostgresqlDB.currval(:position)
85
91
  assert_equal 2, PostgresqlDB.lastval(:position)
92
+ end
93
+
94
+ test %( returns current/last sequence value, which doesn't increase by itself
95
+ for migration WITH 'start' and 'increment' values ) do
96
+ with_migration do
97
+ def up
98
+ create_sequence :position, start: 2, increment: 3
99
+ end
100
+ end.up
101
+
102
+ # catch the 'start' value
86
103
  assert_equal 2, PostgresqlDB.currval(:position)
104
+ # is the same value
87
105
  assert_equal 2, PostgresqlDB.lastval(:position)
106
+
107
+ PostgresqlDB.nextval(:position)
108
+
109
+ # support 'increment' value
110
+ assert_equal 5, PostgresqlDB.currval(:position)
111
+ assert_equal 5, PostgresqlDB.lastval(:position)
88
112
  end
89
113
 
90
- test 'sets sequence value' do
114
+ test 'sets a new sequence value greater than the current one' do
91
115
  with_migration do
92
116
  def up
93
117
  create_sequence :position
94
118
  end
95
119
  end.up
96
120
 
97
- PostgresqlDB.nextval(:position)
98
121
  assert_equal PostgresqlDB.currval(:position), 1
99
122
 
123
+ PostgresqlDB.nextval(:position)
124
+ assert_equal PostgresqlDB.currval(:position), 2
125
+
100
126
  PostgresqlDB.setval(:position, 101)
101
- assert_equal 101, PostgresqlDB.currval(:position)
127
+ assert_equal 101, PostgresqlDB.lastval(:position)
128
+
129
+ assert_equal 102, PostgresqlDB.nextval(:position)
130
+ end
131
+
132
+ test 'sets a new sequence value less than the current one (change the value as an EXCEPTION)' do
133
+ with_migration do
134
+ def up
135
+ create_sequence :position, start: 100
136
+ end
137
+ end.up
138
+
139
+ assert_equal PostgresqlDB.currval(:position), 100
140
+
141
+ PostgresqlDB.nextval(:position)
142
+ assert_equal PostgresqlDB.currval(:position), 101
143
+
144
+ PostgresqlDB.setval(:position, 1)
145
+ assert_equal 1, PostgresqlDB.lastval(:position)
146
+
147
+ PostgresqlDB.nextval(:position)
148
+ assert_equal 2, PostgresqlDB.lastval(:position)
102
149
  end
103
150
 
104
151
  test 'drops sequence and check_sequences' do
@@ -128,6 +175,12 @@ class PostgresqlSequenceTest < Minitest::Test
128
175
  end
129
176
 
130
177
  test 'orders sequences' do
178
+ with_migration do
179
+ def up
180
+ drop_table :things, if_exists: true
181
+ end
182
+ end.up
183
+
131
184
  list = PostgresqlDB.check_sequences.map { |s| s[:sequence_name] }
132
185
  assert !list.include?('a')
133
186
  assert !list.include?('b')
@@ -135,7 +188,6 @@ class PostgresqlSequenceTest < Minitest::Test
135
188
 
136
189
  with_migration do
137
190
  def up
138
- drop_table :things, if_exists: true
139
191
  create_sequence :c
140
192
  create_sequence :a
141
193
  create_sequence :b
@@ -76,20 +76,41 @@ class SqliteSequenceTest < Minitest::Test
76
76
  assert_operator (2 + @step), :>, SQLiteDB.nextval(:position)
77
77
  end
78
78
 
79
- test "returns current/last sequence value, which doesn't increase by itself" do
79
+ test %( returns current/last sequence value, which doesn't increase by itself
80
+ for migration WITHOUT 'start' or 'increment' values ) do
80
81
  with_migration do
81
82
  def up
82
83
  create_sequence :position
83
84
  end
84
85
  end.up
85
86
 
87
+ # catch the 'start' value 'by default
88
+ assert_equal 1, SQLiteDB.currval(:position)
89
+ assert_equal 1, SQLiteDB.lastval(:position)
90
+
86
91
  SQLiteDB.nextval(:position)
87
- # changed value (=2) after default one (=1)
88
92
 
89
93
  assert_equal 2, SQLiteDB.currval(:position)
90
94
  assert_equal 2, SQLiteDB.lastval(:position)
95
+ end
96
+
97
+ test %( returns current/last sequence value, which doesn't increase by itself
98
+ for migration WITH 'start' and 'increment' values ) do
99
+ with_migration do
100
+ def up
101
+ create_sequence :position, start: 2, increment: 3
102
+ end
103
+ end.up
104
+
105
+ # catch the 'start' value
91
106
  assert_equal 2, SQLiteDB.currval(:position)
92
107
  assert_equal 2, SQLiteDB.lastval(:position)
108
+
109
+ SQLiteDB.nextval(:position)
110
+
111
+ # Doesn't support 'increment' value
112
+ assert_equal 3, SQLiteDB.currval(:position)
113
+ assert_equal 3, SQLiteDB.lastval(:position)
93
114
  end
94
115
 
95
116
  test 'sets a new sequence value greater than the current one' do
@@ -111,7 +132,7 @@ class SqliteSequenceTest < Minitest::Test
111
132
  assert_equal 102, SQLiteDB.lastval(:position)
112
133
  end
113
134
 
114
- test 'sets a new sequence value less than the current one' do
135
+ test 'sets a new sequence value less than the current one (does not change the value)' do
115
136
  with_migration do
116
137
  def up
117
138
  create_sequence :position, start: 100
@@ -196,6 +217,12 @@ class SqliteSequenceTest < Minitest::Test
196
217
  end
197
218
 
198
219
  test 'orders sequences' do
220
+ with_migration do
221
+ def up
222
+ drop_table :objects, if_exists: true
223
+ end
224
+ end.up
225
+
199
226
  list = SQLiteDB.check_sequences.map { |s| s[:name] }
200
227
  assert !list.include?('a')
201
228
  assert !list.include?('b')
@@ -203,7 +230,6 @@ class SqliteSequenceTest < Minitest::Test
203
230
 
204
231
  with_migration do
205
232
  def up
206
- drop_table :things, if_exists: true
207
233
  create_sequence :c, { start: 1 }
208
234
  create_sequence :a, { start: 3 }
209
235
  create_sequence :b
@@ -322,6 +348,18 @@ class SqliteSequenceTest < Minitest::Test
322
348
  assert_equal pos4 - pos2, 2
323
349
  end
324
350
 
351
+ test 'checks custom sequence generated from code' do
352
+ assert_equal SQLiteDB.custom_sequence?(:c), false
353
+
354
+ with_migration do
355
+ def up
356
+ create_sequence :c
357
+ end
358
+ end.up
359
+
360
+ assert_equal SQLiteDB.custom_sequence?(:c), true
361
+ end
362
+
325
363
  test 'creates a Sequence by calling DB.setval(position, 1) if it still does not exist' do
326
364
  assert !sequence_table_exists?('position')
327
365
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sequel-sequence
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.4.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nikolai Bocharov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-09-28 00:00:00.000000000 Z
11
+ date: 2023-10-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sequel
@@ -19,7 +19,7 @@ dependencies:
19
19
  version: '5.28'
20
20
  - - "<"
21
21
  - !ruby/object:Gem::Version
22
- version: '5.73'
22
+ version: '6.0'
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
@@ -29,7 +29,7 @@ dependencies:
29
29
  version: '5.28'
30
30
  - - "<"
31
31
  - !ruby/object:Gem::Version
32
- version: '5.73'
32
+ version: '6.0'
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: bundler
35
35
  requirement: !ruby/object:Gem::Requirement
@@ -114,50 +114,8 @@ dependencies:
114
114
  - - "~>"
115
115
  - !ruby/object:Gem::Version
116
116
  version: 0.22.0
117
- - !ruby/object:Gem::Dependency
118
- name: mysql2
119
- requirement: !ruby/object:Gem::Requirement
120
- requirements:
121
- - - "~>"
122
- - !ruby/object:Gem::Version
123
- version: 0.5.3
124
- type: :development
125
- prerelease: false
126
- version_requirements: !ruby/object:Gem::Requirement
127
- requirements:
128
- - - "~>"
129
- - !ruby/object:Gem::Version
130
- version: 0.5.3
131
- - !ruby/object:Gem::Dependency
132
- name: pg
133
- requirement: !ruby/object:Gem::Requirement
134
- requirements:
135
- - - "~>"
136
- - !ruby/object:Gem::Version
137
- version: 1.5.4
138
- type: :development
139
- prerelease: false
140
- version_requirements: !ruby/object:Gem::Requirement
141
- requirements:
142
- - - "~>"
143
- - !ruby/object:Gem::Version
144
- version: 1.5.4
145
- - !ruby/object:Gem::Dependency
146
- name: sqlite3
147
- requirement: !ruby/object:Gem::Requirement
148
- requirements:
149
- - - "~>"
150
- - !ruby/object:Gem::Version
151
- version: 1.6.0
152
- type: :development
153
- prerelease: false
154
- version_requirements: !ruby/object:Gem::Requirement
155
- requirements:
156
- - - "~>"
157
- - !ruby/object:Gem::Version
158
- version: 1.6.0
159
117
  description: |2
160
- This gem provides a single interface for SEQUENCE functionality
118
+ This gem provides a single user-friendly interface for SEQUENCE functionality
161
119
  in Postgresql and MariaDB DBMS within the Sequel ORM.
162
120
  It also models the Sequences to meet the needs of SQLite and MySQL users.
163
121
  email:
@@ -168,6 +126,7 @@ extra_rdoc_files:
168
126
  - README.md
169
127
  - LICENSE.md
170
128
  files:
129
+ - ".ci.gemfile"
171
130
  - ".github/ISSUE_TEMPLATE/bug_report.md"
172
131
  - ".github/ISSUE_TEMPLATE/feature_request.md"
173
132
  - ".github/PULL_REQUEST_TEMPLATE.md"