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

per_platform help text shows plugin-focused guide, not usage #20980

Open
huonw opened this issue May 30, 2024 · 0 comments
Open

per_platform help text shows plugin-focused guide, not usage #20980

huonw opened this issue May 30, 2024 · 0 comments

Comments

@huonw
Copy link
Contributor

huonw commented May 30, 2024

Describe the bug

The per_platform doc string appears in the output of pants help per_platform, but that doc string is currently entirely focused on plugin authors using

I think it'd be more helpful for the help output to be focused on how to use it:

PANTS_VERSION=2.22.0.dev3 pants help per_platform
`per_platform` BUILD file symbol
--------------------------------

Signature: per_platform(linux_arm64: '_T | None' = None, linux_x86_64: '_T | None' = None, macos_arm64: '_T | None' = None, macos_x86_64: '_T | None' = None) -> None

An object containing differing homogeneous platform-dependent values.

The values should be evaluated for the execution environment, and not the host environment
(I.e. it should be evaluated in a `rule` which requests `Platform`).

Expected usage is roughly:

```python
class MyFieldType(...):
    value = str | per_platform[str]

    @classmethod
    def compute_value(  # type: ignore[override]
        cls,
        raw_value: Optional[Union[str, per_platform[str]]],
        address: Address,
    ) -> Optional[Union[str, per_platform[str]]]:
        if isinstance(raw_value, per_platform):
            # NOTE: Ensure the values are homogeneous
            raw_value.check_types(str)

        return raw_value

...

@rule
async def my_rule(..., platform: Platform) -> ...:
    field_value = target[MyFieldType].value

    if isinstance(field_value, per_platform):
        field_value = field_value.get_value_for_platform(platform)

    ...
```

NOTE: Support for this object should be heavily weighed, as it would be inappropriate to use
in
certain contexts (such as the `source` field in a `foo_source` target, where the intent is to
support differing source files based on platform. The result would be that dependency
inference
(and therefore the dependencies field) wouldn't be knowable on the host, which is not
something
the engine can support yet).

Bonus points: while writing this, write some docs for http_source too: PANTS_VERSION=2.22.0.dev3 pants help http_source doesn't show anything.

Pants version
2.22.0.dev3

OS
both

Additional info

huonw added a commit to pantsbuild/pantsbuild.org that referenced this issue May 30, 2024
This adds a new section to the reference docs:
`/2.x/reference/build-file-symbols/`. This renders all the known
non-target BUILD file symbols, as indicated by the
`name_to_build_file_info` key of the `help-all` output JSON.

This JSON looks like the following, and this generation basically just
mashes it up into documentation form:

```json
  "name_to_build_file_info": {
    "PANTS_VERSION": {
      "documentation": null,
      "is_target": false,
      "name": "PANTS_VERSION",
      "signature": null
    },
    "__defaults__": {
      "documentation": "Provide default field values.\n\nLearn more https://www.pantsbuild.org/2.22/docs/using-pants/key-concepts/targets-and-build-files#field-default-values",
      "is_target": false,
      "name": "__defaults__",
      "signature": "(*args: 'SetDefaultsT', ignore_unknown_fields: 'bool' = False, ignore_unknown_targets: 'bool' = False, **kwargs) -> 'None'"
    },
    "__dependencies_rules__": {
      "documentation": "Declare dependencies rules.",
      "is_target": false,
      "name": "__dependencies_rules__",
      "signature": "(*args, **kwargs) -> 'None'"
    },
    "__dependents_rules__": {
      "documentation": "Declare dependents rules.",
      "is_target": false,
      "name": "__dependents_rules__",
      "signature": "(*args, **kwargs) -> 'None'"
    },
    "_generator_sources_helper": {
      "documentation": null,
      "is_target": true,
      "name": "_generator_sources_helper",
      "signature": "(**kwargs: 'Any') -> 'TargetAdaptor'"
    },
    "_lockfile": {
      "documentation": null,
      "is_target": true,
      "name": "_lockfile",
      "signature": "(**kwargs: 'Any') -> 'TargetAdaptor'"
    },
...
```

This is a new sidebar option:


![image](https://github.com/pantsbuild/pantsbuild.org/assets/1203825/e1e1a27c-9cc2-47e1-ac07-644a1c019ae8)


Some of these have reasonable docs:


![image](https://github.com/pantsbuild/pantsbuild.org/assets/1203825/b453a0ad-055b-4ef9-b7b9-9528782f1d02)


![image](https://github.com/pantsbuild/pantsbuild.org/assets/1203825/3f11ca66-85a2-49cc-87f4-fe36ed75a960)


Others do not have good docs:


![image](https://github.com/pantsbuild/pantsbuild.org/assets/1203825/83df063c-2a59-434c-8d8e-878d6b57ac3e)


![image](https://github.com/pantsbuild/pantsbuild.org/assets/1203825/121f3c2e-10a3-491c-b836-f9cad0256d31)



![image](https://github.com/pantsbuild/pantsbuild.org/assets/1203825/76a07178-de41-4022-b29c-56a6f04f191e)


I think we should land this and then separately work to improve the
documentation of each BUILD file symbol:

- pantsbuild/pants#20976
- pantsbuild/pants#20977
- pantsbuild/pants#20978
- pantsbuild/pants#20979
- pantsbuild/pants#20980


To make this work, there's two other changes required, which are done as
separate commits:

- support for back-tick code blocks, to avoid mangling them
- explicit sidebar positions, so that `BUILD file symbols` is placed
last, rather than before `Global options` (thus becoming the default)

This generates back to the first version that include that (2.16) and
involves some other changes to the code-genned docs, hence this is
targeted `automation:sync-docs`.

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

No branches or pull requests

1 participant