core_ex 0.2.0 → 0.3.1

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 (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]