duct_tape 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. data/Gemfile +10 -0
  2. data/Gemfile.lock +35 -0
  3. data/LICENSE +25 -0
  4. data/README.md +223 -0
  5. data/Rakefile +38 -0
  6. data/VERSION +1 -0
  7. data/duct_tape.gemspec +106 -0
  8. data/ext/mkrf_conf.rb +36 -0
  9. data/git_hooks/env_vars.sh +287 -0
  10. data/git_hooks/post-commit +43 -0
  11. data/git_hooks/post-merge +8 -0
  12. data/git_hooks/pre-commit +273 -0
  13. data/install_git_hooks +17 -0
  14. data/lib/algorithms/containers/heap.rb +15 -0
  15. data/lib/algorithms/containers/priority_queue.rb +11 -0
  16. data/lib/algorithms/containers.rb +1 -0
  17. data/lib/duct_tape/autoassociative_array.rb +110 -0
  18. data/lib/duct_tape.rb +10 -0
  19. data/lib/ext/array.rb +327 -0
  20. data/lib/ext/boolean.rb +3 -0
  21. data/lib/ext/datetime.rb +7 -0
  22. data/lib/ext/dir.rb +59 -0
  23. data/lib/ext/file.rb +40 -0
  24. data/lib/ext/hash.rb +83 -0
  25. data/lib/ext/kernel.rb +593 -0
  26. data/lib/ext/numeric.rb +74 -0
  27. data/lib/ext/object.rb +17 -0
  28. data/lib/ext/pathname.rb +114 -0
  29. data/lib/ext/range.rb +7 -0
  30. data/lib/ext/regexp.rb +12 -0
  31. data/lib/ext/string.rb +54 -0
  32. data/lib/ext/symbol.rb +8 -0
  33. data/lib/ext/time.rb +32 -0
  34. data/lib/ext/uri.rb +16 -0
  35. data/spec/algorithms/containers/heap_spec.rb +19 -0
  36. data/spec/algorithms/containers/priority_queue_spec.rb +19 -0
  37. data/spec/duct_tape/autoassociative_array_spec.rb +139 -0
  38. data/spec/ext/array_spec.rb +407 -0
  39. data/spec/ext/boolean_spec.rb +19 -0
  40. data/spec/ext/datetime_spec.rb +10 -0
  41. data/spec/ext/dir_spec.rb +46 -0
  42. data/spec/ext/file_spec.rb +10 -0
  43. data/spec/ext/hash_spec.rb +73 -0
  44. data/spec/ext/kernel_spec.rb +64 -0
  45. data/spec/ext/numeric_spec.rb +61 -0
  46. data/spec/ext/object_spec.rb +19 -0
  47. data/spec/ext/pathname_spec.rb +13 -0
  48. data/spec/ext/range_spec.rb +10 -0
  49. data/spec/ext/regexp_spec.rb +10 -0
  50. data/spec/ext/string_spec.rb +73 -0
  51. data/spec/ext/symbol_spec.rb +10 -0
  52. data/spec/ext/time_spec.rb +19 -0
  53. data/spec/ext/uri_spec.rb +28 -0
  54. data/spec/spec_helper.rb +7 -0
  55. metadata +183 -0
@@ -0,0 +1,114 @@
1
+ require 'pathname'
2
+
3
+ class Pathname
4
+ # Cross-platform way of finding an executable in the $PATH.
5
+ #
6
+ # Pathname.which('ruby') #=> /usr/bin/ruby
7
+ def self.which(cmd)
8
+ paths = ENV['PATH'].split(File::PATH_SEPARATOR).uniq
9
+ exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
10
+ names = exts.map { |ext| "#{cmd}#{ext}" }
11
+ return do_search(paths, *names) { |f| f.executable? }
12
+ end
13
+
14
+ def self.library(lib)
15
+ paths = [
16
+ '/usr/local/lib64',
17
+ '/usr/local/lib',
18
+ '/usr/local/libdata',
19
+ '/opt/local/lib',
20
+ '/usr/lib64',
21
+ '/usr/lib',
22
+ '/usr/X11/lib',
23
+ '/usr/share',
24
+ ].uniq
25
+ names = [lib, "#{lib}.so", "lib#{lib}", "lib#{lib}.so"]
26
+
27
+ if detect_os[:platform] == "windows"
28
+ names = [
29
+ lib, "#{lib}.dll", "#{lib}.dll.a",
30
+ "lib#{lib}", "lib#{lib}.dll", "lib#{lib}.dll.a"
31
+ ]
32
+ paths = [
33
+ calling_method_dirname,
34
+ Dir.pwd,
35
+ File.join(ENV["SystemRoot"], "system"),
36
+ File.join(ENV["SystemRoot"], "system32"),
37
+ ENV["SystemRoot"],
38
+ ].compact.uniq
39
+ paths |= ENV['PATH'].split(File::PATH_SEPARATOR).uniq
40
+ end
41
+
42
+ return do_search(paths, *names) { |f| f.readable? && f.file? }
43
+ end
44
+
45
+ def self.header(hdr)
46
+ paths = [
47
+ "/usr/local/include",
48
+ "/opt/include",
49
+ "/usr/include",
50
+ RbConfig::CONFIG["includedir"],
51
+ RbConfig::CONFIG["oldincludedir"],
52
+ ].compact.uniq
53
+ names = [hdr, hdr + ".h", hdr + ".hpp"]
54
+ return do_search(paths, *names) { |f| f.readable? && f.file? }
55
+ end
56
+
57
+ def self.join(*paths)
58
+ new(File.join(*paths))
59
+ end
60
+
61
+ def to_file(*args, &block)
62
+ File.open(to_s, *args, &block)
63
+ end
64
+
65
+ def to_dir(*args, &block)
66
+ Dir.new(to_s, *args, &block)
67
+ end
68
+
69
+ =begin
70
+ def to_object(*args, &block)
71
+ if socket?
72
+ if defined?(::UNIXSocket)
73
+ ::UNIXSocket.new(path)
74
+ else
75
+ :socket
76
+ end
77
+ elsif symlink?
78
+ link = Pathname.new(File.readlink(name))
79
+ link = Pathname.join(File.dirname(to_s), link) if link !~ /\A#{SEPARATOR}/
80
+ # {:symlink => classify_file(link)}
81
+ link.to_object(*args, &block)
82
+ elsif directory?
83
+ (readable?) ? Dir.new(to_s, *args, &block) : :unreadable_directory
84
+ elsif file?
85
+ (readable?) ? File.open(to_s, *args, &block) : :unreadable_file
86
+ elsif blockdev?
87
+ :block_device
88
+ elsif chardev?
89
+ :char_device
90
+ end
91
+ rescue Errno::ECONNREFUSED
92
+ :unreadable_socket
93
+ rescue Errno::EPROTOTYPE
94
+ :socket
95
+ rescue Errno::EACCES
96
+ :unreadable_item
97
+ end
98
+ =end
99
+ alias_method :exists?, :exist?
100
+
101
+ private
102
+
103
+ def self.do_search(paths, *try_names, &block)
104
+ try_names.flatten!
105
+ paths.each do |path|
106
+ pn = Pathname.new(path)
107
+ try_names.each do |name|
108
+ file = pn + name
109
+ return file if yield(file)
110
+ end
111
+ end
112
+ nil
113
+ end
114
+ end
data/lib/ext/range.rb ADDED
@@ -0,0 +1,7 @@
1
+ class Range
2
+ # Converts to an array, then chunks into segments of maximum length
3
+ # (1..10).chunk(3) #=> [[1,2,3], [4,5,6], [7,8,9], [10]]
4
+ def chunk(max_length)
5
+ each_slice(max_length).to_a
6
+ end
7
+ end
data/lib/ext/regexp.rb ADDED
@@ -0,0 +1,12 @@
1
+ class Regexp
2
+ def invert
3
+ if @inverse
4
+ %r{#{@inverse}}
5
+ else
6
+ ret = %r{\A(?:(?!#{source}).)+\z}
7
+ ret.instance_exec(source) { |src| @inverse = src }
8
+ ret
9
+ end
10
+ end
11
+ alias_method :inverse, :invert
12
+ end
data/lib/ext/string.rb ADDED
@@ -0,0 +1,54 @@
1
+ class String
2
+ def uncolorize
3
+ self.gsub(/\e\[0[;0-9]*m/, "")
4
+ end
5
+
6
+ def colorized?
7
+ self =~ /\e\[0[;0-9]*m/ && true || false
8
+ end
9
+
10
+ def word_wrap(width=(tty_width || 80).to_i)
11
+ ret = dup
12
+ ret.word_wrap!(width)
13
+ ret
14
+ end
15
+
16
+ def word_wrap!(width=(tty_width || 80).to_i)
17
+ self.gsub!(/(.{1,#{width}})( +|$\n?)|(.{1,#{width}})/, "\\1\\3\n")
18
+ end
19
+
20
+ def chunk(max_length)
21
+ type_assert(max_length, Integer)
22
+ chars.each_slice(max_length).to_a.map! { |ary| ary.join("") }
23
+ end
24
+
25
+ def %(arg)
26
+ if ::RUBY_VERSION <= "1.8.7" && arg.is_a?(Hash)
27
+ return gsub(/%\{(\w+)\}/) do |s|
28
+ if arg.has_key?($1.to_sym)
29
+ arg[$1.to_sym]
30
+ else
31
+ raise KeyError.new("key{#{$1}} not found")
32
+ end
33
+ end
34
+ elsif arg.is_a?(Array)
35
+ return Kernel.sprintf(self, *arg)
36
+ else
37
+ return Kernel.sprintf(self, arg)
38
+ end
39
+ end
40
+
41
+ # Transform self to a Date
42
+ def to_date
43
+ Date.parse(self)
44
+ end
45
+
46
+ # Transform self to a Time
47
+ def to_time
48
+ Time.parse(self)
49
+ end
50
+
51
+ def to_const
52
+ split("::").inject(::Object) { |k,c| k.const_get(c) }
53
+ end
54
+ end
data/lib/ext/symbol.rb ADDED
@@ -0,0 +1,8 @@
1
+ class Symbol
2
+ unless method_defined?(:<=>)
3
+ def <=>(other)
4
+ return nil unless other.is_a?(Symbol)
5
+ to_s <=> other.to_s
6
+ end
7
+ end
8
+ end
data/lib/ext/time.rb ADDED
@@ -0,0 +1,32 @@
1
+ class Time
2
+ def self.duration(num, usecs=false)
3
+ type_assert(num, Numeric)
4
+ secs = num.to_i
5
+ mins = secs / 60
6
+ hours = mins / 60
7
+ days = hours / 24
8
+
9
+ secs = num if usecs
10
+
11
+ day_str = (days == 1 ? "day" : "days")
12
+ hour_str = (hours % 24 == 1 ? "hour" : "hours")
13
+ min_str = (mins % 60 == 1 ? "minute" : "minutes")
14
+ sec_str = (secs % 60 == 1 ? "second" : "seconds")
15
+
16
+ str_ary = []
17
+ str_ary << "#{days} #{day_str}" if days > 0
18
+ str_ary << "#{hours % 24} #{hour_str}" if hours > 0
19
+ str_ary << "#{mins % 60} #{min_str}" if mins > 0
20
+ str_ary << "#{secs % 60} #{sec_str}" if secs > 0
21
+ if str_ary.size > 2
22
+ [str_ary[0..-2].join(", "), str_ary[-1]].join(", and ")
23
+ else
24
+ str_ary.join(" and ")
25
+ end
26
+ end
27
+
28
+ # Transform a Time to a DateTime
29
+ def to_datetime
30
+ DateTime.parse(self.to_s)
31
+ end
32
+ end
data/lib/ext/uri.rb ADDED
@@ -0,0 +1,16 @@
1
+ require 'pathname'
2
+ require 'uri'
3
+
4
+ class URI::Generic
5
+ def relative_path?
6
+ relative? && !path.empty? && Pathname.new(path).relative?
7
+ end
8
+
9
+ def absolute_path?
10
+ relative? && Pathname.new(path).absolute?
11
+ end
12
+
13
+ def relative_scheme?
14
+ scheme.nil? && (!host.nil? || !path.empty?)
15
+ end
16
+ end
@@ -0,0 +1,19 @@
1
+ require File.join(File.dirname(__FILE__), "..", "..", "spec_helper.rb")
2
+
3
+ #
4
+ # Containers::Heap#to_a
5
+ #
6
+ describe Containers::Heap, "#to_a" do
7
+ it "remains unchanged" do
8
+ # TODO
9
+ end
10
+ end
11
+
12
+ #
13
+ # Containers::Heap#each
14
+ #
15
+ describe Containers::Heap, "#each" do
16
+ it "remains unchanged" do
17
+ # TODO
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ require File.join(File.dirname(__FILE__), "..", "..", "spec_helper.rb")
2
+
3
+ #
4
+ # Containers::PriorityQueue#to_a
5
+ #
6
+ describe Containers::PriorityQueue, "#to_a" do
7
+ it "remains unchanged" do
8
+ # TODO
9
+ end
10
+ end
11
+
12
+ #
13
+ # Containers::PriorityQueue#each
14
+ #
15
+ describe Containers::PriorityQueue, "#each" do
16
+ it "remains unchanged" do
17
+ # TODO
18
+ end
19
+ end
@@ -0,0 +1,139 @@
1
+ require File.join(File.dirname(__FILE__), "..", "spec_helper.rb")
2
+
3
+ #
4
+ # Containers::AutoassociativeArray#initialize
5
+ #
6
+ describe Containers::AutoassociativeArray, "#initialize" do
7
+ it "remains unchanged" do
8
+ # TODO
9
+ end
10
+ end
11
+
12
+ #
13
+ # Containers::AutoassociativeArray#insert
14
+ #
15
+ describe Containers::AutoassociativeArray, "#insert" do
16
+ it "remains unchanged" do
17
+ # TODO
18
+ end
19
+ end
20
+
21
+ #
22
+ # Containers::AutoassociativeArray#<<
23
+ #
24
+ describe Containers::AutoassociativeArray, "#<<" do
25
+ it "remains unchanged" do
26
+ # TODO
27
+ end
28
+ end
29
+
30
+ #
31
+ # Containers::AutoassociativeArray#partial_match
32
+ #
33
+ describe Containers::AutoassociativeArray, "#partial_match" do
34
+ it "remains unchanged" do
35
+ # TODO
36
+ end
37
+
38
+ it "returns the matches with the most query matches" do
39
+ aa = Containers::AutoassociativeArray.new
40
+ aa << [1,2,3] << [2,3,4] << [3,4,5]
41
+ aa.partial_match(1,4,5).should eq([3,4,5])
42
+ end
43
+
44
+ it "returns all of the matches with the most query matches" do
45
+ aa = Containers::AutoassociativeArray.new
46
+ aa << [1,2,3] << [2,3,4] << [3,4,5]
47
+ aa.partial_match(1,5).should eq([[1,2,3], [3,4,5]])
48
+ aa.partial_match(1,3,5).should eq([[1,2,3], [3,4,5]])
49
+ aa.partial_match(2,4).should eq([2,3,4])
50
+ end
51
+
52
+ it "returns the matches with the most query matches with the most matches" do
53
+ aa = Containers::AutoassociativeArray.new
54
+ aa << [1,2,3] << [2,3,4] << [3,4,5]
55
+ aa.partial_match(1,4).should eq([[2,3,4], [3,4,5]])
56
+ aa.partial_match(2,5).should eq([[1,2,3], [2,3,4]])
57
+ end
58
+ end
59
+
60
+ #
61
+ # Containers::AutoassociativeArray#[]
62
+ #
63
+ describe Containers::AutoassociativeArray, "#[]" do
64
+ it "remains unchanged" do
65
+ # TODO
66
+ end
67
+ end
68
+
69
+ #
70
+ # Containers::AutoassociativeArray#by_column
71
+ #
72
+ describe Containers::AutoassociativeArray, "#by_column" do
73
+ it "remains unchanged" do
74
+ # TODO
75
+ end
76
+ end
77
+
78
+ #
79
+ # Containers::AutoassociativeArray#empty?
80
+ #
81
+ describe Containers::AutoassociativeArray, "#empty?" do
82
+ it "remains unchanged" do
83
+ # TODO
84
+ end
85
+ end
86
+
87
+ #
88
+ # Containers::AutoassociativeArray#length
89
+ #
90
+ describe Containers::AutoassociativeArray, "#length" do
91
+ it "remains unchanged" do
92
+ # TODO
93
+ end
94
+ end
95
+
96
+ #
97
+ # Containers::AutoassociativeArray#size
98
+ #
99
+ describe Containers::AutoassociativeArray, "#size" do
100
+ it "remains unchanged" do
101
+ # TODO
102
+ end
103
+ end
104
+
105
+ #
106
+ # Containers::AutoassociativeArray#clear
107
+ #
108
+ describe Containers::AutoassociativeArray, "#clear" do
109
+ it "remains unchanged" do
110
+ # TODO
111
+ end
112
+ end
113
+
114
+ #
115
+ # Containers::AutoassociativeArray#inspect
116
+ #
117
+ describe Containers::AutoassociativeArray, "#inspect" do
118
+ it "remains unchanged" do
119
+ # TODO
120
+ end
121
+ end
122
+
123
+ #
124
+ # Containers::AutoassociativeArray#to_s
125
+ #
126
+ describe Containers::AutoassociativeArray, "#to_s" do
127
+ it "remains unchanged" do
128
+ # TODO
129
+ end
130
+ end
131
+
132
+ #
133
+ # Containers::AutoassociativeArray#dup
134
+ #
135
+ describe Containers::AutoassociativeArray, "#dup" do
136
+ it "remains unchanged" do
137
+ # TODO
138
+ end
139
+ end