Anuncio
· 4 mar, 2022

Cómo generar datos aleatorios que tengan sentido

Creo que es por todos conocido que Populate Utility es bastante simple y para muchos casos puede tener una funcionalidad limitada. Solo admite un lenguaje y un país. La lista de valores posibles no tiene muchas opciones. 

Hay un tipo de herramienta que puede ayudar con esto, se llama Faker. Se puede implementar en distintos lenguajes, incluido Python. Como IRIS ahora tiene la funcionalidad de Python Embebido (Embedded Python), Python faker se puede implementar en IRIS.

Python Faker tiene

  • +80 configuraciones de idiomas locales, de forma que los datos generados pueden estar en casi cualquier idioma: inglés, ruso, chino... Los nombres de personas, las direcciones y muchos otros valores se pueden adaptar al idioma.
  • +20 proveedores para muchos tipos diferentes de datos. 
  • Proveedores de la comunidad para otros datos, como música, publicaciones, vehículos, etc.

La implementación de este proyecto iris-python-faker en IRIS se puede encontrar en OpenExchange. Demo online disponible, solo en modo preview.

Instalación

Para probarlo en local, es posible con Docker o con zpm. Para ejecutarlo con Docker desde el repositorio, requiere que BuildKit esté habilitado. ZPM-way requiere la versión de IRIS con soporte a Python Embebido (2021.2+) y python-pip instalado (la imagen oficial de Docker image com IRIS no lo tiene).

git clone https://github.com/caretdev/iris-python-faker.git
cd iris-python-faker
DOCKER_BUILDKIT=1 docker-compose up --build -d

Comprueba el puerto

$ docker-compose ps
          Name                        Command                       State                                                 Ports                                      
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
iris-python-faker-iris-1   /tini -- /iris-main -a iri ...   Up (health: starting)   0.0.0.0:50628->1972/tcp, 2188/tcp, 0.0.0.0:50629->52773/tcp, 53773/tcp, 54773/tcp

Uso

En este caso, el puerto web es 50629, y UI se puede abrir con la URL http://localhost:50629/faker/index.html. O, si trabajas desde VSCode, se puede abrir desde el menú.

Las filas de la tabla representan las columnas en la tabla objetivo. Puedes elegir el tipo desde la lista de tipos de datos implementados.

En la barra de herramientas abajo, puedes elegir una de las configuraciones locales de idioma, elige cuántas filas te gustaría ver en vista previa. Cualquier cambio actualizará la tabla en vista previa, pero puedes actualizarla manualmente con el botón "Refresh".

El botón "Generate" mostrará un formulario, para indicar la Clase objetivo y la cantidad de filas a generar. Si quieres añadir más filas a una clase existente, solo tienes que desmarcar "Create Class".

Si sucediera algún error del lador del servidor, mostrará un mensaje de error.

También es posible generar nuevos datos programáticamente.

  Set params = {
    "rows": 3,                // How many rows generate
    "className": (className), // Where to store generated data
    "locale": "en",           // Select Locale for generated data
    "columns": [{
      "type": "person_name",
      "name": "name"
    }, {
      "type": "date_of_birth",
      "name": "dob"
    }, {
      "type": "boolean",
      "name": "flag"
    }]
  }
  Set faker = ##class("caretdev.Faker.Main").%New()
  Do faker.%JSONImport(params)
  Quit:'$$$AssertStatusOK(faker.GenerateClass())
  Do $ClassMethod(className, "%KillExtent")

  Set result = faker.Generate()
  If $Extract(result)=0 Do $system.OBJ.DisplayError(result)
  Write !,"Rows created",result.created

O simplemente generarlos sin guardarlos en la clase

  Set params = {
    "previewRows": 3,         // How many items generate
    "locale": "en",           // Select Locale for generated data
    "columns": [{
      "type": "person_name",
      "name": "name"
    }, {
      "type": "date_of_birth",
      "name": "dob"
    }, {
      "type": "boolean",
      "name": "flag"
    }]
  }
  Set faker = ##class("caretdev.Faker.Main").%New()
  Do faker.%JSONImport(params)

  Set result = faker.Generate()
  If $Extract(result)=0 Do $system.OBJ.DisplayError(result)
  Set items = result."__getitem__"("items")
  Set count = items."__len__"()
  For i=0:1:count-1 {
    Set item = items."__getitem__"(i)
    Set name = item."__getitem__"("name")
    Set dob = item."__getitem__"("dob")
    Set flag = item."__getitem__"("flag")
  }

Si te gustaría apoyar mi contribución a proyectos de OpenSource, puedes donar aquí.

Comentarios (0)0
Inicie sesión o regístrese para continuar