gem_polisher 0.1.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/README.md +8 -0
- data/lib/gem_polisher.rb +59 -0
- data/lib/gem_polisher/gem_info.rb +100 -0
- data/lib/gem_polisher/release_task.rb +80 -0
- data/lib/gem_polisher/task.rb +27 -0
- data/lib/gem_polisher/test_task.rb +9 -0
- data/lib/gem_polisher/version.rb +3 -0
- metadata +137 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: a6d7b3ec998e563cd973f180ccc292198d08709f
|
4
|
+
data.tar.gz: 570221fd0fcf51c0bc410a163d5764c8724a2f2e
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 2b87621abf6c71a8abe889609f9b23c9b241f3a190a9eeaa41a8b09de084ab914832695b6611140fdc032968d744efed323750ebb095db2e5afc081823cc2b16
|
7
|
+
data.tar.gz: 1b403ece4ee9e436872cf8525835d9961e1e690f9593757965773a8d008230d58b6a0110664fb4f3fedcb645b5793fb6325d9ad8d937e7b42be0d9b4d9181072
|
data/README.md
ADDED
@@ -0,0 +1,8 @@
|
|
1
|
+
# gem_polisher
|
2
|
+
|
3
|
+
* Home: [https://github.com/fornellas/gem_polisher/](https://github.com/fornellas/gem_polisher/)
|
4
|
+
* Bugs: [https://github.com/fornellas/gem_polisher/issues](https://github.com/fornellas/gem_polisher/issues)
|
5
|
+
|
6
|
+
## Description
|
7
|
+
|
8
|
+
This Gem provides Rake tasks to assist Ruby Gem development workflow.
|
data/lib/gem_polisher.rb
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'agita'
|
3
|
+
require_relative 'gem_polisher/gem_info'
|
4
|
+
require_relative 'gem_polisher/task'
|
5
|
+
Dir.glob(File.dirname(__FILE__)+ '/gem_polisher/*_task.rb').each do |task|
|
6
|
+
require_relative task
|
7
|
+
end
|
8
|
+
|
9
|
+
# Provides Rake tasks to assist Ruby Gem development workflow.
|
10
|
+
class GemPolisher
|
11
|
+
|
12
|
+
extend Forwardable
|
13
|
+
|
14
|
+
# GemInfo instance
|
15
|
+
attr_reader :gem_info
|
16
|
+
|
17
|
+
def_delegators :gem_info,
|
18
|
+
:gemspec_path,
|
19
|
+
:gem_name,
|
20
|
+
:gem_require,
|
21
|
+
:gem_main_constant_s
|
22
|
+
|
23
|
+
# Command used to publish Gem.
|
24
|
+
attr_reader :gem_publish_command
|
25
|
+
|
26
|
+
# Hash with all created Rake tasks
|
27
|
+
attr_reader :rake_tasks
|
28
|
+
|
29
|
+
# Agita instance
|
30
|
+
attr_reader :agita
|
31
|
+
|
32
|
+
|
33
|
+
# This should be called from within Rakefile. It will create necessary Rake tasks.
|
34
|
+
# Optionally, a Hash can be passed with:
|
35
|
+
# +:gem_publish_command+:: Command to use to publish your gem (eg. "gem inabox"). Default: "gem push".
|
36
|
+
# This Hash is also passed to GemPolisher::GemInfo#initialize, so same options are valid here.
|
37
|
+
def initialize opts={}
|
38
|
+
unless ENV["BUNDLE_GEMFILE"]
|
39
|
+
raise RuntimeError.new("#{self.class.to_s} should not be called outside Bundler environment. Try calling rake with 'bundle exec rake'")
|
40
|
+
end
|
41
|
+
@gem_info = GemInfo.new(opts)
|
42
|
+
@gem_publish_command = opts.fetch(:gem_publish_command) { 'gem push' }
|
43
|
+
@agita = Agita.new
|
44
|
+
@rake_tasks = []
|
45
|
+
define_rake_tasks
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
# Defire Rake tasks
|
51
|
+
def define_rake_tasks
|
52
|
+
# For each *Task class...
|
53
|
+
self.class.constants.keep_if{|c| c.match(/.Task$/)}.each do |constant|
|
54
|
+
# ...initialize it
|
55
|
+
@rake_tasks << self.class.const_get(constant).send(:new, self)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
@@ -0,0 +1,100 @@
|
|
1
|
+
require 'semantic'
|
2
|
+
|
3
|
+
class GemPolisher
|
4
|
+
# Extracts information from Gem at current directory.
|
5
|
+
class GemInfo
|
6
|
+
|
7
|
+
# String representing Gem's main constant.
|
8
|
+
attr_reader :gem_main_constant_s
|
9
|
+
|
10
|
+
# Optin Hash can be passed with:
|
11
|
+
# +:gem_main_constant_s+:: By default, conventions documented at http://guides.rubygems.org/name-your-gem/ are followed to extract Gem's main constant name, but with strict camel case (eg: Rdoc no RDoc). Use this option case your gem does not follow strict camel case. Eg: for Gem named +net-http-persistent+, use +"Net::HTTP::Persistent"+ here.
|
12
|
+
def initialize opts={}
|
13
|
+
@gem_main_constant_s = opts.fetch(:gem_main_constant_s) do
|
14
|
+
default_gem_main_constant_s
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
# Return path to .gemspec file.
|
19
|
+
def gemspec_path
|
20
|
+
path = Dir.glob('*.gemspec').first
|
21
|
+
unless path
|
22
|
+
raise Errno::ENOENT.new('*.gemspec not found')
|
23
|
+
end
|
24
|
+
path
|
25
|
+
end
|
26
|
+
|
27
|
+
# Returns Gem name from #gemspec_path file.
|
28
|
+
def gem_name
|
29
|
+
gemspec_path.gsub(/\.gemspec$/, '')
|
30
|
+
end
|
31
|
+
|
32
|
+
# Argument to be used for #require for the gem.
|
33
|
+
def gem_require
|
34
|
+
gem_name.downcase.gsub(/-/, '/')
|
35
|
+
end
|
36
|
+
|
37
|
+
# Returns String with name of Gem's main constant, calculated from #gem_name, following conventions at: http://guides.rubygems.org/name-your-gem/
|
38
|
+
def default_gem_main_constant_s
|
39
|
+
const = gem_name
|
40
|
+
.capitalize
|
41
|
+
.split('_')
|
42
|
+
.map{|n| n.capitalize}
|
43
|
+
.join('')
|
44
|
+
if const.match(/-/)
|
45
|
+
const
|
46
|
+
.split('-')
|
47
|
+
.map do |n|
|
48
|
+
n[0].capitalize +
|
49
|
+
n[1, n.length]
|
50
|
+
end
|
51
|
+
.join('::')
|
52
|
+
else
|
53
|
+
const
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
# Returns value of Gem's main constant.
|
58
|
+
def gem_main_constant
|
59
|
+
gem_specification # avoid NameError if not loaded.
|
60
|
+
Object.const_get(gem_main_constant_s)
|
61
|
+
end
|
62
|
+
|
63
|
+
# Returns Gem::Specification object.
|
64
|
+
def gem_specification
|
65
|
+
# Avoids warning over redefined VERSION constant
|
66
|
+
version_const_str = '::' + gem_main_constant_s + "::VERSION"
|
67
|
+
if Object.const_defined?(version_const_str)
|
68
|
+
Object.const_get(gem_main_constant_s).send(:remove_const, :VERSION)
|
69
|
+
end
|
70
|
+
# Allow #gem_version_rb to be reloaded after changes
|
71
|
+
$LOADED_FEATURES.delete_if{|f| f == File.absolute_path(gem_version_rb)}
|
72
|
+
eval(File.open(gemspec_path, 'r').read, nil, gemspec_path)
|
73
|
+
end
|
74
|
+
|
75
|
+
# Returns a Semantic::Version instance
|
76
|
+
def semantic_version
|
77
|
+
Semantic::Version.new(gem_specification.version.to_s)
|
78
|
+
end
|
79
|
+
|
80
|
+
# Path to Gem's version.rb
|
81
|
+
def gem_version_rb
|
82
|
+
"lib/#{gem_name}/version.rb"
|
83
|
+
end
|
84
|
+
|
85
|
+
# Increment version at "lib/#{gem_name}/version.rb".
|
86
|
+
def inc_version! type
|
87
|
+
new_version = semantic_version.increment!(type)
|
88
|
+
const_class = gem_main_constant.class.to_s.downcase
|
89
|
+
const_name = gem_main_constant
|
90
|
+
ancestor_classes = gem_main_constant.ancestors.keep_if{|a| a.class == Class}
|
91
|
+
parent_class = ( parent = ancestor_classes[1] ) == Object ? nil : parent
|
92
|
+
File.open(gem_version_rb, 'w') do |io|
|
93
|
+
io.puts "#{const_class} #{const_name}#{" < #{parent_class}" if parent_class}"
|
94
|
+
io.puts " VERSION = '#{new_version.to_s}'"
|
95
|
+
io.puts "end"
|
96
|
+
end
|
97
|
+
new_version
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
class GemPolisher
|
2
|
+
# gem:release task
|
3
|
+
class ReleaseTask < Task
|
4
|
+
|
5
|
+
extend Forwardable
|
6
|
+
|
7
|
+
def_delegators :gem_polisher,
|
8
|
+
:agita,
|
9
|
+
:gem_info,
|
10
|
+
:gem_publish_command
|
11
|
+
|
12
|
+
def create_task
|
13
|
+
namespace :gem do
|
14
|
+
desc 'Update bundle, run tests, increment version, build and publish Gem; type can be major, minor or patch.'
|
15
|
+
task :release, [:type] do |t, args|
|
16
|
+
type = args[:type]
|
17
|
+
git_ensure_master_updated_clean
|
18
|
+
bundle_update
|
19
|
+
Rake::Task[:test].invoke
|
20
|
+
inc_version(type)
|
21
|
+
gem_build
|
22
|
+
gem_publish
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
# :section: Steps
|
30
|
+
|
31
|
+
# Make sure we are at master, updated and clean.
|
32
|
+
def git_ensure_master_updated_clean
|
33
|
+
agita.ensure_master_updated_clean
|
34
|
+
end
|
35
|
+
|
36
|
+
# bundle update
|
37
|
+
def bundle_update
|
38
|
+
run 'bundle update'
|
39
|
+
if agita.commit('Updated Bundle', 'Gemfile.lock')
|
40
|
+
unless File.basename($PROGRAM_NAME) == 'rake'
|
41
|
+
raise RuntimeError.new("Not executed by rake executable!")
|
42
|
+
end
|
43
|
+
exec 'bundle', *['exec', 'rake', *ARGV]
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
# Increment Gem version
|
48
|
+
def inc_version type
|
49
|
+
new_version = gem_info.inc_version!(type)
|
50
|
+
# This loop shouldn't be needed, but test fails without it. Bundler bug?
|
51
|
+
2.times{ run("bundle install") }
|
52
|
+
agita.commit("Increased #{type} version.", 'Gemfile.lock', gem_info.gem_version_rb)
|
53
|
+
agita.tag("v#{new_version.to_s}", "New #{type} version.")
|
54
|
+
end
|
55
|
+
|
56
|
+
# Build .gem
|
57
|
+
def gem_build
|
58
|
+
run("gem build #{gem_info.gem_name}.gemspec")
|
59
|
+
end
|
60
|
+
|
61
|
+
# Path to .gem
|
62
|
+
def gem_path
|
63
|
+
"#{gem_info.gem_name}-#{gem_info.semantic_version}.gem"
|
64
|
+
end
|
65
|
+
|
66
|
+
# Publishes .gem with gem_publish_command
|
67
|
+
def gem_publish
|
68
|
+
run("#{gem_publish_command} #{Shellwords.escape(gem_path)}")
|
69
|
+
end
|
70
|
+
|
71
|
+
# :section: Helpers
|
72
|
+
|
73
|
+
def run command
|
74
|
+
output = `#{command}`
|
75
|
+
raise "#{command} returned non-zero status:\n#{output}" unless $?.exitstatus == 0
|
76
|
+
output
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
80
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
class GemPolisher
|
2
|
+
# Parent class that handles Rake tasks creation
|
3
|
+
class Task
|
4
|
+
|
5
|
+
include Rake::DSL
|
6
|
+
|
7
|
+
# GemPolisher instance
|
8
|
+
attr_reader :gem_polisher
|
9
|
+
|
10
|
+
extend Forwardable
|
11
|
+
|
12
|
+
def_delegators :gem_polisher,
|
13
|
+
:gem_info
|
14
|
+
|
15
|
+
# Receive a GemPolisher instance
|
16
|
+
def initialize gem_polisher
|
17
|
+
@gem_polisher = gem_polisher
|
18
|
+
create_task
|
19
|
+
end
|
20
|
+
|
21
|
+
# Creates Rake task (abstract method)
|
22
|
+
def create_task
|
23
|
+
raise "Not implemented!"
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
metadata
ADDED
@@ -0,0 +1,137 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: gem_polisher
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Fabio Pugliese Ornellas
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-01-27 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: agita
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0.1'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0.1'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: semantic
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.4'
|
34
|
+
- - ">="
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: 1.4.1
|
37
|
+
type: :runtime
|
38
|
+
prerelease: false
|
39
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - "~>"
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '1.4'
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: 1.4.1
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: rake
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - "~>"
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '10.4'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - "~>"
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '10.4'
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
name: rspec
|
63
|
+
requirement: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - "~>"
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '3.4'
|
68
|
+
type: :development
|
69
|
+
prerelease: false
|
70
|
+
version_requirements: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - "~>"
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '3.4'
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
name: simplecov
|
77
|
+
requirement: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - "~>"
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '0.11'
|
82
|
+
- - ">="
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
version: 0.11.1
|
85
|
+
type: :development
|
86
|
+
prerelease: false
|
87
|
+
version_requirements: !ruby/object:Gem::Requirement
|
88
|
+
requirements:
|
89
|
+
- - "~>"
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
version: '0.11'
|
92
|
+
- - ">="
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: 0.11.1
|
95
|
+
description: This Gem provides Rake tasks to assist Ruby Gem development workflow.
|
96
|
+
email: fabio.ornellas@gmail.com
|
97
|
+
executables: []
|
98
|
+
extensions: []
|
99
|
+
extra_rdoc_files:
|
100
|
+
- README.md
|
101
|
+
files:
|
102
|
+
- README.md
|
103
|
+
- lib/gem_polisher.rb
|
104
|
+
- lib/gem_polisher/gem_info.rb
|
105
|
+
- lib/gem_polisher/release_task.rb
|
106
|
+
- lib/gem_polisher/task.rb
|
107
|
+
- lib/gem_polisher/test_task.rb
|
108
|
+
- lib/gem_polisher/version.rb
|
109
|
+
homepage: https://github.com/fornellas/gem_polisher
|
110
|
+
licenses: []
|
111
|
+
metadata: {}
|
112
|
+
post_install_message:
|
113
|
+
rdoc_options:
|
114
|
+
- "--main"
|
115
|
+
- README.md
|
116
|
+
- lib/
|
117
|
+
- README.md
|
118
|
+
require_paths:
|
119
|
+
- lib
|
120
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
126
|
+
requirements:
|
127
|
+
- - ">="
|
128
|
+
- !ruby/object:Gem::Version
|
129
|
+
version: '0'
|
130
|
+
requirements: []
|
131
|
+
rubyforge_project:
|
132
|
+
rubygems_version: 2.4.5.1
|
133
|
+
signing_key:
|
134
|
+
specification_version: 4
|
135
|
+
summary: This Gem provides Rake tasks to assist Ruby Gem development workflow.
|
136
|
+
test_files: []
|
137
|
+
has_rdoc:
|