[[post_data {
    "author" : "KyMAN",
    "since" : 20210719,
    "version" : 20210726
}]]
# AnP.Common.py

Esta librería es la librería donde se encuentran todos los elementos comunes del lado Python de AnP.
Aunque sea la primera librería para la importación, esto no indica que sea la librería principal,
quedando como la principal *AnP.py*, esta librería simplemente contendrá metodos y variables comunes
para la librería principal, así como estructuras comunes cortas como la creación y gestión de Hashes
entre otras opciones.

Para documentar esta librería nos centraremos en las diferentes funciones o variables de las que se
compone para uso global.

## AnP.platform

[[wdoc
Método objeto que retorna la plataforma del OS sobre la que trabaja (UNIX o DOS).
@name       AnP.platform
@lang       Python
@author     KyMAN
@since      20210726
@version    20210726
@access     public
#return     str -   Plataforma de trabajo
]]

## AnP.is_dos

[[wdoc
Método objeto que verifica si está trabajando en DOS o no.
@name       AnP.is_dos
@lang       Python
@author     KyMAN
@since      20210726
@version    20210726
@access     public
#return     bool    -   Verifica si está trabajando en DOS.
]]

## AnP.is_unix

[[wdoc
Método objeto que verifica si está trabajando en UNIX o no.
@name       AnP.is_unix
@lang       Python
@author     KyMAN
@since      20210726
@version    20210726
@access     public
#return     bool    -   Verifica si está trabajando en UNIX.
]]

## AnP.python2

[[wdoc
Método estático que verifica si se está ejecutando en Python 2 o no.
@name       AnP.python2
@lang       Python
@author     KyMAN
@since      20210722
@version    20210722
@access     public
#return     bool    -           Verifica si está en Python 2 o no.
]]

Método estático que retorna un valor Booleano que verifica si se está ejecutando en Python 2 o no.

## AnP.python3

[[wdoc
Método estático que verifica si se está ejecutando en Python 3 o no.
@name       AnP.python3
@lang       Python
@author     KyMAN
@since      20210722
@version    20210722
@access     public
#return     bool    -           Verifica si está en Python 3 o no.
]]

Método estático que retorna un valor Booleano que verifica si se está ejecutando en Python 3 o no.

## AnP.is_bool

[[wdoc
Método estático que verifica si una variable es un valor Booleano o no.
@name       AnP.is_bool
@lang       Python
@author     KyMAN
@see        AnP.python2
@since      20210722
@version    20210722
@access     public
#value      -       required    Variable a analizar.
#return     bool    -           Verifica si es un valor Booleano o no.
]]

Método estático que retorna un valor Booleano que verifica si la variable enviada es de tipo
Booleana o no.

```py

print("YES" if AnP.is_bool(0) else "NO") # NO
print("YES" if AnP.is_bool(True) else "NO") # YES
print("YES" if AnP.is_bool(False) else "NO") # YES
print("YES" if AnP.is_bool("True") else "NO") # NO

```

## AnP.is_array

[[wdoc
Método estático que verifica si una variable es un Array o no.
@name       AnP.is_array
@lang       Python
@author     KyMAN
@since      20210722
@version    20210722
@access     public
#value      -       required    Variable a analizar.
#return     bool    -           Verifica si es un Array o no.
]]

Método estático que retorna un valor Booleano que verifica si la variable enviada es un Array o no.
Para validar si es un Array o no en Python, puesto que este lenguaje no posee como tal un tipado
concreto para éste, se verifica si es de tipo lista (list) o tupla (tuple), siendo la diferencia
entre ambas que la tupla es un vector rígido y la lista un vector dinámico.

```py

print("YES" if AnP.is_array(0) else "NO") # NO
print("YES" if AnP.is_array([]) else "NO") # YES
print("YES" if AnP.is_array((0,)) else "NO") # YES
print("YES" if AnP.is_array(("jojo")) else "NO") # NO

```

## AnP.is_list

[[wdoc
Método estático que verifica si una variable es una lista o no.
@name       AnP.is_list
@lang       Python
@author     KyMAN
@since      20210722
@version    20210722
@access     public
#value      -       required    Variable a analizar.
#return     bool    -           Verifica si es una lista o no.
]]

Método estático que retorna un valor Booleano que verifica si la variable enviada es una lista o no.

```py

print("YES" if AnP.is_array(0) else "NO") # NO
print("YES" if AnP.is_array([]) else "NO") # YES
print("YES" if AnP.is_array((0,)) else "NO") # NO
print("YES" if AnP.is_array(("jojo")) else "NO") # NO

```

## AnP.is_tuple

[[wdoc
Método estático que verifica si una variable es una tupla o no.
@name       AnP.is_tuple
@lang       Python
@author     KyMAN
@since      20210722
@version    20210722
@access     public
#value      -       required    Variable a analizar.
#return     bool    -           Verifica si es una tupla o no.
]]

Método estático que retorna un valor Booleano que verifica si la variable enviada es una tupla o no.

```py

print("YES" if AnP.is_array(0) else "NO") # NO
print("YES" if AnP.is_array([]) else "NO") # NO
print("YES" if AnP.is_array((0,)) else "NO") # YES
print("YES" if AnP.is_array(("jojo")) else "NO") # NO

```

## AnP.is_dictionary

[[wdoc
Método estático que verifica si una variable es un diccionario o no.
@name       AnP.is_dictionary
@lang       Python
@author     KyMAN
@since      20210722
@version    20210722
@access     public
#value      -       required    Variable a analizar.
#return     bool    -           Verifica si es un diccionario o no.
]]

Método estático que retorna un valor Booleano que verifica si la variable enviada es un diccionario
o no.

```py

print("YES" if AnP.is_array(0) else "NO") # NO
print("YES" if AnP.is_array([]) else "NO") # NO
print("YES" if AnP.is_array((0,)) else "NO") # NO
print("YES" if AnP.is_array({}) else "NO") # YES

```

## AnP.is_string

[[wdoc
Método estático que verifica si una variable es un String o no.
@name       AnP.is_string
@lang       Python
@author     KyMAN
@see        AnP.python2
@since      20210722
@version    20210722
@access     public
#value      -       required    Variable a analizar.
#return     bool    -           Verifica si es un String o no.
]]

Método estático que retorna un valor Booleano que verifica si la variable enviada es un string o no.

```py

print("YES" if AnP.is_array(0) else "NO") # NO
print("YES" if AnP.is_array([]) else "NO") # NO
print("YES" if AnP.is_array("") else "NO") # YES
print("YES" if AnP.is_array({}) else "NO") # NO

```

## AnP.is_function

[[wdoc
Método estático que verifica si una variable es una función o no.
@name       AnP.is_function
@lang       Python
@author     KyMAN
@since      20210722
@version    20210722
@access     public
#value      -       required    Variable a analizar.
#return     bool    -           Verifica si es una función o no.
]]

Método estático que retorna un valor Booleano que verifica si la variable enviada es una función o
no.

```py

def test():
    pass

print("YES" if AnP.is_array(0) else "NO") # NO
print("YES" if AnP.is_array(lambda:0) else "NO") # YES
print("YES" if AnP.is_array(test) else "NO") # YES
print("YES" if AnP.is_array({}) else "NO") # NO

```

## AnP.is_number

[[wdoc
Método estático que verifica si una variable es un valor numérico o no.
@name       AnP.is_number
@lang       Python
@author     KyMAN
@since      20210722
@version    20210722
@access     public
#value      -       required    Variable a analizar.
#return     bool    -           Verifica si es un número o no.
]]

Método estático que retorna un valor Booleano que verifica si la variable enviada es un número o no.

```py

print("YES" if AnP.is_array(0) else "NO") # YES
print("YES" if AnP.is_array("1") else "NO") # NO
print("YES" if AnP.is_array(.8) else "NO") # YES
print("YES" if AnP.is_array(-6.23) else "NO") # YES
print("YES" if AnP.is_array({}) else "NO") # NO

```

## AnP.is_integer

[[wdoc
Método estático que verifica si una variable es un valor numérico entero o no.
@name       AnP.is_integer
@lang       Python
@author     KyMAN
@since      20210722
@version    20210722
@access     public
#value      -       required    Variable a analizar.
#return     bool    -           Verifica si es un valor entero o no.
]]

Método estático que retorna un valor Booleano que verifica si la variable enviada es un número
entero o no.

```py

print("YES" if AnP.is_array(0) else "NO") # YES
print("YES" if AnP.is_array("1") else "NO") # NO
print("YES" if AnP.is_array(.8) else "NO") # NO
print("YES" if AnP.is_array(-6.23) else "NO") # NO
print("YES" if AnP.is_array({}) else "NO") # NO

```

## AnP.is_datetime

[[wdoc
Método estático que verifica si una variable es una fecha y/o hora o no.
@name       AnP.is_datetime
@lang       Python
@author     KyMAN
@since      20210722
@version    20210722
@access     public
#value      -       required    Variable a analizar.
#return     bool    -           Verifica si es una fecha y/o hora o no.
]]

Método estático que retorna un valor Booleano que verifica si la variable enviada es un objeto de
tipo fecha y/o hora o no.

## AnP.if_none

[[wdoc
Método estático que retorna el primer valor si no es nulo, sino el segundo valor.
@name       AnP.if_none
@lang       Python
@author     KyMAN
@see        AnP.is_function
@since      20210722
@version    20210722
@access     public
#value      -   required    Variable principal.
#callback   -   required    Variable secundaria.
#return     -   -           Variable no nula o única.
]]

Método estático al cual se le mandan dos valores donde si el primero es nulo (None) éste retornará
el segundo, haciendo referencia al **isnull** de SQL Server y al **ifnull** de MySQL. Para evitar un
preprocesamiento inútil se permite que el segundo parámetro sea una función, ya sea Lambda o una
función predefinida y el valor devuelto en caso de que el primero sea nulo, será la respuesta a la
llamada de dicha función.

## AnP.string_variables

[[wdoc
Método de clase que procesa las variables de un String.
@name       AnP.string_variables
@lang       Python
@author     KyMAN
@see        AnP.is_array
@see        AnP.is_dictionary
@since      20210722
@version    20210722
@access     public
#string     str             required    String a procesar.
#variables  dict,list,tuple optional    Variables para procesar el String.
#default    str             optional    Valor por defecto.
#return     str             -           String procesado.
]]

Método estático que permite procesar variables en un String dado, entiendendo que las variables
dentro del String sean nombradas estableciendo su Key entre llaves, siendo substituídos por el valor
que se le determine en las variables. En caso de no encontrarse un valor en las variables, éste
devolverá el valor por defecto, a no ser que éste sea nulo, que será cuando se devolverá de nuevo su
estado original incluyendo las llaves. La entrada de variables puede ser nula, lo cual no haría
nada; un diccionario donde vuscar el valor a la llave del String; o una lista o tupla de
diccionarios con la misma finalidad.

## [[plain AnP.get_directory_path]]

[[wdoc
Método de clase que retorna el Path del directorio de un Path ya sea fichero o directorio.
@name       AnP.get_directory_path
@lang       Python
@author     KyMAN
@since      20210726
@version    20210726
@access     public
#path       str required    Path a procesar.
#return     str -           Path del directorio.
]]

## AnP.make_directories

[[wdoc
Método estático que crea un directorio, incluyendo los niveles del mismo.
@name       AnP.get_directory_path
@lang       Python
@author     KyMAN
@see        AnP.is_string
@since      20210726
@version    20210726
@access     public
#path       str required    Path a crear como directorio.
]]

> [[! important IMPORTANTE]]: Los permisos del mismo quedarán exclusivizados al usuario ejecutor del
Python, y dará una excepción si no tiene permisos o el Path del mismo está mal sintácticamente o no
pertenece a ninguna unidad.

## AnP.paths_get

[[wdoc
Método objeto que retorna una lista de todos los posibles Paths absolutos de un Path relativo dado.
@name       AnP.paths_get
@lang       Python
@author     KyMAN
@see        AnP.is_string
@since      20210726
@version    20210726
@access     public
#path       str optional    Path del que partir.
#return     str -           Lista de Paths.
]]

La lista de Paths resultante será una lista de Paths a partir de como se estructure en la
configuración a partir del siguiente orden de prioridad:

# Path dado.
# Path absoluto de la aplicación.
# Path relativo anterior al de la ejecución.
# Path relativo desde la ejecución.
# Paths roots dados.
    # Paths establecidos como "root".
    # Paths establecidos como "roots".

## AnP.file_load

[[wdoc
Método objeto que carga el contenido de un fichero.
@name       AnP.file_load
@lang       Python
@author     KyMAN
@see        AnP.paths_get
@since      20210726
@version    20210726
@access     public
#path       str optional    Path del que partir.
#return     str -           Contenido
]]

> [[! note NOTA]]: El contenido cargado será de caracter binario en Python 3.

> [[! important IMPORTANTE]]: El contenido será None si no se encuentra el fichero.

## AnP.json_decode

[[wdoc
Método objeto que decodifica un String en JSON.
@name       AnP.json_decode
@lang       Python
@author     KyMAN
@see        AnP.is_string
@see        AnP.exception
@since      20210726
@version    20210726
@access     public
#path           str             required    String JSON.
#show_errors    bool            optional    Verifica si se imprime error o no.
#return         dict,list,tuple -           JSON decodificado.
]]

> [[! important IMPORTANTE]]: Si el formato del String no es un JSON retornará None.

## AnP.json_encode

[[wdoc
Método objeto que codifica un objeto en JSON.
@name       AnP.json_encode
@lang       Python
@author     KyMAN
@see        AnP.exception
@since      20210726
@version    20210726
@access     public
#object         str     required    Objeto a serializar en JSON.
#show_errors    bool    optional    Verifica si se imprime error o no.
#return         str     -           String JSON.
]]

> [[! important IMPORTANTE]]: Si el objeto dado no es serializable y codificable en JSON retornará
None.

## AnP.base64_decode

[[wdoc
Método estático que decodifica un String en Base64.
@name       AnP.base64_decode
@lang       Python
@author     KyMAN
@since      20210726
@version    20210726
@access     public
#data       str     required    String codificado.
#return     str     -           String decodificado.
]]

> [[! important IMPORTANTE]]: Si la codificación es errónea retornará None.

## AnP.base64_encode

[[wdoc
Método estático que codifica un String en Base64.
@name       AnP.base64_encode
@lang       Python
@author     KyMAN
@see        AnP.exception
@since      20210726
@version    20210726
@access     public
#data       str     required    String a codificar.
#return     str     -           String codificado.
]]

> [[! important IMPORTANTE]]: Si No es un String o da problemas su codificación, éste retornará
None.

## AnP.shell

[[wdoc
Método estático que ejecuta un comando en la Terminal o en la Consola de COMANDOS.
@name       AnP.shell
@lang       Python
@author     KyMAN
@see        AnP.exception
@since      20210726
@version    20210726
@access     public
#command    str     required    Comando a ejecutar.
#return     str     -           Respuesta de la ejecución.
]]

> [[! important IMPORTANTE]]: Si la ejecución da error éste retornará None.

> [[! important IMPORTANTE]]: Solo retorna el nivel de respuesta e ignora el nivel de error e
inserción de texto.

## AnP.load_url

[[wdoc
Método estático que carga el contenido de una URL.
@name       AnP.load_url
@lang       Python
@author     KyMAN
@see        AnP.shell
@since      20210726
@version    20210726
@access     public
#url        str     required    URL a cargar.
#data       dict    optional    Variables a enviar por POST.
#cookies    str     optional    Cookies.
#return     bool    -           Contenido del sitio Web.
]]

> [[! note NOTA]]: Para realizar un POST sin variables ha de enviarse un diccionario vacío en el
parámetro "data".

> [[! note NOTA]]: Este método no usa ningún método interno nativo de Python como pueden ser las
librerías "urllib", "urllib2", "urllib3", "request" o "socket" puesto que Python, de forma nativa,
espera a la finalización del Timeout, relentizando las conexiones de la aplicación o incluso
arriesgando a que la respuesta venga parcial por culpa de dicho Timeout. Para realizar dicha acción
usará la Terminal o la Consola de COMANDOS, dependiendo de la plataforma en la que se encuentre, a
partir de la librería nativa de Python "subprocess", y ejecutará el programa cURL para efectuar
dicha acción. Es importante destacar que dicho programa viene nativo en Windows 10 en su Consola de
COMANDOS, pero en Linux se requiere de instalar, lo cual puede efectuarse de la siguiente manera:

```sh
apt install curl
```

## AnP.are_string

[[wdoc
Método estático que verifica si en un Array todos sus elementos son String o no.
@name       AnP.are_string
@lang       Python
@author     KyMAN
@see        AnP.is_array
@see        AnP.is_string
@since      20210726
@version    20210726
@access     public
#data       list,tuple  required    Array a analizar.
#return     bool        -           Verifica si todos los elementos son String.
]]

## AnP.ternary

[[wdoc
Método estático que retorna el primer valor enviado si la condición es afirmativa, en caso contrario
retornará el valor del segundo elemento dado.
@name       AnP.ternary
@lang       Python
@author     KyMAN
@since      20210726
@version    20210726
@access     public
@deprecated
#condition  bool    required    Condición a analizar.
#true       -       required    Retorno afirmativo.
#false      -       optional    Retorno negativo.
#return     -       -           Retorno.
]]

## AnP.timestamp

[[wdoc
Método estático que retorna la fecha actual en segundos en formato Timestamp.
@name       AnP.timestamp
@lang       Python
@author     KyMAN
@since      20210726
@version    20210726
@access     public
#return     int -   Fecha actual en segundos.
]]

## AnP.timestamp_milliseconds

[[wdoc
Método estático que retorna la fecha actual en milisegundos en formato Timestamp.
@name       AnP.timestamp_milliseconds
@lang       Python
@author     KyMAN
@since      20210726
@version    20210726
@access     public
#return     int -   Fecha actual en milisegundos.
]]

## AnP.now

[[wdoc
Método estático que retorna la fecha actual en un objeto de tipo "datetime".
@name       AnP.now
@lang       Python
@author     KyMAN
@since      20210726
@version    20210726
@access     public
#return     datetime    -   Fecha actual.
]]

## AnP.datetime

[[wdoc
Método estático que retorna la fecha actual en un objeto de tipo "datetime", o si se le da un
Timestamp en segundos, éste retornará dicha fecha como objeto de tipo "datetime".
@name       AnP.datetime
@lang       Python
@author     KyMAN
@see        AnP.is_number
@see        AnP.now
@since      20210726
@version    20210726
@access     public
#date       int         optional    Fecha Timestamp.
#return     datetime    -           Fecha actual.
]]

## AnP.exception

[[wdoc
Método objeto que gestiona el almacenamiento de la excepción en las trazas de la base de datos.
@name       AnP.exception
@lang       Python
@author     KyMAN
@see        AnP.Procedures.Logs.exception
@since      20210726
@version    20210726
@access     public
#method     str required    Nombre del método del que parte la excepción.
#exception  str required    Traza e información de la excepción.
]]

> [[! warning AVISO]]: Si la base de datos no está montada, ya sea que no hay configuración para la
misma o falla cualquier punto para el montaje de la base de datos SQLite, éste no hará nada más que
almacenar en memoria las excepciones mientras el programa siga activo y en cuanto detecte que existe
la base de datos, éste insertará todas las excepciones en la misma, sino, dichas excepciones se
perderán.

## AnP.format_path

[[wdoc
Método objeto que formatea el Path según esté ejecutándose en DOS o en UNIX.
@name       AnP.format_path
@lang       Python
@author     KyMAN
@see        AnP.is_dos
@since      20210726
@version    20210726
@access     public
#path       str required    Path a formatear.
#return     str -           Path formateado.
]]

> [[! warning AVISO]]: Si el Path apunta a una unidad, ésta se formateará en los casos de UNIX no
sobre el directorio raíz, sino desde el directorio de montaje "/mnt" continuando con un
subdirectorio con la letra de la unidad en minúscula siguiendo la estructura de los Subsistemas
Linux.

> [[! note NOTA]]: Si el Path ya está formateado en el sistema requerido éste no cambiará.

## AnP.procedure_exists

[[wdoc
Método objeto que verifica si existe la librería de procedimientos almacenados a partir del nombre
dado o no.
@name       AnP.procedure_exists
@lang       Python
@author     KyMAN
@since      20210726
@version    20210726
@access     public
#name       str     required    Nombre de la librería de procedimientos.
#return     bool    -           Verifica si existe o no.
]]

## AnP.procedure_get

[[wdoc
Método objeto que retorna la librería de procedimientos.
@name       AnP.procedure_get
@lang       Python
@author     KyMAN
@see        AnP.procedure_exists
@since      20210726
@version    20210726
@access     public
#name       str     required    Nombre de la librería de procedimientos.
#return     object  -           Librería de procedimientos.
]]

> [[! note NOTA]]: Si no existe retornará None.

## AnP._print

[[wdoc
Método objeto que imprime un texto.
@name       AnP._print
@lang       Python
@author     KyMAN
@see        AnP.now
@see        AnP.is_built
@see        AnP.Settings.get
@see        AnP.is_array
@see        AnP.is_tuple
@see        AnP.I18N.get
@see        AnP.string_variables
@see        AnP.Logs.add
@since      20210726
@version    20210726
@access     public
#_type      str             required    Nombre de la librería de procedimientos.
#text       str             required    String a imprimir.
#variables  dict,list,tuple optional    Variables para tratar el String de impresión.
]]

> Hablar de la configuración, formato, tipados, filtro de impresión por tipados, uso de la I18N,
variables, etc.

> [[! note NOTA]]: Es un método oculto para diferenciarlo del "print" nativo de Python. *Parece ser
que aunque esté internamente dentro de una clase, la palabra reservada "print" da errores
inesperados.*

> [[! note NOTA]]: Este método también se encarga del almacenamiento de los LOGs, entendiéndose como
los elementos de impresión aquellos elementos importantes a mostrar o monitorizar por parte del
usuario cliente.

[[html_data {
    "title" : "Documentación - AnP.py",
    "url" : "https://anp.k3y.pw/es/py/anp.py.html",
    "author" : "Tarsier, angelus, inoro, KyMAN",
    "since" : 20210719,
    "version" : 20210726,
    "key_words" : "anp,attach,play,attach&play,documentación,python,anp.common.py",
    "description" : "Documentación del fichero AnP.Common.py.",
    "project" : "AnP",
    "logo" : "https://anp.k3y.pw/images/anp.png",
    "language" : "es"
}]]
