gemify 0.2.3 → 0.2.4

Sign up to get free protection for your applications and to get access to all the features.
data/bin/gemify CHANGED
@@ -1,12 +1,45 @@
1
1
  #!/usr/bin/env ruby
2
+
3
+ $:.unshift File.dirname(__FILE__)+"/../lib"
4
+
5
+ require 'gemify'
6
+ require 'optparse'
7
+
8
+ options = {}
9
+ options[:interactive] = true # Interactive by default
10
+
11
+ parser = OptionParser.new do |opts|
12
+ opts.banner = "Usage: #{opts.program_name} [options]"
13
+ opts.separator ""
14
+ opts.separator "Options:"
15
+ opts.on("-h", "--help", "Shows this message") do |val|
16
+ $stdout.puts opts
17
+ exit(0)
18
+ end
19
+ opts.on("-I", "--no-interactive", "Automaticically builds the gem") do |val|
20
+ options[:interactive] = false
21
+ end
22
+ opts.on("-c", "--from-vcs", "Use files from version control system" ) do |val|
23
+ options[:vcs] = true
24
+ end
25
+ end
26
+
2
27
  begin
3
- require 'gemify'
4
- rescue LoadError
5
- require 'lib/gemify'
28
+ parser.parse!(ARGV)
29
+ rescue => e
30
+ $stderr.puts "Error: #{e.message}"
31
+ $stdout.puts parser
32
+ exit -1
6
33
  end
7
34
 
8
35
  begin
9
- Gemify.new.main
36
+ gemify = Gemify.new
37
+ gemify.from_vcs = !!options[:vcs]
38
+ if not options[:interactive] and File.exist?(Gemify::SETTINGS)
39
+ gemify.build!
40
+ else
41
+ gemify.main
42
+ end
10
43
  rescue Gemify::Exit
11
44
  exit
12
- end
45
+ end
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $:.unshift File.dirname(__FILE__)+"/../lib"
4
+
5
+ require 'gemify'
6
+
7
+ manifest = (ARGV.first || ".manifest")
8
+
9
+ $stdout.puts "=> Generating #{manifest}"
10
+ File.open(manifest, "w") do |file|
11
+ file << Gemify::VCS.files.join("\n")
12
+ end
@@ -2,37 +2,53 @@ require 'rubygems'
2
2
  require 'rubygems/builder'
3
3
  require 'yaml'
4
4
 
5
+ require 'gemify/vcs'
6
+
5
7
  class Gemify
8
+ attr_accessor :from_vcs
9
+
6
10
  class Exit < StandardError;end
11
+ SETTINGS = ".gemified"
7
12
  MANIFEST = ["MANIFEST", "Manifest.txt", ".manifest"]
8
13
  REQUIRED = [:name, :summary, :version]
9
- OPTIONAL = [:author, :email, :homepage, :rubyforge_project, :dependencies]
14
+ OPTIONAL = [:author, :email, :homepage, :rubyforge_project, :has_rdoc, :dependencies]
10
15
  ALL = REQUIRED+OPTIONAL
11
- REPLACE = {:rubyforge_project => "RubyForge project"}
16
+ REPLACE = {
17
+ :rubyforge_project => "RubyForge project",
18
+ :has_rdoc => "documentation",
19
+ }
20
+ TYPE = {
21
+ :has_rdoc => :boolean,
22
+ :dependencies => :array,
23
+ }
24
+
12
25
  def initialize
13
26
  @settings = {}
14
- @bin = Dir["bin/**/*"]
15
-
16
- if files.empty?
17
- puts "Can't find anything to make a gem out of..."
18
- raise Exit
19
- end
20
-
21
- if File.exists? ".gemified"
22
- @settings = YAML.load(open(".gemified"))
27
+ @from_vcs = false
28
+
29
+ if File.exists? SETTINGS
30
+ load!
23
31
  end
24
- rescue Errno::EACCES
25
- @result = "Can't read .gemified"
26
32
  end
27
33
 
28
34
  def files
29
- @files ||= if m=MANIFEST.detect{|x|File.exist?(x)}
35
+ @files ||= if @from_vcs
36
+ VCS.files
37
+ elsif m=MANIFEST.detect{|x|File.exist?(x)}
30
38
  File.read(m).split(/\r?\n/)
31
39
  else
32
- @bin + Dir["lib/**/*"]
40
+ VCS.files(:unknown)
33
41
  end
34
42
  end
35
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
+
36
52
  def main
37
53
  loop do
38
54
  menu
@@ -41,34 +57,22 @@ class Gemify
41
57
  l=(o=gets).downcase[0]
42
58
  i=o.to_i
43
59
 
44
- if l==?x
45
- puts "Exiting..."
60
+ case l
61
+ when ?x
46
62
  raise Exit
47
- end
48
-
49
- if l==?b
50
- build
51
- end
52
-
53
- if (1..ALL.length-1).include? i
54
- sub_task(i)
55
- next
56
- end
57
-
58
- case i-(ALL.length-1)
59
- when 1
60
- puts "Write all your dependencies here, split by ENTER and"
61
- puts "press ENTER twice when you're done:"
62
- @settings[:dependencies] = $stdin.gets($/*2).strip.split($/)
63
- @settings.delete(:dependencies) if @settings[:dependencies].empty?
64
- @result = "Updated 'dependencies'"
65
- next
66
- when 2
67
- save
63
+ when ?b
64
+ build!
65
+ when ?s
66
+ save!
68
67
  next
69
- when 3
68
+ when ?i
70
69
  @result = "Included files:#{$/}" + files.join($/)
71
70
  next
71
+ end
72
+
73
+ if (1..ALL.length).include? i
74
+ set(ALL[i-1])
75
+ next
72
76
  end
73
77
 
74
78
  @result = "Can't find the task named '#{o}'"
@@ -76,6 +80,7 @@ class Gemify
76
80
  end
77
81
 
78
82
  def menu
83
+ require_files!
79
84
  clear
80
85
  puts "Welcome to Gemify!"
81
86
  puts
@@ -83,8 +88,9 @@ class Gemify
83
88
  ALL.each do |m|
84
89
  puts build_task(m)
85
90
  end
86
- puts "#{ALL.length+1}) Save"
87
- puts "#{ALL.length+2}) Show included files"
91
+ puts
92
+ puts "s) Save"
93
+ puts "i) Show included files"
88
94
  puts
89
95
  puts "b) Build gem"
90
96
  puts "x) Exit"
@@ -93,7 +99,8 @@ class Gemify
93
99
 
94
100
  ## Special tasks
95
101
 
96
- def build
102
+ def build!
103
+ require_files!
97
104
  Gem::Builder.new(Gem::Specification.new do |s|
98
105
  (@settings.delete(:dependencies)||[]).each do |dep|
99
106
  s.add_dependency dep
@@ -105,47 +112,73 @@ class Gemify
105
112
  s.bindir = "bin"
106
113
  s.require_path = "lib"
107
114
 
108
- unless @bin.empty?
109
- s.executables = @bin.map{|x|x[4..-1]}
115
+ unless bin.empty?
116
+ s.executables = bin.map{|x|x[4..-1]}
110
117
  end
118
+
119
+ unless extensions.empty?
120
+ s.extensions = extensions
121
+ end
122
+
111
123
  end).build
112
124
  raise Exit
113
125
  end
114
126
 
115
- def save
116
- File.open(".gemified","w"){|f|f<<YAML.dump(@settings)}
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)}
117
138
  @result = "Saved!"
118
139
  rescue Errno::EACCES
119
- @result = "Can't write to .gemified"
140
+ @result = "Can't write to #{SETTINGS}"
120
141
  end
121
142
 
122
- def sub_task(i)
123
- key = ALL[i-1]
124
- menu
125
- @settings[key] = gets(key)
126
- @settings.delete(key) if @settings[key].empty?
127
- @result = "Updated '#{show(key)}'"
128
- end
129
-
130
- # Helpers
131
- private
132
143
  def build_task(m)
133
144
  index = (ALL.index(m)||0)+1
134
- verb,now = if @settings.keys.include?(m)
135
- ["Change"," = " + inspect_setting(m)]
145
+ unless type(m) == :boolean
146
+ verb,now = if @settings.keys.include?(m)
147
+ ["Change"," = " + inspect_setting(m)]
148
+ else
149
+ ["Set",""]
150
+ end
136
151
  else
137
- ["Set",""]
152
+ verb, now = ["Toogle"," = " + inspect_setting(m)]
138
153
  end
139
154
  req = REQUIRED.include?(m) ? " (required)" : ""
140
155
  "#{index}) #{verb} #{show(m)}#{req}#{now}"
141
156
  end
142
157
 
143
158
  def clear
144
- print "\e[H\e[2J"
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}'"
145
178
  end
146
179
 
147
- def gets(m=nil)
148
- print m ? "> #{show(m).capitalize}: " : "> "
180
+ def gets
181
+ print("> ")
149
182
  $stdin.gets.strip
150
183
  end
151
184
 
@@ -153,12 +186,39 @@ class Gemify
153
186
  REPLACE[m]||m.to_s
154
187
  end
155
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
+
156
205
  def inspect_setting(m)
157
- case i=@settings[m]
158
- when Array
206
+ i=@settings[m]
207
+ case type(m)
208
+ when :array
159
209
  i.join(", ")
160
- else
210
+ when :boolean
211
+ (i||false).to_s
212
+ when :string
161
213
  i.to_s
162
214
  end
163
215
  end
164
- 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
@@ -0,0 +1,58 @@
1
+
2
+ require 'open3'
3
+
4
+ class Gemify
5
+
6
+ class VCS
7
+ def self.determine_vcs
8
+ vcs = :unknown
9
+ if File.exist?(".git")
10
+ vcs = :git
11
+ elsif File.exist?("_darcs")
12
+ vcs = :darcs
13
+ elsif File.exist?(".hg")
14
+ vcs = :hg
15
+ elsif File.exist?(".bzr")
16
+ vcs = :bzr
17
+ elsif File.exist?(".svn")
18
+ vcs = :svn
19
+ elsif File.exist?("CVSROOT")
20
+ vcs = :cvs
21
+ end
22
+
23
+ vcs
24
+ end
25
+
26
+ def self.get_files_from_command(command)
27
+ files = []
28
+
29
+ Open3.popen3(command) do |stdin, stdout, stderr|
30
+ stdout.each { |line|
31
+ file = line.strip
32
+ files << file if File.exist?(file)
33
+ }
34
+ end
35
+ files
36
+ end
37
+
38
+ def self.files(forced_vcs = false)
39
+ case (forced_vcs || determine_vcs)
40
+ when :git
41
+ get_files_from_command("git-ls-files").delete_if { |w| w == ".gitignore" or w == ".gitattributes" }
42
+ when :darcs
43
+ get_files_from_command("darcs query manifest")
44
+ when :bzr
45
+ get_files_from_command("bzr ls").delete_if { |w| w == ".bzrignore" }
46
+ when :hg
47
+ get_files_from_command("hg manifest")
48
+ when :svn
49
+ get_files_from_command("svn ls")
50
+ when :cvs
51
+ get_files_from_command("cvs ls")
52
+ when :unknown
53
+ Dir['bin/*'] + Dir['lib/**/**']
54
+ end
55
+ end
56
+ end
57
+
58
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gemify
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 0.2.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Magnus Holm
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-03-23 00:00:00 +01:00
12
+ date: 2008-04-06 00:00:00 +02:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -17,12 +17,16 @@ description:
17
17
  email: judofyr@gmail.com
18
18
  executables:
19
19
  - gemify
20
+ - gemify-manifest
20
21
  extensions: []
21
22
 
22
23
  extra_rdoc_files: []
23
24
 
24
25
  files:
25
26
  - bin/gemify
27
+ - bin/gemify-manifest
28
+ - lib/gemify
29
+ - lib/gemify/vcs.rb
26
30
  - lib/gemify.rb
27
31
  has_rdoc: false
28
32
  homepage: http://dojo.rubyforge.org
@@ -46,7 +50,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
46
50
  requirements: []
47
51
 
48
52
  rubyforge_project: dojo
49
- rubygems_version: 1.0.1
53
+ rubygems_version: 1.1.0
50
54
  signing_key:
51
55
  specification_version: 2
52
56
  summary: An extremely simple way to create a RubyGem