class Middleman::Cli::CloudFlareCDN

Constants

INVALIDATE_ZONE_THRESHOLD

Public Class Methods

example_configuration_elements() click to toggle source
# File lib/middleman-cdn/cdns/cloudflare.rb, line 14
def self.example_configuration_elements
  {
    client_api_key: ['"..."', "# default ENV['CLOUDFLARE_CLIENT_API_KEY']"],
    email: ['"..."', "# default ENV['CLOUDFLARE_EMAIL']"],
    zone: ['"..."', ""],
    base_urls: [['http://example.com', 'https://example.com'], ""],
    invalidate_zone_for_many_files: [true, "# default true"]
  }
end
key() click to toggle source
# File lib/middleman-cdn/cdns/cloudflare.rb, line 10
def self.key
  "cloudflare"
end

Public Instance Methods

invalidate(options, files, all: false) click to toggle source
# File lib/middleman-cdn/cdns/cloudflare.rb, line 24
def invalidate(options, files, all: false)
  options[:invalidate_zone_for_many_files] = true unless options.key?(:invalidate_zone_for_many_files)
  options[:client_api_key] ||= ENV['CLOUDFLARE_CLIENT_API_KEY']
  options[:email] ||= ENV['CLOUDFLARE_EMAIL']

  [:client_api_key, :email, :zone, :base_urls].each do |key|
    if options[key].blank?
      say_status(ANSI.red{ "Error: Configuration key cloudflare[:#{key}] is missing." })
      raise
    end
  end

  options[:base_urls] = [options[:base_urls]] if options[:base_urls].is_a?(String)
  if !options[:base_urls].is_a?(Array)
    say_status(ANSI.red{ "Error: Configuration key cloudflare[:base_urls] must be an array and contain at least one base url." })
    raise
  end

  cloudflare = ::Cloudflare::connect(key: options[:client_api_key], email: options[:email])
  zone = cloudflare.zones.find_by_name(options[:zone])
  if all || (options[:invalidate_zone_for_many_files] && files.count > INVALIDATE_ZONE_THRESHOLD)
    begin
      say_status("Invalidating zone #{zone}... ", newline: false)
      zone.purge_cache
    rescue => e
      say_status(", " + ANSI.red{ "error: #{e.message}" }, header: false)
    else
      say_status(ANSI.green{ "✔" }, header: false)
    end
  else
    begin
      urls = options[:base_urls].map do |base_url|
        files.map { |file| "#{base_url}#{file}" }
      end

      say_status("Invalidating #{urls}... ", newline: false)
      zone.purge_cache(files: urls.flatten)
    rescue => e
      say_status(", " + ANSI.red{ "error: #{e.message}" }, header: false)
    else
      say_status(ANSI.green{ "✔" }, header: false)
    end
  end
end