Module: Smalltime

Defined in:
lib/smalltime.rb,
lib/smalltime/configuration.rb

Overview

Smalltime is a drop-in replacement for ActiveSupport::Duration that supports arbitrary precision, no floating point arithmetic, and advanced formatting capabilities. It has no dependencies and can cooperate with ActiveSupport::Durations.

Defined Under Namespace

Classes: Configuration, Duration, Unit

Constant Summary collapse

YOCTOSECOND =
Unit.new(:yoctosecond, :yoctoseconds, :ys)
ZEPTOSECOND =
Unit.new(:zeptosecond, :zeptoseconds, :zs, base: YOCTOSECOND, multiplier: 1000)
ATTOSECOND =
Unit.new(:attosecond, :attoseconds, :as, base: ZEPTOSECOND, multiplier: 1000)
FEMTOSECOND =
Unit.new(:femtosecond, :femtoseconds, :fs, base: ATTOSECOND, multiplier: 1000)
PICOSECOND =
Unit.new(:picosecond, :picoseconds, :ps, base: FEMTOSECOND, multiplier: 1000)
NANOSECOND =
Unit.new(:nanosecond, :nanoseconds, :ns, base: PICOSECOND, multiplier: 1000)
MICROSECOND =
Unit.new(:microsecond, :microseconds, :
MILLISECOND =
Unit.new(:millisecond, :milliseconds, :ms, base: MICROSECOND, multiplier: 1000)
CENTISECOND =
Unit.new(:centisecond, :centiseconds, :cs, base: MILLISECOND, multiplier: 10)
DECISECOND =
Unit.new(:decisecond, :deciseconds, :ds, base: CENTISECOND, multiplier: 10)
STRICT_SECOND =
Unit.new(:second, :seconds, :s, base: DECISECOND, multiplier: 10)
STRICT_MINUTE =
Unit.new(:minute, :minutes, :min, base: STRICT_SECOND, multiplier: 60)
STRICT_HOUR =
Unit.new(:hour, :hours, :h, base: STRICT_MINUTE, multiplier: 60)
STRICT_DAY =
Unit.new(:day, :days, :d, base: STRICT_HOUR, multiplier: 24)
STRICT_WEEK =
Unit.new(:week, :weeks, :w, base: STRICT_DAY, multiplier: 7)
STRICT_MONTH =

Warning: approximate

Unit.new(:month, :months, :mo, base: STRICT_WEEK, multiplier: 4)
STRICT_YEAR =
Unit.new(:year, :years, :y, base: STRICT_MONTH, multiplier: 12)
STRICT_DECADE =
Unit.new(:decade, :decades, :dy, base: STRICT_YEAR, multiplier: 10)
STRICT_CENTURY =
Unit.new(:century, :centuries, :c, base: STRICT_DECADE, multiplier: 10)
STRICT_MILLENIUM =
Unit.new(:millenium, :millenia, :mi, base: STRICT_CENTURY, multiplier: 10)
NONSTRICT_SECOND =
Unit.new(:second, :seconds, :s, base: MILLISECOND, multiplier: 1000)
NONSTRICT_MINUTE =
Unit.new(:minute, :minutes, :m, base: NONSTRICT_SECOND, multiplier: 60)
NONSTRICT_HOUR =
Unit.new(:hour, :hours, :h, base: NONSTRICT_MINUTE, multiplier: 60)
NONSTRICT_DAY =
Unit.new(:day, :days, :d, base: NONSTRICT_HOUR, multiplier: 24)
NONSTRICT_WEEK =
Unit.new(:week, :weeks, :w, base: NONSTRICT_DAY, multiplier: 7)
NONSTRICT_MONTH =

Warning: approximate

Unit.new(:month, :months, :mo, base: NONSTRICT_WEEK, multiplier: 4)
NONSTRICT_YEAR =
Unit.new(:year, :years, :y, base: NONSTRICT_MONTH, multiplier: 12)
NONSTRICT_DECADE =
Unit.new(:decade, :decades, :dy, base: NONSTRICT_YEAR, multiplier: 10)
NONSTRICT_CENTURY =
Unit.new(:century, :centuries, :c, base: NONSTRICT_DECADE, multiplier: 10)
NONSTRICT_MILLENIUM =
Unit.new(:millenium, :millenia, :mi, base: NONSTRICT_CENTURY, multiplier: 10)
STRICT_UNITS =
[
  YOCTOSECOND, ZEPTOSECOND, ATTOSECOND, FEMTOSECOND, PICOSECOND, NANOSECOND,
  MICROSECOND, MILLISECOND, CENTISECOND, DECISECOND, STRICT_SECOND, STRICT_MINUTE,
  STRICT_HOUR, STRICT_DAY, STRICT_WEEK, STRICT_MONTH, STRICT_YEAR, STRICT_DECADE,
  STRICT_CENTURY, STRICT_MILLENIUM
]
NONSTRICT_UNITS =
[
  YOCTOSECOND, ZEPTOSECOND, ATTOSECOND, FEMTOSECOND, PICOSECOND, NANOSECOND,
  MICROSECOND, MILLISECOND, NONSTRICT_SECOND, NONSTRICT_MINUTE, NONSTRICT_HOUR,
  NONSTRICT_DAY, NONSTRICT_WEEK, NONSTRICT_MONTH, NONSTRICT_YEAR, NONSTRICT_DECADE,
  NONSTRICT_CENTURY, NONSTRICT_MILLENIUM
]

Class Attribute Summary collapse

Class Method Summary collapse

Class Attribute Details

.configurationObject



12
13
14
# File 'lib/smalltime.rb', line 12

def configuration
  @configuration ||= Configuration.new
end

Class Method Details

.configure {|configuration| ... } ⇒ Object

Yields:



20
21
22
# File 'lib/smalltime.rb', line 20

def configure
  yield(configuration)
end

.resetObject



16
17
18
# File 'lib/smalltime.rb', line 16

def reset
  @configuration = Configuration.new
end

.unit_by_name(name) ⇒ Object



32
33
34
35
36
37
38
# File 'lib/smalltime.rb', line 32

def unit_by_name(name)
  (configuration.strict? ? STRICT_UNITS : NONSTRICT_UNITS).find do |unit|
    names = [unit.name, unit.plural, unit.shortname].map { |s| s.to_s }
    names += names.map { |s| s.to_sym }
    names.include?(name)
  end
end

.unitsObject



24
25
26
27
28
29
30
# File 'lib/smalltime.rb', line 24

def units
  unts = configuration.strict? ? STRICT_UNITS : NONSTRICT_UNITS

  unts[0..unts.find_index do |u|
    u.names.include?(Smalltime.configuration.maximum_unit)
  end]
end