valkyrie 3.2.0 → 3.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7439f8be7099e4b54998826abda9222d07226ff7a54fdb868f2ab7d99596fd56
4
- data.tar.gz: 866c57941b2e2604a8d7bd8b013e0b31c07dd909404733cfb7043c61412389ad
3
+ metadata.gz: a4fcef8213a3e959929dbdb15bffd20c70bf3a5a07ff977a4937271d137d51a7
4
+ data.tar.gz: 875ced504589316a4d837fbd4d2d8bfe2e590d0e5f5f3c792edefe1461575a25
5
5
  SHA512:
6
- metadata.gz: 89d1857a2f40c0d8c32c6a31a9ff1247e9b8c32aa84e917c77c3d89e6a0cb52c7548802852914ddcf11d9805f3cf0b6784331f937cf9004b18e63ecb27449971
7
- data.tar.gz: 5b143107a9ca53b86c83c5ba884635fb869919a7641c1373324193f9ac918684557177cf2c2519f5d8eeb0420bd48404037da5fb46c84d5a17bda0e4381b72f7
6
+ metadata.gz: 98945b1fdd7f8cce636eea9abf5fc44c05d8291d1955b22ff91e218e12b81f4b3b617f52d0c846b179e040f623665a62027c60de2b50c50d7b027a7008d78e12
7
+ data.tar.gz: 844db5f6507ff3678ffe3c253a29dedd7753d26da6495ffcf51e2a275e6175fc9a904361a5724ec385330366eb84eaf13acf66db014bc783201e2e06e11168fb
data/.circleci/config.yml CHANGED
@@ -9,7 +9,7 @@ jobs:
9
9
  type: "string"
10
10
  ruby:
11
11
  description: "Ruby version"
12
- default: "2.7.7"
12
+ default: "3.1.6"
13
13
  type: "string"
14
14
  docker:
15
15
  - image: cimg/ruby:<< parameters.ruby >>
@@ -96,57 +96,45 @@ workflows:
96
96
  build:
97
97
  jobs:
98
98
  - build:
99
- gemfile: "gemfiles/activerecord_7_0.gemfile"
100
- ruby: 3.2.0
101
- name: "Ruby3-2_rails7-0"
99
+ gemfile: "gemfiles/activerecord_7_2.gemfile"
100
+ ruby: 3.3.5
101
+ name: "Ruby3-3_rails7-2"
102
102
  - build:
103
- gemfile: "gemfiles/activerecord_6_0.gemfile"
104
- ruby: 3.2.0
105
- name: "Ruby3-2_Rails6-0"
103
+ gemfile: "gemfiles/activerecord_7_1.gemfile"
104
+ ruby: 3.3.5
105
+ name: "Ruby3-3_rails7-1"
106
106
  - build:
107
107
  gemfile: "gemfiles/activerecord_7_0.gemfile"
108
- ruby: 3.1.3
109
- name: "Ruby3-1_rails7-0"
108
+ ruby: 3.3.5
109
+ name: "Ruby3-3_rails7-0"
110
110
  - build:
111
- gemfile: "gemfiles/activerecord_6_0.gemfile"
112
- ruby: 3.1.3
113
- name: "Ruby3-1_Rails6-0"
111
+ gemfile: "gemfiles/activerecord_7_2.gemfile"
112
+ ruby: 3.2.5
113
+ name: "Ruby3-2_rails7-2"
114
+ - build:
115
+ gemfile: "gemfiles/activerecord_7_1.gemfile"
116
+ ruby: 3.2.5
117
+ name: "Ruby3-2_rails7-1"
114
118
  - build:
115
119
  gemfile: "gemfiles/activerecord_7_0.gemfile"
116
- ruby: 3.0.5
117
- name: "Ruby3-0_rails7-0"
120
+ ruby: 3.2.5
121
+ name: "Ruby3-2_rails7-0"
118
122
  - build:
119
- gemfile: "gemfiles/activerecord_6_0.gemfile"
120
- ruby: 3.0.5
121
- name: "Ruby3-0_Rails6-0"
123
+ gemfile: "gemfiles/activerecord_7_2.gemfile"
124
+ ruby: 3.1.6
125
+ name: "Ruby3-1_rails7-2"
122
126
  - build:
123
- gemfile: "gemfiles/activerecord_7_0.gemfile"
124
- ruby: 2.7.7
125
- name: "Ruby2-7_rails7-0"
127
+ gemfile: "gemfiles/activerecord_7_1.gemfile"
128
+ ruby: 3.1.6
129
+ name: "Ruby3-1_rails7-1"
126
130
  - build:
127
- gemfile: "gemfiles/activerecord_6_0.gemfile"
128
- ruby: 2.7.7
129
- name: "Ruby2-7_Rails6-0"
131
+ gemfile: "gemfiles/activerecord_7_0.gemfile"
132
+ ruby: 3.1.6
133
+ name: "Ruby3-1_rails7-0"
130
134
  - build:
131
135
  gemfile: "gemfiles/faraday_1.gemfile"
132
- ruby: 2.7.7
136
+ ruby: 3.1.6
133
137
  name: "Faraday1"
134
- - build:
135
- gemfile: "gemfiles/faraday_0.gemfile"
136
- ruby: 2.7.7
137
- name: "Faraday0"
138
- - build:
139
- gemfile: "gemfiles/activerecord_6_0.gemfile"
140
- ruby: 2.6.10
141
- name: "Ruby2-6_Rails6-0"
142
- - build:
143
- gemfile: "gemfiles/activerecord_5_2.gemfile"
144
- ruby: 2.7.7
145
- name: "Ruby2-7_Rails5-2"
146
- - build:
147
- gemfile: "gemfiles/activerecord_5_2.gemfile"
148
- ruby: 2.6.10
149
- name: "Ruby2-6_Rails5-2"
150
138
 
151
139
  nightly:
152
140
  triggers:
@@ -158,54 +146,42 @@ workflows:
158
146
  - master
159
147
  jobs:
160
148
  - build:
161
- gemfile: "gemfiles/activerecord_7_0.gemfile"
162
- ruby: 3.2.0
163
- name: "Ruby3-2_rails7-0"
149
+ gemfile: "gemfiles/activerecord_7_2.gemfile"
150
+ ruby: 3.3.5
151
+ name: "Ruby3-3_rails7-2"
164
152
  - build:
165
- gemfile: "gemfiles/activerecord_6_0.gemfile"
166
- ruby: 3.2.0
167
- name: "Ruby3-2_Rails6-0"
153
+ gemfile: "gemfiles/activerecord_7_1.gemfile"
154
+ ruby: 3.3.5
155
+ name: "Ruby3-3_rails7-1"
168
156
  - build:
169
157
  gemfile: "gemfiles/activerecord_7_0.gemfile"
170
- ruby: 3.1.3
171
- name: "Ruby3-1_rails7-0"
158
+ ruby: 3.3.5
159
+ name: "Ruby3-3_rails7-0"
172
160
  - build:
173
- gemfile: "gemfiles/activerecord_6_0.gemfile"
174
- ruby: 3.1.3
175
- name: "Ruby3-1_Rails6-0"
161
+ gemfile: "gemfiles/activerecord_7_2.gemfile"
162
+ ruby: 3.2.5
163
+ name: "Ruby3-2_rails7-2"
164
+ - build:
165
+ gemfile: "gemfiles/activerecord_7_1.gemfile"
166
+ ruby: 3.2.5
167
+ name: "Ruby3-2_rails7-1"
176
168
  - build:
177
169
  gemfile: "gemfiles/activerecord_7_0.gemfile"
178
- ruby: 3.0.5
179
- name: "Ruby3-0_rails7-0"
170
+ ruby: 3.2.5
171
+ name: "Ruby3-2_rails7-0"
180
172
  - build:
181
- gemfile: "gemfiles/activerecord_6_0.gemfile"
182
- ruby: 3.0.5
183
- name: "Ruby3-0_Rails6-0"
173
+ gemfile: "gemfiles/activerecord_7_2.gemfile"
174
+ ruby: 3.1.6
175
+ name: "Ruby3-1_rails7-2"
184
176
  - build:
185
- gemfile: "gemfiles/activerecord_7_0.gemfile"
186
- ruby: 2.7.7
187
- name: "Ruby2-7_rails7-0"
177
+ gemfile: "gemfiles/activerecord_7_1.gemfile"
178
+ ruby: 3.1.6
179
+ name: "Ruby3-1_rails7-1"
188
180
  - build:
189
- gemfile: "gemfiles/activerecord_6_0.gemfile"
190
- ruby: 2.7.7
191
- name: "Ruby2-7_Rails6-0"
181
+ gemfile: "gemfiles/activerecord_7_0.gemfile"
182
+ ruby: 3.1.6
183
+ name: "Ruby3-1_rails7-0"
192
184
  - build:
193
185
  gemfile: "gemfiles/faraday_1.gemfile"
194
- ruby: 2.7.7
186
+ ruby: 3.1.6
195
187
  name: "Faraday1"
196
- - build:
197
- gemfile: "gemfiles/faraday_0.gemfile"
198
- ruby: 2.7.7
199
- name: "Faraday0"
200
- - build:
201
- gemfile: "gemfiles/activerecord_6_0.gemfile"
202
- ruby: 2.6.10
203
- name: "Ruby2-6_Rails6-0"
204
- - build:
205
- gemfile: "gemfiles/activerecord_5_2.gemfile"
206
- ruby: 2.7.7
207
- name: "Ruby2-7_Rails5-2"
208
- - build:
209
- gemfile: "gemfiles/activerecord_5_2.gemfile"
210
- ruby: 2.6.10
211
- name: "Ruby2-6_Rails5-2"
data/.tool-versions CHANGED
@@ -1 +1 @@
1
- ruby 2.7.5
1
+ ruby 3.3.5
data/Appraisals CHANGED
@@ -1,23 +1,18 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- appraise "activerecord-7-0" do
4
- gem "activerecord", "~> 7.0.0"
5
- end
6
-
7
- appraise "activerecord-6-0" do
8
- gem "activerecord", "~> 6.0.0"
3
+ appraise "activerecord-7-2" do
4
+ gem "activerecord", "~> 7.2.0"
9
5
  end
10
6
 
11
- appraise "activerecord-5-2" do
12
- gem "activerecord", "~> 5.2.0"
7
+ appraise "activerecord-7-1" do
8
+ gem "activerecord", "~> 7.1.0"
13
9
  end
14
10
 
15
- appraise "faraday-0" do
16
- gem "faraday", "< 1"
17
- gem "activerecord", "~> 6.0.0"
11
+ appraise "activerecord-7-0" do
12
+ gem "activerecord", "~> 7.0.0"
18
13
  end
19
14
 
20
15
  appraise "faraday-1" do
21
16
  gem "faraday", "~> 1.0"
22
- gem "activerecord", "~> 6.0.0"
17
+ gem "activerecord", "~> 7.0.0"
23
18
  end
data/CHANGELOG.md CHANGED
@@ -1,3 +1,18 @@
1
+ # v3.4.0 2024-10-11
2
+
3
+ ## Changes since last release
4
+
5
+ * Adds config setting index_tsim_only_threshold ([dchandekstark](https://github.com/dchandekstark))
6
+ * Fix related URIs for pairtree paths in Fedora. ([randalldfloyd](https://github.com/randalldfloyd))
7
+ * Return nil when #id_to_uri is passed empty strings. ([bwatson78](https://github.com/bwatson78))
8
+ * Add support for Ruby 3.3 and Rails 7.2 ([cjcolvar](https://github.com/cjcolvar))
9
+
10
+ # v3.3.0 2024-07-03
11
+
12
+ ## Changes since last release
13
+
14
+ * Add support for configurable pairtree IDs in Fedora 6. ([randalldfloyd](https://github.com/randalldfloyd))
15
+
1
16
  # v3.2.0 2024-04-10
2
17
 
3
18
  ## Changes since last release
data/README.md CHANGED
@@ -234,6 +234,39 @@ config. If Fedora requires auth, you can also include that in the URL, e.g.:
234
234
  fedora_version: 5
235
235
  )
236
236
  ```
237
+ #### Pairtree paths in Fedora 4/6
238
+ Fedora 4 and 6.5+ support automatic creation of "pairtree" paths, which means that identifiers are stored in
239
+ a hashed directory structure to avoid excessive child nodes directly in the root node.
240
+
241
+ Unlike Fedora 4 where this is the default behavior, it has to be enabled via options in Fedora 6.5. This is
242
+ done by configuring both the count and length of the pairtree algorithm, so it needs to be configured
243
+ in the Fedora adapters so that both sides match.
244
+
245
+ In the following example, Fedora 6.5 is being started with options to create pairtree paths consisting of
246
+ 4 segments, 2 characters in length:
247
+
248
+ ```angular2html
249
+ CATALINA_OPTS=-Dfcrepo.home=/fcrepo-home ...
250
+ ...
251
+ -Dfcrepo.pid.minter.length=2 -Dfcrepo.pid.minter.count=4
252
+ ```
253
+ For the Fedora metadata/storage adapters to correctly translate identifiers into URI's, they should be initialized
254
+ like:
255
+
256
+ ```angular2html
257
+ Valkyrie::Persistence::Fedora::MetadataAdapter.new(
258
+ connection: ::Ldp::Client.new("http://localhost:8080/fcrepo/rest"),
259
+ fedora_version: 6.5,
260
+ fedora_pairtree_count: 4,
261
+ fedora_pairtree_length: 2
262
+ )
263
+ ```
264
+
265
+ In the configuration above, an ID of `AaBbCcDd` will be created in Fedora under the root node as `/Aa/Bb/Cc/Dd/AaBbCcDd`.
266
+ If count and length correctly match in the Fedora adapters, that same path will be calculated and returned.
267
+
268
+ Note that the configuration above is not required for pairtree paths to work correctly in Fedora 4, and automatic
269
+ pairtree creation is not supported under Fedora 5 or Fedora 6 < 6.5.
237
270
 
238
271
  ## Installing a Development environment
239
272
 
data/Rakefile CHANGED
@@ -68,10 +68,14 @@ namespace :db do
68
68
  ActiveRecord::Migrator.migrate(MIGRATIONS_DIR, version) do |migration|
69
69
  scope.blank? || scope == migration.scope
70
70
  end
71
- else
71
+ elsif ActiveRecord.version < Gem::Version.new("7.2.0")
72
72
  ActiveRecord::Base.connection.migration_context.migrate(version) do |migration|
73
73
  scope.blank? || scope == migration.scope
74
74
  end
75
+ else
76
+ ActiveRecord::MigrationContext.new(ActiveRecord::Migrator.migrations_paths).migrate(version) do |migration|
77
+ scope.blank? || scope == migration.scope
78
+ end
75
79
  end
76
80
  ActiveRecord::Base.clear_cache!
77
81
  ensure
@@ -3,7 +3,7 @@
3
3
 
4
4
  source "https://rubygems.org"
5
5
 
6
- gem "activerecord", "~> 5.2.0"
6
+ gem "activerecord", "~> 7.1.0"
7
7
  gem "ldp"
8
8
  gem "pg"
9
9
  gem "rsolr"
@@ -3,7 +3,7 @@
3
3
 
4
4
  source "https://rubygems.org"
5
5
 
6
- gem "activerecord", "~> 6.0.0"
6
+ gem "activerecord", "~> 7.2.0"
7
7
  gem "ldp"
8
8
  gem "pg"
9
9
  gem "rsolr"
@@ -3,7 +3,7 @@
3
3
 
4
4
  source "https://rubygems.org"
5
5
 
6
- gem "activerecord", "~> 6.0.0"
6
+ gem "activerecord", "~> 7.0.0"
7
7
  gem "ldp"
8
8
  gem "pg"
9
9
  gem "rsolr"
@@ -9,17 +9,23 @@ module Valkyrie::Persistence::Fedora
9
9
  # schema: Valkyrie::Persistence::Fedora::PermissiveSchema.new(title: RDF::URI("http://example.com/title"))
10
10
  # )
11
11
  class MetadataAdapter
12
- attr_reader :connection, :base_path, :schema, :fedora_version
12
+ attr_reader :connection, :base_path, :schema, :fedora_version, :pairtree_count, :pairtree_length
13
13
 
14
14
  # @param [Ldp::Client] connection
15
15
  # @param [String] base_path
16
16
  # @param [Valkyrie::Persistence::Fedora::PermissiveSchema] schema
17
17
  # @param [Integer] fedora_version
18
- def initialize(connection:, base_path: "/", schema: Valkyrie::Persistence::Fedora::PermissiveSchema.new, fedora_version: Valkyrie::Persistence::Fedora::DEFAULT_FEDORA_VERSION)
18
+ # @param [Integer] fedora_pairtree_count
19
+ # @param [Integer] fedora_pairtree_length
20
+ def initialize(connection:, base_path: "/", schema: Valkyrie::Persistence::Fedora::PermissiveSchema.new, # rubocop:disable Metrics/ParameterLists
21
+ fedora_version: Valkyrie::Persistence::Fedora::DEFAULT_FEDORA_VERSION,
22
+ fedora_pairtree_count: 0, fedora_pairtree_length: 0)
19
23
  @connection = connection
20
24
  @base_path = base_path
21
25
  @schema = schema
22
26
  @fedora_version = fedora_version
27
+ @pairtree_count = fedora_pairtree_count
28
+ @pairtree_length = fedora_pairtree_length
23
29
  end
24
30
 
25
31
  # Construct the query service object using this adapter
@@ -58,7 +64,9 @@ module Valkyrie::Persistence::Fedora
58
64
  # @param [RDF::URI] id the Valkyrie ID
59
65
  # @return [RDF::URI]
60
66
  def id_to_uri(id)
61
- prefix = [5, 6].include?(fedora_version) ? "" : "#{pair_path(id)}/"
67
+ return if id.to_s.empty?
68
+ prefix = ""
69
+ prefix = "#{pair_path(id)}/" if fedora_version == 4 || (fedora_version >= 6.5 && (pairtree_count * pairtree_length).positive?)
62
70
  RDF::URI("#{connection_prefix}/#{prefix}#{CGI.escape(id.to_s)}")
63
71
  end
64
72
 
@@ -68,7 +76,16 @@ module Valkyrie::Persistence::Fedora
68
76
  # @param [Valkyrie::ID] id the Valkyrie ID
69
77
  # @return [Array<String>]
70
78
  def pair_path(id)
71
- id.to_s.split(/[-\/]/).first.split("").each_slice(2).map(&:join).join("/")
79
+ if fedora_version >= 6.5
80
+ # When configurable, pair the part up to count * length, but only up to a slash
81
+ pair_part = id.to_s[0, pairtree_count * pairtree_length].split(/[\/]/).first
82
+ slice_length = pairtree_length
83
+ else
84
+ # When not configurable, pair the full string, but only up to a dash or slash
85
+ pair_part = id.to_s.split(/[-\/]/).first
86
+ slice_length = 2
87
+ end
88
+ pair_part.split("").each_slice(slice_length).map(&:join).join("/")
72
89
  end
73
90
 
74
91
  def url_prefix
@@ -52,7 +52,7 @@ module Valkyrie::Persistence::Fedora
52
52
  # @return [Array<RDF::URI>]
53
53
  def include_uris
54
54
  [
55
- [5, 6].include?(adapter.fedora_version) ? "http://fedora.info/definitions/fcrepo#PreferInboundReferences" : ::RDF::Vocab::Fcrepo4.InboundReferences
55
+ adapter.fedora_version >= 5 ? "http://fedora.info/definitions/fcrepo#PreferInboundReferences" : ::RDF::Vocab::Fcrepo4.InboundReferences
56
56
  ]
57
57
  end
58
58
 
@@ -422,7 +422,7 @@ module Valkyrie::Persistence::Solr
422
422
  # @see https://github.com/samvera-labs/valkyrie/blob/main/solr/config/schema.xml
423
423
  # @return [Array<Symbol>]
424
424
  def fields
425
- if value.value.length > 1000
425
+ if value.value.length > Valkyrie.config.index_tsim_only_threshold
426
426
  [:tsim]
427
427
  else
428
428
  [:tsim, :ssim, :tesim, :tsi, :ssi, :tesi]
@@ -2,15 +2,26 @@
2
2
  module Valkyrie::Storage
3
3
  # Implements the DataMapper Pattern to store binary data in fedora
4
4
  class Fedora
5
- attr_reader :connection, :base_path, :fedora_version
5
+ attr_reader :connection, :base_path, :fedora_version, :pairtree_count, :pairtree_length, :uri_transformer
6
6
  PROTOCOL = 'fedora://'
7
7
  SLASH = '/'
8
8
 
9
9
  # @param [Ldp::Client] connection
10
- def initialize(connection:, base_path: "/", fedora_version: Valkyrie::Persistence::Fedora::DEFAULT_FEDORA_VERSION)
10
+ # @param [Integer] fedora_pairtree_count
11
+ # @param [Integer] fedora_pairtree_length
12
+ def initialize(connection:, base_path: "/", fedora_version: Valkyrie::Persistence::Fedora::DEFAULT_FEDORA_VERSION,
13
+ fedora_pairtree_count: 0, fedora_pairtree_length: 0)
11
14
  @connection = connection
12
15
  @base_path = base_path
13
16
  @fedora_version = fedora_version
17
+ @pairtree_count = fedora_pairtree_count
18
+ @pairtree_length = fedora_pairtree_length
19
+
20
+ @uri_transformer = if fedora_version >= 6.5 && (pairtree_count * pairtree_length).positive?
21
+ pairtree_resource_uri_transformer
22
+ else
23
+ default_resource_uri_transformer
24
+ end
14
25
  end
15
26
 
16
27
  # @param id [Valkyrie::ID]
@@ -24,7 +35,7 @@ module Valkyrie::Storage
24
35
  def supports?(feature)
25
36
  return true if feature == :versions
26
37
  # Fedora 6 auto versions and you can't delete versions.
27
- return true if feature == :version_deletion && fedora_version != 6
38
+ return true if feature == :version_deletion && fedora_version < 6
28
39
  false
29
40
  end
30
41
 
@@ -44,7 +55,7 @@ module Valkyrie::Storage
44
55
  # @param extra_arguments [Hash] additional arguments which may be passed to other adapters
45
56
  # @return [Valkyrie::StorageAdapter::StreamFile]
46
57
  def upload(file:, original_filename:, resource:, content_type: "application/octet-stream", # rubocop:disable Metrics/ParameterLists
47
- resource_uri_transformer: default_resource_uri_transformer, **_extra_arguments)
58
+ resource_uri_transformer: uri_transformer, **_extra_arguments)
48
59
  identifier = resource_uri_transformer.call(resource, base_url) + '/original'
49
60
  upload_file(fedora_uri: identifier, io: file, content_type: content_type, original_filename: original_filename)
50
61
  # Fedora 6 auto versions, so check to see if there's a version for this
@@ -60,7 +71,7 @@ module Valkyrie::Storage
60
71
  uri = fedora_identifier(id: id)
61
72
  # Fedora 6 has auto versioning, so have to sleep if it's too soon after last
62
73
  # upload.
63
- if fedora_version == 6 && current_version_id(id: id).to_s.split("/").last == Time.current.utc.strftime("%Y%m%d%H%M%S")
74
+ if fedora_version >= 6 && current_version_id(id: id).to_s.split("/").last == Time.current.utc.strftime("%Y%m%d%H%M%S")
64
75
  sleep(0.5)
65
76
  return upload_version(id: id, file: file)
66
77
  end
@@ -102,7 +113,7 @@ module Valkyrie::Storage
102
113
  end
103
114
 
104
115
  def upload_file(fedora_uri:, io:, content_type: "application/octet-stream", original_filename: "default")
105
- sha1 = [5, 6].include?(fedora_version) ? "sha" : "sha1"
116
+ sha1 = fedora_version >= 5 ? "sha" : "sha1"
106
117
  connection.http.put do |request|
107
118
  request.url fedora_uri
108
119
  request.headers['Content-Type'] = content_type
@@ -141,7 +152,7 @@ module Valkyrie::Storage
141
152
  version_id ||= id if id != current_id
142
153
  # No version got passed and we're asking for a current_id, gotta get the
143
154
  # version ID
144
- return perform_find(id: current_id, version_id: (current_version_id(id: id) || :empty)) if version_id.nil?
155
+ return perform_find(id: current_id, version_id: current_version_id(id: id) || :empty) if version_id.nil?
145
156
  Valkyrie::StorageAdapter::StreamFile.new(id: current_id, io: response(id: id), version_id: version_id)
146
157
  end
147
158
 
@@ -211,6 +222,18 @@ module Valkyrie::Storage
211
222
  end
212
223
  end
213
224
 
225
+ def pairtree_resource_uri_transformer
226
+ lambda do |resource, base_url|
227
+ id = CGI.escape(resource.id.to_s)
228
+ return RDF::URI.new(base_url + id) unless (pairtree_count * pairtree_length).positive?
229
+
230
+ pair_part = id.to_s[0, pairtree_count * pairtree_length].split(/[\/]/).first
231
+ slice_length = pairtree_length
232
+ prefix = pair_part.split("").each_slice(slice_length).map(&:join).join("/")
233
+ RDF::URI.new(base_url + "#{prefix}/" + id)
234
+ end
235
+ end
236
+
214
237
  def base_url
215
238
  pre_divider = base_path.starts_with?(SLASH) ? '' : SLASH
216
239
  post_divider = base_path.ends_with?(SLASH) ? '' : SLASH
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module Valkyrie
3
- VERSION = "3.2.0"
3
+ VERSION = "3.4.0"
4
4
  end
data/lib/valkyrie.rb CHANGED
@@ -97,6 +97,10 @@ module Valkyrie
97
97
  Valkyrie::StorageAdapter.find(self[:storage_adapter].to_sym)
98
98
  end
99
99
 
100
+ def index_tsim_only_threshold
101
+ self[:index_tsim_only_threshold].to_i
102
+ end
103
+
100
104
  # @api public
101
105
  #
102
106
  # The returned anonymous method (e.g. responds to #call) has a signature of
@@ -118,7 +122,8 @@ module Valkyrie
118
122
 
119
123
  def defaults
120
124
  {
121
- resource_class_resolver: method(:default_resource_class_resolver)
125
+ resource_class_resolver: method(:default_resource_class_resolver),
126
+ index_tsim_only_threshold: 1000
122
127
  }
123
128
  end
124
129
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: valkyrie
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.2.0
4
+ version: 3.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Trey Pendragon
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-05-07 00:00:00.000000000 Z
11
+ date: 2024-10-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dry-struct
@@ -452,10 +452,9 @@ files:
452
452
  - db/migrate/20180212092225_create_updated_at_index.rb
453
453
  - db/migrate/20180802220739_add_optimistic_locking_to_orm_resources.rb
454
454
  - db/schema.rb
455
- - gemfiles/activerecord_5_2.gemfile
456
- - gemfiles/activerecord_6_0.gemfile
457
455
  - gemfiles/activerecord_7_0.gemfile
458
- - gemfiles/faraday_0.gemfile
456
+ - gemfiles/activerecord_7_1.gemfile
457
+ - gemfiles/activerecord_7_2.gemfile
459
458
  - gemfiles/faraday_1.gemfile
460
459
  - lib/valkyrie.rb
461
460
  - lib/valkyrie/adapter_container.rb
@@ -582,7 +581,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
582
581
  - !ruby/object:Gem::Version
583
582
  version: '0'
584
583
  requirements: []
585
- rubygems_version: 3.1.6
584
+ rubygems_version: 3.5.16
586
585
  signing_key:
587
586
  specification_version: 4
588
587
  summary: An ORM using the Data Mapper pattern, specifically built to solve Digital
@@ -1,12 +0,0 @@
1
- # frozen_string_literal: true
2
- # This file was generated by Appraisal
3
-
4
- source "https://rubygems.org"
5
-
6
- gem "activerecord", "~> 6.0.0"
7
- gem "ldp"
8
- gem "pg"
9
- gem "rsolr"
10
- gem "faraday", "< 1"
11
-
12
- gemspec path: "../"