module Middleman::S3Sync

Constants

VERSION

Attributes

app[R]
mm_resources[RW]
s3_sync_options[RW]

Public Class Methods

add_local_resource(mm_resource) click to toggle source
# File lib/middleman/s3_sync.rb, line 58
def add_local_resource(mm_resource)
  s3_sync_resources[mm_resource.destination_path] = S3Sync::Resource.new(mm_resource, remote_resource_for_path(mm_resource.destination_path)).tap(&:status)
end
app=(app) click to toggle source
# File lib/middleman/s3_sync.rb, line 66
def app=(app)
  @app = app
end
bucket() click to toggle source
# File lib/middleman/s3_sync.rb, line 48
def bucket
  @@bucket_lock.synchronize do
    @bucket ||= begin
                  bucket = connection.directories.get(s3_sync_options.bucket, :prefix => s3_sync_options.prefix)
                  raise "Bucket #{s3_sync_options.bucket} doesn't exist!" unless bucket
                  bucket
                end
  end
end
content_types() click to toggle source
# File lib/middleman/s3_sync.rb, line 70
def content_types
  @content_types || {}
end
remote_only_paths() click to toggle source
# File lib/middleman/s3_sync.rb, line 62
def remote_only_paths
  paths - s3_sync_resources.keys
end
sync() click to toggle source
# File lib/middleman/s3_sync.rb, line 27
def sync()
  @app ||= ::Middleman::Application.new

  say_status "Let's see if there's work to be done..."
  unless work_to_be_done?
    say_status "All S3 files are up to date."
    return
  end

  say_status "Ready to apply updates to #{s3_sync_options.bucket}."

  update_bucket_versioning

  update_bucket_website

  ignore_resources
  create_resources
  update_resources
  delete_resources
end

Protected Class Methods

bucket_files() click to toggle source
# File lib/middleman/s3_sync.rb, line 134
def bucket_files
  @@bucket_files_lock.synchronize do
    @bucket_files ||= [].tap { |files|
      bucket.files.each { |f|
        files << f
      }
    }
  end
end
build_dir() click to toggle source
# File lib/middleman/s3_sync.rb, line 198
def build_dir
  @build_dir ||= s3_sync_options.build_dir
end
connection() click to toggle source
# File lib/middleman/s3_sync.rb, line 94
def connection
  connection_options = {
    :region => s3_sync_options.region,
    :path_style => s3_sync_options.path_style
  }

  if s3_sync_options.aws_access_key_id && s3_sync_options.aws_secret_access_key
    connection_options.merge!({
      :aws_access_key_id => s3_sync_options.aws_access_key_id,
      :aws_secret_access_key => s3_sync_options.aws_secret_access_key
    })
  else
    connection_options.merge!({ :use_iam_profile => true })
  end

  @connection ||= Fog::Storage::AWS.new(connection_options)
end
create_resources() click to toggle source
# File lib/middleman/s3_sync.rb, line 144
def create_resources
  files_to_create.each do |r|
    r.create!
  end
end
delete_resources() click to toggle source
# File lib/middleman/s3_sync.rb, line 156
def delete_resources
  files_to_delete.each do |r|
    r.destroy!
  end
end
files_to_create() click to toggle source
# File lib/middleman/s3_sync.rb, line 186
def files_to_create
  s3_sync_resources.values.select { |r| r.to_create? }
end
files_to_delete() click to toggle source
# File lib/middleman/s3_sync.rb, line 178
def files_to_delete
  if s3_sync_options.delete
    s3_sync_resources.values.select { |r| r.to_delete? }
  else
    []
  end
end
files_to_ignore() click to toggle source
# File lib/middleman/s3_sync.rb, line 194
def files_to_ignore
  s3_sync_resources.values.select { |r| r.to_ignore? }
end
files_to_update() click to toggle source
# File lib/middleman/s3_sync.rb, line 190
def files_to_update
  s3_sync_resources.values.select { |r| r.to_update? }
end
ignore_resources() click to toggle source
# File lib/middleman/s3_sync.rb, line 162
def ignore_resources
  files_to_ignore.each do |r|
    r.ignore!
  end
end
paths() click to toggle source
# File lib/middleman/s3_sync.rb, line 120
def paths
  @paths ||= begin
               (remote_paths.map { |rp| rp.gsub(/^#{s3_sync_options.prefix}/, '')} + s3_sync_resources.keys).uniq.sort
             end
end
remote_paths() click to toggle source
# File lib/middleman/s3_sync.rb, line 126
def remote_paths
  @remote_paths ||= if s3_sync_options.delete
                      bucket_files.map(&:key)
                    else
                      []
                    end
end
remote_resource_for_path(path) click to toggle source
# File lib/middleman/s3_sync.rb, line 112
def remote_resource_for_path(path)
  bucket_files.find { |f| f.key == "#{s3_sync_options.prefix}#{path}" }
end
s3_sync_resources() click to toggle source
# File lib/middleman/s3_sync.rb, line 116
def s3_sync_resources
  @s3_sync_resources ||= {}
end
update_bucket_versioning() click to toggle source
# File lib/middleman/s3_sync.rb, line 75
def update_bucket_versioning
  connection.put_bucket_versioning(s3_sync_options.bucket, "Enabled") if s3_sync_options.version_bucket
end
update_bucket_website() click to toggle source
# File lib/middleman/s3_sync.rb, line 79
def update_bucket_website
  opts = {}
  opts[:IndexDocument] = s3_sync_options.index_document if s3_sync_options.index_document
  opts[:ErrorDocument] = s3_sync_options.error_document if s3_sync_options.error_document

  if opts[:ErrorDocument] && !opts[:IndexDocument]
    raise 'S3 requires `index_document` if `error_document` is specified'
  end

  unless opts.empty?
    say_status "Putting bucket website: #{opts.to_json}"
    connection.put_bucket_website(s3_sync_options.bucket, opts)
  end
end
update_resources() click to toggle source
# File lib/middleman/s3_sync.rb, line 150
def update_resources
  files_to_update.each do |r|
    r.update!
  end
end
work_to_be_done?() click to toggle source
# File lib/middleman/s3_sync.rb, line 168
def work_to_be_done?
  Parallel.each(mm_resources, in_threads: 8, progress: "Processing sitemap") { |mm_resource| add_local_resource(mm_resource) }

  Parallel.each(remote_only_paths, in_threads: 8, progress: "Processing remote files") do |remote_path|
    s3_sync_resources[remote_path] ||= S3Sync::Resource.new(nil, remote_resource_for_path(remote_path)).tap(&:status)
  end

  !(files_to_create.empty? && files_to_update.empty? && files_to_delete.empty?)
end