myrails 1.0.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 +7 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +21 -0
- data/README.md +74 -0
- data/Rakefile +6 -0
- data/bin/console +14 -0
- data/bin/myrails +3 -0
- data/bin/setup +8 -0
- data/lib/myrails/templates/assets/animate.scss +3340 -0
- data/lib/myrails/templates/assets/application.css.sass +6 -0
- data/lib/myrails/templates/assets/application.js +10 -0
- data/lib/myrails/templates/assets/bootstrap_themes/cerulean.scss +11 -0
- data/lib/myrails/templates/assets/bootstrap_themes/cosmo.scss +11 -0
- data/lib/myrails/templates/assets/bootstrap_themes/cyborg.scss +11 -0
- data/lib/myrails/templates/assets/bootstrap_themes/darkly.scss +11 -0
- data/lib/myrails/templates/assets/bootstrap_themes/flatly.scss +11 -0
- data/lib/myrails/templates/assets/bootstrap_themes/journal.scss +11 -0
- data/lib/myrails/templates/assets/bootstrap_themes/lumen.scss +11 -0
- data/lib/myrails/templates/assets/bootstrap_themes/paper.scss +11 -0
- data/lib/myrails/templates/assets/bootstrap_themes/readable.scss +11 -0
- data/lib/myrails/templates/assets/bootstrap_themes/sandstone.scss +11 -0
- data/lib/myrails/templates/assets/bootstrap_themes/simplex.scss +11 -0
- data/lib/myrails/templates/assets/bootstrap_themes/slate.scss +11 -0
- data/lib/myrails/templates/assets/bootstrap_themes/spacelab.scss +11 -0
- data/lib/myrails/templates/assets/bootstrap_themes/superhero.scss +11 -0
- data/lib/myrails/templates/assets/bootstrap_themes/united.scss +11 -0
- data/lib/myrails/templates/assets/bootstrap_themes/yeti.scss +11 -0
- data/lib/myrails/templates/assets/will_paginate.scss +104 -0
- data/lib/myrails/templates/db/mysql_database.yml +55 -0
- data/lib/myrails/templates/db/sqlite3_database.yml +28 -0
- data/lib/myrails/templates/heroku/Procfile +1 -0
- data/lib/myrails/templates/heroku/puma.rb +15 -0
- data/lib/myrails/templates/layout/_error_messages.html.haml +6 -0
- data/lib/myrails/templates/layout/_info_messages.html.haml +9 -0
- data/lib/myrails/templates/layout/_nav.html.haml +24 -0
- data/lib/myrails/templates/layout/_success_message.html.haml +3 -0
- data/lib/myrails/templates/layout/application.html.haml +14 -0
- data/lib/myrails/templates/layout/footers/css/footer-distributed-with-address-and-phones.scss +168 -0
- data/lib/myrails/templates/layout/footers/css/footer-distributed-with-contact-form.scss +200 -0
- data/lib/myrails/templates/layout/footers/css/footer-distributed-with-search.scss +140 -0
- data/lib/myrails/templates/layout/footers/css/footer-distributed.scss +74 -0
- data/lib/myrails/templates/layout/footers/footer-distributed-with-address-and-phones.html.haml +45 -0
- data/lib/myrails/templates/layout/footers/footer-distributed-with-contact-form.html.haml +33 -0
- data/lib/myrails/templates/layout/footers/footer-distributed-with-search.html.haml +19 -0
- data/lib/myrails/templates/layout/footers/footer-distributed.html.haml +24 -0
- data/lib/myrails/templates/mailer/dev_mail_interceptor.rb +27 -0
- data/lib/myrails/templates/mailer/sendgrid.rb +8 -0
- data/lib/myrails/templates/presenters/base.rb +33 -0
- data/lib/myrails/templates/presenters/presenter.rb +19 -0
- data/lib/myrails/templates/presenters/presenter_config.rb +4 -0
- data/lib/myrails/templates/presenters/presenter_spec.rb +17 -0
- data/lib/myrails/templates/rails/application_helper.rb +49 -0
- data/lib/myrails/templates/rails/controller.rb +12 -0
- data/lib/myrails/templates/rails/model.rb +2 -0
- data/lib/myrails/templates/rails/pundit.rb +26 -0
- data/lib/myrails/templates/rspec/controller.rb +98 -0
- data/lib/myrails/templates/rspec/database_cleaner.rb +18 -0
- data/lib/myrails/templates/rspec/devise.rb +38 -0
- data/lib/myrails/templates/rspec/factory.rb +5 -0
- data/lib/myrails/templates/rspec/factory_girl.rb +3 -0
- data/lib/myrails/templates/rspec/files.rb +3 -0
- data/lib/myrails/templates/rspec/javascript.rb +8 -0
- data/lib/myrails/templates/rspec/mailer.rb +7 -0
- data/lib/myrails/templates/rspec/model.rb +5 -0
- data/lib/myrails/templates/rspec/pundit.rb +28 -0
- data/lib/myrails/templates/rspec/pundit_matchers.rb +47 -0
- data/lib/myrails/templates/rspec/router.rb +7 -0
- data/lib/myrails/templates/rspec/shoulda_matchers.rb +16 -0
- data/lib/myrails/templates/rspec/silence_backtrace.rb +8 -0
- data/lib/myrails/templates/ui/index.html.haml +6 -0
- data/lib/myrails/templates/ui/ui_controller.rb +8 -0
- data/lib/myrails/version.rb +3 -0
- data/lib/myrails.rb +399 -0
- data/myrails.gemspec +37 -0
- data/spec/controllers/sam_controller_spec.rb +98 -0
- data/spec/myrails_spec.rb +11 -0
- data/spec/spec_helper.rb +2 -0
- metadata +197 -0
@@ -0,0 +1,27 @@
|
|
1
|
+
# @author Lovell McIlwain
|
2
|
+
#
|
3
|
+
# Mail interceptor for development and test emails
|
4
|
+
require 'socket'
|
5
|
+
class DevMailInterceptor
|
6
|
+
def self.delivering_email(message)
|
7
|
+
dev_text = "\n\n\n------------\n"
|
8
|
+
dev_text += "To address is: #{message.to.to_a.join(", ")}\n"
|
9
|
+
dev_text += "CC address is: #{message.cc.to_a.join(", ")}\n"
|
10
|
+
dev_text += "BCC address is: #{message.bcc.to_a.join(", ")}\n"
|
11
|
+
|
12
|
+
message.subject = "[#{Socket.gethostname}] [#{Rails.env}] #{message.subject}"
|
13
|
+
message.to = '<%= options[:email]%>'
|
14
|
+
message.cc = ""
|
15
|
+
message.bcc = ""
|
16
|
+
append_address_info(message, dev_text)
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.append_address_info(part, dev_text)
|
20
|
+
case part.content_type
|
21
|
+
when %r{^text/plain} then part.body = part.body.to_s + dev_text
|
22
|
+
when %r{^text/html} then part.body = part.body.to_s + ("<pre>#{dev_text}</pre>").html_safe
|
23
|
+
end
|
24
|
+
part.parts.each { |p| append_address_info(p, dev_text)}
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
# config.action_mailer.delivery_method = :smtp
|
2
|
+
# config.action_mailer.smtp_settings = { address: 'smtp.sendgrid.net',
|
3
|
+
# port: 587,
|
4
|
+
# domain: 'yourdomain.com',
|
5
|
+
# user_name: 'someuser',
|
6
|
+
# password: 'somepassword',
|
7
|
+
# authentication: 'plain',
|
8
|
+
# enable_starttls_auto: true }
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# @author Lovell McIlwain
|
2
|
+
#
|
3
|
+
# Class every presenter class should inherit from
|
4
|
+
class BasePresenter
|
5
|
+
# Initialize class with object to be presented and the view it is to be presented on
|
6
|
+
def initialize(object, template)
|
7
|
+
@object = object
|
8
|
+
@template = template
|
9
|
+
end
|
10
|
+
|
11
|
+
# Same as application helper short date
|
12
|
+
def format_date(date)
|
13
|
+
date.strftime("%Y-%m-%d")
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
# Class method to call the object by its class
|
18
|
+
def self.presents(name)
|
19
|
+
define_method(name) do
|
20
|
+
@object
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
# Accessor for template methods
|
25
|
+
def t
|
26
|
+
@template
|
27
|
+
end
|
28
|
+
|
29
|
+
# In the event a method called can't be found, default to the template methods
|
30
|
+
def method_missing(*args, &block)
|
31
|
+
@template.send(*args, &block)
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# @author Lovell McIlwain
|
2
|
+
#
|
3
|
+
# Presenter class for object views
|
4
|
+
class <%= options[:name].camelize %>Presenter < BasePresenter
|
5
|
+
# Reference initialized object_presenter as object
|
6
|
+
presents :<%= options[:name]%>
|
7
|
+
|
8
|
+
# delegate :attribute, to: :object, allow_nil: true
|
9
|
+
|
10
|
+
# Return concatenated full name
|
11
|
+
def name
|
12
|
+
<%= options[:name]%>.attribute + " " + <%= options[:name]%>.attribute
|
13
|
+
end
|
14
|
+
|
15
|
+
# Return edit path
|
16
|
+
def edit_link
|
17
|
+
link_to :Edit, edit_<%= options[:name]%>_path(<%= options[:name]%>)
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
|
2
|
+
require 'rails_helper'
|
3
|
+
#
|
4
|
+
describe <%= options[:name].camelize %>Presenter do
|
5
|
+
include_behavior
|
6
|
+
|
7
|
+
let(:presenter) {<%= options[:name].camelize %>Presenter.new(<%= options[:name] %>, view)}
|
8
|
+
let(:<%= options[:name] %>) {create :<%= options[:name] %>}
|
9
|
+
|
10
|
+
it 'returns name' do
|
11
|
+
expect(presenter.name).to eq object.attribute + " " + object.attribute
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'returns edit path' do
|
15
|
+
expect(presenter.edit_link).to eq link_to :Edit, edit_<%= options[:name] %>_path(<%= options[:name] %>)
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module ApplicationHelper
|
2
|
+
# Long date format
|
3
|
+
#
|
4
|
+
# @param date [Date] the date object
|
5
|
+
# @return day date month year - hour:minutes AM/PM
|
6
|
+
def long_date(date)
|
7
|
+
date.strftime("%A %d %B %Y - %H:%M %p") rescue 'unknown'
|
8
|
+
end
|
9
|
+
|
10
|
+
# Medium date format
|
11
|
+
#
|
12
|
+
# @param date [Date] the date object
|
13
|
+
# @return month/date/year at hour:minutes AM/PM
|
14
|
+
def medium_date(date)
|
15
|
+
date.strftime("%m/%d/%Y at %H:%M %p") rescue 'unknown'
|
16
|
+
end
|
17
|
+
|
18
|
+
# Another style of medium date format
|
19
|
+
#
|
20
|
+
# @param date [Date] the date object
|
21
|
+
# @return day/MONTH/YEAR
|
22
|
+
# Produces -> 18 October 2015
|
23
|
+
def medium_date2(date)
|
24
|
+
date.strftime("%d %B %Y") rescue 'unknown'
|
25
|
+
end
|
26
|
+
|
27
|
+
# Short date format
|
28
|
+
#
|
29
|
+
# @param date [Date] the date object
|
30
|
+
# @return year-month-date
|
31
|
+
def short_date(date)
|
32
|
+
date.strftime("%Y-%m-%d") rescue 'unknown'
|
33
|
+
end
|
34
|
+
|
35
|
+
# US date format
|
36
|
+
#
|
37
|
+
# @param date [Date] the date object
|
38
|
+
# @return year-month-date
|
39
|
+
def us_date(date)
|
40
|
+
date.strftime("%m/%d/%Y at %H:%M %p") rescue 'unknown'
|
41
|
+
end
|
42
|
+
|
43
|
+
def present(object, klass = nil)
|
44
|
+
klass ||= "#{object.class}Presenter".constantize
|
45
|
+
presenter = klass.new(object, self)
|
46
|
+
yield presenter if block_given?
|
47
|
+
presenter
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
class <%= options[:name].pluralize.camelize %>Controller < ApplicationController
|
2
|
+
# before_action :<%= options[:name].singularize %>, only: []
|
3
|
+
private
|
4
|
+
|
5
|
+
def <%= options[:name].singularize %>
|
6
|
+
@<%= options[:name] %> = Object.find(params[:id])
|
7
|
+
end
|
8
|
+
|
9
|
+
def <%= options[:name].singularize %>_params
|
10
|
+
params.require(:<%= options[:name] %>).permit()
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# @author Lovell McIlwain
|
2
|
+
#
|
3
|
+
# Authorization for article objects
|
4
|
+
class <%= options[:name].camelize %>Policy < ApplicationPolicy
|
5
|
+
# Allow all users to access new article objects
|
6
|
+
def new?
|
7
|
+
true
|
8
|
+
end
|
9
|
+
|
10
|
+
# Allows owner of an article to edit the article
|
11
|
+
def edit?
|
12
|
+
user == record.user
|
13
|
+
end
|
14
|
+
|
15
|
+
# Allows all users to create article objects
|
16
|
+
alias_method :create?, :new?
|
17
|
+
|
18
|
+
# Allows all users to view article objects
|
19
|
+
alias_method :show?, :new?
|
20
|
+
|
21
|
+
# Allows owner of an article to update an article object
|
22
|
+
alias_method :update?, :edit?
|
23
|
+
|
24
|
+
# Allows owner of an object to remove an object
|
25
|
+
alias_method :destroy?, :edit?
|
26
|
+
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
require 'rails_helper'
|
2
|
+
|
3
|
+
# Does this controller require authentication?
|
4
|
+
describe <%= options[:name].camelize %>Controller do
|
5
|
+
# let(:user) {create :user}
|
6
|
+
let(:<%= options[:name].pluralize %>) {[]}
|
7
|
+
let(:<%= options[:name].singularize %>) {create :<%= options[:name].singularize %>}
|
8
|
+
|
9
|
+
# before {sign_in user}
|
10
|
+
|
11
|
+
describe 'GET index' do
|
12
|
+
before do
|
13
|
+
3.times {<%= options[:name].pluralize %> << create(:<%= options[:name].singularize %>)}
|
14
|
+
get :index
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'sets @<%= options[:name].pluralize %>' do
|
18
|
+
expect(assigns[:<%= options[:name].pluralize %>]).to eq <%= options[:name].pluralize %>
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe 'GET show' do
|
23
|
+
before {get :show, params: {id: <%= options[:name].singularize %>.id}}
|
24
|
+
|
25
|
+
it 'sets @<%= options[:name].singularize %>' do
|
26
|
+
expect(assigns[:<%= options[:name].singularize %>]).to eq <%= options[:name].singularize %>
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe 'GET new' do
|
31
|
+
before {get :new}
|
32
|
+
|
33
|
+
it 'sets @<%= options[:name].singularize %>' do
|
34
|
+
expect(assigns[:<%= options[:name].singularize %>]).to be_a_new <%= options[:name].singularize.camelize %>
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe 'POST create' do
|
39
|
+
context 'successful create' do
|
40
|
+
before {post :create, params: {<%= options[:name].singularize %>: attributes_for(:<%= options[:name].singularize %>)}}
|
41
|
+
|
42
|
+
subject(:<%= options[:name].first %>){assigns[:<%= options[:name].singularize %>]}
|
43
|
+
|
44
|
+
it 'redirects to :show'
|
45
|
+
it 'sets @<%= options[:name].singularize %>'
|
46
|
+
it 'sets flash[:success]'
|
47
|
+
it 'tags the current_user as creator'
|
48
|
+
end
|
49
|
+
|
50
|
+
context 'unsuccessful create' do
|
51
|
+
before {post :create, params: {<%= options[:name].singularize %>: attributes_for(:<%= options[:name].singularize %>, attr: nil)}}
|
52
|
+
|
53
|
+
it 'renders :new template'
|
54
|
+
it 'sets @<%= options[:name].singularize %>'
|
55
|
+
it 'sets flash[:error]'
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
describe 'GET edit' do
|
60
|
+
before {get :edit, params: {id: <%= options[:name].singularize %>.id}}
|
61
|
+
|
62
|
+
it 'sets @<%= options[:name].singularize %>' do
|
63
|
+
expect(assigns[:<%= options[:name].singularize %>]).to eq <%= options[:name].singularize %>
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
describe 'PUT/PATCH update' do
|
68
|
+
context 'successful update' do
|
69
|
+
before {put :update, params: {id: <%= options[:name].singularize %>.id, <%= options[:name].singularize %>: attributes_for(:<%= options[:name].singularize %>)}}
|
70
|
+
|
71
|
+
subject(:<%= options[:name].first %>) {assigns[:<%= options[:name].singularize %>]}
|
72
|
+
|
73
|
+
it 'redirects to :show'
|
74
|
+
it 'sets @<%= options[:name].singularize %>'
|
75
|
+
it 'sets flash[:success]'
|
76
|
+
it 'tags current_user as updater'
|
77
|
+
end
|
78
|
+
|
79
|
+
context 'unsuccessful update' do
|
80
|
+
before {put :update, params: {id: <%= options[:name].singularize %>.id, <%= options[:name].singularize %>: attributes_for(:<%= options[:name].singularize %>, attr: nil)}}
|
81
|
+
|
82
|
+
it 'renders :edit template'
|
83
|
+
it 'sets @<%= options[:name].singularize %>'
|
84
|
+
it 'sets flash[:error]'
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
describe 'DELETE destroy' do
|
89
|
+
before {delete :destroy, params: {id: <%= options[:name].singularize %>.id}}
|
90
|
+
|
91
|
+
it 'redirects to :index' do
|
92
|
+
expect(response).to redirect_to <%= options[:name].pluralize %>_path
|
93
|
+
end
|
94
|
+
it 'sets @<%= options[:name].singularize %>'
|
95
|
+
it 'deletes @<%= options[:name].singularize %>'
|
96
|
+
it 'sets flash[success]'
|
97
|
+
end
|
98
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
RSpec.configure do |config|
|
2
|
+
# => database cleaner configs
|
3
|
+
config.before(:suite) do
|
4
|
+
DatabaseCleaner.clean_with(:truncation)
|
5
|
+
end
|
6
|
+
config.before(:each) do
|
7
|
+
DatabaseCleaner.strategy = :transaction
|
8
|
+
end
|
9
|
+
config.before(:each, :js => true) do
|
10
|
+
DatabaseCleaner.strategy = :truncation
|
11
|
+
end
|
12
|
+
config.before(:each) do
|
13
|
+
DatabaseCleaner.start
|
14
|
+
end
|
15
|
+
config.after(:each) do
|
16
|
+
DatabaseCleaner.clean
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
RSpec.configure do |config|
|
2
|
+
config.include Devise::Test::ControllerHelpers, type: :controller
|
3
|
+
# config.include Devise::TestHelpers, type: :controller
|
4
|
+
config.include Devise::TestHelpers, type: :view
|
5
|
+
end
|
6
|
+
|
7
|
+
# Authenticate without going through the login process
|
8
|
+
RSpec.configure do |config|
|
9
|
+
config.include Warden::Test::Helpers
|
10
|
+
config.before :suite do
|
11
|
+
Warden.test_mode!
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
RSpec.configure do |config|
|
16
|
+
config.after :each do
|
17
|
+
Warden.test_reset!
|
18
|
+
end
|
19
|
+
end
|
20
|
+
#
|
21
|
+
=begin
|
22
|
+
Reference: https://github.com/plataformatec/devise/wiki/How-To:-Test-with-Capybara
|
23
|
+
|
24
|
+
To use authentication bypass use the following for loging in:
|
25
|
+
|
26
|
+
user = FactoryGirl.create(:user)
|
27
|
+
login_as(user, :scope => :user)
|
28
|
+
|
29
|
+
if within a test you need to logout a user use:
|
30
|
+
logout(:user)
|
31
|
+
=end
|
32
|
+
|
33
|
+
def sign_in_with(user)
|
34
|
+
click_link 'Sign In'
|
35
|
+
fill_in 'user_email', with: user.email
|
36
|
+
fill_in 'user_password', with: 'somepassword'
|
37
|
+
click_button 'Log in'
|
38
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
module JavascriptHelper
|
2
|
+
# Basecamp trix uses hidden input to populate its editor
|
3
|
+
def fill_in_trix_editor(id, value)
|
4
|
+
find(:xpath, "//*[@id='#{id}']", visible: false).set(value)
|
5
|
+
end
|
6
|
+
end
|
7
|
+
|
8
|
+
# Example of use in feature test: fill_in_trix_editor("blog_comment_body_trix_input_blog_comment_#{blog_comment.id}", "some text")
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# Use with Pundit Matches: https://github.com/chrisalley/pundit-matchers
|
2
|
+
require 'rails_helper'
|
3
|
+
describe <%= options[:name].camelize %>Policy do
|
4
|
+
subject { <%= options[:name].camelize %>Policy.new(user, <%= options[:name] %>) }
|
5
|
+
|
6
|
+
let(:<%= options[:name] %>) { create :<%= options[:name] %> }
|
7
|
+
|
8
|
+
context 'for a visitor' do
|
9
|
+
it {is_expected.to permit_action(:new)}
|
10
|
+
it {is_expected.to permit_action(:create)}
|
11
|
+
it {is_expected.to permit_action(:show)}
|
12
|
+
it {is_expected.to forbid_action(:edit)}
|
13
|
+
it {is_expected.to forbid_action(:update)}
|
14
|
+
it {is_expected.to forbid_action(:destroy)}
|
15
|
+
end
|
16
|
+
|
17
|
+
context "for an admin" do
|
18
|
+
|
19
|
+
let(:user) { <%= options[:name] %>.user }
|
20
|
+
|
21
|
+
it {is_expected.to permit_action(:new)}
|
22
|
+
it {is_expected.to permit_action(:create)}
|
23
|
+
it {is_expected.to permit_action(:show)}
|
24
|
+
it {is_expected.to permit_action(:edit)}
|
25
|
+
it {is_expected.to permit_action(:update)}
|
26
|
+
it {is_expected.to permit_action(:destroy)}
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
RSpec::Matchers.define :permitted_to do |action|
|
2
|
+
match do |policy|
|
3
|
+
policy.public_send("#{action}?")
|
4
|
+
end
|
5
|
+
|
6
|
+
failure_message do |policy|
|
7
|
+
"#{policy.class} does not permit #{action} on #{policy.record} for #{policy.user.inspect}."
|
8
|
+
end
|
9
|
+
|
10
|
+
failure_message_when_negated do |policy|
|
11
|
+
"#{policy.class} does not forbid #{action} on #{policy.record} for #{policy.user.inspect}."
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def pundit_error
|
16
|
+
Pundit::NotAuthorizedError
|
17
|
+
end
|
18
|
+
|
19
|
+
=begin
|
20
|
+
|
21
|
+
example: spec/policies/projects_policy_spec.rb
|
22
|
+
|
23
|
+
require 'rails_helper'
|
24
|
+
|
25
|
+
describe ProjectPolicy do
|
26
|
+
subject { ProjectPolicy.new(user, project) }
|
27
|
+
let(:project) { Fabricate :project }
|
28
|
+
|
29
|
+
|
30
|
+
context 'for a visitor' do
|
31
|
+
it { should_not permitted_to(:create) }
|
32
|
+
it { should_not permitted_to(:new) }
|
33
|
+
it { should_not permitted_to(:update) }
|
34
|
+
it { should_not permitted_to(:edit) }
|
35
|
+
end
|
36
|
+
|
37
|
+
context "for an admin" do
|
38
|
+
let(:user) { Fabricate(:user, admin: true) }
|
39
|
+
|
40
|
+
it { should permitted_to(:create) }
|
41
|
+
it { should permitted_to(:new) }
|
42
|
+
it { should permitted_to(:update) }
|
43
|
+
it { should permitted_to(:edit) }
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
=end
|
@@ -0,0 +1,7 @@
|
|
1
|
+
# Controller test doesn't seem to use default url option when redirecting to an associated record. Uses http://test.com. This is an attmept to unify this and capybara which uses http://www.example.com.
|
2
|
+
# Add this method to the before action of any controller specs that needed it. Found it useful to use this when using shared examples.
|
3
|
+
RSpec.configure do |config|
|
4
|
+
config.before(:each) do
|
5
|
+
@request.host = 'localhost:3000'
|
6
|
+
end
|
7
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
Shoulda::Matchers.configure do |config|
|
2
|
+
config.integrate do |with|
|
3
|
+
# Choose a test framework:
|
4
|
+
with.test_framework :rspec
|
5
|
+
# with.test_framework :minitest
|
6
|
+
# with.test_framework :minitest_4
|
7
|
+
# with.test_framework :test_unit
|
8
|
+
|
9
|
+
# Choose one or more libraries:
|
10
|
+
# with.library :active_record
|
11
|
+
# with.library :active_model
|
12
|
+
# with.library :action_controller
|
13
|
+
# Or, choose the following (which implies all of the above):
|
14
|
+
with.library :rails
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,6 @@
|
|
1
|
+
%section.ui-index
|
2
|
+
%ul
|
3
|
+
- Dir.glob('app/views/ui/*.html.haml').sort.each do |file|
|
4
|
+
- wireframe = File.basename(file,'.html.haml')
|
5
|
+
- unless wireframe == 'index' || wireframe.match(/^_/)
|
6
|
+
%li= link_to wireframe.titleize, action: wireframe unless wireframe == 'index'
|