Callbacks
Overview
Callbacks are used to run specific functions after the success and/or failure of your project run. Callbacks can be provided when instantiating your PrismProject
or when calling the PrismProject.run()
method.
Let's look at an example:
common/
├── utils.py
example_project/
├── main.py
├── callbacks.py
├── tasks/
│ ├── extract.py
│ ├── transfrom.py
│ └── load.py
# example_project/main.py
def print_success():
print("Success!")
def print_failure():
print("Boo! Project failed!")
project = PrismProject(
...
on_success=[print_success],
on_failure=[print_failure],
)
if __name__ == "__main__":
project.run()
Here's what's happening in this project:
In
main.py
, we see that the user wishes to runprint_success
upon the project's success andprint_failure
upon the project's failure. These are specified in the same module as theproject
instance (i.e., inmain.py
itself).Both
print_success
andprint_failure
do not accept any arguments. This is required.
What if the user wants to run functions that do not live inside inside main.py
)? Let's take a look at two more examples.
Callbacks live inside a separate module in the project directory
Let's say that, instead of living in main.py
, the callbacks live inside callbacks.py
:
# example_project/main.py
project = PrismProject(
...
on_success=[...],
on_failure=[...],
)
if __name__ == "__main__":
project.run()
In this case, you should be able to import callbacks
directly, since it lives in the same directory as main.py
:
# example_project/main.py
import callbacks
project = PrismProject(
...
on_success=[callbacks.print_success],
on_failure=[callbacks.print_failure],
)
if __name__ == "__main__":
project.run()
Callbacks live outside project directory
Now, let's assume that the callbacks live inside common/utils.py
:
# example_project/main.py
project = PrismProject(
...
on_success=[...],
on_failure=[...],
)
if __name__ == "__main__":
project.run()
When specifying the on_success
and on_failure
callbacks, we can use the string representation of the import path:
# example_project/main.py
project = PrismProject(
package_lookups=[
Path(__file__).parent.parent # the folder that contains commons/
]
on_success=["common.utils.print_success"], # string repr of import path
on_failure=["common.utils.print_failure"], # string repr of import path
)
if __name__ == "__main__":
project.run()
Last updated