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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c46fdde5c2da4ed4d002c6272ad3473e99b88bebf51405b01e7f2bc206345290
4
- data.tar.gz: 70c33ce94b1887dcb03d3f1cbd2a98424647cc4b347910226d4b823df01c49f1
3
+ metadata.gz: 2efdabed6d5159d35dde521f624561f01eba89ab8a64ca11dca7be11fb9367c7
4
+ data.tar.gz: 1f2d2c96af18e5374c6a15f80453fd9ac1dfd83b79ce290c5540594185aa4deb
5
5
  SHA512:
6
- metadata.gz: 2b0323be4e90e29eee6ebcd5aecf579e7c3b0667bddea70473f572567c83d3da7ad1ccd5a47d67ea426a59631436819ff7699085885f2dd93aba523970f81fe2
7
- data.tar.gz: d59beb708c3cf10462a389d3e74f44860d8fd3ae14ee10a2218f60e2a86614cb4cd9fec541dfc852bf31046d3cdc2de8d326ea20f9b4353972a41393d58b96df
6
+ metadata.gz: bdd9a28d76542ae43278f24f7fa53c14922e48433a2094e60dc6dbe380b5a2725e4c9702daf396c5e73bbdaf57f2d9f6a07f9e8b7d294fb93861456e4c6b1ee0
7
+ data.tar.gz: d43e5b3deeb4de33bdf1a0d4896b5aaaab0579222ee4f0793c8b7f263d4663022a3e3363e9135bdb6335ce900a19d7efff14dbb0f756baccb5679677da7ca555
@@ -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
- TODO: Write usage instructions here
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/[USERNAME]/clemency.
64
+ Bug reports and pull requests are welcome on GitHub at https://github.com/leftplusrightllc/clemency.
36
65
 
37
66
  ## License
38
67
 
@@ -26,4 +26,5 @@ Gem::Specification.new do |spec|
26
26
  spec.add_development_dependency "bundler", "~> 2.0"
27
27
  spec.add_development_dependency "rake", "~> 10.0"
28
28
  spec.add_development_dependency "rspec", "~> 3.0"
29
+ spec.add_development_dependency "pry"
29
30
  end
@@ -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
- # Your code goes here...
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,13 @@
1
+ require 'clemency'
2
+ require 'rails'
3
+
4
+ module Clemency
5
+ class Railtie < Rails::Railtie
6
+ railtie_name :clemency
7
+
8
+ rake_tasks do
9
+ path = File.expand_path(__dir__)
10
+ Dir.glob("#{path}/tasks/**/*.rake").each { |f| load f }
11
+ end
12
+ end
13
+ 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
@@ -1,3 +1,3 @@
1
1
  module Clemency
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -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.1.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-22 00:00:00.000000000 Z
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