Fold action.exe into action.args

This commit is contained in:
Tim Van Baak 2024-11-06 18:39:44 -08:00
parent 9bb331941f
commit 381de535f7
10 changed files with 28 additions and 24 deletions

View File

@ -31,11 +31,9 @@ intake
{
"action": {
"fetch": {
"exe": "<absolute path to program or name on intake's PATH>",
"args": ["list", "of", "program", "arguments"]
"args": ["program name", "and", "list", "of", "arguments"]
},
"<action name>": {
"exe": "...",
"args": "..."
}
},
@ -46,9 +44,9 @@ intake
}
```
Each key under `action` defines an action that can be taken for the source. An action must contain `exe` and may contain `args`. A source must have a `fetch` action. If an action named `on_create` is defined for the source, it is executed once for an item when that item is created.
Each key under `action` defines an action that can be taken for the source. A source must at least have a `fetch` action. If an action named `on_create` is defined for the source, it is executed once for an item when that item is created, that is, the first time the item is returned from the source.
Each key under `env` defines an environment variable that will be set when actions are executed.
Each key under `env` defines an environment variable that will be set when `fetch` or other actions are executed.
If `cron` is present, it must define a crontab schedule. Intake will automatically create crontab entries to update each source according to its cron schedule.
@ -56,7 +54,7 @@ If `cron` is present, it must define a crontab schedule. Intake will automatical
Intake interacts with sources by executing the actions defined in the source's `intake.json`. The `fetch` action is required and used to check for new feed items when `intake update` is executed.
To execute an action, intake executes the `exe` program for the action with the corresponding `args` (if present) as arguments. The process's working directory is set to the source's folder, i.e. the folder containing `intake.json`. The process's environment is as follows:
To execute an action, intake executes the command given by `args`. The process's working directory is set to the source's folder, i.e. the folder containing `intake.json`. The process's environment is as follows:
* intake's environment is inherited.
* `STATE_PATH` is set to the absolute path of `state`.

View File

@ -326,7 +326,7 @@ def _parse_source_config(config_str: str):
if "fetch" not in action:
return ("No fetch action defined", {})
fetch = action["fetch"]
if "exe" not in fetch:
if "exe" not in fetch and not fetch.get("args"):
return ("No fetch exe", {})
config = {"action": parsed["action"]}
if "env" in parsed:
@ -399,7 +399,7 @@ def fetch(source_name: str):
update_items(source, items)
titles = "\n".join(f"<li>{item.display_title}</li>" for item in items)
source_url = url_for("source_feed", name=source_name)
return f"Update returned {len(items)} items:<ul>{titles}</ul><p><a href=\"{source_url}\">{source_name}</a></p>"
return f'Update returned {len(items)} items:<ul>{titles}</ul><p><a href="{source_url}">{source_name}</a></p>'
except InvalidConfigException as ex:
abort(500, f"Could not fetch {source_name}:\n{ex}")
except SourceUpdateException as ex:
@ -417,7 +417,7 @@ def add_item():
config_path = source_path / "intake.json"
if not config_path.exists():
config_path.write_text(
json.dumps({"action": {"fetch": {"exe": "true"}}}, indent=2)
json.dumps({"action": {"fetch": {"args": ["true"]}}}, indent=2)
)
source = LocalSource(source_path.parent, source_path.name)

View File

@ -52,7 +52,6 @@ def cmd_edit(cmd_args):
{
"action": {
"fetch": {
"exe": "",
"args": [],
},
},

View File

@ -229,10 +229,13 @@ def _execute_source_action(
if not action_cfg:
raise InvalidConfigException(f"No such action {action}")
if "exe" not in action_cfg:
exe = [action_cfg["exe"]] if "exe" in action_cfg else []
command = exe + action_cfg.get("args", [])
if not command:
raise InvalidConfigException(f"No exe for action {action}")
command = [action_cfg["exe"], *action_cfg.get("args", [])]
config_env = {key: str(value) for key, value in config.get("env", {}).items()}
env = {
**os.environ.copy(),

View File

@ -1,7 +1,9 @@
{
"action": {
"fetch": {
"exe": "true"
"args": [
"true"
]
}
}
}

View File

@ -1,20 +1,20 @@
{
"action": {
"fetch": {
"exe": "./increment.py",
"args": [
"./increment.py",
"fetch"
]
},
"increment": {
"exe": "./increment.py",
"args": [
"./increment.py",
"increment"
]
},
"decrement": {
"exe": "./increment.py",
"args": [
"./increment.py",
"decrement"
]
}

View File

@ -1,8 +1,8 @@
{
"action": {
"fetch": {
"exe": "python3",
"args": [
"python3",
"update.py"
]
}

View File

@ -1,20 +1,20 @@
{
"action": {
"fetch": {
"exe": "./update.py",
"args": [
"./update.py",
"fetch"
]
},
"update": {
"exe": "./update.py",
"args": [
"./update.py",
"update"
]
},
"on_create": {
"exe": "./update.py",
"args": [
"./update.py",
"update"
]
}

View File

@ -1,8 +1,8 @@
{
"action": {
"fetch": {
"exe": "sh",
"args": [
"sh",
"-c",
"echo {\\\"id\\\": \\\"$(date +%Y-%m-%d-%H-%M)\\\"}"
]

View File

@ -1,8 +1,10 @@
{
"action": {
"fetch": {
"exe": "./update.py",
"args": ["fetch"]
"args": [
"./update.py",
"fetch"
]
}
}
}