clemency 0.1.0 → 0.2.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 +4 -4
- data/Gemfile.lock +41 -0
- data/README.md +31 -2
- data/clemency.gemspec +1 -0
- data/lib/clemency.rb +71 -1
- data/lib/clemency/callbacks.rb +23 -0
- data/lib/clemency/changelog.rb +27 -0
- data/lib/clemency/configuration.rb +24 -0
- data/lib/clemency/railtie.rb +13 -0
- data/lib/clemency/release.rb +51 -0
- data/lib/clemency/tasks/clemency.rake +48 -0
- data/lib/clemency/version.rb +1 -1
- data/lib/generators/clemency/install_generator.rb +31 -0
- data/lib/generators/clemency/release_generator.rb +29 -0
- metadata +25 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2efdabed6d5159d35dde521f624561f01eba89ab8a64ca11dca7be11fb9367c7
|
4
|
+
data.tar.gz: 1f2d2c96af18e5374c6a15f80453fd9ac1dfd83b79ce290c5540594185aa4deb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bdd9a28d76542ae43278f24f7fa53c14922e48433a2094e60dc6dbe380b5a2725e4c9702daf396c5e73bbdaf57f2d9f6a07f9e8b7d294fb93861456e4c6b1ee0
|
7
|
+
data.tar.gz: d43e5b3deeb4de33bdf1a0d4896b5aaaab0579222ee4f0793c8b7f263d4663022a3e3363e9135bdb6335ce900a19d7efff14dbb0f756baccb5679677da7ca555
|
data/Gemfile.lock
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
clemency (0.1.0)
|
5
|
+
|
6
|
+
GEM
|
7
|
+
remote: https://rubygems.org/
|
8
|
+
specs:
|
9
|
+
coderay (1.1.2)
|
10
|
+
diff-lcs (1.3)
|
11
|
+
method_source (0.9.2)
|
12
|
+
pry (0.12.2)
|
13
|
+
coderay (~> 1.1.0)
|
14
|
+
method_source (~> 0.9.0)
|
15
|
+
rake (10.5.0)
|
16
|
+
rspec (3.8.0)
|
17
|
+
rspec-core (~> 3.8.0)
|
18
|
+
rspec-expectations (~> 3.8.0)
|
19
|
+
rspec-mocks (~> 3.8.0)
|
20
|
+
rspec-core (3.8.0)
|
21
|
+
rspec-support (~> 3.8.0)
|
22
|
+
rspec-expectations (3.8.2)
|
23
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
24
|
+
rspec-support (~> 3.8.0)
|
25
|
+
rspec-mocks (3.8.0)
|
26
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
27
|
+
rspec-support (~> 3.8.0)
|
28
|
+
rspec-support (3.8.0)
|
29
|
+
|
30
|
+
PLATFORMS
|
31
|
+
ruby
|
32
|
+
|
33
|
+
DEPENDENCIES
|
34
|
+
bundler (~> 2.0)
|
35
|
+
clemency!
|
36
|
+
pry
|
37
|
+
rake (~> 10.0)
|
38
|
+
rspec (~> 3.0)
|
39
|
+
|
40
|
+
BUNDLED WITH
|
41
|
+
2.0.1
|
data/README.md
CHANGED
@@ -22,7 +22,36 @@ Or install it yourself as:
|
|
22
22
|
|
23
23
|
## Usage
|
24
24
|
|
25
|
-
|
25
|
+
Installs the configuration file:
|
26
|
+
|
27
|
+
$ rails g clemency:install
|
28
|
+
|
29
|
+
Create a new release (Generates a new release file in RAILS_ROOT/releases folder):
|
30
|
+
|
31
|
+
$ rails g clemency:release 1.1.0
|
32
|
+
|
33
|
+
Migrate to a specific release:
|
34
|
+
|
35
|
+
$ rails clemency:migrate -> calls the up callback on the current release as defined in .version
|
36
|
+
$ rails clemency:migrate[1.1.0] -> calls the up callback on the 1.1.0 release
|
37
|
+
$ [NOT IMPLEMENTED] rails clemency:migrate[1.0.0-1.1.0] -> calls the up callback on all releases between 1.0.0 and 1.1.0
|
38
|
+
|
39
|
+
Rollback to a specific release:
|
40
|
+
|
41
|
+
$ rails clemency:rollback -> calls the down callback on the current release as defined in .version
|
42
|
+
$ rails clemency:rollback[1.1.0] -> calls the down callback on the 1.1.0 release
|
43
|
+
$ [NOT IMPLEMENTED] rails clemency:rollback[1.1.0-1.0.0] -> calls the down callback on all releases between 1.1.0 and 1.0.0
|
44
|
+
|
45
|
+
Generate a changelog for a specific release:
|
46
|
+
|
47
|
+
$ rails clemency:changelog -> generates a changelog the current release as defined in .version
|
48
|
+
$ rails clemency:changelog[1.1.0] -> generates a changelog for the 1.1.0 release
|
49
|
+
$ [NOT IMPLEMENTED] rails clemency:changelog[1.1.0-1.0.0] -> generates a changelog for all releases between 1.1.0 and 1.0.0
|
50
|
+
|
51
|
+
## TODO
|
52
|
+
|
53
|
+
- add more specs
|
54
|
+
- implement rake tasks that execute a series of release tasks
|
26
55
|
|
27
56
|
## Development
|
28
57
|
|
@@ -32,7 +61,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
|
|
32
61
|
|
33
62
|
## Contributing
|
34
63
|
|
35
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/
|
64
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/leftplusrightllc/clemency.
|
36
65
|
|
37
66
|
## License
|
38
67
|
|
data/clemency.gemspec
CHANGED
data/lib/clemency.rb
CHANGED
@@ -1,6 +1,76 @@
|
|
1
1
|
require "clemency/version"
|
2
|
+
require "clemency/callbacks"
|
3
|
+
require "clemency/configuration"
|
4
|
+
require "clemency/changelog"
|
5
|
+
require "clemency/release"
|
6
|
+
require 'clemency/railtie' if defined?(Rails)
|
2
7
|
|
3
8
|
module Clemency
|
9
|
+
|
4
10
|
class Error < StandardError; end
|
5
|
-
|
11
|
+
|
12
|
+
@releases = {}
|
13
|
+
@config = Configuration.new
|
14
|
+
|
15
|
+
def self.config
|
16
|
+
@config
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.releases
|
20
|
+
@releases
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.define_release(&blk)
|
24
|
+
release = Release.new
|
25
|
+
release.instance_eval(&blk)
|
26
|
+
Clemency.releases[release.get(:version)] = release
|
27
|
+
release
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.load_config
|
31
|
+
load "#{Rails.root}/config/clemency.rb"
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.latest_release
|
35
|
+
latest_verion = @releases.keys.sort{|a, b| Gem::Version.new(a) <=> Gem::Version.new(b) }.last
|
36
|
+
puts latest_verion
|
37
|
+
@releases.fetch(latest_verion, nil)
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.load_release_files
|
41
|
+
Dir.glob("#{Rails.root}/releases/*.rb").each { |f| load f }
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.configure(&blk)
|
45
|
+
@config.instance_eval(&blk)
|
46
|
+
end
|
47
|
+
|
48
|
+
def self.migrate!(version)
|
49
|
+
puts "Clemency is migrating release #{version}"
|
50
|
+
release = @releases.fetch(version, nil)
|
51
|
+
if release.nil?
|
52
|
+
puts "We could not find release #{version}"
|
53
|
+
return
|
54
|
+
end
|
55
|
+
@config.call!(:before_up, release)
|
56
|
+
release.call!(:up, release)
|
57
|
+
@config.call!(:after_up, release)
|
58
|
+
end
|
59
|
+
|
60
|
+
def self.rollback!(version)
|
61
|
+
puts "Clemency is migrating release #{version}"
|
62
|
+
release = @releases.fetch(version, nil)
|
63
|
+
if release.nil?
|
64
|
+
puts "We could not find release #{version}"
|
65
|
+
return
|
66
|
+
end
|
67
|
+
@config.call!(:before_down, release)
|
68
|
+
release.call!(:down, release)
|
69
|
+
@config.call!(:after_down, release)
|
70
|
+
end
|
71
|
+
|
72
|
+
def self.to_markdown
|
73
|
+
@releases.map { |release| release.to_markdown }.join("\n\n")
|
74
|
+
end
|
75
|
+
|
6
76
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Clemency
|
2
|
+
|
3
|
+
class Callbacks
|
4
|
+
|
5
|
+
def initialize
|
6
|
+
@callbacks = {}
|
7
|
+
end
|
8
|
+
|
9
|
+
def call!(key, *args)
|
10
|
+
get(key).call(*args)
|
11
|
+
end
|
12
|
+
|
13
|
+
def get(key)
|
14
|
+
@callbacks.fetch(key, Proc.new {})
|
15
|
+
end
|
16
|
+
|
17
|
+
def set(key, callback)
|
18
|
+
@callbacks[key] = callback
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
class Changelog
|
2
|
+
|
3
|
+
attr_reader :items
|
4
|
+
|
5
|
+
def initialize
|
6
|
+
@items = Hash.new { |h, k| h[k] = [] }
|
7
|
+
end
|
8
|
+
|
9
|
+
def fixed(item)
|
10
|
+
@items[:fixed] << item
|
11
|
+
end
|
12
|
+
|
13
|
+
def added(item)
|
14
|
+
@items[:added] << item
|
15
|
+
end
|
16
|
+
|
17
|
+
def changed(item)
|
18
|
+
@items[:changed] << item
|
19
|
+
end
|
20
|
+
|
21
|
+
def to_markdown
|
22
|
+
@items.map do |type, items|
|
23
|
+
"####{type.upcase}\n" + items.map { |item| "- #{item}"}.join("\n")
|
24
|
+
end.join("\n\n")
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
|
3
|
+
module Clemency
|
4
|
+
class Configuration
|
5
|
+
extend Forwardable
|
6
|
+
def_delegators :@callbacks, :call!
|
7
|
+
attr_reader :callbacks
|
8
|
+
def initialize
|
9
|
+
@callbacks = Callbacks.new
|
10
|
+
end
|
11
|
+
def before_up(&blk)
|
12
|
+
@callbacks.set(:before_up, blk)
|
13
|
+
end
|
14
|
+
def after_up(&blk)
|
15
|
+
@callbacks.set(:after_up, blk)
|
16
|
+
end
|
17
|
+
def before_down(&blk)
|
18
|
+
@callbacks.set(:before_down, blk)
|
19
|
+
end
|
20
|
+
def after_down(&blk)
|
21
|
+
@callbacks.set(:after_down, blk)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
|
3
|
+
module Clemency
|
4
|
+
|
5
|
+
class Release
|
6
|
+
extend Forwardable
|
7
|
+
|
8
|
+
def_delegators :@callbacks, :call!
|
9
|
+
|
10
|
+
attr_reader :callbacks
|
11
|
+
|
12
|
+
def initialize
|
13
|
+
@config = {}
|
14
|
+
@changelog = Changelog.new
|
15
|
+
@callbacks = Callbacks.new
|
16
|
+
end
|
17
|
+
|
18
|
+
def set(key, value)
|
19
|
+
@config[key] = value
|
20
|
+
end
|
21
|
+
|
22
|
+
def get(key, default = nil)
|
23
|
+
@config.fetch(key, default)
|
24
|
+
end
|
25
|
+
|
26
|
+
def changelog(&blk)
|
27
|
+
if block_given?
|
28
|
+
@changelog.instance_eval(&blk)
|
29
|
+
else
|
30
|
+
@changelog
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def up(&blk)
|
35
|
+
@callbacks.set(:up, blk)
|
36
|
+
end
|
37
|
+
|
38
|
+
def down(&blk)
|
39
|
+
@callbacks.set(:down, blk)
|
40
|
+
end
|
41
|
+
|
42
|
+
def to_markdown
|
43
|
+
%Q(##[#{get(:version)}] - #{Time.now.strftime("%D")}
|
44
|
+
|
45
|
+
#{@changelog.to_markdown}
|
46
|
+
)
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require "clemency"
|
2
|
+
|
3
|
+
namespace :clemency do
|
4
|
+
|
5
|
+
# TODO: Refactor the migrate and rollback - loads of duplication...
|
6
|
+
|
7
|
+
desc "Migrates a specific release version"
|
8
|
+
task :migrate, [:version] => [:environment] do |t, args|
|
9
|
+
version = args[:version]
|
10
|
+
if version.nil?
|
11
|
+
version = File.read("#{Rails.root}/.version").to_s.strip
|
12
|
+
end
|
13
|
+
Clemency.load_config
|
14
|
+
Clemency.load_release_files
|
15
|
+
Clemency.migrate!(version)
|
16
|
+
end
|
17
|
+
|
18
|
+
desc "Rollback a specific release version"
|
19
|
+
task :rollback, [:version] => [:environment] do |t, args|
|
20
|
+
version = args[:version]
|
21
|
+
if version.nil?
|
22
|
+
version = File.read("#{Rails.root}/.version").to_s.strip
|
23
|
+
end
|
24
|
+
Clemency.load_config
|
25
|
+
Clemency.load_release_files
|
26
|
+
Clemency.rollback!(version)
|
27
|
+
end
|
28
|
+
|
29
|
+
desc "Generate changelog for a release"
|
30
|
+
task :changelog, [:version] => [:environment] do |t, args|
|
31
|
+
version = args[:version]
|
32
|
+
if version.nil?
|
33
|
+
version = File.read("#{Rails.root}/.version").to_s.strip
|
34
|
+
end
|
35
|
+
puts "Clemency is generating a changelog for release #{version}"
|
36
|
+
Clemency.load_release_files
|
37
|
+
release = Clemency.releases.fetch(version, nil)
|
38
|
+
if release.nil?
|
39
|
+
puts "We could not find release #{version}"
|
40
|
+
next
|
41
|
+
end
|
42
|
+
puts release.to_markdown
|
43
|
+
end
|
44
|
+
|
45
|
+
|
46
|
+
|
47
|
+
|
48
|
+
end
|
data/lib/clemency/version.rb
CHANGED
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'rails/generators/base'
|
2
|
+
|
3
|
+
module Clemency
|
4
|
+
module Generators
|
5
|
+
class InstallGenerator < Rails::Generators::Base
|
6
|
+
|
7
|
+
desc "Installs Clemency's configuration file"
|
8
|
+
def create_release_file
|
9
|
+
config_file = %Q(#add gem "slack-notifier" to your Gemfile
|
10
|
+
#notifier = Slack::Notifier.new "WEBHOOK_URL"
|
11
|
+
Clemency.configure do
|
12
|
+
before_up do |release|
|
13
|
+
#execute code before every migration
|
14
|
+
end
|
15
|
+
after_up do |release|
|
16
|
+
#execute code after every migration
|
17
|
+
#message = release.to_markdown
|
18
|
+
#notifier.post(text: message)
|
19
|
+
end
|
20
|
+
before_down do |release|
|
21
|
+
#execute code before every rollback
|
22
|
+
end
|
23
|
+
after_down do |release|
|
24
|
+
#execute code after every rollback
|
25
|
+
end
|
26
|
+
end)
|
27
|
+
create_file "config/clemency.rb", config_file
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'rails/generators/base'
|
2
|
+
|
3
|
+
module Clemency
|
4
|
+
module Generators
|
5
|
+
class ReleaseGenerator < Rails::Generators::Base
|
6
|
+
argument :version, required: true
|
7
|
+
|
8
|
+
desc "Creates a new release file"
|
9
|
+
def create_release_file
|
10
|
+
release_file = %Q(Clemency.define_release do
|
11
|
+
set :version, "#{version}"
|
12
|
+
changelog do
|
13
|
+
#added "Added changelog item here..."
|
14
|
+
#changed "Changed changelog item here..."
|
15
|
+
#fixed "Fixed changelog item here..."
|
16
|
+
end
|
17
|
+
up do |release|
|
18
|
+
#perform release migration work here
|
19
|
+
end
|
20
|
+
down do |release|
|
21
|
+
#perform release rollback work here
|
22
|
+
end
|
23
|
+
end)
|
24
|
+
create_file "releases/#{version}_release.rb", release_file
|
25
|
+
create_file ".version", "#{version}"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: clemency
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Thomas Brewer
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-02-
|
11
|
+
date: 2019-02-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -52,6 +52,20 @@ dependencies:
|
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '3.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: pry
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
55
69
|
description: Release management
|
56
70
|
email:
|
57
71
|
- tom@leftplusright.com
|
@@ -63,6 +77,7 @@ files:
|
|
63
77
|
- ".rspec"
|
64
78
|
- ".travis.yml"
|
65
79
|
- Gemfile
|
80
|
+
- Gemfile.lock
|
66
81
|
- LICENSE.txt
|
67
82
|
- README.md
|
68
83
|
- Rakefile
|
@@ -70,7 +85,15 @@ files:
|
|
70
85
|
- bin/setup
|
71
86
|
- clemency.gemspec
|
72
87
|
- lib/clemency.rb
|
88
|
+
- lib/clemency/callbacks.rb
|
89
|
+
- lib/clemency/changelog.rb
|
90
|
+
- lib/clemency/configuration.rb
|
91
|
+
- lib/clemency/railtie.rb
|
92
|
+
- lib/clemency/release.rb
|
93
|
+
- lib/clemency/tasks/clemency.rake
|
73
94
|
- lib/clemency/version.rb
|
95
|
+
- lib/generators/clemency/install_generator.rb
|
96
|
+
- lib/generators/clemency/release_generator.rb
|
74
97
|
homepage: https://github.com/leftplusrightllc/clemency
|
75
98
|
licenses:
|
76
99
|
- MIT
|