def METHOD_NAME(specs_dir, full_path):
    """This function generates a dictionary of table metadata for a spec file
    found at a given path."""
    with open(full_path, "r") as file_handle:
        # Each osquery table specification is a syntactically correct python file
        # because we imported `from gentable import *`, we imported all of the
        # functions that you use in an osquery specification. a global "table"
        # is then modified based on the python that has just executed.
        tree = ast.parse(file_handle.read())
        exec(compile(tree, "<string>", "exec"))
        # Now that the `table` variable is accessible, we can access attributes
        # of the table
        t = {}
        t["name"] = table.table_name
        t["description"] = table.description
        t["url"] = url_for_spec(specs_dir, full_path)
        t["platforms"] = platform_for_spec(full_path)
        t["evented"] = "event_subscriber" in table.attributes
        t["cacheable"] = "cacheable" in table.attributes
        t["notes"] = table.notes
        t["examples"] = table.examples
        # Now we must iterate through `table.columns` to collect information
        # about each column
        t["columns"] = []
        for col in table.columns():
            c = {}
            c["name"] = col.name
            c["description"] = col.description
            c["type"] = col.type.affinity.replace("_TYPE", "").lower()
            c["notes"] = col.notes
            c["hidden"] = col.options.get("hidden", False)
            c["required"] = col.options.get("required", False)
            c["index"] = col.options.get("index", False)
            if col.platforms != []:
                c["platforms"] = col.platforms
            t["columns"].append(c)
    return t