diff --git a/LICENSE b/LICENSE index f9f3153..72ef792 100644 --- a/LICENSE +++ b/LICENSE @@ -1,22 +1,20 @@ The MIT License (MIT) -Copyright (c) 2014, 2015 Nelson Martell +Copyright (c) 2014-2015 Nelson Martell -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: +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. - +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. diff --git a/Locale/es/LC_MESSAGES/nml.mo b/Locale/es/LC_MESSAGES/nml.mo index 3d804df..f808b46 100644 Binary files a/Locale/es/LC_MESSAGES/nml.mo and b/Locale/es/LC_MESSAGES/nml.mo differ diff --git a/Locale/es/LC_MESSAGES/nml.po b/Locale/es/LC_MESSAGES/nml.po index 9d5b15a..acaca90 100644 --- a/Locale/es/LC_MESSAGES/nml.po +++ b/Locale/es/LC_MESSAGES/nml.po @@ -1,8 +1,8 @@ msgid "" msgstr "" "Project-Id-Version: PHP: Nelson Martell Library 1.0\n" -"POT-Creation-Date: 2015-02-25 14:55-0430\n" -"PO-Revision-Date: 2015-02-25 15:01-0430\n" +"POT-Creation-Date: 2015-07-05 01:20-0430\n" +"PO-Revision-Date: 2015-07-05 01:21-0430\n" "Last-Translator: Nelson Martell \n" "Language-Team: \n" "Language: es\n" @@ -16,170 +16,295 @@ msgstr "" "X-Poedit-SearchPath-0: ../../../src\n" "X-Poedit-SearchPath-1: ../../..\n" -#: ../../../autoload.php:39 -#, php-format +#: src/Extensions/String.php:84 +msgid "Provided object must not be NULL." +msgstr "" + +#: src/Extensions/String.php:101 +msgid "Provided object must to be an string; \"{0}\" given." +msgstr "" + +#: src/Extensions/String.php:118 +msgid "Provided string must not be empty." +msgstr "" + +#: src/Extensions/String.php:135 +msgid "Provided string must not be white spaces." +msgstr "" + +#: src/Extensions/String.php:153 msgid "" -"Unable to auto-load \"%s\" class in Nelson Martell Library (NML): \"%s\" " -"file was not found. You can see the API documentation (http://nelson6e65." -"github.io/php_nml/api) in order to check availability of all classes/" -"namespaces in NML. Note: If you are using \"NelsonMartell\" as main " -"namespace in a file that not belongs to NML, you should include it before to " -"load \"NML/autoload.php\" or, using SPL autoload features, register autoload " -"function for that class(es) using \"prepend\" argument for " -"spl_autoload_register function set to TRUE." -msgstr "" -"No se puede cargar la clase \"%s\" en Nelson Martell Library (NML): El " -"archivo \"%s\" no fue encontrado. Puedes ver la documentación de la API " -"(http://nelson6e65.github.io/php_nml/api) para chequear la disponibilidad de " -"todas las clases/namespaces en NML. Nota: Si estás usando \"NelsonMartell\" " -"como espacio de nombres principal en un archivo que no pertenece a NML, " -"deberías incluirlo antes de cargar \"NML/autoload.php\" ó, usando las " -"funciones de autocarga de SPL, registrar la función autoload para esa(s) " -"clase(s) usando el argumento \"prepend\" de la función spl_autoload_register " -"establecido en TRUE." - -#: ../../../src/Collections/Collection.php:168 -#, php-format -msgid "%1$s (%2$d items): { %3$s }" -msgstr "%1$s (%2$d elementos): { %3$s }" +"Provided string do not follows PHP variables naming convention: \"{0}\"." +msgstr "" -#: ../../../src/Object.php:67 ../../../src/Object.php:96 -msgid "Property do not exists" -msgstr "La propiedad no existe" +#: src/Object.php:96 +msgid "Using default \"{base_class}::{function}\" ({access}) method." +msgstr "" -#: ../../../src/Object.php:74 -msgid "Property is write only" -msgstr "La propiedad es de sólo escritura" +#: src/Object.php:98 src/Object.php:139 +msgid "" +" You can replace (override) its behavior by creating \"{class}::" +"{function}\" ({access}) method." +msgstr "" -#: ../../../src/Object.php:79 -#, php-format -msgid "Unable to access to '%s' property in '%s' class. Reason: %s" -msgstr "No se puede acceder a la propiedad '%s' en la clase '%s'. Razón: %s" +#: src/Object.php:134 +msgid "" +"You implemented IEquatable, but using default \"{base_class}::" +"{function}\" ({access}) method." +msgstr "" -#: ../../../src/Object.php:103 -msgid "Property is read only" -msgstr "La propiedad es de sólo lectura" +#: src/Utilities/Asset.php:59 src/Utilities/Asset.php:90 +#: src/Utilities/Asset.php:119 src/Utilities/Asset.php:182 +#: src/Utilities/Asset.php:313 src/Version.php:97 src/Version.php:113 +#: src/VersionComponent.php:47 src/VersionComponent.php:103 +msgid "Invalid argument value." +msgstr "" -#: ../../../src/Object.php:108 -#, php-format -msgid "Unable to assign '%s' property in '%s' class. Reason: %s" -msgstr "No se puede asignar la propiedad '%s' en la clase '%s'. Razón: %s" +#: src/Utilities/Asset.php:61 +msgid "" +" \"{name}\" (position {pos}) can not be specified if \"{name2}\" (position " +"{pos2}) is \"null\"." +msgstr "" -#: ../../../src/Object.php:137 -#, php-format +#: src/Utilities/Asset.php:92 msgid "" -"Using default %s method. You can replace its behavior, overriding it by " -"creating %s::ToString() public method." +" \"{name}\" (position {pos}) must to be an array of \"{expected}\" elements " +"(or any parseable into \"{expected}\"); the array given has an invalid " +"\"{actual}\" element." msgstr "" -"Usando el método %s predeterminado. Puedes reemplazar su comportamiento, " -"sobrescribiéndolo, creando el método público %s::ToString()." -#: ../../../src/Object.php:157 -#, php-format +#: src/Utilities/Asset.php:121 msgid "" -"You implemented IEquatable interface, but using default Object::Equals() " -"method. You must override it, creating %s::Equals() public method." +" \"{name}\" (position {pos}) must to be an array of \"{expected}\" elements, " +"an instance of \"{expected}\" or any object parseable into \"{expected}\"; " +"\"{actual}\" given." msgstr "" -"Has implementado la interfaz IEquatable, pero se está usando el método " -"predeterminado Object::Equals(). Debes sobreescribirlo creando el método " -"público %s::Equals()." -#: ../../../src/Type.php:75 -msgid "To get the name, use Type::Name property instead." -msgstr "Para obtener el nombre, usa la propiedad Type::Name más bien." +#: src/Utilities/Asset.php:164 src/Utilities/Asset.php:302 src/Version.php:61 +#: src/Version.php:80 src/VersionComponent.php:67 src/VersionComponent.php:122 +msgid "Invalid argument type." +msgstr "" -#: ../../../src/Type.php:93 -msgid "To get vars, use Type::Vars property instead." -msgstr "Para obtener las variables, usa la propiedad Type::Vars más bien." +#: src/Utilities/Asset.php:166 +msgid "" +" \"{class}::{property}\" must to be an instance of \"{expected}\"; " +"\"{actual}\" given." +msgstr "" -#: ../../../src/Type.php:111 -msgid "To get methods, use Type::Methods property instead." -msgstr "Para obtener los métodos, usa la propiedad Type::Methods más bien." +#: src/Utilities/Asset.php:184 +msgid " \"{class}::{property}\" value can not be empty or whitespace." +msgstr "" -#: ../../../src/Utilities/Asset.php:52 -msgid "Can not specify $versions argument if $name argument is null." +#: src/Utilities/Asset.php:275 +msgid "This Asset has not versions." msgstr "" -"No se puede especificar el argumento $versions si el argumento $name es null." -#: ../../../src/Utilities/Asset.php:204 -msgid "Asset has not versions." -msgstr "Recurso no tiene versiones definidas." +#: src/Utilities/Asset.php:304 +msgid "" +" \"{name}\" (position {pos}) must to be an instance of \"{expected}\" (or " +"compatible); \"{actual}\" given." +msgstr "" -#: ../../../src/Utilities/Asset.php:228 -#, php-format -msgid "Asset has not version %s." -msgstr "Recurso no tiene definida la versión %s." +#: src/Utilities/Asset.php:314 +msgid " Asset has not the version \"{version}\"." +msgstr "" -#: ../../../src/Utilities/UnitTesting/Assert.php:83 +#: src/Utilities/UnitTesting/Assert.php:89 #, php-format msgid "%5$s failed. Expected: (%3$s) \"%4$s\". Actual: (%1$s) \"%2$s\"." msgstr "%5$s ha fallado. Se esperaba: (%3$s) \"%4$s\". Real: (%1$s) \"%2$s\"." -#: ../../../src/Utilities/UnitTesting/Assert.php:86 -#: ../../../src/Utilities/UnitTesting/Assert.php:131 -#: ../../../src/Utilities/UnitTesting/Assert.php:187 -#: ../../../src/Utilities/UnitTesting/Assert.php:204 -#: ../../../src/Utilities/UnitTesting/Assert.php:241 -#: ../../../src/Utilities/UnitTesting/Assert.php:258 +#: src/Utilities/UnitTesting/Assert.php:98 +#: src/Utilities/UnitTesting/Assert.php:151 +#: src/Utilities/UnitTesting/Assert.php:220 +#: src/Utilities/UnitTesting/Assert.php:242 +#: src/Utilities/UnitTesting/Assert.php:290 +#: src/Utilities/UnitTesting/Assert.php:312 #, php-format msgid "Message: %s" msgstr "Mensaje: %s" -#: ../../../src/Utilities/UnitTesting/Assert.php:128 +#: src/Utilities/UnitTesting/Assert.php:142 #, php-format msgid "%5$s failed. Not expected: (%3$s) \"%4$s\". Actual: (%1$s) \"%2$s\"." msgstr "" "%5$s ha fallado. No se esperaba: (%3$s) \"%4$s\". Real: (%1$s) \"%2$s\"." -#: ../../../src/Utilities/UnitTesting/Assert.php:184 -#: ../../../src/Utilities/UnitTesting/Assert.php:201 -#: ../../../src/Utilities/UnitTesting/Assert.php:238 -#: ../../../src/Utilities/UnitTesting/Assert.php:255 +#: src/Utilities/UnitTesting/Assert.php:213 +#: src/Utilities/UnitTesting/Assert.php:235 +#: src/Utilities/UnitTesting/Assert.php:283 +#: src/Utilities/UnitTesting/Assert.php:305 #, php-format msgid "%1$s failed. Expected: \"%2$s\". Actual: \"%3$s\"." msgstr "%1$s ha fallado. Se esperaba: \"%2$s\". Real: \"%3$s\"." -#: ../../../src/Version.php:49 ../../../src/Version.php:53 -#, php-format +#: src/Version.php:63 src/Version.php:82 src/VersionComponent.php:69 +#: src/VersionComponent.php:124 msgid "" -"Invalid argument type. '%s' (argument %s) must be an instance of '%s', '%s' " -"given. Convert value or use the static method Version::Parse(string|mixed) " -"to create a new instance from an string." +" \"{name}\" (position {pos}) must to be an instance of \"{expected}\"; " +"\"{actual}\" given." msgstr "" -"Tipo inválido de argumento. '%s' (argumento %s) debe ser una instancia de " -"'%s', '%s' given. Convierte el valor o usa el método estático Version::" -"Parse(string|mixed) para crear una nueva instancia de una cadena." -#: ../../../src/Version.php:57 ../../../src/Version.php:61 -#, php-format +#: src/Version.php:66 src/Version.php:85 +msgid " Convert value or use the \"{class}::parse\" (static) method." +msgstr "" + +#: src/Version.php:99 src/Version.php:115 src/VersionComponent.php:49 msgid "" -"Invalid argument value. '%s' (argument %s) must be a positive number; '%s' " +" \"{name}\" (position {pos}) must to be a positive number; \"{actual}\" " "given." msgstr "" -"Valor inválido de argumento. '%s' (argumento %s) debe ser un número " -"positivo; '%s' dado." -#: ../../../src/Version.php:90 -#, php-format -msgid "Unable to parse. Argument passed has an invalid format: '%s'." +#: src/Version.php:161 +msgid "Unable to parse. Argument passed has an invalid type: \"{0}\"." msgstr "" -"No se puede convertir. El argumento que se ha pasado tiene un formato " -"inválido '%s'." -#: ../../../src/VersionComponent.php:36 -#, php-format -msgid "" -"Invalid argument value. \"%s\" (argument %s) must be positive; \"%s\" given." +#: src/Version.php:169 +msgid "Unable to parse. Argument passed has an invalid format: \"{0}\"." msgstr "" -"Valor inválido de argumento. \"%s\" (argumento %s) debe ser positivo; se dio " -"\"%s\"." -#: ../../../src/VersionComponent.php:62 -#, php-format -msgid "Invalid argument value. \"%s\" (argument %s) has invalid chars: \"%s\"." +#: src/VersionComponent.php:105 +msgid " \"{name}\" (position {pos}) has invalid chars; \"{actual}\" given." +msgstr "" + +#: src/PropertiesHandler.inc:70 +msgid "Unable to get the property value in \"{0}\" class." +msgstr "" + +#: src/PropertiesHandler.inc:96 +msgid "Unable to set the property value in \"{0}\" class." +msgstr "" + +#: src/PropertiesHandler.inc:118 +msgid "Property name is not valid." +msgstr "" + +#: src/PropertiesHandler.inc:128 +msgid "Property \"{class}::{property}\" do not exists." +msgstr "" + +#: src/PropertiesHandler.inc:150 +msgid "Method name is not valid." +msgstr "" + +#: src/PropertiesHandler.inc:160 +msgid "Method \"{class}::{method}\" do not exists." +msgstr "" + +#: src/PropertiesHandler.inc:189 +msgid "Property \"{class}::{name}\" has not a setter." +msgstr "" + +#: src/PropertiesHandler.inc:218 +msgid "Property \"{class}::{name}\" has not a getter." msgstr "" -"Valor inválido de argumento. \"%s\" (argumento %s) tiene caracteres " -"inválidos: \"%s\"." + +#~ msgid "Can not specify $versions argument if $name argument is null." +#~ msgstr "" +#~ "No se puede especificar el argumento $versions si el argumento $name es " +#~ "null." + +#~ msgid "Asset has not versions." +#~ msgstr "Recurso no tiene versiones definidas." + +#~ msgid "Asset has not version %s." +#~ msgstr "Recurso no tiene definida la versión %s." + +#~ msgid "" +#~ "Invalid argument value. '%s' (argument %s) must be a positive number; " +#~ "'%s' given." +#~ msgstr "" +#~ "Valor inválido de argumento. '%s' (argumento %s) debe ser un número " +#~ "positivo; '%s' dado." + +#~ msgid "Unable to parse. Argument passed has an invalid format: '%s'." +#~ msgstr "" +#~ "No se puede convertir. El argumento que se ha pasado tiene un formato " +#~ "inválido '%s'." + +#~ msgid "" +#~ "Invalid argument value. \"%s\" (argument %s) must be positive; \"%s\" " +#~ "given." +#~ msgstr "" +#~ "Valor inválido de argumento. \"%s\" (argumento %s) debe ser positivo; se " +#~ "dio \"%s\"." + +#~ msgid "" +#~ "Invalid argument value. \"%s\" (argument %s) has invalid chars: \"%s\"." +#~ msgstr "" +#~ "Valor inválido de argumento. \"%s\" (argumento %s) tiene caracteres " +#~ "inválidos: \"%s\"." + +#~ msgid "" +#~ "Using default \"{0}\" method. You can replace its behavior, overriding it " +#~ "by creating \"{1}::{2}\" public method." +#~ msgstr "" +#~ "Usando el método predeterminado \"{0}\". You can replace its behavior, " +#~ "overriding it by creating \"{1}::{2}\" public method." + +#~ msgid "" +#~ "You implemented IEquatable interface, but using default Object::Equals() " +#~ "method. You must override it, creating %s::Equals() public method." +#~ msgstr "" +#~ "Has implementado la interfaz IEquatable, pero se está usando el método " +#~ "predeterminado Object::Equals(). Debes sobreescribirlo creando el método " +#~ "público %s::Equals()." + +#~ msgid "" +#~ "Unable to auto-load \"%s\" class in Nelson Martell Library (NML): \"%s\" " +#~ "file was not found. You can see the API documentation (http://nelson6e65." +#~ "github.io/php_nml/api) in order to check availability of all classes/" +#~ "namespaces in NML. Note: If you are using \"NelsonMartell\" as main " +#~ "namespace in a file that not belongs to NML, you should include it before " +#~ "to load \"NML/autoload.php\" or, using SPL autoload features, register " +#~ "autoload function for that class(es) using \"prepend\" argument for " +#~ "spl_autoload_register function set to TRUE." +#~ msgstr "" +#~ "No se puede cargar la clase \"%s\" en Nelson Martell Library (NML): El " +#~ "archivo \"%s\" no fue encontrado. Puedes ver la documentación de la API " +#~ "(http://nelson6e65.github.io/php_nml/api) para chequear la disponibilidad " +#~ "de todas las clases/namespaces en NML. Nota: Si estás usando " +#~ "\"NelsonMartell\" como espacio de nombres principal en un archivo que no " +#~ "pertenece a NML, deberías incluirlo antes de cargar \"NML/autoload.php\" " +#~ "ó, usando las funciones de autocarga de SPL, registrar la función " +#~ "autoload para esa(s) clase(s) usando el argumento \"prepend\" de la " +#~ "función spl_autoload_register establecido en TRUE." + +#~ msgid "%1$s (%2$d items): { %3$s }" +#~ msgstr "%1$s (%2$d elementos): { %3$s }" + +#~ msgid "Property do not exists" +#~ msgstr "La propiedad no existe" + +#~ msgid "Property is write only" +#~ msgstr "La propiedad es de sólo escritura" + +#~ msgid "Unable to access to '%s' property in '%s' class. Reason: %s" +#~ msgstr "No se puede acceder a la propiedad '%s' en la clase '%s'. Razón: %s" + +#~ msgid "Property is read only" +#~ msgstr "La propiedad es de sólo lectura" + +#~ msgid "Unable to assign '%s' property in '%s' class. Reason: %s" +#~ msgstr "No se puede asignar la propiedad '%s' en la clase '%s'. Razón: %s" + +#~ msgid "To get the name, use Type::Name property instead." +#~ msgstr "Para obtener el nombre, usa la propiedad Type::Name más bien." + +#~ msgid "To get vars, use Type::Vars property instead." +#~ msgstr "Para obtener las variables, usa la propiedad Type::Vars más bien." + +#~ msgid "To get methods, use Type::Methods property instead." +#~ msgstr "Para obtener los métodos, usa la propiedad Type::Methods más bien." + +#~ msgid "" +#~ "Invalid argument type. '%s' (argument %s) must be an instance of '%s', " +#~ "'%s' given. Convert value or use the static method Version::Parse(string|" +#~ "mixed) to create a new instance from an string." +#~ msgstr "" +#~ "Tipo inválido de argumento. '%s' (argumento %s) debe ser una instancia de " +#~ "'%s', '%s' given. Convierte el valor o usa el método estático Version::" +#~ "Parse(string|mixed) para crear una nueva instancia de una cadena." #~ msgid "" #~ "Unable to auto-load \"%s\" class: File \"%s\" do not exists. See the API " diff --git a/Locale/nml.pot b/Locale/nml.pot new file mode 100644 index 0000000..814e79b --- /dev/null +++ b/Locale/nml.pot @@ -0,0 +1,200 @@ +msgid "" +msgstr "" +"Project-Id-Version: PHP: Nelson Martell Library 1.0\n" +"POT-Creation-Date: 2015-07-05 01:20-0430\n" +"PO-Revision-Date: 2015-07-05 01:21-0430\n" +"Last-Translator: Nelson Martell \n" +"Language-Team: \n" +"Language: en\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.7.1\n" +"X-Poedit-Basepath: ..\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Poedit-KeywordsList: nml_msg;nml_nmsg\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Poedit-SearchPath-0: src\n" +"X-Poedit-SearchPath-1: tests\n" + +#: src/Extensions/String.php:84 +msgid "Provided object must not be NULL." +msgstr "" + +#: src/Extensions/String.php:101 +msgid "Provided object must to be an string; \"{0}\" given." +msgstr "" + +#: src/Extensions/String.php:118 +msgid "Provided string must not be empty." +msgstr "" + +#: src/Extensions/String.php:135 +msgid "Provided string must not be white spaces." +msgstr "" + +#: src/Extensions/String.php:153 +msgid "" +"Provided string do not follows PHP variables naming convention: \"{0}\"." +msgstr "" + +#: src/Object.php:96 +msgid "Using default \"{base_class}::{function}\" ({access}) method." +msgstr "" + +#: src/Object.php:98 src/Object.php:139 +msgid "" +" You can replace (override) its behavior by creating \"{class}::" +"{function}\" ({access}) method." +msgstr "" + +#: src/Object.php:134 +msgid "" +"You implemented IEquatable, but using default \"{base_class}::" +"{function}\" ({access}) method." +msgstr "" + +#: src/Utilities/Asset.php:59 src/Utilities/Asset.php:90 +#: src/Utilities/Asset.php:119 src/Utilities/Asset.php:182 +#: src/Utilities/Asset.php:313 src/Version.php:97 src/Version.php:113 +#: src/VersionComponent.php:47 src/VersionComponent.php:103 +msgid "Invalid argument value." +msgstr "" + +#: src/Utilities/Asset.php:61 +msgid "" +" \"{name}\" (position {pos}) can not be specified if \"{name2}\" (position " +"{pos2}) is \"null\"." +msgstr "" + +#: src/Utilities/Asset.php:92 +msgid "" +" \"{name}\" (position {pos}) must to be an array of \"{expected}\" elements " +"(or any parseable into \"{expected}\"); the array given has an invalid " +"\"{actual}\" element." +msgstr "" + +#: src/Utilities/Asset.php:121 +msgid "" +" \"{name}\" (position {pos}) must to be an array of \"{expected}\" elements, " +"an instance of \"{expected}\" or any object parseable into \"{expected}\"; " +"\"{actual}\" given." +msgstr "" + +#: src/Utilities/Asset.php:164 src/Utilities/Asset.php:302 src/Version.php:61 +#: src/Version.php:80 src/VersionComponent.php:67 src/VersionComponent.php:122 +msgid "Invalid argument type." +msgstr "" + +#: src/Utilities/Asset.php:166 +msgid "" +" \"{class}::{property}\" must to be an instance of \"{expected}\"; " +"\"{actual}\" given." +msgstr "" + +#: src/Utilities/Asset.php:184 +msgid " \"{class}::{property}\" value can not be empty or whitespace." +msgstr "" + +#: src/Utilities/Asset.php:275 +msgid "This Asset has not versions." +msgstr "" + +#: src/Utilities/Asset.php:304 +msgid "" +" \"{name}\" (position {pos}) must to be an instance of \"{expected}\" (or " +"compatible); \"{actual}\" given." +msgstr "" + +#: src/Utilities/Asset.php:314 +msgid " Asset has not the version \"{version}\"." +msgstr "" + +#: src/Utilities/UnitTesting/Assert.php:89 +#, php-format +msgid "%5$s failed. Expected: (%3$s) \"%4$s\". Actual: (%1$s) \"%2$s\"." +msgstr "" + +#: src/Utilities/UnitTesting/Assert.php:98 +#: src/Utilities/UnitTesting/Assert.php:151 +#: src/Utilities/UnitTesting/Assert.php:220 +#: src/Utilities/UnitTesting/Assert.php:242 +#: src/Utilities/UnitTesting/Assert.php:290 +#: src/Utilities/UnitTesting/Assert.php:312 +#, php-format +msgid "Message: %s" +msgstr "" + +#: src/Utilities/UnitTesting/Assert.php:142 +#, php-format +msgid "%5$s failed. Not expected: (%3$s) \"%4$s\". Actual: (%1$s) \"%2$s\"." +msgstr "" + +#: src/Utilities/UnitTesting/Assert.php:213 +#: src/Utilities/UnitTesting/Assert.php:235 +#: src/Utilities/UnitTesting/Assert.php:283 +#: src/Utilities/UnitTesting/Assert.php:305 +#, php-format +msgid "%1$s failed. Expected: \"%2$s\". Actual: \"%3$s\"." +msgstr "" + +#: src/Version.php:63 src/Version.php:82 src/VersionComponent.php:69 +#: src/VersionComponent.php:124 +msgid "" +" \"{name}\" (position {pos}) must to be an instance of \"{expected}\"; " +"\"{actual}\" given." +msgstr "" + +#: src/Version.php:66 src/Version.php:85 +msgid " Convert value or use the \"{class}::parse\" (static) method." +msgstr "" + +#: src/Version.php:99 src/Version.php:115 src/VersionComponent.php:49 +msgid "" +" \"{name}\" (position {pos}) must to be a positive number; \"{actual}\" " +"given." +msgstr "" + +#: src/Version.php:161 +msgid "Unable to parse. Argument passed has an invalid type: \"{0}\"." +msgstr "" + +#: src/Version.php:169 +msgid "Unable to parse. Argument passed has an invalid format: \"{0}\"." +msgstr "" + +#: src/VersionComponent.php:105 +msgid " \"{name}\" (position {pos}) has invalid chars; \"{actual}\" given." +msgstr "" + +#: src/PropertiesHandler.inc:70 +msgid "Unable to get the property value in \"{0}\" class." +msgstr "" + +#: src/PropertiesHandler.inc:96 +msgid "Unable to set the property value in \"{0}\" class." +msgstr "" + +#: src/PropertiesHandler.inc:118 +msgid "Property name is not valid." +msgstr "" + +#: src/PropertiesHandler.inc:128 +msgid "Property \"{class}::{property}\" do not exists." +msgstr "" + +#: src/PropertiesHandler.inc:150 +msgid "Method name is not valid." +msgstr "" + +#: src/PropertiesHandler.inc:160 +msgid "Method \"{class}::{method}\" do not exists." +msgstr "" + +#: src/PropertiesHandler.inc:189 +msgid "Property \"{class}::{name}\" has not a setter." +msgstr "" + +#: src/PropertiesHandler.inc:218 +msgid "Property \"{class}::{name}\" has not a getter." +msgstr "" diff --git a/VERSION b/VERSION new file mode 100644 index 0000000..ef52a64 --- /dev/null +++ b/VERSION @@ -0,0 +1 @@ +0.4.6 diff --git a/autoload.php b/autoload.php index 513e448..57fed51 100644 --- a/autoload.php +++ b/autoload.php @@ -1,47 +1,27 @@ GetItem($this->_iteratorPosition); - } - - public function rewind() { - $this->_iteratorPosition = 0; - } - - public function key() { - return $this->_iteratorPosition; - } - - public function next() { - ++$this->_iteratorPosition; - } - - public function valid() { - $v = (bool) ($this->GetItem($this->_iteratorPosition) != null); - return $v; - } - - protected abstract function GetItem($index); - } - - /** - * Clase base de una colección de objetos, que provee una implementación predeterminada de la - * interfaz ICollection. - * - * @author Nelson Martell (nelson6e65-dev@yahoo.es) - * */ - class Collection extends Object implements ICollection { - use CollectionIterator; //Implementación de la interfaz Iterator - - function __construct() { - parent::__construct(); - unset($this->Count); - } - - public final function __invoke($index, $value = null) { - if ($value == null) { - return $this->_items[$index]; - } - - $this->SetItem($index, $value); - } - - private $_items = array(); - - - /** - * Inserta un nuevo elemento a la colección, en el índice especificado. - * - * @param integer $index Índice del elemento a insertar. - * @param mixed $newItem Nuevo elemento a insertar a la colección. - * @access protected - * @return void - * */ - protected function InsertItem($index, $newItem) { - if ($index > $this->Count || $index < 0) { - throw new OutOfRangeException(); - } - - if ($index == $this->Count){ - $this->_items[$index] = null; - $this->_count++; - } - - $this->_items[$index] = $newItem; - } - - /** - * Quita todos los elementos de la colección. - * - * @return void - * */ - protected function ClearItems() { - $this->_items = array(); - $this->_count = 0; - } - - /** - * Establece un elemento en el índice especificado. - * - * @param integer $index Índice del elemento a establecer. - * @param mixed $newItem Nuevo valor con el que se va a reemplazar. - * @return void - * */ - protected function SetItem($index, $newItem) { - if ($index >= $this->Count || $index < 0) { - throw new OutOfRangeException(); - } - - $this->_items[$index] = $newItem; - } - - /** - * Obtiene el elemento almacenado en el índice especificado. - * Este método no lanza excepción en caso de indicar un índice fuera del rango; en cambio, - * devuelve NULL. - * El elemento obtenido es de sólo lectura. Para modificar el elemento dentro de la colección, - * tendría que utilizarse el método Collection::SetItem una vez modificado. - * - * @param integer $index Índice del elemento a obtener. - * @return mixed - * */ - protected function GetItem($index) { - if ($index >= $this->Count || $index < 0) { - return null; - } - - return $this->_items[$index]; - } - - protected function RemoveItem($index) { - if ($index >= $this->Count || $index < 0) { - throw new OutOfRangeException(); - } - - for($i = $index; $i < $this->Count - 1; $i++) { - $this->_items[$i] = $this->_items[$i + 1]; //Mueve los valores - } - - unset($this->_items[$this->Count - 1]); //Des-asigna el último elemento - - $this->_count--; - } - - /** - * Gets the string representation of this object collection. - * - * You can format the output, by setting $format param to one of this options: - * - `R` or `r`: All items, separated by comma and space (`, `). This is the default format. - * - `L` or `l`: Same as `r` option, but enclosed in braces (`{`, `}`). - * - `g`: A full string, containing class name, items count and items list (this list, like `L` option). - * - `G`: Same as `g`, but using a full class name (including namespace). - * - * You can also use a custom format instead, using this placeholders: - * - `{class}`: Short class name (without namespace part); - * - `{nsclass}`: Full class name (included namespace); - * - `{count}`: Items count; and - * - `{items}`: List of items, using comma and space (`, `) as separator. - * - * Example: For a instance with 10 elements (numbers: 1-10), using: - * `Collection::ToString('My collection ({count} items): { {items} }');` - * Result: 'My collection (10 items): { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }' - * - * - * @param string $format String format (optional). By default, `r`. - * @return string - * @see String::Format() - * */ - public function ToString($format = 'r') { - static $defaultFormats = [ - 'r' => '{items}', - 'l' => '{ {items} }', - 'g' => '{class} ({count} items): { {items} }', - 'G' => '{nsclass} ({count} items): { {items} }', - ]; - - if ($format == null or !is_string($format)) { - $format = 'r'; //Override if is not an string - } - - $str = ''; - switch ($format) { - case 'r': - case 'l': - case 'g': - case 'G': - $str = $defaultFormats[$format]; - break; - - default: - $str = $format; - } - - $t = $this->GetType(); - - $items = implode(', ', $this->_items); - - $placeHoldersValues = [ - 'class' => $t->ShortName, - 'nsclass' => $t->Name, - 'count' => $this->Count, - 'items' => $items, - ]; - - - $s = String::Format($str, $placeHoldersValues); - - return $s; - } - - - #region {Implementación de la interfaz ICollection} - - /** - * Obtiene el número de elementos incluidos en la colección. - * Ésta propiedad es de sólo lectura. - * - * @var integer - * */ - public $Count; - private $_count = 0; - - /** - * Obtiene el número de elementos incluidos en la colección. - * - * @return integer - * */ - public function get_Count() { - return $this->_count; - } - - /** - * Agrega un nuevo elemento al final de la colección. - * Nota para herederos: Para cambiar el comportamiento de este método, reemplazar más bien - * el método protegido 'InsertItem'. - * - * @param mixed Elemento que se va a agregar a la colección. - * @return void - * */ - public function Add($item) { - $this->InsertItem($this->Count, $item); - } - - /** - * Quita todos los elementos de la colección. - * Nota para herederos: Para cambiar el comportamiento de este método, reemplazar más bien - * el método protegido 'ClearItems'. - * - * @return void - * */ - public function Clear() { - $this->ClearItems(); - } - - /** - * Determina si la colección contiene al elemento especificado. - * - * @param mixed $item Objeto que se va a buscar. - * @return boolean true si $item se encuentra; en caso contrario, false. - * */ - public function Contains($item) { - foreach($this->_items as $i) { - if ($item === $i) { - return true; - } - } - - return false; - } - - /** - * Quita, si existe, la primera aparición de un objeto específico de la colección. - * - * @param mixed $item Objeto que se va a quitar. - * @return boolean True si $item se ha quitado correctamente; en caso contrario, False. - * Este método también devuelve false si no se encontró $item. - * */ - public function Remove($item) { - for ($i = 0; $i < $this->Count; $i++) { - if ($this->_items[$i] === $item) { - $this->RemoveItem($i); - } - } - - return false; - } - - #end region - - - } + + use NelsonMartell\Extensions\String; + use NelsonMartell\Object; + + /** + * Clase base de una colección de objetos, que provee una implementación + * predeterminada de la interfaz ICollection. + * + * @author Nelson Martell + * */ + class Collection extends Object implements ICollection + { + // Implementación de la interfaz Iterator. + use CollectionIterator; + + public function __construct() + { + parent::__construct(); + unset($this->Count); + } + + final public function __invoke($index, $value = null) + { + if ($value == null) { + return $this->items[$index]; + } + + $this->setItem($index, $value); + } + + private $items = array(); + + + /** + * Inserta un nuevo elemento a la colección, en el índice especificado. + * + * @param integer $index Índice del elemento a insertar. + * @param mixed $newItem Nuevo elemento a insertar a la colección. + * + * @return void + * @access protected + * */ + protected function insertItem($index, $newItem) + { + if ($index > $this->Count || $index < 0) { + throw new OutOfRangeException(); + } + + if ($index == $this->Count) { + $this->items[$index] = null; + $this->count++; + } + + $this->items[$index] = $newItem; + } + + /** + * Quita todos los elementos de la colección. + * + * @return void + * */ + protected function clearItems() + { + $this->items = array(); + $this->count = 0; + } + + /** + * Establece un elemento en el índice especificado. + * + * @param integer $index Índice del elemento a establecer. + * @param mixed $newItem Nuevo valor con el que se va a reemplazar. + * + * @return void + * */ + protected function setItem($index, $newItem) + { + if ($index >= $this->Count || $index < 0) { + throw new OutOfRangeException(); + } + + $this->items[$index] = $newItem; + } + + /** + * Obtiene el elemento almacenado en el índice especificado. + * Este método no lanza excepción en caso de indicar un índice fuera del + * rango; en cambio, devuelve NULL. + * El elemento obtenido es de sólo lectura. Para modificar el elemento + * dentro de la colección, tendría que utilizarse el método + * Collection::setItem una vez modificado. + * + * @param integer $index Índice del elemento a obtener. + * + * @return mixed + * */ + protected function getItem($index) + { + if ($index >= $this->Count || $index < 0) { + return null; + } + + return $this->items[$index]; + } + + /** + * Remove the item in specified index. + * + * @param integer $index Index. + * + * @return void + */ + protected function removeItem($index) + { + if ($index >= $this->Count || $index < 0) { + throw new OutOfRangeException(); + } + + for ($i = $index; $i < $this->Count - 1; $i++) { + $this->items[$i] = $this->items[$i + 1]; //Mueve los valores + } + + unset($this->items[$this->Count - 1]); //Des-asigna el último elemento + + $this->count--; + } + + /** + * Gets the string representation of this object collection. + * + * You can format the output, by setting $format param to one of this + * options: + * - `R` or `r`: All items, separated by comma and space (`, `). + * This is the default format. + * - `L` or `l`: Same as `r` option, but enclosed in braces (`{`, `}`). + * - `g`: A full string, containing class name, items count and items + * list (this list, like `L` option). + * - `G`: Same as `g`, but using a full class name (including namespace). + * + * You can also use a custom format instead, using this placeholders: + * - `{class}`: Short class name (without namespace part); + * - `{nsclass}`: Full class name (included namespace); + * - `{count}`: Items count; and + * - `{items}`: List of items, using comma and space (`, `) as separator. + * + * Example: For a instance with 10 elements (numbers: 1-10), using: + * `Collection::ToString('My collection ({count} items): { {items} }');` + * Result: 'My collection (10 items): { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }' + * + * @param string $format String format (optional). By default, `r`. + * + * @return string + * @see String::format + * */ + public function toString($format = 'r') + { + static $defaultFormats = [ + 'r' => '{items}', + 'l' => '{ {items} }', + 'g' => '{class} ({count} items): { {items} }', + 'G' => '{nsclass} ({count} items): { {items} }', + ]; + + if ($format == null or !is_string($format)) { + $format = 'r'; //Override if is not an string + } + + $str = ''; + switch ($format) { + case 'r': + case 'l': + case 'g': + case 'G': + $str = $defaultFormats[$format]; + break; + + default: + $str = $format; + } + + $t = $this->GetType(); + + $items = implode(', ', $this->items); + + $placeHoldersValues = [ + 'class' => $t->ShortName, + 'nsclass' => $t->Name, + 'count' => $this->Count, + 'items' => $items, + ]; + + + $s = String::Format($str, $placeHoldersValues); + + return $s; + } + + + + /** + * Obtiene el número de elementos incluidos en la colección. + * Esta propiedad es de sólo lectura. + * + * @var integer + * */ + public $Count; + private $count = 0; + + /** + * Getter for Count property. + * + * @return integer + * */ + public function getCount() + { + return $this->count; + } + + /** + * Agrega un nuevo elemento al final de la colección. + * Nota para herederos: Para cambiar el comportamiento de este método, + * reemplazar más bien el método protegido 'InsertItem'. + * + * @param mixed $item Elemento que se va a agregar a la colección. + * + * @return void + * */ + public function add($item) + { + $this->InsertItem($this->Count, $item); + } + + /** + * Quita todos los elementos de la colección. + * Nota para herederos: Para cambiar el comportamiento de este método, + * reemplazar más bien el método protegido `Collection::clearItems`. + * + * @return void + * @see Collection::clearItems + * */ + public function clear() + { + $this->clearItems(); + } + + /** + * Determina si la colección contiene al elemento especificado. + * + * @param mixed $item Objeto que se va a buscar. + * + * @return boolean `true` si $item se encuentra; en caso contrario, `false`. + * */ + public function contains($item) + { + foreach ($this->items as $i) { + if ($item === $i) { + return true; + } + } + + return false; + } + + /** + * Quita, si existe, la primera aparición de un objeto específico de la + * colección. + * + * @param mixed $item Objeto que se va a quitar. + * + * @return boolean `true` si el elemento se ha quitado correctamente; en + * caso contrario, `false`. Este método también devuelve `false` si no + * se encontró. + * */ + public function remove($item) + { + for ($i = 0; $i < $this->Count; $i++) { + if ($this->items[$i] === $item) { + $this->RemoveItem($i); + } + } + + return false; + } + } } diff --git a/src/Collections/CollectionIterator.inc b/src/Collections/CollectionIterator.inc new file mode 100644 index 0000000..b7bd455 --- /dev/null +++ b/src/Collections/CollectionIterator.inc @@ -0,0 +1,60 @@ + + * @since v0.4.0 + * */ +trait CollectionIterator +{ + private $iteratorPosition = 0; + + public function current() + { + return $this->getItem($this->iteratorPosition); + } + + public function rewind() + { + $this->iteratorPosition = 0; + } + + public function key() + { + return $this->iteratorPosition; + } + + public function next() + { + ++$this->iteratorPosition; + } + + public function valid() + { + $v = (bool) ($this->getItem($this->iteratorPosition) != null); + return $v; + } + + protected abstract function getItem($index); +} diff --git a/src/Collections/ICollection.php b/src/Collections/ICollection.php index e42ff68..c60f552 100644 --- a/src/Collections/ICollection.php +++ b/src/Collections/ICollection.php @@ -11,71 +11,76 @@ * For full copyright and license information, please see the LICENSE * Redistributions of files must retain the above copyright notice. * - * @copyright Copyright © 2015 Nelson Martell - * @link http://nelson6e65.github.io/php_nml/ - * @since v0.1.1 - * @license http://www.opensource.org/licenses/mit-license.php The MIT License (MIT) + * @copyright 2015 Nelson Martell + * @link http://nelson6e65.github.io/php_nml/ + * @since v0.1.1 + * @license http://www.opensource.org/licenses/mit-license.php The MIT License (MIT) * */ namespace NelsonMartell\Collections { - use \Iterator; - /** - * Define métodos para manipular colecciones de objetos. - * - * - * @author Nelson Martell (nelson6e65-dev@yahoo.es) - * */ - interface ICollection extends Iterator { + use \Iterator; - /** - * Obtiene el número de elementos incluidos en la colección. - * Si extiende la clase NelsonMartell.Object, debe definirse la propiedad 'public $Count'. - * - * - * @see NelsonMartell\Object - * @return integer - * */ - public function get_Count(); + /** + * Define métodos para manipular colecciones de objetos. + * + * @author Nelson Martell + * */ + interface ICollection extends Iterator + { - /** - * Agrega un elemento a la colección. - * - * - * @param mixed $item Objeto que se va a agregar. - * @return void - * */ - public function Add($item); - /** - * Quita todos los elementos de la colección. - * - * - * La propiedad Count se debe establecer en 0 y deben liberarse las referencias a otros - * objetos desde los elementos de la colección. - * - * @return void - * */ - public function Clear(); + /** + * Obtiene el número de elementos incluidos en la colección. + * Si extiende la clase NelsonMartell.Object, puede accederse desde la + * propiedad `Count`. + * + * @return integer + * @see NelsonMartell\Object + * */ + public function getCount(); - /** - * Determina si la colección contiene un valor específico. - * - * - * @param mixed $item Objeto que se va a buscar. - * @return boolean true si $item se encuentra; en caso contrario, false. - * */ - public function Contains($item); - /** - * Quita la primera aparición de un objeto específico de la colección. - * - * - * @param $item Objeto que se va a quitar. - * @return boolean True si $item se ha quitado correctamente; en caso contrario, False. - * Este método también devuelve false si no se encontró $item. - * */ - public function Remove($item); + /** + * Agrega un elemento a la colección. + * + * @param mixed $item Objeto que se va a agregar. + * + * @return void + * */ + public function add($item); - } + + /** + * Quita todos los elementos de la colección. + * La propiedad Count se debe establecer en 0 y deben liberarse las + * referencias a otros objetos desde los elementos de la colección. + * + * @return void + * */ + public function clear(); + + + /** + * Determina si la colección contiene al elemento especificado. + * + * @param mixed $item Objeto que se va a buscar. + * + * @return boolean `true` si $item se encuentra; en caso contrario, `false`. + * */ + public function contains($item); + + + /** + * Quita, si existe, la primera aparición de un objeto específico de la + * colección. + * + * @param mixed $item Objeto que se va a quitar. + * + * @return boolean `true` si el elemento se ha quitado correctamente; en + * caso contrario, `false`. Este método también devuelve `false` si no + * se encontró. + * */ + public function remove($item); + } } diff --git a/src/Collections/IList.php b/src/Collections/IList.php index 3086754..1e06f73 100644 --- a/src/Collections/IList.php +++ b/src/Collections/IList.php @@ -11,50 +11,59 @@ * For full copyright and license information, please see the LICENSE * Redistributions of files must retain the above copyright notice. * - * @copyright Copyright © 2015 Nelson Martell - * @link http://nelson6e65.github.io/php_nml/ - * @since v0.1.1 - * @license http://www.opensource.org/licenses/mit-license.php The MIT License (MIT) + * @copyright 2015 Nelson Martell + * @link http://nelson6e65.github.io/php_nml/ + * @since v0.1.1 + * @license http://www.opensource.org/licenses/mit-license.php The MIT License (MIT) * */ namespace NelsonMartell\Collections { - /** - * Representa una colección de objetos a los que se puede tener acceso por un índice. - * - * - * @author Nelson Martell (nelson6e65-dev@yahoo.es) - * */ - interface IList extends ICollection { - - /** - * Determina el índice de un elemento específico de la lista. - * Si un objeto aparece varias veces en la lista, el método IndexOf siempre devolverá la - * primera instancia encontrada. - * - * - * @param mixed $item Objeto que se va a buscar. - * @return integer Índice de $item si se encuentra en la lista; en caso contrario, -1. - * */ - public function IndexOf($item); - - /** - * Inserta un elemento en la lista, en el índice especificado. - * - * - * @param integer $index Índice de base cero en el que debe insertarse $item. - * @param mixed $item Objeto que se va a insertar. - * - * */ - public function Insert($index, $item); - - /** - * Quita el elemento del índice especificado. - * - * - * @param integer $index Índice de base cero del elemento que se va a quitar. - * */ - public function RemoveAt($index); - - } + /** + * Representa una colección de objetos a los que se puede tener acceso por + * un índice. + * + * @author Nelson Martell + * */ + interface IList extends ICollection + { + + + /** + * Determina el índice de un elemento específico de la lista. + * Si un objeto aparece varias veces en la lista, el método indexOf + * siempre devolverá la primera instancia encontrada. + * + * @param mixed $item Objeto que se va a buscar. + * + * @return integer Índice de $item si se encuentra en la lista; en caso + * contrario, -1. + * */ + public function indexOf($item); + + + /** + * Inserta un elemento en la lista, en el índice especificado. + * + * @param integer $index Índice de base cero en el que debe insertarse + * $item. + * @param mixed $item Objeto que se va a insertar. + * + * @return void + * */ + public function insert($index, $item); + + + /** + * Quita el elemento del índice especificado. + * + * @param integer $index Índice de base cero del elemento que se va a + * quitar. + * + * @return boolean `true` si el elemento se ha quitado correctamente; en + * caso contrario, `false`. Este método también devuelve `false` si no + * se encontró. + * */ + public function removeAt($index); + } } diff --git a/src/Extensions/String.php b/src/Extensions/String.php index ddc799b..28b76cc 100644 --- a/src/Extensions/String.php +++ b/src/Extensions/String.php @@ -11,61 +11,162 @@ * For full copyright and license information, please see the LICENSE * Redistributions of files must retain the above copyright notice. * - * @copyright Copyright © 2015 Nelson Martell - * @link http://nelson6e65.github.io/php_nml/ - * @since v0.4.1 - * @license http://www.opensource.org/licenses/mit-license.php The MIT License (MIT) + * @copyright 2015 Nelson Martell + * @link http://nelson6e65.github.io/php_nml/ + * @since v0.4.1 + * @license http://www.opensource.org/licenses/mit-license.php The MIT License (MIT) * */ namespace NelsonMartell\Extensions; /** * Provides extension methods to handle strings. + * This class is based on \Cake\Utility\Text of CakePHP(tm) class. * - * - * @copyright This class is based on Cake\Utility\String of CakePHP(tm) class. - * @see Original DOC of String based on: http://book.cakephp.org/3.0/en/core-libraries/string.html + * @see \Cake\Utility\Text::insert + * @see http://book.cakephp.org/3.0/en/core-libraries/text.html * */ -class String extends \Cake\Utility\Text { +class String extends \Cake\Utility\Text +{ + + /** + * Replaces format elements in a string with the string representation of an + * object matching the list of arguments specified. You can give as many + * params as you need, or an array with values. + * + * ##Usage + * Using numbers as placeholders (encloses between `{` and `}`), you can get + * the matching string representation of each object given. Use `{0}` for + * the fist object, `{1}` for the second, and so on. + * Example: + * `String::format('{0} is {1} years old, and have {2} cats.', 'Bob', 65, 101);` + * Returns: 'Bob is 65 years old, and have 101 cats.' + * + * You can also use an array to give objects values. + * Example: `String::Format('{0} is {1} years old.', ['Bob', 65, 101]);` + * Returns: 'Bob is 65 years old, and have 101 cats.' + * + * If give an key => value array, each key stands for a placeholder variable + * name to be replaced with value key. In this case, order of keys do not + * matter. + * Example: + * `$arg0 = ['name' => 'Bob', 'n' => 101, 'age' => 65];` + * `$format = '{name} is {age} years old, and have {n} cats.';` + * `String::Format($format, $arg0);` + * Returns: 'Bob is 65 years old, and have 101 cats.' + * + * @param string $format A string containing variable placeholders. + * @param array|mixed $args Object(s) to be replaced into $format + * placeholders. + * + * @return string + * @todo Implement, for php 5.6+: + * php.net/functions.arguments.html#functions.variable-arg-list.new + * @todo Implement formatting, like IFormatProvider or something like that. + * @author Nelson Martell + */ + public static function format($format, $args) + { + static $options = [ + 'before' => '{', + 'after' => '}', + ]; + + $data = func_num_args() === 2 ? (array) $args : array_slice(func_get_args(), 1); + + return static::insert($format, $data, $options); + } + + /** + * Ensures that object given is not null. If is `null`, throws and exception. + * + * @param mixed $obj Object to validate + * + * @return mixed Same object + * @throws InvalidArgumentException if object is `null`. + */ + public static function ensureIsNotNull($obj) + { + if (is_null($obj)) { + $msg = nml_msg('Provided object must not be NULL.'); + throw new InvalidArgumentException($msg); + } + + return $obj; + } + + /** + * Ensures that object given is an string. Else, thows an exception + * + * @param mixed $obj Object to validate. + * + * @return string Same object given, but ensured that is an string. + * @throws InvalidArgumentException if object is not an `string`. + */ + public static function ensureIsString($obj) + { + if (!is_string(static::ensureIsNotNull($obj))) { + $msg = nml_msg('Provided object must to be an string; "{0}" given.', typeof($obj)); + throw new InvalidArgumentException($msg); + } + + return $obj; + } + + /** + * Ensures that given string is not empty. + * + * @param string $string String to validate. + * + * @return string Same string given, but ensured that is not empty. + * @throws InvalidArgumentException if string is null or empty. + */ + public static function ensureIsNotEmpty($string) + { + if (static::ensureIsString($string) === '') { + $msg = nml_msg('Provided string must not be empty.'); + throw new InvalidArgumentException($msg); + } + + return $string; + } + + /** + * Ensures that given string is not empty or whitespaces. + * + * @param string $string String to validate. + * + * @return string Same string given, but ensured that is not whitespaces. + * @throws InvalidArgumentException if object is not an `string`. + * @see trim + */ + public static function ensureIsNotWhiteSpaces($string) + { + if (trim(static::ensureIsString($string)) === '') { + $msg = nml_msg('Provided string must not be white spaces.'); + throw new InvalidArgumentException($msg); + } + + return $string; + } - /** - * Replaces format elements in a string with the string representation of an object matching the - * list of arguments specified. You can give as many params as you need, or an array with values. - * - * ##Usage - * Using numbers as placeholders (encloses between `{` and `}`), you can get the matching string - * representation of each object given. Use `{0}` for the fist object, `{1}` for the second, - * and so on. - * Example: `String::Format('{0} is {1} years old, and have {2} cats.', 'Bob', 65, 101);` - * Returns: 'Bob is 65 years old, and have 101 cats.' - * - * You can also use an array to give objects values. - * Example: `String::Format('{0} is {1} years old.', ['Bob', 65, 101]);` - * Returns: 'Bob is 65 years old, and have 101 cats.' - * - * If give an key => value array, each key stands for a placeholder variable name to be replaced - * with value key. In this case, order of keys do not matter. - * Example: - * `$arg0 = ['name' => 'Bob', 'n' => 101, 'age' => 65];` - * `$format = '{name} is {age} years old, and have {n} cats.';` - * `String::Format($format, $arg0);` - * Returns: 'Bob is 65 years old, and have 101 cats.' - * - * - * @param string $format A string containing variable placeholders. - * @param array|mixed $args Object(s) to be replaced into $format placeholders. - * @return string - * @todo Implement php.net/functions.arguments.html#functions.variable-arg-list.new for PHP 5.6+ - * @todo Implement formatting, like IFormatProvider or something like that. - * @author Nelson Martell (nelson6e65-dev@yahoo.es) - */ - public static function Format($format, $args) { - static $options = [ - 'before' => '{', - 'after' => '}', - ]; + /** + * Ensures that an string follows the PHP variables naming convention. + * + * @param string $string String to be ensured. + * + * @return string + * @throws InvalidArgumentException if object is not an `string` or do not + * follows the PHP variables naming convention. + */ + public static function ensureIsValidVarName($string) + { + $pattern = '/^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/'; - $data = func_num_args() === 2 ? (array) $args : array_slice(func_get_args(), 1); + if (!preg_match($pattern, static::ensureIsString($string))) { + $msg = nml_msg('Provided string do not follows PHP variables naming convention: "{0}".', $string); + throw new InvalidArgumentException($msg); + } - return parent::insert($format, $data, $options); - } + return $string; + } } diff --git a/src/IComparable.php b/src/IComparable.php index 53fbed3..8b92108 100644 --- a/src/IComparable.php +++ b/src/IComparable.php @@ -11,39 +11,50 @@ * For full copyright and license information, please see the LICENSE * Redistributions of files must retain the above copyright notice. * - * @copyright Copyright © 2015 Nelson Martell - * @link http://nelson6e65.github.io/php_nml/ - * @since v0.3.2 - * @license http://www.opensource.org/licenses/mit-license.php The MIT License (MIT) + * @copyright 2015 Nelson Martell + * @link http://nelson6e65.github.io/php_nml/ + * @since v0.3.2 + * @license http://www.opensource.org/licenses/mit-license.php The MIT License (MIT) * */ namespace NelsonMartell { - /** - * Provee un método para compara igualdad entre objetos del mismo tipo. - * - * @author Nelson Martell (nelson6e65-dev@yahoo.es) - * */ - interface IComparable { + /** + * Provee métodos para comparar posición relativa entre objetos del mismo + * tipo, o compatibles. + * + * @author Nelson Martell + * */ + interface IComparable + { - /** - * Determina la posición relativa del objeto especificado con respecto a esta instancia. - * - * - * @param mixed $other - * @return integer 0, si es igual; >0, si es mayor; <0, si es menor. - * */ - public function CompareTo($other); + /** + * Determina la posición relativa del objeto especificado con respecto a + * esta instancia. + * + * @param mixed $other Objeto con el cuál comparar posición relativa. + * + * @return integer Si es igual, `0` (cero); si es mayor, un número + * positivo mayor a `0` (cero); y si es menor, un número negativo. + * @see compare + * */ + public function compareTo($other); - /** - * Determina la posición relativa del objeto de la derecha con respecto al de la izquierda. - * Puede usarse como segundo argumento en la función de ordenamiento de arrays 'usort'. - * - * - * @param mixed $left Objeto de la izquierda - * @param mixed $right Objeto de la derecha - * @return integer 0, si ambos son iguales; >0, si $right es mayor a $left; <0, si $left es mayor a $right. - * */ - public static function Compare($left, $right); - } + /** + * Determina la posición relativa del objeto de la derecha con respecto + * al de la izquierda. + * Puede usarse como segundo argumento en la función de ordenamiento de + * arrays 'usort'. + * + * @param mixed $left Objeto de la izquierda + * @param mixed $right Objeto de la derecha + * + * @return integer Si son iguales, `0` (cero); si el derecho es el mayor + * al izquierdo, un número positivo mayor a `0` (cero); y, en caso + * contrario, si el izquierdo es el mayor, un número negativo. + * @see usort + * @see IComparable::compareTo + * */ + public static function compare($left, $right); + } } diff --git a/src/IEquatable.php b/src/IEquatable.php index 6941306..98c8826 100644 --- a/src/IEquatable.php +++ b/src/IEquatable.php @@ -5,34 +5,36 @@ * Content: * - Interface definition: [NelsonMartell] IEquatable * - * Copyright © 2014, 2015 Nelson Martell (http://nelson6e65.github.io) + * Copyright © 2014-2015 Nelson Martell (http://nelson6e65.github.io) * * Licensed under The MIT License (MIT) * For full copyright and license information, please see the LICENSE * Redistributions of files must retain the above copyright notice. * - * @copyright Copyright © 2014, 2015 Nelson Martell - * @link http://nelson6e65.github.io/php_nml/ - * @since v0.1.1 - * @license http://www.opensource.org/licenses/mit-license.php The MIT License (MIT) + * @copyright 2014-2015 Nelson Martell + * @link http://nelson6e65.github.io/php_nml/ + * @since v0.1.1 + * @license http://www.opensource.org/licenses/mit-license.php The MIT License (MIT) * */ namespace NelsonMartell { - /** - * Provee un método para compara igualdad entre objetos del mismo tipo. - * - * @author Nelson Martell (nelson6e65-dev@yahoo.es) - * */ - interface IEquatable { + /** + * Provee un método para comparar igualdad entre objetos del mismo tipo, o + * compatibles. + * + * @author Nelson Martell + * */ + interface IEquatable + { - /** - * Indica si el objeto especificado es igual a la instancia actual. - * - * - * @return boolean - * */ - public function Equals($other); - - } + /** + * Indica si el objeto especificado es igual a la instancia actual. + * + * @param mixed $other Another object to compare equality. + * + * @return boolean + * */ + public function equals($other); + } } diff --git a/src/IntString.php b/src/IntString.php index daf2175..404d813 100644 --- a/src/IntString.php +++ b/src/IntString.php @@ -11,117 +11,122 @@ * For full copyright and license information, please see the LICENSE * Redistributions of files must retain the above copyright notice. * - * @copyright Copyright © 2015 Nelson Martell - * @link http://nelson6e65.github.io/php_nml/ - * @since v0.1.1 - * @license http://www.opensource.org/licenses/mit-license.php The MIT License (MIT) + * @copyright 2015 Nelson Martell + * @link http://nelson6e65.github.io/php_nml/ + * @since v0.1.1 + * @license http://www.opensource.org/licenses/mit-license.php The MIT License (MIT) * */ namespace NelsonMartell { - /** - * Representa un elemento mixto, compuesto por un entero y una cadena unidos (en ese orden). - * El método ToString obtiene esa cadena compuesta. - * - * - * @author Nelson Martell (nelson6e65-dev@yahoo.es) - * */ - class IntString extends Object implements IEquatable, IComparable { - - function __construct($intValue = 0, $stringValue = '') { - unset($this->IntValue, $this->StringValue); - - if (is_integer($intValue) or $intValue == NULL) { - $this->_intValue = $intValue; - } else { - //Try convert to integer - $this->_intValue = (integer) $intValue; - } - - $this->_stringValue = (string) $stringValue; - } - - public static function Parse($value) { - if ($value instanceof IntString) { - return $value; - } - - $s = (string) $value; - $intValue = (int) $s; - - $stringValue = explode($intValue, $s, 2); - - if ($intValue > 0 or $stringValue[1] != '') { - $stringValue = $stringValue[1]; - } else { - $stringValue = $stringValue[0]; - } - - return new IntString($intValue, $stringValue); - } - - - protected $_intValue; - protected $_stringValue; - - public $IntValue; - public function get_IntValue() { - return (int) $this->_intValue; - } - - public $StringValue; - public function get_StringValue() { - return $this->_stringValue; - } - - public function ToString() { - return $this->IntValue . $this->StringValue; - } - - public function Equals($other) { - if ($other instanceof IntString) { - if ($this->IntValue === $other->IntValue) { - if ($this->StringValue === $other->StringValue) { - return true; - } - } - } - - return false; - } - - - #region IComparable - - /** - * Determina la posición relativa de esta instancia con respecto al objeto especificado. - * Nota: Cualquier objeto que no sea instancia de IntString se considerará menor. - * - * - * @param IntString|mixed $other Objeto con el que se va a comparar. - * @return integer Cero (0), si esta instancia es igual a $other; mayor a cero (>0), - * si es mayor a $other; menor a cero (<0), si es menor. - * */ - public function CompareTo($other) { - - $r = $this->Equals($other) ? 0 : 9999; - - if ($r != 0) { - if ($other instanceof IntString) { - $r = $this->IntValue - $other->IntValue; - - if ($r == 0) { - $r = $this->StringValue < $other->StringValue ? -1 : 1; - } - } else { - $r = 1; - } - } - - return $r; - } - - #endregion - - } + /** + * Representa un elemento mixto, compuesto por un entero y una cadena unidos + * (en ese orden). + * El método IntString::toString obtiene esa cadena compuesta. + * + * @author Nelson Martell + * */ + class IntString extends Object implements IEquatable, IComparable + { + + public function __construct($intValue = 0, $stringValue = '') + { + unset($this->IntValue, $this->StringValue); + + if (is_integer($intValue) or $intValue == null) { + $this->intValue = $intValue; + } else { + //Try convert to integer + $this->intValue = (integer) $intValue; + } + + $this->stringValue = (string) $stringValue; + } + + public static function parse($value) + { + if ($value instanceof IntString) { + return $value; + } + + $s = (string) $value; + $intValue = (int) $s; + + $stringValue = explode($intValue, $s, 2); + + if ($intValue > 0 or $stringValue[1] != '') { + $stringValue = $stringValue[1]; + } else { + $stringValue = $stringValue[0]; + } + + return new IntString($intValue, $stringValue); + } + + + protected $intValue; + protected $stringValue; + + public $IntValue; + public function getIntValue() + { + return (int) $this->intValue; + } + + public $StringValue; + public function getStringValue() + { + return $this->stringValue; + } + + public function toString() + { + return $this->IntValue.$this->StringValue; + } + + public function equals($other) + { + if ($other instanceof IntString) { + if ($this->IntValue === $other->IntValue) { + if ($this->StringValue === $other->StringValue) { + return true; + } + } + } + + return false; + } + + + /** + * Determina la posición relativa de esta instancia con respecto al + * objeto especificado. + * Nota: Cualquier objeto que no sea instancia de IntString se + * considerará menor. + * + * @param IntString|mixed $other Objeto con el que se va a comparar. + * + * @return integer Cero (0), si esta instancia es igual a $other; mayor + * a cero (>0), si es mayor a $other; menor a cero (<0), si es menor. + * */ + public function compareTo($other) + { + + $r = $this->equals($other) ? 0 : 9999; + + if ($r != 0) { + if ($other instanceof IntString) { + $r = $this->IntValue - $other->IntValue; + + if ($r == 0) { + $r = $this->StringValue < $other->StringValue ? -1 : 1; + } + } else { + $r = 1; + } + } + + return $r; + } + } } diff --git a/src/Object.php b/src/Object.php index 5ab2849..6fc3b34 100644 --- a/src/Object.php +++ b/src/Object.php @@ -5,196 +5,178 @@ * Content: * - Class definition: [NelsonMartell] Object * - * Copyright © 2014, 2015 Nelson Martell (http://nelson6e65.github.io) + * Copyright © 2014-2015 Nelson Martell (http://nelson6e65.github.io) * * Licensed under The MIT License (MIT) * For full copyright and license information, please see the LICENSE * Redistributions of files must retain the above copyright notice. * - * @copyright Copyright © 2014, 2015 Nelson Martell - * @link http://nelson6e65.github.io/php_nml/ - * @since v0.1.1 - * @license http://www.opensource.org/licenses/mit-license.php The MIT License (MIT) + * @copyright 2014-2015 Nelson Martell + * @link http://nelson6e65.github.io/php_nml/ + * @since v0.1.1 + * @license http://www.opensource.org/licenses/mit-license.php The MIT License (MIT) * */ namespace NelsonMartell { - use \BadMethodCallException; - - spl_autoload_call('NelsonMartell\Type'); - - /** - * Clase base de objetos, para encapsular propiedades y otros métodos básicos. - * - * - * @example Para usar los getter y setter de los atributos como propiedades, el atributo debe - * ser privado y su nombre tipo cammel, iniciando con $_, y su propiedad para get/set debe - * iniciar en Mayúscula, sin '_'. Ejemplo: - * - * private $_nombre = ''; //Atributo - * public $Nombre; //Propiedad para acceder a $_nombre - * - * Luego, las respectivas funciones siguiendo el formato "get_" o "set_", seguido del nombre de - * la propiedad. - * - * public function get_Nombre() { - * return $this->_nombre; - * } - * - * public function set_Nombre(string $value) { - * // Validaciones - * $this->_nombre = $value; - * } - * - * Además, para habilitar esta funcionalidad de propiedades, el constructor debe la siguiente - * línea: - * unset($this->Nombre); - * - * - * @author Nelson Martell (nelson6e65-dev@yahoo.es) - * */ - class Object { - function __construct() { } - - /** - * Obtiene el valor de una propiedad. Ésta debe definir un método getter, que sigue este - * modelo: 'get_' + $name + '()'. - * Restringe la obtención de una propiedad no definida dentro de la clase si no posee su - * método getter. - * - * - * */ - function __get($name) { - $error = false; - - if (!property_exists($this, $name)) { - $error = dgettext('nml', 'Property do not exists') . '.'; - } - - $getter = 'get_' . $name; - - if (!$error) { - if (!method_exists($this, $getter)) { - $error = dgettext('nml', 'Property is write only') . '.'; //? - } - } - - if ($error) { - throw new BadMethodCallException(sprintf(dgettext('nml', "Unable to access to '%s' property in '%s' class. Reason: %s"), $name, $this->GetType()->Name, $error)); - } - - return $this->$getter(); - } - - /** - * Establece el valor de una propiedad según el modelo: 'set_' + $name + '(' + $value + ')' - * Restringe la asignación de una propiedad no definida dentro de la clase si no posee su - * método setter. - * - * - * */ - function __set($name, $value) { - $error = false; - - if (!property_exists($this, $name)) { - $error = dgettext('nml', 'Property do not exists') . '.'; - } - - $setter = 'set_' . $name; - - if (!$error) { - if (!method_exists($this, $setter)) { - $error = dgettext('nml', 'Property is read only') . '.'; //La propiedad existe, pero no tiene establecido el método setter. - } - } - - if ($error) { - throw new BadMethodCallException(sprintf(dgettext('nml', "Unable to assign '%s' property in '%s' class. Reason: %s"), $name, $this->GetType()->Name, $error)); - } - - $this->$setter($value); - } - - /** - * Convierte esta instancia en su representación de cadena. - * Para modificar el funcionamiento de esta función, debe reemplazarse la función - * ObjectClass::ToString() - * - * - * @return string - * */ - final function __toString() { - //$args = null; - //list($args) = func_get_args(); - return $this->ToString(); - } - - /** - * Convierte la instancia actual en su representación de cadena. - * - * - * @return string - * */ - public function ToString() { - $t = $this->GetType(); - - if (defined('CODE_ANALYSIS')) { - if ($t->Name != 'NelsonMartell\Object') { - trigger_error(sprintf(dgettext('nml', 'Using default %s method. You can replace its behavior, overriding it by creating %s::ToString() public method.'), __METHOD__, $t->Name), E_USER_NOTICE); - } - } - - return '{ ' . $t . ' }'; - } - - /** - * Obtiene el tipo del objeto actual. - * - * - * @return Type - * */ - public final function GetType() { - return typeof($this); - } - - public function Equals($other) { - if (defined('CODE_ANALYSIS')) { - if ($this instanceof IEquatable) { - $t = $this->GetType(); - trigger_error(sprintf(dgettext('nml', 'You implemented IEquatable interface, but using default Object::Equals() method. You must override it, creating %s::Equals() public method.'), $t->Name), E_USER_NOTICE); - } - } - - return $this == $other; - } - - /** - * Determina la posición relativa del objeto de la derecha con respecto al de la izquierda. - * Puede usarse como segundo argumento en la función de ordenamiento de arrays 'usort'. - * - * - * @param mixed $left Objeto de la izquierda - * @param mixed $right Objeto de la derecha - * @return integer 0, si ambos son iguales; >0, si $right es mayor a $left; <0, si $left es mayor a $right. - * */ - public static function Compare($left, $right) { - $r = null; - - if ($left instanceof IComparable) { - $r = $left->CompareTo($right); - } else { - if ($right instanceof IComparable) { - $r = $right->CompareTo($left); - } else { - //Si no son miembros de IComparable, se usa por defecto: - if ($left == $right) { - $r = 0; - } else { - $r = ($left > $right) ? +1 : -1; - } - } - } - - return $r; - } - } + + use \BadMethodCallException; + + /** + * Clase base de objetos, para encapsular propiedades y otros métodos básicos. + * + * + * @example Para usar los getter y setter de los atributos como propiedades, el atributo debe + * ser privado y su nombre tipo cammel, iniciando con $_, y su propiedad para get/set debe + * iniciar en Mayúscula, sin '_'. Ejemplo: + * + * private $_nombre = ''; //Atributo + * public $Nombre; //Propiedad para acceder a $_nombre + * + * Luego, las respectivas funciones siguiendo el formato "get_" o "set_", seguido del nombre de + * la propiedad. + * + * public function getNombre() { + * return $this->_nombre; + * } + * + * public function setNombre(string $value) { + * // Validaciones + * $this->_nombre = $value; + * } + * + * Además, para habilitar esta funcionalidad de propiedades, el constructor debe la siguiente + * línea: + * unset($this->Nombre); + * + * + * @author Nelson Martell + * */ + class Object + { + use PropertiesHandler; + + public function __construct() + { + } + + /** + * Convierte esta instancia en su representación de cadena. + * Para modificar el funcionamiento de esta función, debe reemplazarse + * la función ObjectClass::toString() + * + * @return string + * @see Object::toString + * */ + final public function __toString() + { + //$args = null; + //list($args) = func_get_args(); + return $this->toString(); + } + + /** + * Convierte la instancia actual en su representación de cadena. + * + * @return string + * */ + public function toString() + { + $type = $this->getType(); + + if (defined('CODE_ANALYSIS')) { + if ($type->Name != 'NelsonMartell\Object') { + $args = [ + 'access' => 'public', + 'base_class' => __CLASS__, + 'class' => $type->Name, + 'function' => __FUNCTION__, + ]; + + $msg = nml_msg('Using default "{base_class}::{function}" ({access}) method.', $args); + $msg .= nml_msg( + ' You can replace (override) its behavior by creating "{class}::{function}" ({access}) method.', + $args + ); + + trigger_error($msg, E_USER_NOTICE); + } + } + + return '{ '.$type.' }'; + } + + /** + * Obtiene el tipo del objeto actual. + * + * @return Type + * */ + final public function getType() + { + return typeof($this); + } + + public function equals($other) + { + if (defined('CODE_ANALYSIS')) { + if ($this instanceof IEquatable) { + $type = $this->getType(); + + $args = [ + 'access' => 'public', + 'base_class' => __CLASS__, + 'class' => $type->Name, + 'function' => __FUNCTION__, + ]; + + $msg = nml_msg( + 'You implemented IEquatable, but using default "{base_class}::{function}" ({access}) method.', + $args + ); + + $msg .= nml_msg( + ' You can replace (override) its behavior by creating "{class}::{function}" ({access}) method.', + $args + ); + + trigger_error($msg, E_USER_NOTICE); + } + } + + return $this == $other; + } + + /** + * Determina la posición relativa del objeto de la derecha con respecto + * al de la izquierda. + * Puede usarse como segundo argumento en la función de ordenamiento de + * arrays 'usort'. + * + * @param mixed $left Objeto de la izquierda + * @param mixed $right Objeto de la derecha + * + * @return integer `0`, si ambos son iguales; `>0`, si $right es mayor a + * $left; `<0`, si $left es mayor a $right. + * */ + public static function compare($left, $right) + { + $r = null; + + if ($left instanceof IComparable) { + $r = $left->CompareTo($right); + } else { + if ($right instanceof IComparable) { + $r = $right->CompareTo($left); + } else { + // Si no son miembros de IComparable, se usa por defecto: + if ($left == $right) { + $r = 0; + } else { + $r = ($left > $right) ? +1 : -1; + } + } + } + + return $r; + } + } } diff --git a/src/PropertiesHandler.inc b/src/PropertiesHandler.inc new file mode 100644 index 0000000..009b613 --- /dev/null +++ b/src/PropertiesHandler.inc @@ -0,0 +1,258 @@ +Name. + * + * @author Nelson Martell + * */ + trait PropertiesHandler + { + /** + * Prefix for methods witch get properties value. + * You can override to use another prefix. + * @var string + */ + protected static $getterPrefix = 'get'; + + /** + * Prefix for methods witch set properties value. + * You can override to use another prefix. + * @var string + */ + protected static $setterPrefix = 'set'; + + + /** + * Obtiene el valor de una propiedad, usando automáticamente el método + * `$getterPrefix + nombre_propiedad` (getter). + * + * Restringe la obtención de una propiedad no definida dentro de la clase + * si no posee su método getter. + * + * @param string $name Property name. + * + * @see PropertiesHandler::$getterPrefix + * @return mixed + * @throws BadMethodCallException If unable to get the property value. + * */ + public function __get($name) + { + try { + $getter = $this->getPropertyGetter($name); + } catch (BadMethodCallException $error) { + $msg = nml_msg('Unable to get the property value in "{0}" class.', typeof($this)->Name); + throw new BadMethodCallException($msg, 31, $error); + } + + return $this->$getter(); + } + + + /** + * Establece el valor de una propiedad, usando automáticamente el método + * `$setterPrefix + nombre_propiedad` (setter). + * Restringe la asignación de una propiedad no definida dentro de la clase + * si no posee su método setter. + * + * @param string $name Property name. + * @param mixed $value Property value. + * + * @see PropertiesHandler::$setterPrefix + * @return void + * @throws BadMethodCallException If unable to set property value. + * */ + public function __set($name, $value) + { + try { + $setter = $this->getPropertySetter($name); + } catch (BadMethodCallException $error) { + $msg = nml_msg('Unable to set the property value in "{0}" class.', typeof($this)->Name); + throw new BadMethodCallException($msg, 41, $error); + } + + $this->$setter($value); + + } + + + /** + * Ensures that property provided exists in this class. + * + * @param string $name Property name. + * + * @return string Same property name, but validated. + * @throws BadMethodCallException If property do not exists or name is invalid. + */ + private function ensurePropertyExists($name) + { + try { + $pName = String::ensureIsValidVarName($name); + } catch (InvalidArgumentException $error) { + $msg = nml_msg('Property name is not valid.'); + throw new BadMethodCallException($msg, 10, $error); + } + + if (property_exists($this, $name) === false) { + $args = [ + 'class' => typeof($this)->Name, + 'property' => $name, + ]; + + $msg = nml_msg('Property "{class}::{property}" do not exists.', $args); + + throw new BadMethodCallException($msg, 11); + } + + return $name; + } + + + /** + * Ensures that method provided exists in this class. + * + * @param string $name Method name. + * + * @return string Same method name, but validated. + * @throws BadMethodCallException If method name is invalid or do not exists. + */ + private function ensureMethodExists($name) + { + try { + $mName = String::ensureIsValidVarName($name); + } catch (InvalidArgumentException $error) { + $msg = nml_msg('Method name is not valid.'); + throw new BadMethodCallException($msg, 20, $error); + } + + if (method_exists($this, $name) === false) { + $args = [ + 'class' => typeof($this)->Name, + 'method' => $name, + ]; + + $msg = nml_msg('Method "{class}::{method}" do not exists.', $args); + + throw new BadMethodCallException($msg, 21); + } + + return $name; + } + + + /** + * Ensures that there is a setter for the provided property name. + * + * @param string $name Property name. + * + * @return string Same property name, after checks that setter exists. + * @throws BadMethodCallException If property is not writable or do not exists. + */ + private function ensurePropertyHasSetter($name) + { + $setter = static::$setterPrefix.$this->ensurePropertyExists($name); + + try { + $setter = $this->ensureMethodExists($setter); + } catch (BadMethodCallException $error) { + $args = [ + 'class' => typeof($this)->Name, + 'name' => $name, + ]; + + $msg = nml_msg('Property "{class}::{name}" has not a setter.', $args); + + throw new BadMethodCallException($msg, 40, $error); + } + + return $name; + } + + + /** + * Ensures that there is a getter for the provided property name. + * + * @param string $name Property name. + * + * @return string Same property name, after checks that getter exists. + * @throws BadMethodCallException If property is not readable or do not exists. + */ + private function ensurePropertyHasGetter($name) + { + $getter = static::$getterPrefix.$this->ensurePropertyExists($name); + + try { + $getter = $this->ensureMethodExists($getter); + } catch (BadMethodCallException $error) { + $args = [ + 'class' => typeof($this)->Name, + 'name' => $name, + ]; + + $msg = nml_msg('Property "{class}::{name}" has not a getter.', $args); + + throw new BadMethodCallException($msg, 30, $error); + } + + return $name; + } + + + /** + * Gets the property setter method name. + * + * @param string $name Property name. + * + * @return string + * @throws BadMethodCallException If property is not valid or has not setter. + */ + private function getPropertySetter($name) + { + $setter = static::$setterPrefix.$this->ensurePropertyHasSetter($name); + + return $setter; + } + + + /** + * Gets the property getter method name. + * + * @param string $name Property name. + * + * @return string + * @throws BadMethodCallException If property is not valid or has not getter. + */ + private function getPropertyGetter($name) + { + $setter = static::$getterPrefix.$this->ensurePropertyHasGetter($name); + + return $setter; + } + } +} diff --git a/src/Type.php b/src/Type.php index 99b447d..f6290e1 100644 --- a/src/Type.php +++ b/src/Type.php @@ -12,288 +12,300 @@ * For full copyright and license information, please see the LICENSE * Redistributions of files must retain the above copyright notice. * - * @copyright Copyright © 2013-2015 Nelson Martell - * @link http://nelson6e65.github.io/php_nml/ - * @since v0.1.1 - * @license http://www.opensource.org/licenses/mit-license.php The MIT License (MIT) + * @copyright 2013-2015 Nelson Martell + * @link http://nelson6e65.github.io/php_nml/ + * @since v0.1.1 + * @license http://www.opensource.org/licenses/mit-license.php The MIT License (MIT) * */ namespace NelsonMartell { - use \ReflectionClass; - use \ReflectionProperty; - use \ReflectionMethod; - - /** - * Represents a PHP object type, and provides some properties and methods to describe some info - * about itself. - * - * @author Nelson Martell (nelson6e65-dev@yahoo.es) - * */ - final class Type extends Object { - - /** - * Gets the type of specified $obj and collect some info about itself. - * - * @param mixed $obj Target object. - * */ - function __construct($obj) { - parent::__construct(); - unset($this->Namespace, $this->Name, $this->ShortName, $this->Vars, $this->Methods); - - $name = gettype($obj); - $shortname = null; - $namespace = null; - $vars = null; - $methods = null; - $ref = null; - - switch ($name) { - case 'object': - $ref = new ReflectionClass($obj); - $name = $ref->getName(); - $shortName = $ref->getShortName(); - $namespace = $ref->getNamespaceName(); - break; - - case 'resource': - $shortName = get_resource_type($obj); - $name = 'resource: ' . $shortName; - $vars = []; - $methods = []; - break; - - default: - $shortName = $name; - $vars = []; - $methods = []; - } - - $this->_name = $name; - $this->_shortName = $shortName; - $this->_namespace = $namespace; - $this->_vars = $vars; - $this->_methods = $methods; - $this->_reflectionObject = $ref; - } - - private $_reflectionObject = null; - - /** - * Gets the name of this Type. - * This property is read-only. - * - * @var string - * */ - public $Name; - private $_name; - - /** - * Getter for Type::Name property. - * - * @return string - * */ - public function get_Name() { - return $this->_name; - } - - /** - * Gets the abbreviated name of class, in other words, without the namespace. - * This property is read-only. - * - * @var string - * */ - public $ShortName; - private $_shortName = null; - - /** - * Getter for Type::ShortName property. - * - * @return string - * @see Type::ShortName - * */ - public function get_ShortName() { - return $this->_shortName; - } - - /** - * Gets the namespace name of this class. - * If this Type is not a class, this property is set to `NULL`. - * This property is read-only. - * - * @var string|NULL - * */ - public $Namespace; - private $_namespace; - - /** - * Getter for Type::Namespace property. - * - * @return string|NULL - * @see Type::Namespace - * */ - public function get_Namespace() { - return $this->_namespace; - } - - /** - * Gets the public|protected properties (ReflectionProperty) of this Type. - * This property is read-only. - * - * - * @var array - * */ - public $Vars; - private $_vars = null; - public function get_Vars() { - if ($this->_vars == NULL) { - $this->_vars = $this->_reflectionObject->getProperties(ReflectionProperty::IS_PUBLIC | ReflectionProperty::IS_PROTECTED); - } - return $this->_vars; - } - - /** - * Gets the public|protected methods (ReflectionMethod) of this Type. - * This property is read-only. - * - * - * @var array - * */ - public $Methods; - private $_methods = null; - public function get_Methods() { - if ($this->_methods == null) { - $this->_methods = $this->_reflectionObject->getMethods(ReflectionMethod::IS_PUBLIC | ReflectionMethod::IS_PROTECTED); - } - return $this->_methods; - } - - /** - * Determina si este Type es NULL. - * - * - * @return boolean True if this type is null; other case, False. - * */ - public function IsNull() { - if ($this->Name == 'NULL' || $this->Name == 'null') { - return true; - } - - return false; - } - - /** - * Determina si este Type NO es NULL. - * - * - * @return boolean True if this type is NOT null; other case, False. - * */ - public function IsNotNull() { - return !$this->IsNull(); - } - - - /** - * Determina si este Type es una clase personalizada. - * - * - * @return boolean True, if this Type is a custom class; another case, False. - * */ - public function IsCustom() { - switch ($this->Name) { - case 'boolean': - case 'integer': - case 'double': - case 'string': - case 'array': - case 'NULL': - case 'null': - return false; - default: - return true; - } - } - - /** - * Determinate if this type is scalar. - * - * @return boolean - * @see is_scalar() - * */ - public function IsScalar() { - $r = false; - - switch ($this->Name) { - case 'boolean': - case 'integer': - case 'double': - case 'string': - $r = true; - break; - - default: - $r = false; - } - - return $r; - } - - /** - * Determina si este Type es de tipo valor. - * - * - * @return boolean - * @deprecated Use more precise method: Type::IsScalar, which excludes `array`. - * */ - public function IsValueType() { - switch($this->Name){ - case 'string': - case 'integer': - case 'double': - case 'boolean': - case 'array': - return true; - default: - return false; - } - } - - /** - * Determina si este Type es de tipo referencia. - * - * - * @return boolean - * */ - public function IsReferenceType() { - return !IsValueType(); - } - - /** - * Convierte la instancia actual en su representación en cadena. - * - * - * @return string - * */ - public function ToString() { - $s = $this->Name; - - if ($this->IsCustom()) { - $s = sprintf("object (%s)", $s); - } - - return $s; - } - - /** - * Obtiene el tipo del objeto especificado. - * Es un alias para el constructor de Type. - * - * - * @return Type - * @deprecated - * */ - public static function typeof($obj) { - return new static($obj); - } - - } + + use \ReflectionClass; + use \ReflectionProperty; + use \ReflectionMethod; + + /** + * Represents a PHP object type, and provides some properties and methods to + * describe some info about itself. + * + * @author Nelson Martell + * */ + final class Type extends Object + { + + /** + * Gets the type of specified $obj and collect some info about itself. + * + * @param mixed $obj Target object. + * */ + public function __construct($obj) + { + parent::__construct(); + unset($this->Namespace, $this->Name, $this->ShortName, $this->Vars, $this->Methods); + + $name = gettype($obj); + $shortname = null; + $namespace = null; + $vars = null; + $methods = null; + $ref = null; + + switch ($name) { + case 'object': + $ref = new ReflectionClass($obj); + $name = $ref->getName(); + $shortName = $ref->getShortName(); + $namespace = $ref->getNamespaceName(); + break; + + case 'resource': + $shortName = get_resource_type($obj); + $name = 'resource: '.$shortName; + $vars = []; + $methods = []; + break; + + default: + $shortName = $name; + $vars = []; + $methods = []; + } + + $this->name = $name; + $this->shortName = $shortName; + $this->namespace = $namespace; + $this->vars = $vars; + $this->methods = $methods; + $this->reflectionObject = $ref; + } + + private $reflectionObject = null; + + /** + * Gets the name of this Type. + * This property is read-only. + * + * @var string + * */ + public $Name; + private $name; + + /** + * Getter for Type::Name property. + * + * @return string + * */ + public function getName() + { + return $this->name; + } + + /** + * Gets the abbreviated name of class, in other words, without the namespace. + * This property is read-only. + * + * @var string + * */ + public $ShortName; + private $shortName = null; + + /** + * Getter for Type::ShortName property. + * + * @return string + * @see Type::ShortName + * */ + public function getShortName() + { + return $this->shortName; + } + + /** + * Gets the namespace name of this class. + * If this Type is not a class, this property is set to `NULL`. + * This property is read-only. + * + * @var string|NULL + * */ + public $Namespace; + private $namespace; + + /** + * Getter for Type::Namespace property. + * + * @return string|NULL + * @see Type::Namespace + * */ + public function getNamespace() + { + return $this->namespace; + } + + /** + * Gets the public|protected properties (ReflectionProperty) of this Type. + * This property is read-only. + * + * @var array + * */ + public $Vars; + private $vars = null; + public function getVars() + { + if ($this->vars == null) { + $this->vars = $this->reflectionObject->getProperties( + ReflectionProperty::IS_PUBLIC | ReflectionProperty::IS_PROTECTED + ); + } + return $this->vars; + } + + /** + * Gets the public|protected methods (ReflectionMethod) of this Type. + * This property is read-only. + * + * @var array + * */ + public $Methods; + private $methods = null; + public function getMethods() + { + if ($this->methods == null) { + $this->methods = $this->reflectionObject->getMethods( + ReflectionMethod::IS_PUBLIC | ReflectionMethod::IS_PROTECTED + ); + } + return $this->methods; + } + + /** + * Determina si este Type es `null`. + * + * @return boolean `true` if this type is `null`; other case, `false`. + * */ + public function isNull() + { + if ($this->Name == 'NULL' || $this->Name == 'null') { + return true; + } + + return false; + } + + /** + * Determina si este Type NO es `null`. + * + * @return boolean `true` if this type is NOT `null`; other case, `false`. + * */ + public function isNotNull() + { + return !$this->IsNull(); + } + + + /** + * Determina si este Type es una clase personalizada. + * + * @return boolean `true`, if this Type is a custom class; another case, + * `false`. + * */ + public function isCustom() + { + switch ($this->Name) { + case 'boolean': + case 'integer': + case 'double': + case 'string': + case 'array': + case 'NULL': + case 'null': + return false; + default: + return true; + } + } + + /** + * Determinate if this type is scalar. + * + * @return boolean + * @see is_scalar() + * */ + public function isScalar() + { + $r = false; + + switch ($this->Name) { + case 'boolean': + case 'integer': + case 'double': + case 'string': + $r = true; + break; + + default: + $r = false; + } + + return $r; + } + + /** + * Determina si este Type es de tipo valor. + * + * @return boolean + * @deprecated Use more precise method: Type::isScalar, which excludes + * `array`. + * */ + public function isValueType() + { + switch ($this->Name) { + case 'string': + case 'integer': + case 'double': + case 'boolean': + case 'array': + return true; + default: + return false; + } + } + + /** + * Determina si este Type es de tipo referencia. + * + * @return boolean + * */ + public function isReferenceType() + { + return !IsValueType(); + } + + /** + * Convierte la instancia actual en su representación en cadena. + * + * @return string + * */ + public function toString() + { + $s = $this->Name; + + if ($this->isCustom()) { + $s = sprintf("object (%s)", $s); + } + + return $s; + } + + /** + * Obtiene el tipo del objeto especificado. + * Es un alias para el constructor de Type. + * + * @return Type + * @deprecated + * */ + public static function typeof($obj) + { + return new static($obj); + } + } } diff --git a/src/Utilities/Asset.php b/src/Utilities/Asset.php index f40f742..46f4b6f 100644 --- a/src/Utilities/Asset.php +++ b/src/Utilities/Asset.php @@ -5,249 +5,350 @@ * Content: * - Class definition: [NelsonMartell\Utilities] Asset * - * Copyright © 2014, 2015 Nelson Martell (http://nelson6e65.github.io) + * Copyright © 2014-2015 Nelson Martell (http://nelson6e65.github.io) * * Licensed under The MIT License (MIT) * For full copyright and license information, please see the LICENSE * Redistributions of files must retain the above copyright notice. * - * @copyright Copyright © 2014, 2015 Nelson Martell - * @link http://nelson6e65.github.io/php_nml/ - * @since v0.1.1 - * @license http://www.opensource.org/licenses/mit-license.php The MIT License (MIT) + * @copyright 2014-2015 Nelson Martell + * @link http://nelson6e65.github.io/php_nml/ + * @since v0.1.1 + * @license http://www.opensource.org/licenses/mit-license.php The MIT License (MIT) * */ namespace NelsonMartell\Utilities { - use NelsonMartell\Object; - use NelsonMartell\Version; - use \InvalidArgumentException; - - /** - * Representa un recurso estático de una página, como elementos js y css, que poseen varias - * versiones y están organizadas en subdirectorios, proponiendo una estructura predeterminada. - * Contiene métodos y propiedades para obtener las rutas de los directorios y recursos de las - * diferentes versiones del framework. - * - * - * @author Nelson Martell (nelson6e65-dev@yahoo.es) - * */ - class Asset extends Object { - /** - * Crea una nueva instancia de la clase Asset - * - * - * - * */ - public function __construct($name = null, $versions = null, $cdnUri = null) { - parent::__construct(); - unset($this->Name, $this->Versions, $this->ShortName, $this->CdnUri, $this->RootDirectory); - - if ($name == null) { - $this->_name = ''; - $this->_shortName = ''; - } else { - $this->Name = $name; - } - - if ($this->Name == '' && $versions != null) { - throw new InvalidArgumentException(dgettext('nml', 'Can not specify $versions argument if $name argument is null.')); - } - - if ($versions == null) { - $versions = array(); - } - - if (is_array($versions)) { - - $this->_versions = array(); - - if (count($versions) > 0) { - $i = 0; - foreach($versions as $version) { - $v = $version; - if (!($v instanceof Version)) { - try { - $v = Version::Parse($version); - } catch (InvalidArgumentException $e) { - throw new InvalidArgumentException('$versions argument must be an array of Version objects or any objects parseable into Version.', 0, $e); - } - } - - $this->_versions[$i] = $v; - - $i += 1; - } - } - - } else { - // Trata de convertir $versions en un objeto Versión - try { - $v = Version::Parse($versions); - } catch (InvalidArgumentException $e) { - throw new InvalidArgumentException('$versions argument must be an array of Version objects (or empty), a Version object or any object parseable into Version.', 0, $e); - } - - $this->_versions = array($v); - } - - $this->CdnUri = $cdnUri; - } - - - /** - * Obtiene o establece el nombre original del recurso. - * A partir de éste se determinará la ruta y el nombre real del archivo (que, por defecto, - * será éste mismo pero convertido en minúsculas y reemplazando sus espacios en blanco por - * guiones (' ' -> '-')). - * - * - * @see $ShortName - * @var string Nombre del recurso - * */ - public $Name; - private $_name; - - public function get_Name() { - return $this->_name; - } - - public function set_Name($value) { - if (!is_string($value)) { - throw new InvalidArgumentException('$value argument must be string.'); - } - - if (str_word_count($value) == 0) { - throw new InvalidArgumentException('$value argument can not be an empty or whitespace string.'); - } - - $this->_name = trim($value); - - $this->_shortName = str_replace(' ', '-', strtolower($this->_name)); - } - - /** - * Obtiene el nombre real del recurso, que representa al nombre real de . - * - * - * @var string Nombre del recurso en su forma generada - * */ - public $ShortName; - private $_shortName; - - public function get_ShortName() { - return $this->_shortName; - } - - /** - * Obtiene la lista de versiones - * - * - * @var List Lista de versiones del recurso - * */ - public $Versions; - private $_versions; - - public function get_Versions() { - return $this->_versions; - } - - /** - * Obtiene o establece el CDN del recurso. - * Debe modificarse la URL, colocando '{v}' en vez de la versión. - * @example Un CDN para el JavaScript de jQuery UI v1.11.2 es: - * "//ajax.googleapis.com/ajax/libs/jqueryui/1.11.2/jquery-ui.min.js" - * Entonces el valor de esta propiedad debe ser: - * "//ajax.googleapis.com/ajax/libs/jqueryui/{v}/jquery-ui" - * - * - * @var string CDN - * */ - public $CdnUri; - private $_cdnUri; - - public function get_CdnUri() { - return $this->_cdnUri; - } - - public function set_CdnUri($value) { - $this->_cdnUri = (string) $value; - } - - - /** - * Obtiene el directorio principal del recurso. - * - * - * @var string Ruta inicial del recurso - * */ - public $RootDirectory; - public function get_RootDirectory() { - return $this->ShortName . '/'; - } - - const NEWEST = 'newest'; - - const OLDEST = 'oldest'; - - /** - * Obtiene la ruta del directorio de la versión especificada. Si no se especifica, - * se devuelve la versión más reciente. - * - * - * @param string|Version $version Versión a obtener. También puede tomar los valores - * 'newest' u 'oldest' para representar a la versión más nueva o más vieja, respectivamente. - * @return string Ruta del directorio de la versión especificada. - * */ - public function GetDirectoryPath($version = self::NEWEST) { - $c = count($this->Versions); - - if ($c == 0) { - throw new LogicException(dgettext('nml', 'Asset has not versions.')); - } - $v = $version; - - if ($version == self::OLDEST or $version == self::NEWEST) { - $v = $this->Versions[0]; - - if ($c > 1) { - usort($this->_versions, array("NelsonMartell\\Version", "Compare")); - - $v = $this->Versions[0]; - - if ($version == self::NEWEST) { - $v = $this->Versions[$c - 1]; - } - } - } else { - try { - $v = Version::Parse($version); - } catch (InvalidArgumentException $e) { - throw new InvalidArgumentException('$version argument must be an Version object or any object parseable into Version.', 0, $e); - } - - if (array_search($v, $this->Versions) === false) { - throw new InvalidArgumentException(sprintf(dgettext('nml', 'Asset has not version %s.'), $v)); - } - } - - return sprintf('%s%s/', $this->RootDirectory, $v); - } - - - /** - * Obtiene la ruta del recurso de la versión especificada. Si no se especifica, se devuelve la - * versión más reciente. - * - * @param string|Version $version Versión a obtener. También puede tomar los valores - * 'newest' u 'oldest' para representar a la versión más nueva o más vieja, respectivamente. - * @param string $append Texto que se le anezará a la cadena de salida - * @return string Ruta del recurso - * */ - public function GetResourcePath($version = self::NEWEST, $append = '') { - - $r = sprintf('%s%s%s', $this->GetDirectoryPath($version), $this->ShortName, $append); - - return $r; - } - } + + use NelsonMartell\Object; + use NelsonMartell\Version; + use \InvalidArgumentException; + + /** + * Representa un recurso estático de una página, como elementos js y css + * organizados de una manera predeterminada en subdirectorios. + * Contiene métodos y propiedades para obtener las rutas de los directorios + * y recursos entre sus diferentes versiones. + * + * @author Nelson Martell + * */ + class Asset extends Object + { + /** + * Crea una nueva instancia de la clase Asset. + * + * @param string|null $name Nombre humano del recurso. + * @param array|string|Version|null $versions Versión(es) del recurso. + * @param string|null $cdnUri URL del recurso en un + * servidor CDN. + */ + public function __construct($name = null, $versions = null, $cdnUri = null) + { + parent::__construct(); + unset($this->Name, $this->Versions, $this->ShortName, $this->CdnUri, $this->RootDirectory); + + if ($name == null) { + $this->name = ''; + $this->shortName = ''; + } else { + $this->Name = $name; + } + + if ($this->Name == '' && $versions != null) { + $args = [ + 'name' => 'versions', + 'pos' => 1, + 'name2' => 'name', + 'pos2' => 0, + ]; + + $msg = nml_msg('Invalid argument value.'); + $msg .= nml_msg( + ' "{name}" (position {pos}) can not be specified if "{name2}" (position {pos2}) is "null".', + $args + ); + + throw new InvalidArgumentException($msg); + } + + if ($versions == null) { + $versions = array(); + } + + if (is_array($versions)) { + $this->versions = array(); + + if (count($versions) > 0) { + $i = 0; + foreach ($versions as $version) { + $v = $version; + if (!($v instanceof Version)) { + try { + $v = Version::parse($version); + } catch (InvalidArgumentException $e) { + $args = [ + 'name' => 'versions', + 'pos' => 1, + 'expected' => typeof(new Version(1, 0))->Name, + 'actual' => typeof($version)->Name, + ]; + + $msg = nml_msg('Invalid argument value.'); + $msg .= nml_msg( + ' "{name}" (position {pos}) must to be an array of "{expected}" elements (or any'. + ' parseable into "{expected}"); the array given has an invalid "{actual}" element.', + $args + ); + + throw new InvalidArgumentException($msg, 0, $e); + } + } + + $this->versions[$i] = $v; + + $i += 1; + } + } + + } else { + // Trata de convertir $versions en un objeto Versión + try { + $v = Version::parse($versions); + } catch (InvalidArgumentException $e) { + $args = [ + 'name' => 'versions', + 'pos' => 1, + 'expected' => typeof(new Version(1, 0))->Name, + 'actual' => typeof($versions)->Name, + ]; + + $msg = nml_msg('Invalid argument value.'); + $msg .= nml_msg( + ' "{name}" (position {pos}) must to be an array of "{expected}" elements, an instance of'. + ' "{expected}" or any object parseable into "{expected}"; "{actual}" given.', + $args + ); + + throw new InvalidArgumentException($msg, 0, $e); + } + + $this->versions = array($v); + } + + $this->CdnUri = $cdnUri; + } + + + /** + * Obtiene o establece el nombre original 'humano' del recurso. + * A partir de éste se determinará la ruta y el nombre real del archivo + * (que, por defecto, será éste mismo pero convertido en minúsculas y + * reemplazando sus espacios en blanco por guiones (' ' -> '-')). + * + * @var string Nombre del recurso + * @see Asset::ShortName + * */ + public $Name; + private $name; + + public function getName() + { + return $this->name; + } + + public function setName($value) + { + if (!is_string($value)) { + $args = [ + 'class' => $this->getType()->Name, + 'property' => 'Name', + 'pos' => 0, + 'expected' => 'string', + 'actual' => typeof($value)->Name, + ]; + + $msg = nml_msg('Invalid argument type.'); + $msg .= nml_msg( + ' "{class}::{property}" must to be an instance of "{expected}"; "{actual}" given.', + $args + ); + + throw new InvalidArgumentException($msg); + } + + if (str_word_count($value) == 0) { + $args = [ + 'class' => $this->getType()->Name, + 'property' => 'Name', + 'pos' => 0, + 'expected' => 'string', + 'actual' => typeof($value)->Name, + ]; + + $msg = nml_msg('Invalid argument value.'); + $msg .= nml_msg( + ' "{class}::{property}" value can not be empty or whitespace.', + $args + ); + + throw new InvalidArgumentException($msg); + } + + $this->name = trim($value); + + $this->shortName = str_replace(' ', '-', strtolower($this->name)); + } + + /** + * Obtiene el nombre real del recurso, que representa al nombre 'usable' + * del recurso. + * Esta propiedad es de sólo lectura. + * + * @var string Nombre del recurso en su forma generada + * */ + public $ShortName; + private $shortName; + + public function getShortName() + { + return $this->shortName; + } + + /** + * Obtiene la lista de versiones. + * Esta propiedad es de sólo lectura. + * + * @var List Lista de versiones del recurso + * */ + public $Versions; + private $versions; + + public function getVersions() + { + return $this->versions; + } + + /** + * Obtiene o establece el CDN del recurso. + * Debe modificarse la URL, colocando '{v}' en vez de la versión. + * + * @example Un CDN para el JavaScript de jQuery UI v1.11.2 es: + * "//ajax.googleapis.com/ajax/libs/jqueryui/1.11.2/jquery-ui.min.js" + * Entonces el valor de esta propiedad debe ser: + * "//ajax.googleapis.com/ajax/libs/jqueryui/{v}/jquery-ui" + * + * @var string CDN + * */ + public $CdnUri; + private $cdnUri; + + public function getCdnUri() + { + return $this->cdnUri; + } + + public function setCdnUri($value) + { + $this->cdnUri = (string) $value; + } + + + /** + * Obtiene el directorio principal del recurso. + * + * @var string Ruta inicial del recurso + * */ + public $RootDirectory; + public function getRootDirectory() + { + return $this->ShortName.'/'; + } + + const NEWEST = 'newest'; + + const OLDEST = 'oldest'; + + /** + * Obtiene la ruta del directorio de la versión especificada. Si no se + * especifica, se devuelve la versión más reciente. + * + * @param string|Version $version Versión a obtener. También puede + * tomar los valores 'newest' u 'oldest' para representar a la versión + * más nueva o más vieja, respectivamente. + * + * @return string Ruta del directorio de la versión especificada. + * */ + public function getDirectoryPath($version = self::NEWEST) + { + $c = count($this->Versions); + + if ($c == 0) { + throw new LogicException(nml_msg('This Asset has not versions.')); + } + $v = $version; + + if ($version == self::OLDEST or $version == self::NEWEST) { + $v = $this->Versions[0]; + + if ($c > 1) { + usort($this->versions, array("NelsonMartell\\Version", "Compare")); + + $v = $this->Versions[0]; + + if ($version == self::NEWEST) { + $v = $this->Versions[$c - 1]; + } + } + } else { + try { + $v = Version::parse($version); + } catch (InvalidArgumentException $e) { + $args = [ + 'name' => 'version', + 'pos' => 0, + 'expected' => typeof(new Version(1, 0))->Name, + 'actual' => typeof($version), + ]; + + $msg = nml_msg('Invalid argument type.'); + $msg .= nml_msg( + ' "{name}" (position {pos}) must to be an instance of "{expected}" (or compatible);'. + ' "{actual}" given.', + $args + ); + + throw new InvalidArgumentException($msg); + } + + if (array_search($v, $this->Versions) === false) { + $msg = nml_msg('Invalid argument value.'); + $msg .= nml_msg(' Asset has not the version "{version}".', ['version' => $v]); + + throw new InvalidArgumentException($msg); + } + } + + return sprintf('%s%s/', $this->RootDirectory, $v); + } + + + /** + * Obtiene la ruta del recurso de la versión especificada. Si no se + * especifica, se devuelve la versión más reciente. + * + * @param string|Version $version Versión a obtener. También puede + * tomar los valores 'newest' u 'oldest' para representar a la versión + * más nueva o más vieja, respectivamente. + * @param string $append Texto que se le anezará a la cadena + * de salida. + * + * @return string Ruta del recurso + * */ + public function getResourcePath($version = self::NEWEST, $append = '') + { + + $r = sprintf('%s%s%s', $this->GetDirectoryPath($version), $this->ShortName, $append); + + return $r; + } + } } diff --git a/src/Utilities/UnitTesting/Assert.php b/src/Utilities/UnitTesting/Assert.php index 385acc2..4e71673 100644 --- a/src/Utilities/UnitTesting/Assert.php +++ b/src/Utilities/UnitTesting/Assert.php @@ -11,260 +11,312 @@ * For full copyright and license information, please see the LICENSE * Redistributions of files must retain the above copyright notice. * - * @copyright Copyright © 2015 Nelson Martell - * @link http://nelson6e65.github.io/php_nml/ - * @since v0.1.1 - * @license http://www.opensource.org/licenses/mit-license.php The MIT License (MIT) + * @copyright 2015 Nelson Martell + * @link http://nelson6e65.github.io/php_nml/ + * @since v0.1.1 + * @license http://www.opensource.org/licenses/mit-license.php The MIT License (MIT) * */ namespace NelsonMartell\Utilities\UnitTesting { - use NelsonMartell\Object; - use NelsonMartell\Version; - use \Exception; - - /** - * Comprueba condiciones de pruebas. - * - * - * @author Nelson Martell (nelson6e65-dev@yahoo.es) - * */ - final class Assert { - - private static function Equals($expected, $actual) { - if ($expected === $actual) { - return true; - } - - if ($expected instanceof Object || $expected instanceof IEquatable) { - if ($expected->Equals($actual)) { - return true; - } - } else { - if ($expected == $actual) { - return true; - } - } - return false; - } - - - /** - * Comprueba si los dos objetos especificados son iguales. Caso contrario, emite una - * advertencia. - * - * - * @param string $msg Custom message to append on assert failed. - * @return boolean true si son iguales; false, en caso contrario. - * */ - public static function AreEqual($expected, $actual, $msg = '') { - - $equals = self::Equals($expected, $actual); - - if (!$equals) { - $a_string = $actual; - $e_string = $expected; - - if (is_array($actual)) { - $a_string = implode(', ', $actual); - } - - if (is_array($expected)) { - $e_string = implode(', ', $expected); - } - - if (is_bool($actual)) { - $a_string = $actual ? 'true' : 'false'; - } - - if (is_bool($expected)) { - $e_string = $expected ? 'true' : 'false'; - } - - $error = sprintf(dgettext('nml', '%5$s failed. Expected: (%3$s) "%4$s". Actual: (%1$s) "%2$s".'), typeof($actual), $a_string, typeof($expected), $e_string, __METHOD__); - - if ($msg) { - $error .= ' ' . sprintf(dgettext('nml', 'Message: %s'), $msg); - } - - trigger_error($error, E_USER_WARNING); - } - - return $equals; - } - - - - /** - * Comprueba si los dos objetos especificados NO son iguales. En caso de que sí lo sean, - * emite una advertencia. - * - * - * @param string $msg Custom message to append on assert failed. - * @return boolean true si NO son iguales; false, en caso contrario. - * */ - public static function AreNotEqual($notExpected, $actual, $msg = '') { - $not_equals = !self::Equals($notExpected, $actual); - - if (!$not_equals) { - $a_string = $actual; - $ne_string = $notExpected; - - if (is_array($actual)) { - $a_string = implode(', ', $actual); - } - - if (is_array($notExpected)) { - $ne_string = implode(', ', $notExpected); - } - - if (is_bool($actual)) { - $a_string = $actual ? 'true' : 'false'; - } - - if (is_bool($notExpected)) { - $ne_string = $notExpected ? 'true' : 'false'; - } - - $error = sprintf(dgettext('nml', '%5$s failed. Not expected: (%3$s) "%4$s". Actual: (%1$s) "%2$s".'), Type::typeof($actual), $a_string, Type::typeof($notExpected), $ne_string, __METHOD__); - - if ($msg) { - $error .= ' ' . sprintf(dgettext('nml', 'Message: %s'), $msg); - } - - trigger_error($error, E_USER_WARNING); - } - - return $not_equals; - } - - - public static function IsTrue($actual) { - return self::AreEqual(true, $actual); - } - - public static function IsFalse($actual) { - return self::AreEqual(false, $actual); - } - - /** - * Comprueba que, si al llamar un método público de un objeto, se obtiene una excepción del - * tipo especificado. - * - * - * @param string $method_name Method name. - * @param mixed $obj Object to check. - * @param array $params Method params. - * @param Exception $expectedException Exception to check type. If null, checks any. - * @param string $msg Custom message to append on assert failed. - * @return boolean - * */ - public static function MethodThrowsException($method_name, $obj, $params = array(), Exception $expectedException = null, $msg = '') { - - $equals = false; - - $expected = typeof($expectedException); - $actual = typeof(null); - - try { - call_user_func_array(array($obj, $method_name), $params); - } catch (Exception $e) { - $actual = typeof($e); - } - - if ($actual->IsNotNull()) { - // Se lanzó la excepción... - if ($expected->IsNull()) { - // ...pero no se especificó el tipo de excepción, es decir, puede ser cualquiera - $equals = true; - } else { - // ...pero debe comprobarse si son del mismo tipo: - $equals = self::Equals($expected, $actual); - - if (!$equals) { - $error = sprintf(dgettext('nml', '%1$s failed. Expected: "%2$s". Actual: "%3$s".'), __METHOD__, $expected, $actual); - - if ($msg) { - $error .= ' ' . sprintf(dgettext('nml', 'Message: %s'), $msg); - } - - trigger_error($error, E_USER_WARNING); - } - } - } else { - // No se lanzó la excepción - $actual = "No exception"; - - if ($expected->IsNull()) { - $expected = "Any exception"; - } - - $error = sprintf(dgettext('nml', '%1$s failed. Expected: "%2$s". Actual: "%3$s".'), __METHOD__, $expected, $actual); - - if ($msg) { - $error .= ' ' . sprintf(dgettext('nml', 'Message: %s'), $msg); - } - - trigger_error($error, E_USER_WARNING); - } - - - return $equals; - } - - - - public static function PropertyThrowsException($obj, $property_name, $value, Exception $expectedException = null, $msg = '') { - $equals = false; - - $expected = typeof($expectedException); - $actual = typeof(null); - - try { - $obj->$property_name = $value; - } catch (Exception $e) { - $actual = typeof($e); - } - - if ($actual->IsNotNull()) { - // Se lanzó la excepción... - if ($expected->IsNull()) { - // ...pero no se especificó el tipo de excepción, es decir, puede ser cualquiera - $equals = true; - } else { - // ...pero debe comprobarse si son del mismo tipo: - $equals = self::Equals($expected, $actual); - - if (!$equals) { - $error = sprintf(dgettext('nml', '%1$s failed. Expected: "%2$s". Actual: "%3$s".'), __METHOD__, $expected, $actual); - - if ($msg) { - $error .= ' ' . sprintf(dgettext('nml', 'Message: %s'), $msg); - } - - trigger_error($error, E_USER_WARNING); - } - } - } else { - // No se lanzó la excepción - $actual = "No exception"; - - if ($expected->IsNull()) { - $expected = "Any exception"; - } - - $error = sprintf(dgettext('nml', '%1$s failed. Expected: "%2$s". Actual: "%3$s".'), __METHOD__, $expected, $actual); - - if ($msg) { - $error .= ' ' . sprintf(dgettext('nml', 'Message: %s'), $msg); - } - - trigger_error($error, E_USER_WARNING); - } - - - return $equals; - } - - } + use NelsonMartell\Object; + use \Exception; + + /** + * Comprueba condiciones de pruebas. + * + * + * @author Nelson Martell + * */ + final class Assert + { + + private static function equals($expected, $actual) + { + if ($expected === $actual) { + return true; + } + + if ($expected instanceof Object || $expected instanceof IEquatable) { + if ($expected->Equals($actual)) { + return true; + } + } else { + if ($expected == $actual) { + return true; + } + } + + return false; + } + + + /** + * Comprueba si los dos objetos especificados son iguales. Caso contrario, emite una + * advertencia. + * + * + * @param string $msg Custom message to append on assert failed. + * @param boolean $expected + * @return boolean true si son iguales; false, en caso contrario. + * */ + public static function areEqual($expected, $actual, $msg = '') + { + + $equals = self::Equals($expected, $actual); + + if (!$equals) { + $a_string = $actual; + $e_string = $expected; + + if (is_array($actual)) { + $a_string = implode(', ', $actual); + } + + if (is_array($expected)) { + $e_string = implode(', ', $expected); + } + + if (is_bool($actual)) { + $a_string = $actual ? 'true' : 'false'; + } + + if (is_bool($expected)) { + $e_string = $expected ? 'true' : 'false'; + } + + $error = sprintf( + dgettext('nml', '%5$s failed. Expected: (%3$s) "%4$s". Actual: (%1$s) "%2$s".'), + typeof($actual), + $a_string, + typeof($expected), + $e_string, + __METHOD__ + ); + + if ($msg) { + $error .= ' ' . sprintf(dgettext('nml', 'Message: %s'), $msg); + } + + trigger_error($error, E_USER_WARNING); + } + + return $equals; + } + + + + /** + * Comprueba si los dos objetos especificados NO son iguales. En caso de que sí lo sean, + * emite una advertencia. + * + * + * @param string $msg Custom message to append on assert failed. + * @return boolean true si NO son iguales; false, en caso contrario. + * */ + public static function areNotEqual($notExpected, $actual, $msg = '') + { + $not_equals = !self::Equals($notExpected, $actual); + + if (!$not_equals) { + $a_string = $actual; + $ne_string = $notExpected; + + if (is_array($actual)) { + $a_string = implode(', ', $actual); + } + + if (is_array($notExpected)) { + $ne_string = implode(', ', $notExpected); + } + + if (is_bool($actual)) { + $a_string = $actual ? 'true' : 'false'; + } + + if (is_bool($notExpected)) { + $ne_string = $notExpected ? 'true' : 'false'; + } + + $error = sprintf( + dgettext('nml', '%5$s failed. Not expected: (%3$s) "%4$s". Actual: (%1$s) "%2$s".'), + Type::typeof($actual), + $a_string, + Type::typeof($notExpected), + $ne_string, + __METHOD__ + ); + + if ($msg) { + $error .= ' ' . sprintf(dgettext('nml', 'Message: %s'), $msg); + } + + trigger_error($error, E_USER_WARNING); + } + + return $not_equals; + } + + + public static function isTrue($actual) + { + return self::areEqual(true, $actual); + } + + public static function isFalse($actual) + { + return self::areEqual(false, $actual); + } + + /** + * Comprueba que, si al llamar un método público de un objeto, se obtiene una excepción del + * tipo especificado. + * + * + * @param string $method_name Method name. + * @param mixed $obj Object to check. + * @param array $params Method params. + * @param Exception $expectedException Exception to check type. If null, checks any. + * @param string $msg Custom message to append on assert failed. + * @return boolean + * */ + public static function methodThrowsException( + $method_name, + $obj, + $params = array(), + Exception $expectedException = null, + $msg = '' + ) { + + $equals = false; + + $expected = typeof($expectedException); + $actual = typeof(null); + + try { + call_user_func_array(array($obj, $method_name), $params); + } catch (Exception $e) { + $actual = typeof($e); + } + + if ($actual->IsNotNull()) { + // Se lanzó la excepción... + if ($expected->IsNull()) { + // ...pero no se especificó el tipo de excepción, es decir, puede ser cualquiera + $equals = true; + } else { + // ...pero debe comprobarse si son del mismo tipo: + $equals = self::Equals($expected, $actual); + + if (!$equals) { + $error = sprintf( + dgettext('nml', '%1$s failed. Expected: "%2$s". Actual: "%3$s".'), + __METHOD__, + $expected, + $actual + ); + + if ($msg) { + $error .= ' ' . sprintf(dgettext('nml', 'Message: %s'), $msg); + } + + trigger_error($error, E_USER_WARNING); + } + } + } else { + // No se lanzó la excepción + $actual = "No exception"; + + if ($expected->IsNull()) { + $expected = "Any exception"; + } + + $error = sprintf( + dgettext('nml', '%1$s failed. Expected: "%2$s". Actual: "%3$s".'), + __METHOD__, + $expected, + $actual + ); + + if ($msg) { + $error .= ' ' . sprintf(dgettext('nml', 'Message: %s'), $msg); + } + + trigger_error($error, E_USER_WARNING); + } + + + return $equals; + } + + + + public static function propertyThrowsException( + $obj, + $property_name, + $value, + Exception $expectedException = null, + $msg = '' + ) { + $equals = false; + + $expected = typeof($expectedException); + $actual = typeof(null); + + try { + $obj->$property_name = $value; + } catch (Exception $e) { + $actual = typeof($e); + } + + if ($actual->IsNotNull()) { + // Se lanzó la excepción... + if ($expected->IsNull()) { + // ...pero no se especificó el tipo de excepción, es decir, puede ser cualquiera + $equals = true; + } else { + // ...pero debe comprobarse si son del mismo tipo: + $equals = self::Equals($expected, $actual); + + if (!$equals) { + $error = sprintf( + dgettext('nml', '%1$s failed. Expected: "%2$s". Actual: "%3$s".'), + __METHOD__, + $expected, + $actual + ); + + if ($msg) { + $error .= ' ' . sprintf(dgettext('nml', 'Message: %s'), $msg); + } + + trigger_error($error, E_USER_WARNING); + } + } + } else { + // No se lanzó la excepción + $actual = "No exception"; + + if ($expected->IsNull()) { + $expected = "Any exception"; + } + + $error = sprintf( + dgettext('nml', '%1$s failed. Expected: "%2$s". Actual: "%3$s".'), + __METHOD__, + $expected, + $actual + ); + + if ($msg) { + $error .= ' ' . sprintf(dgettext('nml', 'Message: %s'), $msg); + } + + trigger_error($error, E_USER_WARNING); + } + + + return $equals; + } + } } diff --git a/src/Version.php b/src/Version.php index b28d3ba..edf9d29 100644 --- a/src/Version.php +++ b/src/Version.php @@ -11,286 +11,408 @@ * For full copyright and license information, please see the LICENSE * Redistributions of files must retain the above copyright notice. * - * @copyright Copyright © 2015 Nelson Martell - * @link http://nelson6e65.github.io/php_nml/ - * @since v0.1.1 - * @license http://www.opensource.org/licenses/mit-license.php The MIT License (MIT) + * @copyright 2015 Nelson Martell + * @link http://nelson6e65.github.io/php_nml/ + * @since v0.1.1 + * @license http://www.opensource.org/licenses/mit-license.php The MIT License (MIT) * */ namespace NelsonMartell { - use \InvalidArgumentException; - - /** - * Representa el número de versión de un programa o ensamblado, de la forma "1.2.3.4". Sólo - * siendo obligatorios el primer y segundo componente. - * No se puede heredar esta clase. - * - * - * @author Nelson Martell (nelson6e65-dev@yahoo.es) - * */ - final class Version extends Object implements IEquatable, IComparable { - - /** - * Crea una nueva instancia con los números principal, secundario, de compilación (opcional) - * y revisión (opcional). - * Para comprobar si la versión es válida, usar el método IsValid. - * - * - * @param int $major Componente principal - * @param int $minor Componente secundario - * @param int|string|VersionComponent|NULL $build Componente de compilación - * @param int|string|VersionComponent|NULL $revision Componente de revisión - * @throw InvalidArgumentException - * */ - function __construct($major, $minor, $build = null, $revision = null) { - parent::__construct(); - unset($this->Major, $this->Minor, $this->Build, $this->Revision); - - if (!is_integer($major)) { - throw new InvalidArgumentException(sprintf(dgettext('nml', "Invalid argument type. '%s' (argument %s) must be an instance of '%s', '%s' given. Convert value or use the static method Version::Parse(string|mixed) to create a new instance from an string."), "major", 1, typeof(0), typeof($major))); - } - - if (!is_integer($minor)) { - throw new InvalidArgumentException(sprintf(dgettext('nml', "Invalid argument type. '%s' (argument %s) must be an instance of '%s', '%s' given. Convert value or use the static method Version::Parse(string|mixed) to create a new instance from an string."), "minor", 2, typeof(0), typeof($major))); - } - - if ($major < 0) { - throw new InvalidArgumentException(sprintf(dgettext('nml', "Invalid argument value. '%s' (argument %s) must be a positive number; '%s' given."), "major", 1, $major)); - } - - if ($minor < 0) { - throw new InvalidArgumentException(sprintf(dgettext('nml', "Invalid argument value. '%s' (argument %s) must be a positive number; '%s' given."), "minor", 2, $minor)); - } - - $this->_major = $major; - $this->_minor = $minor; - $this->_build = VersionComponent::Parse($build); - $this->_revision = VersionComponent::Parse($revision); - } - - /** - * Convierte una cadena a su representación del tipo Version. - * - * - * @param string Cadena a convertir. - * @return Version Objeto convertido desde $value. - * */ - public static function Parse($value) { - if ($value instanceof Version) { - return $value; - } - - $version = (string) $value; - - $version = explode('.', $version); - - $c = count($version); - - if ($c > 4 || $c < 2) { - //var_dump($version); - throw new InvalidArgumentException(sprintf(dgettext('nml', "Unable to parse. Argument passed has an invalid format: '%s'."), $value)); - } - - - $major = (int) $version[0]; - $minor = (int) $version[1]; - $build = null; - $revision = null; - - if(count($version) >= 3) { - $build = VersionComponent::Parse($version[2]); - - if(count($version) == 4) { - $revision = VersionComponent::Parse($version[3]); - } - } - - - - return new Version($major, $minor, $build, $revision); - } - - /** - * Obtiene el valor del componente principal del número de versión del objeto actual. - * Ésta propiedad es de sólo lectura. - * - * - * @var int Componente principal del número de versión - * */ - public $Major; - private $_major; - - public function get_Major() { return $this->_major; } - - - /** - * Obtiene el valor del componente secundario del número de versión del objeto actual. - * Ésta propiedad es de sólo lectura. - * - * - * @var int Componente secundario del número de versión - * */ - public $Minor; - private $_minor; - - public function get_Minor() { return $this->_minor; } - - /** - * Obtiene el valor del componente de compilación del número de versión del objeto actual. - * Ésta propiedad es de sólo lectura. - * - * - * @var VersionComponent Componente de compilación del número de versión - * */ - public $Build; - private $_build; - - public function get_Build() { return $this->_build; } - - /** - * Obtiene el valor del componente de revisión del número de versión del objeto actual. - * Ésta propiedad es de sólo lectura. - * - * - * @var VersionComponent Componente de revisión del número de versión - * */ - public $Revision; - private $_revision; - - public function get_Revision() { return $this->_revision; } - - - /** - * Convierte la instancia actual en su representación en cadena. - * Por defecto, si no están definidos los componentes de compilación y revisión, no se - * incluyen en la salida. - * Use el método IsValid si quiere determinar si la versión es válida antes de devolver esta cadena. - * - * - * @return string Representación de la versión en forma de cadena: 'major.minor[.build[.revision]]' - * @see VersionComponent::IsNull - * @see Version::IsValid - * */ - public function ToString() { - $s[0] = $this->Major; - $s[1] = $this->Minor; - - if ($this->Revision->IsNotNull()) { - $s[2] = $this->Build; - $s[3] = $this->Revision; - } else { - if ($this->Build->IsNotNull()) { - $s[2] = $this->Build; - } - } - $v = implode('.', $s); - - return $v; - } - - /** - * Indica si la instancia actual es un número de versión válido. - * - * Se considera válido si: - * 1. Major o Minor es mayor a cero (0). No puede ser '0.0'. - * 2. Build y Revision son nulos (no están definidos). - * 3. Build está definido pero Revision no. - * 4. Ambos están definidos, pero no poseen la parte de la cadena. - * 5. Ambos están definidos, pero Build no posee la parte de cadena. - * 6. Build está definido y tiene la cadena, pero Revision no está definido. - * 7. Revision posee cadena, pero Build no. - * - * @return boolean Un valor que indica si la instancia actual es válida. - * */ - public function IsValid() { - // Validación de Major y Minor: - $r = ($this->Major > 0 or $this->Minor > 0); //#1 - - // Validación de Build y Revision: - if ($r) { - $r = ($this->Build->IsNull() and $this->Revision->IsNull()); // #2 - - if (!$r) { - if ($this->Build->IsNotNull() and $this->Revision->IsNotNull()) { // Si ambos están definidos... - - $r = (bool)($this->Build->StringValue == ''); //#5 - - if (!$r) { - $r = (bool)(($this->Build->StringValue == '') and ($this->Revision->StringValue == '')); //#4 - - if (!$r) { - if ($this->Build->StringValue != '') { - $r = $this->Revision->IsNull(); #6 - } - - if ($this->Revision->StringValue != '') { - $r = ($this->Build->StringValue == ''); #7 - } - } - } - } else { - $r = ($this->Build->IsNotNull() and $this->Revision->IsNull()); //#3 - } - } - } - - return (bool) $r; - } - - /** - * Determina si el objeto $other especificado es igual a la instancia actual. - * - * - * @return bool True si $other es igual esta instancia - * */ - public function Equals($other) { - if ($other instanceof Version) { - if ($this->Major == $other->Major && $this->Minor == $other->Minor) { - if ($this->Build->Equals($other->Build)) { - if ($this->Revision->Equals($other->Revision)) { - return true; - } - } - } - } - - return false; - } - - - #region IComparable - - /** - * Determina la posición relativa del objeto especificado con respecto a esta instancia. - * - * - * @param Version $other - * @return integer 0, si es igual; >0, si es mayor; <0, si es menor. - * */ - public function CompareTo($other){ - - $r = $this->Equals($other) ? 0 : 9999; - - if ($r != 0) { - $r = $this->Major - $other->Major; - - if ($r == 0) { - $r = $this->Minor - $other->Minor; - - if ($r == 0) { - $r = $this->Build->CompareTo($other->Build); - - if ($r == 0) { - $r = $this->Revision->CompareTo($other->Revision); - } - } - } - } - - return $r; - } - - #endregion - - } + + use \InvalidArgumentException; + + /** + * Representa el número de versión de un programa o ensamblado, de la forma "1.2.3.4". Sólo + * siendo obligatorios el primer y segundo componente. + * No se puede heredar esta clase. + * + * @author Nelson Martell + * */ + final class Version extends Object implements IEquatable, IComparable + { + + /** + * Crea una nueva instancia con los números principal, secundario, de + * compilación (opcional) y revisión (opcional). + * Para comprobar si la versión es válida, usar el método isValid. + * + * @param int $major Componente principal + * @param int $minor Componente secundario + * @param int|string|VersionComponent|null $build Componente de compilación + * @param int|string|VersionComponent|null $revision Componente de revisión + * + * @throws InvalidArgumentException + * */ + public function __construct($major, $minor, $build = null, $revision = null) + { + parent::__construct(); + unset($this->Major, $this->Minor, $this->Build, $this->Revision); + + if (!is_integer($major)) { + $args = [ + 'class' => $this->getType()->Name, + 'name' => 'major', + 'pos' => 0, + 'expected' => typeof(0), + 'actual' => typeof($major), + ]; + + $msg = nml_msg('Invalid argument type.'); + $msg .= nml_msg( + ' "{name}" (position {pos}) must to be an instance of "{expected}"; "{actual}" given.', + $args + ); + $msg .= nml_msg(' Convert value or use the "{class}::parse" (static) method.', $args); + + throw new InvalidArgumentException($msg); + } + + if (!is_integer($minor)) { + $args = [ + 'class' => $this->getType()->Name, + 'name' => 'minor', + 'pos' => 1, + 'expected' => typeof(0), + 'actual' => typeof($minor), + ]; + + $msg = nml_msg('Invalid argument type.'); + $msg .= nml_msg( + ' "{name}" (position {pos}) must to be an instance of "{expected}"; "{actual}" given.', + $args + ); + $msg .= nml_msg(' Convert value or use the "{class}::parse" (static) method.', $args); + + throw new InvalidArgumentException($msg); + } + + if ($major < 0) { + $args = [ + 'name' => 'major', + 'pos' => 0, + 'actual' => $major, + ]; + + $msg = nml_msg('Invalid argument value.'); + $msg .= nml_msg( + ' "{name}" (position {pos}) must to be a positive number; "{actual}" given.', + $args + ); + + throw new InvalidArgumentException($msg); + } + + if ($minor < 0) { + $args = [ + 'name' => 'minor', + 'pos' => 1, + 'actual' => $minor, + ]; + + $msg = nml_msg('Invalid argument value.'); + $msg .= nml_msg( + ' "{name}" (position {pos}) must to be a positive number; "{actual}" given.', + $args + ); + + throw new InvalidArgumentException($msg); + } + + $this->major = $major; + $this->minor = $minor; + $this->build = VersionComponent::Parse($build); + $this->revision = VersionComponent::Parse($revision); + } + + /** + * Convierte una cadena a su representación del tipo Version. + * + * @param Version|string|int|float|array $value Objeto a convertir. + * + * @return Version Objeto convertido desde $value. + * */ + public static function parse($value) + { + if ($value instanceof Version) { + return $value; + } + + $version = []; + + // Try to convert into an array + if (is_integer($value)) { + // Integer for major value + $version = [$value, 0]; + + } elseif (is_float($value)) { + // Integer part as major, and decimal part as minor + $version = sprintf("%F", $value); + $version = explode('.', $version); + + } elseif (is_array($value)) { + // Implode first 4 places for major, minor, build and revision respectivally. + $version = array_slice($value, 0, 4); + + } elseif (is_string($value)) { + $version = explode('.', $value); + + } else { + $msg = nml_msg('Unable to parse. Argument passed has an invalid type: "{0}".', typeof($value)); + throw new InvalidArgumentException($msg); + } + + // $value ya debería ser un array. + $c = count($version); + + if ($c > 4 || $c < 2) { + $msg = nml_msg('Unable to parse. Argument passed has an invalid format: "{0}".', $value); + //var_dump($version); + throw new InvalidArgumentException($msg); + } + + + $major = (int) $version[0]; + $minor = (int) $version[1]; + $build = null; + $revision = null; + + if (count($version) >= 3) { + $build = VersionComponent::Parse($version[2]); + + if (count($version) == 4) { + $revision = VersionComponent::Parse($version[3]); + } + } + + return new Version($major, $minor, $build, $revision); + } + + /** + * Obtiene el valor del componente principal del número de versión del + * objeto actual. + * Esta propiedad es de sólo lectura. + * + * @var int Componente principal del número de versión. + * */ + public $Major; + private $major; + + /** + * Getter for Major property. + * + * @return integer + * @see Version::Major. + */ + public function getMajor() + { + return $this->major; + } + + + /** + * Obtiene el valor del componente secundario del número de versión del + * objeto actual. + * Esta propiedad es de sólo lectura. + * + * @var int Componente secundario del número de versión. + * */ + public $Minor; + private $minor; + + /** + * Getter for minor property. + * + * @return integer + * @see Version::Minor. + */ + public function getMinor() + { + return $this->minor; + } + + /** + * Obtiene el valor del componente de compilación del número de versión + * del objeto actual. + * Esta propiedad es de sólo lectura. + * + * @var VersionComponent Componente de compilación del número de versión. + * */ + public $Build; + private $build; + + /** + * Getter for Build property. + * + * @return VersionComponent + * @see Version::Build + */ + public function getBuild() + { + return $this->build; + } + + /** + * Obtiene el valor del componente de revisión del número de versión del + * objeto actual. + * Esta propiedad es de sólo lectura. + * + * @var VersionComponent Componente de revisión del número de versión. + * */ + public $Revision; + private $revision; + + /** + * Getter for Revision property. + * + * @return VersionComponent + * @see Version::Revision + */ + public function getRevision() + { + return $this->revision; + } + + + /** + * Convierte la instancia actual en su representación en cadena. + * Por defecto, si no están definidos los componentes de compilación y + * revisión, no se incluyen en la salida. + * Use el método isValid si quiere determinar si la versión es válida + * antes de devolver esta cadena. + * + * @return string Representación de la versión en forma de cadena: + * 'major.minor[.build[.revision]]' + * @see VersionComponent::isNull + * @see Version::isValid + * */ + public function toString() + { + $s[0] = $this->Major; + $s[1] = $this->Minor; + + if ($this->Revision->IsNotNull()) { + $s[2] = $this->Build; + $s[3] = $this->Revision; + } else { + if ($this->Build->IsNotNull()) { + $s[2] = $this->Build; + } + } + $v = implode('.', $s); + + return $v; + } + + /** + * Indica si la instancia actual es un número de versión válido. + * + * Se considera válido si: + * 1. Major o Minor es mayor a cero (0). No puede ser '0.0'. + * 2. Build y Revision son nulos (no están definidos). + * 3. Build está definido pero Revision no. + * 4. Ambos están definidos, pero no poseen la parte de la cadena. + * 5. Ambos están definidos, pero Build no posee la parte de cadena. + * 6. Build está definido y tiene la cadena, pero Revision no está definido. + * 7. Revision posee cadena, pero Build no. + * + * @return boolean Un valor que indica si la instancia actual es válida. + * */ + public function isValid() + { + // Validación de Major y Minor: + $r = ($this->Major > 0 or $this->Minor > 0); //#1 + + // Validación de Build y Revision: + if ($r) { + $r = ($this->Build->IsNull() and $this->Revision->IsNull()); // #2 + + if (!$r) { + if ($this->Build->IsNotNull() and $this->Revision->IsNotNull()) { + // Si ambos están definidos... + + $r = (bool) ($this->Build->StringValue == ''); //#5 + + if (!$r) { + //#4 + $r = (bool) (($this->Build->StringValue == '') and ($this->Revision->StringValue == '')); + + if (!$r) { + if ($this->Build->StringValue != '') { + $r = $this->Revision->IsNull(); #6 + } + + if ($this->Revision->StringValue != '') { + $r = ($this->Build->StringValue == ''); #7 + } + } + } + } else { + $r = ($this->Build->IsNotNull() and $this->Revision->IsNull()); //#3 + } + } + } + + return (bool) $r; + } + + /** + * Determina si el objeto $other especificado es igual a la instancia actual. + * + * @param Version $other El otro objeto a comparar. + * + * @return bool `true` si $other es igual esta instancia; caso contrario, + * `false`. + * */ + public function equals($other) + { + if ($other instanceof Version) { + if ($this->Major == $other->Major && $this->Minor == $other->Minor) { + if ($this->Build->Equals($other->Build)) { + if ($this->Revision->Equals($other->Revision)) { + return true; + } + } + } + } + + return false; + } + + + #region IComparable + + /** + * Determina la posición relativa del objeto especificado con respecto a + * esta instancia. + * + * @param Version $other El otro objeto Version a comparar. + * + * @return integer `0`, si es igual; >0, si es mayor; <0, si es menor. + * */ + public function compareTo($other) + { + + $r = $this->Equals($other) ? 0 : 9999; + + if ($r != 0) { + $r = $this->Major - $other->Major; + + if ($r == 0) { + $r = $this->Minor - $other->Minor; + + if ($r == 0) { + $r = $this->Build->CompareTo($other->Build); + + if ($r == 0) { + $r = $this->Revision->CompareTo($other->Revision); + } + } + } + } + + return $r; + } + + #endregion + } } diff --git a/src/VersionComponent.php b/src/VersionComponent.php index 87fad0b..406b812 100644 --- a/src/VersionComponent.php +++ b/src/VersionComponent.php @@ -11,151 +11,201 @@ * For full copyright and license information, please see the LICENSE * Redistributions of files must retain the above copyright notice. * - * @copyright Copyright © 2015 Nelson Martell - * @link http://nelson6e65.github.io/php_nml/ - * @since v0.1.1 - * @license http://www.opensource.org/licenses/mit-license.php The MIT License (MIT) + * @copyright 2015 Nelson Martell + * @link http://nelson6e65.github.io/php_nml/ + * @since v0.1.1 + * @license http://www.opensource.org/licenses/mit-license.php The MIT License (MIT) * */ namespace NelsonMartell { - use \InvalidArgumentException; - - /** - * Representa un componente de un número de Version. - * Extiende la clase IntString, pero restringe los valores que puede tomar. - * - * - * @author Nelson Martell (nelson6e65-dev@yahoo.es) - * */ - class VersionComponent extends IntString implements IEquatable { - - function __construct($intValue = null, $stringValue = null) { - parent::__construct($intValue, $stringValue); - - if (is_integer($intValue)) { - //Validaciones: - if ($this->IntValue < 0) { - throw new InvalidArgumentException(sprintf(dgettext('nml', 'Invalid argument value. "%s" (argument %s) must be positive; "%s" given.'), '$intValue', 1, $intValue)); - } - } else { - if ($intValue === null) { - if ($stringValue != null) { - throw new InvalidArgumentException(sprintf(dgettext('nml', 'Invalid argument type. "%s" must be NULL when "%s" is NULL; "%s" given.'), '$stringValue', '$intValue', $stringValue)); - } - } else { - throw new InvalidArgumentException(sprintf(dgettext('nml', 'Invalid argument type. "%s" (argument %s) must be an integer or NULL; "%s" given.'), '$intValue', 1, $intValue)); - } - } //Only integer or null - - if (is_string($stringValue)) { - if ($this->StringValue != '') { - // if ($this->IntValue == 0) { - // throw new InvalidArgumentException(sprintf(dgettext('nml', 'Invalid argument value. "%s" (argument %s) has invalid format: "%s". VersionComponent can not be a text-only value. $intValue must be > 0 to append it text.'), '$stringValue', 2, $stringValue)); - // } Sí puede ser 0 - - $pattern = '~^([a-z])$~'; // 1 char - - if (strlen($this->StringValue) > 1) { - $start = '~^([a-z]|-)'; - $middle = '([a-z]|[0-9]|-)*'; - $end = '([a-z]|[0-9])$~'; - - $pattern = $start . $middle . $end; - } - - $correct = (boolean) preg_match($pattern, $this->StringValue); - - if ($correct) { - //Último chequeo: que no hayan 2 '-' consecutivos. - $correct = strpos($this->StringValue, '--') == false ? true : false; - } - - if (!$correct) { - throw new InvalidArgumentException(sprintf(dgettext('nml', 'Invalid argument value. "%s" (argument %s) has invalid chars: "%s".'), '$stringValue', 2, $stringValue)); - } - - } - } else { - if ($stringValue != null) { - throw new InvalidArgumentException(sprintf(dgettext('nml', 'Invalid argument type. "%s" (argument %s) must be an string or NULL; "%s" given.'), '$stringValue', 2, $stringValue)); - } - } // Only integer or null - } - - public static function Parse($value = NULL) { - if ($value instanceof VersionComponent) { - return $value; - } - - if ($value === NULL or trim((string) $value) === '') { - return new VersionComponent(); - } - - $s = parent::Parse($value); - - $r = new VersionComponent($s->IntValue, $s->StringValue); - - return $r; - } - - /** - * Determina si este componente tiene los valores predeterminados (0). - * - * - * @return boolean - * */ - public function IsDefault() { - if ($this->IntValue == 0){ - if ($this->StringValue == '') { - return true; - } - } - - return false; - } - - - /** - * Getter method for VersionComponent::IntValue property. - * - * @return integer|NULL - * */ - public function get_IntValue() { - return $this->_intValue; - } - - - /** - * Determina si este componente NO tiene los valores predeterminados. - * - * - * @return boolean - * */ - public function IsNotDefault() { - return !$this->IsDefault(); - } - - /** - * Determina si esta instancia es nula. - * - * @return boolean - * */ - public function IsNull() { - if ($this->IntValue === NULL) { - return true; - } - - return false; - } - - /** - * Determina si esta instancia NO es nula. - * - * @return boolean - * */ - public function IsNotNull() { - return !$this->IsNull(); - } - - } + + use \InvalidArgumentException; + + /** + * Representa un componente de un número de Version. + * Extiende la clase IntString, pero restringe los valores que puede tomar. + * + * @author Nelson Martell + * */ + class VersionComponent extends IntString implements IEquatable + { + + public function __construct($intValue = null, $stringValue = null) + { + parent::__construct($intValue, $stringValue); + + if (is_integer($intValue)) { + //Validaciones: + if ($this->IntValue < 0) { + $args = [ + 'name' => 'intValue', + 'pos' => 0, + 'actual' => $intValue, + ]; + + $msg = nml_msg('Invalid argument value.'); + $msg .= nml_msg( + ' "{name}" (position {pos}) must to be a positive number; "{actual}" given.', + $args + ); + + throw new InvalidArgumentException($msg); + } + } else { + if ($intValue === null) { + // Ignore string value id intValue is null. + $this->stringValue = $stringValue = ''; + } else { + $args = [ + 'name' => 'intValue', + 'pos' => 0, + 'expected' => typeof(0).' or '.typeof(null), + 'actual' => typeof($intValue), + ]; + + $msg = nml_msg('Invalid argument type.'); + $msg .= nml_msg( + ' "{name}" (position {pos}) must to be an instance of "{expected}"; "{actual}" given.', + $args + ); + + throw new InvalidArgumentException($msg); + } + } //Only integer or null + + if (is_string($stringValue)) { + if ($this->StringValue != '') { + $pattern = '~^([a-z])$~'; // 1 char + + if (strlen($this->StringValue) > 1) { + $start = '~^([a-z]|-)'; + $middle = '([a-z]|[0-9]|-)*'; + $end = '([a-z]|[0-9])$~'; + + $pattern = $start.$middle.$end; + } + + $correct = (boolean) preg_match($pattern, $this->StringValue); + + if ($correct) { + //Último chequeo: que no hayan 2 '-' consecutivos. + $correct = strpos($this->StringValue, '--') == false ? true : false; + } + + if (!$correct) { + $args = [ + 'name' => 'stringValue', + 'pos' => 1, + 'actual' => $stringValue, + ]; + + $msg = nml_msg('Invalid argument value.'); + $msg .= nml_msg( + ' "{name}" (position {pos}) has invalid chars; "{actual}" given.', + $args + ); + + throw new InvalidArgumentException($msg); + } + + } + } else { + if ($stringValue != null) { + $args = [ + 'name' => 'stringValue', + 'pos' => 1, + 'expected' => typeof('string').' or '.typeof(null), + 'actual' => typeof($stringValue), + ]; + + $msg = nml_msg('Invalid argument type.'); + $msg .= nml_msg( + ' "{name}" (position {pos}) must to be an instance of "{expected}"; "{actual}" given.', + $args + ); + + throw new InvalidArgumentException($msg); + } + } // Only string or null + } + + public static function parse($value = null) + { + if ($value instanceof VersionComponent) { + return $value; + } + + if ($value === null or trim((string) $value) === '') { + return new VersionComponent(); + } + + $s = parent::Parse($value); + + $r = new VersionComponent($s->IntValue, $s->StringValue); + + return $r; + } + + /** + * Determina si este componente tiene los valores predeterminados (0). + * + * @return boolean + * */ + public function isDefault() + { + if ($this->IntValue == 0) { + if ($this->StringValue == '') { + return true; + } + } + + return false; + } + + + /** + * Getter method for VersionComponent::IntValue property. + * + * @return integer|NULL + * */ + public function getIntValue() + { + return $this->intValue; + } + + + /** + * Determina si este componente NO tiene los valores predeterminados. + * + * @return boolean + * */ + public function isNotDefault() + { + return !$this->IsDefault(); + } + + /** + * Determina si esta instancia es nula. + * + * @return boolean + * */ + public function isNull() + { + if ($this->IntValue === null) { + return true; + } + + return false; + } + + /** + * Determina si esta instancia NO es nula. + * + * @return boolean + * */ + public function isNotNull() + { + return !$this->IsNull(); + } + } } diff --git a/src/constants.php b/src/constants.php new file mode 100644 index 0000000..2aaac9b --- /dev/null +++ b/src/constants.php @@ -0,0 +1,48 @@ + 2) { + $args = array_slice(func_get_args(), 1); + } - return dgettext(NML_GETTEXT_DOMAIN, $s); + return String::format($translated, $args); } @@ -46,34 +48,41 @@ function nml_msg($message, $args = null) { * Busca un mensaje único, en singular y plural, traducido en el dominio 'nml'. * El mensaje puede contener cadenas de formato. * - * @param string $singular Mensaje con formato que se va a buscar cuando $n es uno (1). - * @param string $plural Mensaje con formato que se va a buscar cuando $n es distinto a (1). - * @param integer $n Cantidad - * @param array|mixed $args Un objeto, una lista de objetos o múltiples argumentos que se van a - * incluir en las cadenas de formato del mensaje. - * @return string - * @see dngettext - * @see String::Format + * @param string $singular Mensaje con formato que se va a buscar cuando $n + * es uno (1). + * @param string $plural Mensaje con formato que se va a buscar cuando $n + * es distinto a (1). + * @param integer $n Cantidad + * @param array|mixed $args Un objeto, una lista de objetos o múltiples + * argumentos que se van a incluir en las cadenas de formato del mensaje. + * + * @return string + * @see dngettext + * @see String::format * */ -function nml_nmsg($singular, $plural, $n, $args = null) { - $s = String::Format($singular, array_slice(func_get_args(), 1)); - $p = String::Format($plural, array_slice(func_get_args(), 1)); +function nml_nmsg($singular, $plural, $n, $args = null) +{ + $translated = dngettext(NML_GETTEXT_DOMAIN, $singular, $plural, $n); + + if (func_num_args() > 4) { + $args = array_slice(func_get_args(), 3); + } - return dngettext(NML_GETTEXT_DOMAIN, $s, $p, $n); + return String::format($translated, $args); } if (!function_exists('typeof')) { - - /** - * Obtiene el tipo del objeto especificado. - * Es un alias para el constructor de la clase Type. - * - * - * @param mixed $obj Objeto al cual se le extraerá su tipo. - * @return Type - * @see Type::__construct - * */ - function typeof($obj) { - return new Type($obj); - } + /** + * Obtiene el tipo del objeto especificado. + * Es un alias para el constructor de la clase Type. + * + * @param mixed $obj Objeto al cual se le extraerá su tipo. + * + * @return Type + * @see Type::__construct + * */ + function typeof($obj) + { + return new Type($obj); + } } diff --git a/src/nml.php b/src/nml.php deleted file mode 100644 index 9e8de5e..0000000 --- a/src/nml.php +++ /dev/null @@ -1,24 +0,0 @@ -