raygun 1.0.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.rubocop.yml +99 -0
- data/.ruby-version +1 -1
- data/CHANGES.md +38 -0
- data/Gemfile +1 -1
- data/README.md +81 -39
- data/Rakefile +9 -1
- data/bin/raygun +2 -2
- data/bin/setup +6 -0
- data/lib/colorize.rb +55 -55
- data/lib/raygun/raygun.rb +159 -148
- data/lib/raygun/template_repo.rb +78 -0
- data/lib/raygun/version.rb +1 -1
- data/raygun.gemspec +13 -8
- data/spec/raygun/raygun.rb +3 -0
- data/spec/raygun/runner_spec.rb +27 -0
- data/spec/spec_helper.rb +1 -0
- metadata +76 -11
data/lib/raygun/raygun.rb
CHANGED
@@ -1,43 +1,47 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
8
|
-
|
9
|
-
|
1
|
+
require "optparse"
|
2
|
+
require "ostruct"
|
3
|
+
require "fileutils"
|
4
|
+
require "securerandom"
|
5
|
+
require "net/http"
|
6
|
+
require "open-uri"
|
7
|
+
require "json"
|
8
|
+
require "colorize"
|
9
|
+
|
10
|
+
require_relative "version"
|
11
|
+
require_relative "template_repo"
|
10
12
|
|
11
13
|
module Raygun
|
12
14
|
class Runner
|
13
|
-
CARBONFIVE_REPO =
|
15
|
+
CARBONFIVE_REPO = "carbonfive/raygun-rails"
|
16
|
+
C5_CONVENTIONS_REPO = "carbonfive/c5-conventions"
|
14
17
|
|
15
|
-
attr_accessor :target_dir, :app_dir, :app_name, :dash_name, :snake_name,
|
18
|
+
attr_accessor :target_dir, :app_dir, :app_name, :dash_name, :snake_name,
|
19
|
+
:camel_name, :title_name, :prototype_repo,
|
16
20
|
:current_ruby_version, :current_ruby_patch_level
|
17
21
|
|
18
22
|
def initialize(target_dir, prototype_repo)
|
19
23
|
@target_dir = target_dir
|
20
24
|
@app_dir = File.expand_path(target_dir.strip.to_s)
|
21
|
-
@app_name = File.basename(app_dir).gsub(/\s+/,
|
22
|
-
@dash_name = app_name.
|
23
|
-
@snake_name = app_name.
|
25
|
+
@app_name = File.basename(app_dir).gsub(/\s+/, "-")
|
26
|
+
@dash_name = app_name.tr("_", "-")
|
27
|
+
@snake_name = app_name.tr("-", "_")
|
24
28
|
@camel_name = camelize(snake_name)
|
25
29
|
@title_name = titleize(snake_name)
|
26
30
|
@prototype_repo = prototype_repo
|
27
31
|
|
28
32
|
@current_ruby_version = RUBY_VERSION
|
29
|
-
@current_ruby_patch_level = if RUBY_VERSION <
|
30
|
-
|
33
|
+
@current_ruby_patch_level = if RUBY_VERSION < "2.1.0" # Ruby adopted semver starting with 2.1.0.
|
34
|
+
"#{RUBY_VERSION}-p#{RUBY_PATCHLEVEL}"
|
31
35
|
else
|
32
|
-
|
36
|
+
RUBY_VERSION.to_s
|
33
37
|
end
|
34
38
|
end
|
35
39
|
|
36
40
|
def check_target
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
+
return if Dir["#{@app_dir}/*"].empty?
|
42
|
+
|
43
|
+
puts "Misfire! The target directory isn't empty... aim elsewhere.".colorize(:light_red)
|
44
|
+
exit 1
|
41
45
|
end
|
42
46
|
|
43
47
|
def fetch_prototype
|
@@ -45,26 +49,26 @@ module Raygun
|
|
45
49
|
$stdout.flush
|
46
50
|
|
47
51
|
# Check if we can connect, or fail gracefully and use the latest cached version.
|
48
|
-
|
49
|
-
|
50
|
-
tarball_url
|
52
|
+
repo = TemplateRepo.new(prototype_repo)
|
53
|
+
name = repo.name
|
54
|
+
tarball_url = repo.tarball
|
55
|
+
sha = repo.sha
|
51
56
|
|
52
|
-
print " #{
|
57
|
+
print " #{name}.".colorize(:white)
|
53
58
|
$stdout.flush
|
54
59
|
|
55
60
|
cached_prototypes_dir = File.join(Dir.home, ".raygun")
|
56
|
-
@prototype = "#{cached_prototypes_dir}/#{
|
61
|
+
@prototype = "#{cached_prototypes_dir}/#{name.gsub("/", "--")}-#{sha}.tar.gz"
|
57
62
|
|
58
63
|
# Do we already have the tarball cached under ~/.raygun?
|
59
|
-
if File.
|
64
|
+
if File.exist?(@prototype)
|
60
65
|
puts " Using cached version.".colorize(:yellow)
|
61
66
|
else
|
62
67
|
print " Downloading...".colorize(:yellow)
|
63
68
|
$stdout.flush
|
64
69
|
|
65
70
|
# Download the tarball and install in the cache.
|
66
|
-
Dir.mkdir(cached_prototypes_dir,
|
67
|
-
|
71
|
+
Dir.mkdir(cached_prototypes_dir, 0o755) unless Dir.exist?(cached_prototypes_dir)
|
68
72
|
shell "curl -s -L #{tarball_url} -o #{@prototype}"
|
69
73
|
puts " done!".colorize(:yellow)
|
70
74
|
end
|
@@ -72,50 +76,56 @@ module Raygun
|
|
72
76
|
|
73
77
|
def check_raygun_version
|
74
78
|
required_raygun_version =
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
end
|
79
|
+
`tar xfz #{@prototype} --include "*.raygun-version" -O 2> /dev/null`.chomp ||
|
80
|
+
::Raygun::VERSION
|
81
|
+
return unless Gem::Version.new(required_raygun_version) > Gem::Version.new(::Raygun::VERSION)
|
82
|
+
|
83
|
+
puts ""
|
84
|
+
print "Hold up!".colorize(:red)
|
85
|
+
print " This version of the raygun gem (".colorize(:light_red)
|
86
|
+
print "#{::Raygun::VERSION})".colorize(:white)
|
87
|
+
print " is too old to generate this application (needs ".colorize(:light_red)
|
88
|
+
print required_raygun_version.to_s.colorize(:white)
|
89
|
+
puts " or newer).".colorize(:light_red)
|
90
|
+
puts ""
|
91
|
+
print "Please update the gem by running ".colorize(:light_red)
|
92
|
+
print "gem update raygun".colorize(:white)
|
93
|
+
puts ", and try again. Thanks!".colorize(:light_red)
|
94
|
+
puts ""
|
95
|
+
exit 1
|
93
96
|
end
|
94
97
|
|
95
98
|
def copy_prototype
|
96
99
|
FileUtils.mkdir_p(app_dir)
|
97
100
|
|
98
|
-
shell "tar xfz #{@prototype} -C #{app_dir}"
|
101
|
+
shell "tar xfz #{@prototype} -C \"#{app_dir}\""
|
99
102
|
|
100
103
|
# Github includes an extra directory layer in the tag tarball.
|
101
104
|
extraneous_dir = Dir.glob("#{app_dir}/*").first
|
102
105
|
dirs_to_move = Dir.glob("#{extraneous_dir}/*", File::FNM_DOTMATCH)
|
103
|
-
|
106
|
+
.reject { |d| %w[. ..].include?(File.basename(d)) }
|
104
107
|
|
105
108
|
FileUtils.mv dirs_to_move, app_dir
|
106
109
|
FileUtils.remove_dir extraneous_dir
|
110
|
+
|
111
|
+
fetch_rubocop_file if @prototype_repo == CARBONFIVE_REPO
|
107
112
|
end
|
108
113
|
|
109
114
|
def rename_new_app
|
110
115
|
Dir.chdir(app_dir) do
|
111
116
|
{
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
117
|
+
"AppPrototype" => camel_name,
|
118
|
+
"app-prototype" => dash_name,
|
119
|
+
"app_prototype" => snake_name,
|
120
|
+
"App Prototype" => title_name
|
116
121
|
}.each do |proto_name, new_name|
|
117
122
|
shell "find . -type f -print | xargs #{sed_i} 's/#{proto_name}/#{new_name}/g'"
|
118
123
|
end
|
124
|
+
|
125
|
+
%w[d f].each do |find_type|
|
126
|
+
shell "find . -depth -type #{find_type} -name '*app_prototype*' " \
|
127
|
+
"-exec bash -c 'mv $0 ${0/app_prototype/#{snake_name}}' {} \\;"
|
128
|
+
end
|
119
129
|
end
|
120
130
|
end
|
121
131
|
|
@@ -144,26 +154,33 @@ module Raygun
|
|
144
154
|
def initialize_git
|
145
155
|
Dir.chdir(app_dir) do
|
146
156
|
shell "git init"
|
157
|
+
shell "git checkout -q -b main"
|
147
158
|
shell "git add -A ."
|
148
159
|
shell "git commit -m 'Raygun-zapped skeleton.'"
|
149
160
|
end
|
150
161
|
end
|
151
162
|
|
163
|
+
# rubocop:disable Metrics/AbcSize
|
152
164
|
def print_plan
|
153
|
-
puts
|
165
|
+
puts " ____ ".colorize(:light_yellow)
|
154
166
|
puts ' / __ \____ ___ ______ ___ ______ '.colorize(:light_yellow)
|
155
167
|
puts ' / /_/ / __ `/ / / / __ `/ / / / __ \ '.colorize(:light_yellow)
|
156
|
-
puts
|
168
|
+
puts " / _, _/ /_/ / /_/ / /_/ / /_/ / / / / ".colorize(:light_yellow)
|
157
169
|
puts ' /_/ |_|\__,_/\__, /\__, /\__,_/_/ /_/ '.colorize(:light_yellow)
|
158
|
-
puts
|
170
|
+
puts " /____//____/ ".colorize(:light_yellow)
|
159
171
|
puts
|
160
|
-
puts "Raygun will create new app in directory:".colorize(:yellow) +
|
172
|
+
puts "Raygun will create new app in directory:".colorize(:yellow) +
|
173
|
+
" #{target_dir}".colorize(:yellow) + "...".colorize(:yellow)
|
161
174
|
puts
|
162
|
-
puts "-".colorize(:blue) + " Application Name:".colorize(:light_blue) +
|
163
|
-
|
164
|
-
puts "-".colorize(:blue) + "
|
175
|
+
puts "-".colorize(:blue) + " Application Name:".colorize(:light_blue) +
|
176
|
+
" #{title_name}".colorize(:light_reen)
|
177
|
+
puts "-".colorize(:blue) + " Project Template:".colorize(:light_blue) +
|
178
|
+
" #{prototype_repo}".colorize(:light_reen)
|
179
|
+
puts "-".colorize(:blue) + " Ruby Version: ".colorize(:light_blue) +
|
180
|
+
" #{@current_ruby_patch_level}".colorize(:light_reen)
|
165
181
|
puts
|
166
182
|
end
|
183
|
+
# rubocop:enable Metrics/AbcSize
|
167
184
|
|
168
185
|
def print_next_steps
|
169
186
|
if @prototype_repo == CARBONFIVE_REPO
|
@@ -172,29 +189,30 @@ module Raygun
|
|
172
189
|
print_next_steps_for_custom_repo
|
173
190
|
end
|
174
191
|
end
|
175
|
-
|
192
|
+
|
193
|
+
# rubocop:disable Metrics/AbcSize
|
176
194
|
def print_next_steps_carbon_five
|
177
195
|
puts ""
|
178
196
|
puts "Zap! Your application is ready. Next steps...".colorize(:yellow)
|
179
197
|
puts ""
|
180
|
-
puts "# Install updated dependencies".colorize(:light_green)
|
198
|
+
puts "# Install updated dependencies and prepare the database".colorize(:light_green)
|
181
199
|
puts "$".colorize(:blue) + " cd #{target_dir}".colorize(:light_blue)
|
182
|
-
puts "$".colorize(:blue) + "
|
183
|
-
puts "$".colorize(:blue) + " bundle".colorize(:light_blue)
|
184
|
-
puts ""
|
185
|
-
puts "# Prepare the database: schema and reference / sample data".colorize(:light_green)
|
186
|
-
puts "$".colorize(:blue) + " rake db:setup db:sample_data".colorize(:light_blue)
|
200
|
+
puts "$".colorize(:blue) + " bin/setup".colorize(:light_blue)
|
187
201
|
puts ""
|
188
202
|
puts "# Run the specs (they should all pass)".colorize(:light_green)
|
189
|
-
puts "$".colorize(:blue) + " rake".colorize(:light_blue)
|
203
|
+
puts "$".colorize(:blue) + " bin/rake".colorize(:light_blue)
|
190
204
|
puts ""
|
191
205
|
puts "# Run the app and check things out".colorize(:light_green)
|
192
|
-
puts "$".colorize(:blue) + "
|
206
|
+
puts "$".colorize(:blue) + " heroku local".colorize(:light_blue)
|
193
207
|
puts "$".colorize(:blue) + " open http://localhost:3000".colorize(:light_blue)
|
194
208
|
puts ""
|
209
|
+
puts "# For some suggested next steps, check out the raygun README".colorize(:light_green)
|
210
|
+
puts "$".colorize(:blue) + " open https://github.com/carbonfive/raygun/#next-steps".colorize(:light_blue)
|
211
|
+
puts ""
|
195
212
|
puts "Enjoy your Carbon Five flavored Rails application!".colorize(:yellow)
|
196
213
|
end
|
197
|
-
|
214
|
+
# rubocop:enable Metrics/AbcSize
|
215
|
+
|
198
216
|
def print_next_steps_for_custom_repo
|
199
217
|
puts ""
|
200
218
|
puts "Zap! Your application is ready.".colorize(:yellow)
|
@@ -204,111 +222,104 @@ module Raygun
|
|
204
222
|
|
205
223
|
protected
|
206
224
|
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
uri = URI.parse(url)
|
211
|
-
http = Net::HTTP.new(uri.host, uri.port)
|
212
|
-
http.use_ssl = true
|
213
|
-
request = Net::HTTP::Get.new(URI.encode(url))
|
214
|
-
|
215
|
-
response = http.request(request)
|
216
|
-
|
217
|
-
unless response.code == "200"
|
218
|
-
puts ""
|
219
|
-
print "Whoops - need to try again!".colorize(:red)
|
220
|
-
puts ""
|
221
|
-
print "We could not find (".colorize(:light_red)
|
222
|
-
print "#{repo}".colorize(:white)
|
223
|
-
print ") on github.".colorize(:light_red)
|
224
|
-
puts ""
|
225
|
-
print "The response from github was a (".colorize(:light_red)
|
226
|
-
print "#{response.code}".colorize(:white)
|
227
|
-
puts ") which I'm sure you can fix right up!".colorize(:light_red)
|
228
|
-
puts ""
|
229
|
-
exit 1
|
230
|
-
end
|
225
|
+
def fetch_rubocop_file
|
226
|
+
sha = shell("git ls-remote https://github.com/#{C5_CONVENTIONS_REPO} master") || ""
|
227
|
+
sha = sha.slice(0..6)
|
231
228
|
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
puts
|
246
|
-
|
229
|
+
rubocop_file = "https://raw.githubusercontent.com/#{C5_CONVENTIONS_REPO}/master/rubocop/rubocop.yml"
|
230
|
+
begin
|
231
|
+
rubocop_contents = URI.open(rubocop_file)
|
232
|
+
IO.write("#{@app_dir}/.rubocop.yml", <<~RUBOCOP_YML)
|
233
|
+
# Sourced from #{C5_CONVENTIONS_REPO} @ #{sha}
|
234
|
+
#
|
235
|
+
# If you make changes to this file, consider opening
|
236
|
+
# a PR to backport them to the c5-conventions repo:
|
237
|
+
# https://github.com/#{C5_CONVENTIONS_REPO}/blob/master/rubocop/rubocop.yml
|
238
|
+
|
239
|
+
#{rubocop_contents.string}
|
240
|
+
RUBOCOP_YML
|
241
|
+
rescue Errno::ENOENT, OpenURI::HTTPError => e
|
242
|
+
puts ""
|
243
|
+
puts "Failed to find the CarbonFive conventions rubocop file at #{rubocop_file}".colorize(:light_red)
|
244
|
+
puts "Error: #{e}".colorize(:light_red)
|
245
|
+
puts "You'll have to manage you're own `.rubocop.yml` setup".colorize(:light_red)
|
247
246
|
end
|
248
|
-
|
249
|
-
result
|
250
247
|
end
|
251
248
|
|
252
249
|
def camelize(string)
|
253
250
|
result = string.sub(/^[a-z\d]*/) { $&.capitalize }
|
254
|
-
result.gsub(
|
251
|
+
result.gsub(%r{(?:_|(/))([a-z\d]*)}) { "#{Regexp.last_match(1)}#{Regexp.last_match(2).capitalize}" }
|
255
252
|
end
|
256
253
|
|
257
254
|
def titleize(underscored_string)
|
258
|
-
result = underscored_string.
|
259
|
-
result.gsub(/\b('?[a-z])/) {
|
255
|
+
result = underscored_string.tr("_", " ")
|
256
|
+
result.gsub(/\b('?[a-z])/) { Regexp.last_match(1).capitalize }
|
260
257
|
end
|
261
258
|
|
262
259
|
# Distinguish BSD vs GNU sed with the --version flag (only present in GNU sed).
|
263
260
|
def sed_i
|
264
|
-
@
|
265
|
-
|
266
|
-
|
267
|
-
|
261
|
+
@sed_i ||= begin
|
262
|
+
`sed --version &> /dev/null`
|
263
|
+
$?.success? ? "sed -i" : "sed -i ''"
|
264
|
+
end
|
268
265
|
end
|
269
266
|
|
270
267
|
# Run a shell command and raise an exception if it fails.
|
271
268
|
def shell(command)
|
272
|
-
|
269
|
+
output = `#{command}`
|
273
270
|
raise "#{command} failed with status #{$?.exitstatus}." unless $?.success?
|
274
|
-
end
|
275
271
|
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
options = OpenStruct.new
|
280
|
-
options.target_dir = nil
|
281
|
-
options.prototype_repo = CARBONFIVE_REPO
|
282
|
-
|
283
|
-
parser = OptionParser.new do |opts|
|
284
|
-
opts.banner = "Usage: raygun [options] NEW_APP_DIRECTORY"
|
272
|
+
output
|
273
|
+
end
|
285
274
|
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
275
|
+
class << self
|
276
|
+
# rubocop:disable Metrics/MethodLength
|
277
|
+
def parse(_args)
|
278
|
+
raygun = nil
|
279
|
+
|
280
|
+
options = OpenStruct.new
|
281
|
+
options.target_dir = nil
|
282
|
+
options.prototype_repo = CARBONFIVE_REPO
|
283
|
+
|
284
|
+
parser = OptionParser.new do |opts|
|
285
|
+
opts.banner = "Usage: raygun [options] NEW_APP_DIRECTORY"
|
286
|
+
|
287
|
+
opts.on("-h", "--help", "Show raygun usage") do
|
288
|
+
usage_and_exit(opts)
|
289
|
+
end
|
290
|
+
opts.on(
|
291
|
+
"-p",
|
292
|
+
"--prototype [github_repo]",
|
293
|
+
"Prototype github repo (e.g. carbonfive/raygun-rails)."
|
294
|
+
) do |prototype|
|
295
|
+
options.prototype_repo = prototype
|
296
|
+
end
|
297
|
+
|
298
|
+
opts.on("-v", "--version", "Print the version number") do
|
299
|
+
puts Raygun::VERSION
|
300
|
+
exit 1
|
301
|
+
end
|
291
302
|
end
|
292
|
-
end
|
293
303
|
|
294
|
-
|
295
|
-
|
296
|
-
|
304
|
+
begin
|
305
|
+
parser.parse!
|
306
|
+
options.target_dir = ARGV.first
|
297
307
|
|
298
|
-
|
308
|
+
raise OptionParser::InvalidOption if options.target_dir.nil?
|
299
309
|
|
300
|
-
|
310
|
+
raygun = Raygun::Runner.new(options.target_dir, options.prototype_repo)
|
311
|
+
rescue OptionParser::InvalidOption
|
312
|
+
usage_and_exit(parser)
|
313
|
+
end
|
301
314
|
|
302
|
-
|
303
|
-
usage_and_exit(parser)
|
315
|
+
raygun
|
304
316
|
end
|
317
|
+
# rubocop:enable Metrics/MethodLength
|
305
318
|
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
puts parser
|
311
|
-
exit 1
|
319
|
+
def usage_and_exit(parser)
|
320
|
+
puts parser
|
321
|
+
exit 1
|
322
|
+
end
|
312
323
|
end
|
313
324
|
end
|
314
325
|
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
module Raygun
|
2
|
+
class TemplateRepo
|
3
|
+
attr_reader :name, :branch, :tarball, :sha
|
4
|
+
|
5
|
+
def initialize(repo)
|
6
|
+
@name, @branch = repo.split("#").map(&:strip)
|
7
|
+
fetch
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def fetch
|
13
|
+
return if @branch && @sha
|
14
|
+
|
15
|
+
@branch ? fetch_branches : fetch_tags
|
16
|
+
end
|
17
|
+
|
18
|
+
def handle_github_error(response)
|
19
|
+
puts ""
|
20
|
+
print "Whoops - need to try again!".colorize(:red)
|
21
|
+
puts ""
|
22
|
+
print "We could not find (".colorize(:light_red)
|
23
|
+
print name.to_s.colorize(:white)
|
24
|
+
print "##{branch}".colorize(:white) if @branch
|
25
|
+
print ") on github.".colorize(:light_red)
|
26
|
+
puts ""
|
27
|
+
print "The response from github was a (".colorize(:light_red)
|
28
|
+
print response.code.to_s.colorize(:white)
|
29
|
+
puts ") which I'm sure you can fix right up!".colorize(:light_red)
|
30
|
+
puts ""
|
31
|
+
exit 1
|
32
|
+
end
|
33
|
+
|
34
|
+
def handle_missing_tag_error
|
35
|
+
puts ""
|
36
|
+
print "Whoops - need to try again!".colorize(:red)
|
37
|
+
puts ""
|
38
|
+
print "We could not find any tags in the repo (".colorize(:light_red)
|
39
|
+
print name.to_s.colorize(:white)
|
40
|
+
print ") on github.".colorize(:light_red)
|
41
|
+
puts ""
|
42
|
+
print "Raygun uses the 'largest' tag in a repository, " \
|
43
|
+
"where tags are sorted alphanumerically.".colorize(:light_red)
|
44
|
+
puts ""
|
45
|
+
print "E.g., tag 'v.0.10.0' > 'v.0.9.9' and 'x' > 'a'.".colorize(:light_red)
|
46
|
+
print ""
|
47
|
+
puts ""
|
48
|
+
exit 1
|
49
|
+
end
|
50
|
+
|
51
|
+
def fetch_branches
|
52
|
+
response = http_get("https://api.github.com/repos/#{name}/branches/#{branch}")
|
53
|
+
handle_github_error(response) unless response.code == "200"
|
54
|
+
result = JSON.parse(response.body)
|
55
|
+
@sha = result["commit"]["sha"]
|
56
|
+
@tarball = result["_links"]["html"].gsub(%r{/tree/#{branch}}, "/archive/#{branch}.tar.gz")
|
57
|
+
end
|
58
|
+
|
59
|
+
def fetch_tags
|
60
|
+
response = http_get("https://api.github.com/repos/#{name}/tags")
|
61
|
+
handle_github_error(response) unless response.code == "200"
|
62
|
+
|
63
|
+
result = JSON.parse(response.body).first
|
64
|
+
handle_missing_tag_error unless result
|
65
|
+
@sha = result["commit"]["sha"]
|
66
|
+
@tarball = result["tarball_url"]
|
67
|
+
end
|
68
|
+
|
69
|
+
def http_get(url)
|
70
|
+
uri = URI(url)
|
71
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
72
|
+
http.use_ssl = true
|
73
|
+
request = Net::HTTP::Get.new(uri)
|
74
|
+
|
75
|
+
http.request(request)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|