I’m trying to write a plugin in our repo to run `m...
# plugins
s
I’m trying to write a plugin in our repo to run
msgfmt
on
.po
files (trying to replicate Django’s
compilemessages
management command), but I’m having trouble getting my
rule
to be recognized by
export-codegen
. Details in 🧵
1
right now I’ve got:
Copy code
# target_types.py

from pants.engine.target import (
    COMMON_TARGET_FIELDS,
    MultipleSourcesField,
    SingleSourceField,
    Target,
    TargetFilesGenerator,
)


class MessageSourceField(SingleSourceField):
    expected_file_extensions = (".po",)


class MessageSourcesField(MultipleSourcesField):
    expected_file_extensions = (".po",)
    default = ("*.po",)


class MessageSourceTarget(Target):
    alias = "message_source"
    core_fields = (*COMMON_TARGET_FIELDS, MessageSourceField)


class MessageSourcesGeneratorTarget(TargetFilesGenerator):
    alias = "message_sources"
    core_fields = (*COMMON_TARGET_FIELDS, MessageSourcesField)
    copied_fields = COMMON_TARGET_FIELDS
    moved_fields = ()
    generated_target_cls = MessageSourceTarget
    copied_fields = COMMON_TARGET_FIELDS
Copy code
# rules.py

from pants.core.target_types import ResourceSourceField
from pants.engine.internals.native_engine import EMPTY_SNAPSHOT
from pants.engine.rules import rule
from pants.engine.target import GeneratedSources, GenerateSourcesRequest
from pants.engine.unions import UnionRule
from pants.util.logging import LogLevel
from plugins.django.messages.target_types import MessageSourceField


class CompileMessageRequest(GenerateSourcesRequest):
    input = MessageSourceField
    output = ResourceSourceField


@rule(level=LogLevel.DEBUG, desc="Compile messages")
async def compile_messages(_: CompileMessageRequest) -> GeneratedSources:
    return GeneratedSources(EMPTY_SNAPSHOT)


def rules():
    return [compile_messages, UnionRule(GenerateSourcesRequest, CompileMessageRequest)]
Copy code
# register.py

from plugins.django.messages.rules import rules as messages_rules
from plugins.django.messages.target_types import (
    MessageSourcesGeneratorTarget,
    MessageSourceTarget,
)


def target_types():
    return [MessageSourceTarget, MessageSourcesGeneratorTarget]


def ruiles():
    return [
        *messages_rules(),
    ]
I’m able to use the
message_sources
target generator in the repo, and I can confirm it’s working with:
Copy code
./pants --filter-target-type=message_source list ::
however when I run
./pants export-codegen ::
I get the warning:
Copy code
No codegen files/targets matched. All codegen target types: docker_image, experimental_shell_command, protobuf_source
based on the docs I expected
UnionRule(GenerateSourcesRequest, CompileMessageRequest)
to be the thing that hooked my rule into
export-codegen
- am I missing anything else?
omg 🤦‍♂️
Copy code
def ruiles():
instead of
Copy code
def rules():