From 87ad273659ef261f51dafee4ca1cc097b9ffd1bd Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Thu, 6 Jul 2017 15:02:09 +0200 Subject: Extract configuration into config/storage_configuration.yml --- README.md | 11 +++++------ lib/active_storage/config/sites.yml | 25 ------------------------- lib/active_storage/railtie.rb | 29 +++++++++++++++++++++++++++++ lib/active_storage/storage_services.yml | 27 +++++++++++++++++++++++++++ lib/tasks/activestorage.rake | 15 +++++++++++---- 5 files changed, 72 insertions(+), 35 deletions(-) delete mode 100644 lib/active_storage/config/sites.yml create mode 100644 lib/active_storage/storage_services.yml diff --git a/README.md b/README.md index 1f0f30098d..b771629cd0 100644 --- a/README.md +++ b/README.md @@ -53,13 +53,12 @@ class MessagesController < ApplicationController end ``` -## Configuration +## Installation -Add `require "active_storage"` to config/application.rb and create a `config/initializers/active_storage_services.rb` with the following: - -```ruby - -``` +1. Add `require "active_storage"` to config/application.rb. +2. Run rails activestorage:install to create needed directories, migrations, and configuration. +3. Configure the storage service in config/environments/* with `config.active_storage.service = :local` + that references the services configured in config/storage_services.yml. ## Todos diff --git a/lib/active_storage/config/sites.yml b/lib/active_storage/config/sites.yml deleted file mode 100644 index 317ef2b9b7..0000000000 --- a/lib/active_storage/config/sites.yml +++ /dev/null @@ -1,25 +0,0 @@ -# Configuration should be something like this: -# -# config/environments/development.rb -# config.active_storage.service = :local -# -# config/environments/production.rb -# config.active_storage.service = :amazon -local: - service: Disk - root: <%%= File.join(Dir.tmpdir, "active_storage") %> - -amazon: - service: S3 - access_key_id: <%%= Rails.application.secrets.aws[:access_key_id] %> - secret_access_key: <%%= Rails.application.secrets.aws[:secret_access_key] %> - region: us-east-1 - bucket: <%= Rails.application.class.name.remove(/::Application$/).underscore %> - -google: - service: GCS - -mirror: - service: Mirror - primary: amazon - secondaries: google diff --git a/lib/active_storage/railtie.rb b/lib/active_storage/railtie.rb index 15ab8aa096..76894c2e16 100644 --- a/lib/active_storage/railtie.rb +++ b/lib/active_storage/railtie.rb @@ -23,5 +23,34 @@ module ActiveStorage extend ActiveStorage::Attached::Macros end end + + config.after_initialize do |app| + config_choice = app.config.active_storage.service + config_file = Pathname.new(Rails.root.join("config/storage_services.yml")) + + if config_choice + raise("Couldn't find Active Storage configuration in #{config_file}") unless config_file.exist? + + begin + require "yaml" + require "erb" + configs = YAML.load(ERB.new(config_file.read).result) || {} + + if service_configuration = configs[config_choice.to_s].symbolize_keys + service_name = service_configuration.delete(:service) + + ActiveStorage::Blob.service = ActiveStorage::Service.configure(service_name, service_configuration) + else + raise "Couldn't configure Active Storage as #{config_choice} was not found in #{config_file}" + end + rescue Psych::SyntaxError => e + raise "YAML syntax error occurred while parsing #{config_file}. " \ + "Please note that YAML must be consistently indented using spaces. Tabs are not allowed. " \ + "Error: #{e.message}" + rescue => e + raise e, "Cannot load `Rails.config.active_storage.service`:\n#{e.message}", e.backtrace + end + end + end end end diff --git a/lib/active_storage/storage_services.yml b/lib/active_storage/storage_services.yml new file mode 100644 index 0000000000..d3f001a27b --- /dev/null +++ b/lib/active_storage/storage_services.yml @@ -0,0 +1,27 @@ +test: + service: Disk + root: <%= Rails.root.join("tmp/storage") %> + +local: + service: Disk + root: <%= Rails.root.join("storage") %> + +# Use rails secrets:edit to set the AWS secrets (as shared:aws:access_key_id|secret_access_key) +amazon: + service: S3 + access_key_id: <%= Rails.application.secrets.aws[:access_key_id] %> + secret_access_key: <%= Rails.application.secrets.aws[:secret_access_key] %> + region: us-east-1 + bucket: your_own_bucket + +# Remember not to checkin your GCS keyfile to a repository +google: + service: GCS + project: your_project + keyfile: <%= Rails.root.join("path/to/gcs.keyfile") %> + bucket: your_own_bucket + +mirror: + service: Mirror + primary: local + secondaries: [ amazon, google ] diff --git a/lib/tasks/activestorage.rake b/lib/tasks/activestorage.rake index ff44958151..09aefef0d8 100644 --- a/lib/tasks/activestorage.rake +++ b/lib/tasks/activestorage.rake @@ -2,10 +2,17 @@ require "fileutils" namespace :activestorage do desc "Copy over the migration needed to the application" - task :migration do - FileUtils.cp \ - File.expand_path("../../active_storage/migration.rb", __FILE__), - Rails.root.join("db/migrate/#{Time.now.utc.strftime("%Y%m%d%H%M%S")}_active_storage_create_tables.rb") + task :install do + FileUtils.mkdir_p Rails.root.join("storage") + FileUtils.mkdir_p Rails.root.join("tmp/storage") + puts "Made storage and tmp/storage directories for development and testing" + + FileUtils.cp File.expand_path("../../active_storage/storage_services.yml", __FILE__), Rails.root.join("config") + puts "Copied default configuration to config/storage_services.yml" + + migration_file_path = "db/migrate/#{Time.now.utc.strftime("%Y%m%d%H%M%S")}_active_storage_create_tables.rb" + FileUtils.cp File.expand_path("../../active_storage/migration.rb", __FILE__), Rails.root.join(migration_file_path) + puts "Copied migration to #{migration_file_path}" puts "Now run rails db:migrate to create the tables for Active Storage" end -- cgit v1.2.3