epitools 0.5.103 → 0.5.105

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/README.rdoc +1 -1
  3. data/Rakefile +2 -2
  4. data/TODO +1 -1
  5. data/VERSION +1 -1
  6. data/lib/epitools.rb +1 -1
  7. data/lib/epitools/colored.rb +25 -25
  8. data/lib/epitools/core_ext/enumerable.rb +1 -1
  9. data/lib/epitools/core_ext/file.rb +6 -2
  10. data/lib/epitools/core_ext/hash.rb +43 -29
  11. data/lib/epitools/core_ext/misc.rb +21 -1
  12. data/lib/epitools/core_ext/object.rb +19 -19
  13. data/lib/epitools/core_ext/truthiness.rb +5 -5
  14. data/lib/epitools/daemonize.rb +1 -1
  15. data/lib/epitools/hexdump.rb +1 -1
  16. data/lib/epitools/iter.rb +26 -26
  17. data/lib/epitools/lcs.rb +3 -3
  18. data/lib/epitools/mimemagic.rb +7 -7
  19. data/lib/epitools/niceprint.rb +18 -18
  20. data/lib/epitools/numwords.rb +34 -34
  21. data/lib/epitools/path.rb +7 -0
  22. data/lib/epitools/permutations.rb +9 -9
  23. data/lib/epitools/pretty_backtrace.rb +11 -11
  24. data/lib/epitools/progressbar.rb +7 -7
  25. data/lib/epitools/rails.rb +2 -2
  26. data/lib/epitools/rash.rb +16 -16
  27. data/lib/epitools/ratio.rb +1 -1
  28. data/lib/epitools/sys.rb +47 -47
  29. data/lib/epitools/trie.rb +4 -4
  30. data/lib/epitools/typed_struct.rb +5 -5
  31. data/lib/epitools/wm.rb +6 -6
  32. data/lib/epitools/zopen.rb +2 -2
  33. data/spec/autoreq_spec.rb +5 -5
  34. data/spec/browser_spec.rb +1 -1
  35. data/spec/colored_spec.rb +5 -5
  36. data/spec/core_ext_spec.rb +1 -1
  37. data/spec/histogram_spec.rb +3 -3
  38. data/spec/iter_spec.rb +16 -16
  39. data/spec/lcs_spec.rb +5 -5
  40. data/spec/numwords_spec.rb +8 -8
  41. data/spec/permutations_spec.rb +9 -9
  42. data/spec/rash_spec.rb +7 -7
  43. data/spec/ratio_spec.rb +5 -5
  44. data/spec/sys_spec.rb +6 -6
  45. data/spec/term_spec.rb +7 -7
  46. data/spec/typed_struct_spec.rb +5 -5
  47. data/spec/wm_spec.rb +4 -4
  48. data/spec/zopen_spec.rb +11 -11
  49. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 37053f6a5bb1b1406914ce14114703107679b60f
4
- data.tar.gz: 7a309d8da2d15f2f73021680cb0de08846089db3
3
+ metadata.gz: d427d1b5d8c2314e24298cf32b86887e9f4592c3
4
+ data.tar.gz: 7e4ba5fbe4bdb2b3f07484f63f53fec7dba23389
5
5
  SHA512:
6
- metadata.gz: 6008b6abf95ac50f0ce55974b0378a3a03eee78f94d9a71967b75b482b1bdd9b99993d702dbb432c55da127fdafcb12b42e30a674d734d8baa610116254f69e6
7
- data.tar.gz: b0ba59178f118c8d857fe7d853ba47d224c74806ac5be870e6d7203cabcc5a588615e0913d7a7e703b0a9748875e7f003a28b7438ba02ac9eab6b08323e907ea
6
+ metadata.gz: 56cfdcaf9cc2b1d56e41a0eacad29c004cdf675f996a4281074f714dee52435c5dcd062b61d7ba0f32930b10044d7cbfb318670eea8b1a6a6d8f970953fdcd61
7
+ data.tar.gz: 442b4209f5caf2d85b3a90980d15e4a7114d2521eda593e8f641c29674617e5f6914f33a445c014dd35887fb3c88193d336b3f9c4327c50e3dd648b84864db5b
@@ -4,7 +4,7 @@ Useful miscellaneous improvements for base Ruby objects, plus some extra
4
4
  data structures and handy wrappers. You can think of it as a light-weight
5
5
  ActiveSupport.
6
6
 
7
- All epitools modules (and a bunch of Ruby's stdlib) are
7
+ All epitools modules (and a bunch of Ruby's stdlib) are
8
8
  {loaded on demand with "autoload"}[https://github.com/epitron/epitools/blob/master/lib/epitools/autoloads.rb],
9
9
  so it's really fast. (Require this in your .irbrc or .pryrc, and you'll never have to require another Ruby stdlib module again!)
10
10
 
data/Rakefile CHANGED
@@ -3,7 +3,7 @@ gem_version = File.read("VERSION").strip
3
3
  task :build do
4
4
  system "gem build .gemspec"
5
5
  end
6
-
6
+
7
7
  task :release => :build do
8
8
  system "gem push epitools-#{gem_version}.gem"
9
9
  end
@@ -18,7 +18,7 @@ end
18
18
 
19
19
  task :spec do
20
20
  cmd = %w[rspec -fd -c spec]
21
-
21
+
22
22
  if system *%w[which rescue]
23
23
  system *(["rescue"]+cmd)
24
24
  else
data/TODO CHANGED
@@ -24,4 +24,4 @@
24
24
  |_ eg: [file:line:method]
25
25
  |_ "gsmartcontrol" has good warning messages
26
26
  ie: "|13<warn> |07[hz] Warning: exit: The device error log contains records of errors."
27
-
27
+
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.5.103
1
+ 0.5.105
@@ -15,7 +15,7 @@ end
15
15
  # Load the things that can't be autoloaded
16
16
  #
17
17
  %w[
18
- core_ext
18
+ core_ext
19
19
  zopen
20
20
  colored
21
21
  clitools
@@ -32,7 +32,7 @@
32
32
  #
33
33
  # Since the presence of a terminal is detected automatically, the colors will be
34
34
  # disabled when you pipe your program to another program. However, if you want to
35
- # show colors when piped (eg: when you pipe to `less -R`), you can force it:
35
+ # show colors when piped (eg: when you pipe to `less -R`), you can force it:
36
36
  #
37
37
  # >> Colored.enable!
38
38
  # >> Colored.disable!
@@ -49,10 +49,10 @@ module Colored
49
49
 
50
50
  @@is_tty = STDOUT.isatty
51
51
 
52
- COLORS = {
52
+ COLORS = {
53
53
  'black' => 30,
54
- 'red' => 31,
55
- 'green' => 32,
54
+ 'red' => 31,
55
+ 'green' => 32,
56
56
  'yellow' => 33,
57
57
  'blue' => 34,
58
58
  'magenta' => 35,
@@ -62,13 +62,13 @@ module Colored
62
62
  }
63
63
 
64
64
  EXTRAS = {
65
- 'clear' => 0,
65
+ 'clear' => 0,
66
66
  'bold' => 1,
67
67
  'light' => 1,
68
68
  'underline' => 4,
69
69
  'reversed' => 7
70
70
  }
71
-
71
+
72
72
  #
73
73
  # BBS-style numeric color codes.
74
74
  #
@@ -99,9 +99,9 @@ module Colored
99
99
 
100
100
  Set.new(normal + lights + brights + on_backgrounds + ["grey", "gray"])
101
101
  end
102
-
102
+
103
103
  COLORS.each do |color, value|
104
- define_method(color) do
104
+ define_method(color) do
105
105
  colorize(self, :foreground => color)
106
106
  end
107
107
 
@@ -133,10 +133,10 @@ module Colored
133
133
 
134
134
  alias_method :gray, :light_black
135
135
  alias_method :grey, :light_black
136
-
136
+
137
137
  EXTRAS.each do |extra, value|
138
138
  next if extra == 'clear'
139
- define_method(extra) do
139
+ define_method(extra) do
140
140
  colorize(self, :extra => extra)
141
141
  end
142
142
  end
@@ -173,7 +173,7 @@ module Colored
173
173
  if string == nil
174
174
  return self.tagged_colors
175
175
  end
176
-
176
+
177
177
  if @@is_tty
178
178
  colored = [color(options[:foreground]), color("on_#{options[:background]}"), extra(options[:extra])].compact * ''
179
179
  colored << string
@@ -221,7 +221,7 @@ module Colored
221
221
  background = color_name.to_s =~ /on_/
222
222
  color_name = color_name.to_s.sub('on_', '')
223
223
  return unless color_name && COLORS[color_name]
224
- "\e[#{COLORS[color_name] + (background ? 10 : 0)}m"
224
+ "\e[#{COLORS[color_name] + (background ? 10 : 0)}m"
225
225
  end
226
226
 
227
227
  #
@@ -231,7 +231,7 @@ module Colored
231
231
  @@is_tty
232
232
  end
233
233
 
234
- alias_method :is_tty?, :enabled?
234
+ alias_method :is_tty?, :enabled?
235
235
 
236
236
  #
237
237
  # Color commands will always produce colored strings, regardless
@@ -240,7 +240,7 @@ module Colored
240
240
  def enable!
241
241
  @@is_tty = true
242
242
  end
243
-
243
+
244
244
  alias_method :force!, :enable!
245
245
 
246
246
  #
@@ -263,12 +263,12 @@ module Colored
263
263
 
264
264
  #
265
265
  # Is this string legal?
266
- #
266
+ #
267
267
  def valid_tag?(tag)
268
268
  VALID_COLORS.include?(tag) or
269
269
  (tag =~ /^\d+$/ and BBS_COLOR_TABLE.include?(tag.to_i) )
270
270
  end
271
-
271
+
272
272
  #
273
273
  # Colorize a string that has "color tags".
274
274
  #
@@ -278,18 +278,18 @@ module Colored
278
278
  # split the string into tags and literal strings
279
279
  tokens = self.split(/(<\/?[\w\d_]+>)/)
280
280
  tokens.delete_if { |token| token.size == 0 }
281
-
281
+
282
282
  result = ""
283
283
 
284
284
  tokens.each do |token|
285
285
 
286
286
  # token is an opening tag!
287
-
287
+
288
288
  if /<([\w\d_]+)>/ =~ token and valid_tag?($1)
289
289
  stack.push $1
290
290
 
291
- # token is a closing tag!
292
-
291
+ # token is a closing tag!
292
+
293
293
  elsif /<\/([\w\d_]+)>/ =~ token and valid_tag?($1)
294
294
 
295
295
  # if this color is on the stack somwehere...
@@ -301,19 +301,19 @@ module Colored
301
301
  end
302
302
 
303
303
  # token is a literal string!
304
-
304
+
305
305
  else
306
306
 
307
307
  color = (stack.last || "white")
308
308
  color = BBS_COLOR_TABLE[color.to_i] if color =~ /^\d+$/
309
309
  result << token.send(color)
310
-
310
+
311
311
  end
312
-
312
+
313
313
  end
314
-
314
+
315
315
  result
316
- end
316
+ end
317
317
 
318
318
  end unless Object.const_defined? :Colored
319
319
 
@@ -607,4 +607,4 @@ class Enumerator
607
607
  end
608
608
  alias_method :cross, :cross_product
609
609
 
610
- end
610
+ end
@@ -102,7 +102,7 @@ class File
102
102
  # Scan through the file until `string` is found, and set the IO's +pos+ to the first character of the matched string.
103
103
  #
104
104
  def seek_to(string, blocksize=512)
105
- raise "Error: blocksize must be at least as large as the string" if string.size < blocksize
105
+ raise "Error: blocksize must be at least as large as the string" if blocksize < string.size
106
106
 
107
107
  loop do
108
108
  data = read(blocksize)
@@ -116,13 +116,15 @@ class File
116
116
  seek(-(string.size - 1), IO::SEEK_CUR)
117
117
  end
118
118
  end
119
+
120
+ pos
119
121
  end
120
122
 
121
123
  #
122
124
  # Scan backwards in the file until `string` is found, and set the IO's +pos+ to the first character after the matched string.
123
125
  #
124
126
  def seek_backwards_to(string, blocksize=512, rindex_end=-1)
125
- raise "Error: blocksize must be at least as large as the string" if string.size < blocksize
127
+ raise "Error: blocksize must be at least as large as the string" if blocksize < string.size
126
128
 
127
129
  loop do
128
130
  data = reverse_read(blocksize)
@@ -136,6 +138,8 @@ class File
136
138
  seek(string.size - 1, IO::SEEK_CUR)
137
139
  end
138
140
  end
141
+
142
+ pos
139
143
  end
140
144
  alias_method :reverse_seek_to, :seek_backwards_to
141
145
 
@@ -7,15 +7,15 @@ class Hash
7
7
  def blank?
8
8
  not any?
9
9
  end
10
-
10
+
11
11
  #
12
12
  # Runs "remove_blank_values" on self.
13
- #
13
+ #
14
14
  def remove_blank_values!
15
15
  delete_if{|k,v| v.blank?}
16
16
  self
17
17
  end
18
-
18
+
19
19
  #
20
20
  # Returns a new Hash where blank values have been removed.
21
21
  # (It checks if the value is blank by calling #blank? on it)
@@ -23,10 +23,10 @@ class Hash
23
23
  def remove_blank_values
24
24
  dup.remove_blank_values!
25
25
  end
26
-
26
+
27
+ #
28
+ # Runs map_values on self.
27
29
  #
28
- # Runs map_values on self.
29
- #
30
30
  def map_values!(&block)
31
31
  keys.each do |key|
32
32
  value = self[key]
@@ -34,7 +34,7 @@ class Hash
34
34
  end
35
35
  self
36
36
  end
37
-
37
+
38
38
  #
39
39
  # Transforms the values of the hash by passing them into the supplied
40
40
  # block, and then using the block's result as the new value.
@@ -45,7 +45,7 @@ class Hash
45
45
 
46
46
  #
47
47
  # Runs map_keys on self.
48
- #
48
+ #
49
49
  def map_keys!(&block)
50
50
  keys.each do |key|
51
51
  value = delete(key)
@@ -53,7 +53,7 @@ class Hash
53
53
  end
54
54
  self
55
55
  end
56
-
56
+
57
57
  #
58
58
  # Transforms the keys of the hash by passing them into the supplied block,
59
59
  # and then using the blocks result as the new key.
@@ -62,6 +62,20 @@ class Hash
62
62
  dup.map_keys!(&block)
63
63
  end
64
64
 
65
+ #
66
+ # Convert the keys to symbols in-place, for fun and profit
67
+ #
68
+ def symbolize_keys!
69
+ map_keys! { |k| k.to_sym }
70
+ end
71
+
72
+ #
73
+ # Return a hash with its keys converted to symbols, for great justice
74
+ #
75
+ def symbolize_keys
76
+ dup.symbolize_keys!
77
+ end
78
+
65
79
  #
66
80
  # Returns a hash containing only the keys passed as arguments.
67
81
  #
@@ -140,14 +154,14 @@ class Hash
140
154
  end
141
155
  end
142
156
  end
143
- end
144
-
157
+ end
158
+
145
159
  #
146
160
  # `key?` and `includes?` is an alias for `include?`
147
- #
161
+ #
148
162
  alias_method :key?, :include?
149
163
  alias_method :includes?, :include?
150
-
164
+
151
165
  #
152
166
  # Makes each element in the `path` array point to a hash containing the next element in the `path`.
153
167
  # Useful for turning a bunch of strings (paths, module names, etc.) into a tree.
@@ -164,7 +178,7 @@ class Hash
164
178
  self[dir].mkdir_p(path[1..-1])
165
179
  self
166
180
  end
167
-
181
+
168
182
  #
169
183
  # Turn some nested hashes into a tree (returns an array of strings, padded on the left with indents.)
170
184
  #
@@ -176,8 +190,8 @@ class Hash
176
190
  result += val.tree(level+1) if val.any?
177
191
  end
178
192
  result
179
- end
180
-
193
+ end
194
+
181
195
  #
182
196
  # Print the result of `tree`
183
197
  #
@@ -188,15 +202,15 @@ class Hash
188
202
  puts block_given? ? yield(key, level) : "#{dent}#{key}"
189
203
  val.print_tree(level+1, indent, &block) if val.any?
190
204
  end
191
- end
192
-
205
+ end
206
+
193
207
  #
194
208
  # Convert the hash into a GET query.
195
209
  #
196
210
  def to_query
197
211
  params = ''
198
212
  stack = []
199
-
213
+
200
214
  each do |k, v|
201
215
  if v.is_a?(Hash)
202
216
  stack << [k,v]
@@ -204,7 +218,7 @@ class Hash
204
218
  params << "#{k}=#{v}&"
205
219
  end
206
220
  end
207
-
221
+
208
222
  stack.each do |parent, hash|
209
223
  hash.each do |k, v|
210
224
  if v.is_a?(Hash)
@@ -214,15 +228,15 @@ class Hash
214
228
  end
215
229
  end
216
230
  end
217
-
231
+
218
232
  params.chop! # trailing &
219
233
  params
220
234
  end
221
-
235
+
222
236
  #
223
237
  # Query a hash using MQL (see: http://wiki.freebase.com/wiki/MQL_operators for reference)
224
238
  #
225
- # Examples:
239
+ # Examples:
226
240
  # > query(name: /steve/)
227
241
  # > query(/title/ => ??)
228
242
  # > query(articles: [{title: ??}])
@@ -230,21 +244,21 @@ class Hash
230
244
  # > query("date_of_birth<" => "2000")
231
245
  #
232
246
  def query(template)
233
- results = []
247
+ results = []
234
248
  template.each do |key,val|
235
249
  case key
236
250
  when Regexp, String
237
251
  when Array
238
252
  when Hash
239
- results += hash.query(template)
253
+ results += hash.query(template)
240
254
  end
241
255
  end
242
-
256
+
243
257
  map do |key,val|
244
- end
258
+ end
245
259
  end
246
260
  alias_method :mql, :query
247
-
261
+
248
262
 
249
263
  #
250
264
  # Return all the changes necessary to transform `self` into `other`. (Works on nested hashes.) The result is a hash of {:key => [old value, new value]} pairs.
@@ -257,7 +271,7 @@ class Hash
257
271
  if self[key].kind_of?(Hash) && other[key].kind_of?(Hash)
258
272
  memo[key] = self[key].diff(other[key])
259
273
  else
260
- memo[key] = [self[key], other[key]]
274
+ memo[key] = [self[key], other[key]]
261
275
  end
262
276
  end
263
277
  memo