zucker 0.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (88) hide show
  1. data/MIT-LICENSE +20 -0
  2. data/README +4 -0
  3. data/Rakefile +23 -0
  4. data/lib/zucker.rb +10 -0
  5. data/lib/zucker/1/D.rb +19 -0
  6. data/lib/zucker/1/aliases.rb +28 -0
  7. data/lib/zucker/1/all.rb +6 -0
  8. data/lib/zucker/1/array.rb +17 -0
  9. data/lib/zucker/1/array2proc.rb +10 -0
  10. data/lib/zucker/1/binding.rb +25 -0
  11. data/lib/zucker/1/blank.rb +26 -0
  12. data/lib/zucker/1/class2proc.rb +10 -0
  13. data/lib/zucker/1/debug.rb +4 -0
  14. data/lib/zucker/1/default.rb +25 -0
  15. data/lib/zucker/1/descriptions/D.yaml +25 -0
  16. data/lib/zucker/1/descriptions/aliases.yaml +18 -0
  17. data/lib/zucker/1/descriptions/array.yaml +16 -0
  18. data/lib/zucker/1/descriptions/array2proc.yaml +15 -0
  19. data/lib/zucker/1/descriptions/binding.yaml +12 -0
  20. data/lib/zucker/1/descriptions/blank.yaml +14 -0
  21. data/lib/zucker/1/descriptions/class2proc.yaml +15 -0
  22. data/lib/zucker/1/descriptions/egonil.yaml +20 -0
  23. data/lib/zucker/1/descriptions/enumerable.yaml +13 -0
  24. data/lib/zucker/1/descriptions/hash.yaml +14 -0
  25. data/lib/zucker/1/descriptions/hash2proc.yaml +13 -0
  26. data/lib/zucker/1/descriptions/iterate.yaml +19 -0
  27. data/lib/zucker/1/descriptions/ivars.yaml +22 -0
  28. data/lib/zucker/1/descriptions/kernel.yaml +13 -0
  29. data/lib/zucker/1/descriptions/mcopy.yaml +14 -0
  30. data/lib/zucker/1/descriptions/mm.yaml +14 -0
  31. data/lib/zucker/1/descriptions/regexp2proc.yaml +15 -0
  32. data/lib/zucker/1/descriptions/sandbox.yaml +16 -0
  33. data/lib/zucker/1/descriptions/square_brackets_for.yaml +25 -0
  34. data/lib/zucker/1/descriptions/string.yaml +15 -0
  35. data/lib/zucker/1/descriptions/unary.yaml +15 -0
  36. data/lib/zucker/1/descriptions/union.yaml +11 -0
  37. data/lib/zucker/1/documentation/meta.yaml +4 -0
  38. data/lib/zucker/1/documentation/zucker_doc.html +1158 -0
  39. data/lib/zucker/1/documentation/zucker_doc.rb +369 -0
  40. data/lib/zucker/1/egonil.rb +14 -0
  41. data/lib/zucker/1/enumerable.rb +12 -0
  42. data/lib/zucker/1/hash.rb +19 -0
  43. data/lib/zucker/1/hash2proc.rb +12 -0
  44. data/lib/zucker/1/iterate.rb +23 -0
  45. data/lib/zucker/1/ivars.rb +26 -0
  46. data/lib/zucker/1/kernel.rb +20 -0
  47. data/lib/zucker/1/mcopy.rb +9 -0
  48. data/lib/zucker/1/mm.rb +31 -0
  49. data/lib/zucker/1/regexp2proc.rb +10 -0
  50. data/lib/zucker/1/sandbox.rb +15 -0
  51. data/lib/zucker/1/specification/D_spec.rb +27 -0
  52. data/lib/zucker/1/specification/aliases_spec.rb +34 -0
  53. data/lib/zucker/1/specification/array2proc_spec.rb +8 -0
  54. data/lib/zucker/1/specification/array_spec.rb +23 -0
  55. data/lib/zucker/1/specification/binding_spec.rb +6 -0
  56. data/lib/zucker/1/specification/blank_spec.rb +20 -0
  57. data/lib/zucker/1/specification/class2proc_spec.rb +9 -0
  58. data/lib/zucker/1/specification/egonil_spec.rb +30 -0
  59. data/lib/zucker/1/specification/enumerable_spec.rb +8 -0
  60. data/lib/zucker/1/specification/hash2proc_spec.rb +12 -0
  61. data/lib/zucker/1/specification/hash_spec.rb +10 -0
  62. data/lib/zucker/1/specification/iterate_spec.rb +54 -0
  63. data/lib/zucker/1/specification/ivars_spec.rb +20 -0
  64. data/lib/zucker/1/specification/kernel_spec.rb +34 -0
  65. data/lib/zucker/1/specification/mcopy_spec.rb +13 -0
  66. data/lib/zucker/1/specification/mm_spec.rb +6 -0
  67. data/lib/zucker/1/specification/regexp2proc_spec.rb +9 -0
  68. data/lib/zucker/1/specification/sandbox_spec.rb +7 -0
  69. data/lib/zucker/1/specification/square_brackets_for_spec.rb +59 -0
  70. data/lib/zucker/1/specification/string_spec.rb +29 -0
  71. data/lib/zucker/1/specification/unary_spec.rb +26 -0
  72. data/lib/zucker/1/specification/union_spec.rb +13 -0
  73. data/lib/zucker/1/square_brackets_for.rb +20 -0
  74. data/lib/zucker/1/string.rb +25 -0
  75. data/lib/zucker/1/unary.rb +22 -0
  76. data/lib/zucker/1/union.rb +14 -0
  77. data/lib/zucker/all.rb +2 -0
  78. data/lib/zucker/debug.rb +2 -0
  79. data/lib/zucker/default.rb +2 -0
  80. data/lib/zucker/edge/ideas/args.rb +22 -0
  81. data/lib/zucker/edge/ideas/args.yaml +19 -0
  82. data/lib/zucker/edge/ideas/args_spec.rb +19 -0
  83. data/lib/zucker/edge/ideas/clone_deep.rb +21 -0
  84. data/lib/zucker/edge/ideas/clone_deep_spec.rb +12 -0
  85. data/lib/zucker/edge/ideas/dclone.yaml +12 -0
  86. data/lib/zucker/edge/ideas/hash.rb +18 -0
  87. data/lib/zucker/edge/ideas/require_directory.rb +6 -0
  88. metadata +153 -0
@@ -0,0 +1,26 @@
1
+ def instance_variables_from(obj, *only)
2
+ iter =
3
+ if obj.is_a? Binding
4
+ obj.eval('local_variables').map{|e| [obj.eval(e), e] }
5
+ elsif obj.is_a? Hash
6
+ obj.map{|k,v| [v,k] }
7
+ else
8
+ # elsif obj.is_a? Enumerable
9
+ obj.each.with_index
10
+ end
11
+
12
+ ret = []
13
+ iter.each{ |value, arg|
14
+ arg = arg.to_s
15
+ if only.include?(arg) || only.include?(arg.to_sym) || only.empty?
16
+ arg = '_' + arg if (48..57).member? arg.unpack('C')[0] # 1.8+1.9
17
+ ret << ivar = :"@#{arg}"
18
+ self.instance_variable_set ivar, value
19
+ end
20
+ }
21
+ ret
22
+ end
23
+ alias ivars instance_variables_from
24
+
25
+ # J-_-L
26
+
@@ -0,0 +1,20 @@
1
+ def activate_warnings!
2
+ $VERBOSE = true
3
+ end
4
+
5
+ def deactivate_warnings!
6
+ $VERBOSE = false
7
+ end
8
+
9
+ def warnings_activated?
10
+ $VERBOSE
11
+ end
12
+
13
+ def library?
14
+ __FILE__ != $PROGRAM_NAME
15
+ end
16
+
17
+ def ignore_sigint! # ctrl+c
18
+ Signal.trap *%w|SIGINT IGNORE|
19
+ end
20
+
@@ -0,0 +1,9 @@
1
+ class Object
2
+ def mcopy
3
+ Marshal.load Marshal.dump self
4
+ end
5
+ # alias copy mcopy
6
+ end
7
+
8
+ # J-_-L
9
+
@@ -0,0 +1,31 @@
1
+ module Kernel
2
+ def method_list(levels = 1)
3
+ if self.is_a? Module
4
+ klass, method_function = self, :public_methods
5
+ else
6
+ klass, method_function = self.class, :public_instance_methods
7
+
8
+ eigen = self.singleton_methods
9
+ if !eigen.empty?
10
+ puts :Eigenclass # sorry for not being up to date, I just love the word
11
+ p self.singleton_methods
12
+ end
13
+ end
14
+
15
+ levels.times{ |level|
16
+ if cur = klass.ancestors[level]
17
+ p cur # put class name
18
+ p cur.send method_function, false # put methods of the class
19
+ else
20
+ break
21
+ end
22
+ }
23
+
24
+ self # or whatever
25
+ end
26
+
27
+ alias mm method_list
28
+ end
29
+
30
+ # J-_-L
31
+
@@ -0,0 +1,10 @@
1
+ class Regexp
2
+ def to_proc
3
+ proc do |e|
4
+ e.to_s[self]
5
+ end
6
+ end
7
+ end
8
+
9
+ # J-_-L
10
+
@@ -0,0 +1,15 @@
1
+ def sandbox(rescueblock=nil)
2
+ Thread.start do
3
+ $SAFE = 4
4
+ yield
5
+ end.value
6
+ rescue SecurityError => e
7
+ if rescueblock
8
+ rescueblock.call e
9
+ else
10
+ raise e
11
+ end
12
+ end
13
+
14
+ # J-_-L
15
+
@@ -0,0 +1,27 @@
1
+ require 'D'
2
+
3
+ describe 'Object#D' do
4
+
5
+ let :a do
6
+ [ 1, "1", 2..5, [], {:hallo => :du}, nil, true ]
7
+ end
8
+
9
+ it 'should not change the object"s value' do
10
+ a.each{ |e|
11
+ (e.D).should == e
12
+ }
13
+ end
14
+
15
+ it "should puts .inspect if no block is given (and not change the object's value)" do
16
+ # a.each{ |e|
17
+ # (e.D).should == e
18
+ # }
19
+ end
20
+
21
+ it "should puts the block if it is given (and not change the object's value)" do
22
+ a.each{ |e|
23
+ (e.D{|value| "This is a: #{value}"}).should == e
24
+ }
25
+ end
26
+ end
27
+
@@ -0,0 +1,34 @@
1
+ require 'aliases'
2
+
3
+ describe '(aliases)' do
4
+ it 'should create these aliases [ sorry, no real spec for this one :P ] ' do
5
+ # alias is_an? is_a?
6
+
7
+ # module Enumerable
8
+ # alias with zip
9
+ # alias % zip
10
+ # end
11
+
12
+ # class Array
13
+ # alias ** product
14
+ # end
15
+
16
+ # class Hash
17
+ # alias + merge
18
+ # end
19
+
20
+ # class Binding
21
+ # #alias [] eval
22
+ # def [](expr)
23
+ # self.eval "#{expr}"
24
+ # end
25
+ # end
26
+
27
+ end
28
+
29
+ it 'should define these constants' do
30
+ Infinity.finite?.should == false
31
+ NaN.nan?.should == true
32
+ end
33
+ end
34
+
@@ -0,0 +1,8 @@
1
+ require 'array2proc'
2
+
3
+ describe 'Array#to_proc' do
4
+ it 'should call the method of the first symbol, using the remaining elements as paramaters' do
5
+ [1,2,3,4].map( &[:to_s, 2] ).should == ["1", "10", "11", "100"]
6
+ end
7
+ end
8
+
@@ -0,0 +1,23 @@
1
+ require 'array'
2
+
3
+ describe 'Array#^' do
4
+ it 'should do an exclusive or' do
5
+ a = [1,2,3,4]
6
+ b = [3,4,5,6]
7
+ (a^b).should == [1,2,5,6]
8
+ end
9
+ end
10
+
11
+ describe 'Array#sum' do
12
+ it 'should sum the array' do
13
+ [1,2,3,4,5].sum.should == 15
14
+ %w|More Ruby|.sum.should == 'MoreRuby'
15
+ end
16
+ end
17
+
18
+ describe 'Array#chrs' do
19
+ it 'should convert the array to a string, using each element as ord value for the char' do
20
+ [72, 97, 108, 108, 111].chrs.should == 'Hallo'
21
+ end
22
+ end
23
+
@@ -0,0 +1,6 @@
1
+ require 'binding'
2
+
3
+ describe 'Binding#inspect' do
4
+ it 'should output the current environment'
5
+ end
6
+
@@ -0,0 +1,20 @@
1
+ require 'blank'
2
+
3
+ describe 'Object#blank?' do
4
+ it 'should be blank for blank values' do
5
+ blank_values = [ nil, false, '', ' ', " \n\t \r ", [], {}, // ]
6
+
7
+ blank_values.each{ |blank|
8
+ blank.blank?.should == true
9
+ }
10
+ end
11
+
12
+ it 'should not be blank for non blank values' do
13
+ present_values = [ Object.new, true, 0, 1, 'a', [nil], { nil => nil } ]
14
+
15
+ present_values.each{ |present|
16
+ present.blank?.should == false
17
+ }
18
+ end
19
+ end
20
+
@@ -0,0 +1,9 @@
1
+ require 'class2proc'
2
+ require 'set'
3
+
4
+ describe 'Class#to_proc' do
5
+ it 'should create new instances of the class' do
6
+ [ [1,2],[3,5,6,7,3] ].map(&Set).should == [ Set[1,2], Set[5,6,7,3] ]
7
+ end
8
+ end
9
+
@@ -0,0 +1,30 @@
1
+ require 'egonil'
2
+
3
+ describe 'egonil' do
4
+ it 'should not raise nil exceptions in the block' do
5
+ proc do
6
+ egonil{ nil.some_methods.that[:do].not.exist }
7
+ end.should_not raise_exception
8
+ end
9
+
10
+ it 'should return the nil_value if given' do
11
+ egonil(9){ nil.some_methods.that[:do].not.exist }.should == 9
12
+ end
13
+
14
+ it 'should restore default behaviour after the block' do
15
+ proc do
16
+ egonil{ nil.some_methods.that[:do].not.exist }
17
+ end.should_not raise_exception
18
+
19
+ proc do
20
+ nil.a_method
21
+ end.should raise_exception NoMethodError
22
+ end
23
+
24
+ it 'raise NoMethodError for non-nil objects' do
25
+ proc do
26
+ egonil{ 5.a_method }
27
+ end.should raise_exception NoMethodError
28
+ end
29
+ end
30
+
@@ -0,0 +1,8 @@
1
+ require 'enumerable'
2
+
3
+ describe 'Enumerable#mash' do
4
+ it 'should "map" a hash' do
5
+ [1,2,3].mash{|e| [e, e.to_s] }.should == {1=>'1',2=>'2',3=>'3',}
6
+ end
7
+ end
8
+
@@ -0,0 +1,12 @@
1
+ require 'hash2proc'
2
+
3
+ describe 'Hash#to_proc' do
4
+ it 'should run the proc given in the value for a key in the hash' do
5
+ [1,2,3,4].map(&{
6
+ 4 => :to_s,
7
+ # 3 => [:to_s, 2] # "11" => if array2proc is used
8
+ 2 => lambda {|e| e + 1000}
9
+ }).should == [1, 1002, 3, "4"]
10
+ end
11
+ end
12
+
@@ -0,0 +1,10 @@
1
+ require 'hash'
2
+
3
+ describe 'Hash.zip' do
4
+ it 'should zip together both given enumerables and take them as key=>values for a new hash'
5
+ end
6
+
7
+ describe 'Hash#<<' do
8
+ it 'should append new elements to the hash'
9
+ end
10
+
@@ -0,0 +1,54 @@
1
+ require 'iterate'
2
+
3
+ describe 'Object#iterate' do
4
+ let :a do [1, 2, 3] end
5
+ let :b do %w|a b c d| end
6
+ let :res do Hash.new {[]} end
7
+
8
+ it 'should behave like Enumerable#each for a single argument' do
9
+ iterate a do |ele|
10
+ res[:iter] << ele
11
+ end
12
+
13
+ a.each do |ele|
14
+ res[:each] << ele
15
+ end
16
+
17
+ res[:iter].should == res[:each]
18
+ end
19
+
20
+ it 'should pass the right params to the block' do
21
+ res = Hash.new {[]} # TODO: why?
22
+ res[:iter_a_b] = [] # ....
23
+ res[:iter_b_a] = [] # ....
24
+
25
+
26
+ iterate a, b do |e,f|
27
+ res[:iter_a_b] << [e, f]
28
+ # p res[:iter_a_b], e, f
29
+ end
30
+
31
+ res[:iter_a_b].should == [
32
+ [1, 'a'],
33
+ [2, 'b'],
34
+ [3, 'c'],
35
+ [nil, 'd'],
36
+ ]
37
+
38
+ iterate b, a do |e,f|
39
+ res[:iter_b_a] << [e, f]
40
+ end
41
+
42
+ res[:iter_b_a].should == [
43
+ ['a', 1],
44
+ ['b', 2],
45
+ ['c', 3],
46
+ ['d', nil],
47
+ ]
48
+
49
+ end
50
+
51
+ it 'should return enumerators if no block is applied' do
52
+ end
53
+ end
54
+
@@ -0,0 +1,20 @@
1
+ require 'ivars'
2
+
3
+ describe 'instance_variables_from' do
4
+ it 'should tansform the given parameter to instance variables' do
5
+ def a_method(a = 1, b = 2)
6
+ instance_variables_from binding # assigns @a and @b
7
+
8
+ params = {:c => 3, :d => 4}
9
+ ivars params # # assigns @c and @d
10
+ end
11
+
12
+ a_method
13
+ @a.should == 1
14
+ @b.should == 2
15
+ @c.should == 3
16
+ @d.should == 4
17
+
18
+ end
19
+ end
20
+
@@ -0,0 +1,34 @@
1
+ require 'kernel'
2
+
3
+ describe 'activate_warnings!' do
4
+ it 'should set $VERBOSE to true' do
5
+ activate_warnings!
6
+ $VERBOSE.should == true
7
+ end
8
+ end
9
+
10
+ describe 'deactivate_warnings!' do
11
+ it 'should set $VERBOSE to false' do
12
+ deactivate_warnings!
13
+ $VERBOSE.should == false
14
+ end
15
+ end
16
+
17
+ describe 'warnings_activated?' do
18
+ it 'should return $VERBOSE' do
19
+ warnings_activated?.should == $VERBOSE
20
+ end
21
+ end
22
+
23
+ describe 'library?' do
24
+ it 'should return false if the file is invoked directly' do
25
+ library?.should == ( __FILE__ != $PROGRAM_NAME )
26
+ end
27
+ end
28
+
29
+ describe 'ignore_sigint!' do
30
+ it 'should catch ctrl+c signals' do
31
+ # ...
32
+ end
33
+ end
34
+
@@ -0,0 +1,13 @@
1
+ require 'mcopy'
2
+
3
+ describe 'Object#mcopy' do
4
+ it 'create a (deep) copy via marshalling' do
5
+ a = %w[hello world]
6
+ b = a.mcopy
7
+ b.should == a
8
+
9
+ b[0][1,1] = ''
10
+ b.should_not == a
11
+ end
12
+ end
13
+