technicalpickles-jeweler 0.0.6 → 0.0.7
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.
- data/README.markdown +68 -26
- data/Rakefile +10 -0
- data/TODO +3 -1
- data/lib/jeweler/bumping.rb +19 -7
- data/lib/jeweler/errors.rb +5 -0
- data/lib/jeweler/gemspec.rb +24 -0
- data/lib/jeweler/singleton.rb +5 -1
- data/lib/jeweler/tasks.rb +17 -7
- data/lib/jeweler/version.rb +6 -6
- data/lib/jeweler/versioning.rb +10 -2
- data/lib/jeweler.rb +3 -0
- data/test/jeweler_test.rb +8 -2
- metadata +2 -1
data/README.markdown
CHANGED
@@ -1,13 +1,52 @@
|
|
1
|
-
#
|
1
|
+
# Jeweler: Let us craft you the perfect gem
|
2
|
+
|
3
|
+
Rubygems are the awesome way of distributing your code to others. GitHub is the awesome way of managing the source code of your project. GitHub can even generate a Rubygem if you include a gemspec.
|
4
|
+
|
5
|
+
Trouble is when developing your Rubygems on GitHub, you generally do one of the following:
|
6
|
+
|
7
|
+
* Manage the gemspec by hand
|
8
|
+
* ... why bother doing something by hand when you can automate it?
|
9
|
+
* Write your own rake stuff to manage the gemspec, and deal with managing the version somehow
|
10
|
+
* ... why keep reinventing the wheel?
|
11
|
+
* use hoe or echoe for generating the gemspec
|
12
|
+
* ... why use utilities made for the days before GitHub existed?
|
13
|
+
* ... why have extra stuff you aren't going to use?
|
14
|
+
|
15
|
+
Jeweler was created with some simple goals:
|
16
|
+
|
17
|
+
* The only configuration should be providing a Gem::Specification to Jeweler
|
18
|
+
* Version bumping should only be one command away
|
19
|
+
* Authoritative version information should stored in one place, a Version module in your project
|
20
|
+
* Jeweler should only concern itself with versioning and gems (and one day, git)
|
21
|
+
* Your Rakefile should be usable when Jeweler isn't installed (you just wouldn't be able to version bump or generate a gemspec)
|
22
|
+
* Jeweler should use Jeweler. Oh the meta!
|
23
|
+
|
24
|
+
## Use Jeweler in a new project
|
25
|
+
|
26
|
+
We'll use Jeweler as an example for creating a new project.
|
27
|
+
|
28
|
+
### Install it
|
29
|
+
|
30
|
+
Run the following if you haven't already:
|
31
|
+
|
32
|
+
gem sources -a http://gems.github.com
|
33
|
+
|
34
|
+
Install the gem:
|
35
|
+
|
36
|
+
sudo gem install technicalpickles-jeweler
|
37
|
+
|
38
|
+
### Create a directory and git repo
|
2
39
|
|
3
40
|
$ mkdir jeweler
|
41
|
+
$ cd jeweler
|
4
42
|
$ git init
|
5
43
|
|
6
|
-
|
44
|
+
### Create a Rakefile:
|
7
45
|
|
8
46
|
require 'rake'
|
9
47
|
|
10
48
|
begin
|
49
|
+
require 'rubygems'
|
11
50
|
require 'jeweler'
|
12
51
|
Jeweler.gemspec = Gem::Specification.new do |s|
|
13
52
|
s.name = "jeweler"
|
@@ -22,14 +61,13 @@
|
|
22
61
|
puts "Jeweler not available. Try installing technicalpickles-jeweler."
|
23
62
|
end
|
24
63
|
|
64
|
+
Note, we don't include 'date', or 'version'. Jeweler handles filing these in when it needs them.
|
25
65
|
|
26
|
-
|
27
|
-
|
28
|
-
If you don't specify `s.files`, it will use `s.files = FileList["[A-Z]*", "{generators,lib,test,spec}/**/*"]`
|
66
|
+
If you don't specify `s.files`, it will use `s.files = FileList["[A-Z]*", "{generators,lib,test,spec}/**/*"]`.
|
29
67
|
|
30
|
-
For now, `s.name` should be lower-cased and underscored, without hyphens. That's because Jeweler camelizes and constantizes this value internally. For example, `ruby-debug` would be camelized/constanized to `Ruby-debug`, which isn't valid.
|
68
|
+
For now, `s.name` should be lower-cased and underscored, without hyphens. That's because Jeweler camelizes and constantizes this value internally. For example, `ruby-debug` would be camelized/constanized to `Ruby-debug`, which isn't a valid constant. Use `ruby_debug` instead (for now).
|
31
69
|
|
32
|
-
|
70
|
+
### Create a version file
|
33
71
|
|
34
72
|
Stick it in `lib/(spec_name_here)/version.rb`, and start it out at some version, like 0.0.0:
|
35
73
|
|
@@ -51,40 +89,44 @@ OR
|
|
51
89
|
end
|
52
90
|
end
|
53
91
|
|
54
|
-
Which you use depends on how you want to organize your gem. If you have a top-level class, like Jeweler, use the first. If you have a top level module, like
|
92
|
+
Which you use depends on how you want to organize your gem. If you have a top-level class, like Jeweler, use the first. If you have a top level module, like ActiveRecord, use the latter.
|
55
93
|
|
56
|
-
|
94
|
+
### Generate the gemspec
|
57
95
|
|
58
96
|
$ rake gemspec
|
97
|
+
|
98
|
+
This also validates that the gemspec should work on GitHub.
|
59
99
|
|
60
|
-
|
100
|
+
### Commit it already
|
61
101
|
|
62
102
|
$ git add .
|
63
|
-
$ git commit -a -m "First commit yo"
|
103
|
+
$ git commit -a -m "First commit, yo."
|
64
104
|
|
65
|
-
|
105
|
+
### Make a github repository
|
66
106
|
|
67
|
-
Wander to http://github.com/repositories/new and follow the instructions to get it pushed
|
107
|
+
Wander to http://github.com/repositories/new and follow the instructions to get it pushed.
|
68
108
|
|
69
|
-
|
109
|
+
### Enable RubyGem building on the repository
|
70
110
|
|
71
111
|
Go to your project's edit page and check the 'RubyGem' box.
|
72
112
|
|
73
|
-
|
113
|
+
### Implement something awesome
|
74
114
|
|
75
|
-
I'll let you figure that out
|
115
|
+
I'll let you figure that out on your own.
|
76
116
|
|
77
|
-
|
117
|
+
### Bump the version
|
78
118
|
|
79
|
-
You have a few rake tasks for
|
119
|
+
You have a few rake tasks for doing the version bump:
|
80
120
|
|
81
|
-
$ rake version:bump:patch
|
82
|
-
$ rake version:bump:minor
|
83
|
-
$ rake version:bump:major
|
84
|
-
|
85
|
-
|
121
|
+
$ rake version:bump:patch # 1.5.1 -> 1.5.2
|
122
|
+
$ rake version:bump:minor # 1.5.1 -> 1.6.0
|
123
|
+
$ rake version:bump:major # 1.5.1 -> 2.0.0
|
124
|
+
|
125
|
+
After that, commit and push it:
|
126
|
+
|
127
|
+
$ git commit -a -m "Version bump, yo."
|
128
|
+
$ git push origin master
|
86
129
|
|
87
|
-
|
130
|
+
### Play the waiting game
|
88
131
|
|
89
|
-
|
90
|
-
$ git push origin master
|
132
|
+
Wander over to [Has My Gem Built Yet](http://hasmygembuiltyet.org/) to play the waiting game.
|
data/Rakefile
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'rake'
|
2
2
|
require 'rake/testtask'
|
3
|
+
require 'rake/rdoctask'
|
3
4
|
|
4
5
|
$:.unshift('lib')
|
5
6
|
|
@@ -23,6 +24,15 @@ Rake::TestTask.new do |t|
|
|
23
24
|
t.pattern = 'test/**/*_test.rb'
|
24
25
|
t.verbose = false
|
25
26
|
end
|
27
|
+
|
28
|
+
desc 'Generate documentation for the safety_valve plugin.'
|
29
|
+
Rake::RDocTask.new(:rdoc) do |rdoc|
|
30
|
+
rdoc.rdoc_dir = 'rdoc'
|
31
|
+
rdoc.title = 'Jeweler'
|
32
|
+
rdoc.options << '--line-numbers' << '--inline-source'
|
33
|
+
rdoc.rdoc_files.include('README.markdown')
|
34
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
35
|
+
end
|
26
36
|
|
27
37
|
desc "Run the test suite"
|
28
38
|
task :default => :test
|
data/TODO
CHANGED
@@ -2,5 +2,7 @@
|
|
2
2
|
* ruby-debug -> Ruby::Debug
|
3
3
|
* safety_valve -> SafetyValve
|
4
4
|
* Generator for making new Jeweler projects
|
5
|
+
* Rails generator for making a plugin that's Jeweler enabled
|
5
6
|
* Git tagging/branching
|
6
|
-
*
|
7
|
+
* Make sure everything is pushed/committed before bumping (controlled by a Jeweler.strict perhaps)
|
8
|
+
* Have version:bump:xxx do a commit with an appropriate message
|
data/lib/jeweler/bumping.rb
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
class Jeweler
|
2
2
|
module Bumping
|
3
|
+
# Bumps the patch version.
|
4
|
+
#
|
5
|
+
# 1.5.1 -> 1.5.2
|
3
6
|
def bump_patch_version()
|
4
7
|
patch = self.patch_version + 1
|
5
8
|
|
@@ -7,6 +10,9 @@ class Jeweler
|
|
7
10
|
write_gemspec
|
8
11
|
end
|
9
12
|
|
13
|
+
# Bumps the minor version.
|
14
|
+
#
|
15
|
+
# 1.5.1 -> 1.6.0
|
10
16
|
def bump_minor_version()
|
11
17
|
minor = minor_version + 1
|
12
18
|
|
@@ -14,6 +20,9 @@ class Jeweler
|
|
14
20
|
write_gemspec
|
15
21
|
end
|
16
22
|
|
23
|
+
# Bumps the major version.
|
24
|
+
#
|
25
|
+
# 1.5.1 -> 2.0.0
|
17
26
|
def bump_major_version()
|
18
27
|
major = major_version + 1
|
19
28
|
|
@@ -21,26 +30,29 @@ class Jeweler
|
|
21
30
|
write_gemspec
|
22
31
|
end
|
23
32
|
|
33
|
+
# Bumps the version, to the specific major/minor/patch version, writing out the appropriate version.rb, and then reloads it.
|
24
34
|
def bump_version(major, minor, patch)
|
25
35
|
main_module_or_class = constantize(main_module_name)
|
26
36
|
keyword = top_level_keyword()
|
27
37
|
|
28
38
|
File.open(version_module_path, 'w') do |file|
|
29
39
|
file.write <<-END
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
end
|
40
|
+
#{keyword} #{main_module_name}
|
41
|
+
module Version
|
42
|
+
MAJOR = #{major}
|
43
|
+
MINOR = #{minor}
|
44
|
+
PATCH = #{patch}
|
36
45
|
end
|
37
|
-
|
46
|
+
end
|
47
|
+
END
|
38
48
|
end
|
39
49
|
@gemspec.version = "#{major}.#{minor}.#{patch}"
|
40
50
|
refresh_version
|
41
51
|
end
|
42
52
|
|
43
53
|
protected
|
54
|
+
# Tries to figure out the Ruby keyword of what is containing the Version
|
55
|
+
# module. This should be 'module' or 'class', and is used for rewriting the version.rb.
|
44
56
|
def top_level_keyword
|
45
57
|
main_module_or_class = constantize(main_module_name)
|
46
58
|
case main_module_or_class
|
data/lib/jeweler/gemspec.rb
CHANGED
@@ -1,16 +1,40 @@
|
|
1
1
|
class Jeweler
|
2
2
|
module Gemspec
|
3
|
+
# Generates a date for stuffing in the gemspec
|
3
4
|
def date
|
4
5
|
date = DateTime.now
|
5
6
|
"#{date.year}-#{date.month}-#{date.day}"
|
6
7
|
end
|
7
8
|
|
8
9
|
|
10
|
+
# Writes out the gemspec
|
9
11
|
def write_gemspec
|
10
12
|
@gemspec.date = self.date
|
11
13
|
File.open(gemspec_path, 'w') do |f|
|
12
14
|
f.write @gemspec.to_ruby
|
13
15
|
end
|
16
|
+
puts "Generated #{gemspec_path}."
|
17
|
+
end
|
18
|
+
|
19
|
+
# Validates the gemspec in an environment similar to how GitHub would build
|
20
|
+
# it. See http://gist.github.com/16215
|
21
|
+
def validate_gemspec
|
22
|
+
begin
|
23
|
+
# Snippet borrowed from http://gist.github.com/16215
|
24
|
+
data = File.read(gemspec_path)
|
25
|
+
|
26
|
+
spec = nil
|
27
|
+
if data !~ %r{!ruby/object:Gem::Specification}
|
28
|
+
Thread.new { spec = eval("$SAFE = 3\n#{data}", binding, gemspec_path) }.join
|
29
|
+
else
|
30
|
+
spec = YAML.load(data)
|
31
|
+
end
|
32
|
+
|
33
|
+
puts "#{gemspec_path} is valid."
|
34
|
+
rescue Exception => e
|
35
|
+
puts "#{gemspec_path} is invalid. See the backtrace for more details."
|
36
|
+
raise
|
37
|
+
end
|
14
38
|
end
|
15
39
|
|
16
40
|
protected
|
data/lib/jeweler/singleton.rb
CHANGED
@@ -5,10 +5,14 @@ class Jeweler
|
|
5
5
|
end
|
6
6
|
|
7
7
|
module ClassMethods
|
8
|
-
|
8
|
+
# Gives Jeweler a gem to craft. This is really just a convience method for making the Rake usage nicer.
|
9
|
+
# In reality, this creates a new Jeweler, and assigns that to the singleton instance.
|
10
|
+
def craft(gemspec)
|
9
11
|
@@instance = new(gemspec)
|
10
12
|
end
|
13
|
+
alias_method :gemspec=, :craft
|
11
14
|
|
15
|
+
# Gets the current Jeweler. Typically only the Jeweler Rake tasks would use this.
|
12
16
|
def instance
|
13
17
|
@@instance
|
14
18
|
end
|
data/lib/jeweler/tasks.rb
CHANGED
@@ -1,6 +1,16 @@
|
|
1
|
-
desc "Generate
|
2
|
-
task :gemspec
|
3
|
-
|
1
|
+
desc "Generate and validates gemspec"
|
2
|
+
task :gemspec => ['gemspec:generate', 'gemspec:validate']
|
3
|
+
|
4
|
+
namespace :gemspec do
|
5
|
+
desc "Validates the gemspec"
|
6
|
+
task :validate do
|
7
|
+
Jeweler.instance.validate_gemspec
|
8
|
+
end
|
9
|
+
|
10
|
+
desc "Generates the gemspec"
|
11
|
+
task :generate do
|
12
|
+
Jeweler.instance.write_gemspec
|
13
|
+
end
|
4
14
|
end
|
5
15
|
|
6
16
|
desc "Displays the current version"
|
@@ -10,11 +20,11 @@ end
|
|
10
20
|
|
11
21
|
namespace :version do
|
12
22
|
namespace :bump do
|
13
|
-
desc "Bump the gemspec a major version."
|
23
|
+
desc "Bump the gemspec by a major version."
|
14
24
|
task :major do
|
15
25
|
jeweler = Jeweler.instance
|
16
26
|
|
17
|
-
|
27
|
+
jeweler.bump_major_version
|
18
28
|
|
19
29
|
jeweler.bump_version(major, 0, 0)
|
20
30
|
jeweler.write_gemspec
|
@@ -22,14 +32,14 @@ namespace :version do
|
|
22
32
|
puts "Version bumped to #{jeweler.version}"
|
23
33
|
end
|
24
34
|
|
25
|
-
desc "Bump the gemspec a minor version."
|
35
|
+
desc "Bump the gemspec by a minor version."
|
26
36
|
task :minor do
|
27
37
|
jeweler = Jeweler.instance
|
28
38
|
jeweler.bump_minor_version
|
29
39
|
puts "Version bumped to #{jeweler.version}"
|
30
40
|
end
|
31
41
|
|
32
|
-
desc "Bump the gemspec a patch version."
|
42
|
+
desc "Bump the gemspec by a patch version."
|
33
43
|
task :patch do
|
34
44
|
jeweler = Jeweler.instance
|
35
45
|
jeweler.bump_patch_version
|
data/lib/jeweler/version.rb
CHANGED
data/lib/jeweler/versioning.rb
CHANGED
@@ -1,17 +1,24 @@
|
|
1
1
|
class Jeweler
|
2
2
|
module Versioning
|
3
|
+
# Major version, as defined by the gemspec's Version module.
|
4
|
+
# For 1.5.3, this would return 1.
|
3
5
|
def major_version
|
4
6
|
version_module.const_get(:MAJOR)
|
5
7
|
end
|
6
8
|
|
9
|
+
# Minor version, as defined by the gemspec's Version module.
|
10
|
+
# For 1.5.3, this would return 5.
|
7
11
|
def minor_version
|
8
12
|
version_module.const_get(:MINOR)
|
9
13
|
end
|
10
14
|
|
15
|
+
# Patch version, as defined by the gemspec's Version module.
|
16
|
+
# For 1.5.3, this would return 5.
|
11
17
|
def patch_version
|
12
18
|
version_module.const_get(:PATCH)
|
13
19
|
end
|
14
20
|
|
21
|
+
# Human readable version, which is used in the gemspec.
|
15
22
|
def version
|
16
23
|
"#{major_version}.#{minor_version}.#{patch_version}"
|
17
24
|
end
|
@@ -25,12 +32,13 @@ class Jeweler
|
|
25
32
|
constantize("#{main_module_name}::Version")
|
26
33
|
end
|
27
34
|
|
35
|
+
#
|
28
36
|
def refresh_version
|
29
|
-
# Remove the constants, so we can reload the version_module
|
30
37
|
undefine_versions()
|
31
38
|
load_version()
|
32
39
|
end
|
33
40
|
|
41
|
+
# Undefines version constants, so we can +load+ the version.rb again.
|
34
42
|
def undefine_versions
|
35
43
|
version_module.module_eval do
|
36
44
|
remove_const(:MAJOR) if const_defined?(:MAJOR)
|
@@ -40,7 +48,7 @@ class Jeweler
|
|
40
48
|
end
|
41
49
|
|
42
50
|
def load_version
|
43
|
-
load
|
51
|
+
load(version_module_path)
|
44
52
|
end
|
45
53
|
end
|
46
54
|
end
|
data/lib/jeweler.rb
CHANGED
@@ -4,10 +4,12 @@ require 'jeweler/bumping'
|
|
4
4
|
require 'jeweler/versioning'
|
5
5
|
require 'jeweler/singleton'
|
6
6
|
require 'jeweler/gemspec'
|
7
|
+
require 'jeweler/errors'
|
7
8
|
|
8
9
|
require 'jeweler/tasks' if defined?(Rake)
|
9
10
|
require 'jeweler/active_support' # Adds the stolen camelize and constantize
|
10
11
|
|
12
|
+
# A Jeweler helps you craft the perfect Rubygem. Give him a gemspec, and he takes care of the rest.
|
11
13
|
class Jeweler
|
12
14
|
include Jeweler::Singleton
|
13
15
|
include Jeweler::Bumping
|
@@ -18,6 +20,7 @@ class Jeweler
|
|
18
20
|
attr_accessor :base_dir
|
19
21
|
|
20
22
|
def initialize(gemspec, base_dir = '.')
|
23
|
+
raise(GemspecError, "Can't create a Jeweler with a nil gemspec") if gemspec.nil?
|
21
24
|
@gemspec = gemspec
|
22
25
|
@base_dir = base_dir
|
23
26
|
|
data/test/jeweler_test.rb
CHANGED
@@ -56,7 +56,7 @@ end
|
|
56
56
|
end
|
57
57
|
end
|
58
58
|
|
59
|
-
context 'A
|
59
|
+
context 'A jeweler (with a gemspec with top level module)' do
|
60
60
|
setup do
|
61
61
|
write_version_file('foo', 'module', 'Foo', 0, 1, 0)
|
62
62
|
@spec = Gem::Specification.new do |s|
|
@@ -129,7 +129,7 @@ end
|
|
129
129
|
|
130
130
|
end
|
131
131
|
|
132
|
-
context "A
|
132
|
+
context "A Jeweler (with a gemspec with top level class)" do
|
133
133
|
setup do
|
134
134
|
write_version_file('bar', 'class', 'Bar', 1, 5, 2)
|
135
135
|
|
@@ -171,4 +171,10 @@ end
|
|
171
171
|
end
|
172
172
|
end
|
173
173
|
|
174
|
+
should "raise an exception when created with a nil gemspec" do
|
175
|
+
assert_raises Jeweler::GemspecError do
|
176
|
+
@jeweler = Jeweler.new(nil, File.dirname(__FILE__))
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
174
180
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: technicalpickles-jeweler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Josh Nichols
|
@@ -29,6 +29,7 @@ files:
|
|
29
29
|
- lib/jeweler
|
30
30
|
- lib/jeweler/active_support.rb
|
31
31
|
- lib/jeweler/bumping.rb
|
32
|
+
- lib/jeweler/errors.rb
|
32
33
|
- lib/jeweler/gemspec.rb
|
33
34
|
- lib/jeweler/singleton.rb
|
34
35
|
- lib/jeweler/tasks.rb
|