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 +4 -4
- data/.github/workflows/build.yml +3 -3
- data/.github/workflows/gem-push.yml +33 -0
- data/.rubocop.yml +138 -0
- data/.ruby-version +1 -1
- data/CHANGES.md +5 -0
- data/Dockerfile +58 -0
- data/berkeley_library-util.gemspec +9 -9
- data/docker-compose.yml +10 -0
- data/lib/berkeley_library/util/arrays.rb +1 -1
- data/lib/berkeley_library/util/module_info.rb +3 -3
- data/lib/berkeley_library/util/strings.rb +1 -1
- data/lib/berkeley_library/util/uris.rb +5 -7
- data/rakelib/.rubocop.yml +1 -1
- data/spec/.rubocop.yml +5 -4
- data/spec/berkeley_library/util/arrays_spec.rb +16 -18
- data/spec/berkeley_library/util/files_spec.rb +20 -20
- data/spec/berkeley_library/util/strings_spec.rb +3 -3
- metadata +32 -26
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3f343b3b9dc12a94f77d0a672e3d61f90ccb637f4217238b9a5b7358d658c860
|
4
|
+
data.tar.gz: 94ce31eb5eeb374fda410f3b984ce26ca4e070635415b2aa8afa38c33a9ceefa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 25a2f1d770068ed5d54e70c359dc574958c2438f872ae466c07c9dbf9dfd8c4c033aca4cbadec1f45c8cb886ba5cdf3b626e1ab5131d3bebba94325975dc70b3
|
7
|
+
data.tar.gz: 22607a4573f7f85cdbde5dcb997d7b3b5fc0480262faad923ac3b01bcc6cca0c301c4746eeb9195ff8054b6b00ac56a030a0c566348278086b48603172c1823b
|
data/.github/workflows/build.yml
CHANGED
@@ -6,7 +6,7 @@ jobs:
|
|
6
6
|
fail-fast: false
|
7
7
|
matrix:
|
8
8
|
os: [ ubuntu-latest, macos-latest ]
|
9
|
-
ruby: [ '
|
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@
|
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
|
-
|
1
|
+
~> 3.3
|
data/CHANGES.md
CHANGED
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 = '
|
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::
|
12
|
-
spec.email = BerkeleyLibrary::Util::ModuleInfo::
|
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.
|
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
|
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', '
|
34
|
-
spec.add_development_dependency 'rubocop-rake', '
|
35
|
-
spec.add_development_dependency 'rubocop-rspec', '
|
36
|
-
spec.add_development_dependency 'ruby-prof'
|
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
|
|
data/docker-compose.yml
ADDED
@@ -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
|
-
|
6
|
-
|
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.
|
10
|
+
VERSION = '0.2.0'.freeze
|
11
11
|
HOMEPAGE = 'https://github.com/BerkeleyLibrary/util'.freeze
|
12
12
|
end
|
13
13
|
end
|
@@ -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
|
130
|
-
return true if byte
|
131
|
-
return true if byte
|
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
data/spec/.rubocop.yml
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
inherit_from: ../.rubocop.yml
|
2
2
|
|
3
|
-
|
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/
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
21
|
-
expect(Files.file_exists?(path_str)).to
|
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
|
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
|
30
|
-
expect(Files.file_exists?(path_str)).to
|
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
|
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
|
42
|
-
expect(Files.parent_exists?(path_str)).to
|
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
|
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
|
52
|
-
expect(Files.parent_exists?(path_str)).to
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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.
|
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:
|
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.
|
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.
|
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
|
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
|
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:
|
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:
|
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.
|
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.
|
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:
|
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:
|
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
|
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
|
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:
|
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: '
|
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.
|
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
|