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.
- checksums.yaml +7 -0
- data/.gitignore +9 -0
- data/.travis.yml +6 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +21 -0
- data/README.md +73 -0
- data/Rakefile +10 -0
- data/bin/console +14 -0
- data/bin/setup +7 -0
- data/fiesta.gemspec +33 -0
- data/lib/capistrano/fiesta.rb +4 -0
- data/lib/capistrano/tasks/fiesta.rake +75 -0
- data/lib/fiesta.rb +2 -0
- data/lib/fiesta/announcement.rb +28 -0
- data/lib/fiesta/auto_composed_story.rb +13 -0
- data/lib/fiesta/editor.rb +43 -0
- data/lib/fiesta/github.rb +39 -0
- data/lib/fiesta/logger.rb +14 -0
- data/lib/fiesta/release.rb +30 -0
- data/lib/fiesta/repo_url_parser.rb +12 -0
- data/lib/fiesta/report.rb +89 -0
- data/lib/fiesta/slack.rb +18 -0
- data/lib/fiesta/story.rb +34 -0
- data/lib/fiesta/template.rb +19 -0
- data/lib/fiesta/templates/draft.erb +6 -0
- data/lib/fiesta/timestamp_normalizer.rb +16 -0
- data/lib/fiesta/version.rb +3 -0
- metadata +217 -0
checksums.yaml
ADDED
@@ -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
|
data/.gitignore
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -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.
|
data/README.md
ADDED
@@ -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
|
+
|
data/Rakefile
ADDED
data/bin/console
ADDED
@@ -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
|
data/bin/setup
ADDED
data/fiesta.gemspec
ADDED
@@ -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,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"
|
data/lib/fiesta.rb
ADDED
@@ -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,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,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,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
|
data/lib/fiesta/slack.rb
ADDED
@@ -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
|
data/lib/fiesta/story.rb
ADDED
@@ -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,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
|
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: []
|