lib/cap_gun.rb in cap_gun-0.0.9 vs lib/cap_gun.rb in cap_gun-0.2.0

- old
+ new

@@ -1,6 +1,8 @@ require 'action_mailer' + +require File.join(File.dirname(__FILE__), *%w[cap_gun presenter]) require File.join(File.dirname(__FILE__), *%w[.. vendor action_mailer_tls lib smtp_tls]) # Tell everyone about your releases! Send email notification after Capistrano deployments! Rule the world! # # We include the ActionMailer hack to play nice with Gmail, so that's a super easy way @@ -24,134 +26,48 @@ # # cap -s comment="fix for bug #303" deploy # # See README for full install/config instructions. module CapGun - VERSION = '0.0.9' + VERSION = '0.0.11' - module Helper - - # Loads ActionMailer settings from a Capistrano variable called "cap_gun_action_mailer_config" - def load_mailer_config(cap) - raise ArgumentError, "You must define ActionMailer settings in 'cap_gun_action_mailer_config'" unless cap.cap_gun_action_mailer_config - raise ArgumentError, "Need at least one recipient." if !cap.exists?(:cap_gun_email_envelope) || cap[:cap_gun_email_envelope][:recipients].blank? - - ActionMailer::Base.smtp_settings = cap.cap_gun_action_mailer_config - end - - # Current user - unsupported on Windows, patches welcome - def current_user - platform.include?('mswin') ? nil : `id -un`.strip - end - - # stub hook purposes only - def platform - RUBY_PLATFORM - end - - # Gives you a prettier date/time for output from the standard Capistrano timestamped release directory. - # This assumes Capistrano uses UTC for its date/timestamped directories, and converts to the local - # machine timezone. - def humanize_release_time(path) - return unless path - match = path.match(/(\d+)$/) - return unless match - local = convert_from_utc(match[1]) - local.strftime("%B #{local.day.ordinalize}, %Y %l:%M %p #{local_timezone}").gsub(/\s+/, ' ').strip - end - - # Use some DateTime magicrey to convert UTC to the current time zone - # When the whole world is on Rails 2.1 (and therefore new ActiveSupport) we can use the magic timezone support there. - def convert_from_utc(timestamp) - # we know Capistrano release timestamps are UTC, but Ruby doesn't, so make it explicit - utc_time = timestamp << "UTC" - datetime = DateTime.parse(utc_time) - datetime.new_offset(local_datetime_zone_offset) - end - - def local_datetime_zone_offset - @local_datetime_zone_offset ||= DateTime.now.offset - end - - def local_timezone - @current_timezone ||= Time.now.zone - end - - extend self - end - # This mailer is configured with a capistrano variable called "cap_gun_email_envelope" class Mailer < ActionMailer::Base - include CapGun::Helper - DEFAULT_SENDER = %("CapGun" <cap_gun@example.com>) - DEFAULT_EMAIL_PREFIX = "[DEPLOY]" + + def self.load_mailer_config(cap) + raise ArgumentError, "You must define ActionMailer settings in 'cap_gun_action_mailer_config'" unless cap.cap_gun_action_mailer_config + raise ArgumentError, "Need at least one recipient." if !cap.exists?(:cap_gun_email_envelope) || cap[:cap_gun_email_envelope][:recipients].blank? + + ActionMailer::Base.smtp_settings = cap.cap_gun_action_mailer_config + end - adv_attr_accessor :email_prefix - attr_accessor :summary - - # Grab the options for emailing from cap_gun_email_envelope (should be set in your deploy file) + # Grab the options for emailing from capistrano[:cap_gun_email_envelope] (should be set in your deploy file) # # Valid options: # :recipients (required) an array or string of email address(es) that should get notifications # :from the sender of the notification, defaults to cap_gun@example.com # :email_prefix subject prefix, defaults to [DEPLOY] - def init(envelope = {}) - recipients envelope[:recipients] - from (envelope[:from] || DEFAULT_SENDER) - email_prefix (envelope[:email_prefix] || DEFAULT_EMAIL_PREFIX) - end - - # Do the actual email def deployment_notification(capistrano) - init(capistrano[:cap_gun_email_envelope]) - self.summary = create_summary(capistrano) + presenter = Presenter.new(capistrano) content_type "text/plain" - subject "#{email_prefix} #{capistrano[:application]} #{deployed_to(capistrano)}" - body create_body(capistrano) + from presenter.from + recipients presenter.recipients + subject presenter.subject + body presenter.body end - - def create_summary(capistrano) - %[#{capistrano[:application]} was deployed#{" to " << capistrano[:rails_env] if capistrano[:rails_env]} by #{current_user} at #{humanize_release_time(capistrano[:current_release])}.] - end - - def deployed_to(capistrano) - returning(deploy_msg = "deployed") { |msg| msg << " to #{capistrano[:rails_env]}" if capistrano[:rails_env] } - end - - # Create the body of the message using a bunch of values from Capistrano - def create_body(capistrano) -<<-EOL -#{summary} - -Comment: #{capistrano[:comment] || "[none given]"} - -Nerd details -============ -Release: #{capistrano[:current_release]} -Release Time: #{humanize_release_time(capistrano[:current_release])} -Release Revision: #{capistrano[:current_revision]} - -Previous Release: #{capistrano[:previous_release]} -Previous Release Time: #{humanize_release_time(capistrano[:previous_release])} -Previous Release Revision: #{capistrano[:previous_revision]} - -Repository: #{capistrano[:repository]} -Deploy path: #{capistrano[:deploy_to]} -EOL - end end - + end if Object.const_defined?("Capistrano") Capistrano::Configuration.instance(:must_exist).load do namespace :cap_gun do desc "Send notification of the current release and the previous release via email." - task :email do - CapGun::Helper.load_mailer_config(self) + task :email, :roles => :app do + CapGun::Mailer.load_mailer_config(self) CapGun::Mailer.deliver_deployment_notification(self) end end end \ No newline at end of file