The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
Build.PL 02
Changes 04
META.json 610
META.yml 1315
lib/DateTime/Format/Pg.pm 715
t/parse_interval.t 051
6 files changed (This is a version diff) 2697
@@ -33,6 +33,8 @@ my %args = (
 
     test_files           => ((-d '.git' || $ENV{RELEASE_TESTING}) && -d 'xt') ? 't/ xt/' : 't/',
     recursive_test_files => 1,
+
+    
 );
 if (-d 'share') {
     $args{share_dir} = 'share';
@@ -1,5 +1,9 @@
 Revision history for Perl extension DateTime::Format::Pg.
 
+0.16010 2014-09-18T12:36:03Z
+    - Add support for various more interval units [pr #3]:
+      millenium, century, decade, month, week
+
 0.16009 2013-08-25T04:51:15Z
     - Fix typos [pr #2] (dsteinbrunner)
     - Migrate to using Minilla for packaging
@@ -4,8 +4,10 @@
       "Daisuke Maki <daisuke@endeworks.jp>"
    ],
    "dynamic_config" : 0,
-   "generated_by" : "Minilla/v0.6.4",
-   "license" : "perl_5",
+   "generated_by" : "Minilla/v0.12.0",
+   "license" : [
+      "perl_5"
+   ],
    "meta-spec" : {
       "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
       "version" : "2"
@@ -19,7 +21,8 @@
          "share",
          "eg",
          "examples",
-         "author"
+         "author",
+         "builder"
       ]
    },
    "prereqs" : {
@@ -55,7 +58,7 @@
    "provides" : {
       "DateTime::Format::Pg" : {
          "file" : "lib/DateTime/Format/Pg.pm",
-         "version" : "0.16009"
+         "version" : "0.16010"
       }
    },
    "release_status" : "stable",
@@ -69,10 +72,11 @@
          "web" : "https://github.com/lestrrat/DateTime-Format-Pg"
       }
    },
-   "version" : "0.16009",
+   "version" : "0.16010",
    "x_contributors" : [
       "Vasily Chekalkin <bacek@bacek.com>",
       "David Steinbrunner <dsteinbrunner@pobox.com>",
-      "Daisuke Maki <lestrrat+github@gmail.com>"
+      "Henrik Pauli <henrik.pauli@gmail.com>",
+      "lestrrat <lestrrat+github@gmail.com>"
    ]
 }
@@ -3,18 +3,18 @@ abstract: 'Parse and format PostgreSQL dates and times'
 author:
   - 'Daisuke Maki <daisuke@endeworks.jp>'
 build_requires:
-  ExtUtils::MakeMaker: 6.36
-  Test::More: 0
+  ExtUtils::MakeMaker: '6.36'
+  Test::More: '0'
 configure_requires:
-  CPAN::Meta: 0
-  CPAN::Meta::Prereqs: 0
-  Module::Build: 0.38
+  CPAN::Meta: '0'
+  CPAN::Meta::Prereqs: '0'
+  Module::Build: '0.38'
 dynamic_config: 0
-generated_by: 'Minilla/v0.6.4, CPAN::Meta::Converter version 2.120921'
+generated_by: 'Minilla/v0.12.0, CPAN::Meta::Converter version 2.120921'
 license: perl
 meta-spec:
   url: http://module-build.sourceforge.net/META-spec-v1.4.html
-  version: 1.4
+  version: '1.4'
 name: DateTime-Format-Pg
 no_index:
   directory:
@@ -25,20 +25,22 @@ no_index:
     - eg
     - examples
     - author
+    - builder
 provides:
   DateTime::Format::Pg:
     file: lib/DateTime/Format/Pg.pm
-    version: 0.16009
+    version: '0.16010'
 requires:
-  DateTime: 0.10
-  DateTime::Format::Builder: 0.72
-  DateTime::TimeZone: 0.05
+  DateTime: '0.10'
+  DateTime::Format::Builder: '0.72'
+  DateTime::TimeZone: '0.05'
 resources:
   bugtracker: https://github.com/lestrrat/DateTime-Format-Pg/issues
   homepage: https://github.com/lestrrat/DateTime-Format-Pg
   repository: git://github.com/lestrrat/DateTime-Format-Pg.git
-version: 0.16009
+version: '0.16010'
 x_contributors:
   - 'Vasily Chekalkin <bacek@bacek.com>'
   - 'David Steinbrunner <dsteinbrunner@pobox.com>'
-  - 'Daisuke Maki <lestrrat+github@gmail.com>'
+  - 'Henrik Pauli <henrik.pauli@gmail.com>'
+  - 'lestrrat <lestrrat+github@gmail.com>'
@@ -11,7 +11,7 @@ use DateTime::TimeZone 0.06;
 use DateTime::TimeZone::UTC;
 use DateTime::TimeZone::Floating;
 
-$VERSION = '0.16009';
+$VERSION = '0.16010';
 $VERSION = eval $VERSION;
 
 our @ISA = ('DateTime::Format::Builder');
@@ -561,19 +561,23 @@ If given an improperly formatted string, this method may die.
 
 sub parse_duration {
     my ($self, $string) = @_;
-    my ($year, $mon, $day, $sgn, $hour, $min, $sec, $frc, $ago) = $string =~ m{
+    my ($mil, $cent, $dec, $year, $mon, $wk, $day, $sgn, $hour, $min, $sec, $frc, $ago) = $string =~ m{
         \A                                     # Start of string.
         (?:\@\s*)?                             # Optional leading @.
-        (?:([-+]?\d+)\s+years?\s*)?            # years
-        (?:([-+]?\d+)\s+mons?\s*)?             # months
-        (?:([-+]?\d+)\s+days?\s*)?             # days
+        (?:([-+]?\d+)\s+(?:millennium|millennia|millenniums|mil|mils)\s*)?  # millennia
+        (?:([-+]?\d+)\s+(?:century|centuries|cent|c)\s*)?                   # centuries
+        (?:([-+]?\d+)\s+(?:decade|decades|dec|decs)\s*)?                    # decades
+        (?:([-+]?\d+)\s+(?:year|years|yr|yrs|y)\s*)?                        # years
+        (?:([-+]?\d+)\s+(?:month|months|mon|mons)\s*)?                      # months
+        (?:([-+]?\d+)\s+(?:week|weeks|w)\s*)?                               # weeks
+        (?:([-+]?\d+)\s+(?:day|days|d)\s*)?                                 # days
         (?:                                    # Start h/m/s
           # hours
           (?:([-+])?([0-9]\d|[1-9]\d{2,}(?=:)|\d+(?=\s+hour))(?:\s+hours?)?\s*)?
           # minutes
-          (?::?((?<=:)[012345]\d|\d+(?=\s+mins?))(?:\s+mins?)?\s*)?
+          (?::?((?<=:)[012345]\d|\d+(?=\s+min(?:ute)?s?))(?:\s+min(?:ute)?s?)?\s*)?
           # seconds
-          (?::?((?<=:)[012345]\d|\d+(?=\.|\s+secs?))(\.\d+)?(?:\s+secs?)?\s*)?
+          (?::?((?<=:)[012345]\d|\d+(?=\.|\s+sec(?:ond)?s?))(\.\d+)?(?:\s+sec(?:ond)?s?)?\s*)?
         ?)                                     # End hh:mm:ss
         (ago)?                                 # Optional inversion
         \z                                     # End of string
@@ -589,7 +593,11 @@ sub parse_duration {
 
     # DT::Duration only stores years, days, months, seconds (and
     # nanoseconds)
+    $year += 1000 * $mil if $mil;
+    $year += 100 * $cent if $cent;
+    $year += 10 * $dec   if $dec;
     $mon += 12 * $year if $year;
+    $day +=  7 *   $wk if $wk;
     $min += 60 * $hour if $hour;
 
     # HH:MM:SS.FFFF share a single sign
@@ -28,7 +28,9 @@ BEGIN
         [ '-23:59'    => DateTime::Duration->new(hours => -23, minutes => -59) ],
         [ '-1 days -00:01' => DateTime::Duration->new( days => -1, minutes => -1) ],
         [ '1 mon -1 days' => DateTime::Duration->new(months => 1)->add(days => -1) ],
+        [ '1 month -1 days' => DateTime::Duration->new(months => 1)->add(days => -1) ],
         [ '@ 1 mon -1 days' => DateTime::Duration->new(months => 1)->add(days => -1) ],
+        [ '@ 1 month -1 days' => DateTime::Duration->new(months => 1)->add(days => -1) ],
         [ '-1 days +02:03:00' => DateTime::Duration->new(days => -1)
               ->add(
                   hours  => 2,
@@ -50,7 +52,10 @@ BEGIN
         [ '@ 1 day 1 min ago' => DateTime::Duration->new( days => -1, minutes => -1 )],
         [ '10 days' => DateTime::Duration->new(days => 10 ) ],
         [ '34 years' => DateTime::Duration->new(years => 34 )],
+        [ '3 mon' => DateTime::Duration->new(months => 3 )],
         [ '3 mons' => DateTime::Duration->new(months => 3 )],
+        [ '3 month' => DateTime::Duration->new(months => 3 )],
+        [ '3 months' => DateTime::Duration->new(months => 3 )],
         [ '-00:00:14' => DateTime::Duration->new(seconds => -14 )],
         [ '1 day 02:03:04' => DateTime::Duration->new(
             days => 1,
@@ -61,10 +66,16 @@ BEGIN
     
         [ '5 mons 12:00:00' => DateTime::Duration->new( months => 5, hours => 12) ],
         [ '@ 1 min' => DateTime::Duration->new(minutes => 1 )],
+        [ '@ 1 mins' => DateTime::Duration->new(minutes => 1 )],
+        [ '@ 1 minute' => DateTime::Duration->new(minutes => 1 )],
+        [ '@ 1 minutes' => DateTime::Duration->new(minutes => 1 )],
         [ '@ 5 hours' => DateTime::Duration->new( hours => 5 )],
         [ '@ 34 years' => DateTime::Duration->new(years => 34 )],
         [ '@ 3 mons' => DateTime::Duration->new(months => 3 )],
+        [ '@ 14 sec ago' => DateTime::Duration->new( seconds => -14 )],
         [ '@ 14 secs ago' => DateTime::Duration->new( seconds => -14 )],
+        [ '@ 14 second ago' => DateTime::Duration->new( seconds => -14 )],
+        [ '@ 14 seconds ago' => DateTime::Duration->new( seconds => -14 )],
         [ '@ 1 day 2 hours 3 mins 4 secs' => DateTime::Duration->new(
             days => 1,
             hours => 2,
@@ -94,6 +105,46 @@ BEGIN
             hours => -2,
             minutes => -3,
         )],
+
+        [ '1 millennium' => DateTime::Duration->new( years => 1000 )],
+        [ '2 millennia' => DateTime::Duration->new( years => 2000 )],
+        [ '3 millenniums' => DateTime::Duration->new( years => 3000 )],
+        [ '1 mil' => DateTime::Duration->new( years => 1000 )],
+        [ '2 mils' => DateTime::Duration->new( years => 2000 )],
+        
+        [ '1 century' => DateTime::Duration->new( years => 100 )],
+        [ '2 centuries' => DateTime::Duration->new( years => 200 )],
+        [ '1 cent' => DateTime::Duration->new( years => 100 )],
+        [ '2 c' => DateTime::Duration->new( years => 200 )],
+        
+        [ '1 decade' => DateTime::Duration->new( years => 10 )],
+        [ '2 decades' => DateTime::Duration->new( years => 20 )],
+        [ '1 dec' => DateTime::Duration->new( years => 10 )],
+        [ '2 decs' => DateTime::Duration->new( years => 20 )],
+
+        [ '1 year' => DateTime::Duration->new( years => 1 )],
+        [ '2 years' => DateTime::Duration->new( years => 2 )],
+        [ '1 y' => DateTime::Duration->new( years => 1 )],
+        [ '1 yr' => DateTime::Duration->new( years => 1 )],
+        [ '2 yrs' => DateTime::Duration->new( years => 2 )],
+        
+        [ '1 mil 9 c 6 decade 2 yr' => DateTime::Duration->new( years => 1962 )],
+
+        [ '1 month' => DateTime::Duration->new( months => 1 )],
+        [ '2 months' => DateTime::Duration->new( months => 2 )],
+        [ '1 mon' => DateTime::Duration->new( months => 1 )],
+        [ '2 mons' => DateTime::Duration->new( months => 2 )],
+        
+        [ '1 week' => DateTime::Duration->new( weeks => 1 )],
+        [ '2 weeks' => DateTime::Duration->new( weeks => 2 )],
+        [ '1 w' => DateTime::Duration->new( weeks => 1 )],
+        
+        [ '1 day' => DateTime::Duration->new( days => 1 )],
+        [ '2 days' => DateTime::Duration->new( days => 2 )],
+        [ '1 d' => DateTime::Duration->new( days => 1 )],
+        
+        [ '1 mil 2 c 4 decade 8 yr 9 months 18 d ' => DateTime::Duration->new( years => 1248, months => 9, days => 18 )],
+        [ '12 yr 42 w' => DateTime::Duration->new( years => 12, weeks => 42 )],
     );
 
     plan tests => @negative_data + @positive_data + 1;