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

fix: render mfe-ports for unmounted mfes when these exist #241

Open
wants to merge 2 commits into
base: release
Choose a base branch
from
Open
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 13 additions & 6 deletions tutormfe/patches/local-docker-compose-dev-services
Original file line number Diff line number Diff line change
@@ -1,10 +1,17 @@
{%- set unmounted_mfes = [] %}
{%- for app_name, app in iter_mfes() %}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could we simplify this declaration with the following?

{%- set unmounted_mfes = [(app_name, app) for app_name, app in iter_mfes() if not list(iter_mounts(MOUNTS, app_name))] %}

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's giving error: Error: Template syntax error: expected token ',', got 'for'. Because of , in app_name, app. I've also tried with iter_mfes().items(). Got same error.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right. In which case, I suggest to expose a unmounted_mfes variable via the ENV_TEMPLATE_VARIABLES filter.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've tried to applied using the below code.

def get_unmounted_mfes() -> list:
    unmounted_mfes = []
    def append_to_unmounted_mfes(mounts: list[str], app_name:str, app: MFE_ATTRS_TYPE):
        if not mounts:
            unmounted_mfes.append((app_name, app))

        return unmounted_mfes
    return append_to_unmounted_mfes


tutor_hooks.Filters.ENV_TEMPLATE_VARIABLES.add_items(
    [
        ...
        ("get_unmounted_mfes", get_unmounted_mfes()),
    ]
)

That leads us to this template:

{%- set unmounted_mfes = [] %}

{%- for app_name, app in iter_mfes() %}
{%- set mounts = iter_mounts(MOUNTS, app_name)|list %}
{%- set unmounted_mfes = get_unmounted_mfes(mounts, app_name, app) %}  ---> here I add this line
{%- if mounts %}
{{ app_name }}: # Work on this MFE for development
...
{%- endif %}
{%- endfor %}



{% if unmounted_mfes|length > 0 %}
mfe:
   ports:
       {%- for app_name, app in unmounted_mfes %}
       - {{ app["port"] }}:8002 # {{ app_name }}
       {%- endfor %}
{% endif %}

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have re-arranged the code in the patch.

Copy link
Contributor

@regisb regisb Jan 14, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not a big fan of this pattern, as it moves too much declarative code to the Jinja templates. This is not a great practice. Instead, I suggest:

def get_unmounted_mfes(mounts):
    unmounted_mfes = []   
    for mfe in ...:
        if ...:
            unmounted_mfes.append(mfe)
    return unmounted_mfes

tutor_hooks.Filters.ENV_TEMPLATE_VARIABLES.add_item(
        ("get_unmounted_mfes", get_unmounted_mfes),
)

and then in the templates:

{%- set unmounted_mfes = get_unmounted_mfes(MOUNTS) %}

{%- if not iter_mounts(MOUNTS, app_name)|list %}
{%- set _ = unmounted_mfes.append((app_name, app)) %}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

shouldn't append be enough by itself? Is it necessary to set the output to _?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The set _ is necessary. Jinja does not support direct in-place modifications like Python does (list.append()), so you need to reassign the list with the new value.
https://stackoverflow.com/a/66019113

{%- endif %}
{%- endfor %}
{% if unmounted_mfes|length > 0 %}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: {% if unmounted_mfes|length > 0 %}

mfe:
ports:
{%- for app_name, app in iter_mfes() %}
{%- if not iter_mounts(MOUNTS, app_name)|list %}
- {{ app["port"] }}:8002 # {{ app_name }}
{%- endif %}
{%- endfor %}
ports:
{%- for app_name, app in unmounted_mfes %}
- {{ app["port"] }}:8002 # {{ app_name }}
{%- endfor %}
{% endif %}


{%- for app_name, app in iter_mfes() %}
{%- set mounts = iter_mounts(MOUNTS, app_name)|list %}
Expand Down
Loading