shelly 0.0.21.pre → 0.0.21.pre2

Sign up to get free protection for your applications and to get access to all the features.
data/.travis.yml CHANGED
@@ -1,4 +1,5 @@
1
1
  rvm:
2
- - 1.8.7
2
+ - 1.9.3
3
3
  - 1.9.2
4
+ - 1.8.7
4
5
  - ree
data/bin/shelly CHANGED
@@ -1,3 +1,4 @@
1
1
  #!/usr/bin/env ruby
2
- require "shelly/cli/main"
3
- Shelly::CLI::Main.start
2
+ require "shelly/cli/runner"
3
+ runner = Shelly::CLI::Runner.new(ARGV)
4
+ runner.start
data/lib/shelly.rb CHANGED
@@ -1,11 +1,8 @@
1
1
  require "rubygems"
2
- require "thor"
3
2
  require "core_ext/object"
4
3
  require "core_ext/hash"
5
4
  require "shelly/helpers"
6
- require "shelly/base"
7
- require "thor/options"
8
- require "thor/arguments"
5
+ require "shelly/model"
9
6
 
10
7
  module Shelly
11
8
  autoload :App, "shelly/app"
@@ -14,4 +11,3 @@ module Shelly
14
11
  autoload :User, "shelly/user"
15
12
  autoload :VERSION, "shelly/version"
16
13
  end
17
-
data/lib/shelly/app.rb CHANGED
@@ -2,8 +2,9 @@ require 'erb'
2
2
  require 'launchy'
3
3
 
4
4
  module Shelly
5
- class App < Base
5
+ class App < Model
6
6
  DATABASE_KINDS = %w(postgresql mongodb redis none)
7
+
7
8
  attr_accessor :code_name, :databases, :ruby_version, :environment,
8
9
  :git_url, :domains
9
10
 
@@ -0,0 +1,13 @@
1
+ require "shelly"
2
+ require "thor"
3
+ require "thor/group"
4
+ require "thor/options"
5
+ require "thor/arguments"
6
+
7
+ module Shelly
8
+ module CLI
9
+ class Command < Thor
10
+ class_option :debug, :type => :boolean, :desc => "Show debug information"
11
+ end
12
+ end
13
+ end
@@ -1,13 +1,12 @@
1
- require "shelly"
2
- require "thor/group"
1
+ require "shelly/cli/command"
3
2
  require "shelly/cli/user"
4
3
 
5
4
  module Shelly
6
5
  module CLI
7
- class Main < Thor
6
+ class Main < Command
8
7
  include Thor::Actions
9
8
  include Helpers
10
- register(User, "user", "user <command>", "Manages users using this app")
9
+ register(User, "user", "user <command>", "Manages users using this cloud")
11
10
  check_unknown_options!
12
11
 
13
12
  map %w(-v --version) => :version
@@ -50,7 +49,7 @@ module Shelly
50
49
  say "Login successful"
51
50
  say "Uploading your public SSH key"
52
51
  user.upload_ssh_key
53
- say "You have following applications available:", :green
52
+ say "You have following clouds available:", :green
54
53
  user.apps.each do |app|
55
54
  say " #{app["code_name"]}"
56
55
  end
@@ -68,14 +67,14 @@ module Shelly
68
67
  end
69
68
 
70
69
  method_option "code-name", :type => :string, :aliases => "-c",
71
- :desc => "Unique code_name of your application"
70
+ :desc => "Unique code-name of your cloud"
72
71
  method_option :databases, :type => :array, :aliases => "-d",
73
- :banner => "#{Shelly::App::DATABASE_KINDS.join(', ')}",
72
+ :banner => Shelly::App::DATABASE_KINDS.join(', '),
74
73
  :desc => "Array of databases of your choice"
75
74
  method_option :domains, :type => :array,
76
75
  :banner => "CODE-NAME.shellyapp.com, YOUR-DOMAIN.com",
77
76
  :desc => "Array of your domains"
78
- desc "add", "Adds new application to Shelly Cloud"
77
+ desc "add", "Adds new cloud to Shelly Cloud"
79
78
  def add
80
79
  say_error "Must be run inside your project git repository" unless App.inside_git_repository?
81
80
  check_options(options)
@@ -99,9 +98,9 @@ module Shelly
99
98
 
100
99
  rescue Client::APIError => e
101
100
  if e.validation?
102
- e.each_error { |error| say_error "#{error}", :with_exit => false }
101
+ e.each_error { |error| say_error error, :with_exit => false }
103
102
  say_new_line
104
- say_error "Fix erros in the below command and type it again to create your application" , :with_exit => false
103
+ say_error "Fix erros in the below command and type it again to create your cloud" , :with_exit => false
105
104
  say_error "shelly add --code-name=#{@app.code_name} --databases=#{@app.databases.join} --domains=#{@app.code_name}.shellyapp.com"
106
105
  end
107
106
  end
@@ -144,7 +143,7 @@ module Shelly
144
143
 
145
144
  def ask_for_code_name
146
145
  default_code_name = "#{Shelly::App.guess_code_name}-production"
147
- code_name = ask("Application code name (#{default_code_name} - default):")
146
+ code_name = ask("Cloud code name (#{default_code_name} - default):")
148
147
  code_name.blank? ? default_code_name : code_name
149
148
  end
150
149
 
@@ -0,0 +1,26 @@
1
+ require "shelly/cli/main"
2
+
3
+ module Shelly
4
+ module CLI
5
+ class Runner < Thor::Shell::Basic
6
+ include Helpers
7
+ attr_accessor :args
8
+
9
+ def initialize(args)
10
+ super()
11
+ @args = args
12
+ end
13
+
14
+ def debug?
15
+ args.include?("--debug")
16
+ end
17
+
18
+ def start
19
+ Shelly::CLI::Main.start(args)
20
+ rescue => e
21
+ raise e if debug?
22
+ say_error "Unknown error, to see debug information run command with --debug"
23
+ end
24
+ end
25
+ end
26
+ end
@@ -1,10 +1,6 @@
1
- require "yaml"
2
- require "shelly/user"
3
- require "shelly/cloudfile"
4
-
5
1
  module Shelly
6
2
  module CLI
7
- class User < Thor
3
+ class User < Command
8
4
  namespace :user
9
5
  include Helpers
10
6
 
@@ -33,14 +29,21 @@ module Shelly
33
29
  @cloudfile, @user = check_clouds
34
30
  user_email = email || ask_for_email({:guess_email => false})
35
31
  @cloudfile.clouds.each do |cloud|
36
- @user.send_invitation(cloud, user_email)
37
- say "Sending invitation to #{user_email} to work on #{cloud}", :green
32
+ begin
33
+ @user.send_invitation(cloud, user_email)
34
+ rescue Client::APIError => e
35
+ if e.validation? && e.errors.include?(["email", "#{email} has already been taken"])
36
+ say_error "User #{email} is already in the cloud #{cloud}", :with_exit => false
37
+ elsif e.validation?
38
+ e.each_error { |error| say_error error, :with_exit => false }
39
+ exit 1
40
+ end
41
+ else
42
+ say "Sending invitation to #{user_email} to work on #{cloud}", :green
43
+ end
38
44
  end
39
45
  rescue Client::APIError => e
40
- if e.validation?
41
- e.each_error { |error| say_error error =~ /already in the project/ ? error.gsub("Email", "User") : error, :with_exit => false }
42
- exit 1
43
- elsif e.unauthorized?
46
+ if e.unauthorized?
44
47
  e.errors.each { |error| say_error error, :with_exit => false}
45
48
  exit 1
46
49
  end
@@ -52,7 +55,9 @@ module Shelly
52
55
  @user = Shelly::User.new
53
56
  user_apps = @user.apps.map { |cloud| cloud['code_name'] }
54
57
  unless @cloudfile.clouds.all? { |cloud| user_apps.include?(cloud) }
55
- errors = (@cloudfile.clouds - user_apps).map { |cloud| "You have no access to '#{cloud}' cloud defined in Cloudfile" }
58
+ errors = (@cloudfile.clouds - user_apps).map do |cloud|
59
+ "You have no access to '#{cloud}' cloud defined in Cloudfile"
60
+ end
56
61
  raise Shelly::Client::APIError.new({:message => "Unauthorized",
57
62
  :errors => errors}.to_json)
58
63
  end
@@ -1,5 +1,5 @@
1
1
  module Shelly
2
- class Cloudfile < Base
2
+ class Cloudfile < Model
3
3
  attr_accessor :content
4
4
 
5
5
  def self.present?
@@ -39,7 +39,7 @@ module Shelly
39
39
  response = shelly.apps_users(clouds)
40
40
  response.inject({}) do |result, app|
41
41
  result[app['code_name']] = app['users'].map do |user|
42
- "#{user['email']} (#{user['name']})"
42
+ user['name'] ? "#{user['email']} (#{user['name']})" : user['email']
43
43
  end
44
44
  result
45
45
  end
@@ -11,6 +11,7 @@ module Shelly
11
11
  say "\n"
12
12
  end
13
13
 
14
+ # FIXME: errors should be printed on STDERR
14
15
  def say_error(message, options = {})
15
16
  options = {:with_exit => true}.merge(options)
16
17
  say message, :red
@@ -1,5 +1,5 @@
1
1
  module Shelly
2
- class Base
2
+ class Model
3
3
  def current_user
4
4
  @user = User.new
5
5
  @user.load_credentials
data/lib/shelly/user.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module Shelly
2
- class User < Base
2
+ class User < Model
3
3
  attr_accessor :email, :password
4
4
 
5
5
  def initialize(email = nil, password = nil)
@@ -1,3 +1,3 @@
1
1
  module Shelly
2
- VERSION = "0.0.21.pre"
2
+ VERSION = "0.0.21.pre2"
3
3
  end
data/shelly.gemspec CHANGED
@@ -22,7 +22,7 @@ Gem::Specification.new do |s|
22
22
  end
23
23
  s.add_development_dependency "fakefs"
24
24
  s.add_development_dependency "fakeweb"
25
- s.add_runtime_dependency "thor"
25
+ s.add_runtime_dependency "wijet-thor", "~> 0.14.7"
26
26
  s.add_runtime_dependency "rest-client"
27
27
  s.add_runtime_dependency "json"
28
28
  s.add_runtime_dependency "wijet-launchy"
@@ -23,12 +23,15 @@ describe Shelly::CLI::Main do
23
23
  it "should display available commands" do
24
24
  expected = <<-OUT
25
25
  Tasks:
26
- shelly add # Adds new application to Shelly Cloud
26
+ shelly add # Adds new cloud to Shelly Cloud
27
27
  shelly help [TASK] # Describe available tasks or one specific task
28
28
  shelly login [EMAIL] # Logs user in to Shelly Cloud
29
29
  shelly register [EMAIL] # Registers new user account on Shelly Cloud
30
- shelly user <command> # Manages users using this app
30
+ shelly user <command> # Manages users using this cloud
31
31
  shelly version # Displays shelly version
32
+
33
+ Options:
34
+ [--debug] # Show debug information
32
35
  OUT
33
36
  out = IO.popen("bin/shelly").read.strip
34
37
  out.should == expected.strip
@@ -189,7 +192,7 @@ OUT
189
192
  end
190
193
 
191
194
  it "should display list of applications to which user has access" do
192
- $stdout.should_receive(:puts).with("\e[32mYou have following applications available:\e[0m")
195
+ $stdout.should_receive(:puts).with("\e[32mYou have following clouds available:\e[0m")
193
196
  $stdout.should_receive(:puts).with(" abc")
194
197
  $stdout.should_receive(:puts).with(" fooo")
195
198
  fake_stdin(["megan@example.com", "secret"]) do
@@ -277,7 +280,7 @@ OUT
277
280
  end
278
281
 
279
282
  it "should use code name provided by user" do
280
- $stdout.should_receive(:print).with("Application code name (foo-production - default): ")
283
+ $stdout.should_receive(:print).with("Cloud code name (foo-production - default): ")
281
284
  @app.should_receive(:code_name=).with("mycodename")
282
285
  fake_stdin(["mycodename", ""]) do
283
286
  @main.add
@@ -286,7 +289,7 @@ OUT
286
289
 
287
290
  context "when user provided empty code name" do
288
291
  it "should use 'current_dirname-purpose' as default" do
289
- $stdout.should_receive(:print).with("Application code name (foo-production - default): ")
292
+ $stdout.should_receive(:print).with("Cloud code name (foo-production - default): ")
290
293
  @app.should_receive(:code_name=).with("foo-production")
291
294
  fake_stdin(["", ""]) do
292
295
  @main.add
@@ -331,7 +334,7 @@ OUT
331
334
  exception = Shelly::Client::APIError.new(response.to_json)
332
335
  @app.should_receive(:create).and_raise(exception)
333
336
  $stdout.should_receive(:puts).with("\e[31mCode name has been already taken\e[0m")
334
- $stdout.should_receive(:puts).with("\e[31mFix erros in the below command and type it again to create your application\e[0m")
337
+ $stdout.should_receive(:puts).with("\e[31mFix erros in the below command and type it again to create your cloud\e[0m")
335
338
  $stdout.should_receive(:puts).with("\e[31mshelly add --code-name=foo-production --databases=postgresql --domains=foo-production.shellyapp.com\e[0m")
336
339
  lambda {
337
340
  fake_stdin(["", ""]) do
@@ -0,0 +1,57 @@
1
+ require "spec_helper"
2
+ require "shelly/cli/runner"
3
+
4
+ describe Shelly::CLI::Runner do
5
+ before do
6
+ @runner = Shelly::CLI::Runner.new(%w(version --debug))
7
+ end
8
+
9
+ describe "#initialize" do
10
+ it "should initialize parent class" do
11
+ @runner.should be_kind_of(Thor::Shell::Basic)
12
+ @runner.should respond_to(:say) # if responds to parent class method
13
+ end
14
+
15
+ it "should assign args" do
16
+ @runner.args.should == %w(version --debug)
17
+ end
18
+ end
19
+
20
+ describe "#debug?" do
21
+ it "should be true if args include --debug option" do
22
+ @runner.should be_debug
23
+ end
24
+
25
+ it "should be failse if args doesn't include --debug option" do
26
+ runner = Shelly::CLI::Runner.new(%w(version))
27
+ runner.should_not be_debug
28
+ end
29
+ end
30
+
31
+ describe "#start" do
32
+ it "should start main CLI with given args" do
33
+ Shelly::CLI::Main.should_receive(:start).with(%w(version --debug))
34
+ @runner.start
35
+ end
36
+
37
+ context "with --debug option (debug mode)" do
38
+ it "should re-raise caught exception to the console" do
39
+ Shelly::CLI::Main.stub(:start).and_raise(RuntimeError.new)
40
+ lambda {
41
+ @runner.start
42
+ }.should raise_error(RuntimeError)
43
+ end
44
+ end
45
+
46
+ context "without --debug option (normal mode)" do
47
+ it "should rescue exception and display generic error message" do
48
+ Shelly::CLI::Main.stub(:start).and_raise(RuntimeError.new)
49
+ runner = Shelly::CLI::Runner.new(%w(version))
50
+ $stdout.should_receive(:puts).with("Unknown error, to see debug information run command with --debug")
51
+ lambda {
52
+ runner.start
53
+ }.should raise_error(SystemExit)
54
+ end
55
+ end
56
+ end
57
+ end
@@ -16,7 +16,7 @@ describe Shelly::CLI::User do
16
16
  it "should show help" do
17
17
  $stdout.should_receive(:puts).with("Tasks:")
18
18
  $stdout.should_receive(:puts).with(/add \[EMAIL\]\s+# Add new developer to clouds defined in Cloudfile/)
19
- $stdout.should_receive(:puts).with(/list\s+# List users with access to clouds defined in Cloudfile/)
19
+ $stdout.should_receive(:puts).with(/list\s+# List users with access to clouds defined in Cloudfile/)
20
20
  @cli_user.help
21
21
  end
22
22
  end
@@ -56,7 +56,7 @@ describe Shelly::CLI::User do
56
56
  @client.should_receive(:apps).and_return([{"code_name" => "foo-production"}, {"code_name" => "foo-staging"}])
57
57
  @client.stub(:apps_users).and_return(response)
58
58
  $stdout.should_receive(:puts).with("Cloud foo-production:")
59
- $stdout.should_receive(:puts).with(" user@example.com (username)")
59
+ $stdout.should_receive(:puts).with(" user@example.com")
60
60
  $stdout.should_receive(:puts).with("Cloud foo-staging:")
61
61
  $stdout.should_receive(:puts).with(" user2@example.com (username2)")
62
62
  @cli_user.list
@@ -64,7 +64,7 @@ describe Shelly::CLI::User do
64
64
  end
65
65
 
66
66
  def response
67
- [{'code_name' => 'foo-production', 'users' => [{'name' => 'username','email' => 'user@example.com'}]},
67
+ [{'code_name' => 'foo-production', 'users' => [{'email' => 'user@example.com'}]},
68
68
  {'code_name' => 'foo-staging', 'users' => [{'name' => 'username2','email' => 'user2@example.com'}]}]
69
69
  end
70
70
 
@@ -1,6 +1,6 @@
1
1
  require "spec_helper"
2
2
 
3
- describe Shelly::Base do
3
+ describe Shelly::Model do
4
4
  before do
5
5
  config_dir = File.expand_path("~/.shelly")
6
6
  FileUtils.mkdir_p(config_dir)
@@ -9,7 +9,7 @@ describe Shelly::Base do
9
9
  describe "#current_user" do
10
10
  it "should return user with loaded credentials" do
11
11
  File.open(File.join("~/.shelly/credentials"), "w") { |f| f << "superman@example.com\nthe-kal-el" }
12
- base = Shelly::Base.new
12
+ base = Shelly::Model.new
13
13
  user = base.current_user
14
14
  user.email.should == "superman@example.com"
15
15
  user.password.should == "the-kal-el"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: shelly
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.21.pre
4
+ version: 0.0.21.pre2
5
5
  prerelease: 7
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-11-16 00:00:00.000000000Z
12
+ date: 2011-11-21 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
16
- requirement: &2152869040 !ruby/object:Gem::Requirement
16
+ requirement: &2156497740 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *2152869040
24
+ version_requirements: *2156497740
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rake
27
- requirement: &2152868540 !ruby/object:Gem::Requirement
27
+ requirement: &2156497220 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *2152868540
35
+ version_requirements: *2156497220
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: guard
38
- requirement: &2152868020 !ruby/object:Gem::Requirement
38
+ requirement: &2156496760 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *2152868020
46
+ version_requirements: *2156496760
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: guard-rspec
49
- requirement: &2152861100 !ruby/object:Gem::Requirement
49
+ requirement: &2156496320 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '0'
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *2152861100
57
+ version_requirements: *2156496320
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: growl_notify
60
- requirement: &2152860640 !ruby/object:Gem::Requirement
60
+ requirement: &2156495760 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: '0'
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *2152860640
68
+ version_requirements: *2156495760
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rb-fsevent
71
- requirement: &2152860220 !ruby/object:Gem::Requirement
71
+ requirement: &2156495020 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: '0'
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *2152860220
79
+ version_requirements: *2156495020
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: fakefs
82
- requirement: &2152859800 !ruby/object:Gem::Requirement
82
+ requirement: &2156494560 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ! '>='
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: '0'
88
88
  type: :development
89
89
  prerelease: false
90
- version_requirements: *2152859800
90
+ version_requirements: *2156494560
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: fakeweb
93
- requirement: &2152859380 !ruby/object:Gem::Requirement
93
+ requirement: &2156493960 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ! '>='
@@ -98,21 +98,21 @@ dependencies:
98
98
  version: '0'
99
99
  type: :development
100
100
  prerelease: false
101
- version_requirements: *2152859380
101
+ version_requirements: *2156493960
102
102
  - !ruby/object:Gem::Dependency
103
- name: thor
104
- requirement: &2152858960 !ruby/object:Gem::Requirement
103
+ name: wijet-thor
104
+ requirement: &2156493440 !ruby/object:Gem::Requirement
105
105
  none: false
106
106
  requirements:
107
- - - ! '>='
107
+ - - ~>
108
108
  - !ruby/object:Gem::Version
109
- version: '0'
109
+ version: 0.14.7
110
110
  type: :runtime
111
111
  prerelease: false
112
- version_requirements: *2152858960
112
+ version_requirements: *2156493440
113
113
  - !ruby/object:Gem::Dependency
114
114
  name: rest-client
115
- requirement: &2152858540 !ruby/object:Gem::Requirement
115
+ requirement: &2156493000 !ruby/object:Gem::Requirement
116
116
  none: false
117
117
  requirements:
118
118
  - - ! '>='
@@ -120,10 +120,10 @@ dependencies:
120
120
  version: '0'
121
121
  type: :runtime
122
122
  prerelease: false
123
- version_requirements: *2152858540
123
+ version_requirements: *2156493000
124
124
  - !ruby/object:Gem::Dependency
125
125
  name: json
126
- requirement: &2152858120 !ruby/object:Gem::Requirement
126
+ requirement: &2156492380 !ruby/object:Gem::Requirement
127
127
  none: false
128
128
  requirements:
129
129
  - - ! '>='
@@ -131,10 +131,10 @@ dependencies:
131
131
  version: '0'
132
132
  type: :runtime
133
133
  prerelease: false
134
- version_requirements: *2152858120
134
+ version_requirements: *2156492380
135
135
  - !ruby/object:Gem::Dependency
136
136
  name: wijet-launchy
137
- requirement: &2152857640 !ruby/object:Gem::Requirement
137
+ requirement: &2156491660 !ruby/object:Gem::Requirement
138
138
  none: false
139
139
  requirements:
140
140
  - - ! '>='
@@ -142,7 +142,7 @@ dependencies:
142
142
  version: '0'
143
143
  type: :runtime
144
144
  prerelease: false
145
- version_requirements: *2152857640
145
+ version_requirements: *2156491660
146
146
  description: Tool for managing applications and clouds at shellycloud.com
147
147
  email:
148
148
  - support@shellycloud.com
@@ -162,12 +162,14 @@ files:
162
162
  - lib/core_ext/object.rb
163
163
  - lib/shelly.rb
164
164
  - lib/shelly/app.rb
165
- - lib/shelly/base.rb
165
+ - lib/shelly/cli/command.rb
166
166
  - lib/shelly/cli/main.rb
167
+ - lib/shelly/cli/runner.rb
167
168
  - lib/shelly/cli/user.rb
168
169
  - lib/shelly/client.rb
169
170
  - lib/shelly/cloudfile.rb
170
171
  - lib/shelly/helpers.rb
172
+ - lib/shelly/model.rb
171
173
  - lib/shelly/templates/Cloudfile.erb
172
174
  - lib/shelly/user.rb
173
175
  - lib/shelly/version.rb
@@ -177,11 +179,12 @@ files:
177
179
  - spec/helpers.rb
178
180
  - spec/input_faker.rb
179
181
  - spec/shelly/app_spec.rb
180
- - spec/shelly/base_spec.rb
181
182
  - spec/shelly/cli/main_spec.rb
183
+ - spec/shelly/cli/runner_spec.rb
182
184
  - spec/shelly/cli/user_spec.rb
183
185
  - spec/shelly/client_spec.rb
184
186
  - spec/shelly/cloudfile_spec.rb
187
+ - spec/shelly/model_spec.rb
185
188
  - spec/shelly/user_spec.rb
186
189
  - spec/spec_helper.rb
187
190
  - spec/thor/options_spec.rb
@@ -213,11 +216,12 @@ test_files:
213
216
  - spec/helpers.rb
214
217
  - spec/input_faker.rb
215
218
  - spec/shelly/app_spec.rb
216
- - spec/shelly/base_spec.rb
217
219
  - spec/shelly/cli/main_spec.rb
220
+ - spec/shelly/cli/runner_spec.rb
218
221
  - spec/shelly/cli/user_spec.rb
219
222
  - spec/shelly/client_spec.rb
220
223
  - spec/shelly/cloudfile_spec.rb
224
+ - spec/shelly/model_spec.rb
221
225
  - spec/shelly/user_spec.rb
222
226
  - spec/spec_helper.rb
223
227
  - spec/thor/options_spec.rb