This howto will show you how you can create any resource dynamically with a script.
In this example, we will create a CSV but you can create any type of resource on the fly.
You should have followed the bash script howto to understand how to execute and pass arguments via a command
The bash script that will be executed is:
We can print the content with the data cat command
tabul data cat command/hello-csv@howto
#!/usr/bin/env bash
# The first argument is the number of lines generated, default to 1
LINES=${1:-1}
# Print CSV headers
echo "Id;Greeting"
# Generate the lines
for ((i=1; i<=LINES; i++)); do
if [ "$i" -gt 1 ]; then
echo "$i;Hello World $i times"
continue
fi
echo "$i;Hello World $i time"
done
We can execute it to test that it works.
tabul data print --strict-selection '(command/hello-csv@howto)@tmp'
# The quotes are only mandatory in bash because parenthesis are a bash token (ie subshell)
# We execute it with a strict-selection flag so that we get an error if the executable file is not found.
(command/hello-csv@howto)@tmp
lines
--------------------
Id;Greeting
1;Hello World 1 time
To pass the argument, we have created the following command manifest
tabul data cat command/hello-csv--command.yml@howto
kind: command
spec:
# the runtime data uri
data-uri: (command/hello-csv@howto)@tmp
# The data definition (attributes)
data-def:
# A list of arguments passed to the command
arguments:
- 3 # The first argument, the number of lines
# Create a file with the CSV extension
stdout-data-uri: 'execute/${execution_start_time}-${executable_logical_name}.csv@tmp'
Executing it yield 3 lines
tabul data print --strict-selection command/hello-csv--command.yml@howto
# We execute it with a strict-selection flag so that we get an error if the file is not found.
(command/hello-csv@howto)@tmp
Id;Greeting
---------------------
1;Hello World 1 time
2;Hello World 2 times
3;Hello World 3 times
Unfortunately, we can see that the CSV does not split correctly the columns because the separator is a semicolon ; and not a the default colon , character.
To define the csv structure, we created the following csv manifest
tabul data cat command/hello-csv--csv.yml@howto
kind: csv
spec:
# the command manifest
data-uri: hello-csv--command.yml@md
data-def:
# the character separator
delimiter-character: ;
# the columns to define the data type
columns:
- name: Id
type: integer
- name: Greeting
type: varchar
Executing it yield now a CSV with 2 columns
tabul data print --strict-selection command/hello-csv--csv.yml@howto
# We execute it with a strict-selection flag so that we get an error if the file is not found.
execute/20251110-204747-850-hello-csv.csv@tmp
Id Greeting
-- -------------------
1 Hello World 1 time
2 Hello World 2 times
3 Hello World 3 times
This example shows how you can create dynamic resources.
It's the way to hack Tabulify and because it's based on programing language, the sky is your only limit.