gemify 0.3 → 0.4.0
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/CHANGELOG +4 -1
- data/README.md +34 -51
- data/Rakefile +3 -0
- data/bin/gemify +262 -54
- data/gemify.gemspec +36 -19
- data/lib/gemify.rb +84 -24
- data/lib/gemify/version.rb +3 -0
- data/test/test_gemify.rb +67 -0
- metadata +23 -27
- data/.yardopts +0 -4
- data/lib/gemify/base.rb +0 -67
- data/lib/gemify/cli.rb +0 -157
- data/lib/gemify/manifest.rb +0 -94
- data/lib/trollop.rb +0 -739
- data/spec/spec_helper.rb +0 -2
data/CHANGELOG
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
== 0.4
|
2
|
+
* Gemify is now a gemspec generator!
|
3
|
+
|
1
4
|
== 0.3
|
2
5
|
* Gemify is now a gemspec editor!
|
3
6
|
|
@@ -35,4 +38,4 @@
|
|
35
38
|
* Added a very fancy CLI
|
36
39
|
|
37
40
|
== 0.1.0 - 2008-02-07
|
38
|
-
* The first release. More like a POC-code
|
41
|
+
* The first release. More like a POC-code
|
data/README.md
CHANGED
@@ -1,71 +1,54 @@
|
|
1
|
-
Gemify, the
|
2
|
-
|
1
|
+
Gemify, the gemspec generator
|
2
|
+
=============================
|
3
3
|
|
4
4
|
Overview
|
5
5
|
--------
|
6
6
|
|
7
|
-
Gemify is a simple tool which helps you
|
8
|
-
|
9
|
-
|
10
|
-
approach.
|
11
|
-
|
12
|
-
Gemify works directly on the .gemspec file. In fact, when you're using Gemify,
|
13
|
-
you're only using it as an editor. If you want, you could just edit the file
|
14
|
-
manually.
|
7
|
+
Gemify is a simple tool which helps you generate gemspecs (which are
|
8
|
+
used for building gems) and verify that your project follows the common
|
9
|
+
and proven way to structure your Ruby packages.
|
15
10
|
|
16
11
|
Getting started
|
17
12
|
---------------
|
18
13
|
|
14
|
+
Generating gemspec:
|
15
|
+
|
19
16
|
$ gem install gemify
|
20
|
-
$ cd myproject (
|
17
|
+
$ cd myproject (which doesn't have a gemspec yet)
|
21
18
|
$ gemify
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
1) Change name (required) = gemify
|
26
|
-
2) Change summary (required) = The lightweight gemspec editor
|
27
|
-
3) Change version (required) = 0.3
|
28
|
-
4) Change author = Magnus Holm
|
29
|
-
5) Change email = judofyr@gmail.com
|
30
|
-
6) Change homepage = http://dojo.rubyforge.org/
|
31
|
-
7) Set dependencies
|
32
|
-
|
33
|
-
s) Save
|
34
|
-
r) Reload (discard unsaved changes)
|
35
|
-
m) Rename
|
36
|
-
l) List files
|
19
|
+
Gemify needs to know a bit about your project, but should be
|
20
|
+
able to guess most of the information. Type the value if you
|
21
|
+
need to correct it, or press ENTER to accept the suggestion by Gemify.
|
37
22
|
|
38
|
-
|
23
|
+
Project name: gemify?
|
24
|
+
Namespace: Gemify?
|
25
|
+
Library: lib/gemify?
|
39
26
|
|
40
|
-
|
27
|
+
*** Verifying the structure of lib/
|
28
|
+
[+] Please consider to define Gemify::VERSION in lib/gemify/version.rb
|
29
|
+
[.] Done
|
41
30
|
|
42
|
-
|
31
|
+
*** Verifying the structure of bin/
|
32
|
+
[.] Done
|
43
33
|
|
44
|
-
|
34
|
+
*** Verifying the structure of ext/
|
35
|
+
[.] Done
|
45
36
|
|
46
|
-
|
47
|
-
|
37
|
+
*** Generating a gemspec
|
38
|
+
[.] Done
|
48
39
|
|
49
|
-
|
50
|
-
or CVS and uses the commited files.
|
40
|
+
Please open gemify.gemspec in your text editor and fill out the details.
|
51
41
|
|
52
|
-
|
42
|
+
You should fix any warnings that was reported above. You won't need to
|
43
|
+
generate a new gemspec after you've fixed them.
|
53
44
|
|
54
|
-
You
|
55
|
-
|
56
|
-
|
45
|
+
You must also define Gemify::VERSION in lib/gemify/version.rb.
|
46
|
+
Gemify has automatically created the file for you, so simply
|
47
|
+
open it in your text editor and fill in the current version.
|
48
|
+
|
49
|
+
Or if you just want to verify it:
|
57
50
|
|
58
|
-
|
59
|
-
|
60
|
-
When you set dependencies, you can separate the version requirement by a
|
61
|
-
comma:
|
62
|
-
|
63
|
-
$ gemify
|
64
|
-
...
|
65
|
-
> 7
|
66
|
-
Split by ENTER and press ENTER twice when you're done
|
67
|
-
> nokogiri
|
68
|
-
> rack, >= 1.0
|
51
|
+
$ gemify -v
|
69
52
|
|
70
53
|
### Build and share a gem
|
71
54
|
|
@@ -78,8 +61,8 @@ Let's not reinvent the wheel, shall we?
|
|
78
61
|
Acknowledgements
|
79
62
|
----------------
|
80
63
|
|
81
|
-
Thanks to [Pat Nakajima](http://patnakajima.com/) for reminding me that
|
82
|
-
still has its uses.
|
64
|
+
Thanks to [Pat Nakajima](http://patnakajima.com/) for reminding me that
|
65
|
+
Gemify still has its uses.
|
83
66
|
|
84
67
|
|
85
68
|
Contributors
|
data/Rakefile
ADDED
data/bin/gemify
CHANGED
@@ -1,57 +1,265 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
$:.unshift File.dirname(__FILE__) + '/../lib'
|
4
2
|
require 'gemify'
|
5
|
-
require '
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
3
|
+
require 'gemify/version'
|
4
|
+
require 'fileutils'
|
5
|
+
include Gemify
|
6
|
+
include FileUtils
|
7
|
+
|
8
|
+
options, args = ARGV.partition { |a| a[0] == ?- }
|
9
|
+
verify_only = options.include?('-v')
|
10
|
+
force = options.include?('-f')
|
11
|
+
|
12
|
+
if options.grep(/^--?(h|\?)/).first
|
13
|
+
puts <<-EOF
|
14
|
+
Gemify v#{Gemify::VERSION}
|
15
|
+
|
16
|
+
Verify project and generate gemspec:
|
17
|
+
#$0
|
18
|
+
|
19
|
+
Only verify project:
|
20
|
+
#$0 -v
|
21
|
+
|
22
|
+
Show help:
|
23
|
+
#$0 -h
|
24
|
+
EOF
|
25
|
+
exit
|
26
|
+
end
|
27
|
+
|
28
|
+
puts <<-EOF
|
29
|
+
Gemify needs to know a bit about your project, but should be
|
30
|
+
able to guess most of the information. Type the value if you
|
31
|
+
need to correct it, or press ENTER to accept the suggestion by Gemify.
|
32
|
+
|
33
|
+
EOF
|
34
|
+
|
35
|
+
name = clean_name(args.shift || File.basename(Dir.pwd))
|
36
|
+
name = ask "Project name", name
|
37
|
+
|
38
|
+
namespace = name_to_namespace(name)
|
39
|
+
namespace = ask "Namespace", namespace
|
40
|
+
|
41
|
+
library = namespace_to_library(namespace)
|
42
|
+
library = ask "Library", 'lib/' + library
|
43
|
+
library = 'lib/' + library unless library =~ /^lib\//
|
44
|
+
puts
|
45
|
+
|
46
|
+
gemspec = "#{name}.gemspec"
|
47
|
+
|
48
|
+
if !force && !verify_only && File.exists?(gemspec)
|
49
|
+
puts <<-EOF
|
50
|
+
*** Gemspec already exists!
|
51
|
+
Either remove the gemspec:
|
52
|
+
mv #{gemspec} #{gemspec}.old
|
53
|
+
|
54
|
+
Or run the verifier only:
|
55
|
+
#{$0} -v #{ARGV.join(' ')}
|
56
|
+
|
57
|
+
Or force an overwrite:
|
58
|
+
#{$0} -f #{ARGV.join(' ')}
|
59
|
+
EOF
|
60
|
+
exit
|
61
|
+
end
|
62
|
+
|
63
|
+
|
64
|
+
## Verify files
|
65
|
+
|
66
|
+
puts "*** Verifying the structure of lib/"
|
67
|
+
|
68
|
+
Dir["lib/**/*"].each do |file|
|
69
|
+
next if File.directory?(file)
|
70
|
+
next if file =~ /^lib\/tasks/
|
71
|
+
|
72
|
+
if File.extname(file) != ".rb"
|
73
|
+
w :lib_rb, "Non-Ruby library: #{file}"
|
74
|
+
end
|
75
|
+
|
76
|
+
if file !~ /^#{Regexp.escape(library)}(\.rb|\/)/
|
77
|
+
w :lib_leaky, "Library pollution: #{file}"
|
78
|
+
end
|
79
|
+
|
80
|
+
mode = File.stat(file).mode.to_s(8)[-4..-1]
|
81
|
+
if mode != "0644"
|
82
|
+
w :bin_mode, "Wrong permission (#{mode}): #{file}"
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
if w? :lib_rb
|
87
|
+
n "Please consider moving any library non-Ruby files to the data/ directory"
|
88
|
+
end
|
89
|
+
|
90
|
+
if w? :lib_leaky
|
91
|
+
n "Please consider moving all your library files to the #{library}/ directory"
|
92
|
+
end
|
93
|
+
|
94
|
+
if w? :lib_perm
|
95
|
+
n "Please consider to chmod all your library files to 0644"
|
96
|
+
if yes " Should Gemify do this for you?"
|
97
|
+
Dir["lib/**/*"].each do |file|
|
98
|
+
next if File.directory?(file)
|
99
|
+
chmod(0644, file)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
version_require = library[4..-1] + '/version'
|
105
|
+
version_file = library + '/version.rb'
|
106
|
+
version = File.exists?(version_file)
|
107
|
+
|
108
|
+
unless version
|
109
|
+
n "Please consider to define #{namespace}::VERSION in #{version_file}"
|
110
|
+
end
|
111
|
+
|
112
|
+
puts "[.] Done"
|
113
|
+
|
114
|
+
puts
|
115
|
+
puts "*** Verifying the structure of bin/"
|
116
|
+
|
117
|
+
shebang = "#!/usr/bin/env ruby"
|
118
|
+
|
119
|
+
Dir["bin/*"].each do |file|
|
120
|
+
next if File.directory?(file)
|
121
|
+
|
122
|
+
File.open(file) do |f|
|
123
|
+
if f.read(shebang.length) != shebang
|
124
|
+
w :shebang, "Missing shebang: #{file}"
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
if File.extname(file) == ".rb"
|
129
|
+
w :bin_rb, ".rb extension: #{file}"
|
130
|
+
end
|
131
|
+
|
132
|
+
mode = File.stat(file).mode.to_s(8)[-4..-1]
|
133
|
+
if mode != "0755"
|
134
|
+
w :bin_mode, "Wrong permission (#{mode}): #{file}"
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
if w? :shebang
|
139
|
+
n "Please consider to add '#{shebang}' to all binaries"
|
140
|
+
end
|
141
|
+
|
142
|
+
if w? :bin_rb
|
143
|
+
n "Please consider that binaries should NOT end in .rb"
|
144
|
+
end
|
145
|
+
|
146
|
+
if w? :bin_mode
|
147
|
+
n "Please consider to chmod all your binary files to 0755"
|
148
|
+
if yes " Should Gemify do this for you?"
|
149
|
+
Dir["bin/*"].each do |file|
|
150
|
+
next if File.directory?(file)
|
151
|
+
chmod(0755, file)
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
puts "[.] Done"
|
157
|
+
|
158
|
+
puts
|
159
|
+
puts "*** Verifying the structure of ext/"
|
160
|
+
|
161
|
+
Dir["ext/*"].each do |ext|
|
162
|
+
unless File.exists?(ext + '/extconf.rb')
|
163
|
+
w :ext_conf, "Missing extconf.rb: #{ext}"
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
if w? :ext_conf
|
168
|
+
n "All extensions MUST have a extconf.rb"
|
169
|
+
end
|
170
|
+
|
171
|
+
puts "[.] Done"
|
172
|
+
|
173
|
+
exit if options.include?('-v')
|
174
|
+
|
175
|
+
puts
|
176
|
+
puts "*** Generating a gemspec"
|
177
|
+
|
178
|
+
require 'erb'
|
179
|
+
require 'time'
|
180
|
+
|
181
|
+
now = Time.now.strftime('%Y-%m-%d')
|
182
|
+
content = ERB.new(DATA.read).result(binding)
|
183
|
+
File.open(gemspec, "w") do |f|
|
184
|
+
f << content
|
185
|
+
end
|
186
|
+
|
187
|
+
puts "[.] Done"
|
188
|
+
puts
|
189
|
+
puts <<EOF
|
190
|
+
Please open #{gemspec} in your text editor and fill out the details.
|
191
|
+
|
192
|
+
You should fix any warnings that was reported above. You won't need to
|
193
|
+
generate a new gemspec after you've fixed them.
|
194
|
+
EOF
|
195
|
+
|
196
|
+
unless version
|
197
|
+
mkdir_p(File.dirname(version_file))
|
198
|
+
|
199
|
+
File.open(version_file, "w") do |f|
|
200
|
+
i = 0
|
201
|
+
mods = namespace.split("::")
|
202
|
+
mods.each do |mod|
|
203
|
+
f.puts("#{' '*i}module #{mod}")
|
204
|
+
i += 1
|
205
|
+
end
|
206
|
+
|
207
|
+
f.puts("#{' '*i}VERSION = '0.0.1'")
|
208
|
+
|
209
|
+
mods.each do
|
210
|
+
i -= 1
|
211
|
+
f.puts("#{' '*i}end")
|
212
|
+
end
|
213
|
+
end
|
214
|
+
|
215
|
+
puts
|
216
|
+
puts <<-EOF
|
217
|
+
You must also define #{namespace}::VERSION in #{version_file}.
|
218
|
+
Gemify has automatically created the file for you, so simply
|
219
|
+
open it in your text editor and fill in the current version.
|
220
|
+
EOF
|
221
|
+
end
|
222
|
+
|
223
|
+
__END__
|
224
|
+
# -*- encoding: utf-8 -*-
|
225
|
+
$:.push('lib')
|
226
|
+
require <%= version_require.inspect %>
|
227
|
+
|
228
|
+
Gem::Specification.new do |s|
|
229
|
+
s.name = <%= name.inspect %>
|
230
|
+
s.version = <%= namespace %>::VERSION.dup
|
231
|
+
s.date = <%= now.inspect %>
|
232
|
+
s.summary = "TODO: Summary of project"
|
233
|
+
s.email = "todo@project.com"
|
234
|
+
s.homepage = "http://todo.project.com/"
|
235
|
+
s.authors = ['Me Todo']
|
236
|
+
|
237
|
+
s.description = <<-EOF
|
238
|
+
TODO: Long description
|
239
|
+
EOF
|
240
|
+
|
241
|
+
dependencies = [
|
242
|
+
# Examples:
|
243
|
+
# [:runtime, "rack", "~> 1.1"],
|
244
|
+
# [:development, "rspec", "~> 2.1"],
|
245
|
+
]
|
246
|
+
|
247
|
+
s.files = Dir['**/*']
|
248
|
+
s.test_files = Dir['test/**/*'] + Dir['spec/**/*']
|
249
|
+
s.executables = Dir['bin/*'].map { |f| File.basename(f) }
|
250
|
+
s.require_paths = ["lib"]
|
251
|
+
|
252
|
+
|
253
|
+
## Make sure you can build the gem on older versions of RubyGems too:
|
254
|
+
s.rubygems_version = <%= Gem::VERSION.inspect %>
|
255
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
256
|
+
s.specification_version = 3 if s.respond_to? :specification_version
|
257
|
+
|
258
|
+
dependencies.each do |type, name, version|
|
259
|
+
if s.respond_to?("add_#{type}_dependency")
|
260
|
+
s.send("add_#{type}_dependency", name, version)
|
261
|
+
else
|
262
|
+
s.add_dependency(name, version)
|
263
|
+
end
|
264
|
+
end
|
57
265
|
end
|