def add_middleware(self, mw): """Add a single middleware to this command. Outermost middleware should be added first. Remember: first added, first called. """ if not is_middleware(mw): mw = face_middleware(mw) check_middleware(mw) for flag in mw._face_flags: self.add(flag) for path, mws in self._path_mw_map.items(): self._path_mw_map[path] = [mw] + mws # TODO: check for conflicts return
def add(self, *a, **kw): """Add a flag, subcommand, or middleware to this Command. If the first argument is a callable, this method contructs a Command from it and the remaining arguments, all of which are optional. See the Command docs for for full details on names and defaults. If the first argument is a string, this method constructs a Flag from that flag string and the rest of the method arguments, all of which are optional. See the Flag docs for more options. If the argument is already an instance of Flag or Command, an exception is only raised on conflicting subcommands and flags. See add_command for details. Middleware is only added if it is already decorated with @face_middleware. Use .add_middleware() for automatic wrapping of callables. """ # TODO: need to check for middleware provides names + flag names # conflict target = a[0] if is_middleware(target): return self.add_middleware(target) subcmd = a[0] if not isinstance(subcmd, Command) and callable(subcmd) or subcmd is None: subcmd = Command(*a, **kw) # attempt to construct a new subcmd if isinstance(subcmd, Command): self.add_command(subcmd) return subcmd flag = a[0] if not isinstance(flag, Flag): flag = Flag(*a, **kw) # attempt to construct a Flag from arguments super(Command, self).add(flag) return flag