facets 2.6.0 → 2.7.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.
- data/HISTORY.rdoc +331 -35
- data/MANIFEST +685 -826
- data/{doc/guide/notes.rd → NOTES} +0 -0
- data/README.rdoc +73 -25
- data/Rakefile +245 -2
- data/TODO +5 -0
- data/demo/hook.rd +47 -0
- data/demo/scenario_require.rd +9 -0
- data/doc/README.more +24 -6
- data/doc/manual/about.rb +47 -0
- data/doc/manual/annotations.rdoc +60 -0
- data/doc/manual/associations.rdoc +55 -0
- data/doc/manual/blockups.rdoc +101 -0
- data/doc/manual/capsule.rdoc +34 -0
- data/doc/manual/command.rdoc +177 -0
- data/doc/manual/core.rdoc +37 -0
- data/doc/manual/faq.rdoc +32 -0
- data/doc/manual/typecast.html +112 -0
- data/lib/core/facets.rb +359 -11
- data/lib/core/facets/array/combination.rb +3 -3
- data/lib/core/facets/array/index.rb +4 -1
- data/lib/core/facets/array/permutation.rb +2 -2
- data/lib/core/facets/array/product.rb +1 -1
- data/lib/core/facets/binding/eval.rb +1 -1
- data/lib/core/facets/denumerable.rb +76 -0
- data/lib/core/facets/duplicable.rb +34 -0
- data/lib/core/facets/enumerable/count.rb +10 -4
- data/lib/core/facets/enumerable/defer.rb +77 -0
- data/lib/core/facets/enumerable/each_by.rb +1 -1
- data/lib/core/facets/enumerable/every.rb +35 -0
- data/lib/{more/facets/elementwise.rb → core/facets/enumerable/ewise.rb} +0 -0
- data/lib/core/facets/enumerable/filter.rb +25 -0
- data/lib/core/facets/enumerable/group_by.rb +1 -1
- data/lib/core/facets/enumerable/none.rb +3 -2
- data/lib/core/facets/enumerable/one.rb +3 -2
- data/lib/core/facets/enumerable/per.rb +61 -0
- data/lib/core/facets/exception/raised.rb +14 -0
- data/lib/core/facets/integer/odd.rb +5 -1
- data/lib/core/facets/kernel/__dir__.rb +13 -3
- data/lib/core/facets/kernel/__here__.rb +14 -0
- data/lib/core/facets/kernel/__method__.rb +9 -3
- data/lib/core/facets/kernel/ask.rb +1 -0
- data/lib/core/facets/kernel/equate.rb +13 -0
- data/lib/core/facets/kernel/extension.rb +9 -0
- data/lib/core/facets/kernel/identical.rb +4 -0
- data/lib/core/facets/kernel/instance_exec.rb +2 -1
- data/lib/core/facets/kernel/method.rb +49 -0
- data/lib/core/facets/kernel/object_send.rb +2 -2
- data/lib/core/facets/kernel/{state.rb → object_state.rb} +23 -12
- data/lib/core/facets/kernel/require_all.rb +6 -1
- data/lib/core/facets/kernel/require_local.rb +8 -1
- data/lib/core/facets/kernel/require_relative.rb +52 -0
- data/lib/core/facets/kernel/source_location.rb +13 -0
- data/lib/core/facets/kernel/tap.rb +13 -6
- data/lib/core/facets/module/attr_setter.rb +57 -0
- data/lib/core/facets/module/instance_method.rb +24 -0
- data/lib/core/facets/module/module_load.rb +60 -44
- data/lib/core/facets/module/module_require.rb +1 -0
- data/lib/core/facets/nilclass/to_f.rb +1 -1
- data/lib/core/facets/objectspace/op_fetch.rb +3 -0
- data/lib/core/facets/proc/curry.rb +4 -3
- data/lib/core/facets/string/bytes.rb +10 -4
- data/lib/core/facets/string/camelcase.rb +6 -5
- data/lib/core/facets/string/chars.rb +5 -1
- data/lib/core/facets/string/each_char.rb +1 -1
- data/lib/core/facets/string/each_word.rb +1 -1
- data/lib/core/facets/string/lines.rb +11 -4
- data/lib/core/facets/string/start_with.rb +9 -2
- data/lib/core/facets/string/unfold.rb +27 -0
- data/lib/core/facets/symbol/succ.rb +3 -3
- data/lib/core/facets/symbol/thrown.rb +20 -0
- data/lib/core/facets/symbol/to_proc.rb +3 -2
- data/lib/core/facets/time/to_time.rb +1 -1
- data/lib/core/facets/to_hash.rb +41 -100
- data/lib/core/facets/unboundmethod/name.rb +20 -23
- data/lib/more/facets/ansicode.rb +1 -10
- data/lib/more/facets/autoarray.rb +3 -31
- data/lib/more/facets/basicobject.rb +73 -0
- data/lib/more/facets/blankslate.rb +2 -66
- data/lib/{lore → more}/facets/cgi.rb +0 -0
- data/lib/more/facets/class_extend.rb +1 -0
- data/lib/{lore → more}/facets/continuation.rb +0 -0
- data/lib/{lore → more}/facets/date.rb +3 -3
- data/lib/more/facets/enumargs.rb +192 -0
- data/lib/more/facets/enumerablepass.rb +2 -216
- data/lib/more/facets/enumerator.rb +62 -0
- data/lib/more/facets/{equatable.rb → equitable.rb} +11 -11
- data/lib/more/facets/expirable.rb +13 -41
- data/lib/{lore → more}/facets/fileutils.rb +0 -0
- data/lib/{lore → more}/facets/fileutils/head.rb +0 -0
- data/lib/{lore → more}/facets/fileutils/safe_ln.rb +0 -0
- data/lib/{lore → more}/facets/fileutils/slice.rb +0 -0
- data/lib/{lore → more}/facets/fileutils/tail.rb +0 -0
- data/lib/{lore → more}/facets/fileutils/wc.rb +0 -0
- data/lib/{lore → more}/facets/fileutils/whereis.rb +0 -0
- data/lib/{lore → more}/facets/fileutils/which.rb +0 -0
- data/lib/{lore → more}/facets/getoptlong.rb +0 -0
- data/lib/more/facets/hook.rb +2 -29
- data/lib/more/facets/inheritor.rb +2 -2
- data/lib/more/facets/instance_eval.rb +50 -0
- data/lib/more/facets/instance_function.rb +78 -0
- data/lib/more/facets/main.rb +20 -15
- data/lib/more/facets/memoize.rb +1 -113
- data/lib/more/facets/module/attr.rb +83 -0
- data/lib/more/facets/module/attr_tester.rb +44 -0
- data/lib/more/facets/module/attr_toggler.rb +59 -0
- data/lib/more/facets/module/attr_validator.rb +34 -0
- data/lib/more/facets/{class_extension.rb → module/class_extend.rb} +21 -13
- data/lib/more/facets/once.rb +59 -0
- data/lib/more/facets/openmodule.rb +1 -0
- data/lib/more/facets/orderedhash.rb +1 -33
- data/lib/{lore → more}/facets/ostruct.rb +0 -0
- data/lib/more/facets/ostructable.rb +1 -4
- data/lib/more/facets/partial.rb +18 -16
- data/lib/{lore → more}/facets/pathname.rb +0 -0
- data/lib/more/facets/preinitialize.rb +157 -0
- data/lib/{lore → more}/facets/rbconfig.rb +0 -0
- data/lib/more/facets/recorder.rb +1 -2
- data/lib/{lore → more}/facets/set.rb +0 -0
- data/lib/{lore → more}/facets/shellwords.rb +0 -0
- data/lib/{lore → more}/facets/uri.rb +0 -0
- data/lib/{lore → more}/facets/yaml.rb +0 -0
- data/lib/{lore → more}/facets/zlib.rb +0 -0
- data/meta/loadpath +0 -1
- data/meta/sitemap +4 -0
- data/meta/version +1 -1
- data/test/core/enumerable/test_count.rb +1 -1
- data/test/{more/test_filter.rb → core/enumerable/test_defer.rb} +24 -22
- data/test/{more/test_elementor.rb → core/enumerable/test_every.rb} +2 -15
- data/test/core/enumerable/test_ewise.rb +23 -0
- data/test/core/enumerable/test_per.rb +18 -0
- data/test/core/enumerable/test_take.rb +13 -0
- data/test/core/kernel/test_deepcopy.rb +1 -1
- data/test/{more/test_1stclassmethod.rb → core/kernel/test_method.rb} +2 -7
- data/test/core/kernel/test_tap.rb +1 -1
- data/test/core/proc/test_curry.rb +11 -0
- data/test/core/string/test_bytes.rb +1 -1
- data/test/core/string/test_camelcase.rb +23 -6
- data/test/core/string/test_lines.rb +1 -1
- data/test/core/string/test_unfold.rb +14 -0
- data/test/{more → core}/test_blank.rb +0 -0
- data/test/{more → core}/test_boolean.rb +0 -0
- data/test/{more → core}/test_functor.rb +0 -0
- data/test/{lore → more}/test_basicobject.rb +0 -0
- data/test/more/{test_class_extension.rb → test_class_extend.rb} +6 -6
- data/test/{lore → more}/test_continuation.rb +0 -0
- data/test/{lore → more}/test_date.rb +0 -0
- data/test/more/{test_enumerablepass.rb → test_enumargs.rb} +2 -4
- data/test/more/{test_equatable.rb → test_equitable.rb} +2 -2
- data/test/more/{test_instantise.rb → test_instance_function.rb} +3 -2
- data/test/more/test_memoize.rb +1 -1
- data/test/{lore → more}/test_ostruct.rb +0 -0
- metadata +865 -1016
- data/RELEASE +0 -38
- data/doc/README.lore +0 -51
- data/doc/log/basic_stats/index.html +0 -39
- data/doc/log/changelog.html +0 -648
- data/doc/log/changelog.txt +0 -217
- data/doc/log/stats/index.html +0 -39
- data/doc/log/testlog.txt +0 -278
- data/doc/notes/CHANGES +0 -2529
- data/doc/rdoc/lore/classes/Array.html +0 -176
- data/doc/rdoc/lore/classes/CGI.html +0 -191
- data/doc/rdoc/lore/classes/Config.html +0 -135
- data/doc/rdoc/lore/classes/Continuation.html +0 -113
- data/doc/rdoc/lore/classes/Date.html +0 -631
- data/doc/rdoc/lore/classes/DateTime.html +0 -583
- data/doc/rdoc/lore/classes/Enumerable.html +0 -89
- data/doc/rdoc/lore/classes/Enumerable/Enumerator.html +0 -147
- data/doc/rdoc/lore/classes/File.html +0 -128
- data/doc/rdoc/lore/classes/FileUtils.html +0 -434
- data/doc/rdoc/lore/classes/GetoptLong.html +0 -118
- data/doc/rdoc/lore/classes/GetoptLong/DSL.html +0 -208
- data/doc/rdoc/lore/classes/Kernel.html +0 -135
- data/doc/rdoc/lore/classes/Logger.html +0 -229
- data/doc/rdoc/lore/classes/Logger/Ansicolor.html +0 -277
- data/doc/rdoc/lore/classes/Logger/LogDevice.html +0 -121
- data/doc/rdoc/lore/classes/NilClass.html +0 -119
- data/doc/rdoc/lore/classes/OpenStruct.html +0 -432
- data/doc/rdoc/lore/classes/Pathname.html +0 -353
- data/doc/rdoc/lore/classes/Set.html +0 -117
- data/doc/rdoc/lore/classes/Shellwords.html +0 -111
- data/doc/rdoc/lore/classes/String.html +0 -140
- data/doc/rdoc/lore/classes/Time.html +0 -154
- data/doc/rdoc/lore/classes/URI.html +0 -454
- data/doc/rdoc/lore/classes/URI/Hash.html +0 -105
- data/doc/rdoc/lore/classes/URI/Kernel.html +0 -122
- data/doc/rdoc/lore/classes/Zlib.html +0 -188
- data/doc/rdoc/lore/created.rid +0 -1
- data/doc/rdoc/lore/files/README.html +0 -286
- data/doc/rdoc/lore/files/doc/README_lore.html +0 -155
- data/doc/rdoc/lore/files/lib/lore/facets/basicobject_rb.html +0 -118
- data/doc/rdoc/lore/files/lib/lore/facets/cgi_rb.html +0 -111
- data/doc/rdoc/lore/files/lib/lore/facets/continuation_rb.html +0 -147
- data/doc/rdoc/lore/files/lib/lore/facets/date_rb.html +0 -97
- data/doc/rdoc/lore/files/lib/lore/facets/enumerator_rb.html +0 -111
- data/doc/rdoc/lore/files/lib/lore/facets/fileutils/head_rb.html +0 -96
- data/doc/rdoc/lore/files/lib/lore/facets/fileutils/safe_ln_rb.html +0 -96
- data/doc/rdoc/lore/files/lib/lore/facets/fileutils/slice_rb.html +0 -96
- data/doc/rdoc/lore/files/lib/lore/facets/fileutils/tail_rb.html +0 -96
- data/doc/rdoc/lore/files/lib/lore/facets/fileutils/wc_rb.html +0 -96
- data/doc/rdoc/lore/files/lib/lore/facets/fileutils/whereis_rb.html +0 -96
- data/doc/rdoc/lore/files/lib/lore/facets/fileutils/which_rb.html +0 -96
- data/doc/rdoc/lore/files/lib/lore/facets/fileutils_rb.html +0 -131
- data/doc/rdoc/lore/files/lib/lore/facets/getoptlong_rb.html +0 -135
- data/doc/rdoc/lore/files/lib/lore/facets/logger_rb.html +0 -142
- data/doc/rdoc/lore/files/lib/lore/facets/ostruct_rb.html +0 -135
- data/doc/rdoc/lore/files/lib/lore/facets/pathname_rb.html +0 -145
- data/doc/rdoc/lore/files/lib/lore/facets/rbconfig_rb.html +0 -124
- data/doc/rdoc/lore/files/lib/lore/facets/set_rb.html +0 -96
- data/doc/rdoc/lore/files/lib/lore/facets/shellwords_rb.html +0 -124
- data/doc/rdoc/lore/files/lib/lore/facets/uri_rb.html +0 -125
- data/doc/rdoc/lore/files/lib/lore/facets/yaml_rb.html +0 -146
- data/doc/rdoc/lore/files/lib/lore/facets/zlib_rb.html +0 -97
- data/doc/rdoc/lore/fr_class_index.html +0 -73
- data/doc/rdoc/lore/fr_file_index.html +0 -71
- data/doc/rdoc/lore/fr_method_index.html +0 -177
- data/doc/rdoc/lore/index.html +0 -26
- data/doc/rdoc/lore/rdoc-style.css +0 -177
- data/doc/release-notes/RELEASE-2.0.5 +0 -8
- data/doc/release-notes/RELEASE-2.1.0 +0 -9
- data/doc/release-notes/RELEASE-2.1.1 +0 -5
- data/doc/release-notes/RELEASE-2.1.2 +0 -6
- data/doc/release-notes/RELEASE-2.1.3 +0 -5
- data/doc/release-notes/RELEASE-2.2.0 +0 -14
- data/doc/release-notes/RELEASE-2.2.1 +0 -4
- data/doc/release-notes/RELEASE-2.3.0 +0 -6
- data/doc/release-notes/RELEASE-2.4.0 +0 -70
- data/doc/release-notes/RELEASE-2.4.1 +0 -8
- data/doc/release-notes/RELEASE-2.4.2 +0 -4
- data/doc/release-notes/RELEASE-2.4.3 +0 -78
- data/doc/release-notes/RELEASE-2.4.4 +0 -38
- data/doc/release-notes/RELEASE-2.4.5 +0 -37
- data/doc/release-notes/RELEASE-2.5.0 +0 -83
- data/lib/core/facets/kernel/instance.rb +0 -19
- data/lib/lore/facets/basicobject.rb +0 -14
- data/lib/lore/facets/enumerator.rb +0 -67
- data/lib/lore/facets/logger.rb +0 -291
- data/lib/more/facets/1stclassmethod.rb +0 -140
- data/lib/more/facets/advisable.rb +0 -162
- data/lib/more/facets/association.rb +0 -210
- data/lib/more/facets/attr.rb +0 -209
- data/lib/more/facets/basex.rb +0 -37
- data/lib/more/facets/bbcode.rb +0 -397
- data/lib/more/facets/bicrypt.rb +0 -265
- data/lib/more/facets/binreadable.rb +0 -221
- data/lib/more/facets/censor.rb +0 -97
- data/lib/more/facets/classmethods.rb +0 -199
- data/lib/more/facets/consoleutils.rb +0 -99
- data/lib/more/facets/crypt.rb +0 -166
- data/lib/more/facets/dependency.rb +0 -151
- data/lib/more/facets/downloader.rb +0 -281
- data/lib/more/facets/duplicable.rb +0 -43
- data/lib/more/facets/elementor.rb +0 -133
- data/lib/more/facets/filter.rb +0 -121
- data/lib/more/facets/heap.rb +0 -22
- data/lib/more/facets/infinity.rb +0 -193
- data/lib/more/facets/ini.rb +0 -264
- data/lib/more/facets/instantise.rb +0 -1
- data/lib/more/facets/instantize.rb +0 -95
- data/lib/more/facets/interval.rb +0 -282
- data/lib/more/facets/iteration.rb +0 -65
- data/lib/more/facets/linkedlist.rb +0 -222
- data/lib/more/facets/lrucache.rb +0 -157
- data/lib/more/facets/matcher.rb +0 -140
- data/lib/more/facets/memoizer.rb +0 -74
- data/lib/more/facets/minitar.rb +0 -1063
- data/lib/more/facets/nackclass.rb +0 -41
- data/lib/more/facets/net/smtp_tls.rb +0 -131
- data/lib/more/facets/nilstatus.rb +0 -48
- data/lib/more/facets/overload.rb +0 -94
- data/lib/more/facets/paramix.rb +0 -202
- data/lib/more/facets/pool.rb +0 -91
- data/lib/more/facets/pqueue.rb +0 -449
- data/lib/more/facets/pry.rb +0 -32
- data/lib/more/facets/reflection.rb +0 -145
- data/lib/more/facets/semaphore.rb +0 -92
- data/lib/more/facets/settings.rb +0 -248
- data/lib/more/facets/snapshot.rb +0 -209
- data/lib/more/facets/sparse_array.rb +0 -809
- data/lib/more/facets/string/mask.rb +0 -278
- data/lib/more/facets/string/obfuscate.rb +0 -65
- data/lib/more/facets/string/stylize.rb +0 -169
- data/lib/more/facets/string/words.rb +0 -167
- data/lib/more/facets/syncarray.rb +0 -114
- data/lib/more/facets/synchash.rb +0 -157
- data/lib/more/facets/typecast.rb +0 -261
- data/lib/more/facets/uninheritable.rb +0 -50
- data/lib/more/facets/xmlhash.rb +0 -112
- data/lib/more/facets/xoxo.rb +0 -259
- data/lib/more/facets/ziputils.rb +0 -490
- data/task/conflicts +0 -63
- data/task/coverage.rake +0 -37
- data/task/methods +0 -49
- data/task/rdoc.rake +0 -17
- data/task/setup.rake +0 -38
- data/task/test.rake +0 -145
- data/test/more/test_advisable.rb +0 -71
- data/test/more/test_association.rb +0 -38
- data/test/more/test_bbcode.rb +0 -21
- data/test/more/test_binreadable.rb +0 -50
- data/test/more/test_buildable.rb +0 -73
- data/test/more/test_classmethods.rb +0 -56
- data/test/more/test_crypt.rb +0 -32
- data/test/more/test_dependency.rb +0 -69
- data/test/more/test_elementwise.rb +0 -25
- data/test/more/test_infinity.rb +0 -40
- data/test/more/test_interval.rb +0 -151
- data/test/more/test_linkedlist.rb +0 -41
- data/test/more/test_lrucache.rb +0 -14
- data/test/more/test_overload.rb +0 -160
- data/test/more/test_paramix.rb +0 -170
- data/test/more/test_prototype.rb +0 -35
- data/test/more/test_snapshot.rb +0 -21
- data/test/more/test_sparsearray.rb +0 -279
- data/test/more/test_syncarray.rb +0 -15
- data/test/more/test_synchash.rb +0 -16
- data/test/more/test_typecast.rb +0 -54
- data/test/more/test_uninheritable.rb +0 -31
- data/test/more/test_xoxo.rb +0 -274
- data/test/test_facets.rb +0 -9
@@ -1,278 +0,0 @@
|
|
1
|
-
require 'facets/functor'
|
2
|
-
|
3
|
-
class String
|
4
|
-
|
5
|
-
# Create a mask.
|
6
|
-
def to_mask(re=nil)
|
7
|
-
Mask.new(self,re)
|
8
|
-
end
|
9
|
-
|
10
|
-
# = Mask
|
11
|
-
#
|
12
|
-
class Mask
|
13
|
-
|
14
|
-
ESC = "\032" # ASCII SUBSTITUTE
|
15
|
-
|
16
|
-
class << self
|
17
|
-
|
18
|
-
def [](string, re=nil)
|
19
|
-
new(string, re)
|
20
|
-
end
|
21
|
-
|
22
|
-
end # class<< self
|
23
|
-
|
24
|
-
protected
|
25
|
-
|
26
|
-
attr :string
|
27
|
-
|
28
|
-
private
|
29
|
-
|
30
|
-
def initialize(string, re=nil)
|
31
|
-
@string = string.dup
|
32
|
-
mask!(re) if re
|
33
|
-
end
|
34
|
-
|
35
|
-
public
|
36
|
-
|
37
|
-
def inspect ; string.inspect ; end
|
38
|
-
def to_s ; string ; end
|
39
|
-
|
40
|
-
def [](*a)
|
41
|
-
string[*a]
|
42
|
-
end
|
43
|
-
|
44
|
-
def mask(re)
|
45
|
-
self.class.new(string,re)
|
46
|
-
end
|
47
|
-
|
48
|
-
def mask!(re)
|
49
|
-
string.gsub!(re){ |s| ESC * s.size }
|
50
|
-
end
|
51
|
-
|
52
|
-
# Mask subtraction. Where the characters are the same,
|
53
|
-
# the result is "empty", where they differ the result
|
54
|
-
# reflects the last string.
|
55
|
-
#
|
56
|
-
# "abc..123" "ab..789."
|
57
|
-
# - "ab..789." - "abc..123"
|
58
|
-
# ---------- ----------
|
59
|
-
# "....789." "..c..123"
|
60
|
-
#
|
61
|
-
def -(other)
|
62
|
-
i = 0
|
63
|
-
o = ''
|
64
|
-
while i < string.size
|
65
|
-
if string[i,1] == other[i,1]
|
66
|
-
o << ESC
|
67
|
-
else
|
68
|
-
o << other[i,1]
|
69
|
-
end
|
70
|
-
i += 1
|
71
|
-
end
|
72
|
-
self.class.new(o)
|
73
|
-
end
|
74
|
-
|
75
|
-
# Mask ADD. As long as there is a value other
|
76
|
-
# then empty the character filters though.
|
77
|
-
# The last string takes precedence.
|
78
|
-
#
|
79
|
-
# "abc..123" "ab..789."
|
80
|
-
# + "ab..789." + "abc..123"
|
81
|
-
# ---------- ----------
|
82
|
-
# "abc.7893" "abc.7123"
|
83
|
-
#
|
84
|
-
def +(other)
|
85
|
-
i = 0
|
86
|
-
o = ''
|
87
|
-
while i < string.size
|
88
|
-
if other[i,1] == ESC
|
89
|
-
o << string[i,1]
|
90
|
-
else
|
91
|
-
o << other[i,1]
|
92
|
-
end
|
93
|
-
i += 1
|
94
|
-
end
|
95
|
-
self.class.new(o)
|
96
|
-
end
|
97
|
-
|
98
|
-
# Mask OR is the same as ADD.
|
99
|
-
alias_method :|, :+
|
100
|
-
|
101
|
-
# Mask XAND. Where the characters are the same, the
|
102
|
-
# result is the same, where they differ the result
|
103
|
-
# reflects the later.
|
104
|
-
#
|
105
|
-
# "abc..123" "ab..789."
|
106
|
-
# * "ab..789." | "abc..123"
|
107
|
-
# ---------- ----------
|
108
|
-
# "ab..789." "abc..123"
|
109
|
-
#
|
110
|
-
def *(other)
|
111
|
-
i = 0
|
112
|
-
o = ''
|
113
|
-
while i < string.size
|
114
|
-
if (c = string[i,1]) == other[i,1]
|
115
|
-
o << c
|
116
|
-
else
|
117
|
-
o << other[i,1]
|
118
|
-
end
|
119
|
-
i += 1
|
120
|
-
end
|
121
|
-
self.class.new(o)
|
122
|
-
end
|
123
|
-
|
124
|
-
# Mask AND. Only where they are
|
125
|
-
# then same filters through.
|
126
|
-
#
|
127
|
-
# "abc..123" "ab..789."
|
128
|
-
# & "ab..789." | "abc..123"
|
129
|
-
# ---------- ----------
|
130
|
-
# "ab......" "ab......"
|
131
|
-
#
|
132
|
-
def &(other)
|
133
|
-
i = 0
|
134
|
-
o = ''
|
135
|
-
while i < string.size
|
136
|
-
if (c = string[i,1]) == other[i,1]
|
137
|
-
o << c
|
138
|
-
else
|
139
|
-
o << ESC
|
140
|
-
end
|
141
|
-
i += 1
|
142
|
-
end
|
143
|
-
self.class.new(o)
|
144
|
-
end
|
145
|
-
|
146
|
-
# Mask XOR operation. Only where there
|
147
|
-
# is an empty slot will the value filter.
|
148
|
-
#
|
149
|
-
# "abc..123" "ab..789."
|
150
|
-
# | "ab..789." | "abc..123"
|
151
|
-
# ---------- ----------
|
152
|
-
# "..c.7..3" "..c.7..3"
|
153
|
-
#
|
154
|
-
def ^(other)
|
155
|
-
i = 0
|
156
|
-
o = ''
|
157
|
-
while i < string.size
|
158
|
-
if string[i,1] == ESC
|
159
|
-
o << other[i,1]
|
160
|
-
elsif other[i,1] == ESC
|
161
|
-
o << string[i,1]
|
162
|
-
else
|
163
|
-
o << ESC
|
164
|
-
end
|
165
|
-
i += 1
|
166
|
-
end
|
167
|
-
self.class.new(o)
|
168
|
-
end
|
169
|
-
|
170
|
-
#
|
171
|
-
def ==(other)
|
172
|
-
case other
|
173
|
-
when String::Mask
|
174
|
-
string == other.string
|
175
|
-
else
|
176
|
-
string == other.to_s
|
177
|
-
end
|
178
|
-
end
|
179
|
-
|
180
|
-
# Apply a method to the internal string
|
181
|
-
# and return a new mask.
|
182
|
-
def apply(s=nil,*a,&b)
|
183
|
-
if s
|
184
|
-
string.send(s,*a,&b).to_mask
|
185
|
-
else
|
186
|
-
@_self ||= Functor.new do |op, *a|
|
187
|
-
string.send(op,*a).to_mask
|
188
|
-
end
|
189
|
-
end
|
190
|
-
end
|
191
|
-
|
192
|
-
def replace(string)
|
193
|
-
@string = string.to_s
|
194
|
-
end
|
195
|
-
|
196
|
-
def instance_delegate
|
197
|
-
@string
|
198
|
-
end
|
199
|
-
|
200
|
-
# Functor on the interal string.
|
201
|
-
#def self
|
202
|
-
# @_self ||= Functor.new do |op, *a|
|
203
|
-
# @string = @string.send(op, *a)
|
204
|
-
# end
|
205
|
-
#end
|
206
|
-
|
207
|
-
# Delegate any missing methods to underlying string.
|
208
|
-
#
|
209
|
-
def method_missing(s, *a, &b)
|
210
|
-
begin
|
211
|
-
str = string.send(s, *a, &b)
|
212
|
-
rescue NoMethodError
|
213
|
-
super(s, *a, &b)
|
214
|
-
end
|
215
|
-
end
|
216
|
-
|
217
|
-
end
|
218
|
-
end
|
219
|
-
|
220
|
-
|
221
|
-
=begin spec
|
222
|
-
|
223
|
-
require 'quarry/spec'
|
224
|
-
|
225
|
-
Quarry.spec "String::Mask" do
|
226
|
-
|
227
|
-
x1 = String::Mask["abc..123", '.']
|
228
|
-
x2 = String::Mask["ab..789.", '.']
|
229
|
-
|
230
|
-
verify "sub" do
|
231
|
-
r = x1 - x2
|
232
|
-
a = String::Mask["....789.", '.']
|
233
|
-
r.assert == a
|
234
|
-
r = x2 - x1
|
235
|
-
a = String::Mask["..c..123", '.']
|
236
|
-
r.assert == a
|
237
|
-
end
|
238
|
-
|
239
|
-
verify "add" do
|
240
|
-
r = x1 + x2
|
241
|
-
a = String::Mask["abc.7893", '.']
|
242
|
-
r.assert == a
|
243
|
-
r = x2 + x1
|
244
|
-
a = String::Mask["abc.7123", '.']
|
245
|
-
r.assert == a
|
246
|
-
end
|
247
|
-
|
248
|
-
verify "xand" do
|
249
|
-
r = x1 * x2
|
250
|
-
a = String::Mask["ab..789.", '.']
|
251
|
-
r.assert == a
|
252
|
-
r = x2 * x1
|
253
|
-
a = String::Mask["abc..123", '.']
|
254
|
-
r.assert == a
|
255
|
-
end
|
256
|
-
|
257
|
-
verify "and" do
|
258
|
-
r = x1 & x2
|
259
|
-
a = String::Mask["ab......", '.']
|
260
|
-
r.assert == a
|
261
|
-
r = x2 & x1
|
262
|
-
a = String::Mask["ab......", '.']
|
263
|
-
r.assert == a
|
264
|
-
end
|
265
|
-
|
266
|
-
verify "xor" do
|
267
|
-
r = x1 ^ x2
|
268
|
-
a = String::Mask["..c.7..3", '.']
|
269
|
-
r.assert == a
|
270
|
-
r = x2 ^ x1
|
271
|
-
a = String::Mask["..c.7..3", '.']
|
272
|
-
r.assert == a
|
273
|
-
end
|
274
|
-
|
275
|
-
end
|
276
|
-
|
277
|
-
=end
|
278
|
-
|
@@ -1,65 +0,0 @@
|
|
1
|
-
module English
|
2
|
-
|
3
|
-
# = String Obfuscation
|
4
|
-
#
|
5
|
-
# The Obfuscate mixin provides a means of applying common
|
6
|
-
# scrambling patterns to strings.
|
7
|
-
#
|
8
|
-
# This module is automatically mixed into the String class, but
|
9
|
-
# the mixin is designed in such a way that it can be mixed into
|
10
|
-
# any class that supports the #to_s method.
|
11
|
-
#
|
12
|
-
# Examples
|
13
|
-
#
|
14
|
-
# "superman".jumble #=> "SUpeRmAn"
|
15
|
-
#
|
16
|
-
module Obfuscate
|
17
|
-
|
18
|
-
# Jumble string.
|
19
|
-
#
|
20
|
-
#
|
21
|
-
def jumble
|
22
|
-
j = ''
|
23
|
-
to_s.split(//).each_with_index{ |c,i| j << ( i % 2 == 0 ? c.downcase : c.upcase ) }
|
24
|
-
j
|
25
|
-
end
|
26
|
-
|
27
|
-
# Dresener Obfuscation.
|
28
|
-
#
|
29
|
-
# Scramble the inner characters of words leaving the text still readable
|
30
|
-
# (research at Cambridge University, code by KurtDresner).
|
31
|
-
#
|
32
|
-
# For example, the above text may result in:
|
33
|
-
#
|
34
|
-
# Srblamce the iennr cchrteaars of wodrs lvenaig the txet stlil rbeaadle
|
35
|
-
# (rreceash at Cbamigdre Uverintisy, cdoe by KrneruestDr?)
|
36
|
-
#
|
37
|
-
# :credit: Kurt Dresener
|
38
|
-
def dresner
|
39
|
-
to_s.gsub(/\B\w+\B/){$&.split(//).sort_by{rand}}
|
40
|
-
end
|
41
|
-
|
42
|
-
# Include Replace mixin if base class/module supports #replace method.
|
43
|
-
def self.included(base)
|
44
|
-
if base.instance_methods.include?('replace') or
|
45
|
-
base.instance_methods.include?(:replace) # Ruby 1.9
|
46
|
-
base.module_eval{ include Replace }
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
# TODO: Replace this will dynamic generate of inplace methods.
|
51
|
-
# But only when the base defines #replace (?) Need to
|
52
|
-
# think about this some more.
|
53
|
-
module Replace
|
54
|
-
def jumble! ; replace(jumble) ; end
|
55
|
-
def dresner! ; replace(dresner) ; end
|
56
|
-
end
|
57
|
-
|
58
|
-
end
|
59
|
-
|
60
|
-
end
|
61
|
-
|
62
|
-
class String #:nodoc:
|
63
|
-
include English::Obfuscate
|
64
|
-
end
|
65
|
-
|
@@ -1,169 +0,0 @@
|
|
1
|
-
class String
|
2
|
-
|
3
|
-
# = String Stylization Extensions
|
4
|
-
#
|
5
|
-
# The Stylize mixin provides common transformation to strings.
|
6
|
-
#
|
7
|
-
# This module is automatically mixed into the String class, but
|
8
|
-
# the mixin is designed in such a way that it can be mixed into
|
9
|
-
# any class that supports the #to_s method.
|
10
|
-
#
|
11
|
-
# Examples
|
12
|
-
#
|
13
|
-
# "super_man".dasherize #=> "super-man"
|
14
|
-
#
|
15
|
-
#--
|
16
|
-
# TODO: With #pathize, is downcasing really needed? After all paths
|
17
|
-
# can have capitalize letters ;p
|
18
|
-
#
|
19
|
-
# TODO: With #methodize, is downcasing any but the first letter
|
20
|
-
# really needed? Desipite Matz preference methods can have
|
21
|
-
# capitalized letters.
|
22
|
-
#++
|
23
|
-
module Stylize
|
24
|
-
|
25
|
-
# Ordinalize turns a number string into an ordinal string
|
26
|
-
# used to denote the position in an ordered sequence such
|
27
|
-
# as 1st, 2nd, 3rd, 4th.
|
28
|
-
#
|
29
|
-
# '1'.ordinalize # => "1st"
|
30
|
-
# '2'.ordinalize # => "2nd"
|
31
|
-
# '1002'.ordinalize # => "1002nd"
|
32
|
-
# '1003'.ordinalize # => "1003rd"
|
33
|
-
#
|
34
|
-
def ordinalize
|
35
|
-
number_string = to_s
|
36
|
-
if number_string =~ /\d{1,2}$/
|
37
|
-
number = $1.to_i
|
38
|
-
if (11..13).include?(number.to_i % 100)
|
39
|
-
r = "#{number}th"
|
40
|
-
else
|
41
|
-
r = case number.to_i % 10
|
42
|
-
when 1; "#{number}st"
|
43
|
-
when 2; "#{number}nd"
|
44
|
-
when 3; "#{number}rd"
|
45
|
-
else "#{number}th"
|
46
|
-
end
|
47
|
-
end
|
48
|
-
number_string.sub(/\d{1,2}$/, r)
|
49
|
-
else
|
50
|
-
number_string
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
# Replaces underscores with dashes in the string.
|
55
|
-
#
|
56
|
-
# "puni_puni".dasherize #=> "puni-puni"
|
57
|
-
#
|
58
|
-
def dasherize
|
59
|
-
to_s.gsub(/_/, '-')
|
60
|
-
end
|
61
|
-
|
62
|
-
# The reverse of +camelize+. Makes an underscored, lowercase form from
|
63
|
-
# the expression in the string.
|
64
|
-
#
|
65
|
-
# Changes '::' to '/' to convert namespaces to paths.
|
66
|
-
#
|
67
|
-
# "ActiveRecord".underscore #=> "active_record"
|
68
|
-
# "ActiveRecord::Errors".underscore #=> active_record/errors
|
69
|
-
#
|
70
|
-
def underscore
|
71
|
-
to_s.
|
72
|
-
gsub(/::/, '/').
|
73
|
-
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
|
74
|
-
gsub(/([a-z\d])([A-Z])/,'\1_\2').
|
75
|
-
tr("-", "_").
|
76
|
-
downcase
|
77
|
-
end
|
78
|
-
|
79
|
-
# Converts a module or method name into a unix pathname.
|
80
|
-
# This method is geared toward code reflection.
|
81
|
-
#
|
82
|
-
# "MyModule::MyClass".pathize #=> my_module/my_class
|
83
|
-
# "my_module__my_class".pathize #=> my_module/my_class
|
84
|
-
#
|
85
|
-
# TODO: Make sure that all scenarios return a valid unix path.
|
86
|
-
# TODO: Make sure it is revertible.
|
87
|
-
#
|
88
|
-
# See also #modulize, #methodize
|
89
|
-
def pathize
|
90
|
-
to_s.
|
91
|
-
gsub(/__/, '/').
|
92
|
-
gsub(/::/, '/').
|
93
|
-
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
|
94
|
-
gsub(/([a-z\d])([A-Z])/,'\1_\2').
|
95
|
-
tr("-", "_").
|
96
|
-
downcase
|
97
|
-
end
|
98
|
-
|
99
|
-
# Converts a module name into a valid method name.
|
100
|
-
# This method is geared toward code reflection.
|
101
|
-
#
|
102
|
-
# Examples
|
103
|
-
# "SuperMan".methodize #=> "super_man"
|
104
|
-
# "SuperMan::Errors".methodize #=> "super_man__errors
|
105
|
-
# "MyModule::MyClass".methodize #=> "my_module__my_class"
|
106
|
-
#
|
107
|
-
# See also #modulize, #pathize
|
108
|
-
def methodize
|
109
|
-
to_s.
|
110
|
-
gsub(/\//, '__').
|
111
|
-
gsub(/::/, '__').
|
112
|
-
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
|
113
|
-
gsub(/([a-z\d])([A-Z])/,'\1_\2').
|
114
|
-
tr("-", "_").
|
115
|
-
downcase
|
116
|
-
end
|
117
|
-
|
118
|
-
# Converts a pathized or methodized string into a valid ruby
|
119
|
-
# class or module name. This method is geared toward code
|
120
|
-
# reflection.
|
121
|
-
#
|
122
|
-
# "camel_case".modulize #=> "CamelCase"
|
123
|
-
# "camel/case".modulize #=> "Camel::Case"
|
124
|
-
# "my_module__my_path".modulize #=> "MyModule::MyPath"
|
125
|
-
#
|
126
|
-
# See also #methodize, #pathize
|
127
|
-
def modulize
|
128
|
-
to_s.
|
129
|
-
gsub(/__(.?)/){ "::#{$1.upcase}" }.
|
130
|
-
gsub(/\/(.?)/){ "::#{$1.upcase}" }.
|
131
|
-
gsub(/(?:_+)([a-z])/){ $1.upcase }.
|
132
|
-
gsub(/(^|\s+)([a-z])/){ $1 + $2.upcase }
|
133
|
-
end
|
134
|
-
|
135
|
-
# Removes the module part from a modularized expression.
|
136
|
-
#
|
137
|
-
# "English::Style".demodulize #=> "Style"
|
138
|
-
# "Style".demodulize #=> "Style"
|
139
|
-
#
|
140
|
-
#def demodulize
|
141
|
-
# to_s.gsub(/^.*::/, '')
|
142
|
-
#end
|
143
|
-
|
144
|
-
# Include Replace mixin if base class/module supports #replace method.
|
145
|
-
def self.included(base)
|
146
|
-
if base.instance_methods.include?('replace') or
|
147
|
-
base.instance_methods.include?(:replace) # Ruby 1.9
|
148
|
-
base.module_eval{ include Replace }
|
149
|
-
end
|
150
|
-
end
|
151
|
-
|
152
|
-
# In place versions of Stylize methods.
|
153
|
-
module Replace
|
154
|
-
def ordinalize! ; replace(ordinalize) ; end
|
155
|
-
def pathize! ; replace(pathize) ; end
|
156
|
-
def methodize! ; replace(methodize) ; end
|
157
|
-
def modulize! ; replace(modulize) ; end
|
158
|
-
def dasherize! ; replace(dasherize) ; end
|
159
|
-
def underscore! ; replace(underscore) ; end
|
160
|
-
end
|
161
|
-
|
162
|
-
end
|
163
|
-
|
164
|
-
end
|
165
|
-
|
166
|
-
class String #:nodoc:
|
167
|
-
include String::Stylize
|
168
|
-
end
|
169
|
-
|