Add on_create trigger
This commit is contained in:
parent
c21f55da8d
commit
0c4177b783
|
@ -330,6 +330,8 @@ def update_items(source: LocalSource, fetched_items: List[Item]):
|
||||||
Update the source with a batch of new items, doing creations, updates, and
|
Update the source with a batch of new items, doing creations, updates, and
|
||||||
deletions as necessary.
|
deletions as necessary.
|
||||||
"""
|
"""
|
||||||
|
config = source.get_config()
|
||||||
|
|
||||||
# Get a list of item ids that already existed for this source.
|
# Get a list of item ids that already existed for this source.
|
||||||
prior_ids = source.get_item_ids()
|
prior_ids = source.get_item_ids()
|
||||||
print(f"Found {len(prior_ids)} prior items", file=sys.stderr)
|
print(f"Found {len(prior_ids)} prior items", file=sys.stderr)
|
||||||
|
@ -345,9 +347,19 @@ def update_items(source: LocalSource, fetched_items: List[Item]):
|
||||||
|
|
||||||
# Write all the new items to the source directory.
|
# Write all the new items to the source directory.
|
||||||
for item in new_items:
|
for item in new_items:
|
||||||
# TODO: support on-create trigger
|
|
||||||
source.save_item(item)
|
source.save_item(item)
|
||||||
|
|
||||||
|
# If the source has an on-create trigger, run it for new items
|
||||||
|
if "on_create" in config.get("action", {}):
|
||||||
|
for item in new_items:
|
||||||
|
try:
|
||||||
|
execute_action(source, item["id"], "on_create")
|
||||||
|
except Exception as ex:
|
||||||
|
print(
|
||||||
|
f"on_create failed for {source.source_name}/{item['id']}:\n{ex}",
|
||||||
|
file=sys.stderr,
|
||||||
|
)
|
||||||
|
|
||||||
# Update the other items using the fetched items' values.
|
# Update the other items using the fetched items' values.
|
||||||
for upd_item in upd_items:
|
for upd_item in upd_items:
|
||||||
old_item = source.get_item(upd_item["id"])
|
old_item = source.get_item(upd_item["id"])
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
"demo": [
|
"demo": [
|
||||||
"demo_basic_callback",
|
"demo_basic_callback",
|
||||||
"demo_logging",
|
"demo_logging",
|
||||||
"demo_raw_sh"
|
"demo_raw_sh",
|
||||||
|
"demo_oncreate"
|
||||||
]
|
]
|
||||||
}
|
}
|
|
@ -23,6 +23,7 @@ def using_source() -> Callable:
|
||||||
clean_source(source_path)
|
clean_source(source_path)
|
||||||
sources.append(source_path)
|
sources.append(source_path)
|
||||||
return LocalSource(test_data, name)
|
return LocalSource(test_data, name)
|
||||||
|
|
||||||
yield _using_source
|
yield _using_source
|
||||||
|
|
||||||
for source_path in sources:
|
for source_path in sources:
|
||||||
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
{
|
||||||
|
"action": {
|
||||||
|
"fetch": {
|
||||||
|
"exe": "./update.py",
|
||||||
|
"args": [
|
||||||
|
"fetch"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"update": {
|
||||||
|
"exe": "./update.py",
|
||||||
|
"args": [
|
||||||
|
"update"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"on_create": {
|
||||||
|
"exe": "./update.py",
|
||||||
|
"args": [
|
||||||
|
"update"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,29 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
import argparse, json, sys, time
|
||||||
|
|
||||||
|
parser = argparse.ArgumentParser()
|
||||||
|
parser.add_argument("action")
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
print("args:", args, file=sys.stderr, flush=True)
|
||||||
|
|
||||||
|
if args.action == "fetch":
|
||||||
|
print(
|
||||||
|
json.dumps(
|
||||||
|
{
|
||||||
|
"id": str(int(time.time())),
|
||||||
|
"title": "Title has not been updated",
|
||||||
|
"action": {
|
||||||
|
"update": 0,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
if args.action == "update" or args.action == "on_create":
|
||||||
|
item = sys.stdin.readline()
|
||||||
|
item = json.loads(item)
|
||||||
|
item["action"]["update"] += 1
|
||||||
|
item["title"] = f"Updated {item['action']['update']} times"
|
||||||
|
print(json.dumps(item))
|
|
@ -8,6 +8,7 @@ def test_default_source(using_source):
|
||||||
fetch = fetch_items(source)
|
fetch = fetch_items(source)
|
||||||
assert len(fetch) == 0
|
assert len(fetch) == 0
|
||||||
|
|
||||||
|
|
||||||
def test_basic_lifecycle(using_source):
|
def test_basic_lifecycle(using_source):
|
||||||
source: LocalSource = using_source("test_inbox")
|
source: LocalSource = using_source("test_inbox")
|
||||||
state = {"inbox": [{"id": "first"}]}
|
state = {"inbox": [{"id": "first"}]}
|
||||||
|
|
Loading…
Reference in New Issue