From fcd968cfeabc24cf291353c7e201827f3786cccd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20A=2E=20Matienzo?= Date: Wed, 5 Nov 2025 16:20:37 -0800 Subject: [PATCH 1/4] update to ruby 3.3+ and more recent versions of core dependencies --- Dockerfile | 6 +++++- av_core.gemspec | 10 +++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/Dockerfile b/Dockerfile index e3786d9..d2488bc 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ # ============================================================================= # Target: base -FROM ruby:3.0.2-alpine AS base +FROM ruby:3.3-alpine AS base RUN apk --no-cache --update upgrade && \ apk --no-cache add \ @@ -12,6 +12,7 @@ RUN apk --no-cache --update upgrade && \ openssl \ tzdata \ xz-libs \ + yaml-dev \ && rm -rf /var/cache/apk/* WORKDIR /opt/app @@ -29,6 +30,9 @@ RUN apk --update --no-cache add \ git \ && rm -rf /var/cache/apk/* +# The base image ships an older bundler, but we want something more recent +RUN gem install bundler -v 2.5.22 + # Copy codebase to WORKDIR. Unlike application projects, for a gem project # we need to do this before running `bundle install`, in order for the gem # we're building to be able to "install" itself. diff --git a/av_core.gemspec b/av_core.gemspec index 9373014..269bbdb 100644 --- a/av_core.gemspec +++ b/av_core.gemspec @@ -26,22 +26,22 @@ Gem::Specification.new do |spec| spec.add_dependency 'berkeley_library-logging', '~> 0.2' spec.add_dependency 'berkeley_library-marc', '~> 0.2', '>= 0.2.1' - spec.add_dependency 'berkeley_library-util', '~> 0.1', '>= 0.1.1' + spec.add_dependency 'berkeley_library-util', '~> 0.2' spec.add_dependency 'ruby-marc-spec', '~> 0.1', '>= 0.1.3' spec.add_dependency 'typesafe_enum', '~> 0.3' spec.add_development_dependency 'brakeman', '~> 4.9' spec.add_development_dependency 'bundle-audit', '~> 0.1' spec.add_development_dependency 'ci_reporter_rspec', '~> 1.0' - spec.add_development_dependency 'colorize', '~> 0.8' + spec.add_development_dependency 'colorize', '~> 1.0' spec.add_development_dependency 'dotenv', '~> 2.7' spec.add_development_dependency 'irb', '~> 1.2' # workaroundfor https://github.com/bundler/bundler/issues/6929 spec.add_development_dependency 'listen', '>= 3.0.5', '< 3.2' spec.add_development_dependency 'rake', '~> 13.0' spec.add_development_dependency 'rspec-support', '~> 3.9' - spec.add_development_dependency 'rubocop', '1.26.0' - spec.add_development_dependency 'rubocop-rake', '~> 0.6.0' - spec.add_development_dependency 'rubocop-rspec', '~> 2.4.0' + spec.add_development_dependency 'rubocop', '1.81.7' + spec.add_development_dependency 'rubocop-rake', '~> 0.7.1' + spec.add_development_dependency 'rubocop-rspec', '~> 3.7.0' spec.add_development_dependency 'simplecov', '~> 0.21' spec.add_development_dependency 'simplecov-rcov', '~> 0.2' spec.add_development_dependency 'webmock', '~> 3.8' From 0e4dd425a0796b3e5a610dc4d093c7df52d2e9a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20A=2E=20Matienzo?= Date: Wed, 5 Nov 2025 16:21:42 -0800 Subject: [PATCH 2/4] rubocop: enable new cops --- .rubocop.yml | 188 +++++++++++++++++++++++++++++++++++++++++++++- spec/.rubocop.yml | 10 +-- 2 files changed, 191 insertions(+), 7 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index aef12b5..b5ceb74 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -102,6 +102,13 @@ Style/SingleLineBlockParams: Style/SafeNavigation: Enabled: false +# disable newer cops that require some cleanup +Gemspec/DevelopmentDependencies: # new in 1.44 + Enabled: false + +Gemspec/DeprecatedAttributeAssignment: # (new in 1.10) + Enabled: false + ############################################################ # Enable newer cops @@ -187,8 +194,6 @@ Lint/TripleQuotes: # (new in 1.9) Enabled: true Style/IfWithBooleanLiteralBranches: # (new in 1.9) Enabled: true -Gemspec/DateAssignment: # (new in 1.10) - Enabled: true Style/HashConversion: # (new in 1.10) Enabled: true Style/StringChars: # (new in 1.12) @@ -239,3 +244,182 @@ Style/MapToHash: # new in 1.24 Enabled: true Style/NestedFileDirname: # new in 1.26 Enabled: true + +# newer cops + +Gemspec/AddRuntimeDependency: # new in 1.65 + Enabled: true +Gemspec/AttributeAssignment: # new in 1.77 + Enabled: true +Layout/EmptyLinesAfterModuleInclusion: # new in 1.79 + Enabled: true +Layout/LineContinuationLeadingSpace: # new in 1.31 + Enabled: true +Layout/LineContinuationSpacing: # new in 1.31 + Enabled: true +Lint/ArrayLiteralInRegexp: # new in 1.71 + Enabled: true +Lint/ConstantOverwrittenInRescue: # new in 1.31 + Enabled: true +Lint/ConstantReassignment: # new in 1.70 + Enabled: true +Lint/CopDirectiveSyntax: # new in 1.72 + Enabled: true +Lint/DuplicateMagicComment: # new in 1.37 + Enabled: true +Lint/DuplicateMatchPattern: # new in 1.50 + Enabled: true +Lint/DuplicateSetElement: # new in 1.67 + Enabled: true +Lint/HashNewWithKeywordArgumentsAsDefault: # new in 1.69 + Enabled: true +Lint/ItWithoutArgumentsInBlock: # new in 1.59 + Enabled: true +Lint/LiteralAssignmentInCondition: # new in 1.58 + Enabled: true +Lint/MixedCaseRange: # new in 1.53 + Enabled: true +Lint/NonAtomicFileOperation: # new in 1.31 + Enabled: true +Lint/NumericOperationWithConstantResult: # new in 1.69 + Enabled: true +Lint/RedundantRegexpQuantifiers: # new in 1.53 + Enabled: true +Lint/RedundantTypeConversion: # new in 1.72 + Enabled: true +Lint/RefinementImportMethods: # new in 1.27 + Enabled: true +Lint/RequireRangeParentheses: # new in 1.32 + Enabled: true +Lint/SharedMutableDefault: # new in 1.70 + Enabled: true +Lint/SuppressedExceptionInNumberConversion: # new in 1.72 + Enabled: true +Lint/UnescapedBracketInRegexp: # new in 1.68 + Enabled: true +Lint/UselessConstantScoping: # new in 1.72 + Enabled: true +Lint/UselessDefaultValueArgument: # new in 1.76 + Enabled: true +Lint/UselessDefined: # new in 1.69 + Enabled: true +Lint/UselessNumericOperation: # new in 1.66 + Enabled: true +Lint/UselessOr: # new in 1.76 + Enabled: true +Lint/UselessRescue: # new in 1.43 + Enabled: true +Metrics/CollectionLiteralLength: # new in 1.47 + Enabled: true +Naming/PredicateMethod: # new in 1.76 + Enabled: true +Security/CompoundHash: # new in 1.28 + Enabled: true +Style/AmbiguousEndlessMethodDefinition: # new in 1.68 + Enabled: true +Style/ArrayIntersect: # new in 1.40 + Enabled: true +Style/ArrayIntersectWithSingleElement: # new in 1.81 + Enabled: true +Style/BitwisePredicate: # new in 1.68 + Enabled: true +Style/CollectionQuerying: # new in 1.77 + Enabled: true +Style/CombinableDefined: # new in 1.68 + Enabled: true +Style/ComparableBetween: # new in 1.74 + Enabled: true +Style/ComparableClamp: # new in 1.44 + Enabled: true +Style/ConcatArrayLiterals: # new in 1.41 + Enabled: true +Style/DataInheritance: # new in 1.49 + Enabled: true +Style/DigChain: # new in 1.69 + Enabled: true +Style/DirEmpty: # new in 1.48 + Enabled: true +Style/EmptyHeredoc: # new in 1.32 + Enabled: true +Style/EmptyStringInsideInterpolation: # new in 1.76 + Enabled: true +Style/EnvHome: # new in 1.29 + Enabled: true +Style/ExactRegexpMatch: # new in 1.51 + Enabled: true +Style/FetchEnvVar: # new in 1.28 + Enabled: true +Style/FileEmpty: # new in 1.48 + Enabled: true +Style/FileNull: # new in 1.69 + Enabled: true +Style/FileTouch: # new in 1.69 + Enabled: true +Style/HashFetchChain: # new in 1.75 + Enabled: true +Style/HashSlice: # new in 1.71 + Enabled: true +Style/ItAssignment: # new in 1.70 + Enabled: true +Style/ItBlockParameter: # new in 1.75 + Enabled: true +Style/KeywordArgumentsMerging: # new in 1.68 + Enabled: true +Style/MagicCommentFormat: # new in 1.35 + Enabled: true +Style/MapCompactWithConditionalBlock: # new in 1.30 + Enabled: true +Style/MapIntoArray: # new in 1.63 + Enabled: true +Style/MapToSet: # new in 1.42 + Enabled: true +Style/MinMaxComparison: # new in 1.42 + Enabled: true +Style/ObjectThen: # new in 1.28 + Enabled: true +Style/OperatorMethodCall: # new in 1.37 + Enabled: true +Style/RedundantArrayConstructor: # new in 1.52 + Enabled: true +Style/RedundantArrayFlatten: # new in 1.76 + Enabled: true +Style/RedundantConstantBase: # new in 1.40 + Enabled: true +Style/RedundantCurrentDirectoryInPath: # new in 1.53 + Enabled: true +Style/RedundantDoubleSplatHashBraces: # new in 1.41 + Enabled: true +Style/RedundantEach: # new in 1.38 + Enabled: true +Style/RedundantFilterChain: # new in 1.52 + Enabled: true +Style/RedundantFormat: # new in 1.72 + Enabled: true +Style/RedundantHeredocDelimiterQuotes: # new in 1.45 + Enabled: true +Style/RedundantInitialize: # new in 1.27 + Enabled: true +Style/RedundantInterpolationUnfreeze: # new in 1.66 + Enabled: true +Style/RedundantLineContinuation: # new in 1.49 + Enabled: true +Style/RedundantRegexpArgument: # new in 1.53 + Enabled: true +Style/RedundantRegexpConstructor: # new in 1.52 + Enabled: true +Style/RedundantStringEscape: # new in 1.37 + Enabled: true +Style/ReturnNilInPredicateMethodDefinition: # new in 1.53 + Enabled: true +Style/SafeNavigationChainLength: # new in 1.68 + Enabled: true +Style/SendWithLiteralMethodName: # new in 1.64 + Enabled: true +Style/SingleLineDoEndBlock: # new in 1.57 + Enabled: true +Style/SuperArguments: # new in 1.64 + Enabled: true +Style/SuperWithArgsParentheses: # new in 1.58 + Enabled: true +Style/YAMLFileRead: # new in 1.53 + Enabled: true diff --git a/spec/.rubocop.yml b/spec/.rubocop.yml index 74da3ec..20f3fc0 100644 --- a/spec/.rubocop.yml +++ b/spec/.rubocop.yml @@ -1,6 +1,6 @@ inherit_from: ../.rubocop.yml -require: +plugins: - rubocop-rspec Layout/LineLength: @@ -65,7 +65,10 @@ RSpec/ExpectInHook: Enabled: false # your naming scheme is not in possession of all the facts -RSpec/FilePath: +RSpec/SpecFilePathFormat: + Enabled: false + +RSpec/SpecFilePathSuffix: Enabled: false # explicit >>> implicit @@ -111,6 +114,3 @@ RSpec/VerifiedDoubles: RSpec/IdenticalEqualityAssertion: # new in 2.4 Enabled: true - -RSpec/Rails/AvoidSetupHook: # new in 2.4 - Enabled: true From 97d07fb7135060e24173113faa54a9787a95d8e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20A=2E=20Matienzo?= Date: Wed, 5 Nov 2025 16:22:01 -0800 Subject: [PATCH 3/4] rubocop: address style issues --- lib/berkeley_library/av/metadata/field.rb | 2 +- lib/berkeley_library/av/metadata/fields.rb | 2 +- lib/berkeley_library/av/metadata/source.rb | 9 ++- lib/berkeley_library/av/track.rb | 4 +- spec/lib/berkeley_library/av/config_spec.rb | 24 +++---- .../av/metadata/metadata_spec.rb | 68 +++++++++---------- spec/lib/berkeley_library/av/record_spec.rb | 16 +++-- spec/lib/berkeley_library/av/track_spec.rb | 16 ++--- 8 files changed, 71 insertions(+), 70 deletions(-) diff --git a/lib/berkeley_library/av/metadata/field.rb b/lib/berkeley_library/av/metadata/field.rb index 5c0409c..61a6512 100644 --- a/lib/berkeley_library/av/metadata/field.rb +++ b/lib/berkeley_library/av/metadata/field.rb @@ -48,7 +48,7 @@ def same_metadata?(other) raise ArgumentError, "Not a #{class_name(self)}: #{other}" unless other.is_a?(Field) %i[tag query subfields_separator subfield_order].all? do |attr| - (other.respond_to?(attr) && send(attr) == other.send(attr)) + other.respond_to?(attr) && send(attr) == other.send(attr) end end diff --git a/lib/berkeley_library/av/metadata/fields.rb b/lib/berkeley_library/av/metadata/fields.rb index c246abc..e447881 100644 --- a/lib/berkeley_library/av/metadata/fields.rb +++ b/lib/berkeley_library/av/metadata/fields.rb @@ -75,7 +75,7 @@ def to_field(json_field) label: json_field['labels']['en'], tag:, spec: marc_spec, - subfields_separator: (params['subfields_separator'] || ' '), + subfields_separator: params['subfields_separator'] || ' ', subfield_order: params['subfield_order'].to_s.split(',') ) end diff --git a/lib/berkeley_library/av/metadata/source.rb b/lib/berkeley_library/av/metadata/source.rb index dbc4b15..cef7d65 100644 --- a/lib/berkeley_library/av/metadata/source.rb +++ b/lib/berkeley_library/av/metadata/source.rb @@ -34,7 +34,8 @@ def name def catalog_link_text return LINK_TEXT_ALMA if self == ALMA - return LINK_TEXT_TIND if self == TIND + + LINK_TEXT_TIND if self == TIND end def display_uri_for(metadata) @@ -46,7 +47,8 @@ def display_uri_for(metadata) def find_bib_number(metadata) return alma_bib_number(metadata.marc_record) if self == Source::ALMA - return tind_bib_number(metadata.marc_record) if self == Source::TIND + + tind_bib_number(metadata.marc_record) if self == Source::TIND end private @@ -58,7 +60,8 @@ def canonical_record_id_for(metadata) def canonical_record_id_accessor return :alma_id if self == ALMA - return :tind_id if self == TIND + + :tind_id if self == TIND end def tind_bib_number(marc_record) diff --git a/lib/berkeley_library/av/track.rb b/lib/berkeley_library/av/track.rb index 1605959..e44f39d 100644 --- a/lib/berkeley_library/av/track.rb +++ b/lib/berkeley_library/av/track.rb @@ -35,7 +35,7 @@ def to_s end def inspect - "\#<#{self.class.name} #{self}>" + "#<#{self.class.name} #{self}>" end # @return [Array] @@ -90,7 +90,7 @@ def group_values(subfields) end def group_subfields(subfields) - single_track = subfields.lazy.select { |sf| sf.code.to_sym == SUBFIELD_CODE_PATH }.one? + single_track = subfields.lazy.one? { |sf| sf.code.to_sym == SUBFIELD_CODE_PATH } return [group_together(subfields)] if single_track group_on_paths(subfields) diff --git a/spec/lib/berkeley_library/av/config_spec.rb b/spec/lib/berkeley_library/av/config_spec.rb index 3e4dca6..6156184 100644 --- a/spec/lib/berkeley_library/av/config_spec.rb +++ b/spec/lib/berkeley_library/av/config_spec.rb @@ -11,7 +11,7 @@ module AV describe :configured? do it 'defaults to false' do - expect(AV.configured?).to eq(false) + expect(AV.configured?).to be(false) end it 'returns true if and only if all values are configured' do @@ -25,12 +25,12 @@ module AV wowza_base_uri: 'http://wowza.example.edu' } settings.each { |setting, value| Config.send("#{setting}=", value) } - expect(AV.configured?).to eq(true) + expect(AV.configured?).to be(true) aggregate_failures do settings.each do |setting, value| - Config.instance_variable_set("@#{setting}".to_sym, nil) - expect(AV.configured?).to eq(false), "Clearing #{setting} did not set configured? to false" + Config.instance_variable_set(:"@#{setting}", nil) + expect(AV.configured?).to be(false), "Clearing #{setting} did not set configured? to false" Config.send("#{setting}=", value) end end @@ -49,8 +49,7 @@ module AV rails_config = Struct.new(*settings.keys, keyword_init: true).new(**settings) # Mock Rails config - expect(defined?(Rails)).to be_nil # just to be sure - Object.send(:const_set, 'Rails', Struct.new(:application).new) + stub_const('Rails', Struct.new(:application).new) Rails.application = Struct.new(:config).new Rails.application.config = rails_config @@ -60,9 +59,8 @@ module AV end end - expect(AV.configured?).to eq(true) - ensure - Object.send(:remove_const, 'Rails') + expect(AV.configured?).to be(true) + end end @@ -100,7 +98,7 @@ module AV expected = [] settings.each_key do |setting| - Config.instance_variable_set("@#{setting}".to_sym, nil) + Config.instance_variable_set(:"@#{setting}", nil) expected << setting expect(Config.missing).to eq(expected) end @@ -246,11 +244,7 @@ module AV rails = double(Object) allow(rails).to receive(:application).and_return(application) - Object.const_set(:Rails, rails) - end - - after do - Object.send(:remove_const, :Rails) + stub_const('Rails', rails) end describe :avplayer_base_uri do diff --git a/spec/lib/berkeley_library/av/metadata/metadata_spec.rb b/spec/lib/berkeley_library/av/metadata/metadata_spec.rb index 9e50700..81b738e 100644 --- a/spec/lib/berkeley_library/av/metadata/metadata_spec.rb +++ b/spec/lib/berkeley_library/av/metadata/metadata_spec.rb @@ -44,28 +44,28 @@ module AV bib_number = 'b18538031' stub_sru_request(bib_number) metadata = Metadata.for_record(record_id: bib_number) - expect(metadata.calnet_or_ip?).to eq(true) + expect(metadata.calnet_or_ip?).to be(true) end it 'detects restricted video' do bib_number = 'b25207857' stub_sru_request(bib_number) metadata = Metadata.for_record(record_id: bib_number) - expect(metadata.calnet_or_ip?).to eq(true) + expect(metadata.calnet_or_ip?).to be(true) end it 'detects CalNet restrictions' do bib_number = 'b24659129' stub_sru_request(bib_number) metadata = Metadata.for_record(record_id: bib_number) - expect(metadata.calnet_or_ip?).to eq(true) + expect(metadata.calnet_or_ip?).to be(true) end it 'detects unrestricted audio' do bib_number = 'b23161018' stub_sru_request(bib_number) metadata = Metadata.for_record(record_id: bib_number) - expect(metadata.calnet_or_ip?).to eq(false) + expect(metadata.calnet_or_ip?).to be(false) end end @@ -75,89 +75,89 @@ module AV bib_number = 'b18538031' stub_sru_request(bib_number) metadata = Metadata.for_record(record_id: bib_number) - expect(metadata.calnet_or_ip?).to eq(true) + expect(metadata.calnet_or_ip?).to be(true) end it 'finds "UCB Access" (capitalized)' do bib_number = 'b25716973' stub_sru_request(bib_number) metadata = Metadata.for_record(record_id: bib_number) - expect(metadata.calnet_or_ip?).to eq(true) - expect(metadata.calnet_only?).to eq(false) + expect(metadata.calnet_or_ip?).to be(true) + expect(metadata.calnet_only?).to be(false) end it 'returns "Requires CalNet"' do bib_number = 'b24659129' stub_sru_request(bib_number) metadata = Metadata.for_record(record_id: bib_number) - expect(metadata.calnet_or_ip?).to eq(true) - expect(metadata.calnet_only?).to eq(true) + expect(metadata.calnet_or_ip?).to be(true) + expect(metadata.calnet_only?).to be(true) end it 'returns "Freely available" for unrestricted audio' do bib_number = 'b23161018' stub_sru_request(bib_number) metadata = Metadata.for_record(record_id: bib_number) - expect(metadata.calnet_or_ip?).to eq(false) - expect(metadata.calnet_only?).to eq(false) + expect(metadata.calnet_or_ip?).to be(false) + expect(metadata.calnet_only?).to be(false) end it 'extracts UCB restrictions from a TIND 856' do marc_record = MARC::XMLReader.new('spec/data/record-(cityarts)00002.xml').first metadata = Metadata.new(record_id: 'record-(cityarts)00002', source: Metadata::Source::TIND, marc_record:) - expect(metadata.calnet_or_ip?).to eq(true) - expect(metadata.calnet_only?).to eq(false) + expect(metadata.calnet_or_ip?).to be(true) + expect(metadata.calnet_only?).to be(false) end it 'extracts UCB restrictions from an Alma 956' do marc_record = MARC::XMLReader.new('spec/data/alma/991054360089706532-sru.xml').first metadata = Metadata.new(record_id: '991047179369706532', source: Metadata::Source::ALMA, marc_record:) - expect(metadata.calnet_or_ip?).to eq(true) - expect(metadata.calnet_only?).to eq(false) + expect(metadata.calnet_or_ip?).to be(true) + expect(metadata.calnet_only?).to be(false) end it 'extracts CalNet restrictions from an Alma 956' do marc_record = MARC::XMLReader.new('spec/data/alma/991047179369706532-sru.xml').first metadata = Metadata.new(record_id: '991054360089706532', source: Metadata::Source::ALMA, marc_record:) - expect(metadata.calnet_or_ip?).to eq(true) - expect(metadata.calnet_only?).to eq(true) + expect(metadata.calnet_or_ip?).to be(true) + expect(metadata.calnet_only?).to be(true) end it 'extracts restrictions from a 998$r' do marc_record = MARC::XMLReader.new('spec/data/alma/991005939359706532-sru.xml').first metadata = Metadata.new(record_id: '991005939359706532', source: Metadata::Source::ALMA, marc_record:) - expect(metadata.calnet_or_ip?).to eq(false) # just to be sure - expect(metadata.calnet_only?).to eq(false) # just to be sure + expect(metadata.calnet_or_ip?).to be(false) # just to be sure + expect(metadata.calnet_only?).to be(false) # just to be sure marc_record['998'].append(MARC::Subfield.new('r', 'UCB access. Requires CalNet.')) metadata = Metadata.new(record_id: '991005939359706532', source: Metadata::Source::ALMA, marc_record:) - expect(metadata.calnet_or_ip?).to eq(true) - expect(metadata.calnet_only?).to eq(true) + expect(metadata.calnet_or_ip?).to be(true) + expect(metadata.calnet_only?).to be(true) end it 'extracts restrictions from multiple subfields 998$r' do marc_record = MARC::XMLReader.new('spec/data/alma/991005939359706532-sru.xml').first metadata = Metadata.new(record_id: '991005939359706532', source: Metadata::Source::ALMA, marc_record:) - expect(metadata.calnet_or_ip?).to eq(false) # just to be sure - expect(metadata.calnet_only?).to eq(false) # just to be sure + expect(metadata.calnet_or_ip?).to be(false) # just to be sure + expect(metadata.calnet_only?).to be(false) # just to be sure marc_record['998'].append(MARC::Subfield.new('r', 'UCB access.')) marc_record['998'].append(MARC::Subfield.new('r', 'Requires CalNet.')) metadata = Metadata.new(record_id: '991005939359706532', source: Metadata::Source::ALMA, marc_record:) - expect(metadata.calnet_or_ip?).to eq(true) - expect(metadata.calnet_only?).to eq(true) + expect(metadata.calnet_or_ip?).to be(true) + expect(metadata.calnet_only?).to be(true) end it 'accepts "CalNet" anywhere in the 998$r' do marc_record = MARC::XMLReader.new('spec/data/alma/991005939359706532-sru.xml').first metadata = Metadata.new(record_id: '991005939359706532', source: Metadata::Source::ALMA, marc_record:) - expect(metadata.calnet_or_ip?).to eq(false) # just to be sure - expect(metadata.calnet_only?).to eq(false) # just to be sure + expect(metadata.calnet_or_ip?).to be(false) # just to be sure + expect(metadata.calnet_only?).to be(false) # just to be sure marc_record['998'].append(MARC::Subfield.new('r', 'some string with CalNet in it somewhere')) metadata = Metadata.new(record_id: '991005939359706532', source: Metadata::Source::ALMA, marc_record:) - expect(metadata.calnet_only?).to eq(true) - expect(metadata.calnet_or_ip?).to eq(false) # just to be sure + expect(metadata.calnet_only?).to be(true) + expect(metadata.calnet_or_ip?).to be(false) # just to be sure end end @@ -177,7 +177,7 @@ module AV body: AV::Metadata::Source::ALMA.catalog_link_text ) ] - expect(catalog_value.entries).to contain_exactly(*expected_links) + expect(catalog_value.entries).to match_array(expected_links) end it 'injects a TIND URL if not present (1/2)' do @@ -194,7 +194,7 @@ module AV body: Metadata::Source::TIND.catalog_link_text ) ] - expect(catalog_value.entries).to contain_exactly(*expected_links) + expect(catalog_value.entries).to match_array(expected_links) end it 'injects a TIND URL if not present (2/2)' do @@ -211,7 +211,7 @@ module AV body: Metadata::Source::TIND.catalog_link_text ) ] - expect(catalog_value.entries).to contain_exactly(*expected_links) + expect(catalog_value.entries).to match_array(expected_links) end # TODO: suppress these? @@ -233,7 +233,7 @@ module AV body: Metadata::Source::TIND.catalog_link_text ) ] - expect(catalog_value.entries).to contain_exactly(*expected_links) + expect(catalog_value.entries).to match_array(expected_links) end it 'works for TIND-only records' do @@ -250,7 +250,7 @@ module AV url: 'https://digicoll.lib.berkeley.edu/record/21937' ) ] - expect(catalog_value.entries).to contain_exactly(*expected_links) + expect(catalog_value.entries).to match_array(expected_links) end end diff --git a/spec/lib/berkeley_library/av/record_spec.rb b/spec/lib/berkeley_library/av/record_spec.rb index 562ccb4..d20747d 100644 --- a/spec/lib/berkeley_library/av/record_spec.rb +++ b/spec/lib/berkeley_library/av/record_spec.rb @@ -177,6 +177,7 @@ module AV end describe :from_metadata do + # rubocop:disable RSpec/ExampleLength it 'loads the metadata' do marc_xml = File.read('spec/data/record-(pacradio)01469.xml') search_url = 'https://digicoll.lib.berkeley.edu/api/v1/search?p=035__a%3A%22%28pacradio%2901469%22&format=xml' @@ -220,6 +221,7 @@ module AV expect(record.title).to eq(metadata.title) expect(record.bib_number).to eq(metadata.bib_number) end + # rubocop:enable RSpec/ExampleLength end it "raises #{AV::RecordNotFound} if the record cannot be found" do @@ -234,6 +236,7 @@ module AV end end + # rubocop:disable RSpec/ExampleLength describe :calnet_or_ip? do it 'returns true for restricted, false for unrestricted' do restricted = %w[b18538031 b24071548 (cityarts)00002 (cityarts)00773] @@ -251,32 +254,33 @@ module AV aggregate_failures 'restrictions' do restricted.each do |record_id| record = Record.from_metadata(collection: 'test', record_id:) - expect(record.calnet_or_ip?).to eq(true), "Expected #{record_id} to be restricted, was not" + expect(record.calnet_or_ip?).to be(true), "Expected #{record_id} to be restricted, was not" end unrestricted.each do |record_id| record = Record.from_metadata(collection: 'test', record_id:) - expect(record.calnet_or_ip?).to eq(false), "Expected #{record_id} not to be restricted, was" + expect(record.calnet_or_ip?).to be(false), "Expected #{record_id} not to be restricted, was" end end end end + # rubocop:enable RSpec/ExampleLength describe :calnet_only? do it 'returns true for CalNet-only records' do mms_id = '991047179369706532' stub_sru_request(mms_id) record = Record.from_metadata(collection: 'test', record_id: mms_id) - expect(record.calnet_or_ip?).to eq(true) - expect(record.calnet_only?).to eq(true) + expect(record.calnet_or_ip?).to be(true) + expect(record.calnet_only?).to be(true) end it 'returns false for records open to UCB IP addresses' do mms_id = '991054360089706532' stub_sru_request(mms_id) record = Record.from_metadata(collection: 'test', record_id: mms_id) - expect(record.calnet_or_ip?).to eq(true) - expect(record.calnet_only?).to eq(false) + expect(record.calnet_or_ip?).to be(true) + expect(record.calnet_only?).to be(false) end end end diff --git a/spec/lib/berkeley_library/av/track_spec.rb b/spec/lib/berkeley_library/av/track_spec.rb index 1e47d53..ddb0cb7 100644 --- a/spec/lib/berkeley_library/av/track_spec.rb +++ b/spec/lib/berkeley_library/av/track_spec.rb @@ -26,34 +26,34 @@ module AV describe :<=> do it 'treats object as equal to itself' do track = Track.new(sort_order: 2, title: 'Part 2', path: 'frost-read2.mp3') - expect(track == track).to eq(true) + expect(track == track).to be(true) end it 'treats object as equal to identical object' do t1 = Track.new(sort_order: 2, title: 'Part 2', path: 'frost-read2.mp3') t2 = Track.new(sort_order: 2, title: 'Part 2', path: 'frost-read2.mp3') - expect(t1 == t2).to eq(true) + expect(t1 == t2).to be(true) end it 'sorts by sort order' do t1 = Track.new(sort_order: 3, title: 'Part 2', path: 'frost-read2.mp3') t2 = Track.new(sort_order: 2, title: 'Part 2', path: 'frost-read2.mp3') - expect(t1 > t2).to eq(true) - expect(t2 < t1).to eq(true) + expect(t1 > t2).to be(true) + expect(t2 < t1).to be(true) end it 'sorts by title' do t1 = Track.new(sort_order: 2, title: 'Part 3', path: 'frost-read2.mp3') t2 = Track.new(sort_order: 2, title: 'Part 2', path: 'frost-read2.mp3') - expect(t1 > t2).to eq(true) - expect(t2 < t1).to eq(true) + expect(t1 > t2).to be(true) + expect(t2 < t1).to be(true) end it 'sorts by path' do t1 = Track.new(sort_order: 2, title: 'Part 2', path: 'frost-read2.mp4') t2 = Track.new(sort_order: 2, title: 'Part 2', path: 'frost-read2.mp3') - expect(t1 > t2).to eq(true) - expect(t2 < t1).to eq(true) + expect(t1 > t2).to be(true) + expect(t2 < t1).to be(true) end it 'returns nil for nil' do From 50a4c8ae40a247e469b59b547115d79977bcb41c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20A=2E=20Matienzo?= Date: Wed, 5 Nov 2025 16:23:38 -0800 Subject: [PATCH 4/4] ci: update to ruby 3.3 --- .github/workflows/build.yml | 2 +- .github/workflows/gem-push.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1941c9b..a5b04f3 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -6,7 +6,7 @@ jobs: fail-fast: false matrix: os: [ ubuntu-latest, macos-latest ] - ruby: [ '3.1' ] + ruby: [ '3.3' ] runs-on: ${{ matrix.os }} steps: diff --git a/.github/workflows/gem-push.yml b/.github/workflows/gem-push.yml index 55444c7..199fb80 100644 --- a/.github/workflows/gem-push.yml +++ b/.github/workflows/gem-push.yml @@ -18,7 +18,7 @@ jobs: - name: Set up Ruby uses: ruby/setup-ruby@v1 with: - ruby-version: '3.2' + ruby-version: '3.3' bundler-cache: true - name: Publish to RubyGems