sequel 5.26.0 → 5.27.0
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/CHANGELOG +12 -0
- data/doc/release_notes/5.27.0.txt +21 -0
- data/lib/sequel/adapters/shared/postgres.rb +5 -0
- data/lib/sequel/adapters/shared/sqlite.rb +7 -2
- data/lib/sequel/dataset/features.rb +6 -0
- data/lib/sequel/dataset/sql.rb +17 -4
- data/lib/sequel/extensions/pg_array_ops.rb +10 -6
- data/lib/sequel/extensions/pg_enum.rb +4 -1
- data/lib/sequel/sql.rb +1 -0
- data/lib/sequel/version.rb +1 -1
- data/spec/adapters/postgres_spec.rb +5 -7
- data/spec/adapters/sqlite_spec.rb +1 -1
- data/spec/core/expression_filters_spec.rb +15 -1
- data/spec/extensions/pg_array_ops_spec.rb +3 -3
- data/spec/integration/dataset_test.rb +25 -0
- data/spec/integration/plugin_test.rb +1 -1
- data/spec/integration/spec_helper.rb +7 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 512f72ad99402b33be776e759611a9299b638f49344fb1f349120c8cd1643107
|
4
|
+
data.tar.gz: ea0852b3ea61ef9a5a192637a2b457fe47f2374c8ee2eb20d9b02e6eb25a25ac
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4397a4a7530bd3234d7c1e3bf8b1c2b8a6845e659b86b7177dc704edf8ebf2185c499ac7ba04bb7d52006cf1367b8c0835787be1483e7bb481fa4ea2d775680b
|
7
|
+
data.tar.gz: 653238c46ae32bd74127bddb87dc4c99637f5eadfb7515a51e8da5bc57df10de57c2e9a97d085828cc45b97303fa66580c1c8832a5f6fbb5cdaffd585ce0ff86
|
data/CHANGELOG
CHANGED
@@ -1,3 +1,15 @@
|
|
1
|
+
=== 5.27.0 (2019-12-01)
|
2
|
+
|
3
|
+
* Add Sequel::DEFAULT for a DEFAULT expression, useful for assigning to default values (jeremyevans)
|
4
|
+
|
5
|
+
* Make Postgres::ArrayOp#join in pg_array_ops extension work correctly on PostgreSQL <9.1 (jeremyevans)
|
6
|
+
|
7
|
+
* Make pg_enum extension work correctly on PostgreSQL 8.3-9.0 (jeremyevans)
|
8
|
+
|
9
|
+
* Emulate FILTER clause for aggregate functions using CASE on databases not supporting it directly (jeremyevans)
|
10
|
+
|
11
|
+
* Support ordering by NULLS FIRST/NULLS LAST without emulation on SQLite 3.30+ (jeremyevans)
|
12
|
+
|
1
13
|
=== 5.26.0 (2019-11-01)
|
2
14
|
|
3
15
|
* Recognize two additional foreign key constraint violation codes on MySQL 8.0.13+ (rianmcguire) (#1657)
|
@@ -0,0 +1,21 @@
|
|
1
|
+
= New Features
|
2
|
+
|
3
|
+
* Sequel::DEFAULT has been added a constant for the DEFAULT expression,
|
4
|
+
useful in inserts and especially updates:
|
5
|
+
|
6
|
+
DB[:a].where(:id=>1).update(:b=>Sequel::DEFAULT)
|
7
|
+
# UPDATE "a" SET "b" = DEFAULT WHERE "id" = 1
|
8
|
+
|
9
|
+
* SQL::Function#filter for filtered aggregate functions is now
|
10
|
+
supported on all databases. On databases not supporting it natively
|
11
|
+
(all except PostgreSQL 9.4+ and SQLite 3.30+), a CASE statement is
|
12
|
+
used to emulate the support.
|
13
|
+
|
14
|
+
= Other Improvements
|
15
|
+
|
16
|
+
* NULLS FIRST/LAST is now used without emulation on SQLite 3.30+.
|
17
|
+
|
18
|
+
* The pg_enum extension now works correctly on PostgreSQL 8.3-9.0.
|
19
|
+
|
20
|
+
* Postgres::ArrayOp#join in the pg_array_ops extension now works
|
21
|
+
correctly on PostgreSQL <9.1.
|
@@ -1955,6 +1955,11 @@ module Sequel
|
|
1955
1955
|
db.server_version(@opts[:server])
|
1956
1956
|
end
|
1957
1957
|
|
1958
|
+
# PostgreSQL 9.4+ supports the FILTER clause for aggregate functions.
|
1959
|
+
def supports_filtered_aggregates?
|
1960
|
+
server_version >= 90400
|
1961
|
+
end
|
1962
|
+
|
1958
1963
|
# PostgreSQL supports quoted function names.
|
1959
1964
|
def supports_quoted_function_names?
|
1960
1965
|
true
|
@@ -869,9 +869,9 @@ module Sequel
|
|
869
869
|
end
|
870
870
|
end
|
871
871
|
|
872
|
-
# SQLite
|
872
|
+
# SQLite supports NULLS FIRST/LAST natively in 3.30+.
|
873
873
|
def requires_emulating_nulls_first?
|
874
|
-
|
874
|
+
db.sqlite_version < 33000
|
875
875
|
end
|
876
876
|
|
877
877
|
# SQLite does not support FOR UPDATE, but silently ignore it
|
@@ -897,6 +897,11 @@ module Sequel
|
|
897
897
|
false
|
898
898
|
end
|
899
899
|
|
900
|
+
# SQLite 3.30 supports the FILTER clause for aggregate functions.
|
901
|
+
def supports_filtered_aggregates?
|
902
|
+
db.sqlite_version >= 33000
|
903
|
+
end
|
904
|
+
|
900
905
|
# SQLite supports quoted function names.
|
901
906
|
def supports_quoted_function_names?
|
902
907
|
true
|
@@ -230,6 +230,12 @@ module Sequel
|
|
230
230
|
supports_cte_in_subqueries?
|
231
231
|
end
|
232
232
|
|
233
|
+
# Whether the dataset supports the FILTER clause for aggregate functions.
|
234
|
+
# If not, support is emulated using CASE.
|
235
|
+
def supports_filtered_aggregates?
|
236
|
+
false
|
237
|
+
end
|
238
|
+
|
233
239
|
# Whether the database supports quoting function names.
|
234
240
|
def supports_quoted_function_names?
|
235
241
|
false
|
data/lib/sequel/dataset/sql.rb
CHANGED
@@ -492,11 +492,24 @@ module Sequel
|
|
492
492
|
end
|
493
493
|
|
494
494
|
sql << '('
|
495
|
+
if filter = opts[:filter]
|
496
|
+
filter = filter_expr(filter, &opts[:filter_block])
|
497
|
+
end
|
495
498
|
if opts[:*]
|
496
|
-
|
499
|
+
if filter && !supports_filtered_aggregates?
|
500
|
+
literal_append(sql, Sequel.case({filter=>1}, nil))
|
501
|
+
filter = nil
|
502
|
+
else
|
503
|
+
sql << '*'
|
504
|
+
end
|
497
505
|
else
|
498
506
|
sql << "DISTINCT " if opts[:distinct]
|
499
|
-
|
507
|
+
if filter && !supports_filtered_aggregates?
|
508
|
+
expression_list_append(sql, f.args.map{|arg| Sequel.case({filter=>arg}, nil)})
|
509
|
+
filter = nil
|
510
|
+
else
|
511
|
+
expression_list_append(sql, f.args)
|
512
|
+
end
|
500
513
|
if order = opts[:order]
|
501
514
|
sql << " ORDER BY "
|
502
515
|
expression_list_append(sql, order)
|
@@ -510,9 +523,9 @@ module Sequel
|
|
510
523
|
sql << ')'
|
511
524
|
end
|
512
525
|
|
513
|
-
if filter
|
526
|
+
if filter
|
514
527
|
sql << " FILTER (WHERE "
|
515
|
-
literal_append(sql,
|
528
|
+
literal_append(sql, filter)
|
516
529
|
sql << ')'
|
517
530
|
end
|
518
531
|
|
@@ -51,8 +51,8 @@
|
|
51
51
|
# ia.length(2) # array_length(int_array_column, 2)
|
52
52
|
# ia.lower # array_lower(int_array_column, 1)
|
53
53
|
# ia.lower(2) # array_lower(int_array_column, 2)
|
54
|
-
# ia.join # array_to_string(int_array_column, ''
|
55
|
-
# ia.join(':') # array_to_string(int_array_column, ':'
|
54
|
+
# ia.join # array_to_string(int_array_column, '')
|
55
|
+
# ia.join(':') # array_to_string(int_array_column, ':')
|
56
56
|
# ia.join(':', ' ') # array_to_string(int_array_column, ':', ' ')
|
57
57
|
# ia.unnest # unnest(int_array_column)
|
58
58
|
# ia.unnest(:b) # unnest(int_array_column, b)
|
@@ -217,12 +217,16 @@ module Sequel
|
|
217
217
|
|
218
218
|
# Call the array_to_string method:
|
219
219
|
#
|
220
|
-
# array_op.join # array_to_string(array, ''
|
221
|
-
# array_op.to_string # array_to_string(array, ''
|
222
|
-
# array_op.join(":") # array_to_string(array, ':'
|
220
|
+
# array_op.join # array_to_string(array, '')
|
221
|
+
# array_op.to_string # array_to_string(array, '')
|
222
|
+
# array_op.join(":") # array_to_string(array, ':')
|
223
223
|
# array_op.join(":", "*") # array_to_string(array, ':', '*')
|
224
224
|
def to_string(joiner="", null=nil)
|
225
|
-
|
225
|
+
if null.nil?
|
226
|
+
function(:array_to_string, joiner)
|
227
|
+
else
|
228
|
+
function(:array_to_string, joiner, null)
|
229
|
+
end
|
226
230
|
end
|
227
231
|
alias join to_string
|
228
232
|
|
@@ -133,8 +133,11 @@ module Sequel
|
|
133
133
|
# the pg_type table to get names and array oids for
|
134
134
|
# enums.
|
135
135
|
def parse_enum_labels
|
136
|
+
order = [:enumtypid]
|
137
|
+
order << :enumsortorder if server_version >= 90100
|
138
|
+
|
136
139
|
enum_labels = metadata_dataset.from(:pg_enum).
|
137
|
-
order(
|
140
|
+
order(*order).
|
138
141
|
select_hash_groups(Sequel.cast(:enumtypid, Integer).as(:v), :enumlabel).freeze
|
139
142
|
enum_labels.each_value(&:freeze)
|
140
143
|
|
data/lib/sequel/sql.rb
CHANGED
@@ -1317,6 +1317,7 @@ module Sequel
|
|
1317
1317
|
CURRENT_DATE = Constant.new(:CURRENT_DATE)
|
1318
1318
|
CURRENT_TIME = Constant.new(:CURRENT_TIME)
|
1319
1319
|
CURRENT_TIMESTAMP = Constant.new(:CURRENT_TIMESTAMP)
|
1320
|
+
DEFAULT = Constant.new(:DEFAULT)
|
1320
1321
|
SQLTRUE = TRUE = BooleanConstant.new(true)
|
1321
1322
|
SQLFALSE = FALSE = BooleanConstant.new(false)
|
1322
1323
|
NULL = BooleanConstant.new(nil)
|
data/lib/sequel/version.rb
CHANGED
@@ -6,7 +6,7 @@ module Sequel
|
|
6
6
|
|
7
7
|
# The minor version of Sequel. Bumped for every non-patch level
|
8
8
|
# release, generally around once a month.
|
9
|
-
MINOR =
|
9
|
+
MINOR = 27
|
10
10
|
|
11
11
|
# The tiny version of Sequel. Usually 0, only bumped for bugfix
|
12
12
|
# releases that fix regressions from previous versions.
|
@@ -70,7 +70,7 @@ describe "PostgreSQL", '#create_table' do
|
|
70
70
|
|
71
71
|
it "should create an unlogged table" do
|
72
72
|
@db.create_table(:unlogged_dolls, :unlogged => true){text :name}
|
73
|
-
end
|
73
|
+
end if DB.server_version >= 90100
|
74
74
|
|
75
75
|
it "should create a table inheriting from another table" do
|
76
76
|
@db.create_table(:unlogged_dolls){text :name}
|
@@ -615,10 +615,6 @@ describe "A PostgreSQL dataset" do
|
|
615
615
|
@d.from{generate_series(1,3,1).as(:a)}.select{(a.sql_number % 2).as(:a)}.from_self.get{mode.function.within_group(:a)}.must_equal 1
|
616
616
|
end if DB.server_version >= 90400
|
617
617
|
|
618
|
-
it "should support filtered aggregate functions" do
|
619
|
-
@d.from{generate_series(1,3,1).as(:a)}.select{(a.sql_number % 2).as(:a)}.from_self.get{count(:a).filter(:a=>1)}.must_equal 2
|
620
|
-
end if DB.server_version >= 90400
|
621
|
-
|
622
618
|
it "should support functions with ordinality" do
|
623
619
|
@d.from{generate_series(1,10,3).with_ordinality}.select_map([:generate_series, :ordinality]).must_equal [[1, 1], [4, 2], [7, 3], [10, 4]]
|
624
620
|
end if DB.server_version >= 90400
|
@@ -1272,7 +1268,7 @@ describe "A PostgreSQL database" do
|
|
1272
1268
|
end
|
1273
1269
|
|
1274
1270
|
it "should support indexes with index type" do
|
1275
|
-
@db.create_table(:posts){
|
1271
|
+
@db.create_table(:posts){box :geom; index :geom, :type => 'gist'}
|
1276
1272
|
end
|
1277
1273
|
|
1278
1274
|
it "should support unique indexes with index type" do
|
@@ -2704,6 +2700,8 @@ describe 'PostgreSQL array handling' do
|
|
2704
2700
|
if @db.server_version >= 90000
|
2705
2701
|
@ds.get(Sequel.pg_array(:i5).join).must_equal '15'
|
2706
2702
|
@ds.get(Sequel.pg_array(:i5).join(':')).must_equal '1:5'
|
2703
|
+
end
|
2704
|
+
if @db.server_version >= 90100
|
2707
2705
|
@ds.get(Sequel.pg_array(:i5).join(':', '*')).must_equal '1:*:5'
|
2708
2706
|
end
|
2709
2707
|
if @db.server_version >= 90300
|
@@ -4475,4 +4473,4 @@ describe "pg_auto_constraint_validations plugin" do
|
|
4475
4473
|
File.delete(cache_file) if File.file?(cache_file)
|
4476
4474
|
end
|
4477
4475
|
end
|
4478
|
-
end if DB.respond_to?(:error_info)
|
4476
|
+
end if DB.respond_to?(:error_info) && DB.server_version >= 90300
|
@@ -623,7 +623,7 @@ describe "SQLite", 'INSERT ON CONFLICT' do
|
|
623
623
|
@ds.insert_conflict(:target=>:a).insert(1, 3, 4, false)
|
624
624
|
@ds.insert_conflict(:target=>:c, :conflict_where=>:c_is_unique).insert(11, 12, 3, true)
|
625
625
|
@ds.all.must_equal [{:a=>1, :b=>2, :c=>3, :c_is_unique=>false}, {:a=>10, :b=>11, :c=>3, :c_is_unique=>true}]
|
626
|
-
end
|
626
|
+
end unless DB.adapter_scheme == :amalgalite
|
627
627
|
|
628
628
|
it "Dataset#insert_ignore and insert_conflict should work with multi_insert/import" do
|
629
629
|
@ds.insert(1, 2, 3, false)
|
@@ -353,6 +353,11 @@ describe "Blockless Ruby Filters" do
|
|
353
353
|
@d.l({:x => Sequel::FALSE}).must_equal '(x IS FALSE)'
|
354
354
|
@d.l({:x => Sequel::SQLTRUE}).must_equal '(x IS TRUE)'
|
355
355
|
@d.l({:x => Sequel::SQLFALSE}).must_equal '(x IS FALSE)'
|
356
|
+
|
357
|
+
@d.l({:x => Sequel::CURRENT_DATE}).must_equal '(x = CURRENT_DATE)'
|
358
|
+
@d.l({:x => Sequel::CURRENT_TIME}).must_equal '(x = CURRENT_TIME)'
|
359
|
+
@d.l({:x => Sequel::CURRENT_TIMESTAMP}).must_equal '(x = CURRENT_TIMESTAMP)'
|
360
|
+
@d.l({:x => Sequel::DEFAULT}).must_equal '(x = DEFAULT)'
|
356
361
|
end
|
357
362
|
|
358
363
|
it "should support negation of SQL::Constants" do
|
@@ -741,14 +746,23 @@ describe Sequel::SQL::VirtualRow do
|
|
741
746
|
@d.l{mode.function.within_group(:a, :b)}.must_equal 'mode() WITHIN GROUP (ORDER BY "a", "b")'
|
742
747
|
end
|
743
748
|
|
749
|
+
it "should handle emualted filtered aggregate function calls" do
|
750
|
+
@d.l{count.function.*.filter(Sequel.&(:a, :b))}.must_equal 'count((CASE WHEN ("a" AND "b") THEN 1 ELSE NULL END))'
|
751
|
+
@d.l{count.function.*.filter(:a=>1)}.must_equal 'count((CASE WHEN ("a" = 1) THEN 1 ELSE NULL END))'
|
752
|
+
@d.l{count(:a).filter{b > 1}}.must_equal 'count((CASE WHEN ("b" > 1) THEN "a" ELSE NULL END))'
|
753
|
+
@d.l{count(:a).filter(:a=>1){b > 1}}.must_equal 'count((CASE WHEN (("a" = 1) AND ("b" > 1)) THEN "a" ELSE NULL END))'
|
754
|
+
end
|
755
|
+
|
744
756
|
it "should handle filtered aggregate function calls" do
|
757
|
+
@d = @d.with_extend{def supports_filtered_aggregates?; true end}
|
745
758
|
@d.l{count.function.*.filter(Sequel.&(:a, :b))}.must_equal 'count(*) FILTER (WHERE ("a" AND "b"))'
|
746
759
|
@d.l{count.function.*.filter(:a=>1)}.must_equal 'count(*) FILTER (WHERE ("a" = 1))'
|
747
760
|
@d.l{count.function.*.filter{b > 1}}.must_equal 'count(*) FILTER (WHERE ("b" > 1))'
|
748
761
|
@d.l{count.function.*.filter(:a=>1){b > 1}}.must_equal 'count(*) FILTER (WHERE (("a" = 1) AND ("b" > 1)))'
|
749
762
|
end
|
750
763
|
|
751
|
-
it "should handle
|
764
|
+
it "should handle filtered ordered-set and hypothetical-set function calls" do
|
765
|
+
@d = @d.with_extend{def supports_filtered_aggregates?; true end}
|
752
766
|
@d.l{mode.function.within_group(:a).filter(:a=>1)}.must_equal 'mode() WITHIN GROUP (ORDER BY "a") FILTER (WHERE ("a" = 1))'
|
753
767
|
end
|
754
768
|
|
@@ -83,9 +83,9 @@ describe "Sequel::Postgres::ArrayOp" do
|
|
83
83
|
end
|
84
84
|
|
85
85
|
it "#to_string/join should use the array_to_string function" do
|
86
|
-
@db.literal(@a.to_string).must_equal "array_to_string(a, ''
|
87
|
-
@db.literal(@a.join).must_equal "array_to_string(a, ''
|
88
|
-
@db.literal(@a.join(':')).must_equal "array_to_string(a, ':'
|
86
|
+
@db.literal(@a.to_string).must_equal "array_to_string(a, '')"
|
87
|
+
@db.literal(@a.join).must_equal "array_to_string(a, '')"
|
88
|
+
@db.literal(@a.join(':')).must_equal "array_to_string(a, ':')"
|
89
89
|
@db.literal(@a.join(':', '*')).must_equal "array_to_string(a, ':', '*')"
|
90
90
|
end
|
91
91
|
|
@@ -92,6 +92,17 @@ describe "Simple Dataset operations" do
|
|
92
92
|
@ds.from_self(:alias=>:items).graph(@ds.from_self, {:id=>:id}, :table_alias=>:b).extension(:graph_each).all.must_equal [{:items=>{:id=>1, :number=>10}, :b=>{:id=>1, :number=>10}}]
|
93
93
|
end
|
94
94
|
|
95
|
+
cspecify "should have insert and update work with Sequel::DEFAULT", :sqlite do
|
96
|
+
@db.create_table!(:items) do
|
97
|
+
Integer :number, :default=>10
|
98
|
+
end
|
99
|
+
@ds.insert(:number=>Sequel::DEFAULT)
|
100
|
+
@ds.select_map(:number).must_equal [10]
|
101
|
+
@ds.insert(:number=>20)
|
102
|
+
@ds.update(:number=>Sequel::DEFAULT)
|
103
|
+
@ds.select_map(:number).must_equal [10, 10]
|
104
|
+
end
|
105
|
+
|
95
106
|
cspecify "should have insert work correctly when inserting a row with all NULL values", :hsqldb do
|
96
107
|
@db.create_table!(:items) do
|
97
108
|
String :name
|
@@ -443,6 +454,20 @@ describe Sequel::Dataset do
|
|
443
454
|
@d.extension(:sequel_4_dataset_methods).interval(:value).to_i.must_equal 6
|
444
455
|
end
|
445
456
|
|
457
|
+
it "should support or emulate filtered aggregate functions" do
|
458
|
+
@d.insert(:name => 'abc', :value => 123)
|
459
|
+
@d.insert(:name => 'abc', :value => 456)
|
460
|
+
@d.insert(:name => 'def', :value => 324)
|
461
|
+
@d.get{count.function.*.filter{value > 100}}.must_equal 3
|
462
|
+
@d.get{count.function.*.filter{value > 200}}.must_equal 2
|
463
|
+
@d.get{count.function.*.filter{value > 400}}.must_equal 1
|
464
|
+
@d.get{count.function.*.filter{value > 500}}.must_equal 0
|
465
|
+
@d.get{count(:value).filter{value > 100}}.must_equal 3
|
466
|
+
@d.get{count(:value).filter{value > 200}}.must_equal 2
|
467
|
+
@d.get{count(:value).filter{value > 400}}.must_equal 1
|
468
|
+
@d.get{count(:value).filter{value > 500}}.must_equal 0
|
469
|
+
end
|
470
|
+
|
446
471
|
it "should return the correct records" do
|
447
472
|
@d.to_a.must_equal []
|
448
473
|
@d.insert(:name => 'abc', :value => 123)
|
@@ -2393,7 +2393,7 @@ describe "string_agg extension" do
|
|
2393
2393
|
cspecify "should have string_agg return aggregated concatenation for distinct values", :mssql, :sqlite, :oracle, :db2, :derby do
|
2394
2394
|
@ds.select_group(:id).select_append(Sequel.string_agg(:s).order(:s).distinct.as(:v)).map([:id, :v]).must_equal [[1, 'a,b,c'], [2, 'aa,bb']]
|
2395
2395
|
end
|
2396
|
-
end
|
2396
|
+
end if (DB.database_type != :postgres || DB.server_version >= 90000)
|
2397
2397
|
|
2398
2398
|
describe "insert_conflict plugin" do
|
2399
2399
|
before(:all) do
|
@@ -62,4 +62,10 @@ if ENV['SEQUEL_FREEZE_DATABASE']
|
|
62
62
|
DB.freeze
|
63
63
|
end
|
64
64
|
|
65
|
-
|
65
|
+
version = if DB.respond_to?(:server_version)
|
66
|
+
DB.server_version
|
67
|
+
elsif DB.respond_to?(:sqlite_version)
|
68
|
+
DB.sqlite_version
|
69
|
+
end
|
70
|
+
|
71
|
+
puts "running #{defined?(SEQUEL_ADAPTER_TEST) ? SEQUEL_ADAPTER_TEST : "integration (database type: #{DB.database_type})"} specs on #{RUBY_ENGINE} #{defined?(JRUBY_VERSION) ? JRUBY_VERSION : RUBY_VERSION} with #{DB.adapter_scheme} adapter#{" (database version: #{version})" if version}"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sequel
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.
|
4
|
+
version: 5.27.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeremy Evans
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-12-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: minitest
|
@@ -224,6 +224,7 @@ extra_rdoc_files:
|
|
224
224
|
- doc/release_notes/5.24.0.txt
|
225
225
|
- doc/release_notes/5.25.0.txt
|
226
226
|
- doc/release_notes/5.26.0.txt
|
227
|
+
- doc/release_notes/5.27.0.txt
|
227
228
|
files:
|
228
229
|
- CHANGELOG
|
229
230
|
- MIT-LICENSE
|
@@ -321,6 +322,7 @@ files:
|
|
321
322
|
- doc/release_notes/5.24.0.txt
|
322
323
|
- doc/release_notes/5.25.0.txt
|
323
324
|
- doc/release_notes/5.26.0.txt
|
325
|
+
- doc/release_notes/5.27.0.txt
|
324
326
|
- doc/release_notes/5.3.0.txt
|
325
327
|
- doc/release_notes/5.4.0.txt
|
326
328
|
- doc/release_notes/5.5.0.txt
|