heroku_whiz 0.1.0 → 0.2.1
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 +4 -4
- checksums.yaml.gz.sig +0 -0
- data/lib/heroku_whiz.rb +269 -55
- data.tar.gz.sig +0 -0
- metadata +22 -2
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c8fa80bb83fdb773d2b05d79c4df5e1f176de51608c90eb8e24506e88c22027f
|
4
|
+
data.tar.gz: 2a3c0e94b9737149aefa1e10148e88bb1875c62be15775807d33edb75859e155
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1f00da4e02b5bd3ec99079d64a085b08581d2f1ce326e4a293e5931f59eae480b81854b33e0c9930c14d9dc0604894e1de662008cbd2d25246cd06bddee09397
|
7
|
+
data.tar.gz: 6f9fbaa7facaf1227583a364f19c29be59ba7a6ab136e929e11fd8d386af995e8fe28b9897ece4cb25c7c5e14825d565ccc6c34f70657f9f636badbca128b3ef
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data/lib/heroku_whiz.rb
CHANGED
@@ -3,18 +3,40 @@
|
|
3
3
|
# file: heroku_whiz.rb
|
4
4
|
|
5
5
|
# created: 8th March 2022
|
6
|
-
#
|
6
|
+
# updated: 9th March 2022
|
7
|
+
|
8
|
+
# description: Handy (experimental) Heroku gem for noobs to create a
|
7
9
|
# simple Heroku app in a whiz!
|
8
10
|
|
9
|
-
#
|
10
|
-
#
|
11
|
+
# Q: Why Heroku?
|
12
|
+
#
|
13
|
+
# A: With a quick Twitter search for Free wen hosting, a
|
14
|
+
# popular Tweet mentioned Heroku
|
15
|
+
#
|
16
|
+
# 10 FREE Hosting/Clouds for Your website:
|
17
|
+
#
|
18
|
+
# ➡️ GitHub Pages
|
19
|
+
# ➡️ Heroku
|
20
|
+
# ➡️ Amazon Web Services (AWS)
|
21
|
+
# ➡️ Vercel
|
22
|
+
# ➡️ Firebase Hosting
|
23
|
+
# ➡️ Awardspace
|
24
|
+
# ➡️ Netlify
|
25
|
+
# ➡️ Google Cloud
|
26
|
+
# ➡️ Cloudflare
|
27
|
+
# ➡️ Weebly
|
28
|
+
#
|
29
|
+
|
30
|
+
|
31
|
+
# note: If this gem becomes outdated because of a change in the Heroku app
|
32
|
+
# setup process, please inform the owner of this project via *Issues*
|
11
33
|
# on GitHub (https://github.com/jrobertson/heroku_whiz).
|
12
34
|
|
13
35
|
|
14
36
|
require 'open-uri'
|
15
37
|
require 'fileutils'
|
16
38
|
require 'clipboard'
|
17
|
-
|
39
|
+
require 'launchy'
|
18
40
|
|
19
41
|
# Resources
|
20
42
|
#
|
@@ -23,8 +45,9 @@ require 'clipboard'
|
|
23
45
|
|
24
46
|
# Example usage:
|
25
47
|
#
|
26
|
-
# hw = HerokuWhiz.new dir: '/home/james/heroku', template: 'rack',
|
27
|
-
#
|
48
|
+
# hw = HerokuWhiz.new dir: '/home/james/heroku', template: 'rack',
|
49
|
+
# appname: 'hello2', debug: true
|
50
|
+
#
|
28
51
|
# hw.wipe_clean # removes the previous local app file directory
|
29
52
|
# hw.create # creates the local app file directory
|
30
53
|
# #hw.local_run # runs the web app locally
|
@@ -33,52 +56,44 @@ require 'clipboard'
|
|
33
56
|
# hw.app_url #=> e.g. https://frozen-dusk-65820.herokuapp.com/
|
34
57
|
|
35
58
|
|
36
|
-
class HerokuWhiz
|
37
59
|
|
38
|
-
|
39
|
-
verbose: true, debug: false)
|
60
|
+
class WhizBase
|
40
61
|
|
41
|
-
|
62
|
+
def initialize(app_path, verbose: true, debug: false)
|
42
63
|
|
43
|
-
@app_path =
|
64
|
+
@app_path, @verbose, debug = app_path, verbose, debug
|
44
65
|
|
45
|
-
|
46
66
|
end
|
47
67
|
|
48
|
-
def
|
49
|
-
|
50
|
-
app = `heroku config`.lines.first.split[1]
|
51
|
-
s = "https://#{app}.herokuapp.com/"
|
52
|
-
|
53
|
-
Clipboard.copy s
|
54
|
-
puts 'app URL copied to clipboard.'
|
55
|
-
|
56
|
-
return s
|
57
|
-
|
58
|
-
end
|
68
|
+
def create(add: nil)
|
59
69
|
|
60
|
-
|
70
|
+
config = %q(
|
71
|
+
run lambda {|env|
|
72
|
+
[200, {'Content-Type'=>'text/plain'}, StringIO.new("Hello World!\n")]
|
73
|
+
})
|
61
74
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
end
|
75
|
+
gemfile = %q(
|
76
|
+
source 'https://rubygems.org'
|
77
|
+
gem 'rack'
|
78
|
+
gem 'puma'
|
79
|
+
)
|
68
80
|
|
69
|
-
#
|
70
|
-
|
71
|
-
|
81
|
+
# Procfile: see https://devcenter.heroku.com/articles/procfile
|
82
|
+
# for more info
|
83
|
+
procfile = 'web: bundle exec rackup config.ru -p $PORT'
|
72
84
|
|
85
|
+
create_basefiles(config, gemfile, procfile)
|
73
86
|
end
|
74
87
|
|
88
|
+
# currently only removes a file directory if there are no user created files
|
89
|
+
#
|
75
90
|
def wipe_clean(setup=:local)
|
76
91
|
|
77
92
|
return unless File.exists? @app_path
|
78
93
|
|
79
94
|
# remove the app files
|
80
95
|
#
|
81
|
-
%w(Gemfile config.ru Gemfile.lock).each do |file|
|
96
|
+
%w(Gemfile config.ru Procfile Gemfile.lock).each do |file|
|
82
97
|
|
83
98
|
puts 'removing file ' + file if @debug
|
84
99
|
rm File.join(@app_path, file)
|
@@ -86,15 +101,20 @@ class HerokuWhiz
|
|
86
101
|
|
87
102
|
end
|
88
103
|
|
104
|
+
appname = heroku_app()
|
105
|
+
|
106
|
+
if setup == :both then
|
107
|
+
|
108
|
+
Clipboard.copy appname
|
109
|
+
puts 'App name ' + appname + ' copied to clipboard'
|
110
|
+
`heroku apps:destroy #{appname}`
|
111
|
+
|
112
|
+
end
|
113
|
+
|
89
114
|
rm_rf File.join(@app_path, '.git')
|
90
115
|
rmdir File.join(@app_path, '.git')
|
91
116
|
rmdir @app_path
|
92
117
|
|
93
|
-
return unless setup == :both
|
94
|
-
|
95
|
-
app = `heroku config`.lines.first.split[1]
|
96
|
-
`heroku apps:destroy --confirm #{app}`
|
97
|
-
|
98
118
|
end
|
99
119
|
|
100
120
|
def deploy()
|
@@ -110,24 +130,33 @@ class HerokuWhiz
|
|
110
130
|
|
111
131
|
#`heroku create #{@appname}`
|
112
132
|
|
113
|
-
# the above statement was commented out because there's a
|
133
|
+
# the above statement was commented out because there's a
|
114
134
|
# high probability the appname you have chosen has already been taken
|
115
135
|
# e.g. hello2 => hello2.herokuapp.com
|
116
|
-
|
136
|
+
|
137
|
+
puts 'Running *heroku create*' if @verbose
|
117
138
|
`heroku create`
|
118
|
-
sleep
|
139
|
+
sleep 3
|
119
140
|
|
141
|
+
puts 'Running *git push heroku master*' if @verbose
|
120
142
|
r = `git push heroku master`
|
143
|
+
sleep 10
|
121
144
|
|
122
145
|
end
|
123
146
|
|
124
147
|
def local_run()
|
148
|
+
|
149
|
+
#`heroku local &`
|
150
|
+
# attempted to use heroku local but couldn't automatically kill the
|
151
|
+
# process directly
|
152
|
+
|
125
153
|
`bundle exec rackup -p 9292 config.ru &`
|
126
154
|
end
|
127
155
|
|
128
156
|
def local_testrun()
|
129
157
|
|
130
|
-
r = IO.popen(
|
158
|
+
#r = IO.popen("heroku local")
|
159
|
+
r = IO.popen("bundle exec rackup -p 9292 config.ru")
|
131
160
|
puts 'r: ' + r.inspect if @debug
|
132
161
|
sleep 2
|
133
162
|
|
@@ -135,7 +164,6 @@ class HerokuWhiz
|
|
135
164
|
sleep 1
|
136
165
|
|
137
166
|
Process.kill('QUIT', r.pid)
|
138
|
-
|
139
167
|
|
140
168
|
puts 'SUCCESS! Ready to deploy' if s == "Hello World!\n"
|
141
169
|
|
@@ -143,29 +171,32 @@ class HerokuWhiz
|
|
143
171
|
|
144
172
|
private
|
145
173
|
|
146
|
-
def
|
174
|
+
def create_basefiles(config, gemfile, procfile)
|
147
175
|
|
148
176
|
FileUtils.mkdir_p @app_path
|
149
177
|
FileUtils.chdir @app_path
|
150
178
|
|
151
179
|
# write the config.ru file
|
152
180
|
#
|
153
|
-
config = %q(
|
154
|
-
run lambda do |env|
|
155
|
-
[200, {'Content-Type'=>'text/plain'}, StringIO.new("Hello World!\n")]
|
156
|
-
end)
|
157
181
|
File.write File.join(@app_path, 'config.ru'), config
|
182
|
+
sleep 0.2
|
158
183
|
|
159
184
|
# write the Gemfile
|
160
185
|
#
|
161
|
-
gemfile = %q(
|
162
|
-
source 'https://rubygems.org'
|
163
|
-
gem 'rack'
|
164
|
-
gem 'puma'
|
165
|
-
)
|
166
186
|
File.write File.join(@app_path, 'Gemfile'), gemfile
|
167
|
-
sleep 0.
|
187
|
+
sleep 0.2
|
168
188
|
|
189
|
+
# write the Procfile (although not essential it will flag a warning when
|
190
|
+
# deploying if the file doesn't exist
|
191
|
+
#
|
192
|
+
File.write File.join(@app_path, 'Procfile'), procfile
|
193
|
+
sleep 0.2
|
194
|
+
|
195
|
+
end
|
196
|
+
|
197
|
+
def heroku_app()
|
198
|
+
s = `heroku config`
|
199
|
+
s.lines.first.split[1] if s
|
169
200
|
end
|
170
201
|
|
171
202
|
def rm(file)
|
@@ -182,3 +213,186 @@ gem 'puma'
|
|
182
213
|
|
183
214
|
end
|
184
215
|
|
216
|
+
class SinatraWhizError < Exception
|
217
|
+
end
|
218
|
+
|
219
|
+
class SinatraWhiz < WhizBase
|
220
|
+
|
221
|
+
def initialize(app_path, verbose: true, debug: false)
|
222
|
+
super(app_path, verbose: verbose, debug: debug)
|
223
|
+
end
|
224
|
+
|
225
|
+
def create(add: nil)
|
226
|
+
|
227
|
+
if add then
|
228
|
+
|
229
|
+
FileUtils.mkdir_p @app_path
|
230
|
+
FileUtils.chdir @app_path
|
231
|
+
|
232
|
+
# copying the files into file directory @app_path
|
233
|
+
# ensure the files config.ru, Gemfile, and Procfile exist
|
234
|
+
#
|
235
|
+
a = Dir.glob(File.join(add,'*'))
|
236
|
+
files = a.map {|x| File.basename(x)}
|
237
|
+
|
238
|
+
expected = %w(config.ru Gemfile Procfile)
|
239
|
+
found = (files & expected)
|
240
|
+
|
241
|
+
if found.length < 3 then
|
242
|
+
raise SinatraWhizError, 'missing ' + (expected - found).join(', ')
|
243
|
+
end
|
244
|
+
|
245
|
+
puts 'copying files ' + a.inspect if @debug
|
246
|
+
|
247
|
+
a.each {|x| FileUtils.cp x, @app_path }
|
248
|
+
|
249
|
+
else
|
250
|
+
|
251
|
+
config = %q(
|
252
|
+
require './hello'
|
253
|
+
run Sinatra::Application
|
254
|
+
)
|
255
|
+
gemfile = %q(
|
256
|
+
source 'https://rubygems.org'
|
257
|
+
gem 'sinatra'
|
258
|
+
gem 'puma'
|
259
|
+
)
|
260
|
+
|
261
|
+
procfile = 'web: bundle exec rackup config.ru -p $PORT'
|
262
|
+
create_basefiles(config, gemfile, procfile)
|
263
|
+
|
264
|
+
hello_rb = %q(
|
265
|
+
require 'sinatra'
|
266
|
+
|
267
|
+
get '/' do
|
268
|
+
"Hello World!"
|
269
|
+
end
|
270
|
+
)
|
271
|
+
File.write File.join(@app_path, 'hello.rb'), hello_rb
|
272
|
+
sleep 0.3
|
273
|
+
|
274
|
+
end
|
275
|
+
|
276
|
+
end
|
277
|
+
|
278
|
+
def local_testrun()
|
279
|
+
r = IO.popen("bundle exec rackup -p 9292 config.ru")
|
280
|
+
puts 'r: ' + r.inspect if @debug
|
281
|
+
sleep 2
|
282
|
+
|
283
|
+
s = URI.open('http://127.0.0.1:9292').read
|
284
|
+
sleep 1
|
285
|
+
|
286
|
+
Process.kill('QUIT', r.pid)
|
287
|
+
|
288
|
+
puts 'SUCCESS! Ready to deploy' if s == "Hello World!"
|
289
|
+
end
|
290
|
+
|
291
|
+
def wipe_clean(setup=nil)
|
292
|
+
|
293
|
+
rm File.join(@app_path, 'hello.rb')
|
294
|
+
super(setup)
|
295
|
+
|
296
|
+
end
|
297
|
+
|
298
|
+
end
|
299
|
+
|
300
|
+
class HerokuWhiz
|
301
|
+
|
302
|
+
def initialize(dir: '.', template: 'rack', appname: File.basename(Dir.pwd),
|
303
|
+
verbose: true, debug: false)
|
304
|
+
|
305
|
+
@dir, @template, @appname, @verbose = dir, template, appname, verbose
|
306
|
+
|
307
|
+
@app_path = File.join(@dir, @appname)
|
308
|
+
FileUtils.chdir @app_path if File.exists? @app_path
|
309
|
+
|
310
|
+
case @template.to_sym
|
311
|
+
when :rack
|
312
|
+
@tapp = WhizBase.new @app_path, verbose: verbose, debug: debug
|
313
|
+
when :sinatra
|
314
|
+
@tapp = SinatraWhiz.new @app_path, verbose: verbose, debug: debug
|
315
|
+
end
|
316
|
+
|
317
|
+
end
|
318
|
+
|
319
|
+
def app_url()
|
320
|
+
|
321
|
+
s = "https://#{heroku_app()}.herokuapp.com/"
|
322
|
+
|
323
|
+
Clipboard.copy s
|
324
|
+
puts 'app URL copied to clipboard.'
|
325
|
+
|
326
|
+
return s
|
327
|
+
|
328
|
+
end
|
329
|
+
|
330
|
+
def app_open()
|
331
|
+
`heroku open`
|
332
|
+
end
|
333
|
+
|
334
|
+
def create(add: nil)
|
335
|
+
|
336
|
+
return unless @tapp
|
337
|
+
|
338
|
+
@tapp.create add: add
|
339
|
+
|
340
|
+
# build
|
341
|
+
`bundle install`
|
342
|
+
sleep 1
|
343
|
+
|
344
|
+
end
|
345
|
+
|
346
|
+
def goto(target)
|
347
|
+
|
348
|
+
case target.to_sym
|
349
|
+
when :apps
|
350
|
+
Launchy.open("https://dashboard.heroku.com/apps")
|
351
|
+
when :docs
|
352
|
+
Launchy.open('https://devcenter.heroku.com/articles/rack')
|
353
|
+
end
|
354
|
+
|
355
|
+
end
|
356
|
+
|
357
|
+
# currently only removes a file directory if there are no user created files
|
358
|
+
#
|
359
|
+
def wipe_clean(setup=:local)
|
360
|
+
|
361
|
+
return unless @tapp
|
362
|
+
|
363
|
+
@tapp.wipe_clean setup
|
364
|
+
|
365
|
+
end
|
366
|
+
|
367
|
+
def deploy()
|
368
|
+
|
369
|
+
return unless @tapp
|
370
|
+
|
371
|
+
@tapp.deploy
|
372
|
+
|
373
|
+
end
|
374
|
+
|
375
|
+
def local_run()
|
376
|
+
|
377
|
+
return unless @tapp
|
378
|
+
|
379
|
+
@tapp.local_run
|
380
|
+
|
381
|
+
end
|
382
|
+
|
383
|
+
def local_testrun()
|
384
|
+
|
385
|
+
return unless @tapp
|
386
|
+
|
387
|
+
@tapp.local_testrun()
|
388
|
+
|
389
|
+
end
|
390
|
+
|
391
|
+
private
|
392
|
+
|
393
|
+
def heroku_app()
|
394
|
+
s = `heroku config`
|
395
|
+
s.lines.first.split[1] if s
|
396
|
+
end
|
397
|
+
|
398
|
+
end
|
data.tar.gz.sig
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: heroku_whiz
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- James Robertson
|
@@ -35,7 +35,7 @@ cert_chain:
|
|
35
35
|
n5lICiaMyvvvMKfV1rE1Pz0tCPqOu++rZFRC9XbrR+Vio0ha4mHPPAUsvY2f9DtE
|
36
36
|
ZOz9jhKlb8t2o3xNUKH/e3WN
|
37
37
|
-----END CERTIFICATE-----
|
38
|
-
date: 2022-03-
|
38
|
+
date: 2022-03-09 00:00:00.000000000 Z
|
39
39
|
dependencies:
|
40
40
|
- !ruby/object:Gem::Dependency
|
41
41
|
name: clipboard
|
@@ -57,6 +57,26 @@ dependencies:
|
|
57
57
|
- - ">="
|
58
58
|
- !ruby/object:Gem::Version
|
59
59
|
version: 1.3.6
|
60
|
+
- !ruby/object:Gem::Dependency
|
61
|
+
name: launchy
|
62
|
+
requirement: !ruby/object:Gem::Requirement
|
63
|
+
requirements:
|
64
|
+
- - "~>"
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: '2.5'
|
67
|
+
- - ">="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: 2.5.0
|
70
|
+
type: :runtime
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - "~>"
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '2.5'
|
77
|
+
- - ">="
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: 2.5.0
|
60
80
|
description:
|
61
81
|
email: digital.robertson@gmail.com
|
62
82
|
executables: []
|
metadata.gz.sig
CHANGED
Binary file
|