ruby-nuggets 0.9.8.1 → 0.9.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README +1 -1
- data/Rakefile +9 -3
- data/lib/nuggets/all.rb +1 -1
- data/lib/nuggets/array/combination.rb +2 -25
- data/lib/nuggets/array/flatten_once.rb +1 -12
- data/lib/nuggets/array/format.rb +2 -60
- data/lib/nuggets/array/in_order.rb +1 -12
- data/lib/nuggets/array/monotone.rb +10 -27
- data/lib/nuggets/array/only.rb +1 -16
- data/lib/nuggets/array/shuffle.rb +1 -1
- data/lib/nuggets/array/to_hash.rb +1 -22
- data/lib/nuggets/cli.rb +2 -2
- data/lib/nuggets/content_type.rb +3 -8
- data/lib/nuggets/dotted_decimal.rb +0 -18
- data/lib/nuggets/enumerable/all_any_extended.rb +0 -27
- data/lib/nuggets/enumerable/minmax.rb +4 -25
- data/lib/nuggets/hash/at.rb +2 -20
- data/lib/nuggets/hash/deep_fetch.rb +5 -0
- data/lib/nuggets/hash/deep_fetch_mixin.rb +75 -0
- data/lib/nuggets/hash/in_order.rb +0 -8
- data/lib/nuggets/hash/insert.rb +2 -13
- data/lib/nuggets/hash/only.rb +2 -18
- data/lib/nuggets/i18n.rb +1 -10
- data/lib/nuggets/integer/factorial.rb +0 -17
- data/lib/nuggets/integer/to_binary_s.rb +0 -8
- data/lib/nuggets/lsi.rb +2 -2
- data/lib/nuggets/midos.rb +2 -2
- data/lib/nuggets/mysql.rb +6 -207
- data/lib/nuggets/numeric/duration.rb +0 -8
- data/lib/nuggets/numeric/limit.rb +1 -8
- data/lib/nuggets/numeric/signum.rb +0 -7
- data/lib/nuggets/numeric/to_multiple.rb +0 -6
- data/lib/nuggets/rdf/compression.rb +3 -89
- data/lib/nuggets/rdf/prefix.rb +6 -32
- data/lib/nuggets/rdf/turtle/reader.rb +5 -70
- data/lib/nuggets/rdf/turtle.rb +6 -122
- data/lib/nuggets/rdf/uri.rb +5 -37
- data/lib/nuggets/ruby.rb +39 -147
- data/lib/nuggets/string/capitalize_first.rb +2 -18
- data/lib/nuggets/string/case.rb +0 -22
- data/lib/nuggets/string/msub.rb +0 -18
- data/lib/nuggets/string/nsub.rb +2 -16
- data/lib/nuggets/string/sub_with_md.rb +6 -25
- data/lib/nuggets/string/word_wrap.rb +1 -35
- data/lib/nuggets/util/ansicolor2css.rb +1 -1
- data/lib/nuggets/util/cli.rb +1 -1
- data/lib/nuggets/util/content_type.rb +1 -1
- data/lib/nuggets/util/dotted_decimal.rb +1 -2
- data/lib/nuggets/util/i18n.rb +1 -1
- data/lib/nuggets/util/lazy_attr.rb +1 -1
- data/lib/nuggets/util/log_parser/apache.rb +1 -1
- data/lib/nuggets/util/log_parser/rails.rb +1 -1
- data/lib/nuggets/util/log_parser.rb +1 -1
- data/lib/nuggets/util/midos.rb +1 -1
- data/lib/nuggets/util/mysql.rb +1 -1
- data/lib/nuggets/util/pluggable.rb +1 -1
- data/lib/nuggets/util/ruby.rb +1 -1
- data/lib/nuggets/version.rb +2 -2
- data/spec/nuggets/array/boost_spec.rb +1 -3
- data/spec/nuggets/array/combination_spec.rb +25 -0
- data/spec/nuggets/array/correlation_spec.rb +1 -3
- data/spec/nuggets/array/flatten_once_spec.rb +16 -0
- data/spec/nuggets/array/flush_spec.rb +1 -3
- data/spec/nuggets/array/format_spec.rb +52 -0
- data/spec/nuggets/array/hashify_spec.rb +1 -3
- data/spec/nuggets/array/histogram_spec.rb +1 -3
- data/spec/nuggets/array/in_order_spec.rb +13 -0
- data/spec/nuggets/array/limit_spec.rb +1 -3
- data/spec/nuggets/array/mean_spec.rb +3 -5
- data/spec/nuggets/array/median_spec.rb +3 -5
- data/spec/nuggets/array/mode_spec.rb +1 -3
- data/spec/nuggets/array/monotone_spec.rb +30 -0
- data/spec/nuggets/array/only_spec.rb +26 -0
- data/spec/nuggets/array/regression_spec.rb +1 -3
- data/spec/nuggets/array/runiq_spec.rb +1 -3
- data/spec/nuggets/array/standard_deviation_spec.rb +1 -3
- data/spec/nuggets/array/to_hash_spec.rb +28 -0
- data/spec/nuggets/array/variance_spec.rb +3 -5
- data/spec/nuggets/dotted_decimal_spec.rb +27 -0
- data/spec/nuggets/enumerable/all_any_extended_spec.rb +31 -0
- data/spec/nuggets/enumerable/minmax_spec.rb +21 -0
- data/spec/nuggets/env/set_spec.rb +1 -3
- data/spec/nuggets/env/user_encoding_spec.rb +1 -3
- data/spec/nuggets/env/user_home_spec.rb +12 -10
- data/spec/nuggets/file/ext_spec.rb +1 -3
- data/spec/nuggets/file/replace_spec.rb +1 -3
- data/spec/nuggets/file/sub_spec.rb +1 -3
- data/spec/nuggets/file/which_spec.rb +1 -3
- data/spec/nuggets/hash/at_spec.rb +19 -0
- data/spec/nuggets/hash/deep_fetch_spec.rb +159 -0
- data/spec/nuggets/hash/deep_merge_spec.rb +1 -3
- data/spec/nuggets/hash/in_order_spec.rb +12 -0
- data/spec/nuggets/hash/insert_spec.rb +13 -0
- data/spec/nuggets/hash/nest_spec.rb +1 -3
- data/spec/nuggets/hash/only_spec.rb +29 -0
- data/spec/nuggets/hash/seen_spec.rb +4 -6
- data/spec/nuggets/hash/unroll_spec.rb +2 -4
- data/spec/nuggets/i18n_spec.rb +13 -0
- data/spec/nuggets/integer/factorial_spec.rb +10 -0
- data/spec/nuggets/integer/length_spec.rb +1 -3
- data/spec/nuggets/integer/map_spec.rb +1 -3
- data/spec/nuggets/integer/to_binary_s_spec.rb +19 -0
- data/spec/nuggets/numeric/duration_spec.rb +25 -0
- data/spec/nuggets/numeric/limit_spec.rb +16 -0
- data/spec/nuggets/numeric/signum_spec.rb +16 -0
- data/spec/nuggets/numeric/to_multiple_spec.rb +16 -0
- data/spec/nuggets/object/blank_spec.rb +1 -2
- data/spec/nuggets/object/boolean_spec.rb +1 -3
- data/spec/nuggets/object/msend_spec.rb +1 -3
- data/spec/nuggets/object/silence_spec.rb +7 -4
- data/spec/nuggets/object/singleton_class_spec.rb +11 -4
- data/spec/nuggets/proc/bind_spec.rb +1 -3
- data/spec/nuggets/range/quantile_spec.rb +1 -3
- data/spec/nuggets/string/camelscore_spec.rb +11 -13
- data/spec/nuggets/string/capitalize_first_spec.rb +13 -0
- data/spec/nuggets/string/case_spec.rb +31 -0
- data/spec/nuggets/string/evaluate_spec.rb +1 -3
- data/spec/nuggets/string/msub_spec.rb +20 -0
- data/spec/nuggets/string/nsub_spec.rb +13 -0
- data/spec/nuggets/string/sub_with_md_spec.rb +25 -0
- data/spec/nuggets/string/wc_spec.rb +1 -3
- data/spec/nuggets/string/word_wrap_spec.rb +81 -0
- data/spec/nuggets/string/xor_spec.rb +1 -3
- data/spec/nuggets/uri/content_type_spec.rb +32 -27
- data/spec/nuggets/uri/exist_spec.rb +33 -9
- data/spec/spec_helper.rb +17 -0
- metadata +34 -5
- data/.rspec +0 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: efd0fc2a1e207d02a5c1615f520546f04670a134
|
4
|
+
data.tar.gz: 34a92b46ae4b4201598feef5fb9ff329fba2f98d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bdaa6f53862c08efa393837dbdd2dcabea561911141ceecdeec1221e0866ed531da04c15bc850d72d3ec0a82b4ace4066b9832bb3c2368fcddc002f5453a5f32
|
7
|
+
data.tar.gz: a9db082c3a292393906f1c1c8151aff57cf719abd9c36ebf698808363105dfcad662c506efd4b4aa498670329a9992bf342012a987cb92ca51b1cec61b12e6a6
|
data/README
CHANGED
data/Rakefile
CHANGED
@@ -18,9 +18,6 @@ begin
|
|
18
18
|
#'amatch', # enumerable/agrep
|
19
19
|
'mime-types', # content_type
|
20
20
|
'open4', # ruby
|
21
|
-
#'rbzip2', # rdf/compression
|
22
|
-
#'rdf', # rdf/{prefix,uri,compression}
|
23
|
-
#'rdf-turtle', # rdf/turtle
|
24
21
|
#'ruby-filemagic' # content_type
|
25
22
|
]
|
26
23
|
}
|
@@ -39,3 +36,12 @@ task 'spec:isolated' do
|
|
39
36
|
system($0, *ARGV)
|
40
37
|
}
|
41
38
|
end
|
39
|
+
|
40
|
+
if RUBY_PLATFORM == 'java'
|
41
|
+
task :spec => :enable_objspace
|
42
|
+
|
43
|
+
task :enable_objspace do
|
44
|
+
k, v = 'JRUBY_OPTS', '-X+O'
|
45
|
+
ENV[k] ? ENV[k] += " #{v}" : ENV[k] = v
|
46
|
+
end
|
47
|
+
end
|
data/lib/nuggets/all.rb
CHANGED
@@ -29,7 +29,7 @@ base = ::File.dirname(__FILE__)
|
|
29
29
|
base_re = ::Regexp.escape(base)
|
30
30
|
|
31
31
|
::Dir[::File.join(base, %w[* ** *.rb])].sort.each { |path|
|
32
|
-
next if path
|
32
|
+
next if path.include?('/util/') || path.end_with?('_mixin.rb')
|
33
33
|
|
34
34
|
ext_re = ::Regexp.escape(::File.extname(path))
|
35
35
|
require path.sub(/#{base_re}(.*)#{ext_re}/, 'nuggets\1')
|
@@ -38,14 +38,9 @@ class Array
|
|
38
38
|
# If no sizes are given, produce all!
|
39
39
|
sizes = (0..size).to_a.reverse if sizes.empty?
|
40
40
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
# Collect combinations and, optionally, yield to block.
|
45
|
-
collect_and_yield = lambda { |combination|
|
41
|
+
combinations, collect_and_yield = [], lambda { |combination|
|
42
|
+
yield combination if block_given?
|
46
43
|
combinations << combination
|
47
|
-
|
48
|
-
yield(combination) if block_given?
|
49
44
|
}
|
50
45
|
|
51
46
|
sizes.each { |n|
|
@@ -62,25 +57,7 @@ class Array
|
|
62
57
|
end
|
63
58
|
}
|
64
59
|
|
65
|
-
# Anyway, return what we've found...
|
66
60
|
combinations
|
67
61
|
end
|
68
62
|
|
69
63
|
end
|
70
|
-
|
71
|
-
if $0 == __FILE__
|
72
|
-
a = %w[a b c d]
|
73
|
-
p a
|
74
|
-
|
75
|
-
p a.comb(3)
|
76
|
-
a.comb(3) { |x|
|
77
|
-
p x
|
78
|
-
}
|
79
|
-
|
80
|
-
p a.comb(4, 2, 4)
|
81
|
-
|
82
|
-
p a.comb
|
83
|
-
a.comb { |x|
|
84
|
-
p x
|
85
|
-
}
|
86
|
-
end
|
@@ -51,18 +51,7 @@ class Array
|
|
51
51
|
#
|
52
52
|
# Destructive version of #flatten_once.
|
53
53
|
def flatten_once!
|
54
|
-
replace
|
54
|
+
replace(flatten_once)
|
55
55
|
end
|
56
56
|
|
57
57
|
end
|
58
|
-
|
59
|
-
if $0 == __FILE__
|
60
|
-
a = [1, 2, [3, 4, 5], 6, [7, [8, 9]]]
|
61
|
-
p a
|
62
|
-
|
63
|
-
p a.flatten
|
64
|
-
p a.flatten_once
|
65
|
-
|
66
|
-
a.flatten_once!
|
67
|
-
p a
|
68
|
-
end
|
data/lib/nuggets/array/format.rb
CHANGED
@@ -44,9 +44,7 @@ class Array
|
|
44
44
|
opts = { :sep => ', ' }
|
45
45
|
opts.update(pop) if last.is_a?(::Hash)
|
46
46
|
|
47
|
-
default = lambda { |n|
|
48
|
-
['%s'] * n * opts[:sep]
|
49
|
-
}
|
47
|
+
default = lambda { |n| ['%s'] * n * opts[:sep] }
|
50
48
|
|
51
49
|
case args
|
52
50
|
when ::String
|
@@ -56,9 +54,7 @@ class Array
|
|
56
54
|
i = 0
|
57
55
|
[*args].comb { |x|
|
58
56
|
return (self[i] || default[x.size]) % x unless
|
59
|
-
x.empty? || x.any? { |y|
|
60
|
-
y.nil? || y.empty?
|
61
|
-
}
|
57
|
+
x.empty? || x.any? { |y| y.nil? || y.empty? }
|
62
58
|
|
63
59
|
i += 1
|
64
60
|
}
|
@@ -68,57 +64,3 @@ class Array
|
|
68
64
|
end
|
69
65
|
|
70
66
|
end
|
71
|
-
|
72
|
-
if $0 == __FILE__
|
73
|
-
[[], 'string', ''].each { |x|
|
74
|
-
p x
|
75
|
-
puts '>> ' << ['"%s"'] % x
|
76
|
-
}
|
77
|
-
|
78
|
-
[ ['place', 'country'],
|
79
|
-
['place', '' ],
|
80
|
-
['', 'country'],
|
81
|
-
['', '' ]
|
82
|
-
].each { |x|
|
83
|
-
p x
|
84
|
-
puts '>> ' << ['%s, (%s)', '%s', '(%s)'] % x
|
85
|
-
}
|
86
|
-
|
87
|
-
puts '=' * 80
|
88
|
-
|
89
|
-
[ ['author', 'title', 'year'],
|
90
|
-
['author', 'title', '' ],
|
91
|
-
['author', '', 'year'],
|
92
|
-
['', 'title', 'year'],
|
93
|
-
['author', '' , '' ],
|
94
|
-
['', 'title', '' ],
|
95
|
-
['', '', 'year'],
|
96
|
-
['', '', '' ]
|
97
|
-
].each { |x|
|
98
|
-
p x
|
99
|
-
puts '>> ' << ['%s: %s (%s)', '%s: %s', '%s (%s)', '%s (%s)'] % x
|
100
|
-
}
|
101
|
-
|
102
|
-
puts '=' * 80
|
103
|
-
|
104
|
-
[ ['1', '2', '3', '4'],
|
105
|
-
['1', '2', '3', '' ],
|
106
|
-
['1', '2', '', '4'],
|
107
|
-
['1', '', '3', '4'],
|
108
|
-
['', '2', '3', '4'],
|
109
|
-
['1', '2', '', '' ],
|
110
|
-
['1', '', '3', '' ],
|
111
|
-
['1', '', '', '4'],
|
112
|
-
['', '2', '3', '' ],
|
113
|
-
['', '2', '', '4'],
|
114
|
-
['', '', '3', '4'],
|
115
|
-
['1', '', '', '' ],
|
116
|
-
['', '2', '', '' ],
|
117
|
-
['', '', '3', '' ],
|
118
|
-
['', '', '', '4'],
|
119
|
-
['', '', '', '' ]
|
120
|
-
].each { |x|
|
121
|
-
p x
|
122
|
-
puts '>> ' << [{ :sep => ':' }] % x
|
123
|
-
}
|
124
|
-
end
|
@@ -45,18 +45,7 @@ class Array
|
|
45
45
|
#
|
46
46
|
# Destructive version of #in_order.
|
47
47
|
def in_order!(*ordered)
|
48
|
-
replace
|
48
|
+
replace(in_order(*ordered))
|
49
49
|
end
|
50
50
|
|
51
51
|
end
|
52
|
-
|
53
|
-
if $0 == __FILE__
|
54
|
-
a = [:created_at, :email, :login, :updated_at]
|
55
|
-
p a
|
56
|
-
|
57
|
-
p a.in_order(:login, :email)
|
58
|
-
p a.in_order(:email, :address)
|
59
|
-
|
60
|
-
a.in_order!(:login, :email)
|
61
|
-
p a
|
62
|
-
end
|
@@ -31,13 +31,17 @@ class Array
|
|
31
31
|
# array.monotone?(operator) => +true+ or +false+
|
32
32
|
#
|
33
33
|
# Check whether _array_ is monotone according to +operator+.
|
34
|
-
def monotone?(operator)
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
34
|
+
def monotone?(operator = nil)
|
35
|
+
if [nil, true, false].include?(operator)
|
36
|
+
ascending?(operator) || descending?(operator)
|
37
|
+
else
|
38
|
+
inject { |a, b|
|
39
|
+
return false unless a.send(operator, b)
|
40
|
+
b
|
41
|
+
}
|
39
42
|
|
40
|
-
|
43
|
+
true
|
44
|
+
end
|
41
45
|
end
|
42
46
|
alias_method :monotonic?, :monotone?
|
43
47
|
|
@@ -78,24 +82,3 @@ class Array
|
|
78
82
|
alias_method :strictly_decreasing?, :strictly_descending?
|
79
83
|
|
80
84
|
end
|
81
|
-
|
82
|
-
if $0 == __FILE__
|
83
|
-
a = [1, 2, 3, 4]
|
84
|
-
p a
|
85
|
-
|
86
|
-
p a.ascending? # => true
|
87
|
-
p a.strictly_ascending? # => true
|
88
|
-
p a.descending? # => false
|
89
|
-
|
90
|
-
b = [1, 2, 4, 3]
|
91
|
-
p b
|
92
|
-
|
93
|
-
p b.ascending? # => false
|
94
|
-
p b.descending? # => false
|
95
|
-
|
96
|
-
c = [1, 2, 4, 4]
|
97
|
-
p c
|
98
|
-
|
99
|
-
p c.ascending? # => true
|
100
|
-
p c.strictly_ascending? # => false
|
101
|
-
end
|
data/lib/nuggets/array/only.rb
CHANGED
@@ -36,22 +36,7 @@ class Array
|
|
36
36
|
#
|
37
37
|
# Idea stolen from Gavin Sinclair's Ruby Extensions Project.
|
38
38
|
def only(relax = size == 1)
|
39
|
-
raise
|
40
|
-
first
|
39
|
+
relax ? first : raise(::IndexError, 'not a single-element array')
|
41
40
|
end
|
42
41
|
|
43
42
|
end
|
44
|
-
|
45
|
-
if $0 == __FILE__
|
46
|
-
[[5], [1, 2, 3], []].each { |a|
|
47
|
-
p a
|
48
|
-
|
49
|
-
begin
|
50
|
-
p a.only
|
51
|
-
rescue ::IndexError => err
|
52
|
-
warn err
|
53
|
-
end
|
54
|
-
|
55
|
-
p a.only(true)
|
56
|
-
}
|
57
|
-
end
|
@@ -59,28 +59,7 @@ class Array
|
|
59
59
|
|
60
60
|
hash
|
61
61
|
end
|
62
|
-
alias_method :to_h, :to_hash
|
63
|
-
|
64
|
-
end
|
65
62
|
|
66
|
-
|
67
|
-
a = [[:a, 1], [:b, 2], [:c, 3]]
|
68
|
-
p a
|
69
|
-
p a.to_h
|
70
|
-
|
71
|
-
b = [[:a, [1, 2]], [:b, 3], [[:c, :d], [4, [5, 6]]]]
|
72
|
-
p b
|
73
|
-
p b.to_h
|
74
|
-
|
75
|
-
c = %w[a b c d]
|
76
|
-
p c
|
77
|
-
p c.to_h
|
78
|
-
p c.to_h(1)
|
79
|
-
p c.to_h { nil }
|
63
|
+
alias_method :to_h, :to_hash
|
80
64
|
|
81
|
-
h = { :a => 1, :b => [2, 3], :c => { :d => 4}}
|
82
|
-
p h
|
83
|
-
p h.to_a
|
84
|
-
p h.to_a.to_h
|
85
|
-
p h.to_a.to_h == h
|
86
65
|
end
|
data/lib/nuggets/cli.rb
CHANGED
@@ -2,7 +2,7 @@ begin
|
|
2
2
|
require 'cyclops'
|
3
3
|
module Nuggets; CLI = ::Cyclops; end
|
4
4
|
|
5
|
-
warn "#{__FILE__}: Nuggets::CLI is deprecated, use Cyclops instead."
|
5
|
+
warn "#{__FILE__}: Nuggets::CLI is deprecated, use Cyclops instead." unless ENV['NUGGETS_DEPRECATED_CLI']
|
6
6
|
rescue LoadError => err
|
7
|
-
warn "#{__FILE__}: Nuggets::CLI is no longer available; install `cyclops' instead. (#{err})"
|
7
|
+
warn "#{__FILE__}: Nuggets::CLI is no longer available; install `cyclops' instead. (#{err})" unless ENV['NUGGETS_DEPRECATED_CLI']
|
8
8
|
end
|
data/lib/nuggets/content_type.rb
CHANGED
@@ -25,14 +25,9 @@
|
|
25
25
|
###############################################################################
|
26
26
|
#++
|
27
27
|
|
28
|
-
begin
|
29
|
-
require 'rubygems'
|
30
|
-
rescue ::LoadError
|
31
|
-
end
|
32
|
-
|
33
28
|
begin
|
34
29
|
require 'filemagic/ext'
|
35
|
-
rescue
|
30
|
+
rescue LoadError
|
36
31
|
def File.content_type(path) # :nodoc:
|
37
32
|
nil
|
38
33
|
end
|
@@ -40,7 +35,7 @@ end
|
|
40
35
|
|
41
36
|
begin
|
42
37
|
require 'nuggets/uri/content_type'
|
43
|
-
rescue
|
38
|
+
rescue LoadError
|
44
39
|
module URI
|
45
40
|
def self.content_type(path) # :nodoc:
|
46
41
|
nil
|
@@ -50,7 +45,7 @@ end
|
|
50
45
|
|
51
46
|
begin
|
52
47
|
require 'mime/types'
|
53
|
-
rescue
|
48
|
+
rescue LoadError
|
54
49
|
module MIME # :nodoc:
|
55
50
|
class Types # :nodoc:
|
56
51
|
def self.of(path)
|
@@ -58,21 +58,3 @@ class Array
|
|
58
58
|
end
|
59
59
|
|
60
60
|
end
|
61
|
-
|
62
|
-
if $0 == __FILE__
|
63
|
-
[2294967042, 4294967040].each { |i|
|
64
|
-
p i.to_binary_s(32)
|
65
|
-
p i.to_dotted_decimal
|
66
|
-
}
|
67
|
-
|
68
|
-
puts '#' * 34
|
69
|
-
|
70
|
-
%w[77.47.161.3 196.101.53.1].each { |s|
|
71
|
-
p s
|
72
|
-
p s.from_dotted_decimal.to_binary_s(32)
|
73
|
-
}
|
74
|
-
|
75
|
-
a = %w[77.47.161.3 196.101.53.1 77.47.161.11]
|
76
|
-
p a.sort
|
77
|
-
p a.sort_by_dotted_decimal
|
78
|
-
end
|
@@ -65,30 +65,3 @@ module Enumerable
|
|
65
65
|
end
|
66
66
|
|
67
67
|
end
|
68
|
-
|
69
|
-
if $0 == __FILE__
|
70
|
-
e = %w[quux quuux quix]
|
71
|
-
p e
|
72
|
-
|
73
|
-
p e.all?(::String)
|
74
|
-
p e.any?(::Numeric)
|
75
|
-
|
76
|
-
e = [:one, 'c', nil, 88]
|
77
|
-
p e
|
78
|
-
|
79
|
-
p e.all?(::Object)
|
80
|
-
p e.any?(::NilClass)
|
81
|
-
|
82
|
-
begin
|
83
|
-
e.any?(::NilClass) { |i| i.nil? }
|
84
|
-
rescue ::ArgumentError => err
|
85
|
-
puts "#{err.backtrace.first}: #{err} (#{err.class})"
|
86
|
-
end
|
87
|
-
|
88
|
-
e = [0, 10, 20]
|
89
|
-
p e
|
90
|
-
|
91
|
-
p e.any?(9..99)
|
92
|
-
p e.any?(9, :<)
|
93
|
-
p e.any? { |i| i < 9 }
|
94
|
-
end
|
@@ -87,9 +87,8 @@ module Enumerable
|
|
87
87
|
#
|
88
88
|
# Maximum #minmax. If +what+ is omitted, or +nil+, the original Enumerable#max
|
89
89
|
# is called.
|
90
|
-
def max(what = nil)
|
91
|
-
what ? minmax(:max, what) :
|
92
|
-
_nuggets_original_max { |*a| yield(*a) } : _nuggets_original_max
|
90
|
+
def max(what = nil, &block)
|
91
|
+
what ? minmax(:max, what) : _nuggets_original_max(&block)
|
93
92
|
end
|
94
93
|
|
95
94
|
# call-seq:
|
@@ -97,28 +96,8 @@ module Enumerable
|
|
97
96
|
#
|
98
97
|
# Minimum #minmax. If +what+ is omitted, or +nil+, the original Enumerable#min
|
99
98
|
# is called.
|
100
|
-
def min(what = nil)
|
101
|
-
what ? minmax(:min, what) :
|
102
|
-
_nuggets_original_min { |*a| yield(*a) } : _nuggets_original_min
|
99
|
+
def min(what = nil, &block)
|
100
|
+
what ? minmax(:min, what) : _nuggets_original_min(&block)
|
103
101
|
end
|
104
102
|
|
105
103
|
end
|
106
|
-
|
107
|
-
if $0 == __FILE__
|
108
|
-
e = %w[quux quuux quix]
|
109
|
-
p e
|
110
|
-
|
111
|
-
p e.max
|
112
|
-
p e.max_by(:length)
|
113
|
-
p e.max(:length)
|
114
|
-
|
115
|
-
e = [3, 222, 45]
|
116
|
-
p e
|
117
|
-
|
118
|
-
# the last digit counts ;-)
|
119
|
-
l = lambda { |i| i.to_s.split(//).last.to_i }
|
120
|
-
|
121
|
-
p e.max
|
122
|
-
p e.max_by(l)
|
123
|
-
p e.max(l)
|
124
|
-
end
|
data/lib/nuggets/hash/at.rb
CHANGED
@@ -34,15 +34,10 @@ class Hash
|
|
34
34
|
#
|
35
35
|
# Returns the key/value pair of _hash_ at key position +what+. Remember that
|
36
36
|
# hashes might not have the intended (or expected) order in pre-1.9 Ruby.
|
37
|
-
def at(what)
|
37
|
+
def at(what, &block)
|
38
38
|
return {} if empty?
|
39
39
|
|
40
|
-
key =
|
41
|
-
when ::Integer
|
42
|
-
keys[what]
|
43
|
-
else
|
44
|
-
block_given? ? keys.send(*what) { |*a| yield(*a) } : keys.send(*what)
|
45
|
-
end
|
40
|
+
key = what.is_a?(::Integer) ? keys[what] : keys.send(*what, &block)
|
46
41
|
|
47
42
|
{ key => self[key] }
|
48
43
|
end
|
@@ -72,16 +67,3 @@ class Hash
|
|
72
67
|
end
|
73
68
|
|
74
69
|
end
|
75
|
-
|
76
|
-
if $0 == __FILE__
|
77
|
-
h = { :a => 1, 2 => 3, nil => nil, 'foo' => %w[b a r]}
|
78
|
-
p h
|
79
|
-
|
80
|
-
p h.first
|
81
|
-
p h.last
|
82
|
-
p h.rand
|
83
|
-
|
84
|
-
p h.at(0)
|
85
|
-
p h.at(1)
|
86
|
-
p h.at(-1)
|
87
|
-
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
#--
|
2
|
+
###############################################################################
|
3
|
+
# #
|
4
|
+
# A component of ruby-nuggets, some extensions to the Ruby programming #
|
5
|
+
# language. #
|
6
|
+
# #
|
7
|
+
# Copyright (C) 2007-2014 Jens Wille #
|
8
|
+
# #
|
9
|
+
# Authors: #
|
10
|
+
# Jens Wille <jens.wille@gmail.com> #
|
11
|
+
# #
|
12
|
+
# ruby-nuggets is free software; you can redistribute it and/or modify it #
|
13
|
+
# under the terms of the GNU Affero General Public License as published by #
|
14
|
+
# the Free Software Foundation; either version 3 of the License, or (at your #
|
15
|
+
# option) any later version. #
|
16
|
+
# #
|
17
|
+
# ruby-nuggets is distributed in the hope that it will be useful, but WITHOUT #
|
18
|
+
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or #
|
19
|
+
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License #
|
20
|
+
# for more details. #
|
21
|
+
# #
|
22
|
+
# You should have received a copy of the GNU Affero General Public License #
|
23
|
+
# along with ruby-nuggets. If not, see <http://www.gnu.org/licenses/>. #
|
24
|
+
# #
|
25
|
+
###############################################################################
|
26
|
+
#++
|
27
|
+
|
28
|
+
module Nuggets
|
29
|
+
class Hash
|
30
|
+
module DeepFetchMixin
|
31
|
+
|
32
|
+
# call-seq:
|
33
|
+
# hash.deep_fetch(path[, separator]) => anObject
|
34
|
+
# hash.deep_fetch(path[, separator]) { |key| ... } => anObject
|
35
|
+
#
|
36
|
+
# Recursively fetches keys in +path+, separated by +separator+
|
37
|
+
# if +path+ is not an array, from _hash_. Maps each individual
|
38
|
+
# key according to the block if provided.
|
39
|
+
#
|
40
|
+
# Examples:
|
41
|
+
#
|
42
|
+
# hash = { 'foo' => { 'bar' => { 'baz' => 42 }, 'bay' => 23 } }
|
43
|
+
# hash.deep_fetch('foo/bar/baz') #=> 42
|
44
|
+
# hash.deep_fetch('foo/bar/bax') #=> nil
|
45
|
+
# hash.deep_fetch('foo/bax/baz') #=> KeyError
|
46
|
+
# hash.deep_fetch('foo/bay/baz') #=> TypeError
|
47
|
+
# hash % 'foo/bar/baz' #=> 42
|
48
|
+
# hash % %w[foo bar baz] #=> 42
|
49
|
+
#
|
50
|
+
# hash = { foo: { bar: { baz: 42 } } }
|
51
|
+
# hash.deep_fetch('foo/bar/baz', &:to_sym) #=> 42
|
52
|
+
# hash % [:foo, :bar, :baz] #=> 42
|
53
|
+
def deep_fetch(path, separator = '/')
|
54
|
+
keys = path.is_a?(::Array) ? path : path.split(separator)
|
55
|
+
raise ::ArgumentError, 'no keys given' if keys.empty?
|
56
|
+
|
57
|
+
hash, klass = self, self.class
|
58
|
+
|
59
|
+
loop {
|
60
|
+
key = keys.shift
|
61
|
+
key = yield key if block_given?
|
62
|
+
|
63
|
+
return hash[key] if keys.empty?
|
64
|
+
|
65
|
+
unless (hash = hash.fetch(key)).is_a?(klass)
|
66
|
+
raise ::TypeError, '%p: %s expected, got %s' % [key, klass, hash.class]
|
67
|
+
end
|
68
|
+
}
|
69
|
+
end
|
70
|
+
|
71
|
+
alias_method :%, :deep_fetch
|
72
|
+
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
data/lib/nuggets/hash/insert.rb
CHANGED
@@ -47,19 +47,8 @@ class Hash
|
|
47
47
|
# hash.insert!(other) { |key, old_value, new_value| ... } => hash
|
48
48
|
#
|
49
49
|
# Destructive version of #insert.
|
50
|
-
def insert!(other)
|
51
|
-
replace
|
50
|
+
def insert!(other, &block)
|
51
|
+
replace(insert(other, &block))
|
52
52
|
end
|
53
53
|
|
54
54
|
end
|
55
|
-
|
56
|
-
if $0 == __FILE__
|
57
|
-
h = { :a => 0, :b => { :b1 => 1, :b2 => 2 } }
|
58
|
-
p h
|
59
|
-
|
60
|
-
p h.insert(:a => -1)
|
61
|
-
p h.insert(:b => { :b3 => 3 })
|
62
|
-
|
63
|
-
h.insert!(:b => { :b0 => 0 })
|
64
|
-
p h
|
65
|
-
end
|
data/lib/nuggets/hash/only.rb
CHANGED
@@ -36,9 +36,8 @@ class Hash
|
|
36
36
|
# Returns the only key/value pair of _hash_. Raises an IndexError if _hash_'s
|
37
37
|
# size is not 1, unless parameter +true+ is passed.
|
38
38
|
def only(relax = size == 1, split = false)
|
39
|
-
|
40
|
-
|
41
|
-
split ? Array(*first) : first
|
39
|
+
relax ? split ? Array(*first) : first :
|
40
|
+
raise(::IndexError, 'not a single-element hash')
|
42
41
|
end
|
43
42
|
|
44
43
|
# call-seq:
|
@@ -52,18 +51,3 @@ class Hash
|
|
52
51
|
end
|
53
52
|
|
54
53
|
end
|
55
|
-
|
56
|
-
if $0 == __FILE__
|
57
|
-
[{ :a => 5 }, { 1 => 2, 3 => 4 }, {}].each { |h|
|
58
|
-
p h
|
59
|
-
|
60
|
-
begin
|
61
|
-
p h.only
|
62
|
-
p h.only_pair
|
63
|
-
rescue ::IndexError => err
|
64
|
-
warn err
|
65
|
-
end
|
66
|
-
|
67
|
-
p h.only(true)
|
68
|
-
}
|
69
|
-
end
|
data/lib/nuggets/i18n.rb
CHANGED
@@ -136,7 +136,7 @@ class String
|
|
136
136
|
# But:
|
137
137
|
# 'SÖS' => 'SOES' (not 'SOeS'!)
|
138
138
|
if s.length > 1
|
139
|
-
t = $'[0
|
139
|
+
t = $'[0, 1]
|
140
140
|
s[1..-1] = s[1..-1].downcase if t == t.downcase
|
141
141
|
end
|
142
142
|
|
@@ -154,12 +154,3 @@ class String
|
|
154
154
|
end
|
155
155
|
|
156
156
|
end
|
157
|
-
|
158
|
-
if $0 == __FILE__
|
159
|
-
s = 'Äh, Rüby iß sö cüül, nö? SÖS!'
|
160
|
-
p s
|
161
|
-
p s.replace_diacritics
|
162
|
-
|
163
|
-
s.replace_diacritics!
|
164
|
-
p s
|
165
|
-
end
|