Are you happy with your logging solution? Would you help us out by taking a 30-second survey? Click here


A fast, straightforward, reliable tool for performing massive, automated code refactoring

Subscribe to updates I use undebt

Statistics on undebt

Number of watchers on Github 1497
Number of open issues 1
Average time to close an issue 6 days
Main language Python
Average time to merge a PR 1 day
Open pull requests 0+
Closed pull requests 6+
Last commit over 2 years ago
Repo Created over 3 years ago
Repo Last Updated almost 2 years ago
Size 132 KB
Organization / Authoryelp
Latest Releasev0.6.3
Page Updated
Do you use undebt? Leave a review!
View undebt activity
View on github
Fresh, new opensource launches 🚀🚀🚀
Trendy new open source projects in your inbox! View examples

Subscribe to our mailing list

Evaluating undebt for your project? Score Explanation
Commits Score (?)
Issues & PR Score (?)

Join the chat at Build Status Coverage Status PyPI version


Undebt is a fast, straightforward, reliable tool for performing massive, automated code refactoring used @Yelp. Undebt lets you define complex find-and-replace rules using standard, straightforward Python that can be applied quickly to an entire code base with a simple command.

To learn about what Undebt is and why we created it, check out our post on the Yelp Engineering Blog.

Get Started

To get started using Undebt, install with

pip install undebt

then head over to our documentation for more information.


While the full list of examples can be found in the documentation, to show you how it's done we'll go in-depth into one example in particular, Like most of the examples, this pattern is built for Python, but in theory Undebt could be used with any language. The idea of this pattern is to convert any usage of old-style classes to new-style classes by making all classes that don't inherit from anything else inherit from object. The code for this pattern is incredibly simplea mere four lines not counting imports:

grammar = INDENT + Keyword("class").suppress() + NAME + (Optional(LPAREN + RPAREN) + COLON).suppress()

def replace(tokens):
    return tokens[0] + "class " + tokens[1] + "(object):"

What's going on here? The basic idea is that grammar defines what to look for, and replace defines how to change it. Undebt scans your files looking for grammar, tokenizes the matching text, passes the tokens to replace, and replaces the original text with the return value. For a more in-depth explanation of how to use grammar and replace in a pattern file, see the pattern files documentation.

In this particular case, grammar is defined to match an indent (INDENT), followed by a class definition (+ Keyword("class") + NAME) that doesn't inherit from anything (+ Optional(LPAREN + RPAREN) + COLON). Along the way, all the tokens except for the indent and the class name are suppressed, that way replace only gets those two tokens, which it reassembles into a class definition that inherits from object. For a full specification of all of the helper objects used here, see the pattern utilities documentation.

To run this pattern on your code:

(1) Install Undebt by entering into your command line

pip install undebt

(2) Run undebt with class_inherit_object as the pattern

undebt --pattern undebt.examples.class_inherit_object <file to undebt> ...

For a complete command line example and the full command line help, see the command line documentation, which includes tips and tricks to show how you how to use Undebt with other common Unix utilities.

undebt open issues Ask a question     (View All Issues)
  • over 3 years Automate generation of CLI usage
  • over 3 years Adding a 'stdlib' of anti-patterns fixes
undebt list of languages used
undebt latest release notes

Add cPyparsing support.

Other projects in Python