summaryrefslogtreecommitdiff
path: root/bin/dashing
blob: 30824cef730667c7f83b8d86a0bbc30cdeb71031 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#!/usr/bin/env ruby

require 'thor'
require 'net/http'
require 'json'
require 'open-uri'

class MockScheduler
  def method_missing(*args)
    yield
  end
end

SCHEDULER = MockScheduler.new

module Dashing

  class CLI < Thor
    include Thor::Actions

    class << self
      attr_accessor :auth_token

      def hyphenate(str)
        return str.downcase if str =~ /^[A-Z-]+$/
        str.gsub('_', '-').gsub(/\B[A-Z]/, '-\&').squeeze('-').downcase
      end
    end

    attr_accessor :name

    no_tasks do
      ['widget', 'dashboard', 'job'].each do |type|
        define_method "generate_#{type}" do |name|
          @name = Thor::Util.snake_case(name)
          directory type.to_sym, File.join("#{type}s")
        end
      end
    end

    def self.source_root
      File.expand_path('../../templates', __FILE__)
    end

    desc "new PROJECT_NAME", "Sets up ALL THE THINGS needed for your dashboard project."
    def new(name)
      @name = Thor::Util.snake_case(name)
      directory :project, @name
    end

    desc "generate (widget/dashboard/job) NAME", "Creates a new widget, dashboard, or job."
    def generate(type, name)
      send("generate_#{type}".to_sym, name)
    rescue NoMethodError => e
      puts "Invalid generator. Either use widget, dashboard, or job"
    end
    map "g" => :generate

    desc "install GIST_ID", "Installs a new widget from a gist."
    def install(gist_id)
      public_url = "https://gist.github.com/#{gist_id}"
      gist = JSON.parse(open("https://api.github.com/gists/#{gist_id}").read)

      gist['files'].each do |filename, contents|
        if filename.end_with?(".rb")
          create_file File.join(Dir.pwd, 'jobs', filename), contents['content']
        elsif filename.end_with?(".coffee", ".html", ".scss")
          widget_name = File.basename(filename, '.*')
          create_file File.join(Dir.pwd, 'widgets', widget_name, filename), contents['content']
        end
      end

      print set_color("Don't forget to edit the ", :yellow)
      print set_color("Gemfile ", :yellow, :bold)
      print set_color("and run ", :yellow)
      print set_color("bundle install ", :yellow, :bold)
      say set_color("if needed. More information for this widget can be found at #{public_url}", :yellow)

    rescue OpenURI::HTTPError => e
      say set_color("Could not find gist at #{public_url}"), :red
    end
    map "i" => :install

    desc "start", "Starts the server in style!"
    method_option :job_path, :desc => "Specify the directory where jobs are stored"
    def start(*args)
      port_option = args.include?('-p')? '' : ' -p 3030'
      args = args.join(" ")
      command = "bundle exec thin -R config.ru start #{port_option} #{args}"
      command.prepend "export JOB_PATH=#{options[:job_path]}; " if options[:job_path]
      system(command)
    end
    map "s" => :start

    desc "job JOB_NAME AUTH_TOKEN(optional)", "Runs the specified job. Make sure to supply your auth token if you have one set."
    def job(name, auth_token = "")
      Dir[File.join(Dir.pwd, 'lib/**/*.rb')].each {|file| require file }
      self.class.auth_token = auth_token
      f = File.join(Dir.pwd, "jobs", "#{name}.rb")
      require f
    end

  end
end

Dashing::CLI.start