Skip to main content

FastAPI CLI Command

Project description

FastAPI CLI Command

FastAPI CLI Command package helps you:

  • Automatically generate CLI commands.
  • Construct command modules in a clean and organized manner.
  • Automatically inject dependencies into your commands.

By utilizing the click package behind the scenes, the commands can leverage features such as command arguments, options, command groups, and more.

Dependencies

  • fastapi
  • click

Installation

pip install fastapi_cli_command

Command generation

  1. Generate single command
fastapi_cli_command generate command --path {path}

Example: To generate single command, run:

fastapi_cli_command generate command --path src/users/commands --name test

Note: You can omit the --name option from the CLI command, as click will prompt you for input.

This will create a file at src/users/commands/single-command.py with the following content:

# src/users/commands/test_command.py
from click import Option
from fastapi_cli_command import BaseCommand, command


class CommandOptions:
  REQUIRED_OPTION = Option(
    ['--foo'],
    help='Description for option',
    required=True,
    type=str
  )
  PROMPT_OPTION = Option(
    ['--bar'],
    help='Description for option',
    prompt=True,
    type=int,
    default=99
  )

@command('test')
class TestCommand(BaseCommand):
  def __init__(self):
    pass

  async def run(self, foo: CommandOptions.REQUIRED_OPTION, bar: CommandOptions.PROMPT_OPTION):
    ...
    
  1. Generate group command
fastapi_cli_command generate group-command --path={path}

Example: To generate a group seeder command, run:

fastapi_cli_command generate group-command --path src/seed/commands --name seeder
# src/seed/commands/seeder_command.py
from click import Option
from fastapi_cli_command import cli_command, cli_command_group

class CommandOptions:
  REQUIRED_OPTION = Option(
    ['--foo'],
    help='Description for option',
    required=True,
    type=str
  )
  PROMPT_OPTION = Option(
    ['--bar'],
    help='Description for option',
    prompt=True,
    type=int,
    default=99
  )

@cli_command_group('seeder')
class SeederGroupCommand:
  def __init__(self):
    pass

  @cli_command('REPLACE_ME')
  async def command(self, foo: CommandOptions.REQUIRED_OPTION, bar: CommandOptions.PROMPT_OPTION):
    ...

  @cli_command('REPLACE_ME')
  async def command_2(self):
    ...
    

When to use?

Scenario 1: Seeding Data into the Database

If you want to seed user and post data into the database, you can create a group command:

fastapi_cli_command generate group-command --path src/seed/commands --name seed
from click import Option
from fastapi_cli_command import cli_command, cli_command_group

class CommandOptions:
  USER_QUANTITY = Option(
    ['--quantity'],
    help='How many users that you want to generate',
    required=True,
    prompt=True,
    type=int
  )
  POST_QUANTITY = Option(
    ['--quantity'],
    help='How many users that you want to generate',
    type=int,
    default=99
  )

@cli_command_group('seed')
class SeedGroupCommand:
  def __init__(self, user_repo: UserRepository = Depends(), post_repo: PostRepository = Depends()):
    self.user_repo = user_repo
    self.post_repo = post_repo

  @cli_command('user')
  async def seed_user(self, quantity: CommandOptions.USER_QUANTITY):
    ...

  @cli_command('post')
  async def seed_post(self, quantity: CommandOptions.POST_QUANTITY = None):
    ...
    

Then, you can run the following commands:

fastapi_cli_command seed user
fastapi_cli_command seed post --quantity 10

Scenario 2: Updating a User's Username

If you want to update a user's username using their email address, you can create a single command:

fastapi_cli_command generate command --path src/users/commands --name update-username
from click import Option
from fastapi_cli_command import BaseCommand, command

class CommandOptions:
  EMAIL = Option(
    ['--email'],
    help='Email address of user that you want to update',
    prompt=True,
    required=True,
    type=str,
  )
  USERNAME = Option(
    ['--username'],
    help='Username that you want to replace',
    required=True,
    prompt=True,
    type=str,
  )

@command('update-username')
class UpdateUsernameCommand(BaseCommand):
  def __init__(self, user_repo: UserRepository = Depends()):
    self.user_repo = user_repo

  async def get_user_by_email(self, email: str):
    ...

  async def update_username_by_email(self, user_id: UUID, username: str):
    ...

  async def run(self, email: TestCommandOptions.EMAIL, username: TestCommandOptions.USERNAME):
    user = await self.get_user_by_email(email)
    await self.update_username_by_email(user.id, username)

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

fastapi_cli_command-0.0.5.tar.gz (9.7 kB view details)

Uploaded Source

Built Distribution

fastapi_cli_command-0.0.5-py3-none-any.whl (15.0 kB view details)

Uploaded Python 3

File details

Details for the file fastapi_cli_command-0.0.5.tar.gz.

File metadata

  • Download URL: fastapi_cli_command-0.0.5.tar.gz
  • Upload date:
  • Size: 9.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.10.14

File hashes

Hashes for fastapi_cli_command-0.0.5.tar.gz
Algorithm Hash digest
SHA256 9074c6a7a264aa3c613c9b0a417b55299e4f6eae71b753b2ee54960f95309ef9
MD5 c352659a6aa6b0c59677cab2f8af04c9
BLAKE2b-256 ca91b1d073f0641ee76e44fb27fac4aa19fa057ee2efaa6597483ff5b4ffd06d

See more details on using hashes here.

File details

Details for the file fastapi_cli_command-0.0.5-py3-none-any.whl.

File metadata

File hashes

Hashes for fastapi_cli_command-0.0.5-py3-none-any.whl
Algorithm Hash digest
SHA256 5ff0326d41163fa9b2b297c1dd3a58c92744e8399ff503866a1482092273bc13
MD5 39c975af855eaf8e95588c23461637a2
BLAKE2b-256 a6d65d112245d172cc27a1d16d9d51cd5e8d1bef4aa20a63d6bfcceb3265b50f

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page