rant 0.3.8 → 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.
Files changed (55) hide show
  1. data/NEWS +19 -0
  2. data/README +51 -24
  3. data/Rantfile +7 -8
  4. data/doc/advanced.rdoc +3 -1
  5. data/doc/package.rdoc +280 -0
  6. data/doc/rantfile.rdoc +9 -19
  7. data/doc/rubyproject.rdoc +24 -16
  8. data/lib/rant/archive/minitar.rb +983 -0
  9. data/lib/rant/archive/rubyzip/ioextras.rb +122 -0
  10. data/lib/rant/archive/rubyzip/stdrubyext.rb +114 -0
  11. data/lib/rant/archive/rubyzip/tempfile_bugfixed.rb +195 -0
  12. data/lib/rant/archive/rubyzip.rb +1575 -0
  13. data/lib/rant/import/archive/tgz.rb +49 -0
  14. data/lib/rant/import/archive/zip.rb +67 -0
  15. data/lib/rant/import/archive.rb +312 -0
  16. data/lib/rant/import/autoclean.rb +2 -2
  17. data/lib/rant/import/c/dependencies.rb +3 -3
  18. data/lib/rant/import/clean.rb +1 -1
  19. data/lib/rant/import/directedrule.rb +1 -1
  20. data/lib/rant/import/package/tgz.rb +35 -0
  21. data/lib/rant/import/package/zip.rb +36 -0
  22. data/lib/rant/import/rubydoc.rb +1 -1
  23. data/lib/rant/import/rubypackage.rb +19 -77
  24. data/lib/rant/import/rubytest.rb +1 -1
  25. data/lib/rant/import/subfile.rb +28 -14
  26. data/lib/rant/import/win32/rubycmdwrapper.rb +1 -1
  27. data/lib/rant/import.rb +36 -16
  28. data/lib/rant/plugin/csharp.rb +1 -1
  29. data/lib/rant/rantenv.rb +2 -13
  30. data/lib/rant/rantfile.rb +11 -11
  31. data/lib/rant/rantlib.rb +7 -3
  32. data/lib/rant/rantsys.rb +53 -2
  33. data/lib/rant/rantvar.rb +62 -1
  34. data/misc/TODO +41 -0
  35. data/{devel-notes → misc/devel-notes} +6 -0
  36. data/misc/mt.rb +3 -0
  37. data/misc/t.rb +18 -0
  38. data/test/import/c/dependencies/test_c_dependencies.rb +18 -0
  39. data/test/import/package/MANIFEST +4 -0
  40. data/test/import/package/Rantfile +49 -0
  41. data/test/import/package/deep/sub/sub/f1 +1 -0
  42. data/test/import/package/sub/f1 +1 -0
  43. data/test/import/package/sub2/f1 +1 -0
  44. data/test/import/package/test_package.rb +425 -0
  45. data/test/import/subfile/Rantfile +8 -0
  46. data/test/import/subfile/test_subfile.rb +12 -0
  47. data/test/project_rb1/rantfile.rb +3 -4
  48. data/test/project_rb1/test_project_rb1.rb +16 -40
  49. data/test/rant-import/test_rant-import.rb +3 -3
  50. data/test/test_filelist.rb +39 -2
  51. data/test/tutil.rb +89 -3
  52. metadata +35 -6
  53. data/TODO +0 -21
  54. data/lib/rant/import/package.rb +0 -258
  55. /data/{rantmethods.rb → misc/rantmethods.rb} +0 -0
@@ -1,258 +0,0 @@
1
-
2
- require 'rant/rantlib'
3
-
4
- class Rant::Generators::Package
5
-
6
- class << self
7
- def rant_generate(app, ch, args, &block)
8
- if !args || args.empty?
9
- self.new(:app => app, :__caller__ => ch, &block)
10
- elsif args.size == 1
11
- pkg_name = case args.first
12
- when String: args.first
13
- when Symbol: args.first.to_s
14
- else
15
- app.abort("Package takes only one additional " +
16
- "argument, which should be a string or symbol.")
17
- end
18
- self.new(:app => app, :__caller__ => ch,
19
- :name => pkg_name, &block)
20
- else
21
- app.abort(app.pos_text(file, ln),
22
- "Package takes only one additional argument, " +
23
- "which should be a string or symbol.")
24
- end
25
- end
26
- end
27
-
28
- # A hash containing all package information.
29
- attr_reader :data
30
- # Directory where packages go to. Defaults to "pkg".
31
- attr_accessor :pkg_dir
32
-
33
- def initialize(opts = {})
34
- @rac = opts[:app] || Rant.rantapp
35
- @pkg_dir = "pkg"
36
- @pkg_dir_task = nil
37
- @dist_dir_task = nil
38
- @tar_task = nil
39
- @zip_task = nil
40
- @package_task = nil
41
- name = opts[:name]
42
- @ch = opts[:__caller__] || Rant::Lib.parse_caller_elem(caller[0])
43
- unless name
44
- # TODO: pos_text
45
- @rac.warn_msg(@rac.pos_text(@ch[:file], @ch[:ln]),
46
- "No package name given, using directory name.")
47
- # use directory name as project name
48
- name = File.split(Dir.pwd)[1]
49
- # reset name if it contains a slash or a backslash
50
- name = nil if name =~ /\/|\\/
51
- end
52
- @data = { "name" => name }
53
-
54
- yield self if block_given?
55
- end
56
-
57
- def name
58
- @data["name"]
59
- end
60
-
61
- def version
62
- @data["version"]
63
- end
64
-
65
- def version=(str)
66
- unless String === str
67
- @rac.abort_at(@ch, "version has to be a String")
68
- end
69
- @data["version"] = str
70
- end
71
-
72
- def files
73
- @data["files"]
74
- end
75
-
76
- def files=(list)
77
- unless Array === list || ::Rant::FileList === List
78
- if list.respond_to? :to_ary
79
- list = list.to_ary
80
- else
81
- @rac.abort_at(@ch,
82
- "files must be an Array or FileList")
83
- end
84
- end
85
- @data["files"] = list
86
- end
87
-
88
- def validate_attrs(pkg_type = :general)
89
- %w(name files).each { |a|
90
- pkg_requires_attr a
91
- }
92
- end
93
- private :validate_attrs
94
-
95
- def pkg_requires_attr(attr_name)
96
- unless @data[attr_name]
97
- @rac.abort("Packaged defined: " +
98
- @rac.pos_text(@ch[:file], @ch[:ln]),
99
- "`#{attr_name}' attribute required")
100
- end
101
- end
102
-
103
- def pkg_dir_task
104
- return if @pkg_dir_task
105
- if @dist_dir_task
106
- # not ideal but should work: If only the gem task will
107
- # be run, dist dir creation wouldn't be necessary
108
- return @pkg_dir_task = @dist_dir_task
109
- end
110
- @pkg_dir_task = @rac.gen(
111
- ::Rant::Generators::Directory, @pkg_dir)
112
- end
113
-
114
- def dist_dir_task
115
- return if @dist_dir_task
116
- pkg_name = pkg_dist_dir
117
- dist_dir = pkg_dist_dir
118
- @dist_dir_task = @rac.gen(Rant::Generators::Directory,
119
- dist_dir => files) { |t|
120
- # ensure to create new and empty destination directory
121
- if Dir.entries(dist_dir).size > 2 # "." and ".."
122
- @rac.sys.rm_rf(dist_dir)
123
- @rac.sys.mkdir(dist_dir)
124
- end
125
- # evaluate directory structure first
126
- dirs = []
127
- fl = []
128
- files.each { |e|
129
- if test(?d, e)
130
- dirs << e unless dirs.include? e
131
- else # assuming e is a file
132
- fl << e
133
- dir = File.dirname(e)
134
- dirs << dir unless dir == "." || dirs.include?(dir)
135
- end
136
- }
137
- # create directory structure
138
- dirs.each { |dir|
139
- dest = File.join(dist_dir, dir)
140
- @rac.sys.mkpath(dest) unless test(?d, dest)
141
- }
142
- # link or copy files
143
- fl.each { |f|
144
- dest = File.join(dist_dir, f)
145
- @rac.sys.safe_ln(f, dest)
146
- }
147
- }
148
- end
149
-
150
- def tar_task(tname = :tar)
151
- validate_attrs
152
- # Create tar task first to ensure that a pending description
153
- # is used for the tar task and not for the dist dir task.
154
- pkg_name = tar_pkg_path
155
- pkg_files = files
156
- if tname
157
- # shortcut task
158
- @rac.task({:__caller__ => @ch, tname => pkg_name})
159
- end
160
- # actual tar-creating task
161
- @tar_task = @rac.file(:__caller__ => @ch,
162
- pkg_name => [pkg_dist_dir] + pkg_files) { |t|
163
- @rac.sys.cd(@pkg_dir) {
164
- @rac.sys %W(tar zcf #{tar_pkg_name} #{pkg_base_name})
165
- }
166
- }
167
- dist_dir_task
168
- end
169
-
170
- def zip_task(tname = :zip)
171
- validate_attrs
172
- # Create zip task first to ensure that a pending description
173
- # is used for the zip task and not for the dist dir task.
174
- pkg_name = zip_pkg_path
175
- pkg_files = files
176
- if tname
177
- # shortcut task
178
- @rac.task({:__caller__ => @ch, tname => pkg_name})
179
- end
180
- # actual zip-creating task
181
- @zip_task = @rac.file(:__caller__ => @ch,
182
- pkg_name => [pkg_dist_dir] + pkg_files) { |t|
183
- @rac.sys.cd(@pkg_dir) {
184
- # zip options:
185
- # y: store symlinks instead of referenced files
186
- # r: recurse into directories
187
- # q: quiet operation
188
- @rac.sys %W(zip -yqr #{zip_pkg_name} #{pkg_base_name})
189
- }
190
- }
191
- dist_dir_task
192
- end
193
-
194
- # Create a task which runs gem/zip/tar tasks.
195
- def package_task(tname = :package)
196
- def_tasks = [@tar_task, @zip_task].compact
197
- if def_tasks.empty?
198
- # take description for overall package task
199
- pdesc = @rac.pop_desc
200
- unless def_available_tasks
201
- @rac.desc pdesc
202
- @rac.warn_msg("No tools for packaging available (tar, zip):",
203
- "Can't generate task `#{tname}'.")
204
- return
205
- end
206
- @rac.desc pdesc
207
- end
208
- pre = []
209
- pre << tar_pkg_path if @tar_task
210
- pre << zip_pkg_path if @zip_task
211
- pre << gem_pkg_path if @gem_task
212
- @rac.task(:__caller__ => @ch, tname => pre)
213
- end
214
-
215
- # Returns true if at least one task was defined.
216
- def def_available_tasks
217
- defined = false
218
- if Rant::Env.have_tar?
219
- # we don't create shortcut tasks, hence nil as argument
220
- self.tar_task(nil)
221
- defined = true
222
- end
223
- if Rant::Env.have_zip?
224
- self.zip_task(nil)
225
- defined = true
226
- end
227
- defined
228
- end
229
-
230
- def pkg_base_name
231
- unless name
232
- @rac.abort(@rac.pos_text(@ch[:file], @ch[:ln]),
233
- "`name' required for packaging")
234
- end
235
- version ? "#{name}-#{version}" : name
236
- end
237
-
238
- def tar_pkg_name
239
- pkg_base_name + ".tar.gz"
240
- end
241
-
242
- def tar_pkg_path
243
- pkg_dist_dir + ".tar.gz"
244
- end
245
-
246
- def zip_pkg_name
247
- pkg_base_name + ".zip"
248
- end
249
-
250
- def zip_pkg_path
251
- pkg_dist_dir + ".zip"
252
- end
253
-
254
- def pkg_dist_dir
255
- @pkg_dir ? File.join(@pkg_dir, pkg_base_name) : pkg_base_name
256
- end
257
-
258
- end # class Rant::Generators::Package
File without changes