This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Time-Piece: synch with CPAN version 1.34
authorJames E Keenan <jkeenan@cpan.org>
Tue, 10 Mar 2020 02:24:37 +0000 (02:24 +0000)
committerJames E Keenan <jkeenan@cpan.org>
Tue, 10 Mar 2020 02:24:37 +0000 (02:24 +0000)
MANIFEST
Porting/Maintainers.pl
cpan/Time-Piece/Piece.pm
cpan/Time-Piece/Seconds.pm
cpan/Time-Piece/t/02core_dst.t
cpan/Time-Piece/t/08truncate.t [new file with mode: 0644]
cpan/Time-Piece/t/09locales.t [new file with mode: 0644]
cpan/Time-Piece/t/10overload.t [new file with mode: 0644]
cpan/Time-Piece/t/99legacy.t [new file with mode: 0644]

index 2f325af..7db314d 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -2600,6 +2600,10 @@ cpan/Time-Piece/t/04mjd.t        Test for Time::Piece
 cpan/Time-Piece/t/05overload.t Test for Time::Piece
 cpan/Time-Piece/t/06subclass.t Test for Time::Piece
 cpan/Time-Piece/t/07arith.t    Test for Time::Piece
+cpan/Time-Piece/t/08truncate.t
+cpan/Time-Piece/t/09locales.t
+cpan/Time-Piece/t/10overload.t
+cpan/Time-Piece/t/99legacy.t
 cpan/Time-Piece/t/lib/Time/Piece/Twin.pm
 cpan/Unicode-Collate/Collate.pm                        Unicode::Collate
 cpan/Unicode-Collate/Collate.xs                        Unicode::Collate
index 6cb4d9c..d305f3e 100755 (executable)
@@ -1189,7 +1189,7 @@ use File::Glob qw(:case);
     },
 
     'Time::Piece' => {
-        'DISTRIBUTION' => 'ESAYM/Time-Piece-1.33.tar.gz',
+        'DISTRIBUTION' => 'ESAYM/Time-Piece-1.34.tar.gz',
         'FILES'        => q[cpan/Time-Piece],
         'EXCLUDED'     => [ qw[reverse_deps.txt] ],
     },
index d562463..7a61370 100644 (file)
@@ -19,7 +19,7 @@ our %EXPORT_TAGS = (
     ':override' => 'internal',
     );
 
-our $VERSION = '1.33';
+our $VERSION = '1.34';
 
 XSLoader::load( 'Time::Piece', $VERSION );
 
@@ -126,6 +126,7 @@ sub _mktime {
     if ($class->_is_time_struct($time)) {
         my @new_time = @$time;
         my @tm_parts = (@new_time[c_sec .. c_mon], $new_time[c_year]+1900);
+        #TODO: what happens here for data below 1970?
         $new_time[c_epoch] = $islocal ? timelocal(@tm_parts) : timegm(@tm_parts);
 
         return wantarray ? @new_time : bless [@new_time[0..9], $islocal], $class;
@@ -896,7 +897,7 @@ in perlfunc will still return what you expect.
 
 The module actually implements most of an interface described by
 Larry Wall on the perl5-porters mailing list here:
-L<http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/2000-01/msg00241.html>
+L<https://www.nntp.perl.org/group/perl.perl5.porters/2000/01/msg5283.html>
 
 =head1 USAGE
 
@@ -1152,6 +1153,14 @@ moves afoot to fix that in perl. Alternatively use 64 bit perl. Or if none
 of those are options, use the L<DateTime> module which has support for years
 well into the future and past.
 
+Also, the internal representation of Time::Piece->strftime deviates from the
+standard POSIX implementation in that is uses the epoch (instead of separate
+year, month, day parts). This change was added in version 1.30. If you must
+have a more traditional strftime (which will normally never calculate day
+light saving times correctly), you can pass the date parts from Time::Piece
+into the strftime function provided by the POSIX module
+(see strftime in L<POSIX> ).
+
 =head1 AUTHOR
 
 Matt Sergeant, matt@sergeant.org
index 71a4bd2..fda1d2f 100644 (file)
@@ -1,7 +1,7 @@
 package Time::Seconds;
 use strict;
 
-our $VERSION = '1.33';
+our $VERSION = '1.34';
 
 use Exporter 5.57 'import';
 
index 3f54fff..f443351 100644 (file)
@@ -1,4 +1,9 @@
-use Test::More tests => 56;
+use Test::More;
+
+# Skip if doing a regular install
+# Avoids mystery DST bugs [rt 128240], [GH40]
+plan skip_all => "DST tests not required for installation"
+  unless ( $ENV{AUTOMATED_TESTING} );
 
 my $is_win32 = ($^O =~ /Win32/);
 my $is_qnx = ($^O eq 'qnx');
@@ -121,7 +126,7 @@ cmp_ok($t->month_last_day, '==', 31); # test more
 SKIP: {
        skip "Extra tests for Linux, BSD only.", 8 unless $is_linux or $is_mac or $is_bsd;
 
-    local $ENV{TZ} = "EST5EDT4";
+    local $ENV{TZ} = "EST5EDT4,M3.2.0/2,M11.1.0/2";
     Time::Piece::_tzset();
     my $lt = localtime(1373371631); #2013-07-09T12:07:11
     cmp_ok(scalar($lt->tzoffset), 'eq', '-14400');
@@ -136,4 +141,4 @@ SKIP: {
     is    ($lt->strftime("%s"), 1357733231, 'Epoch output is the same with EST');
 }
 
-
+done_testing(56);
diff --git a/cpan/Time-Piece/t/08truncate.t b/cpan/Time-Piece/t/08truncate.t
new file mode 100644 (file)
index 0000000..4bacf0e
--- /dev/null
@@ -0,0 +1,51 @@
+use strict;
+use warnings;
+use Test::More tests => 24;
+
+use Time::Piece;
+
+my $epoch = 1373371631;
+my $t = gmtime($epoch); # 2013-07-09T12:07:11
+
+is ($t->truncate,        $t, 'No args, same object');
+is ($t->truncate('foo'), $t, 'No "to" arg, same object');
+eval { $t->truncate('to') };
+like ($@, qr/Invalid value of 'to' parameter/,
+        'No "to" value croaks');
+eval { $t->truncate('to' => 'foo') };
+like ($@, qr/Invalid value of 'to' parameter: foo/,
+        'Unrecognised "to" value croaks');
+
+my $short = $t->truncate(to => 'second');
+my $exp   = $epoch;
+cmp_ok ($short->epoch, '==', $exp, 'Truncate to second');
+
+$short = $t->truncate(to => 'minute');
+$exp   -= 11;
+cmp_ok ($short->epoch, '==', $exp, 'Truncate to minute');
+
+$short = $t->truncate(to => 'hour');
+$exp   -= 420;
+cmp_ok ($short->epoch, '==', $exp, 'Truncate to hour');
+
+$short = $t->truncate(to => 'day');
+$exp   -= 43200;
+cmp_ok ($short->epoch, '==', $exp, 'Truncate to day');
+
+$short = $t->truncate(to => 'month');
+$exp   -= 8 * 86400;
+cmp_ok ($short->epoch, '==', $exp, 'Truncate to month');
+
+$exp = gmtime ($exp)->add_months(-6);
+$short = $t->truncate(to => 'year');
+cmp_ok ($short, '==', $exp, 'Truncate to year');
+
+is ($t->epoch, $epoch, 'Time unchanged');
+
+for my $addmon (0..12) {
+    my $quarter = $short->add_months ($addmon);
+    $exp   = $quarter->add_months (0 - ($addmon % 3));
+    $quarter = $quarter->truncate(to => 'quarter');
+    cmp_ok ($quarter, '==', $exp, "Truncate to quarter (month $addmon)");
+
+}
diff --git a/cpan/Time-Piece/t/09locales.t b/cpan/Time-Piece/t/09locales.t
new file mode 100644 (file)
index 0000000..e7c183f
--- /dev/null
@@ -0,0 +1,105 @@
+use Test::More tests => 172;
+use Time::Piece;
+
+my $t = gmtime(1373371631);    # 2013-07-09T12:07:11
+
+#locale should be undef
+is( $t->_locale, undef );
+&Time::Piece::_default_locale();
+
+ok( $t->_locale );
+
+#use localized names
+cmp_ok( $t->monname,   'eq', &Time::Piece::_locale()->{mon}[ $t->_mon ] );
+cmp_ok( $t->month,     'eq', &Time::Piece::_locale()->{mon}[ $t->_mon ] );
+cmp_ok( $t->fullmonth, 'eq', &Time::Piece::_locale()->{month}[ $t->_mon ] );
+
+#use localized names
+cmp_ok( $t->wdayname, 'eq', &Time::Piece::_locale()->{wday}[ $t->_wday ] );
+cmp_ok( $t->day,      'eq', &Time::Piece::_locale()->{wday}[ $t->_wday ] );
+cmp_ok( $t->fullday,  'eq', &Time::Piece::_locale()->{weekday}[ $t->_wday ] );
+
+my @frdays = qw( Dimanche Lundi Merdi Mercredi Jeudi Vendredi Samedi );
+$t->day_list(@frdays);
+cmp_ok( $t->day,     'eq', &Time::Piece::_locale()->{wday}[ $t->_wday ] );
+cmp_ok( $t->fullday, 'eq', &Time::Piece::_locale()->{weekday}[ $t->_wday ] );
+
+#test reverse parsing
+sub check_parsed
+{
+    my ( $t, $parsed, $t_str, $strp_format ) = @_;
+
+    cmp_ok( $parsed->epoch, '==', $t->epoch,
+        "Epochs match for $t_str with $strp_format" );
+    cmp_ok(
+        $parsed->strftime($strp_format),
+        'eq',
+        $t->strftime($strp_format),
+        "Outputs formatted with $strp_format match"
+    );
+    cmp_ok( $parsed->strftime(), 'eq', $t->strftime(),
+        'Outputs formatted as default match' );
+}
+
+my @dates = (
+    '%Y-%m-%d %H:%M:%S',
+    '%Y-%m-%d %T',
+    '%A, %e %B %Y at %H:%M:%S',
+    '%a, %e %b %Y at %r',
+    '%s',
+    '%c',
+    '%F %T',
+
+#TODO
+#    '%u %U %Y %T',                    #%U,W,V currently skipped inside strptime
+#    '%w %W %y %T',
+    '%A, %e %B %Y at %I:%M:%S %p',    #%I and %p can be locale dependant
+    '%x %X',                          #hard coded to American localization
+);
+
+for my $time (
+    time(),                           # Now, whenever that might be
+    1451606400,                       # 2016-01-01 00:00
+    1451649600,                       # 2016-01-01 12:00
+  )
+{
+    Time::Piece->use_locale();
+    local $ENV{LC_TIME} = 'en_US';    # Otherwise DD/MM vs MM/DD causes grief
+    my $t = gmtime($time);
+    for my $strp_format (@dates) {
+
+        my $t_str = $t->strftime($strp_format);
+        my $parsed;
+      SKIP: {
+            eval { $parsed = $t->strptime( $t_str, $strp_format ); };
+            skip "gmtime strptime parse failed", 3 if $@;
+            check_parsed( $t, $parsed, $t_str, $strp_format );
+        }
+
+    }
+
+}
+
+for my $time (
+    time(),        # Now, whenever that might be
+    1451606400,    # 2016-01-01 00:00
+    1451649600,    # 2016-01-01 12:00
+  )
+{
+    Time::Piece->use_locale();
+    local $ENV{LC_TIME} = 'en_US';    # Otherwise DD/MM vs MM/DD causes grief
+    my $t = localtime($time);
+    for my $strp_format (@dates) {
+
+        my $t_str = $t->strftime($strp_format);
+        my $parsed;
+      SKIP: {
+            eval { $parsed = $t->strptime( $t_str, $strp_format ); };
+            skip "gmtime strptime parse failed", 3 if $@;
+            check_parsed( $t, $parsed, $t_str, $strp_format );
+        }
+
+    }
+
+}
+
diff --git a/cpan/Time-Piece/t/10overload.t b/cpan/Time-Piece/t/10overload.t
new file mode 100644 (file)
index 0000000..a85b509
--- /dev/null
@@ -0,0 +1,25 @@
+use strict;
+use warnings;
+use Time::Piece;
+use Test::More;
+
+eval 'use Math::BigInt';
+plan skip_all => "Math::BigInt required for testing overloaded operands" if $@;
+
+my $t = Time::Piece->gmtime(315532800); # 00:00:00 1/1/1980
+isa_ok $t, 'Time::Piece';
+is $t->cdate, 'Tue Jan  1 00:00:00 1980', 'got expected gmtime with int secs';
+
+$t = Time::Piece->gmtime(Math::BigInt->new('315532800')); # 00:00:00 1/1/1980
+is $t->cdate, 'Tue Jan  1 00:00:00 1980', 'got same time with overloaded secs';
+
+
+my $big_hour = Math::BigInt->new('3600');
+$t = $t + $big_hour;
+is $t->cdate, 'Tue Jan  1 01:00:00 1980', 'add overloaded value';
+$t = $t - $big_hour;
+is $t->cdate, 'Tue Jan  1 00:00:00 1980', 'sub overloaded value';
+
+done_testing;
diff --git a/cpan/Time-Piece/t/99legacy.t b/cpan/Time-Piece/t/99legacy.t
new file mode 100644 (file)
index 0000000..175e335
--- /dev/null
@@ -0,0 +1,26 @@
+use strict;
+use warnings;
+no warnings 'deprecated';
+
+use Test::More tests => 5;
+
+BEGIN { use_ok('Time::Piece'); }
+
+# The parse() legacy method is deprecated and will not be maintained.
+# The tests in this script illustrate both its functionality and some of
+# its bugs. This script should be removed from the test suite once
+# parse() has been deleted from Time::Piece.
+
+SKIP: {
+    skip "Linux only", 4 if $^O !~ /linux/i;
+
+    my $timestring = '2000-01-01T06:00:00';
+    my $t1         = Time::Piece->parse($timestring);
+    isnt( $t1->datetime, $timestring, 'LEGACY: parse string months fail' );
+    my $t2 = $t1->parse( 0, 0, 6, 1, 0, 100 );
+    is( $t2->datetime, $timestring, 'LEGACY: parse array' );
+    eval { $t2 = Time::Piece->parse(); };
+    is( $t2->datetime, $timestring, 'LEGACY: parse with no args dies' );
+    eval { $t2 = Time::Piece::parse( 0, 0, 12, 1, 0, 100 ); };
+    is( $t2->datetime, $timestring, 'LEGACY: parse as non-method dies' );
+}