class Quickdraw::Cli

Constants

BINARY_EXTENSIONS
DEFAULT_WHITELIST
IGNORE
TIMEFORMAT

Public Instance Methods

configure() click to toggle source
# File lib/quickdraw/cli.rb, line 24
def configure
        config = {
                :api_key => ask("API Key?"),
                :password => ask("Password?"),
                :store => ask("Store domain (ex. 'example.myshopify.com')?"),
                :theme_id => ask("Theme ID")
        }
        create_file('config.yml', config.to_yaml)
        empty_directory('src')
        empty_directory('src/assets')
        empty_directory('src/config')
        empty_directory('src/layout')
        empty_directory('src/snippets')
        empty_directory('src/templates')
        empty_directory('theme')
        empty_directory('theme/assets')
        empty_directory('theme/config')
        empty_directory('theme/layout')
        empty_directory('theme/snippets')
        empty_directory('theme/templates')
end
download(filter=nil) click to toggle source
# File lib/quickdraw/cli.rb, line 74
def download(filter=nil)
        asset_list = Celluloid::Actor[:shopify_connector].get_asset_list

        if filter
                assets = asset_list.select{ |i| i[/^#{filter.gsub(/[^a-z0-9A-Z\/]/, '')}/] }.map{|a| FilePath.getwd / 'theme' / a }
        else
                assets = asset_list.map{|a| FilePath.getwd / 'theme' / a }
        end

        futures = []
        assets.each do |asset|
                futures << Celluloid::Actor[:shopify_connector].future.download_asset(asset)
        end
        futures.each do |future|
                asset, response = future.value
                if response.success?
                        say("Downloaded: #{asset.relative_to(Quickdraw.getwd)}", :green)
                else
                        say("[" + Time.now.strftime(TIMEFORMAT) + "] Error: Could not download #{asset.relative_to(Quickdraw.getwd)}. #{errors_from_response(response)}\n", :red)
                end
        end
        say("Done.", :green)
end
remove(filter=nil) click to toggle source
# File lib/quickdraw/cli.rb, line 144
def remove(filter=nil)
        asset_list = Celluloid::Actor[:shopify_connector].get_asset_list

        if filter
                assets = asset_list.select{ |i| i[/^#{filter.gsub(/[^a-z0-9A-Z\/]/, '')}/] }.map{|a| FilePath.getwd / 'theme' / a }
        else
                assets = asset_list.map{|a| FilePath.getwd / 'theme' / a }
        end

        futures = []
        assets.each do |asset|
                futures << Celluloid::Actor[:shopify_connector].future.remove_asset(asset)
        end
        futures.each do |future|
                asset, response = future.value
                if response.success?
                        say("Deleted: #{asset.relative_to(Quickdraw.getwd)}", :green)
                else
                        say("[" + Time.now.strftime(TIMEFORMAT) + "] Error: Could not remove #{asset.relative_to(Quickdraw.getwd)}. #{errors_from_response(response)}\n", :red)
                end
        end
        say("Done.", :green) unless options['quiet']
end
replace(filter=nil) click to toggle source
# File lib/quickdraw/cli.rb, line 99
def replace(filter=nil)
        say("Are you sure you want to completely replace your shop theme assets? This is not undoable.", :yellow)
        if ask("Continue? (y/n): ") == "y"
                # only delete files on remote that are not present locally
                # files present on remote and present locally get overridden anyway
                asset_list = Celluloid::Actor[:shopify_connector].get_asset_list

                if filter
                        remote_assets = asset_list.select{ |i| i[/^#{filter.gsub(/[^a-z0-9A-Z\/]/, '')}/] }.map{|a| (FilePath.getwd / 'theme' / a) }
                else
                        remote_assets = asset_list.map{|a| (FilePath.getwd / 'theme' / a) }
                end

                if filter
                        local_assets = (FilePath.getwd / 'theme').files(true).select{ |i| i.relative_to(Quickdraw.theme_dir).to_s[/^#{filter.gsub(/[^a-z0-9A-Z\/]/, '')}/] }
                else
                        local_assets = (FilePath.getwd / 'theme').files(true)
                end

                remote_only_assets = remote_assets.to_a.map{|p| p.to_s} - local_assets.to_a.map{|p| p.to_s}

                futures = []
                remote_only_assets.each do |asset|
                        futures << Celluloid::Actor[:shopify_connector].future.remove_asset(asset.as_path)
                end
                local_assets.each do |asset|
                        futures << Celluloid::Actor[:shopify_connector].future.upload_asset(asset)
                end
                futures.each do |future|
                        asset, response = future.value
                        if response.success?
                                if response.request.http_method.to_s == "Net::HTTP::Put"
                                        say("Uploaded: #{asset.relative_to(Quickdraw.getwd)}", :green)
                                else
                                        say("Removed: #{asset.relative_to(Quickdraw.getwd)}", :green)
                                end
                        else
                                say("[" + Time.now.strftime(TIMEFORMAT) + "] Error: Could not download #{asset.relative_to(Quickdraw.getwd)}. #{errors_from_response(response)}\n", :red)
                        end
                end
                say("Done.", :green) unless options['quiet']
        end
end
upload(filter=nil) click to toggle source
# File lib/quickdraw/cli.rb, line 47
def upload(filter=nil)

        if filter
                assets = (FilePath.getwd / 'theme').files(true).select{ |i|
                        i.relative_to(Quickdraw.theme_dir).to_s[/^#{filter.gsub(/[^a-z0-9A-Z\/]/, '')}/]
                }
        else
                assets = (FilePath.getwd / 'theme').files(true)
        end

        futures = []
        assets.each do |asset|
                futures << Celluloid::Actor[:shopify_connector].future.upload_asset(asset)
        end
        futures.each do |future|
                asset, response = future.value
                if response.success?
                        say("Uploaded: #{asset.relative_to(Quickdraw.getwd)}", :green)
                else
                        say("[" + Time.now.strftime(TIMEFORMAT) + "] Error: Could not upload #{asset.relative_to(Quickdraw.getwd)}. #{errors_from_response(response)}\n", :red)
                end
        end

        say("Done.", :green)
end
watch() click to toggle source
# File lib/quickdraw/cli.rb, line 169
def watch
        puts "Watching current folder: #{Dir.pwd}"

        futures = []

        FileWatcher.new([(Quickdraw.getwd/'theme').to_s, (Quickdraw.getwd/'src').to_s]).watch(0.5) do |asset, event|
                asset = asset.as_path
                if(event == :changed)
                        if theme_file?(asset)
                                say("UPLOADING: #{asset.relative_to(Quickdraw.getwd)}", :green)
                                futures << Celluloid::Actor[:shopify_connector].future.upload_asset(asset)
                        elsif src_file?(asset)
                                say("COMPILING: #{asset.relative_to(Quickdraw.getwd)}", :green)
                                futures << Celluloid::Actor[:shopify_connector].future.compile_asset(asset)
                        end
                end
                if(event == :delete)
                        if theme_file?(asset)
                                say("REMOVING: #{asset}", :green)
                                futures << Celluloid::Actor[:shopify_connector].future.remove_asset(asset)
                        else
                        end
                end
                if(event == :new)
                        if theme_file?(asset)
                                say("ADDING: #{asset}", :green)
                                futures << Celluloid::Actor[:shopify_connector].future.upload_asset(asset)
                        else
                        end
                end
        end

        loop do

                futures.each do |future|
                        asset, response = future.value
                        if response
                                unless response.success?
                                        say("[" + Time.now.strftime(TIMEFORMAT) + "] Error: #{asset.relative_to(Quickdraw.getwd)} Failed", :red)
                                end
                        else
                                say("Compiled: #{asset.relative_to(Quickdraw.getwd)}")
                        end
                        futures.delete(future)
                end

                sleep 0.2
        end

rescue => e
        puts e.message
        puts e.backtrace
        retry
        puts "exiting...."
end

Private Instance Methods

errors_from_response(response) click to toggle source
# File lib/quickdraw/cli.rb, line 227
def errors_from_response(response)
        return unless response.parsed_response

        errors = response.parsed_response["errors"]

        case errors
                when NilClass
                        ''
                when String
                        errors
                else
                        errors.values.join(", ")
        end
end
src_file?(asset) click to toggle source
# File lib/quickdraw/cli.rb, line 246
def src_file?(asset)
        asset.as_path.relative_to(Quickdraw.getwd).to_s[/^src\//]
end
theme_file?(asset) click to toggle source
# File lib/quickdraw/cli.rb, line 242
def theme_file?(asset)
        asset.as_path.relative_to(Quickdraw.getwd).to_s[/^theme\//]
end