class Recipes::FileStorage

Public Instance Methods

ask() click to toggle source
# File lib/potassium/recipes/file_storage.rb, line 2
def ask
  storages = {
    active_storage: 'ActiveStorage',
    shrine: 'Shrine',
    none: 'None, thanks'
  }

  storage = answer(:storage) do
    storages.keys[Ask.list('Which storage are you going to use?', storages.values)]
  end

  set(:storage, storage.to_sym)
end
create() click to toggle source
# File lib/potassium/recipes/file_storage.rb, line 16
def create
  add_chosen_storage
end
install() click to toggle source
# File lib/potassium/recipes/file_storage.rb, line 20
def install
  ask
  add_chosen_storage
end
installed?() click to toggle source
# File lib/potassium/recipes/file_storage.rb, line 25
def installed?
  file_exist?('config/storage.yml')
end

Private Instance Methods

add_active_storage() click to toggle source
# File lib/potassium/recipes/file_storage.rb, line 31
def add_active_storage
  after(:gem_install) { run('bundle exec rails active_storage:install') }
  copy_file('../assets/config/storage.yml', 'config/storage.yml', force: true)
  active_storage_service_regexp = /config.active_storage.service = :local\n/
  gsub_file 'config/environments/production.rb', active_storage_service_regexp do
    'config.active_storage.service = :amazon'
  end
end
add_chosen_storage() click to toggle source
# File lib/potassium/recipes/file_storage.rb, line 105
def add_chosen_storage
  return if [:none, :None].include? get(:storage).to_sym

  common_setup
  case get(:storage)
  when :active_storage
    add_active_storage
  when :shrine
    add_shrine
  end
end
add_cover_image_uploader() click to toggle source
# File lib/potassium/recipes/file_storage.rb, line 62
  def add_cover_image_uploader
    copy_file(
      '../assets/app/uploaders/cover_image_uploader.rb', 'app/uploaders/cover_image_uploader.rb'
    )
    insert_into_file "config/routes.rb", after: "Rails.application.routes.draw do\n" do
      <<~HERE.indent(2)
        mount CoverImageUploader.derivation_endpoint => "/derivations/cover_image"
      HERE
    end
  end
add_image_handling_and_cover_image_uploader() click to toggle source
# File lib/potassium/recipes/file_storage.rb, line 50
def add_image_handling_and_cover_image_uploader
  gather_gem('image_processing', '~> 1.8')
  gather_gem('blurhash', '~> 0.1')
  gather_gem('ruby-vips', '~> 2.1')
  append_to_file('.env.development', "SHRINE_SECRET_KEY=#{SecureRandom.hex}\n")
  copy_file('../assets/app/jobs/shrine_promote_job.rb', 'app/jobs/shrine_promote_job.rb')
  add_image_handling_plugin
  add_cover_image_uploader
  add_image_handling_serializer_concern if get(:api)
  add_image_handling_heroku_setup if get(:heroku)
end
add_image_handling_heroku_setup() click to toggle source
# File lib/potassium/recipes/file_storage.rb, line 88
  def add_image_handling_heroku_setup
    prepend_file(
      '.buildpacks',
      <<~HERE
        https://github.com/heroku/heroku-buildpack-apt
        https://github.com/brandoncc/heroku-buildpack-vips
      HERE
    )
    copy_file('../assets/Aptfile', 'Aptfile')
  end
add_image_handling_plugin() click to toggle source
# File lib/potassium/recipes/file_storage.rb, line 73
def add_image_handling_plugin
  copy_file(
    '../assets/config/initializers/shrine/plugins/image_handling_utilities.rb',
    'config/initializers/shrine/plugins/image_handling_utilities.rb'
  )
end
add_image_handling_serializer_concern() click to toggle source
# File lib/potassium/recipes/file_storage.rb, line 80
def add_image_handling_serializer_concern
  copy_file(
    '../assets/app/serializers/concerns/image_handling_attributes.rb',
    'app/serializers/concerns/image_handling_attributes.rb'
  )
  copy_file('../assets/app/serializers/base_serializer.rb', 'app/serializers/base_serializer.rb')
end
add_shrine() click to toggle source
# File lib/potassium/recipes/file_storage.rb, line 40
def add_shrine
  gather_gem('shrine', '~> 3.0')
  gather_gem('marcel', '~> 1.0')
  copy_file('../assets/config/shrine.rb', 'config/initializers/shrine.rb', force: true)
  copy_file('../assets/app/uploaders/image_uploader.rb', 'app/uploaders/image_uploader.rb')
  copy_file('../assets/app/uploaders/base_uploader.rb', 'app/uploaders/base_uploader.rb')
  append_to_file('.gitignore', "/public/uploads\n")
  add_image_handling_and_cover_image_uploader
end
common_setup() click to toggle source
# File lib/potassium/recipes/file_storage.rb, line 99
def common_setup
  gather_gem 'aws-sdk-s3', '~> 1.0'
  add_readme_section :internal_dependencies, get(:storage)
  append_to_file '.env.development', "S3_BUCKET=\n"
end