gemify 0.2.4 → 0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/.yardopts +4 -0
- data/CHANGELOG +38 -0
- data/README.md +91 -0
- data/bin/gemify +46 -34
- data/gemify.gemspec +27 -0
- data/lib/gemify.rb +17 -214
- data/lib/gemify/base.rb +67 -0
- data/lib/gemify/cli.rb +157 -0
- data/lib/gemify/manifest.rb +94 -0
- data/lib/trollop.rb +739 -0
- data/spec/spec_helper.rb +2 -0
- metadata +30 -17
- data/bin/gemify-manifest +0 -12
- data/lib/gemify/vcs.rb +0 -58
data/.yardopts
ADDED
data/CHANGELOG
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
== 0.3
|
2
|
+
* Gemify is now a gemspec editor!
|
3
|
+
|
4
|
+
== 0.2.4 - 2008-04-06
|
5
|
+
* Added Sake-task
|
6
|
+
* Added has_rdoc to the options (Ben Wyrosdick)
|
7
|
+
* Windows-support?
|
8
|
+
* Little re-write of lib/gemify.rb
|
9
|
+
* Added bin/gemify-manifest (David A. Cuadrad)
|
10
|
+
* Added option to disable interactivity (David A. Cuadrad)
|
11
|
+
* Binaries will now read from the manifest
|
12
|
+
* Added an option parser (David A. Cuadrad)
|
13
|
+
* Added option to build the gem using the VCS tree (David A. Cuadrad)
|
14
|
+
* The settings from .gemified will now read as correct type (David A. Cuadrad)
|
15
|
+
* Rubinius-support (no test/spec = can't verify, but I think so)
|
16
|
+
|
17
|
+
== 0.2.3 - 2008-03-23
|
18
|
+
* Require rubygems/builder (defunkt)
|
19
|
+
* Made it simpler to test in developement
|
20
|
+
* Dependencies should work properly
|
21
|
+
* Custom manifest
|
22
|
+
|
23
|
+
== 0.2.2 - 2008-02-15
|
24
|
+
* Quick-release to fix an error in 0.2.1
|
25
|
+
|
26
|
+
== 0.2.1 - 2008-02-15
|
27
|
+
* Added error-handing of .gemfied
|
28
|
+
* Fixed some dependecies-bugs
|
29
|
+
|
30
|
+
== 0.2.0 - 2008-02-09
|
31
|
+
* Added support for dependencies
|
32
|
+
* Raises Exit in stead of exiting
|
33
|
+
* Read/write changes in .gemified
|
34
|
+
* Skinny bin, fat lib
|
35
|
+
* Added a very fancy CLI
|
36
|
+
|
37
|
+
== 0.1.0 - 2008-02-07
|
38
|
+
* The first release. More like a POC-code
|
data/README.md
ADDED
@@ -0,0 +1,91 @@
|
|
1
|
+
Gemify, the lightweight gemspec editor
|
2
|
+
======================================
|
3
|
+
|
4
|
+
Overview
|
5
|
+
--------
|
6
|
+
|
7
|
+
Gemify is a simple tool which helps you create and manage your gemspecs.
|
8
|
+
Instead of messing with Rakefiles and adding yet another development
|
9
|
+
dependency (like Hoe, Echoe and Jeweler), Gemify takes a much less obtrusive
|
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.
|
15
|
+
|
16
|
+
Getting started
|
17
|
+
---------------
|
18
|
+
|
19
|
+
$ gem install gemify
|
20
|
+
$ cd myproject (might already have a gemspec)
|
21
|
+
$ gemify
|
22
|
+
Currently editing gemify.gemspec
|
23
|
+
|
24
|
+
Which task would you like to invoke?
|
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
|
37
|
+
|
38
|
+
x) Exit
|
39
|
+
|
40
|
+
>
|
41
|
+
|
42
|
+
### Manifest
|
43
|
+
|
44
|
+
Gemify helps you manage the manifest (files which will be included in the gem). It follows these rules:
|
45
|
+
|
46
|
+
* If there's a file called **MANIFEST**, **Manifest.txt** or **.manifest**, it
|
47
|
+
assumes this files contains a line-separated list of the manifest.
|
48
|
+
|
49
|
+
* If not, it checks if you're using Git, Mercurial, Darcs, Bazaar, Subversion
|
50
|
+
or CVS and uses the commited files.
|
51
|
+
|
52
|
+
* If not, it just includes all the files.
|
53
|
+
|
54
|
+
You can always run `gemify -m` to see the manifest, and if you don't like what
|
55
|
+
you see you should maintain a manifest file yourself. Every time you open
|
56
|
+
Gemify and save, it will update the manifest. You can also call `gemify -u`.
|
57
|
+
|
58
|
+
### Dependencies
|
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
|
69
|
+
|
70
|
+
### Build and share a gem
|
71
|
+
|
72
|
+
Let's not reinvent the wheel, shall we?
|
73
|
+
|
74
|
+
$ gem build foo.gemspec
|
75
|
+
$ gem push foo.gem
|
76
|
+
|
77
|
+
|
78
|
+
Acknowledgements
|
79
|
+
----------------
|
80
|
+
|
81
|
+
Thanks to [Pat Nakajima](http://patnakajima.com/) for reminding me that Gemify
|
82
|
+
still has its uses.
|
83
|
+
|
84
|
+
|
85
|
+
Contributors
|
86
|
+
------------
|
87
|
+
|
88
|
+
* David A. Cuadrado
|
89
|
+
* Ben Wyrosdick
|
90
|
+
* Chris Wanstrath
|
91
|
+
* Pat Nakajima
|
data/bin/gemify
CHANGED
@@ -1,45 +1,57 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
$:.unshift File.dirname(__FILE__)+
|
4
|
-
|
3
|
+
$:.unshift File.dirname(__FILE__) + '/../lib'
|
5
4
|
require 'gemify'
|
6
|
-
require '
|
5
|
+
require 'trollop'
|
7
6
|
|
8
|
-
|
9
|
-
|
7
|
+
gemspec = nil
|
8
|
+
actions = [:new, :update, :manifest]
|
10
9
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
opts.on("-c", "--from-vcs", "Use files from version control system" ) do |val|
|
23
|
-
options[:vcs] = true
|
24
|
-
end
|
10
|
+
opts = Trollop.options do
|
11
|
+
version "gemify 0.3"
|
12
|
+
banner <<-EOS
|
13
|
+
Usage: #{$0} [OPTION]... [FILE]
|
14
|
+
A simple gemspec editor
|
15
|
+
|
16
|
+
EOS
|
17
|
+
|
18
|
+
opt :new, "Create a new gemspec"
|
19
|
+
opt :update, "Update the manifest"
|
20
|
+
opt :manifest, "Dump the manifest"
|
25
21
|
end
|
26
22
|
|
27
|
-
|
28
|
-
|
29
|
-
rescue => e
|
30
|
-
$stderr.puts "Error: #{e.message}"
|
31
|
-
$stdout.puts parser
|
32
|
-
exit -1
|
33
|
-
end
|
23
|
+
action = opts.detect { |opt, val| actions.include?(opt) && val }
|
24
|
+
action = action[0] unless action.nil?
|
34
25
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
26
|
+
if action == :new
|
27
|
+
# do nothing
|
28
|
+
elsif (arg = ARGV.shift).nil?
|
29
|
+
gemspecs = Dir['*.gemspec']
|
30
|
+
gemspec = case gemspecs.length
|
31
|
+
when 0
|
32
|
+
nil
|
33
|
+
when 1
|
34
|
+
gemspecs.first
|
40
35
|
else
|
41
|
-
|
36
|
+
gemspecs
|
42
37
|
end
|
43
|
-
|
44
|
-
|
38
|
+
elsif File.exists?(arg)
|
39
|
+
gemspec = arg
|
40
|
+
else
|
41
|
+
Trollop.die "No such file: #{arg}"
|
42
|
+
end
|
43
|
+
|
44
|
+
Trollop.die "Extra operand: #{ARGV[0]}" unless ARGV.empty?
|
45
|
+
|
46
|
+
cli = Gemify::CLI.load(gemspec)
|
47
|
+
|
48
|
+
case action
|
49
|
+
when :update
|
50
|
+
cli.update_manifest
|
51
|
+
cli.save
|
52
|
+
puts "Updated manifest (to #{cli.base.files.length} files)"
|
53
|
+
when :manifest
|
54
|
+
puts cli.base.inspect_files
|
55
|
+
else
|
56
|
+
cli.main
|
45
57
|
end
|
data/gemify.gemspec
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{gemify}
|
5
|
+
s.version = "0.3"
|
6
|
+
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = ["Magnus Holm"]
|
9
|
+
s.date = %q{2010-01-23}
|
10
|
+
s.email = %q{judofyr@gmail.com}
|
11
|
+
s.files = [".yardopts", "CHANGELOG", "README.md", "bin/gemify", "gemify.gemspec", "lib/gemify.rb", "lib/gemify/base.rb", "lib/gemify/cli.rb", "lib/gemify/manifest.rb", "lib/trollop.rb", "spec/spec_helper.rb"]
|
12
|
+
s.homepage = %q{http://dojo.rubyforge.org/}
|
13
|
+
s.require_paths = ["lib"]
|
14
|
+
s.rubygems_version = %q{1.3.6}
|
15
|
+
s.summary = %q{The lightweight gemspec editor}
|
16
|
+
s.post_install_message = %q{** Gemify has changed since 0.2, please see http://dojo.rubyforge.org/}
|
17
|
+
|
18
|
+
if s.respond_to? :specification_version then
|
19
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
20
|
+
s.specification_version = 3
|
21
|
+
|
22
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
23
|
+
else
|
24
|
+
end
|
25
|
+
else
|
26
|
+
end
|
27
|
+
end
|
data/lib/gemify.rb
CHANGED
@@ -1,224 +1,27 @@
|
|
1
|
+
$:.unshift File.dirname(__FILE__)
|
2
|
+
|
1
3
|
require 'rubygems'
|
2
4
|
require 'rubygems/builder'
|
3
5
|
require 'yaml'
|
6
|
+
require 'open3'
|
4
7
|
|
5
|
-
require 'gemify/
|
8
|
+
require 'gemify/base'
|
9
|
+
require 'gemify/manifest'
|
10
|
+
require 'gemify/cli'
|
6
11
|
|
7
|
-
|
8
|
-
attr_accessor :
|
9
|
-
|
10
|
-
class Exit < StandardError;end
|
11
|
-
SETTINGS = ".gemified"
|
12
|
-
MANIFEST = ["MANIFEST", "Manifest.txt", ".manifest"]
|
13
|
-
REQUIRED = [:name, :summary, :version]
|
14
|
-
OPTIONAL = [:author, :email, :homepage, :rubyforge_project, :has_rdoc, :dependencies]
|
15
|
-
ALL = REQUIRED+OPTIONAL
|
16
|
-
REPLACE = {
|
17
|
-
:rubyforge_project => "RubyForge project",
|
18
|
-
:has_rdoc => "documentation",
|
19
|
-
}
|
20
|
-
TYPE = {
|
21
|
-
:has_rdoc => :boolean,
|
22
|
-
:dependencies => :array,
|
23
|
-
}
|
24
|
-
|
25
|
-
def initialize
|
26
|
-
@settings = {}
|
27
|
-
@from_vcs = false
|
12
|
+
module Gemify
|
13
|
+
class << self; attr_accessor :last_specification; end
|
14
|
+
end
|
28
15
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
def files
|
35
|
-
@files ||= if @from_vcs
|
36
|
-
VCS.files
|
37
|
-
elsif m=MANIFEST.detect{|x|File.exist?(x)}
|
38
|
-
File.read(m).split(/\r?\n/)
|
16
|
+
# Force Gem::Specification to use Gemify::Base instead.
|
17
|
+
Gem::Specification.extend Module.new {
|
18
|
+
def new(*args, &blk)
|
19
|
+
if self == Gem::Specification
|
20
|
+
Gemify::Base.new(*args, &blk)
|
39
21
|
else
|
40
|
-
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
def bin
|
45
|
-
files.select { |file| file =~ /^bin\// }
|
46
|
-
end
|
47
|
-
|
48
|
-
def extensions
|
49
|
-
files.select { |file| file =~ /extconf\.rb$/ }
|
50
|
-
end
|
51
|
-
|
52
|
-
def main
|
53
|
-
loop do
|
54
|
-
menu
|
55
|
-
puts @result if @result
|
56
|
-
@result = nil
|
57
|
-
l=(o=gets).downcase[0]
|
58
|
-
i=o.to_i
|
59
|
-
|
60
|
-
case l
|
61
|
-
when ?x
|
62
|
-
raise Exit
|
63
|
-
when ?b
|
64
|
-
build!
|
65
|
-
when ?s
|
66
|
-
save!
|
67
|
-
next
|
68
|
-
when ?i
|
69
|
-
@result = "Included files:#{$/}" + files.join($/)
|
70
|
-
next
|
71
|
-
end
|
72
|
-
|
73
|
-
if (1..ALL.length).include? i
|
74
|
-
set(ALL[i-1])
|
75
|
-
next
|
76
|
-
end
|
77
|
-
|
78
|
-
@result = "Can't find the task named '#{o}'"
|
22
|
+
Gemify.last_specification = super
|
79
23
|
end
|
80
24
|
end
|
81
|
-
|
82
|
-
def menu
|
83
|
-
require_files!
|
84
|
-
clear
|
85
|
-
puts "Welcome to Gemify!"
|
86
|
-
puts
|
87
|
-
puts "Which task would you like to invoke?"
|
88
|
-
ALL.each do |m|
|
89
|
-
puts build_task(m)
|
90
|
-
end
|
91
|
-
puts
|
92
|
-
puts "s) Save"
|
93
|
-
puts "i) Show included files"
|
94
|
-
puts
|
95
|
-
puts "b) Build gem"
|
96
|
-
puts "x) Exit"
|
97
|
-
puts
|
98
|
-
end
|
99
|
-
|
100
|
-
## Special tasks
|
101
|
-
|
102
|
-
def build!
|
103
|
-
require_files!
|
104
|
-
Gem::Builder.new(Gem::Specification.new do |s|
|
105
|
-
(@settings.delete(:dependencies)||[]).each do |dep|
|
106
|
-
s.add_dependency dep
|
107
|
-
end
|
108
|
-
|
109
|
-
@settings.each { |key, value| s.send("#{key}=",value) }
|
110
|
-
s.platform = Gem::Platform::RUBY
|
111
|
-
s.files = files
|
112
|
-
s.bindir = "bin"
|
113
|
-
s.require_path = "lib"
|
25
|
+
}
|
114
26
|
|
115
|
-
|
116
|
-
s.executables = bin.map{|x|x[4..-1]}
|
117
|
-
end
|
118
|
-
|
119
|
-
unless extensions.empty?
|
120
|
-
s.extensions = extensions
|
121
|
-
end
|
122
|
-
|
123
|
-
end).build
|
124
|
-
raise Exit
|
125
|
-
end
|
126
|
-
|
127
|
-
def load!
|
128
|
-
@settings = YAML.load(File.read(SETTINGS))
|
129
|
-
@settings.keys.each do |key|
|
130
|
-
@settings[key] = value(key)
|
131
|
-
end
|
132
|
-
rescue Errno::EACCES
|
133
|
-
@result = "Can't read #{SETTINGS}"
|
134
|
-
end
|
135
|
-
|
136
|
-
def save!
|
137
|
-
File.open(SETTINGS,"w"){|f|f << YAML.dump(@settings)}
|
138
|
-
@result = "Saved!"
|
139
|
-
rescue Errno::EACCES
|
140
|
-
@result = "Can't write to #{SETTINGS}"
|
141
|
-
end
|
142
|
-
|
143
|
-
def build_task(m)
|
144
|
-
index = (ALL.index(m)||0)+1
|
145
|
-
unless type(m) == :boolean
|
146
|
-
verb,now = if @settings.keys.include?(m)
|
147
|
-
["Change"," = " + inspect_setting(m)]
|
148
|
-
else
|
149
|
-
["Set",""]
|
150
|
-
end
|
151
|
-
else
|
152
|
-
verb, now = ["Toogle"," = " + inspect_setting(m)]
|
153
|
-
end
|
154
|
-
req = REQUIRED.include?(m) ? " (required)" : ""
|
155
|
-
"#{index}) #{verb} #{show(m)}#{req}#{now}"
|
156
|
-
end
|
157
|
-
|
158
|
-
def clear
|
159
|
-
system("cls") || print("\e[H\e[2J")
|
160
|
-
end
|
161
|
-
|
162
|
-
def set(m)
|
163
|
-
menu
|
164
|
-
case type(m)
|
165
|
-
when :array
|
166
|
-
puts "Split by ENTER and press ENTER twice when you're done"
|
167
|
-
puts "> #{show(m).capitalize}: "
|
168
|
-
@settings[m] = $stdin.gets($/*2).strip.split($/)
|
169
|
-
@settings.delete(m) if @settings[m].empty?
|
170
|
-
when :boolean
|
171
|
-
@settings[m] = !@settings[m]
|
172
|
-
when :string
|
173
|
-
print "> #{show(m).capitalize}: "
|
174
|
-
@settings[m] = $stdin.gets.strip
|
175
|
-
@settings.delete(m) if @settings[m].empty?
|
176
|
-
end
|
177
|
-
@result = "Updated '#{m}'"
|
178
|
-
end
|
179
|
-
|
180
|
-
def gets
|
181
|
-
print("> ")
|
182
|
-
$stdin.gets.strip
|
183
|
-
end
|
184
|
-
|
185
|
-
def show(m)
|
186
|
-
REPLACE[m]||m.to_s
|
187
|
-
end
|
188
|
-
|
189
|
-
def type(m)
|
190
|
-
TYPE[m]||:string
|
191
|
-
end
|
192
|
-
|
193
|
-
def value(m)
|
194
|
-
i=@settings[m]
|
195
|
-
case type(m)
|
196
|
-
when :array
|
197
|
-
i.to_a
|
198
|
-
when :boolean
|
199
|
-
!!i
|
200
|
-
when :string
|
201
|
-
i.to_s
|
202
|
-
end
|
203
|
-
end
|
204
|
-
|
205
|
-
def inspect_setting(m)
|
206
|
-
i=@settings[m]
|
207
|
-
case type(m)
|
208
|
-
when :array
|
209
|
-
i.join(", ")
|
210
|
-
when :boolean
|
211
|
-
(i||false).to_s
|
212
|
-
when :string
|
213
|
-
i.to_s
|
214
|
-
end
|
215
|
-
end
|
216
|
-
|
217
|
-
protected
|
218
|
-
def require_files!
|
219
|
-
if files.empty?
|
220
|
-
puts "Can't find anything to make a gem out of..."
|
221
|
-
raise Exit
|
222
|
-
end
|
223
|
-
end
|
224
|
-
end
|
27
|
+
Gem::DefaultUserInteraction.ui = Gem::SilentUI.new
|