)]}'
{"doc/source/developer/extending_yaql.rst":[{"author":{"_account_id":21970,"name":"Andras Kovi","email":"akovi@nokia.com","username":"andras.kovi"},"change_message_id":"6e8553627db88a7819e810fdb72db0037a5bef61","unresolved":false,"context_lines":[{"line_number":1,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":2,"context_line":"How to extend YAQL with a new function"},{"line_number":3,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":4,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"3aaa91ec_ebc9ffad","line":1,"updated":"2016-06-28 08:19:24.000000000","message":"I like this description but it would be better if it were in actual Tutorial format, or explanation of an example that can be found in the code. This description kind of \u0027hangs in the air\u0027 without giving the details of what file has to be added where or being able to change something existing.\n\nAnother question is: what has to be done to make this working? Simply restarting Mistral is enough or it needs to be pip/setup installed?","commit_id":"e896b76435f01a683534e9e1544882aa8981c072"},{"author":{"_account_id":21970,"name":"Andras Kovi","email":"akovi@nokia.com","username":"andras.kovi"},"change_message_id":"6e8553627db88a7819e810fdb72db0037a5bef61","unresolved":false,"context_lines":[{"line_number":2,"context_line":"How to extend YAQL with a new function"},{"line_number":3,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"1. Write a function. That function might have ``context`` as first argument"},{"line_number":6,"context_line":"to have the current YAQL context available inside the function."},{"line_number":7,"context_line":""},{"line_number":8,"context_line":" .. code-block:: python"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3aaa91ec_ab5d37ee","line":5,"updated":"2016-06-28 08:19:24.000000000","message":"The example should include the \u0027context\u0027 feature. It\u0027s very vague how this instruction could be interpreted now.","commit_id":"e896b76435f01a683534e9e1544882aa8981c072"},{"author":{"_account_id":21970,"name":"Andras Kovi","email":"akovi@nokia.com","username":"andras.kovi"},"change_message_id":"6e8553627db88a7819e810fdb72db0037a5bef61","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"   [entry_points]"},{"line_number":22,"context_line":"   mistral.yaql_functions \u003d"},{"line_number":23,"context_line":"       json_pp \u003d my.mistral_plugins.somefile:json_pp"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"3. Reinstall Mistral if it was installed in system (not in virtualenv) or"},{"line_number":26,"context_line":"update the egg file."}],"source_content_type":"text/x-rst","patch_set":1,"id":"3aaa91ec_8bd79b22","line":23,"updated":"2016-06-28 08:19:24.000000000","message":"would be better if this was an actual implemented custom function","commit_id":"e896b76435f01a683534e9e1544882aa8981c072"},{"author":{"_account_id":21970,"name":"Andras Kovi","email":"akovi@nokia.com","username":"andras.kovi"},"change_message_id":"bc10ca853afcbc50d07ac67bc0e269bce3cdbd4a","unresolved":false,"context_lines":[{"line_number":5,"context_line":"********"},{"line_number":6,"context_line":"Tutorial"},{"line_number":7,"context_line":"********"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"1. Create a new Python project, an empty folder, containing a basic ``setup.py`` file."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":".. code-block:: bash"}],"source_content_type":"text/x-rst","patch_set":2,"id":"3aaa91ec_a627ac10","line":8,"updated":"2016-06-30 10:14:14.000000000","message":"Description:\nCreate a task() YAQL function that takes the name of a task and returns the execution related to it in the scope of the current workflow execution.\n\n!! I\u0027d change the function name to task_execution() !!\n\nPrerequisites:\nMistral installed and configured as a conventional python package. Running Mistral in venv or in development requires slightly different steps that are not detailed here.\n\nExample project:\nThe final project can be found at \u003crepo/path...\u003e (We should definitely add the final product for people to be able to see the whole thing together.)","commit_id":"57a379812c13f608d23a6f233ee507f87aa29acc"},{"author":{"_account_id":8731,"name":"Renat Akhmerov","email":"renat.akhmerov@gmail.com","username":"rakhmerov"},"change_message_id":"951bef4dc8db0e9eb78fd581525b979e3c866afc","unresolved":false,"context_lines":[{"line_number":5,"context_line":"********"},{"line_number":6,"context_line":"Tutorial"},{"line_number":7,"context_line":"********"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"1. Create a new Python project, an empty folder, containing a basic ``setup.py`` file."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":".. code-block:: bash"}],"source_content_type":"text/x-rst","patch_set":2,"id":"3aaa91ec_8c00d135","line":8,"in_reply_to":"3aaa91ec_a627ac10","updated":"2016-06-30 10:41:45.000000000","message":"This is basically an existing function.","commit_id":"57a379812c13f608d23a6f233ee507f87aa29acc"},{"author":{"_account_id":21970,"name":"Andras Kovi","email":"akovi@nokia.com","username":"andras.kovi"},"change_message_id":"bc10ca853afcbc50d07ac67bc0e269bce3cdbd4a","unresolved":false,"context_lines":[{"line_number":22,"context_line":"    # setuptools if some other modules registered functions in `atexit`."},{"line_number":23,"context_line":"    # solution from: http://bugs.python.org/issue15881#msg170215"},{"line_number":24,"context_line":"    try:"},{"line_number":25,"context_line":"        import multiprocessing  # noqa"},{"line_number":26,"context_line":"    except ImportError:"},{"line_number":27,"context_line":"        pass"},{"line_number":28,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"3aaa91ec_c671180e","line":25,"range":{"start_line":25,"start_character":34,"end_line":25,"end_character":38},"updated":"2016-06-30 10:14:14.000000000","message":"what is noqa?","commit_id":"57a379812c13f608d23a6f233ee507f87aa29acc"},{"author":{"_account_id":21970,"name":"Andras Kovi","email":"akovi@nokia.com","username":"andras.kovi"},"change_message_id":"bc10ca853afcbc50d07ac67bc0e269bce3cdbd4a","unresolved":false,"context_lines":[{"line_number":68,"context_line":"    [pbr]"},{"line_number":69,"context_line":"    autodoc_tree_index_modules \u003d True"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    [entry_points]"},{"line_number":72,"context_line":"    mistral.yaql_functions \u003d"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"3. Add ``yaql`` and ``mistral`` as requirements in ``requirements.txt``."}],"source_content_type":"text/x-rst","patch_set":2,"id":"3aaa91ec_2cd1dd57","line":71,"updated":"2016-06-30 10:14:14.000000000","message":"How does it happen that the configuration here can influence the mistral package\u0027s configuration? Is there some magic here? Is this provided by PBR?","commit_id":"57a379812c13f608d23a6f233ee507f87aa29acc"},{"author":{"_account_id":8731,"name":"Renat Akhmerov","email":"renat.akhmerov@gmail.com","username":"rakhmerov"},"change_message_id":"951bef4dc8db0e9eb78fd581525b979e3c866afc","unresolved":false,"context_lines":[{"line_number":68,"context_line":"    [pbr]"},{"line_number":69,"context_line":"    autodoc_tree_index_modules \u003d True"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    [entry_points]"},{"line_number":72,"context_line":"    mistral.yaql_functions \u003d"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"3. Add ``yaql`` and ``mistral`` as requirements in ``requirements.txt``."}],"source_content_type":"text/x-rst","patch_set":2,"id":"3aaa91ec_4c46e97b","line":71,"in_reply_to":"3aaa91ec_2cd1dd57","updated":"2016-06-30 10:41:45.000000000","message":"Not sure I fully understand the question. But this is how stevedore works, this is the whole point: we don\u0027t have to change project installation in order to plug in something new. Mistral just declares an extension point and any other project can contribute to it. Similarly, Mistral actions don\u0027t have to be part of Mistral package.","commit_id":"57a379812c13f608d23a6f233ee507f87aa29acc"},{"author":{"_account_id":21970,"name":"Andras Kovi","email":"akovi@nokia.com","username":"andras.kovi"},"change_message_id":"bc10ca853afcbc50d07ac67bc0e269bce3cdbd4a","unresolved":false,"context_lines":[{"line_number":104,"context_line":"   from mistral.db.v2 import api as db_api"},{"line_number":105,"context_line":"   from mistral.workflow import utils as wf_utils"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"   def task_(context, task_name):"},{"line_number":108,"context_line":"      # Importing data_flow in order to break cycle dependency between modules."},{"line_number":109,"context_line":"      from mistral.workflow import data_flow"},{"line_number":110,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"3aaa91ec_41119203","line":107,"updated":"2016-06-30 10:14:14.000000000","message":"get_task_execution() ?\nWhy add the underscore?","commit_id":"57a379812c13f608d23a6f233ee507f87aa29acc"},{"author":{"_account_id":8731,"name":"Renat Akhmerov","email":"renat.akhmerov@gmail.com","username":"rakhmerov"},"change_message_id":"951bef4dc8db0e9eb78fd581525b979e3c866afc","unresolved":false,"context_lines":[{"line_number":104,"context_line":"   from mistral.db.v2 import api as db_api"},{"line_number":105,"context_line":"   from mistral.workflow import utils as wf_utils"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"   def task_(context, task_name):"},{"line_number":108,"context_line":"      # Importing data_flow in order to break cycle dependency between modules."},{"line_number":109,"context_line":"      from mistral.workflow import data_flow"},{"line_number":110,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"3aaa91ec_cc52d934","line":107,"in_reply_to":"3aaa91ec_41119203","updated":"2016-06-30 10:41:45.000000000","message":"YAQL requirement.","commit_id":"57a379812c13f608d23a6f233ee507f87aa29acc"},{"author":{"_account_id":21970,"name":"Andras Kovi","email":"akovi@nokia.com","username":"andras.kovi"},"change_message_id":"bc10ca853afcbc50d07ac67bc0e269bce3cdbd4a","unresolved":false,"context_lines":[{"line_number":108,"context_line":"      # Importing data_flow in order to break cycle dependency between modules."},{"line_number":109,"context_line":"      from mistral.workflow import data_flow"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"      # fetch the workflow execution using its ID found in the context"},{"line_number":112,"context_line":"      wf_ex \u003d db_api.get_workflow_execution(context[\u0027__execution\u0027][\u0027id\u0027])"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"      # get all task executions for this workflow matching the task name"}],"source_content_type":"text/x-rst","patch_set":2,"id":"3aaa91ec_e117deeb","line":111,"range":{"start_line":111,"start_character":18,"end_line":111,"end_character":26},"updated":"2016-06-30 10:14:14.000000000","message":"current workflow execution","commit_id":"57a379812c13f608d23a6f233ee507f87aa29acc"},{"author":{"_account_id":21970,"name":"Andras Kovi","email":"akovi@nokia.com","username":"andras.kovi"},"change_message_id":"bc10ca853afcbc50d07ac67bc0e269bce3cdbd4a","unresolved":false,"context_lines":[{"line_number":114,"context_line":"      # get all task executions for this workflow matching the task name"},{"line_number":115,"context_line":"      task_execs \u003d wf_utils.find_task_executions_by_name(wf_ex, task_name)"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"      # This code sample does not account for multiple executions (i.e. in"},{"line_number":118,"context_line":"      # case of cycles)."},{"line_number":119,"context_line":"      task_ex \u003d task_execs[-1] if len(task_execs) \u003e 0 else None"},{"line_number":120,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"3aaa91ec_41ad129a","line":117,"updated":"2016-06-30 10:14:14.000000000","message":"Simplify comment:\nTake only the last execution of the task.","commit_id":"57a379812c13f608d23a6f233ee507f87aa29acc"},{"author":{"_account_id":21970,"name":"Andras Kovi","email":"akovi@nokia.com","username":"andras.kovi"},"change_message_id":"bc10ca853afcbc50d07ac67bc0e269bce3cdbd4a","unresolved":false,"context_lines":[{"line_number":119,"context_line":"      task_ex \u003d task_execs[-1] if len(task_execs) \u003e 0 else None"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"      # no task were found, raise an error"},{"line_number":122,"context_line":"      if not task_ex:"},{"line_number":123,"context_line":"         raise ValueError("},{"line_number":124,"context_line":"             \u0027Failed to find task execution with name: %s\u0027 % task_name"},{"line_number":125,"context_line":"         )"}],"source_content_type":"text/x-rst","patch_set":2,"id":"3aaa91ec_a1a4b6a5","line":122,"updated":"2016-06-30 10:14:14.000000000","message":"if task_ex is None:\n\nIn Heat they decided to mess around with the __bool function of the objects. (What a fail!!) Since then I have been cautious with the `if obj` expression.","commit_id":"57a379812c13f608d23a6f233ee507f87aa29acc"},{"author":{"_account_id":21970,"name":"Andras Kovi","email":"akovi@nokia.com","username":"andras.kovi"},"change_message_id":"bc10ca853afcbc50d07ac67bc0e269bce3cdbd4a","unresolved":false,"context_lines":[{"line_number":140,"context_line":"The ``context`` argument will be passed by Mistral YAQL engine to the"},{"line_number":141,"context_line":"function. It is invisble to the user. It contains variables from the current"},{"line_number":142,"context_line":"task execution scope, such as ``__execution`` which is a dictionary with"},{"line_number":143,"context_line":"information about the current workflow execution such as its ``id``."},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"After getting the workflow execution, it looks for the task using its name."},{"line_number":146,"context_line":"Note that errors can be raised and will be displayed in the task execution"}],"source_content_type":"text/x-rst","patch_set":2,"id":"3aaa91ec_21d4461e","line":143,"updated":"2016-06-30 10:14:14.000000000","message":"For more info on contect, check out .... ?","commit_id":"57a379812c13f608d23a6f233ee507f87aa29acc"},{"author":{"_account_id":8731,"name":"Renat Akhmerov","email":"renat.akhmerov@gmail.com","username":"rakhmerov"},"change_message_id":"951bef4dc8db0e9eb78fd581525b979e3c866afc","unresolved":false,"context_lines":[{"line_number":147,"context_line":"state information in case they are raised. Any valid Python primitives may"},{"line_number":148,"context_line":"be returned."},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"The ``context`` argument is optional. There can as many arguments as wanted,"},{"line_number":151,"context_line":"even list arguments such as ``*args`` or dictionary arguments such as"},{"line_number":152,"context_line":"``**kwargs`` can be used as function arguments."},{"line_number":153,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"3aaa91ec_676bfeb9","line":150,"range":{"start_line":150,"start_character":47,"end_line":150,"end_character":48},"updated":"2016-06-30 10:41:45.000000000","message":"\"be\" is missing.","commit_id":"57a379812c13f608d23a6f233ee507f87aa29acc"},{"author":{"_account_id":21970,"name":"Andras Kovi","email":"akovi@nokia.com","username":"andras.kovi"},"change_message_id":"bc10ca853afcbc50d07ac67bc0e269bce3cdbd4a","unresolved":false,"context_lines":[{"line_number":147,"context_line":"state information in case they are raised. Any valid Python primitives may"},{"line_number":148,"context_line":"be returned."},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"The ``context`` argument is optional. There can as many arguments as wanted,"},{"line_number":151,"context_line":"even list arguments such as ``*args`` or dictionary arguments such as"},{"line_number":152,"context_line":"``**kwargs`` can be used as function arguments."},{"line_number":153,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"3aaa91ec_2113a6b9","line":150,"updated":"2016-06-30 10:14:14.000000000","message":"This is a bit confusing. How does the execution environment decide whether context is a parameter or not? Can we describe it in more clearly, even by adding examples. I see the official documentation is linked below but the reader needs direct links or examples here.","commit_id":"57a379812c13f608d23a6f233ee507f87aa29acc"},{"author":{"_account_id":21970,"name":"Andras Kovi","email":"akovi@nokia.com","username":"andras.kovi"},"change_message_id":"bc10ca853afcbc50d07ac67bc0e269bce3cdbd4a","unresolved":false,"context_lines":[{"line_number":166,"context_line":"   [entry_points]"},{"line_number":167,"context_line":"   mistral.yaql_functions \u003d"},{"line_number":168,"context_line":"       task \u003d my_package.sub_package.yaql:task_"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"7. Install ``pip`` and ``setuptools``."},{"line_number":171,"context_line":""},{"line_number":172,"context_line":".. code-block:: bash"}],"source_content_type":"text/x-rst","patch_set":2,"id":"3aaa91ec_61e5aea2","line":169,"updated":"2016-06-30 10:14:14.000000000","message":"Add note about format:\n\n\u003cname of yaql expression\u003e \u003d \u003creference of implementation\u003e\n\nThe new yaql function will need to be called from workflows by the name set here.","commit_id":"57a379812c13f608d23a6f233ee507f87aa29acc"},{"author":{"_account_id":21970,"name":"Andras Kovi","email":"akovi@nokia.com","username":"andras.kovi"},"change_message_id":"bc10ca853afcbc50d07ac67bc0e269bce3cdbd4a","unresolved":false,"context_lines":[{"line_number":172,"context_line":".. code-block:: bash"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"   cd /tmp"},{"line_number":175,"context_line":"   wget https://bootstrap.pypa.io/get-pip.py"},{"line_number":176,"context_line":"   python get-pip.py"},{"line_number":177,"context_line":"   pip install --upgrade setuptools"},{"line_number":178,"context_line":"   cd -"}],"source_content_type":"text/x-rst","patch_set":2,"id":"3aaa91ec_81237abc","line":175,"updated":"2016-06-30 10:14:14.000000000","message":"I like the \ncurl https://bootstrap.pypa.io/get-pip.py | python\nformat more as it does not pollute the file system. :)","commit_id":"57a379812c13f608d23a6f233ee507f87aa29acc"},{"author":{"_account_id":21970,"name":"Andras Kovi","email":"akovi@nokia.com","username":"andras.kovi"},"change_message_id":"bc10ca853afcbc50d07ac67bc0e269bce3cdbd4a","unresolved":false,"context_lines":[{"line_number":209,"context_line":"Development"},{"line_number":210,"context_line":"***********"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"While developing, it is sufficient to add the root source folder (the parent"},{"line_number":213,"context_line":"folder of ``my_package``) to the ``PYTHONPATH`` environment variable and the"},{"line_number":214,"context_line":"line ``task \u003d my_package.sub_package.yaql:task_`` in the Mistral entry points"},{"line_number":215,"context_line":"in the ``mistral.yaql_functions`` namespace. If the path to the parent folder"}],"source_content_type":"text/x-rst","patch_set":2,"id":"3aaa91ec_ac978d8e","line":212,"updated":"2016-06-30 10:14:14.000000000","message":"Honestly, I have hard time understanding what is happening here. But it sounds a little hackish.","commit_id":"57a379812c13f608d23a6f233ee507f87aa29acc"},{"author":{"_account_id":9712,"name":"Dougal Matthews","email":"dougal.matthews@canonical.com","username":"dougal"},"change_message_id":"97e1fb97aa2132d663584635969e47bd16e513a4","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    setuptools.setup("},{"line_number":30,"context_line":"        setup_requires\u003d[\u0027pbr\u003e\u003d1.8\u0027],"},{"line_number":31,"context_line":"        pbr\u003dTrue)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"2. Create a setup configuration file named ``setup.cfg``. Note that the"},{"line_number":34,"context_line":"package name will be used in Pip and must not overlap with other packages"}],"source_content_type":"text/x-rst","patch_set":4,"id":"1aa78d24_7ebae2e2","line":31,"updated":"2016-07-04 16:21:58.000000000","message":"I have concerns about documenting in this much detail - we don\u0027t want the Mistral documentation to cover how to write a setup.py and setup.cfg - these will change over time, do you want to keep it up to date? As I understand there is no need for users to use pbr or this specific method either. Just a vanilla setup.py should work. If you compare this with the Action Plugin documentation, it skips all of this.\n\nhttp://docs.openstack.org/developer/mistral/developer/creating_custom_action.html\n\nI actually think the Action Plugin documentation skips too much. However, instead of documenting all this stuff here we should link to relevant pbr or setuptools documentation. Maybe I\u0027ll post a patch for that to make it a little more useful.","commit_id":"abb2478f560c1775693b4fd3c44776476e9b29df"}],"mistral/utils/yaql_utils.py":[{"author":{"_account_id":21970,"name":"Andras Kovi","email":"akovi@nokia.com","username":"andras.kovi"},"change_message_id":"6e8553627db88a7819e810fdb72db0037a5bef61","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    \"\"\"Register custom YAQL functions"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    Custom YAQL functions must be added as entry points in the"},{"line_number":47,"context_line":"    \u0027mistral.yaql_functions\u0027 namespace"},{"line_number":48,"context_line":"    :param yaql_ctx: YAQL context object"},{"line_number":49,"context_line":"    \"\"\""},{"line_number":50,"context_line":"    mgr \u003d extension.ExtensionManager("}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_0bce0b5a","line":47,"updated":"2016-06-28 08:19:24.000000000","message":"please add reference to setup.cfg. It may be clear for long time contributors but as a newbie I\u0027d have a hard time figuring this out.","commit_id":"e896b76435f01a683534e9e1544882aa8981c072"},{"author":{"_account_id":9712,"name":"Dougal Matthews","email":"dougal.matthews@canonical.com","username":"dougal"},"change_message_id":"97e1fb97aa2132d663584635969e47bd16e513a4","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    yaql_ctx.register_function(execution_)"},{"line_number":45,"context_line":"    yaql_ctx.register_function(task_)"},{"line_number":46,"context_line":"    yaql_ctx.register_function(json_pp_, name\u003d\u0027json_pp\u0027)"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"# Additional YAQL functions needed by Mistral."},{"line_number":50,"context_line":"# If a function name ends with underscore then it doesn\u0027t need to pass"}],"source_content_type":"text/x-python","patch_set":4,"id":"1aa78d24_5e944636","side":"PARENT","line":47,"updated":"2016-07-04 16:21:58.000000000","message":"Can we switch all of these to use the _register_custom function? Would be better to be consistent.","commit_id":"024d93801d7c26651a9c021323611be7a8dc6fa4"},{"author":{"_account_id":9712,"name":"Dougal Matthews","email":"dougal.matthews@canonical.com","username":"dougal"},"change_message_id":"97e1fb97aa2132d663584635969e47bd16e513a4","unresolved":false,"context_lines":[{"line_number":94,"context_line":"    # cycles)."},{"line_number":95,"context_line":"    task_ex \u003d task_execs[-1] if len(task_execs) \u003e 0 else None"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    if task_ex is None:"},{"line_number":98,"context_line":"        raise ValueError("},{"line_number":99,"context_line":"            \u0027Failed to find task execution with name: %s\u0027 % task_name"},{"line_number":100,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":4,"id":"1aa78d24_dea03693","line":97,"updated":"2016-07-04 16:21:58.000000000","message":"This change looks unrelated, why change from a falsey check to specifically None?","commit_id":"abb2478f560c1775693b4fd3c44776476e9b29df"}]}
