druid-tools 2.0.0 → 2.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.circleci/config.yml +10 -0
- data/.github/pull_request_template.md +9 -0
- data/.rubocop.yml +118 -21
- data/.rubocop_todo.yml +48 -24
- data/Gemfile +1 -5
- data/README.md +3 -2
- data/VERSION +1 -1
- data/druid-tools.gemspec +6 -3
- data/lib/druid_tools/access_druid.rb +4 -0
- data/lib/druid_tools/druid.rb +36 -14
- data/spec/druid_tools/purl_druid_spec.rb +8 -1
- data/spec/druid_tools_spec.rb +87 -24
- metadata +30 -15
- data/.travis.yml +0 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ae5225239dbe4cabc2b4380a386d476b73d9ae21af9f3791df9b1d44cb90f04e
|
4
|
+
data.tar.gz: 1a3274f2ba03e506cc1289715df194cbf8f6cf16b0d23a0367ee13ed0cae9e11
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 25274f7e81d1694cbbef1419165dc517ca40ada672a9d4a76f9c8c38781a3782520992050ce2f056f6d954a9fd74adea1c5483b3f4297d7918c512697ab1148a
|
7
|
+
data.tar.gz: 259575663aa19d712b31aa5f62f4204b6779dae6deec8512a0fba5dcb98df50af8f44d7a51b2b5b88573fd51acf9716d46e2a9bdb2a354b50f379406166e609e
|
@@ -0,0 +1,9 @@
|
|
1
|
+
## Why was this change made? 🤔
|
2
|
+
|
3
|
+
|
4
|
+
|
5
|
+
## How was this change tested? 🤨
|
6
|
+
|
7
|
+
⚡ ⚠ If this change has cross service impact, ***run [integration tests](https://github.com/sul-dlss/infrastructure-integration-test)*** that exercise the code and/or test in [stage|qa] environment, in addition to specs. ⚡
|
8
|
+
|
9
|
+
|
data/.rubocop.yml
CHANGED
@@ -1,41 +1,138 @@
|
|
1
1
|
inherit_from: .rubocop_todo.yml
|
2
2
|
|
3
|
-
# Turn on RSpec cops
|
4
3
|
require: rubocop-rspec
|
5
4
|
|
6
5
|
AllCops:
|
6
|
+
TargetRubyVersion: 2.7
|
7
7
|
DisplayCopNames: true
|
8
|
-
# Include:
|
9
|
-
# - 'Rakefile'
|
10
8
|
Exclude:
|
11
9
|
- 'Gemfile.lock'
|
12
10
|
- '**/*.md'
|
13
|
-
- 'vendor/**/*' # avoid running rubocop on
|
14
|
-
|
15
|
-
# --- Layout ---
|
16
|
-
|
17
|
-
# --- Lint ---
|
18
|
-
|
19
|
-
# --- Metrics ---
|
20
|
-
|
21
|
-
# because this isn't 1994
|
22
|
-
Metrics/LineLength:
|
23
|
-
Max: 167 # would like to reduce this to 120
|
11
|
+
- 'vendor/**/*' # avoid running rubocop on cached bundler
|
24
12
|
|
25
13
|
Metrics/BlockLength:
|
26
14
|
Exclude:
|
27
15
|
- 'spec/**/*_spec.rb'
|
28
16
|
|
29
|
-
# --- Naming ---
|
30
|
-
|
31
17
|
Naming/FileName:
|
32
18
|
Exclude:
|
33
19
|
- Gemfile
|
34
20
|
- druid-tools.gemspec
|
35
21
|
- lib/druid-tools.rb
|
36
22
|
|
37
|
-
#
|
38
|
-
|
39
|
-
#
|
40
|
-
|
41
|
-
#
|
23
|
+
Gemspec/DateAssignment: # new in 1.10
|
24
|
+
Enabled: true
|
25
|
+
Gemspec/RequireMFA: # new in 1.23
|
26
|
+
Enabled: true
|
27
|
+
Layout/LineEndStringConcatenationIndentation: # new in 1.18
|
28
|
+
Enabled: true
|
29
|
+
Layout/SpaceBeforeBrackets: # new in 1.7
|
30
|
+
Enabled: true
|
31
|
+
Lint/AmbiguousAssignment: # new in 1.7
|
32
|
+
Enabled: true
|
33
|
+
Lint/AmbiguousOperatorPrecedence: # new in 1.21
|
34
|
+
Enabled: true
|
35
|
+
Lint/AmbiguousRange: # new in 1.19
|
36
|
+
Enabled: true
|
37
|
+
Lint/DeprecatedConstants: # new in 1.8
|
38
|
+
Enabled: true
|
39
|
+
Lint/DuplicateBranch: # new in 1.3
|
40
|
+
Enabled: true
|
41
|
+
Lint/DuplicateRegexpCharacterClassElement: # new in 1.1
|
42
|
+
Enabled: true
|
43
|
+
Lint/EmptyBlock: # new in 1.1
|
44
|
+
Enabled: true
|
45
|
+
Lint/EmptyClass: # new in 1.3
|
46
|
+
Enabled: true
|
47
|
+
Lint/EmptyInPattern: # new in 1.16
|
48
|
+
Enabled: true
|
49
|
+
Lint/IncompatibleIoSelectWithFiberScheduler: # new in 1.21
|
50
|
+
Enabled: true
|
51
|
+
Lint/LambdaWithoutLiteralBlock: # new in 1.8
|
52
|
+
Enabled: true
|
53
|
+
Lint/NoReturnInBeginEndBlocks: # new in 1.2
|
54
|
+
Enabled: true
|
55
|
+
Lint/NumberedParameterAssignment: # new in 1.9
|
56
|
+
Enabled: true
|
57
|
+
Lint/OrAssignmentToConstant: # new in 1.9
|
58
|
+
Enabled: true
|
59
|
+
Lint/RedundantDirGlobSort: # new in 1.8
|
60
|
+
Enabled: true
|
61
|
+
Lint/RequireRelativeSelfPath: # new in 1.22
|
62
|
+
Enabled: true
|
63
|
+
Lint/SymbolConversion: # new in 1.9
|
64
|
+
Enabled: true
|
65
|
+
Lint/ToEnumArguments: # new in 1.1
|
66
|
+
Enabled: true
|
67
|
+
Lint/TripleQuotes: # new in 1.9
|
68
|
+
Enabled: true
|
69
|
+
Lint/UnexpectedBlockArity: # new in 1.5
|
70
|
+
Enabled: true
|
71
|
+
Lint/UnmodifiedReduceAccumulator: # new in 1.1
|
72
|
+
Enabled: true
|
73
|
+
Lint/UselessRuby2Keywords: # new in 1.23
|
74
|
+
Enabled: true
|
75
|
+
Naming/BlockForwarding: # new in 1.24
|
76
|
+
Enabled: true
|
77
|
+
Security/IoMethods: # new in 1.22
|
78
|
+
Enabled: true
|
79
|
+
Style/ArgumentsForwarding: # new in 1.1
|
80
|
+
Enabled: true
|
81
|
+
Style/CollectionCompact: # new in 1.2
|
82
|
+
Enabled: true
|
83
|
+
Style/DocumentDynamicEvalDefinition: # new in 1.1
|
84
|
+
Enabled: true
|
85
|
+
Style/EndlessMethod: # new in 1.8
|
86
|
+
Enabled: true
|
87
|
+
Style/FileRead: # new in 1.24
|
88
|
+
Enabled: true
|
89
|
+
Style/FileWrite: # new in 1.24
|
90
|
+
Enabled: true
|
91
|
+
Style/HashConversion: # new in 1.10
|
92
|
+
Enabled: true
|
93
|
+
Style/HashExcept: # new in 1.7
|
94
|
+
Enabled: true
|
95
|
+
Style/IfWithBooleanLiteralBranches: # new in 1.9
|
96
|
+
Enabled: true
|
97
|
+
Style/InPatternThen: # new in 1.16
|
98
|
+
Enabled: true
|
99
|
+
Style/MapToHash: # new in 1.24
|
100
|
+
Enabled: true
|
101
|
+
Style/MultilineInPatternThen: # new in 1.16
|
102
|
+
Enabled: true
|
103
|
+
Style/NegatedIfElseCondition: # new in 1.2
|
104
|
+
Enabled: true
|
105
|
+
Style/NilLambda: # new in 1.3
|
106
|
+
Enabled: true
|
107
|
+
Style/NumberedParameters: # new in 1.22
|
108
|
+
Enabled: true
|
109
|
+
Style/NumberedParametersLimit: # new in 1.22
|
110
|
+
Enabled: true
|
111
|
+
Style/OpenStructUse: # new in 1.23
|
112
|
+
Enabled: true
|
113
|
+
Style/QuotedSymbols: # new in 1.16
|
114
|
+
Enabled: true
|
115
|
+
Style/RedundantArgument: # new in 1.4
|
116
|
+
Enabled: true
|
117
|
+
Style/RedundantSelfAssignmentBranch: # new in 1.19
|
118
|
+
Enabled: true
|
119
|
+
Style/SelectByRegexp: # new in 1.22
|
120
|
+
Enabled: true
|
121
|
+
Style/StringChars: # new in 1.12
|
122
|
+
Enabled: true
|
123
|
+
Style/SwapValues: # new in 1.1
|
124
|
+
Enabled: true
|
125
|
+
RSpec/BeEq: # new in 2.9.0
|
126
|
+
Enabled: true
|
127
|
+
RSpec/BeNil: # new in 2.9.0
|
128
|
+
Enabled: true
|
129
|
+
RSpec/ExcessiveDocstringSpacing: # new in 2.5
|
130
|
+
Enabled: true
|
131
|
+
RSpec/IdenticalEqualityAssertion: # new in 2.4
|
132
|
+
Enabled: true
|
133
|
+
RSpec/SubjectDeclaration: # new in 2.5
|
134
|
+
Enabled: true
|
135
|
+
RSpec/FactoryBot/SyntaxMethods: # new in 2.7
|
136
|
+
Enabled: true
|
137
|
+
RSpec/Rails/AvoidSetupHook: # new in 2.4
|
138
|
+
Enabled: true
|
data/.rubocop_todo.yml
CHANGED
@@ -1,29 +1,32 @@
|
|
1
1
|
# This configuration was generated by
|
2
|
-
# `rubocop --auto-gen-config`
|
3
|
-
# on
|
2
|
+
# `rubocop --auto-gen-config --auto-gen-only-exclude`
|
3
|
+
# on 2022-04-01 18:08:00 UTC using RuboCop version 1.26.1.
|
4
4
|
# The point is for the user to remove these configuration records
|
5
5
|
# one by one as the offenses are removed from the code base.
|
6
6
|
# Note that changes in the inspected code, or installation of new
|
7
7
|
# versions of RuboCop, may require this file to be generated again.
|
8
8
|
|
9
9
|
# Offense count: 1
|
10
|
+
# Configuration parameters: IgnoredMethods, CountRepeatedAttributes, Max.
|
10
11
|
Metrics/AbcSize:
|
11
|
-
|
12
|
+
Exclude:
|
13
|
+
- 'lib/druid_tools/druid.rb'
|
12
14
|
|
13
15
|
# Offense count: 1
|
14
|
-
# Configuration parameters: CountComments.
|
16
|
+
# Configuration parameters: CountComments, Max, CountAsOne.
|
15
17
|
Metrics/ClassLength:
|
16
|
-
|
18
|
+
Exclude:
|
19
|
+
- 'lib/druid_tools/druid.rb'
|
17
20
|
|
18
21
|
# Offense count: 1
|
19
|
-
# Configuration parameters:
|
20
|
-
Metrics/
|
21
|
-
|
22
|
+
# Configuration parameters: IgnoredMethods, Max.
|
23
|
+
Metrics/CyclomaticComplexity:
|
24
|
+
Exclude:
|
25
|
+
- 'lib/druid_tools/druid.rb'
|
22
26
|
|
23
27
|
# Offense count: 1
|
24
|
-
# Configuration parameters:
|
25
|
-
|
26
|
-
Naming/HeredocDelimiterNaming:
|
28
|
+
# Configuration parameters: CountComments, Max, CountAsOne, ExcludedMethods, IgnoredMethods.
|
29
|
+
Metrics/MethodLength:
|
27
30
|
Exclude:
|
28
31
|
- 'lib/druid_tools/druid.rb'
|
29
32
|
|
@@ -35,22 +38,30 @@ RSpec/BeforeAfterAll:
|
|
35
38
|
- 'spec/support/**/*.rb'
|
36
39
|
- 'spec/druid_tools_spec.rb'
|
37
40
|
|
38
|
-
# Offense count:
|
39
|
-
# Configuration parameters: Max.
|
41
|
+
# Offense count: 8
|
42
|
+
# Configuration parameters: Max, CountAsOne.
|
40
43
|
RSpec/ExampleLength:
|
41
44
|
Exclude:
|
42
45
|
- 'spec/druid_tools_spec.rb'
|
43
46
|
|
44
47
|
# Offense count: 1
|
45
|
-
# Configuration parameters: CustomTransform, IgnoreMethods.
|
48
|
+
# Configuration parameters: Include, CustomTransform, IgnoreMethods, SpecSuffixOnly.
|
49
|
+
# Include: **/*_spec*rb*, **/spec/**/*
|
46
50
|
RSpec/FilePath:
|
47
51
|
Exclude:
|
48
52
|
- 'spec/druid_tools_spec.rb'
|
49
53
|
|
50
|
-
# Offense count:
|
51
|
-
# Configuration parameters:
|
54
|
+
# Offense count: 16
|
55
|
+
# Configuration parameters: Max.
|
52
56
|
RSpec/MultipleExpectations:
|
53
|
-
|
57
|
+
Exclude:
|
58
|
+
- 'spec/druid_tools_spec.rb'
|
59
|
+
|
60
|
+
# Offense count: 4
|
61
|
+
# Configuration parameters: AllowSubject, Max.
|
62
|
+
RSpec/MultipleMemoizedHelpers:
|
63
|
+
Exclude:
|
64
|
+
- 'spec/druid_tools_spec.rb'
|
54
65
|
|
55
66
|
# Offense count: 2
|
56
67
|
RSpec/RepeatedExample:
|
@@ -58,19 +69,32 @@ RSpec/RepeatedExample:
|
|
58
69
|
- 'spec/druid_tools_spec.rb'
|
59
70
|
|
60
71
|
# Offense count: 1
|
61
|
-
|
62
|
-
Exclude:
|
63
|
-
- 'lib/druid_tools/druid.rb'
|
64
|
-
|
65
|
-
# Offense count: 2
|
72
|
+
# Configuration parameters: AllowedConstants.
|
66
73
|
Style/Documentation:
|
67
74
|
Exclude:
|
68
75
|
- 'spec/**/*'
|
69
76
|
- 'test/**/*'
|
70
|
-
- 'lib/druid_tools.rb'
|
71
77
|
- 'lib/druid_tools/druid.rb'
|
72
78
|
|
73
79
|
# Offense count: 1
|
74
|
-
|
80
|
+
# This cop supports safe auto-correction (--auto-correct).
|
81
|
+
Style/IfUnlessModifier:
|
75
82
|
Exclude:
|
76
83
|
- 'lib/druid_tools/druid.rb'
|
84
|
+
|
85
|
+
# Offense count: 8
|
86
|
+
# Configuration parameters: AllowedMethods.
|
87
|
+
# AllowedMethods: respond_to_missing?
|
88
|
+
Style/OptionalBooleanParameter:
|
89
|
+
Exclude:
|
90
|
+
- 'lib/druid_tools/access_druid.rb'
|
91
|
+
- 'lib/druid_tools/druid.rb'
|
92
|
+
|
93
|
+
# Offense count: 2
|
94
|
+
# This cop supports safe auto-correction (--auto-correct).
|
95
|
+
# Configuration parameters: Max, AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
|
96
|
+
# URISchemes: http, https
|
97
|
+
Layout/LineLength:
|
98
|
+
Exclude:
|
99
|
+
- 'lib/druid_tools/druid.rb'
|
100
|
+
- 'spec/druid_tools_spec.rb'
|
data/Gemfile
CHANGED
@@ -3,11 +3,7 @@
|
|
3
3
|
source 'https://rubygems.org'
|
4
4
|
|
5
5
|
group :development do
|
6
|
-
gem '
|
7
|
-
gem 'pry-debugger', platform: :ruby_19
|
8
|
-
gem 'rcov', platform: :ruby_18
|
9
|
-
gem 'ruby-debug', platform: :ruby_18
|
10
|
-
gem 'simplecov', platform: %i[ruby_19 ruby_20]
|
6
|
+
gem 'byebug'
|
11
7
|
end
|
12
8
|
|
13
9
|
gemspec
|
data/README.md
CHANGED
@@ -1,6 +1,7 @@
|
|
1
|
-
[![
|
2
|
-
[![Coverage Status](https://coveralls.io/repos/github/sul-dlss/druid-tools/badge.svg?branch=master)](https://coveralls.io/github/sul-dlss/druid-tools?branch=master)
|
1
|
+
[![CircleCI](https://circleci.com/gh/sul-dlss/druid-tools/tree/main.svg?style=svg)](https://circleci.com/gh/sul-dlss/druid-tools/tree/main)
|
3
2
|
[![Gem Version](https://badge.fury.io/rb/druid-tools.svg)](https://badge.fury.io/rb/druid-tools)
|
3
|
+
[![Test Coverage](https://api.codeclimate.com/v1/badges/a21a8f4d0abae265638e/test_coverage)](https://codeclimate.com/github/sul-dlss/druid-tools/test_coverage)
|
4
|
+
[![Maintainability](https://api.codeclimate.com/v1/badges/a21a8f4d0abae265638e/maintainability)](https://codeclimate.com/github/sul-dlss/druid-tools/maintainability)
|
4
5
|
|
5
6
|
# Druid::Tools
|
6
7
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.
|
1
|
+
2.2.1
|
data/druid-tools.gemspec
CHANGED
@@ -7,7 +7,9 @@ Gem::Specification.new do |gem|
|
|
7
7
|
gem.summary = 'Tools to manipulate DRUID trees and content directories'
|
8
8
|
gem.homepage = 'http://github.com/sul-dlss/druid-tools'
|
9
9
|
gem.licenses = ['ALv2', 'Stanford University Libraries']
|
10
|
-
gem.
|
10
|
+
gem.metadata['rubygems_mfa_required'] = 'true'
|
11
|
+
|
12
|
+
gem.required_ruby_version = '>= 2.7'
|
11
13
|
|
12
14
|
gem.files = `git ls-files`.split($OUTPUT_RECORD_SEPARATOR)
|
13
15
|
gem.executables = gem.files.grep(%r{^bin/}).map { |f| File.basename(f) }
|
@@ -16,9 +18,10 @@ Gem::Specification.new do |gem|
|
|
16
18
|
gem.require_paths = ['lib']
|
17
19
|
gem.version = File.read('VERSION').strip
|
18
20
|
|
21
|
+
gem.add_dependency 'deprecation'
|
19
22
|
gem.add_development_dependency 'coveralls'
|
20
23
|
gem.add_development_dependency 'rake', '>= 10.1.0'
|
21
24
|
gem.add_development_dependency 'rspec', '~> 3.0'
|
22
|
-
gem.add_development_dependency 'rubocop'
|
23
|
-
gem.add_development_dependency 'rubocop-rspec'
|
25
|
+
gem.add_development_dependency 'rubocop'
|
26
|
+
gem.add_development_dependency 'rubocop-rspec'
|
24
27
|
end
|
data/lib/druid_tools/druid.rb
CHANGED
@@ -2,9 +2,13 @@
|
|
2
2
|
|
3
3
|
require 'pathname'
|
4
4
|
require 'fileutils'
|
5
|
+
require 'deprecation'
|
5
6
|
|
6
7
|
module DruidTools
|
7
8
|
class Druid
|
9
|
+
extend Deprecation
|
10
|
+
self.deprecation_horizon = 'druid-tools 3.0.0'
|
11
|
+
|
8
12
|
attr_accessor :druid, :base
|
9
13
|
|
10
14
|
# See https://consul.stanford.edu/pages/viewpage.action?title=SURI+2.0+Specification&spaceKey=chimera
|
@@ -41,16 +45,28 @@ module DruidTools
|
|
41
45
|
end
|
42
46
|
self.prefix = 'druid'
|
43
47
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
path("#{dir_type}",create)
|
48
|
-
end
|
48
|
+
def content_dir(create = true)
|
49
|
+
path('content', create)
|
50
|
+
end
|
49
51
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
52
|
+
def metadata_dir(create = true)
|
53
|
+
path('metadata', create)
|
54
|
+
end
|
55
|
+
|
56
|
+
def temp_dir(create = true)
|
57
|
+
path('temp', create)
|
58
|
+
end
|
59
|
+
|
60
|
+
def find_content(path)
|
61
|
+
find(:content, path)
|
62
|
+
end
|
63
|
+
|
64
|
+
def find_metadata(path)
|
65
|
+
find(:metadata, path)
|
66
|
+
end
|
67
|
+
|
68
|
+
def find_temp(path)
|
69
|
+
find(:temp, path)
|
54
70
|
end
|
55
71
|
|
56
72
|
# @param druid [String] A valid druid
|
@@ -66,7 +82,7 @@ module DruidTools
|
|
66
82
|
end
|
67
83
|
|
68
84
|
def id
|
69
|
-
@druid.scan(self.class.pattern).flatten.join
|
85
|
+
@druid.scan(self.class.pattern).flatten.join
|
70
86
|
end
|
71
87
|
|
72
88
|
def tree
|
@@ -122,6 +138,7 @@ module DruidTools
|
|
122
138
|
FileUtils.mkdir_p(real_path)
|
123
139
|
FileUtils.ln_s(source, new_path, force: true)
|
124
140
|
end
|
141
|
+
deprecation_deprecate :mkdir_with_final_link
|
125
142
|
|
126
143
|
def rmdir(extra = nil)
|
127
144
|
parts = tree
|
@@ -137,6 +154,7 @@ module DruidTools
|
|
137
154
|
parts.pop
|
138
155
|
end
|
139
156
|
end
|
157
|
+
deprecation_deprecate :rmdir
|
140
158
|
|
141
159
|
def pathname
|
142
160
|
Pathname path
|
@@ -146,12 +164,15 @@ module DruidTools
|
|
146
164
|
Pathname base
|
147
165
|
end
|
148
166
|
|
167
|
+
def pruning_base
|
168
|
+
pathname.parent
|
169
|
+
end
|
170
|
+
|
149
171
|
def prune!
|
150
|
-
|
151
|
-
|
152
|
-
parent.rmtree if parent.exist? && parent != base_pathname
|
153
|
-
prune_ancestors parent.parent
|
172
|
+
pruning_base.rmtree if pruning_base.exist? && pruning_base != base_pathname
|
173
|
+
prune_ancestors pruning_base.parent
|
154
174
|
end
|
175
|
+
deprecation_deprecate :prune!
|
155
176
|
|
156
177
|
# @param [Pathname] outermost_branch The branch at which pruning begins
|
157
178
|
# @return [void] Ascend the druid tree and prune empty branches
|
@@ -162,5 +183,6 @@ module DruidTools
|
|
162
183
|
break if outermost_branch == base_pathname
|
163
184
|
end
|
164
185
|
end
|
186
|
+
deprecation_deprecate :prune_ancestors
|
165
187
|
end
|
166
188
|
end
|
@@ -5,7 +5,8 @@ require 'spec_helper'
|
|
5
5
|
RSpec.describe DruidTools::PurlDruid do
|
6
6
|
let(:purl_root) { Dir.mktmpdir }
|
7
7
|
|
8
|
-
let(:druid) { described_class.new
|
8
|
+
let(:druid) { described_class.new druid_str, purl_root }
|
9
|
+
let(:druid_str) { 'druid:cd456ef7890' }
|
9
10
|
|
10
11
|
after do
|
11
12
|
FileUtils.remove_entry purl_root
|
@@ -15,6 +16,12 @@ RSpec.describe DruidTools::PurlDruid do
|
|
15
16
|
expect(druid.tree).to eq(%w[cd 456 ef 7890])
|
16
17
|
end
|
17
18
|
|
19
|
+
describe '#pruning_base' do
|
20
|
+
subject(:path) { described_class.new(druid_str).pruning_base }
|
21
|
+
|
22
|
+
it { is_expected.to eq(Pathname.new('./cd/456/ef/7890')) }
|
23
|
+
end
|
24
|
+
|
18
25
|
describe '#content_dir' do
|
19
26
|
it 'creates content directories at leaf of the druid tree' do
|
20
27
|
expect(druid.content_dir).to match(%r{ef/7890$})
|
data/spec/druid_tools_spec.rb
CHANGED
@@ -6,6 +6,8 @@ RSpec.describe DruidTools::Druid do
|
|
6
6
|
let(:tree1) { File.join(fixture_dir, 'cd/456/ef/7890/cd456ef7890') }
|
7
7
|
let(:strictly_valid_druid_str) { 'druid:cd456gh1234' }
|
8
8
|
let(:tree2) { File.join(fixture_dir, 'cd/456/gh/1234/cd456gh1234') }
|
9
|
+
let(:access_druid_str) { 'druid:cd456ef9999' }
|
10
|
+
let(:tree3) { File.join(fixture_dir, 'cd/456/ef/9999') }
|
9
11
|
|
10
12
|
after do
|
11
13
|
FileUtils.rm_rf(File.join(fixture_dir, 'cd'))
|
@@ -41,6 +43,7 @@ RSpec.describe DruidTools::Druid do
|
|
41
43
|
expect(described_class.valid?(dru, false)).to eq(exp)
|
42
44
|
end
|
43
45
|
end
|
46
|
+
|
44
47
|
context 'with strict validation' do
|
45
48
|
it 'correctly validates druid strings' do
|
46
49
|
tests = [
|
@@ -82,6 +85,12 @@ RSpec.describe DruidTools::Druid do
|
|
82
85
|
end
|
83
86
|
end
|
84
87
|
|
88
|
+
describe '#pruning_base' do
|
89
|
+
subject(:path) { described_class.new(druid_str).pruning_base }
|
90
|
+
|
91
|
+
it { is_expected.to eq(Pathname.new('./cd/456/ef/7890')) }
|
92
|
+
end
|
93
|
+
|
85
94
|
it '#druid provides the full druid including the prefix' do
|
86
95
|
expect(described_class.new('druid:cd456ef7890', fixture_dir).druid).to eq('druid:cd456ef7890')
|
87
96
|
expect(described_class.new('cd456ef7890', fixture_dir).druid).to eq('druid:cd456ef7890')
|
@@ -97,6 +106,7 @@ RSpec.describe DruidTools::Druid do
|
|
97
106
|
expect { described_class.new('nondruid:cd456ef7890', fixture_dir) }.to raise_error(ArgumentError)
|
98
107
|
expect { described_class.new('druid:cd4567ef890', fixture_dir) }.to raise_error(ArgumentError)
|
99
108
|
end
|
109
|
+
|
100
110
|
it 'takes strict argument' do
|
101
111
|
described_class.new(strictly_valid_druid_str, fixture_dir, true)
|
102
112
|
expect { described_class.new(druid_str, fixture_dir, true) }.to raise_error(ArgumentError)
|
@@ -109,29 +119,46 @@ RSpec.describe DruidTools::Druid do
|
|
109
119
|
expect(druid.path).to eq(tree1)
|
110
120
|
end
|
111
121
|
|
112
|
-
it '#mkdir, #rmdir
|
113
|
-
|
114
|
-
expect(File.exist?(
|
122
|
+
it '#mkdir creates, and #rmdir destroys, *only* the expected druid directory' do
|
123
|
+
allow(Deprecation).to receive(:warn)
|
124
|
+
expect(File.exist?(tree1)).to be false
|
125
|
+
expect(File.exist?(tree2)).to be false
|
126
|
+
expect(File.exist?(tree3)).to be false
|
115
127
|
|
116
128
|
druid1 = described_class.new(druid_str, fixture_dir)
|
117
129
|
druid2 = described_class.new(strictly_valid_druid_str, fixture_dir)
|
130
|
+
druid3 = DruidTools::AccessDruid.new(access_druid_str, fixture_dir)
|
118
131
|
|
119
132
|
druid1.mkdir
|
120
|
-
expect(File.exist?(tree1)).to
|
121
|
-
expect(File.exist?(tree2)).to
|
133
|
+
expect(File.exist?(tree1)).to be true
|
134
|
+
expect(File.exist?(tree2)).to be false
|
135
|
+
expect(File.exist?(tree3)).to be false
|
122
136
|
|
123
137
|
druid2.mkdir
|
124
|
-
expect(File.exist?(tree1)).to
|
125
|
-
expect(File.exist?(tree2)).to
|
138
|
+
expect(File.exist?(tree1)).to be true
|
139
|
+
expect(File.exist?(tree2)).to be true
|
140
|
+
expect(File.exist?(tree3)).to be false
|
141
|
+
|
142
|
+
druid3.mkdir
|
143
|
+
expect(File.exist?(tree1)).to be true
|
144
|
+
expect(File.exist?(tree2)).to be true
|
145
|
+
expect(File.exist?(tree3)).to be true
|
146
|
+
|
147
|
+
druid3.rmdir
|
148
|
+
expect(File.exist?(tree1)).to be true
|
149
|
+
expect(File.exist?(tree2)).to be true
|
150
|
+
expect(File.exist?(tree3)).to be false
|
126
151
|
|
127
152
|
druid2.rmdir
|
128
|
-
expect(File.exist?(tree1)).to
|
129
|
-
expect(File.exist?(tree2)).to
|
153
|
+
expect(File.exist?(tree1)).to be true
|
154
|
+
expect(File.exist?(tree2)).to be false
|
155
|
+
expect(File.exist?(tree3)).to be false
|
130
156
|
|
131
157
|
druid1.rmdir
|
132
|
-
expect(File.exist?(tree1)).to
|
133
|
-
expect(File.exist?(tree2)).to
|
134
|
-
expect(File.exist?(
|
158
|
+
expect(File.exist?(tree1)).to be false
|
159
|
+
expect(File.exist?(tree2)).to be false
|
160
|
+
expect(File.exist?(tree3)).to be false
|
161
|
+
expect(File.exist?(File.join(fixture_dir, 'cd'))).to be false
|
135
162
|
end
|
136
163
|
|
137
164
|
describe 'alternate prefixes' do
|
@@ -157,9 +184,9 @@ RSpec.describe DruidTools::Druid do
|
|
157
184
|
expect(druid.metadata_dir(false)).to eq(File.join(tree1, 'metadata'))
|
158
185
|
expect(druid.temp_dir(false)).to eq(File.join(tree1, 'temp'))
|
159
186
|
|
160
|
-
expect(File.exist?(File.join(tree1, 'content'))).to
|
161
|
-
expect(File.exist?(File.join(tree1, 'metadata'))).to
|
162
|
-
expect(File.exist?(File.join(tree1, 'temp'))).to
|
187
|
+
expect(File.exist?(File.join(tree1, 'content'))).to be false
|
188
|
+
expect(File.exist?(File.join(tree1, 'metadata'))).to be false
|
189
|
+
expect(File.exist?(File.join(tree1, 'temp'))).to be false
|
163
190
|
end
|
164
191
|
|
165
192
|
it 'creates its content directories on the fly' do
|
@@ -168,9 +195,9 @@ RSpec.describe DruidTools::Druid do
|
|
168
195
|
expect(druid.metadata_dir).to eq(File.join(tree1, 'metadata'))
|
169
196
|
expect(druid.temp_dir).to eq(File.join(tree1, 'temp'))
|
170
197
|
|
171
|
-
expect(File.exist?(File.join(tree1, 'content'))).to
|
172
|
-
expect(File.exist?(File.join(tree1, 'metadata'))).to
|
173
|
-
expect(File.exist?(File.join(tree1, 'temp'))).to
|
198
|
+
expect(File.exist?(File.join(tree1, 'content'))).to be true
|
199
|
+
expect(File.exist?(File.join(tree1, 'metadata'))).to be true
|
200
|
+
expect(File.exist?(File.join(tree1, 'temp'))).to be true
|
174
201
|
end
|
175
202
|
|
176
203
|
it 'matches glob' do
|
@@ -178,6 +205,7 @@ RSpec.describe DruidTools::Druid do
|
|
178
205
|
druid.mkdir
|
179
206
|
expect(Dir.glob(File.join(File.dirname(druid.path), described_class.glob)).size).to eq(1)
|
180
207
|
end
|
208
|
+
|
181
209
|
it 'matches strict_glob' do
|
182
210
|
druid = described_class.new(druid_str, fixture_dir)
|
183
211
|
druid.mkdir
|
@@ -194,31 +222,31 @@ RSpec.describe DruidTools::Druid do
|
|
194
222
|
|
195
223
|
it 'finds content in content directories' do
|
196
224
|
location = druid.content_dir
|
197
|
-
File.
|
225
|
+
File.write(File.join(location, 'someContent'), 'This is the content')
|
198
226
|
expect(druid.find_content('someContent')).to eq(File.join(location, 'someContent'))
|
199
227
|
end
|
200
228
|
|
201
229
|
it 'finds content in the root directory' do
|
202
230
|
location = druid.path(nil, true)
|
203
|
-
File.
|
231
|
+
File.write(File.join(location, 'someContent'), 'This is the content')
|
204
232
|
expect(druid.find_content('someContent')).to eq(File.join(location, 'someContent'))
|
205
233
|
end
|
206
234
|
|
207
235
|
it 'finds content in the leaf directory' do
|
208
236
|
location = File.expand_path('..', druid.path(nil, true))
|
209
|
-
File.
|
237
|
+
File.write(File.join(location, 'someContent'), 'This is the content')
|
210
238
|
expect(druid.find_content('someContent')).to eq(File.join(location, 'someContent'))
|
211
239
|
end
|
212
240
|
|
213
241
|
it 'does not find content in the wrong content directory' do
|
214
242
|
location = druid.metadata_dir
|
215
|
-
File.
|
243
|
+
File.write(File.join(location, 'someContent'), 'This is the content')
|
216
244
|
expect(druid.find_content('someContent')).to be_nil
|
217
245
|
end
|
218
246
|
|
219
247
|
it 'does not find content in a higher-up directory' do
|
220
248
|
location = File.expand_path('../..', druid.path(nil, true))
|
221
|
-
File.
|
249
|
+
File.write(File.join(location, 'someContent'), 'This is the content')
|
222
250
|
expect(druid.find_content('someContent')).to be_nil
|
223
251
|
end
|
224
252
|
|
@@ -269,7 +297,10 @@ RSpec.describe DruidTools::Druid do
|
|
269
297
|
source_dir = '/tmp/content_dir'
|
270
298
|
FileUtils.mkdir_p(source_dir)
|
271
299
|
dr = described_class.new(strictly_valid_druid_str, fixture_dir)
|
272
|
-
dr.
|
300
|
+
new_path = dr.path
|
301
|
+
FileUtils.mkdir_p(File.expand_path('..', new_path))
|
302
|
+
FileUtils.ln_s(source_dir, new_path, force: true)
|
303
|
+
|
273
304
|
expect { dr.mkdir }.to raise_error(DruidTools::DifferentContentExistsError)
|
274
305
|
end
|
275
306
|
end
|
@@ -279,6 +310,7 @@ RSpec.describe DruidTools::Druid do
|
|
279
310
|
let(:druid_obj) { described_class.new(strictly_valid_druid_str, fixture_dir) }
|
280
311
|
|
281
312
|
before do
|
313
|
+
allow(Deprecation).to receive(:warn)
|
282
314
|
FileUtils.mkdir_p(source_dir)
|
283
315
|
end
|
284
316
|
|
@@ -304,12 +336,43 @@ RSpec.describe DruidTools::Druid do
|
|
304
336
|
let(:workspace) { Dir.mktmpdir }
|
305
337
|
let(:dr1) { described_class.new(druid_str, workspace) }
|
306
338
|
let(:dr2) { described_class.new(strictly_valid_druid_str, workspace) }
|
339
|
+
let(:dr3) { DruidTools::AccessDruid.new(access_druid_str, workspace) }
|
307
340
|
let(:pathname1) { dr1.pathname }
|
308
341
|
|
342
|
+
before do
|
343
|
+
allow(Deprecation).to receive(:warn)
|
344
|
+
end
|
345
|
+
|
309
346
|
after do
|
310
347
|
FileUtils.remove_entry workspace
|
311
348
|
end
|
312
349
|
|
350
|
+
context 'with an access druid sharing the first three path segments' do
|
351
|
+
before do
|
352
|
+
# Nil the create records for this context because we're in a known read only one
|
353
|
+
dr1.mkdir
|
354
|
+
dr2.mkdir
|
355
|
+
dr3.mkdir
|
356
|
+
dr3.prune!
|
357
|
+
end
|
358
|
+
|
359
|
+
it 'deletes the outermost directory' do
|
360
|
+
expect(File).not_to exist(dr3.pruning_base)
|
361
|
+
end
|
362
|
+
|
363
|
+
it 'does not delete unrelated ancestor directories' do
|
364
|
+
expect(File).to exist(dr1.pruning_base)
|
365
|
+
expect(File).to exist(dr1.pruning_base.parent)
|
366
|
+
end
|
367
|
+
|
368
|
+
it 'stops at ancestor directories that have children' do
|
369
|
+
# 'cd/456/ef' should still exist because of dr1
|
370
|
+
shared_ancestor = dr1.pruning_base.parent
|
371
|
+
expect(shared_ancestor.to_s).to match(%r{cd/456/ef$})
|
372
|
+
expect(File).to exist(shared_ancestor)
|
373
|
+
end
|
374
|
+
end
|
375
|
+
|
313
376
|
context 'when there is a shared ancestor' do
|
314
377
|
before do
|
315
378
|
# Nil the create records for this context because we're in a known read only one
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: druid-tools
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Klein
|
@@ -9,8 +9,22 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2022-04-01 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: deprecation
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - ">="
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: '0'
|
21
|
+
type: :runtime
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: '0'
|
14
28
|
- !ruby/object:Gem::Dependency
|
15
29
|
name: coveralls
|
16
30
|
requirement: !ruby/object:Gem::Requirement
|
@@ -57,30 +71,30 @@ dependencies:
|
|
57
71
|
name: rubocop
|
58
72
|
requirement: !ruby/object:Gem::Requirement
|
59
73
|
requirements:
|
60
|
-
- - "
|
74
|
+
- - ">="
|
61
75
|
- !ruby/object:Gem::Version
|
62
|
-
version: 0
|
76
|
+
version: '0'
|
63
77
|
type: :development
|
64
78
|
prerelease: false
|
65
79
|
version_requirements: !ruby/object:Gem::Requirement
|
66
80
|
requirements:
|
67
|
-
- - "
|
81
|
+
- - ">="
|
68
82
|
- !ruby/object:Gem::Version
|
69
|
-
version: 0
|
83
|
+
version: '0'
|
70
84
|
- !ruby/object:Gem::Dependency
|
71
85
|
name: rubocop-rspec
|
72
86
|
requirement: !ruby/object:Gem::Requirement
|
73
87
|
requirements:
|
74
|
-
- - "
|
88
|
+
- - ">="
|
75
89
|
- !ruby/object:Gem::Version
|
76
|
-
version:
|
90
|
+
version: '0'
|
77
91
|
type: :development
|
78
92
|
prerelease: false
|
79
93
|
version_requirements: !ruby/object:Gem::Requirement
|
80
94
|
requirements:
|
81
|
-
- - "
|
95
|
+
- - ">="
|
82
96
|
- !ruby/object:Gem::Version
|
83
|
-
version:
|
97
|
+
version: '0'
|
84
98
|
description: Tools to manipulate DRUID trees and content directories
|
85
99
|
email:
|
86
100
|
- mbklein@stanford.edu
|
@@ -88,11 +102,12 @@ executables: []
|
|
88
102
|
extensions: []
|
89
103
|
extra_rdoc_files: []
|
90
104
|
files:
|
105
|
+
- ".circleci/config.yml"
|
106
|
+
- ".github/pull_request_template.md"
|
91
107
|
- ".gitignore"
|
92
108
|
- ".rspec"
|
93
109
|
- ".rubocop.yml"
|
94
110
|
- ".rubocop_todo.yml"
|
95
|
-
- ".travis.yml"
|
96
111
|
- Gemfile
|
97
112
|
- LICENSE
|
98
113
|
- README.md
|
@@ -112,7 +127,8 @@ homepage: http://github.com/sul-dlss/druid-tools
|
|
112
127
|
licenses:
|
113
128
|
- ALv2
|
114
129
|
- Stanford University Libraries
|
115
|
-
metadata:
|
130
|
+
metadata:
|
131
|
+
rubygems_mfa_required: 'true'
|
116
132
|
post_install_message:
|
117
133
|
rdoc_options: []
|
118
134
|
require_paths:
|
@@ -121,15 +137,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
121
137
|
requirements:
|
122
138
|
- - ">="
|
123
139
|
- !ruby/object:Gem::Version
|
124
|
-
version: '
|
140
|
+
version: '2.7'
|
125
141
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
126
142
|
requirements:
|
127
143
|
- - ">="
|
128
144
|
- !ruby/object:Gem::Version
|
129
145
|
version: '0'
|
130
146
|
requirements: []
|
131
|
-
|
132
|
-
rubygems_version: 2.7.6
|
147
|
+
rubygems_version: 3.2.32
|
133
148
|
signing_key:
|
134
149
|
specification_version: 4
|
135
150
|
summary: Tools to manipulate DRUID trees and content directories
|
data/.travis.yml
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
notifications:
|
2
|
-
email: false
|
3
|
-
|
4
|
-
rvm:
|
5
|
-
- 2.4.6
|
6
|
-
- 2.5.5
|
7
|
-
- 2.6.3
|
8
|
-
|
9
|
-
# script, expressed as an array, is necessary for 'bundle exec coveralls push' to work locally
|
10
|
-
script:
|
11
|
-
- bundle exec rake
|
12
|
-
|
13
|
-
cache: bundler
|
14
|
-
|
15
|
-
before_install:
|
16
|
-
- gem install bundler # the default version of bundler for ruby 2.1 is out of date.
|