sundbp-extlib 0.9.14

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 (72) hide show
  1. data/.autotest +21 -0
  2. data/.document +5 -0
  3. data/.gitignore +22 -0
  4. data/LICENSE +47 -0
  5. data/README.rdoc +17 -0
  6. data/Rakefile +28 -0
  7. data/VERSION +1 -0
  8. data/extlib.gemspec +146 -0
  9. data/lib/extlib.rb +50 -0
  10. data/lib/extlib/array.rb +36 -0
  11. data/lib/extlib/assertions.rb +8 -0
  12. data/lib/extlib/blank.rb +89 -0
  13. data/lib/extlib/boolean.rb +11 -0
  14. data/lib/extlib/byte_array.rb +6 -0
  15. data/lib/extlib/class.rb +177 -0
  16. data/lib/extlib/datetime.rb +29 -0
  17. data/lib/extlib/dictionary.rb +433 -0
  18. data/lib/extlib/hash.rb +442 -0
  19. data/lib/extlib/hook.rb +403 -0
  20. data/lib/extlib/inflection.rb +440 -0
  21. data/lib/extlib/lazy_array.rb +451 -0
  22. data/lib/extlib/lazy_module.rb +18 -0
  23. data/lib/extlib/logger.rb +198 -0
  24. data/lib/extlib/mash.rb +155 -0
  25. data/lib/extlib/module.rb +47 -0
  26. data/lib/extlib/nil.rb +5 -0
  27. data/lib/extlib/numeric.rb +5 -0
  28. data/lib/extlib/object.rb +175 -0
  29. data/lib/extlib/object_space.rb +13 -0
  30. data/lib/extlib/pathname.rb +20 -0
  31. data/lib/extlib/pooling.rb +235 -0
  32. data/lib/extlib/rubygems.rb +38 -0
  33. data/lib/extlib/simple_set.rb +66 -0
  34. data/lib/extlib/string.rb +176 -0
  35. data/lib/extlib/struct.rb +17 -0
  36. data/lib/extlib/symbol.rb +21 -0
  37. data/lib/extlib/time.rb +43 -0
  38. data/lib/extlib/virtual_file.rb +10 -0
  39. data/spec/array_spec.rb +39 -0
  40. data/spec/blank_spec.rb +85 -0
  41. data/spec/byte_array_spec.rb +7 -0
  42. data/spec/class_spec.rb +157 -0
  43. data/spec/datetime_spec.rb +22 -0
  44. data/spec/hash_spec.rb +537 -0
  45. data/spec/hook_spec.rb +1234 -0
  46. data/spec/inflection/plural_spec.rb +564 -0
  47. data/spec/inflection/singular_spec.rb +497 -0
  48. data/spec/inflection_extras_spec.rb +110 -0
  49. data/spec/lazy_array_spec.rb +1957 -0
  50. data/spec/lazy_module_spec.rb +38 -0
  51. data/spec/mash_spec.rb +311 -0
  52. data/spec/module_spec.rb +70 -0
  53. data/spec/object_space_spec.rb +9 -0
  54. data/spec/object_spec.rb +114 -0
  55. data/spec/pooling_spec.rb +511 -0
  56. data/spec/rcov.opts +6 -0
  57. data/spec/simple_set_spec.rb +57 -0
  58. data/spec/spec.opts +4 -0
  59. data/spec/spec_helper.rb +10 -0
  60. data/spec/string_spec.rb +221 -0
  61. data/spec/struct_spec.rb +12 -0
  62. data/spec/symbol_spec.rb +8 -0
  63. data/spec/time_spec.rb +29 -0
  64. data/spec/try_call_spec.rb +73 -0
  65. data/spec/try_dup_spec.rb +45 -0
  66. data/spec/virtual_file_spec.rb +21 -0
  67. data/tasks/ci.rake +1 -0
  68. data/tasks/metrics.rake +36 -0
  69. data/tasks/spec.rake +25 -0
  70. data/tasks/yard.rake +9 -0
  71. data/tasks/yardstick.rake +19 -0
  72. metadata +180 -0
@@ -0,0 +1,6 @@
1
+ --exclude "spec"
2
+ --sort coverage
3
+ --callsites
4
+ --xrefs
5
+ --profile
6
+ --text-summary
@@ -0,0 +1,57 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), 'spec_helper'))
2
+
3
+ describe Extlib::SimpleSet do
4
+
5
+ before do
6
+ @s = Extlib::SimpleSet.new("Initial")
7
+ end
8
+
9
+ describe "#initialize" do
10
+ it 'adds passed value to the set' do
11
+ @new_generation_vms = Extlib::SimpleSet.new(["Rubinius", "PyPy", "Parrot"])
12
+
13
+ @new_generation_vms.should have_key("Rubinius")
14
+ @new_generation_vms.should have_key("PyPy")
15
+ @new_generation_vms.should have_key("Parrot")
16
+ end
17
+ end
18
+
19
+ describe "#<<" do
20
+ it "adds value to the set" do
21
+ @s << "Hello"
22
+ @s.to_a.should be_include("Hello")
23
+ end
24
+
25
+ it 'sets true mark on the key' do
26
+ @s << "Fun"
27
+ @s["Fun"].should be_true
28
+ end
29
+ end
30
+
31
+ describe "#merge(other)" do
32
+ it "preserves old values when values do not overlap" do
33
+ @s.should have_key("Initial")
34
+ end
35
+
36
+ it 'adds new values from merged set' do
37
+ @t = @s.merge(["Merged value"])
38
+ @t.should have_key("Merged value")
39
+ end
40
+
41
+ it 'returns a SimpleSet instance' do
42
+ @s.merge(["Merged value"]).should be_kind_of(Extlib::SimpleSet)
43
+ end
44
+ end
45
+
46
+ describe "#inspect" do
47
+ it "lists set values" do
48
+ @s.inspect.should == "#<SimpleSet: {\"Initial\"}>"
49
+ end
50
+ end
51
+
52
+ describe "#keys" do
53
+ it 'is aliased as to_a' do
54
+ @s.to_a.should === @s.keys
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,4 @@
1
+ --colour
2
+ --loadby random
3
+ --format profile
4
+ --backtrace
@@ -0,0 +1,10 @@
1
+ $TESTING=true
2
+ require "rubygems"
3
+ require "spec"
4
+ require "yaml"
5
+
6
+ dir = File.dirname(__FILE__)
7
+ lib_path = File.expand_path("#{dir}/../lib")
8
+ $LOAD_PATH.unshift lib_path unless $LOAD_PATH.include?(lib_path)
9
+
10
+ require 'extlib'
@@ -0,0 +1,221 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), 'spec_helper'))
2
+
3
+ describe String, "#to_const_string" do
4
+ it "swaps slashes with ::" do
5
+ "foo/bar".to_const_string.should == "Foo::Bar"
6
+ end
7
+
8
+ it "replaces snake_case with CamelCase" do
9
+ "foo/bar/baz_bat".to_const_string.should == "Foo::Bar::BazBat"
10
+ end
11
+
12
+ it "leaves constant string as is" do
13
+ "Merb::Test".to_const_string.should == "Merb::Test"
14
+ end
15
+ end
16
+
17
+
18
+
19
+ describe String, "#to_const_path" do
20
+ it "swaps :: with slash" do
21
+ "Foo::Bar".to_const_path.should == "foo/bar"
22
+ end
23
+
24
+ it "snake_cases string" do
25
+ "Merb::Test::ViewHelper".to_const_path.should == "merb/test/view_helper"
26
+ end
27
+
28
+ it "leaves slash-separated snake case string as is" do
29
+ "merb/test/view_helper".to_const_path.should == "merb/test/view_helper"
30
+ end
31
+ end
32
+
33
+
34
+
35
+ describe String, "#camel_case" do
36
+ it "handles lowercase without underscore" do
37
+ "merb".camel_case.should == "Merb"
38
+ end
39
+
40
+ it "handles lowercase with 1 underscore" do
41
+ "merb_core".camel_case.should == "MerbCore"
42
+ end
43
+
44
+ it "handles lowercase with more than 1 underscore" do
45
+ "so_you_want_contribute_to_merb_core".camel_case.should == "SoYouWantContributeToMerbCore"
46
+ end
47
+
48
+ it "handles lowercase with more than 1 underscore in a row" do
49
+ "__python__is__like__this".camel_case.should == "PythonIsLikeThis"
50
+ end
51
+
52
+ it "handle first capital letter with underscores" do
53
+ "Python__Is__Like__This".camel_case.should == "PythonIsLikeThis"
54
+ end
55
+
56
+ it "leaves CamelCase as is" do
57
+ "TestController".camel_case.should == "TestController"
58
+ end
59
+ end
60
+
61
+
62
+
63
+ describe String, "#snake_case" do
64
+ it "lowercases one word CamelCase" do
65
+ "Merb".snake_case.should == "merb"
66
+ end
67
+
68
+ it "makes one underscore snake_case two word CamelCase" do
69
+ "MerbCore".snake_case.should == "merb_core"
70
+ end
71
+
72
+ it "handles CamelCase with more than 2 words" do
73
+ "SoYouWantContributeToMerbCore".snake_case.should == "so_you_want_contribute_to_merb_core"
74
+ end
75
+
76
+ it "handles CamelCase with more than 2 capital letter in a row" do
77
+ "CNN".snake_case.should == "cnn"
78
+ "CNNNews".snake_case.should == "cnn_news"
79
+ "HeadlineCNNNews".snake_case.should == "headline_cnn_news"
80
+ "NameACRONYM".snake_case.should == "name_acronym"
81
+ end
82
+
83
+ it "does NOT change one word lowercase" do
84
+ "merb".snake_case.should == "merb"
85
+ end
86
+
87
+ it "leaves snake_case as is" do
88
+ "merb_core".snake_case.should == "merb_core"
89
+ end
90
+ end
91
+
92
+
93
+
94
+ describe String, "#escape_regexp" do
95
+ it "escapes all * in a string" do
96
+ "*and*".escape_regexp.should == "\\*and\\*"
97
+ end
98
+
99
+ it "escapes all ? in a string" do
100
+ "?and?".escape_regexp.should == "\\?and\\?"
101
+ end
102
+
103
+ it "escapes all { in a string" do
104
+ "{and{".escape_regexp.should == "\\{and\\{"
105
+ end
106
+
107
+ it "escapes all } in a string" do
108
+ "}and}".escape_regexp.should == "\\}and\\}"
109
+ end
110
+
111
+ it "escapes all . in a string" do
112
+ ".and.".escape_regexp.should == "\\.and\\."
113
+ end
114
+
115
+ it "escapes all regexp special characters used in a string" do
116
+ "*?{}.".escape_regexp.should == "\\*\\?\\{\\}\\."
117
+ end
118
+ end
119
+
120
+
121
+
122
+ describe String, "#unescape_regexp" do
123
+ it "unescapes all \\* in a string" do
124
+ "\\*and\\*".unescape_regexp.should == "*and*"
125
+ end
126
+
127
+ it "unescapes all \\? in a string" do
128
+ "\\?and\\?".unescape_regexp.should == "?and?"
129
+ end
130
+
131
+ it "unescapes all \\{ in a string" do
132
+ "\\{and\\{".unescape_regexp.should == "{and{"
133
+ end
134
+
135
+ it "unescapes all \\} in a string" do
136
+ "\\}and\\}".unescape_regexp.should == "}and}"
137
+ end
138
+
139
+ it "unescapes all \\. in a string" do
140
+ "\\.and\\.".unescape_regexp.should == ".and."
141
+ end
142
+
143
+ it "unescapes all regexp special characters used in a string" do
144
+ "\\*\\?\\{\\}\\.".unescape_regexp.should == "*?{}."
145
+ end
146
+ end
147
+
148
+
149
+
150
+ describe String, "#/" do
151
+ it "concanates operands with File::SEPARATOR" do
152
+ ("merb" / "core").should == "merb#{File::SEPARATOR}core"
153
+ end
154
+ end
155
+
156
+
157
+ require 'rbconfig'
158
+ describe String, "#relative_path_from" do
159
+ it "uses other operand as base for path calculation" do
160
+ site_dir = Config::CONFIG["sitedir"]
161
+
162
+ two_levels_up = site_dir.split(File::SEPARATOR)
163
+ 2.times { two_levels_up.pop } # remove two deepest directories
164
+ two_levels_up = two_levels_up.join(File::SEPARATOR)
165
+
166
+ two_levels_up.relative_path_from(site_dir).should == "../.."
167
+ end
168
+ end
169
+
170
+
171
+ describe String, ".translate" do
172
+ before(:each) do
173
+ String.stub!(:translations).and_return({ "on snakes and rubies" => "a serpenti e rubini" })
174
+ end
175
+
176
+ it 'looks up for translation in translations dictionary' do
177
+ String.translate("on snakes and rubies").should == "a serpenti e rubini"
178
+ end
179
+
180
+ it 'returns string that has no translations as it is' do
181
+ String.translate("shapes").should == "shapes"
182
+ String.translate("kalopsia").should == "kalopsia"
183
+ String.translate("holding on to nothing").should == "holding on to nothing"
184
+ end
185
+ end
186
+
187
+ describe String, ".t" do
188
+ before(:each) do
189
+ String.stub!(:translations).and_return({ '%s must not be blank' => "%s moet ingevuld worden",
190
+ 'username' => 'gebruikersnaam',
191
+ '%s must be between %s and %s characters long' => '%s moet tussen %s en %s tekens lang zijn'})
192
+ end
193
+
194
+ it 'looks up for translation in translations dictionary and translates parameters as well' do
195
+ "%s must not be blank".t(:username).should == "gebruikersnaam moet ingevuld worden"
196
+ "%s must not be blank".t('username').should == "gebruikersnaam moet ingevuld worden"
197
+ "%s must be between %s and %s characters long".t(:password, 5, 9).should == "password moet tussen 5 en 9 tekens lang zijn"
198
+ end
199
+
200
+ it 'returns string that has no translations as it is' do
201
+ "password".t.should == "password"
202
+ end
203
+
204
+ it 'should not translate when freezed' do
205
+ "%s must not be blank".t('username'.freeze).should == "username moet ingevuld worden"
206
+ end
207
+ end
208
+
209
+ describe String, ".translations" do
210
+ before(:each) do
211
+
212
+ end
213
+
214
+ it 'returns empty hash by default' do
215
+ String.translations.should == {}
216
+ end
217
+
218
+ it 'returns @translations if set' do
219
+ pending "is it @translations on metaclass or @@translations? leaving it out for now"
220
+ end
221
+ end
@@ -0,0 +1,12 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), 'spec_helper'))
2
+
3
+ describe Struct do
4
+
5
+ it "should have attributes" do
6
+
7
+ s = Struct.new(:name).new('bob')
8
+ s.attributes.should == { :name => 'bob' }
9
+
10
+ end
11
+
12
+ end
@@ -0,0 +1,8 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), 'spec_helper'))
2
+
3
+ describe Symbol, "#/" do
4
+ it "concanates operands with File::SEPARATOR" do
5
+ (:merb / "core").should == "merb#{File::SEPARATOR}core"
6
+ (:merb / :core).should == "merb#{File::SEPARATOR}core"
7
+ end
8
+ end
@@ -0,0 +1,29 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), 'spec_helper'))
2
+ require 'json'
3
+
4
+ describe Time, "#to_json" do
5
+
6
+ before do
7
+ @expected = "\"2008-03-28T22:54:20Z\""
8
+ end
9
+
10
+ it "should transform itself into a ISO 8601 compatible string" do
11
+ Time.utc(2008, 3, 28, 22, 54, 20).to_json.should == @expected
12
+ Time.xmlschema("2008-03-28T22:54:20Z").to_json.should == @expected
13
+ Time.xmlschema("2008-03-28T17:54:20-05:00").to_json.should == @expected
14
+ end
15
+ end
16
+
17
+ describe Time, "#to_time" do
18
+ it "should return a copy of its self" do
19
+ time = Time.now
20
+ time.to_time.should == time
21
+ end
22
+ end
23
+
24
+ describe Time, "#to_datetime" do
25
+ it "should return an equivalent DateTime" do
26
+ time = Time.now
27
+ time.to_datetime.should == DateTime.parse(time.to_s)
28
+ end
29
+ end
@@ -0,0 +1,73 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), 'spec_helper'))
2
+
3
+ describe "#try_call" do
4
+ describe "with an Object" do
5
+ before :all do
6
+ @receiver = Object.new
7
+ end
8
+
9
+ it "returns receiver itself" do
10
+ @receiver.try_call.should == @receiver
11
+ end
12
+ end
13
+
14
+ describe "with a number" do
15
+ before :all do
16
+ @receiver = 42
17
+ end
18
+
19
+ it "returns receiver itself" do
20
+ @receiver.try_call.should == @receiver
21
+ end
22
+ end
23
+
24
+ describe "with a String" do
25
+ before :all do
26
+ @receiver = "Ruby, programmer's best friend"
27
+ end
28
+
29
+ it "returns receiver itself" do
30
+ @receiver.try_call.should == @receiver
31
+ end
32
+ end
33
+
34
+ describe "with a hash" do
35
+ before :all do
36
+ @receiver = { :functional_programming => "FTW" }
37
+ end
38
+
39
+ it "returns receiver itself" do
40
+ @receiver.try_call.should == @receiver
41
+ end
42
+ end
43
+
44
+ describe "with a Proc" do
45
+ before :all do
46
+ @receiver = Proc.new { 5 * 7 }
47
+ end
48
+
49
+ it "returns result of calling of a proc" do
50
+ @receiver.try_call.should == 35
51
+ end
52
+ end
53
+
54
+ describe "with a Proc that takes 2 arguments" do
55
+ before :all do
56
+ @receiver = Proc.new { |one, other| one + other }
57
+ end
58
+
59
+ it "passes arguments to #call, returns result of calling of a proc" do
60
+ @receiver.try_call(10, 20).should == 30
61
+ end
62
+ end
63
+
64
+ describe "with a Proc that takes 3 arguments" do
65
+ before :all do
66
+ @receiver = Proc.new { |a, b, c| (a + b) * c }
67
+ end
68
+
69
+ it "passes arguments to #call, returns result of calling of a proc" do
70
+ @receiver.try_call(10, 20, 3).should == 90
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,45 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), 'spec_helper'))
2
+
3
+ describe "try_dup" do
4
+ it "returns a duplicate version on regular objects" do
5
+ obj = Object.new
6
+ oth = obj.try_dup
7
+ obj.should_not === oth
8
+ end
9
+
10
+ it "returns self on Numerics" do
11
+ obj = 12
12
+ oth = obj.try_dup
13
+ obj.should === oth
14
+ end
15
+
16
+ it "returns self on Symbols" do
17
+ obj = :test
18
+ oth = obj.try_dup
19
+ obj.should === oth
20
+ end
21
+
22
+ it "returns self on true" do
23
+ obj = true
24
+ oth = obj.try_dup
25
+ obj.should === oth
26
+ end
27
+
28
+ it "returns self on false" do
29
+ obj = false
30
+ oth = obj.try_dup
31
+ obj.should === oth
32
+ end
33
+
34
+ it "returns self on nil" do
35
+ obj = nil
36
+ oth = obj.try_dup
37
+ obj.should === oth
38
+ end
39
+
40
+ it "returns self on modules" do
41
+ obj = Extlib
42
+ oth = obj.try_dup
43
+ obj.object_id.should == oth.object_id
44
+ end
45
+ end