Relaxes deleting of the screen when the associated device is deleted. Instead we set the `device_id` foreign key to `null` like we do for the `template_id` foreign key. This allows a screen to remain in case you want to repurpose it for another device.
Milestone: patch
This reverts commit 5e9ab0cf02 (Removed screen and firmware struct attachment replace behavior, 2026-08-03) because you can't reliably have link:https://shrinerb.com[Shrine] upload a replacable image. We still need to have distinct methods for `#replace` and `#upload`.
This also prevents duplicate images being created.
Milestone: patch
Necessary to prevent automatic bricking of devices due to unreliable firmware updates. I have a couple issues, via the Core and Firmware projects, to address this but the root cause stems from unreliable and inconsistent firmware version releases.
Milestone: minor
Solves situations where keys can be missing for both the Rack and SQL formats. This also simplifies the patch by mimicking the original implementation by merging the block content into the payload.
The SQL check for block content being a hash is no longer required either.
Issue: 348
Milestone: patch
This reverts commit f33e112d33 (Fixed screen repository to use atomic upsert, 2026-08-03) because when an extension was built for multiple screens with different models, only one of the screens would be built. The problem is with using PostgreSQL on conflict resolution and updating of image information.
This also removes the Dry RB requirements since they are not being used.
Issue: 359
Milestone: patch
Provides a quick way to obtain the default option out of a list of records. This is a companion to the `.select_options_for` method which shares similar behavior and is why the `DEFAULT_OPTION` is introduced to reduce duplication.
The spec descriptions were updated to correctly represent class methods. Reek was also updated to ignore the duplicate call since Reek it too sensitive to two messages to the same object.
Milestone: minor
Ensures the upsert happens only if there isn't a conflict. This also prevents unique constraint issues with duplicate key value. This, unfortunately, introduces code that is a bit more complex and isn't ideal. Leaving these comments in for now in order to address in the future because I think this can be extracted further.
Issue: 339
Milestone: patch
We can safely remove the `#remove` method in favor of using `#upload` for everything now that we conditionally destroy the record only if found and the `*_data` key exists. This also updates firmware attachment behavior to mimic screen attachment behavior in order to improve consistency.
Milestone: minor