webget_ruby_ramp 1.7.2 → 1.7.3

Sign up to get free protection for your applications and to get access to all the features.
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