technicalpickles-jeweler 0.3.4 → 0.4.1
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 +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
|