From 012affa46a19682721206f377b5258f2fe426e00 Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Sun, 12 Jul 2015 22:03:00 -0400 Subject: [PATCH] CmdUnique: New helper command to generate unique value lists --- src/commands/CMakeLists.txt | 1 + src/commands/CmdUnique.cpp | 94 +++++++++++++++++++++++++++++++++++++ src/commands/CmdUnique.h | 41 ++++++++++++++++ src/commands/Command.cpp | 2 + src/l10n/deu-DEU.h | 3 ++ src/l10n/eng-USA.h | 3 ++ src/l10n/epo-RUS.h | 3 ++ src/l10n/esp-ESP.h | 3 ++ src/l10n/fra-FRA.h | 3 ++ src/l10n/ita-ITA.h | 3 ++ src/l10n/jpn-JPN.h | 3 ++ src/l10n/pol-POL.h | 3 ++ src/l10n/por-PRT.h | 3 ++ 13 files changed, 165 insertions(+) create mode 100644 src/commands/CmdUnique.cpp create mode 100644 src/commands/CmdUnique.h diff --git a/src/commands/CMakeLists.txt b/src/commands/CMakeLists.txt index 035d0dc14..cd6f7a519 100644 --- a/src/commands/CMakeLists.txt +++ b/src/commands/CMakeLists.txt @@ -51,6 +51,7 @@ set (commands_SRCS Command.cpp Command.h CmdTimesheet.cpp CmdTimesheet.h CmdUDAs.cpp CmdUDAs.h CmdUndo.cpp CmdUndo.h + CmdUnique.cpp CmdUnique.h CmdUrgency.cpp CmdUrgency.h CmdVersion.cpp CmdVersion.h) diff --git a/src/commands/CmdUnique.cpp b/src/commands/CmdUnique.cpp new file mode 100644 index 000000000..839001e2f --- /dev/null +++ b/src/commands/CmdUnique.cpp @@ -0,0 +1,94 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2006 - 2015, Paul Beckingham, Federico Hernandez. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +// http://www.opensource.org/licenses/mit-license.php +// +//////////////////////////////////////////////////////////////////////////////// + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +extern Context context; + +//////////////////////////////////////////////////////////////////////////////// +CmdUnique::CmdUnique () +{ + _keyword = "_unique"; + _usage = "task _unique "; + _description = STRING_CMD_UNIQUE_USAGE; + _read_only = false; + _displays_id = true; +} + +//////////////////////////////////////////////////////////////////////////////// +int CmdUnique::execute (std::string& output) +{ + // Apply filter. + Filter filter; + filter.disableSafety (); + std::vector filtered; + filter.subset (filtered); + + // Find . + std::string attribute = ""; + for (auto& a : context.cli2._args) + { + if ((a._lextype == Lexer::Type::word || + a._lextype == Lexer::Type::dom) && + a.hasTag ("MODIFICATION")) + { + // Stop at first matching arg. + attribute = a.attribute ("raw"); + break; + } + } + + if (attribute == "") + throw std::string (STRING_CMD_UNIQUE_MISSING); + + std::string canonical; + if (! context.cli2.canonicalize (canonical, "attribute", attribute) && + ! context.cli2.canonicalize (canonical, "uda", attribute)) + throw std::string (STRING_CMD_UNIQUE_VALID); + + // Find number of matching tasks. + std::set values; + for (auto& task : filtered) + if (task.has (canonical)) + values.insert (task.get (canonical)); + + // Generate list of unique values. + for (auto& value : values) + std::cout << value << "\n"; + + context.headers.clear (); + return 0; +} + +/////////////////////////////////////////////////////////////////////////////// diff --git a/src/commands/CmdUnique.h b/src/commands/CmdUnique.h new file mode 100644 index 000000000..333391e54 --- /dev/null +++ b/src/commands/CmdUnique.h @@ -0,0 +1,41 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2006 - 2015, Paul Beckingham, Federico Hernandez. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +// http://www.opensource.org/licenses/mit-license.php +// +//////////////////////////////////////////////////////////////////////////////// + +#ifndef INCLUDED_CMDUNIQUE +#define INCLUDED_CMDUNIQUE + +#include +#include + +class CmdUnique : public Command +{ +public: + CmdUnique (); + int execute (std::string&); +}; + +#endif +//////////////////////////////////////////////////////////////////////////////// diff --git a/src/commands/Command.cpp b/src/commands/Command.cpp index 5299ddd92..a3e2c336b 100644 --- a/src/commands/Command.cpp +++ b/src/commands/Command.cpp @@ -81,6 +81,7 @@ #include #include #include +#include #include #include @@ -155,6 +156,7 @@ void Command::factory (std::map & all) c = new CmdTimesheet (); all[c->keyword ()] = c; c = new CmdUDAs (); all[c->keyword ()] = c; c = new CmdUndo (); all[c->keyword ()] = c; + c = new CmdUnique (); all[c->keyword ()] = c; c = new CmdUrgency (); all[c->keyword ()] = c; c = new CmdUUIDs (); all[c->keyword ()] = c; c = new CmdVersion (); all[c->keyword ()] = c; diff --git a/src/l10n/deu-DEU.h b/src/l10n/deu-DEU.h index a64746e84..796c4c7a7 100644 --- a/src/l10n/deu-DEU.h +++ b/src/l10n/deu-DEU.h @@ -338,6 +338,9 @@ #define STRING_CMD_GHISTORY_YEAR "Jahr" #define STRING_CMD_GHISTORY_MONTH "Monat" #define STRING_CMD_GHISTORY_NUMBER "Anzahl Hinzugefügt/Erledigt/Gelöscht" +#define STRING_CMD_UNIQUE_USAGE "Generates lists of unique attribute values" +#define STRING_CMD_UNIQUE_MISSING "An attribute must be specified. See 'task _columns'." +#define STRING_CMD_UNIQUE_VALID "You must specify an attribute or UDA." #define STRING_CMD_DONE_USAGE "Kennzeichnet die gewählte Aufgabe als erledigt" #define STRING_CMD_DONE_CONFIRM "Aufgabe {1} '{2}' als erledigt kennzeichnen?" diff --git a/src/l10n/eng-USA.h b/src/l10n/eng-USA.h index 1d7ff3853..a9b69ce6f 100644 --- a/src/l10n/eng-USA.h +++ b/src/l10n/eng-USA.h @@ -338,6 +338,9 @@ #define STRING_CMD_GHISTORY_YEAR "Year" #define STRING_CMD_GHISTORY_MONTH "Month" #define STRING_CMD_GHISTORY_NUMBER "Number Added/Completed/Deleted" +#define STRING_CMD_UNIQUE_USAGE "Generates lists of unique attribute values" +#define STRING_CMD_UNIQUE_MISSING "An attribute must be specified. See 'task _columns'." +#define STRING_CMD_UNIQUE_VALID "You must specify an attribute or UDA." #define STRING_CMD_DONE_USAGE "Marks the specified task as completed" #define STRING_CMD_DONE_CONFIRM "Complete task {1} '{2}'?" diff --git a/src/l10n/epo-RUS.h b/src/l10n/epo-RUS.h index 01c637f56..8c4372d2e 100644 --- a/src/l10n/epo-RUS.h +++ b/src/l10n/epo-RUS.h @@ -338,6 +338,9 @@ #define STRING_CMD_GHISTORY_YEAR "Jaro" #define STRING_CMD_GHISTORY_MONTH "Monato" #define STRING_CMD_GHISTORY_NUMBER "Nombro Kreitaj/Finitaj/Viŝitaj" +#define STRING_CMD_UNIQUE_USAGE "Generates lists of unique attribute values" +#define STRING_CMD_UNIQUE_MISSING "An attribute must be specified. See 'task _columns'." +#define STRING_CMD_UNIQUE_VALID "You must specify an attribute or UDA." #define STRING_CMD_DONE_USAGE "Markas la specifatan taskon kiel finita" #define STRING_CMD_DONE_CONFIRM "Fini taskon {1} '{2}'?" diff --git a/src/l10n/esp-ESP.h b/src/l10n/esp-ESP.h index b271b01da..faac29b52 100644 --- a/src/l10n/esp-ESP.h +++ b/src/l10n/esp-ESP.h @@ -345,6 +345,9 @@ #define STRING_CMD_GHISTORY_YEAR "Año" #define STRING_CMD_GHISTORY_MONTH "Mes" #define STRING_CMD_GHISTORY_NUMBER "Número Añadidas/Completadas/Suprimidas" +#define STRING_CMD_UNIQUE_USAGE "Generates lists of unique attribute values" +#define STRING_CMD_UNIQUE_MISSING "An attribute must be specified. See 'task _columns'." +#define STRING_CMD_UNIQUE_VALID "You must specify an attribute or UDA." #define STRING_CMD_DONE_USAGE "Marca la tarea especificada como completada" #define STRING_CMD_DONE_CONFIRM "¿Completar tarea {1} '{2}'?" diff --git a/src/l10n/fra-FRA.h b/src/l10n/fra-FRA.h index e2474d1a0..525aeaa91 100644 --- a/src/l10n/fra-FRA.h +++ b/src/l10n/fra-FRA.h @@ -338,6 +338,9 @@ #define STRING_CMD_GHISTORY_YEAR "An" #define STRING_CMD_GHISTORY_MONTH "Mois" #define STRING_CMD_GHISTORY_NUMBER "Number Added/Completed/Deleted" +#define STRING_CMD_UNIQUE_USAGE "Generates lists of unique attribute values" +#define STRING_CMD_UNIQUE_MISSING "An attribute must be specified. See 'task _columns'." +#define STRING_CMD_UNIQUE_VALID "You must specify an attribute or UDA." #define STRING_CMD_DONE_USAGE "Marque la tâche spécifiée comme terminée" #define STRING_CMD_DONE_CONFIRM "Terminer la tâche {1} '{2}'?" diff --git a/src/l10n/ita-ITA.h b/src/l10n/ita-ITA.h index 5c67c592a..9cc6848a9 100644 --- a/src/l10n/ita-ITA.h +++ b/src/l10n/ita-ITA.h @@ -337,6 +337,9 @@ #define STRING_CMD_GHISTORY_YEAR "Anno" #define STRING_CMD_GHISTORY_MONTH "Mese" #define STRING_CMD_GHISTORY_NUMBER "Aggiunti/Completati/Cancellati" +#define STRING_CMD_UNIQUE_USAGE "Generates lists of unique attribute values" +#define STRING_CMD_UNIQUE_MISSING "An attribute must be specified. See 'task _columns'." +#define STRING_CMD_UNIQUE_VALID "You must specify an attribute or UDA." #define STRING_CMD_DONE_USAGE "Contrassegna il task specificato come completato" #define STRING_CMD_DONE_CONFIRM "Completare il task {1} '{2}'?" diff --git a/src/l10n/jpn-JPN.h b/src/l10n/jpn-JPN.h index 0ad641db4..735a7896e 100644 --- a/src/l10n/jpn-JPN.h +++ b/src/l10n/jpn-JPN.h @@ -338,6 +338,9 @@ #define STRING_CMD_GHISTORY_YEAR "Year" #define STRING_CMD_GHISTORY_MONTH "Month" #define STRING_CMD_GHISTORY_NUMBER "Number Added/Completed/Deleted" +#define STRING_CMD_UNIQUE_USAGE "Generates lists of unique attribute values" +#define STRING_CMD_UNIQUE_MISSING "An attribute must be specified. See 'task _columns'." +#define STRING_CMD_UNIQUE_VALID "You must specify an attribute or UDA." #define STRING_CMD_DONE_USAGE "Marks the specified task as completed" #define STRING_CMD_DONE_CONFIRM "task {1} '{2}' を完了?" diff --git a/src/l10n/pol-POL.h b/src/l10n/pol-POL.h index 25e0739bb..641ef1a24 100644 --- a/src/l10n/pol-POL.h +++ b/src/l10n/pol-POL.h @@ -338,6 +338,9 @@ #define STRING_CMD_GHISTORY_YEAR "Rok" #define STRING_CMD_GHISTORY_MONTH "Miesiąc" #define STRING_CMD_GHISTORY_NUMBER "Liczba Dodanych/Ukończonych/Usuniętych" +#define STRING_CMD_UNIQUE_USAGE "Generates lists of unique attribute values" +#define STRING_CMD_UNIQUE_MISSING "An attribute must be specified. See 'task _columns'." +#define STRING_CMD_UNIQUE_VALID "You must specify an attribute or UDA." #define STRING_CMD_DONE_USAGE "Oznacza wybrane zadanie jako zakończone" #define STRING_CMD_DONE_CONFIRM "Zakończyć zadanie {1} '{2}'?" diff --git a/src/l10n/por-PRT.h b/src/l10n/por-PRT.h index dfe1d36be..058a129e4 100644 --- a/src/l10n/por-PRT.h +++ b/src/l10n/por-PRT.h @@ -338,6 +338,9 @@ #define STRING_CMD_GHISTORY_YEAR "Ano" #define STRING_CMD_GHISTORY_MONTH "Mês" #define STRING_CMD_GHISTORY_NUMBER "Número de Adicionadas/Concluídas/Eliminadas" +#define STRING_CMD_UNIQUE_USAGE "Generates lists of unique attribute values" +#define STRING_CMD_UNIQUE_MISSING "An attribute must be specified. See 'task _columns'." +#define STRING_CMD_UNIQUE_VALID "You must specify an attribute or UDA." #define STRING_CMD_DONE_USAGE "Concluí a tarefa indicada" #define STRING_CMD_DONE_CONFIRM "Concluír tarefa {1} '{2}'?"