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 +4 -4
- data/.ci.gemfile +25 -0
- data/.github/workflows/ci.yml +1 -2
- data/CHANGELOG.md +11 -0
- data/CONTRIBUTING.md +15 -5
- data/README.md +14 -3
- data/lib/sequel/sequence/database/postgresql.rb +17 -7
- data/lib/sequel/sequence/database/server/mariadb.rb +38 -13
- data/lib/sequel/sequence/database/server/mysql.rb +1 -1
- data/lib/sequel/sequence/database/sqlite.rb +9 -4
- data/lib/sequel/sequence/version.rb +1 -1
- data/lib/sequel/sequence.rb +46 -14
- data/sequel-sequence.gemspec +13 -13
- data/test/mariadb_test_helper.rb +2 -0
- data/test/postgresql_test_helper.rb +3 -1
- data/test/sequel/mariadb_sequence_test.rb +67 -16
- data/test/sequel/mysql_sequence_test.rb +42 -16
- data/test/sequel/postgresql_sequence_test.rb +58 -6
- data/test/sequel/sqlite_sequence_test.rb +42 -4
- metadata +6 -47
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a027c577de1ee27127880328c29208456a26635c9ea18b1c5eb3c1cb0dbbd5fc
|
4
|
+
data.tar.gz: 71764d6ec16bf3425ba3d3bfb4ac47c04dd2a6f7001342c0ae35ebec63af293d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
data/.github/workflows/ci.yml
CHANGED
@@ -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:
|
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.
|
37
|
-
4.
|
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
|
-
|
41
|
-
|
42
|
-
|
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
|
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
|
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
|
-
|
68
|
+
quoted_name = quote(name.to_s)
|
69
69
|
out = nil
|
70
|
-
fetch("SELECT currval(#{
|
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
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
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
|
-
|
57
|
+
quoted_name = quote(name.to_s)
|
50
58
|
out = nil
|
51
|
-
fetch("SELECT lastval(#{
|
52
|
-
out = row["lastval(#{
|
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
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
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
|
-
|
83
|
+
value
|
66
84
|
end
|
67
85
|
|
68
86
|
def set_column_default_nextval(table, column, sequence)
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
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
|
@@ -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(
|
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)
|
data/lib/sequel/sequence.rb
CHANGED
@@ -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
|
-
|
25
|
-
|
26
|
-
)
|
27
|
-
|
28
|
-
|
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
|
data/sequel-sequence.gemspec
CHANGED
@@ -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', '<
|
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
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
else
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
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
|
data/test/mariadb_test_helper.rb
CHANGED
@@ -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
|
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
|
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
|
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
|
-
#
|
102
|
-
|
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
|
-
#
|
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
|
129
|
-
seq[:Tables_in_test] == 'position'
|
130
|
-
end
|
165
|
+
sequence = MariaDB.check_sequences
|
131
166
|
|
132
|
-
|
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
|
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
|
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
|
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.
|
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
|
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.
|
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-
|
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: '
|
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: '
|
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"
|