facets 3.0.0 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.index +11 -7
- data/CONTRIBUTING.md +112 -0
- data/HISTORY.md +38 -0
- data/{README.rdoc → README.md} +59 -59
- data/demo/core/array/after.md +13 -0
- data/demo/core/array/arrange.md +17 -0
- data/demo/core/array/before.md +14 -0
- data/demo/core/array/collapse.md +15 -0
- data/demo/core/array/collisions.md +30 -0
- data/demo/core/array/commonality.md +31 -0
- data/demo/core/array/conjoin.md +47 -0
- data/demo/core/array/contains.md +9 -0
- data/demo/core/array/delete_unless.md +13 -0
- data/demo/core/array/delete_values.md +10 -0
- data/demo/core/array/delete_values_at.md +15 -0
- data/demo/core/array/divide.md +14 -0
- data/demo/core/array/duplicates.md +14 -0
- data/demo/core/array/each_overlap.md +12 -0
- data/demo/core/array/each_pair.md +13 -0
- data/demo/core/array/each_value.md +12 -0
- data/demo/core/array/entropy.md +13 -0
- data/demo/core/array/extract_options.md +13 -0
- data/demo/core/array/first.md +11 -0
- data/demo/core/array/from.md +11 -0
- data/demo/core/array/ideal_entropy.md +11 -0
- data/demo/core/array/intersection.md +11 -0
- data/demo/core/array/last.md +11 -0
- data/demo/core/array/median.md +23 -0
- data/demo/core/array/merge.md +15 -0
- data/demo/core/array/missing.md +10 -0
- data/demo/core/array/mode.md +9 -0
- data/demo/core/array/nonuniq.md +16 -0
- data/demo/core/array/not_empty.md +8 -0
- data/demo/core/array/occur.md +18 -0
- data/demo/core/array/occurrence.md +13 -0
- data/demo/core/array/only.md +9 -0
- data/demo/core/array/op_pow.md +10 -0
- data/demo/core/array/pad.md +28 -0
- data/demo/core/array/peek.md +10 -0
- data/demo/core/array/poke.md +15 -0
- data/demo/core/array/probability +8 -0
- data/demo/core/array/pull.md +10 -0
- data/demo/core/array/recurse.md +10 -0
- data/demo/core/array/recursively.md +20 -0
- data/demo/core/array/reject_values.md +10 -0
- data/demo/core/array/splice.md +14 -0
- data/demo/core/array/split.md +13 -0
- data/demo/core/array/squeeze.md +14 -0
- data/demo/core/array/step.md +16 -0
- data/demo/core/array/store.md +9 -0
- data/demo/core/array/thru.md +12 -0
- data/demo/core/array/to_h.md +11 -0
- data/demo/core/array/traverse.md +20 -0
- data/demo/core/array/uniq_by.md +16 -0
- data/demo/core/array/unique_permutation.md +14 -0
- data/demo/core/array/zip.md +8 -0
- data/demo/core/binding/caller.md +57 -0
- data/demo/core/binding/defined.md +10 -0
- data/demo/core/binding/opvars.md +16 -0
- data/demo/core/binding/self.md +6 -0
- data/demo/core/class/descendants.md +13 -0
- data/demo/core/class/to_proc.md +11 -0
- data/demo/core/comparable/at_least.md +11 -0
- data/demo/core/comparable/at_most.md +11 -0
- data/demo/core/comparable/bound.md +13 -0
- data/demo/core/comparable/cap.md +11 -0
- data/demo/core/comparable/clip.md +29 -0
- data/demo/core/comparable/cmp.md +18 -0
- data/demo/core/comparable/op_get.md +32 -0
- data/demo/core/dir/ascend.md +24 -0
- data/demo/core/dir/descend.md +16 -0
- data/demo/core/dir/multiglob.md +41 -0
- data/demo/core/dir/parent.md +6 -0
- data/demo/core/dir/recurse.md +41 -0
- data/demo/core/exception/detail.md +19 -0
- data/demo/core/{facets.rdoc → facets.md} +1 -1
- data/demo/core/filetest/root.md +13 -0
- data/demo/core/hash/recursively.md +21 -0
- data/demo/core/indexable.md +95 -0
- data/demo/core/integer/bitmask.md +46 -0
- data/demo/core/integer/{factorial.rdoc → factorial.md} +1 -1
- data/demo/core/integer/{length.rdoc → length.md} +1 -1
- data/demo/core/integer/{multiple.rdoc → multiple.md} +3 -1
- data/demo/core/integer/of.md +11 -0
- data/demo/core/integer/{ordinal.rdoc → ordinal.md} +3 -1
- data/demo/core/integer/{of.rdoc → times_collect.md} +2 -7
- data/demo/core/matchdata/match.md +7 -0
- data/demo/core/matchdata/matchset.md +7 -0
- data/demo/core/matchdata/matchtree.md +10 -0
- data/demo/core/module/cattr.md +43 -0
- data/demo/core/module/class_extend.md +64 -0
- data/demo/core/module/{class_inheritor.rdoc → class_inheritor.md} +2 -2
- data/demo/core/module/{copy_inheritor.rdoc → copy_inheritor.md} +4 -4
- data/demo/core/module/include_as.md +31 -0
- data/demo/core/module/method_space.md +24 -0
- data/demo/core/string/acronym.md +9 -0
- data/demo/core/string/{align.rdoc → align.md} +10 -10
- data/demo/core/string/ascii_only.md +37 -0
- data/demo/core/string/{bracket.rdoc → bracket.md} +10 -10
- data/demo/core/string/camelcase.md +47 -0
- data/demo/core/string/{capitalized.rdoc → capitalized.md} +9 -9
- data/demo/core/string/characters.md +11 -0
- data/demo/core/string/{cleanlines.rdoc → cleanlines.md} +3 -3
- data/demo/core/string/cleave.md +49 -0
- data/demo/core/string/compress_lines.md +22 -0
- data/demo/core/string/crypt.md +15 -0
- data/demo/core/string/divide.md +9 -0
- data/demo/core/string/each_word.md +11 -0
- data/demo/core/string/edit_distance.md +15 -0
- data/demo/core/string/exclude.md +15 -0
- data/demo/core/string/expand_tabs.md +69 -0
- data/demo/core/string/fold.md +14 -0
- data/demo/core/string/indent.md +65 -0
- data/demo/core/string/index_all.md +14 -0
- data/demo/core/string/interpolate.md +8 -0
- data/demo/core/string/lchomp.md +14 -0
- data/demo/core/string/line_wrap.md +7 -0
- data/demo/core/string/lowercase.md +12 -0
- data/demo/core/string/methodize.md +22 -0
- data/demo/core/string/modulize.md +22 -0
- data/demo/core/string/mscan.md +10 -0
- data/demo/core/string/natcmp.md +10 -0
- data/demo/core/string/nchar.md +9 -0
- data/demo/core/string/{newlines.rdoc → newlines.md} +3 -3
- data/demo/core/string/number.md +27 -0
- data/demo/core/string/op_div.md +10 -0
- data/demo/core/string/op_sub.md +7 -0
- data/demo/core/string/pathize.md +22 -0
- data/demo/core/string/quote.md +20 -0
- data/demo/core/string/random.md +25 -0
- data/demo/core/string/range.md +19 -0
- data/demo/core/string/remove.md +33 -0
- data/demo/core/string/rewrite.md +9 -0
- data/demo/core/string/shatter.md +9 -0
- data/demo/core/string/similarity.md +12 -0
- data/demo/core/string/snakecase.md +14 -0
- data/demo/core/string/splice.md +28 -0
- data/demo/core/string/squish.md +27 -0
- data/demo/core/string/store.md +10 -0
- data/demo/core/string/subtract.md +8 -0
- data/demo/core/string/titlecase.md +8 -0
- data/demo/core/string/to_re.md +22 -0
- data/demo/core/string/{margin.rdoc → trim.md} +14 -14
- data/demo/core/string/unbracket.md +24 -0
- data/demo/core/string/underscore.md +17 -0
- data/demo/core/string/unfold.md +9 -0
- data/demo/core/string/unindent.md +65 -0
- data/demo/core/string/unquote.md +6 -0
- data/demo/core/string/uppercase.md +15 -0
- data/demo/core/string/variablize.md +7 -0
- data/demo/core/string/word_wrap.md +54 -0
- data/demo/core/string/words.md +13 -0
- data/demo/core/string/xor.md +8 -0
- data/lib/core/facets.yml +11 -7
- data/lib/core/facets/array.rb +1 -0
- data/lib/core/facets/array/average.rb +16 -0
- data/lib/core/facets/array/collapse.rb +4 -0
- data/lib/core/facets/array/delete_values_at.rb +1 -0
- data/lib/core/facets/array/divide.rb +7 -0
- data/lib/core/facets/array/duplicates.rb +2 -0
- data/lib/core/facets/array/each_pair.rb +1 -4
- data/lib/core/facets/array/first.rb +1 -0
- data/lib/core/facets/array/from.rb +11 -16
- data/lib/core/facets/array/intersection.rb +1 -1
- data/lib/core/facets/array/last.rb +1 -0
- data/lib/core/facets/array/mode.rb +2 -2
- data/lib/core/facets/array/occurrence.rb +4 -3
- data/lib/core/facets/array/op_pow.rb +0 -2
- data/lib/core/facets/array/probability.rb +1 -1
- data/lib/core/facets/array/recursively.rb +2 -2
- data/lib/core/facets/array/splice.rb +1 -1
- data/lib/core/facets/array/standard_deviation.rb +23 -0
- data/lib/core/facets/array/to_h.rb +0 -3
- data/lib/core/facets/array/uniq_by.rb +4 -0
- data/lib/core/facets/array/variance.rb +20 -0
- data/lib/core/facets/binding.rb +0 -1
- data/lib/core/facets/enumerable/cluster.rb +6 -4
- data/lib/core/facets/enumerable/hashify.rb +27 -31
- data/lib/core/facets/enumerable/sum.rb +12 -2
- data/lib/core/facets/file/atomic_open.rb +1 -1
- data/lib/core/facets/hash/except.rb +13 -1
- data/lib/core/facets/indexable.rb +1 -1
- data/lib/core/facets/kernel/ergo.rb +3 -3
- data/lib/core/facets/kernel/like.rb +1 -1
- data/lib/core/facets/matchdata/matchtree.rb +2 -0
- data/lib/core/facets/numeric/delimit.rb +20 -0
- data/lib/core/facets/range/nudge.rb +29 -0
- data/lib/core/facets/string.rb +0 -2
- data/lib/core/facets/string/indent.rb +0 -8
- data/lib/core/facets/string/margin.rb +0 -4
- data/lib/core/facets/string/random.rb +13 -3
- data/lib/core/facets/string/similarity.rb +7 -6
- data/lib/standard/facets/enumargs.rb +5 -0
- data/lib/standard/facets/math/percentile.rb +1 -1
- data/lib/standard/facets/net/http.rb +33 -14
- data/lib/standard/facets/timer.rb +3 -3
- data/test/core/array/test_average.rb +16 -0
- data/test/core/array/test_before.rb +21 -0
- data/test/core/array/test_collapse.rb +10 -1
- data/test/core/array/test_delete_unless.rb +17 -0
- data/test/core/array/test_delete_values.rb +31 -0
- data/test/core/array/test_divide.rb +10 -0
- data/test/core/array/test_each_pair.rb +16 -0
- data/test/core/array/test_each_value.rb +16 -0
- data/test/core/array/test_from.rb +42 -0
- data/test/core/array/test_op_pow.rb +13 -0
- data/test/core/array/test_standard_deviation.rb +18 -0
- data/test/core/array/test_to_h.rb +14 -0
- data/test/core/array/test_uniq_by.rb +7 -0
- data/test/core/array/test_variance.rb +17 -0
- data/test/core/array/test_zip.rb +13 -0
- data/test/core/dir/test_each_child.rb +1 -1
- data/test/core/dir/test_multiglob.rb +1 -1
- data/test/core/enumerable/test_cluster.rb +36 -0
- data/test/core/enumerable/test_hashify.rb +113 -0
- data/test/core/hash/test_expect.rb +11 -1
- data/test/core/kernel/test_ergo.rb +7 -5
- data/test/core/{object/test_replace.rb → kernel/test_instance_replace.rb} +6 -28
- data/test/core/numeric/test_delimit.rb +68 -0
- data/test/core/numeric/{test_round.rb → test_round_to.rb} +27 -27
- data/test/core/range/test_nudge.rb +32 -0
- data/test/core/range/{test_to_r.rb → test_to_rng.rb} +3 -3
- data/test/core/string/test_acronym.rb +14 -0
- data/test/core/string/test_ascii_only.rb +21 -0
- data/test/core/string/test_compress_lines.rb +9 -0
- data/test/core/string/test_crypt.rb +17 -0
- data/test/core/string/test_index_all.rb +4 -0
- data/test/core/string/test_random.rb +25 -0
- data/test/core/string/test_remove.rb +14 -0
- data/test/core/string/test_similarity.rb +9 -1
- data/test/core/struct/test_replace.rb +18 -0
- data/test/standard/test_enumargs.rb +26 -10
- data/test/standard/test_timer.rb +1 -1
- metadata +634 -588
- data/CONTRIBUTE.md +0 -78
- data/demo/core/array/combination.rdoc +0 -19
- data/demo/core/array/delete.rdoc +0 -23
- data/demo/core/array/index.rdoc +0 -14
- data/demo/core/array/merge.rdoc +0 -15
- data/demo/core/array/only.rdoc +0 -9
- data/demo/core/array/pad.rdoc +0 -28
- data/demo/core/array/permutation.rdoc +0 -10
- data/demo/core/array/product.rdoc +0 -26
- data/demo/core/array/recursively.rdoc +0 -16
- data/demo/core/array/rotate.rdoc +0 -30
- data/demo/core/array/select.rdoc +0 -8
- data/demo/core/array/uniq_by.rdoc +0 -9
- data/demo/core/binding/caller.rdoc +0 -57
- data/demo/core/binding/defined.rdoc +0 -10
- data/demo/core/binding/eval.rdoc +0 -8
- data/demo/core/binding/local_variables.rdoc +0 -26
- data/demo/core/binding/opvars.rdoc +0 -16
- data/demo/core/binding/self.rdoc +0 -6
- data/demo/core/class/descendants.rdoc +0 -10
- data/demo/core/class/to_proc.rdoc +0 -8
- data/demo/core/comparable/cap.rdoc +0 -20
- data/demo/core/comparable/clip.rdoc +0 -37
- data/demo/core/comparable/cmp.rdoc +0 -18
- data/demo/core/comparable/op_get.rdoc +0 -29
- data/demo/core/dir/ascend.rdoc +0 -24
- data/demo/core/dir/descend.rdoc +0 -14
- data/demo/core/dir/multiglob.rdoc +0 -41
- data/demo/core/dir/parent.rdoc +0 -6
- data/demo/core/dir/recurse.rdoc +0 -41
- data/demo/core/exception/detail.rdoc +0 -12
- data/demo/core/filetest/root.rdoc +0 -6
- data/demo/core/hash/recursively.rdoc +0 -21
- data/demo/core/indexable.rdoc +0 -95
- data/demo/core/integer/bitmask.rdoc +0 -46
- data/demo/core/integer/even.rdoc +0 -12
- data/demo/core/integer/odd.rdoc +0 -12
- data/demo/core/matchdata/match.rdoc +0 -7
- data/demo/core/matchdata/matchset.rdoc +0 -15
- data/demo/core/module/cattr.rdoc +0 -43
- data/demo/core/module/class_extend.rdoc +0 -64
- data/demo/core/module/method_space.rdoc +0 -55
- data/demo/core/string/bytes.rdoc +0 -8
- data/demo/core/string/camelcase.rdoc +0 -47
- data/demo/core/string/characters.rdoc +0 -11
- data/demo/core/string/cleave.rdoc +0 -49
- data/demo/core/string/divide.rdoc +0 -9
- data/demo/core/string/each_char.rdoc +0 -9
- data/demo/core/string/each_word.rdoc +0 -9
- data/demo/core/string/end_with.rdoc +0 -6
- data/demo/core/string/expand_tabs.rdoc +0 -69
- data/demo/core/string/fold.rdoc +0 -14
- data/demo/core/string/indent.rdoc +0 -65
- data/demo/core/string/interpolate.rdoc +0 -7
- data/demo/core/string/lchomp.rdoc +0 -14
- data/demo/core/string/line_wrap.rdoc +0 -7
- data/demo/core/string/lines.rdoc +0 -8
- data/demo/core/string/methodize.rdoc +0 -22
- data/demo/core/string/modulize.rdoc +0 -22
- data/demo/core/string/mscan.rdoc +0 -10
- data/demo/core/string/natcmp.rdoc +0 -10
- data/demo/core/string/nchar.rdoc +0 -9
- data/demo/core/string/op_sub.rdoc +0 -7
- data/demo/core/string/pathize.rdoc +0 -22
- data/demo/core/string/quote.rdoc +0 -20
- data/demo/core/string/range.rdoc +0 -19
- data/demo/core/string/rewrite.rdoc +0 -9
- data/demo/core/string/shatter.rdoc +0 -9
- data/demo/core/string/snakecase.rdoc +0 -10
- data/demo/core/string/splice.rdoc +0 -28
- data/demo/core/string/start_with.rdoc +0 -7
- data/demo/core/string/subtract.rdoc +0 -8
- data/demo/core/string/tab.rdoc +0 -16
- data/demo/core/string/tabto.rdoc +0 -29
- data/demo/core/string/titlecase.rdoc +0 -8
- data/demo/core/string/to_re.rdoc +0 -22
- data/demo/core/string/unfold.rdoc +0 -9
- data/demo/core/string/unindent.rdoc +0 -65
- data/demo/core/string/unquote.rdoc +0 -6
- data/demo/core/string/variablize.rdoc +0 -7
- data/demo/core/string/word_wrap.rdoc +0 -54
- data/demo/core/string/words.rdoc +0 -13
- data/demo/core/string/xor.rdoc +0 -8
- data/lib/core/facets/binding/local_variables.rb +0 -16
- data/lib/core/facets/string/tab.rb +0 -2
- data/lib/core/facets/string/tabto.rb +0 -2
- data/test/core/array/test_after.rb +0 -27
- data/test/core/array/test_combination.rb +0 -25
- data/test/core/array/test_index.rb +0 -20
- data/test/core/array/test_permutation.rb +0 -20
- data/test/core/array/test_product.rb +0 -64
- data/test/core/array/test_rotate.rb +0 -38
- data/test/core/array/test_select.rb +0 -16
- data/test/core/binding/test_eval.rb +0 -15
- data/test/core/binding/test_local_variables.rb +0 -36
- data/test/core/enumerable/test_cluster_by.rb +0 -30
- data/test/core/enumerable/test_count.rb +0 -32
- data/test/core/enumerable/test_each_with_object.rb +0 -18
- data/test/core/enumerable/test_group_by.rb +0 -36
- data/test/core/enumerable/test_none.rb +0 -29
- data/test/core/enumerable/test_one.rb +0 -34
- data/test/core/enumerable/test_take.rb +0 -15
- data/test/core/hash/test_select.rb +0 -44
- data/test/core/hash/test_url_params.rb +0 -26
- data/test/core/integer/test_even.rb +0 -24
- data/test/core/integer/test_odd.rb +0 -24
- data/test/core/kernel/test_require_relative.rb +0 -12
- data/test/core/nilclass/test_to_f.rb +0 -13
- data/test/core/proc/test_curry.rb +0 -38
- data/test/core/string/test_bytes.rb +0 -13
- data/test/core/string/test_each_char.rb +0 -17
- data/test/core/string/test_end_with.rb +0 -24
- data/test/core/string/test_lines.rb +0 -15
- data/test/core/string/test_start_with.rb +0 -24
- data/test/core/string/test_tab.rb +0 -16
- data/test/core/symbol/test_to_proc.rb +0 -35
- data/test/core/to_hash_tc.rb +0 -210
- data/test/core/unboundmethod/test_name.rb +0 -19
@@ -7,6 +7,18 @@ class Hash
|
|
7
7
|
hash
|
8
8
|
end
|
9
9
|
|
10
|
+
# Replaces hash with new hash less the given keys.
|
11
|
+
#
|
12
|
+
# h = {:a=>1, :b=>2, :c=>3}
|
13
|
+
# h.except!(:a) #=> {:b=>2,:c=>3}
|
14
|
+
# h #=> {:b=>2,:c=>3}
|
15
|
+
#
|
16
|
+
# Returns the hash.
|
17
|
+
def except!(*rejected)
|
18
|
+
rejected.each{ |k| delete(k) }
|
19
|
+
self
|
20
|
+
end
|
21
|
+
|
10
22
|
# Replaces hash with new hash less the given keys.
|
11
23
|
# This returns the hash of keys removed.
|
12
24
|
#
|
@@ -15,7 +27,7 @@ class Hash
|
|
15
27
|
# h #=> {:b=>2,:c=>3}
|
16
28
|
#
|
17
29
|
# Returns a Hash of the removed pairs.
|
18
|
-
def
|
30
|
+
def remove!(*rejected)
|
19
31
|
removed = {}
|
20
32
|
rejected.each{ |k| removed[k] = delete(k) }
|
21
33
|
removed
|
@@ -26,7 +26,8 @@ module Kernel
|
|
26
26
|
end
|
27
27
|
|
28
28
|
class NilClass
|
29
|
-
|
29
|
+
FUNCTOR = Functor.new{ nil }
|
30
|
+
|
30
31
|
# Compliments Kernel#ergo.
|
31
32
|
#
|
32
33
|
# "a".ergo{ |o| o.upcase } #=> "A"
|
@@ -35,8 +36,7 @@ class NilClass
|
|
35
36
|
# CREDIT: Daniel DeLorme
|
36
37
|
|
37
38
|
def ergo
|
38
|
-
|
39
|
-
@_ergo unless block_given?
|
39
|
+
FUNCTOR unless block_given?
|
40
40
|
end
|
41
41
|
|
42
42
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
class Numeric
|
2
|
+
# Returns a string representation of the number e.g.
|
3
|
+
# 1000.delimit # => "1,000"
|
4
|
+
# 1000000.delimit # => "1,000,000"
|
5
|
+
# (1000000.1234).delimit # => "1,000,000.1234"
|
6
|
+
#
|
7
|
+
# Can take a hash of options:
|
8
|
+
# * <tt>delimiter</tt> - defaults to "," but can be any string
|
9
|
+
# * <tt>separator</tt> - defaults to "." but can be any string
|
10
|
+
#
|
11
|
+
# 1000.delimit(:delimiter => "_") # => "1_000"
|
12
|
+
# (1000.00).delimit(:delimiter => ".", :separator => ",") # => "1.000,00"
|
13
|
+
def delimit(options = {})
|
14
|
+
opts = { :delimiter => ',', :separator => '.' }.merge(options)
|
15
|
+
digits, decimals = self.to_s.split('.')
|
16
|
+
digits = digits.reverse.chars.each_slice(3).map(&:join).join(opts[:delimiter]).reverse
|
17
|
+
return digits unless decimals
|
18
|
+
[digits, decimals].join(opts[:separator])
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
class Range
|
2
|
+
|
3
|
+
# Nudge range values
|
4
|
+
#
|
5
|
+
# (1..5).nudge #=> 2..6
|
6
|
+
# (1..5).nudge(2) #=> 3..7
|
7
|
+
# (1..5).nudge(-2) #=> -1..3
|
8
|
+
# (1..5).nudge(min: 1) #=> 2..5
|
9
|
+
# (1..5).nudge(max: 1) #=> 1..6
|
10
|
+
#
|
11
|
+
# CREDIT: Codeindulgence
|
12
|
+
|
13
|
+
def nudge(options_or_number = 1)
|
14
|
+
if options_or_number.instance_of? Fixnum
|
15
|
+
{:min => options_or_number, :max => options_or_number}
|
16
|
+
min = options_or_number
|
17
|
+
max = options_or_number
|
18
|
+
else
|
19
|
+
min = options_or_number[:min].to_i
|
20
|
+
max = options_or_number[:max].to_i
|
21
|
+
end
|
22
|
+
|
23
|
+
if exclude_end?
|
24
|
+
(self.min + min)...((self.max + 1) + max)
|
25
|
+
else
|
26
|
+
(self.min + min)..(self.max + max)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/lib/core/facets/string.rb
CHANGED
@@ -53,8 +53,6 @@ require_relative 'string/squish.rb'
|
|
53
53
|
require_relative 'string/starts_with.rb'
|
54
54
|
require_relative 'string/store.rb'
|
55
55
|
require_relative 'string/subtract.rb'
|
56
|
-
require_relative 'string/tab.rb'
|
57
|
-
require_relative 'string/tabto.rb'
|
58
56
|
require_relative 'string/titlecase.rb'
|
59
57
|
require_relative 'string/to_re.rb'
|
60
58
|
require_relative 'string/unbracket.rb'
|
@@ -2,6 +2,8 @@ class String
|
|
2
2
|
|
3
3
|
# Create a random String of given length, using given character set
|
4
4
|
#
|
5
|
+
# Character set is an Array which can contain Ranges, Arrays, Characters
|
6
|
+
#
|
5
7
|
# Examples
|
6
8
|
#
|
7
9
|
# String.random
|
@@ -19,6 +21,15 @@ class String
|
|
19
21
|
# String.random(10, ['0'..'9','A'..'F'] )
|
20
22
|
# => "3EBF48AD3D"
|
21
23
|
#
|
24
|
+
# BASE64_CHAR_SET = ["A".."Z", "a".."z", "0".."9", '_', '-']
|
25
|
+
# String.random(10, BASE64_CHAR_SET)
|
26
|
+
# => "xM_1t3qcNn"
|
27
|
+
#
|
28
|
+
# SPECIAL_CHARS = ["!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "-", "_", "=", "+", "|", "/", "?", ".", ",", ";", ":", "~", "`", "[", "]", "{", "}", "<", ">"]
|
29
|
+
# BASE91_CHAR_SET = ["A".."Z", "a".."z", "0".."9", SPECIAL_CHARS]
|
30
|
+
# String.random(10, BASE91_CHAR_SET)
|
31
|
+
# => "S(Z]z,J{v;"
|
32
|
+
#
|
22
33
|
# CREDIT: Tilo Sloboda
|
23
34
|
#
|
24
35
|
# SEE: https://gist.github.com/tilo/3ee8d94871d30416feba
|
@@ -26,9 +37,8 @@ class String
|
|
26
37
|
# TODO: Move to random.rb in standard library?
|
27
38
|
|
28
39
|
def self.random(len=32, character_set = ["A".."Z", "a".."z", "0".."9"])
|
29
|
-
|
30
|
-
|
31
|
-
(0...len).map{ characters[rand(characters_len)] }.join
|
40
|
+
chars = character_set.map{|x| x.is_a?(Range) ? x.to_a : x }.flatten
|
41
|
+
Array.new(len){ chars.sample }.join
|
32
42
|
end
|
33
43
|
|
34
44
|
end
|
@@ -4,19 +4,19 @@ class String
|
|
4
4
|
# on the number of shared edges. To be effective, the strings
|
5
5
|
# must be of length 2 or greater.
|
6
6
|
#
|
7
|
-
#
|
7
|
+
# "Alexsander".similarity("Aleksander") #=> 0.9
|
8
8
|
#
|
9
9
|
# The way it works:
|
10
10
|
#
|
11
11
|
# 1. Converts each string into a "graph like" object, with edges ...
|
12
12
|
#
|
13
|
-
#
|
14
|
-
#
|
13
|
+
# "alexsander" -> [ alexsander, alexsand, alexsan ... lexsand ... san ... an, etc ]
|
14
|
+
# "aleksander" -> [ aleksander, aleksand ... etc. ]
|
15
15
|
#
|
16
16
|
# 2. Perform match, then remove any subsets from this matched set (i.e. a hit
|
17
17
|
# on "san" is a subset of a hit on "sander") ...
|
18
18
|
#
|
19
|
-
#
|
19
|
+
# Above example, once reduced -> [ ale, sander ]
|
20
20
|
#
|
21
21
|
# 3. See's how many of the matches remain, and calculates a score based
|
22
22
|
# on how many matches, their length, and compare to the length of the
|
@@ -24,7 +24,8 @@ class String
|
|
24
24
|
#
|
25
25
|
# Still a bit rough. Any suggestions for improvement are welcome.
|
26
26
|
#
|
27
|
-
# CREDIT: Derek Lewis
|
27
|
+
# CREDIT: Derek Lewis
|
28
|
+
|
28
29
|
def similarity(str_in)
|
29
30
|
return 0 if str_in == nil
|
30
31
|
return 1 if self == str_in
|
@@ -82,7 +83,7 @@ class String
|
|
82
83
|
score = 0.0
|
83
84
|
matches.each{ |mm| score += mm.length }
|
84
85
|
self.length > str_in.length ? largest = self.length : largest = str_in.length
|
85
|
-
return score/largest
|
86
|
+
return score/(largest+1)
|
86
87
|
end
|
87
88
|
|
88
89
|
end
|
@@ -51,6 +51,11 @@ module Enumerable
|
|
51
51
|
end
|
52
52
|
}
|
53
53
|
else
|
54
|
+
# this branch is used when the method has a variable number of arguments
|
55
|
+
# resulting in an arity of -1. Right now this is bugged as it does
|
56
|
+
# not pass the argument to the each, and always passes the argument
|
57
|
+
# to the method. This makes methods like .min amdn .max to act
|
58
|
+
# in an unexpected manner.
|
54
59
|
class_eval %{
|
55
60
|
def #{m}( *args, &yld )
|
56
61
|
enum_for(:each).#{m}( *args, &yld )
|
@@ -5,7 +5,7 @@ module Math
|
|
5
5
|
# +pcnt+ should be expressed as an integer, e.g. `percentile(90)` returns
|
6
6
|
# the 90th percentile of the array.
|
7
7
|
#
|
8
|
-
# Algorithm from NIST[http://www.itl.nist.gov/div898/handbook/prc/section2/
|
8
|
+
# Algorithm from NIST[http://www.itl.nist.gov/div898/handbook/prc/section2/prc262.htm]
|
9
9
|
#
|
10
10
|
# NOTE: This is not a common core extension and is not
|
11
11
|
# loaded automatically when using <code>require 'facets'</code>.
|
@@ -2,13 +2,17 @@ require 'net/http'
|
|
2
2
|
|
3
3
|
module Net
|
4
4
|
|
5
|
+
# Returns a response object for the given URL or raises
|
6
|
+
# an exception with the appropriate error status code if unable to
|
7
|
+
# complete the request
|
8
|
+
#
|
9
|
+
# Net.download('http://example.com/')
|
10
|
+
# Net.download('http://example.com/', 2) # fail after 2 redirects
|
11
|
+
#
|
5
12
|
# CREDIT: Daniel Huckstep
|
6
|
-
def self.download(url, limit=
|
7
|
-
|
8
|
-
|
9
|
-
#req = Net::HTTP::Get.new(url.path)
|
10
|
-
#req['User-Agent'] = "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.7) Gecko/2009030422 Ubuntu/8.10 (intrepid) Firefox/3.0.7"
|
11
|
-
#resp = Net::HTTP.new(url.host, url.port).start { |http| http.request(req) }
|
13
|
+
def self.download(url, limit = nil)
|
14
|
+
limit ||= 10
|
15
|
+
raise ArgumentError, 'HTTP redirect too deep' if limit.zero?
|
12
16
|
resp = Net::HTTP.get_response(URI.parse(url))
|
13
17
|
case resp
|
14
18
|
when Net::HTTPSuccess then resp
|
@@ -17,16 +21,31 @@ module Net
|
|
17
21
|
end
|
18
22
|
end
|
19
23
|
|
24
|
+
# Downloads a given URL and saves it to disk at the specified path.
|
25
|
+
# If path is not provided or nil, then the last segment in the path of
|
26
|
+
# the URL is used as the file name.
|
27
|
+
#
|
28
|
+
# Takes a third parameters as a hash of options:
|
29
|
+
# * <tt>limit</tt> - passed to Net.download to limit number of redirects
|
30
|
+
# * <tt>mode</tt>, <tt>:open_args<tt>, etc - passed to File.write to save the file.
|
31
|
+
# For details on those options, see File.write
|
32
|
+
#
|
33
|
+
# # Saves robots.txt to PWD as robots.txt
|
34
|
+
# Net.download_and_save('http://example.com/robots.txt')
|
35
|
+
#
|
36
|
+
# # Saves robots.txt to PWD as example.txt
|
37
|
+
# Net.download_and_save('http://example.com/robots.txt', 'example.txt')
|
38
|
+
#
|
39
|
+
# # Saves robots.txt to PWD as robots.txt, and writes the result as binary
|
40
|
+
# Net.download_and_save('http://example.com/robots.txt', nil, mode: 'wb')
|
41
|
+
#
|
20
42
|
# CREDIT: Daniel Huckstep
|
21
|
-
def self.download_and_save(url, path=nil)
|
22
|
-
|
23
|
-
|
24
|
-
else
|
25
|
-
path = File.expand_path(path)
|
26
|
-
end
|
43
|
+
def self.download_and_save(url, path = nil, options = {})
|
44
|
+
opts = options.dup
|
45
|
+
path = File.expand_path(path || url.split('/').last)
|
27
46
|
raise ArgumentError.new('Save path is a directory') if File.directory?(path)
|
28
|
-
resp = download(url)
|
29
|
-
|
47
|
+
resp = download(url, opts.delete(:limit))
|
48
|
+
File.write(path, resp.body, opts) if resp.is_a?(Net::HTTPSuccess)
|
30
49
|
end
|
31
50
|
end
|
32
51
|
|
@@ -1,11 +1,11 @@
|
|
1
|
-
require 'timeout' # for
|
1
|
+
require 'timeout' # for Timeout::Error
|
2
2
|
|
3
3
|
# = Timer
|
4
4
|
#
|
5
5
|
# Provides a strightforward means for controlling time critical execution.
|
6
6
|
# Can be used as a "stop watch" timer or as a "time bomb" timer:
|
7
7
|
#
|
8
|
-
# t = Timer.new(10) { raise
|
8
|
+
# t = Timer.new(10) { raise Timeout::Error, "timeout!" }
|
9
9
|
# t.start
|
10
10
|
# : # done within 10sec timeout
|
11
11
|
# t.stop
|
@@ -107,7 +107,7 @@ class Timer
|
|
107
107
|
if @on_timeout then
|
108
108
|
@on_timeout.call @time_limit
|
109
109
|
else
|
110
|
-
@current_thread.raise
|
110
|
+
@current_thread.raise Timeout::Error, "#{@time_limit} seconds past"
|
111
111
|
end
|
112
112
|
}
|
113
113
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'facets/array/average'
|
2
|
+
|
3
|
+
test_case Array do
|
4
|
+
method :average do
|
5
|
+
test 'Empty array returns nil' do
|
6
|
+
[].average.assert == nil
|
7
|
+
end
|
8
|
+
|
9
|
+
test 'Calculate average of array of numerical values' do
|
10
|
+
[1, 2, 3].average.assert == 2
|
11
|
+
[96, 35, 72, 30, 75, 33, 68, 13, 49, 71].average.assert == 54.2
|
12
|
+
[36, -67, -17, 85, -46, -64, -23, -13, 89, -47].average.assert == -6.7
|
13
|
+
[60.7829, 31.2622, 20.626, 78.8907, 61.5328].average.assert == 50.61892
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -23,5 +23,26 @@ test_case Array do
|
|
23
23
|
|
24
24
|
end
|
25
25
|
|
26
|
+
method :after do
|
27
|
+
|
28
|
+
setup do
|
29
|
+
@sequence = ['a', 'b', 'c']
|
30
|
+
end
|
31
|
+
|
32
|
+
test "returns the following element" do
|
33
|
+
@sequence.after('a').assert == 'b'
|
34
|
+
@sequence.after('b').assert == 'c'
|
35
|
+
end
|
36
|
+
|
37
|
+
test "loops around from back to front" do
|
38
|
+
@sequence.after('c').assert == 'a'
|
39
|
+
end
|
40
|
+
|
41
|
+
test "non-member elements return nil" do
|
42
|
+
@sequence.after('d').assert == nil
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
26
47
|
end
|
27
48
|
|
@@ -5,10 +5,19 @@ test_case Array do
|
|
5
5
|
method :collapse do
|
6
6
|
|
7
7
|
test do
|
8
|
-
[1,nil,[1,2],nil,[[3]]].collapse.assert == [1,1,2,3]
|
8
|
+
[1, nil, [1, 2], nil, [[3]]].collapse.assert == [1, 1, 2, 3]
|
9
9
|
end
|
10
10
|
|
11
11
|
end
|
12
12
|
|
13
|
+
method :collapse! do
|
14
|
+
|
15
|
+
test do
|
16
|
+
a = [1, nil, [1, 2], nil, [[3]]]
|
17
|
+
a.collapse!
|
18
|
+
a.assert == [1, 1, 2, 3]
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
13
22
|
end
|
14
23
|
|
@@ -0,0 +1,17 @@
|
|
1
|
+
covers 'facets/array/delete_unless'
|
2
|
+
|
3
|
+
test_case Array do
|
4
|
+
|
5
|
+
method :delete_unless do
|
6
|
+
|
7
|
+
test 'with an explicit block' do
|
8
|
+
[1,2,3].delete_unless{ |x| x < 2 }.assert == [1]
|
9
|
+
end
|
10
|
+
|
11
|
+
test 'with an implicit block' do
|
12
|
+
[1,2,3].delete_unless(&:even?).assert == [2]
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
covers 'facets/array/delete_values'
|
2
|
+
|
3
|
+
test_case Array do
|
4
|
+
|
5
|
+
method :delete_values do
|
6
|
+
|
7
|
+
test do
|
8
|
+
a = [1,2,3,4]
|
9
|
+
a.delete_values(1,2).assert == [1,2]
|
10
|
+
a.assert == [3,4]
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
|
15
|
+
method :delete_values_at do
|
16
|
+
|
17
|
+
test do
|
18
|
+
a = [1,2,3,4]
|
19
|
+
a.delete_values_at(1,2).assert == [2,3]
|
20
|
+
a.assert == [1,4]
|
21
|
+
end
|
22
|
+
|
23
|
+
test do
|
24
|
+
a = [1,2,3,4]
|
25
|
+
a.delete_values_at(0..2).assert == [1,2,3]
|
26
|
+
a.assert == [4]
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|