GenerateRandomJSON

Generate a list of random dictionaries, using Faker Python library. For more information, please visit https://faker.readthedocs.io

python · Community Common Scripts

Source

import demistomock as demisto  # noqa: F401
from CommonServerPython import *  # noqa: F401
from faker import Faker
from datetime import datetime, date
from decimal import Decimal
import random


categories = {
    "IT": ["domain_name", "email", "ipv4", "ipv6", "url", "user_name"],
    "Company": ["company", "company_suffix", "job", "catch_phrase"],
    "Address": ["address", "city", "state", "country", "postalcode", "street_address"],
    "Person": ["name", "first_name", "last_name", "email", "phone_number"],
    "Finance": ["credit_card_number", "credit_card_provider", "iban", "bban"],
    "DateTime": ["date", "time", "year", "month", "date_of_birth"],
    "Profile": ["simple_profile"],
    "Color": ["color_name", "hex_color", "rgb_color", "safe_color_name"],
    "Job": ["job", "company", "company_suffix", "catch_phrase"],
    "Other": [],
}

excluded_providers = ["get_providers", "binary", "zip", "tar", "json_bytes", "get_words_list"]


def serialize_value(value):
    if isinstance(value, datetime | date):
        return value.isoformat()
    elif isinstance(value, Decimal):
        return float(value)
    elif isinstance(value, tuple | list):
        return [serialize_value(v) for v in value]
    elif isinstance(value, dict):
        return {k: serialize_value(v) for k, v in value.items()}
    return value


def getAllValidProviders(faker):
    random_providers = [provider for provider in dir(faker) if not provider.startswith("_")]
    valid_providers_list: list = []
    for provider in random_providers:
        try:
            getattr(faker, provider)()
            if provider in excluded_providers:
                continue
            valid_providers_list.append(provider)
        except Exception:
            continue
    return valid_providers_list


def generate_fake_data(category: str, providers: List[str], num_entries: int, randomSize: int):
    global categories
    fake = Faker()
    fake_data_list = []
    providers_list = categories.get(category, [])

    if not isinstance(providers_list, list):
        raise TypeError(f"Expected a list for category '{category}', but got {type(providers_list).__name__}")

    all_valid_providers = getAllValidProviders(fake)

    if not isinstance(all_valid_providers, list):
        raise TypeError(f"Expected a list from getAllValidProviders, but got {type(all_valid_providers).__name__}")

    if category == "Random":
        providers = random.sample(all_valid_providers, k=min(randomSize, len(all_valid_providers)))
    elif category != "Other":
        if category not in list(categories.keys()):
            raise ValueError(f"Category '{category}' is not available. Choose from {list(categories.keys())}.")
        else:
            providers = random.sample(providers_list, k=min(10, len(providers_list)))
    else:
        # Check that all providers entered are valid
        missing_providers = [provider for provider in providers if provider not in all_valid_providers]
        if missing_providers:
            raise ValueError(f"Providers {missing_providers} are not valid faker providers.")

    for _ in range(num_entries):
        fake_data = {}
        for provider in providers:
            if hasattr(fake, provider):
                fake_data[provider] = serialize_value(getattr(fake, provider)())
            else:
                raise ValueError(f"Provider '{provider}' is not available in Faker.")
        fake_data_list.append(fake_data)

    return fake_data_list


def main():
    try:
        args = demisto.args()
        num_entries = int(args.get("list_size", 1))
        providers = argToList(args.get("faker_providers"))
        category = args.get("category", "Random")
        random_size = int(args.get("dict_size", 10))

        if category == "Other" and not providers:
            raise ValueError("When category is 'Other', a list of faker providers must be provided.")

        fake_data_list = generate_fake_data(category, providers, num_entries, random_size)

        return_results(
            CommandResults(
                readable_output=tableToMarkdown(
                    f"Random JSON of category `{category}`", fake_data_list, headers=list(fake_data_list[0].keys())
                ),
                outputs_prefix=f"RandomJSON.{category}",
                outputs=fake_data_list,
                raw_response=fake_data_list,
            )
        )

    except Exception as ex:
        return_error(f"Failed to generate a Random JSON object.\nError: {ex}")


if __name__ in ("__main__", "__builtin__", "builtins"):
    main()

README

Generate a list of random dictionaries, using Faker Python library. For more information, please visit https://faker.readthedocs.io

Script Data


Name Description
Script Type python3

Inputs


Argument Name Description
list_size Size of the list of dictionaries to generate.
faker_providers Comma separated list of Faker provider(s) to generate data from (Only relevant if category input is set to Other). For the list of providers, please visit https://faker.readthedocs.io/en/master/providers.html
category Faker providers grouped into categories (e.g. IT, Finance, Person, etc) for the creation of the dictionary. If Random is selected, faker providers are chosen at random from the entire set of providers.
dict_size Number of key-value pairs contained on each dictionary if Random is selected as category, otherwise this number is chosen from a pre-defined list.

Outputs


There are no outputs for this script.