---
title: Shrine 1.2.0
---

New features
============

* `Shrine::Attacher.promote` and `Shrine::Attacher.delete` from the
  backgrounding plugin now return the record (unless the record wasn't found or
  the action aborted).

```rb
class PromoteJob
  include Sidekiq::Worker

  def perform(data)
    record = Shrine::Attacher.promote(data)
    record.update(published: true) if record.is_a?(Post)
  end
end
```

Other improvements
==================

* Custom metadata (which can be set by overriding `Shrine#extract_metadata`) is
  now properly inherited from cached files, and `Shrine#extact_metadata` is now
  only called once.

* If the record was deleted before the background job for promoting started,
  instead of erroring, the job now ignores that error and immediately finishes.

* Fixed a very unlikely scenario where a background job could replaced an
  updated attachment on subsequent attachment updates, by wrapping the check if
  the attachment changed and updating the attachment in a database transaction.

* Prevented starting the background job if the attachment has already changed,
  which fixes a relatively harmless attack where the end user could create a
  lot of retrying jobs by updating the attachment with a corrupted file.

* All IOs are now closed even if their upload errors.
