raygun 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/.rbenv-version +1 -0
- data/.rvmrc +1 -1
- data/README.md +34 -11
- data/TODO.md +1 -1
- data/bin/raygun +6 -7
- data/generators/application_template.rb +5 -0
- data/generators/simplecov/simplecov.rb +25 -0
- data/generators/simplecov/simplecov_template.rb +11 -0
- data/generators/simplecov/spec/support/simplecov.rb +25 -0
- data/generators/simplecov/tasks/coverage.rake +12 -0
- data/lib/raygun/app_builder.rb +53 -12
- data/lib/raygun/generators/app_generator.rb +45 -48
- data/lib/raygun/helpers/ruby_version_helpers.rb +52 -0
- data/lib/raygun/raygun.rb +11 -0
- data/lib/raygun/version.rb +1 -1
- data/templates/Gemfile_customized +7 -0
- data/templates/Guardfile_customized +18 -0
- data/templates/Procfile +1 -0
- data/templates/README.md.erb +3 -3
- data/templates/_app/controllers/user_sessions_controller.rb +1 -0
- data/templates/_app/models/ability.rb +36 -0
- data/templates/_app/models/user.rb +1 -1
- data/templates/_db/sample_data.rb +8 -1
- data/templates/_lib/tasks/coverage.rake +12 -0
- data/templates/_lib/tasks/db.rake +1 -1
- data/templates/_lib/tasks/spec.rake +18 -0
- data/templates/_lib/templates/rails/scaffold_controller/controller.rb +45 -0
- data/templates/_lib/templates/slim/scaffold/_form.html.slim +1 -1
- data/templates/_lib/templates/slim/scaffold/index.html.slim +8 -7
- data/templates/_lib/templates/slim/scaffold/show.html.slim +10 -8
- data/templates/_spec/factories/users.rb +5 -0
- data/templates/_spec/javascripts/example_spec.js.coffee +20 -0
- data/templates/_spec/javascripts/spec.css +3 -0
- data/templates/_spec/javascripts/spec.js.coffee +2 -0
- data/templates/_spec/models/ability_spec.rb +36 -0
- data/templates/rbenv-version.erb +1 -0
- metadata +21 -3
- data/templates/_lib/email_validator.rb +0 -9
data/.gitignore
CHANGED
data/.rbenv-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
1.9.3-p286-perf
|
data/.rvmrc
CHANGED
@@ -1 +1 @@
|
|
1
|
-
rvm use 1.9.3-
|
1
|
+
rvm use 1.9.3-p286@raygun --create
|
data/README.md
CHANGED
@@ -20,6 +20,7 @@ Major tools/libraries:
|
|
20
20
|
* Cancan
|
21
21
|
* RSpec
|
22
22
|
* Factory Girl
|
23
|
+
* Jasmine
|
23
24
|
* Guard
|
24
25
|
|
25
26
|
And many tweaks, patterns and common recipes.
|
@@ -27,32 +28,40 @@ And many tweaks, patterns and common recipes.
|
|
27
28
|
## Projects Goals
|
28
29
|
|
29
30
|
Raygun...
|
31
|
+
|
30
32
|
* should generate a new rails application that's ready for feature development immediately.
|
31
33
|
* should generate an application that has best practices that apply to most projects baked in.
|
32
34
|
* is a forum for discussing what should or should not be included as part of a standard stack.
|
33
35
|
|
34
36
|
## Installation
|
35
37
|
|
36
|
-
|
38
|
+
$ gem install raygun
|
39
|
+
|
40
|
+
## Prerequisites
|
41
|
+
|
42
|
+
Be sure you met these requirements before using raygun, otherwise you won't make it very far (misfire!).
|
43
|
+
|
44
|
+
* Ruby 1.9.2+ (rvm and rbenv supported)
|
45
|
+
* PostgreSQL 9.x with superuser 'postgres' with no password (```createuser -s postgres```)
|
46
|
+
* PhantomJS for JavaScript testing (```brew install phantomjs```)
|
37
47
|
|
38
48
|
## Usage
|
39
49
|
|
40
|
-
|
50
|
+
$ raygun your-project
|
41
51
|
|
42
52
|
Once your project is baked out, you can easily kick the wheels:
|
43
53
|
|
44
|
-
|
54
|
+
$ cd your-project
|
45
55
|
|
46
|
-
|
47
|
-
|
56
|
+
# Prepare the database: schema and reference / sample data
|
57
|
+
$ rake db:migrate db:seed db:sample_data
|
48
58
|
|
49
|
-
|
50
|
-
|
59
|
+
# Run the specs
|
60
|
+
$ rake
|
51
61
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
$ open http://0.0.0.0:3000
|
62
|
+
# Fire up the app and open it in a browser
|
63
|
+
$ foreman start
|
64
|
+
$ open http://0.0.0.0:3000
|
56
65
|
|
57
66
|
## Contributing
|
58
67
|
|
@@ -61,3 +70,17 @@ Once your project is baked out, you can easily kick the wheels:
|
|
61
70
|
3. Commit your changes (`git commit -am 'Add some feature'`)
|
62
71
|
4. Push to the branch (`git push origin my-new-feature`)
|
63
72
|
5. Create new Pull Request
|
73
|
+
|
74
|
+
### Development
|
75
|
+
|
76
|
+
Generate an example app using your local development version of raygun
|
77
|
+
|
78
|
+
./bin/raygun tmp/example_app
|
79
|
+
|
80
|
+
### Customizing the generated Rails app
|
81
|
+
|
82
|
+
Changes which can be applied on top of an existing Rails app should be added as `foo_template.rb` files
|
83
|
+
in `raygun/generators/foo/`.
|
84
|
+
|
85
|
+
Changes which must be performed during the creation of the Rails app should be added to `lib/raygun/app_builder.rb`
|
86
|
+
and called from an appropriate step in `lib/raygun/generators/app_generator.rb`.
|
data/TODO.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# TODOs
|
2
2
|
|
3
|
-
Looking for inspiration? Here are some ideas for things that still could be done.
|
3
|
+
Looking for inspiration? Here are some ideas for things that still could be done. Don't forget to check the open issus too.
|
4
4
|
|
5
5
|
* Cleanup/refactor raygun code (a few simple helpers would help out a whole lot)
|
6
6
|
* Automated testing of raygun (e.g. generate an app and run its specs?)
|
data/bin/raygun
CHANGED
@@ -1,11 +1,10 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
|
4
|
-
require File.expand_path(File.join('..', 'lib', 'raygun', 'actions'), File.dirname(__FILE__))
|
5
|
-
require File.expand_path(File.join('..', 'lib', 'raygun', 'app_builder'), File.dirname(__FILE__))
|
6
|
-
|
2
|
+
require File.expand_path(File.join('..', 'lib', 'raygun', 'raygun'), File.dirname(__FILE__))
|
3
|
+
Raygun::AppGenerator.launch_path(Dir.pwd)
|
7
4
|
templates_root = File.expand_path(File.join('..', 'templates'), File.dirname(__FILE__))
|
8
5
|
Raygun::AppGenerator.source_root templates_root
|
9
|
-
Raygun::AppGenerator.source_paths << Rails::Generators::AppGenerator.source_root
|
6
|
+
Raygun::AppGenerator.source_paths << Rails::Generators::AppGenerator.source_root
|
7
|
+
Raygun::AppGenerator.source_paths << templates_root
|
8
|
+
Raygun::AppGenerator.source_paths << File.expand_path(File.join('..', 'generators'), File.dirname(__FILE__))
|
10
9
|
|
11
|
-
Raygun::AppGenerator.start
|
10
|
+
Raygun::AppGenerator.start ARGV.concat ['-m', 'generators/application_template.rb']
|
@@ -0,0 +1,25 @@
|
|
1
|
+
if ENV['COVERAGE']
|
2
|
+
require 'simplecov'
|
3
|
+
|
4
|
+
# Writes the coverage stat to a file to be used by Cane.
|
5
|
+
class SimpleCov::Formatter::QualityFormatter
|
6
|
+
def format(result)
|
7
|
+
SimpleCov::Formatter::HTMLFormatter.new.format(result)
|
8
|
+
File.open("coverage/covered_percent", "w") do |f|
|
9
|
+
f.puts result.source_files.covered_percent.to_f
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
SimpleCov.formatter = SimpleCov::Formatter::QualityFormatter
|
14
|
+
|
15
|
+
SimpleCov.start do
|
16
|
+
add_filter '/spec/'
|
17
|
+
add_filter '/config/'
|
18
|
+
add_filter '/vendor/'
|
19
|
+
add_group 'Models', 'app/models'
|
20
|
+
add_group 'Controllers', 'app/controllers'
|
21
|
+
add_group 'Helpers', 'app/helpers'
|
22
|
+
add_group 'Views', 'app/views'
|
23
|
+
add_group 'Mailers', 'app/mailers'
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
insert_into_file 'spec/spec_helper.rb',
|
2
|
+
"require File.expand_path('../support/simplecov', __FILE__)\n",
|
3
|
+
after: "ENV[\"RAILS_ENV\"] ||= \'test\'\n"
|
4
|
+
|
5
|
+
#gem_group :test, :development do
|
6
|
+
# gem 'simplecov'
|
7
|
+
#end
|
8
|
+
uncomment_lines 'Gemfile', /simplecov/
|
9
|
+
|
10
|
+
copy_file 'simplecov/tasks/coverage.rake', 'lib/tasks/coverage.rake'
|
11
|
+
copy_file 'simplecov/spec/support/simplecov.rb', 'spec/support/simplecov.rb'
|
@@ -0,0 +1,25 @@
|
|
1
|
+
if ENV['COVERAGE']
|
2
|
+
require 'simplecov'
|
3
|
+
|
4
|
+
# Writes the coverage stat to a file to be used by Cane.
|
5
|
+
class SimpleCov::Formatter::QualityFormatter
|
6
|
+
def format(result)
|
7
|
+
SimpleCov::Formatter::HTMLFormatter.new.format(result)
|
8
|
+
File.open("coverage/covered_percent", "w") do |f|
|
9
|
+
f.puts result.source_files.covered_percent.to_f
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
SimpleCov.formatter = SimpleCov::Formatter::QualityFormatter
|
14
|
+
|
15
|
+
SimpleCov.start do
|
16
|
+
add_filter '/spec/'
|
17
|
+
add_filter '/config/'
|
18
|
+
add_filter '/vendor/'
|
19
|
+
add_group 'Models', 'app/models'
|
20
|
+
add_group 'Controllers', 'app/controllers'
|
21
|
+
add_group 'Helpers', 'app/helpers'
|
22
|
+
add_group 'Views', 'app/views'
|
23
|
+
add_group 'Mailers', 'app/mailers'
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
namespace :spec do
|
2
|
+
task :enable_coverage do
|
3
|
+
ENV['COVERAGE'] = '1'
|
4
|
+
end
|
5
|
+
|
6
|
+
desc 'Executes specs with code coverage reports'
|
7
|
+
task coverage: :enable_coverage do
|
8
|
+
Rake::Task[:spec].invoke
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
Rake::Task['spec'].enhance ['spec:enable_coverage']
|
data/lib/raygun/app_builder.rb
CHANGED
@@ -54,12 +54,18 @@ module Raygun
|
|
54
54
|
template 'rvmrc.erb', '.rvmrc', rvm_ruby: rvm_ruby
|
55
55
|
end
|
56
56
|
|
57
|
+
def configure_rbenv
|
58
|
+
template 'rbenv-version.erb', '.rbenv-version', rbenv_ruby: rbenv_ruby
|
59
|
+
end
|
60
|
+
|
57
61
|
def configure_gemfile
|
58
62
|
run 'gem install bundler'
|
59
63
|
copy_file 'Gemfile_customized', 'Gemfile', force: true
|
60
64
|
end
|
61
65
|
|
62
66
|
def setup_generators
|
67
|
+
directory '_lib/templates/rails', 'lib/templates/rails'
|
68
|
+
|
63
69
|
%w(_form index show new edit).each do |view|
|
64
70
|
template = "lib/templates/slim/scaffold/#{view}.html.slim"
|
65
71
|
remove_file template
|
@@ -71,10 +77,10 @@ module Raygun
|
|
71
77
|
generators_config = <<-RUBY
|
72
78
|
|
73
79
|
config.generators do |generate|
|
74
|
-
generate.stylesheets
|
75
|
-
#generate.helpers
|
76
|
-
generate.
|
77
|
-
#generate.view_specs
|
80
|
+
generate.stylesheets false
|
81
|
+
#generate.helpers false
|
82
|
+
generate.routing_specs false
|
83
|
+
#generate.view_specs false
|
78
84
|
end
|
79
85
|
|
80
86
|
RUBY
|
@@ -116,6 +122,11 @@ RUBY
|
|
116
122
|
copy_file '_spec/support/accept_values.rb', 'spec/support/accept_values.rb'
|
117
123
|
end
|
118
124
|
|
125
|
+
def add_js_testing
|
126
|
+
directory '_spec/javascripts', 'spec/javascripts'
|
127
|
+
copy_file '_lib/tasks/spec.rake', 'lib/tasks/spec.rake'
|
128
|
+
end
|
129
|
+
|
119
130
|
def configure_time_zone
|
120
131
|
'config/application.rb'.tap do |fn|
|
121
132
|
#inject_into_file fn, ' config.active_record.default_timezone = :utc\n', after: "'Central Time (US & Canada)'\n"
|
@@ -138,12 +149,6 @@ RUBY
|
|
138
149
|
end
|
139
150
|
end
|
140
151
|
|
141
|
-
def add_email_validator
|
142
|
-
# CN: I'm not thrilled with this use of the lib directory, but it's not that unusual. Would love to hear what
|
143
|
-
# other folks think about where such things should live.
|
144
|
-
copy_file '_lib/email_validator.rb', 'lib/email_validator.rb'
|
145
|
-
end
|
146
|
-
|
147
152
|
def setup_simple_form
|
148
153
|
generate 'simple_form:install --bootstrap -s'
|
149
154
|
|
@@ -169,8 +174,10 @@ RUBY
|
|
169
174
|
copy_file '_spec/factories/users.rb', 'spec/factories/users.rb', force: true
|
170
175
|
copy_file '_spec/models/user_spec.rb', 'spec/models/user_spec.rb', force: true
|
171
176
|
|
177
|
+
gsub_file 'spec/controllers/users_controller_spec.rb', 'login_user build :user', 'login_user build :admin'
|
178
|
+
|
172
179
|
inject_into_file 'app/controllers/users_controller.rb',
|
173
|
-
"\n before_filter :require_login\n
|
180
|
+
"\n before_filter :require_login\n",
|
174
181
|
after: "UsersController < ApplicationController\n"
|
175
182
|
|
176
183
|
# User mailer (has to happen before sorcery config changes)
|
@@ -246,7 +253,34 @@ RUBY
|
|
246
253
|
|
247
254
|
copy_file '_app/views/password_resets/edit.html.slim',
|
248
255
|
'app/views/password_resets/edit.html.slim'
|
256
|
+
end
|
257
|
+
|
258
|
+
def setup_authorization
|
259
|
+
generate 'migration add_admin_to_users admin:boolean'
|
260
|
+
|
261
|
+
copy_file '_app/models/ability.rb', 'app/models/ability.rb'
|
262
|
+
copy_file '_spec/models/ability_spec.rb', 'spec/models/ability_spec.rb'
|
249
263
|
|
264
|
+
inject_into_file 'app/controllers/application_controller.rb',
|
265
|
+
" check_authorization\n",
|
266
|
+
after: "protect_from_forgery\n"
|
267
|
+
|
268
|
+
append_to_file 'config/environments/test.rb', 'Sorcery::CryptoProviders::BCrypt.cost = 1'
|
269
|
+
end
|
270
|
+
|
271
|
+
def setup_default_rake_task
|
272
|
+
append_file 'Rakefile' do
|
273
|
+
"\ntask(:default).clear\ntask default: ['spec', 'spec:javascripts']"
|
274
|
+
end
|
275
|
+
end
|
276
|
+
|
277
|
+
def setup_guard
|
278
|
+
copy_file 'Guardfile_customized', 'Guardfile'
|
279
|
+
run 'bundle exec guard init jasmine'
|
280
|
+
end
|
281
|
+
|
282
|
+
def setup_logging
|
283
|
+
inject_into_file 'config.ru', "$stdout.sync = true\n", before: 'run ExampleApp::Application'
|
250
284
|
end
|
251
285
|
|
252
286
|
def setup_stylesheets
|
@@ -265,12 +299,19 @@ RUBY
|
|
265
299
|
copy_file '_db/sample_data.rb', 'db/sample_data.rb'
|
266
300
|
end
|
267
301
|
|
302
|
+
def copy_procfile
|
303
|
+
copy_file 'Procfile'
|
304
|
+
end
|
305
|
+
|
268
306
|
def remove_routes_comment_lines
|
269
307
|
replace_in_file 'config/routes.rb', /Application\.routes\.draw do.*end/m, "Application.routes.draw do\nend"
|
270
308
|
end
|
271
309
|
|
272
310
|
def convert_to_19_hash_syntax
|
273
|
-
|
311
|
+
original_destination_root = destination_root
|
312
|
+
inside(Raygun::AppGenerator.launch_path) do
|
313
|
+
run "find #{original_destination_root} -name '*.rb' | xargs hash_syntax -n"
|
314
|
+
end
|
274
315
|
end
|
275
316
|
|
276
317
|
def consistent_quoting
|
@@ -1,9 +1,12 @@
|
|
1
|
-
require 'rails/generators'
|
2
|
-
require 'rails/generators/rails/app/app_generator'
|
3
|
-
require 'rvm'
|
4
|
-
|
5
1
|
module Raygun
|
6
2
|
class AppGenerator < Rails::Generators::AppGenerator
|
3
|
+
include Raygun::RubyVersionHelpers
|
4
|
+
|
5
|
+
# set and get raygun launch path
|
6
|
+
def self.launch_path(path=nil)
|
7
|
+
@_launch_path = path if path
|
8
|
+
@_launch_path
|
9
|
+
end
|
7
10
|
|
8
11
|
class_option :database, type: :string, aliases: '-d', default: 'postgresql',
|
9
12
|
desc: "Preconfigure for selected database (options: #{DATABASES.join('/')})"
|
@@ -17,28 +20,24 @@ module Raygun
|
|
17
20
|
end
|
18
21
|
|
19
22
|
def raygun_customization
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
invoke :copy_miscellaneous_files
|
39
|
-
|
40
|
-
# Go back to the original rvm environment.
|
41
|
-
@@env.use!(rvm_original_env)
|
23
|
+
|
24
|
+
with_ruby_version do
|
25
|
+
invoke :remove_files_we_dont_need
|
26
|
+
invoke :remove_routes_comment_lines
|
27
|
+
invoke :setup_development_environment
|
28
|
+
invoke :setup_production_environment
|
29
|
+
invoke :setup_acceptance_environment
|
30
|
+
#invoke :setup_staging_environment
|
31
|
+
invoke :configure_ruby_version
|
32
|
+
invoke :customize_gemfile
|
33
|
+
invoke :setup_database
|
34
|
+
invoke :setup_generators
|
35
|
+
invoke :create_raygun_views
|
36
|
+
invoke :configure_app
|
37
|
+
invoke :setup_javascripts
|
38
|
+
invoke :setup_stylesheets
|
39
|
+
invoke :copy_miscellaneous_files
|
40
|
+
end
|
42
41
|
|
43
42
|
invoke :knits_and_picks
|
44
43
|
invoke :outro
|
@@ -71,15 +70,14 @@ module Raygun
|
|
71
70
|
build :initialize_on_precompile
|
72
71
|
end
|
73
72
|
|
74
|
-
def
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
build :configure_rvm
|
73
|
+
def configure_ruby_version
|
74
|
+
if rvm_installed?
|
75
|
+
say "Configuring RVM"
|
76
|
+
build :configure_rvm
|
77
|
+
else
|
78
|
+
say "Configuring rbenv"
|
79
|
+
build :configure_rbenv
|
80
|
+
end
|
83
81
|
end
|
84
82
|
|
85
83
|
def customize_gemfile
|
@@ -115,14 +113,17 @@ module Raygun
|
|
115
113
|
build :generate_rspec
|
116
114
|
build :add_rspec_support
|
117
115
|
|
116
|
+
build :add_js_testing
|
117
|
+
|
118
|
+
build :setup_logging
|
118
119
|
build :configure_time_zone
|
119
120
|
build :configure_action_mailer
|
120
121
|
build :add_lib_to_load_path
|
121
|
-
build :add_email_validator
|
122
122
|
build :setup_simple_form
|
123
123
|
build :setup_authentication
|
124
|
+
build :setup_authorization
|
124
125
|
build :setup_default_rake_task
|
125
|
-
|
126
|
+
build :setup_guard
|
126
127
|
end
|
127
128
|
|
128
129
|
def setup_stylesheets
|
@@ -138,6 +139,7 @@ module Raygun
|
|
138
139
|
def copy_miscellaneous_files
|
139
140
|
say 'Copying miscellaneous support files'
|
140
141
|
build :copy_rake_tasks
|
142
|
+
build :copy_procfile
|
141
143
|
end
|
142
144
|
|
143
145
|
def knits_and_picks
|
@@ -150,17 +152,16 @@ module Raygun
|
|
150
152
|
say ""
|
151
153
|
say "You're done! Next steps..."
|
152
154
|
say ""
|
153
|
-
say "# Prepare the database"
|
154
|
-
say "
|
155
|
-
say "
|
155
|
+
say "# Prepare the database: schema and reference / sample data"
|
156
|
+
say "$ cd #{ARGV[0]}"
|
157
|
+
say "$ rake db:migrate db:seed db:sample_data"
|
156
158
|
say ""
|
157
159
|
say "# Run the specs (they should all pass)"
|
158
|
-
say "
|
160
|
+
say "$ rake"
|
159
161
|
say ""
|
160
162
|
say "# Load reference and sample data, then run the app and check things out"
|
161
|
-
say "
|
162
|
-
say "
|
163
|
-
say " $ open http://0.0.0.0:3000"
|
163
|
+
say "$ foreman start"
|
164
|
+
say "$ open http://0.0.0.0:3000"
|
164
165
|
say ""
|
165
166
|
say "Enjoy your Carbon Five flavored Rails application!"
|
166
167
|
end
|
@@ -169,10 +170,6 @@ module Raygun
|
|
169
170
|
# Let's not: We'll bundle manually at the right spot
|
170
171
|
end
|
171
172
|
|
172
|
-
def rvm_ruby
|
173
|
-
@@env.expanded_name.match(/(.*)@?/)[1]
|
174
|
-
end
|
175
|
-
|
176
173
|
protected
|
177
174
|
|
178
175
|
def get_builder_class
|
@@ -0,0 +1,52 @@
|
|
1
|
+
begin
|
2
|
+
require 'rvm'
|
3
|
+
rescue LoadError; end
|
4
|
+
|
5
|
+
module Raygun
|
6
|
+
module RubyVersionHelpers
|
7
|
+
|
8
|
+
# Executes the block within the configured ruby version manager. For rvm,
|
9
|
+
# this means that any processing in the block will happen in a new gemset
|
10
|
+
# context.
|
11
|
+
def with_ruby_version(&block)
|
12
|
+
setup_rvm if rvm_installed?
|
13
|
+
yield if block_given?
|
14
|
+
ensure
|
15
|
+
reset_rvm if rvm_installed?
|
16
|
+
end
|
17
|
+
|
18
|
+
# Records the original rvm environment and sets up a new gemset.
|
19
|
+
def setup_rvm
|
20
|
+
@@rvm_original_env ||= RVM.current.expanded_name
|
21
|
+
|
22
|
+
@@env = RVM::Environment.current
|
23
|
+
@@env.gemset_create(app_name)
|
24
|
+
@@env.gemset_use!(app_name)
|
25
|
+
end
|
26
|
+
|
27
|
+
# Reverts to the original rvm environment
|
28
|
+
def reset_rvm
|
29
|
+
@@env.use!(@@rvm_original_env)
|
30
|
+
end
|
31
|
+
|
32
|
+
# Returns the rbenv ruby version
|
33
|
+
def rbenv_ruby
|
34
|
+
`rbenv version`.split(' ').first
|
35
|
+
end
|
36
|
+
|
37
|
+
# Returns the RVM ruby version
|
38
|
+
def rvm_ruby
|
39
|
+
@@env.expanded_name.match(/(.*)@?/)[1]
|
40
|
+
end
|
41
|
+
|
42
|
+
# Returns true if rbenv is installed.
|
43
|
+
def rbenv_installed?
|
44
|
+
@rbenv_installed ||= `which rbenv`.present?
|
45
|
+
end
|
46
|
+
|
47
|
+
# Returns true if RVM is installed.
|
48
|
+
def rvm_installed?
|
49
|
+
@rvm_installed ||= `which rvm`.present?
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'rails/generators'
|
2
|
+
require 'rails/generators/rails/app/app_generator'
|
3
|
+
|
4
|
+
[
|
5
|
+
'helpers/ruby_version_helpers',
|
6
|
+
'actions',
|
7
|
+
'app_builder',
|
8
|
+
'generators/app_generator'
|
9
|
+
].each do |lib_path|
|
10
|
+
require File.expand_path(lib_path, File.dirname(__FILE__))
|
11
|
+
end
|
data/lib/raygun/version.rb
CHANGED
@@ -5,8 +5,10 @@ gem 'rails', '~> 3.2.8'
|
|
5
5
|
gem 'slim-rails'
|
6
6
|
gem 'jquery-rails'
|
7
7
|
gem 'sorcery'
|
8
|
+
gem 'cancan'
|
8
9
|
gem 'simple_form'
|
9
10
|
gem 'active_attr'
|
11
|
+
gem 'valid_email'
|
10
12
|
gem 'pg'
|
11
13
|
gem 'awesome_print'
|
12
14
|
|
@@ -22,11 +24,16 @@ group :test, :development do
|
|
22
24
|
gem 'rspec-rails'
|
23
25
|
gem 'capybara', github: 'jnicklas/capybara' # TODO Change when 2.0 is released.
|
24
26
|
gem 'factory_girl_rails'
|
27
|
+
gem 'jasminerice'
|
25
28
|
gem 'timecop'
|
29
|
+
#gem 'simplecov'
|
26
30
|
end
|
27
31
|
|
28
32
|
group :development do
|
33
|
+
gem 'foreman'
|
29
34
|
gem 'guard'
|
30
35
|
gem 'guard-rspec'
|
36
|
+
gem 'guard-jasmine'
|
31
37
|
gem 'guard-livereload'
|
38
|
+
gem 'rb-fsevent'
|
32
39
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# A sample Guardfile
|
2
|
+
# More info at https://github.com/guard/guard#readme
|
3
|
+
|
4
|
+
guard 'rspec' do
|
5
|
+
watch(%r{^spec/.+_spec\.rb$})
|
6
|
+
watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
|
7
|
+
watch('spec/spec_helper.rb') { "spec" }
|
8
|
+
|
9
|
+
# Rails example
|
10
|
+
watch(%r{^app/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
|
11
|
+
watch(%r{^app/(.*)(\.slim)$}) { |m| "spec/#{m[1]}#{m[2]}_spec.rb" }
|
12
|
+
watch(%r{^app/controllers/(.+)_(controller)\.rb$}) { |m| ["spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb", "spec/requests/#{m[1]}_spec.rb"] }
|
13
|
+
watch(%r{^spec/support/(.+)\.rb$}) { "spec" }
|
14
|
+
watch('app/controllers/application_controller.rb') { "spec/controllers" }
|
15
|
+
|
16
|
+
# Capybara request specs
|
17
|
+
watch(%r{^app/views/(.+)/.*(\.slim)$}) { |m| "spec/requests/#{m[1]}_spec.rb" }
|
18
|
+
end
|
data/templates/Procfile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
web: rails server -p 3000
|
data/templates/README.md.erb
CHANGED
@@ -7,7 +7,7 @@ Requirements
|
|
7
7
|
============
|
8
8
|
|
9
9
|
* ruby 1.9.?
|
10
|
-
* postgresql 9.?
|
10
|
+
* postgresql 9.? (user 'postgres' with no password)
|
11
11
|
|
12
12
|
Running the Specs
|
13
13
|
=================
|
@@ -18,12 +18,12 @@ $ rake
|
|
18
18
|
Running the Application
|
19
19
|
=======================
|
20
20
|
|
21
|
-
$
|
21
|
+
$ foreman start
|
22
22
|
|
23
23
|
Using Guard
|
24
24
|
===========
|
25
25
|
|
26
|
-
$ guard -c
|
26
|
+
$ bundle exec guard -c
|
27
27
|
|
28
28
|
Considerations
|
29
29
|
==============
|
@@ -0,0 +1,36 @@
|
|
1
|
+
class Ability
|
2
|
+
include CanCan::Ability
|
3
|
+
|
4
|
+
def initialize(user)
|
5
|
+
user ||= User.new # guest user (not logged in)
|
6
|
+
|
7
|
+
if user.admin?
|
8
|
+
can :manage, User
|
9
|
+
else
|
10
|
+
can :manage, User, id: user.id
|
11
|
+
end
|
12
|
+
|
13
|
+
# Define abilities for the passed in user here. For example:
|
14
|
+
#
|
15
|
+
# user ||= User.new # guest user (not logged in)
|
16
|
+
# if user.admin?
|
17
|
+
# can :manage, :all
|
18
|
+
# else
|
19
|
+
# can :read, :all
|
20
|
+
# end
|
21
|
+
#
|
22
|
+
# The first argument to `can` is the action you are giving the user permission to do.
|
23
|
+
# If you pass :manage it will apply to every action. Other common actions here are
|
24
|
+
# :read, :create, :update and :destroy.
|
25
|
+
#
|
26
|
+
# The second argument is the resource the user can perform the action on. If you pass
|
27
|
+
# :all it will apply to every resource. Otherwise pass a Ruby class of the resource.
|
28
|
+
#
|
29
|
+
# The third argument is an optional hash of conditions to further filter the objects.
|
30
|
+
# For example, here the user can only update published articles.
|
31
|
+
#
|
32
|
+
# can :update, Article, :published => true
|
33
|
+
#
|
34
|
+
# See the wiki for details: https://github.com/ryanb/cancan/wiki/Defining-Abilities
|
35
|
+
end
|
36
|
+
end
|
@@ -12,6 +12,13 @@
|
|
12
12
|
|
13
13
|
User.create! do |u|
|
14
14
|
u.email = 'user@example.com'
|
15
|
-
u.name = '
|
15
|
+
u.name = 'Ustead User'
|
16
16
|
u.password = 'password'
|
17
17
|
end.activate!
|
18
|
+
|
19
|
+
User.create! do |u|
|
20
|
+
u.email = 'admin@example.com'
|
21
|
+
u.name = 'Adam Admin'
|
22
|
+
u.password = 'password'
|
23
|
+
u.admin = true
|
24
|
+
end.activate!
|
@@ -0,0 +1,12 @@
|
|
1
|
+
namespace :spec do
|
2
|
+
task :enable_coverage do
|
3
|
+
ENV['COVERAGE'] = '1'
|
4
|
+
end
|
5
|
+
|
6
|
+
desc 'Executes specs with code coverage reports'
|
7
|
+
task coverage: :enable_coverage do
|
8
|
+
Rake::Task[:spec].invoke
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
Rake::Task['spec'].enhance ['spec:enable_coverage']
|
@@ -1,6 +1,6 @@
|
|
1
1
|
namespace :db do
|
2
2
|
desc "Load a small, representative set of data so that the application can start in an use state (for development)."
|
3
|
-
task :
|
3
|
+
task sample_data: :environment do
|
4
4
|
sample_data = File.join(Rails.root, 'db', 'sample_data.rb')
|
5
5
|
load(sample_data) if sample_data
|
6
6
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'guard/jasmine/task'
|
2
|
+
|
3
|
+
namespace :spec do
|
4
|
+
desc "Run all javascript specs"
|
5
|
+
task :javascripts do
|
6
|
+
begin
|
7
|
+
::Guard::Jasmine::CLI.start
|
8
|
+
|
9
|
+
rescue SystemExit => e
|
10
|
+
case e.status
|
11
|
+
when 1
|
12
|
+
fail "Some specs have failed"
|
13
|
+
when 2
|
14
|
+
fail "The spec couldn't be run: #{e.message}'"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
<% if namespaced? -%>
|
2
|
+
require_dependency "<%= namespaced_file_path %>/application_controller"
|
3
|
+
|
4
|
+
<% end -%>
|
5
|
+
<% module_namespacing do -%>
|
6
|
+
class <%= controller_class_name %>Controller < ApplicationController
|
7
|
+
|
8
|
+
load_and_authorize_resource
|
9
|
+
|
10
|
+
def index
|
11
|
+
end
|
12
|
+
|
13
|
+
def show
|
14
|
+
end
|
15
|
+
|
16
|
+
def new
|
17
|
+
end
|
18
|
+
|
19
|
+
def edit
|
20
|
+
end
|
21
|
+
|
22
|
+
def create
|
23
|
+
@<%= singular_table_name %> = <%= orm_class.build(class_name, "params[:#{singular_table_name}]") %>
|
24
|
+
|
25
|
+
if @<%= orm_instance.save %>
|
26
|
+
redirect_to @<%= singular_table_name %>, <%= key_value :notice, "'#{human_name} was successfully created.'" %>
|
27
|
+
else
|
28
|
+
render <%= key_value :action, '"new"' %>
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def update
|
33
|
+
if @<%= orm_instance.update_attributes("params[:#{singular_table_name}]") %>
|
34
|
+
redirect_to @<%= singular_table_name %>, <%= key_value :notice, "'#{human_name} was successfully updated.'" %>
|
35
|
+
else
|
36
|
+
render <%= key_value :action, '"edit"' %>
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def destroy
|
41
|
+
@<%= orm_instance.destroy %>
|
42
|
+
redirect_to <%= index_helper %>_url
|
43
|
+
end
|
44
|
+
end
|
45
|
+
<% end -%>
|
@@ -3,7 +3,7 @@
|
|
3
3
|
|
4
4
|
.form-inputs
|
5
5
|
<%- attributes.each_with_index do |attribute, i| -%>
|
6
|
-
= f.<%= attribute.reference? ? :association : :input %> :<%= attribute.name
|
6
|
+
= f.<%= attribute.reference? ? :association : :input %> :<%= attribute.name %><%= ', autofocus: true' if i == 0 %>
|
7
7
|
<%- end -%>
|
8
8
|
|
9
9
|
.form-actions
|
@@ -13,15 +13,16 @@ table.table.table-striped
|
|
13
13
|
tbody
|
14
14
|
- @<%= plural_table_name %>.each do |<%= singular_table_name %>|
|
15
15
|
tr
|
16
|
-
td=
|
16
|
+
td= link_to_if can?(:show, <%= singular_table_name %>), <%= singular_table_name %>.id, <%= singular_table_name %>_path(<%= singular_table_name %>)
|
17
17
|
<% attributes.each do |attribute| -%>
|
18
18
|
td= <%= singular_table_name %>.<%= attribute.name %>
|
19
19
|
<% end -%>
|
20
20
|
td
|
21
|
-
|
22
|
-
|
23
|
-
|
21
|
+
- if can? :edit, <%= singular_table_name %>
|
22
|
+
= link_to 'Edit', edit_<%= singular_table_name %>_path(<%= singular_table_name %>), class: 'btn btn-mini'
|
23
|
+
'
|
24
|
+
- if can? :destroy, <%= singular_table_name %>
|
25
|
+
= link_to 'Destroy', <%= singular_table_name %>_path(<%= singular_table_name %>), method: :delete, data: { confirm: "Are you sure?" }, class: 'btn btn-mini btn-danger'
|
24
26
|
|
25
|
-
|
26
|
-
|
27
|
-
= link_to 'New <%= human_name %>', new_<%= singular_table_name %>_path, class: 'btn btn-primary'
|
27
|
+
- if can? :create, <%= singular_table_name.classify %>
|
28
|
+
= link_to 'New <%= human_name %>', new_<%= singular_table_name %>_path, class: 'btn btn-primary'
|
@@ -1,15 +1,17 @@
|
|
1
1
|
.page-header
|
2
|
-
h1 <%= singular_table_name %>
|
2
|
+
h1 <%= singular_table_name.capitalize %>
|
3
3
|
|
4
|
+
dl
|
4
5
|
<% attributes.each do |attribute| -%>
|
5
|
-
|
6
|
-
|
7
|
-
= @<%= singular_table_name %>.<%= attribute.name %>
|
6
|
+
dt <%= attribute.human_name %>
|
7
|
+
dd= @<%= singular_table_name %>.<%= attribute.name %>
|
8
8
|
<% end -%>
|
9
9
|
|
10
|
-
|
11
|
-
'
|
10
|
+
- if can?(:edit, @<%= singular_table_name %>)
|
11
|
+
= link_to 'Edit', edit_<%= singular_table_name %>_path(@<%= singular_table_name %>), class: 'btn'
|
12
|
+
'
|
12
13
|
= link_to 'Back', <%= index_helper %>_path, class: 'btn'
|
13
|
-
'
|
14
|
-
= link_to 'Destroy', <%= singular_table_name %>_path(@<%= singular_table_name %>), method: :delete, data: { confirm: "Are you sure?" }, class: 'btn btn-danger'
|
15
14
|
|
15
|
+
- if can?(:destroy, @<%= singular_table_name %>)
|
16
|
+
'
|
17
|
+
= link_to'Destroy', <%= singular_table_name %>_path(@<%= singular_table_name %>), method: :delete, data: { confirm: "Are you sure?" }, class: 'btn btn-danger'
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# This is an example spec, delete when there are some real specs.
|
2
|
+
|
3
|
+
class Foo
|
4
|
+
bar: ->
|
5
|
+
false
|
6
|
+
|
7
|
+
class Bar
|
8
|
+
foo: ->
|
9
|
+
false
|
10
|
+
|
11
|
+
|
12
|
+
describe "Foo", ->
|
13
|
+
it "it is not bar", ->
|
14
|
+
v = new Foo()
|
15
|
+
expect(v.bar()).toEqual(false)
|
16
|
+
|
17
|
+
describe "Bar", ->
|
18
|
+
it "it is not foo", ->
|
19
|
+
v = new Bar()
|
20
|
+
expect(v.foo()).toEqual(false)
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'cancan/matchers'
|
3
|
+
|
4
|
+
describe "User" do
|
5
|
+
context "when working with User" do
|
6
|
+
context "as a non-admin" do
|
7
|
+
let(:user) { build(:user) { |u| u.id = 1 } }
|
8
|
+
subject { Ability.new(user) }
|
9
|
+
|
10
|
+
context "operating on themselves" do
|
11
|
+
it { should be_able_to(:manage, user) }
|
12
|
+
end
|
13
|
+
|
14
|
+
context "operating on someone else" do
|
15
|
+
let(:other) { build(:user) { |u| u.id = 2 } }
|
16
|
+
|
17
|
+
it { should_not be_able_to(:manage, other) }
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
context "as an admin" do
|
22
|
+
let(:user) { build(:admin) { |u| u.id = 1 } }
|
23
|
+
subject { Ability.new(user) }
|
24
|
+
|
25
|
+
context "operating on themselves" do
|
26
|
+
it { should be_able_to(:manage, user) }
|
27
|
+
end
|
28
|
+
|
29
|
+
context "operating on someone else" do
|
30
|
+
let(:other) { build(:user) { |u| u.id = 2 } }
|
31
|
+
|
32
|
+
it { should be_able_to(:manage, other) }
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= rbenv_ruby %>
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: raygun
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-10-
|
12
|
+
date: 2012-10-31 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
@@ -84,6 +84,7 @@ extensions: []
|
|
84
84
|
extra_rdoc_files: []
|
85
85
|
files:
|
86
86
|
- .gitignore
|
87
|
+
- .rbenv-version
|
87
88
|
- .rvmrc
|
88
89
|
- Gemfile
|
89
90
|
- LICENSE.txt
|
@@ -91,13 +92,22 @@ files:
|
|
91
92
|
- Rakefile
|
92
93
|
- TODO.md
|
93
94
|
- bin/raygun
|
95
|
+
- generators/application_template.rb
|
96
|
+
- generators/simplecov/simplecov.rb
|
97
|
+
- generators/simplecov/simplecov_template.rb
|
98
|
+
- generators/simplecov/spec/support/simplecov.rb
|
99
|
+
- generators/simplecov/tasks/coverage.rake
|
94
100
|
- lib/raygun/actions.rb
|
95
101
|
- lib/raygun/app_builder.rb
|
96
102
|
- lib/raygun/generators/app_generator.rb
|
103
|
+
- lib/raygun/helpers/ruby_version_helpers.rb
|
104
|
+
- lib/raygun/raygun.rb
|
97
105
|
- lib/raygun/version.rb
|
98
106
|
- marvin.jpg
|
99
107
|
- raygun.gemspec
|
100
108
|
- templates/Gemfile_customized
|
109
|
+
- templates/Guardfile_customized
|
110
|
+
- templates/Procfile
|
101
111
|
- templates/README.md.erb
|
102
112
|
- templates/_app/assets/stylesheets/_footer.less
|
103
113
|
- templates/_app/assets/stylesheets/application.css.less
|
@@ -107,6 +117,7 @@ files:
|
|
107
117
|
- templates/_app/controllers/user_sessions_controller.rb
|
108
118
|
- templates/_app/helpers/application_helper.rb
|
109
119
|
- templates/_app/mailers/user_mailer.rb
|
120
|
+
- templates/_app/models/ability.rb
|
110
121
|
- templates/_app/models/user.rb
|
111
122
|
- templates/_app/models/user_session.rb
|
112
123
|
- templates/_app/views/layouts/application.html.slim.erb
|
@@ -122,8 +133,10 @@ files:
|
|
122
133
|
- templates/_app/views/user_sessions/new.html.slim
|
123
134
|
- templates/_config/database.yml.erb
|
124
135
|
- templates/_db/sample_data.rb
|
125
|
-
- templates/_lib/
|
136
|
+
- templates/_lib/tasks/coverage.rake
|
126
137
|
- templates/_lib/tasks/db.rake
|
138
|
+
- templates/_lib/tasks/spec.rake
|
139
|
+
- templates/_lib/templates/rails/scaffold_controller/controller.rb
|
127
140
|
- templates/_lib/templates/rspec/scaffold/controller_spec.rb
|
128
141
|
- templates/_lib/templates/slim/scaffold/_form.html.slim
|
129
142
|
- templates/_lib/templates/slim/scaffold/edit.html.slim
|
@@ -132,13 +145,18 @@ files:
|
|
132
145
|
- templates/_lib/templates/slim/scaffold/show.html.slim
|
133
146
|
- templates/_public/index.html.erb
|
134
147
|
- templates/_spec/factories/users.rb
|
148
|
+
- templates/_spec/javascripts/example_spec.js.coffee
|
149
|
+
- templates/_spec/javascripts/spec.css
|
150
|
+
- templates/_spec/javascripts/spec.js.coffee
|
135
151
|
- templates/_spec/mailers/user_mailer_spec.rb
|
152
|
+
- templates/_spec/models/ability_spec.rb
|
136
153
|
- templates/_spec/models/user_spec.rb
|
137
154
|
- templates/_spec/requests/user_sessions_spec.rb
|
138
155
|
- templates/_spec/support/accept_values.rb
|
139
156
|
- templates/_spec/support/factory_girl.rb
|
140
157
|
- templates/_spec/support/sorcery.rb
|
141
158
|
- templates/_spec/support/user_sessions_request_helper.rb
|
159
|
+
- templates/rbenv-version.erb
|
142
160
|
- templates/rvmrc.erb
|
143
161
|
homepage: https://github.com/carbonfive/raygun
|
144
162
|
licenses: []
|