atlas_rb 1.8.4 → 1.8.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.version +1 -1
- data/CHANGELOG.md +13 -0
- data/Gemfile.lock +1 -1
- data/lib/atlas_rb/blob.rb +1 -1
- data/lib/atlas_rb/collection.rb +1 -1
- data/lib/atlas_rb/community.rb +1 -1
- data/lib/atlas_rb/delegate.rb +1 -1
- data/lib/atlas_rb/errors.rb +5 -2
- data/lib/atlas_rb/file_set.rb +1 -1
- data/lib/atlas_rb/person.rb +1 -1
- data/lib/atlas_rb/resource.rb +14 -4
- data/lib/atlas_rb/work.rb +32 -18
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: c3cb4c5a2d7eb16f4647817a9afc282ce6ebb34d9a8b46c7bfaefa304373317f
|
|
4
|
+
data.tar.gz: 2524726c4bcc1d24bc0a51f812dde391da066ec5b65540ec3c91d8f37d7d4724
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 77c312024d884794f49976c38d1cc53ea949db0e1e24f24f016f104158509d219ec0517deb29567176ce5e53a9e971d9ec11996cba4f77fc4fe2050be3965e9a
|
|
7
|
+
data.tar.gz: e8d194e9632802f871cbd89efb7625a6ca633643f119d4aefaab306aecde4719b098e2e78578f862b190c9d2172a0ada3208976ddb600d6c2a4c8de6bfb413d4
|
data/.version
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
1.8.
|
|
1
|
+
1.8.6
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.8.5
|
|
4
|
+
|
|
5
|
+
### Fixed — `find` returns a tombstone (`410`) instead of raising
|
|
6
|
+
|
|
7
|
+
The status-aware `find` (1.8.3) raised `AtlasRb::ResourceError` on any non-2xx
|
|
8
|
+
other than `404`. But Atlas returns a **tombstoned** resource as `410 Gone`
|
|
9
|
+
**with its full body** (carrying `tombstoned` / `tombstoned_at` / `tombstoned_by`)
|
|
10
|
+
— a "gone, but here it is" tombstone, not an error envelope. `fetch_resource`
|
|
11
|
+
now parses a `410` like a `2xx`, so every typed `find` (`Work` / `Collection` /
|
|
12
|
+
`Community` / `FileSet` / `Person` / `Compilation` / `Blob` / `Delegate` and the
|
|
13
|
+
polymorphic `Resource.find`) yields the tombstone rather than raising. Genuine
|
|
14
|
+
error statuses (400/401/403/422) still raise; a `404` still returns `nil`.
|
|
15
|
+
|
|
3
16
|
## 1.8.4
|
|
4
17
|
|
|
5
18
|
### Added — per-tier derivative-visibility policy (`Work.set_derivative_permissions`)
|
data/Gemfile.lock
CHANGED
data/lib/atlas_rb/blob.rb
CHANGED
|
@@ -29,7 +29,7 @@ module AtlasRb
|
|
|
29
29
|
# held bytes — reconciliation compares this against the v1 manifest
|
|
30
30
|
# without re-downloading), and a download URL — or `nil` when the Blob
|
|
31
31
|
# does not exist (`404`).
|
|
32
|
-
# @raise [AtlasRb::ResourceError] on any non-2xx other than `404` (e.g. an
|
|
32
|
+
# @raise [AtlasRb::ResourceError] on any non-2xx other than `404` / `410` (e.g. an
|
|
33
33
|
# auth/validation error envelope), carrying Atlas's status + body.
|
|
34
34
|
#
|
|
35
35
|
# @example
|
data/lib/atlas_rb/collection.rb
CHANGED
|
@@ -24,7 +24,7 @@ module AtlasRb
|
|
|
24
24
|
# omitted.
|
|
25
25
|
# @return [Hash, nil] the `"collection"` object, already unwrapped from the
|
|
26
26
|
# JSON response, or `nil` when the Collection does not exist (`404`).
|
|
27
|
-
# @raise [AtlasRb::ResourceError] on any non-2xx other than `404` (e.g. an
|
|
27
|
+
# @raise [AtlasRb::ResourceError] on any non-2xx other than `404` / `410` (e.g. an
|
|
28
28
|
# auth/validation error envelope), carrying Atlas's status + body.
|
|
29
29
|
#
|
|
30
30
|
# @example
|
data/lib/atlas_rb/community.rb
CHANGED
|
@@ -25,7 +25,7 @@ module AtlasRb
|
|
|
25
25
|
# omitted.
|
|
26
26
|
# @return [Hash, nil] the `"community"` object from the JSON response,
|
|
27
27
|
# already unwrapped, or `nil` when the Community does not exist (`404`).
|
|
28
|
-
# @raise [AtlasRb::ResourceError] on any non-2xx other than `404` (e.g. an
|
|
28
|
+
# @raise [AtlasRb::ResourceError] on any non-2xx other than `404` / `410` (e.g. an
|
|
29
29
|
# auth/validation error envelope), carrying Atlas's status + body.
|
|
30
30
|
#
|
|
31
31
|
# @example
|
data/lib/atlas_rb/delegate.rb
CHANGED
|
@@ -33,7 +33,7 @@ module AtlasRb
|
|
|
33
33
|
# includes `id`, `valkyrie_id`, `use`, `uri`, `mime_type`,
|
|
34
34
|
# `original_filename`, `label`, and tombstone fields — or `nil` when the
|
|
35
35
|
# Delegate does not exist (`404`).
|
|
36
|
-
# @raise [AtlasRb::ResourceError] on any non-2xx other than `404` (e.g. an
|
|
36
|
+
# @raise [AtlasRb::ResourceError] on any non-2xx other than `404` / `410` (e.g. an
|
|
37
37
|
# auth/validation error envelope), carrying Atlas's status + body.
|
|
38
38
|
#
|
|
39
39
|
# @example
|
data/lib/atlas_rb/errors.rb
CHANGED
|
@@ -235,7 +235,7 @@ module AtlasRb
|
|
|
235
235
|
# Raised by the typed single-resource readers ({Resource.find} and the
|
|
236
236
|
# `Work` / `Collection` / `Community` / `FileSet` / `Person` / `Compilation`
|
|
237
237
|
# / `Blob` / `Delegate` overrides) when Atlas answers the `GET` with a
|
|
238
|
-
# non-2xx that is **not** a `404` — i.e. an error envelope
|
|
238
|
+
# non-2xx that is **not** a `404` or a `410` — i.e. an error envelope
|
|
239
239
|
# (`{ "error" => ... }`, status 400/401/403/422) on what the caller treated
|
|
240
240
|
# as a plain read.
|
|
241
241
|
#
|
|
@@ -249,7 +249,10 @@ module AtlasRb
|
|
|
249
249
|
# attributable everywhere `find` is used.
|
|
250
250
|
#
|
|
251
251
|
# A genuine `404` is **not** this — it stays a clean `nil` return, since
|
|
252
|
-
# "not found" is a normal `find` outcome callers already nil-check.
|
|
252
|
+
# "not found" is a normal `find` outcome callers already nil-check. A `410`
|
|
253
|
+
# is also **not** this — a tombstoned resource comes back as `410 Gone` with
|
|
254
|
+
# its full body, which `find` returns (the caller nil-checks / reads
|
|
255
|
+
# `tombstoned`), rather than an error to raise.
|
|
253
256
|
#
|
|
254
257
|
# @note Authorization failures on the narrow re-parent / linked-member /
|
|
255
258
|
# Compilation write paths surface as {ForbiddenError} via
|
data/lib/atlas_rb/file_set.rb
CHANGED
|
@@ -25,7 +25,7 @@ module AtlasRb
|
|
|
25
25
|
# omitted.
|
|
26
26
|
# @return [Hash, nil] the `"file_set"` object, already unwrapped, or `nil`
|
|
27
27
|
# when the FileSet does not exist (`404`).
|
|
28
|
-
# @raise [AtlasRb::ResourceError] on any non-2xx other than `404` (e.g. an
|
|
28
|
+
# @raise [AtlasRb::ResourceError] on any non-2xx other than `404` / `410` (e.g. an
|
|
29
29
|
# auth/validation error envelope), carrying Atlas's status + body.
|
|
30
30
|
#
|
|
31
31
|
# @example
|
data/lib/atlas_rb/person.rb
CHANGED
|
@@ -37,7 +37,7 @@ module AtlasRb
|
|
|
37
37
|
# server-side `nuid` for callers that need it, e.g. depositor gating, and
|
|
38
38
|
# `personal_root_id` for the publish-conduit parent), or `nil` when the
|
|
39
39
|
# Person does not exist (`404`).
|
|
40
|
-
# @raise [AtlasRb::ResourceError] on any non-2xx other than `404` (e.g. an
|
|
40
|
+
# @raise [AtlasRb::ResourceError] on any non-2xx other than `404` / `410` (e.g. an
|
|
41
41
|
# auth/validation error envelope), carrying Atlas's status + body.
|
|
42
42
|
def self.find(id, nuid: nil, on_behalf_of: nil)
|
|
43
43
|
body = fetch_resource(ROUTE + id, nuid: nuid, on_behalf_of: on_behalf_of)
|
data/lib/atlas_rb/resource.rb
CHANGED
|
@@ -36,7 +36,7 @@ module AtlasRb
|
|
|
36
36
|
# when the id resolves to nothing (`404`):
|
|
37
37
|
# - `"klass"` — the resource type, capitalized (e.g. `"Work"`).
|
|
38
38
|
# - `"resource"` — the resource payload as a Hash.
|
|
39
|
-
# @raise [AtlasRb::ResourceError] on any non-2xx other than `404` (e.g. an
|
|
39
|
+
# @raise [AtlasRb::ResourceError] on any non-2xx other than `404` / `410` (e.g. an
|
|
40
40
|
# auth/validation error envelope), carrying Atlas's status + body.
|
|
41
41
|
#
|
|
42
42
|
# @example Polymorphic lookup
|
|
@@ -260,6 +260,10 @@ module AtlasRb
|
|
|
260
260
|
# - `404` → `nil` (clean "not found"; also avoids the
|
|
261
261
|
# `JSON::ParserError` the old code raised on the empty `head :not_found`
|
|
262
262
|
# body).
|
|
263
|
+
# - `410` → the parsed JSON Hash. A tombstoned resource is
|
|
264
|
+
# returned as `410 Gone` WITH its full body (carrying tombstoned /
|
|
265
|
+
# tombstoned_at / tombstoned_by), so it is a returnable tombstone, not an
|
|
266
|
+
# error envelope — `find` yields the tombstone rather than raising.
|
|
263
267
|
# - any other non-2xx → {AtlasRb::ResourceError} carrying Atlas's status +
|
|
264
268
|
# body, so the failure is attributable at the boundary.
|
|
265
269
|
# - `2xx` → the parsed JSON Hash, for the caller to unwrap.
|
|
@@ -267,13 +271,19 @@ module AtlasRb
|
|
|
267
271
|
# @param path [String] the resource path to GET (e.g. `"/works/abc123"`).
|
|
268
272
|
# @param nuid [String, nil] optional acting user's NUID (see {find}).
|
|
269
273
|
# @param on_behalf_of [String, nil] optional `On-Behalf-Of` NUID (see {find}).
|
|
270
|
-
# @return [Hash, nil] the parsed JSON envelope
|
|
271
|
-
#
|
|
274
|
+
# @return [Hash, nil] the parsed JSON envelope (incl. a `410` tombstone), or
|
|
275
|
+
# `nil` on `404`.
|
|
276
|
+
# @raise [AtlasRb::ResourceError] on any non-2xx other than `404` / `410`.
|
|
272
277
|
# @api private
|
|
273
278
|
def self.fetch_resource(path, nuid: nil, on_behalf_of: nil)
|
|
274
279
|
resp = connection({}, nuid, on_behalf_of: on_behalf_of).get(path)
|
|
275
280
|
return nil if resp.status == 404
|
|
276
|
-
|
|
281
|
+
|
|
282
|
+
# A tombstoned resource comes back as 410 Gone WITH its full body — a
|
|
283
|
+
# "gone, but here it is" tombstone, not an error envelope — so parse it
|
|
284
|
+
# like a 2xx and let callers read the tombstone. Only genuine error
|
|
285
|
+
# statuses raise.
|
|
286
|
+
unless resp.success? || resp.status == 410
|
|
277
287
|
raise AtlasRb::ResourceError.new("GET #{path} → #{resp.status}: #{resp.body}", response: resp)
|
|
278
288
|
end
|
|
279
289
|
|
data/lib/atlas_rb/work.rb
CHANGED
|
@@ -24,7 +24,7 @@ module AtlasRb
|
|
|
24
24
|
# {AtlasRb.config}.default_on_behalf_of when omitted.
|
|
25
25
|
# @return [Hash, nil] the `"work"` object, already unwrapped from the JSON
|
|
26
26
|
# response, or `nil` when the Work does not exist (`404`).
|
|
27
|
-
# @raise [AtlasRb::ResourceError] on any non-2xx other than `404` (e.g. an
|
|
27
|
+
# @raise [AtlasRb::ResourceError] on any non-2xx other than `404` / `410` (e.g. an
|
|
28
28
|
# auth/validation error envelope), carrying Atlas's status + body.
|
|
29
29
|
#
|
|
30
30
|
# @example
|
|
@@ -345,28 +345,37 @@ module AtlasRb
|
|
|
345
345
|
))
|
|
346
346
|
end
|
|
347
347
|
|
|
348
|
-
# Replace a Work's per-
|
|
348
|
+
# Replace a Work's per-asset derivative-visibility policy.
|
|
349
349
|
#
|
|
350
|
-
# Sets which read groups may fetch the Work's
|
|
351
|
-
#
|
|
352
|
-
#
|
|
353
|
-
#
|
|
354
|
-
#
|
|
355
|
-
#
|
|
356
|
-
#
|
|
357
|
-
# tier as `[]` to make it private.
|
|
350
|
+
# Sets which read groups may fetch each of the Work's downloadable
|
|
351
|
+
# renditions, reusing the resource read-group vocabulary (`"public"`,
|
|
352
|
+
# Grouper group names, `[]` = private). Two media families:
|
|
353
|
+
#
|
|
354
|
+
# * the image ladder `small` / `medium` / `large` / `service` (deep-zoom) /
|
|
355
|
+
# `master` (the original image), and
|
|
356
|
+
# * independent media `audio` / `video` / `pdf`.
|
|
358
357
|
#
|
|
359
|
-
#
|
|
360
|
-
#
|
|
361
|
-
#
|
|
362
|
-
#
|
|
363
|
-
#
|
|
358
|
+
# Unlike {.set_image_derivatives} (which upserts URIs) this is a whole-object
|
|
359
|
+
# REPLACE: the map you pass is the complete policy. Within the image ladder
|
|
360
|
+
# omitted tiers inherit by cascade (an absent tier inherits the next
|
|
361
|
+
# lower-resolution tier; `small` inherits the Work's own visibility).
|
|
362
|
+
# Independent media do NOT cascade — an absent `audio`/`video`/`pdf` key
|
|
363
|
+
# rides the Work. Pass a tier as `[]` to make it private.
|
|
364
|
+
#
|
|
365
|
+
# Atlas enforces: a tier may not be more visible than the Work, and — within
|
|
366
|
+
# the image ladder — visibility must narrow as resolution grows
|
|
367
|
+
# (`master` ⊆ `service` ⊆ `large` ⊆ `medium` ⊆ `small`; independent media
|
|
368
|
+
# impose no ordering). The gate is advisory — it surfaces on {.assets} as
|
|
369
|
+
# `gated` / `permission` for BOTH Delegate (image tier) and Blob (master /
|
|
370
|
+
# pdf / audio / video, classified by media type) entries, for the display
|
|
371
|
+
# layer (Cerberus / the IIIF auth service; Cerberus's download :read check)
|
|
372
|
+
# to enforce.
|
|
364
373
|
#
|
|
365
374
|
# @param id [String] the Work ID.
|
|
366
375
|
# @param policy [Hash] tier => Array(read groups), e.g.
|
|
367
|
-
# `{ large: ["northeastern:drs:repository:archives"],
|
|
368
|
-
# Keys may be strings or symbols;
|
|
369
|
-
# `service`
|
|
376
|
+
# `{ large: ["northeastern:drs:repository:archives"], master: [...] }`.
|
|
377
|
+
# Keys may be strings or symbols; recognized keys are `small` / `medium` /
|
|
378
|
+
# `large` / `service` / `master` / `audio` / `video` / `pdf`.
|
|
370
379
|
# @param nuid [String, nil] optional acting user's NUID. On the relay-signing
|
|
371
380
|
# path it is signed into the assertion `sub`; on the BYO-JWT (`ATLAS_JWT`)
|
|
372
381
|
# path it is ignored (identity lives in the token).
|
|
@@ -437,6 +446,11 @@ module AtlasRb
|
|
|
437
446
|
# duck-type on the field they need rather than expecting a single
|
|
438
447
|
# schema.
|
|
439
448
|
#
|
|
449
|
+
# Every entry (Blob and Delegate) also carries the advisory read gate set
|
|
450
|
+
# via {.set_derivative_permissions}: `gated` (true if the asset must be
|
|
451
|
+
# authorized rather than fetched directly) and `permission` (the effective
|
|
452
|
+
# read-group set, or `nil` for guests, to whom group names are withheld).
|
|
453
|
+
#
|
|
440
454
|
# @param id [String] the Work ID.
|
|
441
455
|
# @param nuid [String, nil] optional acting user's NUID. On the relay-signing
|
|
442
456
|
# path it is signed into the assertion `sub`; on the BYO-JWT (`ATLAS_JWT`)
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: atlas_rb
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.8.
|
|
4
|
+
version: 1.8.6
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- David Cliff
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2026-07-
|
|
11
|
+
date: 2026-07-03 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: faraday
|