From f983d8e65dc18db575a7ed00293f20f4958734df Mon Sep 17 00:00:00 2001 From: Justin Coyne Date: Fri, 28 Apr 2023 14:00:32 -0500 Subject: [PATCH] Add new rubocops and autocorrect --- .rubocop.yml | 276 ++++++++++++++++++ app/jobs/garbage_collect_job.rb | 2 +- app/models/concerns/locking.rb | 2 +- app/models/iiif_content_search_response.rb | 32 +- spec/controllers/search_controller_spec.rb | 4 +- spec/lib/full_text_indexer_spec.rb | 4 +- ...hocr_payload_delimited_transformer_spec.rb | 6 +- .../iiif_content_search_response_spec.rb | 76 ++--- 8 files changed, 339 insertions(+), 63 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 2439636..53331d3 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -150,3 +150,279 @@ Rails/WhereExists: # (new in 2.7) Enabled: true Rails/WhereNot: # (new in 2.8) Enabled: true +Gemspec/DeprecatedAttributeAssignment: # new in 1.30 + Enabled: true +Gemspec/DevelopmentDependencies: # new in 1.44 + Enabled: true +Gemspec/RequireMFA: # new in 1.23 + Enabled: true +Layout/LineContinuationLeadingSpace: # new in 1.31 + Enabled: true +Layout/LineContinuationSpacing: # new in 1.31 + Enabled: true +Layout/LineEndStringConcatenationIndentation: # new in 1.18 + Enabled: true +Lint/AmbiguousOperatorPrecedence: # new in 1.21 + Enabled: true +Lint/AmbiguousRange: # new in 1.19 + Enabled: true +Lint/ConstantOverwrittenInRescue: # new in 1.31 + Enabled: true +Lint/DeprecatedConstants: # new in 1.8 + Enabled: true +Lint/DuplicateMagicComment: # new in 1.37 + Enabled: true +Lint/DuplicateMatchPattern: # new in 1.50 + Enabled: true +Lint/EmptyInPattern: # new in 1.16 + Enabled: true +Lint/IncompatibleIoSelectWithFiberScheduler: # new in 1.21 + Enabled: true +Lint/LambdaWithoutLiteralBlock: # new in 1.8 + Enabled: true +Lint/NonAtomicFileOperation: # new in 1.31 + Enabled: true +Lint/NumberedParameterAssignment: # new in 1.9 + Enabled: true +Lint/OrAssignmentToConstant: # new in 1.9 + Enabled: true +Lint/RedundantDirGlobSort: # new in 1.8 + Enabled: true +Lint/RefinementImportMethods: # new in 1.27 + Enabled: true +Lint/RequireRangeParentheses: # new in 1.32 + Enabled: true +Lint/RequireRelativeSelfPath: # new in 1.22 + Enabled: true +Lint/SymbolConversion: # new in 1.9 + Enabled: true +Lint/TripleQuotes: # new in 1.9 + Enabled: true +Lint/UselessRescue: # new in 1.43 + Enabled: true +Lint/UselessRuby2Keywords: # new in 1.23 + Enabled: true +Metrics/CollectionLiteralLength: # new in 1.47 + Enabled: true +Naming/BlockForwarding: # new in 1.24 + Enabled: true +Security/CompoundHash: # new in 1.28 + Enabled: true +Security/IoMethods: # new in 1.22 + Enabled: true +Style/ArrayIntersect: # new in 1.40 + 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/DirEmpty: # new in 1.48 + Enabled: true +Style/EmptyHeredoc: # new in 1.32 + Enabled: true +Style/EndlessMethod: # new in 1.8 + Enabled: true +Style/EnvHome: # new in 1.29 + Enabled: true +Style/FetchEnvVar: # new in 1.28 + Enabled: true +Style/FileEmpty: # new in 1.48 + Enabled: true +Style/FileRead: # new in 1.24 + Enabled: true +Style/FileWrite: # new in 1.24 + Enabled: true +Style/HashConversion: # new in 1.10 + Enabled: true +Style/IfWithBooleanLiteralBranches: # new in 1.9 + Enabled: true +Style/InPatternThen: # new in 1.16 + Enabled: true +Style/MagicCommentFormat: # new in 1.35 + Enabled: true +Style/MapCompactWithConditionalBlock: # new in 1.30 + Enabled: true +Style/MapToHash: # new in 1.24 + Enabled: true +Style/MapToSet: # new in 1.42 + Enabled: true +Style/MinMaxComparison: # new in 1.42 + Enabled: true +Style/MultilineInPatternThen: # new in 1.16 + Enabled: true +Style/NestedFileDirname: # new in 1.26 + Enabled: true +Style/NumberedParameters: # new in 1.22 + Enabled: true +Style/NumberedParametersLimit: # new in 1.22 + Enabled: true +Style/ObjectThen: # new in 1.28 + Enabled: true +Style/OpenStructUse: # new in 1.23 + Enabled: true +Style/OperatorMethodCall: # new in 1.37 + Enabled: true +Style/QuotedSymbols: # new in 1.16 + Enabled: true +Style/RedundantConstantBase: # new in 1.40 + Enabled: true +Style/RedundantDoubleSplatHashBraces: # new in 1.41 + Enabled: true +Style/RedundantEach: # new in 1.38 + Enabled: true +Style/RedundantHeredocDelimiterQuotes: # new in 1.45 + Enabled: true +Style/RedundantInitialize: # new in 1.27 + Enabled: true +Style/RedundantLineContinuation: # new in 1.49 + Enabled: true +Style/RedundantSelfAssignmentBranch: # new in 1.19 + Enabled: true +Style/RedundantStringEscape: # new in 1.37 + Enabled: true +Style/SelectByRegexp: # new in 1.22 + Enabled: true +Style/StringChars: # new in 1.12 + Enabled: true +Rails/ActionControllerFlashBeforeRender: # new in 2.16 + Enabled: true +Rails/ActionControllerTestCase: # new in 2.14 + Enabled: true +Rails/ActionOrder: # new in 2.17 + Enabled: true +Rails/ActiveSupportOnLoad: # new in 2.16 + Enabled: true +Rails/AddColumnIndex: # new in 2.11 + Enabled: true +Rails/CompactBlank: # new in 2.13 + Enabled: true +Rails/DeprecatedActiveModelErrorsMethods: # new in 2.14 + Enabled: true +Rails/DotSeparatedKeys: # new in 2.15 + Enabled: true +Rails/DuplicateAssociation: # new in 2.14 + Enabled: true +Rails/DuplicateScope: # new in 2.14 + Enabled: true +Rails/DurationArithmetic: # new in 2.13 + Enabled: true +Rails/EagerEvaluationLogMessage: # new in 2.11 + Enabled: true +Rails/ExpandedDateRange: # new in 2.11 + Enabled: true +Rails/FreezeTime: # new in 2.16 + Enabled: true +Rails/I18nLazyLookup: # new in 2.14 + Enabled: true +Rails/I18nLocaleAssignment: # new in 2.11 + Enabled: true +Rails/I18nLocaleTexts: # new in 2.14 + Enabled: true +Rails/IgnoredColumnsAssignment: # new in 2.17 + Enabled: true +Rails/MigrationClassName: # new in 2.14 + Enabled: true +Rails/RedundantPresenceValidationOnBelongsTo: # new in 2.13 + Enabled: true +Rails/RedundantTravelBack: # new in 2.12 + Enabled: true +Rails/ResponseParsedBody: # new in 2.18 + Enabled: true +Rails/RootJoinChain: # new in 2.13 + Enabled: true +Rails/RootPathnameMethods: # new in 2.16 + Enabled: true +Rails/RootPublicPath: # new in 2.15 + Enabled: true +Rails/StripHeredoc: # new in 2.15 + Enabled: true +Rails/ThreeStateBooleanColumn: # new in 2.19 + Enabled: true +Rails/TimeZoneAssignment: # new in 2.10 + Enabled: true +Rails/ToFormattedS: # new in 2.15 + Enabled: true +Rails/ToSWithArgument: # new in 2.16 + Enabled: true +Rails/TopLevelHashWithIndifferentAccess: # new in 2.16 + Enabled: true +Rails/TransactionExitStatement: # new in 2.14 + Enabled: true +Rails/UnusedIgnoredColumns: # new in 2.11 + Enabled: true +Rails/WhereMissing: # new in 2.16 + Enabled: true +Rails/WhereNotWithMultipleConditions: # new in 2.17 + Enabled: true +Capybara/MatchStyle: # new in 2.17 + Enabled: true +Capybara/NegationMatcher: # new in 2.14 + Enabled: true +Capybara/SpecificActions: # new in 2.14 + Enabled: true +Capybara/SpecificFinders: # new in 2.13 + Enabled: true +Capybara/SpecificMatcher: # new in 2.12 + Enabled: true +RSpec/BeEmpty: # new in 2.20 + Enabled: true +RSpec/BeEq: # new in 2.9.0 + Enabled: true +RSpec/BeNil: # new in 2.9.0 + Enabled: true +RSpec/ChangeByZero: # new in 2.11 + Enabled: true +RSpec/ContainExactly: # new in 2.19 + Enabled: true +RSpec/DuplicatedMetadata: # new in 2.16 + Enabled: true +RSpec/ExcessiveDocstringSpacing: # new in 2.5 + Enabled: true +RSpec/IdenticalEqualityAssertion: # new in 2.4 + Enabled: true +RSpec/IndexedLet: # new in 2.20 + Enabled: true +RSpec/MatchArray: # new in 2.19 + Enabled: true +RSpec/NoExpectationExample: # new in 2.13 + Enabled: true +RSpec/PendingWithoutReason: # new in 2.16 + Enabled: true +RSpec/RedundantAround: # new in 2.19 + Enabled: true +RSpec/SkipBlockInsideExample: # new in 2.19 + Enabled: true +RSpec/SortMetadata: # new in 2.14 + Enabled: true +RSpec/SubjectDeclaration: # new in 2.5 + Enabled: true +RSpec/VerifiedDoubleReference: # new in 2.10.0 + Enabled: true +RSpec/FactoryBot/ConsistentParenthesesStyle: # new in 2.14 + Enabled: true +RSpec/FactoryBot/FactoryNameStyle: # new in 2.16 + Enabled: true +RSpec/FactoryBot/SyntaxMethods: # new in 2.7 + Enabled: true +RSpec/Rails/AvoidSetupHook: # new in 2.4 + Enabled: true +RSpec/Rails/HaveHttpStatus: # new in 2.12 + Enabled: true +RSpec/Rails/InferredSpecType: # new in 2.14 + Enabled: true +RSpec/Rails/MinitestAssertions: # new in 2.17 + Enabled: true +RSpec/Rails/TravelAround: # new in 2.19 + Enabled: true +Performance/ConcurrentMonotonicTime: # new in 1.12 + Enabled: true +Performance/MapCompact: # new in 1.11 + Enabled: true +Performance/RedundantEqualityComparisonBlock: # new in 1.10 + Enabled: true +Performance/RedundantSplitRegexpArgument: # new in 1.10 + Enabled: true +Performance/StringIdentifierArgument: # new in 1.13 + Enabled: true \ No newline at end of file diff --git a/app/jobs/garbage_collect_job.rb b/app/jobs/garbage_collect_job.rb index ff37966..03ee829 100644 --- a/app/jobs/garbage_collect_job.rb +++ b/app/jobs/garbage_collect_job.rb @@ -16,7 +16,7 @@ def response params: { q: 'resource_id:druid', fl: 'druid,timestamp', - fq: "timestamp:[* TO #{(Time.zone.now - 3.days).utc.iso8601}]", + fq: "timestamp:[* TO #{3.days.ago.utc.iso8601}]", rows: 100 } ) diff --git a/app/models/concerns/locking.rb b/app/models/concerns/locking.rb index c99c4a5..ff45a6a 100644 --- a/app/models/concerns/locking.rb +++ b/app/models/concerns/locking.rb @@ -36,7 +36,7 @@ def with_simple_lock(id) yield(true) end - File.delete(lock_file) if File.exist?(lock_file) + FileUtils.rm_f(lock_file) resp end diff --git a/app/models/iiif_content_search_response.rb b/app/models/iiif_content_search_response.rb index c035085..e3ffb30 100644 --- a/app/models/iiif_content_search_response.rb +++ b/app/models/iiif_content_search_response.rb @@ -13,14 +13,14 @@ def initialize(search, controller) def as_json(*_args) { - "@context": [ + '@context': [ 'http://iiif.io/api/presentation/2/context.json', 'http://iiif.io/api/search/1/context.json' ], - "@id": request.original_url, - "@type": 'sc:AnnotationList', - "resources": resources.flat_map(&:annotations).uniq { |a| a[:'@id'] }, - "hits": hits + '@id': request.original_url, + '@type': 'sc:AnnotationList', + resources: resources.flat_map(&:annotations).uniq { |a| a[:@id] }, + hits: hits }.merge(pagination_as_json) end @@ -82,10 +82,10 @@ def hits resources.uniq(&:annotation_urls).map do |hit| { '@type': 'search:Hit', - 'annotations': hit.annotation_urls, - 'before': hit.before, - 'after': hit.after, - 'match': hit.match + annotations: hit.annotation_urls, + before: hit.before, + after: hit.after, + match: hit.match } end end @@ -104,14 +104,14 @@ def initialize(id, highlight) def annotations tokens.map do |(chars, xywh)| { - "@id": annotation_url([chars, xywh]), - "@type": 'oa:Annotation', - "motivation": 'sc:painting', - "resource": { - "@type": 'cnt:ContentAsText', - "chars": chars + '@id': annotation_url([chars, xywh]), + '@type': 'oa:Annotation', + motivation: 'sc:painting', + resource: { + '@type': 'cnt:ContentAsText', + chars: chars }, - "on": canvas_fragment_url(xywh) + on: canvas_fragment_url(xywh) } end end diff --git a/spec/controllers/search_controller_spec.rb b/spec/controllers/search_controller_spec.rb index e31ae14..339c496 100644 --- a/spec/controllers/search_controller_spec.rb +++ b/spec/controllers/search_controller_spec.rb @@ -34,7 +34,7 @@ it 'executes a search and transforms it into a content search response' do get :search, params: { id: 'x', q: 'y', motivation: 'painting' } - data = JSON.parse(response.body) + data = response.parsed_body expect(data).to include '@context' => ['http://iiif.io/api/presentation/2/context.json', 'http://iiif.io/api/search/1/context.json'], @@ -46,7 +46,7 @@ it 'includes resources for every hit' do get :search, params: { id: 'x', q: 'y' } - data = JSON.parse(response.body) + data = response.parsed_body expect(data['resources']).to include '@id' => 'https://purl.stanford.edu/x/iiif/canvas/y/text/at/0,0,0,0', '@type' => 'oa:Annotation', diff --git a/spec/lib/full_text_indexer_spec.rb b/spec/lib/full_text_indexer_spec.rb index 44d6107..c116ca8 100644 --- a/spec/lib/full_text_indexer_spec.rb +++ b/spec/lib/full_text_indexer_spec.rb @@ -27,7 +27,7 @@ describe '#alto?' do it 'checks if the content looks like ALTO xml' do - expect(indexer.alto?).to eq true + expect(indexer.alto?).to be true end end @@ -52,7 +52,7 @@ describe '#alto?' do it 'checks if the content looks like ALTO xml' do - expect(indexer.alto?).to eq false + expect(indexer.alto?).to be false end end end diff --git a/spec/lib/hocr_payload_delimited_transformer_spec.rb b/spec/lib/hocr_payload_delimited_transformer_spec.rb index 1a9ff09..eec9dd5 100644 --- a/spec/lib/hocr_payload_delimited_transformer_spec.rb +++ b/spec/lib/hocr_payload_delimited_transformer_spec.rb @@ -16,9 +16,9 @@ it 'includes line breaks where appropriate' do words_only = transformer.output.map { |block| block.gsub(/☞[\d,.]+/, '') } expect(words_only).to include "Reintfelter Jacob, tailor, 133 Goerck 1 ,\n" \ - "Reinwald Augustus, shoemaker, 23 Spruce\n" \ - "Reirdon Robert, porterhouse, 443 Washington\n" \ - 'Reis Anton, painter, 642714 Monroe' + "Reinwald Augustus, shoemaker, 23 Spruce\n" \ + "Reirdon Robert, porterhouse, 443 Washington\n" \ + 'Reis Anton, painter, 642714 Monroe' end end end diff --git a/spec/models/iiif_content_search_response_spec.rb b/spec/models/iiif_content_search_response_spec.rb index e824c5b..3156147 100644 --- a/spec/models/iiif_content_search_response_spec.rb +++ b/spec/models/iiif_content_search_response_spec.rb @@ -52,41 +52,41 @@ describe '#as_json' do it 'has the expected json-ld properties' do - expect(response.as_json).to include "@context": ['http://iiif.io/api/presentation/2/context.json', + expect(response.as_json).to include '@context': ['http://iiif.io/api/presentation/2/context.json', 'http://iiif.io/api/search/1/context.json'], - "@id": 'http://test.host', - "@type": 'sc:AnnotationList' + '@id': 'http://test.host', + '@type': 'sc:AnnotationList' end it 'has resources for each word in the alto highlight' do - expect(response.as_json).to include resources: include("@id": 'https://purl.stanford.edu/x/iiif/canvas/y/text/at/639,129,79,243', - "@type": 'oa:Annotation', - "motivation": 'sc:painting', - "resource": { - "@type": 'cnt:ContentAsText', - "chars": 'George' + expect(response.as_json).to include resources: include('@id': 'https://purl.stanford.edu/x/iiif/canvas/y/text/at/639,129,79,243', + '@type': 'oa:Annotation', + motivation: 'sc:painting', + resource: { + '@type': 'cnt:ContentAsText', + chars: 'George' }, - "on": 'https://purl.stanford.edu/x/iiif/canvas/y#xywh=639,129,79,243') - - expect(response.as_json).to include resources: include("@id": 'https://purl.stanford.edu/x/iiif/canvas/y/text/at/633,426,84,300', - "@type": 'oa:Annotation', - "motivation": 'sc:painting', - "resource": { - "@type": 'cnt:ContentAsText', - "chars": 'Stirling’s' + on: 'https://purl.stanford.edu/x/iiif/canvas/y#xywh=639,129,79,243') + + expect(response.as_json).to include resources: include('@id': 'https://purl.stanford.edu/x/iiif/canvas/y/text/at/633,426,84,300', + '@type': 'oa:Annotation', + motivation: 'sc:painting', + resource: { + '@type': 'cnt:ContentAsText', + chars: 'Stirling’s' }, - "on": 'https://purl.stanford.edu/x/iiif/canvas/y#xywh=633,426,84,300') + on: 'https://purl.stanford.edu/x/iiif/canvas/y#xywh=633,426,84,300') end it 'has a resource for the plain text highlight' do - expect(response.as_json).to include resources: include("@id": 'https://purl.stanford.edu/x/iiif/canvas/y/text/at/0,0,0,0', - "@type": 'oa:Annotation', - "motivation": 'sc:painting', - "resource": { - "@type": 'cnt:ContentAsText', - "chars": 'MEMBERS' + expect(response.as_json).to include resources: include('@id': 'https://purl.stanford.edu/x/iiif/canvas/y/text/at/0,0,0,0', + '@type': 'oa:Annotation', + motivation: 'sc:painting', + resource: { + '@type': 'cnt:ContentAsText', + chars: 'MEMBERS' }, - "on": 'https://purl.stanford.edu/x/iiif/canvas/y#xywh=0,0,0,0') + on: 'https://purl.stanford.edu/x/iiif/canvas/y#xywh=0,0,0,0') end describe '#resources' do @@ -137,9 +137,9 @@ let(:highlights) do { '' => [ - 'as☞1590.12,1094.11,46.81,33.89 crimes☞1660.33,1094.11,140.42,3'\ - '3.89 against☞1824.15,1094.11,163.82,33.89 humani'\ - 'ty,☞2011.38,1094.11,210.62,33.89 contrary☞674.90,1140.00,179.'\ + 'as☞1590.12,1094.11,46.81,33.89 crimes☞1660.33,1094.11,140.42,3' \ + '3.89 against☞1824.15,1094.11,163.82,33.89 humani' \ + 'ty,☞2011.38,1094.11,210.62,33.89 contrary☞674.90,1140.00,179.' \ '61,32.48 to☞899.41,1140.00,44.90,32.48' ] } @@ -151,24 +151,24 @@ end it 'has hits with additional context for an ALTO resource' do - expect(response.as_json).to include hits: include("@type": 'search:Hit', - "annotations": [ + expect(response.as_json).to include hits: include('@type': 'search:Hit', + annotations: [ 'https://purl.stanford.edu/x/iiif/canvas/y/text/at/639,129,79,243', 'https://purl.stanford.edu/x/iiif/canvas/y/text/at/633,426,84,300' ], - "before": '', - "after": 'Heritage', - "match": 'George Stirling’s') + before: '', + after: 'Heritage', + match: 'George Stirling’s') end it 'has hits with additional context for a plain text resource' do - expect(response.as_json).to include hits: include("@type": 'search:Hit', - "annotations": [ + expect(response.as_json).to include hits: include('@type': 'search:Hit', + annotations: [ 'https://purl.stanford.edu/x/iiif/canvas/y/text/at/0,0,0,0' ], - "before": '', - "after": 'OF THE COUNCIL', - "match": 'MEMBERS') + before: '', + after: 'OF THE COUNCIL', + match: 'MEMBERS') end it 'has basic pagination context' do