mologue 0.0.1
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.
- data/.gitignore +6 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +110 -0
- data/LICENSE +21 -0
- data/README.md +69 -0
- data/Rakefile +2 -0
- data/bin/mologue +4 -0
- data/features/new.feature +40 -0
- data/features/support/setup.rb +1 -0
- data/lib/mologue.rb +7 -0
- data/lib/mologue/cli.rb +52 -0
- data/lib/mologue/version.rb +3 -0
- data/mologue.gemspec +27 -0
- data/templates/admin.rb +24 -0
- data/templates/admin/cucumber.rb +70 -0
- data/templates/admin/dashboard_spec.rb +23 -0
- data/templates/admin/layout.rb +76 -0
- data/templates/admin/sass.rb +80 -0
- data/templates/admin/users.rb +137 -0
- data/templates/admin/users_spec.rb +31 -0
- data/templates/application_layout.rb +71 -0
- data/templates/bootstrap.rb +117 -0
- data/templates/cancan.rb +112 -0
- data/templates/clean_routes.rb +8 -0
- data/templates/db.rb +2 -0
- data/templates/db_seed.rb +5 -0
- data/templates/devise.rb +215 -0
- data/templates/devise/cucumber.rb +111 -0
- data/templates/dynamic_form.rb +1 -0
- data/templates/friendly_id.rb +1 -0
- data/templates/gemfile.rb +46 -0
- data/templates/haml_generator.rb +7 -0
- data/templates/home_controller.rb +10 -0
- data/templates/initializers.rb +27 -0
- data/templates/jammit.rb +17 -0
- data/templates/js.rb +60 -0
- data/templates/mongoid.rb +46 -0
- data/templates/rails_clean.rb +7 -0
- data/templates/rspec_clean.rb +3 -0
- data/templates/rvm.rb +11 -0
- data/templates/sass.rb +152 -0
- data/templates/terminitor.rb +12 -0
- data/templates/test_suite.rb +92 -0
- metadata +192 -0
data/templates/cancan.rb
ADDED
@@ -0,0 +1,112 @@
|
|
1
|
+
say "Building roles"
|
2
|
+
generate(:model, "role name:string")
|
3
|
+
generate(:migration, "UsersHaveAndBelongToManyRoles")
|
4
|
+
habtm_roles = Dir['db/migrate/*_users_have_and_belong_to_many_roles.rb'].first
|
5
|
+
inject_into_file habtm_roles, :after => "def self.up\n" do
|
6
|
+
<<-RUBY
|
7
|
+
create_table :roles_users, :id => false do |t|
|
8
|
+
t.references :role, :user
|
9
|
+
end
|
10
|
+
RUBY
|
11
|
+
end
|
12
|
+
|
13
|
+
inject_into_file habtm_roles, :after => "def self.down\n" do
|
14
|
+
<<-RUBY
|
15
|
+
drop_table :roles_users
|
16
|
+
RUBY
|
17
|
+
end
|
18
|
+
|
19
|
+
inject_into_file 'app/models/user.rb', :after => "class User < ActiveRecord::Base\n" do
|
20
|
+
<<-RUBY
|
21
|
+
has_and_belongs_to_many :roles
|
22
|
+
RUBY
|
23
|
+
end
|
24
|
+
|
25
|
+
inject_into_file 'app/models/role.rb', :after => "class Role < ActiveRecord::Base\n" do
|
26
|
+
<<-RUBY
|
27
|
+
has_and_belongs_to_many :users
|
28
|
+
|
29
|
+
def self.sanitize role
|
30
|
+
role.to_s.humanize.split(' ').each{ |word| word.capitalize! }.join(' ')
|
31
|
+
end
|
32
|
+
RUBY
|
33
|
+
end
|
34
|
+
|
35
|
+
create_file 'app/models/ability.rb' do
|
36
|
+
<<-RUBY
|
37
|
+
class Ability
|
38
|
+
include CanCan::Ability
|
39
|
+
|
40
|
+
def initialize(user)
|
41
|
+
user ||= User.new # guest user
|
42
|
+
|
43
|
+
if user.role? :admin
|
44
|
+
can :manage, :all
|
45
|
+
# elsif user.role? :writter
|
46
|
+
# can :manage, [Post, Asset]
|
47
|
+
# elsif user.role? :memeber
|
48
|
+
# can :read, [MemberPost, Asset]
|
49
|
+
# # manage posts, assets user owns
|
50
|
+
# can :manage, Post do |p|
|
51
|
+
# p.try(:owner) == user
|
52
|
+
# end
|
53
|
+
# can :manage, Asset do |a|
|
54
|
+
# a.try(:owner) == user
|
55
|
+
# end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
RUBY
|
60
|
+
end
|
61
|
+
|
62
|
+
inject_into_file 'app/models/user.rb', :before => "def destroy\n" do
|
63
|
+
<<-RUBY
|
64
|
+
|
65
|
+
def role?(role)
|
66
|
+
return !!self.roles.find_by_name( Role.sanitize role )
|
67
|
+
end
|
68
|
+
|
69
|
+
RUBY
|
70
|
+
end
|
71
|
+
|
72
|
+
inject_into_file 'app/controllers/application_controller.rb', :before => "end\n" do
|
73
|
+
<<-RUBY
|
74
|
+
|
75
|
+
rescue_from CanCan::AccessDenied do |exception|
|
76
|
+
flash[:error] = "Access Denied"
|
77
|
+
redirect_to root_url
|
78
|
+
end
|
79
|
+
RUBY
|
80
|
+
end
|
81
|
+
|
82
|
+
if ENV['MOLOGUE_ADMIN']
|
83
|
+
inject_into_file 'app/views/admin/users/_form.html.haml', :after => "= f.password_field :password_confirmation\n" do
|
84
|
+
<<-'RUBY'
|
85
|
+
.form_row
|
86
|
+
- Role.find(:all, :order => "name").each do |role|
|
87
|
+
.check_box_item
|
88
|
+
= check_box_tag "user[role_ids][]", role.id, @user.roles.include?(role), :id => "user_role_#{role.id}"
|
89
|
+
%label{:for => "user_role_#{role.id}"}= role.name.humanize
|
90
|
+
= hidden_field_tag "user[role_ids][]", ""
|
91
|
+
RUBY
|
92
|
+
end
|
93
|
+
|
94
|
+
gsub_file 'app/controllers/admin/users_controller.rb', /# attr_accessor logic here/, '@user.accessible = [:role_ids] if current_user.role? :admin'
|
95
|
+
end
|
96
|
+
|
97
|
+
append_file 'db/seeds.rb' do
|
98
|
+
<<-FILE
|
99
|
+
Role.create! :name => 'Admin'
|
100
|
+
Role.create! :name => 'Member'
|
101
|
+
|
102
|
+
user1 = User.find_by_email('#{ENV['MOLOGUE_USER_EMAIL']}')
|
103
|
+
user1.role_ids = [1,2]
|
104
|
+
user1.save
|
105
|
+
FILE
|
106
|
+
end
|
107
|
+
|
108
|
+
|
109
|
+
|
110
|
+
|
111
|
+
|
112
|
+
|
@@ -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
data/templates/devise.rb
ADDED
@@ -0,0 +1,215 @@
|
|
1
|
+
say "Building authentication"
|
2
|
+
gsub_file 'config/application.rb', /:password/, ':password, :password_confirmation'
|
3
|
+
|
4
|
+
run 'rails generate devise:install'
|
5
|
+
|
6
|
+
gsub_file 'config/environments/development.rb', /# Don't care if the mailer can't send/, '### ActionMailer Config'
|
7
|
+
|
8
|
+
gsub_file 'config/environments/development.rb', /config.action_mailer.raise_delivery_errors = false/ do
|
9
|
+
<<-RUBY
|
10
|
+
config.action_mailer.default_url_options = { :host => '0.0.0.0:3000' }
|
11
|
+
# A dummy setup for development - no deliveries, but logged
|
12
|
+
config.action_mailer.delivery_method = :smtp
|
13
|
+
config.action_mailer.perform_deliveries = false
|
14
|
+
config.action_mailer.raise_delivery_errors = true
|
15
|
+
config.action_mailer.default :charset => "utf-8"
|
16
|
+
RUBY
|
17
|
+
end
|
18
|
+
|
19
|
+
inject_into_file 'config/environments/test.rb', :after => "config.action_controller.allow_forgery_protection = false\n" do
|
20
|
+
<<-RUBY
|
21
|
+
config.action_mailer.default_url_options = { :host => '0.0.0.0:3000' }
|
22
|
+
RUBY
|
23
|
+
end
|
24
|
+
|
25
|
+
gsub_file 'config/environments/production.rb', /config.i18n.fallbacks = true/ do
|
26
|
+
<<-RUBY
|
27
|
+
config.i18n.fallbacks = true
|
28
|
+
config.action_mailer.default_url_options = { :host => 'yourhost.com' }
|
29
|
+
### ActionMailer Config
|
30
|
+
# Setup for production - deliveries, no errors raised
|
31
|
+
config.action_mailer.delivery_method = :smtp
|
32
|
+
config.action_mailer.perform_deliveries = true
|
33
|
+
config.action_mailer.raise_delivery_errors = false
|
34
|
+
config.action_mailer.default :charset => "utf-8"
|
35
|
+
RUBY
|
36
|
+
end
|
37
|
+
|
38
|
+
run 'rails generate devise User'
|
39
|
+
|
40
|
+
run 'rm app/models/user.rb'
|
41
|
+
if ENV['MOLOGUE_MONGOID']
|
42
|
+
create_file 'app/models/user.rb' do
|
43
|
+
<<-RUBY
|
44
|
+
class User
|
45
|
+
include Mongoid::Document
|
46
|
+
# Include default devise modules. Others available are:
|
47
|
+
# :lockable and :timeoutable
|
48
|
+
devise :database_authenticatable, :registerable, :token_authenticatable, :recoverable, :rememberable, :trackable, :validatable, :confirmable
|
49
|
+
|
50
|
+
field :username
|
51
|
+
field :admin, :type => Boolean
|
52
|
+
|
53
|
+
validates_presence_of :username
|
54
|
+
validates_uniqueness_of :username, :email, :case_sensitive => false
|
55
|
+
attr_accessible :username, :admin, :email, :password, :password_confirmation, :remember_me
|
56
|
+
end
|
57
|
+
RUBY
|
58
|
+
end
|
59
|
+
else
|
60
|
+
create_file 'app/models/user.rb' do
|
61
|
+
<<-RUBY
|
62
|
+
class User < ActiveRecord::Base
|
63
|
+
# Include default devise modules. Others available are:
|
64
|
+
# :lockable and :timeoutable
|
65
|
+
devise :database_authenticatable, :registerable, :token_authenticatable, :recoverable, :rememberable, :trackable, :validatable, :confirmable
|
66
|
+
|
67
|
+
validates_presence_of :username
|
68
|
+
validates_uniqueness_of :username, :email, :case_sensitive => false, :scope => :deleted_at
|
69
|
+
attr_accessible :username, :admin, :email, :password, :password_confirmation, :remember_me
|
70
|
+
|
71
|
+
default_scope :conditions => { :deleted_at => nil }
|
72
|
+
has_friendly_id :username, :use_slug => true, :strip_non_ascii => true
|
73
|
+
|
74
|
+
def destroy
|
75
|
+
self.update_attribute(:deleted_at, Time.now.utc)
|
76
|
+
end
|
77
|
+
|
78
|
+
def self.find_with_destroyed *args
|
79
|
+
self.with_exclusive_scope { find(*args) }
|
80
|
+
end
|
81
|
+
|
82
|
+
def self.find_only_destroyed
|
83
|
+
self.with_exclusive_scope :find => { :conditions => "deleted_at IS NOT NULL" } do
|
84
|
+
all
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
end
|
89
|
+
RUBY
|
90
|
+
end
|
91
|
+
generate(:migration, "AddNameToUsers username:string")
|
92
|
+
generate(:migration, "AddAdminToUsers admin:boolean")
|
93
|
+
generate(:migration, "AddCachedSlugToUsers cached_slug:string")
|
94
|
+
generate(:migration, "AddDeletedAtToUsers deleted_at:datetime")
|
95
|
+
|
96
|
+
devise_migration = Dir['db/migrate/*_devise_create_users.rb'].first
|
97
|
+
|
98
|
+
gsub_file devise_migration, /# t.confirmable/, 't.confirmable'
|
99
|
+
gsub_file devise_migration, /# t.token_authenticatable/, 't.token_authenticatable'
|
100
|
+
gsub_file devise_migration, /# add_index :users, :confirmation_token, :unique => true/, 'add_index :users, :confirmation_token, :unique => true'
|
101
|
+
|
102
|
+
end
|
103
|
+
|
104
|
+
run 'rails generate devise:views'
|
105
|
+
|
106
|
+
run 'rm app/views/devise/registrations/edit.html.haml'
|
107
|
+
create_file 'app/views/devise/registrations/edit.html.haml' do
|
108
|
+
<<-FILE
|
109
|
+
%h2
|
110
|
+
Edit \#{resource_name.to_s.humanize}
|
111
|
+
= form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => { :method => :put }) do |f|
|
112
|
+
= devise_error_messages!
|
113
|
+
%p
|
114
|
+
= f.label :username
|
115
|
+
%br/
|
116
|
+
= f.text_field :username
|
117
|
+
%p
|
118
|
+
= f.label :email
|
119
|
+
%br/
|
120
|
+
= f.text_field :email
|
121
|
+
%p
|
122
|
+
= f.label :password
|
123
|
+
%i (leave blank if you don't want to change it)
|
124
|
+
%br/
|
125
|
+
= f.password_field :password
|
126
|
+
%p
|
127
|
+
= f.label :password_confirmation
|
128
|
+
%br/
|
129
|
+
= f.password_field :password_confirmation
|
130
|
+
%p
|
131
|
+
= f.label :current_password
|
132
|
+
%i (we need your current password to confirm your changes)
|
133
|
+
%br/
|
134
|
+
= f.password_field :current_password
|
135
|
+
%p= f.submit "Update"
|
136
|
+
%h3 Cancel my account
|
137
|
+
%p
|
138
|
+
Unhappy? \#{link_to "Cancel my account", registration_path(resource_name), :confirm => "Are you sure?", :method => :delete}.
|
139
|
+
= link_to "Back", :back
|
140
|
+
FILE
|
141
|
+
end
|
142
|
+
|
143
|
+
run 'rm app/views/devise/registrations/new.html.haml'
|
144
|
+
create_file 'app/views/devise/registrations/new.html.haml' do
|
145
|
+
<<-'FILE'
|
146
|
+
%h2 Sign up
|
147
|
+
= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f|
|
148
|
+
= devise_error_messages!
|
149
|
+
%p
|
150
|
+
= f.label :username
|
151
|
+
%br/
|
152
|
+
= f.text_field :username
|
153
|
+
%p
|
154
|
+
= f.label :email
|
155
|
+
%br/
|
156
|
+
= f.text_field :email
|
157
|
+
%p
|
158
|
+
= f.label :password
|
159
|
+
%br/
|
160
|
+
= f.password_field :password
|
161
|
+
%p
|
162
|
+
= f.label :password_confirmation
|
163
|
+
%br/
|
164
|
+
= f.password_field :password_confirmation
|
165
|
+
%p= f.submit "Sign up"
|
166
|
+
= render :partial => "devise/shared/links"
|
167
|
+
FILE
|
168
|
+
end
|
169
|
+
|
170
|
+
create_file "app/views/devise/menu/_registration_items.html.haml" do <<-'FILE'
|
171
|
+
- if user_signed_in?
|
172
|
+
%li
|
173
|
+
= link_to('Edit account', edit_user_registration_path)
|
174
|
+
- else
|
175
|
+
%li
|
176
|
+
= link_to('Sign up', new_user_registration_path)
|
177
|
+
FILE
|
178
|
+
end
|
179
|
+
|
180
|
+
|
181
|
+
create_file 'app/views/devise/menu/_login_items.html.haml' do
|
182
|
+
<<-'FILE'
|
183
|
+
- if user_signed_in?
|
184
|
+
%li
|
185
|
+
= link_to('Logout', destroy_user_session_path)
|
186
|
+
%li
|
187
|
+
= current_user.username
|
188
|
+
- else
|
189
|
+
%li
|
190
|
+
= link_to('Login', new_user_session_path)
|
191
|
+
FILE
|
192
|
+
end
|
193
|
+
|
194
|
+
append_file 'app/views/shared/_header.html.haml' do
|
195
|
+
<<-'FILE'
|
196
|
+
%ul#user_nav
|
197
|
+
= render 'devise/menu/registration_items'
|
198
|
+
= render 'devise/menu/login_items'
|
199
|
+
FILE
|
200
|
+
end
|
201
|
+
|
202
|
+
ENV['MOLOGUE_USERNAME'] = ask("What would you like the username of the admin user to be? (example: 'admin')")
|
203
|
+
ENV['MOLOGUE_USER_EMAIL'] = ask("What would you like the administrator's email address to be? (example: 'me@me.com')")
|
204
|
+
ENV['MOLOGUE_USER_PASSWORD'] = ask("What would you like the administrator's password to be? (example: 'xyz123')")
|
205
|
+
append_file 'db/seeds.rb' do
|
206
|
+
<<-FILE
|
207
|
+
# Setup initial user so we can get in
|
208
|
+
user = User.create! :username => "#{ENV['MOLOGUE_USERNAME']}", :email => "#{ENV['MOLOGUE_USER_EMAIL']}", :password => "#{ENV['MOLOGUE_USER_PASSWORD']}", :password_confirmation => "#{ENV['MOLOGUE_USER_PASSWORD']}"
|
209
|
+
user.confirmed_at = user.confirmation_sent_at
|
210
|
+
user.save
|
211
|
+
FILE
|
212
|
+
end
|
213
|
+
|
214
|
+
# make cukes and websteps for devise
|
215
|
+
apply File.expand_path("../devise/cucumber.rb", __FILE__)
|
@@ -0,0 +1,111 @@
|
|
1
|
+
|
2
|
+
create_file 'spec/factories/user.rb' do
|
3
|
+
<<-'FILE'
|
4
|
+
Factory.define :user do |u|
|
5
|
+
u.sequence(:username) { |n| "Quick #{n}" }
|
6
|
+
u.sequence(:email) { |n| "user.#{n}@quickleft.com" }
|
7
|
+
u.password "password"
|
8
|
+
u.confirmed_at Time.new.to_s
|
9
|
+
u.confirmation_sent_at Time.new.to_s
|
10
|
+
u.password_confirmation { |u| u.password }
|
11
|
+
end
|
12
|
+
|
13
|
+
Factory.define :admin, :parent => :user do |admin|
|
14
|
+
admin.username "admin"
|
15
|
+
admin.email "admin@quickleft.com"
|
16
|
+
admin.password "password"
|
17
|
+
end
|
18
|
+
|
19
|
+
Factory.define :member, :parent => :user do |member|
|
20
|
+
member.username "member"
|
21
|
+
member.email "member@quickleft.com"
|
22
|
+
member.password "password"
|
23
|
+
end
|
24
|
+
|
25
|
+
FILE
|
26
|
+
end
|
27
|
+
|
28
|
+
create_file 'features/step_definitions/devise_steps.rb' do
|
29
|
+
<<-'FILE'
|
30
|
+
When /^I log in as "([^\"]*)" with password "([^\"]*)"$/ do |email, password|
|
31
|
+
visit(new_user_session_path)
|
32
|
+
fill_in("user[email]", :with => email)
|
33
|
+
fill_in("user[password]", :with => password)
|
34
|
+
click_button("Sign in")
|
35
|
+
end
|
36
|
+
|
37
|
+
Given /^a logged in (\w+)$/ do |usertype|
|
38
|
+
Factory.create(usertype.to_sym)
|
39
|
+
visit(new_user_session_path)
|
40
|
+
fill_in("user[email]", :with => "#{usertype}@quickleft.com")
|
41
|
+
fill_in("user[password]", :with => "password")
|
42
|
+
click_button("Sign in")
|
43
|
+
end
|
44
|
+
|
45
|
+
When /^I log out$/ do
|
46
|
+
visit(destroy_user_session_path)
|
47
|
+
end
|
48
|
+
|
49
|
+
Given /^an? (\w+) "([^\"]*)"$/ do |usertype, email|
|
50
|
+
Factory.create(usertype.to_sym, :email => email)
|
51
|
+
end
|
52
|
+
FILE
|
53
|
+
end
|
54
|
+
|
55
|
+
inject_into_file 'features/support/paths.rb', :after => "case page_name\n" do
|
56
|
+
<<-'FILE'
|
57
|
+
|
58
|
+
when /logout/
|
59
|
+
'/users/sign_out'
|
60
|
+
|
61
|
+
when /login/
|
62
|
+
'/users/sign_in'
|
63
|
+
FILE
|
64
|
+
end
|
65
|
+
|
66
|
+
create_file 'features/forgot_password.feature' do
|
67
|
+
<<-'FILE'
|
68
|
+
Feature: Forgot password
|
69
|
+
As an user
|
70
|
+
I want to secure way to reset my password
|
71
|
+
So that I can still login if I forget it
|
72
|
+
|
73
|
+
Scenario: Follow forget your password link
|
74
|
+
Given the following user records
|
75
|
+
| email |
|
76
|
+
| forgot@quickleft.com |
|
77
|
+
When I am on the login page
|
78
|
+
And I follow "Forgot your password?"
|
79
|
+
And I fill in "Email" with "forgot@quickleft.com"
|
80
|
+
And I press "Send me reset password instructions"
|
81
|
+
Then I should see "You will receive an email with instructions about how to reset your password in a few minutes."
|
82
|
+
And 1 emails should be delivered to forgot@quickleft.com
|
83
|
+
When I click the first link in the email
|
84
|
+
And I fill in "Password" with "myNewP@ssword"
|
85
|
+
And I fill in "Password confirmation" with "myNewP@ssword"
|
86
|
+
And I press "Change my password"
|
87
|
+
Then I should see "Your password was changed successfully. You are now signed in."
|
88
|
+
FILE
|
89
|
+
end
|
90
|
+
|
91
|
+
create_file 'features/resend_verification_email.feature' do
|
92
|
+
<<-'FILE'
|
93
|
+
Feature: Resend Verification
|
94
|
+
As an user
|
95
|
+
I want to resend my verification email
|
96
|
+
So that I can activate my account if I lost the original email
|
97
|
+
|
98
|
+
Scenario: Follow resend verification email
|
99
|
+
Given the following user records
|
100
|
+
| email | confirmed_at |
|
101
|
+
| resend@quickleft.com | nil |
|
102
|
+
When I am on the login page
|
103
|
+
And I follow "Didn't receive confirmation instructions?"
|
104
|
+
And I fill in "Email" with "resend@quickleft.com"
|
105
|
+
And I press "Resend confirmation instructions"
|
106
|
+
Then I should see "You will receive an email with instructions about how to confirm your account in a few minutes."
|
107
|
+
And 2 emails should be delivered to resend@quickleft.com
|
108
|
+
When I click the first link in the email
|
109
|
+
Then I should see "Your account was successfully confirmed. You are now signed in."
|
110
|
+
FILE
|
111
|
+
end
|