sequel-sequence 0.4.1 → 0.4.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 +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"
|