raygun 1.0.2 → 1.2.0
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 +5 -5
- data/.circleci/config.yml +66 -0
- data/.rubocop.yml +99 -0
- data/.ruby-version +1 -1
- data/CHANGES.md +45 -0
- data/Gemfile +1 -1
- data/README.md +111 -36
- data/Rakefile +9 -1
- data/bin/raygun +2 -2
- data/bin/setup +6 -0
- data/lib/colorize.rb +55 -55
- data/lib/raygun/c5_conventions.rb +65 -0
- data/lib/raygun/raygun.rb +134 -148
- data/lib/raygun/template_repo.rb +78 -0
- data/lib/raygun/version.rb +1 -1
- data/raygun.gemspec +13 -8
- data/spec/raygun/c5_conventions_spec.rb +41 -0
- data/spec/spec_helper.rb +1 -0
- metadata +75 -10
data/Rakefile
CHANGED
data/bin/raygun
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
File.expand_path(
|
3
|
+
File.expand_path("../lib", __dir__).tap do |lib|
|
4
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
5
|
end
|
6
6
|
|
7
|
-
require
|
7
|
+
require "raygun/raygun"
|
8
8
|
|
9
9
|
raygun = Raygun::Runner.parse(ARGV)
|
10
10
|
|
data/bin/setup
ADDED
data/lib/colorize.rb
CHANGED
@@ -5,41 +5,40 @@
|
|
5
5
|
# want to add a gem dependency.
|
6
6
|
|
7
7
|
class String
|
8
|
-
|
9
8
|
#
|
10
9
|
# Colors Hash
|
11
10
|
#
|
12
11
|
COLORS = {
|
13
|
-
:
|
14
|
-
:
|
15
|
-
:
|
16
|
-
:
|
17
|
-
:
|
18
|
-
:
|
19
|
-
:
|
20
|
-
:
|
21
|
-
:
|
22
|
-
|
23
|
-
:
|
24
|
-
:
|
25
|
-
:
|
26
|
-
:
|
27
|
-
:
|
28
|
-
:
|
29
|
-
:
|
30
|
-
:
|
12
|
+
black: 0,
|
13
|
+
red: 1,
|
14
|
+
green: 2,
|
15
|
+
yellow: 3,
|
16
|
+
blue: 4,
|
17
|
+
magenta: 5,
|
18
|
+
cyan: 6,
|
19
|
+
white: 7,
|
20
|
+
default: 9,
|
21
|
+
|
22
|
+
light_black: 10,
|
23
|
+
light_red: 11,
|
24
|
+
light_green: 12,
|
25
|
+
light_yellow: 13,
|
26
|
+
light_blue: 14,
|
27
|
+
light_magenta: 15,
|
28
|
+
light_cyan: 16,
|
29
|
+
light_white: 17
|
31
30
|
}
|
32
31
|
|
33
32
|
#
|
34
33
|
# Modes Hash
|
35
34
|
#
|
36
35
|
MODES = {
|
37
|
-
:
|
36
|
+
default: 0, # Turn off all attributes
|
38
37
|
#:bright => 1, # Set bright mode
|
39
|
-
:
|
40
|
-
:
|
41
|
-
:
|
42
|
-
:
|
38
|
+
underline: 4, # Set underline mode
|
39
|
+
blink: 5, # Set blink mode
|
40
|
+
swap: 7, # Exchange foreground and background colors
|
41
|
+
hide: 8 # Hide text (foreground color would be the same as background)
|
43
42
|
}
|
44
43
|
|
45
44
|
protected
|
@@ -47,16 +46,14 @@ class String
|
|
47
46
|
#
|
48
47
|
# Set color values in new string intance
|
49
48
|
#
|
50
|
-
def
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
nil
|
59
|
-
end
|
49
|
+
def color_parameters(params)
|
50
|
+
return unless params.instance_of?(Hash)
|
51
|
+
|
52
|
+
@color = params[:color]
|
53
|
+
@background = params[:background]
|
54
|
+
@mode = params[:mode]
|
55
|
+
@uncolorized = params[:uncolorized]
|
56
|
+
self
|
60
57
|
end
|
61
58
|
|
62
59
|
public
|
@@ -77,22 +74,23 @@ class String
|
|
77
74
|
# puts "This is blue text on red".blue.on_red.blink
|
78
75
|
# puts "This is uncolorized".blue.on_red.uncolorize
|
79
76
|
#
|
80
|
-
|
77
|
+
# rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
78
|
+
def colorize(params)
|
81
79
|
return self unless STDOUT.isatty
|
82
80
|
|
83
81
|
begin
|
84
|
-
require
|
82
|
+
require "Win32/Console/ANSI" if RUBY_PLATFORM.match?(/win32/)
|
85
83
|
rescue LoadError
|
86
|
-
raise
|
84
|
+
raise "You must gem install win32console to use colorize on Windows"
|
87
85
|
end
|
88
86
|
|
89
87
|
color_parameters = {}
|
90
88
|
|
91
|
-
if
|
89
|
+
if params.instance_of?(Hash)
|
92
90
|
color_parameters[:color] = COLORS[params[:color]]
|
93
91
|
color_parameters[:background] = COLORS[params[:background]]
|
94
92
|
color_parameters[:mode] = MODES[params[:mode]]
|
95
|
-
elsif
|
93
|
+
elsif params.instance_of?(Symbol)
|
96
94
|
color_parameters[:color] = COLORS[params]
|
97
95
|
end
|
98
96
|
|
@@ -100,15 +98,18 @@ class String
|
|
100
98
|
color_parameters[:background] ||= @background ||= COLORS[:default]
|
101
99
|
color_parameters[:mode] ||= @mode ||= MODES[:default]
|
102
100
|
|
103
|
-
color_parameters[:uncolorized] ||= @uncolorized ||=
|
101
|
+
color_parameters[:uncolorized] ||= @uncolorized ||= dup
|
104
102
|
|
105
103
|
# calculate bright mode
|
106
104
|
color_parameters[:color] += 50 if color_parameters[:color] > 10
|
107
105
|
|
108
106
|
color_parameters[:background] += 50 if color_parameters[:background] > 10
|
109
107
|
|
110
|
-
"\033[#{color_parameters[:mode]};#{color_parameters[:color]+30}
|
108
|
+
"\033[#{color_parameters[:mode]};#{color_parameters[:color] + 30};"\
|
109
|
+
"#{color_parameters[:background] + 40}m#{color_parameters[:uncolorized]}\033[0m"\
|
110
|
+
.color_parameters(color_parameters)
|
111
111
|
end
|
112
|
+
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
112
113
|
|
113
114
|
#
|
114
115
|
# Return uncolorized string
|
@@ -127,37 +128,36 @@ class String
|
|
127
128
|
#
|
128
129
|
# Make some color and on_color methods
|
129
130
|
#
|
130
|
-
COLORS.each_key do |
|
131
|
+
COLORS.each_key do |key|
|
131
132
|
next if key == :default
|
132
133
|
|
133
134
|
define_method key do
|
134
|
-
|
135
|
+
colorize(color: key)
|
135
136
|
end
|
136
137
|
|
137
138
|
define_method "on_#{key}" do
|
138
|
-
|
139
|
+
colorize(background: key)
|
139
140
|
end
|
140
141
|
end
|
141
142
|
|
142
143
|
#
|
143
144
|
# Methods for modes
|
144
145
|
#
|
145
|
-
MODES.each_key do |
|
146
|
+
MODES.each_key do |key|
|
146
147
|
next if key == :default
|
147
148
|
|
148
149
|
define_method key do
|
149
|
-
|
150
|
+
colorize(mode: key)
|
150
151
|
end
|
151
152
|
end
|
152
153
|
|
153
154
|
class << self
|
154
|
-
|
155
155
|
#
|
156
156
|
# Return array of available modes used by colorize method
|
157
157
|
#
|
158
158
|
def modes
|
159
159
|
keys = []
|
160
|
-
MODES.each_key do |
|
160
|
+
MODES.each_key do |key|
|
161
161
|
keys << key
|
162
162
|
end
|
163
163
|
keys
|
@@ -168,7 +168,7 @@ class String
|
|
168
168
|
#
|
169
169
|
def colors
|
170
170
|
keys = []
|
171
|
-
COLORS.each_key do |
|
171
|
+
COLORS.each_key do |key|
|
172
172
|
keys << key
|
173
173
|
end
|
174
174
|
keys
|
@@ -177,16 +177,16 @@ class String
|
|
177
177
|
#
|
178
178
|
# Display color matrix with color names.
|
179
179
|
#
|
180
|
-
def color_matrix(
|
180
|
+
def color_matrix(txt = "[X]")
|
181
181
|
size = String.colors.length
|
182
|
-
String.colors.each do |
|
183
|
-
String.colors.each do |
|
184
|
-
print txt.colorize(
|
182
|
+
String.colors.each do |color|
|
183
|
+
String.colors.each do |back|
|
184
|
+
print txt.colorize(color: color, background: back)
|
185
185
|
end
|
186
186
|
puts " < #{color}"
|
187
187
|
end
|
188
|
-
String.colors.reverse.each_with_index do |
|
189
|
-
puts "#{"|".rjust(txt.length)*(size-index)} < #{back}"
|
188
|
+
String.colors.reverse.each_with_index do |back, index|
|
189
|
+
puts "#{"|".rjust(txt.length) * (size - index)} < #{back}"
|
190
190
|
end
|
191
191
|
""
|
192
192
|
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require "colorize"
|
2
|
+
require "open-uri"
|
3
|
+
|
4
|
+
module Raygun
|
5
|
+
class C5Conventions
|
6
|
+
REPO = "carbonfive/c5-conventions".freeze
|
7
|
+
|
8
|
+
SOURCES = [
|
9
|
+
"https://raw.githubusercontent.com/#{REPO}/main/rubocop/.rubocop.yml",
|
10
|
+
"https://raw.githubusercontent.com/#{REPO}/main/rubocop/.rubocop-common.yml",
|
11
|
+
"https://raw.githubusercontent.com/#{REPO}/main/rubocop/.rubocop-performance.yml",
|
12
|
+
"https://raw.githubusercontent.com/#{REPO}/main/rubocop/.rubocop-rails.yml",
|
13
|
+
"https://raw.githubusercontent.com/#{REPO}/main/rubocop/.rubocop-rspec.yml"
|
14
|
+
].freeze
|
15
|
+
|
16
|
+
ATTRIBUTION_HEADER = <<~TEXT
|
17
|
+
# Sourced from #{REPO} @ %<sha>s
|
18
|
+
#
|
19
|
+
# If you make changes to this file, consider opening a PR to backport them to the c5-conventions repo:
|
20
|
+
# https://github.com/#{REPO}
|
21
|
+
TEXT
|
22
|
+
|
23
|
+
# Install the latest copy of c5-conventions rubocop config in the given directory.
|
24
|
+
# If the latest files can't be downloaded from GitHub, print a warning, don't raise an exception.
|
25
|
+
# Any existing .rubocop.yml will be overwritten.
|
26
|
+
def self.install(target:, sources: SOURCES)
|
27
|
+
new(target: target, sources: sources).install
|
28
|
+
rescue Errno::ENOENT, OpenURI::HTTPError => e
|
29
|
+
puts ""
|
30
|
+
puts "Failed to install the CarbonFive conventions from the #{REPO} GitHub repo".colorize(:light_red)
|
31
|
+
puts "Error: #{e}".colorize(:light_red)
|
32
|
+
puts "You'll have to manage your own `.rubocop.yml` setup".colorize(:light_red)
|
33
|
+
end
|
34
|
+
|
35
|
+
def initialize(sources:, target:)
|
36
|
+
@sources = sources
|
37
|
+
@target = target
|
38
|
+
end
|
39
|
+
|
40
|
+
def install
|
41
|
+
sources.each do |url_str|
|
42
|
+
uri = URI(url_str)
|
43
|
+
contents = [attribution_header, uri.open.read].join("\n")
|
44
|
+
filename = File.basename(uri.path)
|
45
|
+
|
46
|
+
IO.write(File.join(target, filename), contents)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
private
|
51
|
+
|
52
|
+
attr_reader :sources, :target
|
53
|
+
|
54
|
+
def attribution_header
|
55
|
+
format(ATTRIBUTION_HEADER, sha: latest_commit_sha)
|
56
|
+
end
|
57
|
+
|
58
|
+
def latest_commit_sha
|
59
|
+
@latest_commit_sha ||= begin
|
60
|
+
stdout = `git ls-remote https://github.com/#{REPO} main`
|
61
|
+
stdout[/^(\h{7})/, 1] || "main"
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
data/lib/raygun/raygun.rb
CHANGED
@@ -1,43 +1,46 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
8
|
-
|
9
|
-
require_relative
|
1
|
+
require "optparse"
|
2
|
+
require "ostruct"
|
3
|
+
require "fileutils"
|
4
|
+
require "securerandom"
|
5
|
+
require "net/http"
|
6
|
+
require "json"
|
7
|
+
require "colorize"
|
8
|
+
|
9
|
+
require_relative "version"
|
10
|
+
require_relative "c5_conventions"
|
11
|
+
require_relative "template_repo"
|
10
12
|
|
11
13
|
module Raygun
|
12
14
|
class Runner
|
13
|
-
CARBONFIVE_REPO =
|
15
|
+
CARBONFIVE_REPO = "carbonfive/raygun-rails"
|
14
16
|
|
15
|
-
attr_accessor :target_dir, :app_dir, :app_name, :dash_name, :snake_name,
|
17
|
+
attr_accessor :target_dir, :app_dir, :app_name, :dash_name, :snake_name,
|
18
|
+
:camel_name, :title_name, :prototype_repo,
|
16
19
|
:current_ruby_version, :current_ruby_patch_level
|
17
20
|
|
18
21
|
def initialize(target_dir, prototype_repo)
|
19
22
|
@target_dir = target_dir
|
20
23
|
@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.
|
24
|
+
@app_name = File.basename(app_dir).gsub(/\s+/, "-")
|
25
|
+
@dash_name = app_name.tr("_", "-")
|
26
|
+
@snake_name = app_name.tr("-", "_")
|
24
27
|
@camel_name = camelize(snake_name)
|
25
28
|
@title_name = titleize(snake_name)
|
26
29
|
@prototype_repo = prototype_repo
|
27
30
|
|
28
31
|
@current_ruby_version = RUBY_VERSION
|
29
|
-
@current_ruby_patch_level = if RUBY_VERSION <
|
30
|
-
|
32
|
+
@current_ruby_patch_level = if RUBY_VERSION < "2.1.0" # Ruby adopted semver starting with 2.1.0.
|
33
|
+
"#{RUBY_VERSION}-p#{RUBY_PATCHLEVEL}"
|
31
34
|
else
|
32
|
-
|
35
|
+
RUBY_VERSION.to_s
|
33
36
|
end
|
34
37
|
end
|
35
38
|
|
36
39
|
def check_target
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
40
|
+
return if Dir["#{@app_dir}/*"].empty?
|
41
|
+
|
42
|
+
puts "Misfire! The target directory isn't empty... aim elsewhere.".colorize(:light_red)
|
43
|
+
exit 1
|
41
44
|
end
|
42
45
|
|
43
46
|
def fetch_prototype
|
@@ -45,26 +48,26 @@ module Raygun
|
|
45
48
|
$stdout.flush
|
46
49
|
|
47
50
|
# Check if we can connect, or fail gracefully and use the latest cached version.
|
48
|
-
|
49
|
-
|
50
|
-
tarball_url
|
51
|
+
repo = TemplateRepo.new(prototype_repo)
|
52
|
+
name = repo.name
|
53
|
+
tarball_url = repo.tarball
|
54
|
+
sha = repo.sha
|
51
55
|
|
52
|
-
print " #{
|
56
|
+
print " #{name}.".colorize(:white)
|
53
57
|
$stdout.flush
|
54
58
|
|
55
59
|
cached_prototypes_dir = File.join(Dir.home, ".raygun")
|
56
|
-
@prototype = "#{cached_prototypes_dir}/#{
|
60
|
+
@prototype = "#{cached_prototypes_dir}/#{name.gsub("/", "--")}-#{sha}.tar.gz"
|
57
61
|
|
58
62
|
# Do we already have the tarball cached under ~/.raygun?
|
59
|
-
if File.
|
63
|
+
if File.exist?(@prototype)
|
60
64
|
puts " Using cached version.".colorize(:yellow)
|
61
65
|
else
|
62
66
|
print " Downloading...".colorize(:yellow)
|
63
67
|
$stdout.flush
|
64
68
|
|
65
69
|
# Download the tarball and install in the cache.
|
66
|
-
Dir.mkdir(cached_prototypes_dir,
|
67
|
-
|
70
|
+
Dir.mkdir(cached_prototypes_dir, 0o755) unless Dir.exist?(cached_prototypes_dir)
|
68
71
|
shell "curl -s -L #{tarball_url} -o #{@prototype}"
|
69
72
|
puts " done!".colorize(:yellow)
|
70
73
|
end
|
@@ -72,24 +75,23 @@ module Raygun
|
|
72
75
|
|
73
76
|
def check_raygun_version
|
74
77
|
required_raygun_version =
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
end
|
78
|
+
`tar xfz #{@prototype} --include "*.raygun-version" -O 2> /dev/null`.chomp ||
|
79
|
+
::Raygun::VERSION
|
80
|
+
return unless Gem::Version.new(required_raygun_version) > Gem::Version.new(::Raygun::VERSION)
|
81
|
+
|
82
|
+
puts ""
|
83
|
+
print "Hold up!".colorize(:red)
|
84
|
+
print " This version of the raygun gem (".colorize(:light_red)
|
85
|
+
print "#{::Raygun::VERSION})".colorize(:white)
|
86
|
+
print " is too old to generate this application (needs ".colorize(:light_red)
|
87
|
+
print required_raygun_version.to_s.colorize(:white)
|
88
|
+
puts " or newer).".colorize(:light_red)
|
89
|
+
puts ""
|
90
|
+
print "Please update the gem by running ".colorize(:light_red)
|
91
|
+
print "gem update raygun".colorize(:white)
|
92
|
+
puts ", and try again. Thanks!".colorize(:light_red)
|
93
|
+
puts ""
|
94
|
+
exit 1
|
93
95
|
end
|
94
96
|
|
95
97
|
def copy_prototype
|
@@ -100,25 +102,28 @@ module Raygun
|
|
100
102
|
# Github includes an extra directory layer in the tag tarball.
|
101
103
|
extraneous_dir = Dir.glob("#{app_dir}/*").first
|
102
104
|
dirs_to_move = Dir.glob("#{extraneous_dir}/*", File::FNM_DOTMATCH)
|
103
|
-
|
105
|
+
.reject { |d| %w[. ..].include?(File.basename(d)) }
|
104
106
|
|
105
107
|
FileUtils.mv dirs_to_move, app_dir
|
106
108
|
FileUtils.remove_dir extraneous_dir
|
109
|
+
|
110
|
+
C5Conventions.install(target: app_dir) if @prototype_repo == CARBONFIVE_REPO
|
107
111
|
end
|
108
112
|
|
109
113
|
def rename_new_app
|
110
114
|
Dir.chdir(app_dir) do
|
111
115
|
{
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
+
"AppPrototype" => camel_name,
|
117
|
+
"app-prototype" => dash_name,
|
118
|
+
"app_prototype" => snake_name,
|
119
|
+
"App Prototype" => title_name
|
116
120
|
}.each do |proto_name, new_name|
|
117
121
|
shell "find . -type f -print | xargs #{sed_i} 's/#{proto_name}/#{new_name}/g'"
|
118
122
|
end
|
119
123
|
|
120
|
-
%w
|
121
|
-
shell "find . -depth -type #{find_type} -name '*app_prototype*'
|
124
|
+
%w[d f].each do |find_type|
|
125
|
+
shell "find . -depth -type #{find_type} -name '*app_prototype*' " \
|
126
|
+
"-exec bash -c 'mv $0 ${0/app_prototype/#{snake_name}}' {} \\;"
|
122
127
|
end
|
123
128
|
end
|
124
129
|
end
|
@@ -148,26 +153,33 @@ module Raygun
|
|
148
153
|
def initialize_git
|
149
154
|
Dir.chdir(app_dir) do
|
150
155
|
shell "git init"
|
156
|
+
shell "git checkout -q -b main"
|
151
157
|
shell "git add -A ."
|
152
158
|
shell "git commit -m 'Raygun-zapped skeleton.'"
|
153
159
|
end
|
154
160
|
end
|
155
161
|
|
162
|
+
# rubocop:disable Metrics/AbcSize
|
156
163
|
def print_plan
|
157
|
-
puts
|
164
|
+
puts " ____ ".colorize(:light_yellow)
|
158
165
|
puts ' / __ \____ ___ ______ ___ ______ '.colorize(:light_yellow)
|
159
166
|
puts ' / /_/ / __ `/ / / / __ `/ / / / __ \ '.colorize(:light_yellow)
|
160
|
-
puts
|
167
|
+
puts " / _, _/ /_/ / /_/ / /_/ / /_/ / / / / ".colorize(:light_yellow)
|
161
168
|
puts ' /_/ |_|\__,_/\__, /\__, /\__,_/_/ /_/ '.colorize(:light_yellow)
|
162
|
-
puts
|
169
|
+
puts " /____//____/ ".colorize(:light_yellow)
|
163
170
|
puts
|
164
|
-
puts "Raygun will create new app in directory:".colorize(:yellow) +
|
171
|
+
puts "Raygun will create new app in directory:".colorize(:yellow) +
|
172
|
+
" #{target_dir}".colorize(:yellow) + "...".colorize(:yellow)
|
165
173
|
puts
|
166
|
-
puts "-".colorize(:blue) + " Application Name:".colorize(:light_blue) +
|
167
|
-
|
168
|
-
puts "-".colorize(:blue) + "
|
174
|
+
puts "-".colorize(:blue) + " Application Name:".colorize(:light_blue) +
|
175
|
+
" #{title_name}".colorize(:light_reen)
|
176
|
+
puts "-".colorize(:blue) + " Project Template:".colorize(:light_blue) +
|
177
|
+
" #{prototype_repo}".colorize(:light_reen)
|
178
|
+
puts "-".colorize(:blue) + " Ruby Version: ".colorize(:light_blue) +
|
179
|
+
" #{@current_ruby_patch_level}".colorize(:light_reen)
|
169
180
|
puts
|
170
181
|
end
|
182
|
+
# rubocop:enable Metrics/AbcSize
|
171
183
|
|
172
184
|
def print_next_steps
|
173
185
|
if @prototype_repo == CARBONFIVE_REPO
|
@@ -176,25 +188,30 @@ module Raygun
|
|
176
188
|
print_next_steps_for_custom_repo
|
177
189
|
end
|
178
190
|
end
|
179
|
-
|
191
|
+
|
192
|
+
# rubocop:disable Metrics/AbcSize
|
180
193
|
def print_next_steps_carbon_five
|
181
194
|
puts ""
|
182
195
|
puts "Zap! Your application is ready. Next steps...".colorize(:yellow)
|
183
196
|
puts ""
|
184
197
|
puts "# Install updated dependencies and prepare the database".colorize(:light_green)
|
185
198
|
puts "$".colorize(:blue) + " cd #{target_dir}".colorize(:light_blue)
|
186
|
-
puts "$".colorize(:blue) + "
|
199
|
+
puts "$".colorize(:blue) + " bin/setup".colorize(:light_blue)
|
187
200
|
puts ""
|
188
201
|
puts "# Run the specs (they should all pass)".colorize(:light_green)
|
189
|
-
puts "$".colorize(:blue) + " rake".colorize(:light_blue)
|
202
|
+
puts "$".colorize(:blue) + " bin/rake".colorize(:light_blue)
|
190
203
|
puts ""
|
191
204
|
puts "# Run the app and check things out".colorize(:light_green)
|
192
|
-
puts "$".colorize(:blue) + "
|
205
|
+
puts "$".colorize(:blue) + " yarn start".colorize(:light_blue)
|
193
206
|
puts "$".colorize(:blue) + " open http://localhost:3000".colorize(:light_blue)
|
194
207
|
puts ""
|
208
|
+
puts "# For next steps like adding Bootstrap or React, check out the raygun README".colorize(:light_green)
|
209
|
+
puts "$".colorize(:blue) + " open https://github.com/carbonfive/raygun/#next-steps".colorize(:light_blue)
|
210
|
+
puts ""
|
195
211
|
puts "Enjoy your Carbon Five flavored Rails application!".colorize(:yellow)
|
196
212
|
end
|
197
|
-
|
213
|
+
# rubocop:enable Metrics/AbcSize
|
214
|
+
|
198
215
|
def print_next_steps_for_custom_repo
|
199
216
|
puts ""
|
200
217
|
puts "Zap! Your application is ready.".colorize(:yellow)
|
@@ -204,111 +221,80 @@ module Raygun
|
|
204
221
|
|
205
222
|
protected
|
206
223
|
|
207
|
-
# Fetch the tags for the repo (e.g. 'carbonfive/raygun-rails') and return the latest as JSON.
|
208
|
-
def fetch_latest_tag(repo)
|
209
|
-
url = "https://api.github.com/repos/#{repo}/tags"
|
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
|
231
|
-
|
232
|
-
result = JSON.parse(response.body).first
|
233
|
-
unless result
|
234
|
-
puts ""
|
235
|
-
print "Whoops - need to try again!".colorize(:red)
|
236
|
-
puts ""
|
237
|
-
print "We could not find any tags in the repo (".colorize(:light_red)
|
238
|
-
print "#{repo}".colorize(:white)
|
239
|
-
print ") on github.".colorize(:light_red)
|
240
|
-
puts ""
|
241
|
-
print "Raygun uses the 'largest' tag in a repository, where tags are sorted alphanumerically.".colorize(:light_red)
|
242
|
-
puts ""
|
243
|
-
print "E.g., tag 'v.0.10.0' > 'v.0.9.9' and 'x' > 'a'.".colorize(:light_red)
|
244
|
-
print ""
|
245
|
-
puts ""
|
246
|
-
exit 1
|
247
|
-
end
|
248
|
-
|
249
|
-
result
|
250
|
-
end
|
251
|
-
|
252
224
|
def camelize(string)
|
253
225
|
result = string.sub(/^[a-z\d]*/) { $&.capitalize }
|
254
|
-
result.gsub(
|
226
|
+
result.gsub(%r{(?:_|(/))([a-z\d]*)}) { "#{Regexp.last_match(1)}#{Regexp.last_match(2).capitalize}" }
|
255
227
|
end
|
256
228
|
|
257
229
|
def titleize(underscored_string)
|
258
|
-
result = underscored_string.
|
259
|
-
result.gsub(/\b('?[a-z])/) {
|
230
|
+
result = underscored_string.tr("_", " ")
|
231
|
+
result.gsub(/\b('?[a-z])/) { Regexp.last_match(1).capitalize }
|
260
232
|
end
|
261
233
|
|
262
234
|
# Distinguish BSD vs GNU sed with the --version flag (only present in GNU sed).
|
263
235
|
def sed_i
|
264
|
-
@
|
265
|
-
|
266
|
-
|
267
|
-
|
236
|
+
@sed_i ||= begin
|
237
|
+
`sed --version &> /dev/null`
|
238
|
+
$?.success? ? "sed -i" : "sed -i ''"
|
239
|
+
end
|
268
240
|
end
|
269
241
|
|
270
242
|
# Run a shell command and raise an exception if it fails.
|
271
243
|
def shell(command)
|
272
|
-
|
244
|
+
output = `#{command}`
|
273
245
|
raise "#{command} failed with status #{$?.exitstatus}." unless $?.success?
|
274
|
-
end
|
275
|
-
|
276
|
-
def self.parse(args)
|
277
|
-
raygun = nil
|
278
246
|
|
279
|
-
|
280
|
-
|
281
|
-
options.prototype_repo = CARBONFIVE_REPO
|
282
|
-
|
283
|
-
parser = OptionParser.new do |opts|
|
284
|
-
opts.banner = "Usage: raygun [options] NEW_APP_DIRECTORY"
|
247
|
+
output
|
248
|
+
end
|
285
249
|
|
286
|
-
|
287
|
-
|
250
|
+
class << self
|
251
|
+
# rubocop:disable Metrics/MethodLength
|
252
|
+
def parse(_args)
|
253
|
+
raygun = nil
|
254
|
+
|
255
|
+
options = OpenStruct.new
|
256
|
+
options.target_dir = nil
|
257
|
+
options.prototype_repo = CARBONFIVE_REPO
|
258
|
+
|
259
|
+
parser = OptionParser.new do |opts|
|
260
|
+
opts.banner = "Usage: raygun [options] NEW_APP_DIRECTORY"
|
261
|
+
|
262
|
+
opts.on("-h", "--help", "Show raygun usage") do
|
263
|
+
usage_and_exit(opts)
|
264
|
+
end
|
265
|
+
opts.on(
|
266
|
+
"-p",
|
267
|
+
"--prototype [github_repo]",
|
268
|
+
"Prototype github repo (e.g. carbonfive/raygun-rails)."
|
269
|
+
) do |prototype|
|
270
|
+
options.prototype_repo = prototype
|
271
|
+
end
|
272
|
+
|
273
|
+
opts.on("-v", "--version", "Print the version number") do
|
274
|
+
puts Raygun::VERSION
|
275
|
+
exit 1
|
276
|
+
end
|
288
277
|
end
|
289
|
-
opts.on('-p', '--prototype [github_repo]', "Prototype github repo (e.g. carbonfive/raygun-rails).") do |prototype|
|
290
|
-
options.prototype_repo = prototype
|
291
|
-
end
|
292
|
-
end
|
293
278
|
|
294
|
-
|
295
|
-
|
296
|
-
|
279
|
+
begin
|
280
|
+
parser.parse!
|
281
|
+
options.target_dir = ARGV.first
|
297
282
|
|
298
|
-
|
283
|
+
raise OptionParser::InvalidOption if options.target_dir.nil?
|
299
284
|
|
300
|
-
|
285
|
+
raygun = Raygun::Runner.new(options.target_dir, options.prototype_repo)
|
286
|
+
rescue OptionParser::InvalidOption
|
287
|
+
usage_and_exit(parser)
|
288
|
+
end
|
301
289
|
|
302
|
-
|
303
|
-
usage_and_exit(parser)
|
290
|
+
raygun
|
304
291
|
end
|
292
|
+
# rubocop:enable Metrics/MethodLength
|
305
293
|
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
puts parser
|
311
|
-
exit 1
|
294
|
+
def usage_and_exit(parser)
|
295
|
+
puts parser
|
296
|
+
exit 1
|
297
|
+
end
|
312
298
|
end
|
313
299
|
end
|
314
300
|
end
|