ruby-units 2.2.0 → 2.2.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 448201b21f6913329bfbd81fff22ea949e74ba81
4
- data.tar.gz: 1021947fecb0fbd41a2cda3dcce5d1a16a31cf61
3
+ metadata.gz: 52d0abf6dc2d186c597aa3543dfb64a2e4e58437
4
+ data.tar.gz: bc9f92f2eaf3eeefb1df33699785d21a2ff9fcf8
5
5
  SHA512:
6
- metadata.gz: 73e1a0a5ff0bf2c7cad7313296f1be2cf666394be7697e82ef0daf8c0d15ce8973ba2a9c4a40589d7bbdf381d5665fc71f237547ef6e10e19303e45fb36457c1
7
- data.tar.gz: 5a41f0e985f8cc118674a29e64fc8b66b9c0cebd81bc622f4986469b0c5fe994c7276204fe1fcd87c81d63ce1e681d8a12f46ded7057f0f127b94ed56f185879
6
+ metadata.gz: cf20400a8552f515beb913042d5d8736402ac244736718fe515058b5556b4f13b3b04fc8091f65fde2adcdb5da8af48af5f32a54b7bdf51f1824ba1371df9f3b
7
+ data.tar.gz: '066711448923f74c7f9995bfd3f1c700495018ffe142ea48e1dbe1158e3842f3d19a363268ecd38546fc35768196334f8fbd05cf3aae693335217e43b3c70d83'
data/CHANGELOG.txt CHANGED
@@ -1,5 +1,9 @@
1
1
  Change Log for Ruby-units
2
2
  =========================
3
+ 2017-12-07 2.2.1 * fix an issue with formatting of rational scalars (see #159)
4
+ 2017-08-07 2.2.0 * add support for ruby 2.4.1
5
+ * drop support for ruby 2.1.0
6
+ * remove dependency on mathn (see #157)
3
7
  2016-12-28 2.1.0 * add support for ruby 2.4.0
4
8
  * allow configuration for optional separator on output
5
9
  * Fix issue #105 -- change 'grad' to 'gon'
data/VERSION CHANGED
@@ -1 +1 @@
1
- 2.2.0
1
+ 2.2.1
@@ -9,7 +9,7 @@ class Date
9
9
  def +(other)
10
10
  case other
11
11
  when RubyUnits::Unit
12
- other = other.convert_to('d').round if %w(y decade century).include? other.units
12
+ other = other.convert_to('d').round if %w[y decade century].include? other.units
13
13
  unit_date_add(other.convert_to('day').scalar)
14
14
  else
15
15
  unit_date_add(other)
@@ -22,7 +22,7 @@ class Date
22
22
  def -(other)
23
23
  case other
24
24
  when RubyUnits::Unit
25
- other = other.convert_to('d').round if %w(y decade century).include? other.units
25
+ other = other.convert_to('d').round if %w[y decade century].include? other.units
26
26
  unit_date_sub(other.convert_to('day').scalar)
27
27
  else
28
28
  unit_date_sub(other)
@@ -45,7 +45,7 @@ class Time
45
45
  def +(other)
46
46
  case other
47
47
  when RubyUnits::Unit
48
- other = other.convert_to('d').round.convert_to('s') if %w(y decade century).include? other.units
48
+ other = other.convert_to('d').round.convert_to('s') if %w[y decade century].include? other.units
49
49
  begin
50
50
  unit_add(other.convert_to('s').scalar)
51
51
  rescue RangeError
@@ -69,7 +69,7 @@ class Time
69
69
  def -(other)
70
70
  case other
71
71
  when RubyUnits::Unit
72
- other = other.convert_to('d').round.convert_to('s') if %w(y decade century).include? other.units
72
+ other = other.convert_to('d').round.convert_to('s') if %w[y decade century].include? other.units
73
73
  begin
74
74
  unit_sub(other.convert_to('s').scalar)
75
75
  rescue RangeError
@@ -1,4 +1,3 @@
1
- # encoding: utf-8
2
1
  require 'date'
3
2
  # Copyright 2006-2015
4
3
  # @author Kevin C. Olbrich, Ph.D.
@@ -62,7 +61,7 @@ module RubyUnits
62
61
  RANKINE = ['<rankine>'].freeze
63
62
  CELSIUS = ['<celsius>'].freeze
64
63
  @@temp_regex = nil
65
- SIGNATURE_VECTOR = %i(
64
+ SIGNATURE_VECTOR = %i[
66
65
  length
67
66
  time
68
67
  temperature
@@ -73,7 +72,7 @@ module RubyUnits
73
72
  currency
74
73
  information
75
74
  angle
76
- ).freeze
75
+ ].freeze
77
76
  @@kinds = {
78
77
  -312_078 => :elastance,
79
78
  -312_058 => :resistance,
@@ -333,9 +332,9 @@ module RubyUnits
333
332
  when rational
334
333
  # if it has whitespace, it will be of the form '6 1/2'
335
334
  if num =~ RATIONAL_NUMBER
336
- sign = $1 == '-' ? -1 : 1
337
- n = $2.to_i
338
- f = Rational($3.to_i, $4.to_i)
335
+ sign = Regexp.last_match(1) == '-' ? -1 : 1
336
+ n = Regexp.last_match(2).to_i
337
+ f = Rational(Regexp.last_match(3).to_i, Regexp.last_match(4).to_i)
339
338
  sign * (n + f)
340
339
  else
341
340
  Rational(*num.split('/').map(&:to_i))
@@ -369,7 +368,7 @@ module RubyUnits
369
368
 
370
369
  def self.temp_regex
371
370
  @@temp_regex ||= begin
372
- temp_units = %w(tempK tempC tempF tempR degK degC degF degR)
371
+ temp_units = %w[tempK tempC tempF tempR degK degC degF degR]
373
372
  aliases = temp_units.map do |unit|
374
373
  d = RubyUnits::Unit.definition(unit)
375
374
  d && d.aliases
@@ -436,7 +435,11 @@ module RubyUnits
436
435
  @base = from.base?
437
436
  @signature = from.signature
438
437
  @base_scalar = from.base_scalar
439
- @unit_name = from.unit_name rescue nil
438
+ @unit_name = begin
439
+ from.unit_name
440
+ rescue
441
+ nil
442
+ end
440
443
  self
441
444
  end
442
445
 
@@ -474,7 +477,11 @@ module RubyUnits
474
477
  cached = @@cached_units[options[1]] * options[0]
475
478
  copy(cached)
476
479
  rescue
477
- initialize("#{options[0]} #{(options[1].units rescue options[1])}")
480
+ initialize("#{options[0]} #{(begin
481
+ options[1].units
482
+ rescue
483
+ options[1]
484
+ end)}")
478
485
  end
479
486
  return
480
487
  end
@@ -495,7 +502,7 @@ module RubyUnits
495
502
  copy(options[0])
496
503
  return
497
504
  when Hash
498
- @scalar = options[0][:scalar] || 1
505
+ @scalar = (options[0][:scalar] || 1)
499
506
  @numerator = options[0][:numerator] || UNITY_ARRAY
500
507
  @denominator = options[0][:denominator] || UNITY_ARRAY
501
508
  @signature = options[0][:signature]
@@ -582,7 +589,11 @@ module RubyUnits
582
589
  return base
583
590
  end
584
591
 
585
- cached = ((@@base_unit_cache[units] * scalar) rescue nil)
592
+ cached = (begin
593
+ (@@base_unit_cache[units] * scalar)
594
+ rescue
595
+ nil
596
+ end)
586
597
  return cached if cached
587
598
 
588
599
  num = []
@@ -630,6 +641,7 @@ module RubyUnits
630
641
  #
631
642
  # output is cached so subsequent calls for the same format will be fast
632
643
  #
644
+ # @note Rational scalars that are equal to an integer will be represented as integers (i.e, 6/1 => 6, 4/2 => 2, etc..)
633
645
  # @param [Symbol] target_units
634
646
  # @return [String]
635
647
  def to_s(target_units = nil)
@@ -652,23 +664,25 @@ module RubyUnits
652
664
  ''
653
665
  when /(%[\-+\.\w#]+)\s*(.+)*/ # format string like '%0.2f in'
654
666
  begin
655
- if $2 # unit specified, need to convert
656
- convert_to($2).to_s($1)
667
+ if Regexp.last_match(2) # unit specified, need to convert
668
+ convert_to(Regexp.last_match(2)).to_s(Regexp.last_match(1))
657
669
  else
658
- "#{$1 % @scalar}#{separator}#{$2 || units}".strip
670
+ "#{Regexp.last_match(1) % @scalar}#{separator}#{Regexp.last_match(2) || units}".strip
659
671
  end
660
672
  rescue # parse it like a strftime format string
661
673
  (DateTime.new(0) + self).strftime(target_units)
662
674
  end
663
675
  when /(\S+)/ # unit only 'mm' or '1/mm'
664
- convert_to($1).to_s
676
+ convert_to(Regexp.last_match(1)).to_s
665
677
  else
666
678
  raise 'unhandled case'
667
679
  end
668
680
  else
669
681
  out = case @scalar
670
- when Rational, Complex
682
+ when Complex
671
683
  "#{@scalar}#{separator}#{units}"
684
+ when Rational
685
+ "#{@scalar == @scalar.to_i ? @scalar.to_i : @scalar}#{separator}#{units}"
672
686
  else
673
687
  "#{'%g' % @scalar}#{separator}#{units}"
674
688
  end.strip
@@ -833,7 +847,13 @@ module RubyUnits
833
847
  RubyUnits::Unit.new(scalar: (other.scalar + convert_to(other.temperature_scale).scalar), numerator: other.numerator, denominator: other.denominator, signature: other.signature)
834
848
  end
835
849
  else
836
- @q ||= (Rational(@@cached_units[units].scalar, @@cached_units[units].base_scalar) rescue units.to_unit.to_base.scalar)
850
+ @q ||= begin
851
+ begin
852
+ Rational(@@cached_units[units].scalar, @@cached_units[units].base_scalar)
853
+ rescue
854
+ units.to_unit.to_base.scalar
855
+ end
856
+ end
837
857
  RubyUnits::Unit.new(scalar: (base_scalar + other.base_scalar) * @q, numerator: @numerator, denominator: @denominator, signature: @signature)
838
858
  end
839
859
  else
@@ -870,7 +890,13 @@ module RubyUnits
870
890
  elsif other.temperature?
871
891
  raise ArgumentError, 'Cannot subtract a temperature from a differential degree unit'
872
892
  else
873
- @q ||= (Rational(@@cached_units[units].scalar, @@cached_units[units].base_scalar) rescue Rational(units.to_unit.scalar, units.to_unit.to_base.scalar))
893
+ @q ||= begin
894
+ begin
895
+ Rational(@@cached_units[units].scalar, @@cached_units[units].base_scalar)
896
+ rescue
897
+ Rational(units.to_unit.scalar, units.to_unit.to_base.scalar)
898
+ end
899
+ end
874
900
  RubyUnits::Unit.new(scalar: (base_scalar - other.base_scalar) * @q, numerator: @numerator, denominator: @denominator, signature: @signature)
875
901
  end
876
902
  else
@@ -1067,9 +1093,12 @@ module RubyUnits
1067
1093
  if (Unit === other && other.temperature?) || (String === other && other =~ /temp[CFRK]/)
1068
1094
  raise ArgumentError, 'Receiver is not a temperature unit' unless degree?
1069
1095
  start_unit = units
1070
- target_unit = other.units rescue other
1071
- unless @base_scalar
1072
- @base_scalar = case @@unit_map[start_unit]
1096
+ target_unit = begin
1097
+ other.units
1098
+ rescue
1099
+ other
1100
+ end
1101
+ @base_scalar ||= case @@unit_map[start_unit]
1073
1102
  when '<tempC>'
1074
1103
  @scalar + 273.15
1075
1104
  when '<tempK>'
@@ -1079,7 +1108,6 @@ module RubyUnits
1079
1108
  when '<tempR>'
1080
1109
  @scalar * Rational(5, 9)
1081
1110
  end
1082
- end
1083
1111
  q = case @@unit_map[target_unit]
1084
1112
  when '<tempC>'
1085
1113
  @base_scalar - 273.15
@@ -1312,7 +1340,11 @@ module RubyUnits
1312
1340
  def before(time_point = ::Time.now)
1313
1341
  case time_point
1314
1342
  when Time, Date, DateTime
1315
- return (time_point - self rescue time_point.to_datetime - self)
1343
+ return (begin
1344
+ time_point - self
1345
+ rescue
1346
+ time_point.to_datetime - self
1347
+ end)
1316
1348
  else
1317
1349
  raise ArgumentError, 'Must specify a Time, Date, or DateTime'
1318
1350
  end
@@ -1356,7 +1388,11 @@ module RubyUnits
1356
1388
  def from(time_point)
1357
1389
  case time_point
1358
1390
  when Time, DateTime, Date
1359
- (time_point + self rescue time_point.to_datetime + self)
1391
+ (begin
1392
+ time_point + self
1393
+ rescue
1394
+ time_point.to_datetime + self
1395
+ end)
1360
1396
  else
1361
1397
  raise ArgumentError, 'Must specify a Time, Date, or DateTime'
1362
1398
  end
@@ -1478,7 +1514,7 @@ module RubyUnits
1478
1514
  # @todo This should either be a separate class or at least a class method
1479
1515
  def parse(passed_unit_string = '0')
1480
1516
  unit_string = passed_unit_string.dup
1481
- unit_string = "#{$1} USD" if unit_string =~ /\$\s*(#{NUMBER_REGEX})/
1517
+ unit_string = "#{Regexp.last_match(1)} USD" if unit_string =~ /\$\s*(#{NUMBER_REGEX})/
1482
1518
  unit_string.gsub!("\u00b0".force_encoding('utf-8'), 'deg') if unit_string.encoding == Encoding::UTF_8
1483
1519
 
1484
1520
  unit_string.gsub!(/[%'"#]/, '%' => 'percent', "'" => 'feet', '"' => 'inch', '#' => 'pound')
@@ -1500,8 +1536,12 @@ module RubyUnits
1500
1536
  end
1501
1537
 
1502
1538
  unit_string =~ NUMBER_REGEX
1503
- unit = @@cached_units[$2]
1504
- mult = ($1.empty? ? 1.0 : $1.to_f) rescue 1.0
1539
+ unit = @@cached_units[Regexp.last_match(2)]
1540
+ mult = begin
1541
+ (Regexp.last_match(1).empty? ? 1.0 : Regexp.last_match(1).to_f)
1542
+ rescue
1543
+ 1.0
1544
+ end
1505
1545
  mult = mult.to_int if mult.to_int == mult
1506
1546
  if unit
1507
1547
  copy(unit)
@@ -1567,7 +1607,7 @@ module RubyUnits
1567
1607
  end
1568
1608
  end
1569
1609
  if bottom
1570
- bottom.gsub!(BOTTOM_REGEX) { "#{$1} " * $2.to_i }
1610
+ bottom.gsub!(BOTTOM_REGEX) { "#{Regexp.last_match(1)} " * Regexp.last_match(2).to_i }
1571
1611
  # Separate leading decimal from denominator, if any
1572
1612
  bottom_scalar, bottom = bottom.scan(NUMBER_UNIT_REGEX)[0]
1573
1613
  end
@@ -3,98 +3,98 @@ RubyUnits::Unit.new('1')
3
3
 
4
4
  RubyUnits::Unit.define('meter') do |unit|
5
5
  unit.scalar = 1
6
- unit.numerator = %w(<meter>)
7
- unit.aliases = %w(m meter meters metre metres)
6
+ unit.numerator = %w[<meter>]
7
+ unit.aliases = %w[m meter meters metre metres]
8
8
  unit.kind = :length
9
9
  end
10
10
 
11
11
  RubyUnits::Unit.define('kilogram') do |unit|
12
12
  unit.scalar = 1
13
- unit.numerator = %w(<kilogram>)
14
- unit.aliases = %w(kg kilogram kilograms)
13
+ unit.numerator = %w[<kilogram>]
14
+ unit.aliases = %w[kg kilogram kilograms]
15
15
  unit.kind = :mass
16
16
  end
17
17
 
18
18
  RubyUnits::Unit.define('second') do |unit|
19
19
  unit.scalar = 1
20
- unit.numerator = %w(<second>)
21
- unit.aliases = %w(s sec second seconds)
20
+ unit.numerator = %w[<second>]
21
+ unit.aliases = %w[s sec second seconds]
22
22
  unit.kind = :time
23
23
  end
24
24
 
25
25
  RubyUnits::Unit.define('mole') do |unit|
26
26
  unit.scalar = 1
27
- unit.numerator = %w(<mole>)
28
- unit.aliases = %w(mol mole)
27
+ unit.numerator = %w[<mole>]
28
+ unit.aliases = %w[mol mole]
29
29
  unit.kind = :substance
30
30
  end
31
31
 
32
32
  RubyUnits::Unit.define('ampere') do |unit|
33
33
  unit.scalar = 1
34
- unit.numerator = %w(<ampere>)
35
- unit.aliases = %w(A ampere amperes amp amps)
34
+ unit.numerator = %w[<ampere>]
35
+ unit.aliases = %w[A ampere amperes amp amps]
36
36
  unit.kind = :current
37
37
  end
38
38
 
39
39
  RubyUnits::Unit.define('radian') do |unit|
40
40
  unit.scalar = 1
41
- unit.numerator = %w(<radian>)
42
- unit.aliases = %w(rad radian radians)
41
+ unit.numerator = %w[<radian>]
42
+ unit.aliases = %w[rad radian radians]
43
43
  unit.kind = :angle
44
44
  end
45
45
 
46
46
  RubyUnits::Unit.define('kelvin') do |unit|
47
47
  unit.scalar = 1
48
- unit.numerator = %w(<kelvin>)
49
- unit.aliases = %w(degK kelvin)
48
+ unit.numerator = %w[<kelvin>]
49
+ unit.aliases = %w[degK kelvin]
50
50
  unit.kind = :temperature
51
51
  end
52
52
 
53
53
  RubyUnits::Unit.define('tempK') do |unit|
54
54
  unit.scalar = 1
55
- unit.numerator = %w(<tempK>)
56
- unit.aliases = %w(tempK)
55
+ unit.numerator = %w[<tempK>]
56
+ unit.aliases = %w[tempK]
57
57
  unit.kind = :temperature
58
58
  end
59
59
 
60
60
  RubyUnits::Unit.define('byte') do |unit|
61
61
  unit.scalar = 1
62
- unit.numerator = %w(<byte>)
63
- unit.aliases = %w(B byte bytes)
62
+ unit.numerator = %w[<byte>]
63
+ unit.aliases = %w[B byte bytes]
64
64
  unit.kind = :information
65
65
  end
66
66
 
67
67
  RubyUnits::Unit.define('dollar') do |unit|
68
68
  unit.scalar = 1
69
- unit.numerator = %w(<dollar>)
70
- unit.aliases = %w(USD dollar)
69
+ unit.numerator = %w[<dollar>]
70
+ unit.aliases = %w[USD dollar]
71
71
  unit.kind = :currency
72
72
  end
73
73
 
74
74
  RubyUnits::Unit.define('candela') do |unit|
75
75
  unit.scalar = 1
76
- unit.numerator = %w(<candela>)
77
- unit.aliases = %w(cd candela)
76
+ unit.numerator = %w[<candela>]
77
+ unit.aliases = %w[cd candela]
78
78
  unit.kind = :luminosity
79
79
  end
80
80
 
81
81
  RubyUnits::Unit.define('each') do |unit|
82
82
  unit.scalar = 1
83
- unit.numerator = %w(<each>)
84
- unit.aliases = %w(each)
83
+ unit.numerator = %w[<each>]
84
+ unit.aliases = %w[each]
85
85
  unit.kind = :counting
86
86
  end
87
87
 
88
88
  RubyUnits::Unit.define('steradian') do |unit|
89
89
  unit.scalar = 1
90
- unit.numerator = %w(<steradian>)
91
- unit.aliases = %w(sr steradian steradians)
90
+ unit.numerator = %w[<steradian>]
91
+ unit.aliases = %w[sr steradian steradians]
92
92
  unit.kind = :solid_angle
93
93
  end
94
94
 
95
95
  RubyUnits::Unit.define('decibel') do |unit|
96
96
  unit.scalar = 1
97
- unit.numerator = %w(<decibel>)
98
- unit.aliases = %w(dB decibel decibels)
97
+ unit.numerator = %w[<decibel>]
98
+ unit.aliases = %w[dB decibel decibels]
99
99
  unit.kind = :logarithmic
100
100
  end
@@ -1,36 +1,34 @@
1
- # encoding: utf-8
2
-
3
1
  {
4
- 'googol' => [%w(googol), 1e100],
5
- 'yobi' => [%w(Yi Yobi yobi), 2**80],
6
- 'zebi' => [%w(Zi Zebi zebi), 2**70],
7
- 'exbi' => [%w(Ei Exbi exbi), 2**60],
8
- 'pebi' => [%w(Pi Pebi pebi), 2**50],
9
- 'tebi' => [%w(Ti Tebi tebi), 2**40],
10
- 'gibi' => [%w(Gi Gibi gibi), 2**30],
11
- 'mebi' => [%w(Mi Mebi mebi), 2**20],
12
- 'kibi' => [%w(Ki Kibi kibi), 2**10],
13
- 'yotta' => [%w(Y Yotta yotta), 1e24],
14
- 'zetta' => [%w(Z Zetta zetta), 1e21],
15
- 'exa' => [%w(E Exa exa), 1e18],
16
- 'peta' => [%w(P Peta peta), 1e15],
17
- 'tera' => [%w(T Tera tera), 1e12],
18
- 'giga' => [%w(G Giga giga), 1e9],
19
- 'mega' => [%w(M Mega mega), 1e6],
20
- 'kilo' => [%w(k kilo), 1e3],
21
- 'hecto' => [%w(h Hecto hecto), 1e2],
22
- 'deca' => [%w(da Deca deca deka), 1e1],
23
- '1' => [%w(1), 1],
24
- 'deci' => [%w(d Deci deci), Rational(1, 1e1)],
25
- 'centi' => [%w(c Centi centi), Rational(1, 1e2)],
26
- 'milli' => [%w(m Milli milli), Rational(1, 1e3)],
27
- 'micro' => [%w(u µ Micro micro mc), Rational(1, 1e6)],
28
- 'nano' => [%w(n Nano nano), Rational(1, 1e9)],
29
- 'pico' => [%w(p Pico pico), Rational(1, 1e12)],
30
- 'femto' => [%w(f Femto femto), Rational(1, 1e15)],
31
- 'atto' => [%w(a Atto atto), Rational(1, 1e18)],
32
- 'zepto' => [%w(z Zepto zepto), Rational(1, 1e21)],
33
- 'yocto' => [%w(y Yocto yocto), Rational(1, 1e24)]
2
+ 'googol' => [%w[googol], 1e100],
3
+ 'yobi' => [%w[Yi Yobi yobi], 2**80],
4
+ 'zebi' => [%w[Zi Zebi zebi], 2**70],
5
+ 'exbi' => [%w[Ei Exbi exbi], 2**60],
6
+ 'pebi' => [%w[Pi Pebi pebi], 2**50],
7
+ 'tebi' => [%w[Ti Tebi tebi], 2**40],
8
+ 'gibi' => [%w[Gi Gibi gibi], 2**30],
9
+ 'mebi' => [%w[Mi Mebi mebi], 2**20],
10
+ 'kibi' => [%w[Ki Kibi kibi], 2**10],
11
+ 'yotta' => [%w[Y Yotta yotta], 1e24],
12
+ 'zetta' => [%w[Z Zetta zetta], 1e21],
13
+ 'exa' => [%w[E Exa exa], 1e18],
14
+ 'peta' => [%w[P Peta peta], 1e15],
15
+ 'tera' => [%w[T Tera tera], 1e12],
16
+ 'giga' => [%w[G Giga giga], 1e9],
17
+ 'mega' => [%w[M Mega mega], 1e6],
18
+ 'kilo' => [%w[k kilo], 1e3],
19
+ 'hecto' => [%w[h Hecto hecto], 1e2],
20
+ 'deca' => [%w[da Deca deca deka], 1e1],
21
+ '1' => [%w[1], 1],
22
+ 'deci' => [%w[d Deci deci], Rational(1, 1e1)],
23
+ 'centi' => [%w[c Centi centi], Rational(1, 1e2)],
24
+ 'milli' => [%w[m Milli milli], Rational(1, 1e3)],
25
+ 'micro' => [%w[u µ Micro micro mc], Rational(1, 1e6)],
26
+ 'nano' => [%w[n Nano nano], Rational(1, 1e9)],
27
+ 'pico' => [%w[p Pico pico], Rational(1, 1e12)],
28
+ 'femto' => [%w[f Femto femto], Rational(1, 1e15)],
29
+ 'atto' => [%w[a Atto atto], Rational(1, 1e18)],
30
+ 'zepto' => [%w[z Zepto zepto], Rational(1, 1e21)],
31
+ 'yocto' => [%w[y Yocto yocto], Rational(1, 1e24)]
34
32
  }.each do |name, definition|
35
33
  RubyUnits::Unit.define(name) do |unit|
36
34
  aliases, scalar = definition