webget_ruby_ramp 1.7.2 → 1.7.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data.tar.gz.sig CHANGED
Binary file
@@ -1,39 +1,21 @@
1
1
  =begin rdoc
2
2
 
3
- = WebGet Ruby Gem: Ramp is a toolkit of methods to ramp up your Ruby On Rails applications
3
+ = WebGet Ruby Gem: Ramp is a toolkit of Ruby base class extensions
4
4
 
5
5
  Author:: Joel Parker Henderson, joelparkerhenderson@gmail.com
6
6
  Copyright:: Copyright (c) 2006-2010 Joel Parker Henderson
7
7
  License:: CreativeCommons License, Non-commercial Share Alike
8
8
  License:: LGPL, GNU Lesser General Public License
9
9
 
10
- Ramp is a library of extensions to Ruby and Rails base classes, including ActiveRecord, Array, Date, Enumerable, Hash, Kernel, Numeric, Object, Process, String, Time, and YAML.
10
+ Ramp is a library of extensions to Ruby base classes, including Array, Date, Enumerable, Hash, Kernel, Numeric, Object, Process, String, Time, and YAML.
11
11
 
12
12
  Testing:
13
13
  <ul>
14
14
  <li>Each has an associated test class, e.g., ArrayTest, DateTest, etc.
15
- <li>The easy way to run the tests: gem install ramp --test
16
- <li>Some of the ActiveRecord extensions use sqlite for testing. We don't install sqlite automatically because it requires some native extensions. If you need sqlite: gem install sqlite3-ruby
15
+ <li>The easy way to run the tests: gem install webget_ruby_ramp --test
17
16
  </ul>
18
17
 
19
18
 
20
- == ActiveRecord
21
-
22
- * create_or_update_by: create a record, or update a record if value passed matches a field (or fields) in the AR object; includes method_missing function to make code more readable.
23
- * seed: syntactic sugar alias for #create_or_update_by
24
-
25
-
26
- == ActiveRecord::ConnectionAdapters::SchemaStatements
27
-
28
- * add_column_and_index: database migration helper to add a table column and index at the same time.
29
- * remove_column_and_index: database migration helper to add a table column and index at the same time.
30
-
31
-
32
- == ActiveRecord::SaveExtensions
33
-
34
- * save_false_then_reload!: a transaction to save and reload a record, to help repair associations
35
-
36
-
37
19
  == Array
38
20
 
39
21
  * car, cdr: aka first, rest (see shifted)
@@ -205,7 +187,8 @@ Extensions that help debug Ruby programs.
205
187
 
206
188
  == Changes
207
189
 
208
- - 1.7.2 Genmcutter update
190
+ - 1.7.3 Refactor Rails classes to their own gem
191
+ - 1.7.2 Gemcutter update
209
192
  - 1.7.1.8 Add Enumerable#map_with_index
210
193
  - 1.7.1.6 Add ActiveRecord::SaveExtensions#save_false_then_reload!
211
194
  - 1.7.1.3 Add XML#strip_xxx
@@ -244,7 +227,7 @@ Extensions that help debug Ruby programs.
244
227
 
245
228
  =end
246
229
 
247
- %w{active_record active_record/save_extensions array csv date enumerable file hash integer io kernel math nil numeric object process string symbol time xml yaml}.map{|x|
230
+ %w{array csv date enumerable file hash integer io kernel math nil numeric object process string symbol time xml yaml}.map{|x|
248
231
  require File.dirname(__FILE__) + "/webget_ruby_ramp/#{x}.rb"
249
232
  }
250
233
 
@@ -34,14 +34,14 @@ class Array
34
34
  when 2
35
35
  prefix=fixes[0].to_s
36
36
  suffix=fixes[1].to_s
37
- return self.map{|s| prefix + s.to_s + suffix}.ruby_join()
37
+ return self.map{|item| prefix + item.to_s + suffix}.ruby_join()
38
38
  when 3
39
39
  infix =fixes[0].to_s
40
40
  prefix=fixes[1].to_s
41
41
  suffix=fixes[2].to_s
42
- return map{|s| prefix + s.to_s + suffix}.ruby_join(infix)
42
+ return self.map{|item| prefix + item.to_s + suffix}.ruby_join(infix)
43
43
  else
44
- raise "join(fixes[#{fixes.size}]"
44
+ raise ArgumentError, "join() takes 0-3 arguments; you gave #{fixes.size}]"
45
45
  end
46
46
  end
47
47
 
@@ -62,11 +62,14 @@ class Array
62
62
  # ==Examples
63
63
  # [1,2,3,4].rotate! => [2,3,4,1]
64
64
  # ['a','b','c'].rotate! => ['b','c','a']
65
+ # [].rotate! => []
65
66
  #
66
67
  # Return self
67
68
 
68
69
  def rotate!
69
- push item=shift
70
+ if size>0
71
+ push item=shift
72
+ end
70
73
  self
71
74
  end
72
75
 
@@ -109,6 +112,7 @@ class Array
109
112
  # This is identical to calling foo.zip(values).to_h
110
113
 
111
114
  def onto(values)
115
+ size==values.size or raise ArgumentError, "Array size #{size} must match values size #{size}"
112
116
  zip(values).to_h
113
117
  end
114
118
 
@@ -133,11 +137,13 @@ class Array
133
137
  # [1,2,3,4,5,6,7,8].slices(5) => [[1,2,3,4,5],[6,7,8]]
134
138
 
135
139
  def slices(slice_length)
140
+ (slice_length.is_a? Integer) or (raise ArgumentError, "slice_length must be an integer")
141
+ (slice_length > 0) or (raise ArgumentError, "slice_length must be > 0")
136
142
  arr=[]
137
- i=0
138
- while i<length
139
- arr.push self[i...(i+slice_length)]
140
- i+=slice_length
143
+ index=0
144
+ while index<length
145
+ arr.push self[index...(index+slice_length)]
146
+ index+=slice_length
141
147
  end
142
148
  return arr
143
149
  end
@@ -162,6 +168,8 @@ class Array
162
168
  # [1,2,3,4,5,6].divvy(4) => [[1,2],[3,4],[5,6]]
163
169
 
164
170
  def divvy(number_of_slices)
171
+ (number_of_slices.is_a? Integer) or (raise ArgumentError, "number_of_slices must be an integer")
172
+ (number_of_slices > 0) or (raise ArgumentError, "number_of_slices must be > 0")
165
173
  return slices((length.to_f/number_of_slices.to_f).ceil)
166
174
  end
167
175
 
@@ -177,22 +185,18 @@ class Array
177
185
  # In typical use, each item is an array.
178
186
  #
179
187
  # ==Example using Ruby Array pipe
180
- # a=[1,2,3]
181
- # b=[2,3,4]
182
- # a | b => [1,2,3,4]
183
- #
184
- # ==Example using union method
185
- # arr=[a,b]
186
- # => [1,2,3,4]
188
+ # arr=[[1,2,3,4],[3,4,5,6]]
189
+ # arr.union => [1,2,3,4,5,6]
187
190
  #
188
- # This is identical to
189
-
190
191
  # ==Examples with proc
191
192
  # arr.map(&:foo).union
192
193
  # => foos that are in any of the array items
194
+ #
195
+ # ==Example with nil
196
+ # [].union => []
193
197
 
194
198
  def union
195
- inject{|inj,item| inj | item.to_a }
199
+ inject{|inj,item| inj | item.to_a } || []
196
200
  end
197
201
 
198
202
 
@@ -200,16 +204,19 @@ class Array
200
204
  # In typical usage, each item is an array.
201
205
  #
202
206
  # ==Examples
203
- # arr=[[1,2,3,4],[2,3,4,5],[3,4,5,6]]
207
+ # arr=[[1,2,3,4],[3,4,5,6]]
204
208
  # arr.intersect
205
209
  # => [3,4]
206
210
  #
207
211
  # ==Examples with proc
208
212
  # arr.map(&:foo).intersect
209
213
  # => foos that are in all of the array items
214
+ #
215
+ # ==Example with nil
216
+ # [].intersect => []
210
217
 
211
218
  def intersect
212
- inject{|inj,item| inj & item.to_a }
219
+ inject{|inj,item| inj & item.to_a } || []
213
220
  end
214
221
 
215
222
 
@@ -243,7 +250,9 @@ class Array
243
250
  #
244
251
 
245
252
  def shifted(number_of_items=1)
246
- slice(n,self.length-number_of_items)
253
+ (number_of_items.is_a? Integer) or (raise ArgumentError, "number_of_items must be an integer")
254
+ (number_of_items >= 0) or (raise ArgumentError, "number_of_items must be >= 0")
255
+ slice(number_of_items,self.length-number_of_items)
247
256
  end
248
257
 
249
258
  alias :car :first
@@ -266,8 +275,10 @@ class Array
266
275
  # If _n_ is greater than the array size, then return []
267
276
 
268
277
  def shifted!(number_of_items=1)
269
- slice!(0,number_of_items)
270
- return self
278
+ (number_of_items.is_a? Integer) or (raise ArgumentError, "number_of_items must be an integer")
279
+ (number_of_items >= 0) or (raise ArgumentError, "number_of_items must be >= 0")
280
+ slice!(0,number_of_items)
281
+ return self
271
282
  end
272
283
 
273
284
  alias :cdr! :shifted!
@@ -333,11 +344,17 @@ class Array
333
344
  #
334
345
  # [[1,2,3],[4,5,6]] => "1,2,3\n4,5,6\n"
335
346
  #
347
+ # ==Example of a blank array
348
+ #
349
+ # [].to_csv => ""
350
+ #
336
351
  # N.b. this method uses the multi-dimensional if the
337
352
  # array's first item is also an array.
338
353
 
339
354
  def to_csv(ops={})
340
355
 
356
+ return "" if size==0
357
+
341
358
  generator = RUBY_VERSION >= "1.9" ? CSV : CSV::Writer
342
359
 
343
360
  str=''
@@ -360,6 +377,10 @@ class Array
360
377
  # representation of a multi-dimensional array.
361
378
  #
362
379
  # Each subarray becomes one 'line' in the output.
380
+ #
381
+ # ==Example of a blank array
382
+ #
383
+ # [].to_csv => ""
363
384
 
364
385
  def to_tsv(ops={})
365
386
  self.map{|row| row.join("\t")+"\n"}.join
@@ -23,22 +23,22 @@ module Enumerable
23
23
  # array.to_h => {:a=>[:b, :c, :d]}
24
24
 
25
25
  def to_h
26
- h={}
26
+ hash={}
27
27
  dupe={}
28
- each{|k,v|
29
- if h.key? k
30
- if dupe.key? k
31
- h[k] << v
28
+ each{|key,val|
29
+ if hash.key? key
30
+ if dupe.key? key
31
+ hash[key] << val
32
32
  else
33
- h[k]=[h[k]]
34
- h[k] << v
35
- dupe[k]=true
33
+ hash[key]=[hash[key]]
34
+ hash[key] << val
35
+ dupe[key]=true
36
36
  end
37
37
  else
38
- h[k]=v
38
+ hash[key]=val
39
39
  end
40
40
  }
41
- return h
41
+ return hash
42
42
  end
43
43
 
44
44
 
@@ -64,8 +64,8 @@ module Enumerable
64
64
  #
65
65
  # ==Example
66
66
  # strings = ["red","blue","green"]
67
- # strings.hash_by{|a| [a.size, a.titlecase]}
68
- # => {3 => "red", 4 => "blue", 5 => "green"}
67
+ # strings.hash_by{|a| [a.size, a.upcase]}
68
+ # => {3 => "RED", 4 => "BLUE", 5 => "GREEN"}
69
69
  #
70
70
  # Compare #index_by
71
71
 
@@ -249,16 +249,16 @@ module Enumerable
249
249
  # true, the second contains the elements for which block is false or nil.
250
250
 
251
251
  def bisect
252
- a=[]
253
- b=[]
254
- each{|x|
255
- if yield(x)
256
- a << x
252
+ accept=[]
253
+ reject=[]
254
+ each{|item|
255
+ if yield(item)
256
+ accept << item
257
257
  else
258
- b << x
258
+ reject << item
259
259
  end
260
260
  }
261
- return a,b
261
+ return accept,reject
262
262
  end
263
263
 
264
264
 
@@ -127,11 +127,11 @@ class String
127
127
  # String.prev_char('0') => '9', true, true # change & carry
128
128
  # String.prev_char('-') => '-', false, false # unchanged
129
129
 
130
- def self.prev_char(c) #=> prev_char, changed_flag, carry_flag
131
- case c
130
+ def self.prev_char(chr) #=> prev_char, changed_flag, carry_flag
131
+ case chr
132
132
  when '1'..'9', 'B'..'Z', 'b'..'z'
133
- i=(c.respond_to?(:ord) ? c.ord : c[0])
134
- return (i-1).chr, true, false
133
+ pos=(chr.respond_to?(:ord) ? chr.ord : chr[0])
134
+ return (pos-1).chr, true, false
135
135
  when '0'
136
136
  return '9', true, true
137
137
  when 'A'
@@ -139,7 +139,7 @@ class String
139
139
  when 'a'
140
140
  return 'z', true, true
141
141
  else
142
- return c, false, false
142
+ return chr, false, false
143
143
  end
144
144
  end
145
145
 
@@ -165,7 +165,7 @@ class REXML::Document
165
165
  # cf. Element#remove_attributes
166
166
 
167
167
  def remove_attributes
168
- self.elements.each("//") { |e| e.attributes.each_attribute{|attribute| attribute.remove }}
168
+ self.elements.each("//") { |elem| elem.attributes.each_attribute{|attribute| attribute.remove }}
169
169
  self
170
170
  end
171
171
 
@@ -7,13 +7,16 @@ class ArrayTest < Test::Unit::TestCase
7
7
  def test_join
8
8
  a=['a','b','c']
9
9
  assert_equal('abc',a.join)
10
+ assert_equal('abc',a.join(''))
10
11
  assert_equal('a*b*c',a.join('*'))
11
12
  assert_equal('[a]*[b]*[c]',a.join('*','[',']'))
12
13
  assert_equal('[a][b][c]',a.join('[',']'))
14
+ assert_raise(ArgumentError){ a.join('','','','') }
13
15
  end
14
16
 
15
17
  def test_size
16
18
  assert_equal(false,[].size?)
19
+ assert_equal(true,[nil].size?)
17
20
  assert_equal(true,[1].size?)
18
21
  assert_equal(true,[1,2].size?)
19
22
  assert_equal(true,[[]].size?)
@@ -25,56 +28,75 @@ class ArrayTest < Test::Unit::TestCase
25
28
  assert_equal([2,3,4,1],a)
26
29
  a.rotate!
27
30
  assert_equal([3,4,1,2],a)
31
+ a.rotate!
32
+ a=[]
33
+ a.rotate!
34
+ assert_equal([],a)
28
35
  end
29
36
 
30
37
  def test_choice
31
38
  a=[1,2,3,4]
32
- c=a.choice
33
- assert_equal(Fixnum,c.class)
34
- assert(a.include?(c))
39
+ 5.times {
40
+ c=a.choice
41
+ assert_equal(Fixnum,c.class)
42
+ assert(a.include?(c))
43
+ }
35
44
  end
36
45
 
37
46
  def test_choices
38
47
  a=[1,2,3,4]
39
- c=a.choices(2)
40
- assert_equal(2,c.size)
41
- assert(a.include?(c[0]))
42
- assert(a.include?(c[1]))
43
- c=a.choices(3)
44
- assert_equal(3,c.size)
45
- assert(a.include?(c[0]))
46
- assert(a.include?(c[1]))
47
- assert(a.include?(c[2]))
48
+ 5.times {
49
+ c=a.choices(2)
50
+ assert_equal(2,c.size)
51
+ assert(a.include?(c[0]))
52
+ assert(a.include?(c[1]))
53
+ c=a.choices(3)
54
+ assert_equal(3,c.size)
55
+ assert(a.include?(c[0]))
56
+ assert(a.include?(c[1]))
57
+ assert(a.include?(c[2]))
58
+ }
48
59
  end
49
60
 
50
61
  def test_onto
51
62
  foo=[:a,:b,:c]
52
63
  goo=[:x,:y,:z]
53
64
  assert_equal({:a=>:x, :b=>:y, :c=>:z},foo.onto(goo))
65
+ assert_raise(ArgumentError){ foo.onto([]) }
54
66
  end
55
67
 
56
68
  def test_slices
57
- a=[1,2,3,4,5,6,7,8]
58
- assert_equal([[1,2],[3,4],[5,6],[7,8]],a.slices(2))
59
- assert_equal([[1,2,3,4],[5,6,7,8]], a.slices(4))
60
- assert_equal([[1,2,3],[4,5,6],[7,8]],a.slices(3))
61
- assert_equal([[1,2,3,4,5],[6,7,8]],a.slices(5))
69
+ a=[1,2,3,4,5,6,7,8]
70
+ assert_equal([[1,2],[3,4],[5,6],[7,8]],a.slices(2))
71
+ assert_equal([[1,2,3,4],[5,6,7,8]], a.slices(4))
72
+ assert_equal([[1,2,3],[4,5,6],[7,8]],a.slices(3))
73
+ assert_equal([[1,2,3,4,5],[6,7,8]],a.slices(5))
74
+ assert_equal([],[].slices(1))
75
+ assert_raise(ArgumentError){ a.slices(-1) }
76
+ assert_raise(ArgumentError){ a.slices("") }
77
+ assert_raise(ArgumentError){ a.slices(0.123) }
62
78
  end
63
79
 
64
- def test_divvy_evenly_divisible
80
+ def test_divvy
81
+ assert_equal([[1,2,3,4,5,6]],[1,2,3,4,5,6].divvy(1),'division into one slice')
65
82
  assert_equal([[1,2,3],[4,5]],[1,2,3,4,5].divvy(2),'division with equal slices')
66
83
  assert_equal([[1,2,3],[4,5,6],[7]],[1,2,3,4,5,6,7].divvy(3),'division with remainer slice')
67
84
  assert_equal([[1,2],[3,4],[5,6]],[1,2,3,4,5,6].divvy(4),'division with small numbers')
85
+ assert_raise(ArgumentError){ [].divvy(-1) }
86
+ assert_raise(ArgumentError){ [].divvy("") }
87
+ assert_raise(ArgumentError){ [].divvy(0.123) }
68
88
  end
69
89
 
70
90
  def test_union
71
- a=[[2,3,4],[4,5,6],[6,7,8]]
72
- assert_equal([2,3,4,5,6,7,8],a.union)
91
+ a=[[1,2,3,4],[2,3,4,5],[3,4,5,6]]
92
+ assert_equal([1,2,3,4,5,6],a.union)
93
+ assert_equal([],[].union)
73
94
  end
74
95
 
75
96
  def test_intersect
76
- a=[[2,3,4],[4,3,5],[3,4,7]]
97
+ a=[[1,2,3,4],[2,3,4,5],[3,4,5,6]]
77
98
  assert_equal([3,4],a.intersect)
99
+ assert_equal([],[].intersect)
78
100
  end
79
101
 
80
102
  def test_shifted
@@ -85,6 +107,9 @@ class ArrayTest < Test::Unit::TestCase
85
107
  assert_equal([ 'c'],a.shifted(2))
86
108
  assert_equal([ ],a.shifted(3))
87
109
  assert_equal(nil ,a.shifted(4))
110
+ assert_raise(ArgumentError){ a.shifted(-1) }
111
+ assert_raise(ArgumentError){ a.shifted("") }
112
+ assert_raise(ArgumentError){ a.shifted(0.123) }
88
113
  end
89
114
 
90
115
  # test_cdr must be idential to test_shifted
@@ -97,6 +122,9 @@ class ArrayTest < Test::Unit::TestCase
97
122
  assert_equal([ 'c'],a.cdr(2))
98
123
  assert_equal([ ],a.cdr(3))
99
124
  assert_equal(nil ,a.cdr(4))
125
+ assert_raise(ArgumentError){ a.cdr(-1) }
126
+ assert_raise(ArgumentError){ a.cdr("") }
127
+ assert_raise(ArgumentError){ a.cdr(0.123) }
100
128
  end
101
129
 
102
130
  # test_rest must be idential to test_shifted
@@ -109,6 +137,9 @@ class ArrayTest < Test::Unit::TestCase
109
137
  assert_equal([ 'c'],a.rest(2))
110
138
  assert_equal([ ],a.rest(3))
111
139
  assert_equal(nil ,a.rest(4))
140
+ assert_raise(ArgumentError){ a.rest(-1) }
141
+ assert_raise(ArgumentError){ a.rest("") }
142
+ assert_raise(ArgumentError){ a.rest(0.123) }
112
143
  end
113
144
 
114
145
  def test_shifted_bang
@@ -118,6 +149,10 @@ class ArrayTest < Test::Unit::TestCase
118
149
  a=['a','b','c']; a.shifted!(2); assert_equal([ 'c'],a)
119
150
  a=['a','b','c']; a.shifted!(3); assert_equal([ ],a)
120
151
  a=['a','b','c']; a.shifted!(4); assert_equal([ ],a)
152
+ a=[]
153
+ assert_raise(ArgumentError){ a.shifted!(-1) }
154
+ assert_raise(ArgumentError){ a.shifted!("") }
155
+ assert_raise(ArgumentError){ a.shifted!(0.123) }
121
156
  end
122
157
 
123
158
  # alias: test_cdr_bang must be identical to test_shifted_bang
@@ -128,6 +163,10 @@ class ArrayTest < Test::Unit::TestCase
128
163
  a=['a','b','c']; a.cdr!(2); assert_equal([ 'c'],a)
129
164
  a=['a','b','c']; a.cdr!(3); assert_equal([ ],a)
130
165
  a=['a','b','c']; a.cdr!(4); assert_equal([ ],a)
166
+ a=[]
167
+ assert_raise(ArgumentError){ a.cdr!(-1) }
168
+ assert_raise(ArgumentError){ a.cdr!("") }
169
+ assert_raise(ArgumentError){ a.cdr!(0.123) }
131
170
  end
132
171
 
133
172
  # alias: test_rest_band must be identical to test_shifted_bang
@@ -138,6 +177,10 @@ class ArrayTest < Test::Unit::TestCase
138
177
  a=['a','b','c']; a.rest!(2); assert_equal([ 'c'],a)
139
178
  a=['a','b','c']; a.rest!(3); assert_equal([ ],a)
140
179
  a=['a','b','c']; a.rest!(4); assert_equal([ ],a)
180
+ a=[]
181
+ assert_raise(ArgumentError){ a.rest!(-1) }
182
+ assert_raise(ArgumentError){ a.rest!("") }
183
+ assert_raise(ArgumentError){ a.rest!(0.123) }
141
184
  end
142
185
 
143
186
  def test_car
@@ -145,9 +188,29 @@ class ArrayTest < Test::Unit::TestCase
145
188
  assert_equal('a',a.car)
146
189
  end
147
190
 
191
+ def test_shuffle
192
+ a=[1,2,3,4]
193
+ 5.times {
194
+ b=a.shuffle
195
+ assert_equal(a.size,b.size)
196
+ a.each{|item| assert(b.include?(item)) }
197
+ }
198
+ end
199
+
200
+ def test_shuffle_bang
201
+ a=[1,2,3,4]
202
+ b=a.dup
203
+ 5.times {
204
+ b.shuffle!
205
+ assert_equal(a.size,b.size)
206
+ a.each{|item| assert(b.include?(item)) }
207
+ }
208
+ end
209
+
148
210
  def test_to_csv_one_dimensional
149
211
  a=["a","b","c"]
150
212
  assert_equal("a,b,c\n",a.to_csv)
213
+ assert_equal("",[].to_csv)
151
214
  end
152
215
 
153
216
  def test_to_csv_multi_dimensional
@@ -158,12 +221,14 @@ class ArrayTest < Test::Unit::TestCase
158
221
  def test_to_tsv
159
222
  a=[["a", "b"], ["c", "d"], ["e", "f"]]
160
223
  assert_equal("a\tb\nc\td\ne\tf\n",a.to_tsv)
224
+ assert_equal("",[].to_tsv)
161
225
  end
162
226
 
163
227
  # alias: test_to_tdf must be identical to test_to_tsv
164
228
  def test_to_tdf
165
229
  a=[["a", "b"], ["c", "d"], ["e", "f"]]
166
230
  assert_equal("a\tb\nc\td\ne\tf\n",a.to_tdf)
231
+ assert_equal("",[].to_tdf)
167
232
  end
168
233
 
169
234
  end
@@ -31,7 +31,7 @@ class EnumerableTest < Test::Unit::TestCase
31
31
  end
32
32
 
33
33
  def test_hash_by
34
- assert_equal({3=>"Red",4=>"Blue",5=>"Green"},RGB.hash_by{|x| [x.size,x.titlecase]})
34
+ assert_equal({3=>"RED",4=>"BLUE",5=>"GREEN"},RGB.hash_by{|x| [x.size,x.upcase]})
35
35
  end
36
36
 
37
37
 
@@ -15,15 +15,15 @@ class YAMLTest < Test::Unit::TestCase
15
15
  def test_load_dir
16
16
  dirpath=File.join(MYDIR,'yaml_test_*.yml')
17
17
  expect=[
18
- "a:a1,a10,a2,a20,a3,a30b:b1,b10,b2,b20,b3,b30c:c1,c10,c2,c20,c3,c30",
19
- "d:d1,d10,d2,d20,d3,d30e:e1,e10,e2,e20,e3,e30f:f1,f10,f2,f20,f3,f30",
20
- "g:g1,g10,g2,g20,g3,g30h:h1,h10,h2,h20,h3,h30i:i1,i10,i2,i20,i3,i30",
21
- "j:j1,j10,j2,j20,j3,j30k:k1,k10,k2,k20,k3,k30l:l1,l10,l2,l20,l3,l30",
22
- "m:m1,m10,m2,m20,m3,m30n:n1,n10,n2,n20,n3,n30o:o1,o10,o2,o20,o3,o30",
23
- "p:p1,p10,p2,p20,p3,p30q:q1,q10,q2,q20,q3,q30r:r1,r10,r2,r20,r3,r30",
18
+ "a:a1,a10,a2,a20,a3,a30;b:b1,b10,b2,b20,b3,b30;c:c1,c10,c2,c20,c3,c30",
19
+ "d:d1,d10,d2,d20,d3,d30;e:e1,e10,e2,e20,e3,e30;f:f1,f10,f2,f20,f3,f30",
20
+ "g:g1,g10,g2,g20,g3,g30;h:h1,h10,h2,h20,h3,h30;i:i1,i10,i2,i20,i3,i30",
21
+ "j:j1,j10,j2,j20,j3,j30;k:k1,k10,k2,k20,k3,k30;l:l1,l10,l2,l20,l3,l30",
22
+ "m:m1,m10,m2,m20,m3,m30;n:n1,n10,n2,n20,n3,n30;o:o1,o10,o2,o20,o3,o30",
23
+ "p:p1,p10,p2,p20,p3,p30;q:q1,q10,q2,q20,q3,q30;r:r1,r10,r2,r20,r3,r30",
24
24
  ]
25
25
  actual=[]
26
- YAML.load_dir(dirpath){|doc| actual << doc.keys.map{|k| v=doc[k]; "#{k}:#{v.sort.join(",")}" }.join("") }
26
+ YAML.load_dir(dirpath){|doc| actual << doc.keys.map{|k| v=doc[k]; "#{k}:#{v.sort.join(",")}" }.sort.join(";") }
27
27
  actual.sort!
28
28
  assert_equal(expect,actual,'YAML.load_dir')
29
29
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: webget_ruby_ramp
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.7.2
4
+ version: 1.7.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - WebGet
@@ -32,7 +32,7 @@ cert_chain:
32
32
  DXnLFY0cVuBnNDMOOFl8vk1qIcZjcTovhzgcixpG6Uk5qmUsKHRLQf4oQJx7TfLK
33
33
  -----END CERTIFICATE-----
34
34
 
35
- date: 2010-02-16 00:00:00 -08:00
35
+ date: 2010-02-17 00:00:00 -08:00
36
36
  default_executable:
37
37
  dependencies: []
38
38
 
@@ -46,9 +46,6 @@ extra_rdoc_files: []
46
46
 
47
47
  files:
48
48
  - lib/webget_ruby_ramp.rb
49
- - lib/webget_ruby_ramp/active_record.rb
50
- - lib/webget_ruby_ramp/active_record/connection_adapters/abstract/schema_statements.rb
51
- - lib/webget_ruby_ramp/active_record/save_extensions.rb
52
49
  - lib/webget_ruby_ramp/array.rb
53
50
  - lib/webget_ruby_ramp/csv.rb
54
51
  - lib/webget_ruby_ramp/date.rb
@@ -104,9 +101,6 @@ signing_key:
104
101
  specification_version: 3
105
102
  summary: "WebGet Ruby Gem: Ramp gem provides base extensions to ruby classes and rails classes."
106
103
  test_files:
107
- - test/webget_ruby_ramp/active_record_test.rb
108
- - test/webget_ruby_ramp/active_record/connection_adapters/abstract/schema_statements_test.rb
109
- - test/webget_ruby_ramp/active_record/save_extensions_test.rb
110
104
  - test/webget_ruby_ramp/array_test.rb
111
105
  - test/webget_ruby_ramp/csv_test.rb
112
106
  - test/webget_ruby_ramp/date_test.rb
metadata.gz.sig CHANGED
@@ -1 +1 @@
1
- ,�Xk��ai���a\�tbH�=� �{�_�*O���f8�.���,&�m��?]��9��=�]���<cӨS���a ��[��p��^"�$y�����` �Ű��{�|�3�����NBB��=�
1
+ ���z(���1����_9�oDE%*H�TZ��M��f�I��GK�.*�?_���@����_t��G���!�6�g���� �0H8�ț��I�6��ڢ�y`��߮���Bi���d2)s!�|��/2
@@ -1,119 +0,0 @@
1
- require 'activerecord'
2
- require 'active_record'
3
-
4
- #:startdoc:
5
- # ActiveRecord extensions
6
-
7
- module ActiveRecord #:doc:
8
-
9
- class Base #:doc:
10
-
11
- # Create a record, or update a record if value passed matches a field in the AR object;
12
- # includes method_missing function to make code more readable
13
- #
14
- # Most common use will be for testing (fixture/mock object generation)
15
- #
16
- # Three versions of method included:
17
- # create_or_update
18
- # create_or_update_by
19
- # create_or_update_by_xxx (where xxx is a field name)
20
- #
21
- # Inspired by http://www.intridea.com/2008/2/19/activerecord-base-create_or_update-on-steroids-2
22
- #
23
- # ==Example
24
- # { "admin" => ["Administrator", 1000],
25
- # "member" => ["Member", 1],
26
- # "moderator" => ["Moderator", 100],
27
- # "disabled" => ["Disabled User", -1] }.each_pair do |key, val|
28
- # Role.create_or_update_by_key(:key => key, :name => val[0], :value => val[1])
29
- # end
30
-
31
- def self.create_or_update(options = {})
32
- self.create_or_update_by(:id, options)
33
- end
34
-
35
-
36
- # Create or update a record by field (or fields).
37
- # This will look for each field name as a key in the options hash.
38
- #
39
- # ==Example
40
- # attributes={:name="John Smith", :email=>"john@example.com", :birthdate=>'1980/01/01'}
41
- # User.create_or_update_by(:email,attributes)
42
- # => if a user with that email exists then update his name and birthdate, else create him
43
- #
44
- # ==Example with multiple conditions
45
- # attributes={:name="John Smith", :email=>"john@example.com", :birthdate=>'1980/01/01'}
46
- # User.create_or_update_by([:name,:birthdate],attributes)
47
- # => if a user with that name and birthdate exists then update his email, else create him
48
- #
49
- # The fields can be any mix of symbols or strings.
50
- # The option keys can be any mix of symbols or strings.
51
-
52
- def self.create_or_update_by(condition_keys, attribute_pairs = {})
53
- condition_pairs=[*condition_keys].map{|key| [key,(attribute_pairs.delete(key)||attribute_pairs.delete(key.to_s)||attribute_pairs.delete(key.to_sym))]}.to_h
54
- record = find(:first, :conditions => condition_pairs) || self.new
55
- if record.new_record? then attribute_pairs.merge!(condition_pairs) end
56
- attribute_pairs.each_pair{|key,val| record.send key.to_s+'=', val}
57
- record.save!
58
- return record
59
- end
60
-
61
-
62
- # Set up a database with initial data, e.g. in rake db:seed method.
63
- #
64
- # This will look for each field name as a key in the options hash.
65
- #
66
- # This method calls #create_or_update_by (and you may want to change
67
- # this behavior to do more, e.g. to test that a DB and table exists).
68
- #
69
- # ==Example
70
- # attributes={:name="John Smith", :email=>"john@example.com", :birthdate=>'1980/01/01'}
71
- # User.create_or_update_by(:email,attributes)
72
- # => if a user with that email exists then update his name and birthdate, else create him
73
- #
74
- # ==Example with multiple conditions
75
- # attributes={:name="John Smith", :email=>"john@example.com", :birthdate=>'1980/01/01'}
76
- # User.create_or_update_by([:name,:birthdate],attributes)
77
- # => if a user with that name and birthdate exists then update his email, else create him
78
- #
79
- # The fields can be any mix of symbols or strings.
80
- # The option keys can be any mix of symbols or strings.
81
-
82
- def self.seed(condition_keys, attribute_pairs = {})
83
- self.create_or_update_by(condition_keys, attribute_pairs)
84
- end
85
-
86
-
87
- # Method missing for create_or_update_by_xxx that forwards to #create_or_update_by
88
- #
89
- # ==Example
90
- # MyModel.create_or_update_by_foo(options)
91
- # => MyModel.create_or_update_by(:foo,option)
92
-
93
- def self.method_missing_with_create_or_update(method_name, *args)
94
- if match = method_name.to_s.match(/create_or_update_by_([a-z0-9_]+)/)
95
- field = match[1]
96
- return create_or_update_by(field,*args)
97
- end
98
- return method_missing_without_create_or_update(method_name, *args)
99
- end
100
-
101
-
102
- # For alias method chain
103
- def self.included(base)
104
- # base == ActiveRecord::Base (the class)
105
- base.class_eval do
106
- # class_eval makes self == ActiveRecord::Base, and makes def define instance methods.
107
- extend ClassMethods
108
- # If has_many were an instance method, we could do this
109
- # alias_method_chain :has_many, :association_option; end
110
- # but it's a class method, so we have to do the alias_method_chain on
111
- # the meta-class for ActiveRecord::Base, which is what class << self does.
112
- class << self; alias_method_chain :method_missing, :create_or_update; end
113
- end
114
- end
115
-
116
-
117
- end
118
-
119
- end
@@ -1,24 +0,0 @@
1
- module ActiveRecord
2
- module ConnectionAdapters
3
- module SchemaStatements
4
-
5
- # Add a column and its index.
6
- # This just calls #add_column then #add_index
7
-
8
- def add_column_and_index(table_name, column_name, type, options = {})
9
- add_column(table_name, column_name, type, options)
10
- add_index(table_name, column_name, type, options)
11
- end
12
-
13
-
14
- # Remove a column and its index in one step.
15
- # This just calls #remove_column then #remove_index.
16
-
17
- def remove_column_and_index(table_name, column_name, type, options = {})
18
- remove_column(table_name, column_name, type, options)
19
- remove_index(table_name, column_name, type, options)
20
- end
21
-
22
- end
23
- end
24
- end
@@ -1,35 +0,0 @@
1
- module ActiveRecord::SaveExtensions
2
-
3
- # Save the record without validation, then reload it.
4
- # If the record is valid then return true, otherwise raise RecordInvalid.
5
- # This solves an issue we found with Rails associations not saving.
6
- #
7
- # By Andrew Carpenter (acarpen@wested.org)
8
- #
9
- # Deprecated, superceded by #save_redux!
10
-
11
- def save_false_then_reload!
12
- transaction do
13
- save(false)
14
- reload
15
- valid? or raise ActiveRecord::RecordInvalid.new(self)
16
- end
17
- return true
18
- end
19
-
20
-
21
- # Save the record without validation, then reload, then save with validtion.
22
- # This ensure that rails brings back the correct associations to validate.
23
- # This solves an issue we found with Rails associations not saving.
24
-
25
- def save_redux!
26
- transaction do
27
- save(false)
28
- reload
29
- save!
30
- end
31
- return true
32
- end
33
-
34
- end
35
- ActiveRecord::Base.send(:include, ActiveRecord::SaveExtensions)
@@ -1,9 +0,0 @@
1
- require 'test/unit'
2
- require 'webget_ruby_ramp'
3
-
4
- class SchemaStatementsTest < Test::Unit::TestCase
5
-
6
- def test_placeholder
7
- end
8
-
9
- end
@@ -1,7 +0,0 @@
1
- require 'test/unit'
2
- require 'webget_ruby_ramp'
3
- require 'active_record'
4
-
5
- class SaveExtensionsText < Test::Unit::TestCase
6
- end
7
-
@@ -1,64 +0,0 @@
1
- require 'test/unit'
2
- require 'webget_ruby_ramp'
3
- require 'active_record'
4
-
5
- begin
6
- require 'sqlite3'
7
- rescue
8
- # noop because sqlite may already be available,
9
- # e.g. in JRuby on Ubuntu you can install it:
10
- # apt-get install libsqlite3-ruby
11
- end
12
-
13
- begin
14
- ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:")
15
- rescue
16
- raise ""+
17
- "ActiveRecord cannot establish connection to sqlite3 database memory.\n" +
18
- "Please verify that you have the sqlite3 database installed for testing.\n" +
19
- "To install it for Ruby typically do: sudo gem install sqlite3-ruby\n" +
20
- "To install it for JRuby + Ubuntu do: sudo apt-get install libsqlite3-ruby"
21
- end
22
-
23
- ActiveRecord::Schema.define(:version => 1) do
24
- create_table :foos do |t|
25
- t.string :a
26
- t.string :b
27
- t.string :c
28
- end
29
- end
30
-
31
- class Foo < ActiveRecord::Base
32
- end
33
-
34
- class ActiveRecordTest < Test::Unit::TestCase
35
-
36
- def test_prelim_count
37
- assert_equal(0,Foo.count)
38
- end
39
-
40
- def test_prelim_create
41
- f=Foo.new
42
- f.a='aa'
43
- f.b='bb'
44
- f.c='cc'
45
- f.save
46
- assert_equal(1,Foo.count)
47
- end
48
-
49
- def test_seed_with_create
50
- n1=Foo.count
51
- Foo.seed(:a,{:a=>'xxx',:b=>'yyy'})
52
- n2=Foo.count
53
- assert_equal(n1+1,n2)
54
- end
55
-
56
- def test_seed_with_update
57
- n1=Foo.count
58
- f1=Foo.find(:first)
59
- Foo.seed(:a,{:a=>f1.a,:b=>'bbb'})
60
- n2=Foo.count
61
- assert_equal(n1,n2)
62
- end
63
-
64
- end