First steps

Create command

Let’s create simple command.

from ezcliy import Command


class SmallTextProcessor(Command):
    def invoke(self):
        print(f'You have passed {len(self.values)} arguments!')


if __name__ == '__main__':
    SmallTextProcessor().cli_entry()

All cleaned values are in self.values.

That will count passed values.

python3 main.py first second
You have passed 2 arguments!

Add parameters

Now we will add flag (-v) and keyval (--verbose-level=debug)

from ezcliy import Command, Flag, KeyVal


class SmallTextProcessor(Command):
    verbose = Flag('-v', '--verbose')
    verbosity_level = KeyVal('--verbose-level', default='info')

    def invoke(self):
        if self.verbose:
            print(f'Logging enabled, {self.verbosity_level.value=}')
        print(f'You have passed {len(self.values)} arguments!')


if __name__ == '__main__':
    SmallTextProcessor().cli_entry()

Flags are boolean values, we can put them directly into ``if``s

python3 main.py first second -v --verbose-level=debug
Logging enabled, self.verbosity_level.value='debug'
You have passed 2 arguments!

Add positionals

Positionals are direct binds for values (by declaration order) with extra steps (ask if not given, etc.). Let’s add them to our command

from ezcliy import *


class SmallTextProcessor(Command):
    first_word = Positional('fw')
    verbose = Flag('-v', '--verbose')
    verbosity_level = KeyVal('--verbose-level', default='info')

    def invoke(self):
        if self.verbose:
            print(f'Logging enabled, {self.verbosity_level.value=}')
        print(f'You have passed {len(self.values)} arguments!')
        for _ in range(3):
            print(self.first_word)


if __name__ == '__main__':
    SmallTextProcessor().cli_entry()

And response will look like that

python3 main.py first second -v --verbose-level=debug
Logging enabled, self.verbosity_level.value='debug'
You have passed 2 arguments!
first
first
first