multiarray 0.17.0 → 0.18.0
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/Rakefile +2 -3
- data/lib/multiarray.rb +0 -28
- data/lib/multiarray/complex.rb +12 -0
- data/lib/multiarray/lambda.rb +1 -1
- data/lib/multiarray/operations.rb +38 -11
- data/lib/multiarray/rgb.rb +76 -10
- data/test/tc_multiarray.rb +10 -8
- data/test/tc_sequence.rb +13 -9
- metadata +3 -3
data/Rakefile
CHANGED
@@ -6,7 +6,7 @@ require 'rake/packagetask'
|
|
6
6
|
require 'rbconfig'
|
7
7
|
|
8
8
|
PKG_NAME = 'multiarray'
|
9
|
-
PKG_VERSION = '0.
|
9
|
+
PKG_VERSION = '0.18.0'
|
10
10
|
RB_FILES = FileList[ 'lib/**/*.rb' ]
|
11
11
|
TC_FILES = FileList[ 'test/tc_*.rb' ]
|
12
12
|
TS_FILES = FileList[ 'test/ts_*.rb' ]
|
@@ -55,8 +55,7 @@ begin
|
|
55
55
|
# For development just run it with "yard server --reload".
|
56
56
|
require 'yard'
|
57
57
|
YARD::Rake::YardocTask.new :yard do |y|
|
58
|
-
y.
|
59
|
-
y.files << FileList[ 'lib/**/*.rb' ]
|
58
|
+
y.files << RB_FILES
|
60
59
|
end
|
61
60
|
rescue LoadError
|
62
61
|
STDERR.puts 'Please install \'yard\' if you want to generate documentation'
|
data/lib/multiarray.rb
CHANGED
@@ -552,34 +552,6 @@ end
|
|
552
552
|
# The +Numeric+ class is extended with a few methods
|
553
553
|
class Numeric
|
554
554
|
|
555
|
-
# Compute complex conjugate
|
556
|
-
#
|
557
|
-
# @return [Numeric] Returns +self+.
|
558
|
-
def conj
|
559
|
-
self
|
560
|
-
end
|
561
|
-
|
562
|
-
# Get red component
|
563
|
-
#
|
564
|
-
# @return [Numeric] Returns +self+.
|
565
|
-
def r
|
566
|
-
self
|
567
|
-
end
|
568
|
-
|
569
|
-
# Get green component
|
570
|
-
#
|
571
|
-
# @return [Numeric] Returns +self+.
|
572
|
-
def g
|
573
|
-
self
|
574
|
-
end
|
575
|
-
|
576
|
-
# Get blue component
|
577
|
-
#
|
578
|
-
# @return [Numeric] Returns +self+.
|
579
|
-
def b
|
580
|
-
self
|
581
|
-
end
|
582
|
-
|
583
555
|
# Get larger number of two numbers
|
584
556
|
#
|
585
557
|
# @param [Numeric] other The other number.
|
data/lib/multiarray/complex.rb
CHANGED
@@ -673,6 +673,18 @@ module Math
|
|
673
673
|
|
674
674
|
end
|
675
675
|
|
676
|
+
# The +Numeric+ class is extended with a few methods
|
677
|
+
class Numeric
|
678
|
+
|
679
|
+
# Compute complex conjugate
|
680
|
+
#
|
681
|
+
# @return [Numeric] Returns +self+.
|
682
|
+
def conj
|
683
|
+
self
|
684
|
+
end
|
685
|
+
|
686
|
+
end
|
687
|
+
|
676
688
|
module Hornetseye
|
677
689
|
|
678
690
|
# Class for representing native complex values
|
data/lib/multiarray/lambda.rb
CHANGED
@@ -322,6 +322,9 @@ module Hornetseye
|
|
322
322
|
value = element( index ).inject nil, :block => block,
|
323
323
|
:var1 => var1, :var2 => var2
|
324
324
|
value = typecode.new value unless value.is_a? Node
|
325
|
+
if initial.nil? and index.size.get == 0
|
326
|
+
raise "Array was empty and no initial value for injection was given"
|
327
|
+
end
|
325
328
|
Inject.new( value, index, initial, block, var1, var2 ).force
|
326
329
|
end
|
327
330
|
end
|
@@ -349,16 +352,20 @@ module Hornetseye
|
|
349
352
|
|
350
353
|
# Find minimum value of array
|
351
354
|
#
|
355
|
+
# @param [Object] initial Only consider values less than this value.
|
356
|
+
#
|
352
357
|
# @return [Object] Minimum value of array.
|
353
|
-
def min
|
354
|
-
inject { |a,b| a.minor b }
|
358
|
+
def min( initial = nil )
|
359
|
+
inject( initial ) { |a,b| a.minor b }
|
355
360
|
end
|
356
361
|
|
357
362
|
# Find maximum value of array
|
358
363
|
#
|
364
|
+
# @param [Object] initial Only consider values greater than this value.
|
365
|
+
#
|
359
366
|
# @return [Object] Maximum value of array.
|
360
|
-
def max
|
361
|
-
inject { |a,b| a.major b }
|
367
|
+
def max( initial = nil )
|
368
|
+
inject( initial ) { |a,b| a.major b }
|
362
369
|
end
|
363
370
|
|
364
371
|
# Compute sum of array
|
@@ -371,8 +378,8 @@ module Hornetseye
|
|
371
378
|
# Find range of values of array
|
372
379
|
#
|
373
380
|
# @return [Object] Range of values of array.
|
374
|
-
def range
|
375
|
-
min .. max
|
381
|
+
def range( initial = nil )
|
382
|
+
min( initial ? initial.min : nil ) .. max( initial ? initial.max : nil )
|
376
383
|
end
|
377
384
|
|
378
385
|
# Normalise values of array
|
@@ -504,7 +511,11 @@ module Hornetseye
|
|
504
511
|
# @return [Node] The histogram.
|
505
512
|
def histogram( *ret_shape )
|
506
513
|
options = ret_shape.last.is_a?( Hash ) ? ret_shape.pop : {}
|
507
|
-
options = { :weight => UINT.new( 1 ), :safe => true }.merge options
|
514
|
+
options = { :weight => UINT. new( 1 ), :safe => true }.merge options
|
515
|
+
unless options[ :weight ].is_a? Node
|
516
|
+
options[ :weight ] =
|
517
|
+
Node.match( options[ :weight ] ).maxint.new options[ :weight ]
|
518
|
+
end
|
508
519
|
if shape.first != 1 and ret_shape.size == 1
|
509
520
|
[ self ].histogram *( ret_shape + [ options ] )
|
510
521
|
else
|
@@ -638,6 +649,11 @@ module Hornetseye
|
|
638
649
|
warp *( field + [ :safe => false ] )
|
639
650
|
end
|
640
651
|
|
652
|
+
# Create array with shifted elements
|
653
|
+
#
|
654
|
+
# @param [Array<Integer>] offset Array with amount of shift for each dimension.
|
655
|
+
#
|
656
|
+
# @return [Node] The result of the shifting operation.
|
641
657
|
def shift( *offset )
|
642
658
|
if offset.size != dimension
|
643
659
|
raise "#{offset.size} offset(s) were given but array has " +
|
@@ -673,6 +689,13 @@ module Hornetseye
|
|
673
689
|
retval
|
674
690
|
end
|
675
691
|
|
692
|
+
# Downsampling of arrays
|
693
|
+
#
|
694
|
+
# @overload downsample( *rate, options = {} )
|
695
|
+
# @param [Array<Integer>] rate The sampling rates for each dimension.
|
696
|
+
# @option options [Array<Integer>] :offset Sampling offsets for each dimension.
|
697
|
+
#
|
698
|
+
# @return [Node] The downsampled data.
|
676
699
|
def downsample( *rate )
|
677
700
|
options = rate.last.is_a?( Hash ) ? rate.pop : {}
|
678
701
|
options = { :offset => rate.collect { |r| r - 1 } }.merge options
|
@@ -728,7 +751,11 @@ class Array
|
|
728
751
|
# @return [Node] The histogram.
|
729
752
|
def histogram( *ret_shape )
|
730
753
|
options = ret_shape.last.is_a?( Hash ) ? ret_shape.pop : {}
|
731
|
-
options = { :weight => Hornetseye::UINT.new( 1 ), :safe => true }.merge options
|
754
|
+
options = { :weight => Hornetseye::UINT. new( 1 ), :safe => true }.merge options
|
755
|
+
unless options[ :weight ].is_a? Hornetseye::Node
|
756
|
+
options[ :weight ] =
|
757
|
+
Hornetseye::Node.match( options[ :weight ] ).maxint.new options[ :weight ]
|
758
|
+
end
|
732
759
|
weight = options[ :weight ]
|
733
760
|
if options[ :safe ]
|
734
761
|
if size != ret_shape.size
|
@@ -740,7 +767,7 @@ class Array
|
|
740
767
|
source_type.check_shape *array_types
|
741
768
|
source_type.check_shape options[ :weight ]
|
742
769
|
for i in 0 ... size
|
743
|
-
range = self[ i ].range
|
770
|
+
range = self[ i ].range 0 ... ret_shape[ i ]
|
744
771
|
if range.begin < 0
|
745
772
|
raise "#{i+1}th dimension of index must be in 0 ... #{ret_shape[i]} " +
|
746
773
|
"(but was #{range.begin})"
|
@@ -780,12 +807,12 @@ class Array
|
|
780
807
|
source_type = array_types.inject { |a,b| a.coercion b }
|
781
808
|
source_type.check_shape *array_types
|
782
809
|
for i in 0 ... size
|
783
|
-
|
810
|
+
offset = table.dimension - size
|
811
|
+
range = self[ i ].range 0 ... table.shape[ i + offset ]
|
784
812
|
if range.begin < 0
|
785
813
|
raise "#{i+1}th index must be in 0 ... #{table.shape[i]} " +
|
786
814
|
"(but was #{range.begin})"
|
787
815
|
end
|
788
|
-
offset = table.dimension - size
|
789
816
|
if range.end >= table.shape[ i + offset ]
|
790
817
|
raise "#{i+1}th index must be in 0 ... " +
|
791
818
|
"#{table.shape[ i + offset ]} (but was #{range.end})"
|
data/lib/multiarray/rgb.rb
CHANGED
@@ -146,9 +146,7 @@ module Hornetseye
|
|
146
146
|
|
147
147
|
# This operation has no effect
|
148
148
|
#
|
149
|
-
# @return [
|
150
|
-
#
|
151
|
-
# @private
|
149
|
+
# @return [RGB] Returns +self+.
|
152
150
|
def +@
|
153
151
|
self
|
154
152
|
end
|
@@ -175,8 +173,6 @@ module Hornetseye
|
|
175
173
|
# Check whether value is equal to zero
|
176
174
|
#
|
177
175
|
# @return [Boolean,GCCValue] The result.
|
178
|
-
#
|
179
|
-
# @private
|
180
176
|
def zero?
|
181
177
|
@r.zero?.and( @g.zero? ).and( @b.zero? )
|
182
178
|
end
|
@@ -184,20 +180,23 @@ module Hornetseye
|
|
184
180
|
# Check whether value is not equal to zero
|
185
181
|
#
|
186
182
|
# @return [Boolean,GCCValue] The result.
|
187
|
-
#
|
188
|
-
# @private
|
189
183
|
def nonzero?
|
190
184
|
@r.nonzero?.or( @g.nonzero? ).or( @b.nonzero? )
|
191
185
|
end
|
192
186
|
|
187
|
+
# Swap colour channels
|
188
|
+
#
|
189
|
+
# @return [RGB] The result.
|
190
|
+
def swap_rgb
|
191
|
+
RGB.new @b, @g, @r
|
192
|
+
end
|
193
|
+
|
193
194
|
# Test on equality
|
194
195
|
#
|
195
196
|
# @param [Object] other Object to compare with.
|
196
197
|
#
|
197
198
|
# @return [Boolean] Returns boolean indicating whether objects are
|
198
199
|
# equal or not.
|
199
|
-
#
|
200
|
-
# @private
|
201
200
|
def ==( other )
|
202
201
|
if other.is_a? RGB
|
203
202
|
@r.eq( other.r ).and( @g.eq( other.g ) ).and( @b.eq( other.b ) )
|
@@ -213,6 +212,8 @@ module Hornetseye
|
|
213
212
|
# This method decomposes the RGB value into an array.
|
214
213
|
#
|
215
214
|
# @return [Node] An array with the three channel values as elements.
|
215
|
+
#
|
216
|
+
# @private
|
216
217
|
def decompose( i )
|
217
218
|
[ @r, @g, @b ][ i ]
|
218
219
|
end
|
@@ -520,6 +521,7 @@ module Hornetseye
|
|
520
521
|
define_unary_op :r, :scalar
|
521
522
|
define_unary_op :g, :scalar
|
522
523
|
define_unary_op :b, :scalar
|
524
|
+
define_unary_op :swap_rgb
|
523
525
|
|
524
526
|
# Fast extraction for red channel of RGB array
|
525
527
|
#
|
@@ -617,7 +619,31 @@ module Hornetseye
|
|
617
619
|
end
|
618
620
|
end
|
619
621
|
|
620
|
-
#
|
622
|
+
# Swapping colour channels for scalar values
|
623
|
+
#
|
624
|
+
# @return [Node] Array with swapped colour channels.
|
625
|
+
def swap_rgb_with_scalar
|
626
|
+
if typecode == OBJECT or typecode < RGB_
|
627
|
+
swap_rgb_without_scalar
|
628
|
+
else
|
629
|
+
self
|
630
|
+
end
|
631
|
+
end
|
632
|
+
|
633
|
+
alias_method_chain :swap_rgb, :scalar
|
634
|
+
|
635
|
+
# Compute colour histogram of this array
|
636
|
+
#
|
637
|
+
# The array is decomposed to its colour channels and a histogram is computed.
|
638
|
+
#
|
639
|
+
# @overload histogram( *ret_shape, options = {} )
|
640
|
+
# @param [Array<Integer>] ret_shape Dimensions of resulting histogram.
|
641
|
+
# @option options [Node] :weight (Hornetseye::UINT(1)) Weights for computing the
|
642
|
+
# histogram.
|
643
|
+
# @option options [Boolean] :safe (true) Do a boundary check before creating the
|
644
|
+
# histogram.
|
645
|
+
#
|
646
|
+
# @return [Node] The histogram.
|
621
647
|
def histogram_with_rgb( *ret_shape )
|
622
648
|
if typecode < RGB_
|
623
649
|
[ r, g, b ].histogram *ret_shape
|
@@ -628,6 +654,13 @@ module Hornetseye
|
|
628
654
|
|
629
655
|
alias_method_chain :histogram, :rgb
|
630
656
|
|
657
|
+
# Perform element-wise lookup with colour values
|
658
|
+
#
|
659
|
+
# @param [Node] table The lookup table (LUT).
|
660
|
+
# @option options [Boolean] :safe (true) Do a boundary check before creating the
|
661
|
+
# element-wise lookup.
|
662
|
+
#
|
663
|
+
# @return [Node] The result of the lookup operation.
|
631
664
|
def lut_with_rgb( table, options = {} )
|
632
665
|
if typecode < RGB_
|
633
666
|
[ r, g, b ].lut table, options
|
@@ -844,6 +877,39 @@ module Hornetseye
|
|
844
877
|
|
845
878
|
end
|
846
879
|
|
880
|
+
# The +Numeric+ class is extended with a few methods
|
881
|
+
class Numeric
|
882
|
+
|
883
|
+
# Get red component
|
884
|
+
#
|
885
|
+
# @return [Numeric] Returns +self+.
|
886
|
+
def r
|
887
|
+
self
|
888
|
+
end
|
889
|
+
|
890
|
+
# Get green component
|
891
|
+
#
|
892
|
+
# @return [Numeric] Returns +self+.
|
893
|
+
def g
|
894
|
+
self
|
895
|
+
end
|
896
|
+
|
897
|
+
# Get blue component
|
898
|
+
#
|
899
|
+
# @return [Numeric] Returns +self+.
|
900
|
+
def b
|
901
|
+
self
|
902
|
+
end
|
903
|
+
|
904
|
+
# Swap colour channels
|
905
|
+
#
|
906
|
+
# @return [Numeric] Returns +self+.
|
907
|
+
def swap_rgb
|
908
|
+
self
|
909
|
+
end
|
910
|
+
|
911
|
+
end
|
912
|
+
|
847
913
|
class Fixnum
|
848
914
|
|
849
915
|
if method_defined? :rpower
|
data/test/tc_multiarray.rb
CHANGED
@@ -341,6 +341,8 @@ class TC_MultiArray < Test::Unit::TestCase
|
|
341
341
|
assert_equal M[ [ 1, 4 ], [ 5, 6 ] ], M[ [ C( 1, 2, 3 ), 4 ], [ 5, 6 ] ].r
|
342
342
|
assert_equal M[ [ 2, 4 ], [ 5, 6 ] ], M[ [ C( 1, 2, 3 ), 4 ], [ 5, 6 ] ].g
|
343
343
|
assert_equal M[ [ 3, 4 ], [ 5, 6 ] ], M[ [ C( 1, 2, 3 ), 4 ], [ 5, 6 ] ].b
|
344
|
+
assert_equal M[ [ C( 3, 2, 1 ), 4 ], [ 5, 6 ] ],
|
345
|
+
M[ [ C( 1, 2, 3 ), 4 ], [ 5, 6 ] ].swap_rgb
|
344
346
|
assert_equal M[ [ 1, 4 ], [ 5, 6 ] ],
|
345
347
|
M[ [ C( 1, 2, 3 ), 4 ], [ 5, 6 ] ].collect { |x| x.r }
|
346
348
|
assert_equal M[ [ 2, 4 ], [ 5, 6 ] ],
|
@@ -431,17 +433,17 @@ class TC_MultiArray < Test::Unit::TestCase
|
|
431
433
|
end
|
432
434
|
|
433
435
|
def test_histogram
|
434
|
-
assert_equal
|
435
|
-
M[ [ 1, 2 ], [ 3, 3 ] ].histogram( 5, :weight =>
|
436
|
-
assert_equal
|
436
|
+
assert_equal [ 0, 1, 1, 2, 0 ],
|
437
|
+
M[ [ 1, 2 ], [ 3, 3 ] ].histogram( 5, :weight => 1 ).to_a
|
438
|
+
assert_equal [ [ 1, 0 ], [ 1, 1 ] ],
|
437
439
|
M[ [ 0, 0 ], [ 0, 1 ], [ 1, 1 ] ].
|
438
|
-
histogram( 2, 2, :weight =>
|
439
|
-
assert_equal
|
440
|
+
histogram( 2, 2, :weight => 1 ).to_a
|
441
|
+
assert_equal [ [ 1, 0 ], [ 1, 1 ] ],
|
440
442
|
[ S[ 0, 0, 1 ], S[ 0, 1, 1 ] ].
|
441
|
-
histogram( 2, 2, :weight =>
|
442
|
-
assert_equal
|
443
|
+
histogram( 2, 2, :weight => 1 ).to_a
|
444
|
+
assert_equal [ [ [ 0, 1 ], [ 1, 0 ] ] ],
|
443
445
|
S[ C( 1, 0, 0 ), C( 0, 1, 0 ) ].
|
444
|
-
histogram( 2, 2, 1, :weight =>
|
446
|
+
histogram( 2, 2, 1, :weight => 1 ).to_a
|
445
447
|
assert_raise( RuntimeError ) { S[ 1, 2, 3 ].histogram 4, 4 }
|
446
448
|
assert_raise( RuntimeError ) { M[ [ -1, 0 ] ].histogram 3, 2 }
|
447
449
|
assert_raise( RuntimeError ) { M[ [ 0, -1 ] ].histogram 3, 2 }
|
data/test/tc_sequence.rb
CHANGED
@@ -240,6 +240,7 @@ class TC_Sequence < Test::Unit::TestCase
|
|
240
240
|
assert_equal [ 1, 4, 5 ], t[ C( 1, 2, 3 ), 4, 5 ].collect { |x| x.r }.to_a
|
241
241
|
assert_equal [ 2, 4, 5 ], t[ C( 1, 2, 3 ), 4, 5 ].collect { |x| x.g }.to_a
|
242
242
|
assert_equal [ 3, 4, 5 ], t[ C( 1, 2, 3 ), 4, 5 ].collect { |x| x.b }.to_a
|
243
|
+
assert_equal t[ C( 3, 2, 1 ), 4, 5 ], t[ C( 1, 2, 3 ), 4, 5 ].swap_rgb
|
243
244
|
s = t[ 0, 0, 0 ]
|
244
245
|
assert_equal 1, s.r = 1
|
245
246
|
assert_equal S[ 1, 2, 3 ], s.g = S[ 1, 2, 3 ]
|
@@ -289,6 +290,8 @@ class TC_Sequence < Test::Unit::TestCase
|
|
289
290
|
assert_equal C( 4, 6, 9 ), S[ C( 1, 2, 3 ), C( 2, 3, 5 ) ].
|
290
291
|
inject( 1 ) { |a,b| a + b }
|
291
292
|
assert_equal X( -5, 10 ), S( X, 2 )[ X( 1, 2 ), X( 3, 4 ) ].inject { |a,b| a * b }
|
293
|
+
assert_raise( RuntimeError ) { S[].inject { |a,b| a + b } }
|
294
|
+
assert_equal 0, S[].inject( 0 ) { |a,b| a + b }
|
292
295
|
end
|
293
296
|
|
294
297
|
def test_collect
|
@@ -312,15 +315,15 @@ class TC_Sequence < Test::Unit::TestCase
|
|
312
315
|
end
|
313
316
|
|
314
317
|
def test_min
|
315
|
-
[
|
316
|
-
assert_equal 2, t[ 4, 2, 3 ].min
|
318
|
+
[ O, I ].each do |t|
|
319
|
+
assert_equal 2, S( t, 3 )[ 4, 2, 3 ].min
|
317
320
|
end
|
318
321
|
assert_equal C( 1, 2, 1 ), S[ C( 1, 2, 3 ), C( 3, 2, 1 ) ].min
|
319
322
|
end
|
320
323
|
|
321
324
|
def test_max
|
322
|
-
[
|
323
|
-
assert_equal 4, t[ 4, 2, 3 ].max
|
325
|
+
[ O, I ].each do |t|
|
326
|
+
assert_equal 4, S( t, 3 )[ 4, 2, 3 ].max
|
324
327
|
end
|
325
328
|
assert_equal C( 3, 2, 3 ), S[ C( 1, 2, 3 ), C( 3, 2, 1 ) ].max
|
326
329
|
end
|
@@ -360,12 +363,12 @@ class TC_Sequence < Test::Unit::TestCase
|
|
360
363
|
|
361
364
|
def test_histogram
|
362
365
|
[ O, I ].each do |t|
|
363
|
-
assert_equal
|
364
|
-
S( t, 5 )[ 1, 2, 2, 3, 4 ].histogram( 5, :weight =>
|
366
|
+
assert_equal [ 0, 1, 2, 1, 1 ],
|
367
|
+
S( t, 5 )[ 1, 2, 2, 3, 4 ].histogram( 5, :weight => 1 ).to_a
|
365
368
|
assert_equal S( t, 5 )[ 0, 1, 2, 3, 0 ],
|
366
369
|
S( t, 3 )[ 1, 3, 2 ].histogram( 5, :weight => S( t, 3 )[ 1, 3, 2 ] )
|
367
|
-
assert_equal
|
368
|
-
S( t, 2 )[ 1.0, 2.0 ].histogram( 4, :weight =>
|
370
|
+
assert_equal [ 0, 1, 1, 0 ],
|
371
|
+
S( t, 2 )[ 1.0, 2.0 ].histogram( 4, :weight => 1 ).to_a
|
369
372
|
end
|
370
373
|
assert_raise( RuntimeError ) { S[ -1, 0, 1 ].histogram 3 }
|
371
374
|
assert_raise( RuntimeError ) { S[ 1, 2, 3 ].histogram 3 }
|
@@ -550,7 +553,8 @@ class TC_Sequence < Test::Unit::TestCase
|
|
550
553
|
end
|
551
554
|
|
552
555
|
def test_conj
|
553
|
-
assert_equal S[ 1.5, 2.5 ], S[ 1.5, 2.5 ].conj
|
556
|
+
assert_equal S( O, 2 )[ 1.5, 2.5 ], S( O, 2 )[ 1.5, 2.5 ].conj
|
557
|
+
assert_equal S( F, 2 )[ 1.5, 2.5 ], S( F, 2 )[ 1.5, 2.5 ].conj
|
554
558
|
assert_equal S[ X( 1.5, -2.5 ) ], S[ X( 1.5, 2.5 ) ].conj
|
555
559
|
end
|
556
560
|
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
7
|
+
- 18
|
8
8
|
- 0
|
9
|
-
version: 0.
|
9
|
+
version: 0.18.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Jan Wedekind
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2011-01-
|
17
|
+
date: 2011-01-11 00:00:00 +00:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|