technicalpickles-jeweler 0.3.4 → 0.4.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.markdown +114 -97
- data/Rakefile +1 -2
- data/TODO +7 -5
- data/VERSION.yml +2 -2
- data/lib/jeweler.rb +0 -2
- data/lib/jeweler/bumping.rb +12 -2
- data/lib/jeweler/release.rb +7 -5
- data/lib/jeweler/tasks.rb +5 -3
- data/lib/jeweler/templates/Rakefile +1 -1
- data/test/jeweler_test.rb +1 -1
- metadata +2 -3
- data/lib/jeweler/singleton.rb +0 -22
data/README.markdown
CHANGED
@@ -12,20 +12,16 @@ Trouble is when developing your Rubygems on GitHub, you generally do one of the
|
|
12
12
|
* ... why use utilities made for the days before GitHub existed?
|
13
13
|
* ... why have extra stuff you aren't going to use?
|
14
14
|
|
15
|
-
Jeweler was created with a few
|
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
|
20
|
-
* Jeweler should only concern itself with versioning and gems
|
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
|
15
|
+
Jeweler was created with a few goals in mind:
|
25
16
|
|
26
|
-
|
17
|
+
* Only use a Gem::Specification as configuration
|
18
|
+
* Be one command away from version bumping and releasing
|
19
|
+
* Store version information in one place
|
20
|
+
* Only concern itself with git, gems, and versioning
|
21
|
+
* Not be a requirement for using your Rakefile (you just wouldn't be able to use its tasks)
|
22
|
+
* Use Jeweler internally. Oh the meta!
|
27
23
|
|
28
|
-
|
24
|
+
## Installation
|
29
25
|
|
30
26
|
Run the following if you haven't already:
|
31
27
|
|
@@ -35,68 +31,118 @@ Install the gem:
|
|
35
31
|
|
36
32
|
sudo gem install technicalpickles-jeweler
|
37
33
|
|
38
|
-
|
39
|
-
|
40
|
-
$ mkdir jeweler
|
41
|
-
$ cd jeweler
|
42
|
-
$ git init
|
34
|
+
## Configuration for an existing project
|
43
35
|
|
44
|
-
|
36
|
+
Armed with the gem, we can begin diving into an example. [the-perfect-gem](http://github.com/technicalpickles/the-perfect-gem/tree) was setup as a Jeweler showcase, and a simple example:
|
45
37
|
|
46
|
-
require 'rake'
|
47
|
-
|
48
38
|
begin
|
49
|
-
require 'rubygems'
|
50
39
|
require 'jeweler'
|
51
|
-
Jeweler
|
52
|
-
s.name = "
|
53
|
-
s.summary = "
|
40
|
+
Jeweler::Tasks.new do |s|
|
41
|
+
s.name = "the-perfect-gem"
|
42
|
+
s.summary = "TODO"
|
54
43
|
s.email = "josh@technicalpickles.com"
|
55
|
-
s.homepage = "http://github.com/technicalpickles/
|
56
|
-
s.description = "
|
57
|
-
s.authors = ["Josh Nichols"
|
58
|
-
s.files = FileList["[A-Z]*", "{generators,lib,test}/**/*"]
|
44
|
+
s.homepage = "http://github.com/technicalpickles/the-perfect-gem"
|
45
|
+
s.description = "TODO"
|
46
|
+
s.authors = ["Josh Nichols"]
|
59
47
|
end
|
60
48
|
rescue LoadError
|
61
49
|
puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
|
62
50
|
end
|
51
|
+
|
52
|
+
Here's a rundown of what's happening:
|
53
|
+
|
54
|
+
* Wrap everything in a begin block, and rescue from LoadError
|
55
|
+
* This lets us degrade gracefully if jeweler isn't installed
|
56
|
+
* Make a new `Jeweler::Tasks`
|
57
|
+
* It gets yielded a new `Gem::Specification`
|
58
|
+
* This is where all the configuration happens
|
59
|
+
* Things you definitely need to specify:
|
60
|
+
* `name`
|
61
|
+
* Things you probably want to specify:
|
62
|
+
* `summary`
|
63
|
+
* `email`
|
64
|
+
* `homepage`
|
65
|
+
* `description`
|
66
|
+
* `authors`
|
67
|
+
* Things you can specify, but have defaults
|
68
|
+
* `files`, defaults to `FileList["[A-Z]*.*", "{bin,generators,lib,test,spec}/**/*"]`
|
69
|
+
* Things you shouldn't specify:
|
70
|
+
* `version`, because Jeweler takes care of this for you
|
71
|
+
* Other things of interest
|
72
|
+
* `executables`, if you have any scripts
|
73
|
+
* `add_dependency`, if you have any dependencies
|
74
|
+
* Keep in mind that this is a `Gem::Specification`, so you can do whatever you would need to do to get your gem in shape
|
75
|
+
|
76
|
+
## Bootstrap a new project
|
77
|
+
|
78
|
+
Before proceeding, take a minute to setup your git environment, specifically your name and email address:
|
79
|
+
|
80
|
+
$ git config --global user.email johndoe@example.com
|
81
|
+
$ git config --global user.name 'John Doe'
|
82
|
+
|
83
|
+
Jeweler provides a generator of sorts, `jeweler`. It takes two arguments: your GitHub username and a repository name.
|
63
84
|
|
64
|
-
|
85
|
+
$ jeweler technicalpickles the-perfect-gem
|
86
|
+
|
87
|
+
Basically, this does:
|
88
|
+
|
89
|
+
* Creates the the-perfect-gem directory
|
90
|
+
* Seeds it with some basic files:
|
91
|
+
* `.gitignore`, with the usual suspects predefined
|
92
|
+
* `Rakefile`, setup with tasks for jeweler, test, rdoc, and rcov
|
93
|
+
* `README`, with your project name
|
94
|
+
* `LICENSE`, MIT, with your name prefilled
|
95
|
+
* `test/test_helper`, setup with shoulda, mocha, and a re-opened `Test::Unit::TestCase`
|
96
|
+
* `test/the_perfect_gem.rb`, placeholder failing test
|
97
|
+
* `lib/the_perfect_gem.rb`, placeholder library file
|
98
|
+
* Makes it a git repo
|
99
|
+
* Sets up `git@github.com:technicalpickles/jeweler.git` as the `origin` git remote
|
100
|
+
* Makes an initial commit, but does not push
|
101
|
+
|
102
|
+
At this point, you probably should create a repository by wandering to [http://github.com/repositories/new](http://github.com/repositories/new). Be sure to use the same project name you told Jeweler.
|
65
103
|
|
66
|
-
|
104
|
+
With the repository firmly created, just push it:
|
67
105
|
|
68
|
-
|
106
|
+
$ git push origin master
|
107
|
+
|
108
|
+
You also probably should [enable RubyGem creation for you repository](http://github.com/blog/51-github-s-rubygem-server): Go to your project's edit page and check the 'RubyGem' box.
|
69
109
|
|
70
|
-
|
110
|
+
## Overview of Jeweler workflow
|
71
111
|
|
72
|
-
|
73
|
-
(in /Users/nichoj/Projects/jeweler)
|
74
|
-
Wrote to VERSION.yml: 1.5.2
|
112
|
+
Here's the general idea:
|
75
113
|
|
76
|
-
|
114
|
+
* Hack, commit, hack, commit, etc, etc
|
115
|
+
* Version bump
|
116
|
+
* Release
|
117
|
+
* Have a delicious scotch
|
118
|
+
|
119
|
+
The hacking and the scotch are up to you, but Jeweler provides rake tasks for the rest.
|
77
120
|
|
78
|
-
|
79
|
-
|
80
|
-
This also validates that the gemspec should work on GitHub.
|
121
|
+
### Versioning
|
81
122
|
|
82
|
-
|
123
|
+
Versioning information is stored in `VERSION.yml`. It's a plain ol' YAML file which contains three things:
|
83
124
|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
125
|
+
* major
|
126
|
+
* minor
|
127
|
+
* patch
|
128
|
+
|
129
|
+
Consider, for a second, `1.5.3`.
|
130
|
+
|
131
|
+
* major = 1
|
132
|
+
* minor = 5
|
133
|
+
* patch = 3
|
88
134
|
|
89
|
-
|
135
|
+
#### Your first time
|
90
136
|
|
91
|
-
|
137
|
+
When you first start using Jeweler, there won't be a `VERSION.yml`, so it'll assume 0.0.0.
|
92
138
|
|
93
|
-
|
139
|
+
If you need some arbitrary version, you can do one of the following:
|
94
140
|
|
95
|
-
|
141
|
+
* `rake version:write MAJOR=6 MINOR=0 PATCH=3`
|
142
|
+
* Write `VERSION.yml` by hand (lame)
|
96
143
|
|
97
|
-
I'll let you figure that out on your own.
|
98
144
|
|
99
|
-
|
145
|
+
#### After that
|
100
146
|
|
101
147
|
You have a few rake tasks for doing the version bump:
|
102
148
|
|
@@ -108,59 +154,30 @@ If you need to do an arbitrary bump, use the same task you used to create `VERSI
|
|
108
154
|
|
109
155
|
$ rake version:write MAJOR=6 MINOR=0 PATCH=3
|
110
156
|
|
111
|
-
|
157
|
+
The process of version bumping does a commit to your repo, so make sure your repo is in a clean state (ie nothing uncommitted).
|
112
158
|
|
113
|
-
|
114
|
-
$ git push origin master
|
159
|
+
### Release it
|
115
160
|
|
116
|
-
|
161
|
+
It's pretty straight forward:
|
117
162
|
|
118
|
-
|
163
|
+
$ rake release
|
164
|
+
|
165
|
+
This takes care of:
|
119
166
|
|
120
|
-
|
167
|
+
* Generating a `.gemspec` for you project, with the version you just bumped to
|
168
|
+
* Commit and push the updated `.gemspec`
|
169
|
+
* Create a tag
|
170
|
+
* Push the tag
|
121
171
|
|
122
|
-
|
172
|
+
### Play the waiting game
|
123
173
|
|
124
|
-
|
125
|
-
* RDoc
|
126
|
-
* Default task
|
174
|
+
How do you know when your gem is built? [Has My Gem Built Yet](http://hasmygembuiltyet.org/) was specifically designed to answer that question.
|
127
175
|
|
128
|
-
|
176
|
+
If it happens to be down, you can also check out the GitHub Gem repo's [list](http://gems.github.com/list). Just search for youname-yourrepo.s
|
129
177
|
|
130
|
-
|
131
|
-
require 'rake/testtask'
|
132
|
-
require 'rake/rdoctask'
|
178
|
+
### Putting it all together
|
133
179
|
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
s.name = "jeweler"
|
139
|
-
s.summary = "Simple and opinionated helper for creating Rubygem projects on GitHub"
|
140
|
-
s.email = "josh@technicalpickles.com"
|
141
|
-
s.homepage = "http://github.com/technicalpickles/jeweler"
|
142
|
-
s.description = "Simple and opinionated helper for creating Rubygem projects on GitHub"
|
143
|
-
s.authors = ["Josh Nichols", "Dan Croak"]
|
144
|
-
s.files = FileList["[A-Z]*", "{generators,lib,test}/**/*"]
|
145
|
-
end
|
146
|
-
rescue LoadError
|
147
|
-
puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
|
148
|
-
end
|
149
|
-
|
150
|
-
Rake::TestTask.new do |t|
|
151
|
-
t.libs << 'lib'
|
152
|
-
t.pattern = 'test/**/*_test.rb'
|
153
|
-
t.verbose = false
|
154
|
-
end
|
155
|
-
|
156
|
-
desc 'Generate documentation for the safety_valve plugin.'
|
157
|
-
Rake::RDocTask.new(:rdoc) do |rdoc|
|
158
|
-
rdoc.rdoc_dir = 'rdoc'
|
159
|
-
rdoc.title = 'Jeweler'
|
160
|
-
rdoc.options << '--line-numbers' << '--inline-source'
|
161
|
-
rdoc.rdoc_files.include('README.*')
|
162
|
-
rdoc.rdoc_files.include('lib/**/*.rb')
|
163
|
-
end
|
164
|
-
|
165
|
-
desc "Run the test suite"
|
166
|
-
task :default => :test
|
180
|
+
<hack, hack, hack, commit>
|
181
|
+
$ rake version:bump:patch release
|
182
|
+
|
183
|
+
Now browse to http://gems.github.com/yourname/yourproject, and wait for it to be built.
|
data/Rakefile
CHANGED
@@ -15,7 +15,6 @@ begin
|
|
15
15
|
gemspec.homepage = "http://github.com/technicalpickles/jeweler"
|
16
16
|
gemspec.description = "Simple and opinionated helper for creating Rubygem projects on GitHub"
|
17
17
|
gemspec.authors = ["Josh Nichols"]
|
18
|
-
gemspec.bindir = 'bin'
|
19
18
|
gemspec.files = FileList["[A-Z]*", "{bin,generators,lib,test}/**/*", 'lib/jeweler/templates/.gitignore']
|
20
19
|
gemspec.add_dependency 'schacon-git'
|
21
20
|
end
|
@@ -40,7 +39,7 @@ end
|
|
40
39
|
|
41
40
|
Rcov::RcovTask.new do |t|
|
42
41
|
t.libs << "test"
|
43
|
-
t.test_files = FileList['test
|
42
|
+
t.test_files = FileList['test/**/*_test.rb']
|
44
43
|
t.verbose = true
|
45
44
|
end
|
46
45
|
|
data/TODO
CHANGED
@@ -1,5 +1,7 @@
|
|
1
|
-
*
|
2
|
-
|
3
|
-
|
4
|
-
*
|
5
|
-
|
1
|
+
* Generators
|
2
|
+
* Rails generator for making a plugin that's Jeweler enabled
|
3
|
+
* Support rspec?
|
4
|
+
* Releasing
|
5
|
+
* Create tag based on version
|
6
|
+
* Push tags
|
7
|
+
* Open hasmygembuiltyet.org
|
data/VERSION.yml
CHANGED
data/lib/jeweler.rb
CHANGED
@@ -2,7 +2,6 @@ require 'date'
|
|
2
2
|
|
3
3
|
require 'jeweler/bumping'
|
4
4
|
require 'jeweler/versioning'
|
5
|
-
require 'jeweler/singleton'
|
6
5
|
require 'jeweler/gemspec'
|
7
6
|
require 'jeweler/errors'
|
8
7
|
require 'jeweler/generator'
|
@@ -12,7 +11,6 @@ require 'jeweler/tasks'
|
|
12
11
|
|
13
12
|
# A Jeweler helps you craft the perfect Rubygem. Give him a gemspec, and he takes care of the rest.
|
14
13
|
class Jeweler
|
15
|
-
include Jeweler::Singleton
|
16
14
|
include Jeweler::Bumping
|
17
15
|
include Jeweler::Versioning
|
18
16
|
include Jeweler::Gemspec
|
data/lib/jeweler/bumping.rb
CHANGED
@@ -41,11 +41,21 @@ class Jeweler
|
|
41
41
|
}
|
42
42
|
YAML.dump(version_hash, f)
|
43
43
|
end
|
44
|
+
|
44
45
|
refresh_version
|
45
46
|
|
46
47
|
@gemspec.version = version
|
47
|
-
|
48
|
+
|
48
49
|
puts "Wrote to #{version_yaml_path}: #{version}"
|
50
|
+
|
51
|
+
commit_version
|
52
|
+
end
|
53
|
+
|
54
|
+
def commit_version
|
55
|
+
if @repo
|
56
|
+
@repo.add('VERSION.yml')
|
57
|
+
@repo.commit("Version bump to #{version}", 'VERSION.yml')
|
58
|
+
end
|
49
59
|
end
|
50
60
|
end
|
51
|
-
end
|
61
|
+
end
|
data/lib/jeweler/release.rb
CHANGED
@@ -12,15 +12,17 @@ class Jeweler
|
|
12
12
|
@repo.commit("Regenerated gemspec for version #{version}")
|
13
13
|
@repo.push
|
14
14
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
15
|
+
@repo.add_tag(release_tag)
|
16
|
+
@repo.push('origin', release_tag)
|
17
|
+
end
|
18
|
+
|
19
|
+
def release_tag
|
20
|
+
@release_tag ||= "v#{version}"
|
19
21
|
end
|
20
22
|
|
21
23
|
protected
|
22
24
|
def any_pending_changes?
|
23
|
-
|
25
|
+
@repo.status.added.empty? && @repo.status.deleted.empty? && @repo.status.changed.empty? && @repo.status.untracked.empty?
|
24
26
|
end
|
25
27
|
end
|
26
28
|
end
|
data/lib/jeweler/tasks.rb
CHANGED
@@ -3,8 +3,10 @@ require 'rake/tasklib'
|
|
3
3
|
|
4
4
|
class Jeweler
|
5
5
|
class Tasks < ::Rake::TaskLib
|
6
|
-
def initialize(&block)
|
7
|
-
@gemspec = Gem::Specification.new(
|
6
|
+
def initialize(gemspec = nil, &block)
|
7
|
+
@gemspec = Gem::Specification.new()
|
8
|
+
block.call(@gemspec) if block
|
9
|
+
|
8
10
|
@jeweler = Jeweler.new(@gemspec)
|
9
11
|
|
10
12
|
define_tasks
|
@@ -83,4 +85,4 @@ class Jeweler
|
|
83
85
|
|
84
86
|
end
|
85
87
|
end
|
86
|
-
end
|
88
|
+
end
|
data/test/jeweler_test.rb
CHANGED
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.
|
4
|
+
version: 0.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Josh Nichols
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-
|
12
|
+
date: 2008-11-03 00:00:00 -08:00
|
13
13
|
default_executable: jeweler
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -41,7 +41,6 @@ files:
|
|
41
41
|
- lib/jeweler/gemspec.rb
|
42
42
|
- lib/jeweler/generator.rb
|
43
43
|
- lib/jeweler/release.rb
|
44
|
-
- lib/jeweler/singleton.rb
|
45
44
|
- lib/jeweler/tasks.rb
|
46
45
|
- lib/jeweler/templates
|
47
46
|
- lib/jeweler/templates/LICENSE
|
data/lib/jeweler/singleton.rb
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
class Jeweler
|
2
|
-
module Singleton
|
3
|
-
def self.included(base)
|
4
|
-
base.extend(ClassMethods)
|
5
|
-
end
|
6
|
-
|
7
|
-
module ClassMethods
|
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)
|
11
|
-
@@instance = new(gemspec)
|
12
|
-
end
|
13
|
-
alias_method :gemspec=, :craft
|
14
|
-
|
15
|
-
# Gets the current Jeweler. Typically only the Jeweler Rake tasks would use this.
|
16
|
-
def instance
|
17
|
-
@@instance
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
end
|