module Shrine::Plugins::Persistence

Helper plugin that defines persistence methods on the attacher according to convention.

plugin :_persistence, plugin: MyPlugin

Public Class Methods

configure(uploader, plugin:) click to toggle source

Using

* Attacher#persist
* Attacher#atomic_persist
* Attacher#atomic_promote
Calls superclass method
# File lib/shrine/plugins/_persistence.rb, line 21
def self.configure(uploader, plugin:)
  plugin_name = plugin.to_s.split("::").last.downcase

  plugin::AttacherMethods.module_eval do
    define_method :atomic_promote do |**options, &block|
      return super(**options, &block) unless send(:"#{plugin_name}?")

      abstract_atomic_promote(
        reload:  method(:"#{plugin_name}_reload"),
        persist: method(:"#{plugin_name}_persist"),
        **options, &block
      )
    end

    define_method :atomic_persist do |*args, **options, &block|
      return super(*args, **options, &block) unless send(:"#{plugin_name}?")

      abstract_atomic_persist(
        *args,
        reload:  method(:"#{plugin_name}_reload"),
        persist: method(:"#{plugin_name}_persist"),
        **options, &block
      )
    end

    define_method :persist do
      return super() unless send(:"#{plugin_name}?")

      send(:"#{plugin_name}_persist")
    end

    define_method :hash_attribute? do
      return super() unless send(:"#{plugin_name}?")

      respond_to?(:"#{plugin_name}_hash_attribute?", true) &&
      send(:"#{plugin_name}_hash_attribute?")
    end
    private :hash_attribute?
  end
end
load_dependencies(uploader, *) click to toggle source
# File lib/shrine/plugins/_persistence.rb, line 10
def self.load_dependencies(uploader, *)
  uploader.plugin :atomic_helpers
  uploader.plugin :entity
end