gem-this 0.1.3
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/Rakefile +109 -0
- data/Rakefile.erb +130 -0
- data/Readme.markdown +91 -0
- data/bin/gem-this +71 -0
- metadata +56 -0
data/Rakefile
ADDED
@@ -0,0 +1,109 @@
|
|
1
|
+
require "rubygems"
|
2
|
+
require "rake/gempackagetask"
|
3
|
+
require "rake/rdoctask"
|
4
|
+
|
5
|
+
task :default => :package do
|
6
|
+
puts "Don't forget to write some tests!"
|
7
|
+
end
|
8
|
+
|
9
|
+
# This builds the actual gem. For details of what all these options
|
10
|
+
# mean, and other ones you can add, check the documentation here:
|
11
|
+
#
|
12
|
+
# http://rubygems.org/read/chapter/20
|
13
|
+
#
|
14
|
+
spec = Gem::Specification.new do |s|
|
15
|
+
|
16
|
+
# Change these as appropriate
|
17
|
+
s.name = "gem-this"
|
18
|
+
s.version = "0.1.3"
|
19
|
+
s.summary = "Make existing code into a gem, without any fuss."
|
20
|
+
s.author = "James Adam"
|
21
|
+
s.email = "james@lazyatom.com"
|
22
|
+
s.homepage = "http://github.com/lazyatom/gem-this"
|
23
|
+
|
24
|
+
s.has_rdoc = true
|
25
|
+
# s.extra_rdoc_files = %w(Readme.markdown)
|
26
|
+
# s.rdoc_options = %w(--main Readme.markdown)
|
27
|
+
|
28
|
+
# Add any extra files to include in the gem
|
29
|
+
s.files = %w(Rakefile Readme.markdown Rakefile.erb) + Dir.glob("{bin}/**/*")
|
30
|
+
s.executables = FileList["bin/**"].map { |f| File.basename(f) }
|
31
|
+
s.require_paths = ["bin"]
|
32
|
+
|
33
|
+
# If you want to depend on other gems, add them here, along with any
|
34
|
+
# relevant versions
|
35
|
+
# s.add_dependency("some_other_gem", "~> 0.1.0")
|
36
|
+
|
37
|
+
# If your tests use any gems, include them here
|
38
|
+
# s.add_development_dependency("mocha")
|
39
|
+
|
40
|
+
# If you want to publish automatically to rubyforge, you'll may need
|
41
|
+
# to tweak this, and the publishing task below too.
|
42
|
+
s.rubyforge_project = "gem-this"
|
43
|
+
end
|
44
|
+
|
45
|
+
# This task actually builds the gem. We also regenerate a static
|
46
|
+
# .gemspec file, which is useful if something (i.e. GitHub) will
|
47
|
+
# be automatically building a gem for this project. If you're not
|
48
|
+
# using GitHub, edit as appropriate.
|
49
|
+
Rake::GemPackageTask.new(spec) do |pkg|
|
50
|
+
pkg.gem_spec = spec
|
51
|
+
|
52
|
+
# Generate the gemspec file for github.
|
53
|
+
file = File.dirname(__FILE__) + "/#{spec.name}.gemspec"
|
54
|
+
File.open(file, "w") {|f| f << spec.to_ruby }
|
55
|
+
end
|
56
|
+
|
57
|
+
# Generate documentation
|
58
|
+
Rake::RDocTask.new do |rd|
|
59
|
+
rd.main = "Readme.markdown"
|
60
|
+
rd.rdoc_files.include("Readme.markdown", "lib/**/*.rb")
|
61
|
+
rd.rdoc_dir = "rdoc"
|
62
|
+
end
|
63
|
+
|
64
|
+
desc 'Clear out RDoc and generated packages'
|
65
|
+
task :clean => [:clobber_rdoc, :clobber_package] do
|
66
|
+
rm "#{spec.name}.gemspec"
|
67
|
+
end
|
68
|
+
|
69
|
+
# If you want to publish to RubyForge automatically, here's a simple
|
70
|
+
# task to help do that. If you don't, just get rid of this.
|
71
|
+
# Be sure to set up your Rubyforge account details with the Rubyforge
|
72
|
+
# gem
|
73
|
+
begin
|
74
|
+
require "rake/contrib/sshpublisher"
|
75
|
+
namespace :rubyforge do
|
76
|
+
|
77
|
+
desc "Release gem and RDoc documentation to RubyForge"
|
78
|
+
task :release => ["rubyforge:release:gem", "rubyforge:release:docs"]
|
79
|
+
|
80
|
+
namespace :release do
|
81
|
+
desc "Release a new version of this gem"
|
82
|
+
task :gem => [:package] do
|
83
|
+
require 'rubyforge'
|
84
|
+
rubyforge = RubyForge.new
|
85
|
+
rubyforge.configure
|
86
|
+
rubyforge.login
|
87
|
+
rubyforge.userconfig['release_notes'] = spec.summary
|
88
|
+
path_to_gem = File.join(File.dirname(__FILE__), "pkg", "#{spec.name}-#{spec.version}.gem")
|
89
|
+
puts "calling rubyforge.add_release(#{spec.rubyforge_project.inspect}, #{spec.name.inspect}, #{spec.version.to_s.inspect}, #{path_to_gem.inspect})"
|
90
|
+
rubyforge.add_release(spec.rubyforge_project, spec.name, spec.version.to_s, path_to_gem)
|
91
|
+
end
|
92
|
+
|
93
|
+
desc "Publish RDoc to RubyForge."
|
94
|
+
task :docs => [:rdoc] do
|
95
|
+
config = YAML.load(
|
96
|
+
File.read(File.expand_path('~/.rubyforge/user-config.yml'))
|
97
|
+
)
|
98
|
+
|
99
|
+
host = "#{config['username']}@rubyforge.org"
|
100
|
+
remote_dir = "/var/www/gforge-projects/gem-this/" # Should be the same as the rubyforge project name
|
101
|
+
local_dir = 'rdoc'
|
102
|
+
|
103
|
+
Rake::SshDirPublisher.new(host, remote_dir, local_dir).upload
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
rescue LoadError
|
108
|
+
puts "Rake SshDirPublisher is unavailable or your rubyforge environment is not configured."
|
109
|
+
end
|
data/Rakefile.erb
ADDED
@@ -0,0 +1,130 @@
|
|
1
|
+
require "rubygems"
|
2
|
+
require "rake/gempackagetask"
|
3
|
+
require "rake/rdoctask"
|
4
|
+
|
5
|
+
<% if using_rspec? %>
|
6
|
+
task :default => :spec
|
7
|
+
|
8
|
+
require "spec"
|
9
|
+
require "spec/rake/spectask"
|
10
|
+
Spec::Rake::SpecTask.new do |t|
|
11
|
+
t.spec_opts = %w(--format specdoc --colour)
|
12
|
+
t.libs = ["spec"]
|
13
|
+
end
|
14
|
+
<% elsif using_test_unit? %>
|
15
|
+
task :default => :test
|
16
|
+
|
17
|
+
require "rake/testtask"
|
18
|
+
Rake::TestTask.new do |t|
|
19
|
+
t.libs << "test"
|
20
|
+
t.test_files = FileList["test/**/*_test.rb"]
|
21
|
+
t.verbose = true
|
22
|
+
end
|
23
|
+
<% else %>
|
24
|
+
task :default => :package do
|
25
|
+
puts "Don't forget to write some tests!"
|
26
|
+
end
|
27
|
+
<% end %>
|
28
|
+
|
29
|
+
# This builds the actual gem. For details of what all these options
|
30
|
+
# mean, and other ones you can add, check the documentation here:
|
31
|
+
#
|
32
|
+
# http://rubygems.org/read/chapter/20
|
33
|
+
#
|
34
|
+
spec = Gem::Specification.new do |s|
|
35
|
+
|
36
|
+
# Change these as appropriate
|
37
|
+
s.name = "<%= gem_name %>"
|
38
|
+
s.version = "0.1.0"
|
39
|
+
s.summary = "What this thing does"
|
40
|
+
s.author = "Your name"
|
41
|
+
s.email = "you@example.com"
|
42
|
+
s.homepage = "http://example.com"
|
43
|
+
|
44
|
+
s.has_rdoc = true
|
45
|
+
<% if readme %>
|
46
|
+
s.extra_rdoc_files = %w(<%= readme %>)
|
47
|
+
s.rdoc_options = %w(--main <%= readme %>)
|
48
|
+
|
49
|
+
# Add any extra files to include in the gem
|
50
|
+
<% else %>
|
51
|
+
# You should probably have a README of some kind. Change the filename
|
52
|
+
# as appropriate
|
53
|
+
# s.extra_rdoc_files = %w(README)
|
54
|
+
# s.rdoc_options = %w(--main README)
|
55
|
+
|
56
|
+
# Add any extra files to include in the gem (like your README)
|
57
|
+
<% end %>
|
58
|
+
s.files = %w(<%= files_in_root %>) + Dir.glob("{<%= dirs_to_include %>}/**/*")
|
59
|
+
<% if has_executables? %>
|
60
|
+
s.executables = FileList["bin/**"].map { |f| File.basename(f) }
|
61
|
+
<% end %>
|
62
|
+
s.require_paths = ["lib"]
|
63
|
+
|
64
|
+
# If you want to depend on other gems, add them here, along with any
|
65
|
+
# relevant versions
|
66
|
+
# s.add_dependency("some_other_gem", "~> 0.1.0")
|
67
|
+
|
68
|
+
<% if using_rspec? %>
|
69
|
+
s.add_development_dependency("rspec") # add any other gems for testing/development
|
70
|
+
<% else %>
|
71
|
+
# If your tests use any gems, include them here
|
72
|
+
# s.add_development_dependency("mocha")
|
73
|
+
<% end %>
|
74
|
+
|
75
|
+
# If you want to publish automatically to rubyforge, you'll may need
|
76
|
+
# to tweak this, and the publishing task below too.
|
77
|
+
s.rubyforge_project = "<%= gem_name %>"
|
78
|
+
end
|
79
|
+
|
80
|
+
# This task actually builds the gem. We also regenerate a static
|
81
|
+
# .gemspec file, which is useful if something (i.e. GitHub) will
|
82
|
+
# be automatically building a gem for this project. If you're not
|
83
|
+
# using GitHub, edit as appropriate.
|
84
|
+
Rake::GemPackageTask.new(spec) do |pkg|
|
85
|
+
pkg.gem_spec = spec
|
86
|
+
|
87
|
+
# Generate the gemspec file for github.
|
88
|
+
file = File.dirname(__FILE__) + "/#{spec.name}.gemspec"
|
89
|
+
File.open(file, "w") {|f| f << spec.to_ruby }
|
90
|
+
end
|
91
|
+
|
92
|
+
# Generate documentation
|
93
|
+
Rake::RDocTask.new do |rd|
|
94
|
+
<% if readme %>rd.main = "<%= readme %>"<% end %>
|
95
|
+
rd.rdoc_files.include(<%= %{"#{readme}", } if readme %>"lib/**/*.rb")
|
96
|
+
rd.rdoc_dir = "rdoc"
|
97
|
+
end
|
98
|
+
|
99
|
+
desc 'Clear out RDoc and generated packages'
|
100
|
+
task :clean => [:clobber_rdoc, :clobber_package] do
|
101
|
+
rm "#{spec.name}.gemspec"
|
102
|
+
end
|
103
|
+
|
104
|
+
# If you want to publish to RubyForge automatically, here's a simple
|
105
|
+
# task to help do that. If you don't, just get rid of this.
|
106
|
+
begin
|
107
|
+
require "rake/contrib/sshpublisher"
|
108
|
+
namespace :rubyforge do
|
109
|
+
|
110
|
+
desc "Release gem and RDoc documentation to RubyForge"
|
111
|
+
task :release => ["rubyforge:release:gem", "rubyforge:release:docs"]
|
112
|
+
|
113
|
+
namespace :release do
|
114
|
+
desc "Publish RDoc to RubyForge."
|
115
|
+
task :docs => [:rdoc] do
|
116
|
+
config = YAML.load(
|
117
|
+
File.read(File.expand_path('~/.rubyforge/user-config.yml'))
|
118
|
+
)
|
119
|
+
|
120
|
+
host = "#{config['username']}@rubyforge.org"
|
121
|
+
remote_dir = "/var/www/gforge-projects/<%= gem_name %>/" # Should be the same as the rubyforge project name
|
122
|
+
local_dir = 'rdoc'
|
123
|
+
|
124
|
+
Rake::SshDirPublisher.new(host, remote_dir, local_dir).upload
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
rescue LoadError
|
129
|
+
puts "Rake SshDirPublisher is unavailable or your rubyforge environment is not configured."
|
130
|
+
end
|
data/Readme.markdown
ADDED
@@ -0,0 +1,91 @@
|
|
1
|
+
Most of the time, I don't set out to write a gem.
|
2
|
+
=================================================
|
3
|
+
|
4
|
+
Perhaps I'm not audacious enough to consider every piece of code I write to be worthy of use by other developers. Perhaps.
|
5
|
+
|
6
|
+
But, more likely than that, it's just that I don't think that far ahead. I'm more interested in playing with the idea at the start, rather than thinking about how other people are going to remember - nay, worship my name, years in the future.
|
7
|
+
|
8
|
+
Anyway, sometimes - after a bit of tinkering and pondering - I do end up with a library that I consider gem-worthy and fit for consumption. But every time I look at the existing tools to build gems, I'm paralysed by the comprehensive nature of their function.
|
9
|
+
|
10
|
+
Often, they'll try to generate a particular directory structure, with test stubs and a website, which is fine in principle, but I've already got my code the way I want it; I'm not generating a new project.
|
11
|
+
|
12
|
+
Even worse, sometimes they'll add themselves as dependencies for your gem! Yuck.
|
13
|
+
|
14
|
+
I am not interested in that. I just want the simplest thing that could possibly work, to build my gem and make it available to the world. I will add any bells and whistles that I want later.
|
15
|
+
|
16
|
+
And so:
|
17
|
+
|
18
|
+
Gem This
|
19
|
+
========
|
20
|
+
|
21
|
+
The `gem-this` command expects to be run in the directory of your existing code:
|
22
|
+
|
23
|
+
$ cd my-project
|
24
|
+
$ mate lib/sweet_code.rb
|
25
|
+
... hacking ...
|
26
|
+
$ gem-this
|
27
|
+
|
28
|
+
When you run `gem-this`, it will create a new `Rakefile` in your project directory. If you already had a `Rakefile`, it will append to the end of it, so your existing tasks are safe.
|
29
|
+
|
30
|
+
$ rake -T
|
31
|
+
rake clean # Clear out RDoc and generated packages
|
32
|
+
rake clobber_package # Remove package products
|
33
|
+
rake clobber_rdoc # Remove rdoc products
|
34
|
+
rake gem # Build the gem file gem-this-0.1.0.gem
|
35
|
+
rake package # Build all the packages
|
36
|
+
rake rdoc # Build the rdoc HTML Files
|
37
|
+
rake repackage # Force a rebuild of the package files
|
38
|
+
rake rerdoc # Force a rebuild of the RDOC files
|
39
|
+
rake rubyforge:release # Release gem and RDoc documentation to RubyForge
|
40
|
+
rake rubyforge:release:docs # Publish RDoc to RubyForge.
|
41
|
+
|
42
|
+
|
43
|
+
The simplest thing to do next is simply run `rake package`:
|
44
|
+
|
45
|
+
mkdir -p pkg
|
46
|
+
Successfully built RubyGem
|
47
|
+
Name: my-project
|
48
|
+
Version: 0.1.0
|
49
|
+
File: my-project-0.1.0.gem
|
50
|
+
mv my-project-0.1.0.gem pkg/my-project-0.1.0.gem
|
51
|
+
|
52
|
+
As you can tell, it's used the current directory name as the name of the gem. But, you can change any of that. Just open your `Rakefile` and edit the details.
|
53
|
+
|
54
|
+
It tries to be a little bit clever, detecting the presence of a few directories (like `bin`, `test` and `spec`) and behave accordingly. If you're already using git, it will ignore the `rdoc` and `pkg` directories for you.
|
55
|
+
|
56
|
+
What next?
|
57
|
+
----------
|
58
|
+
|
59
|
+
For the most part, `gem-this` simply sets up a good base for you to customise yourself, with as little fuss or overhead as possible. It's up to you if you want make it more sophisticated, but I trust you.
|
60
|
+
|
61
|
+
Don't worry; you'll be fine.
|
62
|
+
|
63
|
+
|
64
|
+
Thanks
|
65
|
+
======
|
66
|
+
|
67
|
+
Inspiration, and sometimes code chunks, were taking from lots of the existing gem tools, but particularly 'gemify' (wish I could've used that name!) and 'simple-gem'.
|
68
|
+
|
69
|
+
|
70
|
+
MIT License
|
71
|
+
===========
|
72
|
+
|
73
|
+
(c) James Adam 2009, or whatever
|
74
|
+
|
75
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
76
|
+
of this software and associated documentation files (the "Software"), to deal
|
77
|
+
in the Software without restriction, including without limitation the rights
|
78
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
79
|
+
copies of the Software, and to permit persons to whom the Software is
|
80
|
+
furnished to do so, subject to the following conditions:
|
81
|
+
|
82
|
+
The above copyright notice and this permission notice shall be included in
|
83
|
+
all copies or substantial portions of the Software.
|
84
|
+
|
85
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
86
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
87
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
88
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
89
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
90
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
91
|
+
THE SOFTWARE.
|
data/bin/gem-this
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
args = ARGV.dup
|
4
|
+
|
5
|
+
if args.first =~ /-?-h/
|
6
|
+
puts "Creates a Rakefile suitable for turning the current project into a gem."
|
7
|
+
puts "Usage: #{__FILE__} [-d -h] [gem name]"
|
8
|
+
puts "If a gem name is not given, the name of the current directory will be used as the gem"
|
9
|
+
puts "-h help, prints out this message."
|
10
|
+
puts "-d debug, only prints out the generated Rakefile."
|
11
|
+
exit(0)
|
12
|
+
end
|
13
|
+
|
14
|
+
debug = args.delete("-d")
|
15
|
+
|
16
|
+
gem_name = args.first || File.basename(Dir.pwd)
|
17
|
+
|
18
|
+
def using_rspec?
|
19
|
+
File.directory?('spec')
|
20
|
+
end
|
21
|
+
|
22
|
+
def using_test_unit?
|
23
|
+
File.directory?('test')
|
24
|
+
end
|
25
|
+
|
26
|
+
def has_executables?
|
27
|
+
File.directory?('bin')
|
28
|
+
end
|
29
|
+
|
30
|
+
def dirs_to_include
|
31
|
+
%w(bin test spec lib).select { |d| File.directory?(d) }.join(",")
|
32
|
+
end
|
33
|
+
|
34
|
+
def readme
|
35
|
+
Dir['*'].find { |f| f =~ /readme/i }
|
36
|
+
end
|
37
|
+
|
38
|
+
def files_in_root
|
39
|
+
Dir['*'].reject { |f| File.directory?(f) }.join(" ")
|
40
|
+
end
|
41
|
+
|
42
|
+
def using_git?
|
43
|
+
File.exist?(".git")
|
44
|
+
end
|
45
|
+
|
46
|
+
def add_to_gitignore
|
47
|
+
ignores = File.readlines(".gitignore") if File.exist?(".gitignore")
|
48
|
+
ignores += ["pkg", "rdoc"]
|
49
|
+
File.open(".gitignore", "w") { |f| f.write ignores.map { |l| l.strip }.uniq.join("\n") }
|
50
|
+
end
|
51
|
+
|
52
|
+
require 'erb'
|
53
|
+
|
54
|
+
template = ERB.new File.read(File.join(File.dirname(__FILE__), '..', 'Rakefile.erb')), nil, '<>'
|
55
|
+
rakefile = template.result(binding)
|
56
|
+
|
57
|
+
if debug
|
58
|
+
puts rakefile
|
59
|
+
exit(0)
|
60
|
+
else
|
61
|
+
if File.exist?('Rakefile')
|
62
|
+
puts "Appended to existing Rakefile"
|
63
|
+
File.open('Rakefile', 'a') { |f| 2.times { f.puts }; f.write rakefile }
|
64
|
+
else
|
65
|
+
puts "Writing new Rakefile"
|
66
|
+
File.open('Rakefile', 'w') { |f| f.write rakefile }
|
67
|
+
end
|
68
|
+
add_to_gitignore if using_git?
|
69
|
+
end
|
70
|
+
|
71
|
+
exit(0)
|
metadata
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: gem-this
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.3
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- James Adam
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-04-08 00:00:00 +01:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description:
|
17
|
+
email: james@lazyatom.com
|
18
|
+
executables:
|
19
|
+
- gem-this
|
20
|
+
extensions: []
|
21
|
+
|
22
|
+
extra_rdoc_files: []
|
23
|
+
|
24
|
+
files:
|
25
|
+
- Rakefile
|
26
|
+
- Readme.markdown
|
27
|
+
- Rakefile.erb
|
28
|
+
- bin/gem-this
|
29
|
+
has_rdoc: true
|
30
|
+
homepage: http://github.com/lazyatom/gem-this
|
31
|
+
post_install_message:
|
32
|
+
rdoc_options: []
|
33
|
+
|
34
|
+
require_paths:
|
35
|
+
- bin
|
36
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: "0"
|
41
|
+
version:
|
42
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: "0"
|
47
|
+
version:
|
48
|
+
requirements: []
|
49
|
+
|
50
|
+
rubyforge_project: gem-this
|
51
|
+
rubygems_version: 1.3.1
|
52
|
+
signing_key:
|
53
|
+
specification_version: 2
|
54
|
+
summary: Make existing code into a gem, without any fuss.
|
55
|
+
test_files: []
|
56
|
+
|