zucker 1 → 2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (131) hide show
  1. data/CHANGELOG +14 -0
  2. data/Rakefile +14 -4
  3. data/lib/zucker.rb +0 -4
  4. data/lib/zucker/2/D.rb +19 -0
  5. data/lib/zucker/2/aliases.rb +28 -0
  6. data/lib/zucker/2/all.rb +6 -0
  7. data/lib/zucker/2/array.rb +17 -0
  8. data/lib/zucker/2/array2proc.rb +16 -0
  9. data/lib/zucker/2/binding.rb +25 -0
  10. data/lib/zucker/2/blank.rb +26 -0
  11. data/lib/zucker/2/class2proc.rb +10 -0
  12. data/lib/zucker/2/debug.rb +4 -0
  13. data/lib/zucker/2/default.rb +25 -0
  14. data/lib/zucker/2/desc/D.yaml +23 -0
  15. data/lib/zucker/2/desc/aliases.yaml +16 -0
  16. data/lib/zucker/2/desc/array.yaml +14 -0
  17. data/lib/zucker/2/desc/array2proc.yaml +17 -0
  18. data/lib/zucker/2/desc/binding.yaml +10 -0
  19. data/lib/zucker/2/desc/blank.yaml +10 -0
  20. data/lib/zucker/2/desc/class2proc.yaml +12 -0
  21. data/lib/zucker/2/desc/egonil.yaml +17 -0
  22. data/lib/zucker/2/desc/enumerable.yaml +11 -0
  23. data/lib/zucker/2/desc/hash.yaml +14 -0
  24. data/lib/zucker/2/desc/hash2proc.yaml +11 -0
  25. data/lib/zucker/2/desc/info.yaml +12 -0
  26. data/lib/zucker/2/desc/iterate.yaml +17 -0
  27. data/lib/zucker/2/desc/ivars.yaml +20 -0
  28. data/lib/zucker/2/desc/kernel.yaml +13 -0
  29. data/lib/zucker/2/desc/mcopy.yaml +12 -0
  30. data/lib/zucker/2/desc/mm.yaml +12 -0
  31. data/lib/zucker/2/desc/regexp2proc.yaml +13 -0
  32. data/lib/zucker/2/desc/sandbox.yaml +19 -0
  33. data/lib/zucker/2/desc/square_brackets_for.yaml +23 -0
  34. data/lib/zucker/2/desc/string.yaml +13 -0
  35. data/lib/zucker/2/desc/unary.yaml +15 -0
  36. data/lib/zucker/2/desc/union.yaml +11 -0
  37. data/lib/zucker/2/doc/zucker_doc.html +1494 -0
  38. data/lib/zucker/2/doc/zucker_doc.rb +498 -0
  39. data/lib/zucker/2/egonil.rb +14 -0
  40. data/lib/zucker/2/enumerable.rb +12 -0
  41. data/lib/zucker/2/hash.rb +19 -0
  42. data/lib/zucker/2/hash2proc.rb +14 -0
  43. data/lib/zucker/2/info.rb +164 -0
  44. data/lib/zucker/2/iterate.rb +23 -0
  45. data/lib/zucker/2/ivars.rb +26 -0
  46. data/lib/zucker/2/kernel.rb +18 -0
  47. data/lib/zucker/2/mcopy.rb +9 -0
  48. data/lib/zucker/2/mm.rb +31 -0
  49. data/lib/zucker/2/regexp2proc.rb +10 -0
  50. data/lib/zucker/2/sandbox.rb +19 -0
  51. data/lib/zucker/2/spec/D_spec.rb +35 -0
  52. data/lib/zucker/2/spec/aliases_spec.rb +13 -0
  53. data/lib/zucker/2/spec/array2proc_spec.rb +12 -0
  54. data/lib/zucker/2/spec/array_spec.rb +23 -0
  55. data/lib/zucker/2/spec/binding_spec.rb +8 -0
  56. data/lib/zucker/2/spec/blank_spec.rb +20 -0
  57. data/lib/zucker/2/spec/class2proc_spec.rb +9 -0
  58. data/lib/zucker/2/spec/egonil_spec.rb +30 -0
  59. data/lib/zucker/2/spec/enumerable_spec.rb +8 -0
  60. data/lib/zucker/2/spec/hash2proc_spec.rb +12 -0
  61. data/lib/zucker/2/spec/hash_spec.rb +17 -0
  62. data/lib/zucker/2/spec/info_spec.rb +8 -0
  63. data/lib/zucker/2/spec/iterate_spec.rb +54 -0
  64. data/lib/zucker/2/spec/ivars_spec.rb +20 -0
  65. data/lib/zucker/2/spec/kernel_spec.rb +28 -0
  66. data/lib/zucker/2/spec/mcopy_spec.rb +13 -0
  67. data/lib/zucker/2/spec/mm_spec.rb +8 -0
  68. data/lib/zucker/2/spec/regexp2proc_spec.rb +9 -0
  69. data/lib/zucker/2/spec/sandbox_spec.rb +26 -0
  70. data/lib/zucker/2/spec/spec_helper.rb +18 -0
  71. data/lib/zucker/2/spec/square_brackets_for_spec.rb +59 -0
  72. data/lib/zucker/2/spec/string_spec.rb +29 -0
  73. data/lib/zucker/2/spec/unary_spec.rb +26 -0
  74. data/lib/zucker/2/spec/union_spec.rb +15 -0
  75. data/lib/zucker/2/square_brackets_for.rb +20 -0
  76. data/lib/zucker/2/string.rb +25 -0
  77. data/lib/zucker/2/unary.rb +22 -0
  78. data/lib/zucker/2/union.rb +14 -0
  79. data/lib/zucker/all.rb +2 -2
  80. data/lib/zucker/array2proc.rb +7 -1
  81. data/lib/zucker/debug.rb +3 -3
  82. data/lib/zucker/default.rb +1 -1
  83. data/lib/zucker/desc/D.yaml +1 -1
  84. data/lib/zucker/desc/array.yaml +1 -1
  85. data/lib/zucker/desc/array2proc.yaml +5 -1
  86. data/lib/zucker/desc/binding.yaml +2 -2
  87. data/lib/zucker/desc/blank.yaml +1 -3
  88. data/lib/zucker/desc/egonil.yaml +1 -1
  89. data/lib/zucker/desc/enumerable.yaml +1 -1
  90. data/lib/zucker/desc/hash.yaml +4 -2
  91. data/lib/zucker/desc/info.yaml +12 -0
  92. data/lib/zucker/desc/kernel.yaml +2 -2
  93. data/lib/zucker/desc/mm.yaml +3 -3
  94. data/lib/zucker/desc/regexp2proc.yaml +1 -1
  95. data/lib/zucker/desc/sandbox.yaml +6 -1
  96. data/lib/zucker/desc/string.yaml +1 -1
  97. data/lib/zucker/desc/unary.yaml +2 -2
  98. data/lib/zucker/desc/union.yaml +1 -1
  99. data/lib/zucker/doc/zucker_doc.html +441 -233
  100. data/lib/zucker/doc/zucker_doc.rb +32 -27
  101. data/lib/zucker/hash.rb +3 -3
  102. data/lib/zucker/info.rb +164 -0
  103. data/lib/zucker/ivars.rb +1 -1
  104. data/lib/zucker/kernel.rb +2 -4
  105. data/lib/zucker/sandbox.rb +7 -3
  106. data/lib/zucker/spec/D_spec.rb +15 -7
  107. data/lib/zucker/spec/aliases_spec.rb +3 -24
  108. data/lib/zucker/spec/array2proc_spec.rb +5 -1
  109. data/lib/zucker/spec/array_spec.rb +1 -1
  110. data/lib/zucker/spec/binding_spec.rb +4 -2
  111. data/lib/zucker/spec/blank_spec.rb +1 -1
  112. data/lib/zucker/spec/class2proc_spec.rb +1 -1
  113. data/lib/zucker/spec/egonil_spec.rb +1 -1
  114. data/lib/zucker/spec/enumerable_spec.rb +1 -1
  115. data/lib/zucker/spec/hash2proc_spec.rb +1 -1
  116. data/lib/zucker/spec/hash_spec.rb +10 -3
  117. data/lib/zucker/spec/info_spec.rb +8 -0
  118. data/lib/zucker/spec/iterate_spec.rb +1 -1
  119. data/lib/zucker/spec/ivars_spec.rb +1 -1
  120. data/lib/zucker/spec/kernel_spec.rb +1 -7
  121. data/lib/zucker/spec/mcopy_spec.rb +1 -1
  122. data/lib/zucker/spec/mm_spec.rb +4 -2
  123. data/lib/zucker/spec/regexp2proc_spec.rb +1 -1
  124. data/lib/zucker/spec/sandbox_spec.rb +22 -3
  125. data/lib/zucker/spec/spec_helper.rb +18 -0
  126. data/lib/zucker/spec/square_brackets_for_spec.rb +1 -1
  127. data/lib/zucker/spec/string_spec.rb +7 -7
  128. data/lib/zucker/spec/unary_spec.rb +1 -1
  129. data/lib/zucker/spec/union_spec.rb +8 -6
  130. metadata +207 -131
  131. data/lib/zucker/doc/meta.yaml +0 -4
@@ -0,0 +1,20 @@
1
+ def square_brackets_for(ivar, assignment = true)
2
+ # undef [] if respond_to? :[]
3
+ # undef []= if respond_to? :[]=
4
+
5
+ #instance_eval do
6
+ define_method :[] do |key|
7
+ (instance_variable_get :"@#{ivar}")[key]
8
+ end
9
+
10
+ if assignment
11
+ define_method :[]= do |key, value|
12
+ (instance_variable_get :"@#{ivar}")[key] = value
13
+ end
14
+ end
15
+ #end
16
+
17
+ end
18
+
19
+ # J-_-L
20
+
@@ -0,0 +1,25 @@
1
+ class String
2
+ def ^(pos)
3
+ pos = pos.to_i
4
+ if pos >= 0
5
+ self[pos..-1]
6
+ else
7
+ self[0...pos]
8
+ end
9
+ end
10
+
11
+ def lchomp(arg=$/)
12
+ self.reverse.chomp(arg).reverse
13
+ end
14
+
15
+ def lchomp!(arg=$/)
16
+ self.reverse.chomp!(arg).reverse
17
+ end
18
+
19
+ def ords
20
+ self.unpack 'C*'
21
+ end
22
+ end
23
+
24
+ # J-_-L
25
+
@@ -0,0 +1,22 @@
1
+ class String
2
+ def +@
3
+ self
4
+ end
5
+
6
+ def -@
7
+ to_sym
8
+ end
9
+ end
10
+
11
+ class Symbol
12
+ def +@
13
+ to_s
14
+ end
15
+
16
+ def -@
17
+ self
18
+ end
19
+ end
20
+
21
+ # J-_-L
22
+
@@ -0,0 +1,14 @@
1
+ class Regexp
2
+ def |(arg)
3
+ Regexp.union self, arg.is_a?(Regexp) ? arg : arg.to_s
4
+ end
5
+ end
6
+
7
+ class String
8
+ def |(arg)
9
+ Regexp.union self, arg.is_a?(Regexp) ? arg : arg.to_s
10
+ end
11
+ end
12
+
13
+ # J-_-L
14
+
@@ -1,6 +1,6 @@
1
1
  # require all the sugar ;)
2
2
  # see README for an explaination of what they do
3
3
 
4
- require 'zucker/1/default'
5
- require 'zucker/1/debug'
4
+ require 'zucker/default'
5
+ require 'zucker/debug'
6
6
 
@@ -1,7 +1,13 @@
1
1
  class Array
2
2
  def to_proc
3
3
  Proc.new{ |obj|
4
- obj.send *self
4
+ if self.first.is_a? Array
5
+ self.inject(obj){ |result, nested_array|
6
+ nested_array.to_proc.call result
7
+ }
8
+ else
9
+ obj.send *self
10
+ end
5
11
  }
6
12
  end
7
13
  end
@@ -1,4 +1,4 @@
1
- require 'zucker/1/D'
2
- require 'zucker/1/mm'
3
- require 'zucker/1/binding'
1
+ require 'zucker/D'
2
+ require 'zucker/mm'
3
+ require 'zucker/binding'
4
4
 
@@ -21,5 +21,5 @@ unary
21
21
  union
22
22
  |
23
23
 
24
- zucker.each{|rb| require "zucker/1/#{rb}"}
24
+ zucker.each{|rb| require "zucker/#{rb}"}
25
25
 
@@ -16,7 +16,7 @@ D:
16
16
  # => 'Hello Earth'
17
17
  package: debug
18
18
  info:
19
- - "This is inspired by the funny →⇧.tap⇧ method→http://moonbase.rydia.net/mental/blog/programming/eavesdropping-on-expressions"
19
+ - "This is inspired by the funny →⇧.tap⇧ method→http://moonbase.rydia.net/mental/blog/programming/eavesdropping-on-expressions→."
20
20
  versions:
21
21
  - 1.9
22
22
  - 1.8
@@ -2,7 +2,7 @@ array:
2
2
  summary: Methods one could miss for ⇧Array⇧.
3
3
  why:
4
4
  - ⇧Array⇧ has ⇧&⇧ and ⇧|⇧, but why does it not have ⇧^⇧?
5
- - ⇧sum⇧ is an alias for ⇧inject(:+)⇧, but it is just needed pretty often!
5
+ - ⇧sum⇧ is just an alias for ⇧inject(:+)⇧, but it is needed pretty often..
6
6
  methods:
7
7
  Array#^: "[1,2,3,4] ^ [3,4,5,6] # => [1,2,5,6]"
8
8
  Array#sum: "[1,2,3,4,5].sum # => 15"
@@ -2,10 +2,14 @@ array2proc:
2
2
  summary: Calls the method named by the first paramenter and passes the other elements as paramaters.
3
3
  why: When using ⇧Symbol#to_proc⇧, you often wish to pass parameters.
4
4
  methods:
5
- Array#to_proc: '[1,2,3,4].map( &[:to_s, 2] ) # => ["1", "10", "11", "100"]'
5
+ Array#to_proc: |
6
+ [1,2,3,4].map &[:*, 5] # => [5, 10, 15, 20]
7
+ # you can also chain them, if the first parameter is an Array
8
+ [1,2,3,4].map &[[:to_s, 2],[:+, 'b']] # => ["1b", "10b", "11b", "100b"]
6
9
  info:
7
10
  - Inspired by →this article→http://www.sanityinc.com/articles/adding-array-to-proc-to-ruby→.
8
11
  - "More about →to_proc→http://rbjl.net/29-become-a-proc-star→."
12
+ - Chaining inspired by →eregon→http://github.com/eregon/Classes/blob/master/to_proc.rb→.
9
13
  package: default
10
14
  versions:
11
15
  - 1.9
@@ -1,6 +1,6 @@
1
1
  binding:
2
- summary: Adds a verbose Binding#inspect
3
- why: It gives you information about the current environment
2
+ summary: Adds a verbose Binding#inspect⇧.
3
+ why: It gives you information about the current environment.
4
4
  methods:
5
5
  Binding#inspect: binding.inspect
6
6
  package: debug
@@ -1,11 +1,9 @@
1
1
  blank:
2
- summary: Does pretty the same as in ActiveSupport (Every object can be asked if it is blank)
2
+ summary: Does pretty the same as in ActiveSupport (Every object can be asked if it is blank).
3
3
  why: It's too familiar ;)
4
4
  methods:
5
5
  Object#blank?: "'an object'.blank? # => false"
6
6
  package: default
7
- info:
8
- - See ActiveSupport
9
7
  versions:
10
8
  - 1.9
11
9
  - 1.8
@@ -10,7 +10,7 @@ egonil:
10
10
  # => 5
11
11
  package: default
12
12
  info:
13
- - See →this post→http://rbjl.net/26-the-28-bytes-of-ruby-joy→ for more information and discussion
13
+ - See →this post→http://rbjl.net/26-the-28-bytes-of-ruby-joy→ for more information and discussion.
14
14
  versions:
15
15
  - 1.9
16
16
  - 1.8
@@ -4,7 +4,7 @@ enumerable:
4
4
  Enumerable#mash: "[1,2,3].mash{|e| [e, e.to_s] } # => {1=>'1',2=>'2',3=>'3'}"
5
5
  package: default
6
6
  info:
7
- - Inspired by Ruby Facets' mash
7
+ - Inspired by Ruby Facets' mash⇧.
8
8
  versions:
9
9
  - 1.9
10
10
  - 1.8
@@ -2,10 +2,12 @@ hash:
2
2
  summary: Some sugar for dealing with hashs.
3
3
  methods:
4
4
  Hash.zip: "Hash.zip [1,2,3], [4,5,6] # => {1 => 4, 2 => 5, 3 => 6}"
5
- Hash#<<: "{1 => 2} << [3, 4] # => {1 => 2, 3 => 4}"
5
+ Hash#<<: |
6
+ {1 => 2} << [3, 4] # => { 1 => 2, 3 => 4 }
7
+ {1 => 2} << { 5=>6 } # => { 1 => 2, 5 => 6 }
6
8
  package: default
7
9
  info:
8
- - Some of the operators are inspired by Ruby Facets
10
+ - Some of the operators are inspired by Ruby Facets.
9
11
  versions:
10
12
  - 1.9
11
13
  - 1.8
@@ -0,0 +1,12 @@
1
+ info:
2
+ summary: Access environment information with the ⇧Info⇧ module.
3
+ why: "You don't need to remember in which global variable, constant or special method the information you are searching for is hidden."
4
+ methods:
5
+ Info: |
6
+ # see the source file for the list of accessors
7
+ # you could also add them to the global namespace with: include Info
8
+ package: default
9
+ versions:
10
+ - 1.9
11
+ - 1.8 (not all information)
12
+
@@ -1,6 +1,6 @@
1
1
  kernel:
2
- summary: Some useful general shortcut methods
3
- why: Readability
2
+ summary: Some useful general shortcut methods.
3
+ why: Readability.
4
4
  methods:
5
5
  activate_warnings!: "activate_warnings! # sets $VERBOSE to 1"
6
6
  deactivate_warnings!: "deactivate_warnings! # sets $VERBOSE to 0"
@@ -1,12 +1,12 @@
1
1
  mm:
2
2
  summary: ⇧mm⇧ displays an ordered public method list.
3
- why: See some object's methods without those rarely used inherited methods
3
+ why: See one object's methods without those rarely used inherited methods.
4
4
  methods:
5
5
  Object#method_list, Object#mm: "'test'.mm 2 # outputs the list (2 levels deep)"
6
6
  package: debug
7
7
  info:
8
- - See →this article→http://rbjl.net/31-the-multi-mega-method-list→ for more information
8
+ - See →this article→http://rbjl.net/31-the-multi-mega-method-list→ for more information.
9
9
  versions:
10
10
  - 1.9
11
- - 1.8
11
+ - 1.8 (returns strings instead of symbols)
12
12
 
@@ -1,5 +1,5 @@
1
1
  regexp2proc:
2
- summary: Use &/regex/ to match it against strings
2
+ summary: Use &/regex/ to match it against strings.
3
3
  methods:
4
4
  Regexp#to_proc: |
5
5
  %w|just another string array|.map &/[jy]/ # => ["j", nil, nil, "y"]
@@ -1,12 +1,17 @@
1
1
  sandbox:
2
2
  summary: Creates a sandbox area.
3
- why: Ruby comes with sandboxes, but they are hidden (--> integrated) in the ⇧$SAFE⇧ concept
3
+ why: Ruby comes with sandboxes, but they are hidden (-> integrated) in the ⇧$SAFE⇧ concept.
4
4
  methods:
5
5
  sandbox: |
6
6
  sandbox do
7
7
  # dangerous commands throw SecurityErrors ($SAFE=4)
8
8
  end
9
9
  # everything's normal again
10
+
11
+ sandbox( lambda{} ) do
12
+ # no Exception is thrown, if non-nil parameter is passed
13
+ end
14
+ # if it is a proc, it will be run instead, if an SecurityError gets raised
10
15
  package: default
11
16
  versions:
12
17
  - 1.9
@@ -1,6 +1,6 @@
1
1
  string:
2
2
  summary: ⇧String⇧ extensions.
3
- why: Strings cannot be comfortable enough ;)
3
+ why: Strings cannot be comfortable enough ;).
4
4
  methods:
5
5
  String#^: "'Yes vs No'^3 # => 'Yes'"
6
6
  String#lchomp: "' Yes'.lchomp # => 'Yes'"
@@ -1,6 +1,6 @@
1
1
  unary:
2
2
  summary: Easy conversion between strings and symbols.
3
- why: "Sometimes, you do not care if you get a ⇧String⇧ or ⇧Symbol⇧ as input - but when analysing it, you often need to choose one format. A concise possibility for this conversion is using the unary operators ⇧String#-@⇧ and ⇧Symbol#+@⇧"
3
+ why: "Sometimes, you do not care if you get a ⇧String⇧ or ⇧Symbol⇧ as input - but when analysing it, you often need to choose one format. A concise possibility for this conversion is using the unary operators ⇧String#-@⇧ and ⇧Symbol#+@⇧."
4
4
  methods:
5
5
  String#+@: "+'was_string' # => 'was_string'"
6
6
  String#-@: "-'was_string' # => :was_string"
@@ -11,5 +11,5 @@ unary:
11
11
  - "Inspired by (I've seen the unary + for Symbol somewhere on the net... but cannot remember where...)"
12
12
  versions:
13
13
  - 1.9
14
- - 1.8 (+:literal not possible)
14
+ - 1.8 (⇧+:literal not possible)
15
15
 
@@ -1,5 +1,5 @@
1
1
  union:
2
- summary: Easy creation of ⇧Regexp.union⇧s
2
+ summary: Easy creation of ⇧Regexp.union⇧s.
3
3
  methods:
4
4
  Regexp#|, String#|: |
5
5
  /Ruby\d/ | /test/i | "cheat"
@@ -5,7 +5,7 @@
5
5
  <head>
6
6
  <meta http-equiv="content-type" content="text/html;charset=UTF-8" />
7
7
 
8
- <title>Ruby Zucker 1</title>
8
+ <title>Ruby Zucker 2</title>
9
9
  <script type="text/javascript">
10
10
  var show = function(snippet){
11
11
  document.getElementById( snippet ).style.display = 'block'
@@ -134,19 +134,12 @@ code, pre{
134
134
 
135
135
  .source{
136
136
  display:none;
137
- border:1px solid #005;
138
- # background:#111;
139
137
  width:98%;
140
-
141
- # background-color: #232323;
142
- # border: 1px solid black;
143
- # font-family: 'Courier New', 'Terminal', monospace;
144
- # color: #E6E0DB;
145
138
  padding: 3px 5px;
146
- # margin-right:1em;
147
139
  overflow: auto;
148
140
  font-size: 12px;
149
141
  background-color: #f8f8f8;
142
+ border:1px solid #005;
150
143
  border: 1px solid silver;
151
144
  font-family: 'Courier New', 'Terminal', monospace;
152
145
  color: #000;
@@ -298,9 +291,9 @@ table.source td { padding: 2px 4px; vertical-align: top; }
298
291
  <body>
299
292
  <div id="world">
300
293
 
301
- <h1>Ruby Zucker 1</h1>
294
+ <h1>Ruby Zucker 2</h1>
302
295
  <h2>What is it?</h2>
303
- <p class="text">Zucker is the German word for sugar (<a href="http://www.forvo.com/word/zucker/">pronunciation</a>). This gem adds syntactical sugar in the form of independent, lightweight scripts that make Ruby even more sweet. Read <a href="http://rbjl.net/32-introducing-ruby-zucker-a-new-syntactical-sugar-gem">this blog post</a> for a little introduction.</p>
296
+ <p class="text">Zucker is the German word for sugar (<a href="http://www.forvo.com/word/zucker/">pronunciation</a>). It adds syntactical sugar in the form of independent, small scripts that make Ruby even more sweet. Read <a href="http://rbjl.net/32-introducing-ruby-zucker-a-new-syntactical-sugar-gem">this blog post</a> for a little introduction.</p>
304
297
 
305
298
  <h2>Install</h2>
306
299
  <p class="text">
@@ -321,97 +314,18 @@ table.source td { padding: 2px 4px; vertical-align: top; }
321
314
  <p class="text">You can also lock your require to a specific version of Zucker by simply putting the version before the cube name in this way:
322
315
  <code>require 'zucker/1/egonil'</code>. Future releases of the gem will include all previous (main) versions, so the behaviour of these directly required cubes will not change (except for critical bugs).</p>
323
316
 
324
- <h2 title="require 'zucker/all'">Cubes</h2>
325
- <div class="cubes">
326
- <h3 title="require 'zucker/D'">D</h3>
327
- <table class="cube_table"
328
- id="D_cube"
329
- title="require 'zucker/D'"> <tr><th>Summary</th> <td>Easy debug printing with the <code>p</code> alternative <code>.D</code>. It outputs to stdout and returns <code>self</code>. Accepts a block.</td></tr><tr><th>Methods/Usage</th> <td><h5>Object#D</h5><pre class="usage source" style="display:block">some.<span class="co">D</span>.methods.<span class="co">D</span>.noone.<span class="co">D</span>.knows.<span class="co">D</span>
330
- <span class="c"># ...outputs 4 lines with the inspected objects</span>
331
- <span class="c"># =&gt; (result)</span>
332
-
333
- <span class="i">21</span>+<span class="co">Math</span>.sin(<span class="i">42</span>).<span class="co">D</span>
334
- <span class="c"># outputs -0.916521547915634</span>
335
- <span class="c"># =&gt; 20.0834784520844</span>
336
-
337
- name = <span class="s"><span class="dl">'</span><span class="k">Earth</span><span class="dl">'</span></span>
338
- <span class="s"><span class="dl">'</span><span class="k">Hello </span><span class="dl">'</span></span> + name.<span class="co">D</span>{|e| <span class="s"><span class="dl">&quot;</span><span class="k">The length is: </span><span class="il"><span class="idl">#{</span>e.size<span class="idl">}</span></span><span class="dl">&quot;</span></span>}
339
- <span class="c"># outputs &quot;The length is: 5&quot;</span>
340
- <span class="c"># =&gt; 'Hello Earth'</span>
341
- </pre></td></tr><tr><th>Further information</th> <td>This is inspired by the funny <a href="http://moonbase.rydia.net/mental/blog/programming/eavesdropping-on-expressions"><code>.tap</code> method</a></td></tr><tr><th>Specification</th> <td> <span id="show_D_spec">(<a href="javascript:show('D_spec')">show</a>)</span>
342
- <pre class="source" id="D_spec">require <span class="s"><span class="dl">'</span><span class="k">D</span><span class="dl">'</span></span>
343
-
344
- describe <span class="s"><span class="dl">'</span><span class="k">Object#D</span><span class="dl">'</span></span> <span class="r">do</span>
345
-
346
- let <span class="sy">:a</span> <span class="r">do</span>
347
- [ <span class="i">1</span>, <span class="s"><span class="dl">&quot;</span><span class="k">1</span><span class="dl">&quot;</span></span>, <span class="i">2</span>..<span class="i">5</span>, [], {<span class="sy">:hallo</span> =&gt; <span class="sy">:du</span>}, <span class="pc">nil</span>, <span class="pc">true</span> ]
348
- <span class="r">end</span>
349
-
350
- it <span class="s"><span class="dl">'</span><span class="k">should not change the object&quot;s value</span><span class="dl">'</span></span> <span class="r">do</span>
351
- a.each{ |e|
352
- (e.<span class="co">D</span>).should == e
353
- }
354
- <span class="r">end</span>
355
-
356
- it <span class="s"><span class="dl">&quot;</span><span class="k">should puts .inspect if no block is given (and not change the object's value)</span><span class="dl">&quot;</span></span> <span class="r">do</span>
357
- <span class="c"># a.each{ |e|</span>
358
- <span class="c"># (e.D).should == e</span>
359
- <span class="c"># }</span>
360
- <span class="r">end</span>
361
-
362
- it <span class="s"><span class="dl">&quot;</span><span class="k">should puts the block if it is given (and not change the object's value)</span><span class="dl">&quot;</span></span> <span class="r">do</span>
363
- a.each{ |e|
364
- (e.<span class="co">D</span>{|value| <span class="s"><span class="dl">&quot;</span><span class="k">This is a: </span><span class="il"><span class="idl">#{</span>value<span class="idl">}</span></span><span class="dl">&quot;</span></span>}).should == e
365
- }
366
- <span class="r">end</span>
367
- <span class="r">end</span></pre> </td></tr><tr><th>Source</th> <td> <span id="show_D_source">(<a href="javascript:show('D_source')">show</a>)</span>
368
- <pre class="source" id="D_source"><span class="r">module</span> <span class="cl">Kernel</span>
369
- <span class="r">def</span> <span class="fu">D</span>(*args, &amp;block)
370
- <span class="r">if</span> args.empty?
371
- tap{
372
- <span class="r">if</span> block_given?
373
- puts <span class="r">yield</span> <span class="pc">self</span>
374
- <span class="r">else</span>
375
- puts <span class="pc">self</span>.inspect
376
- <span class="r">end</span>
377
- }
378
- <span class="r">else</span>
379
- raise <span class="co">ArgumentError</span>, <span class="s"><span class="dl">&quot;</span><span class="k">.D - The parser thought that the code after .D are method arguments... Please don't put a space after D or use .D() or .D{} in this case!</span><span class="dl">&quot;</span></span>
380
- <span class="c"># eval ...</span>
381
- <span class="r">end</span>
382
- <span class="r">end</span>
383
- <span class="r">end</span>
384
-
385
- <span class="c"># J-_-L</span></pre> </td></tr><tr><th>Compatibility</th> <td>1.9, 1.8</td></tr></table> <h3 title="require 'zucker/aliases'">aliases</h3>
317
+
318
+ <h2 title="require 'zucker/default'">Cubes[default]</h2>
319
+ <div class="cubes">
320
+ <h3 title="require 'zucker/aliases'">aliases</h3>
386
321
  <table class="cube_table"
387
322
  id="aliases_cube"
388
323
  title="require 'zucker/aliases'"> <tr><th>Summary</th> <td>Some convenient aliases (and constants) for existing methods.</td></tr><tr><th>Methods/Usage</th> <td><h5>Object#is_an?</h5><pre class="usage source" style="display:block"><span class="co">Object</span>.is_a?</pre><h5>Enumerable#with</h5><pre class="usage source" style="display:block"><span class="co">Enumerable</span><span class="c">#zip</span></pre><h5>Enumerable#%</h5><pre class="usage source" style="display:block"><span class="co">Enumerable</span><span class="c">#zip</span></pre><h5>Array#**</h5><pre class="usage source" style="display:block"><span class="co">Array</span><span class="c">#product</span></pre><h5>Hash#+</h5><pre class="usage source" style="display:block"><span class="co">Hash</span><span class="c">#merge</span></pre><h5>Binding#[]</h5><pre class="usage source" style="display:block"><span class="co">Binding</span><span class="c">#eval</span></pre><h5>Infinity</h5><pre class="usage source" style="display:block"><span class="fl">1.0</span> / <span class="fl">0.0</span></pre><h5>NaN</h5><pre class="usage source" style="display:block"><span class="fl">0.0</span> / <span class="fl">0.0</span></pre></td></tr><tr><th>Specification</th> <td> <span id="show_aliases_spec">(<a href="javascript:show('aliases_spec')">show</a>)</span>
389
- <pre class="source" id="aliases_spec">require <span class="s"><span class="dl">'</span><span class="k">aliases</span><span class="dl">'</span></span>
324
+ <pre class="source" id="aliases_spec">require <span class="s"><span class="dl">'</span><span class="k">zucker/aliases</span><span class="dl">'</span></span>
390
325
 
391
326
  describe <span class="s"><span class="dl">'</span><span class="k">(aliases)</span><span class="dl">'</span></span> <span class="r">do</span>
392
- it <span class="s"><span class="dl">'</span><span class="k">should create these aliases [ sorry, no real spec for this one :P ] </span><span class="dl">'</span></span> <span class="r">do</span>
393
- <span class="c"># alias is_an? is_a?</span>
394
-
395
- <span class="c"># module Enumerable</span>
396
- <span class="c"># alias with zip</span>
397
- <span class="c"># alias % zip</span>
398
- <span class="c"># end</span>
399
-
400
- <span class="c"># class Array</span>
401
- <span class="c"># alias ** product</span>
402
- <span class="c"># end</span>
403
-
404
- <span class="c"># class Hash</span>
405
- <span class="c"># alias + merge</span>
406
- <span class="c"># end</span>
407
-
408
- <span class="c"># class Binding</span>
409
- <span class="c"># #alias [] eval</span>
410
- <span class="c"># def [](expr)</span>
411
- <span class="c"># self.eval &quot;#{expr}&quot;</span>
412
- <span class="c"># end</span>
413
- <span class="c"># end</span>
414
-
327
+ it <span class="s"><span class="dl">'</span><span class="k">should create these aliases</span><span class="dl">'</span></span> <span class="r">do</span>
328
+ <span class="c"># see aliases.rb for aliase list</span>
415
329
  <span class="r">end</span>
416
330
 
417
331
  it <span class="s"><span class="dl">'</span><span class="k">should define these constants</span><span class="dl">'</span></span> <span class="r">do</span>
@@ -448,8 +362,8 @@ describe <span class="s"><span class="dl">'</span><span class="k">(aliases)</spa
448
362
  <span class="c"># J-_-L</span></pre> </td></tr><tr><th>Compatibility</th> <td>1.9, 1.8</td></tr></table> <h3 title="require 'zucker/array'">array</h3>
449
363
  <table class="cube_table"
450
364
  id="array_cube"
451
- title="require 'zucker/array'"> <tr><th>Summary</th> <td>Methods one could miss for <code>Array</code>.</td></tr><tr><th>Why?</th> <td><p><code>Array</code> has <code>&</code> and <code>|</code>, but why does it not have <code>^</code>?</p><p><code>sum</code> is an alias for <code>inject(:+)</code>, but it is just needed pretty often!</p></td></tr><tr><th>Methods/Usage</th> <td><h5>Array#^</h5><pre class="usage source" style="display:block">[<span class="i">1</span>,<span class="i">2</span>,<span class="i">3</span>,<span class="i">4</span>] ^ [<span class="i">3</span>,<span class="i">4</span>,<span class="i">5</span>,<span class="i">6</span>] <span class="c"># =&gt; [1,2,5,6]</span></pre><h5>Array#sum</h5><pre class="usage source" style="display:block">[<span class="i">1</span>,<span class="i">2</span>,<span class="i">3</span>,<span class="i">4</span>,<span class="i">5</span>].sum <span class="c"># =&gt; 15</span></pre><h5>Array#chrs</h5><pre class="usage source" style="display:block">[<span class="i">72</span>, <span class="i">97</span>, <span class="i">108</span>, <span class="i">108</span>, <span class="i">111</span>].chrs <span class="c"># =&gt; 'Hallo'</span></pre></td></tr><tr><th>Specification</th> <td> <span id="show_array_spec">(<a href="javascript:show('array_spec')">show</a>)</span>
452
- <pre class="source" id="array_spec">require <span class="s"><span class="dl">'</span><span class="k">array</span><span class="dl">'</span></span>
365
+ title="require 'zucker/array'"> <tr><th>Summary</th> <td>Methods one could miss for <code>Array</code>.</td></tr><tr><th>Why?</th> <td><p><code>Array</code> has <code>&</code> and <code>|</code>, but why does it not have <code>^</code>?</p><p><code>sum</code> is just an alias for <code>inject(:+)</code>, but it is needed pretty often..</p></td></tr><tr><th>Methods/Usage</th> <td><h5>Array#^</h5><pre class="usage source" style="display:block">[<span class="i">1</span>,<span class="i">2</span>,<span class="i">3</span>,<span class="i">4</span>] ^ [<span class="i">3</span>,<span class="i">4</span>,<span class="i">5</span>,<span class="i">6</span>] <span class="c"># =&gt; [1,2,5,6]</span></pre><h5>Array#sum</h5><pre class="usage source" style="display:block">[<span class="i">1</span>,<span class="i">2</span>,<span class="i">3</span>,<span class="i">4</span>,<span class="i">5</span>].sum <span class="c"># =&gt; 15</span></pre><h5>Array#chrs</h5><pre class="usage source" style="display:block">[<span class="i">72</span>, <span class="i">97</span>, <span class="i">108</span>, <span class="i">108</span>, <span class="i">111</span>].chrs <span class="c"># =&gt; 'Hallo'</span></pre></td></tr><tr><th>Specification</th> <td> <span id="show_array_spec">(<a href="javascript:show('array_spec')">show</a>)</span>
366
+ <pre class="source" id="array_spec">require <span class="s"><span class="dl">'</span><span class="k">zucker/array</span><span class="dl">'</span></span>
453
367
 
454
368
  describe <span class="s"><span class="dl">'</span><span class="k">Array#^</span><span class="dl">'</span></span> <span class="r">do</span>
455
369
  it <span class="s"><span class="dl">'</span><span class="k">should do an exclusive or</span><span class="dl">'</span></span> <span class="r">do</span>
@@ -489,59 +403,40 @@ describe <span class="s"><span class="dl">'</span><span class="k">Array#chrs</sp
489
403
  <span class="c"># J-_-L</span></pre> </td></tr><tr><th>Compatibility</th> <td>1.9, 1.8</td></tr></table> <h3 title="require 'zucker/array2proc'">array2proc</h3>
490
404
  <table class="cube_table"
491
405
  id="array2proc_cube"
492
- title="require 'zucker/array2proc'"> <tr><th>Summary</th> <td>Calls the method named by the first paramenter and passes the other elements as paramaters.</td></tr><tr><th>Why?</th> <td>When using <code>Symbol#to_proc</code>, you often wish to pass parameters.</td></tr><tr><th>Methods/Usage</th> <td><h5>Array#to_proc</h5><pre class="usage source" style="display:block">[<span class="i">1</span>,<span class="i">2</span>,<span class="i">3</span>,<span class="i">4</span>].map( &amp;[<span class="sy">:to_s</span>, <span class="i">2</span>] ) <span class="c"># =&gt; [&quot;1&quot;, &quot;10&quot;, &quot;11&quot;, &quot;100&quot;]</span></pre></td></tr><tr><th>Further information</th> <td>Inspired by <a href="http://www.sanityinc.com/articles/adding-array-to-proc-to-ruby">this article</a>.<br/>More about <a href="http://rbjl.net/29-become-a-proc-star">to_proc</a>.</td></tr><tr><th>Specification</th> <td> <span id="show_array2proc_spec">(<a href="javascript:show('array2proc_spec')">show</a>)</span>
493
- <pre class="source" id="array2proc_spec">require <span class="s"><span class="dl">'</span><span class="k">array2proc</span><span class="dl">'</span></span>
406
+ title="require 'zucker/array2proc'"> <tr><th>Summary</th> <td>Calls the method named by the first paramenter and passes the other elements as paramaters.</td></tr><tr><th>Why?</th> <td>When using <code>Symbol#to_proc</code>, you often wish to pass parameters.</td></tr><tr><th>Methods/Usage</th> <td><h5>Array#to_proc</h5><pre class="usage source" style="display:block">[<span class="i">1</span>,<span class="i">2</span>,<span class="i">3</span>,<span class="i">4</span>].map &amp;[<span class="sy">:*</span>, <span class="i">5</span>] <span class="c"># =&gt; [5, 10, 15, 20]</span>
407
+ <span class="c"># you can also chain them, if the first parameter is an Array</span>
408
+ [<span class="i">1</span>,<span class="i">2</span>,<span class="i">3</span>,<span class="i">4</span>].map &amp;[[<span class="sy">:to_s</span>, <span class="i">2</span>],[<span class="sy">:+</span>, <span class="s"><span class="dl">'</span><span class="k">b</span><span class="dl">'</span></span>]] <span class="c"># =&gt; [&quot;1b&quot;, &quot;10b&quot;, &quot;11b&quot;, &quot;100b&quot;]</span>
409
+ </pre></td></tr><tr><th>Further information</th> <td>Inspired by <a href="http://www.sanityinc.com/articles/adding-array-to-proc-to-ruby">this article</a>.<br/>More about <a href="http://rbjl.net/29-become-a-proc-star">to_proc</a>.<br/>Chaining inspired by <a href="http://github.com/eregon/Classes/blob/master/to_proc.rb">eregon</a>.</td></tr><tr><th>Specification</th> <td> <span id="show_array2proc_spec">(<a href="javascript:show('array2proc_spec')">show</a>)</span>
410
+ <pre class="source" id="array2proc_spec">require <span class="s"><span class="dl">'</span><span class="k">zucker/array2proc</span><span class="dl">'</span></span>
494
411
 
495
412
  describe <span class="s"><span class="dl">'</span><span class="k">Array#to_proc</span><span class="dl">'</span></span> <span class="r">do</span>
496
413
  it <span class="s"><span class="dl">'</span><span class="k">should call the method of the first symbol, using the remaining elements as paramaters</span><span class="dl">'</span></span> <span class="r">do</span>
497
414
  [<span class="i">1</span>,<span class="i">2</span>,<span class="i">3</span>,<span class="i">4</span>].map( &amp;[<span class="sy">:to_s</span>, <span class="i">2</span>] ).should == [<span class="s"><span class="dl">&quot;</span><span class="k">1</span><span class="dl">&quot;</span></span>, <span class="s"><span class="dl">&quot;</span><span class="k">10</span><span class="dl">&quot;</span></span>, <span class="s"><span class="dl">&quot;</span><span class="k">11</span><span class="dl">&quot;</span></span>, <span class="s"><span class="dl">&quot;</span><span class="k">100</span><span class="dl">&quot;</span></span>]
498
415
  <span class="r">end</span>
416
+
417
+ it <span class="s"><span class="dl">&quot;</span><span class="k">should convert each element to a proc and chain it, if the first parameter is an array</span><span class="dl">&quot;</span></span> <span class="r">do</span>
418
+ [<span class="i">1</span>,<span class="i">2</span>,<span class="i">3</span>,<span class="i">4</span>].map( &amp;[[<span class="sy">:*</span>,<span class="i">2</span>],[<span class="sy">:+</span>,<span class="i">4</span>]] ).should == [<span class="i">1</span>,<span class="i">2</span>,<span class="i">3</span>,<span class="i">4</span>].map{|i| i*<span class="i">2</span> + <span class="i">4</span> }
419
+ <span class="r">end</span>
499
420
  <span class="r">end</span></pre> </td></tr><tr><th>Source</th> <td> <span id="show_array2proc_source">(<a href="javascript:show('array2proc_source')">show</a>)</span>
500
421
  <pre class="source" id="array2proc_source"><span class="r">class</span> <span class="cl">Array</span>
501
422
  <span class="r">def</span> <span class="fu">to_proc</span>
502
423
  <span class="co">Proc</span>.new{ |obj|
503
- obj.send *<span class="pc">self</span>
504
- }
505
- <span class="r">end</span>
506
- <span class="r">end</span>
507
-
508
- <span class="c"># J-_-L</span></pre> </td></tr><tr><th>Compatibility</th> <td>1.9, 1.8</td></tr></table> <h3 title="require 'zucker/binding'">binding</h3>
509
- <table class="cube_table"
510
- id="binding_cube"
511
- title="require 'zucker/binding'"> <tr><th>Summary</th> <td>Adds a verbose Binding#inspect</td></tr><tr><th>Why?</th> <td>It gives you information about the current environment</td></tr><tr><th>Methods/Usage</th> <td><h5>Binding#inspect</h5><pre class="usage source" style="display:block">binding.inspect</pre></td></tr><tr><th>Specification</th> <td> <span id="show_binding_spec">(<a href="javascript:show('binding_spec')">show</a>)</span>
512
- <pre class="source" id="binding_spec">require <span class="s"><span class="dl">'</span><span class="k">binding</span><span class="dl">'</span></span>
513
-
514
- describe <span class="s"><span class="dl">'</span><span class="k">Binding#inspect</span><span class="dl">'</span></span> <span class="r">do</span>
515
- it <span class="s"><span class="dl">'</span><span class="k">should output the current environment</span><span class="dl">'</span></span>
516
- <span class="r">end</span></pre> </td></tr><tr><th>Source</th> <td> <span id="show_binding_source">(<a href="javascript:show('binding_source')">show</a>)</span>
517
- <pre class="source" id="binding_source"><span class="r">class</span> <span class="cl">Binding</span>
518
- <span class="r">def</span> <span class="fu">inspect</span>
519
- put_vars = lambda { |array|
520
- <span class="r">if</span> array.empty?
521
- <span class="s"><span class="dl">'</span><span class="k"> - none</span><span class="dl">'</span></span>
424
+ <span class="r">if</span> <span class="pc">self</span>.first.is_a? <span class="co">Array</span>
425
+ <span class="pc">self</span>.inject(obj){ |result, nested_array|
426
+ nested_array.to_proc.call result
427
+ }
522
428
  <span class="r">else</span>
523
- array.map{|e| <span class="s"><span class="dl">&quot;</span><span class="k"> - </span><span class="il"><span class="idl">#{</span>e<span class="idl">}</span></span><span class="k">: </span><span class="il"><span class="idl">#{</span> <span class="pc">self</span>.eval <span class="s"><span class="dl">'</span><span class="k">#{e}</span><span class="dl">'</span></span><span class="idl">}</span></span><span class="dl">&quot;</span></span>}*<span class="s"><span class="dl">&quot;</span><span class="ch">\n</span><span class="dl">&quot;</span></span>
429
+ obj.send *<span class="pc">self</span>
524
430
  <span class="r">end</span>
525
431
  }
526
-
527
- <span class="s"><span class="dl">&quot;</span><span class="il"><span class="idl">#{</span><span class="pc">self</span>.to_s<span class="idl">}</span></span><span class="k">
528
- local vars
529
- </span><span class="il"><span class="idl">#{</span> put_vars[ <span class="pc">self</span>.eval <span class="s"><span class="dl">'</span><span class="k">local_variables</span><span class="dl">'</span></span> ] <span class="idl">}</span></span><span class="k">
530
- (instance vars)
531
- </span><span class="il"><span class="idl">#{</span> put_vars[ <span class="pc">self</span>.eval <span class="s"><span class="dl">'</span><span class="k">instance_variables</span><span class="dl">'</span></span> ] <span class="idl">}</span></span><span class="k">
532
- self
533
- - </span><span class="il"><span class="idl">#{</span><span class="pc">self</span>.eval <span class="s"><span class="dl">'</span><span class="k">self</span><span class="dl">'</span></span><span class="idl">}</span></span><span class="k">
534
- block_given?
535
- - </span><span class="il"><span class="idl">#{</span><span class="pc">self</span>.eval <span class="s"><span class="dl">'</span><span class="k">block_given?</span><span class="dl">'</span></span><span class="idl">}</span></span><span class="dl">&quot;</span></span>
536
-
537
432
  <span class="r">end</span>
538
433
  <span class="r">end</span>
539
434
 
540
435
  <span class="c"># J-_-L</span></pre> </td></tr><tr><th>Compatibility</th> <td>1.9, 1.8</td></tr></table> <h3 title="require 'zucker/blank'">blank</h3>
541
436
  <table class="cube_table"
542
437
  id="blank_cube"
543
- title="require 'zucker/blank'"> <tr><th>Summary</th> <td>Does pretty the same as in ActiveSupport (Every object can be asked if it is blank)</td></tr><tr><th>Why?</th> <td>It's too familiar ;)</td></tr><tr><th>Methods/Usage</th> <td><h5>Object#blank?</h5><pre class="usage source" style="display:block"><span class="s"><span class="dl">'</span><span class="k">an object</span><span class="dl">'</span></span>.blank? <span class="c"># =&gt; false</span></pre></td></tr><tr><th>Further information</th> <td>See ActiveSupport</td></tr><tr><th>Specification</th> <td> <span id="show_blank_spec">(<a href="javascript:show('blank_spec')">show</a>)</span>
544
- <pre class="source" id="blank_spec">require <span class="s"><span class="dl">'</span><span class="k">blank</span><span class="dl">'</span></span>
438
+ title="require 'zucker/blank'"> <tr><th>Summary</th> <td>Does pretty the same as in ActiveSupport (Every object can be asked if it is blank).</td></tr><tr><th>Why?</th> <td>It's too familiar ;)</td></tr><tr><th>Methods/Usage</th> <td><h5>Object#blank?</h5><pre class="usage source" style="display:block"><span class="s"><span class="dl">'</span><span class="k">an object</span><span class="dl">'</span></span>.blank? <span class="c"># =&gt; false</span></pre></td></tr><tr><th>Specification</th> <td> <span id="show_blank_spec">(<a href="javascript:show('blank_spec')">show</a>)</span>
439
+ <pre class="source" id="blank_spec">require <span class="s"><span class="dl">'</span><span class="k">zucker/blank</span><span class="dl">'</span></span>
545
440
 
546
441
  describe <span class="s"><span class="dl">'</span><span class="k">Object#blank?</span><span class="dl">'</span></span> <span class="r">do</span>
547
442
  it <span class="s"><span class="dl">'</span><span class="k">should be blank for blank values</span><span class="dl">'</span></span> <span class="r">do</span>
@@ -588,7 +483,7 @@ describe <span class="s"><span class="dl">'</span><span class="k">Object#blank?<
588
483
  <table class="cube_table"
589
484
  id="class2proc_cube"
590
485
  title="require 'zucker/class2proc'"> <tr><th>Summary</th> <td>Creates a new instance of the class.</td></tr><tr><th>Methods/Usage</th> <td><h5>Class#to_proc</h5><pre class="usage source" style="display:block">[ [<span class="i">1</span>,<span class="i">2</span>],[<span class="i">3</span>,<span class="i">5</span>,<span class="i">6</span>,<span class="i">7</span>,<span class="i">3</span>] ].map(&amp;<span class="co">Set</span>) <span class="c"># =&gt; [ Set[1,2], Set[5,6,7,3] ]</span></pre></td></tr><tr><th>Further information</th> <td>Inspired by Ruby Facets.<br/>More about <a href="http://rbjl.net/29-become-a-proc-star">to_proc</a>.</td></tr><tr><th>Specification</th> <td> <span id="show_class2proc_spec">(<a href="javascript:show('class2proc_spec')">show</a>)</span>
591
- <pre class="source" id="class2proc_spec">require <span class="s"><span class="dl">'</span><span class="k">class2proc</span><span class="dl">'</span></span>
486
+ <pre class="source" id="class2proc_spec">require <span class="s"><span class="dl">'</span><span class="k">zucker/class2proc</span><span class="dl">'</span></span>
592
487
  require <span class="s"><span class="dl">'</span><span class="k">set</span><span class="dl">'</span></span>
593
488
 
594
489
  describe <span class="s"><span class="dl">'</span><span class="k">Class#to_proc</span><span class="dl">'</span></span> <span class="r">do</span>
@@ -613,8 +508,8 @@ describe <span class="s"><span class="dl">'</span><span class="k">Class#to_proc<
613
508
 
614
509
  nn(<span class="i">5</span>){ <span class="pc">nil</span>.some_methods.that[<span class="sy">:do</span>].not.exist }
615
510
  <span class="c"># =&gt; 5</span>
616
- </pre></td></tr><tr><th>Further information</th> <td>See <a href="http://rbjl.net/26-the-28-bytes-of-ruby-joy">this post</a> for more information and discussion</td></tr><tr><th>Specification</th> <td> <span id="show_egonil_spec">(<a href="javascript:show('egonil_spec')">show</a>)</span>
617
- <pre class="source" id="egonil_spec">require <span class="s"><span class="dl">'</span><span class="k">egonil</span><span class="dl">'</span></span>
511
+ </pre></td></tr><tr><th>Further information</th> <td>See <a href="http://rbjl.net/26-the-28-bytes-of-ruby-joy">this post</a> for more information and discussion.</td></tr><tr><th>Specification</th> <td> <span id="show_egonil_spec">(<a href="javascript:show('egonil_spec')">show</a>)</span>
512
+ <pre class="source" id="egonil_spec">require <span class="s"><span class="dl">'</span><span class="k">zucker/egonil</span><span class="dl">'</span></span>
618
513
 
619
514
  describe <span class="s"><span class="dl">'</span><span class="k">egonil</span><span class="dl">'</span></span> <span class="r">do</span>
620
515
  it <span class="s"><span class="dl">'</span><span class="k">should not raise nil exceptions in the block</span><span class="dl">'</span></span> <span class="r">do</span>
@@ -658,8 +553,8 @@ describe <span class="s"><span class="dl">'</span><span class="k">egonil</span><
658
553
  <span class="c"># J-_-L</span></pre> </td></tr><tr><th>Compatibility</th> <td>1.9, 1.8</td></tr></table> <h3 title="require 'zucker/enumerable'">enumerable</h3>
659
554
  <table class="cube_table"
660
555
  id="enumerable_cube"
661
- title="require 'zucker/enumerable'"> <tr><th>Summary</th> <td><code>Enumerable</code> extensions.</td></tr><tr><th>Methods/Usage</th> <td><h5>Enumerable#mash</h5><pre class="usage source" style="display:block">[<span class="i">1</span>,<span class="i">2</span>,<span class="i">3</span>].mash{|e| [e, e.to_s] } <span class="c"># =&gt; {1=&gt;'1',2=&gt;'2',3=&gt;'3'}</span></pre></td></tr><tr><th>Further information</th> <td>Inspired by Ruby Facets' mash</td></tr><tr><th>Specification</th> <td> <span id="show_enumerable_spec">(<a href="javascript:show('enumerable_spec')">show</a>)</span>
662
- <pre class="source" id="enumerable_spec">require <span class="s"><span class="dl">'</span><span class="k">enumerable</span><span class="dl">'</span></span>
556
+ title="require 'zucker/enumerable'"> <tr><th>Summary</th> <td><code>Enumerable</code> extensions.</td></tr><tr><th>Methods/Usage</th> <td><h5>Enumerable#mash</h5><pre class="usage source" style="display:block">[<span class="i">1</span>,<span class="i">2</span>,<span class="i">3</span>].mash{|e| [e, e.to_s] } <span class="c"># =&gt; {1=&gt;'1',2=&gt;'2',3=&gt;'3'}</span></pre></td></tr><tr><th>Further information</th> <td>Inspired by Ruby Facets' <code>mash</code>.</td></tr><tr><th>Specification</th> <td> <span id="show_enumerable_spec">(<a href="javascript:show('enumerable_spec')">show</a>)</span>
557
+ <pre class="source" id="enumerable_spec">require <span class="s"><span class="dl">'</span><span class="k">zucker/enumerable</span><span class="dl">'</span></span>
663
558
 
664
559
  describe <span class="s"><span class="dl">'</span><span class="k">Enumerable#mash</span><span class="dl">'</span></span> <span class="r">do</span>
665
560
  it <span class="s"><span class="dl">'</span><span class="k">should &quot;map&quot; a hash</span><span class="dl">'</span></span> <span class="r">do</span>
@@ -679,29 +574,38 @@ describe <span class="s"><span class="dl">'</span><span class="k">Enumerable#mas
679
574
  <span class="c"># J-_-L</span></pre> </td></tr><tr><th>Compatibility</th> <td>1.9, 1.8</td></tr></table> <h3 title="require 'zucker/hash'">hash</h3>
680
575
  <table class="cube_table"
681
576
  id="hash_cube"
682
- title="require 'zucker/hash'"> <tr><th>Summary</th> <td>Some sugar for dealing with hashs.</td></tr><tr><th>Methods/Usage</th> <td><h5>Hash.zip</h5><pre class="usage source" style="display:block"><span class="co">Hash</span>.zip [<span class="i">1</span>,<span class="i">2</span>,<span class="i">3</span>], [<span class="i">4</span>,<span class="i">5</span>,<span class="i">6</span>] <span class="c"># =&gt; {1 =&gt; 4, 2 =&gt; 5, 3 =&gt; 6}</span></pre><h5>Hash#<<</h5><pre class="usage source" style="display:block">{<span class="i">1</span> =&gt; <span class="i">2</span>} &lt;&lt; [<span class="i">3</span>, <span class="i">4</span>] <span class="c"># =&gt; {1 =&gt; 2, 3 =&gt; 4}</span></pre></td></tr><tr><th>Further information</th> <td>Some of the operators are inspired by Ruby Facets</td></tr><tr><th>Specification</th> <td> <span id="show_hash_spec">(<a href="javascript:show('hash_spec')">show</a>)</span>
683
- <pre class="source" id="hash_spec">require <span class="s"><span class="dl">'</span><span class="k">hash</span><span class="dl">'</span></span>
577
+ title="require 'zucker/hash'"> <tr><th>Summary</th> <td>Some sugar for dealing with hashs.</td></tr><tr><th>Methods/Usage</th> <td><h5>Hash.zip</h5><pre class="usage source" style="display:block"><span class="co">Hash</span>.zip [<span class="i">1</span>,<span class="i">2</span>,<span class="i">3</span>], [<span class="i">4</span>,<span class="i">5</span>,<span class="i">6</span>] <span class="c"># =&gt; {1 =&gt; 4, 2 =&gt; 5, 3 =&gt; 6}</span></pre><h5>Hash#<<</h5><pre class="usage source" style="display:block">{<span class="i">1</span> =&gt; <span class="i">2</span>} &lt;&lt; [<span class="i">3</span>, <span class="i">4</span>] <span class="c"># =&gt; { 1 =&gt; 2, 3 =&gt; 4 }</span>
578
+ {<span class="i">1</span> =&gt; <span class="i">2</span>} &lt;&lt; { <span class="i">5</span>=&gt;<span class="i">6</span> } <span class="c"># =&gt; { 1 =&gt; 2, 5 =&gt; 6 }</span>
579
+ </pre></td></tr><tr><th>Further information</th> <td>Some of the operators are inspired by Ruby Facets.</td></tr><tr><th>Specification</th> <td> <span id="show_hash_spec">(<a href="javascript:show('hash_spec')">show</a>)</span>
580
+ <pre class="source" id="hash_spec">require <span class="s"><span class="dl">'</span><span class="k">zucker/hash</span><span class="dl">'</span></span>
684
581
 
685
582
  describe <span class="s"><span class="dl">'</span><span class="k">Hash.zip</span><span class="dl">'</span></span> <span class="r">do</span>
686
- it <span class="s"><span class="dl">'</span><span class="k">should zip together both given enumerables and take them as key=&gt;values for a new hash</span><span class="dl">'</span></span>
583
+ it <span class="s"><span class="dl">'</span><span class="k">should zip together both given enumerables and take them as key=&gt;values for a new hash</span><span class="dl">'</span></span> <span class="r">do</span>
584
+ <span class="co">Hash</span>.zip( [<span class="i">1</span>,<span class="i">2</span>,<span class="i">3</span>], [<span class="i">4</span>,<span class="i">5</span>,<span class="i">6</span>] ).should == { <span class="i">1</span>=&gt;<span class="i">4</span>, <span class="i">2</span>=&gt;<span class="i">5</span>, <span class="i">3</span>=&gt;<span class="i">6</span> }
585
+ <span class="r">end</span>
687
586
  <span class="r">end</span>
688
587
 
689
588
  describe <span class="s"><span class="dl">'</span><span class="k">Hash#&lt;&lt;</span><span class="dl">'</span></span> <span class="r">do</span>
690
- it <span class="s"><span class="dl">'</span><span class="k">should append new elements to the hash</span><span class="dl">'</span></span>
589
+ it <span class="s"><span class="dl">'</span><span class="k">should append new elements to the hash</span><span class="dl">'</span></span> <span class="r">do</span>
590
+ a = { <span class="i">1</span>=&gt;<span class="i">4</span>, <span class="i">2</span>=&gt;<span class="i">5</span>, <span class="i">3</span>=&gt;<span class="i">6</span> }
591
+ a &lt;&lt; { <span class="i">4</span>=&gt;<span class="i">7</span> }
592
+ a &lt;&lt; [<span class="i">5</span>, <span class="i">8</span>]
593
+ a.should == { <span class="i">1</span>=&gt;<span class="i">4</span>, <span class="i">2</span>=&gt;<span class="i">5</span>, <span class="i">3</span>=&gt;<span class="i">6</span>, <span class="i">4</span>=&gt;<span class="i">7</span>, <span class="i">5</span>=&gt;<span class="i">8</span> }
594
+ <span class="r">end</span>
691
595
  <span class="r">end</span></pre> </td></tr><tr><th>Source</th> <td> <span id="show_hash_source">(<a href="javascript:show('hash_source')">show</a>)</span>
692
596
  <pre class="source" id="hash_source"><span class="r">class</span> <span class="cl">Hash</span>
693
597
  <span class="r">def</span> <span class="pc">self</span>.<span class="fu">zip</span>(keys,values)
694
- <span class="co">Hash</span>[ *[<span class="i">1</span>,<span class="i">2</span>,<span class="i">3</span>].zip( [<span class="i">4</span>,<span class="i">5</span>,<span class="i">6</span>] ).flatten ]
598
+ <span class="co">Hash</span>[ *keys.zip( values ).flatten ]
695
599
  <span class="r">end</span>
696
600
 
697
601
  <span class="r">def</span> <span class="fu">&lt;&lt;</span>(other)
698
602
  <span class="r">case</span>
699
603
  <span class="r">when</span> other.is_a?(<span class="co">Hash</span>)
700
604
  merge! other
701
- <span class="r">when</span> other.respond_to?(<span class="sy">:to_splat</span>)
605
+ <span class="r">when</span> other.is_a?(<span class="co">Enumerable</span>) || other.respond_to?(<span class="sy">:to_splat</span>)
702
606
  merge! <span class="co">Hash</span>[*other]
703
607
  <span class="r">else</span>
704
- raise <span class="co">TypeError</span>, <span class="s"><span class="dl">'</span><span class="k">can only append other Hashs and Enumerables</span><span class="dl">'</span></span>
608
+ raise <span class="co">TypeError</span>, <span class="s"><span class="dl">'</span><span class="k">can only append other Hashs and Enumerables (or Classes that implement to_splat)</span><span class="dl">'</span></span>
705
609
  <span class="r">end</span>
706
610
  <span class="r">end</span>
707
611
  <span class="r">end</span>
@@ -713,7 +617,7 @@ describe <span class="s"><span class="dl">'</span><span class="k">Hash#&lt;&lt;<
713
617
  <span class="i">2</span> =&gt; lambda {|e| e + <span class="i">1000</span>},
714
618
  <span class="i">4</span> =&gt; <span class="sy">:to_s</span>,
715
619
  }) <span class="c"># =&gt; [1, 1002, 3, '4']</span></pre></td></tr><tr><th>Further information</th> <td>More about <a href="http://rbjl.net/29-become-a-proc-star">to_proc</a>.</td></tr><tr><th>Specification</th> <td> <span id="show_hash2proc_spec">(<a href="javascript:show('hash2proc_spec')">show</a>)</span>
716
- <pre class="source" id="hash2proc_spec">require <span class="s"><span class="dl">'</span><span class="k">hash2proc</span><span class="dl">'</span></span>
620
+ <pre class="source" id="hash2proc_spec">require <span class="s"><span class="dl">'</span><span class="k">zucker/hash2proc</span><span class="dl">'</span></span>
717
621
 
718
622
  describe <span class="s"><span class="dl">'</span><span class="k">Hash#to_proc</span><span class="dl">'</span></span> <span class="r">do</span>
719
623
  it <span class="s"><span class="dl">'</span><span class="k">should run the proc given in the value for a key in the hash</span><span class="dl">'</span></span> <span class="r">do</span>
@@ -736,7 +640,182 @@ describe <span class="s"><span class="dl">'</span><span class="k">Hash#to_proc</
736
640
  <span class="r">end</span>
737
641
  <span class="r">end</span>
738
642
 
739
- <span class="c"># J-_-L</span></pre> </td></tr><tr><th>Compatibility</th> <td>1.9, 1.8</td></tr></table> <h3 title="require 'zucker/iterate'">iterate</h3>
643
+ <span class="c"># J-_-L</span></pre> </td></tr><tr><th>Compatibility</th> <td>1.9, 1.8</td></tr></table> <h3 title="require 'zucker/info'">info</h3>
644
+ <table class="cube_table"
645
+ id="info_cube"
646
+ title="require 'zucker/info'"> <tr><th>Summary</th> <td>Access environment information with the <code>Info</code> module.</td></tr><tr><th>Why?</th> <td>You don't need to remember in which global variable, constant or special method the information you are searching for is hidden.</td></tr><tr><th>Methods/Usage</th> <td><h5>Info</h5><pre class="usage source" style="display:block"><span class="c"># see the source file for the list of accessors</span>
647
+ <span class="c"># you could also add them to the global namespace with: include Info</span>
648
+ </pre></td></tr><tr><th>Specification</th> <td> <span id="show_info_spec">(<a href="javascript:show('info_spec')">show</a>)</span>
649
+ <pre class="source" id="info_spec">require <span class="s"><span class="dl">'</span><span class="k">zucker/info</span><span class="dl">'</span></span>
650
+
651
+ describe <span class="s"><span class="dl">'</span><span class="k">Info</span><span class="dl">'</span></span> <span class="r">do</span>
652
+ it <span class="s"><span class="dl">'</span><span class="k">should define accessors for global variables, constants and some special methods/keywords</span><span class="dl">'</span></span> <span class="r">do</span>
653
+ <span class="c"># see sourcefile for the list</span>
654
+ <span class="r">end</span>
655
+ <span class="r">end</span></pre> </td></tr><tr><th>Source</th> <td> <span id="show_info_source">(<a href="javascript:show('info_source')">show</a>)</span>
656
+ <pre class="source" id="info_source"><span class="r">module</span> <span class="cl">Info</span>
657
+ <span class="r">class</span> &lt;&lt; <span class="cl">Info</span>
658
+ <span class="c"># hash like access</span>
659
+ <span class="r">def</span> <span class="fu">[]</span>(what)
660
+ send what
661
+ <span class="r">end</span>
662
+
663
+ <span class="c"># TODO: maybe add a descriptions method</span>
664
+ <span class="r">end</span>
665
+
666
+ module_function
667
+
668
+ <span class="c"># current script file</span>
669
+ <span class="r">def</span> <span class="fu">current_file</span>
670
+ <span class="pc">__FILE__</span>
671
+ <span class="r">end</span>
672
+
673
+ <span class="r">def</span> <span class="fu">current_file_directory</span>
674
+ <span class="co">File</span>.dirname(<span class="pc">__FILE__</span>)
675
+ <span class="r">end</span>
676
+
677
+ <span class="c"># input</span>
678
+ <span class="r">def</span> <span class="fu">last_input_file</span>
679
+ <span class="gv">$FILENAME</span>
680
+ <span class="r">end</span>
681
+
682
+ <span class="r">def</span> <span class="fu">last_input_line_number</span>
683
+ <span class="gv">$.</span>
684
+ <span class="r">end</span>
685
+
686
+ <span class="r">def</span> <span class="fu">last_input</span>
687
+ <span class="gv">$_</span>
688
+ <span class="r">end</span>
689
+
690
+ <span class="c"># program</span>
691
+ <span class="r">def</span> <span class="fu">program_name</span>
692
+ <span class="gv">$0</span>
693
+ <span class="r">end</span>
694
+
695
+ <span class="r">def</span> <span class="fu">program_arguments</span>
696
+ <span class="gv">$:</span>
697
+ <span class="r">end</span>
698
+
699
+ <span class="r">def</span> <span class="fu">loaded_programs</span>
700
+ <span class="gv">$&quot;</span>
701
+ <span class="r">end</span>
702
+
703
+ <span class="r">def</span> <span class="fu">program_data</span>
704
+ ::<span class="co">DATA</span>
705
+ <span class="r">end</span>
706
+
707
+ <span class="r">def</span> <span class="fu">child_program_status</span>
708
+ <span class="gv">$CHILD_STATUS</span>
709
+ <span class="r">end</span>
710
+
711
+ <span class="c"># system info</span>
712
+ <span class="r">def</span> <span class="fu">environment</span>
713
+ ::<span class="co">ENV</span>
714
+ <span class="r">end</span>
715
+ <span class="r">alias</span> <span class="fu">env</span> <span class="fu">environment</span>
716
+
717
+ <span class="r">def</span> <span class="fu">working_directory</span>
718
+ <span class="co">Dir</span>.pwd
719
+ <span class="r">end</span>
720
+
721
+ <span class="r">def</span> <span class="fu">platform</span>
722
+ ::<span class="co">RUBY_PLATFORM</span>
723
+ <span class="r">end</span>
724
+
725
+ <span class="r">def</span> <span class="fu">process_id</span>
726
+ <span class="gv">$$</span>
727
+ <span class="r">end</span>
728
+
729
+ <span class="r">def</span> <span class="fu">load_path</span>
730
+ <span class="gv">$:</span>
731
+ <span class="r">end</span>
732
+
733
+ <span class="c"># current</span>
734
+ <span class="r">def</span> <span class="fu">current_line</span>
735
+ <span class="pc">__LINE__</span>
736
+ <span class="r">end</span>
737
+
738
+ <span class="r">def</span> <span class="fu">current_method</span> <span class="c"># 1.9</span>
739
+ __method__
740
+ <span class="r">end</span>
741
+
742
+ <span class="r">def</span> <span class="fu">current_callstack</span>
743
+ caller
744
+ <span class="r">end</span>
745
+
746
+ <span class="c"># dealing with strings</span>
747
+ <span class="r">def</span> <span class="fu">gets_separator</span>
748
+ <span class="gv">$/</span>
749
+ <span class="r">end</span>
750
+
751
+ <span class="r">def</span> <span class="fu">join_separator</span>
752
+ <span class="gv">$,</span>
753
+ <span class="r">end</span>
754
+
755
+ <span class="r">def</span> <span class="fu">print_separator</span>
756
+ <span class="gv">$,</span>
757
+ <span class="r">end</span>
758
+
759
+ <span class="r">def</span> <span class="fu">split_separator</span>
760
+ <span class="gv">$;</span>
761
+ <span class="r">end</span>
762
+
763
+ <span class="c"># misc</span>
764
+ <span class="r">def</span> <span class="fu">security_level</span>
765
+ <span class="gv">$SAFE</span>
766
+ <span class="r">end</span>
767
+
768
+ <span class="r">def</span> <span class="fu">warnings_activated?</span>
769
+ <span class="gv">$VERBOSE</span>
770
+ <span class="r">end</span>
771
+
772
+ <span class="r">def</span> <span class="fu">debug_activated?</span>
773
+ <span class="gv">$DEBUG</span>
774
+ <span class="r">end</span>
775
+
776
+ <span class="r">def</span> <span class="fu">last_exception</span>
777
+ <span class="gv">$!</span>
778
+ <span class="r">end</span>
779
+
780
+ <span class="c"># defined objects</span>
781
+ <span class="r">def</span> <span class="fu">global_variables</span>
782
+ global_variables
783
+ <span class="r">end</span>
784
+
785
+ <span class="r">def</span> <span class="fu">global_constants</span>
786
+ <span class="co">Object</span>.constants
787
+ <span class="r">end</span>
788
+
789
+ <span class="c"># encoding (1.9)</span>
790
+ <span class="r">def</span> <span class="fu">source_encoding</span>
791
+ __ENCODING__
792
+ <span class="r">end</span>
793
+
794
+ <span class="r">def</span> <span class="fu">external_encoding</span>
795
+ <span class="co">Encoding</span>.default_external
796
+ <span class="r">end</span>
797
+
798
+ <span class="r">def</span> <span class="fu">internal_encoding</span>
799
+ <span class="co">Encoding</span>.default_internal
800
+ <span class="r">end</span>
801
+
802
+ <span class="c"># ruby version info</span>
803
+ <span class="r">def</span> <span class="fu">ruby_version</span>
804
+ ::<span class="co">RUBY_VERSION</span>
805
+ <span class="r">end</span>
806
+
807
+ <span class="r">def</span> <span class="fu">ruby_patchlevel</span>
808
+ ::<span class="co">RUBY_PATCHLEVEL</span>
809
+ <span class="r">end</span>
810
+
811
+ <span class="r">def</span> <span class="fu">ruby_description</span>
812
+ ::<span class="co">RUBY_DESCRIPTION</span>
813
+ <span class="r">end</span>
814
+
815
+ <span class="r">def</span> <span class="fu">ruby_release_date</span>
816
+ ::<span class="co">RUBY_RELEASE_DATE</span>
817
+ <span class="r">end</span>
818
+ <span class="r">end</span></pre> </td></tr><tr><th>Compatibility</th> <td>1.9, 1.8 (not all information)</td></tr></table> <h3 title="require 'zucker/iterate'">iterate</h3>
740
819
  <table class="cube_table"
741
820
  id="iterate_cube"
742
821
  title="require 'zucker/iterate'"> <tr><th>Summary</th> <td>Iterate over one or more collections.</td></tr><tr><th>Why?</th> <td>It's like <code>.each</code> with two differences: It feels more like a control structure and you can easily iterate over multiple objects.</td></tr><tr><th>Methods/Usage</th> <td><h5>iterate</h5><pre class="usage source" style="display:block">iterate [<span class="i">1</span>,<span class="i">2</span>], [<span class="i">3</span>,<span class="i">4</span>,<span class="i">5</span>] <span class="r">do</span> |e,f|
@@ -747,7 +826,7 @@ describe <span class="s"><span class="dl">'</span><span class="k">Hash#to_proc</
747
826
  <span class="c"># 2,4</span>
748
827
  <span class="c"># ,5</span>
749
828
  </pre></td></tr><tr><th>Specification</th> <td> <span id="show_iterate_spec">(<a href="javascript:show('iterate_spec')">show</a>)</span>
750
- <pre class="source" id="iterate_spec">require <span class="s"><span class="dl">'</span><span class="k">iterate</span><span class="dl">'</span></span>
829
+ <pre class="source" id="iterate_spec">require <span class="s"><span class="dl">'</span><span class="k">zucker/iterate</span><span class="dl">'</span></span>
751
830
 
752
831
  describe <span class="s"><span class="dl">'</span><span class="k">Object#iterate</span><span class="dl">'</span></span> <span class="r">do</span>
753
832
  let <span class="sy">:a</span> <span class="r">do</span> [<span class="i">1</span>, <span class="i">2</span>, <span class="i">3</span>] <span class="r">end</span>
@@ -831,7 +910,7 @@ describe <span class="s"><span class="dl">'</span><span class="k">Object#iterate
831
910
  instance_variables_from params <span class="c"># # assigns @c and @d</span>
832
911
  <span class="r">end</span>
833
912
  </pre></td></tr><tr><th>Specification</th> <td> <span id="show_ivars_spec">(<a href="javascript:show('ivars_spec')">show</a>)</span>
834
- <pre class="source" id="ivars_spec">require <span class="s"><span class="dl">'</span><span class="k">ivars</span><span class="dl">'</span></span>
913
+ <pre class="source" id="ivars_spec">require <span class="s"><span class="dl">'</span><span class="k">zucker/ivars</span><span class="dl">'</span></span>
835
914
 
836
915
  describe <span class="s"><span class="dl">'</span><span class="k">instance_variables_from</span><span class="dl">'</span></span> <span class="r">do</span>
837
916
  it <span class="s"><span class="dl">'</span><span class="k">should tansform the given parameter to instance variables</span><span class="dl">'</span></span> <span class="r">do</span>
@@ -853,7 +932,7 @@ describe <span class="s"><span class="dl">'</span><span class="k">instance_varia
853
932
  <pre class="source" id="ivars_source"><span class="r">def</span> <span class="fu">instance_variables_from</span>(obj, *only)
854
933
  iter =
855
934
  <span class="r">if</span> obj.is_a? <span class="co">Binding</span>
856
- obj.eval(<span class="s"><span class="dl">'</span><span class="k">local_variables</span><span class="dl">'</span></span>).map{|e| [obj.eval(e), e] }
935
+ obj.eval(<span class="s"><span class="dl">'</span><span class="k">local_variables</span><span class="dl">'</span></span>).map{|e| [obj.eval(<span class="s"><span class="dl">&quot;</span><span class="il"><span class="idl">#{</span>e<span class="idl">}</span></span><span class="dl">&quot;</span></span>), e] }
857
936
  <span class="r">elsif</span> obj.is_a? <span class="co">Hash</span>
858
937
  obj.map{|k,v| [v,k] }
859
938
  <span class="r">else</span>
@@ -877,8 +956,8 @@ describe <span class="s"><span class="dl">'</span><span class="k">instance_varia
877
956
  <span class="c"># J-_-L</span></pre> </td></tr><tr><th>Compatibility</th> <td>1.9, 1.8</td></tr></table> <h3 title="require 'zucker/kernel'">kernel</h3>
878
957
  <table class="cube_table"
879
958
  id="kernel_cube"
880
- title="require 'zucker/kernel'"> <tr><th>Summary</th> <td>Some useful general shortcut methods</td></tr><tr><th>Why?</th> <td>Readability</td></tr><tr><th>Methods/Usage</th> <td><h5>activate_warnings!</h5><pre class="usage source" style="display:block">activate_warnings! <span class="c"># sets $VERBOSE to 1</span></pre><h5>deactivate_warnings!</h5><pre class="usage source" style="display:block">deactivate_warnings! <span class="c"># sets $VERBOSE to 0</span></pre><h5>library?</h5><pre class="usage source" style="display:block">library? <span class="c"># checks, if the current file is ran directly</span></pre><h5>ignore_sigint!</h5><pre class="usage source" style="display:block">ignore_sigint! <span class="c"># blocks CTRL+C</span></pre></td></tr><tr><th>Specification</th> <td> <span id="show_kernel_spec">(<a href="javascript:show('kernel_spec')">show</a>)</span>
881
- <pre class="source" id="kernel_spec">require <span class="s"><span class="dl">'</span><span class="k">kernel</span><span class="dl">'</span></span>
959
+ title="require 'zucker/kernel'"> <tr><th>Summary</th> <td>Some useful general shortcut methods.</td></tr><tr><th>Why?</th> <td>Readability.</td></tr><tr><th>Methods/Usage</th> <td><h5>activate_warnings!</h5><pre class="usage source" style="display:block">activate_warnings! <span class="c"># sets $VERBOSE to 1</span></pre><h5>deactivate_warnings!</h5><pre class="usage source" style="display:block">deactivate_warnings! <span class="c"># sets $VERBOSE to 0</span></pre><h5>library?</h5><pre class="usage source" style="display:block">library? <span class="c"># checks, if the current file is ran directly</span></pre><h5>ignore_sigint!</h5><pre class="usage source" style="display:block">ignore_sigint! <span class="c"># blocks CTRL+C</span></pre></td></tr><tr><th>Specification</th> <td> <span id="show_kernel_spec">(<a href="javascript:show('kernel_spec')">show</a>)</span>
960
+ <pre class="source" id="kernel_spec">require <span class="s"><span class="dl">'</span><span class="k">zucker/kernel</span><span class="dl">'</span></span>
882
961
 
883
962
  describe <span class="s"><span class="dl">'</span><span class="k">activate_warnings!</span><span class="dl">'</span></span> <span class="r">do</span>
884
963
  it <span class="s"><span class="dl">'</span><span class="k">should set $VERBOSE to true</span><span class="dl">'</span></span> <span class="r">do</span>
@@ -894,12 +973,6 @@ describe <span class="s"><span class="dl">'</span><span class="k">deactivate_war
894
973
  <span class="r">end</span>
895
974
  <span class="r">end</span>
896
975
 
897
- describe <span class="s"><span class="dl">'</span><span class="k">warnings_activated?</span><span class="dl">'</span></span> <span class="r">do</span>
898
- it <span class="s"><span class="dl">'</span><span class="k">should return $VERBOSE</span><span class="dl">'</span></span> <span class="r">do</span>
899
- warnings_activated?.should == <span class="gv">$VERBOSE</span>
900
- <span class="r">end</span>
901
- <span class="r">end</span>
902
-
903
976
  describe <span class="s"><span class="dl">'</span><span class="k">library?</span><span class="dl">'</span></span> <span class="r">do</span>
904
977
  it <span class="s"><span class="dl">'</span><span class="k">should return false if the file is invoked directly</span><span class="dl">'</span></span> <span class="r">do</span>
905
978
  library?.should == ( <span class="pc">__FILE__</span> != <span class="gv">$PROGRAM_NAME</span> )
@@ -919,23 +992,21 @@ describe <span class="s"><span class="dl">'</span><span class="k">ignore_sigint!
919
992
  <span class="gv">$VERBOSE</span> = <span class="pc">false</span>
920
993
  <span class="r">end</span>
921
994
 
922
- <span class="r">def</span> <span class="fu">warnings_activated?</span>
923
- <span class="gv">$VERBOSE</span>
924
- <span class="r">end</span>
925
-
926
995
  <span class="r">def</span> <span class="fu">library?</span>
927
996
  <span class="pc">__FILE__</span> != <span class="gv">$PROGRAM_NAME</span>
928
997
  <span class="r">end</span>
929
998
 
930
999
  <span class="r">def</span> <span class="fu">ignore_sigint!</span> <span class="c"># ctrl+c</span>
931
1000
  <span class="co">Signal</span>.trap *<span class="s"><span class="dl">%w|</span><span class="k">SIGINT IGNORE</span><span class="dl">|</span></span>
932
- <span class="r">end</span></pre> </td></tr><tr><th>Compatibility</th> <td>1.9, 1.8</td></tr></table> <h3 title="require 'zucker/mcopy'">mcopy</h3>
1001
+ <span class="r">end</span>
1002
+
1003
+ <span class="c"># J-_-L</span></pre> </td></tr><tr><th>Compatibility</th> <td>1.9, 1.8</td></tr></table> <h3 title="require 'zucker/mcopy'">mcopy</h3>
933
1004
  <table class="cube_table"
934
1005
  id="mcopy_cube"
935
1006
  title="require 'zucker/mcopy'"> <tr><th>Summary</th> <td>Adds <code>Object#mcopy</code> to create a deep copy using <code>Marshal</code>.</td></tr><tr><th>Why?</th> <td>Every Ruby book describes, you can do <code>Marshal.load Marshal.dump object</code> to create a deep copy... But who needs this verbose syntax in everyday coding?</td></tr><tr><th>Methods/Usage</th> <td><h5>Object#mcopy</h5><pre class="usage source" style="display:block">a = <span class="s"><span class="dl">%w[</span><span class="k">hello world</span><span class="dl">]</span></span>
936
1007
  b = a.mcopy
937
1008
  </pre></td></tr><tr><th>Specification</th> <td> <span id="show_mcopy_spec">(<a href="javascript:show('mcopy_spec')">show</a>)</span>
938
- <pre class="source" id="mcopy_spec">require <span class="s"><span class="dl">'</span><span class="k">mcopy</span><span class="dl">'</span></span>
1009
+ <pre class="source" id="mcopy_spec">require <span class="s"><span class="dl">'</span><span class="k">zucker/mcopy</span><span class="dl">'</span></span>
939
1010
 
940
1011
  describe <span class="s"><span class="dl">'</span><span class="k">Object#mcopy</span><span class="dl">'</span></span> <span class="r">do</span>
941
1012
  it <span class="s"><span class="dl">'</span><span class="k">create a (deep) copy via marshalling</span><span class="dl">'</span></span> <span class="r">do</span>
@@ -954,51 +1025,13 @@ describe <span class="s"><span class="dl">'</span><span class="k">Object#mcopy</
954
1025
  <span class="c"># alias copy mcopy</span>
955
1026
  <span class="r">end</span>
956
1027
 
957
- <span class="c"># J-_-L</span></pre> </td></tr><tr><th>Compatibility</th> <td>1.9, 1.8</td></tr></table> <h3 title="require 'zucker/mm'">mm</h3>
958
- <table class="cube_table"
959
- id="mm_cube"
960
- title="require 'zucker/mm'"> <tr><th>Summary</th> <td><code>mm</code> displays an ordered public method list.</td></tr><tr><th>Why?</th> <td>See some object's methods without those rarely used inherited methods</td></tr><tr><th>Methods/Usage</th> <td><h5>Object#method_list, Object#mm</h5><pre class="usage source" style="display:block"><span class="s"><span class="dl">'</span><span class="k">test</span><span class="dl">'</span></span>.mm <span class="i">2</span> <span class="c"># outputs the list (2 levels deep)</span></pre></td></tr><tr><th>Further information</th> <td>See <a href="http://rbjl.net/31-the-multi-mega-method-list">this article</a> for more information</td></tr><tr><th>Specification</th> <td> <span id="show_mm_spec">(<a href="javascript:show('mm_spec')">show</a>)</span>
961
- <pre class="source" id="mm_spec">require <span class="s"><span class="dl">'</span><span class="k">mm</span><span class="dl">'</span></span>
962
-
963
- describe <span class="s"><span class="dl">'</span><span class="k">Object#method_list</span><span class="dl">'</span></span> <span class="r">do</span>
964
- it <span class="s"><span class="dl">'</span><span class="k">should display an ordered method list</span><span class="dl">'</span></span>
965
- <span class="r">end</span></pre> </td></tr><tr><th>Source</th> <td> <span id="show_mm_source">(<a href="javascript:show('mm_source')">show</a>)</span>
966
- <pre class="source" id="mm_source"><span class="r">module</span> <span class="cl">Kernel</span>
967
- <span class="r">def</span> <span class="fu">method_list</span>(levels = <span class="i">1</span>)
968
- <span class="r">if</span> <span class="pc">self</span>.is_a? <span class="co">Module</span>
969
- klass, method_function = <span class="pc">self</span>, <span class="sy">:public_methods</span>
970
- <span class="r">else</span>
971
- klass, method_function = <span class="pc">self</span>.class, <span class="sy">:public_instance_methods</span>
972
-
973
- eigen = <span class="pc">self</span>.singleton_methods
974
- <span class="r">if</span> !eigen.empty?
975
- puts <span class="sy">:Eigenclass</span> <span class="c"># sorry for not being up to date, I just love the word</span>
976
- p <span class="pc">self</span>.singleton_methods
977
- <span class="r">end</span>
978
- <span class="r">end</span>
979
-
980
- levels.times{ |level|
981
- <span class="r">if</span> cur = klass.ancestors[level]
982
- p cur <span class="c"># put class name</span>
983
- p cur.send method_function, <span class="pc">false</span> <span class="c"># put methods of the class</span>
984
- <span class="r">else</span>
985
- <span class="r">break</span>
986
- <span class="r">end</span>
987
- }
988
-
989
- <span class="pc">self</span> <span class="c"># or whatever</span>
990
- <span class="r">end</span>
991
-
992
- <span class="r">alias</span> <span class="fu">mm</span> <span class="fu">method_list</span>
993
- <span class="r">end</span>
994
-
995
1028
  <span class="c"># J-_-L</span></pre> </td></tr><tr><th>Compatibility</th> <td>1.9, 1.8</td></tr></table> <h3 title="require 'zucker/regexp2proc'">regexp2proc</h3>
996
1029
  <table class="cube_table"
997
1030
  id="regexp2proc_cube"
998
- title="require 'zucker/regexp2proc'"> <tr><th>Summary</th> <td>Use &/regex/ to match it against strings</td></tr><tr><th>Methods/Usage</th> <td><h5>Regexp#to_proc</h5><pre class="usage source" style="display:block"><span class="s"><span class="dl">%w|</span><span class="k">just another string array</span><span class="dl">|</span></span>.map &amp;<span class="rx"><span class="dl">/</span><span class="k">[jy]</span><span class="dl">/</span></span> <span class="c"># =&gt; [&quot;j&quot;, nil, nil, &quot;y&quot;]</span>
1031
+ title="require 'zucker/regexp2proc'"> <tr><th>Summary</th> <td>Use &/regex/ to match it against strings.</td></tr><tr><th>Methods/Usage</th> <td><h5>Regexp#to_proc</h5><pre class="usage source" style="display:block"><span class="s"><span class="dl">%w|</span><span class="k">just another string array</span><span class="dl">|</span></span>.map &amp;<span class="rx"><span class="dl">/</span><span class="k">[jy]</span><span class="dl">/</span></span> <span class="c"># =&gt; [&quot;j&quot;, nil, nil, &quot;y&quot;]</span>
999
1032
  <span class="s"><span class="dl">%w|</span><span class="k">just another string array</span><span class="dl">|</span></span>.select &amp;<span class="rx"><span class="dl">/</span><span class="k">[jy]</span><span class="dl">/</span></span> <span class="c"># =&gt; [&quot;just&quot;, &quot;array&quot;]</span>
1000
1033
  </pre></td></tr><tr><th>Further information</th> <td>More about <a href="http://rbjl.net/29-become-a-proc-star">to_proc</a>.</td></tr><tr><th>Specification</th> <td> <span id="show_regexp2proc_spec">(<a href="javascript:show('regexp2proc_spec')">show</a>)</span>
1001
- <pre class="source" id="regexp2proc_spec">require <span class="s"><span class="dl">'</span><span class="k">regexp2proc</span><span class="dl">'</span></span>
1034
+ <pre class="source" id="regexp2proc_spec">require <span class="s"><span class="dl">'</span><span class="k">zucker/regexp2proc</span><span class="dl">'</span></span>
1002
1035
 
1003
1036
  describe <span class="s"><span class="dl">'</span><span class="k">Regexp#to_proc</span><span class="dl">'</span></span> <span class="r">do</span>
1004
1037
  it <span class="s"><span class="dl">'</span><span class="k">should match the regex</span><span class="dl">'</span></span> <span class="r">do</span>
@@ -1017,25 +1050,53 @@ describe <span class="s"><span class="dl">'</span><span class="k">Regexp#to_proc
1017
1050
  <span class="c"># J-_-L</span></pre> </td></tr><tr><th>Compatibility</th> <td>1.9, 1.8</td></tr></table> <h3 title="require 'zucker/sandbox'">sandbox</h3>
1018
1051
  <table class="cube_table"
1019
1052
  id="sandbox_cube"
1020
- title="require 'zucker/sandbox'"> <tr><th>Summary</th> <td>Creates a sandbox area.</td></tr><tr><th>Why?</th> <td>Ruby comes with sandboxes, but they are hidden (--> integrated) in the <code>$SAFE</code> concept</td></tr><tr><th>Methods/Usage</th> <td><h5>sandbox</h5><pre class="usage source" style="display:block">sandbox <span class="r">do</span>
1053
+ title="require 'zucker/sandbox'"> <tr><th>Summary</th> <td>Creates a sandbox area.</td></tr><tr><th>Why?</th> <td>Ruby comes with sandboxes, but they are hidden (-> integrated) in the <code>$SAFE</code> concept.</td></tr><tr><th>Methods/Usage</th> <td><h5>sandbox</h5><pre class="usage source" style="display:block">sandbox <span class="r">do</span>
1021
1054
  <span class="c"># dangerous commands throw SecurityErrors ($SAFE=4)</span>
1022
1055
  <span class="r">end</span>
1023
1056
  <span class="c"># everything's normal again</span>
1057
+
1058
+ sandbox( lambda{} ) <span class="r">do</span>
1059
+ <span class="c"># no Exception is thrown, if non-nil parameter is passed</span>
1060
+ <span class="r">end</span>
1061
+ <span class="c"># if it is a proc, it will be run instead, if an SecurityError gets raised</span>
1024
1062
  </pre></td></tr><tr><th>Specification</th> <td> <span id="show_sandbox_spec">(<a href="javascript:show('sandbox_spec')">show</a>)</span>
1025
- <pre class="source" id="sandbox_spec">require <span class="s"><span class="dl">'</span><span class="k">sandbox</span><span class="dl">'</span></span>
1063
+ <pre class="source" id="sandbox_spec">require <span class="s"><span class="dl">'</span><span class="k">zucker/sandbox</span><span class="dl">'</span></span>
1026
1064
 
1027
1065
  describe <span class="s"><span class="dl">'</span><span class="k">sandbox</span><span class="dl">'</span></span> <span class="r">do</span>
1028
- it <span class="s"><span class="dl">'</span><span class="k">should throw a SecurityError if bad commands are issued</span><span class="dl">'</span></span>
1029
- it <span class="s"><span class="dl">'</span><span class="k">should run the lambda passed as first parameter for errors, if it is given</span><span class="dl">'</span></span>
1066
+ it <span class="s"><span class="dl">'</span><span class="k">should throw a SecurityError if bad commands are issued</span><span class="dl">'</span></span> <span class="r">do</span>
1067
+ proc <span class="r">do</span>
1068
+ sandbox <span class="r">do</span>
1069
+ <span class="sh"><span class="dl">`</span><span class="k">ls</span><span class="dl">`</span></span>
1070
+ <span class="r">end</span>
1071
+ <span class="r">end</span>.should raise_exception <span class="co">SecurityError</span>
1072
+ <span class="r">end</span>
1073
+
1074
+ it <span class="s"><span class="dl">'</span><span class="k">should not throw an exception for errors, if the given parameter is not nil</span><span class="dl">'</span></span> <span class="r">do</span>
1075
+ proc <span class="r">do</span>
1076
+ sandbox( <span class="pc">true</span> ) <span class="r">do</span>
1077
+ <span class="sh"><span class="dl">`</span><span class="k">ls</span><span class="dl">`</span></span>
1078
+ <span class="r">end</span>
1079
+ <span class="r">end</span>.should_not raise_exception
1080
+ <span class="r">end</span>
1081
+
1082
+ it <span class="s"><span class="dl">'</span><span class="k">should run the proc passed as parameter for errors, if it is given</span><span class="dl">'</span></span> <span class="r">do</span>
1083
+ sandbox( lambda{|e| e.class } ) <span class="r">do</span>
1084
+ <span class="sh"><span class="dl">`</span><span class="k">ls</span><span class="dl">`</span></span>
1085
+ <span class="r">end</span>.should == <span class="co">SecurityError</span>
1086
+ <span class="r">end</span>
1030
1087
  <span class="r">end</span></pre> </td></tr><tr><th>Source</th> <td> <span id="show_sandbox_source">(<a href="javascript:show('sandbox_source')">show</a>)</span>
1031
- <pre class="source" id="sandbox_source"><span class="r">def</span> <span class="fu">sandbox</span>(rescueblock=<span class="pc">nil</span>)
1088
+ <pre class="source" id="sandbox_source"><span class="r">def</span> <span class="fu">sandbox</span>(rescueblock_or_default=<span class="pc">nil</span>)
1032
1089
  <span class="co">Thread</span>.start <span class="r">do</span>
1033
1090
  <span class="gv">$SAFE</span> = <span class="i">4</span>
1034
1091
  <span class="r">yield</span>
1035
1092
  <span class="r">end</span>.value
1036
1093
  <span class="r">rescue</span> <span class="co">SecurityError</span> =&gt; e
1037
- <span class="r">if</span> rescueblock
1038
- rescueblock.call e
1094
+ <span class="r">if</span> !rescueblock_or_default.nil?
1095
+ <span class="r">if</span> rescueblock_or_default.is_a? <span class="co">Proc</span>
1096
+ rescueblock_or_default.call e
1097
+ <span class="r">else</span>
1098
+ rescueblock_or_default
1099
+ <span class="r">end</span>
1039
1100
  <span class="r">else</span>
1040
1101
  raise e
1041
1102
  <span class="r">end</span>
@@ -1059,7 +1120,7 @@ describe <span class="s"><span class="dl">'</span><span class="k">sandbox</span>
1059
1120
  a = <span class="co">Klass</span>.new
1060
1121
  a[<span class="sy">:a_key</span>] <span class="c"># =&gt; 1</span>
1061
1122
  </pre></td></tr><tr><th>Specification</th> <td> <span id="show_square_brackets_for_spec">(<a href="javascript:show('square_brackets_for_spec')">show</a>)</span>
1062
- <pre class="source" id="square_brackets_for_spec">require <span class="s"><span class="dl">'</span><span class="k">square_brackets_for</span><span class="dl">'</span></span>
1123
+ <pre class="source" id="square_brackets_for_spec">require <span class="s"><span class="dl">'</span><span class="k">zucker/square_brackets_for</span><span class="dl">'</span></span>
1063
1124
 
1064
1125
  describe <span class="s"><span class="dl">'</span><span class="k">square_brackets_for</span><span class="dl">'</span></span> <span class="r">do</span>
1065
1126
 
@@ -1138,19 +1199,19 @@ describe <span class="s"><span class="dl">'</span><span class="k">square_bracket
1138
1199
  <span class="c"># J-_-L</span></pre> </td></tr><tr><th>Compatibility</th> <td>1.9, 1.8</td></tr></table> <h3 title="require 'zucker/string'">string</h3>
1139
1200
  <table class="cube_table"
1140
1201
  id="string_cube"
1141
- title="require 'zucker/string'"> <tr><th>Summary</th> <td><code>String</code> extensions.</td></tr><tr><th>Why?</th> <td>Strings cannot be comfortable enough ;)</td></tr><tr><th>Methods/Usage</th> <td><h5>String#^</h5><pre class="usage source" style="display:block"><span class="s"><span class="dl">'</span><span class="k">Yes vs No</span><span class="dl">'</span></span>^<span class="i">3</span> <span class="c"># =&gt; 'Yes'</span></pre><h5>String#lchomp</h5><pre class="usage source" style="display:block"><span class="s"><span class="dl">'</span><span class="k"> Yes</span><span class="dl">'</span></span>.lchomp <span class="c"># =&gt; 'Yes'</span></pre><h5>String#lchomp!</h5><pre class="usage source" style="display:block"><span class="c"># mutable lchomp version</span></pre><h5>String#ords</h5><pre class="usage source" style="display:block"><span class="s"><span class="dl">'</span><span class="k">Hallo</span><span class="dl">'</span></span>.ords <span class="c"># =&gt; [72, 97, 108, 108, 111]</span></pre></td></tr><tr><th>Specification</th> <td> <span id="show_string_spec">(<a href="javascript:show('string_spec')">show</a>)</span>
1142
- <pre class="source" id="string_spec">require <span class="s"><span class="dl">'</span><span class="k">string</span><span class="dl">'</span></span>
1202
+ title="require 'zucker/string'"> <tr><th>Summary</th> <td><code>String</code> extensions.</td></tr><tr><th>Why?</th> <td>Strings cannot be comfortable enough ;).</td></tr><tr><th>Methods/Usage</th> <td><h5>String#^</h5><pre class="usage source" style="display:block"><span class="s"><span class="dl">'</span><span class="k">Yes vs No</span><span class="dl">'</span></span>^<span class="i">3</span> <span class="c"># =&gt; 'Yes'</span></pre><h5>String#lchomp</h5><pre class="usage source" style="display:block"><span class="s"><span class="dl">'</span><span class="k"> Yes</span><span class="dl">'</span></span>.lchomp <span class="c"># =&gt; 'Yes'</span></pre><h5>String#lchomp!</h5><pre class="usage source" style="display:block"><span class="c"># mutable lchomp version</span></pre><h5>String#ords</h5><pre class="usage source" style="display:block"><span class="s"><span class="dl">'</span><span class="k">Hallo</span><span class="dl">'</span></span>.ords <span class="c"># =&gt; [72, 97, 108, 108, 111]</span></pre></td></tr><tr><th>Specification</th> <td> <span id="show_string_spec">(<a href="javascript:show('string_spec')">show</a>)</span>
1203
+ <pre class="source" id="string_spec">require <span class="s"><span class="dl">'</span><span class="k">zucker/string</span><span class="dl">'</span></span>
1143
1204
 
1144
1205
  describe <span class="s"><span class="dl">'</span><span class="k">String#^</span><span class="dl">'</span></span> <span class="r">do</span>
1145
1206
  it <span class="s"><span class="dl">'</span><span class="k">should give C-like substring access to strings</span><span class="dl">'</span></span> <span class="r">do</span>
1146
1207
  string = <span class="s"><span class="dl">'</span><span class="k">Theoretische Informatik ist voll geil!</span><span class="dl">'</span></span>
1147
1208
 
1148
- (string|<span class="i">0</span>).should == <span class="s"><span class="dl">'</span><span class="k">Theoretische Informatik ist voll geil!</span><span class="dl">'</span></span>
1149
- (string|<span class="i">1</span>).should == <span class="s"><span class="dl">'</span><span class="k">heoretische Informatik ist voll geil!</span><span class="dl">'</span></span>
1150
- (string|<span class="i">13</span>).should == <span class="s"><span class="dl">'</span><span class="k">Informatik ist voll geil!</span><span class="dl">'</span></span>
1151
- (string|<span class="i">-1</span>).should == <span class="s"><span class="dl">'</span><span class="k">Theoretische Informatik ist voll geil</span><span class="dl">'</span></span>
1152
- (string|<span class="i">38</span>).should == <span class="s"><span class="dl">'</span><span class="dl">'</span></span>
1153
- (string|<span class="i">99</span>).should == <span class="pc">nil</span>
1209
+ (string^<span class="i">0</span>).should == <span class="s"><span class="dl">'</span><span class="k">Theoretische Informatik ist voll geil!</span><span class="dl">'</span></span>
1210
+ (string^<span class="i">1</span>).should == <span class="s"><span class="dl">'</span><span class="k">heoretische Informatik ist voll geil!</span><span class="dl">'</span></span>
1211
+ (string^<span class="i">13</span>).should == <span class="s"><span class="dl">'</span><span class="k">Informatik ist voll geil!</span><span class="dl">'</span></span>
1212
+ (string^<span class="i">-1</span>).should == <span class="s"><span class="dl">'</span><span class="k">Theoretische Informatik ist voll geil</span><span class="dl">'</span></span>
1213
+ (string^<span class="i">38</span>).should == <span class="s"><span class="dl">'</span><span class="dl">'</span></span>
1214
+ (string^<span class="i">99</span>).should == <span class="pc">nil</span>
1154
1215
  <span class="r">end</span>
1155
1216
  <span class="r">end</span>
1156
1217
 
@@ -1193,8 +1254,8 @@ describe <span class="s"><span class="dl">'</span><span class="k">String#ords</s
1193
1254
  <span class="c"># J-_-L</span></pre> </td></tr><tr><th>Compatibility</th> <td>1.9, 1.8</td></tr></table> <h3 title="require 'zucker/unary'">unary</h3>
1194
1255
  <table class="cube_table"
1195
1256
  id="unary_cube"
1196
- title="require 'zucker/unary'"> <tr><th>Summary</th> <td>Easy conversion between strings and symbols.</td></tr><tr><th>Why?</th> <td>Sometimes, you do not care if you get a <code>String</code> or <code>Symbol</code> as input - but when analysing it, you often need to choose one format. A concise possibility for this conversion is using the unary operators <code>String#-@</code> and <code>Symbol#+@</code></td></tr><tr><th>Methods/Usage</th> <td><h5>String#+@</h5><pre class="usage source" style="display:block">+<span class="s"><span class="dl">'</span><span class="k">was_string</span><span class="dl">'</span></span> <span class="c"># =&gt; 'was_string'</span></pre><h5>String#-@</h5><pre class="usage source" style="display:block">-<span class="s"><span class="dl">'</span><span class="k">was_string</span><span class="dl">'</span></span> <span class="c"># =&gt; :was_string</span></pre><h5>Symbol#+@</h5><pre class="usage source" style="display:block">+<span class="sy">:was_symbol</span> <span class="c"># =&gt; 'was_symbol'</span></pre><h5>Symbol#-@</h5><pre class="usage source" style="display:block">-<span class="sy">:was_symbol</span> <span class="c"># =&gt; :was_symbol</span></pre></td></tr><tr><th>Further information</th> <td>Inspired by (I've seen the unary + for Symbol somewhere on the net... but cannot remember where...)</td></tr><tr><th>Specification</th> <td> <span id="show_unary_spec">(<a href="javascript:show('unary_spec')">show</a>)</span>
1197
- <pre class="source" id="unary_spec">require <span class="s"><span class="dl">'</span><span class="k">unary</span><span class="dl">'</span></span>
1257
+ title="require 'zucker/unary'"> <tr><th>Summary</th> <td>Easy conversion between strings and symbols.</td></tr><tr><th>Why?</th> <td>Sometimes, you do not care if you get a <code>String</code> or <code>Symbol</code> as input - but when analysing it, you often need to choose one format. A concise possibility for this conversion is using the unary operators <code>String#-@</code> and <code>Symbol#+@</code>.</td></tr><tr><th>Methods/Usage</th> <td><h5>String#+@</h5><pre class="usage source" style="display:block">+<span class="s"><span class="dl">'</span><span class="k">was_string</span><span class="dl">'</span></span> <span class="c"># =&gt; 'was_string'</span></pre><h5>String#-@</h5><pre class="usage source" style="display:block">-<span class="s"><span class="dl">'</span><span class="k">was_string</span><span class="dl">'</span></span> <span class="c"># =&gt; :was_string</span></pre><h5>Symbol#+@</h5><pre class="usage source" style="display:block">+<span class="sy">:was_symbol</span> <span class="c"># =&gt; 'was_symbol'</span></pre><h5>Symbol#-@</h5><pre class="usage source" style="display:block">-<span class="sy">:was_symbol</span> <span class="c"># =&gt; :was_symbol</span></pre></td></tr><tr><th>Further information</th> <td>Inspired by (I've seen the unary + for Symbol somewhere on the net... but cannot remember where...)</td></tr><tr><th>Specification</th> <td> <span id="show_unary_spec">(<a href="javascript:show('unary_spec')">show</a>)</span>
1258
+ <pre class="source" id="unary_spec">require <span class="s"><span class="dl">'</span><span class="k">zucker/unary</span><span class="dl">'</span></span>
1198
1259
 
1199
1260
  describe <span class="co">Symbol</span>, <span class="s"><span class="dl">'</span><span class="k">#+@</span><span class="dl">'</span></span> <span class="r">do</span>
1200
1261
  it <span class="s"><span class="dl">'</span><span class="k">should convert to_s</span><span class="dl">'</span></span> <span class="r">do</span>
@@ -1239,24 +1300,26 @@ describe <span class="co">String</span>, <span class="s"><span class="dl">'</spa
1239
1300
  <span class="r">end</span>
1240
1301
  <span class="r">end</span>
1241
1302
 
1242
- <span class="c"># J-_-L</span></pre> </td></tr><tr><th>Compatibility</th> <td>1.9, 1.8 (+:literal not possible)</td></tr></table> <h3 title="require 'zucker/union'">union</h3>
1303
+ <span class="c"># J-_-L</span></pre> </td></tr><tr><th>Compatibility</th> <td>1.9, 1.8 (<code>+:literal</code> not possible)</td></tr></table> <h3 title="require 'zucker/union'">union</h3>
1243
1304
  <table class="cube_table"
1244
1305
  id="union_cube"
1245
- title="require 'zucker/union'"> <tr><th>Summary</th> <td>Easy creation of <code>Regexp.union</code>s</td></tr><tr><th>Methods/Usage</th> <td><h5>Regexp#|, String#|</h5><pre class="usage source" style="display:block"><span class="rx"><span class="dl">/</span><span class="k">Ruby</span><span class="ch">\d</span><span class="dl">/</span></span> | <span class="rx"><span class="dl">/</span><span class="k">test</span><span class="dl">/</span><span class="mod">i</span></span> | <span class="s"><span class="dl">&quot;</span><span class="k">cheat</span><span class="dl">&quot;</span></span>
1306
+ title="require 'zucker/union'"> <tr><th>Summary</th> <td>Easy creation of <code>Regexp.union</code>s.</td></tr><tr><th>Methods/Usage</th> <td><h5>Regexp#|, String#|</h5><pre class="usage source" style="display:block"><span class="rx"><span class="dl">/</span><span class="k">Ruby</span><span class="ch">\d</span><span class="dl">/</span></span> | <span class="rx"><span class="dl">/</span><span class="k">test</span><span class="dl">/</span><span class="mod">i</span></span> | <span class="s"><span class="dl">&quot;</span><span class="k">cheat</span><span class="dl">&quot;</span></span>
1246
1307
  <span class="c"># creates a Regexp similar to:</span>
1247
1308
  <span class="c"># /(Ruby\d|[tT][eE][sS][tT]|cheat)/</span>
1248
1309
  </pre></td></tr><tr><th>Specification</th> <td> <span id="show_union_spec">(<a href="javascript:show('union_spec')">show</a>)</span>
1249
- <pre class="source" id="union_spec">require <span class="s"><span class="dl">'</span><span class="k">union</span><span class="dl">'</span></span>
1310
+ <pre class="source" id="union_spec">require <span class="s"><span class="dl">'</span><span class="k">zucker/union</span><span class="dl">'</span></span>
1250
1311
 
1251
- describe <span class="s"><span class="dl">'</span><span class="k">Regexp#|</span><span class="dl">'</span></span> <span class="r">do</span>
1252
- it <span class="s"><span class="dl">'</span><span class="k">should create an Regexp.union of both operands</span><span class="dl">'</span></span> <span class="r">do</span>
1253
- (<span class="rx"><span class="dl">/</span><span class="k">hallo</span><span class="dl">/</span></span> | <span class="rx"><span class="dl">/</span><span class="ch">\d</span><span class="k">+</span><span class="dl">/</span></span> | <span class="rx"><span class="dl">/</span><span class="k">.</span><span class="dl">/</span></span>).should ==
1254
- <span class="co">Regexp</span>.union( <span class="co">Regexp</span>.union(<span class="rx"><span class="dl">/</span><span class="k">hallo</span><span class="dl">/</span></span>, <span class="rx"><span class="dl">/</span><span class="ch">\d</span><span class="k">+</span><span class="dl">/</span></span>), <span class="rx"><span class="dl">/</span><span class="k">.</span><span class="dl">/</span></span> )
1312
+ shared_examples_for <span class="s"><span class="dl">&quot;</span><span class="k">Regexp.union operator</span><span class="dl">&quot;</span></span> <span class="r">do</span>
1313
+ it <span class="s"><span class="dl">&quot;</span><span class="k">should create an Regexp.union of both operands</span><span class="dl">&quot;</span></span> <span class="r">do</span>
1255
1314
  <span class="r">end</span>
1256
1315
  <span class="r">end</span>
1257
1316
 
1317
+ describe <span class="s"><span class="dl">'</span><span class="k">Regexp#|</span><span class="dl">'</span></span> <span class="r">do</span>
1318
+ it_should_behave_like <span class="s"><span class="dl">'</span><span class="k">Regexp.union operator</span><span class="dl">'</span></span>
1319
+ <span class="r">end</span>
1320
+
1258
1321
  describe <span class="s"><span class="dl">'</span><span class="k">String#|</span><span class="dl">'</span></span> <span class="r">do</span>
1259
- it_should_behave_like <span class="s"><span class="dl">'</span><span class="k">Regexp#|</span><span class="dl">'</span></span>
1322
+ it_should_behave_like <span class="s"><span class="dl">'</span><span class="k">Regexp.union operator</span><span class="dl">'</span></span>
1260
1323
  <span class="r">end</span></pre> </td></tr><tr><th>Source</th> <td> <span id="show_union_source">(<a href="javascript:show('union_source')">show</a>)</span>
1261
1324
  <pre class="source" id="union_source"><span class="r">class</span> <span class="cl">Regexp</span>
1262
1325
  <span class="r">def</span> <span class="fu">|</span>(arg)
@@ -1271,12 +1334,157 @@ describe <span class="s"><span class="dl">'</span><span class="k">String#|</span
1271
1334
  <span class="r">end</span>
1272
1335
 
1273
1336
  <span class="c"># J-_-L</span></pre> </td></tr><tr><th>Compatibility</th> <td>1.9</td></tr></table>
1274
- </div>
1337
+ </div>
1338
+ <h2 title="require 'zucker/debug'">Cubes[debug]</h2>
1339
+ <div class="cubes">
1340
+ <h3 title="require 'zucker/D'">D</h3>
1341
+ <table class="cube_table"
1342
+ id="D_cube"
1343
+ title="require 'zucker/D'"> <tr><th>Summary</th> <td>Easy debug printing with the <code>p</code> alternative <code>.D</code>. It outputs to stdout and returns <code>self</code>. Accepts a block.</td></tr><tr><th>Methods/Usage</th> <td><h5>Object#D</h5><pre class="usage source" style="display:block">some.<span class="co">D</span>.methods.<span class="co">D</span>.noone.<span class="co">D</span>.knows.<span class="co">D</span>
1344
+ <span class="c"># ...outputs 4 lines with the inspected objects</span>
1345
+ <span class="c"># =&gt; (result)</span>
1346
+
1347
+ <span class="i">21</span>+<span class="co">Math</span>.sin(<span class="i">42</span>).<span class="co">D</span>
1348
+ <span class="c"># outputs -0.916521547915634</span>
1349
+ <span class="c"># =&gt; 20.0834784520844</span>
1350
+
1351
+ name = <span class="s"><span class="dl">'</span><span class="k">Earth</span><span class="dl">'</span></span>
1352
+ <span class="s"><span class="dl">'</span><span class="k">Hello </span><span class="dl">'</span></span> + name.<span class="co">D</span>{|e| <span class="s"><span class="dl">&quot;</span><span class="k">The length is: </span><span class="il"><span class="idl">#{</span>e.size<span class="idl">}</span></span><span class="dl">&quot;</span></span>}
1353
+ <span class="c"># outputs &quot;The length is: 5&quot;</span>
1354
+ <span class="c"># =&gt; 'Hello Earth'</span>
1355
+ </pre></td></tr><tr><th>Further information</th> <td>This is inspired by the funny <a href="http://moonbase.rydia.net/mental/blog/programming/eavesdropping-on-expressions"><code>.tap</code> method</a>.</td></tr><tr><th>Specification</th> <td> <span id="show_D_spec">(<a href="javascript:show('D_spec')">show</a>)</span>
1356
+ <pre class="source" id="D_spec">require <span class="s"><span class="dl">'</span><span class="k">zucker/D</span><span class="dl">'</span></span>
1357
+
1358
+ describe <span class="s"><span class="dl">'</span><span class="k">Object#D</span><span class="dl">'</span></span> <span class="r">do</span>
1359
+
1360
+ let <span class="sy">:a</span> <span class="r">do</span>
1361
+ [ <span class="i">1</span>, <span class="s"><span class="dl">&quot;</span><span class="k">1</span><span class="dl">&quot;</span></span>, <span class="i">2</span>..<span class="i">5</span>, [], {<span class="sy">:hallo</span> =&gt; <span class="sy">:du</span>}, <span class="pc">nil</span>, <span class="pc">true</span> ]
1362
+ <span class="r">end</span>
1363
+
1364
+ it <span class="s"><span class="dl">'</span><span class="k">should not change the object&quot;s value</span><span class="dl">'</span></span> <span class="r">do</span>
1365
+ a.each{ |e|
1366
+ (e.<span class="co">D</span>).should == e
1367
+ }
1368
+
1369
+ a.each{ |e|
1370
+ (e.<span class="co">D</span>{|value| <span class="s"><span class="dl">&quot;</span><span class="k">This is a: </span><span class="il"><span class="idl">#{</span>value<span class="idl">}</span></span><span class="dl">&quot;</span></span>}).should == e
1371
+ }
1372
+ <span class="r">end</span>
1373
+
1374
+ it <span class="s"><span class="dl">&quot;</span><span class="k">should puts .inspect if no block is given (and not change the object's value)</span><span class="dl">&quot;</span></span> <span class="r">do</span>
1375
+ capture_stdout <span class="r">do</span>
1376
+ a[<span class="i">0</span>].<span class="co">D</span>
1377
+ a[<span class="i">1</span>].<span class="co">D</span>
1378
+ a[<span class="i">6</span>].<span class="co">D</span>
1379
+ <span class="r">end</span>.should == <span class="s"><span class="dl">%{</span><span class="k">1</span><span class="ch">\n</span><span class="k">&quot;1&quot;</span><span class="ch">\n</span><span class="k">true</span><span class="ch">\n</span><span class="dl">}</span></span>
1380
+ <span class="r">end</span>
1381
+
1382
+ it <span class="s"><span class="dl">&quot;</span><span class="k">should puts the block if it is given (and not change the object's value)</span><span class="dl">&quot;</span></span> <span class="r">do</span>
1383
+ capture_stdout <span class="r">do</span>
1384
+ a[<span class="i">0</span>].<span class="co">D</span>{|value| <span class="s"><span class="dl">&quot;</span><span class="k">This is a: </span><span class="il"><span class="idl">#{</span>value<span class="idl">}</span></span><span class="dl">&quot;</span></span>}
1385
+ a[<span class="i">1</span>].<span class="co">D</span>{|value| <span class="s"><span class="dl">&quot;</span><span class="k">This is a: </span><span class="il"><span class="idl">#{</span>value<span class="idl">}</span></span><span class="dl">&quot;</span></span>}
1386
+ a[<span class="i">6</span>].<span class="co">D</span>{|value| <span class="s"><span class="dl">&quot;</span><span class="k">This is a: </span><span class="il"><span class="idl">#{</span>value<span class="idl">}</span></span><span class="dl">&quot;</span></span>}
1387
+ <span class="r">end</span>.should == <span class="s"><span class="dl">%{</span><span class="k">This is a: 1</span><span class="ch">\n</span><span class="k">This is a: 1</span><span class="ch">\n</span><span class="k">This is a: true</span><span class="ch">\n</span><span class="dl">}</span></span>
1388
+ <span class="r">end</span>
1389
+ <span class="r">end</span></pre> </td></tr><tr><th>Source</th> <td> <span id="show_D_source">(<a href="javascript:show('D_source')">show</a>)</span>
1390
+ <pre class="source" id="D_source"><span class="r">module</span> <span class="cl">Kernel</span>
1391
+ <span class="r">def</span> <span class="fu">D</span>(*args, &amp;block)
1392
+ <span class="r">if</span> args.empty?
1393
+ tap{
1394
+ <span class="r">if</span> block_given?
1395
+ puts <span class="r">yield</span> <span class="pc">self</span>
1396
+ <span class="r">else</span>
1397
+ puts <span class="pc">self</span>.inspect
1398
+ <span class="r">end</span>
1399
+ }
1400
+ <span class="r">else</span>
1401
+ raise <span class="co">ArgumentError</span>, <span class="s"><span class="dl">&quot;</span><span class="k">.D - The parser thought that the code after .D are method arguments... Please don't put a space after D or use .D() or .D{} in this case!</span><span class="dl">&quot;</span></span>
1402
+ <span class="c"># eval ...</span>
1403
+ <span class="r">end</span>
1404
+ <span class="r">end</span>
1405
+ <span class="r">end</span>
1406
+
1407
+ <span class="c"># J-_-L</span></pre> </td></tr><tr><th>Compatibility</th> <td>1.9, 1.8</td></tr></table> <h3 title="require 'zucker/binding'">binding</h3>
1408
+ <table class="cube_table"
1409
+ id="binding_cube"
1410
+ title="require 'zucker/binding'"> <tr><th>Summary</th> <td>Adds a verbose <code>Binding#inspect</code>.</td></tr><tr><th>Why?</th> <td>It gives you information about the current environment.</td></tr><tr><th>Methods/Usage</th> <td><h5>Binding#inspect</h5><pre class="usage source" style="display:block">binding.inspect</pre></td></tr><tr><th>Specification</th> <td> <span id="show_binding_spec">(<a href="javascript:show('binding_spec')">show</a>)</span>
1411
+ <pre class="source" id="binding_spec">require <span class="s"><span class="dl">'</span><span class="k">zucker/binding</span><span class="dl">'</span></span>
1412
+
1413
+ describe <span class="s"><span class="dl">'</span><span class="k">Binding#inspect</span><span class="dl">'</span></span> <span class="r">do</span>
1414
+ it <span class="s"><span class="dl">'</span><span class="k">should output the current environment</span><span class="dl">'</span></span> <span class="r">do</span>
1415
+ pending <span class="s"><span class="dl">'</span><span class="k">#TODO: write spec</span><span class="dl">'</span></span>
1416
+ <span class="r">end</span>
1417
+ <span class="r">end</span></pre> </td></tr><tr><th>Source</th> <td> <span id="show_binding_source">(<a href="javascript:show('binding_source')">show</a>)</span>
1418
+ <pre class="source" id="binding_source"><span class="r">class</span> <span class="cl">Binding</span>
1419
+ <span class="r">def</span> <span class="fu">inspect</span>
1420
+ put_vars = lambda { |array|
1421
+ <span class="r">if</span> array.empty?
1422
+ <span class="s"><span class="dl">'</span><span class="k"> - none</span><span class="dl">'</span></span>
1423
+ <span class="r">else</span>
1424
+ array.map{|e| <span class="s"><span class="dl">&quot;</span><span class="k"> - </span><span class="il"><span class="idl">#{</span>e<span class="idl">}</span></span><span class="k">: </span><span class="il"><span class="idl">#{</span> <span class="pc">self</span>.eval <span class="s"><span class="dl">'</span><span class="k">#{e}</span><span class="dl">'</span></span><span class="idl">}</span></span><span class="dl">&quot;</span></span>}*<span class="s"><span class="dl">&quot;</span><span class="ch">\n</span><span class="dl">&quot;</span></span>
1425
+ <span class="r">end</span>
1426
+ }
1427
+
1428
+ <span class="s"><span class="dl">&quot;</span><span class="il"><span class="idl">#{</span><span class="pc">self</span>.to_s<span class="idl">}</span></span><span class="k">
1429
+ local vars
1430
+ </span><span class="il"><span class="idl">#{</span> put_vars[ <span class="pc">self</span>.eval <span class="s"><span class="dl">'</span><span class="k">local_variables</span><span class="dl">'</span></span> ] <span class="idl">}</span></span><span class="k">
1431
+ (instance vars)
1432
+ </span><span class="il"><span class="idl">#{</span> put_vars[ <span class="pc">self</span>.eval <span class="s"><span class="dl">'</span><span class="k">instance_variables</span><span class="dl">'</span></span> ] <span class="idl">}</span></span><span class="k">
1433
+ self
1434
+ - </span><span class="il"><span class="idl">#{</span><span class="pc">self</span>.eval <span class="s"><span class="dl">'</span><span class="k">self</span><span class="dl">'</span></span><span class="idl">}</span></span><span class="k">
1435
+ block_given?
1436
+ - </span><span class="il"><span class="idl">#{</span><span class="pc">self</span>.eval <span class="s"><span class="dl">'</span><span class="k">block_given?</span><span class="dl">'</span></span><span class="idl">}</span></span><span class="dl">&quot;</span></span>
1437
+
1438
+ <span class="r">end</span>
1439
+ <span class="r">end</span>
1440
+
1441
+ <span class="c"># J-_-L</span></pre> </td></tr><tr><th>Compatibility</th> <td>1.9, 1.8</td></tr></table> <h3 title="require 'zucker/mm'">mm</h3>
1442
+ <table class="cube_table"
1443
+ id="mm_cube"
1444
+ title="require 'zucker/mm'"> <tr><th>Summary</th> <td><code>mm</code> displays an ordered public method list.</td></tr><tr><th>Why?</th> <td>See one object's methods without those rarely used inherited methods.</td></tr><tr><th>Methods/Usage</th> <td><h5>Object#method_list, Object#mm</h5><pre class="usage source" style="display:block"><span class="s"><span class="dl">'</span><span class="k">test</span><span class="dl">'</span></span>.mm <span class="i">2</span> <span class="c"># outputs the list (2 levels deep)</span></pre></td></tr><tr><th>Further information</th> <td>See <a href="http://rbjl.net/31-the-multi-mega-method-list">this article</a> for more information.</td></tr><tr><th>Specification</th> <td> <span id="show_mm_spec">(<a href="javascript:show('mm_spec')">show</a>)</span>
1445
+ <pre class="source" id="mm_spec">require <span class="s"><span class="dl">'</span><span class="k">zucker/mm</span><span class="dl">'</span></span>
1446
+
1447
+ describe <span class="s"><span class="dl">'</span><span class="k">Object#method_list</span><span class="dl">'</span></span> <span class="r">do</span>
1448
+ it <span class="s"><span class="dl">'</span><span class="k">should display an ordered method list</span><span class="dl">'</span></span> <span class="r">do</span>
1449
+ pending <span class="s"><span class="dl">'</span><span class="k">#TODO: write spec</span><span class="dl">'</span></span>
1450
+ <span class="r">end</span>
1451
+ <span class="r">end</span></pre> </td></tr><tr><th>Source</th> <td> <span id="show_mm_source">(<a href="javascript:show('mm_source')">show</a>)</span>
1452
+ <pre class="source" id="mm_source"><span class="r">module</span> <span class="cl">Kernel</span>
1453
+ <span class="r">def</span> <span class="fu">method_list</span>(levels = <span class="i">1</span>)
1454
+ <span class="r">if</span> <span class="pc">self</span>.is_a? <span class="co">Module</span>
1455
+ klass, method_function = <span class="pc">self</span>, <span class="sy">:public_methods</span>
1456
+ <span class="r">else</span>
1457
+ klass, method_function = <span class="pc">self</span>.class, <span class="sy">:public_instance_methods</span>
1458
+
1459
+ eigen = <span class="pc">self</span>.singleton_methods
1460
+ <span class="r">if</span> !eigen.empty?
1461
+ puts <span class="sy">:Eigenclass</span> <span class="c"># sorry for not being up to date, I just love the word</span>
1462
+ p <span class="pc">self</span>.singleton_methods
1463
+ <span class="r">end</span>
1464
+ <span class="r">end</span>
1465
+
1466
+ levels.times{ |level|
1467
+ <span class="r">if</span> cur = klass.ancestors[level]
1468
+ p cur <span class="c"># put class name</span>
1469
+ p cur.send method_function, <span class="pc">false</span> <span class="c"># put methods of the class</span>
1470
+ <span class="r">else</span>
1471
+ <span class="r">break</span>
1472
+ <span class="r">end</span>
1473
+ }
1474
+
1475
+ <span class="pc">self</span> <span class="c"># or whatever</span>
1476
+ <span class="r">end</span>
1477
+
1478
+ <span class="r">alias</span> <span class="fu">mm</span> <span class="fu">method_list</span>
1479
+ <span class="r">end</span>
1480
+
1481
+ <span class="c"># J-_-L</span></pre> </td></tr><tr><th>Compatibility</th> <td>1.9, 1.8 (returns strings instead of symbols)</td></tr></table>
1482
+ </div>
1275
1483
  <br/>
1276
1484
  </div>
1277
1485
  <div id="foot">
1278
1486
  <div id="smile"><a href="http://rbjl.net">J-_-L</a></div>
1279
- This is the Ruby Zucker 1 documentation.
1487
+ This is the Ruby Zucker 2 documentation.
1280
1488
  The current version is always available at <a href="http://rubyzucker.info">rubyzucker.info</a>.
1281
1489
  Gem source can be found at <a href="http://github.com/janlelis/zucker">github</a>.
1282
1490
  </div>