theusual 0.0.7 → 0.0.8
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 +4 -4
- data/lib/theusual/time.rb +74 -15
- data/lib/theusual/version.rb +1 -1
- data/test/test_time.rb +38 -6
- metadata +2 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 7dacb5e7a014566aa0c349f8d1ebf456a7668657
         | 
| 4 | 
            +
              data.tar.gz: b7ef75744482e6bffd73885d698337619e130ac4
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: dc9842b4be2725073029d4fae4c424df5ea22cf7af53fa669c36cf8ab85fde7bdff882a5f05348b9b7385912e52a9cca759989be4715ee36922732eba7e82739
         | 
| 7 | 
            +
              data.tar.gz: 65cf8436c7fa60ed4b15f32267c5d5a15a8432f965a87e724cc5ed9bdd85a0f322e23c05384a8d2a1398bcfcca8eb79f925fd5ca061e13d6ac8812d975846a19
         | 
    
        data/lib/theusual/time.rb
    CHANGED
    
    | @@ -1,4 +1,8 @@ | |
| 1 1 | 
             
            class Time
         | 
| 2 | 
            +
              MINUTES_IN_THREE_QUARTERS_YEAR = 394200
         | 
| 3 | 
            +
              MINUTES_IN_QUARTER_YEAR = 131400
         | 
| 4 | 
            +
              MINUTES_IN_YEAR = 525600
         | 
| 5 | 
            +
             | 
| 2 6 |  | 
| 3 7 | 
             
              def self.at_ms ms
         | 
| 4 8 | 
             
                # convert an integer representing Unix time in milliseconds
         | 
| @@ -10,23 +14,78 @@ class Time | |
| 10 14 | 
             
                (to_f * 1_000).to_i
         | 
| 11 15 | 
             
              end
         | 
| 12 16 |  | 
| 17 | 
            +
              # inspired by actionview/lib/action_view/helpers/date_helper.rb
         | 
| 18 | 
            +
              def humanize(to_time = nil, options = {})
         | 
| 19 | 
            +
                from_time = self.utc
         | 
| 20 | 
            +
                to_time ||= Time.now.utc
         | 
| 21 | 
            +
                from_time, to_time = to_time, from_time if from_time > to_time
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                distance_in_minutes = ((to_time.to_i - from_time.to_i) / 60.0).to_i
         | 
| 24 | 
            +
                distance_in_seconds = (to_time.to_i - from_time.to_i).to_i
         | 
| 13 25 |  | 
| 14 | 
            -
             | 
| 15 | 
            -
                 | 
| 16 | 
            -
             | 
| 17 | 
            -
             | 
| 18 | 
            -
             | 
| 19 | 
            -
             | 
| 20 | 
            -
             | 
| 21 | 
            -
             | 
| 22 | 
            -
             | 
| 23 | 
            -
             | 
| 24 | 
            -
             | 
| 25 | 
            -
             | 
| 26 | 
            -
                   | 
| 27 | 
            -
             | 
| 28 | 
            -
             | 
| 26 | 
            +
                res = case distance_in_minutes
         | 
| 27 | 
            +
                when 0
         | 
| 28 | 
            +
                  if options[:seconds]
         | 
| 29 | 
            +
                    case distance_in_seconds
         | 
| 30 | 
            +
                      when 1      then [ :a_second ]
         | 
| 31 | 
            +
                      when 2..4   then [ :less_than_x_seconds, 5 ]
         | 
| 32 | 
            +
                      when 5..9   then [ :less_than_x_seconds, 10 ]
         | 
| 33 | 
            +
                      when 10..29 then [ :less_than_x_seconds, 30 ]
         | 
| 34 | 
            +
                      when 30..39 then [ :half_a_minute ]
         | 
| 35 | 
            +
                      when 40..59 then [ :less_than_a_minute ]
         | 
| 36 | 
            +
                      else             [ :a_minute ]
         | 
| 37 | 
            +
                    end
         | 
| 38 | 
            +
                  else
         | 
| 39 | 
            +
                    if distance_in_seconds == 0
         | 
| 40 | 
            +
                      [ :just_now ]
         | 
| 41 | 
            +
                    else
         | 
| 42 | 
            +
                      [ :less_than_a_minute ]
         | 
| 43 | 
            +
                    end
         | 
| 44 | 
            +
                  end
         | 
| 45 | 
            +
                when 1                then [ :a_minute ]
         | 
| 46 | 
            +
                when 2...45           then [ :x_minutes,      distance_in_minutes ]
         | 
| 47 | 
            +
                when 45...59          then [ :about_an_hour ]
         | 
| 48 | 
            +
                when 60               then [ :an_hour ]
         | 
| 49 | 
            +
                when 61...90          then [ :about_an_hour ]
         | 
| 50 | 
            +
                # 90 mins up to 24 hours
         | 
| 51 | 
            +
                when 90...1440        then [ :about_x_hours,  (distance_in_minutes.to_f / 60.0).round ]
         | 
| 52 | 
            +
                # 24 hours up to  hours
         | 
| 53 | 
            +
                when 1440...2160      then [ :a_day ]
         | 
| 54 | 
            +
                # 36 hours up to 30 days
         | 
| 55 | 
            +
                when 2160...43200     then [ :x_days,         (distance_in_minutes.to_f / 1440.0).round ]
         | 
| 56 | 
            +
                # 30 days up to 60 days
         | 
| 57 | 
            +
                when 43200...86400    then [ :about_x_months, (distance_in_minutes.to_f / 43200.0).round ]
         | 
| 58 | 
            +
                # 60 days up to 365 days
         | 
| 59 | 
            +
                when 86400...525600   then [ :x_months,       (distance_in_minutes.to_f / 43200.0).round ]
         | 
| 60 | 
            +
                else
         | 
| 61 | 
            +
                  fyear = from_time.year
         | 
| 62 | 
            +
                  fyear += 1 if from_time.month >= 3
         | 
| 63 | 
            +
                  tyear = to_time.year
         | 
| 64 | 
            +
                  tyear -= 1 if to_time.month < 3
         | 
| 65 | 
            +
                  leap_years = (fyear > tyear) ? 0 : (fyear..tyear).count{|x| Date.leap?(x)}
         | 
| 66 | 
            +
                  minute_offset_for_leap_year = leap_years * 1440
         | 
| 67 | 
            +
                  # Discount the leap year days when calculating year distance.
         | 
| 68 | 
            +
                  # e.g. if there are 20 leap year days between 2 dates having the same day
         | 
| 69 | 
            +
                  # and month then the based on 365 days calculation
         | 
| 70 | 
            +
                  # the distance in years will come out to over 80 years when in written
         | 
| 71 | 
            +
                  # English it would read better as about 80 years.
         | 
| 72 | 
            +
                  minutes_with_offset = distance_in_minutes - minute_offset_for_leap_year
         | 
| 73 | 
            +
                  remainder                   = (minutes_with_offset % MINUTES_IN_YEAR)
         | 
| 74 | 
            +
                  distance_in_years           = (minutes_with_offset.div MINUTES_IN_YEAR)
         | 
| 75 | 
            +
                  if remainder < MINUTES_IN_QUARTER_YEAR
         | 
| 76 | 
            +
                    [ :about_x_years,  distance_in_years ]
         | 
| 77 | 
            +
                  elsif remainder < MINUTES_IN_THREE_QUARTERS_YEAR
         | 
| 78 | 
            +
                    [ :over_x_years,   distance_in_years ]
         | 
| 79 | 
            +
                  else
         | 
| 80 | 
            +
                    [ :almost_x_years, distance_in_years + 1 ]
         | 
| 81 | 
            +
                  end
         | 
| 29 82 | 
             
                end
         | 
| 83 | 
            +
             | 
| 84 | 
            +
                if res.count > 1
         | 
| 85 | 
            +
                  res.first.to_s.sub 'x', res.last.to_s
         | 
| 86 | 
            +
                else
         | 
| 87 | 
            +
                  res.first.to_s
         | 
| 88 | 
            +
                end.gsub '_', ' '
         | 
| 30 89 | 
             
              end
         | 
| 31 90 |  | 
| 32 91 | 
             
            end
         | 
    
        data/lib/theusual/version.rb
    CHANGED
    
    
    
        data/test/test_time.rb
    CHANGED
    
    | @@ -5,26 +5,58 @@ TheUsual::load 'time' | |
| 5 5 |  | 
| 6 6 | 
             
            class TimeTest < Minitest::Test
         | 
| 7 7 |  | 
| 8 | 
            -
              def  | 
| 8 | 
            +
              def test_ms
         | 
| 9 | 
            +
                ts = Time.now.utc
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                assert(ts.to_ms.class < Integer)
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                assert(
         | 
| 14 | 
            +
                  # to_ms will truncate, so allow for small error
         | 
| 15 | 
            +
                  ts - Time.at_ms(ts.to_ms) <= 0.001
         | 
| 16 | 
            +
                )
         | 
| 17 | 
            +
              end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
             | 
| 20 | 
            +
              def test_humanize
         | 
| 9 21 | 
             
                assert_equal(
         | 
| 10 22 | 
             
                  'just now',
         | 
| 11 23 | 
             
                  Time.new.humanize
         | 
| 12 24 | 
             
                )
         | 
| 13 25 |  | 
| 14 26 | 
             
                assert_equal(
         | 
| 15 | 
            -
                  'a  | 
| 16 | 
            -
                  (Time.new -  | 
| 27 | 
            +
                  'less than a minute',
         | 
| 28 | 
            +
                  (Time.new - 50).humanize
         | 
| 17 29 | 
             
                )
         | 
| 18 30 |  | 
| 19 31 | 
             
                assert_equal(
         | 
| 20 | 
            -
                  ' | 
| 21 | 
            -
                  (Time.new -  | 
| 32 | 
            +
                  'a second',
         | 
| 33 | 
            +
                  (Time.new - 1).humanize(nil, seconds: true)
         | 
| 22 34 | 
             
                )
         | 
| 23 35 |  | 
| 24 36 | 
             
                assert_equal(
         | 
| 25 | 
            -
                  'a minute | 
| 37 | 
            +
                  'a minute',
         | 
| 26 38 | 
             
                  (Time.new - 60).humanize
         | 
| 27 39 | 
             
                )
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                assert_equal(
         | 
| 42 | 
            +
                  'an hour',
         | 
| 43 | 
            +
                  (Time.new - 60 * 60).humanize
         | 
| 44 | 
            +
                )
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                assert_equal(
         | 
| 47 | 
            +
                  'an hour',
         | 
| 48 | 
            +
                  (Time.new - 60 * 60 - 5).humanize
         | 
| 49 | 
            +
                )
         | 
| 50 | 
            +
             | 
| 51 | 
            +
                assert_equal(
         | 
| 52 | 
            +
                  'about an hour',
         | 
| 53 | 
            +
                  (Time.new - 60 * 61).humanize
         | 
| 54 | 
            +
                )
         | 
| 55 | 
            +
             | 
| 56 | 
            +
                assert_equal(
         | 
| 57 | 
            +
                  'a day',
         | 
| 58 | 
            +
                  (Time.new - 60 * 60 * 24).humanize
         | 
| 59 | 
            +
                )
         | 
| 28 60 | 
             
              end
         | 
| 29 61 |  | 
| 30 62 | 
             
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: theusual
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.0. | 
| 4 | 
            +
              version: 0.0.8
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Daniel Pepper
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2017-02- | 
| 11 | 
            +
            date: 2017-02-22 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: rake
         |