fiesta 1.0.0

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,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: d7f4b7845f79cc02648e36a9aaac196cd4e66755f9fe50e4418310c874ce4588
4
+ data.tar.gz: 873befd60c23b6e35c8fec4dc085bcb836ce4b0ea2f0fc54a6f91e993f71ba7a
5
+ SHA512:
6
+ metadata.gz: cd2811e09d3cfd1824626804708ee350d2cc635b1b2bdf21180a390a15a5792c4fadaffb1fd0009ac77ccb9baa695e60b8a72bd4782feff4149154e7a394fad8
7
+ data.tar.gz: 7b45b0236a152aaf5b5563848c9a582071274119596e392a3027e4fccb2580457b585865bc5db12664cec734da643d7e79965b960076dffd5064427eb6481e13
@@ -0,0 +1,9 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
@@ -0,0 +1,6 @@
1
+ notifications:
2
+ email: false
3
+ rvm:
4
+ - 2.4.4
5
+ - 2.5.1
6
+ sudo: false
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in fiesta.gemspec
4
+ gemspec
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2015 Jens Balvig
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -0,0 +1,73 @@
1
+ # Fiesta
2
+
3
+ Fiesta helps integrate deployment tools with GitHub pull requests and Slack, making
4
+ sharing release reports with the rest of the team a breeze.
5
+
6
+ When deploying, Fiesta will compile an editable list of pull
7
+ requests merged to master since the last release, pulling out any images from the descriptions so they can be attached as screenshots:
8
+
9
+ <img src="https://cloud.githubusercontent.com/assets/104138/10676263/57b6bb44-7905-11e5-8df3-38e96a2a0685.png" width="60%" />
10
+
11
+ The edited content will be posted to Slack:
12
+
13
+ <img src="https://cloud.githubusercontent.com/assets/104138/10676270/63f627b4-7905-11e5-88e7-b60c08aada99.png" width="60%" />
14
+
15
+ ## Usage
16
+
17
+ Build a new report for the release:
18
+
19
+ ```ruby
20
+ report = Fiesta::Report.new('balvig/fiesta', {
21
+ last_released_at: '20180920074104',
22
+ comment: 'Only include new features',
23
+ auto_compose: true,
24
+ })
25
+ ```
26
+
27
+ Annouce the report to the Slack channel:
28
+
29
+ ```ruby
30
+ report.announce(
31
+ webhook: 'https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX',
32
+ payload: {
33
+ channel: '#release',
34
+ username: 'New Releases',
35
+ icon_emoji: ':tada:'
36
+ }
37
+ )
38
+ ```
39
+
40
+ Save the report as a GitHub release:
41
+
42
+ ```ruby
43
+ report.create_release('20180927145914')
44
+ ```
45
+
46
+ ## Integrating with Capistrano
47
+
48
+ Fiesta provides integration with Capistran.
49
+
50
+ 1. Add fiesta to your application's Gemfile:
51
+
52
+ ```ruby
53
+ gem 'fiesta'
54
+ ```
55
+ 2. Require in the capfile or appropriate stage and configure the Slack channel:
56
+
57
+ ```ruby
58
+ require 'capistrano/fiesta'
59
+ set :fiesta_slack_channel, '#release'
60
+ set :slack_webhook 'https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX'
61
+ ```
62
+ 3. If you're using [hub](https://github.com/github/hub), your GitHub credentials should already be configured. Otherwise you can use the [ENV vars in Octokit](https://github.com/octokit/octokit.rb/blob/a98979107a4bf9741a05a1f751405f8a29f29b38/lib/octokit/default.rb#L42-L156) to configure GitHub access.
63
+
64
+ ## Contributing
65
+
66
+ Bug reports and pull requests are welcome on GitHub at https://github.com/balvig/fiesta.
67
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests.
68
+
69
+
70
+ ## License
71
+
72
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
73
+
@@ -0,0 +1,10 @@
1
+ require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+
4
+ Rake::TestTask.new(:test) do |t|
5
+ t.libs << "test"
6
+ t.libs << "lib"
7
+ t.test_files = FileList['test/**/*_test.rb']
8
+ end
9
+
10
+ task :default => :test
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "fiesta"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
@@ -0,0 +1,7 @@
1
+ #!/bin/bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+
5
+ bundle install
6
+
7
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,33 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'fiesta/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "fiesta"
8
+ spec.version = Fiesta::VERSION
9
+ spec.authors = ["Jens Balvig"]
10
+ spec.email = ["jens@balvig.com"]
11
+
12
+ spec.summary = %q{Celebrate your releases!}
13
+ spec.description = %q{Automatically creates a report of merged PRs since last deploy for pasting into slack}
14
+ spec.homepage = "https://github.com/balvig/fiesta"
15
+ spec.license = "MIT"
16
+
17
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
18
+ spec.bindir = "exe"
19
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
+ spec.require_paths = ["lib"]
21
+
22
+ spec.add_dependency "attr_extras", "~> 5.2"
23
+ spec.add_dependency "octokit", "~> 4.1"
24
+
25
+ spec.add_development_dependency "bundler", ">= 1.10", "< 3"
26
+ spec.add_development_dependency "rake", "~> 10.0"
27
+ spec.add_development_dependency "minitest"
28
+ spec.add_development_dependency "minitest-line"
29
+ spec.add_development_dependency "minitest-reporters"
30
+ spec.add_development_dependency "multi_json"
31
+ spec.add_development_dependency "pry"
32
+ spec.add_development_dependency "webmock"
33
+ end
@@ -0,0 +1,4 @@
1
+ require "fiesta/repo_url_parser"
2
+ require "fiesta/report"
3
+
4
+ load File.expand_path("../tasks/fiesta.rake", __FILE__)
@@ -0,0 +1,75 @@
1
+ namespace :fiesta do
2
+ desc "Generate a fiesta report and announce it"
3
+ task :run do
4
+ if master_branch?
5
+ invoke "fiesta:generate"
6
+ invoke "fiesta:announce"
7
+ end
8
+ end
9
+
10
+ desc "Generate a fiesta report"
11
+ task :generate do
12
+ run_locally do
13
+ set :fiesta_report, build_report
14
+ end
15
+ end
16
+
17
+ desc "Announce a fiesta report"
18
+ task :announce do
19
+ run_locally do
20
+ report.announce(slack_params)
21
+ Fiesta::Logger.logs.each { |log| warn log }
22
+ end
23
+ end
24
+
25
+ def build_report
26
+ Fiesta::Report.new(repo, report_options)
27
+ end
28
+
29
+ def repo
30
+ Fiesta::RepoUrlParser.new(repo_url).repo
31
+ end
32
+
33
+ def report
34
+ fetch(:fiesta_report)
35
+ end
36
+
37
+ def report_options
38
+ {
39
+ last_released_at: last_release,
40
+ comment: fetch(:fiesta_comment),
41
+ auto_compose: fetch(:fiesta_auto_compose)
42
+ }
43
+ end
44
+
45
+ def last_release
46
+ last_release = nil
47
+ on roles(:web).first do
48
+ last_release_path = capture("readlink #{current_path}")
49
+ last_release = last_release_path.split("/").last
50
+ end
51
+ last_release
52
+ end
53
+
54
+ def master_branch?
55
+ fetch(:branch) == "master"
56
+ end
57
+
58
+ def timestamp
59
+ fetch(:release_timestamp)
60
+ end
61
+
62
+ def slack_params
63
+ {
64
+ webhook: fetch(:slack_webhook),
65
+ payload: {
66
+ channel: fetch(:fiesta_slack_channel) || "releases",
67
+ username: fetch(:fiesta_slack_username) || "New Releases",
68
+ icon_emoji: ":tada:"
69
+ }
70
+ }
71
+ end
72
+ end
73
+
74
+ before "deploy:starting", "fiesta:generate"
75
+ after "deploy:finished", "fiesta:announce"
@@ -0,0 +1,2 @@
1
+ require "fiesta/report"
2
+ require "fiesta/version"
@@ -0,0 +1,28 @@
1
+ require "attr_extras/explicit"
2
+ require "fiesta/slack"
3
+
4
+ module Fiesta
5
+ class Announcement
6
+ extend AttrExtras.mixin
7
+ pattr_initialize :text, :config
8
+
9
+ def post
10
+ client.post
11
+ text
12
+ end
13
+
14
+ private
15
+
16
+ def options
17
+ config.merge(payload: payload)
18
+ end
19
+
20
+ def payload
21
+ config.fetch(:payload, {}).merge(text: text)
22
+ end
23
+
24
+ def client
25
+ Slack.new(options)
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,13 @@
1
+ module Fiesta
2
+ class AutoComposedStory < Story
3
+ SCREENSHOT_TAG = "#"
4
+
5
+ def release_note
6
+ release_note_in_body
7
+ end
8
+
9
+ def images
10
+ pr.body.to_s.scan(/https?:\/\/\S*\.(?:png|jpg|gif)#{SCREENSHOT_TAG}/i)
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,43 @@
1
+ require "attr_extras/explicit"
2
+ require "tempfile"
3
+
4
+ module Fiesta
5
+ class Editor
6
+ extend AttrExtras.mixin
7
+ pattr_initialize :content, [:comment]
8
+
9
+ def compose
10
+ create_temp_file
11
+ open
12
+ read
13
+ end
14
+
15
+ private
16
+
17
+ def create_temp_file
18
+ file << content
19
+ file << "# #{comment}\n\n" if comment
20
+ file.close
21
+ end
22
+
23
+ def open
24
+ system(*editor_command.split, file.path)
25
+ end
26
+
27
+ def editor_command
28
+ ENV["EDITOR"] || "vi"
29
+ end
30
+
31
+ def read
32
+ file.open
33
+ file.unlink
34
+ file.read.each_line.map do |line|
35
+ line unless line.start_with?("\n") || line.start_with?("#")
36
+ end.compact.join
37
+ end
38
+
39
+ def file
40
+ @_file ||= Tempfile.new(["fiesta", ".md"])
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,39 @@
1
+ require "octokit"
2
+ require "yaml"
3
+
4
+ module Fiesta
5
+ class Github
6
+ class << self
7
+ attr_accessor :config
8
+ end
9
+
10
+ def self.client
11
+ new.client
12
+ end
13
+
14
+ def client
15
+ Octokit::Client.new(config)
16
+ end
17
+
18
+ private
19
+
20
+ def config
21
+ self.class.config || default_config
22
+ end
23
+
24
+ def default_config
25
+ { access_token: hub_config["oauth_token"] }.compact
26
+ end
27
+
28
+ def hub_config_path
29
+ Dir.home + "/.config/hub"
30
+ end
31
+
32
+ def hub_config
33
+ YAML.load_file(hub_config_path)["github.com"].first
34
+ rescue Errno::ENOENT
35
+ Logger.warn "No github config found at #{hub_config_path}, using ENV defaults (https://github.com/octokit/octokit.rb/blob/master/lib/octokit/default.rb)"
36
+ {}
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,14 @@
1
+ module Fiesta
2
+ class Logger
3
+ @logs = []
4
+
5
+ def self.warn(message)
6
+ @logs << "[FIESTA] #{message}"
7
+ nil
8
+ end
9
+
10
+ def self.logs
11
+ @logs
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,30 @@
1
+ require "attr_extras/explicit"
2
+
3
+ module Fiesta
4
+ class Release
5
+ extend AttrExtras.mixin
6
+ pattr_initialize [:repo, :name, :stories]
7
+
8
+ def post
9
+ github.create_release(repo, tag, name: name, body: body)
10
+ end
11
+
12
+ private
13
+
14
+ def name
15
+ @name ||= Time.now.to_i.to_s
16
+ end
17
+
18
+ def tag
19
+ "release-#{name}"
20
+ end
21
+
22
+ def body
23
+ stories.map(&:to_markdown).join("\n")
24
+ end
25
+
26
+ def github
27
+ @_github ||= Github.client
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,12 @@
1
+ require "attr_extras/explicit"
2
+
3
+ module Fiesta
4
+ class RepoUrlParser
5
+ extend AttrExtras.mixin
6
+ pattr_initialize :repo_url
7
+
8
+ def repo
9
+ repo_url.slice(/github.com[:\/](\S+\/\S+)\.git/, 1)
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,89 @@
1
+ Encoding.default_internal = Encoding.default_external = "utf-8"
2
+
3
+ require "attr_extras/explicit"
4
+ require "fiesta/announcement"
5
+ require "fiesta/github"
6
+ require "fiesta/template"
7
+ require "fiesta/editor"
8
+ require "fiesta/logger"
9
+ require "fiesta/story"
10
+ require "fiesta/auto_composed_story"
11
+ require "fiesta/release"
12
+ require "fiesta/timestamp_normalizer"
13
+
14
+ module Fiesta
15
+ class Report
16
+ extend AttrExtras.mixin
17
+ pattr_initialize :repo, [:last_released_at, :comment, :auto_compose]
18
+ attr_query :auto_compose?
19
+
20
+ def announce(config = {})
21
+ return Logger.warn("Announcement blank, nothing posted to Slack") if nothing_to_announce?
22
+ Announcement.new(text, config).post
23
+ end
24
+
25
+ def create_release(name = nil)
26
+ return Logger.warn "No new stories, skipping GitHub release" if stories.none?
27
+ Release.new(repo: repo, name: name, stories: stories).post
28
+ end
29
+
30
+ def stories
31
+ @_stories ||= fetch_stories
32
+ end
33
+
34
+ private
35
+
36
+ def fetch_stories
37
+ if auto_compose?
38
+ merged_pull_requests.map { |pr| AutoComposedStory.new(pr) }
39
+ else
40
+ merged_pull_requests.map { |pr| Story.new(pr) }
41
+ end
42
+ end
43
+
44
+ def nothing_to_announce?
45
+ stories.none? || text.nil? || text.empty?
46
+ end
47
+
48
+ def text
49
+ @_text ||= render_text
50
+ end
51
+
52
+ def render_text
53
+ if auto_compose?
54
+ template
55
+ else
56
+ editor.compose
57
+ end
58
+ end
59
+
60
+ def editor
61
+ Editor.new(template, comment: comment)
62
+ end
63
+
64
+ def template
65
+ Template.new(stories_with_release_notes).render
66
+ end
67
+
68
+ def stories_with_release_notes
69
+ stories.find_all(&:release_note)
70
+ end
71
+
72
+ def merged_pull_requests
73
+ github.search_issues("base:master repo:#{repo} merged:>#{last_released_at}").items
74
+ rescue Octokit::UnprocessableEntity => e
75
+ Logger.warn "Unable to access GitHub. Message given was: #{e.message}"
76
+ []
77
+ end
78
+
79
+ def last_released_at
80
+ if @last_released_at
81
+ TimestampNormalizer.new(@last_released_at).run.iso8601
82
+ end
83
+ end
84
+
85
+ def github
86
+ @_github ||= Github.client
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,18 @@
1
+ require "cgi"
2
+ require "net/http"
3
+ require "uri"
4
+
5
+ module Fiesta
6
+ class Slack
7
+ extend AttrExtras.mixin
8
+ pattr_initialize [:webhook, :payload]
9
+
10
+ def post
11
+ uri = URI(webhook)
12
+ req = Net::HTTP::Post.new(uri)
13
+ req.content_type = "application/json"
14
+ req.body = payload.to_json
15
+ Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == "https") { |http| http.request(req) }
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,34 @@
1
+ require "attr_extras/explicit"
2
+
3
+ module Fiesta
4
+ class Story
5
+ extend AttrExtras.mixin
6
+ pattr_initialize :pr
7
+
8
+ def release_note
9
+ (release_note_in_body || title).strip
10
+ end
11
+
12
+ def images
13
+ pr.body.to_s.scan(/https?:\/\/\S*\.(?:png|jpg|gif)/i)
14
+ end
15
+
16
+ def url
17
+ pr.html_url
18
+ end
19
+
20
+ def to_markdown
21
+ "- [#{title}](#{url})"
22
+ end
23
+
24
+ private
25
+
26
+ def title
27
+ @_title ||= pr.title.to_s.sub(/\[Delivers #\S+\]\z/, "")
28
+ end
29
+
30
+ def release_note_in_body
31
+ @_release_note_in_body ||= pr.body.to_s[/_Release\snotes?\:?\s(.+?)_/im, 1]
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,19 @@
1
+ require "attr_extras/explicit"
2
+ require "erb"
3
+
4
+ module Fiesta
5
+ class Template
6
+ extend AttrExtras.mixin
7
+ pattr_initialize :stories
8
+
9
+ def render
10
+ ERB.new(File.read(erb), nil, "-").result(binding)
11
+ end
12
+
13
+ private
14
+
15
+ def erb
16
+ File.join(File.expand_path("../templates", __FILE__), "draft.erb")
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,6 @@
1
+ <% stories.each do |story| -%>
2
+ • <%= story.release_note %>
3
+ <% story.images.each do |image| -%>
4
+ <<%= image %>|Screenshot>
5
+ <% end -%>
6
+ <% end -%>
@@ -0,0 +1,16 @@
1
+ require "attr_extras/explicit"
2
+
3
+ module Fiesta
4
+ class TimestampNormalizer
5
+ extend AttrExtras.mixin
6
+ pattr_initialize :timestamp
7
+
8
+ def run
9
+ if timestamp.is_a?(Time)
10
+ timestamp
11
+ else
12
+ Time.parse(timestamp.to_s + "Z")
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,3 @@
1
+ module Fiesta
2
+ VERSION = "1.0.0"
3
+ end
metadata ADDED
@@ -0,0 +1,217 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fiesta
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Jens Balvig
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2019-07-01 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: attr_extras
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '5.2'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '5.2'
27
+ - !ruby/object:Gem::Dependency
28
+ name: octokit
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '4.1'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '4.1'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '1.10'
48
+ - - "<"
49
+ - !ruby/object:Gem::Version
50
+ version: '3'
51
+ type: :development
52
+ prerelease: false
53
+ version_requirements: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ version: '1.10'
58
+ - - "<"
59
+ - !ruby/object:Gem::Version
60
+ version: '3'
61
+ - !ruby/object:Gem::Dependency
62
+ name: rake
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '10.0'
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '10.0'
75
+ - !ruby/object:Gem::Dependency
76
+ name: minitest
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ - !ruby/object:Gem::Dependency
90
+ name: minitest-line
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ - !ruby/object:Gem::Dependency
104
+ name: minitest-reporters
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
117
+ - !ruby/object:Gem::Dependency
118
+ name: multi_json
119
+ requirement: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ version: '0'
124
+ type: :development
125
+ prerelease: false
126
+ version_requirements: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ version: '0'
131
+ - !ruby/object:Gem::Dependency
132
+ name: pry
133
+ requirement: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ version: '0'
138
+ type: :development
139
+ prerelease: false
140
+ version_requirements: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - ">="
143
+ - !ruby/object:Gem::Version
144
+ version: '0'
145
+ - !ruby/object:Gem::Dependency
146
+ name: webmock
147
+ requirement: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - ">="
150
+ - !ruby/object:Gem::Version
151
+ version: '0'
152
+ type: :development
153
+ prerelease: false
154
+ version_requirements: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - ">="
157
+ - !ruby/object:Gem::Version
158
+ version: '0'
159
+ description: Automatically creates a report of merged PRs since last deploy for pasting
160
+ into slack
161
+ email:
162
+ - jens@balvig.com
163
+ executables: []
164
+ extensions: []
165
+ extra_rdoc_files: []
166
+ files:
167
+ - ".gitignore"
168
+ - ".travis.yml"
169
+ - Gemfile
170
+ - LICENSE.txt
171
+ - README.md
172
+ - Rakefile
173
+ - bin/console
174
+ - bin/setup
175
+ - fiesta.gemspec
176
+ - lib/capistrano/fiesta.rb
177
+ - lib/capistrano/tasks/fiesta.rake
178
+ - lib/fiesta.rb
179
+ - lib/fiesta/announcement.rb
180
+ - lib/fiesta/auto_composed_story.rb
181
+ - lib/fiesta/editor.rb
182
+ - lib/fiesta/github.rb
183
+ - lib/fiesta/logger.rb
184
+ - lib/fiesta/release.rb
185
+ - lib/fiesta/repo_url_parser.rb
186
+ - lib/fiesta/report.rb
187
+ - lib/fiesta/slack.rb
188
+ - lib/fiesta/story.rb
189
+ - lib/fiesta/template.rb
190
+ - lib/fiesta/templates/draft.erb
191
+ - lib/fiesta/timestamp_normalizer.rb
192
+ - lib/fiesta/version.rb
193
+ homepage: https://github.com/balvig/fiesta
194
+ licenses:
195
+ - MIT
196
+ metadata: {}
197
+ post_install_message:
198
+ rdoc_options: []
199
+ require_paths:
200
+ - lib
201
+ required_ruby_version: !ruby/object:Gem::Requirement
202
+ requirements:
203
+ - - ">="
204
+ - !ruby/object:Gem::Version
205
+ version: '0'
206
+ required_rubygems_version: !ruby/object:Gem::Requirement
207
+ requirements:
208
+ - - ">="
209
+ - !ruby/object:Gem::Version
210
+ version: '0'
211
+ requirements: []
212
+ rubyforge_project:
213
+ rubygems_version: 2.7.6.2
214
+ signing_key:
215
+ specification_version: 4
216
+ summary: Celebrate your releases!
217
+ test_files: []