berkeley_library-util 0.1.9 → 0.2.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: fdc84acc6adb94fcfbbcf7d18b9a6bead8ef484ef40028f139b07964b565b4e2
4
- data.tar.gz: 43e850e1ee541d777c07f546f789e576b45a44580734206c44cd2dce4d3293a1
3
+ metadata.gz: 3f343b3b9dc12a94f77d0a672e3d61f90ccb637f4217238b9a5b7358d658c860
4
+ data.tar.gz: 94ce31eb5eeb374fda410f3b984ce26ca4e070635415b2aa8afa38c33a9ceefa
5
5
  SHA512:
6
- metadata.gz: dc47ba39cee501522db01aceeba7060f51ee4270ca03a2d4263e836190eddc2e953fd83eb292379ce4fcdbd5a9bac3831ec76c750cb2ecd9a375c86a60533079
7
- data.tar.gz: 0dc4190292083d68066528c6a7efa815667ccc6ba79fb75ba0d0fa5e5f1ab354465447d1d7b53bbf825426e010bd4954b0ada17f3b935ae68095d8d0795940c1
6
+ metadata.gz: 25a2f1d770068ed5d54e70c359dc574958c2438f872ae466c07c9dbf9dfd8c4c033aca4cbadec1f45c8cb886ba5cdf3b626e1ab5131d3bebba94325975dc70b3
7
+ data.tar.gz: 22607a4573f7f85cdbde5dcb997d7b3b5fc0480262faad923ac3b01bcc6cca0c301c4746eeb9195ff8054b6b00ac56a030a0c566348278086b48603172c1823b
@@ -6,7 +6,7 @@ jobs:
6
6
  fail-fast: false
7
7
  matrix:
8
8
  os: [ ubuntu-latest, macos-latest ]
9
- ruby: [ '2.7', '3.0', '3.1' ]
9
+ ruby: [ '3.3', '3.4' ]
10
10
  runs-on: ${{ matrix.os }}
11
11
 
12
12
  steps:
@@ -24,7 +24,7 @@ jobs:
24
24
 
25
25
  - name: Upload artifacts
26
26
  if: ${{ always() }}
27
- uses: actions/upload-artifact@v3
27
+ uses: actions/upload-artifact@v4
28
28
  with:
29
- name: artifacts
29
+ name: artifacts-${{ matrix.ruby }}-${{ matrix.os }}
30
30
  path: artifacts/**
@@ -0,0 +1,33 @@
1
+ name: Ruby Gem
2
+
3
+ on:
4
+ release:
5
+ types: [published]
6
+
7
+ jobs:
8
+ build:
9
+ name: Build + Publish
10
+ runs-on: ubuntu-latest
11
+ permissions:
12
+ contents: read
13
+ packages: write
14
+
15
+ steps:
16
+ - uses: actions/checkout@v3
17
+
18
+ - name: Set up Ruby
19
+ uses: ruby/setup-ruby@v1
20
+ with:
21
+ ruby-version: '3.3'
22
+ bundler-cache: true
23
+
24
+ - name: Publish to RubyGems
25
+ run: |
26
+ mkdir -p $HOME/.gem
27
+ touch $HOME/.gem/credentials
28
+ chmod 0600 $HOME/.gem/credentials
29
+ printf -- "---\n:rubygems_api_key: ${GEM_HOST_API_KEY}\n" > $HOME/.gem/credentials
30
+ gem build *.gemspec
31
+ gem push *.gem
32
+ env:
33
+ GEM_HOST_API_KEY: "${{secrets.RUBYGEMS_AUTH_TOKEN}}"
data/.rubocop.yml CHANGED
@@ -491,3 +491,141 @@ Style/RedundantStringEscape: # (new in 1.37)
491
491
  Style/RedundantEach: # (new in 1.38)
492
492
  Enabled: true
493
493
 
494
+ Gemspec/AddRuntimeDependency: # new in 1.65
495
+ Enabled: true
496
+ Gemspec/AttributeAssignment: # new in 1.77
497
+ Enabled: true
498
+ Gemspec/DevelopmentDependencies: # new in 1.44
499
+ Enabled: false
500
+ Lint/ArrayLiteralInRegexp: # new in 1.71
501
+ Enabled: true
502
+ Lint/ConstantReassignment: # new in 1.70
503
+ Enabled: true
504
+ Lint/CopDirectiveSyntax: # new in 1.72
505
+ Enabled: true
506
+ Lint/DuplicateMatchPattern: # new in 1.50
507
+ Enabled: true
508
+ Lint/DuplicateSetElement: # new in 1.67
509
+ Enabled: true
510
+ Lint/HashNewWithKeywordArgumentsAsDefault: # new in 1.69
511
+ Enabled: true
512
+ Lint/ItWithoutArgumentsInBlock: # new in 1.59
513
+ Enabled: true
514
+ Lint/LiteralAssignmentInCondition: # new in 1.58
515
+ Enabled: true
516
+ Lint/MixedCaseRange: # new in 1.53
517
+ Enabled: true
518
+ Lint/NumericOperationWithConstantResult: # new in 1.69
519
+ Enabled: true
520
+ Lint/RedundantRegexpQuantifiers: # new in 1.53
521
+ Enabled: true
522
+ Lint/RedundantTypeConversion: # new in 1.72
523
+ Enabled: true
524
+ Lint/SharedMutableDefault: # new in 1.70
525
+ Enabled: true
526
+ Lint/SuppressedExceptionInNumberConversion: # new in 1.72
527
+ Enabled: true
528
+ Lint/UnescapedBracketInRegexp: # new in 1.68
529
+ Enabled: true
530
+ Lint/UselessConstantScoping: # new in 1.72
531
+ Enabled: true
532
+ Lint/UselessDefaultValueArgument: # new in 1.76
533
+ Enabled: true
534
+ Lint/UselessDefined: # new in 1.69
535
+ Enabled: true
536
+ Lint/UselessNumericOperation: # new in 1.66
537
+ Enabled: true
538
+ Lint/UselessOr: # new in 1.76
539
+ Enabled: true
540
+ Lint/UselessRescue: # new in 1.43
541
+ Enabled: true
542
+ Metrics/CollectionLiteralLength: # new in 1.47
543
+ Enabled: true
544
+ Naming/PredicateMethod: # new in 1.76
545
+ Enabled: true
546
+ Style/AmbiguousEndlessMethodDefinition: # new in 1.68
547
+ Enabled: true
548
+ Style/ArrayIntersect: # new in 1.40
549
+ Enabled: true
550
+ Style/BitwisePredicate: # new in 1.68
551
+ Enabled: true
552
+ Style/CollectionQuerying: # new in 1.77
553
+ Enabled: true
554
+ Style/CombinableDefined: # new in 1.68
555
+ Enabled: true
556
+ Style/ComparableBetween: # new in 1.74
557
+ Enabled: true
558
+ Style/ComparableClamp: # new in 1.44
559
+ Enabled: true
560
+ Style/ConcatArrayLiterals: # new in 1.41
561
+ Enabled: true
562
+ Style/DataInheritance: # new in 1.49
563
+ Enabled: true
564
+ Style/DigChain: # new in 1.69
565
+ Enabled: true
566
+ Style/DirEmpty: # new in 1.48
567
+ Enabled: true
568
+ Style/EmptyStringInsideInterpolation: # new in 1.76
569
+ Enabled: true
570
+ Style/ExactRegexpMatch: # new in 1.51
571
+ Enabled: true
572
+ Style/FileEmpty: # new in 1.48
573
+ Enabled: true
574
+ Style/FileNull: # new in 1.69
575
+ Enabled: true
576
+ Style/FileTouch: # new in 1.69
577
+ Enabled: true
578
+ Style/HashFetchChain: # new in 1.75
579
+ Enabled: true
580
+ Style/HashSlice: # new in 1.71
581
+ Enabled: true
582
+ Style/ItAssignment: # new in 1.70
583
+ Enabled: true
584
+ Style/ItBlockParameter: # new in 1.75
585
+ Enabled: true
586
+ Style/KeywordArgumentsMerging: # new in 1.68
587
+ Enabled: true
588
+ Style/MapIntoArray: # new in 1.63
589
+ Enabled: true
590
+ Style/MapToSet: # new in 1.42
591
+ Enabled: true
592
+ Style/MinMaxComparison: # new in 1.42
593
+ Enabled: true
594
+ Style/RedundantArrayConstructor: # new in 1.52
595
+ Enabled: true
596
+ Style/RedundantArrayFlatten: # new in 1.76
597
+ Enabled: true
598
+ Style/RedundantConstantBase: # new in 1.40
599
+ Enabled: true
600
+ Style/RedundantCurrentDirectoryInPath: # new in 1.53
601
+ Enabled: true
602
+ Style/RedundantDoubleSplatHashBraces: # new in 1.41
603
+ Enabled: true
604
+ Style/RedundantFilterChain: # new in 1.52
605
+ Enabled: true
606
+ Style/RedundantFormat: # new in 1.72
607
+ Enabled: true
608
+ Style/RedundantHeredocDelimiterQuotes: # new in 1.45
609
+ Enabled: true
610
+ Style/RedundantInterpolationUnfreeze: # new in 1.66
611
+ Enabled: true
612
+ Style/RedundantLineContinuation: # new in 1.49
613
+ Enabled: true
614
+ Style/RedundantRegexpArgument: # new in 1.53
615
+ Enabled: true
616
+ Style/RedundantRegexpConstructor: # new in 1.52
617
+ Enabled: true
618
+ Style/ReturnNilInPredicateMethodDefinition: # new in 1.53
619
+ Enabled: true
620
+ Style/SafeNavigationChainLength: # new in 1.68
621
+ Enabled: true
622
+ Style/SendWithLiteralMethodName: # new in 1.64
623
+ Enabled: true
624
+ Style/SingleLineDoEndBlock: # new in 1.57
625
+ Enabled: true
626
+ Style/SuperArguments: # new in 1.64
627
+ Enabled: true
628
+ Style/SuperWithArgsParentheses: # new in 1.58
629
+ Enabled: true
630
+ Style/YAMLFileRead: # new in 1.53
631
+ Enabled: true
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 2.7.4
1
+ ~> 3.3
data/CHANGES.md CHANGED
@@ -1,3 +1,8 @@
1
+ # 0.2.0 (2025-07-24)
2
+
3
+ - Update to support Ruby 3.3+.
4
+ - Update Rubocop & style changes.
5
+
1
6
  # 0.1.9 (2023-06-01)
2
7
 
3
8
  - `URIs#path_escape` now attempts to convert non-UTF-8 strings to UTF-8 rather than immediately
data/Dockerfile ADDED
@@ -0,0 +1,58 @@
1
+ # =============================================================================
2
+ # Target: base
3
+
4
+ FROM ruby:3.3-alpine AS base
5
+
6
+ RUN apk --no-cache --update upgrade && \
7
+ apk --no-cache add \
8
+ bash \
9
+ ca-certificates \
10
+ git \
11
+ libc6-compat \
12
+ openssl \
13
+ tzdata \
14
+ xz-libs \
15
+ yaml-dev \
16
+ && rm -rf /var/cache/apk/*
17
+
18
+ WORKDIR /opt/app
19
+
20
+ # =============================================================================
21
+ # Target: development
22
+ #
23
+
24
+ FROM base AS development
25
+
26
+ # Install system packages needed to build gems with C extensions.
27
+ RUN apk --update --no-cache add \
28
+ build-base \
29
+ coreutils \
30
+ git \
31
+ && rm -rf /var/cache/apk/*
32
+
33
+ # The base image ships an older bundler, but we want something more recent
34
+ RUN gem install bundler -v 2.5.22
35
+
36
+ # Copy codebase to WORKDIR. Unlike application projects, for a gem project
37
+ # we need to do this before running `bundle install`, in order for the gem
38
+ # we're building to be able to "install" itself.
39
+ COPY . .
40
+
41
+ # Install gems.
42
+ RUN bundle install --path=/usr/local/bundle
43
+
44
+ # =============================================================================
45
+ # Target: production
46
+
47
+ FROM base AS production
48
+
49
+ # Copy the built codebase from the dev stage
50
+ COPY --from=development /opt/app /opt/app
51
+ COPY --from=development /usr/local/bundle /usr/local/bundle
52
+
53
+ # Sanity-check that everything was installed correctly and still runs in the
54
+ # slimmed-down production image.
55
+ RUN bundle config set deployment 'true'
56
+ RUN bundle install --local --path=/usr/local/bundle
57
+
58
+ CMD ["bundle", "exec", "rake"]
@@ -2,14 +2,14 @@ File.expand_path('lib', __dir__).tap do |lib|
2
2
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
3
  end
4
4
 
5
- ruby_version = '>= 2.7'
5
+ ruby_version = '~> 3.3'
6
6
 
7
7
  require 'berkeley_library/util/module_info'
8
8
 
9
9
  Gem::Specification.new do |spec|
10
10
  spec.name = BerkeleyLibrary::Util::ModuleInfo::NAME
11
- spec.author = BerkeleyLibrary::Util::ModuleInfo::AUTHOR
12
- spec.email = BerkeleyLibrary::Util::ModuleInfo::AUTHOR_EMAIL
11
+ spec.author = BerkeleyLibrary::Util::ModuleInfo::AUTHORS
12
+ spec.email = BerkeleyLibrary::Util::ModuleInfo::AUTHOR_EMAILS
13
13
  spec.summary = BerkeleyLibrary::Util::ModuleInfo::SUMMARY
14
14
  spec.description = BerkeleyLibrary::Util::ModuleInfo::DESCRIPTION
15
15
  spec.license = BerkeleyLibrary::Util::ModuleInfo::LICENSE
@@ -21,19 +21,19 @@ Gem::Specification.new do |spec|
21
21
 
22
22
  spec.required_ruby_version = ruby_version
23
23
 
24
- spec.add_dependency 'berkeley_library-logging', '~> 0.2'
24
+ spec.add_dependency 'berkeley_library-logging', '~> 0.3'
25
25
  spec.add_dependency 'rest-client', '~> 2.1'
26
26
  spec.add_dependency 'typesafe_enum', '~> 0.3'
27
27
 
28
28
  spec.add_development_dependency 'ci_reporter_rspec', '~> 1.0'
29
- spec.add_development_dependency 'colorize', '~> 0.8'
29
+ spec.add_development_dependency 'colorize', '~> 1.0'
30
30
  spec.add_development_dependency 'dotenv', '~> 2.7'
31
31
  spec.add_development_dependency 'rake', '~> 13.0'
32
32
  spec.add_development_dependency 'rspec', '~> 3.10'
33
- spec.add_development_dependency 'rubocop', '= 1.39'
34
- spec.add_development_dependency 'rubocop-rake', '= 0.6.0'
35
- spec.add_development_dependency 'rubocop-rspec', '= 2.4.0'
36
- spec.add_development_dependency 'ruby-prof', '~> 0.17.0'
33
+ spec.add_development_dependency 'rubocop', '~> 1.78.0'
34
+ spec.add_development_dependency 'rubocop-rake', '~> 0.7.1'
35
+ spec.add_development_dependency 'rubocop-rspec', '~> 3.6.0'
36
+ spec.add_development_dependency 'ruby-prof'
37
37
  spec.add_development_dependency 'simplecov', '~> 0.21'
38
38
  spec.add_development_dependency 'webmock', '~> 3.12'
39
39
 
@@ -0,0 +1,10 @@
1
+ services:
2
+ gem:
3
+ build:
4
+ context: .
5
+ target: development
6
+ restart: always
7
+ volumes:
8
+ # Note that this mounts the *entire* repo directory (including
9
+ # files ignored in .dockerignore when building the image)
10
+ - ./:/opt/app
@@ -142,7 +142,7 @@ module BerkeleyLibrary
142
142
  shorter_unmatched = shorter[0...ix_s]
143
143
  longer_unmatched = longer[0...ix_l]
144
144
  all_unmatched = sort_by_first_and_flatten(shorter_unmatched, longer_unmatched)
145
- return (all_unmatched << v) + merge(shorter[ix_s + 1..], longer[ix_l + 1..])
145
+ return (all_unmatched << v) + merge(shorter[(ix_s + 1)..], longer[(ix_l + 1)..])
146
146
  end
147
147
 
148
148
  sort_by_first_and_flatten(longer, shorter)
@@ -2,12 +2,12 @@ module BerkeleyLibrary
2
2
  module Util
3
3
  class ModuleInfo
4
4
  NAME = 'berkeley_library-util'.freeze
5
- AUTHOR = 'David Moles'.freeze
6
- AUTHOR_EMAIL = 'dmoles@berkeley.edu'.freeze
5
+ AUTHORS = ['David Moles', 'maría a. matienzo'].freeze
6
+ AUTHOR_EMAILS = ['dmoles@berkeley.edu', 'matienzo@berkeley.edu'].freeze
7
7
  SUMMARY = 'Miscellaneous Ruby utilities for the UC Berkeley Library'.freeze
8
8
  DESCRIPTION = 'A collection of miscellaneous Ruby routines for the UC Berkeley Library.'.freeze
9
9
  LICENSE = 'MIT'.freeze
10
- VERSION = '0.1.9'.freeze
10
+ VERSION = '0.2.0'.freeze
11
11
  HOMEPAGE = 'https://github.com/BerkeleyLibrary/util'.freeze
12
12
  end
13
13
  end
@@ -8,7 +8,7 @@ module BerkeleyLibrary
8
8
  def ascii_numeric?(s)
9
9
  s.chars.all? do |c|
10
10
  ord = c.ord
11
- ord >= ASCII_0 && ord <= ASCII_9
11
+ ord.between?(ASCII_0, ASCII_9)
12
12
  end
13
13
  end
14
14
 
@@ -109,14 +109,14 @@ module BerkeleyLibrary
109
109
  nil
110
110
  end
111
111
 
112
- private
113
-
114
112
  # TODO: extend to cover other modes - host, zone, path, password, query, fragment
115
113
  # cf. https://github.com/golang/go/blob/master/src/net/url/url.go
116
114
  ALLOWED_BYTES_BY_MODE = {
117
115
  path_segment: [0x24, 0x26, 0x2b, 0x3a, 0x3d, 0x40] # @ & = + $
118
116
  }.freeze
119
117
 
118
+ private
119
+
120
120
  def should_escape?(b, mode)
121
121
  return false if unreserved?(b)
122
122
  return false if ALLOWED_BYTES_BY_MODE[mode].include?(b)
@@ -124,16 +124,14 @@ module BerkeleyLibrary
124
124
  true
125
125
  end
126
126
 
127
- # rubocop:disable Metrics/CyclomaticComplexity
128
127
  def unreserved?(byte)
129
- return true if byte >= 0x41 && byte <= 0x5a # A-Z
130
- return true if byte >= 0x61 && byte <= 0x7a # a-z
131
- return true if byte >= 0x30 && byte <= 0x39 # 0-9
128
+ return true if byte.between?(0x41, 0x5a) # A-Z
129
+ return true if byte.between?(0x61, 0x7a) # a-z
130
+ return true if byte.between?(0x30, 0x39) # 0-9
132
131
  return true if [0x2d, 0x2e, 0x5f, 0x7e].include?(byte) # - . _ ~
133
132
 
134
133
  false
135
134
  end
136
- # rubocop:enable Metrics/CyclomaticComplexity
137
135
  end
138
136
  end
139
137
  end
data/rakelib/.rubocop.yml CHANGED
@@ -1,4 +1,4 @@
1
1
  inherit_from: ../.rubocop.yml
2
2
 
3
- require:
3
+ plugins:
4
4
  - rubocop-rake
data/spec/.rubocop.yml CHANGED
@@ -1,6 +1,6 @@
1
1
  inherit_from: ../.rubocop.yml
2
2
 
3
- require:
3
+ plugins:
4
4
  - rubocop-rspec
5
5
 
6
6
  AllCops:
@@ -78,9 +78,12 @@ RSpec/ExpectInHook:
78
78
  Enabled: false
79
79
 
80
80
  # your naming scheme is not in possession of all the facts
81
- RSpec/FilePath:
81
+ RSpec/SpecFilePathFormat:
82
82
  Enabled: false
83
83
 
84
+ RSpec/SpecFilePathSuffix:
85
+ Enabled: true
86
+
84
87
  # explicit >>> implicit
85
88
  RSpec/InstanceVariable:
86
89
  Enabled: false
@@ -125,5 +128,3 @@ RSpec/VerifiedDoubles:
125
128
  RSpec/IdenticalEqualityAssertion: # new in 2.4
126
129
  Enabled: true
127
130
 
128
- RSpec/Rails/AvoidSetupHook: # new in 2.4
129
- Enabled: true
@@ -8,11 +8,11 @@ module BerkeleyLibrary::Util
8
8
  let(:sup) { %w[a b c d e] }
9
9
 
10
10
  it 'returns true for an identical subset' do
11
- expect(Arrays.ordered_superset?(superset: sup, subset: sup.dup)).to eq(true)
11
+ expect(Arrays.ordered_superset?(superset: sup, subset: sup.dup)).to be(true)
12
12
  end
13
13
 
14
14
  it 'returns true for an empty subset' do
15
- expect(Arrays.ordered_superset?(superset: sup, subset: [])).to eq(true)
15
+ expect(Arrays.ordered_superset?(superset: sup, subset: [])).to be(true)
16
16
  end
17
17
 
18
18
  it 'returns true for an exact sublist' do
@@ -22,7 +22,7 @@ module BerkeleyLibrary::Util
22
22
  %w[c d e]
23
23
  ]
24
24
  subs.each do |sub|
25
- expect(Arrays.ordered_superset?(superset: sup, subset: sub)).to eq(true)
25
+ expect(Arrays.ordered_superset?(superset: sup, subset: sub)).to be(true)
26
26
  end
27
27
  end
28
28
 
@@ -33,13 +33,13 @@ module BerkeleyLibrary::Util
33
33
  %w[a b d e]
34
34
  ]
35
35
  subs.each do |sub|
36
- expect(Arrays.ordered_superset?(superset: sup, subset: sub)).to eq(true)
36
+ expect(Arrays.ordered_superset?(superset: sup, subset: sub)).to be(true)
37
37
  end
38
38
  end
39
39
 
40
40
  it 'returns false for a too-large subset' do
41
41
  sub = %w[a b c d e f g]
42
- expect(Arrays.ordered_superset?(superset: sup, subset: sub)).to eq(false)
42
+ expect(Arrays.ordered_superset?(superset: sup, subset: sub)).to be(false)
43
43
  end
44
44
 
45
45
  it 'returns false when extra elements are present' do
@@ -49,7 +49,7 @@ module BerkeleyLibrary::Util
49
49
  %w[c d x e]
50
50
  ]
51
51
  subs.each do |sub|
52
- expect(Arrays.ordered_superset?(superset: sup, subset: sub)).to eq(false)
52
+ expect(Arrays.ordered_superset?(superset: sup, subset: sub)).to be(false)
53
53
  end
54
54
  end
55
55
  end
@@ -150,7 +150,6 @@ module BerkeleyLibrary::Util
150
150
  expect { Arrays.find_index(1, 2, 3, in_array: [1, 2, 3]) }.to raise_error(ArgumentError)
151
151
  end
152
152
 
153
- # rubocop:disable Lint/Void
154
153
  it 'returns an enumerator if given no arguments' do
155
154
  e = Arrays.find_index(in_array: arr)
156
155
  expect(e.each { |x| x > 3 }).to eq(2)
@@ -158,7 +157,6 @@ module BerkeleyLibrary::Util
158
157
  e = Arrays.find_index(in_array: arr, start_index: 3)
159
158
  expect(e.each { |x| x < 5 }).to eq(4)
160
159
  end
161
- # rubocop:enable Lint/Void
162
160
  end
163
161
 
164
162
  describe :merge do
@@ -181,7 +179,7 @@ module BerkeleyLibrary::Util
181
179
 
182
180
  merged = Arrays.merge(a1, a2)
183
181
  [a1, a2].each do |a|
184
- expect(Arrays.ordered_superset?(superset: merged, subset: a)).to eq(true), "merge(#{[a1.join, a2.join].inspect}): #{a.join} not found in #{merged.join}"
182
+ expect(Arrays.ordered_superset?(superset: merged, subset: a)).to be(true), "merge(#{[a1.join, a2.join].inspect}): #{a.join} not found in #{merged.join}"
185
183
  end
186
184
 
187
185
  expected = [1, 2, 2, 3, 4, 4, 5, 5, 6]
@@ -195,7 +193,7 @@ module BerkeleyLibrary::Util
195
193
 
196
194
  merged = Arrays.merge(a1, a2)
197
195
  [a1, a2].each do |a|
198
- expect(Arrays.ordered_superset?(superset: merged, subset: a)).to eq(true), "merge(#{[a1.join, a2.join].inspect}): #{a.join} not found in #{merged.join}"
196
+ expect(Arrays.ordered_superset?(superset: merged, subset: a)).to be(true), "merge(#{[a1.join, a2.join].inspect}): #{a.join} not found in #{merged.join}"
199
197
  end
200
198
 
201
199
  expected = [1, 2, 3, 4, 5, 7, 8, 9]
@@ -209,7 +207,7 @@ module BerkeleyLibrary::Util
209
207
 
210
208
  merged = Arrays.merge(a1, a2)
211
209
  [a1, a2].each do |a|
212
- expect(Arrays.ordered_superset?(superset: merged, subset: a)).to eq(true), "merge(#{[a1.join, a2.join].inspect}): #{a.join} not found in #{merged.join}"
210
+ expect(Arrays.ordered_superset?(superset: merged, subset: a)).to be(true), "merge(#{[a1.join, a2.join].inspect}): #{a.join} not found in #{merged.join}"
213
211
  end
214
212
 
215
213
  expected = [1, 2, 3, 2, 2, 4]
@@ -223,7 +221,7 @@ module BerkeleyLibrary::Util
223
221
 
224
222
  merged = Arrays.merge(a1, a2)
225
223
  [a1, a2].each do |a|
226
- expect(Arrays.ordered_superset?(superset: merged, subset: a)).to eq(true), "merge(#{[a1.join, a2.join].inspect}): #{a.join} not found in #{merged.join}"
224
+ expect(Arrays.ordered_superset?(superset: merged, subset: a)).to be(true), "merge(#{[a1.join, a2.join].inspect}): #{a.join} not found in #{merged.join}"
227
225
  end
228
226
 
229
227
  expected = [1, nil, 3, nil, nil, 4]
@@ -237,7 +235,7 @@ module BerkeleyLibrary::Util
237
235
 
238
236
  merged = Arrays.merge(a1, a2)
239
237
  [a1, a2].each do |a|
240
- expect(Arrays.ordered_superset?(superset: merged, subset: a)).to eq(true), "merge(#{[a1.join, a2.join].inspect}): #{a.join} not found in #{merged.join}"
238
+ expect(Arrays.ordered_superset?(superset: merged, subset: a)).to be(true), "merge(#{[a1.join, a2.join].inspect}): #{a.join} not found in #{merged.join}"
241
239
  end
242
240
 
243
241
  expected = [1, 'two', 3, 'two', 'two', 4]
@@ -251,7 +249,7 @@ module BerkeleyLibrary::Util
251
249
 
252
250
  merged = Arrays.merge(a1, a2)
253
251
  [a1, a2].each do |a|
254
- expect(Arrays.ordered_superset?(superset: merged, subset: a)).to eq(true), "merge(#{[a1.join, a2.join].inspect}): #{a.join} not found in #{merged.join}"
252
+ expect(Arrays.ordered_superset?(superset: merged, subset: a)).to be(true), "merge(#{[a1.join, a2.join].inspect}): #{a.join} not found in #{merged.join}"
255
253
  end
256
254
 
257
255
  expected = a2
@@ -267,7 +265,7 @@ module BerkeleyLibrary::Util
267
265
 
268
266
  merged = Arrays.merge(a1, a2)
269
267
  [a1, a2].each do |a|
270
- expect(Arrays.ordered_superset?(superset: merged, subset: a)).to eq(true), "merge(#{[a1.join, a2.join].inspect}): #{a.join} not found in #{merged.join}"
268
+ expect(Arrays.ordered_superset?(superset: merged, subset: a)).to be(true), "merge(#{[a1.join, a2.join].inspect}): #{a.join} not found in #{merged.join}"
271
269
  end
272
270
 
273
271
  expected = [1, 2, 3, 4, 5, 6, 9]
@@ -283,7 +281,7 @@ module BerkeleyLibrary::Util
283
281
 
284
282
  merged = Arrays.merge(a1, a2)
285
283
  [a1, a2].each do |a|
286
- expect(Arrays.ordered_superset?(superset: merged, subset: a)).to eq(true), "merge(#{[a1.join, a2.join].inspect}): #{a.join} not found in #{merged.join}"
284
+ expect(Arrays.ordered_superset?(superset: merged, subset: a)).to be(true), "merge(#{[a1.join, a2.join].inspect}): #{a.join} not found in #{merged.join}"
287
285
  end
288
286
 
289
287
  expected = [1, 6, 9, 2, 3, 4, 5]
@@ -299,7 +297,7 @@ module BerkeleyLibrary::Util
299
297
 
300
298
  merged = Arrays.merge(a1, a2)
301
299
  [a1, a2].each do |a|
302
- expect(Arrays.ordered_superset?(superset: merged, subset: a)).to eq(true), "merge(#{[a1.join, a2.join].inspect}): #{a.join} not found in #{merged.join}"
300
+ expect(Arrays.ordered_superset?(superset: merged, subset: a)).to be(true), "merge(#{[a1.join, a2.join].inspect}): #{a.join} not found in #{merged.join}"
303
301
  end
304
302
 
305
303
  expected = [1, 2, 3, 4, 5, 6, 9]
@@ -319,7 +317,7 @@ module BerkeleyLibrary::Util
319
317
 
320
318
  merged = Arrays.merge(a1, a2)
321
319
  [a1, a2].each do |a|
322
- expect(Arrays.ordered_superset?(superset: merged, subset: a)).to eq(true), "merge(#{[a1.join, a2.join].inspect}): #{a.join} not found in #{merged.join}"
320
+ expect(Arrays.ordered_superset?(superset: merged, subset: a)).to be(true), "merge(#{[a1.join, a2.join].inspect}): #{a.join} not found in #{merged.join}"
323
321
  end
324
322
  end
325
323
  end
@@ -14,42 +14,42 @@ module BerkeleyLibrary
14
14
  describe :file_exists? do
15
15
  it 'returns true for files that exist' do
16
16
  path = Pathname.new(tmpdir).join('exists').tap { |p| FileUtils.touch(p) }
17
- expect(path.exist?).to eq(true) # just to be sure
17
+ expect(path.exist?).to be(true) # just to be sure
18
18
  path_str = path.to_s
19
19
 
20
- expect(Files.file_exists?(path)).to eq(true)
21
- expect(Files.file_exists?(path_str)).to eq(true)
20
+ expect(Files.file_exists?(path)).to be(true)
21
+ expect(Files.file_exists?(path_str)).to be(true)
22
22
  end
23
23
 
24
24
  it 'returns false for files that do not exist' do
25
25
  path = Pathname.new(tmpdir).join('not-exists')
26
- expect(path.exist?).to eq(false) # just to be sure
26
+ expect(path.exist?).to be(false) # just to be sure
27
27
  path_str = path.to_s
28
28
 
29
- expect(Files.file_exists?(path)).to eq(false)
30
- expect(Files.file_exists?(path_str)).to eq(false)
29
+ expect(Files.file_exists?(path)).to be(false)
30
+ expect(Files.file_exists?(path_str)).to be(false)
31
31
  end
32
32
  end
33
33
 
34
34
  describe :parent_exists? do
35
35
  it 'returns true for paths whose parent exists' do
36
36
  parent = Pathname.new(tmpdir).join('parent').tap(&:mkdir)
37
- expect(parent.exist?).to eq(true) # just to be sure
37
+ expect(parent.exist?).to be(true) # just to be sure
38
38
  path = parent.join('child')
39
39
  path_str = path.to_s
40
40
 
41
- expect(Files.parent_exists?(path)).to eq(true)
42
- expect(Files.parent_exists?(path_str)).to eq(true)
41
+ expect(Files.parent_exists?(path)).to be(true)
42
+ expect(Files.parent_exists?(path_str)).to be(true)
43
43
  end
44
44
 
45
45
  it 'returns false for paths whose parent does not' do
46
46
  parent = Pathname.new(tmpdir).join('parent')
47
- expect(parent.exist?).to eq(false) # just to be sure
47
+ expect(parent.exist?).to be(false) # just to be sure
48
48
  path = parent.join('child')
49
49
  path_str = path.to_s
50
50
 
51
- expect(Files.parent_exists?(path)).to eq(false)
52
- expect(Files.parent_exists?(path_str)).to eq(false)
51
+ expect(Files.parent_exists?(path)).to be(false)
52
+ expect(Files.parent_exists?(path_str)).to be(false)
53
53
  end
54
54
  end
55
55
 
@@ -59,19 +59,19 @@ module BerkeleyLibrary
59
59
  FileUtils.touch(filename)
60
60
 
61
61
  File.open(filename, 'rb') do |out|
62
- expect(Files.reader_like?(out)).to eq(true)
62
+ expect(Files.reader_like?(out)).to be(true)
63
63
  end
64
64
  end
65
65
 
66
66
  it 'returns true for a StringIO' do
67
67
  out = StringIO.new
68
- expect(Files.reader_like?(out)).to eq(true)
68
+ expect(Files.reader_like?(out)).to be(true)
69
69
  end
70
70
 
71
71
  it 'returns true for a Tempfile' do
72
72
  out = Tempfile.new('out')
73
73
  begin
74
- expect(Files.reader_like?(out)).to eq(true)
74
+ expect(Files.reader_like?(out)).to be(true)
75
75
  ensure
76
76
  out.close
77
77
  out.unlink
@@ -79,7 +79,7 @@ module BerkeleyLibrary
79
79
  end
80
80
 
81
81
  it 'returns false for something that is not reader-like' do
82
- expect(Files.reader_like?('not an IO')).to eq(false)
82
+ expect(Files.reader_like?('not an IO')).to be(false)
83
83
  end
84
84
  end
85
85
 
@@ -88,19 +88,19 @@ module BerkeleyLibrary
88
88
  filename = File.join(tmpdir, 'out')
89
89
 
90
90
  File.open(filename, 'wb') do |out|
91
- expect(Files.writer_like?(out)).to eq(true)
91
+ expect(Files.writer_like?(out)).to be(true)
92
92
  end
93
93
  end
94
94
 
95
95
  it 'returns true for a StringIO' do
96
96
  out = StringIO.new
97
- expect(Files.writer_like?(out)).to eq(true)
97
+ expect(Files.writer_like?(out)).to be(true)
98
98
  end
99
99
 
100
100
  it 'returns true for a Tempfile' do
101
101
  out = Tempfile.new('out')
102
102
  begin
103
- expect(Files.writer_like?(out)).to eq(true)
103
+ expect(Files.writer_like?(out)).to be(true)
104
104
  ensure
105
105
  out.close
106
106
  out.unlink
@@ -108,7 +108,7 @@ module BerkeleyLibrary
108
108
  end
109
109
 
110
110
  it 'returns false for something that is not writer-like' do
111
- expect(Files.writer_like?('not an IO')).to eq(false)
111
+ expect(Files.writer_like?('not an IO')).to be(false)
112
112
  end
113
113
  end
114
114
  end
@@ -6,7 +6,7 @@ module BerkeleyLibrary
6
6
  describe :ascii_numeric do
7
7
  it 'returns true for ASCII numeric strings' do
8
8
  str = '8675309'
9
- expect(Strings.ascii_numeric?(str)).to eq(true)
9
+ expect(Strings.ascii_numeric?(str)).to be(true)
10
10
  end
11
11
 
12
12
  it 'returns false for non-ASCII numeric strings' do
@@ -16,7 +16,7 @@ module BerkeleyLibrary
16
16
  ]
17
17
  aggregate_failures 'non-ASCII numeric strings' do
18
18
  strs.each do |str|
19
- expect(Strings.ascii_numeric?(str)).to eq(false), "Expected #{str.inspect} to be non-ASCII-numeric"
19
+ expect(Strings.ascii_numeric?(str)).to be(false), "Expected #{str.inspect} to be non-ASCII-numeric"
20
20
  end
21
21
  end
22
22
  end
@@ -29,7 +29,7 @@ module BerkeleyLibrary
29
29
  ]
30
30
  aggregate_failures 'ASCII mixed numeric and non-numeric strings' do
31
31
  strs.each do |str|
32
- expect(Strings.ascii_numeric?(str)).to eq(false), "Expected #{str.inspect} to be non-ASCII-numeric"
32
+ expect(Strings.ascii_numeric?(str)).to be(false), "Expected #{str.inspect} to be non-ASCII-numeric"
33
33
  end
34
34
  end
35
35
  end
metadata CHANGED
@@ -1,14 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: berkeley_library-util
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.9
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Moles
8
+ - maría a. matienzo
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2023-06-01 00:00:00.000000000 Z
12
+ date: 2025-07-24 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: berkeley_library-logging
@@ -16,14 +17,14 @@ dependencies:
16
17
  requirements:
17
18
  - - "~>"
18
19
  - !ruby/object:Gem::Version
19
- version: '0.2'
20
+ version: '0.3'
20
21
  type: :runtime
21
22
  prerelease: false
22
23
  version_requirements: !ruby/object:Gem::Requirement
23
24
  requirements:
24
25
  - - "~>"
25
26
  - !ruby/object:Gem::Version
26
- version: '0.2'
27
+ version: '0.3'
27
28
  - !ruby/object:Gem::Dependency
28
29
  name: rest-client
29
30
  requirement: !ruby/object:Gem::Requirement
@@ -72,14 +73,14 @@ dependencies:
72
73
  requirements:
73
74
  - - "~>"
74
75
  - !ruby/object:Gem::Version
75
- version: '0.8'
76
+ version: '1.0'
76
77
  type: :development
77
78
  prerelease: false
78
79
  version_requirements: !ruby/object:Gem::Requirement
79
80
  requirements:
80
81
  - - "~>"
81
82
  - !ruby/object:Gem::Version
82
- version: '0.8'
83
+ version: '1.0'
83
84
  - !ruby/object:Gem::Dependency
84
85
  name: dotenv
85
86
  requirement: !ruby/object:Gem::Requirement
@@ -126,58 +127,58 @@ dependencies:
126
127
  name: rubocop
127
128
  requirement: !ruby/object:Gem::Requirement
128
129
  requirements:
129
- - - '='
130
+ - - "~>"
130
131
  - !ruby/object:Gem::Version
131
- version: '1.39'
132
+ version: 1.78.0
132
133
  type: :development
133
134
  prerelease: false
134
135
  version_requirements: !ruby/object:Gem::Requirement
135
136
  requirements:
136
- - - '='
137
+ - - "~>"
137
138
  - !ruby/object:Gem::Version
138
- version: '1.39'
139
+ version: 1.78.0
139
140
  - !ruby/object:Gem::Dependency
140
141
  name: rubocop-rake
141
142
  requirement: !ruby/object:Gem::Requirement
142
143
  requirements:
143
- - - '='
144
+ - - "~>"
144
145
  - !ruby/object:Gem::Version
145
- version: 0.6.0
146
+ version: 0.7.1
146
147
  type: :development
147
148
  prerelease: false
148
149
  version_requirements: !ruby/object:Gem::Requirement
149
150
  requirements:
150
- - - '='
151
+ - - "~>"
151
152
  - !ruby/object:Gem::Version
152
- version: 0.6.0
153
+ version: 0.7.1
153
154
  - !ruby/object:Gem::Dependency
154
155
  name: rubocop-rspec
155
156
  requirement: !ruby/object:Gem::Requirement
156
157
  requirements:
157
- - - '='
158
+ - - "~>"
158
159
  - !ruby/object:Gem::Version
159
- version: 2.4.0
160
+ version: 3.6.0
160
161
  type: :development
161
162
  prerelease: false
162
163
  version_requirements: !ruby/object:Gem::Requirement
163
164
  requirements:
164
- - - '='
165
+ - - "~>"
165
166
  - !ruby/object:Gem::Version
166
- version: 2.4.0
167
+ version: 3.6.0
167
168
  - !ruby/object:Gem::Dependency
168
169
  name: ruby-prof
169
170
  requirement: !ruby/object:Gem::Requirement
170
171
  requirements:
171
- - - "~>"
172
+ - - ">="
172
173
  - !ruby/object:Gem::Version
173
- version: 0.17.0
174
+ version: '0'
174
175
  type: :development
175
176
  prerelease: false
176
177
  version_requirements: !ruby/object:Gem::Requirement
177
178
  requirements:
178
- - - "~>"
179
+ - - ">="
179
180
  - !ruby/object:Gem::Version
180
- version: 0.17.0
181
+ version: '0'
181
182
  - !ruby/object:Gem::Dependency
182
183
  name: simplecov
183
184
  requirement: !ruby/object:Gem::Requirement
@@ -207,12 +208,15 @@ dependencies:
207
208
  - !ruby/object:Gem::Version
208
209
  version: '3.12'
209
210
  description: A collection of miscellaneous Ruby routines for the UC Berkeley Library.
210
- email: dmoles@berkeley.edu
211
+ email:
212
+ - dmoles@berkeley.edu
213
+ - matienzo@berkeley.edu
211
214
  executables: []
212
215
  extensions: []
213
216
  extra_rdoc_files: []
214
217
  files:
215
218
  - ".github/workflows/build.yml"
219
+ - ".github/workflows/gem-push.yml"
216
220
  - ".gitignore"
217
221
  - ".idea/.gitignore"
218
222
  - ".idea/inspectionProfiles/Project_Default.xml"
@@ -225,11 +229,13 @@ files:
225
229
  - ".simplecov"
226
230
  - ".yardopts"
227
231
  - CHANGES.md
232
+ - Dockerfile
228
233
  - Gemfile
229
234
  - LICENSE.md
230
235
  - README.md
231
236
  - Rakefile
232
237
  - berkeley_library-util.gemspec
238
+ - docker-compose.yml
233
239
  - lib/berkeley_library/util.rb
234
240
  - lib/berkeley_library/util/arrays.rb
235
241
  - lib/berkeley_library/util/files.rb
@@ -272,16 +278,16 @@ require_paths:
272
278
  - lib
273
279
  required_ruby_version: !ruby/object:Gem::Requirement
274
280
  requirements:
275
- - - ">="
281
+ - - "~>"
276
282
  - !ruby/object:Gem::Version
277
- version: '2.7'
283
+ version: '3.3'
278
284
  required_rubygems_version: !ruby/object:Gem::Requirement
279
285
  requirements:
280
286
  - - ">="
281
287
  - !ruby/object:Gem::Version
282
288
  version: '0'
283
289
  requirements: []
284
- rubygems_version: 3.1.6
290
+ rubygems_version: 3.5.22
285
291
  signing_key:
286
292
  specification_version: 4
287
293
  summary: Miscellaneous Ruby utilities for the UC Berkeley Library