clemency 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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