shelly 0.3.8 → 0.4.0.pre
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.
- checksums.yaml +15 -0
- data/CHANGELOG.md +5 -0
- data/lib/shelly/app.rb +4 -9
- data/lib/shelly/cli/main.rb +5 -218
- data/lib/shelly/cli/main/add.rb +116 -0
- data/lib/shelly/cli/main/check.rb +127 -0
- data/lib/shelly/cli/organization.rb +11 -1
- data/lib/shelly/client/organizations.rb +4 -0
- data/lib/shelly/helpers.rb +21 -0
- data/lib/shelly/organization.rb +6 -1
- data/lib/shelly/version.rb +1 -1
- data/spec/input_faker.rb +1 -1
- data/spec/shelly/app_spec.rb +1 -10
- data/spec/shelly/cli/main_spec.rb +27 -18
- data/spec/shelly/cli/organization_spec.rb +48 -4
- data/spec/shelly/client_spec.rb +8 -6
- data/spec/shelly/organization_spec.rb +10 -0
- metadata +61 -42
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
MGM5NmViNjFlMWRiMzQ2OWRhMmRmNjdmZjA2OTc3YmI0M2JmYWUxNg==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
N2RlN2M5NzMyMjNmNjcyMjdhMzFlMThiOGQzZWE5NDBlMjBmNzUzZg==
|
7
|
+
!binary "U0hBNTEy":
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
OGM5NGFjMTY5MWYyZWI1MmU4MmQ0NWU3Nzc0ZWJhNDEwMzViZWFiMzBlZjhl
|
10
|
+
NGRlMmRmZTc1NjZkMTM1ZTM4MmU1ZTcwMDFlYTQ3M2VlNWUyOWEzN2UwNWE0
|
11
|
+
NjdjYzRmYTczYjFkNzZlYTNmMDE2ZmQ0YjkzOTM3ZWVhZDFmN2I=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
ZGQxNThkYTZjMTgxNGFkYzAzNGJhNGNlY2RkZDM0NWNkMTljOWM0N2UwYWYy
|
14
|
+
M2YxNTlmNmM2ZTkwMGM3OTA0OTZhZTdmZjk0NjZjNWJmNGVlMjZhM2IzODJj
|
15
|
+
YWM0ZmEyY2E2ZjY5N2U2ZmM2ZWQ3NmY4MGY0MTRmZjc5Y2NmYzg=
|
data/CHANGELOG.md
CHANGED
data/lib/shelly/app.rb
CHANGED
@@ -9,8 +9,8 @@ module Shelly
|
|
9
9
|
SERVER_SIZES = %w(small large)
|
10
10
|
|
11
11
|
attr_accessor :code_name, :databases, :ruby_version, :environment,
|
12
|
-
:git_url, :domains, :web_server_ip, :size, :thin, :
|
13
|
-
:
|
12
|
+
:git_url, :domains, :web_server_ip, :size, :thin, :content,
|
13
|
+
:organization_name, :zone_name
|
14
14
|
|
15
15
|
def initialize(code_name = nil, content = nil)
|
16
16
|
self.code_name = code_name
|
@@ -62,8 +62,7 @@ module Shelly
|
|
62
62
|
|
63
63
|
def create
|
64
64
|
attributes = {:code_name => code_name,
|
65
|
-
:
|
66
|
-
:organization_name => organization,
|
65
|
+
:organization_name => organization_name,
|
67
66
|
:zone_name => zone_name}
|
68
67
|
response = shelly.create_app(attributes)
|
69
68
|
assign_attributes(response)
|
@@ -164,10 +163,6 @@ module Shelly
|
|
164
163
|
shelly.deployment(code_name, deployment_id)
|
165
164
|
end
|
166
165
|
|
167
|
-
def self.code_name_from_dir_name
|
168
|
-
"#{File.basename(Dir.pwd)}".downcase.dasherize
|
169
|
-
end
|
170
|
-
|
171
166
|
def configs
|
172
167
|
@configs ||= shelly.app_configs(code_name)
|
173
168
|
end
|
@@ -253,7 +248,7 @@ module Shelly
|
|
253
248
|
end
|
254
249
|
|
255
250
|
def edit_billing_url
|
256
|
-
"#{shelly.shellyapp_url}/organizations/#{
|
251
|
+
"#{shelly.shellyapp_url}/organizations/#{organization_name || attributes['organization']['name']}/edit"
|
257
252
|
end
|
258
253
|
|
259
254
|
def open
|
data/lib/shelly/cli/main.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
require "shelly/cli/command"
|
3
2
|
require "shelly/cli/user"
|
4
3
|
require "shelly/cli/backup"
|
@@ -9,6 +8,9 @@ require "shelly/cli/file"
|
|
9
8
|
require "shelly/cli/organization"
|
10
9
|
require "shelly/cli/logs"
|
11
10
|
|
11
|
+
require "shelly/cli/main/add"
|
12
|
+
require "shelly/cli/main/check"
|
13
|
+
|
12
14
|
module Shelly
|
13
15
|
module CLI
|
14
16
|
class Main < Command
|
@@ -80,73 +82,6 @@ module Shelly
|
|
80
82
|
say_error "Use ssh-keygen to generate ssh key pair"
|
81
83
|
end
|
82
84
|
|
83
|
-
method_option "code-name", :type => :string, :aliases => "-c",
|
84
|
-
:desc => "Unique code-name of your cloud"
|
85
|
-
method_option :databases, :type => :array, :aliases => "-d",
|
86
|
-
:banner => Shelly::App::DATABASE_CHOICES.join(', '),
|
87
|
-
:desc => "List of databases of your choice"
|
88
|
-
method_option :size, :type => :string, :aliases => "-s",
|
89
|
-
:desc => "Server size [large, small]"
|
90
|
-
method_option "redeem-code", :type => :string, :aliases => "-r",
|
91
|
-
:desc => "Redeem code for free credits"
|
92
|
-
method_option "organization", :type => :string, :aliases => "-o",
|
93
|
-
:desc => "Add cloud to existing organization"
|
94
|
-
method_option "skip-requirements-check", :type => :boolean,
|
95
|
-
:desc => "Skip Shelly Cloud requirements check"
|
96
|
-
method_option "default-organization", :type => :boolean,
|
97
|
-
:desc => "Create cloud with default organization"
|
98
|
-
method_option "zone", :type => :string, :hide => true,
|
99
|
-
:desc => "Create cloud in given zone"
|
100
|
-
desc "add", "Add a new cloud"
|
101
|
-
def add
|
102
|
-
check_options(options)
|
103
|
-
unless options["skip-requirements-check"]
|
104
|
-
return unless check(verbose = false)
|
105
|
-
end
|
106
|
-
app = Shelly::App.new
|
107
|
-
app.code_name = options["code-name"] || ask_for_code_name
|
108
|
-
app.databases = options["databases"] || ask_for_databases
|
109
|
-
app.size = options["size"] || "large"
|
110
|
-
app.redeem_code = options["redeem-code"]
|
111
|
-
unless options["default-organization"]
|
112
|
-
app.organization = options["organization"] || ask_for_organization(app.code_name)
|
113
|
-
end
|
114
|
-
app.zone_name = options["zone"]
|
115
|
-
app.create
|
116
|
-
|
117
|
-
git_remote = add_remote(app)
|
118
|
-
|
119
|
-
say "Creating Cloudfile", :green
|
120
|
-
app.create_cloudfile
|
121
|
-
|
122
|
-
if app.credit > 0 || !app.organization_details_present?
|
123
|
-
say_new_line
|
124
|
-
say "Billing information", :green
|
125
|
-
if app.credit > 0
|
126
|
-
say "#{app.credit.to_i} Euro credit remaining."
|
127
|
-
end
|
128
|
-
if !app.organization_details_present?
|
129
|
-
say "Remember to provide billing details before trial ends."
|
130
|
-
say app.edit_billing_url
|
131
|
-
end
|
132
|
-
end
|
133
|
-
|
134
|
-
info_adding_cloudfile_to_repository
|
135
|
-
info_deploying_to_shellycloud(git_remote)
|
136
|
-
|
137
|
-
rescue Client::ValidationException => e
|
138
|
-
e.each_error { |error| say_error error, :with_exit => false }
|
139
|
-
say_new_line
|
140
|
-
say_error "Fix erros in the below command and type it again to create your cloud" , :with_exit => false
|
141
|
-
say_error "shelly add --code-name=#{app.code_name.downcase.dasherize} --databases=#{app.databases.join(',')} --size=#{app.size}"
|
142
|
-
rescue Client::ForbiddenException
|
143
|
-
say_error "You have to be the owner of '#{options[:organization]}' organization to add clouds"
|
144
|
-
rescue Client::NotFoundException => e
|
145
|
-
raise unless e.resource == :organization
|
146
|
-
say_error "Organization '#{app.organization}' not found", :with_exit => false
|
147
|
-
say_error "You can list organizations you have access to with `shelly organization list`"
|
148
|
-
end
|
149
|
-
|
150
85
|
map "status" => :list
|
151
86
|
desc "list", "List available clouds"
|
152
87
|
def list
|
@@ -410,126 +345,6 @@ Wait until cloud is in 'turned off' state and try again.}
|
|
410
345
|
say_error "Virtual Server '#{options[:server]}' not found"
|
411
346
|
end
|
412
347
|
|
413
|
-
desc "check", "Check if application fulfills Shelly Cloud requirements"
|
414
|
-
# Public: Check if application fulfills shelly's requirements
|
415
|
-
# and print them
|
416
|
-
# verbose - when true all requirements will be printed out
|
417
|
-
# together with header and a summary at the end
|
418
|
-
# when false only not fulfilled requirements will be
|
419
|
-
# printed
|
420
|
-
# When any requirements is not fulfilled header and summary will
|
421
|
-
# be displayed regardless of verbose value
|
422
|
-
def check(verbose = true)
|
423
|
-
structure = Shelly::StructureValidator.new
|
424
|
-
|
425
|
-
if verbose or structure.invalid? or structure.warnings?
|
426
|
-
say "Checking Shelly Cloud requirements\n\n"
|
427
|
-
end
|
428
|
-
|
429
|
-
print_check(structure.gemfile?, "Gemfile is present",
|
430
|
-
"Gemfile is missing in git repository",
|
431
|
-
:show_fulfilled => verbose)
|
432
|
-
|
433
|
-
print_check(structure.gemfile_lock?, "Gemfile.lock is present",
|
434
|
-
"Gemfile.lock is missing in git repository",
|
435
|
-
:show_fulfilled => verbose)
|
436
|
-
|
437
|
-
print_check(structure.config_ru?, "config.ru is present",
|
438
|
-
"config.ru is missing",
|
439
|
-
:show_fulfilled => verbose)
|
440
|
-
|
441
|
-
print_check(structure.rakefile?, "Rakefile is present",
|
442
|
-
"Rakefile is missing",
|
443
|
-
:show_fulfilled => verbose)
|
444
|
-
|
445
|
-
print_check(!structure.gem?("shelly"),
|
446
|
-
"Gem 'shelly' is not a part of Gemfile",
|
447
|
-
"Gem 'shelly' should not be a part of Gemfile.\n The versions of the thor gem used by shelly and Rails may be incompatible.",
|
448
|
-
:show_fulfilled => verbose || structure.warnings?,
|
449
|
-
:failure_level => :warning)
|
450
|
-
|
451
|
-
print_check(structure.gem?("shelly-dependencies"),
|
452
|
-
"Gem 'shelly-dependencies' is present",
|
453
|
-
"Gem 'shelly-dependencies' is missing, we recommend to install it\n See more at https://shellycloud.com/documentation/requirements#shelly-dependencies",
|
454
|
-
:show_fulfilled => verbose || structure.warnings?, :failure_level => :warning)
|
455
|
-
|
456
|
-
print_check(structure.gem?("thin") || structure.gem?("puma"),
|
457
|
-
"Web server gem is present",
|
458
|
-
"Missing web server gem in Gemfile. Currently supported: 'thin' and 'puma'",
|
459
|
-
:show_fulfilled => verbose, :failure_level => :warning)
|
460
|
-
|
461
|
-
print_check(structure.gem?("rake"), "Gem 'rake' is present",
|
462
|
-
"Gem 'rake' is missing in the Gemfile", :show_fulfilled => verbose)
|
463
|
-
|
464
|
-
print_check(structure.task?("db:migrate"), "Task 'db:migrate' is present",
|
465
|
-
"Task 'db:migrate' is missing", :show_fulfilled => verbose)
|
466
|
-
|
467
|
-
print_check(structure.task?("db:setup"), "Task 'db:setup' is present",
|
468
|
-
"Task 'db:setup' is missing", :show_fulfilled => verbose)
|
469
|
-
|
470
|
-
cloudfile = Cloudfile.new
|
471
|
-
if cloudfile.present?
|
472
|
-
cloudfile.clouds.each do |app|
|
473
|
-
if app.cloud_databases.include?('postgresql')
|
474
|
-
print_check(structure.gem?("pg") || structure.gem?("postgres"),
|
475
|
-
"Postgresql driver is present for '#{app}' cloud",
|
476
|
-
"Postgresql driver is missing in the Gemfile for '#{app}' cloud,\n we recommend adding 'pg' gem to Gemfile",
|
477
|
-
:show_fulfilled => verbose)
|
478
|
-
end
|
479
|
-
|
480
|
-
if app.delayed_job?
|
481
|
-
print_check(structure.gem?("delayed_job"),
|
482
|
-
"Gem 'delayed_job' is present for '#{app}' cloud",
|
483
|
-
"Gem 'delayed_job' is missing in the Gemfile for '#{app}' cloud",
|
484
|
-
:show_fulfilled => verbose)
|
485
|
-
end
|
486
|
-
|
487
|
-
if app.whenever?
|
488
|
-
print_check(structure.gem?("whenever"),
|
489
|
-
"Gem 'whenever' is present for '#{app}' cloud",
|
490
|
-
"Gem 'whenever' is missing in the Gemfile for '#{app}' cloud",
|
491
|
-
:show_fulfilled => verbose)
|
492
|
-
end
|
493
|
-
|
494
|
-
if app.sidekiq?
|
495
|
-
print_check(structure.gem?("sidekiq"),
|
496
|
-
"Gem 'sidekiq' is present for '#{app}' cloud",
|
497
|
-
"Gem 'sidekiq' is missing in the Gemfile for '#{app}' cloud",
|
498
|
-
:show_fulfilled => verbose)
|
499
|
-
end
|
500
|
-
|
501
|
-
if app.thin?
|
502
|
-
print_check(structure.gem?("thin"),
|
503
|
-
"Web server gem 'thin' is present",
|
504
|
-
"Gem 'thin' is missing in the Gemfile for '#{app}' cloud",
|
505
|
-
:show_fulfilled => verbose)
|
506
|
-
end
|
507
|
-
|
508
|
-
if app.puma?
|
509
|
-
print_check(structure.gem?("puma"),
|
510
|
-
"Web server gem 'puma' is present",
|
511
|
-
"Gem 'puma' is missing in the Gemfile for '#{app}' cloud",
|
512
|
-
:show_fulfilled => verbose)
|
513
|
-
end
|
514
|
-
end
|
515
|
-
end
|
516
|
-
|
517
|
-
if structure.valid?
|
518
|
-
if verbose
|
519
|
-
say "\nGreat! Your application is ready to run on Shelly Cloud"
|
520
|
-
end
|
521
|
-
else
|
522
|
-
say "\nFix points marked with #{red("✗")} to run your application on the Shelly Cloud"
|
523
|
-
say "See more about requirements on https://shellycloud.com/documentation/requirements"
|
524
|
-
end
|
525
|
-
|
526
|
-
structure.valid?
|
527
|
-
rescue Bundler::BundlerError => e
|
528
|
-
say_new_line
|
529
|
-
say_error e.message, :with_exit => false
|
530
|
-
say_error "Try to run `bundle install`"
|
531
|
-
end
|
532
|
-
|
533
348
|
# FIXME: move to helpers
|
534
349
|
no_tasks do
|
535
350
|
# Returns valid arguments for rake, removes shelly gem arguments
|
@@ -614,8 +429,8 @@ Wait until cloud is in 'turned off' state and try again.}
|
|
614
429
|
end
|
615
430
|
|
616
431
|
def ask_for_code_name
|
617
|
-
default_code_name =
|
618
|
-
code_name = ask("Cloud code name (#{
|
432
|
+
default_code_name = default_name_from_dir_name
|
433
|
+
code_name = ask("Cloud code name (#{default_name_from_dir_name} - default):")
|
619
434
|
code_name.blank? ? default_code_name : code_name
|
620
435
|
end
|
621
436
|
|
@@ -632,34 +447,6 @@ Wait until cloud is in 'turned off' state and try again.}
|
|
632
447
|
databases.empty? ? ["postgresql"] : databases
|
633
448
|
end
|
634
449
|
|
635
|
-
def ask_for_organization(default_name)
|
636
|
-
organizations = Shelly::User.new.organizations
|
637
|
-
unless organizations.blank?
|
638
|
-
count = organizations.count
|
639
|
-
option_selected = 0
|
640
|
-
loop do
|
641
|
-
say "Select organization for this cloud:"
|
642
|
-
say_new_line
|
643
|
-
say "existing organizations:"
|
644
|
-
|
645
|
-
organizations.each_with_index do |organization, i|
|
646
|
-
print_wrapped "#{i + 1}) #{organization.name}", :ident => 2
|
647
|
-
end
|
648
|
-
say_new_line
|
649
|
-
say "new organization (default as code name):"
|
650
|
-
|
651
|
-
print_wrapped "#{count + 1}) #{default_name}", :ident => 2
|
652
|
-
|
653
|
-
option_selected = ask("Option:")
|
654
|
-
break if ('1'..(count + 1).to_s).include?(option_selected)
|
655
|
-
end
|
656
|
-
|
657
|
-
if (1..count).include?(option_selected.to_i)
|
658
|
-
return organizations[option_selected.to_i - 1].name
|
659
|
-
end
|
660
|
-
end
|
661
|
-
end
|
662
|
-
|
663
450
|
def info_adding_cloudfile_to_repository
|
664
451
|
say_new_line
|
665
452
|
say "Project is now configured for use with Shelly Cloud:", :green
|
@@ -0,0 +1,116 @@
|
|
1
|
+
module Shelly
|
2
|
+
module CLI
|
3
|
+
class Main < Command
|
4
|
+
|
5
|
+
method_option "code-name", :type => :string, :aliases => "-c",
|
6
|
+
:desc => "Unique code-name of your cloud"
|
7
|
+
method_option :databases, :type => :array, :aliases => "-d",
|
8
|
+
:banner => Shelly::App::DATABASE_CHOICES.join(', '),
|
9
|
+
:desc => "List of databases of your choice"
|
10
|
+
method_option :size, :type => :string, :aliases => "-s",
|
11
|
+
:desc => "Server size [large, small]"
|
12
|
+
method_option "redeem-code", :type => :string, :aliases => "-r",
|
13
|
+
:desc => "Redeem code for free credits"
|
14
|
+
method_option "organization", :type => :string, :aliases => "-o",
|
15
|
+
:desc => "Add cloud to existing organization"
|
16
|
+
method_option "skip-requirements-check", :type => :boolean,
|
17
|
+
:desc => "Skip Shelly Cloud requirements check"
|
18
|
+
method_option "zone", :type => :string, :hide => true,
|
19
|
+
:desc => "Create cloud in given zone"
|
20
|
+
desc "add", "Add a new cloud"
|
21
|
+
def add
|
22
|
+
check_options(options)
|
23
|
+
unless options["skip-requirements-check"]
|
24
|
+
return unless check(verbose = false)
|
25
|
+
end
|
26
|
+
app = Shelly::App.new
|
27
|
+
app.code_name = options["code-name"] || ask_for_code_name
|
28
|
+
app.databases = options["databases"] || ask_for_databases
|
29
|
+
app.size = options["size"] || "large"
|
30
|
+
app.organization_name = options["organization"] || ask_for_organization(options)
|
31
|
+
app.zone_name = options["zone"]
|
32
|
+
app.create
|
33
|
+
say "Cloud '#{app}' created in '#{app.organization_name}' organization", :green
|
34
|
+
say_new_line
|
35
|
+
|
36
|
+
git_remote = add_remote(app)
|
37
|
+
|
38
|
+
say "Creating Cloudfile", :green
|
39
|
+
app.create_cloudfile
|
40
|
+
|
41
|
+
if app.credit > 0 || !app.organization_details_present?
|
42
|
+
say_new_line
|
43
|
+
say "Billing information", :green
|
44
|
+
if app.credit > 0
|
45
|
+
say "#{app.credit.to_i} Euro credit remaining."
|
46
|
+
end
|
47
|
+
if !app.organization_details_present?
|
48
|
+
say "Remember to provide billing details before trial ends."
|
49
|
+
say app.edit_billing_url
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
info_adding_cloudfile_to_repository
|
54
|
+
info_deploying_to_shellycloud(git_remote)
|
55
|
+
|
56
|
+
rescue Client::ValidationException => e
|
57
|
+
e.each_error { |error| say_error error, :with_exit => false }
|
58
|
+
say_new_line
|
59
|
+
say_error "Fix erros in the below command and type it again to create your cloud" , :with_exit => false
|
60
|
+
say_error "shelly add --code-name=#{app.code_name.downcase.dasherize} --databases=#{app.databases.join(',')} --organization=#{app.organization_name} --size=#{app.size}"
|
61
|
+
rescue Client::ForbiddenException
|
62
|
+
say_error "You have to be the owner of '#{options[:organization]}' organization to add clouds"
|
63
|
+
rescue Client::NotFoundException => e
|
64
|
+
raise unless e.resource == :organization
|
65
|
+
say_error "Organization '#{app.organization_name}' not found", :with_exit => false
|
66
|
+
say_error "You can list organizations you have access to with `shelly organization list`"
|
67
|
+
end
|
68
|
+
|
69
|
+
no_tasks do
|
70
|
+
def ask_for_organization(options)
|
71
|
+
organizations = Shelly::User.new.organizations
|
72
|
+
if organizations.blank?
|
73
|
+
ask_for_new_organization(options)
|
74
|
+
else
|
75
|
+
count = organizations.count
|
76
|
+
option_selected = 0
|
77
|
+
loop do
|
78
|
+
say "Select organization for this cloud:"
|
79
|
+
say_new_line
|
80
|
+
say "existing organizations:"
|
81
|
+
|
82
|
+
organizations.each_with_index do |organization, i|
|
83
|
+
print_wrapped "#{i + 1}) #{organization.name}", :ident => 2
|
84
|
+
end
|
85
|
+
say_new_line
|
86
|
+
|
87
|
+
print_wrapped "#{count + 1}) provide name for new organization", :ident => 2
|
88
|
+
|
89
|
+
option_selected = ask("Option:")
|
90
|
+
break if ('1'..(count + 1).to_s).include?(option_selected)
|
91
|
+
end
|
92
|
+
|
93
|
+
if option_selected.to_i == count + 1
|
94
|
+
return ask_for_new_organization(options)
|
95
|
+
end
|
96
|
+
|
97
|
+
if (1..count).include?(option_selected.to_i)
|
98
|
+
return organizations[option_selected.to_i - 1].name
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
def ask_for_new_organization(options = {})
|
104
|
+
loop do
|
105
|
+
begin
|
106
|
+
return create_new_organization(options)
|
107
|
+
rescue Client::ValidationException => e
|
108
|
+
e.each_error { |error| say_error error, :with_exit => false }
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
@@ -0,0 +1,127 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Shelly
|
4
|
+
module CLI
|
5
|
+
class Main < Command
|
6
|
+
desc "check", "Check if application fulfills Shelly Cloud requirements"
|
7
|
+
# Public: Check if application fulfills shelly's requirements
|
8
|
+
# and print them
|
9
|
+
# verbose - when true all requirements will be printed out
|
10
|
+
# together with header and a summary at the end
|
11
|
+
# when false only not fulfilled requirements will be
|
12
|
+
# printed
|
13
|
+
# When any requirements is not fulfilled header and summary will
|
14
|
+
# be displayed regardless of verbose value
|
15
|
+
def check(verbose = true)
|
16
|
+
structure = Shelly::StructureValidator.new
|
17
|
+
|
18
|
+
if verbose or structure.invalid? or structure.warnings?
|
19
|
+
say "Checking Shelly Cloud requirements\n\n"
|
20
|
+
end
|
21
|
+
|
22
|
+
print_check(structure.gemfile?, "Gemfile is present",
|
23
|
+
"Gemfile is missing in git repository",
|
24
|
+
:show_fulfilled => verbose)
|
25
|
+
|
26
|
+
print_check(structure.gemfile_lock?, "Gemfile.lock is present",
|
27
|
+
"Gemfile.lock is missing in git repository",
|
28
|
+
:show_fulfilled => verbose)
|
29
|
+
|
30
|
+
print_check(structure.config_ru?, "config.ru is present",
|
31
|
+
"config.ru is missing",
|
32
|
+
:show_fulfilled => verbose)
|
33
|
+
|
34
|
+
print_check(structure.rakefile?, "Rakefile is present",
|
35
|
+
"Rakefile is missing",
|
36
|
+
:show_fulfilled => verbose)
|
37
|
+
|
38
|
+
print_check(!structure.gem?("shelly"),
|
39
|
+
"Gem 'shelly' is not a part of Gemfile",
|
40
|
+
"Gem 'shelly' should not be a part of Gemfile.\n The versions of the thor gem used by shelly and Rails may be incompatible.",
|
41
|
+
:show_fulfilled => verbose || structure.warnings?,
|
42
|
+
:failure_level => :warning)
|
43
|
+
|
44
|
+
print_check(structure.gem?("shelly-dependencies"),
|
45
|
+
"Gem 'shelly-dependencies' is present",
|
46
|
+
"Gem 'shelly-dependencies' is missing, we recommend to install it\n See more at https://shellycloud.com/documentation/requirements#shelly-dependencies",
|
47
|
+
:show_fulfilled => verbose || structure.warnings?, :failure_level => :warning)
|
48
|
+
|
49
|
+
print_check(structure.gem?("thin") || structure.gem?("puma"),
|
50
|
+
"Web server gem is present",
|
51
|
+
"Missing web server gem in Gemfile. Currently supported: 'thin' and 'puma'",
|
52
|
+
:show_fulfilled => verbose, :failure_level => :warning)
|
53
|
+
|
54
|
+
print_check(structure.gem?("rake"), "Gem 'rake' is present",
|
55
|
+
"Gem 'rake' is missing in the Gemfile", :show_fulfilled => verbose)
|
56
|
+
|
57
|
+
print_check(structure.task?("db:migrate"), "Task 'db:migrate' is present",
|
58
|
+
"Task 'db:migrate' is missing", :show_fulfilled => verbose)
|
59
|
+
|
60
|
+
print_check(structure.task?("db:setup"), "Task 'db:setup' is present",
|
61
|
+
"Task 'db:setup' is missing", :show_fulfilled => verbose)
|
62
|
+
|
63
|
+
cloudfile = Cloudfile.new
|
64
|
+
if cloudfile.present?
|
65
|
+
cloudfile.clouds.each do |app|
|
66
|
+
if app.cloud_databases.include?('postgresql')
|
67
|
+
print_check(structure.gem?("pg") || structure.gem?("postgres"),
|
68
|
+
"Postgresql driver is present for '#{app}' cloud",
|
69
|
+
"Postgresql driver is missing in the Gemfile for '#{app}' cloud,\n we recommend adding 'pg' gem to Gemfile",
|
70
|
+
:show_fulfilled => verbose)
|
71
|
+
end
|
72
|
+
|
73
|
+
if app.delayed_job?
|
74
|
+
print_check(structure.gem?("delayed_job"),
|
75
|
+
"Gem 'delayed_job' is present for '#{app}' cloud",
|
76
|
+
"Gem 'delayed_job' is missing in the Gemfile for '#{app}' cloud",
|
77
|
+
:show_fulfilled => verbose)
|
78
|
+
end
|
79
|
+
|
80
|
+
if app.whenever?
|
81
|
+
print_check(structure.gem?("whenever"),
|
82
|
+
"Gem 'whenever' is present for '#{app}' cloud",
|
83
|
+
"Gem 'whenever' is missing in the Gemfile for '#{app}' cloud",
|
84
|
+
:show_fulfilled => verbose)
|
85
|
+
end
|
86
|
+
|
87
|
+
if app.sidekiq?
|
88
|
+
print_check(structure.gem?("sidekiq"),
|
89
|
+
"Gem 'sidekiq' is present for '#{app}' cloud",
|
90
|
+
"Gem 'sidekiq' is missing in the Gemfile for '#{app}' cloud",
|
91
|
+
:show_fulfilled => verbose)
|
92
|
+
end
|
93
|
+
|
94
|
+
if app.thin?
|
95
|
+
print_check(structure.gem?("thin"),
|
96
|
+
"Web server gem 'thin' is present",
|
97
|
+
"Gem 'thin' is missing in the Gemfile for '#{app}' cloud",
|
98
|
+
:show_fulfilled => verbose)
|
99
|
+
end
|
100
|
+
|
101
|
+
if app.puma?
|
102
|
+
print_check(structure.gem?("puma"),
|
103
|
+
"Web server gem 'puma' is present",
|
104
|
+
"Gem 'puma' is missing in the Gemfile for '#{app}' cloud",
|
105
|
+
:show_fulfilled => verbose)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
if structure.valid?
|
111
|
+
if verbose
|
112
|
+
say "\nGreat! Your application is ready to run on Shelly Cloud"
|
113
|
+
end
|
114
|
+
else
|
115
|
+
say "\nFix points marked with #{red("✗")} to run your application on the Shelly Cloud"
|
116
|
+
say "See more about requirements on https://shellycloud.com/documentation/requirements"
|
117
|
+
end
|
118
|
+
|
119
|
+
structure.valid?
|
120
|
+
rescue Bundler::BundlerError => e
|
121
|
+
say_new_line
|
122
|
+
say_error e.message, :with_exit => false
|
123
|
+
say_error "Try to run `bundle install`"
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
@@ -6,7 +6,7 @@ module Shelly
|
|
6
6
|
namespace :organization
|
7
7
|
include Helpers
|
8
8
|
|
9
|
-
before_hook :logged_in?, :only => [:list]
|
9
|
+
before_hook :logged_in?, :only => [:list, :add]
|
10
10
|
|
11
11
|
desc "list", "Lists organizations"
|
12
12
|
def list
|
@@ -23,6 +23,16 @@ module Shelly
|
|
23
23
|
end
|
24
24
|
end
|
25
25
|
end
|
26
|
+
|
27
|
+
method_option "redeem-code", :type => :string, :aliases => "-r",
|
28
|
+
:desc => "Redeem code for free credits"
|
29
|
+
desc "add", "Add a new organization"
|
30
|
+
def add
|
31
|
+
create_new_organization(options)
|
32
|
+
rescue Client::ValidationException => e
|
33
|
+
e.each_error { |error| say_error error, :with_exit => false }
|
34
|
+
exit 1
|
35
|
+
end
|
26
36
|
end
|
27
37
|
end
|
28
38
|
end
|
data/lib/shelly/helpers.rb
CHANGED
@@ -23,6 +23,17 @@ module Shelly
|
|
23
23
|
say message, :yellow
|
24
24
|
end
|
25
25
|
|
26
|
+
# Extracted into a helper so can be used when adding cloud Main#add and
|
27
|
+
# Organization#add
|
28
|
+
def create_new_organization(options = {})
|
29
|
+
organization = Shelly::Organization.new
|
30
|
+
organization.name = ask_for_organization_name
|
31
|
+
organization.redeem_code = options["redeem-code"]
|
32
|
+
organization.create
|
33
|
+
say "Organization '#{organization.name}' created", :green
|
34
|
+
organization.name
|
35
|
+
end
|
36
|
+
|
26
37
|
def ask_for_email(options = {})
|
27
38
|
options = {:guess_email => true}.merge(options)
|
28
39
|
email_question = options[:guess_email] && !User.guess_email.blank? ? "Email (#{User.guess_email} - default):" : "Email:"
|
@@ -59,6 +70,16 @@ module Shelly
|
|
59
70
|
exit 1 unless yes?(reset_database_question)
|
60
71
|
end
|
61
72
|
|
73
|
+
def ask_for_organization_name
|
74
|
+
default_name = default_name_from_dir_name
|
75
|
+
name = ask("Organization name (#{default_name} - default):")
|
76
|
+
name.blank? ? default_name : name
|
77
|
+
end
|
78
|
+
|
79
|
+
def default_name_from_dir_name
|
80
|
+
"#{File.basename(Dir.pwd)}".downcase.dasherize
|
81
|
+
end
|
82
|
+
|
62
83
|
def inside_git_repository?
|
63
84
|
unless App.inside_git_repository?
|
64
85
|
say_error %q{Current directory is not a git repository.
|
data/lib/shelly/organization.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module Shelly
|
2
2
|
class Organization < Model
|
3
|
-
|
3
|
+
attr_accessor :name, :app_code_names, :redeem_code
|
4
4
|
|
5
5
|
def initialize(attributes = {})
|
6
6
|
@name = attributes["name"]
|
@@ -13,6 +13,11 @@ module Shelly
|
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
|
+
def create
|
17
|
+
attributes = {:name => name, :redeem_code => redeem_code}
|
18
|
+
shelly.create_organization(attributes)
|
19
|
+
end
|
20
|
+
|
16
21
|
def memberships
|
17
22
|
@members ||= Array(shelly.members(name)).
|
18
23
|
sort_by { |c| c["email"] }
|
data/lib/shelly/version.rb
CHANGED
data/spec/input_faker.rb
CHANGED
data/spec/shelly/app_spec.rb
CHANGED
@@ -10,13 +10,6 @@ describe Shelly::App do
|
|
10
10
|
@app = Shelly::App.new('foo-staging')
|
11
11
|
end
|
12
12
|
|
13
|
-
describe ".code_name_from_dir_name" do
|
14
|
-
it "should downcase and dasherize code name" do
|
15
|
-
Dir.stub(:pwd).and_return("/project/FOO")
|
16
|
-
Shelly::App.code_name_from_dir_name.should == "foo"
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
13
|
describe "#databases=" do
|
21
14
|
it "should remove 'none' as possible database" do
|
22
15
|
@app.databases = %w{none postgresql}
|
@@ -249,10 +242,8 @@ describe Shelly::App do
|
|
249
242
|
describe "#create" do
|
250
243
|
it "should create the app on shelly cloud via API client" do
|
251
244
|
@app.code_name = "fooo"
|
252
|
-
@app.redeem_code = "foo123"
|
253
245
|
attributes = {
|
254
246
|
:code_name => "fooo",
|
255
|
-
:redeem_code => "foo123",
|
256
247
|
:organization_name => nil,
|
257
248
|
:zone_name => nil
|
258
249
|
}
|
@@ -333,7 +324,7 @@ describe Shelly::App do
|
|
333
324
|
|
334
325
|
describe "#edit_billing_url" do
|
335
326
|
it "should return link to edit billing page for app" do
|
336
|
-
@app.stub(:
|
327
|
+
@app.stub(:organization_name).and_return("example")
|
337
328
|
@app.edit_billing_url.should == "http://shellyapp.example.com/organizations/example/edit"
|
338
329
|
end
|
339
330
|
end
|
@@ -406,7 +406,7 @@ More info at http://git-scm.com/book/en/Git-Basics-Getting-a-Git-Repository\e[0m
|
|
406
406
|
it "should create the app on shelly cloud and show credit information" do
|
407
407
|
@app.stub(:attributes).and_return(
|
408
408
|
"organization" => {"credit" => "40", "details_present" => false})
|
409
|
-
@app.stub(:
|
409
|
+
@app.stub(:organization_name).and_return("example")
|
410
410
|
@app.should_receive(:create)
|
411
411
|
$stdout.should_receive(:puts).with(green "Billing information")
|
412
412
|
$stdout.should_receive(:puts).with("40 Euro credit remaining.")
|
@@ -430,10 +430,11 @@ More info at http://git-scm.com/book/en/Git-Basics-Getting-a-Git-Repository\e[0m
|
|
430
430
|
it "should display validation errors if they are any" do
|
431
431
|
body = {"message" => "Validation Failed", "errors" => [["code_name", "has been already taken"]]}
|
432
432
|
exception = Shelly::Client::ValidationException.new(body)
|
433
|
+
@app.stub(:organization_name).and_return("org-name")
|
433
434
|
@app.should_receive(:create).and_raise(exception)
|
434
435
|
$stdout.should_receive(:puts).with(red "Code name has been already taken")
|
435
436
|
$stdout.should_receive(:puts).with(red "Fix erros in the below command and type it again to create your cloud")
|
436
|
-
$stdout.should_receive(:puts).with(red "shelly add --code-name=big-letters --databases=postgresql --size=large")
|
437
|
+
$stdout.should_receive(:puts).with(red "shelly add --code-name=big-letters --databases=postgresql --organization=org-name --size=large")
|
437
438
|
lambda {
|
438
439
|
fake_stdin(["BiG_LETTERS", ""]) do
|
439
440
|
invoke(@main, :add)
|
@@ -545,14 +546,14 @@ More info at http://git-scm.com/book/en/Git-Basics-Getting-a-Git-Repository\e[0m
|
|
545
546
|
end.to raise_error(SystemExit)
|
546
547
|
end
|
547
548
|
|
548
|
-
context "
|
549
|
+
context "organization" do
|
549
550
|
before do
|
550
551
|
@main.unstub(:ask_for_organization)
|
551
552
|
end
|
552
553
|
|
553
554
|
it "should use --organization option" do
|
554
555
|
@main.options = {"organization" => "foo"}
|
555
|
-
@app.should_receive(:
|
556
|
+
@app.should_receive(:organization_name=).with("foo")
|
556
557
|
fake_stdin(["foooo", "none"]) do
|
557
558
|
invoke(@main, :add)
|
558
559
|
end
|
@@ -564,37 +565,45 @@ More info at http://git-scm.com/book/en/Git-Basics-Getting-a-Git-Repository\e[0m
|
|
564
565
|
end
|
565
566
|
|
566
567
|
it "should ask user to choose organization if present and use chosen organization" do
|
567
|
-
@app.should_receive(:
|
568
|
+
@app.should_receive(:organization_name=).with("aaa")
|
568
569
|
$stdout.should_receive(:puts).with("Select organization for this cloud:")
|
569
570
|
$stdout.should_receive(:puts).with("existing organizations:")
|
570
571
|
$stdout.should_receive(:puts).with(" 1) aaa")
|
571
|
-
$stdout.should_receive(:puts).with("
|
572
|
-
$stdout.should_receive(:puts).with(" 2) foooo")
|
572
|
+
$stdout.should_receive(:puts).with(" 2) provide name for new organization")
|
573
573
|
$stdout.should_receive(:print).with("Option: ")
|
574
574
|
fake_stdin(["foooo", "none", "1"]) do
|
575
575
|
invoke(@main, :add)
|
576
576
|
end
|
577
577
|
end
|
578
578
|
|
579
|
-
it "should ask user to
|
580
|
-
@
|
579
|
+
it "should ask user to create new organization" do
|
580
|
+
@main.options = {'redeem-code' => 'discount'}
|
581
|
+
@client.should_receive(:create_organization).
|
582
|
+
with({:name => "org-name", :redeem_code => 'discount'})
|
583
|
+
@app.should_receive(:organization_name=).with('org-name')
|
581
584
|
$stdout.should_receive(:puts).with("Select organization for this cloud:")
|
582
585
|
$stdout.should_receive(:puts).with("existing organizations:")
|
583
586
|
$stdout.should_receive(:puts).with(" 1) aaa")
|
584
|
-
$stdout.should_receive(:puts).with("
|
585
|
-
$stdout.should_receive(:puts).with(" 2) foooo")
|
587
|
+
$stdout.should_receive(:puts).with(" 2) provide name for new organization")
|
586
588
|
$stdout.should_receive(:print).with("Option: ")
|
587
|
-
|
589
|
+
$stdout.should_receive(:print).with("Organization name (foo - default): ")
|
590
|
+
$stdout.should_receive(:puts).with(green "Organization 'org-name' created")
|
591
|
+
fake_stdin(["foooo", "none", "2", "org-name"]) do
|
588
592
|
invoke(@main, :add)
|
589
593
|
end
|
590
594
|
end
|
591
|
-
end
|
592
595
|
|
593
|
-
|
594
|
-
|
595
|
-
|
596
|
-
|
597
|
-
|
596
|
+
it "should use redeem-code option" do
|
597
|
+
@client.should_receive(:create_organization).
|
598
|
+
with({:name => "org-name", :redeem_code => nil})
|
599
|
+
$stdout.should_receive(:puts).with("Select organization for this cloud:")
|
600
|
+
$stdout.should_receive(:puts).with("existing organizations:")
|
601
|
+
$stdout.should_receive(:puts).with(" 1) aaa")
|
602
|
+
$stdout.should_receive(:puts).with(" 2) provide name for new organization")
|
603
|
+
$stdout.should_receive(:print).with("Option: ")
|
604
|
+
$stdout.should_receive(:print).with("Organization name (foo - default): ")
|
605
|
+
$stdout.should_receive(:puts).with(green "Organization 'org-name' created")
|
606
|
+
fake_stdin(["foooo", "none", "2", "org-name"]) do
|
598
607
|
invoke(@main, :add)
|
599
608
|
end
|
600
609
|
end
|
@@ -4,8 +4,8 @@ require "shelly/cli/organization"
|
|
4
4
|
describe Shelly::CLI::Organization do
|
5
5
|
before do
|
6
6
|
FileUtils.stub(:chmod)
|
7
|
-
@
|
8
|
-
Shelly::CLI::Organization.stub(:new).and_return(@
|
7
|
+
@cli = Shelly::CLI::Organization.new
|
8
|
+
Shelly::CLI::Organization.stub(:new).and_return(@cli)
|
9
9
|
@client = mock
|
10
10
|
Shelly::Client.stub(:new).and_return(@client)
|
11
11
|
$stdout.stub(:puts)
|
@@ -28,7 +28,7 @@ describe Shelly::CLI::Organization do
|
|
28
28
|
end
|
29
29
|
|
30
30
|
it "should ensure user has logged in" do
|
31
|
-
hooks(@
|
31
|
+
hooks(@cli, :list).should include(:logged_in?)
|
32
32
|
end
|
33
33
|
|
34
34
|
it "should print out all organizations with apps" do
|
@@ -38,7 +38,51 @@ describe Shelly::CLI::Organization do
|
|
38
38
|
$stdout.should_receive(:puts).with(green("ccc"))
|
39
39
|
$stdout.should_receive(:puts).with(/app2 \s+ | turned off/)
|
40
40
|
$stdout.should_receive(:puts).with(/app3 \s+ | no code/)
|
41
|
-
invoke(@
|
41
|
+
invoke(@cli, :list)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe "#add" do
|
46
|
+
before do
|
47
|
+
@organization = Shelly::Organization.new
|
48
|
+
Shelly::Organization.stub(:new).and_return(@organization)
|
49
|
+
@organization.stub(:create)
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should ensure user has logged in" do
|
53
|
+
hooks(@cli, :add).should include(:logged_in?)
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should create new organization" do
|
57
|
+
@organization.should_receive(:create)
|
58
|
+
$stdout.should_receive(:print).with("Organization name (foo - default): ")
|
59
|
+
$stdout.should_receive(:puts).with(green "Organization 'org-name' created")
|
60
|
+
fake_stdin("org-name") do
|
61
|
+
invoke(@cli, :add)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
it "should accept redeem-code option" do
|
66
|
+
@organization.should_receive(:redeem_code=).with("discount")
|
67
|
+
@cli.options = {"redeem-code" => "discount"}
|
68
|
+
fake_stdin("org-name") do
|
69
|
+
invoke(@cli, :add)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
context "on failure" do
|
74
|
+
it "should display validation errors" do
|
75
|
+
body = {"message" => "Validation Failed", "errors" =>
|
76
|
+
[["name", "has been already taken"]]}
|
77
|
+
exception = Shelly::Client::ValidationException.new(body)
|
78
|
+
@organization.should_receive(:create).and_raise(exception)
|
79
|
+
$stdout.should_receive(:puts).with(red "Name has been already taken")
|
80
|
+
lambda {
|
81
|
+
fake_stdin("org-name") do
|
82
|
+
invoke(@cli, :add)
|
83
|
+
end
|
84
|
+
}.should raise_error(SystemExit)
|
85
|
+
end
|
42
86
|
end
|
43
87
|
end
|
44
88
|
end
|
data/spec/shelly/client_spec.rb
CHANGED
@@ -170,12 +170,6 @@ describe Shelly::Client do
|
|
170
170
|
|
171
171
|
describe "#create_app" do
|
172
172
|
it "should send post with app's attributes" do
|
173
|
-
@client.should_receive(:post).with("/apps", :app => {:code_name => "foo",
|
174
|
-
:ruby_version => "1.9.2"}, :organization_name => nil, :zone_name => nil)
|
175
|
-
@client.create_app(:code_name => "foo", :ruby_version => "1.9.2")
|
176
|
-
end
|
177
|
-
|
178
|
-
it "should send post with app's attributes and organization name" do
|
179
173
|
@client.should_receive(:post).with("/apps", :app => {:code_name => "foo",
|
180
174
|
:ruby_version => "1.9.2"}, :organization_name => "foo", :zone_name => 'eu1')
|
181
175
|
@client.create_app(:code_name => "foo", :ruby_version => "1.9.2",
|
@@ -194,6 +188,14 @@ describe Shelly::Client do
|
|
194
188
|
end
|
195
189
|
end
|
196
190
|
|
191
|
+
describe "#create_organization" do
|
192
|
+
it "should send post with organization's attributes" do
|
193
|
+
@client.should_receive(:post).with("/organizations",
|
194
|
+
:organization => {:name => "new-organization"})
|
195
|
+
@client.create_organization(:name => "new-organization")
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
197
199
|
describe "#organization" do
|
198
200
|
it "should fetch organization from API" do
|
199
201
|
FakeWeb.register_uri(:get, api_url("organizations/foo-org"),
|
@@ -62,6 +62,16 @@ describe Shelly::Organization do
|
|
62
62
|
end
|
63
63
|
end
|
64
64
|
|
65
|
+
describe "#create" do
|
66
|
+
it "should create organization via API client" do
|
67
|
+
@client.should_receive(:create_organization).with(
|
68
|
+
:name => "new-organization", :redeem_code => "discount")
|
69
|
+
@organization.name = "new-organization"
|
70
|
+
@organization.redeem_code = "discount"
|
71
|
+
@organization.create
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
65
75
|
describe "#send_invitation" do
|
66
76
|
it "should send invitation" do
|
67
77
|
@client.should_receive(:send_invitation).with("foo-org", "megan@example.com", true)
|
metadata
CHANGED
@@ -1,20 +1,18 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: shelly
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.4.0.pre
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Shelly Cloud team
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date: 2013-08-
|
11
|
+
date: 2013-08-12 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: rspec
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
17
|
- - ~>
|
20
18
|
- !ruby/object:Gem::Version
|
@@ -22,7 +20,6 @@ dependencies:
|
|
22
20
|
type: :development
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
24
|
- - ~>
|
28
25
|
- !ruby/object:Gem::Version
|
@@ -30,7 +27,6 @@ dependencies:
|
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: rake
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
31
|
- - ! '>='
|
36
32
|
- !ruby/object:Gem::Version
|
@@ -38,7 +34,6 @@ dependencies:
|
|
38
34
|
type: :development
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
38
|
- - ! '>='
|
44
39
|
- !ruby/object:Gem::Version
|
@@ -46,7 +41,6 @@ dependencies:
|
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
42
|
name: guard
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
45
|
- - ! '>='
|
52
46
|
- !ruby/object:Gem::Version
|
@@ -54,7 +48,6 @@ dependencies:
|
|
54
48
|
type: :development
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
51
|
requirements:
|
59
52
|
- - ! '>='
|
60
53
|
- !ruby/object:Gem::Version
|
@@ -62,7 +55,6 @@ dependencies:
|
|
62
55
|
- !ruby/object:Gem::Dependency
|
63
56
|
name: guard-rspec
|
64
57
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
58
|
requirements:
|
67
59
|
- - ! '>='
|
68
60
|
- !ruby/object:Gem::Version
|
@@ -70,7 +62,6 @@ dependencies:
|
|
70
62
|
type: :development
|
71
63
|
prerelease: false
|
72
64
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
65
|
requirements:
|
75
66
|
- - ! '>='
|
76
67
|
- !ruby/object:Gem::Version
|
@@ -78,7 +69,6 @@ dependencies:
|
|
78
69
|
- !ruby/object:Gem::Dependency
|
79
70
|
name: simplecov
|
80
71
|
requirement: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
72
|
requirements:
|
83
73
|
- - ! '>='
|
84
74
|
- !ruby/object:Gem::Version
|
@@ -86,7 +76,34 @@ dependencies:
|
|
86
76
|
type: :development
|
87
77
|
prerelease: false
|
88
78
|
version_requirements: !ruby/object:Gem::Requirement
|
89
|
-
|
79
|
+
requirements:
|
80
|
+
- - ! '>='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: ruby_gntp
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ! '>='
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ! '>='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rb-fsevent
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ! '>='
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
90
107
|
requirements:
|
91
108
|
- - ! '>='
|
92
109
|
- !ruby/object:Gem::Version
|
@@ -94,7 +111,6 @@ dependencies:
|
|
94
111
|
- !ruby/object:Gem::Dependency
|
95
112
|
name: fakefs
|
96
113
|
requirement: !ruby/object:Gem::Requirement
|
97
|
-
none: false
|
98
114
|
requirements:
|
99
115
|
- - ! '>='
|
100
116
|
- !ruby/object:Gem::Version
|
@@ -102,7 +118,6 @@ dependencies:
|
|
102
118
|
type: :development
|
103
119
|
prerelease: false
|
104
120
|
version_requirements: !ruby/object:Gem::Requirement
|
105
|
-
none: false
|
106
121
|
requirements:
|
107
122
|
- - ! '>='
|
108
123
|
- !ruby/object:Gem::Version
|
@@ -110,7 +125,6 @@ dependencies:
|
|
110
125
|
- !ruby/object:Gem::Dependency
|
111
126
|
name: fakeweb
|
112
127
|
requirement: !ruby/object:Gem::Requirement
|
113
|
-
none: false
|
114
128
|
requirements:
|
115
129
|
- - ! '>='
|
116
130
|
- !ruby/object:Gem::Version
|
@@ -118,7 +132,6 @@ dependencies:
|
|
118
132
|
type: :development
|
119
133
|
prerelease: false
|
120
134
|
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
none: false
|
122
135
|
requirements:
|
123
136
|
- - ! '>='
|
124
137
|
- !ruby/object:Gem::Version
|
@@ -126,7 +139,6 @@ dependencies:
|
|
126
139
|
- !ruby/object:Gem::Dependency
|
127
140
|
name: wijet-thor
|
128
141
|
requirement: !ruby/object:Gem::Requirement
|
129
|
-
none: false
|
130
142
|
requirements:
|
131
143
|
- - ~>
|
132
144
|
- !ruby/object:Gem::Version
|
@@ -134,7 +146,6 @@ dependencies:
|
|
134
146
|
type: :runtime
|
135
147
|
prerelease: false
|
136
148
|
version_requirements: !ruby/object:Gem::Requirement
|
137
|
-
none: false
|
138
149
|
requirements:
|
139
150
|
- - ~>
|
140
151
|
- !ruby/object:Gem::Version
|
@@ -142,7 +153,6 @@ dependencies:
|
|
142
153
|
- !ruby/object:Gem::Dependency
|
143
154
|
name: rest-client
|
144
155
|
requirement: !ruby/object:Gem::Requirement
|
145
|
-
none: false
|
146
156
|
requirements:
|
147
157
|
- - ! '>='
|
148
158
|
- !ruby/object:Gem::Version
|
@@ -150,7 +160,6 @@ dependencies:
|
|
150
160
|
type: :runtime
|
151
161
|
prerelease: false
|
152
162
|
version_requirements: !ruby/object:Gem::Requirement
|
153
|
-
none: false
|
154
163
|
requirements:
|
155
164
|
- - ! '>='
|
156
165
|
- !ruby/object:Gem::Version
|
@@ -158,7 +167,6 @@ dependencies:
|
|
158
167
|
- !ruby/object:Gem::Dependency
|
159
168
|
name: json
|
160
169
|
requirement: !ruby/object:Gem::Requirement
|
161
|
-
none: false
|
162
170
|
requirements:
|
163
171
|
- - ! '>='
|
164
172
|
- !ruby/object:Gem::Version
|
@@ -166,7 +174,6 @@ dependencies:
|
|
166
174
|
type: :runtime
|
167
175
|
prerelease: false
|
168
176
|
version_requirements: !ruby/object:Gem::Requirement
|
169
|
-
none: false
|
170
177
|
requirements:
|
171
178
|
- - ! '>='
|
172
179
|
- !ruby/object:Gem::Version
|
@@ -174,7 +181,6 @@ dependencies:
|
|
174
181
|
- !ruby/object:Gem::Dependency
|
175
182
|
name: progressbar
|
176
183
|
requirement: !ruby/object:Gem::Requirement
|
177
|
-
none: false
|
178
184
|
requirements:
|
179
185
|
- - ! '>='
|
180
186
|
- !ruby/object:Gem::Version
|
@@ -182,7 +188,6 @@ dependencies:
|
|
182
188
|
type: :runtime
|
183
189
|
prerelease: false
|
184
190
|
version_requirements: !ruby/object:Gem::Requirement
|
185
|
-
none: false
|
186
191
|
requirements:
|
187
192
|
- - ! '>='
|
188
193
|
- !ruby/object:Gem::Version
|
@@ -190,7 +195,6 @@ dependencies:
|
|
190
195
|
- !ruby/object:Gem::Dependency
|
191
196
|
name: launchy
|
192
197
|
requirement: !ruby/object:Gem::Requirement
|
193
|
-
none: false
|
194
198
|
requirements:
|
195
199
|
- - ! '>='
|
196
200
|
- !ruby/object:Gem::Version
|
@@ -198,7 +202,6 @@ dependencies:
|
|
198
202
|
type: :runtime
|
199
203
|
prerelease: false
|
200
204
|
version_requirements: !ruby/object:Gem::Requirement
|
201
|
-
none: false
|
202
205
|
requirements:
|
203
206
|
- - ! '>='
|
204
207
|
- !ruby/object:Gem::Version
|
@@ -206,7 +209,6 @@ dependencies:
|
|
206
209
|
- !ruby/object:Gem::Dependency
|
207
210
|
name: netrc
|
208
211
|
requirement: !ruby/object:Gem::Requirement
|
209
|
-
none: false
|
210
212
|
requirements:
|
211
213
|
- - ! '>='
|
212
214
|
- !ruby/object:Gem::Version
|
@@ -214,7 +216,6 @@ dependencies:
|
|
214
216
|
type: :runtime
|
215
217
|
prerelease: false
|
216
218
|
version_requirements: !ruby/object:Gem::Requirement
|
217
|
-
none: false
|
218
219
|
requirements:
|
219
220
|
- - ! '>='
|
220
221
|
- !ruby/object:Gem::Version
|
@@ -249,6 +250,8 @@ files:
|
|
249
250
|
- lib/shelly/cli/file.rb
|
250
251
|
- lib/shelly/cli/logs.rb
|
251
252
|
- lib/shelly/cli/main.rb
|
253
|
+
- lib/shelly/cli/main/add.rb
|
254
|
+
- lib/shelly/cli/main/check.rb
|
252
255
|
- lib/shelly/cli/organization.rb
|
253
256
|
- lib/shelly/cli/runner.rb
|
254
257
|
- lib/shelly/cli/user.rb
|
@@ -306,32 +309,48 @@ files:
|
|
306
309
|
- spec/thor/options_spec.rb
|
307
310
|
homepage: http://shellycloud.com
|
308
311
|
licenses: []
|
312
|
+
metadata: {}
|
309
313
|
post_install_message:
|
310
314
|
rdoc_options: []
|
311
315
|
require_paths:
|
312
316
|
- lib
|
313
317
|
required_ruby_version: !ruby/object:Gem::Requirement
|
314
|
-
none: false
|
315
318
|
requirements:
|
316
319
|
- - ! '>='
|
317
320
|
- !ruby/object:Gem::Version
|
318
321
|
version: '0'
|
319
|
-
segments:
|
320
|
-
- 0
|
321
|
-
hash: -1190904301794294451
|
322
322
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
323
|
-
none: false
|
324
323
|
requirements:
|
325
|
-
- - ! '
|
324
|
+
- - ! '>'
|
326
325
|
- !ruby/object:Gem::Version
|
327
|
-
version:
|
328
|
-
segments:
|
329
|
-
- 0
|
330
|
-
hash: -1190904301794294451
|
326
|
+
version: 1.3.1
|
331
327
|
requirements: []
|
332
328
|
rubyforge_project: shelly
|
333
|
-
rubygems_version:
|
329
|
+
rubygems_version: 2.0.3
|
334
330
|
signing_key:
|
335
|
-
specification_version:
|
331
|
+
specification_version: 4
|
336
332
|
summary: Shelly Cloud command line tool
|
337
|
-
test_files:
|
333
|
+
test_files:
|
334
|
+
- spec/helpers.rb
|
335
|
+
- spec/input_faker.rb
|
336
|
+
- spec/shelly/app_spec.rb
|
337
|
+
- spec/shelly/backup_spec.rb
|
338
|
+
- spec/shelly/cli/backup_spec.rb
|
339
|
+
- spec/shelly/cli/config_spec.rb
|
340
|
+
- spec/shelly/cli/database_spec.rb
|
341
|
+
- spec/shelly/cli/deploy_spec.rb
|
342
|
+
- spec/shelly/cli/file_spec.rb
|
343
|
+
- spec/shelly/cli/logs_spec.rb
|
344
|
+
- spec/shelly/cli/main_spec.rb
|
345
|
+
- spec/shelly/cli/organization_spec.rb
|
346
|
+
- spec/shelly/cli/runner_spec.rb
|
347
|
+
- spec/shelly/cli/user_spec.rb
|
348
|
+
- spec/shelly/client_spec.rb
|
349
|
+
- spec/shelly/cloudfile_spec.rb
|
350
|
+
- spec/shelly/download_progress_bar_spec.rb
|
351
|
+
- spec/shelly/model_spec.rb
|
352
|
+
- spec/shelly/organization_spec.rb
|
353
|
+
- spec/shelly/structure_validator_spec.rb
|
354
|
+
- spec/shelly/user_spec.rb
|
355
|
+
- spec/spec_helper.rb
|
356
|
+
- spec/thor/options_spec.rb
|