Advertisement
Guest User

Untitled

a guest
Jul 30th, 2015
209
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.58 KB | None | 0 0
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4.  
  5. use Carp qw[];
  6. use Time::Moment 0.19 qw[];
  7.  
  8. sub YEAR () { 365.2425 }
  9. sub MONTH () { YEAR / 12 }
  10. sub DAY () { 1 }
  11. sub HOUR () { DAY / 24 }
  12. sub MINUTE () { HOUR / 60 }
  13. sub SECOND () { MINUTE / 60 }
  14.  
  15. sub ago {
  16. @_ == 1 or Carp::croak(q/Usage: ago(moment)/);
  17. my ($moment) = @_;
  18.  
  19. my $now = Time::Moment->now;
  20.  
  21. ($now->compare($moment) >= 0)
  22. or Carp::croak(q/Given moment is in the future/);
  23.  
  24. my $d = $now->mjd - $moment->mjd;
  25.  
  26. if ($d < 0.75 * DAY) {
  27. if ($d < 0.75 * MINUTE) {
  28. return 'a few seconds ago';
  29. }
  30. elsif ($d < 1.5 * MINUTE) {
  31. return 'a minute ago';
  32. }
  33. elsif ($d < 0.75 * HOUR) {
  34. return sprintf '%d minutes ago', $d / MINUTE + 0.5;
  35. }
  36. elsif ($d < 1.5 * HOUR) {
  37. return 'an hour ago';
  38. }
  39. else {
  40. return sprintf '%d hours ago', $d / HOUR + 0.5;
  41. }
  42. }
  43. else {
  44. if ($d < 1.5 * DAY) {
  45. return 'a day ago';
  46. }
  47. elsif ($d < 0.75 * MONTH) {
  48. return sprintf '%d days ago', $d / DAY + 0.5;
  49. }
  50. elsif ($d < 1.5 * MONTH) {
  51. return 'a month ago';
  52. }
  53. elsif ($d < 0.75 * YEAR) {
  54. return sprintf '%d months ago', $d / MONTH + 0.5;
  55. }
  56. elsif ($d < 1.5 * YEAR) {
  57. return 'a year ago';
  58. }
  59. else {
  60. return sprintf '%d years ago', $d / YEAR + 0.5;
  61. }
  62. }
  63. }
  64.  
  65. my @tests = (
  66. [ SECOND * 10, 'a few seconds ago' ],
  67. [ MINUTE * 1, 'a minute ago' ],
  68. [ SECOND * 75, 'a minute ago' ],
  69. [ MINUTE * 30, '30 minutes ago' ],
  70. [ HOUR * 1, 'an hour ago' ],
  71. [ HOUR * 2, '2 hours ago' ],
  72. [ DAY * 1, 'a day ago' ],
  73. [ DAY * 20, '20 days ago' ],
  74. [ MONTH * 1, 'a month ago' ],
  75. [ MONTH * 2, '2 months ago' ],
  76. [ MONTH * 13, 'a year ago' ],
  77. [ YEAR * 1, 'a year ago' ],
  78. [ YEAR * 2, '2 years ago' ],
  79. [ YEAR * 10, '10 years ago' ],
  80. [ YEAR * 100, '100 years ago' ],
  81. );
  82.  
  83. # Time::Moment 0.25 is required to prove the tests as the
  84. # ->from_mjd constructor was an addition in 0.25. The ->mjd
  85. # accessor was added in 0.19.
  86.  
  87. use Time::Moment 0.25;
  88. use Test::More 0.88;
  89.  
  90. my $now = Time::Moment->now;
  91. foreach my $test (@tests) {
  92. my ($duration, $expected) = @$test;
  93. my $tm = Time::Moment->from_mjd($now->mjd - $duration);
  94. is(ago($tm), $expected, "$tm ($duration)");
  95. }
  96.  
  97. done_testing();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement