gem_polisher 0.1.0

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