backports 3.6.0 → 3.6.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Gemfile +1 -0
- data/Gemfile.lock +3 -1
- data/README.rdoc +6 -2
- data/backports.gemspec +1 -1
- data/lib/backports/1.8.7.rb +1 -0
- data/lib/backports/1.8.7/argf.rb +1 -1
- data/lib/backports/1.8.7/argf/each.rb +1 -1
- data/lib/backports/1.8.7/argf/each_byte.rb +1 -1
- data/lib/backports/1.8.7/argf/each_char.rb +1 -1
- data/lib/backports/1.8.7/argf/each_line.rb +1 -1
- data/lib/backports/1.8.7/argf/getbyte.rb +1 -1
- data/lib/backports/1.8.7/argf/readbyte.rb +1 -1
- data/lib/backports/1.8.7/array.rb +1 -1
- data/lib/backports/1.8.7/array/collect.rb +1 -1
- data/lib/backports/1.8.7/array/combination.rb +1 -1
- data/lib/backports/1.8.7/array/cycle.rb +1 -1
- data/lib/backports/1.8.7/array/delete_if.rb +1 -1
- data/lib/backports/1.8.7/array/each.rb +1 -1
- data/lib/backports/1.8.7/array/each_index.rb +1 -1
- data/lib/backports/1.8.7/array/flatten.rb +2 -1
- data/lib/backports/1.8.7/array/index.rb +1 -1
- data/lib/backports/1.8.7/array/map.rb +1 -1
- data/lib/backports/1.8.7/array/permutation.rb +1 -1
- data/lib/backports/1.8.7/array/pop.rb +2 -1
- data/lib/backports/1.8.7/array/product.rb +1 -1
- data/lib/backports/1.8.7/array/reject.rb +1 -1
- data/lib/backports/1.8.7/array/reverse_each.rb +1 -1
- data/lib/backports/1.8.7/array/rindex.rb +1 -1
- data/lib/backports/1.8.7/array/select.rb +1 -1
- data/lib/backports/1.8.7/array/shift.rb +2 -1
- data/lib/backports/1.8.7/binding.rb +1 -1
- data/lib/backports/1.8.7/dir.rb +1 -1
- data/lib/backports/1.8.7/dir/each.rb +1 -1
- data/lib/backports/1.8.7/enumerable.rb +1 -1
- data/lib/backports/1.8.7/enumerable/count.rb +1 -1
- data/lib/backports/1.8.7/enumerable/cycle.rb +1 -1
- data/lib/backports/1.8.7/enumerable/detect.rb +1 -1
- data/lib/backports/1.8.7/enumerable/drop.rb +1 -1
- data/lib/backports/1.8.7/enumerable/each_cons.rb +1 -1
- data/lib/backports/1.8.7/enumerable/each_slice.rb +1 -1
- data/lib/backports/1.8.7/enumerable/each_with_index.rb +1 -1
- data/lib/backports/1.8.7/enumerable/entries.rb +1 -1
- data/lib/backports/1.8.7/enumerable/find.rb +1 -1
- data/lib/backports/1.8.7/enumerable/find_all.rb +1 -1
- data/lib/backports/1.8.7/enumerable/find_index.rb +1 -1
- data/lib/backports/1.8.7/enumerable/first.rb +1 -1
- data/lib/backports/1.8.7/enumerable/inject.rb +2 -1
- data/lib/backports/1.8.7/enumerable/max_by.rb +1 -1
- data/lib/backports/1.8.7/enumerable/min_by.rb +1 -1
- data/lib/backports/1.8.7/enumerable/minmax.rb +1 -1
- data/lib/backports/1.8.7/enumerable/minmax_by.rb +1 -1
- data/lib/backports/1.8.7/enumerable/partition.rb +1 -1
- data/lib/backports/1.8.7/enumerable/reject.rb +1 -1
- data/lib/backports/1.8.7/enumerable/select.rb +1 -1
- data/lib/backports/1.8.7/enumerable/sort_by.rb +1 -1
- data/lib/backports/1.8.7/enumerable/to_a.rb +1 -1
- data/lib/backports/1.8.7/enumerator.rb +1 -1
- data/lib/backports/1.8.7/enumerator/each.rb +1 -1
- data/lib/backports/1.8.7/env.rb +1 -1
- data/lib/backports/1.8.7/env/delete_if.rb +1 -1
- data/lib/backports/1.8.7/env/each.rb +1 -1
- data/lib/backports/1.8.7/env/each_key.rb +1 -1
- data/lib/backports/1.8.7/env/each_pair.rb +1 -1
- data/lib/backports/1.8.7/env/each_value.rb +1 -1
- data/lib/backports/1.8.7/env/reject.rb +1 -1
- data/lib/backports/1.8.7/env/select.rb +1 -1
- data/lib/backports/1.8.7/fixnum.rb +1 -1
- data/lib/backports/1.8.7/float.rb +1 -1
- data/lib/backports/1.8.7/gc.rb +1 -1
- data/lib/backports/1.8.7/hash.rb +1 -1
- data/lib/backports/1.8.7/hash/constructor.rb +1 -1
- data/lib/backports/1.8.7/hash/delete_if.rb +1 -1
- data/lib/backports/1.8.7/hash/each.rb +1 -1
- data/lib/backports/1.8.7/hash/each_key.rb +1 -1
- data/lib/backports/1.8.7/hash/each_pair.rb +1 -1
- data/lib/backports/1.8.7/hash/each_value.rb +1 -1
- data/lib/backports/1.8.7/hash/reject.rb +1 -1
- data/lib/backports/1.8.7/hash/select.rb +1 -1
- data/lib/backports/1.8.7/integer.rb +1 -1
- data/lib/backports/1.8.7/integer/downto.rb +1 -1
- data/lib/backports/1.8.7/integer/times.rb +1 -1
- data/lib/backports/1.8.7/integer/upto.rb +1 -1
- data/lib/backports/1.8.7/io.rb +1 -1
- data/lib/backports/1.8.7/io/each.rb +1 -1
- data/lib/backports/1.8.7/io/each_byte.rb +1 -1
- data/lib/backports/1.8.7/io/each_line.rb +1 -1
- data/lib/backports/1.8.7/io/foreach.rb +1 -1
- data/lib/backports/1.8.7/io/getbyte.rb +1 -1
- data/lib/backports/1.8.7/io/readbyte.rb +1 -1
- data/lib/backports/1.8.7/kernel.rb +1 -1
- data/lib/backports/1.8.7/method.rb +1 -1
- data/lib/backports/1.8.7/method/name.rb +1 -1
- data/lib/backports/1.8.7/module.rb +1 -1
- data/lib/backports/1.8.7/module/module_exec.rb +1 -1
- data/lib/backports/1.8.7/numeric.rb +1 -1
- data/lib/backports/1.8.7/numeric/step.rb +1 -1
- data/lib/backports/1.8.7/object_space.rb +1 -1
- data/lib/backports/1.8.7/object_space/each_object.rb +1 -1
- data/lib/backports/1.8.7/process.rb +1 -1
- data/lib/backports/1.8.7/range.rb +1 -1
- data/lib/backports/1.8.7/range/each.rb +1 -1
- data/lib/backports/1.8.7/range/step.rb +1 -1
- data/lib/backports/1.8.7/regexp.rb +1 -1
- data/lib/backports/1.8.7/regexp/union.rb +1 -1
- data/lib/backports/1.8.7/stop_iteration.rb +2 -2
- data/lib/backports/1.8.7/string.rb +1 -1
- data/lib/backports/1.8.7/string/bytesize.rb +1 -1
- data/lib/backports/1.8.7/string/each.rb +1 -1
- data/lib/backports/1.8.7/string/each_byte.rb +1 -1
- data/lib/backports/1.8.7/string/each_char.rb +1 -1
- data/lib/backports/1.8.7/string/each_line.rb +1 -1
- data/lib/backports/1.8.7/string/partition.rb +2 -1
- data/lib/backports/1.8.7/string/rpartition.rb +1 -1
- data/lib/backports/1.8.7/string/upto.rb +1 -1
- data/lib/backports/1.8.7/struct.rb +1 -1
- data/lib/backports/1.8.7/struct/each.rb +1 -1
- data/lib/backports/1.8.7/struct/each_pair.rb +1 -1
- data/lib/backports/1.8.7/symbol.rb +1 -1
- data/lib/backports/1.9.1/array.rb +1 -1
- data/lib/backports/1.9.1/array/sample.rb +1 -1
- data/lib/backports/1.9.1/array/try_convert.rb +1 -1
- data/lib/backports/1.9.1/dir.rb +1 -1
- data/lib/backports/1.9.1/dir/to_path.rb +1 -1
- data/lib/backports/1.9.1/enumerable.rb +1 -1
- data/lib/backports/1.9.1/enumerable/each_with_index.rb +1 -1
- data/lib/backports/1.9.1/enumerator.rb +1 -1
- data/lib/backports/1.9.1/enumerator/new.rb +1 -1
- data/lib/backports/1.9.1/enumerator/with_object.rb +1 -1
- data/lib/backports/1.9.1/env.rb +1 -1
- data/lib/backports/1.9.1/env/key.rb +1 -1
- data/lib/backports/1.9.1/file.rb +1 -1
- data/lib/backports/1.9.1/file/atime.rb +1 -1
- data/lib/backports/1.9.1/file/basename.rb +1 -1
- data/lib/backports/1.9.1/file/blockdev.rb +1 -1
- data/lib/backports/1.9.1/file/chardev.rb +1 -1
- data/lib/backports/1.9.1/file/chmod.rb +1 -1
- data/lib/backports/1.9.1/file/chown.rb +1 -1
- data/lib/backports/1.9.1/file/ctime.rb +1 -1
- data/lib/backports/1.9.1/file/delete.rb +1 -1
- data/lib/backports/1.9.1/file/directory.rb +1 -1
- data/lib/backports/1.9.1/file/dirname.rb +1 -1
- data/lib/backports/1.9.1/file/executable.rb +1 -1
- data/lib/backports/1.9.1/file/executable_real.rb +1 -1
- data/lib/backports/1.9.1/file/exist.rb +1 -1
- data/lib/backports/1.9.1/file/exists.rb +1 -1
- data/lib/backports/1.9.1/file/expand_path.rb +1 -1
- data/lib/backports/1.9.1/file/extname.rb +1 -1
- data/lib/backports/1.9.1/file/file.rb +1 -1
- data/lib/backports/1.9.1/file/ftype.rb +1 -1
- data/lib/backports/1.9.1/file/grpowned.rb +1 -1
- data/lib/backports/1.9.1/file/join.rb +1 -1
- data/lib/backports/1.9.1/file/lchmod.rb +1 -1
- data/lib/backports/1.9.1/file/lchown.rb +1 -1
- data/lib/backports/1.9.1/file/link.rb +1 -1
- data/lib/backports/1.9.1/file/lstat.rb +1 -1
- data/lib/backports/1.9.1/file/mtime.rb +1 -1
- data/lib/backports/1.9.1/file/new.rb +1 -1
- data/lib/backports/1.9.1/file/open.rb +3 -2
- data/lib/backports/1.9.1/file/owned.rb +1 -1
- data/lib/backports/1.9.1/file/pipe.rb +1 -1
- data/lib/backports/1.9.1/file/readable.rb +1 -1
- data/lib/backports/1.9.1/file/readable_real.rb +1 -1
- data/lib/backports/1.9.1/file/readlink.rb +1 -1
- data/lib/backports/1.9.1/file/rename.rb +1 -1
- data/lib/backports/1.9.1/file/setgid.rb +1 -1
- data/lib/backports/1.9.1/file/setuid.rb +1 -1
- data/lib/backports/1.9.1/file/size.rb +1 -1
- data/lib/backports/1.9.1/file/socket.rb +1 -1
- data/lib/backports/1.9.1/file/split.rb +1 -1
- data/lib/backports/1.9.1/file/stat.rb +1 -1
- data/lib/backports/1.9.1/file/sticky.rb +1 -1
- data/lib/backports/1.9.1/file/symlink.rb +1 -1
- data/lib/backports/1.9.1/file/to_path.rb +1 -1
- data/lib/backports/1.9.1/file/truncate.rb +1 -1
- data/lib/backports/1.9.1/file/unlink.rb +1 -1
- data/lib/backports/1.9.1/file/writable.rb +1 -1
- data/lib/backports/1.9.1/file/writable_real.rb +1 -1
- data/lib/backports/1.9.1/file/zero.rb +1 -1
- data/lib/backports/1.9.1/float.rb +1 -1
- data/lib/backports/1.9.1/float/round.rb +2 -1
- data/lib/backports/1.9.1/hash.rb +1 -1
- data/lib/backports/1.9.1/hash/default_proc.rb +1 -1
- data/lib/backports/1.9.1/hash/key.rb +1 -1
- data/lib/backports/1.9.1/hash/try_convert.rb +1 -1
- data/lib/backports/1.9.1/integer.rb +1 -1
- data/lib/backports/1.9.1/integer/magnitude.rb +1 -1
- data/lib/backports/1.9.1/integer/round.rb +2 -1
- data/lib/backports/1.9.1/io.rb +1 -1
- data/lib/backports/1.9.1/io/binread.rb +1 -1
- data/lib/backports/1.9.1/io/open.rb +4 -2
- data/lib/backports/1.9.1/io/try_convert.rb +1 -1
- data/lib/backports/1.9.1/io/ungetbyte.rb +1 -1
- data/lib/backports/1.9.1/kernel.rb +1 -1
- data/lib/backports/1.9.1/kernel/require_relative.rb +1 -1
- data/lib/backports/1.9.1/math.rb +1 -1
- data/lib/backports/1.9.1/math/log.rb +2 -1
- data/lib/backports/1.9.1/numeric.rb +1 -1
- data/lib/backports/1.9.1/numeric/round.rb +2 -1
- data/lib/backports/1.9.1/proc.rb +1 -1
- data/lib/backports/1.9.1/proc/lambda.rb +1 -1
- data/lib/backports/1.9.1/proc/yield.rb +1 -1
- data/lib/backports/1.9.1/range.rb +1 -1
- data/lib/backports/1.9.1/range/cover.rb +1 -1
- data/lib/backports/1.9.1/regexp.rb +1 -1
- data/lib/backports/1.9.1/regexp/try_convert.rb +1 -1
- data/lib/backports/1.9.1/string.rb +1 -1
- data/lib/backports/1.9.1/string/each_codepoint.rb +1 -1
- data/lib/backports/1.9.1/string/getbyte.rb +1 -1
- data/lib/backports/1.9.1/string/setbyte.rb +1 -1
- data/lib/backports/1.9.1/string/try_convert.rb +1 -1
- data/lib/backports/1.9.1/symbol.rb +1 -1
- data/lib/backports/1.9.2/array.rb +1 -1
- data/lib/backports/1.9.2/array/product.rb +2 -1
- data/lib/backports/1.9.2/array/repeated_combination.rb +1 -1
- data/lib/backports/1.9.2/array/repeated_permutation.rb +1 -1
- data/lib/backports/1.9.2/array/rotate.rb +1 -1
- data/lib/backports/1.9.2/array/uniq.rb +2 -2
- data/lib/backports/1.9.2/complex.rb +1 -1
- data/lib/backports/1.9.2/dir.rb +1 -1
- data/lib/backports/1.9.2/enumerable.rb +1 -1
- data/lib/backports/1.9.2/enumerable/slice_before.rb +1 -1
- data/lib/backports/1.9.2/float.rb +1 -1
- data/lib/backports/1.9.2/hash.rb +1 -1
- data/lib/backports/1.9.2/kernel.rb +1 -1
- data/lib/backports/1.9.2/random.rb +1 -1
- data/lib/backports/1.9.3/file.rb +1 -1
- data/lib/backports/1.9.3/io.rb +1 -1
- data/lib/backports/1.9.3/io/advise.rb +1 -1
- data/lib/backports/1.9.3/io/binwrite.rb +1 -1
- data/lib/backports/1.9.3/io/write.rb +1 -1
- data/lib/backports/1.9.3/string.rb +1 -1
- data/lib/backports/1.9.3/string/byteslice.rb +1 -1
- data/lib/backports/1.9.3/string/prepend.rb +1 -1
- data/lib/backports/2.0.0/array.rb +1 -1
- data/lib/backports/2.0.0/enumerable.rb +1 -1
- data/lib/backports/2.0.0/enumerable/lazy.rb +1 -1
- data/lib/backports/2.0.0/enumerator.rb +1 -1
- data/lib/backports/2.0.0/env.rb +1 -1
- data/lib/backports/2.0.0/hash.rb +1 -1
- data/lib/backports/2.0.0/hash/default_proc.rb +1 -1
- data/lib/backports/2.0.0/nil.rb +1 -1
- data/lib/backports/2.0.0/range.rb +1 -1
- data/lib/backports/2.0.0/struct.rb +1 -1
- data/lib/backports/2.1.0/array.rb +1 -1
- data/lib/backports/2.1.0/bignum.rb +1 -1
- data/lib/backports/2.1.0/enumerable.rb +1 -1
- data/lib/backports/2.1.0/enumerable/to_h.rb +1 -1
- data/lib/backports/2.1.0/fixnum.rb +1 -1
- data/lib/backports/2.1.0/module.rb +1 -1
- data/lib/backports/force/enumerable_map.rb +1 -0
- data/lib/backports/force/hash_select.rb +1 -0
- data/lib/backports/random/MT19937.rb +78 -0
- data/lib/backports/random/bits_and_bytes.rb +93 -0
- data/lib/backports/random/implementation.rb +94 -0
- data/lib/backports/random/load.rb +17 -0
- data/lib/backports/std_lib.rb +24 -0
- data/lib/backports/tools.rb +2 -357
- data/lib/backports/tools/alias_method.rb +8 -0
- data/lib/backports/tools/alias_method_chain.rb +26 -0
- data/lib/backports/tools/arguments.rb +69 -0
- data/lib/backports/tools/extreme_object.rb +12 -0
- data/lib/backports/tools/io.rb +57 -0
- data/lib/backports/tools/make_block_optional.rb +43 -0
- data/lib/backports/tools/path.rb +55 -0
- data/lib/backports/tools/require_relative_dir.rb +13 -0
- data/lib/backports/tools/std_lib.rb +59 -0
- data/lib/backports/tools/suppress_verbose_warnings.rb +9 -0
- data/lib/backports/version.rb +1 -1
- data/spec/tags/1.8.7/core/module/include_spec.rb +3 -0
- metadata +45 -52
- data/lib/backports/extra/random/MT19937.rb +0 -76
- data/lib/backports/extra/random/bits_and_bytes.rb +0 -91
- data/lib/backports/extra/random/implementation.rb +0 -93
- data/lib/backports/extra/random/load.rb +0 -17
@@ -0,0 +1,8 @@
|
|
1
|
+
module Backports
|
2
|
+
# Safe alias_method that will only alias if the source exists and destination doesn't
|
3
|
+
def self.alias_method(mod, new_name, old_name)
|
4
|
+
mod.instance_eval do
|
5
|
+
alias_method new_name, old_name
|
6
|
+
end if mod.method_defined?(old_name) && !mod.method_defined?(new_name)
|
7
|
+
end
|
8
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Backports
|
2
|
+
# Modified to avoid polluting Module if so desired
|
3
|
+
# (from Rails)
|
4
|
+
def self.alias_method_chain(mod, target, feature)
|
5
|
+
mod.class_eval do
|
6
|
+
# Strip out punctuation on predicates or bang methods since
|
7
|
+
# e.g. target?_without_feature is not a valid method name.
|
8
|
+
aliased_target, punctuation = target.to_s.sub(/([?!=])$/, ''), $1
|
9
|
+
yield(aliased_target, punctuation) if block_given?
|
10
|
+
|
11
|
+
with_method, without_method = "#{aliased_target}_with_#{feature}#{punctuation}", "#{aliased_target}_without_#{feature}#{punctuation}"
|
12
|
+
|
13
|
+
alias_method without_method, target
|
14
|
+
alias_method target, with_method
|
15
|
+
|
16
|
+
case
|
17
|
+
when public_method_defined?(without_method)
|
18
|
+
public target
|
19
|
+
when protected_method_defined?(without_method)
|
20
|
+
protected target
|
21
|
+
when private_method_defined?(without_method)
|
22
|
+
private target
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
module Backports
|
2
|
+
# Helper method to coerce a value into a specific class.
|
3
|
+
# Raises a TypeError if the coercion fails or the returned value
|
4
|
+
# is not of the right class.
|
5
|
+
# (from Rubinius)
|
6
|
+
def self.coerce_to(obj, cls, meth)
|
7
|
+
return obj if obj.kind_of?(cls)
|
8
|
+
|
9
|
+
begin
|
10
|
+
ret = obj.__send__(meth)
|
11
|
+
rescue Exception => e
|
12
|
+
raise TypeError, "Coercion error: #{obj.inspect}.#{meth} => #{cls} failed:\n" \
|
13
|
+
"(#{e.message})"
|
14
|
+
end
|
15
|
+
raise TypeError, "Coercion error: obj.#{meth} did NOT return a #{cls} (was #{ret.class})" unless ret.kind_of? cls
|
16
|
+
ret
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.coerce_to_int(obj)
|
20
|
+
coerce_to(obj, Integer, :to_int)
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.coerce_to_ary(obj)
|
24
|
+
coerce_to(obj, Array, :to_ary)
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.coerce_to_str(obj)
|
28
|
+
coerce_to(obj, String, :to_str)
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.coerce_to_hash(obj)
|
32
|
+
coerce_to(obj, Hash, :to_hash)
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.coerce_to_options(obj, *options)
|
36
|
+
hash = coerce_to_hash(obj)
|
37
|
+
hash.values_at(*options)
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.coerce_to_option(obj, option)
|
41
|
+
coerce_to_options(obj, option)[0]
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.is_array?(obj)
|
45
|
+
coerce_to(obj, Array, :to_ary) if obj.respond_to? :to_ary
|
46
|
+
end
|
47
|
+
|
48
|
+
def self.try_convert(obj, cls, meth)
|
49
|
+
return obj if obj.kind_of?(cls)
|
50
|
+
return nil unless obj.respond_to?(meth)
|
51
|
+
ret = obj.__send__(meth)
|
52
|
+
raise TypeError, "Coercion error: obj.#{meth} did NOT return a #{cls} (was #{ret.class})" unless ret.nil? || ret.kind_of?(cls)
|
53
|
+
ret
|
54
|
+
end
|
55
|
+
|
56
|
+
# Checks for a failed comparison (in which case it throws an ArgumentError)
|
57
|
+
# Additionally, it maps any negative value to -1 and any positive value to +1
|
58
|
+
# (from Rubinius)
|
59
|
+
def self.coerce_to_comparison(a, b, cmp = (a <=> b))
|
60
|
+
raise ArgumentError, "comparison of #{a} with #{b} failed" if cmp.nil?
|
61
|
+
return 1 if cmp > 0
|
62
|
+
return -1 if cmp < 0
|
63
|
+
0
|
64
|
+
end
|
65
|
+
|
66
|
+
# Used internally to make it easy to deal with optional arguments
|
67
|
+
# (from Rubinius)
|
68
|
+
Undefined = Object.new
|
69
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'backports/tools/arguments'
|
2
|
+
module Backports
|
3
|
+
# Used internally to combine {IO|File} options hash into mode (String or Integer)
|
4
|
+
def self.combine_mode_and_option(mode = nil, options = Backports::Undefined)
|
5
|
+
# Can't backport autoclose, {internal|external|}encoding
|
6
|
+
mode, options = nil, mode if mode.respond_to?(:to_hash) && options == Backports::Undefined
|
7
|
+
options = {} if options == nil || options == Backports::Undefined
|
8
|
+
options = coerce_to_hash(options)
|
9
|
+
if mode && options[:mode]
|
10
|
+
raise ArgumentError, "mode specified twice"
|
11
|
+
end
|
12
|
+
mode ||= options[:mode] || "r"
|
13
|
+
mode = try_convert(mode, String, :to_str) || try_convert(mode, Integer, :to_int) || mode
|
14
|
+
if options[:textmode] || options[:binmode]
|
15
|
+
text = options[:textmode] || (mode.is_a?(String) && mode =~ /t/)
|
16
|
+
bin = options[:binmode] || (mode.is_a?(String) ? mode =~ /b/ : mode & File::Constants::BINARY != 0)
|
17
|
+
if text && bin
|
18
|
+
raise ArgumentError, "both textmode and binmode specified"
|
19
|
+
end
|
20
|
+
case
|
21
|
+
when !options[:binmode]
|
22
|
+
when mode.is_a?(String)
|
23
|
+
mode.insert(1, "b")
|
24
|
+
else
|
25
|
+
mode |= File::Constants::BINARY
|
26
|
+
end
|
27
|
+
end
|
28
|
+
mode
|
29
|
+
end
|
30
|
+
|
31
|
+
# Used internally to combine {IO|File} options hash into mode (String or Integer) and perm
|
32
|
+
def self.combine_mode_perm_and_option(mode = nil, perm = Backports::Undefined, options = Backports::Undefined)
|
33
|
+
mode, options = nil, mode if mode.respond_to?(:to_hash) && perm == Backports::Undefined
|
34
|
+
perm, options = nil, perm if perm.respond_to?(:to_hash) && options == Backports::Undefined
|
35
|
+
perm = nil if perm == Backports::Undefined
|
36
|
+
options = {} if options == Backports::Undefined
|
37
|
+
options = coerce_to_hash(options)
|
38
|
+
if perm && options[:perm]
|
39
|
+
raise ArgumentError, "perm specified twice"
|
40
|
+
end
|
41
|
+
[combine_mode_and_option(mode, options), perm || options[:perm]]
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.write(binary, filename, string, offset, options)
|
45
|
+
offset, options = nil, offset if offset.respond_to?(:to_hash) && options == Backports::Undefined
|
46
|
+
options = {} if options == Backports::Undefined
|
47
|
+
options = coerce_to_hash(options)
|
48
|
+
File.open(filename, 'a+'){} if offset # insure existence
|
49
|
+
options = {:mode => offset.nil? ? "w" : "r+"}.merge(options)
|
50
|
+
args = options[:open_args] || [options]
|
51
|
+
File.open(filename, *Backports.combine_mode_perm_and_option(*args)) do |f|
|
52
|
+
f.binmode if binary && f.respond_to?(:binmode)
|
53
|
+
f.seek(offset) unless offset.nil?
|
54
|
+
f.write(string)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'backports/tools/alias_method_chain'
|
2
|
+
|
3
|
+
module Backports
|
4
|
+
# Metaprogramming utility to make block optional.
|
5
|
+
# Tests first if block is already optional when given options
|
6
|
+
def self.make_block_optional(mod, *methods)
|
7
|
+
mod = class << mod; self; end unless mod.is_a? Module
|
8
|
+
options = methods.last.is_a?(Hash) ? methods.pop : {}
|
9
|
+
methods.each do |selector|
|
10
|
+
unless mod.method_defined? selector
|
11
|
+
warn "#{mod}##{selector} is not defined, so block can't be made optional"
|
12
|
+
next
|
13
|
+
end
|
14
|
+
unless options[:force]
|
15
|
+
# Check if needed
|
16
|
+
test_on = options.fetch(:test_on)
|
17
|
+
result = begin
|
18
|
+
test_on.send(selector, *options.fetch(:arg, []))
|
19
|
+
rescue LocalJumpError
|
20
|
+
false
|
21
|
+
end
|
22
|
+
next if result.class.name =~ /Enumerator$/
|
23
|
+
end
|
24
|
+
require 'enumerator'
|
25
|
+
arity = mod.instance_method(selector).arity
|
26
|
+
last_arg = []
|
27
|
+
if arity < 0
|
28
|
+
last_arg = ["*rest"]
|
29
|
+
arity = -1-arity
|
30
|
+
end
|
31
|
+
arg_sequence = ((0...arity).map{|i| "arg_#{i}"} + last_arg + ["&block"]).join(", ")
|
32
|
+
|
33
|
+
alias_method_chain(mod, selector, :optional_block) do |aliased_target, punctuation|
|
34
|
+
mod.module_eval <<-end_eval, __FILE__, __LINE__ + 1
|
35
|
+
def #{aliased_target}_with_optional_block#{punctuation}(#{arg_sequence})
|
36
|
+
return to_enum(:#{aliased_target}_without_optional_block#{punctuation}, #{arg_sequence}) unless block_given?
|
37
|
+
#{aliased_target}_without_optional_block#{punctuation}(#{arg_sequence})
|
38
|
+
end
|
39
|
+
end_eval
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'backports/tools/alias_method_chain'
|
2
|
+
require 'backports/tools/arguments'
|
3
|
+
|
4
|
+
module Backports
|
5
|
+
# Metaprogramming utility to convert the first file argument to path
|
6
|
+
def self.convert_first_argument_to_path(klass, selector)
|
7
|
+
mod = class << klass; self; end
|
8
|
+
unless mod.method_defined? selector
|
9
|
+
warn "#{mod}##{selector} is not defined, so argument can't converted to path"
|
10
|
+
return
|
11
|
+
end
|
12
|
+
arity = mod.instance_method(selector).arity
|
13
|
+
last_arg = []
|
14
|
+
if arity < 0
|
15
|
+
last_arg = ["*rest"]
|
16
|
+
arity = -1-arity
|
17
|
+
end
|
18
|
+
arg_sequence = (["file"] + (1...arity).map{|i| "arg_#{i}"} + last_arg + ["&block"]).join(", ")
|
19
|
+
|
20
|
+
alias_method_chain(mod, selector, :potential_path_argument) do |aliased_target, punctuation|
|
21
|
+
mod.module_eval <<-end_eval, __FILE__, __LINE__ + 1
|
22
|
+
def #{aliased_target}_with_potential_path_argument#{punctuation}(#{arg_sequence})
|
23
|
+
file = Backports.convert_path(file)
|
24
|
+
#{aliased_target}_without_potential_path_argument#{punctuation}(#{arg_sequence})
|
25
|
+
end
|
26
|
+
end_eval
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
# Metaprogramming utility to convert all file arguments to paths
|
31
|
+
def self.convert_all_arguments_to_path(klass, selector, skip)
|
32
|
+
mod = class << klass; self; end
|
33
|
+
unless mod.method_defined? selector
|
34
|
+
warn "#{mod}##{selector} is not defined, so arguments can't converted to path"
|
35
|
+
return
|
36
|
+
end
|
37
|
+
first_args = (1..skip).map{|i| "arg_#{i}"}.join(",") + (skip > 0 ? "," : "")
|
38
|
+
alias_method_chain(mod, selector, :potential_path_arguments) do |aliased_target, punctuation|
|
39
|
+
mod.module_eval <<-end_eval, __FILE__, __LINE__ + 1
|
40
|
+
def #{aliased_target}_with_potential_path_arguments#{punctuation}(#{first_args}*files, &block)
|
41
|
+
files = files.map{|f| Backports.convert_path(f) }
|
42
|
+
#{aliased_target}_without_potential_path_arguments#{punctuation}(#{first_args}*files, &block)
|
43
|
+
end
|
44
|
+
end_eval
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def self.convert_path(path)
|
49
|
+
try_convert(path, IO, :to_io) ||
|
50
|
+
begin
|
51
|
+
path = path.to_path if path.respond_to?(:to_path)
|
52
|
+
try_convert(path, String, :to_str) || path
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Backports
|
2
|
+
def self.require_relative_dir
|
3
|
+
dir = caller.first.split(/\.rb:\d/,2).first
|
4
|
+
short_path = dir[/.*(backports\/.*)/, 1] << '/'
|
5
|
+
Dir.entries(dir).
|
6
|
+
map{|f| Regexp.last_match(1) if /^(.*)\.rb$/ =~ f}.
|
7
|
+
compact.
|
8
|
+
sort.
|
9
|
+
each do |f|
|
10
|
+
require short_path + f
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
module Backports
|
2
|
+
module StdLib
|
3
|
+
class LoadedFeatures
|
4
|
+
if RUBY_VERSION >= "1.9"
|
5
|
+
# Full paths are recorded in $LOADED_FEATURES.
|
6
|
+
@@our_loads = {}
|
7
|
+
# Check loaded features for one that matches "#{any of the load path}/#{feature}"
|
8
|
+
def include?(feature)
|
9
|
+
return true if @@our_loads[feature]
|
10
|
+
# Assume backported features are Ruby libraries (i.e. not C)
|
11
|
+
@loaded ||= $LOADED_FEATURES.group_by{|p| File.basename(p, ".rb")}
|
12
|
+
if fullpaths = @loaded[File.basename(feature, ".rb")]
|
13
|
+
fullpaths.any?{|fullpath|
|
14
|
+
base_dir, = fullpath.partition("/#{feature}")
|
15
|
+
$LOAD_PATH.include?(base_dir)
|
16
|
+
}
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.mark_as_loaded(feature)
|
21
|
+
@@our_loads[feature] = true
|
22
|
+
# Nothing to do, the full path will be OK
|
23
|
+
end
|
24
|
+
|
25
|
+
else
|
26
|
+
# Requested features are recorded in $LOADED_FEATURES
|
27
|
+
def include?(feature)
|
28
|
+
# Assume backported features are Ruby libraries (i.e. not C)
|
29
|
+
$LOADED_FEATURES.include?("#{File.basename(feature, '.rb')}.rb")
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.mark_as_loaded(feature)
|
33
|
+
$LOADED_FEATURES << "#{File.basename(feature, '.rb')}.rb"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
class << self
|
39
|
+
attr_accessor :extended_lib
|
40
|
+
|
41
|
+
def extend_relative relative_dir="stdlib"
|
42
|
+
loaded = Backports::StdLib::LoadedFeatures.new
|
43
|
+
dir = File.expand_path(relative_dir, File.dirname(caller.first.split(/:\d/,2).first))
|
44
|
+
Dir.entries(dir).
|
45
|
+
map{|f| Regexp.last_match(1) if /^(.*)\.rb$/ =~ f}.
|
46
|
+
compact.
|
47
|
+
each do |f|
|
48
|
+
path = File.expand_path(f, dir)
|
49
|
+
if loaded.include?(f)
|
50
|
+
require path
|
51
|
+
else
|
52
|
+
@extended_lib[f] << path
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
self.extended_lib ||= Hash.new{|h, k| h[k] = []}
|
58
|
+
end
|
59
|
+
end
|
data/lib/backports/version.rb
CHANGED
metadata
CHANGED
@@ -1,38 +1,28 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: backports
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
6
|
-
segments:
|
7
|
-
- 3
|
8
|
-
- 6
|
9
|
-
- 0
|
10
|
-
version: 3.6.0
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 3.6.1
|
11
5
|
platform: ruby
|
12
|
-
authors:
|
13
|
-
-
|
6
|
+
authors:
|
7
|
+
- Marc-André Lafortune
|
14
8
|
autorequire:
|
15
9
|
bindir: bin
|
16
10
|
cert_chain: []
|
17
|
-
|
18
|
-
date: 2014-02-15 00:00:00 Z
|
11
|
+
date: 2014-09-20 00:00:00.000000000 Z
|
19
12
|
dependencies: []
|
20
|
-
|
21
|
-
|
22
|
-
email:
|
13
|
+
description: Essential backports that enable many of the nice features of Ruby 1.8.7
|
14
|
+
up to 2.1.0 for earlier versions.
|
15
|
+
email:
|
23
16
|
- github@marc-andre.ca
|
24
17
|
executables: []
|
25
|
-
|
26
18
|
extensions: []
|
27
|
-
|
28
19
|
extra_rdoc_files: []
|
29
|
-
|
30
|
-
|
31
|
-
- .
|
32
|
-
- .
|
33
|
-
- .
|
34
|
-
- .
|
35
|
-
- .travis.yml
|
20
|
+
files:
|
21
|
+
- ".document"
|
22
|
+
- ".gitignore"
|
23
|
+
- ".gitmodules"
|
24
|
+
- ".irbrc"
|
25
|
+
- ".travis.yml"
|
36
26
|
- CHANGELOG.rdoc
|
37
27
|
- Gemfile
|
38
28
|
- Gemfile.lock
|
@@ -410,10 +400,6 @@ files:
|
|
410
400
|
- lib/backports/2.1.0/module/include.rb
|
411
401
|
- lib/backports/2.1.rb
|
412
402
|
- lib/backports/basic_object.rb
|
413
|
-
- lib/backports/extra/random/MT19937.rb
|
414
|
-
- lib/backports/extra/random/bits_and_bytes.rb
|
415
|
-
- lib/backports/extra/random/implementation.rb
|
416
|
-
- lib/backports/extra/random/load.rb
|
417
403
|
- lib/backports/force/array_map.rb
|
418
404
|
- lib/backports/force/enumerable_map.rb
|
419
405
|
- lib/backports/force/hash_select.rb
|
@@ -426,7 +412,22 @@ files:
|
|
426
412
|
- lib/backports/rails/kernel.rb
|
427
413
|
- lib/backports/rails/module.rb
|
428
414
|
- lib/backports/rails/string.rb
|
415
|
+
- lib/backports/random/MT19937.rb
|
416
|
+
- lib/backports/random/bits_and_bytes.rb
|
417
|
+
- lib/backports/random/implementation.rb
|
418
|
+
- lib/backports/random/load.rb
|
419
|
+
- lib/backports/std_lib.rb
|
429
420
|
- lib/backports/tools.rb
|
421
|
+
- lib/backports/tools/alias_method.rb
|
422
|
+
- lib/backports/tools/alias_method_chain.rb
|
423
|
+
- lib/backports/tools/arguments.rb
|
424
|
+
- lib/backports/tools/extreme_object.rb
|
425
|
+
- lib/backports/tools/io.rb
|
426
|
+
- lib/backports/tools/make_block_optional.rb
|
427
|
+
- lib/backports/tools/path.rb
|
428
|
+
- lib/backports/tools/require_relative_dir.rb
|
429
|
+
- lib/backports/tools/std_lib.rb
|
430
|
+
- lib/backports/tools/suppress_verbose_warnings.rb
|
430
431
|
- lib/backports/version.rb
|
431
432
|
- set_version/1.8.7.rb
|
432
433
|
- set_version/1.9.1.rb
|
@@ -525,6 +526,7 @@ files:
|
|
525
526
|
- spec/tags/1.8.7/core/kernel/require_relative_spec.rb
|
526
527
|
- spec/tags/1.8.7/core/math/log2_spec.rb
|
527
528
|
- spec/tags/1.8.7/core/math/log_spec.rb
|
529
|
+
- spec/tags/1.8.7/core/module/include_spec.rb
|
528
530
|
- spec/tags/1.8.7/core/proc/curry_spec.rb
|
529
531
|
- spec/tags/1.8.7/core/proc/yield_spec.rb
|
530
532
|
- spec/tags/1.8.7/core/range/size_spec.rb
|
@@ -551,38 +553,28 @@ files:
|
|
551
553
|
- test/test_helper.rb
|
552
554
|
homepage: http://github.com/marcandre/backports
|
553
555
|
licenses: []
|
554
|
-
|
556
|
+
metadata: {}
|
555
557
|
post_install_message:
|
556
558
|
rdoc_options: []
|
557
|
-
|
558
|
-
require_paths:
|
559
|
+
require_paths:
|
559
560
|
- lib
|
560
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
561
|
-
|
562
|
-
requirements:
|
561
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
562
|
+
requirements:
|
563
563
|
- - ">="
|
564
|
-
- !ruby/object:Gem::Version
|
565
|
-
|
566
|
-
|
567
|
-
|
568
|
-
version: "0"
|
569
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
570
|
-
none: false
|
571
|
-
requirements:
|
564
|
+
- !ruby/object:Gem::Version
|
565
|
+
version: '0'
|
566
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
567
|
+
requirements:
|
572
568
|
- - ">="
|
573
|
-
- !ruby/object:Gem::Version
|
574
|
-
|
575
|
-
segments:
|
576
|
-
- 0
|
577
|
-
version: "0"
|
569
|
+
- !ruby/object:Gem::Version
|
570
|
+
version: '0'
|
578
571
|
requirements: []
|
579
|
-
|
580
572
|
rubyforge_project:
|
581
|
-
rubygems_version:
|
573
|
+
rubygems_version: 2.2.2
|
582
574
|
signing_key:
|
583
|
-
specification_version:
|
575
|
+
specification_version: 4
|
584
576
|
summary: Backports of Ruby features for older Ruby.
|
585
|
-
test_files:
|
577
|
+
test_files:
|
586
578
|
- spec/tags/1.8.6/core/argf/each_line_spec.rb
|
587
579
|
- spec/tags/1.8.6/core/argf/each_spec.rb
|
588
580
|
- spec/tags/1.8.6/core/argf/lines_spec.rb
|
@@ -673,6 +665,7 @@ test_files:
|
|
673
665
|
- spec/tags/1.8.7/core/kernel/require_relative_spec.rb
|
674
666
|
- spec/tags/1.8.7/core/math/log2_spec.rb
|
675
667
|
- spec/tags/1.8.7/core/math/log_spec.rb
|
668
|
+
- spec/tags/1.8.7/core/module/include_spec.rb
|
676
669
|
- spec/tags/1.8.7/core/proc/curry_spec.rb
|
677
670
|
- spec/tags/1.8.7/core/proc/yield_spec.rb
|
678
671
|
- spec/tags/1.8.7/core/range/size_spec.rb
|