Skip to content

Commit

Permalink
🐛 Fix broken installation when upgrading from typer <0.12.0 to `typ…
Browse files Browse the repository at this point in the history
…er >=0.12.0`, make `typer` independent of `typer-slim`, include `typer` command in `typer` package (#791)
  • Loading branch information
tiangolo committed Apr 5, 2024
1 parent 8bac821 commit 05ffb24
Show file tree
Hide file tree
Showing 13 changed files with 128 additions and 240 deletions.
7 changes: 2 additions & 5 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,6 @@ jobs:
- typer-slim
- typer
- typer-cli
env:
dir: ${{ matrix.package == 'typer-slim' && './' || matrix.package == 'typer' && 'typer_package' || matrix.package == 'typer-cli' && 'typer_cli_package' }}
permissions:
id-token: write
steps:
Expand All @@ -34,9 +32,8 @@ jobs:
- name: Install build dependencies
run: pip install build
- name: Build distribution
working-directory: ${{ env.dir }}
env:
TIANGOLO_BUILD_PACKAGE: ${{ matrix.package }}
run: python -m build
- name: Publish
uses: pypa/[email protected]
with:
packages-dir: ${{ env.dir }}/dist/
11 changes: 4 additions & 7 deletions .github/workflows/test-redistribute.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,6 @@ jobs:
- typer-slim
- typer
- typer-cli
env:
dir: ${{ matrix.package == 'typer-slim' && './' || matrix.package == 'typer' && 'typer_package' || matrix.package == 'typer-cli' && 'typer_cli_package' }}
steps:
- name: Dump GitHub context
env:
Expand All @@ -36,25 +34,24 @@ jobs:
- name: Install build dependencies
run: pip install build
- name: Build source distribution
working-directory: ${{ env.dir }}
env:
TIANGOLO_BUILD_PACKAGE: ${{ matrix.package }}
run: python -m build --sdist
- name: Decompress source distribution
working-directory: ${{ env.dir }}
run: |
cd dist
tar xvf typer*.tar.gz
- name: Install test dependencies
if: ${{ matrix.package == 'typer-slim' }}
if: ${{ matrix.package != 'typer-cli' }}
run: |
cd dist/typer*/
pip install -r requirements-tests.txt
- name: Run source distribution tests
if: ${{ matrix.package == 'typer-slim' }}
if: ${{ matrix.package != 'typer-cli' }}
run: |
cd dist/typer*/
bash scripts/test.sh
- name: Build wheel distribution
working-directory: ${{ env.dir }}
run: |
cd dist
pip wheel --no-deps typer*.tar.gz
13 changes: 5 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ The key features are:
* **Short**: Minimize code duplication. Multiple features from each parameter declaration. Fewer bugs.
* **Start simple**: The simplest example adds only 2 lines of code to your app: **1 import, 1 function call**.
* **Grow large**: Grow in complexity as much as you want, create arbitrarily complex trees of commands and groups of subcommands, with options and arguments.
* **Run scripts**: Typer includes a `typer` command that you can use to run scripts, automatically converting them to CLIs, even if they don't use Typer internally.
* **Run scripts**: Typer includes a `typer` command/program that you can use to run scripts, automatically converting them to CLIs, even if they don't use Typer internally.

## FastAPI of CLIs

Expand Down Expand Up @@ -355,29 +355,26 @@ By default it also comes with extra standard dependencies:
* <a href="https://github.com/sarugaku/shellingham" class="external-link" target="_blank"><code>shellingham</code></a>: to automatically detect the current shell when installing completion.
* With `shellingham` you can just use `--install-completion`.
* Without `shellingham`, you have to pass the name of the shell to install completion for, e.g. `--install-completion bash`.
* `typer-cli`: adds the `typer` command to your shell:
* Quickly run scripts (that don't have to use Typer) with shell completion.
* Generate docs for your Typer applications.

### `typer-slim`

If you don't want the extra dependencies, install `typer-slim` instead.
If you don't want the extra standard optional dependencies, install `typer-slim` instead.

When you install with:

```bash
pip install typer
```

...it's the equivalent of:
...it includes the same code and dependencies as:

```bash
pip install "typer-slim[standard]"
```

The `standard` extra dependencies are `rich`, `shellingham`, `typer-cli`.
The `standard` extra dependencies are `rich` and `shellingham`.

**Note**: even if you don't install `typer-cli` you can still use it's functionality by calling `typer` as a module, e.g. `python -m typer`.
**Note**: The `typer` command is only included in the `typer` package.

## License

Expand Down
13 changes: 5 additions & 8 deletions docs/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ The key features are:
* **Short**: Minimize code duplication. Multiple features from each parameter declaration. Fewer bugs.
* **Start simple**: The simplest example adds only 2 lines of code to your app: **1 import, 1 function call**.
* **Grow large**: Grow in complexity as much as you want, create arbitrarily complex trees of commands and groups of subcommands, with options and arguments.
* **Run scripts**: Typer includes a `typer` command that you can use to run scripts, automatically converting them to CLIs, even if they don't use Typer internally.
* **Run scripts**: Typer includes a `typer` command/program that you can use to run scripts, automatically converting them to CLIs, even if they don't use Typer internally.

## FastAPI of CLIs

Expand Down Expand Up @@ -355,29 +355,26 @@ By default it also comes with extra standard dependencies:
* <a href="https://github.com/sarugaku/shellingham" class="external-link" target="_blank"><code>shellingham</code></a>: to automatically detect the current shell when installing completion.
* With `shellingham` you can just use `--install-completion`.
* Without `shellingham`, you have to pass the name of the shell to install completion for, e.g. `--install-completion bash`.
* `typer-cli`: adds the `typer` command to your shell:
* Quickly run scripts (that don't have to use Typer) with shell completion.
* Generate docs for your Typer applications.

### `typer-slim`

If you don't want the extra dependencies, install `typer-slim` instead.
If you don't want the extra standard optional dependencies, install `typer-slim` instead.

When you install with:

```bash
pip install typer
```

...it's the equivalent of:
...it includes the same code and dependencies as:

```bash
pip install "typer-slim[standard]"
```

The `standard` extra dependencies are `rich`, `shellingham`, `typer-cli`.
The `standard` extra dependencies are `rich` and `shellingham`.

**Note**: even if you don't install `typer-cli` you can still use it's functionality by calling `typer` as a module, e.g. `python -m typer`.
**Note**: The `typer` command is only included in the `typer` package.

## License

Expand Down
6 changes: 3 additions & 3 deletions docs/tutorial/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -68,12 +68,12 @@ The first step is to install **Typer**:
```console
$ pip install typer
---> 100%
Successfully installed typer click shellingham rich typer-cli
Successfully installed typer click shellingham rich
```

</div>

By default, `typer` comes with `rich`, `shellingham`, and `typer-cli`.
By default, `typer` comes with `rich` and `shellingham`.

!!! note
If you are an advanced user and want to opt out of these default extra dependencies, you can instead install `typer-slim`.
Expand All @@ -82,7 +82,7 @@ By default, `typer` comes with `rich`, `shellingham`, and `typer-cli`.
pip install typer
```

...is the equivalent of:
...includes the same optional dependencies as:

```bash
pip install "typer-slim[standard]"
Expand Down
55 changes: 55 additions & 0 deletions pdm_build.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
import os
from typing import Any, Dict, List

from pdm.backend.hooks import Context

TIANGOLO_BUILD_PACKAGE = os.getenv("TIANGOLO_BUILD_PACKAGE", "typer")


def pdm_build_initialize(context: Context):
metadata = context.config.metadata
# Get main version
version = metadata["version"]
# Get package names to keep in sync with the same main version
sync_dependencies: List[str] = context.config.data["tool"]["tiangolo"][
"_internal-slim-build"
]["sync-dependencies"]
# Get custom config for the current package, from the env var
config: Dict[str, Any] = context.config.data["tool"]["tiangolo"][
"_internal-slim-build"
]["packages"][TIANGOLO_BUILD_PACKAGE]
project_config: Dict[str, Any] = config["project"]
# Get main optional dependencies, extras
optional_dependencies: Dict[str, List[str]] = metadata.get(
"optional-dependencies", {}
)
# Get custom optional dependencies name to always include in this (non-slim) package
include_optional_dependencies: List[str] = config.get(
"include-optional-dependencies", []
)
# Override main [project] configs with custom configs for this package
for key, value in project_config.items():
metadata[key] = value
# Get custom build config for the current package
build_config: Dict[str, Any] = (
config.get("tool", {}).get("pdm", {}).get("build", {})
)
# Override PDM build config with custom build config for this package
for key, value in build_config.items():
context.config.build_config[key] = value
# Get main dependencies
dependencies: List[str] = metadata.get("dependencies", [])
# Add optional dependencies to the default dependencies for this (non-slim) package
for include_optional in include_optional_dependencies:
optional_dependencies_group = optional_dependencies.get(include_optional, [])
dependencies.extend(optional_dependencies_group)
# Sync versions in dependencies
new_dependencies = []
for dep in dependencies:
if dep in sync_dependencies:
new_dep = f"{dep}=={version}"
new_dependencies.append(new_dep)
else:
new_dependencies.append(dep)
if new_dependencies != dependencies:
metadata["dependencies"] = new_dependencies
55 changes: 46 additions & 9 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,12 @@ requires = ["pdm-backend"]
build-backend = "pdm.backend"

[project]
# pip install typer-slim: is only the Typer library, without extras
# pip install typer: is typer-slim[standard], with extras and typer-cli
name = "typer-slim"
name = "typer"
dynamic = ["version"]
description = "Typer, build great CLIs. Easy to code. Based on Python type hints."
authors = [
{name = "Sebastián Ramírez", email = "[email protected]"},
]
readme = "README.md"
requires-python = ">=3.7"
classifiers = [
"Intended Audience :: Information Technology",
Expand All @@ -38,16 +35,12 @@ dependencies = [
"click >= 8.0.0",
"typing-extensions >= 3.7.4.3",
]

readme = "README.md"
[project.urls]
Documentation = "https://typer.tiangolo.com/"
homepage = "https://github.com/tiangolo/typer"

[project.optional-dependencies]
all = [
"shellingham >=1.3.0",
"rich >=10.11.0",
]
standard = [
"shellingham >=1.3.0",
"rich >=10.11.0",
Expand All @@ -65,6 +58,50 @@ source-includes = [
"scripts/",
]

[tool.tiangolo._internal-slim-build]
sync-dependencies = [
"typer-slim[standard]",
"typer-cli",
"typer"
]

[tool.tiangolo._internal-slim-build.packages.typer-slim.project]
name = "typer-slim"

[tool.tiangolo._internal-slim-build.packages.typer]
include-optional-dependencies = ["standard"]

[tool.tiangolo._internal-slim-build.packages.typer.project]
optional-dependencies = {}

[tool.tiangolo._internal-slim-build.packages.typer.project.scripts]
typer = "typer.cli:main"

[tool.tiangolo._internal-slim-build.packages.typer-cli.project]
name = "typer-cli"
readme = "typer-cli/README.md"
dependencies = [
"typer",
]
optional-dependencies = {}

[tool.tiangolo._internal-slim-build.packages.typer-cli.tool.pdm.build]
# excludes needs to explicitly exclude the top level python packages,
# otherwise PDM includes them by default
# A "*" glob pattern can't be used here because in PDM internals, the patterns are put
# in a set (unordered, order varies) and each excluded file is assigned one of the
# glob patterns that matches, as the set is unordered, the matched pattern could be "*"
# independent of the order here. And then the internal code would give it a lower score
# than the one for a default included file.
# By not using "*" and explicitly excluding the top level packages, they get a higher
# score than the default inclusion
excludes = ["typer", "tests", "pdm_build.py"]
# source-includes needs to explicitly define some value because PDM will check the
# truthy value of the list, and if empty, will include some defaults, including "tests",
# an empty string doesn't match anything, but makes the list truthy, so that PDM
# doesn't override it during the build.
source-includes = [""]

[tool.isort]
profile = "black"
known_third_party = ["typer", "click"]
Expand Down
10 changes: 7 additions & 3 deletions typer_cli_package/README.md → typer-cli/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,13 @@ Typer is a library for building <abbr title="command line interface, programs ex

## Typer CLI

This package, `typer-cli`, only provides a command `typer` in the shell with the same functionality of `python -m typer`.
⚠️ Do not install this package. ⚠️

The only reason why this is a separate package is to allow developers to opt out of the `typer` command by installing `typer-slim`, that doesn't include `typer-cli`.
This package, `typer-cli`, does nothing other than depend on `typer`.

All the functionality has been integrated into `typer`.

The only reason this package exists is as a migration path for old projects that used to depend on `typer-cli`, so that they can get the latest version of `typer`.

You probably **should not** install this package.

Expand All @@ -42,7 +46,7 @@ Install instead:
pip install typer
```

That includes this package, `typer-cli`, with the `typer` command.
That includes the `typer` command.

## License

Expand Down
2 changes: 1 addition & 1 deletion typer/__init__.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
"""Typer, build great CLIs. Easy to code. Based on Python type hints."""

__version__ = "0.12.0"
__version__ = "0.12.1.dev2"

from shutil import get_terminal_size as get_terminal_size

Expand Down
40 changes: 0 additions & 40 deletions typer_cli_package/pdm_build.py

This file was deleted.

Loading

0 comments on commit 05ffb24

Please sign in to comment.