gravis-clearance 0.3.7
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/LICENSE +21 -0
- data/README.textile +165 -0
- data/Rakefile +46 -0
- data/TODO.textile +22 -0
- data/generators/clearance/USAGE +1 -0
- data/generators/clearance/clearance_generator.rb +73 -0
- data/generators/clearance/templates/app/controllers/application.rb +5 -0
- data/generators/clearance/templates/app/controllers/confirmations_controller.rb +3 -0
- data/generators/clearance/templates/app/controllers/passwords_controller.rb +3 -0
- data/generators/clearance/templates/app/controllers/sessions_controller.rb +3 -0
- data/generators/clearance/templates/app/controllers/users_controller.rb +3 -0
- data/generators/clearance/templates/app/models/clearance_mailer.rb +5 -0
- data/generators/clearance/templates/app/models/user.rb +3 -0
- data/generators/clearance/templates/app/views/clearance_mailer/change_password.html.erb +6 -0
- data/generators/clearance/templates/app/views/clearance_mailer/confirmation.html.erb +1 -0
- data/generators/clearance/templates/app/views/confirmations/new.html.erb +6 -0
- data/generators/clearance/templates/app/views/passwords/edit.html.erb +23 -0
- data/generators/clearance/templates/app/views/passwords/new.html.erb +15 -0
- data/generators/clearance/templates/app/views/sessions/new.html.erb +26 -0
- data/generators/clearance/templates/app/views/users/_form.html.erb +13 -0
- data/generators/clearance/templates/app/views/users/edit.html.erb +4 -0
- data/generators/clearance/templates/app/views/users/new.html.erb +4 -0
- data/generators/clearance/templates/test/factories.rb +9 -0
- data/generators/clearance/templates/test/functional/confirmations_controller_test.rb +5 -0
- data/generators/clearance/templates/test/functional/passwords_controller_test.rb +5 -0
- data/generators/clearance/templates/test/functional/sessions_controller_test.rb +5 -0
- data/generators/clearance/templates/test/functional/users_controller_test.rb +5 -0
- data/generators/clearance/templates/test/unit/clearance_mailer_test.rb +6 -0
- data/generators/clearance/templates/test/unit/user_test.rb +5 -0
- data/lib/clearance.rb +15 -0
- data/lib/clearance/app/controllers/application_controller.rb +84 -0
- data/lib/clearance/app/controllers/confirmations_controller.rb +46 -0
- data/lib/clearance/app/controllers/passwords_controller.rb +67 -0
- data/lib/clearance/app/controllers/sessions_controller.rb +79 -0
- data/lib/clearance/app/controllers/users_controller.rb +47 -0
- data/lib/clearance/app/models/clearance_mailer.rb +33 -0
- data/lib/clearance/app/models/user.rb +93 -0
- data/lib/clearance/test/functional/confirmations_controller_test.rb +85 -0
- data/lib/clearance/test/functional/passwords_controller_test.rb +188 -0
- data/lib/clearance/test/functional/sessions_controller_test.rb +148 -0
- data/lib/clearance/test/functional/users_controller_test.rb +67 -0
- data/lib/clearance/test/test_helper.rb +94 -0
- data/lib/clearance/test/unit/clearance_mailer_test.rb +63 -0
- data/lib/clearance/test/unit/user_test.rb +222 -0
- data/lib/clearance/version.rb +7 -0
- metadata +120 -0
| @@ -0,0 +1,13 @@ | |
| 1 | 
            +
            <%= form.error_messages %>
         | 
| 2 | 
            +
            <div class="text_field">
         | 
| 3 | 
            +
              <%= form.label :email %>
         | 
| 4 | 
            +
              <%= form.text_field :email %>
         | 
| 5 | 
            +
            </div>
         | 
| 6 | 
            +
            <div class="password_field">
         | 
| 7 | 
            +
              <%= form.label :password %>
         | 
| 8 | 
            +
              <%= form.password_field :password %>
         | 
| 9 | 
            +
            </div>
         | 
| 10 | 
            +
            <div class="password_field">
         | 
| 11 | 
            +
              <%= form.label :password_confirmation %>
         | 
| 12 | 
            +
              <%= form.password_field :password_confirmation %>
         | 
| 13 | 
            +
            </div>
         | 
    
        data/lib/clearance.rb
    ADDED
    
    | @@ -0,0 +1,15 @@ | |
| 1 | 
            +
            require 'clearance/app/controllers/application_controller'
         | 
| 2 | 
            +
            require 'clearance/app/controllers/confirmations_controller'
         | 
| 3 | 
            +
            require 'clearance/app/controllers/passwords_controller'
         | 
| 4 | 
            +
            require 'clearance/app/controllers/sessions_controller'
         | 
| 5 | 
            +
            require 'clearance/app/controllers/users_controller'
         | 
| 6 | 
            +
            require 'clearance/app/models/user'
         | 
| 7 | 
            +
            require 'clearance/app/models/clearance_mailer'
         | 
| 8 | 
            +
            require 'clearance/test/functional/confirmations_controller_test'
         | 
| 9 | 
            +
            require 'clearance/test/functional/sessions_controller_test'
         | 
| 10 | 
            +
            require 'clearance/test/functional/users_controller_test'
         | 
| 11 | 
            +
            require 'clearance/test/functional/passwords_controller_test'
         | 
| 12 | 
            +
            require 'clearance/test/test_helper'
         | 
| 13 | 
            +
            require 'clearance/test/unit/user_test'
         | 
| 14 | 
            +
            require 'clearance/test/unit/clearance_mailer_test'
         | 
| 15 | 
            +
            require 'clearance/version'
         | 
| @@ -0,0 +1,84 @@ | |
| 1 | 
            +
            module Clearance
         | 
| 2 | 
            +
              module App
         | 
| 3 | 
            +
                module Controllers
         | 
| 4 | 
            +
                  module ApplicationController
         | 
| 5 | 
            +
                
         | 
| 6 | 
            +
                    def self.included(base)
         | 
| 7 | 
            +
                      base.class_eval do
         | 
| 8 | 
            +
                        helper_method :current_user
         | 
| 9 | 
            +
                        helper_method :logged_in?
         | 
| 10 | 
            +
                    
         | 
| 11 | 
            +
                        include InstanceMethods
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                     protected
         | 
| 14 | 
            +
                        include ProtectedInstanceMethods
         | 
| 15 | 
            +
                      end
         | 
| 16 | 
            +
                    end
         | 
| 17 | 
            +
                
         | 
| 18 | 
            +
                    module InstanceMethods
         | 
| 19 | 
            +
                      def current_user
         | 
| 20 | 
            +
                        @current_user ||= (user_from_session || user_from_cookie)
         | 
| 21 | 
            +
                      end
         | 
| 22 | 
            +
                  
         | 
| 23 | 
            +
                      def logged_in?
         | 
| 24 | 
            +
                        ! current_user.nil?
         | 
| 25 | 
            +
                      end
         | 
| 26 | 
            +
                    end
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                    module ProtectedInstanceMethods
         | 
| 29 | 
            +
                      def authenticate
         | 
| 30 | 
            +
                        deny_access unless logged_in?
         | 
| 31 | 
            +
                      end
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                      def user_from_session
         | 
| 34 | 
            +
                        user_model.find_by_id session[:user_id]
         | 
| 35 | 
            +
                      end
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                      def user_from_cookie
         | 
| 38 | 
            +
                        user = user_model.find_by_remember_token(cookies[:auth_token]) if cookies[:auth_token]
         | 
| 39 | 
            +
                        user && user.remember_token? ? user : nil
         | 
| 40 | 
            +
                      end
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                      # Level of indirection so you can easily override this method
         | 
| 43 | 
            +
                      # but also call #login .
         | 
| 44 | 
            +
                      def log_user_in(user)
         | 
| 45 | 
            +
                        login(user)
         | 
| 46 | 
            +
                      end
         | 
| 47 | 
            +
             | 
| 48 | 
            +
                      def login(user)
         | 
| 49 | 
            +
                        session[:user_id] = user.id if user
         | 
| 50 | 
            +
                        @current_user = user
         | 
| 51 | 
            +
                      end
         | 
| 52 | 
            +
             | 
| 53 | 
            +
                      def redirect_back_or(default)
         | 
| 54 | 
            +
                        session[:return_to] ? redirect_to(session[:return_to]) : redirect_to(default)
         | 
| 55 | 
            +
                        session[:return_to] = nil
         | 
| 56 | 
            +
                      end
         | 
| 57 | 
            +
                  
         | 
| 58 | 
            +
                      def redirect_to_root
         | 
| 59 | 
            +
                        redirect_to root_url
         | 
| 60 | 
            +
                      end
         | 
| 61 | 
            +
             | 
| 62 | 
            +
                      def store_location
         | 
| 63 | 
            +
                        session[:return_to] = request.request_uri
         | 
| 64 | 
            +
                      end
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                      def deny_access(flash_message = nil, opts = {})
         | 
| 67 | 
            +
                        opts[:redirect] ||= new_session_path
         | 
| 68 | 
            +
                        store_location
         | 
| 69 | 
            +
                        flash[:error] = flash_message if flash_message
         | 
| 70 | 
            +
                        redirect_to opts[:redirect]
         | 
| 71 | 
            +
                      end
         | 
| 72 | 
            +
                  
         | 
| 73 | 
            +
                      def user_model
         | 
| 74 | 
            +
                        User
         | 
| 75 | 
            +
                      end
         | 
| 76 | 
            +
             | 
| 77 | 
            +
                      def mailer_model
         | 
| 78 | 
            +
                        ClearanceMailer
         | 
| 79 | 
            +
                      end
         | 
| 80 | 
            +
                    end
         | 
| 81 | 
            +
                  end
         | 
| 82 | 
            +
                end
         | 
| 83 | 
            +
              end
         | 
| 84 | 
            +
            end
         | 
| @@ -0,0 +1,46 @@ | |
| 1 | 
            +
            module Clearance
         | 
| 2 | 
            +
              module App
         | 
| 3 | 
            +
                module Controllers
         | 
| 4 | 
            +
                  module ConfirmationsController
         | 
| 5 | 
            +
                
         | 
| 6 | 
            +
                    def self.included(base)
         | 
| 7 | 
            +
                      base.class_eval do
         | 
| 8 | 
            +
                        before_filter :existing_user?, :only => [:new, :create]
         | 
| 9 | 
            +
                    
         | 
| 10 | 
            +
                        include InstanceMethods
         | 
| 11 | 
            +
                    
         | 
| 12 | 
            +
                      private
         | 
| 13 | 
            +
                        include PrivateInstanceMethods
         | 
| 14 | 
            +
                      end
         | 
| 15 | 
            +
                    end
         | 
| 16 | 
            +
                
         | 
| 17 | 
            +
                    module InstanceMethods
         | 
| 18 | 
            +
                      def new
         | 
| 19 | 
            +
                        @user = User.find_by_id_and_salt(params[:user_id], params[:salt])
         | 
| 20 | 
            +
                      end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                      def create
         | 
| 23 | 
            +
                        @user = User.find_by_id_and_salt(params[:user_id], params[:salt])
         | 
| 24 | 
            +
                        @user.confirm!
         | 
| 25 | 
            +
                        session[:user_id] = @user.id
         | 
| 26 | 
            +
                        redirect_to url_after_create
         | 
| 27 | 
            +
                      end
         | 
| 28 | 
            +
                    end
         | 
| 29 | 
            +
                
         | 
| 30 | 
            +
                    module PrivateInstanceMethods
         | 
| 31 | 
            +
                      def existing_user?
         | 
| 32 | 
            +
                        user = User.find_by_id_and_salt(params[:user_id], params[:salt])
         | 
| 33 | 
            +
                        if user.nil?
         | 
| 34 | 
            +
                          render :nothing => true, :status => :not_found
         | 
| 35 | 
            +
                        end
         | 
| 36 | 
            +
                      end
         | 
| 37 | 
            +
                      
         | 
| 38 | 
            +
                      def url_after_create
         | 
| 39 | 
            +
                        root_url
         | 
| 40 | 
            +
                      end
         | 
| 41 | 
            +
                    end
         | 
| 42 | 
            +
                
         | 
| 43 | 
            +
                  end
         | 
| 44 | 
            +
                end
         | 
| 45 | 
            +
              end
         | 
| 46 | 
            +
            end
         | 
| @@ -0,0 +1,67 @@ | |
| 1 | 
            +
            module Clearance
         | 
| 2 | 
            +
              module App
         | 
| 3 | 
            +
                module Controllers
         | 
| 4 | 
            +
                  module PasswordsController
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                    def self.included(base)
         | 
| 7 | 
            +
                      base.class_eval do
         | 
| 8 | 
            +
                        before_filter :existing_user?, :only => [:edit, :update]
         | 
| 9 | 
            +
                        filter_parameter_logging :password, :password_confirmation
         | 
| 10 | 
            +
                        
         | 
| 11 | 
            +
                        include InstanceMethods
         | 
| 12 | 
            +
                        
         | 
| 13 | 
            +
                      private
         | 
| 14 | 
            +
                        include PrivateInstanceMethods
         | 
| 15 | 
            +
                      end
         | 
| 16 | 
            +
                    end
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                    module InstanceMethods
         | 
| 19 | 
            +
                      def new
         | 
| 20 | 
            +
                      end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                      def create
         | 
| 23 | 
            +
                        user = User.find_by_email params[:password][:email]
         | 
| 24 | 
            +
                        if user.nil?
         | 
| 25 | 
            +
                          flash.now[:warning] = 'Unknown email'
         | 
| 26 | 
            +
                          render :action => :new
         | 
| 27 | 
            +
                        else
         | 
| 28 | 
            +
                          ClearanceMailer.deliver_change_password user
         | 
| 29 | 
            +
                          redirect_to url_after_create
         | 
| 30 | 
            +
                        end
         | 
| 31 | 
            +
                      end
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                      def edit
         | 
| 34 | 
            +
                        @user = User.find_by_email_and_crypted_password(params[:email],
         | 
| 35 | 
            +
                                                                        params[:password])
         | 
| 36 | 
            +
                      end
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                      def update
         | 
| 39 | 
            +
                        @user = User.find_by_email_and_crypted_password(params[:email],
         | 
| 40 | 
            +
                                                                        params[:password])
         | 
| 41 | 
            +
                        if @user.update_attributes params[:user]
         | 
| 42 | 
            +
                          session[:user_id] = @user.id
         | 
| 43 | 
            +
                          redirect_to @user
         | 
| 44 | 
            +
                        else
         | 
| 45 | 
            +
                          render :action => :edit
         | 
| 46 | 
            +
                        end
         | 
| 47 | 
            +
                      end
         | 
| 48 | 
            +
                    end
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                    module PrivateInstanceMethods
         | 
| 51 | 
            +
                      def existing_user?
         | 
| 52 | 
            +
                        user = User.find_by_email_and_crypted_password(params[:email],
         | 
| 53 | 
            +
                                                                       params[:password])
         | 
| 54 | 
            +
                        if user.nil?
         | 
| 55 | 
            +
                          render :nothing => true, :status => :not_found
         | 
| 56 | 
            +
                        end
         | 
| 57 | 
            +
                      end
         | 
| 58 | 
            +
                      
         | 
| 59 | 
            +
                      def url_after_create
         | 
| 60 | 
            +
                        new_session_url
         | 
| 61 | 
            +
                      end
         | 
| 62 | 
            +
                    end
         | 
| 63 | 
            +
             | 
| 64 | 
            +
                  end
         | 
| 65 | 
            +
                end
         | 
| 66 | 
            +
              end
         | 
| 67 | 
            +
            end
         | 
| @@ -0,0 +1,79 @@ | |
| 1 | 
            +
            module Clearance
         | 
| 2 | 
            +
              module App
         | 
| 3 | 
            +
                module Controllers
         | 
| 4 | 
            +
                  module SessionsController
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                    def self.included(base)
         | 
| 7 | 
            +
                      base.class_eval do
         | 
| 8 | 
            +
                        skip_before_filter :authenticate
         | 
| 9 | 
            +
                        protect_from_forgery :except => :create
         | 
| 10 | 
            +
                        filter_parameter_logging :password
         | 
| 11 | 
            +
                    
         | 
| 12 | 
            +
                        include InstanceMethods
         | 
| 13 | 
            +
                    
         | 
| 14 | 
            +
                      private
         | 
| 15 | 
            +
                        include PrivateInstanceMethods
         | 
| 16 | 
            +
                      end
         | 
| 17 | 
            +
                    end
         | 
| 18 | 
            +
                
         | 
| 19 | 
            +
                    module InstanceMethods
         | 
| 20 | 
            +
                      def create
         | 
| 21 | 
            +
                        @user = user_model.authenticate(params[:session][:email], params[:session][:password])
         | 
| 22 | 
            +
                        if @user.nil?
         | 
| 23 | 
            +
                          login_failure
         | 
| 24 | 
            +
                        else
         | 
| 25 | 
            +
                          if @user.confirmed?
         | 
| 26 | 
            +
                            remember_me = params[:session][:remember_me] if params[:session]
         | 
| 27 | 
            +
                            remember(@user) if remember_me == '1'
         | 
| 28 | 
            +
                            log_user_in(@user)
         | 
| 29 | 
            +
                            login_successful
         | 
| 30 | 
            +
                          else
         | 
| 31 | 
            +
                            mailer_model.deliver_confirmation(@user)
         | 
| 32 | 
            +
                            deny_access('Account not confirmed. Confirmation email sent.')
         | 
| 33 | 
            +
                          end
         | 
| 34 | 
            +
                        end
         | 
| 35 | 
            +
                      end
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                      def destroy
         | 
| 38 | 
            +
                        forget(current_user)
         | 
| 39 | 
            +
                        reset_session
         | 
| 40 | 
            +
                        flash[:notice] = 'You have been logged out.'
         | 
| 41 | 
            +
                        redirect_to url_after_destroy
         | 
| 42 | 
            +
                      end
         | 
| 43 | 
            +
                    end
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                    module PrivateInstanceMethods
         | 
| 46 | 
            +
                      def login_successful
         | 
| 47 | 
            +
                        flash[:notice] = 'Logged in successfully'
         | 
| 48 | 
            +
                        redirect_back_or url_after_create
         | 
| 49 | 
            +
                      end
         | 
| 50 | 
            +
             | 
| 51 | 
            +
                      def login_failure(message = "Bad email or password.")
         | 
| 52 | 
            +
                        flash.now[:notice] = message
         | 
| 53 | 
            +
                        render :action => :new
         | 
| 54 | 
            +
                      end
         | 
| 55 | 
            +
                  
         | 
| 56 | 
            +
                      def remember(user)
         | 
| 57 | 
            +
                        user.remember_me!
         | 
| 58 | 
            +
                        cookies[:auth_token] = { :value   => user.remember_token, 
         | 
| 59 | 
            +
                                                 :expires => user.remember_token_expires_at }
         | 
| 60 | 
            +
                      end
         | 
| 61 | 
            +
             | 
| 62 | 
            +
                      def forget(user)
         | 
| 63 | 
            +
                        user.forget_me! if user
         | 
| 64 | 
            +
                        cookies.delete :auth_token
         | 
| 65 | 
            +
                      end
         | 
| 66 | 
            +
             | 
| 67 | 
            +
                      def url_after_create
         | 
| 68 | 
            +
                        root_url
         | 
| 69 | 
            +
                      end
         | 
| 70 | 
            +
             | 
| 71 | 
            +
                      def url_after_destroy
         | 
| 72 | 
            +
                        new_session_url
         | 
| 73 | 
            +
                      end
         | 
| 74 | 
            +
                    end
         | 
| 75 | 
            +
                    
         | 
| 76 | 
            +
                  end
         | 
| 77 | 
            +
                end
         | 
| 78 | 
            +
              end
         | 
| 79 | 
            +
            end
         | 
| @@ -0,0 +1,47 @@ | |
| 1 | 
            +
            module Clearance
         | 
| 2 | 
            +
              module App
         | 
| 3 | 
            +
                module Controllers
         | 
| 4 | 
            +
                  module UsersController
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                    def self.included(base)
         | 
| 7 | 
            +
                      base.class_eval do
         | 
| 8 | 
            +
                        before_filter :redirect_to_root, :only => [:new, :create], :if => :logged_in?
         | 
| 9 | 
            +
                    
         | 
| 10 | 
            +
                        filter_parameter_logging :password
         | 
| 11 | 
            +
                    
         | 
| 12 | 
            +
                        include InstanceMethods
         | 
| 13 | 
            +
                    
         | 
| 14 | 
            +
                      private
         | 
| 15 | 
            +
                        include PrivateInstanceMethods
         | 
| 16 | 
            +
                      end
         | 
| 17 | 
            +
                    end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                    module InstanceMethods
         | 
| 20 | 
            +
                      def new
         | 
| 21 | 
            +
                        @user = user_model.new(params[:user])
         | 
| 22 | 
            +
                      end
         | 
| 23 | 
            +
                  
         | 
| 24 | 
            +
                      def create
         | 
| 25 | 
            +
                        @user = user_model.new params[:user]
         | 
| 26 | 
            +
                        if @user.save
         | 
| 27 | 
            +
                          ClearanceMailer.deliver_confirmation @user
         | 
| 28 | 
            +
                          flash[:notice] = "You will receive an email within the next few minutes. It contains instructions for you to confirm your account."
         | 
| 29 | 
            +
                          redirect_to url_after_create
         | 
| 30 | 
            +
                        else
         | 
| 31 | 
            +
                          render :action => "new"
         | 
| 32 | 
            +
                        end
         | 
| 33 | 
            +
                      end
         | 
| 34 | 
            +
                    end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                    module PrivateInstanceMethods
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                      def url_after_create
         | 
| 39 | 
            +
                        new_session_url
         | 
| 40 | 
            +
                      end
         | 
| 41 | 
            +
                    
         | 
| 42 | 
            +
                    end
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                  end
         | 
| 45 | 
            +
                end
         | 
| 46 | 
            +
              end
         | 
| 47 | 
            +
            end
         | 
| @@ -0,0 +1,33 @@ | |
| 1 | 
            +
            module Clearance
         | 
| 2 | 
            +
              module App
         | 
| 3 | 
            +
                module Models
         | 
| 4 | 
            +
                  module ClearanceMailer
         | 
| 5 | 
            +
                
         | 
| 6 | 
            +
                    def self.included(base)
         | 
| 7 | 
            +
                      base.class_eval do
         | 
| 8 | 
            +
                    
         | 
| 9 | 
            +
                        include InstanceMethods
         | 
| 10 | 
            +
                    
         | 
| 11 | 
            +
                      end
         | 
| 12 | 
            +
                    end
         | 
| 13 | 
            +
                
         | 
| 14 | 
            +
                    module InstanceMethods
         | 
| 15 | 
            +
                      def change_password(user)
         | 
| 16 | 
            +
                        from       DO_NOT_REPLY
         | 
| 17 | 
            +
                        recipients user.email
         | 
| 18 | 
            +
                        subject    "[#{PROJECT_NAME.humanize}] Change your password"
         | 
| 19 | 
            +
                        body       :user => user
         | 
| 20 | 
            +
                      end
         | 
| 21 | 
            +
                    
         | 
| 22 | 
            +
                      def confirmation(user)
         | 
| 23 | 
            +
                        recipients user.email
         | 
| 24 | 
            +
                        from       DO_NOT_REPLY
         | 
| 25 | 
            +
                        subject   "[#{PROJECT_NAME.humanize}] Account confirmation"
         | 
| 26 | 
            +
                        body      :user => user
         | 
| 27 | 
            +
                      end
         | 
| 28 | 
            +
                    end
         | 
| 29 | 
            +
                    
         | 
| 30 | 
            +
                  end
         | 
| 31 | 
            +
                end
         | 
| 32 | 
            +
              end
         | 
| 33 | 
            +
            end
         |