Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

invoke.tasks.call raises "RuntimeError: maximum recursion depth exceeded while calling a Python object" #257

Closed
keimlink opened this issue Jul 2, 2015 · 6 comments · Fixed by #300

Comments

@keimlink
Copy link

keimlink commented Jul 2, 2015

We have a Cookiecutter template for our Django projects and I decided to replace the Makefile with invoke. Everything works very well, invoke is more flexible than the previous solution. Thanks for the great software!

Unfortunately the tasks package I created works only with Python 2. Python 3 raises a "RuntimeError: maximum recursion depth exceeded while calling a Python object". I was able to track down the cause. It's invoke.tasks.call being used to build a list of pre-targets. The task wrapped with invoke.tasks.call works stand alone. Maybe my solution to build the pre-tasks list is not correct?

@bitprophet
Copy link
Member

Do you have a full traceback handy? I'm not using this combo of feature+interpreter myself, but AFAIK it ought to work fine (i.e. your use of mixed object references & call() objects should be a fine way to implement things), so hopefully it's just a bug (& a hole in test coverage, presumably).

@keimlink
Copy link
Author

keimlink commented Jul 4, 2015

I hope this helps:

$ python -V
Python 3.4.3
$ pip freeze
invoke==0.10.1
$ inv clean
Traceback (most recent call last):
  File "/Users/keimlink/.virtualenvs/my-project/bin/inv", line 11, in <module>
    sys.exit(main())
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/cli.py", line 438, in main
    dispatch(sys.argv)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/cli.py", line 423, in dispatch
    args, collection, parser_contexts = parse(argv, version=version)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/cli.py", line 278, in parse
    collection = loader.load(coll_name) if coll_name else loader.load()
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/loader.py", line 53, in load
    return Collection.from_module(module, loaded_from=parent)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/collection.py", line 166, in from_module
    ret.tasks = copy.deepcopy(obj.tasks)
  File "/Users/keimlink/.pyenv/versions/3.4.3/lib/python3.4/copy.py", line 182, in deepcopy
    y = _reconstruct(x, rv, 1, memo)
  File "/Users/keimlink/.pyenv/versions/3.4.3/lib/python3.4/copy.py", line 323, in _reconstruct
    value = deepcopy(value, memo)
  File "/Users/keimlink/.pyenv/versions/3.4.3/lib/python3.4/copy.py", line 182, in deepcopy
    y = _reconstruct(x, rv, 1, memo)
  File "/Users/keimlink/.pyenv/versions/3.4.3/lib/python3.4/copy.py", line 300, in _reconstruct
    state = deepcopy(state, memo)
  File "/Users/keimlink/.pyenv/versions/3.4.3/lib/python3.4/copy.py", line 155, in deepcopy
    y = copier(x, memo)
  File "/Users/keimlink/.pyenv/versions/3.4.3/lib/python3.4/copy.py", line 246, in _deepcopy_dict
    y[deepcopy(key, memo)] = deepcopy(value, memo)
  File "/Users/keimlink/.pyenv/versions/3.4.3/lib/python3.4/copy.py", line 155, in deepcopy
    y = copier(x, memo)
  File "/Users/keimlink/.pyenv/versions/3.4.3/lib/python3.4/copy.py", line 219, in _deepcopy_list
    y.append(deepcopy(a, memo))
  File "/Users/keimlink/.pyenv/versions/3.4.3/lib/python3.4/copy.py", line 182, in deepcopy
    y = _reconstruct(x, rv, 1, memo)
  File "/Users/keimlink/.pyenv/versions/3.4.3/lib/python3.4/copy.py", line 301, in _reconstruct
    if hasattr(y, '__setstate__'):
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/keimlink/.virtualenvs/my-project/lib/python3.4/site-packages/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
RuntimeError: maximum recursion depth exceeded while calling a Python object

@bitprophet bitprophet added this to the 0.11 milestone Jul 6, 2015
@bitprophet
Copy link
Member

Yup, that does help (obviously, once it enters final recursion, the rest doesn't, but the top part is pretty critical :D). Something to do with how we deepcopy or perform attribute access. Gives me some starting points when I take a look. Thanks!

@rm--
Copy link

rm-- commented Nov 30, 2015

I wrote a test that triggers the problem in this commit.

For explaination:
I added a file with content of the documentation with the modification that I create a collection manually.

In the test I use the Collection.from_module() to load the file. That call ends in a RecursionError very similar to the traceback that @keimlink posted.

Hope that helps a little bit.
PS: During investigation I had the feeling that Lexicon or one of its base classes needs a own __deepcopy__ implemention. I never did something like this, so I could be wrong.
I think Python 3.4.3 or 3.5.0 make no big difference. ;)

# $ tox -e py35
GLOB sdist-make: /Users/rene/used_repos/invoke/setup.py
py35 inst-nodeps: /Users/rene/used_repos/invoke/.tox/dist/invoke-0.12.0.zip
py35 installed: alabaster==0.7.6,Babel==2.1.1,coverage==3.7.1,docutils==0.12,flake8==2.4.0,-e git+https://github.com/pyinvoke/invocations@3b30138505cbff8b2c56bf96770b136961b87fbb#egg=invocations-0.11.0,invoke==0.12.0,Jinja2==2.8,MarkupSafe==0.23,mccabe==0.3.1,mock==1.0.1,nose==1.3.0,pep8==1.5.7,pkginfo==1.2.1,pyflakes==0.8.1,Pygments==2.0.2,pytz==2015.7,releases==1.0.0,requests==2.8.1,semantic-version==2.4.2,six==1.10.0,snowballstemmer==1.2.0,spec==1.3.1,Sphinx==1.3.1,sphinx-rtd-theme==0.1.9,twine==1.5.0,wheel==0.24.0
py35 runtests: PYTHONHASHSEED='3944190071'
py35 runtests: commands[0] | pip install -r dev-requirements.txt
Obtaining file:///Users/rene/used_repos/invoke (from -r tasks-requirements.txt (line 2))
Requirement already satisfied (use --upgrade to upgrade): Sphinx>=1.1.2 in ./.tox/py35/lib/python3.5/site-packages (from -r dev-requirements.txt (line 1))
Requirement already satisfied (use --upgrade to upgrade): releases>=0.6.1 in ./.tox/py35/lib/python3.5/site-packages (from -r dev-requirements.txt (line 2))
Requirement already satisfied (use --upgrade to upgrade): alabaster>=0.6.0 in ./.tox/py35/lib/python3.5/site-packages (from -r dev-requirements.txt (line 3))
Requirement already satisfied (use --upgrade to upgrade): nose==1.3.0 in ./.tox/py35/lib/python3.5/site-packages (from -r dev-requirements.txt (line 4))
Requirement already satisfied (use --upgrade to upgrade): spec>=1.0.0 in ./.tox/py35/lib/python3.5/site-packages (from -r dev-requirements.txt (line 5))
Requirement already satisfied (use --upgrade to upgrade): mock==1.0.1 in ./.tox/py35/lib/python3.5/site-packages (from -r dev-requirements.txt (line 6))
Requirement already satisfied (use --upgrade to upgrade): flake8==2.4.0 in ./.tox/py35/lib/python3.5/site-packages (from -r dev-requirements.txt (line 7))
Obtaining invocations from git+https://github.com/pyinvoke/invocations#egg=invocations (from -r tasks-requirements.txt (line 1))
  Updating ./.tox/py35/src/invocations clone
Requirement already satisfied (use --upgrade to upgrade): semantic-version<2.5,>=2.4 in ./.tox/py35/lib/python3.5/site-packages (from -r tasks-requirements.txt (line 3))
Requirement already satisfied (use --upgrade to upgrade): wheel==0.24 in ./.tox/py35/lib/python3.5/site-packages (from -r tasks-requirements.txt (line 4))
Requirement already satisfied (use --upgrade to upgrade): twine==1.5 in ./.tox/py35/lib/python3.5/site-packages (from -r tasks-requirements.txt (line 5))
Requirement already satisfied (use --upgrade to upgrade): coverage==3.7.1 in ./.tox/py35/lib/python3.5/site-packages (from -r tasks-requirements.txt (line 6))
Requirement already satisfied (use --upgrade to upgrade): Jinja2>=2.3 in ./.tox/py35/lib/python3.5/site-packages (from Sphinx>=1.1.2->-r dev-requirements.txt (line 1))
Requirement already satisfied (use --upgrade to upgrade): Pygments>=2.0 in ./.tox/py35/lib/python3.5/site-packages (from Sphinx>=1.1.2->-r dev-requirements.txt (line 1))
Requirement already satisfied (use --upgrade to upgrade): six>=1.4 in ./.tox/py35/lib/python3.5/site-packages (from Sphinx>=1.1.2->-r dev-requirements.txt (line 1))
Requirement already satisfied (use --upgrade to upgrade): docutils>=0.11 in ./.tox/py35/lib/python3.5/site-packages (from Sphinx>=1.1.2->-r dev-requirements.txt (line 1))
Requirement already satisfied (use --upgrade to upgrade): snowballstemmer>=1.1 in ./.tox/py35/lib/python3.5/site-packages (from Sphinx>=1.1.2->-r dev-requirements.txt (line 1))
Requirement already satisfied (use --upgrade to upgrade): babel>=1.3 in ./.tox/py35/lib/python3.5/site-packages (from Sphinx>=1.1.2->-r dev-requirements.txt (line 1))
Requirement already satisfied (use --upgrade to upgrade): sphinx-rtd-theme<0.2,>=0.1 in ./.tox/py35/lib/python3.5/site-packages (from Sphinx>=1.1.2->-r dev-requirements.txt (line 1))
Requirement already satisfied (use --upgrade to upgrade): pyflakes<0.9,>=0.8.1 in ./.tox/py35/lib/python3.5/site-packages (from flake8==2.4.0->-r dev-requirements.txt (line 7))
Requirement already satisfied (use --upgrade to upgrade): mccabe<0.4,>=0.2.1 in ./.tox/py35/lib/python3.5/site-packages (from flake8==2.4.0->-r dev-requirements.txt (line 7))
Requirement already satisfied (use --upgrade to upgrade): pep8<1.6,>=1.5.7 in ./.tox/py35/lib/python3.5/site-packages (from flake8==2.4.0->-r dev-requirements.txt (line 7))
Requirement already satisfied (use --upgrade to upgrade): requests in ./.tox/py35/lib/python3.5/site-packages (from twine==1.5->-r tasks-requirements.txt (line 5))
Requirement already satisfied (use --upgrade to upgrade): pkginfo in ./.tox/py35/lib/python3.5/site-packages (from twine==1.5->-r tasks-requirements.txt (line 5))
Requirement already satisfied (use --upgrade to upgrade): MarkupSafe in ./.tox/py35/lib/python3.5/site-packages (from Jinja2>=2.3->Sphinx>=1.1.2->-r dev-requirements.txt (line 1))
Requirement already satisfied (use --upgrade to upgrade): pytz>=0a in ./.tox/py35/lib/python3.5/site-packages (from babel>=1.3->Sphinx>=1.1.2->-r dev-requirements.txt (line 1))
Installing collected packages: invocations, invoke
  Running setup.py develop for invocations
  Running setup.py develop for invoke
Successfully installed invocations-0.11.0 invoke-0.12.0
py35 runtests: commands[1] | spec

High level parsing tests
- aliases
- boolean args
- flag then equals sign then value
- flag then space then value
- flag value same as task name
- flag value then task
- inverse boolean flags
- multiple short flags adjacent
- namespaced task
- short boolean flag
- short flag then equals sign then value
- short flag then space then value
- short flag with adjacent value
- subcollection aliases
- subcollection default tasks
- tasks with duplicately named kwargs
- three tasks with args
- underscored flags can be given as dashed

Collection

    __getitem__
    - ValueError for empty subcol task name and no default
    - finds own tasks by name
    - finds subcollection tasks by dotted name
    - honors aliases in own tasks
    - honors own default task with no args
    - honors subcollection default tasks on subcollection name
    - honors subcollection task aliases
    - raises ValueError for no name and no default

    useful_special_methods
    - equality should be useful
    - repr

    from_module
    - adds tasks
    - allows tasks with explicit names to override bound name
    - derives collection name from module name
    - honors explicit collections
    - load collection from real module
    - returns unique Collection objects for same input module
    - submodule names are stripped to last chunk

        parameters
        - inline configuration
        - name and config simultaneously
        - name override

        explicit_root_ns
        - config override merges recursively
        - inline config overrides via merge not replacement
        - inline config with root namespaces overrides builtin
        - inline name overrides root namespace object name
        - root namespace object name overrides module name

    __init__
    - accepts load path kwarg
    - can accept collections as varargs too
    - can accept task varargs
    - initial string arg acts as name
    - initial string arg meshes with varargs and kwargs
    - kwargs act as name args for given objects

    task_names
    - includes aliases and defaults as values
    - returns all task names including subtasks

    to_contexts
    - allows flaglike access via flags
    - exposes aliases
    - exposes namespaced task aliases
    - exposes namespaced task names
    - exposes subcollection default tasks
    - positional arglist preserves order given
    - returns iterable of Contexts corresponding to tasks

    add_task
    - allows specifying task defaultness
    - associates given callable with given name
    - prefers name kwarg over task name attr
    - prefers task name attr over function name
    - raises ValueError if no name found
    - raises ValueError if task added mirrors subcollection name
    - raises ValueError on multiple defaults
    - specifying default False overrides task setting
    - uses function name as implicit name

    add_collection
    - adds collection as subcollection of self
    - can take module objects
    - raises ValueError if collection named same as task
    - raises ValueError if collection without name

    Configuration methods
    - access merges from subcollections
    - basic set and get
    - call returns dict
    - configure allows overwriting
    - configure merging is recursive for nested dicts
    - configure performs merging
    - invalid subcollection paths result in KeyError
    - keys don't have to exist in full path
    - parents overwrite children in path
    - sibling subcollections ignored
    - subcollection paths may be dotted

Shell tab-completion behavior
- bare double dash shows only long core options
- core bool flags have task name completion
- core flags taking values have no completion output
- core partial or invalid flags print all flags
- flag completion includes inverse booleans
- no input means just task names
- no input with no tasks yields empty response
- per task bool flags have task name completion
- per task flags complete with double dashes
- per task flags complete with single dashes
- per task flags taking values have no completion output
- per task partial or invalid flags print all flags
- task name completion includes aliases
- task name completion includes tasks already seen
- task names only complete other task names
- tasks with positional args complete with flags
- top level with dash means core options

Config

    __init__
    - accepts defaults dict
    - accepts env prefix option
    - accepts overrides dict
    - can be empty
    - configure global location prefix
    - configure project location
    - configure runtime path
    - configure user location prefix
    - default system prefix is etc
    - default user prefix is homedir
    - defaults dict is first posarg

    Config hierarchy in effect
    - cli overrides override all
    - collection overrides defaults
    - env vars override collection
    - env vars override project
    - env vars override systemwide
    - env vars override user
    - json prevents python
    - project overrides collection
    - project overrides systemwide
    - project overrides user
    - runtime overrides collection
    - runtime overrides env vars
    - runtime overrides project
    - runtime overrides systemwide
    - runtime overrides user
    - systemwide overrides collection
    - user overrides collection
    - user overrides systemwide
    - yaml prevents json or python

    Configuration file loading
    - honors conf file flag
    - loads no project specific file if no project home given
    - project specific
    - python modules don't load special vars
    - system global
    - unknown suffix in runtime path raises useful error
    - user specific

    Basic API components
    - allows dict and attr access
    - attr access has useful error msg
    - can be used directly after init
    - is iterable like dict
    - nested dict values also allow dual access
    - string display
    - subkeys get merged not overwritten
    - supports mutation dict protocols
    - supports readonly dict protocols

    clone
    - does not reload file data
    - preserves basic members
    - preserves env data
    - preserves file data
    - preserves merged config

    Environment variables
    - ambiguous underscores don't guess
    - base case
    - both types of underscores mixed
    - can declare prefix
    - non predeclared settings do not get consumed
    - underscores nested
    - underscores top level

        type_casting
        - None replaced
        - arbitrary types work too
        - boolean type inputs with non boolean defaults
        - booleans
        - numeric types become casted
        - strings replaced with env value
        - unicode replaced with env value

            uncastable_types
            - lists
            - tuples

Context

    Dict-like proxy for self.config
    - direct access allowed
    - get
    - getattr
    - getitem
    - iter
    - keys
    - update
    - values

    __init__
    - takes optional config arg

Executor

    Collection-driven config concerns
    - hands collection configuration to context
    - hands task specific configuration to context
    - subcollection config works with default tasks

    __init__
    - allows collection and config
    - uses blank config by default

    basic pre/post task functionality
    - call objs play well with context args
    - calls default to empty args always
    - may be call objects specifying args
    - post tasks
    - pre tasks

    execute
    - base case
    - contextualized tasks are given parser context arg
    - default tasks called when no tasks specified
    - kwargs

    deduping_and_chaining
    - chaining is depth first
    - deduping treats different calls to same task differently

        adjacent_hooks
        - deduping
        - no deduping

        non_adjacent_hooks
        - deduping
        - no deduping

        non_adjacent_top_level_tasks
        - deduping
        - no deduping

        adjacent_top_level_tasks
        - deduping
        - no deduping

    returns_return_value_of_specified_task
    - base case
    - with post tasks
    - with pre tasks

    autoprinting
    - defaults to off and no output
    - does not fire on post tasks
    - does not fire on pre tasks
    - prints return value to stdout when on
    - prints return value to stdout when on and in collection

__init__
- dunder version
- dunder version info
- dunder version looks generated from dunder version info

    exposes_bindings
    - argument
    - collection class
    - config class
    - context class
    - ctask decorator
    - exceptions
    - executor
    - failure class
    - filesystemloader
    - local class
    - program
    - pty size function
    - run function
    - runner class
    - runner result
    - task class
    - task decorator

Filesystem loader
- defaults to tasks collection
- exposes discovery start point
- has a default discovery start point
- raises CollectionNotFound if not found
- raises ImportError if found collection cannot be imported
- returns collection object if name found
- searches towards root of filesystem

Loader
- adds module parent dir to sys path
- can load package
- closes opened file object

Argument

    value
    - returns default if not set

    __repr__
    - just aliases dunder str

    set_value
    - allows setting value without casting
    - casts by default

    name
    - returns first name

    __init__
    - can declare positional
    - can set attr name to control name attr
    - default arg is name not names
    - may take name arg
    - may take names list
    - must get at least one name
    - positional is False by default

    value=
    - available as dot raw value
    - transformed appears as dot value with original as raw value
    - untransformed appears as dot value

    nicknames
    - returns rest of names

    'kind' kwarg
    - bool implies default False not None
    - bool implies no value needed
    - defaults to str
    - is optional
    - may validate on set
    - non bool implies value needed

    raw_value
    - is None when no value was actually seen

    takes_value
    - False if kind is bool
    - True by default

    names
    - is normalized to a tuple
    - returns tuple of all names

    __str__
    - does not show nickname parens if no nicknames
    - shows positionalness
    - shows useful info

ParserContext
- may give arg list at init time
- may have a name
- may have aliases

    needs_positional_arg
    - represents whether all positional args have values

    args
    - args dict includes all arg names
    - argument attr names appear in args but not flags
    - exposed as Lexicon
    - exposed as dict

    __deepcopy__
    - includes arguments
    - modifications to copied arguments do not touch originals
    - returns correct copy

    __str__
    - args show as repr
    - repr is str
    - with no args output is simple

    add_arg
    - adds all names to dot flags
    - adds flaglike name to dot flags
    - adds positional args to positional args
    - adds true bools to inverse flags
    - can take Argument instance
    - can take kwargs for single Argument
    - can take name arg
    - inverse flags works right with task driven underscored names
    - positional arg modifications affect args copy
    - positional args empty when none given
    - positional args filled in order
    - raises ValueError on duplicate
    - turns single character names into short flags

    help_tuples
    - case ignored during sorting
    - lowercase wins when values identical otherwise
    - mixed corelike options
    - returns list of help tuples
    - sorts alphabetically by longflag when no shortflag
    - sorts alphabetically by shortflag first
    - sorts heterogenous help output with longflag only options first

    help_for
    - equals sign for long form only
    - kind to placeholder map
    - optional values use brackets
    - raises ValueError for non flag values
    - short form before long form
    - shortflag inputs work too
    - task driven no helpstr
    - task driven with helpstr
    - true default args
    - underscored args
    - vanilla no helpstr
    - vanilla with helpstr

ParseResult
- acts as a list of parsed contexts
- exhibits remainder attribute

Parser
- can take initial and other contexts
- can take initial context
- can take just contexts as non keyword arg
- can take just other contexts
- ignore unknown defaults to False
- raises ValueError for unnamed Contexts in contexts
- raises error for context alias and name clashes
- raises error for context name and alias clashes
- raises error for context name clashes
- takes ignore unknown kwarg

    optional_arg_values
    - no value becomes True not default value
    - not given at all uses default value
    - value given gets preserved normally

        ambiguity_sanity_checks
        - actual other flag
        - flaglike value
        - no ambiguity with flaglike value if option val was given
        - task name
        - unfilled posargs

    task_repetition
    - is happy to handle same task multiple times
    - task args work correctly

    parse_argv
    - always includes initial context if one was given
    - arguments which take values get defaults overridden correctly
    - clones initial context
    - clones noninitial contexts
    - handles multiple boolean flags per context
    - ignore unknown does not mutate rest of argv
    - ignore unknown returns unparsed argv instead
    - inverse bools get set correctly
    - parses sys argv style list of strings
    - raises error if unknown contexts found
    - returned arguments not given contain default values
    - returned context member arguments contain given values
    - returned contexts are in order given
    - returns only contexts mentioned
    - returns remainder
    - unparsed does not share state

        positional_arguments
        - omitted positional arg raises ParseError
        - positional args can still be given as flags
        - positional args eat otherwise valid context names
        - single positional arg

        parsing_errors
        - attached context is None outside contexts
        - attaches context to ParseErrors
        - missing flag values raise ParseError

        equals_signs
        - does not require escaping equals signs in value
        - handles equals style long flags
        - handles equals style short flags

platform

    pty_size
    - calls fcntl with TIOCGWINSZ
    - defaults to 80x24 when stdout not a tty
    - uses default when stdout lacks fileno

Program

    miscellaneous behaviors
    - debug flag activates logging

    run
    - allows explicit task module specification
    - does not seek tasks module if namespace was given
    - expected failure types don't raise exceptions
    - handles task arguments
    - seeks and loads tasks module by default
    - should show context usage on context parse failures
    - should show core usage on core parse failures

    binary
    - defaults to argv when None
    - use binary basename when invoked absolutely
    - uses overridden value when given

    name
    - benefits from binary absolute behavior
    - defaults to capitalized binary when None
    - uses overridden value when given

    execute
    - uses executor class given

    initial_context
    - contains truly core arguments regardless of namespace value
    - non null namespace does not trigger task related args
    - null namespace triggers task related args

    Configuration-related concerns
    - env var prefix can be overridden
    - env vars load with prefix
    - per project config files are loaded
    - per project config files load with explicit ns
    - runtime config file honored
    - tasks dedupe honors configuration

    normalize_argv
    - defaults to sys argv
    - splits a string
    - uses a list unaltered

    run() related CLI flags affect 'run' config values
    - echo
    - hide
    - pty
    - warn only

    __init__
    - default version is unknown
    - env prefix can be overridden
    - env prefix defaults to INVOKE
    - executor class defaults to Executor
    - loader class defaults to FilesystemLoader
    - may specify binary
    - may specify executor class
    - may specify loader class
    - may specify name
    - may specify namespace
    - may specify version

    --help

        per-task
        - complains if given invalid task name
        - dedents correctly
        - dedents correctly for alt docstring style
        - displays docstrings if given
        - exits after printing
        - honors program binary
        - prints help for task only
        - works for unparameterized tasks

        core
        - bundled namspace help includes subcommand listing
        - core help doesn't get mad if loading fails
        - core help option prints core help
        - empty invocation with no default task prints help

    core_args
    - returns core args list

    --list
    - aliases sorted alphabetically
    - default tasks
    - docstrings shown alongside
    - empty collections say no tasks
    - namespacing
    - simple output
    - subcollections sorted in depth order
    - top level tasks listed first

    load_collection
    - complains when default collection not found
    - complains when explicit collection not found
    - uses loader class given

    print_version
    - displays name and version

Local

    pty_and_pty_fallback
    - can be overridden by config
    - can be overridden by kwarg
    - fallback affects result pty value
    - non spurious OSErrors bubble up
    - overridden fallback affects result pty value
    - pty is set to controlling terminal size
    - replaced stdin objects don't explode
    - spurious OSErrors handled gracefully
    - warning only fires once
    - when pty True we use pty fork and os exec

Runner

    echoing
    - enabled via config
    - enabled via kwarg
    - kwarg beats config
    - off by default
    - uses ansi bold

    threading
    - errors within io thread body bubble up

    __init__
    - context instance is required
    - takes a context instance

    warn
    - honors config
    - kwarg beats config

    encoding
    - defaults to encoding method result
    - honors config
    - honors kwarg

    pty
    - honors config
    - kwarg beats config
    - pty defaults to off

    hide
    - honors config
    - kwarg beats config

    output_hiding
    - False hides nothing
    - None hides nothing
    - True hides everything
    - accepts stderr alias for err
    - accepts stdout alias for out
    - both hides everything
    - does not affect capturing
    - err only hides stderr
    - out only hides stdout
    - unknown vals mention value given in error
    - unknown vals raises ValueError

    output_stream_overrides
    - err can be overridden
    - err defaults to sys stderr
    - out can be overridden
    - out defaults to sys stdout
    - pty defaults to sys
    - pty out can be overridden

    failure_handling
    - Failure repr includes stderr
    - Failure repr should present stdout when pty was used
    - fast failures
    - non one return codes still act as failure

    return_value
    - command executed
    - failed attr indicates failure
    - failed attr indicates success
    - ok attr indicates failure
    - ok attr indicates success
    - return code in result
    - stderr attribute contains stderr
    - stdout attribute contains stdout
    - whether pty was used

Task
- equality testing
- has useful repr

    attributes
    - can override name
    - has contextualized flag
    - has default flag
    - name defaults to body name

    callability
    - dunder call wraps body call
    - errors if contextualized and first arg not Context
    - tracks times called
    - wraps body docstring
    - wraps body name

    get_arguments
    - autocreated short flags can be disabled
    - autocreated shortflags don't collide
    - context arguments are not returned
    - early auto shortflags shouldnt lock out real shortflags
    - kinds are preserved
    - optional flag is preserved
    - positional args come first
    - positional flag is preserved
    - shortflags created by default
    - shortflags don't care about positionals
    - turns function signature into Arguments
    - underscores become dashes

ctask
- behaves like task with contextualized True

@task
- allows access to wrapped object
- allows alias specification
- allows annotating args as positional
- allows default specification
- allows multiple aliases
- allows star args as shortcut for pre
- context arguments should not appear in implicit positional list
- disallows ambiguity between star args and pre kwarg
- has autoprint option
- passes in contextualized kwarg
- pre tasks stored directly
- raises ValueError on multiple defaults
- sets arg help
- sets arg kind
- sets name
- sets which args are optional
- when positional arg missing all non default args are positional

======================================================================
ERROR: collection.from_module.load_collection_from_real_module
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/rene/.pyenv/versions/3.5.0/lib/python3.5/unittest/case.py", line 58, in testPartExecutor
    yield
  File "/Users/rene/.pyenv/versions/3.5.0/lib/python3.5/unittest/case.py", line 597, in run
    testMethod()
  File "/Users/rene/used_repos/invoke/.tox/py35/lib/python3.5/site-packages/nose/case.py", line 198, in runTest
    self.test(*self.arg)
  File "/Users/rene/used_repos/invoke/tests/collection.py", line 169, in load_collection_from_real_module
    c = Collection.from_module(my_tasks)
  File "/Users/rene/used_repos/invoke/invoke/collection.py", line 168, in from_module
    ret.tasks = copy.deepcopy(obj.tasks)
  File "/Users/rene/used_repos/invoke/.tox/py35/lib/python3.5/copy.py", line 182, in deepcopy
    y = _reconstruct(x, rv, 1, memo)
  File "/Users/rene/used_repos/invoke/.tox/py35/lib/python3.5/copy.py", line 321, in _reconstruct
    value = deepcopy(value, memo)
  File "/Users/rene/used_repos/invoke/.tox/py35/lib/python3.5/copy.py", line 182, in deepcopy
    y = _reconstruct(x, rv, 1, memo)
  File "/Users/rene/used_repos/invoke/.tox/py35/lib/python3.5/copy.py", line 298, in _reconstruct
    state = deepcopy(state, memo)
  File "/Users/rene/used_repos/invoke/.tox/py35/lib/python3.5/copy.py", line 155, in deepcopy
    y = copier(x, memo)
  File "/Users/rene/used_repos/invoke/.tox/py35/lib/python3.5/copy.py", line 244, in _deepcopy_dict
    y[deepcopy(key, memo)] = deepcopy(value, memo)
  File "/Users/rene/used_repos/invoke/.tox/py35/lib/python3.5/copy.py", line 155, in deepcopy
    y = copier(x, memo)
  File "/Users/rene/used_repos/invoke/.tox/py35/lib/python3.5/copy.py", line 219, in _deepcopy_list
    y.append(deepcopy(a, memo))
  File "/Users/rene/used_repos/invoke/.tox/py35/lib/python3.5/copy.py", line 182, in deepcopy
    y = _reconstruct(x, rv, 1, memo)
  File "/Users/rene/used_repos/invoke/.tox/py35/lib/python3.5/copy.py", line 299, in _reconstruct
    if hasattr(y, '__setstate__'):
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
  File "/Users/rene/used_repos/invoke/invoke/tasks.py", line 339, in __getattr__
    return getattr(self.task, name)
RecursionError: maximum recursion depth exceeded while calling a Python object

Ran 530 tests in 1.741 seconds
FAILED (failures=0, errors=1, skipped=10)

ERROR: InvocationError: '/Users/rene/used_repos/invoke/.tox/py35/bin/spec'

@bitprophet bitprophet modified the milestones: 0.13, 0.12 Dec 22, 2015
presidento added a commit to presidento/invoke that referenced this issue Jan 2, 2016
Having __getattr__ without __deepcopy__ causes infinite
recursion in Python 3 when you deepcopy that object. A test
is also updated to cause the error fixed in this commit.

Fixes pyinvoke#257

Signed-off-by: Máté Farkas <mate.farkas@balabit.com>
bitprophet added a commit that referenced this issue Jan 13, 2016
@bitprophet
Copy link
Member

Rolling into #300, which just got merged

@rm--
Copy link

rm-- commented Jan 25, 2016

Tested our task that triggers the problem originally and it works as expected. Thanks a lot!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants