bear 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +5 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +110 -0
- data/LICENSE +21 -0
- data/README.md +36 -0
- data/Rakefile +2 -0
- data/bear.gemspec +27 -0
- data/bin/bear +4 -0
- data/features/new.feature +24 -0
- data/features/support/setup.rb +1 -0
- data/lib/bear.rb +6 -0
- data/lib/bear/cli.rb +71 -0
- data/lib/bear/version.rb +3 -0
- data/templates/admin.rb +23 -0
- data/templates/admin/cucumber.rb +76 -0
- data/templates/admin/dashboard_spec.rb +23 -0
- data/templates/admin/layout.rb +28 -0
- data/templates/admin/users.rb +115 -0
- data/templates/admin/users_spec.rb +30 -0
- data/templates/application_layout.rb +65 -0
- data/templates/bootstrap.rb +100 -0
- data/templates/clean_routes.rb +8 -0
- data/templates/db.rb +2 -0
- data/templates/db_seed.rb +1 -0
- data/templates/devise.rb +112 -0
- data/templates/devise/cucumber.rb +116 -0
- data/templates/gemfile.rb +36 -0
- data/templates/haml_generator.rb +7 -0
- data/templates/home_controller.rb +9 -0
- data/templates/initializers.rb +24 -0
- data/templates/jammit.rb +20 -0
- data/templates/js.rb +58 -0
- data/templates/rails_clean.rb +5 -0
- data/templates/rspec_clean.rb +3 -0
- data/templates/sass.rb +459 -0
- data/templates/test_suite.rb +41 -0
- metadata +185 -0
@@ -0,0 +1,28 @@
|
|
1
|
+
create_file 'app/views/admin/dashboard/index.html.haml' do
|
2
|
+
<<-FILE
|
3
|
+
%h1 #{app_name.humanize} Admin
|
4
|
+
FILE
|
5
|
+
end
|
6
|
+
|
7
|
+
create_file 'app/views/layouts/admin.html.haml' do
|
8
|
+
<<-FILE
|
9
|
+
!!! 5
|
10
|
+
%html
|
11
|
+
%head
|
12
|
+
%meta{ "http-equiv" => "Content-Type", :content => "text/html; charset=utf-8" }
|
13
|
+
%meta{ "http-equiv" => "X-UA-Compatible", :content => "IE=edge,chrome=1" }
|
14
|
+
%title
|
15
|
+
#{app_name.humanize}
|
16
|
+
= yield(:title)
|
17
|
+
%meta{ :name => "viewport", :content => "width=device-width; initial-scale=1.0" }
|
18
|
+
= csrf_meta_tag
|
19
|
+
= include_stylesheets(:admin, :media => "all")
|
20
|
+
= yield(:head)
|
21
|
+
%body
|
22
|
+
- unless flash_messages.blank?
|
23
|
+
#flash_messages= raw(flash_messages)
|
24
|
+
|
25
|
+
= yield
|
26
|
+
= include_javascripts(:common)
|
27
|
+
FILE
|
28
|
+
end
|
@@ -0,0 +1,115 @@
|
|
1
|
+
generate(:controller, "admin/users index new create edit update destroy")
|
2
|
+
|
3
|
+
inject_into_file 'config/routes.rb', :after => "devise_for :users\n" do
|
4
|
+
<<-'FILE'
|
5
|
+
namespace "admin" do
|
6
|
+
resources :users
|
7
|
+
end
|
8
|
+
FILE
|
9
|
+
end
|
10
|
+
|
11
|
+
inject_into_file 'app/controllers/admin/users_controller.rb', :after => "def index\n" do
|
12
|
+
<<-'FILE'
|
13
|
+
@users = User.paginate :page => params[:page], :per_page => 50
|
14
|
+
FILE
|
15
|
+
end
|
16
|
+
|
17
|
+
inject_into_file 'app/controllers/admin/users_controller.rb', :after => "def new\n" do
|
18
|
+
<<-'FILE'
|
19
|
+
@user = User.new
|
20
|
+
FILE
|
21
|
+
end
|
22
|
+
|
23
|
+
inject_into_file 'app/controllers/admin/users_controller.rb', :after => "def create\n" do
|
24
|
+
<<-'FILE'
|
25
|
+
@user = User.new
|
26
|
+
@user.attributes = params[:user]
|
27
|
+
if @user.save
|
28
|
+
flash[:notice] = "User created!"
|
29
|
+
redirect_to(admin_users_path)
|
30
|
+
else
|
31
|
+
render(:action => "new")
|
32
|
+
end
|
33
|
+
FILE
|
34
|
+
end
|
35
|
+
|
36
|
+
inject_into_file 'app/controllers/admin/users_controller.rb', :after => "def update\n" do
|
37
|
+
<<-'FILE'
|
38
|
+
params[:user].delete(:password) if params[:user][:password].blank?
|
39
|
+
params[:user].delete(:password_confirmation) if params[:user][:password].blank? and params[:user][:password_confirmation].blank?
|
40
|
+
if @user.update_attributes(params[:user])
|
41
|
+
flash[:notice] = "Successfully updated #{@user.name}."
|
42
|
+
redirect_to(admin_users_url)
|
43
|
+
else
|
44
|
+
render(:action => "edit")
|
45
|
+
end
|
46
|
+
FILE
|
47
|
+
end
|
48
|
+
|
49
|
+
inject_into_file 'app/controllers/admin/users_controller.rb', :after => "def destroy\n" do
|
50
|
+
<<-'FILE'
|
51
|
+
@user.destroy
|
52
|
+
flash[:notice] = "User deleted."
|
53
|
+
redirect_to(admin_users_path)
|
54
|
+
FILE
|
55
|
+
end
|
56
|
+
|
57
|
+
gsub_file 'app/controllers/admin/users_controller.rb', /ApplicationController/, 'Admin::BaseController'
|
58
|
+
|
59
|
+
inject_into_file 'app/controllers/admin/users_controller.rb', :after => "class Admin::UsersController < Admin::BaseController\n" do
|
60
|
+
<<-'FILE'
|
61
|
+
before_filter :find_user, :only => [ :edit, :update, :destroy ]
|
62
|
+
|
63
|
+
def find_user
|
64
|
+
@user = User.find(params[:id])
|
65
|
+
end
|
66
|
+
|
67
|
+
FILE
|
68
|
+
end
|
69
|
+
|
70
|
+
create_file 'app/views/admin/users/_form.html.haml' do
|
71
|
+
<<-'FILE'
|
72
|
+
= semantic_form_for([ :admin, @user ]) do |f|
|
73
|
+
= f.semnatic_errors
|
74
|
+
= f.inputs(:name, :email, :password, :password_confirmation)
|
75
|
+
= f.buttons
|
76
|
+
FILE
|
77
|
+
end
|
78
|
+
|
79
|
+
create_file 'app/views/admin/users/edit.html.haml' do
|
80
|
+
<<-'FILE'
|
81
|
+
= render(:partial => "form")
|
82
|
+
FILE
|
83
|
+
end
|
84
|
+
|
85
|
+
create_file 'app/views/admin/users/new.html.haml' do
|
86
|
+
<<-'FILE'
|
87
|
+
= render(:partial => "form")
|
88
|
+
FILE
|
89
|
+
end
|
90
|
+
|
91
|
+
create_file 'app/views/admin/users/index.html.haml' do
|
92
|
+
<<-FILE
|
93
|
+
- if !@users.blank?
|
94
|
+
%table
|
95
|
+
%thead
|
96
|
+
%tr
|
97
|
+
%th Name
|
98
|
+
%th Email
|
99
|
+
%th
|
100
|
+
%tbody
|
101
|
+
- @users.each do |user|
|
102
|
+
%tr
|
103
|
+
%td= link_to(user.name, edit_admin_user_path(user), :class => "edit_link")
|
104
|
+
%td= user.email
|
105
|
+
%td
|
106
|
+
- if user.id != current_user.id
|
107
|
+
= link_to("Delete", admin_user_path(user), :confirm => 'Are you sure?', :method => :delete, :class => "delete_link")
|
108
|
+
- else
|
109
|
+
That's you!
|
110
|
+
= will_paginate(@users)
|
111
|
+
- else
|
112
|
+
%p No users
|
113
|
+
FILE
|
114
|
+
end
|
115
|
+
|
@@ -0,0 +1,30 @@
|
|
1
|
+
run "rm spec/controllers/admin/users_controller_spec.rb"
|
2
|
+
|
3
|
+
create_file "spec/controllers/admin/users_controller_spec.rb" do
|
4
|
+
<<-"FILE"
|
5
|
+
require "spec_helper"
|
6
|
+
include Devise::TestHelpers
|
7
|
+
|
8
|
+
describe Admin::UsersController do
|
9
|
+
let(:admin) { Fabricate(:admin) }
|
10
|
+
|
11
|
+
before do
|
12
|
+
sign_in(admin)
|
13
|
+
end
|
14
|
+
|
15
|
+
describe "GET 'index'" do
|
16
|
+
it "should be successful" do
|
17
|
+
get "index"
|
18
|
+
response.should be_success
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe "GET 'new'" do
|
23
|
+
it "should be successful" do
|
24
|
+
get "new"
|
25
|
+
response.should be_success
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
FILE
|
30
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
run "mkdir app/views/shared"
|
2
|
+
|
3
|
+
run "rm app/helpers/application_helper.rb"
|
4
|
+
create_file "app/helpers/application_helper.rb" do
|
5
|
+
<<-"FILE"
|
6
|
+
module ApplicationHelper
|
7
|
+
def flash_messages
|
8
|
+
%w(notice warning error).collect { |message|
|
9
|
+
unless flash[message.to_sym].blank?
|
10
|
+
content_tag(:p, flash[message.to_sym], :class => "message" + message)
|
11
|
+
end
|
12
|
+
}.join
|
13
|
+
end
|
14
|
+
end
|
15
|
+
FILE
|
16
|
+
end
|
17
|
+
|
18
|
+
run "rm app/views/layouts/application.html.erb"
|
19
|
+
create_file "app/views/layouts/application.html.haml" do
|
20
|
+
<<-FILE
|
21
|
+
!!! 5
|
22
|
+
|
23
|
+
%html
|
24
|
+
%head
|
25
|
+
%meta{ "http-equiv" => "Content-Type", :content => "text/html; charset=utf-8" }
|
26
|
+
%meta{ "http-equiv" => "X-UA-Compatible", :content => "IE=edge,chrome=1" }
|
27
|
+
%title
|
28
|
+
#{app_name.humanize}
|
29
|
+
= yield(:title)
|
30
|
+
%meta{ :name => "description", :content => "" }
|
31
|
+
%meta{ :name => "author", :content => "" }
|
32
|
+
%meta{ :name => "viewport", :content => "width=device-width; initial-scale=1.0" }
|
33
|
+
= csrf_meta_tag
|
34
|
+
= include_stylesheets(:main, :media => "all")
|
35
|
+
= yield(:head)
|
36
|
+
|
37
|
+
%body
|
38
|
+
#header
|
39
|
+
.container_12
|
40
|
+
.grid_12
|
41
|
+
%h1= link_to("#{app_name.humanize}", root_path)
|
42
|
+
%ul
|
43
|
+
%li= link_to("Home", root_path)
|
44
|
+
.clear
|
45
|
+
|
46
|
+
- unless flash_messages.blank?
|
47
|
+
.container_12
|
48
|
+
.grid_12
|
49
|
+
#flash_messages= raw(flash_messages)
|
50
|
+
.clear
|
51
|
+
|
52
|
+
#content
|
53
|
+
.container_2
|
54
|
+
= yield
|
55
|
+
.clear
|
56
|
+
|
57
|
+
.container_12
|
58
|
+
.grid_12
|
59
|
+
#footer
|
60
|
+
.clear
|
61
|
+
|
62
|
+
= include_javascripts(:common)
|
63
|
+
= coffee_script_bundle
|
64
|
+
FILE
|
65
|
+
end
|
@@ -0,0 +1,100 @@
|
|
1
|
+
require "net/http"
|
2
|
+
require "net/https"
|
3
|
+
require "uri"
|
4
|
+
require "rbconfig"
|
5
|
+
|
6
|
+
say "Building Application with Bear..."
|
7
|
+
|
8
|
+
def get_remote_https_file(source, destination)
|
9
|
+
uri = URI.parse(source)
|
10
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
11
|
+
http.use_ssl = true
|
12
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
13
|
+
request = Net::HTTP::Get.new(uri.request_uri)
|
14
|
+
response = http.request(request)
|
15
|
+
path = File.join(destination_root, destination)
|
16
|
+
File.open(path, "w") { |file| file.write(response.body) }
|
17
|
+
end
|
18
|
+
|
19
|
+
append_file ".gitignore" do
|
20
|
+
".DS_Store"
|
21
|
+
".bundle"
|
22
|
+
"capybara-*.html"
|
23
|
+
"config/database.yml"
|
24
|
+
"log/*.log"
|
25
|
+
"public/stylesheets/compiled/"
|
26
|
+
"public/system/**/**/**/*"
|
27
|
+
"public/uploads"
|
28
|
+
"tmp/**/*"
|
29
|
+
end
|
30
|
+
|
31
|
+
git :init
|
32
|
+
|
33
|
+
# Apply Gemfile
|
34
|
+
apply File.expand_path("../gemfile.rb", __FILE__)
|
35
|
+
|
36
|
+
# Apply Jammit
|
37
|
+
apply File.expand_path("../jammit.rb", __FILE__)
|
38
|
+
|
39
|
+
# Apply HAML generator
|
40
|
+
apply File.expand_path("../haml_generator.rb", __FILE__)
|
41
|
+
|
42
|
+
# Apply rails clean up
|
43
|
+
apply File.expand_path("../rails_clean.rb", __FILE__)
|
44
|
+
|
45
|
+
# Apply js
|
46
|
+
apply File.expand_path("../js.rb", __FILE__)
|
47
|
+
|
48
|
+
# Apply HTML5 Layout
|
49
|
+
apply File.expand_path("../application_layout.rb", __FILE__)
|
50
|
+
|
51
|
+
# Apply SASS
|
52
|
+
apply File.expand_path("../sass.rb", __FILE__)
|
53
|
+
|
54
|
+
# Apply Test Suite
|
55
|
+
apply File.expand_path("../test_suite.rb", __FILE__)
|
56
|
+
|
57
|
+
# Apply Devise?
|
58
|
+
apply File.expand_path("../devise.rb", __FILE__) if ENV["BEAR_AUTH"]
|
59
|
+
|
60
|
+
# Apply admin
|
61
|
+
apply File.expand_path("../admin.rb", __FILE__) if ENV["BEAR_ADMIN"]
|
62
|
+
|
63
|
+
# Apply db create and migrations
|
64
|
+
apply File.expand_path("../db.rb", __FILE__)
|
65
|
+
|
66
|
+
# Apply db seeds
|
67
|
+
apply File.expand_path("../db_seed.rb", __FILE__)
|
68
|
+
|
69
|
+
# Make a home controller
|
70
|
+
apply File.expand_path("../home_controller.rb", __FILE__)
|
71
|
+
|
72
|
+
# Make initializers
|
73
|
+
apply File.expand_path("../initializers.rb", __FILE__)
|
74
|
+
|
75
|
+
# Clean up generated routes
|
76
|
+
apply File.expand_path("../clean_routes.rb", __FILE__)
|
77
|
+
|
78
|
+
# Remove RSpec stuff we are not gonna use right away
|
79
|
+
apply File.expand_path("../rspec_clean.rb", __FILE__)
|
80
|
+
|
81
|
+
login_msg = (ENV["BEAR_ADMIN"]) ? "Login to admin with email #{ENV["BEAR_USER_EMAIL"]} and password #{ENV["BEAR_USER_PASSWORD"]}" : ""
|
82
|
+
|
83
|
+
say <<-D
|
84
|
+
|
85
|
+
|
86
|
+
|
87
|
+
|
88
|
+
########################################################################
|
89
|
+
|
90
|
+
Bear says RAWR!!!
|
91
|
+
|
92
|
+
Next run...
|
93
|
+
rake spec
|
94
|
+
rake cucumber
|
95
|
+
rails s
|
96
|
+
|
97
|
+
#{login_msg}
|
98
|
+
|
99
|
+
########################################################################
|
100
|
+
D
|
@@ -0,0 +1,8 @@
|
|
1
|
+
gsub_file("config/routes.rb", /get \"home\/index\"/, '')
|
2
|
+
gsub_file("config/routes.rb", /get \"users\/index\"/, '')
|
3
|
+
gsub_file("config/routes.rb", /get \"users\/new\"/, '')
|
4
|
+
gsub_file("config/routes.rb", /get \"users\/create\"/, '')
|
5
|
+
gsub_file("config/routes.rb", /get \"users\/edit\"/, '')
|
6
|
+
gsub_file("config/routes.rb", /get \"users\/update\"/, '')
|
7
|
+
gsub_file("config/routes.rb", /get \"users\/destroy\"/, '')
|
8
|
+
gsub_file("config/routes.rb", /get \"dashboard\/index\"/, '')
|
data/templates/db.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
run 'rake db:seed'
|
data/templates/devise.rb
ADDED
@@ -0,0 +1,112 @@
|
|
1
|
+
say "Building authentication"
|
2
|
+
gsub_file 'config/application.rb', /:password/, ':password, :password_confirmation'
|
3
|
+
|
4
|
+
run 'rails generate devise:install'
|
5
|
+
run 'rails generate devise:views'
|
6
|
+
|
7
|
+
gsub_file 'config/environments/development.rb', /# Don't care if the mailer can't send/, '### ActionMailer Config'
|
8
|
+
|
9
|
+
gsub_file 'config/environments/development.rb', /config.action_mailer.raise_delivery_errors = false/ do
|
10
|
+
<<-RUBY
|
11
|
+
config.action_mailer.default_url_options = { :host => '0.0.0.0:3000' }
|
12
|
+
# A dummy setup for development - no deliveries, but logged
|
13
|
+
config.action_mailer.delivery_method = :smtp
|
14
|
+
config.action_mailer.perform_deliveries = false
|
15
|
+
config.action_mailer.raise_delivery_errors = true
|
16
|
+
config.action_mailer.default :charset => "utf-8"
|
17
|
+
RUBY
|
18
|
+
end
|
19
|
+
|
20
|
+
inject_into_file 'config/environments/test.rb', :after => "config.action_controller.allow_forgery_protection = false\n" do
|
21
|
+
<<-RUBY
|
22
|
+
config.action_mailer.default_url_options = { :host => '0.0.0.0:3000' }
|
23
|
+
RUBY
|
24
|
+
end
|
25
|
+
|
26
|
+
gsub_file 'config/environments/production.rb', /config.i18n.fallbacks = true/ do
|
27
|
+
<<-RUBY
|
28
|
+
config.i18n.fallbacks = true
|
29
|
+
config.action_mailer.default_url_options = { :host => 'yourhost.com' }
|
30
|
+
### ActionMailer Config
|
31
|
+
# Setup for production - deliveries, no errors raised
|
32
|
+
config.action_mailer.delivery_method = :smtp
|
33
|
+
config.action_mailer.perform_deliveries = true
|
34
|
+
config.action_mailer.raise_delivery_errors = false
|
35
|
+
config.action_mailer.default :charset => "utf-8"
|
36
|
+
RUBY
|
37
|
+
end
|
38
|
+
|
39
|
+
run 'rails generate devise User'
|
40
|
+
run 'rm app/models/user.rb'
|
41
|
+
|
42
|
+
create_file 'app/models/user.rb' do
|
43
|
+
<<-RUBY
|
44
|
+
class User < ActiveRecord::Base
|
45
|
+
devise :database_authenticatable, :token_authenticatable, :recoverable, :rememberable, :trackable, :validatable, :confirmable
|
46
|
+
|
47
|
+
validates_presence_of :name
|
48
|
+
validates_uniqueness_of :name, :email, :case_sensitive => false, :scope => :deleted_at
|
49
|
+
|
50
|
+
default_scope :conditions => { :deleted_at => nil }
|
51
|
+
|
52
|
+
attr_accessible :name, :email, :password, :password_confirmation, :remember_me
|
53
|
+
|
54
|
+
def destroy
|
55
|
+
self.update_attribute(:deleted_at, Time.now.utc)
|
56
|
+
end
|
57
|
+
|
58
|
+
def self.find_with_destroyed(*args)
|
59
|
+
self.with_exclusive_scope { find(*args) }
|
60
|
+
end
|
61
|
+
|
62
|
+
def self.find_only_destroyed
|
63
|
+
self.with_exclusive_scope(:find => { :conditions => "deleted_at IS NOT NULL" }) do
|
64
|
+
all
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
RUBY
|
69
|
+
end
|
70
|
+
|
71
|
+
generate(:migration, "AddNameToUsers name:string")
|
72
|
+
generate(:migration, "AddDeletedAtToUsers deleted_at:datetime")
|
73
|
+
|
74
|
+
inject_into_file 'app/views/layouts/application.html.haml', :after => "%li= link_to(\"Home\", root_path)" do
|
75
|
+
<<-'FILE'
|
76
|
+
- if user_signed_in?
|
77
|
+
%li
|
78
|
+
= link_to('Logout', destroy_user_session_path)
|
79
|
+
- else
|
80
|
+
%li
|
81
|
+
= link_to('Login', new_user_session_path)
|
82
|
+
%li
|
83
|
+
User:
|
84
|
+
- if current_user
|
85
|
+
= current_user.name
|
86
|
+
- else
|
87
|
+
(not logged in)
|
88
|
+
FILE
|
89
|
+
end
|
90
|
+
|
91
|
+
devise_migration = Dir['db/migrate/*_devise_create_users.rb'].first
|
92
|
+
|
93
|
+
gsub_file devise_migration, /# t.confirmable/, 't.confirmable'
|
94
|
+
gsub_file devise_migration, /# t.token_authenticatable/, 't.token_authenticatable'
|
95
|
+
gsub_file devise_migration, /# add_index :users, :confirmation_token, :unique => true/, 'add_index :users, :confirmation_token, :unique => true'
|
96
|
+
|
97
|
+
append_file 'db/seeds.rb' do
|
98
|
+
<<-FILE
|
99
|
+
|
100
|
+
# Setup initial user so we can get in
|
101
|
+
user = User.create!(
|
102
|
+
:name => '#{ENV['BEAR_USER_NAME']}',
|
103
|
+
:email => '#{ENV['BEAR_USER_EMAIL']}',
|
104
|
+
:password => '#{ENV['BEAR_USER_PASSWORD']}',
|
105
|
+
:password_confirmation => '#{ENV['BEAR_USER_PASSWORD']}')
|
106
|
+
user.confirmed_at = user.confirmation_sent_at
|
107
|
+
user.save!
|
108
|
+
FILE
|
109
|
+
end
|
110
|
+
|
111
|
+
# make cukes and websteps for devise
|
112
|
+
apply File.expand_path("../devise/cucumber.rb", __FILE__)
|