strobe 0.3.10 → 0.3.11

Sign up to get free protection for your applications and to get access to all the features.
@@ -20,6 +20,7 @@ module Strobe
20
20
  autoload :Resources, 'strobe/resources'
21
21
  autoload :Validations, 'strobe/validations'
22
22
  autoload :ExceptionNotifier, 'strobe/exception_notifier'
23
+ autoload :Retryable, 'strobe/retryable'
23
24
 
24
25
  module Addons
25
26
  # Stubb out the Addons module
@@ -45,6 +46,8 @@ module Strobe
45
46
  class ValidationError < StrobeError ; end
46
47
  class OutdatedStrobeVersionError < StrobeError ; end
47
48
  class InvalidPortError < StrobeError ; end
49
+ class InvalidAppPathError < StrobeError ; end
50
+
48
51
  class UnderMaintenanceError < StrobeError
49
52
  def initialize
50
53
  super("We are currently down for maintenance. You can check our status " \
@@ -4,31 +4,37 @@ module Strobe
4
4
  class CLI::Deploys < CLI
5
5
 
6
6
  method_option "application-id", :type => :numeric, :banner => "Use application with given id"
7
+ method_option "staging", :type => :boolean, :banner => "Show staging deploys"
7
8
  action "list", "List all deploys for an application" do
9
+ env = options[:staging] ? "staging" : "production"
8
10
  app = get_application(options)
9
- deploys = app.deploys.all
11
+ deploys = Deploy.where(:application_id => app.id, :environment => env)
10
12
 
11
- deploys_table deploys
13
+ puts "All #{env} deploys\n\n"
14
+ deploys_table(deploys)
12
15
  end
13
16
 
14
17
  method_option "application-id", :type => :numeric, :banner => "Use application with given id"
15
18
  method_option "full", :type => :boolean, :banner => "Display full deploy info"
16
19
  method_option "include-builds", :type => :boolean, :banner => "Include builds data"
20
+ method_option "staging", :type => :boolean, :banner => "Show last staging deploy"
17
21
  action "show", "Show the last deploy for an application" do |*args|
18
22
  sha = args.first
19
-
23
+ env = options[:staging] ? "staging" : "production"
20
24
  app = get_application(options)
21
-
22
- deploy = sha ? app.deploys.where(:id => sha) : Deploy.where(:limit => 1, :application_id => app.id).first
25
+ deploy = sha ?
26
+ app.deploys.find{|d| d[:sha1] == sha || d[:id] == sha } :
27
+ Deploy.where(:application_id => app.id, :limit => 1, :environment => env).first
23
28
 
24
29
  raise NoDeploy.new("No deploys to show") unless deploy
25
30
 
26
31
  puts "deploy #{deploy[:sha1] || deploy[:id]}"
27
32
 
28
- if options['full'] || options['include-builds']
33
+ if options['full'] || options['include-builds'] || sha
29
34
  puts <<-DEPLOY
30
35
  Author: #{deploy[:name]} <#{deploy[:email]}>
31
36
  Date: #{deploy[:created_at]}
37
+ Environment: #{deploy['environment.name']}
32
38
 
33
39
  #{deploy[:message]}
34
40
  DEPLOY
@@ -48,9 +54,9 @@ DEPLOY
48
54
 
49
55
  def deploys_table(deploys)
50
56
  table deploys do |t|
51
- t.column :key do |d| d[:sha1] || d[:id] end
52
- t.column :name
53
- t.column :email
57
+ t.column(:key){|d| d[:sha1] || d[:id] }
58
+ t.column :created_at, :header => "Date"
59
+ t.column(:user){|d| d[:name] || d[:email]}
54
60
  t.column :message
55
61
  end
56
62
  end
@@ -190,6 +190,8 @@ LONGDESC
190
190
  method_option "production", :type => :boolean, :banner => "deploy to a production environment"
191
191
  method_option "sc-build", :type => :boolean, :banner => "run `sc-build -c` before deploying"
192
192
  method_option "no-sc-build", :type => :boolean, :banner => "skip the `sc-build -c` step"
193
+ method_option "bpm-rebuild", :type => :boolean, :banner => "run `bpm rebuild` before deploying"
194
+ method_option "no-bpm-rebuild", :type => :boolean, :banner => "skip the `bpm rebuild` step"
193
195
  method_option "url", :banner => "set application's url"
194
196
  long_desc <<-LONGDESC
195
197
  Deploy your application to the Strobe Platform.
@@ -201,6 +203,10 @@ LONGDESC
201
203
  To deploy to production, use `--production`.
202
204
  LONGDESC
203
205
  action "deploy", "Deploy your application to Strobe Platform" do
206
+ if Dir.pwd == Strobe.user_home
207
+ raise InvalidAppPathError.new("Can't deploy the home directory!")
208
+ end
209
+
204
210
  ensure_computer_is_registered
205
211
  env = (options[:production] ? "production" : "staging")
206
212
 
@@ -239,7 +245,11 @@ LONGDESC
239
245
  end
240
246
  end
241
247
 
242
- run_sc_build
248
+ # If there was an error in registration we don't want to continue
249
+ abort unless resource.errors.empty?
250
+
251
+ ran_sc_build = run_sc_build
252
+ ran_bpm_rebuild = run_bpm_rebuild(ran_sc_build)
243
253
 
244
254
  begin
245
255
  host = resource.deploy! :environment => env,
@@ -374,6 +384,41 @@ LONGDESC
374
384
  unless CLI::Ticker.tick("Running `#{cmd}`", 2) { system cmd }
375
385
  error! "Something went wrong while running `#{cmd}`"
376
386
  end
387
+
388
+ return true
389
+ end
390
+
391
+ def run_bpm_rebuild(ran_sc_build=false)
392
+ return unless bpm_project
393
+
394
+ # Using both options at the same time makes no sense
395
+ if options["bpm-rebuild"] && options["no-bpm-rebuild"]
396
+ error! "--bpm-rebuild and --no-bpm-rebuild cannot be used at the same time"
397
+ end
398
+
399
+ # If the user explicitly says that they don't want to run bpm-rebuild,
400
+ # then just skip it
401
+ return if options["no-bpm-rebuild"]
402
+
403
+ cmd = "bpm rebuild"
404
+
405
+ # If the user doesn't ask either way, confirm first
406
+ unless options["bpm-rebuild"]
407
+ location = bpm_project.root_path == Dir.pwd ? "" : " located at #{bpm_project.root_path}"
408
+ say "This appears to be a BPM application#{location}."
409
+ return unless agree "Run `#{cmd}`? [Yn] "
410
+ end
411
+
412
+ if ran_sc_build
413
+ say "Can't build for both SproutCore 1.x and BPM! Skipping BPM rebuild."
414
+ return
415
+ end
416
+
417
+ unless CLI::Ticker.tick("Running `#{cmd}`", 2) { system cmd }
418
+ error! "Something went wrong while running `#{cmd}`"
419
+ end
420
+
421
+ return true
377
422
  end
378
423
 
379
424
  def is_sproutcore?
@@ -382,7 +427,7 @@ LONGDESC
382
427
 
383
428
  def bpm_project
384
429
  return nil unless defined?(BPM)
385
- BPM::Project.nearest_project Dir.pwd
430
+ @bpm_project ||= BPM::Project.nearest_project Dir.pwd
386
431
  end
387
432
 
388
433
  def determine_application_root
@@ -128,6 +128,10 @@ module Strobe
128
128
  end
129
129
 
130
130
  def register_app_path(path)
131
+ if path == Strobe.user_home
132
+ raise InvalidAppPathError, "Can't register the home directory!"
133
+ end
134
+
131
135
  paths = application_paths
132
136
  paths |= [File.expand_path(path.to_s)]
133
137
  global_set! :applications, paths
@@ -61,7 +61,7 @@ module Strobe
61
61
  cell = "[#{index + 1}]"
62
62
  end
63
63
 
64
- width = [ col[:max], 25 ].max + 5
64
+ width = [ col[:max], 8 ].max + 5
65
65
  cell.to_s.ljust(width)
66
66
  end
67
67
  end
@@ -203,8 +203,8 @@ module Strobe
203
203
  end
204
204
 
205
205
  headers['authorization'] ||= authorization_header
206
-
207
- headers['user-agent'] = Strobe.user_agent
206
+ headers['user-agent'] = Strobe.user_agent
207
+ headers['accept'] = 'application/json'
208
208
 
209
209
  if method == "GET" || method == "HEAD"
210
210
 
@@ -12,5 +12,6 @@ module Strobe
12
12
  require 'strobe/resources/deploy'
13
13
  require 'strobe/resources/build'
14
14
  require 'strobe/resources/platform_install'
15
+ require 'strobe/resources/environment'
15
16
  end
16
17
  end
@@ -9,6 +9,7 @@ module Strobe
9
9
  module Resources
10
10
  class Application
11
11
  include Resource::Collection
12
+ include Strobe::Retryable
12
13
 
13
14
  has 1, :account
14
15
  has n, :teams
@@ -26,7 +27,12 @@ module Strobe
26
27
 
27
28
  def web_install
28
29
  @web_install ||= begin
29
- install = self.platform_installs.detect { |p| p.web? }
30
+ install = nil
31
+
32
+ retry_on_error([IOError, Timeout::Error]) do
33
+ install = self.platform_installs.detect { |p| p.web? }
34
+ end
35
+
30
36
  raise "Application does not have web platform" unless install
31
37
  install
32
38
  end
@@ -60,14 +66,20 @@ module Strobe
60
66
 
61
67
  request do
62
68
  qs = []
63
- qs << "environment=#{environment}" if environment
64
69
  qs << "message=#{message}" if message
65
- qs << "deploy=#{sha}"
66
70
  qs << "application_id=#{id}"
67
71
 
68
72
  uri = URI.escape("/deploys?#{qs.join('&')}")
69
73
 
70
- response = connection.post(uri)
74
+ body = { :deploy => sha }
75
+ body[:environment] = environment if environment
76
+
77
+ headers = {
78
+ "Content-Type" => "application/json",
79
+ "Accept" => "application/json"
80
+ }
81
+
82
+ response = connection.post(uri, body, headers)
71
83
  response
72
84
  end
73
85
 
@@ -158,17 +170,9 @@ module Strobe
158
170
  add_directory(m, project_path, "strobe/**/*")
159
171
  end
160
172
 
161
- # Make sure to build bpm before add_directory **/* so
162
- # we get the changes from the rebuild
163
- if project = opts[:bpm_project]
164
- project.rebuild_dependency_list(nil, false)
165
- project.build :production, true
166
- end
167
-
168
173
  # Add all files in current directory
169
174
  add_directory(m, ".", "**/*")
170
175
 
171
-
172
176
  if opts[:sproutcore]
173
177
  picked_root_app = false
174
178
 
@@ -6,6 +6,7 @@ module Strobe
6
6
  key :id, String
7
7
 
8
8
  has 1, :application
9
+ has 1, :environment, :include => true
9
10
  has n, :builds
10
11
  end
11
12
  end
@@ -0,0 +1,9 @@
1
+ module Strobe
2
+ module Resources
3
+ class Environment
4
+ include Resource::Collection
5
+
6
+ key :id, String
7
+ end
8
+ end
9
+ end
@@ -6,7 +6,7 @@ module Strobe
6
6
  has 1, :application
7
7
 
8
8
  def update_uri
9
- "/platform_installs/#{self[:id]}/configuration"
9
+ "/platform_installs/#{self[:id]}/pages/configuration"
10
10
  end
11
11
 
12
12
  def web?
@@ -0,0 +1,19 @@
1
+ module Strobe
2
+ module Retryable
3
+ def retry_on_error(e, retries = 2)
4
+ e = Array.wrap(e)
5
+
6
+ tries = 0
7
+ begin
8
+ yield
9
+ rescue *e
10
+ tries += 1
11
+ if tries <= retries
12
+ retry
13
+ else
14
+ raise
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -1,3 +1,3 @@
1
1
  module Strobe
2
- VERSION = "0.3.10"
2
+ VERSION = "0.3.11"
3
3
  end
metadata CHANGED
@@ -1,116 +1,113 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: strobe
3
- version: !ruby/object:Gem::Version
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.11
4
5
  prerelease:
5
- version: 0.3.10
6
6
  platform: ruby
7
- authors:
7
+ authors:
8
8
  - Carl Lerche
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
-
13
- date: 2011-10-03 00:00:00 +02:00
14
- default_executable:
15
- dependencies:
16
- - !ruby/object:Gem::Dependency
12
+ date: 2011-10-21 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
17
15
  name: activemodel
18
- prerelease: false
19
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: &2153265580 !ruby/object:Gem::Requirement
20
17
  none: false
21
- requirements:
18
+ requirements:
22
19
  - - ~>
23
- - !ruby/object:Gem::Version
20
+ - !ruby/object:Gem::Version
24
21
  version: 3.0.0
25
22
  type: :runtime
26
- version_requirements: *id001
27
- - !ruby/object:Gem::Dependency
28
- name: mime-types
29
23
  prerelease: false
30
- requirement: &id002 !ruby/object:Gem::Requirement
24
+ version_requirements: *2153265580
25
+ - !ruby/object:Gem::Dependency
26
+ name: mime-types
27
+ requirement: &2153419600 !ruby/object:Gem::Requirement
31
28
  none: false
32
- requirements:
29
+ requirements:
33
30
  - - ~>
34
- - !ruby/object:Gem::Version
31
+ - !ruby/object:Gem::Version
35
32
  version: 1.16.0
36
33
  type: :runtime
37
- version_requirements: *id002
38
- - !ruby/object:Gem::Dependency
39
- name: rack
40
34
  prerelease: false
41
- requirement: &id003 !ruby/object:Gem::Requirement
35
+ version_requirements: *2153419600
36
+ - !ruby/object:Gem::Dependency
37
+ name: rack
38
+ requirement: &2154297300 !ruby/object:Gem::Requirement
42
39
  none: false
43
- requirements:
40
+ requirements:
44
41
  - - ~>
45
- - !ruby/object:Gem::Version
42
+ - !ruby/object:Gem::Version
46
43
  version: 1.3.0
47
44
  type: :runtime
48
- version_requirements: *id003
49
- - !ruby/object:Gem::Dependency
50
- name: thin
51
45
  prerelease: false
52
- requirement: &id004 !ruby/object:Gem::Requirement
46
+ version_requirements: *2154297300
47
+ - !ruby/object:Gem::Dependency
48
+ name: thin
49
+ requirement: &2154496680 !ruby/object:Gem::Requirement
53
50
  none: false
54
- requirements:
51
+ requirements:
55
52
  - - ~>
56
- - !ruby/object:Gem::Version
53
+ - !ruby/object:Gem::Version
57
54
  version: 1.2.0
58
55
  type: :runtime
59
- version_requirements: *id004
60
- - !ruby/object:Gem::Dependency
61
- name: em-http-request
62
56
  prerelease: false
63
- requirement: &id005 !ruby/object:Gem::Requirement
57
+ version_requirements: *2154496680
58
+ - !ruby/object:Gem::Dependency
59
+ name: em-http-request
60
+ requirement: &2154620040 !ruby/object:Gem::Requirement
64
61
  none: false
65
- requirements:
62
+ requirements:
66
63
  - - ~>
67
- - !ruby/object:Gem::Version
64
+ - !ruby/object:Gem::Version
68
65
  version: 1.0.0.beta
69
66
  type: :runtime
70
- version_requirements: *id005
71
- - !ruby/object:Gem::Dependency
72
- name: thor
73
67
  prerelease: false
74
- requirement: &id006 !ruby/object:Gem::Requirement
68
+ version_requirements: *2154620040
69
+ - !ruby/object:Gem::Dependency
70
+ name: thor
71
+ requirement: &2154721040 !ruby/object:Gem::Requirement
75
72
  none: false
76
- requirements:
73
+ requirements:
77
74
  - - ~>
78
- - !ruby/object:Gem::Version
75
+ - !ruby/object:Gem::Version
79
76
  version: 0.14.0
80
77
  type: :runtime
81
- version_requirements: *id006
82
- - !ruby/object:Gem::Dependency
83
- name: oauth
84
78
  prerelease: false
85
- requirement: &id007 !ruby/object:Gem::Requirement
79
+ version_requirements: *2154721040
80
+ - !ruby/object:Gem::Dependency
81
+ name: oauth
82
+ requirement: &2154760480 !ruby/object:Gem::Requirement
86
83
  none: false
87
- requirements:
84
+ requirements:
88
85
  - - ~>
89
- - !ruby/object:Gem::Version
86
+ - !ruby/object:Gem::Version
90
87
  version: 0.4.5
91
88
  type: :runtime
92
- version_requirements: *id007
93
- - !ruby/object:Gem::Dependency
94
- name: launchy
95
89
  prerelease: false
96
- requirement: &id008 !ruby/object:Gem::Requirement
90
+ version_requirements: *2154760480
91
+ - !ruby/object:Gem::Dependency
92
+ name: launchy
93
+ requirement: &2154762000 !ruby/object:Gem::Requirement
97
94
  none: false
98
- requirements:
99
- - - ">="
100
- - !ruby/object:Gem::Version
101
- version: "0"
95
+ requirements:
96
+ - - ! '>='
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
102
99
  type: :runtime
103
- version_requirements: *id008
104
- description: The client library for deploying applications to Strobe's HTML5 deployment platform
105
- email:
100
+ prerelease: false
101
+ version_requirements: *2154762000
102
+ description: The client library for deploying applications to Strobe's HTML5 deployment
103
+ platform
104
+ email:
106
105
  - carl@strobecorp.com
107
- executables:
106
+ executables:
108
107
  - strobe
109
108
  extensions: []
110
-
111
109
  extra_rdoc_files: []
112
-
113
- files:
110
+ files:
114
111
  - lib/strobe/addons/social/facebook.rb
115
112
  - lib/strobe/addons/social/twitter.rb
116
113
  - lib/strobe/addons/social.rb
@@ -142,6 +139,7 @@ files:
142
139
  - lib/strobe/resources/assignment.rb
143
140
  - lib/strobe/resources/build.rb
144
141
  - lib/strobe/resources/deploy.rb
142
+ - lib/strobe/resources/environment.rb
145
143
  - lib/strobe/resources/me.rb
146
144
  - lib/strobe/resources/membership.rb
147
145
  - lib/strobe/resources/platform_install.rb
@@ -149,6 +147,7 @@ files:
149
147
  - lib/strobe/resources/team.rb
150
148
  - lib/strobe/resources/user.rb
151
149
  - lib/strobe/resources.rb
150
+ - lib/strobe/retryable.rb
152
151
  - lib/strobe/sproutcore.rb
153
152
  - lib/strobe/validations.rb
154
153
  - lib/strobe/version.rb
@@ -157,33 +156,28 @@ files:
157
156
  - README.md
158
157
  - lib/strobe/certs/cacert.pem
159
158
  - bin/strobe
160
- has_rdoc: true
161
159
  homepage: http://rubygems.org/gems/strobe
162
160
  licenses: []
163
-
164
161
  post_install_message:
165
162
  rdoc_options: []
166
-
167
- require_paths:
163
+ require_paths:
168
164
  - lib
169
- required_ruby_version: !ruby/object:Gem::Requirement
165
+ required_ruby_version: !ruby/object:Gem::Requirement
170
166
  none: false
171
- requirements:
172
- - - ">="
173
- - !ruby/object:Gem::Version
174
- version: "0"
175
- required_rubygems_version: !ruby/object:Gem::Requirement
167
+ requirements:
168
+ - - ! '>='
169
+ - !ruby/object:Gem::Version
170
+ version: '0'
171
+ required_rubygems_version: !ruby/object:Gem::Requirement
176
172
  none: false
177
- requirements:
178
- - - ">="
179
- - !ruby/object:Gem::Version
173
+ requirements:
174
+ - - ! '>='
175
+ - !ruby/object:Gem::Version
180
176
  version: 1.3.6
181
177
  requirements: []
182
-
183
178
  rubyforge_project: strobe
184
- rubygems_version: 1.6.2
179
+ rubygems_version: 1.8.6
185
180
  signing_key:
186
181
  specification_version: 3
187
182
  summary: A deployment tool for HTML5 applications
188
183
  test_files: []
189
-