core_ex 0.2.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. data/NEWS +39 -1
  2. data/SPEC.dyn.yml +6 -6
  3. data/SPEC.gemspec +13 -0
  4. data/SPEC.yml +3 -3
  5. data/lib/core_ex/dependencies_ext/constant_load_path.rb +23 -0
  6. data/lib/core_ex/embedded_tests.rb +29 -23
  7. data/lib/core_ex/enumerable.rb +10 -18
  8. data/lib/core_ex/exception.rb +24 -21
  9. data/lib/core_ex/file_utils.rb +51 -0
  10. data/lib/core_ex/module/attr_once.rb +41 -0
  11. data/lib/core_ex/module/import.rb +28 -0
  12. data/lib/core_ex/module/mix_in_with_args.rb +267 -0
  13. data/lib/core_ex/object/instance_eval_with_args.rb +56 -0
  14. data/lib/core_ex/object/singleton_class.rb +78 -0
  15. data/lib/core_ex/object/the_first_time.rb +32 -0
  16. data/lib/core_ex/pathname.rb +268 -164
  17. data/lib/core_ex/proc.rb +77 -0
  18. data/lib/core_ex/rakefile_base.rf +93 -51
  19. data/lib/core_ex/require.rb +43 -384
  20. data/lib/core_ex/string.rb +52 -41
  21. data/lib/core_ex/time.rb +26 -41
  22. data/lib/core_ex/try_dup.rb +68 -0
  23. data/lib/core_ex/yaml.rb +103 -100
  24. data/lib/core_ex.rb +246 -35
  25. data/lib/{core_ex/dtime.rb → d_time.rb} +36 -22
  26. data/lib/{core_ex/dumpable_proc.rb → dumpable_proc.rb} +1 -2
  27. data/lib/{core_ex/pathlist.rb → path_list.rb} +111 -63
  28. data/lib/{core_ex/temp_path.rb → temp_path.rb} +55 -41
  29. data/lib/{core_ex/test/unit/ui/yaml/testrunner.rb → test/unit/u_i/yaml/test_runner.rb} +7 -10
  30. data/lib/{core_ex/version.rb → version.rb} +4 -7
  31. data/lib/yaml_extension.rb +78 -0
  32. data/test/check-core_ex.yml +6 -8
  33. data/test/check-pkg-core_ex.yml +3 -6
  34. data/test/sanity/multiple-requires.yml +41 -17
  35. data/test/sanity/single-requires.yml +36 -20
  36. data/test/sanity-suite.yml +5 -7
  37. data/test/test-unit-setup.rb +11 -3
  38. data/test/unit-suite.yml +8 -9
  39. metadata +35 -13
  40. data/lib/core_ex/attr_once.rb +0 -36
  41. data/lib/core_ex/fileutils.rb +0 -44
@@ -0,0 +1,77 @@
1
+ # Copyright:: Copyright (c) 2005 Nicolas Pouillard. All rights reserved.
2
+ # Author:: Nicolas Pouillard <ertai@lrde.epita.fr>.
3
+ # License:: Gnu General Public License.
4
+ # Revision:: $Id: proc.rb 334 2005-09-04 14:29:40Z ertai $
5
+
6
+
7
+ module CoreEx
8
+
9
+ module Proc
10
+
11
+ setup do
12
+ have YamlExtension
13
+ end
14
+
15
+ def source_file
16
+ to_s[/#<#{self.class}:.*@(.*):\d*>/, 1]
17
+ end
18
+
19
+ def source_line
20
+ to_s[/#<#{self.class}:.*@.*:(\d*)>/, 1].to_i
21
+ end
22
+
23
+ def source_location
24
+ to_s[/#<#{self.class}:.*@(.*:\d*)>/, 1]
25
+ end
26
+
27
+ def to_yaml_string
28
+ to_s
29
+ end
30
+
31
+ module ClassMethods
32
+ def yaml_load ( val )
33
+ DumpableProc.new(val.to_s)
34
+ end
35
+ end # module ClassMethods
36
+
37
+ end # module Proc
38
+
39
+ test_section __FILE__ do
40
+
41
+ class TestProc < ::Test::Unit::TestCase
42
+ include YamlExtension::Assertions
43
+
44
+ def setup
45
+ @procs = {
46
+ proc {} => __LINE__,
47
+ method(:teardown).to_proc => __LINE__,
48
+ TestProc.instance_method(:setup).bind(self).to_proc => __LINE__
49
+ }
50
+ end
51
+
52
+ def teardown
53
+ end
54
+
55
+ def test_simple
56
+ assert_nothing_raised do
57
+ @procs.each do |block, __line__|
58
+ assert_equal __FILE__, block.source_file, 'bad source_file'
59
+ assert_equal __line__, block.source_line, 'bad source_line'
60
+ assert_equal "#{__FILE__}:#{__line__}",
61
+ block.source_location,
62
+ 'bad source_location'
63
+ end
64
+ end
65
+ end
66
+
67
+ def test_yaml
68
+ assert_yaml_load "--- !proc 3 + 7", Proc
69
+ assert_yaml_dump @val, @ref
70
+ assert_equal(10, @val[])
71
+ end
72
+
73
+ end # class TestProc
74
+
75
+ end
76
+
77
+ end # module CoreEx
@@ -1,7 +1,7 @@
1
1
  # Copyright:: Copyright (c) 2005 Nicolas Pouillard. All rights reserved.
2
2
  # Author:: Nicolas Pouillard <ertai@lrde.epita.fr>.
3
3
  # License:: Gnu General Public License.
4
- # Revision:: $Id: rakefile_base.rf 301 2005-06-23 20:57:05Z ertai $
4
+ # Revision:: $Id: rakefile_base.rf 352 2005-09-15 01:43:03Z ertai $
5
5
 
6
6
  require 'core_ex'
7
7
  require 'ostruct'
@@ -12,15 +12,17 @@ require 'rake/packagetask'
12
12
  require 'rake/rdoctask'
13
13
  require 'rake/gempackagetask'
14
14
  require 'rake/contrib/rubyforgepublisher'
15
- require 'rubygems'
16
- require_gem 'highline'
17
- require 'highline/import'
15
+ suppress(NoMethodError) { require_gem 'highline' }
16
+ suppress(LoadError) { require 'highline/import' }
17
+
18
+ PathList.import!
18
19
 
19
20
 
20
21
  AUTHORS = Pathname.new('AUTHORS')
21
22
  SPEC_YML = Pathname.new('SPEC.yml')
22
23
  SPEC_DYN_YML = Pathname.new('SPEC.dyn.yml')
23
- GEM_SPEC = Pathname.new("SPEC.gemspec")
24
+ GEM_SPEC = Pathname.new('SPEC.gemspec')
25
+ VENDOR = Pathname.new('vendor')
24
26
  RakefileBase = __FILE__
25
27
  EDITOR = ENV['EDITOR'] || 'vi'
26
28
 
@@ -42,13 +44,16 @@ svn = MiniSvn.new
42
44
 
43
45
  def clean_task ( arg, &block )
44
46
  if arg.is_a? Hash
45
- name = :"clobber_#{arg.keys.first}"
46
- task(name => arg.values.first, &block)
47
+ name, deps = arg.to_a.first
47
48
  else
48
- name = :"clobber_#{arg}"
49
- task(name, &block)
49
+ name, deps = arg, []
50
+ end
51
+ clobber_name = :"clobber_#{name}"
52
+ task clobber_name => deps do
53
+ Task[name].instance_eval { @already_invoked = false }
54
+ block[] unless block.nil?
50
55
  end
51
- task :clobber => name
56
+ task :clobber => clobber_name
52
57
  end
53
58
 
54
59
 
@@ -72,12 +77,17 @@ task :default => [ :check ]
72
77
 
73
78
 
74
79
 
80
+ task :ruby_ex => [ :spec ] do
81
+ require_gem('ruby_ex', SPEC.ruby_ex_version || '~> 0.2.0')
82
+ require 'ruby_ex'
83
+ end
84
+
85
+
75
86
  # desc 'Setup the ttk command'
76
- task :ttk => [ :spec ] do
77
- alias highline_ask ask
78
- require_gem 'ttk', SPEC.ttk_version
79
- alias ruby_ex_ask ask
80
- alias ask highline_ask
87
+ task :ttk => [ :spec, :ruby_ex ] do
88
+ require_gem('ttk', SPEC.ttk_version || '~> 0.3.0')
89
+ require 'ttk'
90
+ Commands.import!
81
91
  def ttk ( *a, &b )
82
92
  cmd = TTK.bin[*a]
83
93
  cmd.input = b[] if b
@@ -91,11 +101,11 @@ end
91
101
 
92
102
  desc 'Launch all test suites'
93
103
  task :check => [ :ttk, :spec, :dyn_spec ] do
94
- ttk '-l', 'check-log.yml', '-S', 'url: file://<<pwd>>', '-C',
104
+ ttk '-l', 'check-log', '-S', 'url: file://<<pwd>>', '-C',
95
105
  SPEC.root_test_suite
96
106
  end
97
107
  clean_task :check do
98
- 'check-log.yml'.to_path.rm_f
108
+ PathList['check-log.*'].each { |x| x.rm_f }
99
109
  end
100
110
 
101
111
 
@@ -107,7 +117,7 @@ task :distcheck => [ :ttk, :package ] do
107
117
  next unless path.file?
108
118
  urls << "file://#{path.expand_path}"
109
119
  end
110
- ttk '-l', 'distcheck-log.yml' do %Q[
120
+ ttk '-l', 'distcheck-log' do %Q[
111
121
  Check generated packages:
112
122
  strategy: Iterate
113
123
  over : #{urls.inspect}
@@ -121,7 +131,7 @@ task :distcheck => [ :ttk, :package ] do
121
131
  end
122
132
  end
123
133
  clean_task :distcheck do
124
- 'distcheck-log.yml'.to_path.rm_f
134
+ PathList['distcheck-log.*'].each { |x| x.rm_f }
125
135
  end
126
136
 
127
137
 
@@ -129,7 +139,9 @@ end
129
139
  # desc "Load the #{SPEC_YML} file"
130
140
  task :spec => [ SPEC_YML.to_s ] do
131
141
  Kernel.const_set(:SPEC, OpenStruct.new(YAML.load(SPEC_YML.read)))
142
+ task :spec_pkg_files => SPEC.pkg_files
132
143
  end
144
+ task :spec_pkg_files
133
145
 
134
146
 
135
147
 
@@ -172,26 +184,38 @@ end
172
184
 
173
185
  desc 'Generate the full documentation'
174
186
  task :doc => [ :rdoc_spec, :rdoc_real ]
187
+
175
188
  clean_task :doc => [ :rdoc_spec, :clobber_rdoc_real ]
189
+
176
190
  task :redoc => [ :clobber_doc, :doc ]
177
191
 
178
192
 
193
+ task :tarballs => [ :dyn_spec, :vendor ] do
194
+ Rake::PackageTask.new(SPEC.name, SPEC.dyn.version.to_s) do |p|
195
+ p.need_tar_gz = true
196
+ p.need_tar_bz2 = true
197
+ p.package_files = (SPEC.pkg_files + PathList['vendor/**/*']).map { |x| x.to_s }
198
+ end
199
+ end
179
200
 
180
- desc 'Generate all packages'
181
- task :package => [ :gem_spec, :gem ]
182
- clean_task :package => [ :gem_spec ]
183
201
 
202
+ desc 'Generate all packages'
203
+ task :package => [ :tarballs, :gem_spec, :gem ]
184
204
 
205
+ clean_task :package => [ :spec, :clobber_vendor, :clobber_gem_spec ]
185
206
 
186
207
  desc 'Re-generate all packages'
187
- task :repackage => [ :gem_spec ]
208
+ task :repackage => [ :clobber_package, :package ]
188
209
 
189
210
 
190
211
 
191
212
  desc 'Generate a GEM package'
192
213
  task :gem => [ :gem_spec ]
193
214
 
194
-
215
+ # desc 'Remove the GEM package file'
216
+ clean_task :gem => [ :gem_spec ] do
217
+ $gem.rm_f
218
+ end
195
219
 
196
220
  desc 'Re-generate a GEM package'
197
221
  task :regem => [ :clobber_gem, :gem ]
@@ -207,14 +231,14 @@ task :rdoc_spec => [ :spec ] do
207
231
  rdoc.main = SPEC.rdoc_files.first
208
232
  tail = SPEC.rdoc_tail_files || []
209
233
  fl = SPEC.rdoc_files - tail + tail
210
- rdoc.rdoc_files.include(fl.to_strings)
234
+ rdoc.rdoc_files.include(fl.stringify)
211
235
  end
212
236
  end
213
237
 
214
238
 
215
239
 
216
240
  # desc 'Update the Gem specification'
217
- file GEM_SPEC.to_s => [ :spec, :dyn_spec, :rdoc_spec ] do
241
+ file GEM_SPEC.to_s => [ :spec, :spec_pkg_files, :dyn_spec, :rdoc_spec ] do
218
242
  spec = Gem::Specification.new do |s|
219
243
  s.platform = Gem::Platform::RUBY
220
244
  s.name = SPEC.name
@@ -226,13 +250,13 @@ file GEM_SPEC.to_s => [ :spec, :dyn_spec, :rdoc_spec ] do
226
250
  s.executables = Pathname.glob(bin + '*').select do |path|
227
251
  path.executable? and not path.directory?
228
252
  end.map { |path| path.basename.to_s }
229
- s.files = SPEC.pkg_files.to_strings
253
+ s.files = SPEC.pkg_files.stringify
230
254
  s.require_path = 'lib'
231
255
  s.autorequire = SPEC.autorequire if SPEC.autorequire
232
256
 
233
257
  if SPEC.dependencies
234
258
  SPEC.dependencies.each do |name, version|
235
- s.add_dependency(name, version)
259
+ s.add_dependency(name, (version.is_a? Array)? version.first : version)
236
260
  end
237
261
  end
238
262
 
@@ -255,46 +279,32 @@ end
255
279
 
256
280
 
257
281
 
258
- # desc "Remove the #{GEM_SPEC} file"
259
- clean_task :gem_spec do
260
- GEM_SPEC.rm_f
261
- end
262
-
263
-
264
-
265
- # desc 'Load the GEM spec and create tasks for packages'
266
282
  task :gem_spec => [ GEM_SPEC.to_s ] do
267
283
  spec = eval(GEM_SPEC.read)
268
284
 
269
285
  gtask = Rake::GemPackageTask.new(spec) do |p|
270
286
  p.gem_spec = spec
271
- p.need_tar_gz = true
272
- p.need_tar_bz2 = true
273
287
  p.package_files = SPEC.pkg_files.map { |x| x.to_s }
274
288
  end
275
289
  gtask.instance_eval { $gem = 'pkg'.to_path + gem_file }
276
290
  end
291
+ clean_task :gem_spec do
292
+ GEM_SPEC.rm_f
293
+ end
277
294
 
278
295
 
279
-
280
- # desc 'Remove the GEM package file'
281
- clean_task :gem => [ :gem_spec ] do
282
- $gem.rm_f
296
+ task :vcs do
297
+ require_gem('vcs', SPEC.vcs_version || '~> 0.3.0')
283
298
  end
284
299
 
285
300
 
286
-
287
301
  desc 'Commit with Vcs'
288
- task :commit => [ :spec ] do
289
- subject = ask('Commit subject: ') do |q|
290
- q.confirm = true
291
- q.validate = /^[^a-z].*\.$/
292
- end
302
+ task :commit => [ :vcs ] do
293
303
  pos = ARGV.index('--')
294
304
  args = (pos.nil?)? [] : ARGV[pos .. -1]
295
- cmd = SPEC.commit_command || 'commit'
305
+ cmd = SPEC.commit_command || 'commit'
296
306
  Dir.chdir(SPEC.commit_dir || '.') do
297
- sh 'vcs-svn', cmd, "'#{subject}'", *args
307
+ sh 'vcs-svn', cmd, *args
298
308
  end
299
309
  end
300
310
 
@@ -341,6 +351,9 @@ end
341
351
  # desc 'Common tasks for a release'
342
352
  task :common_release =>
343
353
  [
354
+ :ttk,
355
+ :vcs,
356
+
344
357
  :release_confirm,
345
358
  :check,
346
359
  :doc,
@@ -460,7 +473,7 @@ task :publish_package => [ :spec, :package ] do
460
473
  release_data.gsub(/name="package_id" value="(\d+)"/) { ids << $1 ; nil }
461
474
  release_data.gsub(/name="package_name" value="([^"]+)"/) { names << $1 ; nil }
462
475
  package_name = SPEC.rubyforge_sub_package_name || SPEC.name
463
-
476
+
464
477
  package_id = names.zip(ids).find { |name, id| name == package_name }.last
465
478
  raise "Couldn't get package id or package name" unless package_id
466
479
 
@@ -550,3 +563,32 @@ clean_task :publish_package do
550
563
  x.rm_f
551
564
  end
552
565
  end
566
+
567
+
568
+
569
+ task :vendor => [ :spec, :ruby_ex ] do
570
+ unless VENDOR.directory?
571
+ say "Creating the vendor directory..."
572
+ VENDOR.mkpath
573
+ require 'uri_ex'
574
+ if SPEC.dependencies
575
+ SPEC.dependencies.each do |name, version|
576
+ next unless version.is_a? Array
577
+ url = version.last
578
+ if url =~ /^\d+\/[^\/]+$/
579
+ url = "http://rubyforge.org/frs/download.php/#{url}"
580
+ end
581
+ url = URI.parse(url)
582
+ dest = VENDOR + url.pathname.basename.ext.to_s.sub(/\.tar$/, '').to_path
583
+ STDERR.puts "#{url} => #{dest}"
584
+ FileType.guess(url.checkout).extract.path.mv(dest)
585
+ end
586
+ end
587
+ end
588
+ end
589
+
590
+ clean_task :vendor do
591
+ VENDOR.rm_rf
592
+ end
593
+
594
+ task :revendor => [:clobber_vendor, :vendor]