dawn-cli 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 2d84982fb0b5183bfa3934340f5bab8083a68cb0
4
+ data.tar.gz: 3047933667d1f0fb125c23d4ed2f81df17983c44
5
+ SHA512:
6
+ metadata.gz: 80bb11d6044735d1499cdf033b4f3d0cd4ded45b103b5bf6dd7488f1554cb25452685fd430c6a6c17cc66af1b0e24cfbf1ae57e094ab875fa075248930867c7e
7
+ data.tar.gz: ac198cc5ce1c5211e46b318c4fdbe188ad11834fc3bbbcaf78b85272486d575d4e641e8f5194d6c57a816aeddbe053adffcaa032474bbcf64ab0ab573f736e6f
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+ require 'commander'
3
+ require 'commander/import'
4
+ require 'dawn/cli/version'
5
+
6
+ require 'dawn/cli'
7
+
8
+ Dawn::CLI::Application.new.run
@@ -0,0 +1,9 @@
1
+ require 'uri'
2
+ require 'net/http'
3
+ require 'time-lord'
4
+ require 'terminal-table'
5
+
6
+ require 'dawn/api' # Dawn::Api
7
+ require 'dawn/cli/version' # CLI::Version information
8
+ require 'dawn/cli/patches' # Various Monkey Patches
9
+ require 'dawn/cli/application' # Various Monkey Patches
@@ -0,0 +1,124 @@
1
+ require 'dawn/api'
2
+ require 'dawn/api/hosts'
3
+ require 'dawn/cli/output_formatter' # CLI Console Formatters
4
+ require 'dawn/cli/commands' # CLI Commands
5
+
6
+ module Dawn
7
+ module CLI
8
+ class Application
9
+
10
+ include Commander::Methods
11
+ include OutputFormatter
12
+
13
+ def run
14
+ # :name is optional, otherwise uses the basename of this executable
15
+ program :name, 'Dawn CLI'
16
+ program :version, Dawn::CLI::VERSION + "α"
17
+ program :description, 'CLI client for Dawn'
18
+
19
+ default_command 'help'
20
+
21
+ app_commands
22
+ domain_commands
23
+ drain_commands
24
+ env_commands
25
+ key_commands
26
+ local_commands
27
+ login_commands
28
+ end
29
+
30
+ ## swiped from Heroku
31
+ def has_git?
32
+ %x{ git --version }
33
+ $?.success?
34
+ end
35
+
36
+ def git(args)
37
+ return "" unless has_git?
38
+ flattened_args = [args].flatten.compact.join(" ")
39
+ %x{ git #{flattened_args} 2>&1 }.strip
40
+ end
41
+
42
+ ### CLI App resolver
43
+ def try_create_app(appname=nil)
44
+ abort "dawn remote already exists, please remove it (dawn app:delete)" if git_dawn_remote?
45
+ begin
46
+ app = Dawn::App.create name: appname
47
+ rescue Excon::Errors::Conflict
48
+ app = Dawn::App.find name: appname
49
+ say " warning ! App (#{app.name}) already exists"
50
+ end
51
+ return app
52
+ end
53
+
54
+ def git_remotes(base_dir=Dir.pwd)
55
+ remotes = {}
56
+ original_dir = Dir.pwd
57
+ Dir.chdir(base_dir) do
58
+ return unless File.exists?(".git")
59
+ git("remote -v").split("\n").each do |remote|
60
+ name, url, method = remote.split(/\s+/)
61
+ if url =~ /^git@#{Dawn.git_host}:([\w\d-]+)\.git$/
62
+ remotes[name] = $1
63
+ end
64
+ end
65
+ end
66
+ remotes.empty? ? nil : remotes
67
+ end
68
+
69
+ def git_dawn_remote?
70
+ !!(git_remotes && git_remotes["dawn"])
71
+ end
72
+
73
+ def git_remove_dawn_remote(app)
74
+ # remove old dawn remote
75
+ git "remote remove dawn"
76
+ end
77
+
78
+ def git_add_dawn_remote(app)
79
+ abort "dawn remote already exists, please `dawn app:delete` first" if git_dawn_remote?
80
+ git "remote add dawn git@#{Dawn.git_host}:#{app.git}"
81
+ end
82
+
83
+ def extract_app_remote_from_git_config
84
+ remote = git "config dawn.remote"
85
+ remote.empty? ? nil : remote
86
+ end
87
+
88
+ def extract_app_in_dir(dir, options={})
89
+ return unless remotes = git_remotes(dir)
90
+ if remote = options[:remote]
91
+ remotes[remote]
92
+ elsif remote = extract_app_remote_from_git_config
93
+ remotes[remote]
94
+ else
95
+ apps = remotes.values.uniq
96
+ if apps.size == 1
97
+ apps.first
98
+ else
99
+ abort "Multiple apps in folder and no app specified.\nSpecify app with --app APP."
100
+ end
101
+ end
102
+ end
103
+
104
+ def current_app_name(options={})
105
+ @current_app ||= if options.key?(:app)
106
+ options[:app]
107
+ elsif ENV.key?("DAWN_APP")
108
+ ENV["DAWN_APP"]
109
+ elsif app_from_dir = extract_app_in_dir(Dir.pwd, options)
110
+ app_from_dir
111
+ else
112
+ abort "App could not be located!"
113
+ end
114
+ end
115
+
116
+ def current_app
117
+ app = Dawn::App.find name: current_app_name
118
+ abort "App (#{current_app_name}) was not found on the dawn server!" unless app
119
+ app
120
+ end
121
+
122
+ end
123
+ end
124
+ end
@@ -0,0 +1,7 @@
1
+ require 'dawn/cli/commands/app' # App management namespace
2
+ require 'dawn/cli/commands/drain' # App drain management namespace
3
+ require 'dawn/cli/commands/env' # App ENV management namespace
4
+ require 'dawn/cli/commands/domain' # App domains management namespace
5
+ require 'dawn/cli/commands/key' # Key management namespace
6
+ require 'dawn/cli/commands/local' # Various functions
7
+ require 'dawn/cli/commands/login' # Netrc setup and login command
@@ -0,0 +1,174 @@
1
+ module Dawn
2
+ module CLI
3
+ class Application
4
+ def app_commands
5
+
6
+ command "app:ls" do |c|
7
+ c.syntax = "dawn app:ls"
8
+ c.description = "Displays a list of all the apps you have deployed to dawn"
9
+
10
+ c.action do |args, options|
11
+ apps = Dawn::App.all
12
+ say format_apps(apps)
13
+ end
14
+ end
15
+ alias_command "ls", "app:ls"
16
+
17
+ command "app:scale" do |c|
18
+ c.syntax = "dawn app:scale <gear_modifier>"
19
+ c.description = "Modify the gears of the current app"
20
+
21
+ c.action do |args, options|
22
+ app = current_app
23
+ formation = {}
24
+
25
+ args.each do |s|
26
+ mtch_data = s.match(/(?<type>\S+)(?<op>[+-=])(?<value>\d+)/)
27
+ next unless mtch_data
28
+
29
+ type = mtch_data[:type]
30
+ value = mtch_data[:value].to_i
31
+ old_formation = (app.formation[type] || 0).to_i
32
+
33
+ formation[type] = case mtch_data[:op]
34
+ when "+" then old_formation + value
35
+ when "-" then old_formation - value
36
+ when "=" then value
37
+ end
38
+ end
39
+ app.scale formation: formation
40
+ end
41
+ end
42
+
43
+ command "app:delete" do |c|
44
+ c.syntax = "dawn app:delete [<app_id>]"
45
+ c.description = "Delete App app_id, if no app_id is provided, the current app is deleted instead"
46
+
47
+ c.option "--name APPNAME", String, "specify an app by name to remove"
48
+
49
+ c.action do |args, options|
50
+ if app_id = args.first
51
+ app = Dawn::App.find(id: app_id)
52
+ elsif app_name = options.name
53
+ app = Dawn::App.find(name: app_name)
54
+ else
55
+ app = current_app
56
+ end
57
+
58
+ app_name = app.name
59
+ app.destroy
60
+
61
+ git_remove_dawn_remote app
62
+ end
63
+ end
64
+
65
+ command "app:rename" do |c|
66
+ c.syntax = "dawn rename <new_name>"
67
+ c.description = "Rename the current App to <new_name>"
68
+
69
+ c.action do |args, options|
70
+ app_name = args.first
71
+ app = current_app
72
+ app.update name: app_name
73
+ end
74
+ end
75
+ alias_command "rename", "app:rename"
76
+
77
+ command "app:logs" do |c|
78
+ c.syntax = "dawn logs [-f]"
79
+ c.description = "Prints the App's log to STDOUT"
80
+
81
+ c.option "-f", "should the logs be followed?"
82
+
83
+ c.action do |args, options|
84
+ filter_regex = %r{\A(?<timestamp>\S+)\s(?<token>\S+)\[(?<proc_id>\S+)\]\:(?<message>.*)}
85
+ timestamp_regex = %r{(?<year>\d+)-(?<month>\d+)-(?<day>\d+)T(?<hour>\d+)\:(?<minute>\d+)\:(?<second>\d+)\.(?<other>.*)}
86
+
87
+ opts = {}
88
+ opts[:tail] = options.f
89
+ filters = args
90
+ app = current_app
91
+ url = app.logs(opts)
92
+ uri = URI.parse(url)
93
+
94
+ begin
95
+ http = Net::HTTP.new(uri.host, uri.port)
96
+ http.read_timeout = 60 * 60 * 24
97
+ begin
98
+ http.start do
99
+ link_url = uri.path + ("?srv=1")
100
+ #say uri.host + ":" + uri.port.to_s + link_url
101
+ http.request_get(link_url) do |request|
102
+ request.read_body do |chunk|
103
+ if filters.size > 0
104
+ chunk.each_line do |line|
105
+ if mtch_data = line.chomp.match(filter_regex)
106
+ say mtch_data[0] if filters.include?(mtch_data[:proc_id])
107
+ end
108
+ end
109
+ else
110
+ say chunk.to_s
111
+ end
112
+ end
113
+ end
114
+ end
115
+ rescue Errno::ECONNREFUSED, Errno::ETIMEDOUT, SocketError
116
+ raise "Could not connect to logging service"
117
+ rescue Timeout::Error, EOFError
118
+ raise "\nRequest timed out"
119
+ end
120
+ rescue Interrupt
121
+ end
122
+ end
123
+ end
124
+ alias_command "logs", "app:logs"
125
+
126
+ command "app:gears" do |c|
127
+ c.syntax = "dawn ps [<gear_name>]"
128
+ c.description = "Lists all currently running Gears"
129
+
130
+ c.action do |args, options|
131
+ app = current_app
132
+ gears = app.gears.all.sort_by(&:number)
133
+
134
+ if args.empty?
135
+ ## Print all Gears
136
+ gears_by_type = gears.each_with_object({}) do |gear, hsh|
137
+ (hsh[gear.type] ||= []) << gear
138
+ end
139
+ gears_by_type.keys.sort.each do |key|
140
+ grs = gears_by_type[key]
141
+ say "=== #{key}:"
142
+ say format_gears grs
143
+ end
144
+ else
145
+ ## Print a specific gear
146
+ query = args.first
147
+ gear = gears.find { |gear| gear.name == query }
148
+
149
+ if gear
150
+ say format_gears([gear])
151
+ else
152
+ say "Gear #{query} was not found."
153
+ end
154
+ end
155
+ end
156
+ end
157
+ alias_command "ps", "app:gears"
158
+
159
+ command "app:restart" do |c|
160
+ c.syntax = "dawn restart"
161
+ c.description = "Restart the current App"
162
+
163
+ c.action do |args, options|
164
+ app = current_app
165
+ app.restart
166
+ say "App #{app.name} has been restarted"
167
+ end
168
+ end
169
+ alias_command "restart", "app:restart"
170
+
171
+ end
172
+ end
173
+ end
174
+ end
@@ -0,0 +1,49 @@
1
+ module Dawn
2
+ module CLI
3
+ class Application
4
+ def domain_commands
5
+
6
+ command "domain:add" do |c|
7
+ c.syntax = "dawn domain:add <url>"
8
+ c.description = "Add a new domain to the current app"
9
+
10
+ c.action do |args, options|
11
+ url = args.first
12
+ app = current_app
13
+
14
+ app.domains.create url: url
15
+ end
16
+ end
17
+
18
+ command "domain:delete" do |c|
19
+ c.syntax = "dawn domain:delete <url>"
20
+ c.description = "Remove an existing domain from the current app"
21
+
22
+ c.action do |args, options|
23
+ url = args.first
24
+ app = current_app
25
+
26
+ domain = app.domains.all.find { |domain| domain.url == url }
27
+ if domain
28
+ domain.destroy
29
+ else
30
+ say "Domain (url: #{url}) could not be found"
31
+ end
32
+ end
33
+ end
34
+
35
+ command "domain:ls" do |c|
36
+ c.syntax = "dawn domain:ls"
37
+ c.description = "List all domains for the current app"
38
+
39
+ c.action do |args, options|
40
+ app = current_app
41
+
42
+ say format_domains(app.domains.all)
43
+ end
44
+ end
45
+
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,50 @@
1
+ module Dawn
2
+ module CLI
3
+ class Application
4
+ def drain_commands
5
+
6
+ command "drain:add" do |c|
7
+ c.syntax = "dawn drain:add <url>"
8
+ c.description = "Add a Drain url"
9
+
10
+ c.action do |args, options|
11
+ url = args.first
12
+ app = current_app
13
+
14
+ drain = app.drains.create url: url
15
+ end
16
+ end
17
+
18
+ command "drain:delete" do |c|
19
+ c.syntax = "dawn drain:delete <url>"
20
+ c.description = "Remove a Drain url"
21
+
22
+ c.action do |args, options|
23
+ url = args.first
24
+ app = current_app
25
+
26
+ drain = app.drains.all.find { |drain| drain.url == url }
27
+ if drain
28
+ drain.destroy
29
+ else
30
+ say "Drain (url: #{url}) could not be found"
31
+ end
32
+ end
33
+ end
34
+
35
+ command "drain:ls" do |c|
36
+ c.syntax = "dawn drain:ls"
37
+ c.description = "Lists all Drains for this App"
38
+
39
+ c.action do |args, options|
40
+ url = args.first
41
+ app = current_app
42
+ drains = app.drains.all
43
+ say format_drains(drains)
44
+ end
45
+ end
46
+
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,62 @@
1
+ module Dawn
2
+ module CLI
3
+ class Application
4
+ def env_commands
5
+
6
+ command "env:set" do |c|
7
+ c.syntax = "dawn env:set [<key_name=value>..]"
8
+ c.description = "Set multiple ENV variables"
9
+
10
+ c.action do |args, options|
11
+ env = current_app.env
12
+ vars = args.each_with_object({}) do |arg, hsh|
13
+ key, value = arg.split("=", 2)
14
+ hsh[key] = value
15
+ end
16
+ env.update(vars)
17
+ env.save
18
+ say "App ENV has been updated"
19
+ end
20
+ end
21
+
22
+ command "env:get" do |c|
23
+ c.syntax = "dawn env:get [<key_name> ..]"
24
+ c.description = "Get an ENV var, if none is given prints all the variables"
25
+
26
+ c.action do |args, options|
27
+ env = current_app.env
28
+ if args.empty?
29
+ env.each do |key, value|
30
+ say "#{key}: #{value}"
31
+ end
32
+ else
33
+ args.each do |key|
34
+ value = env[key]
35
+ say "#{key}: #{value}"
36
+ end
37
+ end
38
+ end
39
+ end
40
+
41
+ command "env:unset" do |c|
42
+ c.syntax = "dawn env:unset <key_name> [<key_name>..]"
43
+ c.description = "Deletes an ENV var"
44
+
45
+ c.action do |args, options|
46
+ env = current_app.env
47
+ dlt_keys = [] # list of the deleted keys
48
+ arg.each do |key|
49
+ if env.key?(key)
50
+ env.delete(key)
51
+ dlt_keys << key
52
+ end
53
+ end
54
+ env.save
55
+ say "deleted #{dlt_keys.join(", ")}"
56
+ end
57
+ end
58
+
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,51 @@
1
+ module Dawn
2
+ module CLI
3
+ class Application
4
+ def key_commands
5
+
6
+ command "key:add" do |c|
7
+ c.syntax = "dawn key:add"
8
+ c.description = "Adds your local ssh_key"
9
+
10
+ c.action do |args, options|
11
+ filename = File.join(Dir.home, ".ssh/id_rsa.pub")
12
+ pubkey = File.read filename
13
+ key = Dawn::Key.add(pubkey)
14
+ end
15
+ end
16
+
17
+ command "key:ls" do |c|
18
+ c.syntax = "dawn key:ls"
19
+ c.description = "Lists all your Keys currently on dawn"
20
+
21
+ c.action do |args, options|
22
+ keys = Dawn::Key.all
23
+ say format_keys(keys)
24
+ end
25
+ end
26
+
27
+ command "key:get" do |c|
28
+ c.syntax = "dawn key:get <key_id>"
29
+ c.description = "Retrieve a Key by ID"
30
+
31
+ c.action do |args, options|
32
+ key_id = args.first
33
+ key = Dawn::Key.find(id: key_id)
34
+ say format_keys([key])
35
+ end
36
+ end
37
+
38
+ command "key:delete" do |c|
39
+ c.syntax = "dawn key:delete <key_id>"
40
+ c.description = "Delete a Key by ID"
41
+
42
+ c.action do |args, options|
43
+ key_id = args.first
44
+ Dawn::Key.destroy(id: key_id)
45
+ end
46
+ end
47
+
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,57 @@
1
+ module Dawn
2
+ module CLI
3
+ class Application
4
+ def local_commands
5
+
6
+ #command "ping" do |c|
7
+ # c.syntax "dawn ping"
8
+ # c.description = "Pings the dawn server to determine if its working correctly"
9
+ # c.action do |args, options|
10
+ # end
11
+ #end
12
+
13
+ command "new" do |c|
14
+ c.syntax = "dawn new [<app_name>]"
15
+ c.description = "Create a new dawn App (with git; setup)"
16
+
17
+ c.action do |args, options|
18
+ appname = args.first
19
+ app = try_create_app appname
20
+ appname = app.name
21
+
22
+ if Dir.exists? appname
23
+ say " warning ! Directory #{appname} already exists"
24
+ else
25
+ FileUtils.mkdir_p appname
26
+ say "\tCREATE\t#{appname}"
27
+ end
28
+
29
+ Dir.chdir appname do
30
+ `git init`
31
+ git_add_dawn_remote app
32
+ end
33
+ say "\tAPP\t#{appname}"
34
+ end
35
+ end
36
+ alias_command "create", "new"
37
+
38
+ command "init" do |c|
39
+ c.syntax = "dawn init [<app_name>]"
40
+ c.description = "Setup an existing App with a dawn remote, if no <app_name> is given, the App directory's name will be used"
41
+
42
+ c.option "--name NAME", String, "name your App"
43
+ c.option "--random", "gives you App an awesome name"
44
+
45
+ c.action do |args, options|
46
+ appname = args.first || options.name || File.basename(Dir.getwd)
47
+ appname = nil if options.random
48
+ app = try_create_app appname
49
+ git_add_dawn_remote app
50
+ say "\tAPP\t#{app.name}"
51
+ end
52
+ end
53
+
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,21 @@
1
+ module Dawn
2
+ module CLI
3
+ class Application
4
+ def login_commands
5
+
6
+ command "login" do |c|
7
+ c.syntax = "dawn login"
8
+ c.description = "Login to dawn's API"
9
+
10
+ c.action do |args, options|
11
+ usn = ask "Username: "
12
+ psw = password "Password: "
13
+ Dawn.authenticate username: usn, password: psw
14
+ say " ! login details have been saved to your .netrc"
15
+ end
16
+ end
17
+
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,79 @@
1
+ module Dawn
2
+ module CLI
3
+ module OutputFormatter
4
+
5
+ def table_style
6
+ { } #width: 80 }
7
+ end
8
+
9
+ def format_keys(keys)
10
+ table = Terminal::Table.new title: 'Keys',
11
+ headings: ['ID', 'Fingerprint', 'Key'],
12
+ style: table_style
13
+ keys.each do |key|
14
+ table << [key.id, key.fingerprint, " ... "]#key.key[0, 20]] # truncate the key
15
+ table << :separator
16
+ end
17
+
18
+ table
19
+ end
20
+
21
+ def format_apps(apps)
22
+ table = Terminal::Table.new title: 'Apps',
23
+ headings: ['ID', 'Name', 'Formation'],
24
+ style: table_style
25
+ apps.each do |app|
26
+ form = app.formation.map { |k,v| "#{k}: #{v}" }.join("\n")
27
+ table << [app.id, app.name, form]
28
+ table << :separator
29
+ end
30
+
31
+ table
32
+ end
33
+
34
+ def format_domains(domains)
35
+ table = Terminal::Table.new title: 'Domains',
36
+ headings: ['ID', 'URL'],
37
+ style: table_style
38
+ domains.each do |domain|
39
+ table << [domain.id, domain.url]
40
+ table << :separator
41
+ end
42
+
43
+ table
44
+ end
45
+
46
+ def format_drains(drains)
47
+ table = Terminal::Table.new title: 'Drains',
48
+ headings: ['ID', 'URL'],
49
+ style: table_style
50
+ drains.each do |drain|
51
+ table << [drain.id, drain.url]
52
+ table << :separator
53
+ end
54
+
55
+ table
56
+ end
57
+
58
+ def format_gears(gears)
59
+ table = Terminal::Table.new title: 'Gears',
60
+ headings: ['ID', 'Name', 'Uptime'],
61
+ style: table_style
62
+ gears.each do |gear|
63
+ n = gear.uptime.to_i
64
+ if n > 0
65
+ scale = TimeLord::Scale.new(n)
66
+ uptime = "#{scale.to_value} #{scale.to_unit}"
67
+ else
68
+ uptime = "just now"
69
+ end
70
+ table << [gear.id, gear.name, uptime]
71
+ table << :separator
72
+ end
73
+
74
+ table
75
+ end
76
+
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,7 @@
1
+ class Terminal::Table
2
+
3
+ ##
4
+ # say uses to_str instead of to_s
5
+ alias :to_str :to_s
6
+
7
+ end
@@ -0,0 +1,13 @@
1
+ module Dawn
2
+ module CLI
3
+ module Version
4
+ MAJOR = 0
5
+ MINOR = 7
6
+ PATCH = 0
7
+ BUILD = nil
8
+ STRING = [MAJOR, MINOR, PATCH, BUILD].compact.join(".").freeze
9
+ end
10
+ # backward compatibility
11
+ VERSION = Version::STRING
12
+ end
13
+ end
metadata ADDED
@@ -0,0 +1,116 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dawn-cli
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.7.0
5
+ platform: ruby
6
+ authors:
7
+ - Blaž Hrastnik
8
+ - Corey Powell
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2014-06-07 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: commander
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: '4.2'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: '4.2'
28
+ - !ruby/object:Gem::Dependency
29
+ name: time-lord
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - "~>"
33
+ - !ruby/object:Gem::Version
34
+ version: '1.0'
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: '1.0'
42
+ - !ruby/object:Gem::Dependency
43
+ name: terminal-table
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - "~>"
47
+ - !ruby/object:Gem::Version
48
+ version: '1.4'
49
+ type: :runtime
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - "~>"
54
+ - !ruby/object:Gem::Version
55
+ version: '1.4'
56
+ - !ruby/object:Gem::Dependency
57
+ name: dawn-api
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - "~>"
61
+ - !ruby/object:Gem::Version
62
+ version: '0.9'
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '0.9'
70
+ description: CLI for Dawn PaaS
71
+ email:
72
+ executables:
73
+ - dawn
74
+ extensions: []
75
+ extra_rdoc_files: []
76
+ files:
77
+ - bin/dawn
78
+ - lib/dawn/cli.rb
79
+ - lib/dawn/cli/application.rb
80
+ - lib/dawn/cli/commands.rb
81
+ - lib/dawn/cli/commands/app.rb
82
+ - lib/dawn/cli/commands/domain.rb
83
+ - lib/dawn/cli/commands/drain.rb
84
+ - lib/dawn/cli/commands/env.rb
85
+ - lib/dawn/cli/commands/key.rb
86
+ - lib/dawn/cli/commands/local.rb
87
+ - lib/dawn/cli/commands/login.rb
88
+ - lib/dawn/cli/output_formatter.rb
89
+ - lib/dawn/cli/patches.rb
90
+ - lib/dawn/cli/version.rb
91
+ homepage: https://github.com/dawn/dawn-cli
92
+ licenses:
93
+ - MIT
94
+ metadata: {}
95
+ post_install_message:
96
+ rdoc_options: []
97
+ require_paths:
98
+ - lib
99
+ required_ruby_version: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ required_rubygems_version: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - ">="
107
+ - !ruby/object:Gem::Version
108
+ version: '0'
109
+ requirements: []
110
+ rubyforge_project:
111
+ rubygems_version: 2.2.2
112
+ signing_key:
113
+ specification_version: 4
114
+ summary: Dawn CLI
115
+ test_files: []
116
+ has_rdoc: