From 37bd07883ba164b3fb17b428aca1602fb65ff136 Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Mon, 3 Aug 2015 09:05:17 -0400 Subject: [PATCH] DOM: Clarified _get behavior - It is an error to provide no DOM references (task _get). - It is an error to provide bad DOM references (task _get donkey). In this example, 'donkey' could be a UDA orphan. - It is not an error for a valid DOM reference to yield no value. --- src/commands/CmdGet.cpp | 45 ++++++++++++++++++++++++++++------------- src/l10n/deu-DEU.h | 1 + src/l10n/eng-USA.h | 1 + src/l10n/epo-RUS.h | 1 + src/l10n/esp-ESP.h | 1 + src/l10n/fra-FRA.h | 1 + src/l10n/ita-ITA.h | 1 + src/l10n/jpn-JPN.h | 1 + src/l10n/pol-POL.h | 1 + src/l10n/por-PRT.h | 1 + test/dom.t | 9 +++++++-- 11 files changed, 47 insertions(+), 16 deletions(-) diff --git a/src/commands/CmdGet.cpp b/src/commands/CmdGet.cpp index a2da1139b..d27bdee65 100644 --- a/src/commands/CmdGet.cpp +++ b/src/commands/CmdGet.cpp @@ -51,30 +51,47 @@ CmdGet::CmdGet () } //////////////////////////////////////////////////////////////////////////////// +// Rely on the Lexer to correctly identify DOM references, then jsut iterate +// over those. +// +// It is an error to specify no DOM references. +// It is not an error for a DOM reference to resolve to a blank value. int CmdGet::execute (std::string& output) { - // Obtain the arguments from the description. That way, things like '--' - // have already been handled. - std::vector words = context.cli2.getWords (false); - if (words.size () == 0) - throw std::string (STRING_CMD_GET_NO_DOM); - - bool found = false; std::vector results; - for (auto& word : words) + for (auto& arg : context.cli2._args) { - Task t; - Variant result; - if (context.dom.get (word, t, result)) + switch (arg._lextype) { - results.push_back ((std::string) result); - found = true; + case Lexer::Type::dom: + { + Task t; + Variant result; + if (context.dom.get (arg.attribute ("raw"), t, result)) + results.push_back ((std::string) result); + else + results.push_back (""); + } + break; + + // Look for non-refs to complain about. + case Lexer::Type::word: + case Lexer::Type::identifier: + if (! arg.hasTag ("BINARY") && + ! arg.hasTag ("CMD")) + throw format (STRING_CMD_GET_BAD_REF, arg.attribute ("raw")); + + default: + break; } } + if (results.size () == 0) + throw std::string (STRING_CMD_GET_NO_DOM); + join (output, " ", results); output += "\n"; - return found ? 0 : 1; + return 0; } //////////////////////////////////////////////////////////////////////////////// diff --git a/src/l10n/deu-DEU.h b/src/l10n/deu-DEU.h index acaff2ad7..450723a5e 100644 --- a/src/l10n/deu-DEU.h +++ b/src/l10n/deu-DEU.h @@ -366,6 +366,7 @@ #define STRING_CMD_COUNT_USAGE "Zählt gewählte Aufgaben" #define STRING_CMD_GET_USAGE "DOM-Accessor" #define STRING_CMD_GET_NO_DOM "Keine DOM-Referenz spezifiziert." +#define STRING_CMD_GET_BAD_REF "'{1}' is not a DOM reference." #define STRING_CMD_UDAS_NO "Keine UDAs festgelegt." #define STRING_CMD_UDAS_SUMMARY "{1} UDA festgelegt" diff --git a/src/l10n/eng-USA.h b/src/l10n/eng-USA.h index 3e79294ba..0e1789881 100644 --- a/src/l10n/eng-USA.h +++ b/src/l10n/eng-USA.h @@ -366,6 +366,7 @@ #define STRING_CMD_COUNT_USAGE "Counts matching tasks" #define STRING_CMD_GET_USAGE "DOM Accessor" #define STRING_CMD_GET_NO_DOM "No DOM reference specified." +#define STRING_CMD_GET_BAD_REF "'{1}' is not a DOM reference." #define STRING_CMD_UDAS_NO "No UDAs defined." #define STRING_CMD_UDAS_SUMMARY "{1} UDA defined" diff --git a/src/l10n/epo-RUS.h b/src/l10n/epo-RUS.h index 53a5edb41..dfcd1f7c7 100644 --- a/src/l10n/epo-RUS.h +++ b/src/l10n/epo-RUS.h @@ -366,6 +366,7 @@ #define STRING_CMD_COUNT_USAGE "Nombras kongruantajn taskojn" #define STRING_CMD_GET_USAGE "DOM-enirilo" #define STRING_CMD_GET_NO_DOM "Nenia DOM-referenco specifata." +#define STRING_CMD_GET_BAD_REF "'{1}' is not a DOM reference." #define STRING_CMD_UDAS_NO "Nenia UDA definita." #define STRING_CMD_UDAS_SUMMARY "{1} UDA definita" diff --git a/src/l10n/esp-ESP.h b/src/l10n/esp-ESP.h index 0206eb22e..c75328588 100644 --- a/src/l10n/esp-ESP.h +++ b/src/l10n/esp-ESP.h @@ -373,6 +373,7 @@ #define STRING_CMD_COUNT_USAGE "Cuenta tareas que coinciden" #define STRING_CMD_GET_USAGE "Método de acceso al DOM" #define STRING_CMD_GET_NO_DOM "Referencia a DOM no especificada." +#define STRING_CMD_GET_BAD_REF "'{1}' is not a DOM reference." #define STRING_CMD_UDAS_NO "Ningún UDA definido." #define STRING_CMD_UDAS_SUMMARY "{1} UDA definido" diff --git a/src/l10n/fra-FRA.h b/src/l10n/fra-FRA.h index 62b1cc674..badee61f5 100644 --- a/src/l10n/fra-FRA.h +++ b/src/l10n/fra-FRA.h @@ -366,6 +366,7 @@ #define STRING_CMD_COUNT_USAGE "Compte les taches correspondantes" #define STRING_CMD_GET_USAGE "Accesseur au DOM" #define STRING_CMD_GET_NO_DOM "Aucune référence de DOM spécifié." +#define STRING_CMD_GET_BAD_REF "'{1}' is not a DOM reference." #define STRING_CMD_UDAS_NO "Aucuns ADUs définies." #define STRING_CMD_UDAS_SUMMARY "{1} ADU définie" diff --git a/src/l10n/ita-ITA.h b/src/l10n/ita-ITA.h index ecc733973..5bd51aa5f 100644 --- a/src/l10n/ita-ITA.h +++ b/src/l10n/ita-ITA.h @@ -365,6 +365,7 @@ #define STRING_CMD_COUNT_USAGE "Conteggia task corrispondenti" #define STRING_CMD_GET_USAGE "DOM Accessor" #define STRING_CMD_GET_NO_DOM "No DOM reference specified." +#define STRING_CMD_GET_BAD_REF "'{1}' is not a DOM reference." #define STRING_CMD_UDAS_NO "Nessun UDA definito." #define STRING_CMD_UDAS_SUMMARY "{1} UDA definito" diff --git a/src/l10n/jpn-JPN.h b/src/l10n/jpn-JPN.h index 5f8831a59..2cf18f176 100644 --- a/src/l10n/jpn-JPN.h +++ b/src/l10n/jpn-JPN.h @@ -366,6 +366,7 @@ #define STRING_CMD_COUNT_USAGE "一致した タスク をカウント" #define STRING_CMD_GET_USAGE "DOM Accessor" #define STRING_CMD_GET_NO_DOM "No DOM reference specified." +#define STRING_CMD_GET_BAD_REF "'{1}' is not a DOM reference." #define STRING_CMD_UDAS_NO "UDAが一つも定義されていません。" #define STRING_CMD_UDAS_SUMMARY "{1} UDA が定義されました。" diff --git a/src/l10n/pol-POL.h b/src/l10n/pol-POL.h index 359d0e206..6a8ef3f52 100644 --- a/src/l10n/pol-POL.h +++ b/src/l10n/pol-POL.h @@ -366,6 +366,7 @@ #define STRING_CMD_COUNT_USAGE "Zlicza pasujące zadania" #define STRING_CMD_GET_USAGE "DOM Akcesor" #define STRING_CMD_GET_NO_DOM "Brak zdefiniowanej referencji do DOM." +#define STRING_CMD_GET_BAD_REF "'{1}' is not a DOM reference." #define STRING_CMD_UDAS_NO "Nie zdefiniowano UDA" #define STRING_CMD_UDAS_SUMMARY "{1} zdefiniowane UDA" diff --git a/src/l10n/por-PRT.h b/src/l10n/por-PRT.h index 3a1b65019..e90eb3afb 100644 --- a/src/l10n/por-PRT.h +++ b/src/l10n/por-PRT.h @@ -366,6 +366,7 @@ #define STRING_CMD_COUNT_USAGE "Conta tarefas correspondentes" #define STRING_CMD_GET_USAGE "Método de acesso ao DOM" #define STRING_CMD_GET_NO_DOM "Referência DOM não especificada." +#define STRING_CMD_GET_BAD_REF "'{1}' is not a DOM reference." #define STRING_CMD_UDAS_NO "Nenhum UDA definido." #define STRING_CMD_UDAS_SUMMARY "{1} UDA definido" diff --git a/test/dom.t b/test/dom.t index 1af3a9b66..3f93054b7 100755 --- a/test/dom.t +++ b/test/dom.t @@ -50,6 +50,11 @@ class TestDOM(TestCase): code, out, err = self.t.runError("_get") self.assertEqual("No DOM reference specified.\n", err) + def test_dom_bad_ref(self): + """ DOM bad reference """ + code, out, err = self.t.runError("_get donkey") + self.assertEqual("'donkey' is not a DOM reference.\n", err) + def test_dom_task_ref(self): """ DOM reference to other task """ code, out, err = self.t("_get 2.due") @@ -187,8 +192,8 @@ class TestDOM(TestCase): def test_dom_rc_missing(self): """ DOM rc.missing """ - code, out, err = self.t.runError("_get rc.missing") - self.assertEqual(code, 1) + code, out, err = self.t("_get rc.missing") + self.assertEqual("\n", out) def test_dom_attribute_missing(self): """DOM 1.end (missing)"""