class HaveSnippet::Client::Cli

Constants

ACCESS_MODES

Public Class Methods

new() click to toggle source
# File lib/havesnippet-client/cli.rb, line 14
def initialize
  @opts = {}
  load
end
run() click to toggle source
# File lib/havesnippet-client/cli.rb, line 10
def self.run
  new.run
end

Public Instance Methods

config_paths() click to toggle source
# File lib/havesnippet-client/cli.rb, line 173
def config_paths
  [
    '/etc/havesnippet-client',
    '/var/secrets/havesnippet-client',
    local_config_path,
  ]
end
load() click to toggle source
# File lib/havesnippet-client/cli.rb, line 138
def load
  rename_config

  config_paths.each do |path|
    next unless File.exist?(path)

    cfg = YAML.load(File.read(path))

    if cfg[:expiration_interval]
      cfg[:expiration] = Time.now.to_i + cfg[:expiration_interval]
    end

    @opts.update(cfg)
  end
end
local_config_path() click to toggle source
# File lib/havesnippet-client/cli.rb, line 169
def local_config_path
  File.join(Dir.home, '.havesnippet-client')
end
rename_config() click to toggle source
# File lib/havesnippet-client/cli.rb, line 181
def rename_config
  old = File.join(Dir.home, '.havesnippet')

  if File.exist?(old) && !File.exist?(local_config_path)
    File.rename(old, local_config_path)
  end
end
run() click to toggle source
# File lib/havesnippet-client/cli.rb, line 19
    def run
      usage = <<END
Usage: #{$0} [options] [file]

Options:
END

      opt_parser = OptionParser.new do |opts|
        opts.banner = usage

        opts.on('-s', '--server URL', 'URL to the HaveSnippet server') do |v|
          @opts[:url] = v
        end

        opts.on('-k', '--api-key KEY', 'API key used to authenticate the user') do |v|
          @opts[:api_key] = v
        end

        opts.on('-f', '--filename NAME', 'File name, including the extension') do |v|
          @opts[:file_name] = v
        end

        opts.on('-l', '--language LANG', 'Language used to highlight the syntax') do |v|
          @opts[:language] = v
        end

        opts.on('-L', '--list-languages', 'List available languages') do
          @opts[:languages] = true
        end

        opts.on('-t', '--title TITLE', 'Title for the snippet') do |v|
          @opts[:title] = v
        end

        opts.on('-a', '--access MODE', ACCESS_MODES, "Accessibility (#{ACCESS_MODES.join(',')})") do |v|
          @opts[:accessibility] = translate_access(v)
        end

        opts.on('-e', '--expiration DATE', 'Date of expiration in ISO 8601') do |v|
          @expiration_delta = nil
          @opts[:expiration] = DateTime.iso8601(v).to_time.to_i
        end

        {
          hour:  60*60,
          day:   60*60*24,
          week:  60*60*24*7,
          month: 60*60*24*30,
          year:  60*60*24*30*12,
        }.each do |k, v|
          opts.on("--#{k}", "Expiration in one #{k}") do
            @opts[:expiration] = Time.now.to_i + v
            @expiration_delta = v
          end
        end

        opts.on('--forever', 'Disable expiration') do
          @opts[:expiration] = nil
          @expiration_delta = nil
        end

        opts.on('--clear', 'Clear any previously configured options') do
          @opts.clear
        end

        opts.on('--save', 'Save settings to config file') do
          @opts[:save] = true
        end

        opts.on('-h', '--help', 'Show this message and exit') do
          puts opts
          exit
        end
      end

      opt_parser.parse!

      @opts[:file_name] = File.basename(ARGV[0]) if ARGV[0] && !@opts[:file_name]

      c = HaveSnippet::Client::Client.new(@opts[:url], @opts[:api_key])

      if @opts[:languages]
        c.languages.sort do |a, b|
          a[0] <=> b[0]
        end.each { |k, v| puts "#{k.ljust(16)} #{v}" }
        exit
      end

      if @opts[:save]
        save
        exit
      end

      @opts[:content] = (ARGV[0] ? File.open(ARGV[0]) : STDIN).read

      res = c.paste(@opts)

      if res.ok?
        puts res.url

      else
        if res.errors
          warn "Error occured:"
          res.errors.each do |k, v|
            warn "\t#{k}: #{v.join('; ')}"
          end

        else
          warn "Unknown error occured"
        end
      end
    end
save() click to toggle source
# File lib/havesnippet-client/cli.rb, line 154
def save
  data = @opts.clone
  data.delete(:save)

  if @expiration_delta
    data[:expiration_interval] = @expiration_delta
    data.delete(:expiration)

  else
    data.delete(:expiration_interval)
  end

  File.open(local_config_path, 'w') { |f| f.write(YAML.dump(data)) }
end
translate_access(v) click to toggle source
# File lib/havesnippet-client/cli.rb, line 132
def translate_access(v)
  i = ACCESS_MODES.index(v)
  raise ArgumentError, "'#{v}' is not a valid access mode" unless i
  i
end