set 1.0.3 → 1.1.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e23398781865843cd7ba5286dca1a65ff241807ba8196020407b986bc74270b1
4
- data.tar.gz: 19c57ed5aa898b0e4ee695df08aeccfb0d313cd785d4dd318941d5bb68291595
3
+ metadata.gz: cef560e603f6d6413751c31bb94fddf3838a66af8e71cff73c74760ff479ff6a
4
+ data.tar.gz: 448e22e93eebe57b26200fc1c8be476d60494193136aabb09a50c68e878e96cf
5
5
  SHA512:
6
- metadata.gz: 88ee0f430a9b381d557f4c8bbe161c2199207ffcbaeb79d78daec9b9dc3e4ebb9fbc3a397ae82c5ffeba0b73782e9363ee19512e0b1b0372628ef4c6d715365a
7
- data.tar.gz: d05a97bb9a5cb900eb303ce85926b73e04530fd44ca0cc85e9ca09e8413af5f5a3ad812cf4409a9fd5f2bc191632e8673d9fc3c89ebb62b8fa13fcf6a3c643ff
6
+ metadata.gz: 91fa3052d7f25eaf6c0066013a5bd2d0c58961fe330c8923853634bac908ae83323d01b26ec8f85c4ab1ae309a83cc8e30e0918802ebb6f96fc3fcb7b7bdd433
7
+ data.tar.gz: 07b57081279057d476e1fe7c07587db1de0243cb78d36bc04b5b3ed303643b54320f08e98ed3672e610df84c42f0d503c7fae7eba040d2cf260c84319e7f9745
@@ -0,0 +1 @@
1
+ * @knu
@@ -7,11 +7,11 @@ jobs:
7
7
  name: build (${{ matrix.ruby }} / ${{ matrix.os }})
8
8
  strategy:
9
9
  matrix:
10
- ruby: [ 2.7, 2.6, 2.5, head ]
10
+ ruby: [ 3.2, 3.1, "3.0", head ]
11
11
  os: [ ubuntu-latest, macos-latest ]
12
12
  runs-on: ${{ matrix.os }}
13
13
  steps:
14
- - uses: actions/checkout@v3
14
+ - uses: actions/checkout@v4
15
15
  - name: Set up Ruby
16
16
  uses: ruby/setup-ruby@v1
17
17
  with:
data/CHANGELOG.md CHANGED
@@ -1,5 +1,20 @@
1
1
  # Set Changelog
2
2
 
3
+ # 1.1.0 (2023-12-23)
4
+
5
+ * Optimize for and require Ruby >=3
6
+
7
+ # 1.0.4 (2023-12-08)
8
+
9
+ * Enhancements
10
+ * Avoid the `block or return` pattern to save Proc allocations [#29][] ([@casperisfine][])
11
+ * Set#merge takes many enumerable objects [#30][]
12
+
13
+ # 1.0.3 (2022-09-06)
14
+
15
+ * Enhancements
16
+ * Make Set a builtin feature \[[Feature #16989][]]
17
+
3
18
  # 1.0.2 (2021-10-25)
4
19
 
5
20
  * Enhancements
@@ -31,9 +46,13 @@ This is the first release of set as a gem. Here lists the changes since the ver
31
46
  [#17]: https://github.com/ruby/set/pull/17
32
47
  [#18]: https://github.com/ruby/set/pull/18
33
48
  [#20]: https://github.com/ruby/set/pull/20
49
+ [#29]: https://github.com/ruby/set/pull/29
50
+ [#30]: https://github.com/ruby/set/pull/30
34
51
  [Feature #17838]: https://bugs.ruby-lang.org/issues/17838
52
+ [Feature #16989]: https://bugs.ruby-lang.org/issues/16989
35
53
 
36
54
  [@BurdetteLamar]: https://github.com/BurdetteLamar
55
+ [@casperisfine]: https://github.com/casperisfine
37
56
  [@jeremyevans]: https://github.com/jeremyevans
38
57
  [@k-tsj]: https://github.com/k-tsj
39
58
  [@knu]: https://github.com/knu
data/lib/set.rb CHANGED
@@ -3,7 +3,7 @@
3
3
  #
4
4
  # set.rb - defines the Set class
5
5
  #
6
- # Copyright (c) 2002-2020 Akinori MUSHA <knu@iDaemons.org>
6
+ # Copyright (c) 2002-2023 Akinori MUSHA <knu@iDaemons.org>
7
7
  #
8
8
  # Documentation by Akinori MUSHA and Gavin Sinclair.
9
9
  #
@@ -12,16 +12,12 @@
12
12
 
13
13
 
14
14
  ##
15
- # This library provides the Set class, which deals with a collection
16
- # of unordered values with no duplicates. It is a hybrid of Array's
15
+ # This library provides the Set class, which implements a collection
16
+ # of unordered values with no duplicates. It is a hybrid of Array's
17
17
  # intuitive inter-operation facilities and Hash's fast lookup.
18
18
  #
19
19
  # The method `to_set` is added to Enumerable for convenience.
20
20
  #
21
- # Set implements a collection of unordered values with no duplicates.
22
- # This is a hybrid of Array's intuitive inter-operation facilities and
23
- # Hash's fast lookup.
24
- #
25
21
  # Set is easy to use with Enumerable objects (implementing `each`).
26
22
  # Most of the initializer methods and binary operators accept generic
27
23
  # Enumerable objects besides sets and arrays. An Enumerable object
@@ -156,7 +152,7 @@
156
152
  # If the given object is not an element in the set,
157
153
  # adds it and returns +self+; otherwise, returns +nil+.
158
154
  # - \#merge:
159
- # Adds each given object to the set; returns +self+.
155
+ # Merges the elements of each given enumerable object to the set; returns +self+.
160
156
  # - \#replace:
161
157
  # Replaces the contents of the set with the contents
162
158
  # of a given enumerable.
@@ -220,6 +216,8 @@
220
216
  # has been modified while an element in the set.
221
217
  #
222
218
  class Set
219
+ VERSION = "1.1.0"
220
+
223
221
  include Enumerable
224
222
 
225
223
  # Creates a new set containing the given objects.
@@ -288,18 +286,10 @@ class Set
288
286
  @hash = orig.instance_variable_get(:@hash).dup
289
287
  end
290
288
 
291
- if Kernel.instance_method(:initialize_clone).arity != 1
292
- # Clone internal hash.
293
- def initialize_clone(orig, **options)
294
- super
295
- @hash = orig.instance_variable_get(:@hash).clone(**options)
296
- end
297
- else
298
- # Clone internal hash.
299
- def initialize_clone(orig)
300
- super
301
- @hash = orig.instance_variable_get(:@hash).clone
302
- end
289
+ # Clone internal hash.
290
+ def initialize_clone(orig, **options)
291
+ super
292
+ @hash = orig.instance_variable_get(:@hash).clone(**options)
303
293
  end
304
294
 
305
295
  def freeze # :nodoc:
@@ -391,7 +381,7 @@ class Set
391
381
  # Equivalent to Set#flatten, but replaces the receiver with the
392
382
  # result in place. Returns nil if no modifications were made.
393
383
  def flatten!
394
- replace(flatten()) if any? { |e| e.is_a?(Set) }
384
+ replace(flatten()) if any?(Set)
395
385
  end
396
386
 
397
387
  # Returns true if the set contains the given object.
@@ -411,7 +401,7 @@ class Set
411
401
  when set.instance_of?(self.class) && @hash.respond_to?(:>=)
412
402
  @hash >= set.instance_variable_get(:@hash)
413
403
  when set.is_a?(Set)
414
- size >= set.size && set.all? { |o| include?(o) }
404
+ size >= set.size && set.all?(self)
415
405
  else
416
406
  raise ArgumentError, "value must be a set"
417
407
  end
@@ -424,7 +414,7 @@ class Set
424
414
  when set.instance_of?(self.class) && @hash.respond_to?(:>)
425
415
  @hash > set.instance_variable_get(:@hash)
426
416
  when set.is_a?(Set)
427
- size > set.size && set.all? { |o| include?(o) }
417
+ size > set.size && set.all?(self)
428
418
  else
429
419
  raise ArgumentError, "value must be a set"
430
420
  end
@@ -437,7 +427,7 @@ class Set
437
427
  when set.instance_of?(self.class) && @hash.respond_to?(:<=)
438
428
  @hash <= set.instance_variable_get(:@hash)
439
429
  when set.is_a?(Set)
440
- size <= set.size && all? { |o| set.include?(o) }
430
+ size <= set.size && all?(set)
441
431
  else
442
432
  raise ArgumentError, "value must be a set"
443
433
  end
@@ -450,7 +440,7 @@ class Set
450
440
  when set.instance_of?(self.class) && @hash.respond_to?(:<)
451
441
  @hash < set.instance_variable_get(:@hash)
452
442
  when set.is_a?(Set)
453
- size < set.size && all? { |o| set.include?(o) }
443
+ size < set.size && all?(set)
454
444
  else
455
445
  raise ArgumentError, "value must be a set"
456
446
  end
@@ -481,12 +471,12 @@ class Set
481
471
  case set
482
472
  when Set
483
473
  if size < set.size
484
- any? { |o| set.include?(o) }
474
+ any?(set)
485
475
  else
486
- set.any? { |o| include?(o) }
476
+ set.any?(self)
487
477
  end
488
478
  when Enumerable
489
- set.any? { |o| include?(o) }
479
+ set.any?(self)
490
480
  else
491
481
  raise ArgumentError, "value must be enumerable"
492
482
  end
@@ -507,7 +497,7 @@ class Set
507
497
  # the element as parameter. Returns an enumerator if no block is
508
498
  # given.
509
499
  def each(&block)
510
- block or return enum_for(__method__) { size }
500
+ block_given? or return enum_for(__method__) { size }
511
501
  @hash.each_key(&block)
512
502
  self
513
503
  end
@@ -582,7 +572,7 @@ class Set
582
572
  # Equivalent to Set#delete_if, but returns nil if no changes were
583
573
  # made. Returns an enumerator if no block is given.
584
574
  def reject!(&block)
585
- block or return enum_for(__method__) { size }
575
+ block_given? or return enum_for(__method__) { size }
586
576
  n = size
587
577
  delete_if(&block)
588
578
  self if size != n
@@ -591,7 +581,7 @@ class Set
591
581
  # Equivalent to Set#keep_if, but returns nil if no changes were
592
582
  # made. Returns an enumerator if no block is given.
593
583
  def select!(&block)
594
- block or return enum_for(__method__) { size }
584
+ block_given? or return enum_for(__method__) { size }
595
585
  n = size
596
586
  keep_if(&block)
597
587
  self if size != n
@@ -600,13 +590,15 @@ class Set
600
590
  # Equivalent to Set#select!
601
591
  alias filter! select!
602
592
 
603
- # Merges the elements of the given enumerable object to the set and
593
+ # Merges the elements of the given enumerable objects to the set and
604
594
  # returns self.
605
- def merge(enum)
606
- if enum.instance_of?(self.class)
607
- @hash.update(enum.instance_variable_get(:@hash))
608
- else
609
- do_with_enum(enum) { |o| add(o) }
595
+ def merge(*enums, **nil)
596
+ enums.each do |enum|
597
+ if enum.instance_of?(self.class)
598
+ @hash.update(enum.instance_variable_get(:@hash))
599
+ else
600
+ do_with_enum(enum) { |o| add(o) }
601
+ end
610
602
  end
611
603
 
612
604
  self
data/set.gemspec CHANGED
@@ -1,6 +1,13 @@
1
+ name = File.basename(__FILE__, ".gemspec")
2
+ version = ["lib", Array.new(name.count("-")+1, "..").join("/")].find do |dir|
3
+ break File.foreach(File.join(__dir__, dir, "#{name.tr('-', '/')}.rb")) do |line|
4
+ /^\s*VERSION\s*=\s*"(.*)"/ =~ line and break $1
5
+ end rescue nil
6
+ end
7
+
1
8
  Gem::Specification.new do |spec|
2
- spec.name = "set"
3
- spec.version = "1.0.3"
9
+ spec.name = name
10
+ spec.version = version
4
11
  spec.authors = ["Akinori MUSHA"]
5
12
  spec.email = ["knu@idaemons.org"]
6
13
 
@@ -8,7 +15,7 @@ Gem::Specification.new do |spec|
8
15
  spec.description = %q{Provides a class to deal with collections of unordered, unique values}
9
16
  spec.homepage = "https://github.com/ruby/set"
10
17
  spec.licenses = ["Ruby", "BSD-2-Clause"]
11
- spec.required_ruby_version = Gem::Requirement.new(">= 2.3.0")
18
+ spec.required_ruby_version = Gem::Requirement.new(">= 3.0.0")
12
19
 
13
20
  spec.metadata["homepage_uri"] = spec.homepage
14
21
  spec.metadata["source_code_uri"] = spec.homepage
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: set
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Akinori MUSHA
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-09-06 00:00:00.000000000 Z
11
+ date: 2023-12-23 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Provides a class to deal with collections of unordered, unique values
14
14
  email:
@@ -17,6 +17,7 @@ executables: []
17
17
  extensions: []
18
18
  extra_rdoc_files: []
19
19
  files:
20
+ - ".github/CODEOWNERS"
20
21
  - ".github/dependabot.yml"
21
22
  - ".github/workflows/test.yml"
22
23
  - ".gitignore"
@@ -37,8 +38,8 @@ licenses:
37
38
  metadata:
38
39
  homepage_uri: https://github.com/ruby/set
39
40
  source_code_uri: https://github.com/ruby/set
40
- changelog_uri: https://github.com/ruby/set/blob/v1.0.3/CHANGELOG.md
41
- post_install_message:
41
+ changelog_uri: https://github.com/ruby/set/blob/v1.1.0/CHANGELOG.md
42
+ post_install_message:
42
43
  rdoc_options: []
43
44
  require_paths:
44
45
  - lib
@@ -46,15 +47,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
46
47
  requirements:
47
48
  - - ">="
48
49
  - !ruby/object:Gem::Version
49
- version: 2.3.0
50
+ version: 3.0.0
50
51
  required_rubygems_version: !ruby/object:Gem::Requirement
51
52
  requirements:
52
53
  - - ">="
53
54
  - !ruby/object:Gem::Version
54
55
  version: '0'
55
56
  requirements: []
56
- rubygems_version: 3.4.0.dev
57
- signing_key:
57
+ rubygems_version: 3.4.10
58
+ signing_key:
58
59
  specification_version: 4
59
60
  summary: Provides a class to deal with collections of unordered, unique values
60
61
  test_files: []