ruby_ex 0.2.0 → 0.3.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 (50) hide show
  1. data/ChangeLog +177 -0
  2. data/NEWS +20 -11
  3. data/SPEC.dyn.yml +4 -4
  4. data/SPEC.gemspec +4 -4
  5. data/SPEC.yml +4 -1
  6. data/lib/cache.rb +2 -2
  7. data/lib/commands.rb +19 -1
  8. data/lib/commands/command.rb +5 -5
  9. data/lib/commands/datas/composite.rb +26 -4
  10. data/lib/commands/datas/data.rb +6 -5
  11. data/lib/commands/pipe.rb +55 -14
  12. data/lib/commands/runners/fork.rb +6 -2
  13. data/lib/commands/runners/{mock.rb → mockable.rb} +21 -22
  14. data/lib/commands/runners/runner.rb +13 -1
  15. data/lib/d_logger.rb +11 -5
  16. data/lib/diff_tools.rb +141 -0
  17. data/lib/drb/insecure_protected_methods.rb +2 -2
  18. data/lib/file_type.rb +29 -21
  19. data/lib/hookable.rb +17 -2
  20. data/lib/md5sum.rb +2 -2
  21. data/lib/module/autoload_tree.rb +2 -2
  22. data/lib/ordered_hash.rb +28 -1
  23. data/lib/regex_list.rb +192 -0
  24. data/lib/ruby_ex.rb +8 -5
  25. data/lib/sendmail.rb +8 -1
  26. data/lib/sym_tbl_gsub.rb +44 -18
  27. data/lib/uri/file.rb +2 -2
  28. data/lib/uri/ftp_ex.rb +2 -2
  29. data/lib/uri/http_ex.rb +2 -2
  30. data/lib/uri/ssh.rb +1 -1
  31. data/lib/uri/svn.rb +2 -2
  32. data/lib/uri_ex.rb +4 -7
  33. data/lib/yaml/chop_header.rb +1 -1
  34. data/test/check-pkg-ruby_ex.yml +5 -7
  35. data/test/check-ruby_ex.yml +6 -10
  36. data/test/{resources → fixtures}/autoload_tree/A.rb +0 -0
  37. data/test/{resources → fixtures}/autoload_tree/B.rb +0 -0
  38. data/test/{resources → fixtures}/autoload_tree/foo/C.rb +0 -0
  39. data/test/fixtures/foo.bz2 +0 -0
  40. data/test/fixtures/foo.gz.zip +0 -0
  41. data/test/fixtures/foo.rb.gz +0 -0
  42. data/test/fixtures/foo.tar +0 -0
  43. data/test/fixtures/foo.tar.bz2 +0 -0
  44. data/test/{resources → fixtures}/foo.tar.gz +0 -0
  45. data/test/{resources → fixtures}/foo.txt +0 -0
  46. data/test/fixtures/my_diff.patch +164 -0
  47. data/test/{resources → fixtures}/tar.gz.log +0 -0
  48. data/test/sanity/multiple-requires.yml +1 -1
  49. data/test/sanity/single-requires.yml +1 -1
  50. metadata +23 -16
@@ -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: hookable.rb 343 2005-09-08 01:32:57Z ertai $
4
+ # Revision:: $Id: hookable.rb 364 2005-09-24 17:18:48Z ertai $
5
5
 
6
6
  require 'hooker'
7
7
 
@@ -28,6 +28,8 @@ module Hookable
28
28
 
29
29
 
30
30
  def hook_trigger ( name, *args )
31
+ return if defined? @disabled_hooks and @disabled_hooks.include? name
32
+ return if defined? @@disabled_hooks and @@disabled_hooks.include? name
31
33
  self.class.hook_trigger(name, *args)
32
34
  return unless defined? @hookers
33
35
  @hookers.each do |hooker|
@@ -38,6 +40,7 @@ module Hookable
38
40
 
39
41
  def self.hook_trigger ( name, *args )
40
42
  raise ArgumentError, "Unknown hook #{name}" unless hooks.include? name
43
+ return if defined? @@disabled_hooks and @@disabled_hooks.include? name
41
44
  hookers.each do |hooker|
42
45
  @@hook_trigger_internal[hooker, name, *args]
43
46
  end
@@ -65,6 +68,18 @@ module Hookable
65
68
  end
66
69
 
67
70
 
71
+ def disable_hook ( *hook_names )
72
+ @disabled_hooks ||= []
73
+ @disabled_hooks = @disabled_hooks + hook_names
74
+ end
75
+
76
+
77
+ def self.disable_hook ( *hook_names )
78
+ @@disabled_hooks ||= []
79
+ @@disabled_hooks = @@disabled_hooks + hook_names
80
+ end
81
+
82
+
68
83
  def self.hook_declare ( name, *groups )
69
84
  hooks << name
70
85
  end
@@ -95,7 +110,7 @@ module Hookable
95
110
  end
96
111
  end
97
112
 
98
-
113
+
99
114
  class HashWithRecursiveCloneDup < Hash
100
115
 
101
116
  def initialize_copy ( aHash )
@@ -3,7 +3,7 @@
3
3
  # License: Gnu General Public License.
4
4
 
5
5
  # $LastChangedBy: ertai $
6
- # $Id: md5sum.rb 339 2005-09-06 23:27:27Z ertai $
6
+ # $Id: md5sum.rb 376 2005-09-29 21:46:32Z ertai $
7
7
 
8
8
 
9
9
  require 'md5'
@@ -50,7 +50,7 @@ test_section __FILE__ do
50
50
  class MD5SumTest < Test::Unit::TestCase
51
51
 
52
52
  def setup
53
- @source = __FILE__.to_path.dirname.parent + 'test/resources/foo.txt'
53
+ @source = __FILE__.to_path.dirname.parent + 'test/fixtures/foo.txt'
54
54
  @ref = '9508b4f53cff19cf42c5a0f0fc127602'
55
55
  end
56
56
 
@@ -1,7 +1,7 @@
1
1
  # Copyright:: Copyright (c) 2004 Nicolas Despres. All rights reserved.
2
2
  # Author:: Nicolas Despres <polrop@lrde.epita.fr>.
3
3
  # License:: Gnu General Public License.
4
- # Revision:: $Id: autoload_tree.rb 339 2005-09-06 23:27:27Z ertai $
4
+ # Revision:: $Id: autoload_tree.rb 376 2005-09-29 21:46:32Z ertai $
5
5
 
6
6
 
7
7
  module AutoloadTree
@@ -42,7 +42,7 @@ module AutoloadTree
42
42
 
43
43
  class AutoloadTreeTest < Test::Unit::TestCase
44
44
 
45
- REPO_DIR = __FILE__.to_path.dirname.parent.parent + 'test/resources/autoload_tree'
45
+ REPO_DIR = __FILE__.to_path.dirname.parent.parent + 'test/fixtures/autoload_tree'
46
46
 
47
47
  module AutoloadTree; end
48
48
 
@@ -18,7 +18,7 @@
18
18
  #
19
19
 
20
20
  # $LastChangedBy: ertai $
21
- # $Id: ordered_hash.rb 339 2005-09-06 23:27:27Z ertai $
21
+ # $Id: ordered_hash.rb 367 2005-09-24 19:53:40Z ertai $
22
22
 
23
23
 
24
24
  module OrderedHash
@@ -193,6 +193,27 @@ class OHash < Hash
193
193
  hsh
194
194
  end
195
195
 
196
+ have YamlExtension, :ordered_hash, :ohash, :o_hash
197
+
198
+ def self.yaml_load ( val )
199
+ case val
200
+ when Hash
201
+ return OHash[val.to_a]
202
+ when OHash
203
+ return val
204
+ when Array
205
+ if val.all? { |x| x.is_a?(Hash) and x.size == 1 }
206
+ h = OHash.new
207
+ val.each do |x|
208
+ k, v = x
209
+ h[k] = v
210
+ end
211
+ return h
212
+ end
213
+ end
214
+ raise ArgumentError, "Cannot create a OHash with `#{val}'"
215
+ end
216
+
196
217
  end # class OHash
197
218
 
198
219
 
@@ -283,6 +304,12 @@ test_section __FILE__ do
283
304
  assert_not_equal OHash[1,2,3,4], OHash[3,4,1,2]
284
305
  end
285
306
 
307
+ def test_yaml_load ( aString, aClass, anObject=nil )
308
+ end
309
+
310
+ def test_yaml_dump ( anObject, ref, options={} )
311
+ end
312
+
286
313
  end # OrderedHashTest
287
314
 
288
315
  end
@@ -0,0 +1,192 @@
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: regex_list.rb 379 2005-09-29 22:00:37Z ertai $
5
+
6
+ class RegexList
7
+
8
+ def initialize ( *args )
9
+ @regexps = args.flatten
10
+ @regexps.map! { |re| (re.is_a? Regexp)? re : Regexp.new(re) }
11
+ @regexps.reverse!
12
+ @scores = {}
13
+ end
14
+
15
+ if ENV['REGEXP_LIST_DEBUG']
16
+
17
+ @@h = HighLine.new
18
+
19
+ def score ( aString )
20
+ if @scores.has_key? aString
21
+ result = @scores[aString]
22
+ action = '<%= color "Hit ", :green %>'
23
+ else
24
+ result = score_without_cache(aString)
25
+ action = '<%= color "Miss", :red %>'
26
+ @scores[aString] = result
27
+ end
28
+ @@h.say "#{action}: #{aString} -> #{result.inspect}"
29
+ result
30
+ end
31
+
32
+ else
33
+
34
+ # Perform a cache over +score_without_cache+
35
+ def score ( aString )
36
+ return @scores[aString] if @scores.has_key? aString
37
+ return @scores[aString] = score_without_cache(aString)
38
+ end
39
+
40
+ end
41
+
42
+ # Score represent a weighted sum of the match result with each regexp.
43
+ #
44
+ # 0: Not matched at all
45
+ # 1: Just the last regexp matches (the Nth regexp)
46
+ # 2: Just the (N - 1)th matches
47
+ # 3: The Nth and the (N - 1)th
48
+ # 2^(N - 1): Just the first one matches
49
+ #
50
+ # Formula:
51
+ # U(i <- 0 .. N - 1) is a vector with 1 when it matches and 0 otherwise
52
+ # Score = U(N - 1) * 2^(N - 1) + U(N - 2) * 2^(N - 2) + ... + U(0) * 2^0
53
+ def score_without_cache ( aString )
54
+ result = 0
55
+ @regexps.each_with_index do |re, i|
56
+ result += 2 ** i if aString =~ re
57
+ end
58
+ return result
59
+ end
60
+
61
+ def [] ( score )
62
+ @regexps[score]
63
+ end
64
+
65
+
66
+ module Assertions
67
+ attr_accessor :regex_list
68
+ def assert_regex_list_score ( input, ref, cache=true )
69
+ if cache
70
+ assert_equal ref, @regex_list.score(input)
71
+ else
72
+ assert_equal ref, @regex_list.score_without_cache(input)
73
+ end
74
+ end
75
+ end # module Assertions
76
+
77
+
78
+ # PathList Extension which gives sorting/filtering features to PathList
79
+ module PathListExtension
80
+
81
+ def sort_with_regex_list! ( regex_list )
82
+ sort! { |x, y| regex_list.score(y.to_s) <=> regex_list.score(x.to_s) }
83
+ end
84
+
85
+ def grep_with_regex_list! ( regex_list )
86
+ reject! { |x| regex_list.score(x.to_s).zero? }
87
+ sort_with_regex_list! regex_list
88
+ end
89
+
90
+ def grep_with_negative_regex_list! ( regex_list )
91
+ sort_with_regex_list! regex_list
92
+ reverse!
93
+ end
94
+
95
+ def exclude_with_regex_list! ( regex_list )
96
+ reject! { |x| not regex_list.score(x.to_s).zero? }
97
+ self
98
+ end
99
+
100
+ def self.dup_based_method ( meth )
101
+ define_method(meth) { |regex_list| dup.send(meth.to_s + '!', regex_list) }
102
+ end
103
+
104
+ dup_based_method :sort_with_regex_list
105
+ dup_based_method :grep_with_regex_list
106
+ dup_based_method :grep_with_negative_regex_list
107
+ dup_based_method :exclude_with_regex_list
108
+
109
+ module Assertions
110
+ attr_reader :path_list
111
+
112
+ RegexList::PathListExtension.instance_methods.each do |meth|
113
+ define_method('assert_' + meth.to_s) do |ref, input|
114
+ input = RegexList.new(input) unless input.is_a? RegexList
115
+ ref = PathList.new(ref) unless ref.is_a? PathList
116
+ assert_nothing_raised { @result = @path_list.send(meth, input) }
117
+ assert_kind_of(PathList, @result)
118
+ assert_equal(ref.stringify, @result.stringify)
119
+ end
120
+ end
121
+
122
+ end # module Assertions
123
+
124
+ end # module PathListExtension
125
+
126
+ end # class RegexList
127
+
128
+ PathList.import!
129
+ class PathList
130
+ include RegexList::PathListExtension
131
+ end
132
+
133
+
134
+ test_section __FILE__ do
135
+
136
+ class TestRegexList < ::Test::Unit::TestCase
137
+ include RegexList::Assertions
138
+
139
+ def setup
140
+ assert_nothing_raised do
141
+ @regex_list = RegexList.new %w[ a/abc b/foo fg kb c/a a/bar f ]
142
+ end
143
+ end
144
+
145
+ def teardown
146
+ end
147
+
148
+ def test_0_initialize
149
+ end
150
+
151
+ def test_score_without_cache
152
+ assert_regex_list_score 'a', 0
153
+ assert_regex_list_score 'a/abc', 64
154
+ assert_regex_list_score 'kb', 8
155
+ assert_regex_list_score 'f', 1
156
+ assert_regex_list_score 'a/abc/fg', 81
157
+ assert_regex_list_score 'kb/foo', 41
158
+ assert_regex_list_score 'a/abc b/foo fg kb c/a a/bar f', 127
159
+ assert_regex_list_score 'a/abca/abca/abca/abc', 64
160
+ end
161
+
162
+ end # class TestRegexList
163
+
164
+
165
+ class TestPathListRegexListExtension < ::Test::Unit::TestCase
166
+ include RegexList::PathListExtension::Assertions
167
+
168
+ def setup
169
+ @path_list = PathList.new %w[ a a/b a/c a/bc b/foo fg kb c/a a/bar f ]
170
+ end
171
+
172
+ def test_sort_with_regex_list
173
+ assert_sort_with_regex_list(%w[ f b/foo fg a/bc a/c a/b kb c/a a/bar a ], %w[ f ])
174
+ end
175
+
176
+ def test_grep_with_regex_list
177
+ assert_grep_with_regex_list(%w[ b/foo fg f ], %w[ f ])
178
+ assert_grep_with_regex_list(%w[ a/b a/bc b/foo kb a/bar ], %w[ b ])
179
+ assert_grep_with_regex_list(%w[ b/foo a/b a/bc a/bar kb fg f ], %w[ b f ])
180
+ end
181
+
182
+ def test_grep_with_negative_regex_list
183
+ assert_grep_with_negative_regex_list(%w[f a/bar a/b kb a b/foo fg a/bc c/a a/c ], %w[ c ])
184
+ end
185
+
186
+ def test_exclude_with_regex_list
187
+ assert_exclude_with_regex_list(%w[ a a/b a/c a/bc kb c/a a/bar ], %w[ f ])
188
+ end
189
+
190
+ end # class TestPathListRegexListExtension
191
+
192
+ end
@@ -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: ruby_ex.rb 359 2005-09-16 10:05:22Z ertai $
4
+ # Revision:: $Id: ruby_ex.rb 385 2005-10-02 17:05:35Z ertai $
5
5
 
6
6
  require 'pathname'
7
7
 
@@ -35,13 +35,16 @@ module RubyEx
35
35
 
36
36
 
37
37
  unless defined? CoreEx
38
- file = Pathname.glob("#{dir}/../{core_ex/lib/core_ex,vendor/core_ex*/lib/core_ex}").first
39
- if file.nil?
38
+ vendor = dir.parent + 'vendor'
39
+ $CORE_EX_VENDORS ||= []
40
+ $CORE_EX_VENDORS << vendor
41
+ file = vendor + 'core_ex' + 'lib' + 'core_ex'
42
+ if file.exist?
43
+ require file.to_s
44
+ else
40
45
  require 'rubygems'
41
46
  require_gem 'core_ex'
42
47
  require 'core_ex'
43
- else
44
- require file
45
48
  end
46
49
  end
47
50
  suppress(LoadError) { core_ex_require 'highline' }
@@ -23,6 +23,7 @@ class Sendmail
23
23
  :from => email,
24
24
  :to => [],
25
25
  :server => ENV['SMTPSERVER'] || 'localhost:25',
26
+ :header => {},
26
27
  :body => STDIN
27
28
  )
28
29
  string_args, hash_args = args.partition { |x| x.is_a?(String) }
@@ -59,6 +60,9 @@ class Sendmail
59
60
  opts.on('--comment STRING', 'Choose a comment for GPG') do |aComment|
60
61
  options.comment = aComment
61
62
  end
63
+ opts.on('--header STRING', 'Add some header fields (Yaml syntax)') do |s|
64
+ options.header = YAML.load(s)
65
+ end
62
66
  opts.on('-m', '--[no-]mime', 'Choose the mime protocole') do |mime|
63
67
  options.mime = mime
64
68
  end
@@ -107,7 +111,7 @@ class Sendmail
107
111
  |Send a mail, with this subject: #{opts.subject}
108
112
  | to #{opts.to.join(', ')}
109
113
  | from #{opts.from_name}
110
- | #{(opts.signed.nil?)? 'not signed !' : 'signed by ' + opts.from}
114
+ | #{(opts.signed)? 'signed by ' + opts.from : 'not signed !'}
111
115
  |Are you sure? (y/n)].head_cut!
112
116
  raise 'Aborting' unless HighLine.new.agree question, true
113
117
  end
@@ -118,6 +122,9 @@ class Sendmail
118
122
  f.print %Q[From: #{opts.from_name}
119
123
  |Subject: #{opts.subject}
120
124
  |To: #{opts.to.join(', ')}\n].head_cut!
125
+ opts.header.each do |k, v|
126
+ f.puts "#{k}: #{v}"
127
+ end
121
128
  if opts.signed
122
129
  TempPath.new do |mail_body|
123
130
  mail_body.open('w') do |out|
@@ -1,7 +1,7 @@
1
1
  # Author:: Nicolas Pouillard <ertai@lrde.epita.fr>.
2
2
  # Copyright:: Copyright (c) 2005 Nicolas Pouillard. All rights reserved.
3
3
  # License:: Ruby License
4
- # Revision:: $Id: sym_tbl_gsub.rb 339 2005-09-06 23:27:27Z ertai $
4
+ # Revision:: $Id: sym_tbl_gsub.rb 376 2005-09-29 21:46:32Z ertai $
5
5
 
6
6
  require 'sym_tbl'
7
7
 
@@ -139,18 +139,30 @@ end # class String
139
139
 
140
140
  PathList.import!
141
141
  class PathList
142
-
143
- alias add_matching_without_expand add_matching
144
- def add_matching(pattern)
145
- pattern = @expand[pattern] if defined? @expand and @expand
142
+ attr_accessor :symtbl
143
+
144
+ alias_method :add_matching_without_expand, :add_matching
145
+ def add_matching (pattern )
146
+ @pending_reject ||= []
147
+ if defined? @symtbl and @symtbl
148
+ pattern = pattern.do_symtbl_gsub(@symtbl)
149
+ else
150
+ if pattern.to_s =~ /<<.*>>/ and not @pending_reject.include? pattern
151
+ @pending_reject << pattern
152
+ return
153
+ end
154
+ end
146
155
  add_matching_without_expand pattern
147
156
  end
148
157
  protected :add_matching
149
158
 
150
159
  def symtbl_gsub! ( symtbl )
151
- @expand = lambda { |pattern| pattern.do_symtbl_gsub(symtbl) }
160
+ @pending_add += @pending_reject if defined? @pending_reject
161
+ @pending_reject = []
162
+ @pending = ! @pending_add.empty?
163
+ @symtbl = symtbl
152
164
  map! { |path| path.do_symtbl_gsub(symtbl) }
153
- @expand = nil
165
+ @symtbl = nil
154
166
  self
155
167
  end
156
168
 
@@ -168,12 +180,13 @@ module SymTblGsub
168
180
  class SymTblGsubTest < Test::Unit::TestCase
169
181
  def setup
170
182
  @s = SymTbl.new(
171
- :foo => :bar,
172
- :bar => [1, 2],
173
- 3 => 'foo',
174
- :i => '<<j>>',
175
- :j => '<<3>>',
176
- :pwd => __FILE__.to_path.dirname.to_s
183
+ :foo => :bar,
184
+ :bar => [1, 2],
185
+ 3 => 'foo',
186
+ :i => '<<j>>',
187
+ :j => '<<3>>',
188
+ :pwd => __FILE__.to_path.dirname.to_s,
189
+ :test => '<<pwd>>/../test'
177
190
  )
178
191
  end
179
192
  def assert_symtbl ( my, ref=nil )
@@ -213,15 +226,28 @@ module SymTblGsub
213
226
  end
214
227
  def test_pathlist
215
228
  pathlist = ['<<foo>>', '<<i>>'.to_path]
216
- ls1 = '<<bing>>/../test'.to_path + 'resources/autoload_tree/*.rb'
217
- ls2 = '<<pwd>>/../test'.to_path + 'resources/autoload_tree/*.rb'
218
- pathlist << ls2 << ls1
229
+ ls1 = '<<bing>>/../test'.to_path + 'fixtures/autoload_tree/*.rb'
230
+ ls2 = '<<pwd>>/../test'.to_path + 'fixtures/autoload_tree/*.rb'
231
+ ls3 = '<<test>>'.to_path + 'fixtures/foo.{tar*,bz*}'
232
+ pathlist << ls2 << ls1 << ls3
219
233
  my = PathList[pathlist].symtbl_gsub(@s).map! { |x| x.basename }
220
234
  my.all? { |x| assert_kind_of(Pathname, x) }
221
- ref = %w[ bar foo A.rb B.rb ]
235
+ ref = %w[ bar foo A.rb B.rb foo.bz2 foo.tar foo.tar.bz2 foo.tar.gz ]
236
+ assert_equal ref.to_set, my.map!{ |x| x.to_s }.to_set
237
+ end
238
+ def test_pathlist_keep_pending
239
+ pathlist = ['<<foo>>', '<<i>>'.to_path]
240
+ pathlist << '<<bing>>/../test'.to_path + 'fixtures/autoload_tree/*.rb'
241
+ pathlist << '<<pwd>>/../test'.to_path + 'fixtures/autoload_tree/*.rb'
242
+ pathlist << '<<test>>'.to_path + 'fixtures/foo.{tar*,bz*}'
243
+ pathlist = PathList[pathlist]
244
+ assert_equal(['<<foo>>'.to_path, '<<i>>'.to_path], pathlist)
245
+ my = pathlist.symtbl_gsub(@s).map! { |x| x.basename }
246
+ my.all? { |x| assert_kind_of(Pathname, x) }
247
+ ref = %w[ bar foo A.rb B.rb foo.bz2 foo.tar foo.tar.bz2 foo.tar.gz ]
222
248
  assert_equal ref.to_set, my.map!{ |x| x.to_s }.to_set
223
249
  end
224
250
  end # class SymTblGsubTest
225
251
  end
226
252
 
227
- end # module SymTblGsub
253
+ end # module SymTblGsub