config_types: Enable separating pieces

See bug for why this is a problem. Unfortunately, it is shockingly hard
to solve the problem robustly, since config_types.Path doesn't know what
platform it is running on, and thus doesn't know what the separator is.

To unblock development, this CL does the following:
* Added config_types.Path.separate(separator: str), which separates any
  path pieces by separators. Added tests to
* Added api.path.eq() and api.path.is_parent_of(), which compare
  separated copies of the input paths, thus allowing users to work
  around the issue. Added tests to path/examples/

Since I was in the neighborhood, I did some opportunistic cleanup:
* Added lots of type hints and docstrings.
* Replaced some double-quotes with single-quotes.
* Removed some py2 compatibility, like iteritems and class ...(object):.
* Changed class/function imports into module imports, per go/pystyle.
* Renamed a class and method in
* Made some function kwargs actually read from named kwargs.

TEST=./ test run

Change-Id: I7cf8970131cae4750e78109bd41256e653acc1f4
Reviewed-by: Yiwei Zhang <>
Auto-Submit: Greg Edelston <>
Commit-Queue: Greg Edelston <>
5 files changed
tree: 26cca6226f91e4d6d5be623529d657e641bb1c22
  1. doc/
  2. infra/
  3. misc/
  4. recipe_engine/
  5. recipe_modules/
  6. recipe_proto/
  7. recipes/
  8. unittests/
  9. .gitattributes
  10. .gitignore
  11. .style.yapf
  12. .vpython3
  13. .vpython3_dev
  15. codereview.settings
  18. OWNERS
  22. recipe.warnings


Recipes are a domain-specific language (embedded in Python) for specifying sequences of subprocess calls in a cross-platform and testable way.

They allow writing build flows which integrate with the rest of LUCI.

Documentation for the recipe engine (including this file!). Take a look at the user guide for some hints on how to get started. See the implementation details doc for more detailed implementation information about the recipe engine.


  • Sign the Google CLA.
  • Make sure your and are configured in git config.

Run the following to setup the code review tool and create your first review:

# Get `depot_tools` in $PATH if you don't have it
git clone $HOME/src/depot_tools
export PATH="$PATH:$HOME/src/depot_tools"

# Check out the recipe engine repo
git clone $HOME/src/recipes-py

# make your change
cd $HOME/src/recipes-py
git new-branch cool_feature
# hack hack
git commit -a -m "This is awesome"

# This will ask for your Google Account credentials.
git cl upload -s -r
# Wait for approval over email.
# Click "Submit to CQ" button or ask reviewer to do it for you.
# Wait for the change to be tested and landed automatically.

Use git cl help and git cl help <cmd> for more details.