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 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.
@@ -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
@@ -0,0 +1,9 @@
1
+ class GemPolisher
2
+ # test task
3
+ class TestTask < Task
4
+ def create_task
5
+ desc 'Run all tests.'
6
+ task :test
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,3 @@
1
+ class GemPolisher
2
+ VERSION = '0.1.0'
3
+ 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: