mirror of
https://github.com/GothenburgBitFactory/taskwarrior.git
synced 2025-08-29 07:57:20 +02:00
- Fixed bug whereby the "dateformat" configuration variable was being used to display dates, but not parse them.
This commit is contained in:
parent
07d1f63e31
commit
131693f617
11 changed files with 209 additions and 124 deletions
|
@ -6,7 +6,7 @@ where the x represents a major version number, or architecture. The y
|
||||||
represents a feature release, and the z represents a patch.
|
represents a feature release, and the z represents a patch.
|
||||||
|
|
||||||
1.2.0 (?)
|
1.2.0 (?)
|
||||||
-
|
+ Bug: "dateformat" configuration variable used to display dates, but not parse them.
|
||||||
|
|
||||||
------ reality -----------------------------------
|
------ reality -----------------------------------
|
||||||
|
|
||||||
|
@ -127,6 +127,7 @@ represents a feature release, and the z represents a patch.
|
||||||
+ File locking
|
+ File locking
|
||||||
+ retain deleted tasks
|
+ retain deleted tasks
|
||||||
+ "task info ID" report showing all metadata
|
+ "task info ID" report showing all metadata
|
||||||
|
+ File format v2
|
||||||
|
|
||||||
[Development hiatus while planning for T, TDB API, new features and the future
|
[Development hiatus while planning for T, TDB API, new features and the future
|
||||||
of the project. Seeded to two testers for feedback, suggestions.]
|
of the project. Seeded to two testers for feedback, suggestions.]
|
||||||
|
|
132
src/Date.cpp
132
src/Date.cpp
|
@ -57,29 +57,114 @@ Date::Date (const int m, const int d, const int y)
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
Date::Date (const std::string& mdy)
|
Date::Date (const std::string& mdy, const std::string format /* = "m/d/Y" */)
|
||||||
{
|
{
|
||||||
size_t firstSlash = mdy.find ("/");
|
int month = 0;
|
||||||
size_t secondSlash = mdy.find ("/", firstSlash + 1);
|
int day = 0;
|
||||||
if (firstSlash != std::string::npos &&
|
int year = 0;
|
||||||
secondSlash != std::string::npos)
|
|
||||||
{
|
|
||||||
int m = ::atoi (mdy.substr (0, firstSlash ).c_str ());
|
|
||||||
int d = ::atoi (mdy.substr (firstSlash + 1, secondSlash - firstSlash).c_str ());
|
|
||||||
int y = ::atoi (mdy.substr (secondSlash + 1, std::string::npos ).c_str ());
|
|
||||||
if (!valid (m, d, y))
|
|
||||||
throw std::string ("\"") + mdy + "\" is not a valid date.";
|
|
||||||
|
|
||||||
// Duplicate Date::Date (const int, const int, const int);
|
unsigned int i = 0; // Index into mdy.
|
||||||
struct tm t = {0};
|
|
||||||
t.tm_mday = d;
|
for (unsigned int f = 0; f < format.length (); ++f)
|
||||||
t.tm_mon = m - 1;
|
{
|
||||||
t.tm_year = y - 1900;
|
switch (format[f])
|
||||||
|
{
|
||||||
|
// Single digit.
|
||||||
|
case 'm':
|
||||||
|
if (i >= mdy.length () ||
|
||||||
|
! ::isdigit (mdy[i]))
|
||||||
|
{
|
||||||
|
throw std::string ("\"") + mdy + "\" is not a valid date.";
|
||||||
|
}
|
||||||
|
|
||||||
|
month = ::atoi (mdy.substr (i, 1).c_str ());
|
||||||
|
++i;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'd':
|
||||||
|
if (i >= mdy.length () ||
|
||||||
|
! ::isdigit (mdy[i]))
|
||||||
|
{
|
||||||
|
throw std::string ("\"") + mdy + "\" is not a valid date.";
|
||||||
|
}
|
||||||
|
|
||||||
|
day = ::atoi (mdy.substr (i, 1).c_str ());
|
||||||
|
++i;
|
||||||
|
break;
|
||||||
|
|
||||||
|
// Double digit.
|
||||||
|
case 'y':
|
||||||
|
if (i + 1 >= mdy.length () ||
|
||||||
|
! ::isdigit (mdy[i + 0]) ||
|
||||||
|
! ::isdigit (mdy[i + 1]))
|
||||||
|
{
|
||||||
|
throw std::string ("\"") + mdy + "\" is not a valid date.";
|
||||||
|
}
|
||||||
|
|
||||||
|
year = ::atoi (mdy.substr (i, 2).c_str ()) + 2000;
|
||||||
|
i += 2;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'M':
|
||||||
|
if (i + 1 >= mdy.length () ||
|
||||||
|
! ::isdigit (mdy[i + 0]) ||
|
||||||
|
! ::isdigit (mdy[i + 1]))
|
||||||
|
{
|
||||||
|
throw std::string ("\"") + mdy + "\" is not a valid date.";
|
||||||
|
}
|
||||||
|
|
||||||
|
month = ::atoi (mdy.substr (i, 2).c_str ());
|
||||||
|
i += 2;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'D':
|
||||||
|
if (i + 1 >= mdy.length () ||
|
||||||
|
! ::isdigit (mdy[i + 0]) ||
|
||||||
|
! ::isdigit (mdy[i + 1]))
|
||||||
|
{
|
||||||
|
throw std::string ("\"") + mdy + "\" is not a valid date.";
|
||||||
|
}
|
||||||
|
|
||||||
|
day = ::atoi (mdy.substr (i, 2).c_str ());
|
||||||
|
i += 2;
|
||||||
|
break;
|
||||||
|
|
||||||
|
// Quadruple digit.
|
||||||
|
case 'Y':
|
||||||
|
if (i + 3 >= mdy.length () ||
|
||||||
|
! ::isdigit (mdy[i + 0]) ||
|
||||||
|
! ::isdigit (mdy[i + 1]) ||
|
||||||
|
! ::isdigit (mdy[i + 2]) ||
|
||||||
|
! ::isdigit (mdy[i + 3]))
|
||||||
|
{
|
||||||
|
throw std::string ("\"") + mdy + "\" is not a valid date.";
|
||||||
|
}
|
||||||
|
|
||||||
|
year = ::atoi (mdy.substr (i, 4).c_str ());
|
||||||
|
i += 4;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
if (i >= mdy.length () ||
|
||||||
|
mdy[i] != format[f])
|
||||||
|
{
|
||||||
|
throw std::string ("\"") + mdy + "\" is not a valid date.";
|
||||||
|
}
|
||||||
|
++i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!valid (month, day, year))
|
||||||
|
throw std::string ("\"") + mdy + "\" is not a valid date.";
|
||||||
|
|
||||||
|
// Duplicate Date::Date (const int, const int, const int);
|
||||||
|
struct tm t = {0};
|
||||||
|
t.tm_mday = day;
|
||||||
|
t.tm_mon = month - 1;
|
||||||
|
t.tm_year = year - 1900;
|
||||||
|
|
||||||
mT = mktime (&t);
|
mT = mktime (&t);
|
||||||
}
|
|
||||||
else
|
|
||||||
throw std::string ("\"") + mdy + "\" is not a valid date.";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -118,15 +203,6 @@ void Date::toMDY (int& m, int& d, int& y)
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
std::string Date::toString (const std::string& format /*= "m/d/Y"*/)
|
std::string Date::toString (const std::string& format /*= "m/d/Y"*/)
|
||||||
{
|
{
|
||||||
/*
|
|
||||||
int m, d, y;
|
|
||||||
toMDY (m, d, y);
|
|
||||||
|
|
||||||
char formatted [11];
|
|
||||||
sprintf (formatted, "%d/%d/%d", m, d, y);
|
|
||||||
return std::string (formatted);
|
|
||||||
*/
|
|
||||||
|
|
||||||
std::string formatted;
|
std::string formatted;
|
||||||
for (unsigned int i = 0; i < format.length (); ++i)
|
for (unsigned int i = 0; i < format.length (); ++i)
|
||||||
{
|
{
|
||||||
|
|
|
@ -37,7 +37,7 @@ public:
|
||||||
Date ();
|
Date ();
|
||||||
Date (time_t);
|
Date (time_t);
|
||||||
Date (const int, const int, const int);
|
Date (const int, const int, const int);
|
||||||
Date (const std::string&);
|
Date (const std::string&, const std::string format = "m/d/Y");
|
||||||
Date (const Date&);
|
Date (const Date&);
|
||||||
virtual ~Date ();
|
virtual ~Date ();
|
||||||
|
|
||||||
|
|
14
src/T.cpp
14
src/T.cpp
|
@ -275,20 +275,8 @@ const std::string T::compose () const
|
||||||
int count = 0;
|
int count = 0;
|
||||||
foreach (i, mAttributes)
|
foreach (i, mAttributes)
|
||||||
{
|
{
|
||||||
std::string converted = i->second;
|
|
||||||
|
|
||||||
// Date attributes may need conversion to epoch.
|
|
||||||
if (i->first == "due" ||
|
|
||||||
i->first == "start" ||
|
|
||||||
i->first == "entry" ||
|
|
||||||
i->first == "end")
|
|
||||||
{
|
|
||||||
if (i->second.find ("/") != std::string::npos)
|
|
||||||
validDate (converted);
|
|
||||||
}
|
|
||||||
|
|
||||||
line += (count > 0 ? " " : "");
|
line += (count > 0 ? " " : "");
|
||||||
line += i->first + ":" + converted;
|
line += i->first + ":" + i->second;
|
||||||
|
|
||||||
++count;
|
++count;
|
||||||
}
|
}
|
||||||
|
|
|
@ -659,6 +659,12 @@ void Table::suppressWS ()
|
||||||
mSuppressWS = true;
|
mSuppressWS = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
void Table::setDateFormat (const std::string& dateFormat)
|
||||||
|
{
|
||||||
|
mDateFormat = dateFormat;
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
int Table::rowCount ()
|
int Table::rowCount ()
|
||||||
{
|
{
|
||||||
|
@ -771,8 +777,8 @@ void Table::sort (std::vector <int>& order)
|
||||||
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Date dl ((std::string)*left);
|
Date dl ((std::string)*left, mDateFormat);
|
||||||
Date dr ((std::string)*right);
|
Date dr ((std::string)*right, mDateFormat);
|
||||||
if (dl > dr)
|
if (dl > dr)
|
||||||
SWAP
|
SWAP
|
||||||
}
|
}
|
||||||
|
@ -789,8 +795,8 @@ void Table::sort (std::vector <int>& order)
|
||||||
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Date dl ((std::string)*left);
|
Date dl ((std::string)*left, mDateFormat);
|
||||||
Date dr ((std::string)*right);
|
Date dr ((std::string)*right, mDateFormat);
|
||||||
if (dl < dr)
|
if (dl < dr)
|
||||||
SWAP
|
SWAP
|
||||||
}
|
}
|
||||||
|
|
|
@ -79,6 +79,7 @@ public:
|
||||||
void setCellBg (int, int, Text::color);
|
void setCellBg (int, int, Text::color);
|
||||||
|
|
||||||
void suppressWS ();
|
void suppressWS ();
|
||||||
|
void setDateFormat (const std::string&);
|
||||||
|
|
||||||
int rowCount ();
|
int rowCount ();
|
||||||
int columnCount ();
|
int columnCount ();
|
||||||
|
@ -128,6 +129,7 @@ private:
|
||||||
|
|
||||||
// Misc...
|
// Misc...
|
||||||
bool mSuppressWS;
|
bool mSuppressWS;
|
||||||
|
std::string mDateFormat;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -185,29 +185,13 @@ static bool isCommand (const std::string& candidate)
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
bool validDate (std::string& date)
|
bool validDate (std::string& date, Config& conf)
|
||||||
{
|
{
|
||||||
size_t firstSlash = date.find ("/");
|
Date test (date, conf.get ("dateformat", "m/d/Y"));
|
||||||
size_t secondSlash = date.find ("/", firstSlash + 1);
|
|
||||||
if (firstSlash != std::string::npos &&
|
|
||||||
secondSlash != std::string::npos)
|
|
||||||
{
|
|
||||||
int m = ::atoi (date.substr (0, firstSlash ).c_str ());
|
|
||||||
int d = ::atoi (date.substr (firstSlash + 1, secondSlash - firstSlash).c_str ());
|
|
||||||
int y = ::atoi (date.substr (secondSlash + 1, std::string::npos ).c_str ());
|
|
||||||
if (!Date::valid (m, d, y))
|
|
||||||
throw std::string ("\"") + date + "\" is not a valid date.";
|
|
||||||
|
|
||||||
// Convert to epoch form.
|
char epoch[12];
|
||||||
Date dt (m, d, y);
|
sprintf (epoch, "%d", (int) test.toEpoch ());
|
||||||
time_t t;
|
date = epoch;
|
||||||
dt.toEpoch (t);
|
|
||||||
char converted[12];
|
|
||||||
sprintf (converted, "%u", (unsigned int) t);
|
|
||||||
date = converted;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
throw std::string ("Badly formed date - use the MM/DD/YYYY format");
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -227,7 +211,7 @@ static bool validPriority (std::string& input)
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
static bool validAttribute (std::string& name, std::string& value)
|
static bool validAttribute (std::string& name, std::string& value, Config& conf)
|
||||||
{
|
{
|
||||||
guess ("attribute", attributes, name);
|
guess ("attribute", attributes, name);
|
||||||
|
|
||||||
|
@ -235,7 +219,7 @@ static bool validAttribute (std::string& name, std::string& value)
|
||||||
guess ("color", colors, value);
|
guess ("color", colors, value);
|
||||||
|
|
||||||
else if (name == "due" && value != "")
|
else if (name == "due" && value != "")
|
||||||
validDate (value);
|
validDate (value, conf);
|
||||||
|
|
||||||
else if (name == "priority")
|
else if (name == "priority")
|
||||||
{
|
{
|
||||||
|
@ -335,7 +319,8 @@ static bool validSubstitution (
|
||||||
void parse (
|
void parse (
|
||||||
std::vector <std::string>& args,
|
std::vector <std::string>& args,
|
||||||
std::string& command,
|
std::string& command,
|
||||||
T& task)
|
T& task,
|
||||||
|
Config& conf)
|
||||||
{
|
{
|
||||||
command = "";
|
command = "";
|
||||||
|
|
||||||
|
@ -369,7 +354,7 @@ void parse (
|
||||||
std::string name = arg.substr (0, colon);
|
std::string name = arg.substr (0, colon);
|
||||||
std::string value = arg.substr (colon + 1, std::string::npos);
|
std::string value = arg.substr (colon + 1, std::string::npos);
|
||||||
|
|
||||||
if (validAttribute (name, value))
|
if (validAttribute (name, value, conf))
|
||||||
task.setAttribute (name, value);
|
task.setAttribute (name, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
20
src/task.cpp
20
src/task.cpp
|
@ -70,6 +70,7 @@ void usage (Config& conf)
|
||||||
table.setColumnWidth (1, Table::minimum);
|
table.setColumnWidth (1, Table::minimum);
|
||||||
table.setColumnWidth (2, Table::flexible);
|
table.setColumnWidth (2, Table::flexible);
|
||||||
table.setTableWidth (width);
|
table.setTableWidth (width);
|
||||||
|
table.setDateFormat (conf.get ("dateformat", "m/d/Y"));
|
||||||
|
|
||||||
int row = table.addRow ();
|
int row = table.addRow ();
|
||||||
table.addCell (row, 0, "Usage:");
|
table.addCell (row, 0, "Usage:");
|
||||||
|
@ -242,7 +243,7 @@ int main (int argc, char** argv)
|
||||||
|
|
||||||
std::string command;
|
std::string command;
|
||||||
T task;
|
T task;
|
||||||
parse (args, command, task);
|
parse (args, command, task, conf);
|
||||||
|
|
||||||
if (command == "add") handleAdd (tdb, task, conf);
|
if (command == "add") handleAdd (tdb, task, conf);
|
||||||
else if (command == "projects") handleProjects (tdb, task, conf);
|
else if (command == "projects") handleProjects (tdb, task, conf);
|
||||||
|
@ -326,6 +327,7 @@ void handleProjects (const TDB& tdb, T& task, Config& conf)
|
||||||
table.setColumnUnderline (1);
|
table.setColumnUnderline (1);
|
||||||
|
|
||||||
table.setColumnJustification (1, Table::right);
|
table.setColumnJustification (1, Table::right);
|
||||||
|
table.setDateFormat (conf.get ("dateformat", "m/d/Y"));
|
||||||
|
|
||||||
foreach (i, unique)
|
foreach (i, unique)
|
||||||
{
|
{
|
||||||
|
@ -442,6 +444,8 @@ void handleList (const TDB& tdb, T& task, Config& conf)
|
||||||
table.sortOn (2, Table::descendingPriority);
|
table.sortOn (2, Table::descendingPriority);
|
||||||
table.sortOn (1, Table::ascendingCharacter);
|
table.sortOn (1, Table::ascendingCharacter);
|
||||||
|
|
||||||
|
table.setDateFormat (conf.get ("dateformat", "m/d/Y"));
|
||||||
|
|
||||||
// Split any description specified into words.
|
// Split any description specified into words.
|
||||||
std::vector <std::string> descWords;
|
std::vector <std::string> descWords;
|
||||||
split (descWords, task.getDescription (), ' ');
|
split (descWords, task.getDescription (), ' ');
|
||||||
|
@ -581,6 +585,7 @@ void handleSmallList (const TDB& tdb, T& task, Config& conf)
|
||||||
// Create a table for output.
|
// Create a table for output.
|
||||||
Table table;
|
Table table;
|
||||||
table.setTableWidth (width);
|
table.setTableWidth (width);
|
||||||
|
table.setDateFormat (conf.get ("dateformat", "m/d/Y"));
|
||||||
table.addColumn ("ID");
|
table.addColumn ("ID");
|
||||||
table.addColumn ("Project");
|
table.addColumn ("Project");
|
||||||
table.addColumn ("Pri");
|
table.addColumn ("Pri");
|
||||||
|
@ -737,6 +742,7 @@ void handleCompleted (const TDB& tdb, T& task, Config& conf)
|
||||||
// Create a table for output.
|
// Create a table for output.
|
||||||
Table table;
|
Table table;
|
||||||
table.setTableWidth (width);
|
table.setTableWidth (width);
|
||||||
|
table.setDateFormat (conf.get ("dateformat", "m/d/Y"));
|
||||||
table.addColumn ("Done");
|
table.addColumn ("Done");
|
||||||
table.addColumn ("Project");
|
table.addColumn ("Project");
|
||||||
table.addColumn ("Description");
|
table.addColumn ("Description");
|
||||||
|
@ -852,6 +858,7 @@ void handleInfo (const TDB& tdb, T& task, Config& conf)
|
||||||
|
|
||||||
Table table;
|
Table table;
|
||||||
table.setTableWidth (width);
|
table.setTableWidth (width);
|
||||||
|
table.setDateFormat (conf.get ("dateformat", "m/d/Y"));
|
||||||
|
|
||||||
table.addColumn ("Name");
|
table.addColumn ("Name");
|
||||||
table.addColumn ("Value");
|
table.addColumn ("Value");
|
||||||
|
@ -1024,6 +1031,7 @@ void handleLongList (const TDB& tdb, T& task, Config& conf)
|
||||||
// Create a table for output.
|
// Create a table for output.
|
||||||
Table table;
|
Table table;
|
||||||
table.setTableWidth (width);
|
table.setTableWidth (width);
|
||||||
|
table.setDateFormat (conf.get ("dateformat", "m/d/Y"));
|
||||||
table.addColumn ("ID");
|
table.addColumn ("ID");
|
||||||
table.addColumn ("Project");
|
table.addColumn ("Project");
|
||||||
table.addColumn ("Pri");
|
table.addColumn ("Pri");
|
||||||
|
@ -1279,6 +1287,7 @@ void handleReportSummary (const TDB& tdb, T& task, Config& conf)
|
||||||
table.setColumnJustification (3, Table::right);
|
table.setColumnJustification (3, Table::right);
|
||||||
|
|
||||||
table.sortOn (0, Table::ascendingCharacter);
|
table.sortOn (0, Table::ascendingCharacter);
|
||||||
|
table.setDateFormat (conf.get ("dateformat", "m/d/Y"));
|
||||||
|
|
||||||
int barWidth = 30;
|
int barWidth = 30;
|
||||||
foreach (i, allProjects)
|
foreach (i, allProjects)
|
||||||
|
@ -1390,6 +1399,7 @@ void handleReportNext (const TDB& tdb, T& task, Config& conf)
|
||||||
// Create a table for output.
|
// Create a table for output.
|
||||||
Table table;
|
Table table;
|
||||||
table.setTableWidth (width);
|
table.setTableWidth (width);
|
||||||
|
table.setDateFormat (conf.get ("dateformat", "m/d/Y"));
|
||||||
table.addColumn ("ID");
|
table.addColumn ("ID");
|
||||||
table.addColumn ("Project");
|
table.addColumn ("Project");
|
||||||
table.addColumn ("Pri");
|
table.addColumn ("Pri");
|
||||||
|
@ -1638,6 +1648,7 @@ void handleReportHistory (const TDB& tdb, T& task, Config& conf)
|
||||||
|
|
||||||
// Now build the table.
|
// Now build the table.
|
||||||
Table table;
|
Table table;
|
||||||
|
table.setDateFormat (conf.get ("dateformat", "m/d/Y"));
|
||||||
table.addColumn ("Year");
|
table.addColumn ("Year");
|
||||||
table.addColumn ("Month");
|
table.addColumn ("Month");
|
||||||
table.addColumn ("Added");
|
table.addColumn ("Added");
|
||||||
|
@ -1740,7 +1751,7 @@ void handleReportUsage (const TDB& tdb, T& task, Config& conf)
|
||||||
{
|
{
|
||||||
T task;
|
T task;
|
||||||
std::string commandName;
|
std::string commandName;
|
||||||
parse (args, commandName, task);
|
parse (args, commandName, task, conf);
|
||||||
|
|
||||||
usage[commandName]++;
|
usage[commandName]++;
|
||||||
}
|
}
|
||||||
|
@ -1759,6 +1770,7 @@ void handleReportUsage (const TDB& tdb, T& task, Config& conf)
|
||||||
table.setColumnUnderline (1);
|
table.setColumnUnderline (1);
|
||||||
table.setColumnJustification (1, Table::right);
|
table.setColumnJustification (1, Table::right);
|
||||||
table.sortOn (1, Table::descendingNumeric);
|
table.sortOn (1, Table::descendingNumeric);
|
||||||
|
table.setDateFormat (conf.get ("dateformat", "m/d/Y"));
|
||||||
|
|
||||||
foreach (i, usage)
|
foreach (i, usage)
|
||||||
{
|
{
|
||||||
|
@ -1788,6 +1800,7 @@ std::string renderMonth (
|
||||||
Config& conf)
|
Config& conf)
|
||||||
{
|
{
|
||||||
Table table;
|
Table table;
|
||||||
|
table.setDateFormat (conf.get ("dateformat", "m/d/Y"));
|
||||||
table.addColumn (" ");
|
table.addColumn (" ");
|
||||||
table.addColumn ("Su");
|
table.addColumn ("Su");
|
||||||
table.addColumn ("Mo");
|
table.addColumn ("Mo");
|
||||||
|
@ -1934,6 +1947,7 @@ void handleReportActive (const TDB& tdb, T& task, Config& conf)
|
||||||
// Create a table for output.
|
// Create a table for output.
|
||||||
Table table;
|
Table table;
|
||||||
table.setTableWidth (width);
|
table.setTableWidth (width);
|
||||||
|
table.setDateFormat (conf.get ("dateformat", "m/d/Y"));
|
||||||
table.addColumn ("ID");
|
table.addColumn ("ID");
|
||||||
table.addColumn ("Project");
|
table.addColumn ("Project");
|
||||||
table.addColumn ("Pri");
|
table.addColumn ("Pri");
|
||||||
|
@ -2052,6 +2066,7 @@ void handleReportOverdue (const TDB& tdb, T& task, Config& conf)
|
||||||
// Create a table for output.
|
// Create a table for output.
|
||||||
Table table;
|
Table table;
|
||||||
table.setTableWidth (width);
|
table.setTableWidth (width);
|
||||||
|
table.setDateFormat (conf.get ("dateformat", "m/d/Y"));
|
||||||
table.addColumn ("ID");
|
table.addColumn ("ID");
|
||||||
table.addColumn ("Project");
|
table.addColumn ("Project");
|
||||||
table.addColumn ("Pri");
|
table.addColumn ("Pri");
|
||||||
|
@ -2241,6 +2256,7 @@ void handleVersion (Config& conf)
|
||||||
// Create a table for output.
|
// Create a table for output.
|
||||||
Table table;
|
Table table;
|
||||||
table.setTableWidth (width);
|
table.setTableWidth (width);
|
||||||
|
table.setDateFormat (conf.get ("dateformat", "m/d/Y"));
|
||||||
table.addColumn ("Config variable");
|
table.addColumn ("Config variable");
|
||||||
table.addColumn ("Value");
|
table.addColumn ("Value");
|
||||||
table.setColumnUnderline (0);
|
table.setColumnUnderline (0);
|
||||||
|
|
|
@ -49,8 +49,8 @@ for (typeof (c) *foreach_p = & (c); \
|
||||||
++i)
|
++i)
|
||||||
|
|
||||||
// parse.cpp
|
// parse.cpp
|
||||||
void parse (std::vector <std::string>&, std::string&, T&);
|
void parse (std::vector <std::string>&, std::string&, T&, Config&);
|
||||||
bool validDate (std::string&);
|
bool validDate (std::string&, Config&);
|
||||||
|
|
||||||
// task.cpp
|
// task.cpp
|
||||||
void handleAdd (const TDB&, T&, Config&);
|
void handleAdd (const TDB&, T&, Config&);
|
||||||
|
|
1
src/tests/.gitignore
vendored
1
src/tests/.gitignore
vendored
|
@ -1,5 +1,6 @@
|
||||||
t.t
|
t.t
|
||||||
tdb.t
|
tdb.t
|
||||||
|
date.t
|
||||||
pending.data
|
pending.data
|
||||||
completed.data
|
completed.data
|
||||||
|
|
||||||
|
|
|
@ -9,77 +9,87 @@
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
int main (int argc, char** argv)
|
int main (int argc, char** argv)
|
||||||
{
|
{
|
||||||
UnitTest t (46);
|
plan (52);
|
||||||
|
|
||||||
Date now;
|
Date now;
|
||||||
Date yesterday;
|
Date yesterday;
|
||||||
yesterday -= 1;
|
yesterday -= 1;
|
||||||
|
|
||||||
t.ok (yesterday <= now, "yesterday <= now");
|
ok (yesterday <= now, "yesterday <= now");
|
||||||
t.ok (yesterday < now, "yesterday < now");
|
ok (yesterday < now, "yesterday < now");
|
||||||
t.notok (yesterday == now, "!(yesterday == now)");
|
notok (yesterday == now, "!(yesterday == now)");
|
||||||
t.ok (yesterday != now, "yesterday != now");
|
ok (yesterday != now, "yesterday != now");
|
||||||
t.ok (now >= yesterday, "now >= yesterday");
|
ok (now >= yesterday, "now >= yesterday");
|
||||||
t.ok (now > yesterday, "now > yesterday");
|
ok (now > yesterday, "now > yesterday");
|
||||||
|
|
||||||
t.ok (Date::valid (2, 29, 2008), "valid: 2/29/2008");
|
ok (Date::valid (2, 29, 2008), "valid: 2/29/2008");
|
||||||
t.notok (Date::valid (2, 29, 2007), "invalid: 2/29/2007");
|
notok (Date::valid (2, 29, 2007), "invalid: 2/29/2007");
|
||||||
|
|
||||||
t.ok (Date::leapYear (2008), "2008 is a leap year");
|
ok (Date::leapYear (2008), "2008 is a leap year");
|
||||||
t.notok (Date::leapYear (2007), "2007 is not a leap year");
|
notok (Date::leapYear (2007), "2007 is not a leap year");
|
||||||
|
|
||||||
t.is (Date::daysInMonth (2, 2008), 29, "29 days in February 2008");
|
is (Date::daysInMonth (2, 2008), 29, "29 days in February 2008");
|
||||||
t.is (Date::daysInMonth (2, 2007), 28, "28 days in February 2007");
|
is (Date::daysInMonth (2, 2007), 28, "28 days in February 2007");
|
||||||
|
|
||||||
t.is (Date::monthName (1), "January", "1 = January");
|
is (Date::monthName (1), "January", "1 = January");
|
||||||
t.is (Date::monthName (2), "February", "2 = February");
|
is (Date::monthName (2), "February", "2 = February");
|
||||||
t.is (Date::monthName (3), "March", "3 = March");
|
is (Date::monthName (3), "March", "3 = March");
|
||||||
t.is (Date::monthName (4), "April", "4 = April");
|
is (Date::monthName (4), "April", "4 = April");
|
||||||
t.is (Date::monthName (5), "May", "5 = May");
|
is (Date::monthName (5), "May", "5 = May");
|
||||||
t.is (Date::monthName (6), "June", "6 = June");
|
is (Date::monthName (6), "June", "6 = June");
|
||||||
t.is (Date::monthName (7), "July", "7 = July");
|
is (Date::monthName (7), "July", "7 = July");
|
||||||
t.is (Date::monthName (8), "August", "8 = August");
|
is (Date::monthName (8), "August", "8 = August");
|
||||||
t.is (Date::monthName (9), "September", "9 = September");
|
is (Date::monthName (9), "September", "9 = September");
|
||||||
t.is (Date::monthName (10), "October", "10 = October");
|
is (Date::monthName (10), "October", "10 = October");
|
||||||
t.is (Date::monthName (11), "November", "11 = November");
|
is (Date::monthName (11), "November", "11 = November");
|
||||||
t.is (Date::monthName (12), "December", "12 = December");
|
is (Date::monthName (12), "December", "12 = December");
|
||||||
|
|
||||||
t.is (Date::dayName (0), "Sunday", "0 == Sunday");
|
is (Date::dayName (0), "Sunday", "0 == Sunday");
|
||||||
t.is (Date::dayName (1), "Monday", "1 == Monday");
|
is (Date::dayName (1), "Monday", "1 == Monday");
|
||||||
t.is (Date::dayName (2), "Tuesday", "2 == Tuesday");
|
is (Date::dayName (2), "Tuesday", "2 == Tuesday");
|
||||||
t.is (Date::dayName (3), "Wednesday", "3 == Wednesday");
|
is (Date::dayName (3), "Wednesday", "3 == Wednesday");
|
||||||
t.is (Date::dayName (4), "Thursday", "4 == Thursday");
|
is (Date::dayName (4), "Thursday", "4 == Thursday");
|
||||||
t.is (Date::dayName (5), "Friday", "5 == Friday");
|
is (Date::dayName (5), "Friday", "5 == Friday");
|
||||||
t.is (Date::dayName (6), "Saturday", "6 == Saturday");
|
is (Date::dayName (6), "Saturday", "6 == Saturday");
|
||||||
|
|
||||||
Date happyNewYear (1, 1, 2008);
|
Date happyNewYear (1, 1, 2008);
|
||||||
t.is (happyNewYear.dayOfWeek (), 2, "1/1/2008 == Tuesday");
|
is (happyNewYear.dayOfWeek (), 2, "1/1/2008 == Tuesday");
|
||||||
t.is (happyNewYear.month (), 1, "1/1/2008 == January");
|
is (happyNewYear.month (), 1, "1/1/2008 == January");
|
||||||
t.is (happyNewYear.day (), 1, "1/1/2008 == 1");
|
is (happyNewYear.day (), 1, "1/1/2008 == 1");
|
||||||
t.is (happyNewYear.year (), 2008, "1/1/2008 == 2008");
|
is (happyNewYear.year (), 2008, "1/1/2008 == 2008");
|
||||||
|
|
||||||
t.is (now - yesterday, 1, "today - yesterday == 1");
|
is (now - yesterday, 1, "today - yesterday == 1");
|
||||||
|
|
||||||
t.is (happyNewYear.toString (), "1/1/2008", "toString 1/1/2008");
|
is (happyNewYear.toString (), "1/1/2008", "toString 1/1/2008");
|
||||||
|
|
||||||
int m, d, y;
|
int m, d, y;
|
||||||
happyNewYear.toMDY (m, d, y);
|
happyNewYear.toMDY (m, d, y);
|
||||||
t.is (m, 1, "1/1/2008 == January");
|
is (m, 1, "1/1/2008 == January");
|
||||||
t.is (d, 1, "1/1/2008 == 1");
|
is (d, 1, "1/1/2008 == 1");
|
||||||
t.is (y, 2008, "1/1/2008 == 2008");
|
is (y, 2008, "1/1/2008 == 2008");
|
||||||
|
|
||||||
Date epoch (9, 8, 2001);
|
Date epoch (9, 8, 2001);
|
||||||
t.ok ((int)epoch.toEpoch () < 1000000000, "9/8/2001 < 1,000,000,000");
|
ok ((int)epoch.toEpoch () < 1000000000, "9/8/2001 < 1,000,000,000");
|
||||||
epoch += 86400;
|
epoch += 86400;
|
||||||
t.ok ((int)epoch.toEpoch () > 1000000000, "9/9/2001 > 1,000,000,000");
|
ok ((int)epoch.toEpoch () > 1000000000, "9/9/2001 > 1,000,000,000");
|
||||||
|
|
||||||
Date fromEpoch (epoch.toEpoch ());
|
Date fromEpoch (epoch.toEpoch ());
|
||||||
t.is (fromEpoch.toString (), epoch.toString (), "ctor (time_t)");
|
is (fromEpoch.toString (), epoch.toString (), "ctor (time_t)");
|
||||||
|
|
||||||
Date fromString ("1/1/2008");
|
Date fromString1 ("1/1/2008");
|
||||||
t.is (fromString.month (), 1, "ctor (std::string) -> m");
|
is (fromString1.month (), 1, "ctor (std::string) -> m");
|
||||||
t.is (fromString.day (), 1, "ctor (std::string) -> d");
|
is (fromString1.day (), 1, "ctor (std::string) -> d");
|
||||||
t.is (fromString.year (), 2008, "ctor (std::string) -> y");
|
is (fromString1.year (), 2008, "ctor (std::string) -> y");
|
||||||
|
|
||||||
|
Date fromString2 ("1/1/2008", "m/d/Y");
|
||||||
|
is (fromString2.month (), 1, "ctor (std::string) -> m");
|
||||||
|
is (fromString2.day (), 1, "ctor (std::string) -> d");
|
||||||
|
is (fromString2.year (), 2008, "ctor (std::string) -> y");
|
||||||
|
|
||||||
|
Date fromString3 ("20080101", "YMD");
|
||||||
|
is (fromString3.month (), 1, "ctor (std::string) -> m");
|
||||||
|
is (fromString3.day (), 1, "ctor (std::string) -> d");
|
||||||
|
is (fromString3.year (), 2008, "ctor (std::string) -> y");
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue