backports 3.6.0 → 3.6.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.
- 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
|