lite-ruby 1.0.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.
- checksums.yaml +7 -0
- data/.fasterer.yml +19 -0
- data/.gitignore +11 -0
- data/.rspec +4 -0
- data/.rubocop.yml +32 -0
- data/.travis.yml +24 -0
- data/CHANGELOG.md +11 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +6 -0
- data/Gemfile.lock +119 -0
- data/LICENSE.txt +21 -0
- data/README.md +96 -0
- data/Rakefile +8 -0
- data/_config.yml +1 -0
- data/bin/console +15 -0
- data/bin/setup +8 -0
- data/docs/ARRAY.md +284 -0
- data/docs/DATE.md +78 -0
- data/docs/ENUMERABLE.md +174 -0
- data/docs/HASH.md +282 -0
- data/docs/INTEGER.md +43 -0
- data/docs/KERNEL.md +31 -0
- data/docs/NUMERIC.md +302 -0
- data/docs/OBJECT.md +322 -0
- data/docs/RANGE.md +55 -0
- data/docs/STRING.md +463 -0
- data/docs/TIME.md +86 -0
- data/lib/generators/lite/ruby/install_generator.rb +17 -0
- data/lib/generators/lite/ruby/templates/install.rb +15 -0
- data/lib/lite/ruby.rb +16 -0
- data/lib/lite/ruby/array.rb +290 -0
- data/lib/lite/ruby/configuration.rb +42 -0
- data/lib/lite/ruby/date.rb +27 -0
- data/lib/lite/ruby/enumerable.rb +167 -0
- data/lib/lite/ruby/hash.rb +284 -0
- data/lib/lite/ruby/helpers/date_helper.rb +105 -0
- data/lib/lite/ruby/helpers/time_helper.rb +84 -0
- data/lib/lite/ruby/integer.rb +45 -0
- data/lib/lite/ruby/kernel.rb +29 -0
- data/lib/lite/ruby/numeric.rb +210 -0
- data/lib/lite/ruby/object.rb +182 -0
- data/lib/lite/ruby/range.rb +32 -0
- data/lib/lite/ruby/string.rb +412 -0
- data/lib/lite/ruby/time.rb +26 -0
- data/lib/lite/ruby/version.rb +9 -0
- data/lite-ruby.gemspec +48 -0
- metadata +200 -0
| @@ -0,0 +1,105 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Lite
         | 
| 4 | 
            +
              module Ruby
         | 
| 5 | 
            +
                module DateHelper
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                  DATE_STAMPS ||= {
         | 
| 8 | 
            +
                    weekday: '%d',
         | 
| 9 | 
            +
                    weekday_blank: '%_d',
         | 
| 10 | 
            +
                    weekday_padded: '%d',
         | 
| 11 | 
            +
                    weekday_unpadded: '%-d',
         | 
| 12 | 
            +
                    weekday_name: '%A',
         | 
| 13 | 
            +
                    weekday_name_abbr: '%a',
         | 
| 14 | 
            +
                    month: '%m',
         | 
| 15 | 
            +
                    month_blank: '%_m',
         | 
| 16 | 
            +
                    month_padded: '%m',
         | 
| 17 | 
            +
                    month_unpadded: '%-m',
         | 
| 18 | 
            +
                    month_name: '%B',
         | 
| 19 | 
            +
                    month_name_abbr: '%b',
         | 
| 20 | 
            +
                    week_iso: '%V',
         | 
| 21 | 
            +
                    week_monday: '%W',
         | 
| 22 | 
            +
                    week_sunday: '%U',
         | 
| 23 | 
            +
                    year: '%Y',
         | 
| 24 | 
            +
                    yr: '%y',
         | 
| 25 | 
            +
                    year_abbr: '%y',
         | 
| 26 | 
            +
                    day: '%B %-d',
         | 
| 27 | 
            +
                    day_abbr: '%b %-d',
         | 
| 28 | 
            +
                    day_iso: '%m-%d',
         | 
| 29 | 
            +
                    month_year: '%m %Y',
         | 
| 30 | 
            +
                    month_blank_year: '%_m %Y',
         | 
| 31 | 
            +
                    month_padded_year: '%m %Y',
         | 
| 32 | 
            +
                    month_unpadded_year: '%-m %Y',
         | 
| 33 | 
            +
                    month_name_year: '%B %Y',
         | 
| 34 | 
            +
                    month_name_abbr_year: '%b %Y',
         | 
| 35 | 
            +
                    week_year_iso: '%V-%G',
         | 
| 36 | 
            +
                    year_day: '%Y-%m-%d',
         | 
| 37 | 
            +
                    year_month: '%Y-%m',
         | 
| 38 | 
            +
                    year_week: '%G-%V',
         | 
| 39 | 
            +
                    date: '%B %-d, %Y',
         | 
| 40 | 
            +
                    date_abbr: '%b %-d, %Y',
         | 
| 41 | 
            +
                    date_iso: '%Y-%m-%d'
         | 
| 42 | 
            +
                  }.freeze
         | 
| 43 | 
            +
                  DATE_UNITS ||= {
         | 
| 44 | 
            +
                    w: 'u',
         | 
| 45 | 
            +
                    weekday: 'u',
         | 
| 46 | 
            +
                    ww: 'w',
         | 
| 47 | 
            +
                    weekday_offset: 'w',
         | 
| 48 | 
            +
                    www: 'A',
         | 
| 49 | 
            +
                    weekday_name: 'A',
         | 
| 50 | 
            +
                    wwww: 'a',
         | 
| 51 | 
            +
                    weekday_name_abbr: 'a',
         | 
| 52 | 
            +
                    d: 'd',
         | 
| 53 | 
            +
                    day: 'd',
         | 
| 54 | 
            +
                    day_padded: 'd',
         | 
| 55 | 
            +
                    dd: '-d',
         | 
| 56 | 
            +
                    Day: '-d',
         | 
| 57 | 
            +
                    day_unpadded: '-d',
         | 
| 58 | 
            +
                    ddd: '_d',
         | 
| 59 | 
            +
                    DAY: '_d',
         | 
| 60 | 
            +
                    day_blank: '_d',
         | 
| 61 | 
            +
                    dddd: 'j',
         | 
| 62 | 
            +
                    day_of_the_year: 'j',
         | 
| 63 | 
            +
                    m: 'm',
         | 
| 64 | 
            +
                    month: 'm',
         | 
| 65 | 
            +
                    month_padded: 'm',
         | 
| 66 | 
            +
                    mm: '-m',
         | 
| 67 | 
            +
                    Month: '-m',
         | 
| 68 | 
            +
                    month_unpadded: '-m',
         | 
| 69 | 
            +
                    mmm: '_m',
         | 
| 70 | 
            +
                    MONTH: '_m',
         | 
| 71 | 
            +
                    month_blank: '_m',
         | 
| 72 | 
            +
                    mmmm: 'B',
         | 
| 73 | 
            +
                    month_name: 'B',
         | 
| 74 | 
            +
                    mmmmm: 'b',
         | 
| 75 | 
            +
                    month_name_abbr: 'b',
         | 
| 76 | 
            +
                    swe: 'U',
         | 
| 77 | 
            +
                    sunday_week: 'U',
         | 
| 78 | 
            +
                    mwe: 'W',
         | 
| 79 | 
            +
                    monday_week: 'W',
         | 
| 80 | 
            +
                    we: 'V',
         | 
| 81 | 
            +
                    week: 'V',
         | 
| 82 | 
            +
                    yy: 'y',
         | 
| 83 | 
            +
                    yr: 'y',
         | 
| 84 | 
            +
                    year: 'Y',
         | 
| 85 | 
            +
                    yyyy: 'Y'
         | 
| 86 | 
            +
                  }.freeze
         | 
| 87 | 
            +
             | 
| 88 | 
            +
                  def format(string = nil)
         | 
| 89 | 
            +
                    string ||= default_format
         | 
| 90 | 
            +
                    delimiters = string.scan(/\W+/)
         | 
| 91 | 
            +
                    formatters = string.scan(/[a-z0-9_]+/i)
         | 
| 92 | 
            +
                    string = formatters.map { |key| "%#{format_for(key.to_sym)}#{delimiters.shift}" }
         | 
| 93 | 
            +
                    strftime(string.join)
         | 
| 94 | 
            +
                  end
         | 
| 95 | 
            +
             | 
| 96 | 
            +
                  def stamp(key = nil)
         | 
| 97 | 
            +
                    key = stamp_for(key&.to_sym || default_stamp)
         | 
| 98 | 
            +
                    strftime(key)
         | 
| 99 | 
            +
                  end
         | 
| 100 | 
            +
             | 
| 101 | 
            +
                  alias to_format stamp
         | 
| 102 | 
            +
             | 
| 103 | 
            +
                end
         | 
| 104 | 
            +
              end
         | 
| 105 | 
            +
            end
         | 
| @@ -0,0 +1,84 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Lite
         | 
| 4 | 
            +
              module Ruby
         | 
| 5 | 
            +
                module TimeHelper
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                  TIME_STAMPS ||= {
         | 
| 8 | 
            +
                    hour: '%H',
         | 
| 9 | 
            +
                    hour_blank: '%k',
         | 
| 10 | 
            +
                    hour_padded: '%H',
         | 
| 11 | 
            +
                    hour_12: '%I',
         | 
| 12 | 
            +
                    hour_12_padded: '%I',
         | 
| 13 | 
            +
                    hour_12_blank: '%l',
         | 
| 14 | 
            +
                    minute: '%M',
         | 
| 15 | 
            +
                    second: '%S',
         | 
| 16 | 
            +
                    ampm: '%P',
         | 
| 17 | 
            +
                    meridian: '%p',
         | 
| 18 | 
            +
                    time_zone: '%z',
         | 
| 19 | 
            +
                    time_zone_offset: '%:z',
         | 
| 20 | 
            +
                    time_zone_offset_full: '%::z',
         | 
| 21 | 
            +
                    time_zone_name: '%Z',
         | 
| 22 | 
            +
                    time: '%H:%M',
         | 
| 23 | 
            +
                    time_blank: '%k:%M',
         | 
| 24 | 
            +
                    time_padded: '%H:%M',
         | 
| 25 | 
            +
                    time_tz: '%H:%M %z',
         | 
| 26 | 
            +
                    time_tzn: '%H:%M %Z',
         | 
| 27 | 
            +
                    time_12: '%I:%M %P',
         | 
| 28 | 
            +
                    time_12_padded: '%I:%M %P',
         | 
| 29 | 
            +
                    time_12_blank: '%l:%M %P',
         | 
| 30 | 
            +
                    time_12_tz: '%I:%M %P %z',
         | 
| 31 | 
            +
                    time_12_tzn: '%I:%M %P %Z',
         | 
| 32 | 
            +
                    daytime: '%B %-d %H:%M',
         | 
| 33 | 
            +
                    daytime_abbr: '%b %-d %H:%M',
         | 
| 34 | 
            +
                    daytime_iso: '%m-%d %H:%M',
         | 
| 35 | 
            +
                    daytime_12: '%B %-d %I:%M %P',
         | 
| 36 | 
            +
                    daytime_12_abbr: '%b %-d %I:%M %P',
         | 
| 37 | 
            +
                    daytime_12_iso: '%m-%d %I:%M %P',
         | 
| 38 | 
            +
                    datetime: '%B %-d, %Y %H:%M',
         | 
| 39 | 
            +
                    datetime_abbr: '%b %-d, %Y %H:%M',
         | 
| 40 | 
            +
                    datetime_iso: '%Y-%m-%d %H:%M',
         | 
| 41 | 
            +
                    datetime_12: '%B %-d, %Y %I:%M %P',
         | 
| 42 | 
            +
                    datetime_12_abbr: '%b %-d, %Y %I:%M %P',
         | 
| 43 | 
            +
                    datetime_12_iso: '%Y-%m-%d %I:%M %P',
         | 
| 44 | 
            +
                    datetime_tzn: '%B %-d, %Y %H:%M %Z',
         | 
| 45 | 
            +
                    datetime_abbr_tzn: '%b %-d, %Y %H:%M %Z',
         | 
| 46 | 
            +
                    datetime_iso_tzn: '%Y-%m-%d %H:%M %z',
         | 
| 47 | 
            +
                    datetime_12_tzn: '%B %-d, %Y %I:%M %P %Z',
         | 
| 48 | 
            +
                    datetime_12_abbr_tzn: '%b %-d, %Y %I:%M %P %Z',
         | 
| 49 | 
            +
                    datetime_12_iso_tzn: '%Y-%m-%d %I:%M %P %z'
         | 
| 50 | 
            +
                  }.freeze
         | 
| 51 | 
            +
                  TIME_UNITS = {
         | 
| 52 | 
            +
                    h: 'H',
         | 
| 53 | 
            +
                    hour: 'H',
         | 
| 54 | 
            +
                    hour_padded: 'H',
         | 
| 55 | 
            +
                    hh: 'k',
         | 
| 56 | 
            +
                    HOUR: 'k',
         | 
| 57 | 
            +
                    hour_blank: 'k',
         | 
| 58 | 
            +
                    hhh: 'I',
         | 
| 59 | 
            +
                    hour_12: 'I',
         | 
| 60 | 
            +
                    hour_12_padded: 'I',
         | 
| 61 | 
            +
                    hhhh: 'l',
         | 
| 62 | 
            +
                    HOUR_12: 'l',
         | 
| 63 | 
            +
                    hour_12_blank: 'l',
         | 
| 64 | 
            +
                    n: 'M',
         | 
| 65 | 
            +
                    minute: 'M',
         | 
| 66 | 
            +
                    s: 'S',
         | 
| 67 | 
            +
                    second: 'S',
         | 
| 68 | 
            +
                    ampm: 'P',
         | 
| 69 | 
            +
                    meridian: 'P',
         | 
| 70 | 
            +
                    AMPM: 'p',
         | 
| 71 | 
            +
                    MERIDIAN: 'p',
         | 
| 72 | 
            +
                    z: 'z',
         | 
| 73 | 
            +
                    time_zone: 'z',
         | 
| 74 | 
            +
                    zz: ':z',
         | 
| 75 | 
            +
                    time_zone_offset: ':z',
         | 
| 76 | 
            +
                    zzz: '::z',
         | 
| 77 | 
            +
                    time_zone_offset_full: '::z',
         | 
| 78 | 
            +
                    zzzz: 'Z',
         | 
| 79 | 
            +
                    time_zone_name: 'Z'
         | 
| 80 | 
            +
                  }.freeze
         | 
| 81 | 
            +
             | 
| 82 | 
            +
                end
         | 
| 83 | 
            +
              end
         | 
| 84 | 
            +
            end
         | 
| @@ -0,0 +1,45 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            class Integer
         | 
| 4 | 
            +
             | 
| 5 | 
            +
              ROMAN_NUMERALS ||= {
         | 
| 6 | 
            +
                M: 1000, CM: 900, D: 500, CD: 400, C: 100, XC: 90, L: 50, XL: 40, X: 10, IX: 9, V: 5, IV: 4,
         | 
| 7 | 
            +
                I: 1
         | 
| 8 | 
            +
              }.freeze
         | 
| 9 | 
            +
             | 
| 10 | 
            +
              def factorial
         | 
| 11 | 
            +
                return 1 if zero?
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                2.upto(self).inject(1) { |acc, i| acc * i }
         | 
| 14 | 
            +
              end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
              def factors
         | 
| 17 | 
            +
                limit = Math.sqrt(self).floor
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                (1..limit).each_with_object([]) do |i, array|
         | 
| 20 | 
            +
                  next unless (self % i).zero?
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                  sq = (self / i)
         | 
| 23 | 
            +
                  array.push(i)
         | 
| 24 | 
            +
                  array.push(sq) if sq != i
         | 
| 25 | 
            +
                end
         | 
| 26 | 
            +
              end
         | 
| 27 | 
            +
             | 
| 28 | 
            +
              def of(&block)
         | 
| 29 | 
            +
                Array.new(self, &block)
         | 
| 30 | 
            +
              end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
              def roman_numeral
         | 
| 33 | 
            +
                return '' if zero?
         | 
| 34 | 
            +
                return "-#{(-self).roman_numeral}" if negative?
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                ROMAN_NUMERALS.each { |key, val| break "#{key}#{(self - val).roman_numeral}" if val <= self }
         | 
| 37 | 
            +
              end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
              def to_time
         | 
| 40 | 
            +
                Time.at(self)
         | 
| 41 | 
            +
              end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
              alias to_t to_time unless defined?(to_t)
         | 
| 44 | 
            +
             | 
| 45 | 
            +
            end
         | 
| @@ -0,0 +1,29 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Kernel
         | 
| 4 | 
            +
             | 
| 5 | 
            +
              # rubocop:disable Lint/RescueException, Security/Eval
         | 
| 6 | 
            +
              def safe_eval
         | 
| 7 | 
            +
                eval(self)
         | 
| 8 | 
            +
              rescue Exception
         | 
| 9 | 
            +
                self
         | 
| 10 | 
            +
              end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
              def try_eval
         | 
| 13 | 
            +
                val = /\[\d*,?\d*,?\d*\]/.match(to_s).to_s
         | 
| 14 | 
            +
                return val if val.nil?
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                eval(val)
         | 
| 17 | 
            +
              end
         | 
| 18 | 
            +
              # rubocop:enable Lint/RescueException, Security/Eval
         | 
| 19 | 
            +
             | 
| 20 | 
            +
              private
         | 
| 21 | 
            +
             | 
| 22 | 
            +
              def caller_name(depth = 0)
         | 
| 23 | 
            +
                val = caller[depth][/`([^']*)'/, 1]
         | 
| 24 | 
            +
                return val if depth.zero? || !val.include?('<top (required)>')
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                caller[depth - 1][/`([^']*)'/, 1]
         | 
| 27 | 
            +
              end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
            end
         | 
| @@ -0,0 +1,210 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            class Numeric
         | 
| 4 | 
            +
             | 
| 5 | 
            +
              def add(num)
         | 
| 6 | 
            +
                self + num
         | 
| 7 | 
            +
              end
         | 
| 8 | 
            +
             | 
| 9 | 
            +
              # rubocop:disable Metrics/MethodLength
         | 
| 10 | 
            +
              def clamp(minimum, maximum = nil)
         | 
| 11 | 
            +
                if minimum.is_a?(Range)
         | 
| 12 | 
            +
                  maximum = minimum.max
         | 
| 13 | 
            +
                  minimum = minimum.min
         | 
| 14 | 
            +
                end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                if minimum > self
         | 
| 17 | 
            +
                  minimum
         | 
| 18 | 
            +
                elsif maximum < self
         | 
| 19 | 
            +
                  maximum
         | 
| 20 | 
            +
                else
         | 
| 21 | 
            +
                  self
         | 
| 22 | 
            +
                end
         | 
| 23 | 
            +
              end
         | 
| 24 | 
            +
              # rubocop:enable Metrics/MethodLength
         | 
| 25 | 
            +
             | 
| 26 | 
            +
              def decrement(amount = 1.0)
         | 
| 27 | 
            +
                self - amount
         | 
| 28 | 
            +
              end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
              def distance(num)
         | 
| 31 | 
            +
                (self - num).abs
         | 
| 32 | 
            +
              end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
              def divide(num)
         | 
| 35 | 
            +
                return num if num.zero?
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                self / num
         | 
| 38 | 
            +
              end
         | 
| 39 | 
            +
             | 
| 40 | 
            +
              def equal_to?(num)
         | 
| 41 | 
            +
                self == num
         | 
| 42 | 
            +
              end
         | 
| 43 | 
            +
             | 
| 44 | 
            +
              alias eq? equal_to?
         | 
| 45 | 
            +
             | 
| 46 | 
            +
              def fraction
         | 
| 47 | 
            +
                (self - truncate).abs
         | 
| 48 | 
            +
              end
         | 
| 49 | 
            +
             | 
| 50 | 
            +
              def fraction?
         | 
| 51 | 
            +
                fraction != 0.0
         | 
| 52 | 
            +
              end
         | 
| 53 | 
            +
             | 
| 54 | 
            +
              def greater_than?(num)
         | 
| 55 | 
            +
                num < self
         | 
| 56 | 
            +
              end
         | 
| 57 | 
            +
             | 
| 58 | 
            +
              alias gt? greater_than?
         | 
| 59 | 
            +
             | 
| 60 | 
            +
              def greater_than_or_equal_to?(num)
         | 
| 61 | 
            +
                num <= self
         | 
| 62 | 
            +
              end
         | 
| 63 | 
            +
             | 
| 64 | 
            +
              alias gteq? greater_than_or_equal_to?
         | 
| 65 | 
            +
             | 
| 66 | 
            +
              def increment(amount = 1.0)
         | 
| 67 | 
            +
                self + amount
         | 
| 68 | 
            +
              end
         | 
| 69 | 
            +
             | 
| 70 | 
            +
              def inside?(start, finish)
         | 
| 71 | 
            +
                (start < self) && (finish > self)
         | 
| 72 | 
            +
              end
         | 
| 73 | 
            +
             | 
| 74 | 
            +
              def less_than?(num)
         | 
| 75 | 
            +
                num > self
         | 
| 76 | 
            +
              end
         | 
| 77 | 
            +
             | 
| 78 | 
            +
              alias lt? less_than?
         | 
| 79 | 
            +
             | 
| 80 | 
            +
              def less_than_or_equal_to?(num)
         | 
| 81 | 
            +
                num >= self
         | 
| 82 | 
            +
              end
         | 
| 83 | 
            +
             | 
| 84 | 
            +
              alias lteq? less_than_or_equal_to?
         | 
| 85 | 
            +
             | 
| 86 | 
            +
              def multiply(num)
         | 
| 87 | 
            +
                self * num
         | 
| 88 | 
            +
              end
         | 
| 89 | 
            +
             | 
| 90 | 
            +
              def multiple_of?(number)
         | 
| 91 | 
            +
                return zero? if number.zero?
         | 
| 92 | 
            +
             | 
| 93 | 
            +
                modulo(number).zero?
         | 
| 94 | 
            +
              end
         | 
| 95 | 
            +
             | 
| 96 | 
            +
              def not_equal_to?(num)
         | 
| 97 | 
            +
                self != num
         | 
| 98 | 
            +
              end
         | 
| 99 | 
            +
             | 
| 100 | 
            +
              alias not_eq? not_equal_to?
         | 
| 101 | 
            +
              alias inequal_to? not_equal_to?
         | 
| 102 | 
            +
              alias ineq? not_equal_to?
         | 
| 103 | 
            +
             | 
| 104 | 
            +
              def ordinal
         | 
| 105 | 
            +
                return 'th' if (11..13).cover?(abs % 100)
         | 
| 106 | 
            +
             | 
| 107 | 
            +
                case abs % 10
         | 
| 108 | 
            +
                when 1 then 'st'
         | 
| 109 | 
            +
                when 2 then 'nd'
         | 
| 110 | 
            +
                when 3 then 'rd'
         | 
| 111 | 
            +
                else 'th'
         | 
| 112 | 
            +
                end
         | 
| 113 | 
            +
              end
         | 
| 114 | 
            +
             | 
| 115 | 
            +
              def ordinalize
         | 
| 116 | 
            +
                "#{self}#{ordinal}"
         | 
| 117 | 
            +
              end
         | 
| 118 | 
            +
             | 
| 119 | 
            +
              def outside?(start, finish)
         | 
| 120 | 
            +
                (start > self) || (finish < self)
         | 
| 121 | 
            +
              end
         | 
| 122 | 
            +
             | 
| 123 | 
            +
              def pad(options = {})
         | 
| 124 | 
            +
                pad_number = options[:pad_number] || 0
         | 
| 125 | 
            +
                precision = options[:precision] || 3
         | 
| 126 | 
            +
             | 
| 127 | 
            +
                to_s.rjust(precision, pad_number.to_s)
         | 
| 128 | 
            +
              end
         | 
| 129 | 
            +
             | 
| 130 | 
            +
              # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity
         | 
| 131 | 
            +
              # rubocop:disable Metrics/MethodLength, Metrics/PerceivedComplexity
         | 
| 132 | 
            +
              def pad_precision(options = {})
         | 
| 133 | 
            +
                pad_number = options[:pad_number] || 0
         | 
| 134 | 
            +
                precision = options[:precision] || 2
         | 
| 135 | 
            +
                separator = options[:separator] || '.'
         | 
| 136 | 
            +
                string = to_s
         | 
| 137 | 
            +
             | 
| 138 | 
            +
                string << separator unless string.include?(separator)
         | 
| 139 | 
            +
                ljust_count = string.split(separator).first.length
         | 
| 140 | 
            +
                ljust_count += (string.count(separator) + precision) if precision.positive?
         | 
| 141 | 
            +
             | 
| 142 | 
            +
                if ljust_count >= string.length
         | 
| 143 | 
            +
                  string.ljust(ljust_count, pad_number.to_s)
         | 
| 144 | 
            +
                else
         | 
| 145 | 
            +
                  string[0..(ljust_count - 1)]
         | 
| 146 | 
            +
                end
         | 
| 147 | 
            +
              end
         | 
| 148 | 
            +
              # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity
         | 
| 149 | 
            +
              # rubocop:enable Metrics/MethodLength, Metrics/PerceivedComplexity
         | 
| 150 | 
            +
             | 
| 151 | 
            +
              def percentage_of(number)
         | 
| 152 | 
            +
                return 0 if zero? || number.zero?
         | 
| 153 | 
            +
             | 
| 154 | 
            +
                (self / number.to_f) * 100.0
         | 
| 155 | 
            +
              end
         | 
| 156 | 
            +
             | 
| 157 | 
            +
              def power(num)
         | 
| 158 | 
            +
                self**num
         | 
| 159 | 
            +
              end
         | 
| 160 | 
            +
             | 
| 161 | 
            +
              def root(num)
         | 
| 162 | 
            +
                self**(1.0 / num)
         | 
| 163 | 
            +
              end
         | 
| 164 | 
            +
             | 
| 165 | 
            +
              def subtract(num)
         | 
| 166 | 
            +
                self - num
         | 
| 167 | 
            +
              end
         | 
| 168 | 
            +
             | 
| 169 | 
            +
              def to_currency(options = {})
         | 
| 170 | 
            +
                unit = options[:unit] || '$'
         | 
| 171 | 
            +
             | 
| 172 | 
            +
                "#{unit}#{pad_precision(options.only(:precision))}"
         | 
| 173 | 
            +
              end
         | 
| 174 | 
            +
             | 
| 175 | 
            +
              def to_nearest_value(values = [])
         | 
| 176 | 
            +
                return self if values.length.zero?
         | 
| 177 | 
            +
             | 
| 178 | 
            +
                value = values.first
         | 
| 179 | 
            +
                difference = (self - value).abs
         | 
| 180 | 
            +
             | 
| 181 | 
            +
                values.each do |val|
         | 
| 182 | 
            +
                  next unless (self - val).abs < difference
         | 
| 183 | 
            +
             | 
| 184 | 
            +
                  difference = (self - val).abs
         | 
| 185 | 
            +
                  value = val
         | 
| 186 | 
            +
                end
         | 
| 187 | 
            +
             | 
| 188 | 
            +
                value
         | 
| 189 | 
            +
              end
         | 
| 190 | 
            +
             | 
| 191 | 
            +
              def to_percentage(options = {})
         | 
| 192 | 
            +
                unit = options[:unit] || '%'
         | 
| 193 | 
            +
             | 
| 194 | 
            +
                "#{pad_precision(options.only(:precision))}#{unit}"
         | 
| 195 | 
            +
              end
         | 
| 196 | 
            +
             | 
| 197 | 
            +
              def within?(number, epsilon = 0.01)
         | 
| 198 | 
            +
                return number == self if epsilon.zero?
         | 
| 199 | 
            +
             | 
| 200 | 
            +
                alpha = to_f
         | 
| 201 | 
            +
                beta = number.to_f
         | 
| 202 | 
            +
             | 
| 203 | 
            +
                if alpha.zero? || beta.zero?
         | 
| 204 | 
            +
                  (alpha - beta).abs < epsilon
         | 
| 205 | 
            +
                else
         | 
| 206 | 
            +
                  (alpha / beta - 1).abs < epsilon
         | 
| 207 | 
            +
                end
         | 
| 208 | 
            +
              end
         | 
| 209 | 
            +
             | 
| 210 | 
            +
            end
         |