ey_cli 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. data/Gemfile +3 -0
  2. data/Gemfile.lock +57 -0
  3. data/LICENSE +22 -0
  4. data/README.md +104 -0
  5. data/Rakefile +129 -0
  6. data/bin/ey_cli +5 -0
  7. data/ey_cli.gemspec +117 -0
  8. data/history.md +3 -0
  9. data/lib/ey_cli/api.rb +96 -0
  10. data/lib/ey_cli/cli.rb +17 -0
  11. data/lib/ey_cli/command_manager.rb +29 -0
  12. data/lib/ey_cli/commands/accounts.rb +26 -0
  13. data/lib/ey_cli/commands/apps.rb +24 -0
  14. data/lib/ey_cli/commands/base.rb +16 -0
  15. data/lib/ey_cli/commands/console.rb +38 -0
  16. data/lib/ey_cli/commands/create_app.rb +76 -0
  17. data/lib/ey_cli/commands/create_env.rb +106 -0
  18. data/lib/ey_cli/commands/deploy.rb +23 -0
  19. data/lib/ey_cli/commands/help.rb +65 -0
  20. data/lib/ey_cli/commands/show.rb +65 -0
  21. data/lib/ey_cli/controllers/accounts.rb +23 -0
  22. data/lib/ey_cli/controllers/apps.rb +66 -0
  23. data/lib/ey_cli/controllers/environments.rb +78 -0
  24. data/lib/ey_cli/git_utils.rb +12 -0
  25. data/lib/ey_cli/models/account.rb +6 -0
  26. data/lib/ey_cli/models/app.rb +15 -0
  27. data/lib/ey_cli/models/base.rb +54 -0
  28. data/lib/ey_cli/models/environment.rb +32 -0
  29. data/lib/ey_cli/options_parser.rb +47 -0
  30. data/lib/ey_cli/smarty_parser.rb +29 -0
  31. data/lib/ey_cli/term.rb +58 -0
  32. data/lib/ey_cli.rb +46 -0
  33. data/spec/auth_helper.rb +28 -0
  34. data/spec/ey_cli/api_spec.rb +70 -0
  35. data/spec/ey_cli/command_manager_spec.rb +33 -0
  36. data/spec/ey_cli/commands/help_spec.rb +36 -0
  37. data/spec/ey_cli/controllers/accounts_spec.rb +40 -0
  38. data/spec/ey_cli/controllers/apps_spec.rb +97 -0
  39. data/spec/ey_cli/controllers/environments_spec.rb +101 -0
  40. data/spec/ey_cli/models/app_spec.rb +50 -0
  41. data/spec/ey_cli/models/base_spec.rb +98 -0
  42. data/spec/ey_cli/models/environment_spec.rb +51 -0
  43. data/spec/ey_cli/options_parser_spec.rb +19 -0
  44. data/spec/ey_cli/smarty_parser_spec.rb +19 -0
  45. data/spec/spec_helper.rb +29 -0
  46. metadata +288 -0
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source :rubygems
2
+
3
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,57 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ ey_cli (0.1.0)
5
+ faraday
6
+ faraday-stack
7
+ faraday_middleware
8
+ hashie
9
+ highline
10
+ json
11
+ multi_json
12
+ slop
13
+
14
+ GEM
15
+ remote: http://rubygems.org/
16
+ specs:
17
+ addressable (2.2.6)
18
+ crack (0.3.1)
19
+ diff-lcs (1.1.3)
20
+ fakefs (0.3.2)
21
+ faraday (0.7.4)
22
+ addressable (~> 2.2.6)
23
+ multipart-post (~> 1.1.0)
24
+ rack (< 2, >= 1.1.0)
25
+ faraday-stack (0.1.3)
26
+ faraday (~> 0.6)
27
+ faraday_middleware (0.7.0)
28
+ faraday (~> 0.7.3)
29
+ hashie (1.0.0)
30
+ highline (1.6.2)
31
+ json (1.6.1)
32
+ multi_json (1.0.3)
33
+ multipart-post (1.1.3)
34
+ rack (1.3.3)
35
+ rake (0.9.2)
36
+ rspec (2.6.0)
37
+ rspec-core (~> 2.6.0)
38
+ rspec-expectations (~> 2.6.0)
39
+ rspec-mocks (~> 2.6.0)
40
+ rspec-core (2.6.4)
41
+ rspec-expectations (2.6.0)
42
+ diff-lcs (~> 1.1.2)
43
+ rspec-mocks (2.6.0)
44
+ slop (2.1.0)
45
+ webmock (1.7.6)
46
+ addressable (~> 2.2, > 2.2.5)
47
+ crack (>= 0.1.7)
48
+
49
+ PLATFORMS
50
+ ruby
51
+
52
+ DEPENDENCIES
53
+ ey_cli!
54
+ fakefs
55
+ rake (~> 0.9)
56
+ rspec
57
+ webmock
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ == ey_cli
2
+
3
+ Copyright (c) 2011 David Calavera
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,104 @@
1
+ # ey_cli
2
+
3
+ [![Build Status](https://secure.travis-ci.org/calavera/ey_cli.png)](http://travis-ci.org/calavera/ey_cli)
4
+
5
+ An alternative command line interface for Engine Yard Cloud.
6
+
7
+ Still in early development.
8
+
9
+ ## Installation
10
+
11
+ ```
12
+ gem install ey_cli
13
+ ```
14
+
15
+ ## Usage
16
+
17
+ ```
18
+ ey_cli command [args]
19
+ ```
20
+
21
+ More information available about the available commands if you run:
22
+
23
+ ```
24
+ ey_cli help
25
+ ```
26
+
27
+ ## Examples
28
+
29
+ - How to create a new application:
30
+
31
+ ```
32
+ ey_cli create_app
33
+ ```
34
+
35
+ That's all that you need if you're under the application directory and this already is in a git repository. It also runs a first deploy for free.
36
+
37
+ - How to perform a new deploy:
38
+
39
+ ```
40
+ ey_cli deploy
41
+ ```
42
+
43
+ That's all, if the CLI doesn't know what you want to deploy it politely asks you.
44
+
45
+ ## Avaliable commands
46
+
47
+ General info
48
+ accounts List the accounts associated to a user.
49
+ console Start an interactive session to use ey_cli.
50
+ help Show commands information.
51
+
52
+ Applications
53
+ apps List the applications associated to a user.
54
+ create_app Create a new application. It takes the information from the current directory.
55
+ show Show information and status of an application.
56
+
57
+ Environments
58
+ create_env Create a new environment for an application.
59
+ deploy Run a deploy for an application.
60
+
61
+ ## Motivation
62
+
63
+ engineyard gem is strongly coupled to Thor, and I don't like the
64
+ conventions that you have to assume because of this coupling.
65
+
66
+ engineyarg gem connects to your boxes directly to perform tasks. I
67
+ prefer to connect to the available APIs and have a unique entry point.
68
+
69
+ **Is this a replacement for engineyard gem, then?** No, for now it's just an
70
+ experiment and only implements a few number of commands.
71
+
72
+ ## Development notes
73
+
74
+ Check the opened issues if you want to help and don't know where to
75
+ start from.
76
+
77
+ Run this command to execute the tests:
78
+
79
+ ```
80
+ bundle rake
81
+ ```
82
+
83
+ Any pull request and contribution is really appreciated.
84
+
85
+ ## Notes about the structure:
86
+
87
+ How this library is structured:
88
+
89
+ ### Commands
90
+
91
+ What the user executes. Each one can provide its own command line parser
92
+ to accept further options but one is provided by default.
93
+
94
+ ### Controllers
95
+
96
+ Code and stuff. Show messages, decide what to do...
97
+
98
+ ### Models
99
+
100
+ Connect to the api. Abstraction over the json responses.
101
+
102
+ # Copyright
103
+
104
+ Copyright (c) 2011 David Calavera. See LICENSE for details.
data/Rakefile ADDED
@@ -0,0 +1,129 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+ require 'date'
4
+
5
+ #############################################################################
6
+ #
7
+ # Helper functions
8
+ #
9
+ #############################################################################
10
+
11
+ def name
12
+ @name ||= Dir['*.gemspec'].first.split('.').first
13
+ end
14
+
15
+ def version
16
+ line = File.read("lib/#{name}.rb")[/^\s*VERSION\s*=\s*.*/]
17
+ line.match(/.*VERSION\s*=\s*['"](.*)['"]/)[1]
18
+ end
19
+
20
+ def date
21
+ Date.today.to_s
22
+ end
23
+
24
+ def rubyforge_project
25
+ name
26
+ end
27
+
28
+ def gemspec_file
29
+ "#{name}.gemspec"
30
+ end
31
+
32
+ def gem_file
33
+ "#{name}-#{version}.gem"
34
+ end
35
+
36
+ def replace_header(head, header_name)
37
+ head.sub!(/(\.#{header_name}\s*= ').*'/) { "#{$1}#{send(header_name)}'"}
38
+ end
39
+
40
+ #############################################################################
41
+ #
42
+ # Standard tasks
43
+ #
44
+ #############################################################################
45
+
46
+ require 'rspec/core/rake_task'
47
+
48
+ RSpec::Core::RakeTask.new(:rspec) do |spec|
49
+ spec.rspec_opts = ['--color', "--format documentation"]
50
+ end
51
+
52
+ task :default => :rspec
53
+
54
+ desc "Open an irb session preloaded with this library"
55
+ task :console do
56
+ sh "bundle exec irb -rubygems -I ./lib -r #{name}.rb"
57
+ end
58
+
59
+ #############################################################################
60
+ #
61
+ # Packaging tasks
62
+ #
63
+ #############################################################################
64
+
65
+ desc "release a new version of ey_cli, tag the version and push the gem"
66
+ task :release => :build do
67
+ unless `git branch` =~ /^\* master$/
68
+ puts "You must be on the master branch to release!"
69
+ exit!
70
+ end
71
+ sh "git commit --allow-empty -a -m 'Release #{version}'"
72
+ sh "git tag v#{version}"
73
+ sh "git push origin master"
74
+ sh "git push --tags"
75
+ sh "gem push pkg/#{gem_file}"
76
+ end
77
+
78
+ desc "install ey_cli gem in this box"
79
+ task :install => :build do
80
+ sh "gem install pkg/#{gem_file}"
81
+ end
82
+
83
+ desc "build ey_cli gem"
84
+ task :build => 'gemspec' do
85
+ sh "mkdir -p pkg"
86
+ sh "gem build #{gemspec_file}"
87
+ sh "mv #{gem_file} pkg"
88
+ end
89
+
90
+ desc "generate a valid gemspec file"
91
+ task :gemspec => :validate do
92
+ # read spec file and split out manifest section
93
+ spec = File.read(gemspec_file)
94
+ head, manifest, tail = spec.split(" # = MANIFEST =\n")
95
+
96
+ # replace name version and date
97
+ replace_header(head, :name)
98
+ replace_header(head, :version)
99
+ replace_header(head, :date)
100
+ #comment this out if your rubyforge_project has a different name
101
+ replace_header(head, :rubyforge_project)
102
+
103
+ # determine file list from git ls-files
104
+ files = `git ls-files`.
105
+ split("\n").
106
+ sort.
107
+ reject { |file| file =~ /^\./ }.
108
+ reject { |file| file =~ /^(rdoc|pkg|src|racklib)/ }.
109
+ map { |file| " #{file}" }.
110
+ join("\n")
111
+
112
+ # piece file back together and write
113
+ manifest = " s.files = %w[\n#{files}\n ]\n"
114
+ spec = [head, manifest, tail].join(" # = MANIFEST =\n")
115
+ File.open(gemspec_file, 'w') { |io| io.write(spec) }
116
+ puts "Updated #{gemspec_file}"
117
+ end
118
+
119
+ task :validate do
120
+ libfiles = Dir['lib/*'] - ["lib/#{name}.rb", "lib/#{name}"]
121
+ unless libfiles.empty?
122
+ puts "Directory `lib` should only contain a `#{name}.rb` file and `#{name}` dir."
123
+ exit!
124
+ end
125
+ unless Dir['VERSION*'].empty?
126
+ puts "A `VERSION` file at root level violates Gem best practices."
127
+ exit!
128
+ end
129
+ end
data/bin/ey_cli ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'ey_cli'
4
+
5
+ EYCli::CLI.new.run(ARGV)
data/ey_cli.gemspec ADDED
@@ -0,0 +1,117 @@
1
+ ## This is the rakegem gemspec template. Make sure you read and understand
2
+ ## all of the comments. Some sections require modification, and others can
3
+ ## be deleted if you don't need them. Once you understand the contents of
4
+ ## this file, feel free to delete any comments that begin with two hash marks.
5
+ ## You can find comprehensive Gem::Specification documentation, at
6
+ ## http://docs.rubygems.org/read/chapter/20
7
+ Gem::Specification.new do |s|
8
+ s.specification_version = 2 if s.respond_to? :specification_version=
9
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
10
+ s.rubygems_version = '1.3.5'
11
+
12
+ ## Leave these as is they will be modified for you by the rake gemspec task.
13
+ ## If your rubyforge_project name is different, then edit it and comment out
14
+ ## the sub! line in the Rakefile
15
+ s.name = 'ey_cli'
16
+ s.version = '0.1.0'
17
+ s.date = '2011-10-15'
18
+ s.rubyforge_project = 'ey_cli'
19
+
20
+ ## Make sure your summary is short. The description may be as long
21
+ ## as you like.
22
+ s.summary = "More user friendly CLI for Engine Yard cloud"
23
+ s.description = "More user friendly CLI for Engine Yard cloud. Use undocumented APIs"
24
+
25
+ ## List the primary authors. If there are a bunch of authors, it's probably
26
+ ## better to set the email to an email list or something. If you don't have
27
+ ## a custom homepage, consider using your GitHub URL or the like.
28
+ s.authors = ["David Calavera"]
29
+ s.email = 'david.calavera@gmail.com'
30
+ s.homepage = 'http://github.com/calavera/ey_cli'
31
+
32
+ s.executables = ['ey_cli']
33
+
34
+ ## This gets added to the $LOAD_PATH so that 'lib/NAME.rb' can be required as
35
+ ## require 'NAME.rb' or'/lib/NAME/file.rb' can be as require 'NAME/file.rb'
36
+ s.require_paths = %w[lib]
37
+
38
+ ## Specify any RDoc options here. You'll want to add your README and
39
+ ## LICENSE files to the extra_rdoc_files list.
40
+ s.rdoc_options = ["--charset=UTF-8"]
41
+ s.extra_rdoc_files = %w[README.md LICENSE]
42
+
43
+ ## List your runtime dependencies here. Runtime dependencies are those
44
+ ## that are needed for an end user to actually USE your code.
45
+ s.add_dependency('faraday')
46
+ s.add_dependency('faraday_middleware')
47
+ s.add_dependency('faraday-stack')
48
+ s.add_dependency('highline')
49
+ s.add_dependency('hashie')
50
+ s.add_dependency('json')
51
+ s.add_dependency('multi_json')
52
+ s.add_dependency('slop')
53
+
54
+ ## List your development dependencies here. Development dependencies are
55
+ ## those that are only needed during development
56
+ s.add_development_dependency('rake', '~> 0.9')
57
+ s.add_development_dependency('rspec')
58
+ s.add_development_dependency('webmock')
59
+ s.add_development_dependency('fakefs')
60
+
61
+ ## Leave this section as-is. It will be automatically generated from the
62
+ ## contents of your Git repository via the gemspec task. DO NOT REMOVE
63
+ ## THE MANIFEST COMMENTS, they are used as delimiters by the task.
64
+ # = MANIFEST =
65
+ s.files = %w[
66
+ Gemfile
67
+ Gemfile.lock
68
+ LICENSE
69
+ README.md
70
+ Rakefile
71
+ bin/ey_cli
72
+ ey_cli.gemspec
73
+ history.md
74
+ lib/ey_cli.rb
75
+ lib/ey_cli/api.rb
76
+ lib/ey_cli/cli.rb
77
+ lib/ey_cli/command_manager.rb
78
+ lib/ey_cli/commands/accounts.rb
79
+ lib/ey_cli/commands/apps.rb
80
+ lib/ey_cli/commands/base.rb
81
+ lib/ey_cli/commands/console.rb
82
+ lib/ey_cli/commands/create_app.rb
83
+ lib/ey_cli/commands/create_env.rb
84
+ lib/ey_cli/commands/deploy.rb
85
+ lib/ey_cli/commands/help.rb
86
+ lib/ey_cli/commands/show.rb
87
+ lib/ey_cli/controllers/accounts.rb
88
+ lib/ey_cli/controllers/apps.rb
89
+ lib/ey_cli/controllers/environments.rb
90
+ lib/ey_cli/git_utils.rb
91
+ lib/ey_cli/models/account.rb
92
+ lib/ey_cli/models/app.rb
93
+ lib/ey_cli/models/base.rb
94
+ lib/ey_cli/models/environment.rb
95
+ lib/ey_cli/options_parser.rb
96
+ lib/ey_cli/smarty_parser.rb
97
+ lib/ey_cli/term.rb
98
+ spec/auth_helper.rb
99
+ spec/ey_cli/api_spec.rb
100
+ spec/ey_cli/command_manager_spec.rb
101
+ spec/ey_cli/commands/help_spec.rb
102
+ spec/ey_cli/controllers/accounts_spec.rb
103
+ spec/ey_cli/controllers/apps_spec.rb
104
+ spec/ey_cli/controllers/environments_spec.rb
105
+ spec/ey_cli/models/app_spec.rb
106
+ spec/ey_cli/models/base_spec.rb
107
+ spec/ey_cli/models/environment_spec.rb
108
+ spec/ey_cli/options_parser_spec.rb
109
+ spec/ey_cli/smarty_parser_spec.rb
110
+ spec/spec_helper.rb
111
+ ]
112
+ # = MANIFEST =
113
+
114
+ ## Test files will be grabbed from the file list. Make sure the path glob
115
+ ## matches what you actually use.
116
+ s.test_files = s.files.select { |path| path =~ /^spec\/.*_spec\.rb/ }
117
+ end
data/history.md ADDED
@@ -0,0 +1,3 @@
1
+ ## 0.1.0
2
+
3
+ - Initial release.
data/lib/ey_cli/api.rb ADDED
@@ -0,0 +1,96 @@
1
+ module EYCli
2
+ class Api
3
+ require 'yaml'
4
+ require 'faraday_middleware'
5
+ require 'faraday_stack'
6
+
7
+ attr_reader :endpoint
8
+
9
+ def initialize(endpoint = nil)
10
+ @endpoint = endpoint || 'https://cloud.engineyard.com/api/v2/'
11
+ end
12
+
13
+ def read_token(file = nil)
14
+ file ||= ENV['EYRC'] || File.expand_path("~/.eyrc")
15
+ return nil unless File.exists?(file)
16
+
17
+ if data = YAML.load_file(file)
18
+ (data[endpoint] && data[endpoint]['api_token']) || data['api_token']
19
+ end
20
+ end
21
+
22
+ def fetch_token(times = 3)
23
+ EYCli.term.say("I don't know who you are, please log in with your Engine Yard Cloud credentials.")
24
+ begin
25
+ email = EYCli.term.ask("Email: ")
26
+ password = EYCli.term.ask("Password: ", true)
27
+
28
+ response = post("authenticate", nil, { :email => email, :password => password }, {}, false)
29
+ save_token(response.body['api_token'])
30
+ rescue Faraday::Error::ClientError
31
+ EYCli.term.warning "Invalid username or password; please try again."
32
+ if (times -= 1) > 0
33
+ retry
34
+ else
35
+ exit 1
36
+ end
37
+ end
38
+ end
39
+
40
+ def save_token(token, file = nil)
41
+ file ||= ENV['EYRC'] || File.expand_path("~/.eyrc")
42
+
43
+ data = File.exists?(file) ? YAML.load_file(file) : {}
44
+ data[endpoint] = {"api_token" => token}
45
+
46
+ File.open(file, "w"){|f| YAML.dump(data, f) }
47
+ token
48
+ end
49
+
50
+ def get(path, params = {}, headers = {})
51
+ request(path, {:method => :get}.merge(params), headers)
52
+ end
53
+
54
+ def post(path, body, params = {}, headers = {}, auth = true)
55
+ request(path, {:method => :post, :body => body}.merge(params), headers, auth)
56
+ end
57
+
58
+ def put(path, body, params = {}, headers = {})
59
+ request(path, {:method => :put, :body => body}.merge(params), headers)
60
+ end
61
+
62
+ def delete(path, params = {}, headers = {})
63
+ request(path, {:method => :delete}.merge(params), headers)
64
+ end
65
+
66
+ def request(path, params = {}, headers = {}, auth = true)
67
+ http_method = params.delete(:method).to_s.downcase
68
+ http_body = params.delete(:body)
69
+ @auth_token ||= read_token || fetch_token if auth
70
+
71
+ connection.send(http_method) do |req|
72
+ req.path = path
73
+ req.params.merge! params
74
+ req.headers.merge! headers
75
+
76
+ req.headers["X-EY-Cloud-Token"] = @auth_token if auth
77
+ req.body = http_body if http_body
78
+ end
79
+ rescue Faraday::Error::ClientError => e
80
+ raise e unless e.response[:status] == 401
81
+ @auth_token = fetch_token if auth
82
+ params[:method] = http_method
83
+ params[:body] = http_body
84
+ retry
85
+ end
86
+
87
+ def connection
88
+ @connection ||= Faraday::Connection.new(:url => endpoint) do |builder|
89
+ builder.adapter Faraday.default_adapter
90
+ builder.use Faraday::Response::ParseJson
91
+ builder.use FaradayStack::FollowRedirects
92
+ builder.response :raise_error
93
+ end
94
+ end
95
+ end
96
+ end
data/lib/ey_cli/cli.rb ADDED
@@ -0,0 +1,17 @@
1
+ module EYCli
2
+ class CLI
3
+ def run(args)
4
+ name = args.shift.downcase
5
+ command = EYCli.command_manager[name]
6
+ unless command
7
+ EYCli.term.say <<-EOF
8
+
9
+ Command not available: '#{name}'
10
+ Try running `ey_cli help' to get more information about the available commands.
11
+ EOF
12
+ else
13
+ command.run(args)
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,29 @@
1
+ module EYCli
2
+ class CommandManager
3
+ attr_reader :commands
4
+ def initialize
5
+ @commands = {}
6
+ register_command :accounts, :apps, :console, :create_app, :create_env, :deploy, :help, :show
7
+ end
8
+
9
+ def register_command(*names)
10
+ names.each do | name |
11
+ commands[name] = false
12
+ end
13
+ end
14
+
15
+ def [](name)
16
+ command_name = name.to_sym
17
+ return nil unless commands.key?(command_name)
18
+ commands[command_name] = load_command(command_name) unless commands[command_name]
19
+ end
20
+
21
+ def load_command(name)
22
+ const_name = name.to_s.capitalize.gsub(/_(.)/) { $1.upcase }
23
+ if EYCli::Command.const_defined?(const_name)
24
+ EYCli::Command.const_get(const_name).new
25
+ # TODO: else require and retry (PLUGINS)
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,26 @@
1
+ module EYCli
2
+ module Command
3
+ class Accounts < Base
4
+ def initialize
5
+ @accounts = EYCli::Controller::Accounts.new
6
+ end
7
+
8
+ def invoke
9
+ accounts = @accounts.fetch_accounts.map {|a| " - #{a.name}"}.join("\n")
10
+ EYCli.term.say <<-EOF
11
+
12
+ Available accounts:
13
+ #{accounts}
14
+ EOF
15
+
16
+ end
17
+
18
+ def help
19
+ <<-EOF
20
+ Usage: ey_cli accounts
21
+ Note: it shows the accounts that belong to you and also the ones that you are collaborating with.
22
+ EOF
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,24 @@
1
+ module EYCli
2
+ module Command
3
+ class Apps < Base
4
+ def initialize
5
+ @apps = EYCli::Controller::Apps.new
6
+ end
7
+
8
+ def invoke
9
+ apps = @apps.fetch_apps.map {|a| " - #{a.name}"}.join("\n")
10
+ EYCli.term.say <<-EOF
11
+ Available applications:
12
+ #{apps}
13
+ EOF
14
+ end
15
+
16
+ def help
17
+ <<-EOF
18
+ List the applications created under your account and the accounts you are collaborating with.
19
+ Usage: ey_cli apps
20
+ EOF
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,16 @@
1
+ module EYCli
2
+ module Command
3
+ class Base
4
+ attr_reader :options
5
+
6
+ def run(args = [])
7
+ @options = options_parser.parse(args)
8
+ invoke
9
+ end
10
+
11
+ def options_parser
12
+ EYCli::OptionsParser.new # TODO: Override to extend
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,38 @@
1
+ module EYCli
2
+ module Command
3
+ class Console < Base
4
+ include EYCli
5
+ require 'irb'
6
+
7
+ def invoke
8
+ ARGV.clear
9
+ IRB.setup(nil)
10
+ @irb = IRB::Irb.new(nil)
11
+ IRB.conf[:MAIN_CONTEXT] = @irb.context
12
+ IRB.conf[:PROMPT][:EY_CLI] = IRB.conf[:PROMPT][:SIMPLE].dup
13
+ IRB.conf[:PROMPT][:EY_CLI][:RETURN] = "%s\n"
14
+ @irb.context.prompt_mode = :EY_CLI
15
+ @irb.context.workspace = IRB::WorkSpace.new(binding)
16
+ term.say('Welcome to ey_cli interactive!')
17
+
18
+ catch(:IRB_EXIT) { @irb.eval_input }
19
+ end
20
+
21
+ def help
22
+ <<-EOF
23
+
24
+ Usage: ey_cli console
25
+ Note: starts an interactive session.
26
+ EOF
27
+ end
28
+
29
+ def term
30
+ EYCli.term
31
+ end
32
+
33
+ def api
34
+ EYCli.api
35
+ end
36
+ end
37
+ end
38
+ end