jdc 0.2.1 → 0.2.2.pre

Sign up to get free protection for your applications and to get access to all the features.
Files changed (151) hide show
  1. data/LICENSE +1277 -24
  2. data/Rakefile +13 -0
  3. data/bin/jdc +12 -2
  4. data/lib/admin/README.md +15 -0
  5. data/lib/admin/curl.rb +60 -0
  6. data/lib/admin/guid.rb +89 -0
  7. data/lib/admin/plugin.rb +6 -0
  8. data/lib/admin/service_auth_token.rb +94 -0
  9. data/lib/admin/service_broker/add.rb +47 -0
  10. data/lib/admin/service_broker/service_brokers.rb +24 -0
  11. data/lib/admin/set_quota.rb +44 -0
  12. data/lib/console/README.md +8 -0
  13. data/lib/console/console.rb +187 -0
  14. data/lib/console/plugin.rb +33 -0
  15. data/lib/jdc.rb +15 -2
  16. data/lib/jdc/cli.rb +556 -0
  17. data/lib/jdc/cli/app/app.rb +43 -0
  18. data/lib/jdc/cli/app/apps.rb +87 -0
  19. data/lib/jdc/cli/app/base.rb +72 -0
  20. data/lib/jdc/cli/app/delete.rb +95 -0
  21. data/lib/jdc/cli/app/deprecated.rb +11 -0
  22. data/lib/jdc/cli/app/env.rb +78 -0
  23. data/lib/jdc/cli/app/events.rb +45 -0
  24. data/lib/jdc/cli/app/files.rb +137 -0
  25. data/lib/jdc/cli/app/health.rb +26 -0
  26. data/lib/jdc/cli/app/instances.rb +53 -0
  27. data/lib/jdc/cli/app/logs.rb +76 -0
  28. data/lib/jdc/cli/app/push.rb +103 -0
  29. data/lib/jdc/cli/app/push/create.rb +108 -0
  30. data/lib/jdc/cli/app/push/interactions.rb +86 -0
  31. data/lib/jdc/cli/app/push/sync.rb +57 -0
  32. data/lib/jdc/cli/app/rename.rb +35 -0
  33. data/lib/jdc/cli/app/restart.rb +31 -0
  34. data/lib/jdc/cli/app/scale.rb +63 -0
  35. data/lib/jdc/cli/app/start.rb +161 -0
  36. data/lib/jdc/cli/app/stats.rb +67 -0
  37. data/lib/jdc/cli/app/stop.rb +27 -0
  38. data/lib/jdc/cli/domain/base.rb +9 -0
  39. data/lib/jdc/cli/domain/domains.rb +40 -0
  40. data/lib/jdc/cli/domain/map.rb +55 -0
  41. data/lib/jdc/cli/domain/unmap.rb +56 -0
  42. data/lib/jdc/cli/help.rb +15 -0
  43. data/lib/jdc/cli/interactive.rb +105 -0
  44. data/lib/jdc/cli/login_requirements.rb +15 -0
  45. data/lib/jdc/cli/organization/base.rb +14 -0
  46. data/lib/jdc/cli/organization/create.rb +37 -0
  47. data/lib/jdc/cli/organization/delete.rb +63 -0
  48. data/lib/jdc/cli/organization/org.rb +45 -0
  49. data/lib/jdc/cli/organization/orgs.rb +30 -0
  50. data/lib/jdc/cli/organization/rename.rb +37 -0
  51. data/lib/jdc/cli/populators/base.rb +16 -0
  52. data/lib/jdc/cli/populators/organization.rb +32 -0
  53. data/lib/jdc/cli/populators/populator_methods.rb +64 -0
  54. data/lib/jdc/cli/populators/space.rb +33 -0
  55. data/lib/jdc/cli/populators/target.rb +13 -0
  56. data/lib/jdc/cli/route/base.rb +9 -0
  57. data/lib/jdc/cli/route/delete.rb +28 -0
  58. data/lib/jdc/cli/route/map.rb +68 -0
  59. data/lib/jdc/cli/route/routes.rb +26 -0
  60. data/lib/jdc/cli/route/unmap.rb +56 -0
  61. data/lib/jdc/cli/service/base.rb +9 -0
  62. data/lib/jdc/cli/service/bind.rb +44 -0
  63. data/lib/jdc/cli/service/create.rb +159 -0
  64. data/lib/jdc/cli/service/delete.rb +83 -0
  65. data/lib/jdc/cli/service/rename.rb +36 -0
  66. data/lib/jdc/cli/service/service.rb +42 -0
  67. data/lib/jdc/cli/service/service_instance_helper.rb +99 -0
  68. data/lib/jdc/cli/service/services.rb +111 -0
  69. data/lib/jdc/cli/service/unbind.rb +37 -0
  70. data/lib/jdc/cli/space/base.rb +29 -0
  71. data/lib/jdc/cli/space/create.rb +67 -0
  72. data/lib/jdc/cli/space/delete.rb +56 -0
  73. data/lib/jdc/cli/space/rename.rb +38 -0
  74. data/lib/jdc/cli/space/space.rb +66 -0
  75. data/lib/jdc/cli/space/spaces.rb +57 -0
  76. data/lib/jdc/cli/space/switch.rb +19 -0
  77. data/lib/jdc/cli/start/base.rb +41 -0
  78. data/lib/jdc/cli/start/colors.rb +13 -0
  79. data/lib/jdc/cli/start/target.rb +50 -0
  80. data/lib/jdc/cli/start/target_prettifier.rb +17 -0
  81. data/lib/jdc/cli/start/targets.rb +16 -0
  82. data/lib/jdc/cli/user/base.rb +30 -0
  83. data/lib/jdc/cli/user/create.rb +52 -0
  84. data/lib/jdc/cli/user/passwd.rb +37 -0
  85. data/lib/jdc/cli/user/register.rb +43 -0
  86. data/lib/jdc/cli/user/users.rb +32 -0
  87. data/lib/jdc/constants.rb +11 -0
  88. data/lib/jdc/errors.rb +19 -0
  89. data/lib/jdc/object_extensions.rb +15 -0
  90. data/lib/jdc/plugin.rb +56 -0
  91. data/lib/jdc/spacing.rb +89 -0
  92. data/lib/jdc/spec_helper.rb +1 -0
  93. data/lib/jdc/test_support.rb +6 -0
  94. data/lib/jdc/version.rb +3 -0
  95. data/lib/manifests/errors.rb +35 -0
  96. data/lib/manifests/loader.rb +31 -0
  97. data/lib/manifests/loader/builder.rb +39 -0
  98. data/lib/manifests/loader/normalizer.rb +145 -0
  99. data/lib/manifests/loader/resolver.rb +79 -0
  100. data/lib/manifests/manifests.rb +344 -0
  101. data/lib/manifests/plugin.rb +140 -0
  102. data/lib/micro/README.md +9 -0
  103. data/lib/micro/errors.rb +4 -0
  104. data/lib/{jdc → micro}/micro.rb +15 -15
  105. data/lib/micro/plugin.rb +197 -0
  106. data/lib/micro/switcher/base.rb +79 -0
  107. data/lib/{jdc/micro → micro}/switcher/darwin.rb +5 -3
  108. data/lib/{jdc/micro → micro}/switcher/dummy.rb +1 -1
  109. data/lib/micro/switcher/linux.rb +16 -0
  110. data/lib/{jdc/micro → micro}/switcher/windows.rb +5 -5
  111. data/lib/{jdc/micro → micro}/vmrun.rb +26 -19
  112. data/lib/tasks/gem_release.rake +42 -0
  113. data/lib/tunnel/README.md +29 -0
  114. data/{config → lib/tunnel/config}/clients.yml +2 -2
  115. data/lib/tunnel/helper-app/Gemfile +10 -0
  116. data/lib/tunnel/helper-app/Gemfile.lock +48 -0
  117. data/{caldecott_helper → lib/tunnel/helper-app}/server.rb +5 -5
  118. data/lib/tunnel/plugin.rb +183 -0
  119. data/lib/tunnel/tunnel.rb +295 -0
  120. metadata +371 -210
  121. data/README.md +0 -102
  122. data/config/micro/paths.yml +0 -22
  123. data/config/micro/refresh_ip.rb +0 -20
  124. data/lib/cli.rb +0 -53
  125. data/lib/cli/commands/admin.rb +0 -58
  126. data/lib/cli/commands/apps.rb +0 -1129
  127. data/lib/cli/commands/base.rb +0 -228
  128. data/lib/cli/commands/manifest.rb +0 -56
  129. data/lib/cli/commands/micro.rb +0 -115
  130. data/lib/cli/commands/misc.rb +0 -126
  131. data/lib/cli/commands/services.rb +0 -178
  132. data/lib/cli/commands/user.rb +0 -14
  133. data/lib/cli/config.rb +0 -173
  134. data/lib/cli/console_helper.rb +0 -170
  135. data/lib/cli/core_ext.rb +0 -122
  136. data/lib/cli/errors.rb +0 -19
  137. data/lib/cli/frameworks.rb +0 -265
  138. data/lib/cli/manifest_helper.rb +0 -300
  139. data/lib/cli/runner.rb +0 -505
  140. data/lib/cli/services_helper.rb +0 -84
  141. data/lib/cli/tunnel_helper.rb +0 -332
  142. data/lib/cli/usage.rb +0 -86
  143. data/lib/cli/version.rb +0 -7
  144. data/lib/cli/zip_util.rb +0 -77
  145. data/lib/jdc/client.rb +0 -457
  146. data/lib/jdc/const.rb +0 -25
  147. data/lib/jdc/micro/switcher/base.rb +0 -97
  148. data/lib/jdc/micro/switcher/linux.rb +0 -16
  149. data/lib/jdc/signature/version.rb +0 -27
  150. data/lib/jdc/signer.rb +0 -13
  151. data/lib/jdc/timer.rb +0 -12
@@ -1,228 +0,0 @@
1
- require 'rubygems'
2
- require 'interact'
3
- require 'terminal-table/import'
4
-
5
- module JDC::Cli
6
-
7
- module Command
8
-
9
- class Base
10
- include Interactive
11
-
12
- attr_reader :no_prompt, :prompt_ok
13
-
14
- MANIFEST = "manifest.yml"
15
-
16
- def initialize(options={})
17
- @options = options.dup
18
- @no_prompt = @options[:noprompts]
19
- @prompt_ok = !no_prompt
20
-
21
- # Suppress colorize on Windows systems for now.
22
- if WINDOWS
23
- JDC::Cli::Config.colorize = false
24
- end
25
-
26
- @path = @options[:path] || '.'
27
-
28
- load_manifest manifest_file if manifest_file
29
- end
30
-
31
- def manifest_file
32
- return @options[:manifest] if @options[:manifest]
33
- return @manifest_file if @manifest_file
34
-
35
- where = File.expand_path(@path)
36
- while true
37
- if File.exists?(File.join(where, MANIFEST))
38
- @manifest_file = File.join(where, MANIFEST)
39
- break
40
- elsif File.basename(where) == "/"
41
- @manifest_file = nil
42
- break
43
- else
44
- where = File.expand_path("../", where)
45
- end
46
- end
47
-
48
- @manifest_file
49
- end
50
-
51
- def load_manifest_structure(file)
52
- manifest = YAML.load_file file
53
-
54
- Array(manifest["inherit"]).each do |p|
55
- manifest = merge_parent(manifest, p)
56
- end
57
-
58
- if apps = manifest["applications"]
59
- apps.each do |k, v|
60
- abs = File.expand_path(k, file)
61
- if Dir.pwd.start_with? abs
62
- manifest = merge_manifest(manifest, v)
63
- end
64
- end
65
- end
66
-
67
- manifest
68
- end
69
-
70
- def resolve_manifest(manifest)
71
- if apps = manifest["applications"]
72
- apps.each_value do |v|
73
- resolve_lexically(v, [manifest])
74
- end
75
- end
76
-
77
- resolve_lexically(manifest, [manifest])
78
- end
79
-
80
- def load_manifest(file)
81
- @manifest = load_manifest_structure(file)
82
- resolve_manifest(@manifest)
83
- end
84
-
85
- def merge_parent(child, path)
86
- file = File.expand_path("../" + path, manifest_file)
87
- merge_manifest(child, load_manifest_structure(file))
88
- end
89
-
90
- def merge_manifest(child, parent)
91
- merge = proc do |_, old, new|
92
- if new.is_a?(Hash) and old.is_a?(Hash)
93
- old.merge(new, &merge)
94
- else
95
- new
96
- end
97
- end
98
-
99
- parent.merge(child, &merge)
100
- end
101
-
102
- def resolve_lexically(val, ctx = [@manifest])
103
- case val
104
- when Hash
105
- val.each_value do |v|
106
- resolve_lexically(v, [val] + ctx)
107
- end
108
- when Array
109
- val.each do |v|
110
- resolve_lexically(v, ctx)
111
- end
112
- when String
113
- val.gsub!(/\$\{([[:alnum:]\-]+)\}/) do
114
- resolve_symbol($1, ctx)
115
- end
116
- end
117
-
118
- nil
119
- end
120
-
121
- def resolve_symbol(sym, ctx)
122
- case sym
123
- when "target-base"
124
- target_base(ctx)
125
-
126
- when "target-url"
127
- target_url(ctx)
128
-
129
- when "random-word"
130
- "%04x" % [rand(0x0100000)]
131
-
132
- else
133
- found = find_symbol(sym, ctx)
134
-
135
- if found
136
- resolve_lexically(found, ctx)
137
- found
138
- else
139
- err(sym, "Unknown symbol in manifest: ")
140
- end
141
- end
142
- end
143
-
144
- def find_symbol(sym, ctx)
145
- ctx.each do |h|
146
- if val = resolve_in(h, sym)
147
- return val
148
- end
149
- end
150
-
151
- nil
152
- end
153
-
154
- def resolve_in(hash, *where)
155
- find_in_hash(hash, ["properties"] + where) ||
156
- find_in_hash(hash, ["applications", @application] + where) ||
157
- find_in_hash(hash, where)
158
- end
159
-
160
- def manifest(*where)
161
- resolve_in(@manifest, *where)
162
- end
163
-
164
- def find_in_hash(hash, where)
165
- what = hash
166
- where.each do |x|
167
- return nil unless what.is_a?(Hash)
168
- what = what[x]
169
- end
170
-
171
- what
172
- end
173
-
174
- def target_url(ctx = [])
175
- find_symbol("target", ctx) ||
176
- (@client && @client.target) ||
177
- JDC::Cli::Config.target_url
178
- end
179
-
180
- def target_base(ctx = [])
181
- JDC::Cli::Config.base_of(find_symbol("target", ctx) || target_url)
182
- end
183
-
184
- # Inject a client to help in testing.
185
- def client(cli=nil)
186
- @client ||= cli
187
- return @client if @client
188
- @client = JDC::Client.new(target_url)
189
- @client.trace = JDC::Cli::Config.trace if JDC::Cli::Config.trace
190
- @client.proxy_for @options[:proxy] if @options[:proxy]
191
- @client
192
- end
193
-
194
- def client_info
195
- @client_info ||= client.info
196
- end
197
-
198
- #need to delete
199
- def auth_token
200
- @auth_token = JDC::Cli::Config.auth_token(@options[:token_file])
201
- end
202
-
203
- def runtimes_info
204
- return @runtimes if @runtimes
205
- info = client_info
206
- @runtimes = {}
207
- if info[:frameworks]
208
- info[:frameworks].each_value do |f|
209
- next unless f[:runtimes]
210
- f[:runtimes].each { |r| @runtimes[r[:name]] = r}
211
- end
212
- end
213
- @runtimes
214
- end
215
-
216
- def frameworks_info
217
- return @frameworks if @frameworks
218
- info = client_info
219
- @frameworks = []
220
- if info[:frameworks]
221
- info[:frameworks].each_value { |f| @frameworks << [f[:name]] }
222
- end
223
- @frameworks
224
- end
225
- end
226
- end
227
- end
228
-
@@ -1,56 +0,0 @@
1
- module JDC::Cli::Command
2
- class Manifest < Base
3
- include JDC::Cli::ManifestHelper
4
-
5
- def initialize(options)
6
- super
7
-
8
- # don't resolve any of the manifest template stuff
9
- if manifest_file
10
- @manifest = load_manifest_structure manifest_file
11
- else
12
- @manifest = {}
13
- end
14
- end
15
-
16
- def edit
17
- build_manifest
18
- save_manifest
19
- end
20
-
21
- def extend(which)
22
- parent = load_manifest_structure which
23
- @manifest = load_manifest_structure which
24
-
25
- build_manifest
26
-
27
- simplify(@manifest, parent)
28
-
29
- @manifest["inherit"] ||= []
30
- @manifest["inherit"] << which
31
-
32
- save_manifest(ask("Save where?"))
33
- end
34
-
35
- private
36
-
37
- def simplify(child, parent)
38
- return unless child.is_a?(Hash) and parent.is_a?(Hash)
39
-
40
- child.reject! do |k, v|
41
- if v == parent[k]
42
- puts "rejecting #{k}"
43
- true
44
- else
45
- simplify(v, parent[k])
46
- false
47
- end
48
- end
49
- end
50
-
51
- def build_manifest
52
- @application = ask("Configure for which application?", :default => ".")
53
- interact true
54
- end
55
- end
56
- end
@@ -1,115 +0,0 @@
1
- module JDC::Cli::Command
2
- class Micro < Base
3
-
4
- def initialize(args)
5
- super(args)
6
- end
7
-
8
- def offline(mode)
9
- command('offline')
10
- end
11
-
12
- def online(mode)
13
- command('online')
14
- end
15
-
16
- def status(mode)
17
- command('status')
18
- end
19
-
20
- def command(cmd)
21
- config = build_config
22
- switcher(config).send(cmd)
23
- store_config(config)
24
- end
25
-
26
- def switcher(config)
27
- case Micro.platform
28
- when :darwin
29
- switcher = JDC::Micro::Switcher::Darwin.new(config)
30
- when :linux
31
- switcher = JDC::Micro::Switcher::Linux.new(config)
32
- when :windows
33
- switcher = JDC::Micro::Switcher::Windows.new(config)
34
- when :dummy # for testing only
35
- switcher = JDC::Micro::Switcher::Dummy.new(config)
36
- else
37
- err "unsupported platform: #{Micro.platform}"
38
- end
39
- end
40
-
41
- # Returns the configuration needed to run the micro related subcommands.
42
- # First loads saved config from file (if there is any), then overrides
43
- # loaded values with command line arguments, and finally tries to guess
44
- # in case neither was used:
45
- # vmx location of micro.vmx file
46
- # vmrun location of vmrun command
47
- # password password for vcap user (in the guest vm)
48
- # platform current platform
49
- def build_config
50
- conf = JDC::Cli::Config.micro # returns {} if there isn't a saved config
51
-
52
- override(conf, 'vmx', true) do
53
- locate_vmx(Micro.platform)
54
- end
55
-
56
- override(conf, 'vmrun', true) do
57
- JDC::Micro::VMrun.locate(Micro.platform)
58
- end
59
-
60
- override(conf, 'password') do
61
- @password = ask("Please enter your JingDong Cloud VM password (vcap user) password", :echo => "*")
62
- end
63
-
64
- conf['platform'] = Micro.platform
65
-
66
- conf
67
- end
68
-
69
- # Save the cleartext password if --save is supplied.
70
- # Note: it is due to vix we have to use a cleartext password :(
71
- # Only if --password is used and not --save is the password deleted from the
72
- # config file before it is stored to disk.
73
- def store_config(config)
74
- if @options[:save]
75
- warn("cleartext password saved in: #{JDC::Cli::Config::MICRO_FILE}")
76
- elsif @options[:password] || @password
77
- config.delete('password')
78
- end
79
-
80
- JDC::Cli::Config.store_micro(config)
81
- end
82
-
83
- # override with command line arguments and yield the block in case the option isn't set
84
- def override(config, option, escape=false, &blk)
85
- # override if given on the command line
86
- if opt = @options[option.to_sym]
87
- opt = JDC::Micro.escape_path(opt) if escape
88
- config[option] = opt
89
- end
90
- config[option] = yield unless config[option]
91
- end
92
-
93
- def locate_vmx(platform)
94
- paths = YAML.load_file(JDC::Micro.config_file('paths.yml'))
95
- vmx_paths = paths[platform.to_s]['vmx']
96
- vmx = JDC::Micro.locate_file('micro.vmx', 'micro', vmx_paths)
97
- err "Unable to locate micro.vmx, please supply --vmx option" unless vmx
98
- vmx
99
- end
100
-
101
- def self.platform
102
- case RUBY_PLATFORM
103
- when /darwin/ # x86_64-darwin11.2.0
104
- :darwin
105
- when /linux/ # x86_64-linux
106
- :linux
107
- when /mingw|mswin32|cygwin/ # i386-mingw32
108
- :windows
109
- else
110
- RUBY_PLATFORM
111
- end
112
- end
113
-
114
- end
115
- end
@@ -1,126 +0,0 @@
1
- module JDC::Cli::Command
2
-
3
- class Misc < Base
4
- def version
5
- say "jdc #{JDC::Cli::VERSION}"
6
- end
7
-
8
- def target
9
- return display JSON.pretty_generate({:target => target_url}) if @options[:json]
10
- banner "[#{target_url}]"
11
- end
12
-
13
- def targets
14
- targets = JDC::Cli::Config.targets
15
- return display JSON.pretty_generate(targets) if @options[:json]
16
- return display 'None specified' if targets.empty?
17
- targets_table = table do |t|
18
- t.headings = 'Target', 'Authorization'
19
- targets.each { |target, token| t << [target, token] }
20
- end
21
- display "\n"
22
- display targets_table
23
- end
24
-
25
- alias :tokens :targets
26
-
27
- def set_target(target_url)
28
- target_url = "http://#{target_url}" unless /^https?/ =~ target_url
29
- target_url = target_url.gsub(/\/+$/, '')
30
- client = JDC::Client.new(target_url)
31
- unless client.target_valid?
32
- if prompt_ok
33
- display "Host is not available or is not valid: '#{target_url}'".red
34
- show_response = ask "Would you like see the response?",
35
- :default => false
36
- display "\n<<<\n#{client.raw_info}\n>>>\n" if show_response
37
- end
38
- exit(false)
39
- else
40
- JDC::Cli::Config.store_target(target_url)
41
- say "Successfully targeted to [#{target_url}]".green
42
- end
43
- end
44
-
45
- def info
46
- info = client_info
47
- return display JSON.pretty_generate(info) if @options[:json]
48
-
49
- display "\n#{info[:description]}"
50
- display ""
51
- display "Target: #{target_url} (v#{info[:version]})"
52
- display "Client: v#{JDC::Cli::VERSION}"
53
- if info[:user]
54
- display ''
55
- display "User: #{info[:user]}"
56
- end
57
- if usage = info[:usage] and limits = info[:limits]
58
- tmem = pretty_size(limits[:memory]*1024*1024)
59
- mem = pretty_size(usage[:memory]*1024*1024)
60
- tser = limits[:services]
61
- ser = usage[:services]
62
- tapps = limits[:apps] || 0
63
- apps = usage[:apps] || 0
64
- display "Usage: Memory (#{mem} of #{tmem} total)"
65
- display " Services (#{ser} of #{tser} total)"
66
- display " Apps (#{apps} of #{tapps} total)" if limits[:apps]
67
- end
68
- end
69
-
70
- def runtimes
71
- return display JSON.pretty_generate(runtimes_info) if @options[:json]
72
- return display "No Runtimes" if runtimes_info.empty?
73
- rtable = table do |t|
74
- t.headings = 'Name', 'Description', 'Version'
75
- runtimes_info.each_value { |rt| t << [rt[:name], rt[:description], rt[:version]] }
76
- end
77
- display "\n"
78
- display rtable
79
- end
80
-
81
- def frameworks
82
- return display JSON.pretty_generate(frameworks_info) if @options[:json]
83
- return display "No Frameworks" if frameworks_info.empty?
84
- rtable = table do |t|
85
- t.headings = ['Name']
86
- frameworks_info.each { |f| t << f }
87
- end
88
- display "\n"
89
- display rtable
90
- end
91
-
92
- def aliases
93
- aliases = JDC::Cli::Config.aliases
94
- return display JSON.pretty_generate(aliases) if @options[:json]
95
- return display "No Aliases" if aliases.empty?
96
- atable = table do |t|
97
- t.headings = 'Alias', 'Command'
98
- aliases.each { |k,v| t << [k, v] }
99
- end
100
- display "\n"
101
- display atable
102
- end
103
-
104
- def alias(k, v=nil)
105
- k,v = k.split('=') unless v
106
- aliases = JDC::Cli::Config.aliases
107
- aliases[k] = v
108
- JDC::Cli::Config.store_aliases(aliases)
109
- display "Successfully aliased '#{k}' to '#{v}'".green
110
- end
111
-
112
- def unalias(key)
113
- aliases = JDC::Cli::Config.aliases
114
- if aliases.has_key?(key)
115
- aliases.delete(key)
116
- JDC::Cli::Config.store_aliases(aliases)
117
- display "Successfully unaliased '#{key}'".green
118
- else
119
- display "Unknown alias '#{key}'".red
120
- end
121
- end
122
-
123
- end
124
-
125
- end
126
-