release_party 0.0.1 → 0.0.2

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.
@@ -0,0 +1,5 @@
1
+ module Announce
2
+ def announce(message)
3
+ puts " ~*@ ReleaseParty @*~ #{message}"
4
+ end
5
+ end
@@ -0,0 +1,47 @@
1
+ #
2
+ # Celebration is effectively an abstract class that handles before and after deploy callbacks
3
+ #
4
+ class Celebration
5
+
6
+ attr :environment
7
+
8
+ def self.inherited(subclass)
9
+ (@@celebrations ||= []) << subclass
10
+ end
11
+
12
+ def initialize(environment)
13
+ @environment = environment
14
+ end
15
+
16
+ def tasks
17
+ []
18
+ end
19
+
20
+ def before_deploy
21
+ end
22
+
23
+ def after_deploy
24
+ end
25
+
26
+ protected #####################################################################
27
+
28
+ def announce(*args)
29
+ environment.party.announce *args
30
+ end
31
+
32
+ def self.celebrations
33
+ @@celebrations
34
+ end
35
+
36
+ # Helper to check that all arguments required for a particular task
37
+ # are supplied
38
+ def arguments_required(*arguments)
39
+ missing = arguments.reject do |argument|
40
+ environment.send(argument.to_sym)
41
+ end
42
+ unless missing.empty?
43
+ raise ArgumentError, "Parameters #{missing.join(', ')} must be defined"
44
+ end
45
+ end
46
+
47
+ end
@@ -0,0 +1,32 @@
1
+ #
2
+ # Campfire announcer
3
+ #
4
+ module Celebrations
5
+ class Campfire < Celebration
6
+
7
+ attr :campfire
8
+
9
+ def initialize(env)
10
+ super env
11
+ arguments_required(:campfire_account, :campfire_room, :campfire_token)
12
+
13
+ require 'tinder'
14
+
15
+ ssl = environment.campfire_ssl? && environment.campfire_ssl
16
+ @campfire = ::Tinder::Campfire.new \
17
+ environment.campfire_account,
18
+ :token => environment.campfire_token,
19
+ :ssl => ssl
20
+ @campfire.find_room_by_name(environment.campfire_room)
21
+ end
22
+
23
+ def after_deploy
24
+ @campfire.speak environment.campfire_begin_message
25
+ end
26
+
27
+ def before_deploy
28
+ @campfire.speak environment.campfire_after_message
29
+ end
30
+
31
+ end
32
+ end
@@ -0,0 +1,55 @@
1
+ #
2
+ # Git module, mostly just used to query the repo, could be used to tag?
3
+ #
4
+ module Celebrations
5
+ class Git < Celebration
6
+
7
+ def initialize(env)
8
+ super env
9
+
10
+ require 'grit'
11
+ end
12
+
13
+ def commit_tracker_progress(env)
14
+ # Go through each finished story id we've seen in the git repo
15
+ # and deliver each story that is marked as finished
16
+ env.finished_store_ids.each do |story_id|
17
+
18
+ end
19
+ end
20
+
21
+ def load_git_progress(env)
22
+ repo = Grit::Repo.new(Dir.pwd)
23
+ config = Grit::Config.new(repo)
24
+
25
+ feature_branch = config.fetch('gitflow.prefix.feature', 'feature/')
26
+ release_branch = config.fetch('gitflow.prefix.release', 'release/')
27
+ puts "Feature branch: #{feature_branch}"
28
+ puts "Release branch: #{release_branch}"
29
+
30
+ # Find the last release
31
+ latest_release = \
32
+ repo.commits('master').find do |commit|
33
+ commit.message =~ /\AMerge branch '#{release_branch}(\d+)/
34
+ end
35
+ latest_release_tag = $1
36
+
37
+ puts "Commit: #{latest_release} #{latest_release.message}"
38
+ previous_release = \
39
+ repo.commits('master', 100).find do |commit|
40
+ if commit.message =~ /\AMerge branch '#{release_branch}(\d+)/
41
+ latest_release_tag != $1
42
+ end
43
+ end
44
+ previous_release_tag = $1
45
+ puts "Commit: #{previous_release} #{previous_release.message}"
46
+
47
+ env.finished_story_ids =
48
+ repo.commits('develop').collect do |commit|
49
+ $1 if commit.message =~ /\AMerge branch '#{feature_branch}(\d+)/
50
+ end.compact
51
+ puts env.finished_story_ids
52
+ end
53
+
54
+ end
55
+ end
@@ -0,0 +1,74 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'announce')
2
+ require File.join(File.dirname(__FILE__), '..', 'errors')
3
+
4
+ #
5
+ # Celebrate by sending out emails
6
+ #
7
+ module Celebrations
8
+ class Mailer < Celebration
9
+ include Announce
10
+
11
+ attr :engine
12
+
13
+ def initialize(env)
14
+ super env
15
+ arguments_required(:template_engine, :template, :smtp_address, :smtp_port,
16
+ :from_address, :email_notification_to, :subject)
17
+
18
+ require 'mail'
19
+
20
+ template = env.template
21
+ raise ArgumentError, "Missing template file #{template}" unless File.exists?(template)
22
+
23
+ @engine = \
24
+ case environment.template_engine
25
+ when :haml
26
+ require 'haml'
27
+ Haml::Engine.new(File.read(template))
28
+
29
+ when :erb
30
+ require 'erb'
31
+ ERB.new(File.read(template))
32
+
33
+ else
34
+ raise ArgumentError, "Unsupported template engine #{environment.template_engine}"
35
+ end
36
+
37
+ address = environment.smtp_address
38
+ port = environment.smtp_port
39
+ domain = environment.smtp_domain
40
+ Mail.defaults do
41
+ delivery_method :smtp, :address => address, :port => port, :domain => domain
42
+ end
43
+ end
44
+
45
+ def after_deploy
46
+ deliver_notification
47
+ end
48
+
49
+ private #######################################################################
50
+
51
+ def deliver_notification
52
+ mail = Mail.new
53
+ mail.to = environment.email_notification_to
54
+ mail.from = environment.from_address
55
+ mail.subject = environment.subject
56
+ html = engine.render environment
57
+ mail.html_part do
58
+ content_type 'text/html; charset=UTF-8'
59
+ body html
60
+ end
61
+
62
+ announce "Delivering deployment notice to #{environment.email_notification_to.inspect}"
63
+ mail.deliver!
64
+
65
+ rescue *SMTP_SERVER_ERRORS => error
66
+ announce "Unable to deliver deployment notice: #{error.message}"
67
+
68
+ else
69
+ announce "Deployment notice sent!"
70
+
71
+ end
72
+
73
+ end
74
+ end
@@ -0,0 +1,58 @@
1
+ #
2
+ # Pivotal tracker celebration module, supports tasks:
3
+ #
4
+ # Obtain progress
5
+ # Deliver features
6
+ #
7
+ module Celebrations
8
+ class PivotalTracker < Celebration
9
+ include Announce
10
+
11
+ attr :project_id, :project_api_key
12
+ attr :project
13
+
14
+ def initialize(env)
15
+ super env
16
+ arguments_required(:project_id, :project_api_key)
17
+
18
+ require 'pivotal-tracker'
19
+
20
+ @project_id = environment.project_id
21
+ @project_api_key = environment.project_api_key
22
+
23
+ ::PivotalTracker::Client.token = environment.project_api_key
24
+
25
+ begin
26
+ @project = ::PivotalTracker::Project.find(environment.project_id)
27
+ rescue RestClient::Request::Unauthorized => e
28
+ announce 'Unable to authenticate with pivotal, perhaps your API key is wrong.' +
29
+ "Message: #{e.message}"
30
+ end
31
+ end
32
+
33
+ def before_deploy
34
+ environment.finished_stories = finished_stories
35
+ environment.known_bugs = known_bugs
36
+ end
37
+
38
+ def after_deploy
39
+ # Deliver all finished stories if the deliver_finished flag is set
40
+ if environment.deliver_finished? && environment.deliver_finished
41
+ finished_stories.each do |story|
42
+ story.update(:current_state => 'delivered')
43
+ end
44
+ end
45
+ end
46
+
47
+ private #######################################################################
48
+
49
+ def finished_stories
50
+ project.stories.all(:state => 'finished')
51
+ end
52
+
53
+ def known_bugs
54
+ project.stories.all(:state => ['unstarted', 'started'], :story_type => 'bug')
55
+ end
56
+
57
+ end
58
+ end
@@ -2,56 +2,55 @@ require File.join(File.dirname(__FILE__), 'release_file')
2
2
 
3
3
  class Environment
4
4
 
5
- def initialize
6
- @attributes = {}
7
- load_defaults
5
+ attr :party
6
+
7
+ def initialize(party, config)
8
+ @party = party
9
+ @cap_config = config
10
+ @variables = {}
8
11
  end
9
12
 
10
13
  def method_missing(method_id, *args, &block)
11
14
  case method_id.to_s
12
15
  when /\A(.*)=\Z/
13
- @attributes[$1.to_sym] = args.first
14
-
15
- when /\A(.*)\?\Z/
16
- @attributes.key?($1.to_sym)
16
+ @variables[$1.to_sym] = args.first || block
17
17
 
18
18
  else
19
- unless @attributes.key?(method_id)
20
- raise ArgumentError, "No value for #{method_id} defined"
21
- end
22
- value = @attributes[method_id.to_sym]
19
+ key = method_id.to_sym
20
+ value = if @variables.key?(key)
21
+ @variables[key]
22
+ else
23
+ @cap_config.fetch(key, defaults[key])
24
+ end
23
25
  return value.call if value.is_a?(Proc)
24
26
  value
25
27
 
26
28
  end
27
29
  end
28
30
 
31
+ # Process the Releasefile and merge the variables loaded
29
32
  def load_release_file
30
- # Process the Releasefile and merge the attributes loaded
31
33
  release_file = ReleaseFile.new
32
- @attributes = @attributes.merge release_file.attributes
33
- end
34
-
35
- def load_capistrano_defaults(cap_config)
36
- # General cap info
37
- self.user = cap_config.fetch(:user, `git config user.name`.chomp)
38
- self.branch = cap_config.fetch(:branch, 'master')
39
- self.stage = cap_config.fetch(:stage, 'staging')
40
- self.repository = cap_config.fetch(:repository, nil)
41
- self.domain = cap_config.fetch(:domain, nil)
42
- self.display_name = cap_config.fetch(:display_name, 'Release Party')
34
+ @variables = @variables.merge release_file.variables
43
35
  end
44
36
 
45
- def load_defaults
46
- self.from_address = 'Release Party <releaseparty@noreply.org>'
47
- self.smtp_address = 'localhost'
48
- self.smtp_port = 25
49
- self.subject = Proc.new {"A release of #{display_name} was released to #{domain}"}
50
- self.finished_stories = []
51
- self.known_bugs = []
52
- self.send_email = true
53
- self.template_engine = :haml
54
- self.deliver_stories = false
37
+ def defaults
38
+ {
39
+ :user => `git config user.name`.chomp,
40
+ :branch => 'master',
41
+ :stage => 'staging',
42
+ :domain => 'http://releaseparty.org',
43
+ :display_name => 'Release Party',
44
+ :from_address => 'Release Party <releaseparty@noreply.org>',
45
+ :smtp_address => 'localhost',
46
+ :smtp_port => 25,
47
+ :subject => Proc.new {"#{display_name} was released to #{domain}"},
48
+ :finished_stories => [],
49
+ :known_bugs => [],
50
+ :send_email => true,
51
+ :template_engine => :haml,
52
+ :deliver_stories => false,
53
+ }
55
54
  end
56
55
 
57
56
  end
@@ -0,0 +1,11 @@
1
+ require 'net/smtp'
2
+
3
+ SMTP_SERVER_ERRORS = [TimeoutError,
4
+ IOError,
5
+ EOFError,
6
+ Errno::EINVAL,
7
+ Errno::ECONNRESET,
8
+ Errno::ECONNREFUSED,
9
+ Net::SMTPUnknownError,
10
+ Net::SMTPServerBusy,
11
+ Net::SMTPAuthenticationError]
@@ -1,22 +1,31 @@
1
+ #
2
+ # Release file just gives us some handy short hand for defining variables
3
+ # inside a file, e.g:
4
+ #
5
+ # x 1
6
+ # y 2
7
+ #
8
+ # Sets the configuration variables x and y to 1 and 2 respectively, plus it
9
+ # supports blocks and comments
10
+ #
1
11
  class ReleaseFile
2
12
 
13
+ FileNotFoundError = Class.new(RuntimeError)
14
+
3
15
  RELEASE_FILE = 'Releasefile'
16
+ RELEASE_PATH = File.join(Dir.pwd, RELEASE_FILE)
4
17
 
5
- attr_reader :attributes
18
+ attr_reader :variables
6
19
 
7
- def initialize
8
- @attributes = {}
20
+ def initialize(path = RELEASE_PATH)
21
+ @variables = {}
9
22
 
10
- capfile_path = File.join(Dir.pwd, RELEASE_FILE)
11
- if File.exists?(capfile_path)
12
- eval File.read(capfile_path)
13
- else
14
- puts "Warning: No #{RELEASE_FILE} found, you should put one in your project root."
15
- end
23
+ raise FileNotFoundError, "No Releasefile found name at #{path}" unless File.exists?(path)
24
+ eval File.read(path)
16
25
  end
17
26
 
18
27
  def method_missing(method_id, *args, &block)
19
- @attributes[method_id.to_sym] = args.first || block
28
+ @variables[method_id.to_sym] = args.first || block
20
29
  end
21
30
 
22
31
  end
@@ -1,202 +1,87 @@
1
+ require 'rubygems'
1
2
  require 'capistrano'
2
- require 'pivotal-tracker'
3
- require 'mail'
4
- require 'grit'
5
3
 
4
+ require File.join(File.dirname(__FILE__), 'announce')
6
5
  require File.join(File.dirname(__FILE__), 'environment')
6
+ require File.join(File.dirname(__FILE__), 'celebration')
7
7
 
8
- module Capistrano::ReleaseParty
9
-
10
- def self.extended(configuration)
11
- configuration.load do
12
-
13
- after 'deploy', 'release_party:finished'
14
-
15
- namespace 'release_party' do
16
- task 'started' do
17
- @env = Environment.new
18
-
19
- # Record when the release began
20
- @env.release_started = Time.now
8
+ Dir[File.join(File.dirname(__FILE__), 'celebrations', '*.rb')].each do |file|
9
+ require file
10
+ end
21
11
 
22
- @env.load_capistrano_defaults(self)
23
- @env.load_release_file
12
+ module Capistrano::ReleaseParty
13
+ include Announce
24
14
 
25
- announce "beginning deployment, project details obtained."
15
+ # Singleton instance of the release party environment
16
+ def self.instance(party = nil, cap_config = nil, &block)
17
+ return @env unless @env.nil?
26
18
 
27
- load_git_progress @env
28
- load_tracker_progress @env
29
- end
19
+ raise ArgumentError, "Release finished without being started" if party.nil? || cap_config.nil?
30
20
 
31
- task 'finished' do
32
- raise ArgumentError, "Release finished without being started" if @env.nil?
33
-
34
- begin
35
- announce "celebrating release, deployment finished successfully!"
21
+ @env = Environment.new party, cap_config
22
+ yield(@env) if block_given?
23
+ @env
24
+ end
36
25
 
37
- # Record when the release finished
38
- @env.release_finished = Time.now
26
+ def self.extended(configuration)
27
+ configuration.load do
39
28
 
29
+ before 'deploy', 'release_party:starting'
30
+ after 'deploy', 'release_party:finished'
40
31
 
41
- # Do pivotal story delivery
42
- if @env.deliver_stories
43
- commit_tracker_progress @env
44
- end
32
+ namespace :release_party do
33
+ task :starting do
45
34
 
46
- # Send an email notification
47
- if @env.send_email
48
- body = load_email_content @env
49
- deliver_notification(@env, body)
35
+ env = Capistrano::ReleaseParty.instance(Capistrano::ReleaseParty, configuration) do |environment|
36
+ begin
37
+ environment.load_release_file
38
+ rescue ReleaseFile::FileNotFoundError => error
39
+ announce error.message
50
40
  end
51
-
52
- #rescue ArgumentError => error
53
- # puts "ERROR: #{error.message}"
54
41
  end
55
- end
56
- end
57
- end
58
- end
59
42
 
60
- def commit_tracker_progress(env)
61
- # Go through each finished story id we've seen in the git repo
62
- # and deliver each story that is marked as finished
63
- env.finished_store_ids.each do |story_id|
43
+ announce "Beginning deployment, project details obtained."
64
44
 
65
- end
66
- end
67
-
68
- def load_git_progress(env)
69
- #repo = Grit::Repo.new(Dir.pwd)
70
- repo = Grit::Repo.new("/Users/john/Projects/breeze")
71
- config = Grit::Config.new(repo)
72
-
73
- feature_branch = config.fetch('gitflow.prefix.feature', 'feature/')
74
- release_branch = config.fetch('gitflow.prefix.release', 'release/')
75
- puts "Feature branch: #{feature_branch}"
76
- puts "Release branch: #{release_branch}"
77
-
78
- # Find the last release
79
- latest_release = \
80
- repo.commits('master').find do |commit|
81
- commit.message =~ /\AMerge branch '#{release_branch}(\d+)/
82
- end
83
- latest_release_tag = $1
84
-
85
- puts "Commit: #{latest_release} #{latest_release.message}"
86
- previous_release = \
87
- repo.commits('master', 100).find do |commit|
88
- if commit.message =~ /\AMerge branch '#{release_branch}(\d+)/
89
- latest_release_tag != $1
90
- end
91
- end
92
- previous_release_tag = $1
93
- puts "Commit: #{previous_release} #{previous_release.message}"
94
-
95
- env.finished_story_ids =
96
- repo.commits('develop').collect do |commit|
97
- $1 if commit.message =~ /\AMerge branch '#{feature_branch}(\d+)/
98
- end.compact
99
- puts env.finished_story_ids
100
- end
101
-
102
- def load_email_content(env)
103
- arguments_required env, :template_engine, :template
45
+ # Record when the release began
46
+ env.release_started = Time.now
104
47
 
105
- template = env.template
106
- raise ArgumentError, "Missing template file #{template}" unless File.exists?(template)
48
+ # Load all the celebrations
49
+ env.celebrations = \
50
+ Celebration.celebrations.collect do |celebration_class|
51
+ begin
52
+ celebration_class.new(env).tap(&:before_deploy)
107
53
 
108
- engine = \
109
- case env.template_engine
110
- when :haml
111
- load_haml
112
- Haml::Engine.new(File.read(template))
54
+ rescue LoadError => error
55
+ announce "Unable to load #{celebration_class}, message: #{error.message} you may have to install a gem"
113
56
 
114
- when :erb
115
- load_erb
116
- ERB.new(File.read(template))
57
+ rescue ArgumentError => error
58
+ announce error.message
117
59
 
118
- else
119
- raise ArgumentError, "Unsupported template engine #{env.template_engine}"
120
- end
60
+ end
61
+ end.compact
121
62
 
122
- engine.render env
123
- end
124
-
125
- def load_tracker_progress(env)
126
- arguments_required env, :project_id, :project_api_key
63
+ self
64
+
65
+ end
127
66
 
128
- PivotalTracker::Client.token = env.project_api_key
67
+ task :finished do
68
+ env = Capistrano::ReleaseParty.instance
129
69
 
130
- begin
131
- env.project = PivotalTracker::Project.find(env.project_id)
132
- rescue RestClient::Request::Unauthorized => e
133
- puts 'Unable to authenticate with pivotal, perhaps your API key is wrong.' +
134
- "Message: #{e.message}"
135
- end
70
+ announce "Performing post deploy celebrations!"
136
71
 
137
- env.instance_eval do
138
- self.finished_stories = \
139
- project.stories.all(:state => 'finished')
140
- self.known_bugs = \
141
- project.stories.all(:state => ['unstarted', 'started'], :story_type => 'bug')
142
- end
143
- end
72
+ # Record when the release finished
73
+ env.release_finished = Time.now
144
74
 
145
- def deliver_notification(env, body)
146
- arguments_required env,
147
- :smtp_address, :smtp_port, :smtp_domain, :from_address,
148
- :email_notification_to, :subject
75
+ # Do after deploy
76
+ env.celebrations.each(&:after_deploy)
149
77
 
150
- Mail.defaults do
151
- delivery_method :smtp,
152
- :address => env.smtp_address,
153
- :port => env.smtp_port,
154
- :domain => env.smtp_domain
155
- end
156
- announce "delivering deployment notice to #{env.email_notification_to.inspect}"
157
- Mail.deliver do
158
- from env.from_address
159
- to env.email_notification_to
160
- subject env.subject
161
- html_part do
162
- content_type 'text/html; charset=UTF-8'
163
- body body
78
+ self
79
+ end
164
80
  end
165
81
  end
166
- announce "deployment notice sent!"
167
- end
168
-
169
- def announce(message)
170
- puts "ReleaseParty: #{message}"
171
82
  end
172
-
173
- def arguments_required(env, *arguments)
174
- missing = arguments.reject do |argument|
175
- env.send("#{argument}?".to_sym)
176
- end
177
- unless missing.empty?
178
- raise ArgumentError, "Parameters #{missing.join(', ')} must be defined"
179
- end
180
- end
181
-
182
- def load_haml
183
- require 'haml'
184
- rescue LoadError => error
185
- raise ArgumentError,
186
- 'Unable to load HAML, you need to make sure the haml gem is installed '
187
- 'if it is specified as the template engine'
188
- end
189
-
190
- def load_erb
191
- require 'erb'
192
- rescue LoadError => error
193
- raise ArgumentError,
194
- 'Unable to load ERB, you need to make sure the erb gem is installed '
195
- 'if it is specified as the template engine'
196
- end
197
-
198
83
  end
199
84
 
200
85
  if Capistrano::Configuration.instance
201
- Capistrano::Configuration.instance.extend(Capistrano::Configuration.instance)
86
+ Capistrano::Configuration.instance.extend(Capistrano::ReleaseParty)
202
87
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: release_party
3
3
  version: !ruby/object:Gem::Version
4
- hash: 29
4
+ hash: 27
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 1
10
- version: 0.0.1
9
+ - 2
10
+ version: 0.0.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - John Barker
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-05-18 00:00:00 +08:00
18
+ date: 2011-05-24 00:00:00 +08:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -35,57 +35,101 @@ dependencies:
35
35
  type: :runtime
36
36
  version_requirements: *id001
37
37
  - !ruby/object:Gem::Dependency
38
- name: pivotal-tracker
38
+ name: capistrano_colors
39
39
  prerelease: false
40
40
  requirement: &id002 !ruby/object:Gem::Requirement
41
41
  none: false
42
42
  requirements:
43
43
  - - ">="
44
44
  - !ruby/object:Gem::Version
45
- hash: 23
45
+ hash: 3
46
46
  segments:
47
47
  - 0
48
- - 2
49
- - 0
50
- version: 0.2.0
48
+ version: "0"
51
49
  type: :runtime
52
50
  version_requirements: *id002
53
51
  - !ruby/object:Gem::Dependency
54
- name: grit
52
+ name: colored
55
53
  prerelease: false
56
54
  requirement: &id003 !ruby/object:Gem::Requirement
57
55
  none: false
58
56
  requirements:
59
57
  - - ">="
60
58
  - !ruby/object:Gem::Version
61
- hash: 29
59
+ hash: 3
62
60
  segments:
63
- - 2
64
- - 4
65
- - 1
66
- version: 2.4.1
61
+ - 0
62
+ version: "0"
67
63
  type: :runtime
68
64
  version_requirements: *id003
69
65
  - !ruby/object:Gem::Dependency
70
- name: mail
66
+ name: rake
71
67
  prerelease: false
72
68
  requirement: &id004 !ruby/object:Gem::Requirement
69
+ none: false
70
+ requirements:
71
+ - - ~>
72
+ - !ruby/object:Gem::Version
73
+ hash: 49
74
+ segments:
75
+ - 0
76
+ - 8
77
+ - 7
78
+ version: 0.8.7
79
+ type: :development
80
+ version_requirements: *id004
81
+ - !ruby/object:Gem::Dependency
82
+ name: rspec
83
+ prerelease: false
84
+ requirement: &id005 !ruby/object:Gem::Requirement
73
85
  none: false
74
86
  requirements:
75
87
  - - ">="
76
88
  - !ruby/object:Gem::Version
77
- hash: 11
89
+ hash: 27
90
+ segments:
91
+ - 2
92
+ - 5
93
+ - 0
94
+ version: 2.5.0
95
+ type: :development
96
+ version_requirements: *id005
97
+ - !ruby/object:Gem::Dependency
98
+ name: rr
99
+ prerelease: false
100
+ requirement: &id006 !ruby/object:Gem::Requirement
101
+ none: false
102
+ requirements:
103
+ - - ~>
104
+ - !ruby/object:Gem::Version
105
+ hash: 19
78
106
  segments:
107
+ - 1
108
+ - 0
79
109
  - 2
110
+ version: 1.0.2
111
+ type: :development
112
+ version_requirements: *id006
113
+ - !ruby/object:Gem::Dependency
114
+ name: bundler
115
+ prerelease: false
116
+ requirement: &id007 !ruby/object:Gem::Requirement
117
+ none: false
118
+ requirements:
119
+ - - ">="
120
+ - !ruby/object:Gem::Version
121
+ hash: 5
122
+ segments:
80
123
  - 1
81
124
  - 0
82
- version: 2.1.0
83
- type: :runtime
84
- version_requirements: *id004
125
+ - 9
126
+ version: 1.0.9
127
+ type: :development
128
+ version_requirements: *id007
85
129
  - !ruby/object:Gem::Dependency
86
- name: capistrano_colors
130
+ name: rcov
87
131
  prerelease: false
88
- requirement: &id005 !ruby/object:Gem::Requirement
132
+ requirement: &id008 !ruby/object:Gem::Requirement
89
133
  none: false
90
134
  requirements:
91
135
  - - ">="
@@ -94,12 +138,12 @@ dependencies:
94
138
  segments:
95
139
  - 0
96
140
  version: "0"
97
- type: :runtime
98
- version_requirements: *id005
141
+ type: :development
142
+ version_requirements: *id008
99
143
  - !ruby/object:Gem::Dependency
100
- name: colored
144
+ name: capistrano-spec
101
145
  prerelease: false
102
- requirement: &id006 !ruby/object:Gem::Requirement
146
+ requirement: &id009 !ruby/object:Gem::Requirement
103
147
  none: false
104
148
  requirements:
105
149
  - - ">="
@@ -108,8 +152,112 @@ dependencies:
108
152
  segments:
109
153
  - 0
110
154
  version: "0"
111
- type: :runtime
112
- version_requirements: *id006
155
+ type: :development
156
+ version_requirements: *id009
157
+ - !ruby/object:Gem::Dependency
158
+ name: yard
159
+ prerelease: false
160
+ requirement: &id010 !ruby/object:Gem::Requirement
161
+ none: false
162
+ requirements:
163
+ - - ">="
164
+ - !ruby/object:Gem::Version
165
+ hash: 3
166
+ segments:
167
+ - 0
168
+ version: "0"
169
+ type: :development
170
+ version_requirements: *id010
171
+ - !ruby/object:Gem::Dependency
172
+ name: haml
173
+ prerelease: false
174
+ requirement: &id011 !ruby/object:Gem::Requirement
175
+ none: false
176
+ requirements:
177
+ - - ">="
178
+ - !ruby/object:Gem::Version
179
+ hash: 3
180
+ segments:
181
+ - 0
182
+ version: "0"
183
+ type: :development
184
+ version_requirements: *id011
185
+ - !ruby/object:Gem::Dependency
186
+ name: sass
187
+ prerelease: false
188
+ requirement: &id012 !ruby/object:Gem::Requirement
189
+ none: false
190
+ requirements:
191
+ - - ">="
192
+ - !ruby/object:Gem::Version
193
+ hash: 3
194
+ segments:
195
+ - 0
196
+ version: "0"
197
+ type: :development
198
+ version_requirements: *id012
199
+ - !ruby/object:Gem::Dependency
200
+ name: pivotal-tracker
201
+ prerelease: false
202
+ requirement: &id013 !ruby/object:Gem::Requirement
203
+ none: false
204
+ requirements:
205
+ - - ">="
206
+ - !ruby/object:Gem::Version
207
+ hash: 23
208
+ segments:
209
+ - 0
210
+ - 2
211
+ - 0
212
+ version: 0.2.0
213
+ type: :development
214
+ version_requirements: *id013
215
+ - !ruby/object:Gem::Dependency
216
+ name: mail
217
+ prerelease: false
218
+ requirement: &id014 !ruby/object:Gem::Requirement
219
+ none: false
220
+ requirements:
221
+ - - ">="
222
+ - !ruby/object:Gem::Version
223
+ hash: 11
224
+ segments:
225
+ - 2
226
+ - 1
227
+ - 0
228
+ version: 2.1.0
229
+ type: :development
230
+ version_requirements: *id014
231
+ - !ruby/object:Gem::Dependency
232
+ name: grit
233
+ prerelease: false
234
+ requirement: &id015 !ruby/object:Gem::Requirement
235
+ none: false
236
+ requirements:
237
+ - - ">="
238
+ - !ruby/object:Gem::Version
239
+ hash: 29
240
+ segments:
241
+ - 2
242
+ - 4
243
+ - 1
244
+ version: 2.4.1
245
+ type: :development
246
+ version_requirements: *id015
247
+ - !ruby/object:Gem::Dependency
248
+ name: tinder
249
+ prerelease: false
250
+ requirement: &id016 !ruby/object:Gem::Requirement
251
+ none: false
252
+ requirements:
253
+ - - ">="
254
+ - !ruby/object:Gem::Version
255
+ hash: 3
256
+ segments:
257
+ - 0
258
+ version: "0"
259
+ type: :development
260
+ version_requirements: *id016
113
261
  description: Perform a number of common post deployment tasks such as delivering pivotal stories, sending out a release email, notifying campfire.
114
262
  email: jebarker@gmail.com
115
263
  executables: []
@@ -119,14 +267,21 @@ extensions: []
119
267
  extra_rdoc_files: []
120
268
 
121
269
  files:
270
+ - lib/release_party/announce.rb
271
+ - lib/release_party/celebration.rb
272
+ - lib/release_party/celebrations/campfire.rb
273
+ - lib/release_party/celebrations/git.rb
274
+ - lib/release_party/celebrations/mailer.rb
275
+ - lib/release_party/celebrations/pivotal_tracker.rb
122
276
  - lib/release_party/environment.rb
277
+ - lib/release_party/errors.rb
123
278
  - lib/release_party/release_file.rb
124
279
  - lib/release_party/release_party.rb
125
280
  - lib/release_party.rb
126
281
  has_rdoc: true
127
- homepage:
128
- licenses: []
129
-
282
+ homepage: https://github.com/excepttheweasel/release_party
283
+ licenses:
284
+ - MIT
130
285
  post_install_message:
131
286
  rdoc_options: []
132
287
 
@@ -158,6 +313,6 @@ rubyforge_project:
158
313
  rubygems_version: 1.6.2
159
314
  signing_key:
160
315
  specification_version: 3
161
- summary: Celebrate releases
316
+ summary: Celebrate releases!
162
317
  test_files: []
163
318