Artículos

1.7: Sobre “alias” y “coartada”. El grupo de objetos - Matemáticas


Conviene concluir esta revisión de los preliminares algebraicos formulando una regla que nos guíe en la conexión de los conceptos teóricos grupales con los principios físicos.

Una de las preocupaciones de los físicos es observar, identificar y clasificar partículas. Al perseguir este objetivo, deberíamos poder decir si observamos el mismo objeto cuando lo encontramos en diferentes condiciones en diferentes estados. Así, la identidad de un objeto está implícitamente dada por el conjunto de estados en los que reconocemos que es el mismo. Es plausible considerar las transformaciones que conectan estos estados entre sí y asumir que forman un grupo. Por consiguiente, una forma precisa de identificar un objeto es especificar un grupo de objetos asociado.

El concepto de grupo de objetos es extremadamente general, como debería ser, en vista de la amplia gama de situaciones que debe cubrir. Es útil considerar situaciones específicas con más detalle.

Primero, el mismo objeto puede ser observado por diferentes observadores inerciales cuyos hallazgos están conectados por las transformaciones del grupo inercial, que se llamará también el grupo cinemático pasivo. En segundo lugar, la evolución espacio-temporal del objeto en un marco de referencia fijo puede verse como generado por un grupo cinemático activo. Finalmente, si el objeto se especifica en el espacio de fase, hablamos de la grupo dinámico.

Es bien conocido el hecho de que a las transformaciones lineales en un espacio vectorial se les puede dar una interpretación pasiva y activa. En la literatura matemática, estos a veces se designan con los coloridos términos "alias" y "coartada", respectivamente. El primero significa que la transformación de la base conduce a nuevos "nombres" para los mismos objetos geométricos o físicos. El segundo es un mapeo mediante el cual el objeto se transforma en otra "ubicación" con respecto al mismo marco.

Los grupos importantes de invariancia deben clasificarse como grupos pasivos. Sin minimizar en modo alguno su importancia, prestaremos mucha atención también a los grupos activos. Esto nos permitirá manejar, dentro de un marco teórico-grupal unificado, situaciones comúnmente descritas en términos de ecuaciones de movimiento, y también las llamadas “preparaciones de sistemas” tan importantes en la mecánica cuántica.

Es el uso conjunto sistemático de "coartada" y "alias" lo que caracteriza el siguiente argumento.


Uso de Paless en campos con secuencias de comandos de Kibana

Kibana proporciona formas poderosas de buscar y visualizar datos almacenados en Elasticsearch. A los efectos de las visualizaciones, Kibana busca los campos definidos en las asignaciones de Elasticsearch y los presenta como opciones al usuario que crea un gráfico. Pero, ¿qué sucede si olvida definir un valor importante como un campo separado en su esquema? ¿O qué sucede si desea combinar dos campos y tratarlos como uno solo? Aquí es donde entran en juego los campos con guiones de Kibana.

Los campos con secuencias de comandos han existido desde los primeros días de Kibana 4. En el momento en que se introdujeron, la única forma de definirlos se basaba en Lucene Expressions, un lenguaje de secuencias de comandos en Elasticsearch que se ocupa exclusivamente de valores numéricos. Como resultado, el poder de los campos con secuencias de comandos se limitó a un subconjunto de casos de uso. En 5.0, Elasticsearch introdujo Paless, un lenguaje de scripting seguro y poderoso que permite operar en una variedad de tipos de datos y, como resultado, los campos con guiones en Kibana 5.0 son mucho más poderosos.

En el resto de este blog, le mostraremos cómo crear campos con secuencias de comandos para casos de uso comunes. Lo haremos basándonos en un conjunto de datos del tutorial de introducción de Kibana y usaremos una instancia de Elasticsearch y Kibana que se ejecuta en Elastic Cloud, que puede activar de forma gratuita.

El siguiente video le muestra cómo poner en marcha una instancia personal de Elasticsearch y Kibana en Elastic Cloud y cargar un conjunto de datos de muestra en ella.


La función acos () calcula el valor principal del arco coseno de __X. El valor devuelto está en el rango [0, pi] radianes. Se produce un error de dominio para argumentos que no están en el rango [-1, +1].

La función asin () calcula el valor principal del arco seno de __X. El valor devuelto está en el rango [-pi / 2, pi / 2] radianes. Se produce un error de dominio para argumentos que no están en el rango [-1, +1].

La función atan () calcula el valor principal del arco tangente de __X. El valor devuelto está en el rango [-pi / 2, pi / 2] radianes.

La función atan2 () calcula el valor principal del arco tangente de __y / __x, utilizando los signos de ambos argumentos para determinar el cuadrante del valor de retorno. El valor devuelto está en el rango [-pi, + pi] radianes.

La función cbrt () devuelve la raíz cúbica de __X.

La función ceil () devuelve el valor integral más pequeño mayor o igual que __X, expresado como un número de coma flotante.

La función copysign () devuelve __X pero con el signo de __y. Funcionan incluso si __X o __y son NaN o cero.

La función cos () devuelve el coseno de __X, medido en radianes.

La función cosh () devuelve el coseno hiperbólico de __X.

La función exp () devuelve el valor exponencial de __X.

La función fabs () calcula el valor absoluto de un número de punto flotante __X.

La función fdim () devuelve máx (__ x - __y, 0). Si __X o __y o ambos son NaN, se devuelve NaN.

La función floor () devuelve el mayor valor integral menor o igual que __X, expresado como un número de coma flotante.

La función fma () realiza sumar y multiplicar en coma flotante. Esta es la operacion (__x * __y) + __z, pero el resultado intermedio no se redondea al tipo de destino. A veces, esto puede mejorar la precisión de un cálculo.

La función fmax () devuelve el mayor de los dos valores __X y __y. Si un argumento es NaN, se devuelve el otro argumento. Si ambos argumentos son NaN, se devuelve NaN.

La función fmin () devuelve el menor de los dos valores __X y __y. Si un argumento es NaN, se devuelve el otro argumento. Si ambos argumentos son NaN, se devuelve NaN.

La función fmod () devuelve el resto de coma flotante de __x / __y.

La función frexp () divide un número de punto flotante en una fracción normalizada y una potencia integral de 2. Almacena el número entero en el objeto int apuntado por __pexp.

Si __X es un número de punto flotante normal, la función frexp () devuelve el valor v, tal que v tiene una magnitud en el intervalo [1/2, 1) o cero, y __X es igual a v por 2 elevado a la potencia __pexp. Si __X es cero, ambas partes del resultado son cero. Si __X no es un número finito, el frexp () devuelve __X tal cual y almacena 0 por __pexp.

Nota: Esta implementación permite un puntero cero como directiva para omitir el almacenamiento del exponente.

La función hypot () devuelve raíz cuadrada (__ x * __ x + __y * __ y). Esta es la longitud de la hipotenusa de un triángulo rectángulo con lados de longitud __X y __y, o la distancia del punto (__X, __y) desde el origen. Usar esta función en lugar de la fórmula directa es prudente, ya que el error es mucho menor. Sin subdesbordamiento con pequeños __X y __y. Sin desbordamiento si el resultado está dentro del rango.

La función isfinite () devuelve un valor distinto de cero si __X es finito: ni más ni menos infinito, y no NaN.

La función isinf () devuelve 1 si el argumento __X es infinito positivo, -1 si __X es infinito negativo y 0 en caso contrario.

Nota: GCC 4.3 puede reemplazar esta función con código en línea que devuelve el valor 1 para ambos infinitos (error gcc # 35509).

La función isnan () devuelve 1 si el argumento __X representa un objeto "no es un número" (NaN); de lo contrario, 0.

La función ldexp () multiplica un número de punto flotante por una potencia integral de 2. Devuelve el valor de __X veces 2 elevado al poder __Exp.

La función log () devuelve el logaritmo natural del argumento __X.

La función log10 () devuelve el logaritmo del argumento __X a la base 10.

La función lrint () redondea __X al entero más cercano, redondeando los casos intermedios a la dirección del entero par. (Es decir, los valores de 1,5 y 2,5 se redondean a 2). Esta función es similar a la función rint (), pero difiere en el tipo de valor de retorno y en que es posible un desbordamiento.

Devoluciones: El valor entero largo redondeado. Si __X no es un número finito o un desbordamiento, esta realización devuelve el valor LONG_MIN (0x80000000).

La función lround () redondea __X al entero más cercano, pero redondea a la mitad de los casos desde cero (en lugar de al entero par más cercano). Esta función es similar a la función round (), pero difiere en el tipo de valor de retorno y en que es posible un desbordamiento.

Devoluciones: El valor entero largo redondeado. Si __X no es un número finito o un desbordamiento, esta realización devuelve el valor LONG_MIN (0x80000000).

La función modf () rompe el argumento __X en partes integrales y fraccionarias, cada una de las cuales tiene el mismo signo que el argumento. Almacena la parte integral como un doble en el objeto apuntado por __iptr.

La función modf () devuelve la parte fraccionaria firmada de __X.

Nota: Esta implementación omite la escritura por puntero cero. Sin embargo, GCC 4.3 puede reemplazar esta función con un código en línea que no permite usar la dirección NULL para evitar el almacenamiento.


Lista de modelos de datos

  • Se agregaron objetos de nivel superior WWC (5G Wireline Wireless Convergence), PDU (Protocol Data Unit) y FWE (5G Wireline Wireless Encapsulation)
  • Objeto celular actualizado para que sea aplicable a las puertas de enlace residenciales 5G
  • Soporte extendido para métricas de capa IP TR-471, incluida una nueva prueba de capacidad de capa IP
  • Control de acceso basado en el tiempo del dispositivo de LAN compatible
  • Varias mejoras de Wi-Fi

Noviembre de 2020: corrección de errores 1

  • Parámetros agregados para 3GPP SA5 Rel 11 y 12 (TS 32.452, TS 32.453)
  • Parámetros agregados para 3GPP SA5 Rel 13 (CR S5-145293)
  • Parámetros agregados para 3GPP SA5 Rel 13 (CR S5-146268)

Septiembre de 2019: corrección de errores 1

Versiones 9 y 10 de 3GPP compatibles

Septiembre de 2019: corrección de errores 1

Septiembre de 2019: corrección de errores 1

Enero de 2020: corrección de errores 2


Funciones matemáticas¶

Usaremos el siguiente modelo en ejemplos de funciones matemáticas:

Devuelve el valor absoluto de un campo numérico o expresión.

También se puede registrar como una transformación. Por ejemplo:

Devuelve el arcocoseno de un campo numérico o expresión. El valor de la expresión debe estar dentro del rango de -1 a 1.

También se puede registrar como una transformación. Por ejemplo:

Devuelve el arcoseno de un campo numérico o expresión. El valor de la expresión debe estar en el rango de -1 a 1.

También se puede registrar como una transformación. Por ejemplo:

Devuelve el arcotangente de un campo numérico o expresión.

También se puede registrar como una transformación. Por ejemplo:

ATan2 ¶

Devuelve el arcotangente de expresión1 / expresión2.

Devuelve el número entero más pequeño mayor o igual que un campo numérico o expresión.

También se puede registrar como una transformación. Por ejemplo:

Devuelve el coseno de un campo numérico o expresión.

También se puede registrar como una transformación. Por ejemplo:

Devuelve la cotangente de un campo numérico o expresión.

También se puede registrar como una transformación. Por ejemplo:

Grados ¶

Convierte un campo numérico o una expresión de radianes a grados.

También se puede registrar como una transformación. Por ejemplo:

Devuelve el valor de e (la base del logaritmo natural) elevado a la potencia de un campo numérico o expresión.

También se puede registrar como una transformación. Por ejemplo:

Suelo ¶

Devuelve el valor entero más grande no mayor que un campo numérico o una expresión.

También se puede registrar como una transformación. Por ejemplo:

Devuelve el logaritmo natural de un campo numérico o expresión.

También se puede registrar como una transformación. Por ejemplo:

Acepta dos campos numéricos o expresiones y devuelve el logaritmo del primero a la base del segundo.

Acepta dos campos numéricos o expresiones y devuelve el resto del primero dividido por el segundo (operación de módulo).

Devuelve el valor de la constante matemática π.

Energía ¶

Acepta dos campos numéricos o expresiones y devuelve el valor del primero elevado a la potencia del segundo.

Radianes ¶

Convierte un campo numérico o una expresión de grados a radianes.

También se puede registrar como una transformación. Por ejemplo:

Aleatorio ¶

Devuelve un valor aleatorio en el rango 0.0 ≤ x & lt 1.0.

Redondo ¶

Redondea un campo numérico o una expresión al número entero más cercano. Si los valores medios se redondean hacia arriba o hacia abajo depende de la base de datos.

También se puede registrar como una transformación. Por ejemplo:

Devuelve el signo (-1, 0, 1) de un campo numérico o expresión.

También se puede registrar como una transformación. Por ejemplo:

Devuelve el seno de un campo numérico o expresión.

También se puede registrar como una transformación. Por ejemplo:

Devuelve la raíz cuadrada de una expresión o campo numérico no negativo.

También se puede registrar como una transformación. Por ejemplo:

Devuelve la tangente de un campo numérico o expresión.

También se puede registrar como una transformación. Por ejemplo:


Extensiones

Spock viene con un poderoso mecanismo de extensión, que permite conectarse a un ciclo de vida específico para enriquecer o alterar su comportamiento. En este capítulo, primero aprenderemos sobre las extensiones integradas de Spock & # 8217, y luego profundizaremos en la escritura de extensiones personalizadas.

Archivo de configuración de Spock

Algunas extensiones se pueden configurar con opciones en un archivo de configuración de Spock. La descripción de cada extensión mencionará cómo se puede configurar. Todas esas configuraciones están en un archivo Groovy que generalmente se llama SpockConfig.groovy. Spock primero busca una ubicación personalizada dada en una propiedad del sistema llamada spock.configuration que luego se usa como ubicación de ruta de clase o si no se encuentra como ubicación del sistema de archivos si se puede encontrar allí; de lo contrario, las ubicaciones predeterminadas se investigan para un archivo de configuración. A continuación, busca SpockConfig.groovy en la raíz de la ruta de clases de ejecución de la prueba. Si tampoco existe tal archivo, por fin puede tener un SpockConfig.groovy en su hogar de usuario de Spock. Este por defecto es el directorio .spock dentro de su directorio de inicio, pero se puede cambiar usando la propiedad del sistema spock.user.home o si no, establezca la propiedad de entorno SPOCK_USER_HOME.

Filtrado de seguimiento de pila

Puede configurar Spock si debe filtrar los rastros de pila o no utilizando el archivo de configuración. El valor por defecto es verdadero .

Extensiones integradas

La mayoría de las extensiones integradas de Spock & # 8217 son impulsado por anotaciones. En otras palabras, se activan anotando una clase o método de especificación con una determinada anotación. Puede distinguir dicha anotación por su metaanotación @ExtensionAnnotation.

Ignorar

Para evitar temporalmente que se ejecute un método de función, anótelo con spock.lang.

Para fines de documentación, se puede proporcionar una razón:

Para ignorar una especificación completa, anote su clase:

En la mayoría de los entornos de ejecución, los métodos de características y las especificaciones ignorados se informarán como "omitidos".

Se debe tener cuidado al ignorar los métodos de características en una clase de especificación anotada con spock.lang, ya que los métodos de características posteriores pueden depender de que se hayan ejecutado métodos de características anteriores.

IgnoreRest

Para ignorar todos menos un (típicamente) pequeño subconjunto de métodos, anote este último con spock.lang.IgnoreRest:

@IgnoreRest es especialmente útil en entornos de ejecución que no proporcionan una forma (fácil) de ejecutar un subconjunto de métodos.

Se debe tener cuidado al ignorar los métodos de características en una clase de especificación anotada con spock.lang, ya que los métodos de características posteriores pueden depender de que se hayan ejecutado métodos de características anteriores.

Ignorar si

Para ignorar un método de característica bajo ciertas condiciones, anótelo con spock.lang.IgnoreIf, seguido de un predicado:

Para que los predicados sean más fáciles de leer y escribir, las siguientes propiedades están disponibles dentro del cierre:

sys Un mapa de todas las propiedades del sistema

env Un mapa de todas las variables de entorno

os Información sobre el sistema operativo (consulte spock.util.environment.OperatingSystem)

jvm Información sobre la JVM (consulte spock.util.environment.Jvm)

Usando la propiedad os, el ejemplo anterior se puede reescribir como:

Se debe tener cuidado al ignorar los métodos de características en una clase de especificación anotada con spock.lang, ya que los métodos de características posteriores pueden depender de que se hayan ejecutado métodos de características anteriores.

Requiere

Para ejecutar un método de función bajo ciertas condiciones, anótelo con spock.lang.Requires, seguido de un predicado:

Requiere funciona exactamente como IgnoreIf, excepto que el predicado está invertido. En general, es preferible indicar las condiciones bajo las cuales se ejecuta un método, en lugar de las condiciones bajo las cuales se ignora.

Pendiente

Para indicar que la función aún no se ha implementado por completo y no se debe informar como un error, anótelo con spock.lang.PendingFeature.

El caso de uso es anotar pruebas que aún no se pueden ejecutar pero que ya deberían estar comprometidas. La principal diferencia con Ignorar es que se ejecutan las pruebas, pero se ignoran los fallos de las pruebas. Si la prueba pasa sin un error, entonces se informará como falla ya que la anotación PendingFeature debe eliminarse. De esta manera, las pruebas se convertirán en parte de las pruebas normales en lugar de ser ignoradas para siempre.

Groovy tiene la anotación groovy.transform.NotYetImplemented que es similar pero se comporta de manera diferente.

marcará las pruebas fallidas como aprobadas

si pasa al menos una iteración de una prueba basada en datos, se informará como error

marcará las pruebas fallidas como omitidas

si falla al menos una iteración de una prueba basada en datos, se informará como omitida

si pasa cada iteración de una prueba basada en datos, se informará como error

Paso a paso

Para ejecutar características en el orden en que se declaran, anote una clase de especificación con spock.lang.

Stepwise solo afecta a la clase que lleva la anotación, no a las sub o superclases. Se omiten las funciones posteriores al primer error.

Stepwise no anula el comportamiento de anotaciones como Ignore, IgnoreRest e IgnoreIf, por lo que se debe tener cuidado al ignorar métodos de entidad en clases de especificaciones anotadas con Stepwise.

Se acabó el tiempo

Para fallar un método de característica, accesorio o clase que exceda una duración de ejecución determinada, use spock.lang.Timeout, seguido de una duración y, opcionalmente, una unidad de tiempo. La unidad de tiempo predeterminada es segundos.

Cuando se aplica a un método de función, el tiempo de espera es por ejecución de una iteración, excluyendo el tiempo dedicado a los métodos de fijación:

Aplicar Timeout a una clase de especificación tiene el mismo efecto que aplicarlo a cada característica que aún no está anotada con Timeout, excluyendo el tiempo dedicado a los accesorios:

Cuando se aplica a un método de fijación, el tiempo de espera es por ejecución del método de fijación.

Cuando se informa al usuario de un tiempo de espera, el seguimiento de la pila que se muestra refleja la pila de ejecución del marco de prueba cuando se excedió el tiempo de espera.

Rever

Las extensiones @Retry se pueden usar para pruebas de integración inestables, donde los sistemas remotos pueden fallar a veces. De forma predeterminada, vuelve a intentar una iteración 3 veces con un retraso de 0 si se ha arrojado una Exception o AssertionError, todo esto es configurable. Además, se puede utilizar un cierre de condición opcional para determinar si se debe reintentar una función. También proporciona soporte especial para funciones basadas en datos, ofreciendo reintentar todas las iteraciones o solo las que fallan.

Los reintentos también se pueden aplicar a clases de especificaciones, lo que tiene el mismo efecto que aplicarlo a cada método de característica que no esté & # 8217t ya anotado con <@code Retry>.

Una anotación <@code @Retry> que se declara en una clase de especificación también se aplica a todas las características en todas las subclases, a menos que una subclase declare su propia anotación. Si es así, los reintentos definidos en la subclase se aplican a todos los métodos de características declarados en la subclase, así como a los heredados.

Dado el siguiente ejemplo, la ejecución de FooIntegrationSpec ejecutará tanto heredado como foo con un reintento. La ejecución de BarIntegrationSpec ejecutará la barra heredada y con dos reintentos.

Para activar una o más categorías Groovy dentro del alcance de un método de característica o especificación, use spock.util.mop.

Esto puede ser útil para hacer stubbing de métodos dinámicos, que normalmente son proporcionados por el entorno de ejecución (por ejemplo, Grails). No tiene ningún efecto cuando se aplica a un método auxiliar. Sin embargo, cuando se aplica a una clase de especificación, también afectará a sus métodos auxiliares.

ConfineMetaClassChanges

Para limitar los cambios de la metaclase al alcance de un método de característica o clase de especificación, use spock.util.mop.ConfineMetaClassChanges:

Cuando se aplica a una clase de especificación, las metaclases se restauran al estado en el que estaban antes de que se ejecutara setupSpec, después de que se ejecuta cleanupSpec.

Cuando se aplica a un método de característica, las metaclases se restauran como estaban después de que se ejecutó la configuración, antes de que se ejecute la limpieza.

RestoreSystemProperties

Guarda las propiedades del sistema antes de que se ejecute el método de función anotado (incluido cualquier método de configuración y limpieza) y las restaura después.

Aplicar esta anotación a una clase de especificación tiene el mismo efecto que aplicarla a todos sus métodos de entidad.

AutoAttach

Adjunta automáticamente un simulacro independiente a la Especificación actual. Use esto si no hay soporte de marco directo disponible. La inyección de dependencia de Spring y Guice es manejada automáticamente por Spring Module y Guice Module respectivamente.

AutoCleanup

Limpia automáticamente un campo o propiedad al final de su vida útil mediante spock.lang.AutoCleanup.

De forma predeterminada, un objeto se limpia invocando su método close () sin parámetros. Si se debe llamar a algún otro método en su lugar, anule el atributo de valor de la anotación & # 8217s:

Si se anotan varios campos o propiedades con AutoCleanup, sus objetos se limpian secuencialmente, en orden inverso de declaración de campo / propiedad, comenzando desde la clase de clase más derivada y subiendo por la cadena de herencia.

Si una operación de limpieza falla con una excepción, la excepción se informa de forma predeterminada y la limpieza continúa con el siguiente objeto anotado. Para evitar que se notifiquen las excepciones de limpieza, anule el atributo de anotación & # 8217s quiet:

Título y narrativa

Para adjuntar un nombre en lenguaje natural a una especificación, use spock.lang.Title:

De manera similar, para adjuntar una descripción en lenguaje natural a una especificación, use spock.lang.Narrative:

Para enlazar a una o más referencias a información externa relacionada con una especificación o característica, use spock.lang. Consulte:

Asunto

Para indicar que una característica o especificación se relaciona con uno o más problemas en un sistema de seguimiento externo, use spock.lang.

Si tiene una URL de prefijo común para todos los problemas en un proyecto, puede usar el archivo de configuración de Spock para configurarlo para todos a la vez. Si está configurado, se antepone al valor de la anotación @Issue al crear la URL.

Si se establece el issueNamePrefix, se antepone al valor de la anotación @Issue cuando se crea el nombre del problema.

Sujeto

Para indicar uno o más sujetos de una especificación, use spock.lang.Subject:

Además, Asunto se puede aplicar a campos y variables locales:

El tema actualmente solo tiene fines informativos.

Spock comprende las anotaciones @ org.junit.Rule en campos de instancia no @Shared. Las reglas correspondientes se ejecutan en el punto de intercepción de iteración en el ciclo de vida de Spock. Esto significa que las reglas antes de las acciones se realizan antes de la ejecución de los métodos de configuración y las acciones posteriores se realizan después de la ejecución de los métodos de limpieza.

ClassRule

Spock comprende las anotaciones @ org.junit.ClassRule en los campos @Shared. Las reglas correspondientes se ejecutan en el punto de interceptación de la especificación en el ciclo de vida de Spock. Esto significa que las reglas antes de las acciones se realizan antes de la ejecución de los métodos setupSpec y las acciones posteriores se realizan después de la ejecución de los métodos cleanupSpec.

Incluir y excluir

Spock es capaz de incluir y excluir especificaciones según sus clases, superclases e interfaces y según las anotaciones que se aplican a la especificación. Spock también es capaz de incluir y excluir características individuales de acuerdo con las anotaciones que se aplican al método de características. La configuración de qué incluir o excluir se realiza de acuerdo con la sección Archivo de configuración de Spock.

Optimizar orden de ejecución

Spock puede recordar qué funciones fallaron por última vez y con qué frecuencia sucesivamente, y también durante cuánto tiempo fue necesario probar una función. Para ejecuciones sucesivas, Spock ejecutará primero las características que fallaron en la última ejecución y las primeras características que fallaron más a menudo sucesivamente. Dentro de las funciones previamente fallidas o no fallidas, Spock ejecutará primero las pruebas más rápidas. Este comportamiento se puede habilitar de acuerdo con la sección Archivo de configuración de Spock. El valor predeterminado es falso.

Informe de registro

Spock puede crear un registro de informes de las pruebas ejecutadas en formato JSON. Este informe también contiene cosas como @Title, @Narrative, @See y @Issue valores o descriptores de bloque. Este informe se puede habilitar de acuerdo con la sección Archivo de configuración de Spock. El valor predeterminado es no generar este informe.

Para que se genere el informe, debe habilitarlo y establecer al menos logFileDir y logFileName. enabled también se puede configurar a través de la propiedad del sistema spock.logEnabled, logFileDir también se puede configurar a través de la propiedad del sistema spock.logFileDir y logFileName también se puede configurar a través de la propiedad del sistema spock.logFileName.

Si se establece un logFileSuffix (o la propiedad del sistema spock.logFileSuffix), se agrega al nombre de archivo base, separado por un guión. Si el sufijo contiene la cadena #timestamp, esta se reemplaza automáticamente por la fecha y hora actuales en UTC. Si en cambio desea tener su fecha y hora local, puede usar la configuración del ejemplo a continuación.

Extensiones de terceros

Puede encontrar una lista de extensiones de terceros en Spock Wiki.

Escribir extensiones personalizadas

Hay dos tipos de extensiones que se pueden crear para usar con Spock. Estas son extensiones globales y extensiones locales impulsadas por anotaciones. Para ambos tipos de extensión, implementa una interfaz específica que define algunos métodos de devolución de llamada. En su implementación de esos métodos, puede configurar la magia de su extensión, por ejemplo, agregando interceptores a varios puntos de interceptación que se describen a continuación.

El tipo de anotación que cree depende de su caso de uso. Si desea hacer algo una vez durante la ejecución de Spock, al principio o al final, o desea aplicar algo a todas las especificaciones ejecutadas sin que el usuario de la extensión tenga que hacer nada más que incluir su extensión en la ruta de clases, entonces debe optar por una extensión global. Si, en cambio, desea aplicar su magia solo por elección del usuario, debe implementar una extensión local impulsada por anotaciones.

Extensiones globales

Para crear una extensión global, debe crear una clase que implemente la interfaz IGlobalExtension y poner su nombre de clase completamente calificado en un archivo META-INF / services / org.spockframework.runtime.extension.IGlobalExtension en la ruta de la clase. Tan pronto como se cumplan estas dos condiciones, la extensión se carga automáticamente y se usa cuando Spock se está ejecutando. Para mayor comodidad, también existe la clase AbstractGlobalExtension, que proporciona implementaciones vacías para todos los métodos en la interfaz, de modo que solo se deben anular los necesarios.

IGlobalExtension tiene los siguientes tres métodos:

Esto se llama una vez al comienzo de la ejecución de Spock.

Esto se llama una vez para cada especificación. En este método, puede preparar una especificación con su magia de extensión, como conectar interceptores a varios puntos de intercepción como se describe en el capítulo Interceptores.

Esto se llama una vez al final de la ejecución de Spock.

Extensiones locales controladas por anotaciones

Para crear una extensión local impulsada por anotaciones, debe crear una clase que implemente la interfaz IAnnotationDrivenExtension. Como argumento de tipo para la interfaz, debe proporcionar una clase de anotación que tenga @Retention establecido en RUNTIME, @Target establecido en uno o más de FIELD, METHOD y TYPE, dependiendo de dónde desee que se aplique su anotación, y @ExtensionAnnotation aplicado , con la clase IAnnotationDrivenExtension como argumento. Por supuesto, la clase de anotación puede tener algunos atributos con los que el usuario puede configurar aún más el comportamiento de la extensión para cada aplicación de anotación. Por conveniencia, también existe la clase AbstractAnnotationDrivenExtension, que proporciona implementaciones vacías para todos los métodos en la interfaz, de modo que solo se deben anular los necesarios.

Su anotación se puede aplicar a una especificación, un método de característica, un método de fijación o un campo. En todos los demás lugares, como los métodos auxiliares u otros lugares, si @Target se establece en consecuencia, la anotación se ignorará y no tendrá ningún efecto más que ser visible en el código fuente.

IAnnotationDrivenExtension tiene los siguientes cinco métodos, donde en cada uno puede preparar una especificación con su magia de extensión, como conectar interceptores a varios puntos de interceptación como se describe en el capítulo Interceptores:

Esto se llama una vez para cada especificación donde la anotación se aplica con la instancia de anotación como primer parámetro y el objeto de información de especificación como segundo parámetro.

visitFeatureAnnotation (anotación T, función FeatureInfo)

Esto se llama una vez para cada método de característica donde la anotación se aplica con la instancia de anotación como primer parámetro y el objeto de información de característica como segundo parámetro.

visitFixtureAnnotation (anotación T, MethodInfo fixtureMethod)

Esto se llama una vez para cada método de fijación donde la anotación se aplica con la instancia de la anotación como primer parámetro y el objeto de información del método de fijación como segundo parámetro.

visitFieldAnnotation (anotación T, campo FieldInfo)

Esto se llama una vez para cada campo donde se aplica la anotación con la instancia de anotación como primer parámetro y el objeto de información de campo como segundo parámetro.

Esto se llama una vez para cada especificación dentro de la cual se aplica la anotación a al menos uno de los lugares admitidos como se definió anteriormente. Obtiene el objeto de información de especificación como único parámetro. Este método se llama después de que se procesan todos los demás métodos de esta interfaz para cada anotación aplicada.

Objetos de configuración

Puede agregar secciones propias en el archivo de configuración de Spock para su extensión creando POJO o POGO que estén anotados con @ConfigurationObject y tengan un constructor predeterminado (ya sea implícita o explícitamente). El argumento de la anotación es el nombre de la sección de nivel superior que se agrega a la sintaxis del archivo de configuración de Spock. Los valores predeterminados para las opciones de configuración se definen en la clase inicializando los campos en el momento de la declaración o en el constructor. En el archivo de configuración de Spock, esos valores pueden ser editados por el usuario de su extensión.

Para usar los valores del objeto de configuración en su extensión, simplemente defina un campo de instancia no inicializado de ese tipo. Entonces, Spock creará automáticamente exactamente una instancia del objeto de configuración por ejecución de Spock, le aplicará la configuración del archivo de configuración (antes de que se llamen a los métodos start () de las extensiones globales) e inyectará esa instancia en las instancias de la clase de extensión.

Un objeto de configuración no se puede usar exclusivamente en una extensión local impulsada por anotaciones, pero debe usarse en al menos una extensión global para que se inicialice y se complete correctamente con la configuración del archivo de configuración. Pero si el objeto de configuración se usa en una extensión global, también puede usarlo sin problemas en una extensión local impulsada por anotaciones. Si el objeto de configuración solo se usa en una extensión local impulsada por anotaciones, obtendrá una excepción cuando el objeto de configuración deba inyectarse en la extensión y también obtendrá un error cuando se evalúe el archivo de configuración y contenga la sección, como el objeto de configuración aún no está registrado correctamente.

Interceptores

For applying the magic of your extension, there are various interception points, where you can attach interceptors from the extension methods described above to hook into the Spock lifecycle. For each interception point there can of course be multiple interceptors added by arbitrary Spock extensions (shipped or 3rd party). Their order is currently depending on the order they are added, but there should not be made any order assumptions within one interception point.

An ellipsis in the figure means that the block before it can be repeated an arbitrary amount of times.

The …​ method interceptors are of course only run if there are actual methods of this type to be executed (the white boxes) and those can inject parameters to be given to the method that will be run.

The difference between shared initializer interceptor and shared initializer method interceptor and between initializer interceptor and initializer method interceptor - as there can be at most one of those methods each - is, that there are only the two methods if there are @Shared , respectively non- @Shared , fields that get values assigned at declaration time. The compiler will put those initializations in a generated method and call it at the proper place in the lifecycle. So if there are no such initializations, no method is generated and thus the method interceptor is never called. The non-method interceptors are always called at the proper place in the lifecycle to do work that has to be done at that time.

To create an interceptor to be attached to an interception point, you need to create a class that implements the interface IMethodInterceptor . This interface has the sole method intercept(IMethodInvocation invocation) . The invocation parameter can be used to get and modify the current state of execution. Each interceptor deber call the method invocation.proceed() , which will go on in the lifecycle, except you really want to prevent further execution of the nested elements like shown in the figure above. But this should be a very rare use case.

If you write an interceptor that can be used at different interception points and should do different work at different interception points, there is also the convenience class AbstractMethodInterceptor , which you can extend and which provides various methods for overriding that are called for the various interception points. Most of these methods have a double meaning, like interceptSetupMethod which is called for the setup interceptor and the setup method interceptor . If you attach your interceptor to both of them and need a differentiation, you can check for invocation.method.reflection , which will be set in the method interceptor case and null otherwise. Alternatively you can of course build two different interceptors or add a parameter to your interceptor and create two instances, telling each at addition time whether it is attached to the method interceptor or the other one.

Injecting Method Parameters

If your interceptor should support custom method parameters for wrapped methods, this can be done by modifying invocation.arguments . Two use cases for this would be a mocking framework that can inject method parameters that are annotated with a special annotation or some test helper that injects objects of a specific type that are created and prepared for usage automatically.

invocation.arguments may be an empty array or an array of arbitrary length, depending on what interceptors were run before that maybe also have manipulated this array for parameter injection. So if you for example investigated the method parameters with invocation.method.reflection.parameters and found that you want to inject the fifth parameter, you should first check whether the arguments array is at least five elements long. If not, you should assign it a new array that is at least five elements long and copy the contents of the old array into the new one. Then you can assign your objects to be injected.

When using data driven features (methods with a where: block), the user of your extension has to follow some restrictions, if parameters should be injected by your extension:

all data variables and all to-be-injected parameters have to be defined as method parameters

all method parameters have to be assigned a value in the where: block

the order of the method parameters has to be identical to the order of the data variables in the where: block

the to-be-injected parameters have to be set to any value in the where: block, for example null

of course you can also make your extension only inject a value if none is set already, as the where: block assignments happen before the method interceptor is called


Writing UDF’s using Java

To write a UDF using Java, we have to integrate the jar file Pig-0.15.0.jar. In this section, we discuss how to write a sample UDF using Eclipse. Before proceeding further, make sure you have installed Eclipse and Maven in your system.

Follow the steps given below to write a UDF function &minus

Open Eclipse and create a new project (say myproject).

Convert the newly created project into a Maven project.

Copy the following content in the pom.xml. This file contains the Maven dependencies for Apache Pig and Hadoop-core jar files.

Save the file and refresh it. En el Maven Dependencies section, you can find the downloaded jar files.

Create a new class file with name Sample_Eval and copy the following content in it.

While writing UDF’s, it is mandatory to inherit the EvalFunc class and provide implementation to exec() función. Within this function, the code required for the UDF is written. In the above example, we have return the code to convert the contents of the given column to uppercase.

After compiling the class without errors, right-click on the Sample_Eval.java file. It gives you a menu. Seleccione export as shown in the following screenshot.

On clicking export, you will get the following window. Click on JAR file.

Proceed further by clicking Next> botón. You will get another window where you need to enter the path in the local file system, where you need to store the jar file.

Finally click the Finish botón. In the specified folder, a Jar file sample_udf.jar es creado. This jar file contains the UDF written in Java.


The SELECT list supports the following syntax:

COLUMNS[norte]
Array columns are used for reading data from text files. Use the columns[norte] syntax in the SELECT list to return rows from text files in a columnar format. This syntax uses a zero-based index, so the first column is column 0.

DISTINCT
An option that eliminates duplicate rows from the result set, based on matching values in one or more columns.

expression
An expression formed from one or more columns that exist in the tables, files, or directories referenced by the query. An expression can contain functions and aliases that define select list entries. You can also use a scalar aggregate subquery as the expression in the SELECT list.

scalar aggregate subquery
A scalar aggregate subquery is a regular SELECT query in parentheses that returns exactly one column value from one row. The returned value is used in the outer query. The scalar aggregate subquery must include an aggregate function, such as MAX(), AVG(), or COUNT(). If the subquery returns zero rows, the value of the subquery expression is null. If it returns more than one row, Drill returns an error. Scalar subqueries are not valid expressions in the following cases:

AS column_alias
A temporary name for a column in the final result set. The AS keyword is optional.


3.1.3.1.7 sdtContent (Ruby Inline-Level Structured Document Tag Content)

This element specifies the last known contents of a structured document tag around one or more inline-level structures (runs, DrawingML objects, fields, and so on). This element's contents shall be treated as a cache of the contents to be displayed in the structured document tag for the following reasons:

If the structured document tag specifies an XML mapping via the dataBinding element (§" [ISO/IEC-29500-1] §17.5.2.6 dataBinding"), changes to the custom XML data part shall be reflected in the structured document tag as needed

If the contents of the structured document tag are placeholder text via the showingPlcHdr element (§"[ISO/IEC-29500-1] §17.5.2.39 showingPlcHdr"), then this content may be updated with the placeholder text stored in the Glossary Document part

[Example: Consider a structured document tag with the friendly name firstName that shall be located around two runs in a WordprocessingML document. This requirement would be specified as follows in the WordprocessingML:

La sdtContent element contains two adjacent runs (it is an inline-level structured document tag content container). end example]


Read the Docs

Read the Docs simplifies software documentation by automating building, versioning, and hosting of your docs for you.

Free docs hosting for open source

We will host your documentation for free, forever. There are no tricks. We help over 100,000 open source projects share their docs, including a custom domain and theme.

Always up to date

Whenever you push code to your favorite version control service, whether that is GitHub, BitBucket, or GitLab, we will automatically build your docs so your code and documentation are never out of sync.

Downloadable formats

We build and host your docs for the web, but they are also vieweable as PDFs, as single page HTML, and for eReaders. No additional configuration is required.

Multiple versions

We can host and build multiple versions of your docs so having a 1.0 version of your docs and a 2.0 version of your docs is as easy as having a separate branch or tag in your version control system.

Search all the docs