raygun 1.0.1 → 1.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.circleci/config.yml +66 -0
- data/.rubocop.yml +99 -0
- data/.ruby-version +1 -1
- data/CHANGES.md +39 -0
- data/Gemfile +1 -1
- data/README.md +110 -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 +158 -143
- data/lib/raygun/template_repo.rb +78 -0
- data/lib/raygun/version.rb +1 -1
- data/raygun.gemspec +13 -8
- data/spec/raygun/runner_spec.rb +27 -0
- data/spec/spec_helper.rb +1 -0
- metadata +74 -10
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
|
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,25 +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
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) + "
|
200
|
+
puts "$".colorize(:blue) + " bin/setup".colorize(:light_blue)
|
183
201
|
puts ""
|
184
202
|
puts "# Run the specs (they should all pass)".colorize(:light_green)
|
185
|
-
puts "$".colorize(:blue) + " rake".colorize(:light_blue)
|
203
|
+
puts "$".colorize(:blue) + " bin/rake".colorize(:light_blue)
|
186
204
|
puts ""
|
187
205
|
puts "# Run the app and check things out".colorize(:light_green)
|
188
|
-
puts "$".colorize(:blue) + "
|
206
|
+
puts "$".colorize(:blue) + " yarn start".colorize(:light_blue)
|
189
207
|
puts "$".colorize(:blue) + " open http://localhost:3000".colorize(:light_blue)
|
190
208
|
puts ""
|
209
|
+
puts "# For next steps like adding Bootstrap or React, 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 ""
|
191
212
|
puts "Enjoy your Carbon Five flavored Rails application!".colorize(:yellow)
|
192
213
|
end
|
193
|
-
|
214
|
+
# rubocop:enable Metrics/AbcSize
|
215
|
+
|
194
216
|
def print_next_steps_for_custom_repo
|
195
217
|
puts ""
|
196
218
|
puts "Zap! Your application is ready.".colorize(:yellow)
|
@@ -200,111 +222,104 @@ module Raygun
|
|
200
222
|
|
201
223
|
protected
|
202
224
|
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
uri = URI.parse(url)
|
207
|
-
http = Net::HTTP.new(uri.host, uri.port)
|
208
|
-
http.use_ssl = true
|
209
|
-
request = Net::HTTP::Get.new(URI.encode(url))
|
210
|
-
|
211
|
-
response = http.request(request)
|
212
|
-
|
213
|
-
unless response.code == "200"
|
214
|
-
puts ""
|
215
|
-
print "Whoops - need to try again!".colorize(:red)
|
216
|
-
puts ""
|
217
|
-
print "We could not find (".colorize(:light_red)
|
218
|
-
print "#{repo}".colorize(:white)
|
219
|
-
print ") on github.".colorize(:light_red)
|
220
|
-
puts ""
|
221
|
-
print "The response from github was a (".colorize(:light_red)
|
222
|
-
print "#{response.code}".colorize(:white)
|
223
|
-
puts ") which I'm sure you can fix right up!".colorize(:light_red)
|
224
|
-
puts ""
|
225
|
-
exit 1
|
226
|
-
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)
|
227
228
|
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
puts
|
242
|
-
|
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)
|
243
246
|
end
|
244
|
-
|
245
|
-
result
|
246
247
|
end
|
247
248
|
|
248
249
|
def camelize(string)
|
249
250
|
result = string.sub(/^[a-z\d]*/) { $&.capitalize }
|
250
|
-
result.gsub(
|
251
|
+
result.gsub(%r{(?:_|(/))([a-z\d]*)}) { "#{Regexp.last_match(1)}#{Regexp.last_match(2).capitalize}" }
|
251
252
|
end
|
252
253
|
|
253
254
|
def titleize(underscored_string)
|
254
|
-
result = underscored_string.
|
255
|
-
result.gsub(/\b('?[a-z])/) {
|
255
|
+
result = underscored_string.tr("_", " ")
|
256
|
+
result.gsub(/\b('?[a-z])/) { Regexp.last_match(1).capitalize }
|
256
257
|
end
|
257
258
|
|
258
259
|
# Distinguish BSD vs GNU sed with the --version flag (only present in GNU sed).
|
259
260
|
def sed_i
|
260
|
-
@
|
261
|
-
|
262
|
-
|
263
|
-
|
261
|
+
@sed_i ||= begin
|
262
|
+
`sed --version &> /dev/null`
|
263
|
+
$?.success? ? "sed -i" : "sed -i ''"
|
264
|
+
end
|
264
265
|
end
|
265
266
|
|
266
267
|
# Run a shell command and raise an exception if it fails.
|
267
268
|
def shell(command)
|
268
|
-
|
269
|
+
output = `#{command}`
|
269
270
|
raise "#{command} failed with status #{$?.exitstatus}." unless $?.success?
|
270
|
-
end
|
271
271
|
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
options = OpenStruct.new
|
276
|
-
options.target_dir = nil
|
277
|
-
options.prototype_repo = CARBONFIVE_REPO
|
278
|
-
|
279
|
-
parser = OptionParser.new do |opts|
|
280
|
-
opts.banner = "Usage: raygun [options] NEW_APP_DIRECTORY"
|
272
|
+
output
|
273
|
+
end
|
281
274
|
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
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
|
287
302
|
end
|
288
|
-
end
|
289
303
|
|
290
|
-
|
291
|
-
|
292
|
-
|
304
|
+
begin
|
305
|
+
parser.parse!
|
306
|
+
options.target_dir = ARGV.first
|
293
307
|
|
294
|
-
|
308
|
+
raise OptionParser::InvalidOption if options.target_dir.nil?
|
295
309
|
|
296
|
-
|
310
|
+
raygun = Raygun::Runner.new(options.target_dir, options.prototype_repo)
|
311
|
+
rescue OptionParser::InvalidOption
|
312
|
+
usage_and_exit(parser)
|
313
|
+
end
|
297
314
|
|
298
|
-
|
299
|
-
usage_and_exit(parser)
|
315
|
+
raygun
|
300
316
|
end
|
317
|
+
# rubocop:enable Metrics/MethodLength
|
301
318
|
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
puts parser
|
307
|
-
exit 1
|
319
|
+
def usage_and_exit(parser)
|
320
|
+
puts parser
|
321
|
+
exit 1
|
322
|
+
end
|
308
323
|
end
|
309
324
|
end
|
310
325
|
end
|