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

feat: adds tutor config edit #1099

Open
wants to merge 11 commits into
base: main
Choose a base branch
from

Conversation

tecoholic
Copy link

@tecoholic tecoholic commented Jul 24, 2024

Quickly launch the default YAML editor for editing the config.yml file.

Background

As a developer working with multiple projects, I am constantly changing the tutor config and re-running the tutor dev launch to update the devstack. While it is as simple as running vim $(tutor config printroot)/config.yml, I often found myself wanting to simply express this better using tutor config edit. So this is an attempt at cross-platform solution doing the same. It might not be the best solution, but something to start with if someone else finds this useful and improves their DevEx.

Caveat: I have only tested this on Linux (both open and xdg-open works in mine, so it could be said Unix).

@click.command(name="edit", help="Edit config.yml of the current environment")
@click.pass_obj
def edit(context: Context) -> None:
config_file = os.path.join(context.root, "config.yml")
Copy link
Contributor

Choose a reason for hiding this comment

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

Use config.config_path(context.root) instead.

elif which("start"): # Windows
open_cmd = ["start", '""', config_file]
else:
click.echo(
Copy link
Contributor

Choose a reason for hiding this comment

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

This command should fail if neither open commands are available. You could for instance raise exceptions.TutorError.

tutor/commands/config.py Outdated Show resolved Hide resolved
open_cmd = ["start", '""', config_file]
else:
click.echo(
"Cannot find a way to open the editor automatically. Kindly open the file manually: "
Copy link
Contributor

Choose a reason for hiding this comment

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

Let's rephrase that along the lines of: "Failed to detect an adequate text file editor". (mode concise, no need for "kindly")

tutor/commands/config.py Outdated Show resolved Hide resolved
@tecoholic
Copy link
Author

@regisb Hi, Thanks for the review comments. I hoped to have addressed them by now. Somehow haven't found the time. I will handle the comments this week.

@kdmccormick kdmccormick removed their request for review August 9, 2024 17:14
@kdmccormick
Copy link
Collaborator

I have nothing to add beyond Regis's review--just want to say that this is a great idea and thank you for the contribution 👍🏻

@tecoholic tecoholic force-pushed the tecoholic/add-config-edit-command branch from ecf0b53 to 853e51e Compare August 12, 2024 01:06
@tecoholic tecoholic requested a review from regisb August 12, 2024 01:11
@tecoholic tecoholic force-pushed the tecoholic/add-config-edit-command branch from 853e51e to c095e45 Compare September 2, 2024 12:45
@kdmccormick
Copy link
Collaborator

Hi @tecoholic . I'm looking forward to this change! Looks like there are just a couple minor change requests left, and then we're good to merge this.

@tecoholic
Copy link
Author

@kdmccormick Hi, thanks for the ping. I was waiting on @regisb for more details about read only editor. Can we skip that scenario for now?

@regisb
Copy link
Contributor

regisb commented Sep 24, 2024

@kdmccormick I am less interested in this feature than you seem to be -- mostly because (IMHO) it doesn't bring anything more than a .bashrc alias. E.g: alias tutor-config-edit='vim "$(tutor config printroot)/env.yml"'. So I'd rather defer to you for review.

@kdmccormick kdmccormick self-requested a review September 24, 2024 13:09
Copy link
Collaborator

@kdmccormick kdmccormick left a comment

Choose a reason for hiding this comment

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

Thanks for the patience @tecoholic . If you can rebase and address these comments, I'll be happy to merge this.

tutor/commands/config.py Show resolved Hide resolved
tutor/commands/config.py Outdated Show resolved Hide resolved
tutor/commands/config.py Outdated Show resolved Hide resolved
tutor/commands/config.py Outdated Show resolved Hide resolved
@tecoholic tecoholic force-pushed the tecoholic/add-config-edit-command branch from c095e45 to 2b00211 Compare November 10, 2024 05:12
@tecoholic
Copy link
Author

@kdmccormick Thank you for your comments and your patience with this PR. I have addressed your comments to my best. Kindly take another look when you can.

Copy link
Contributor

@DawoudSheraz DawoudSheraz left a comment

Choose a reason for hiding this comment

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

Please add a changelog entry for this change.

Copy link
Collaborator

@kdmccormick kdmccormick left a comment

Choose a reason for hiding this comment

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

I tested locally, works great on Ubuntu! I also commented out the which("open") block in order to confirm that xdg-open also works.

In addition to Dawoud's request to add a changelog entry, I have just one more change request and one optional suggestion ⬇️

@@ -255,9 +259,41 @@ def patches_show(context: Context, name: str) -> None:
print(rendered)


@click.command(name="edit", help="Edit config.yml of the current environment")
Copy link
Collaborator

Choose a reason for hiding this comment

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

Optional: What do you think about adding a -s/--save flag here? If supplied, then instead of reminding the user to run tutor config save, it would just save config automatically.

Copy link
Author

Choose a reason for hiding this comment

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

This was something I thought of adding later based on user feedback. Now that you have pointed it out, I have taken it as the feeback and added 2 features I think are QOL improvments.

  1. -s automatically updating the environment after a successful save. The caveat here is "successful save". More on them below.
  2. -e to specify an editor of choice. The annoying thing about desktop systems is, installing new software somehow messes up file associations. I discovered after installing KDE that my YAML files now open in Kate Editor. Now I do tutor config edit -e (vim|emacs|..) to open the file in a specific editor.

Save caveats:

  • Sometimes, when I do :wq in Neovim (Lazyvim config), it returns a non-zero error code. This prevents the "save" from happening.
  • When the file gets opened in a GUI editor like Kate, it opens it as an independent process, instead of subprocess. So the utils.execute() returns as soon as the editor is launched instead of return after the editor is closed. So, the environment is updated with config before editing.

Copy link
Collaborator

Choose a reason for hiding this comment

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

Thank you for spelling out those caveats.

Sometimes, when I do :wq in Neovim (Lazyvim config), it returns a non-zero error code. This prevents the "save" from happening.

Could you catch this error, and if --save was provided, warn the user that the editor exited non-zero and thus their config changes were not applied?

When the file gets opened in a GUI editor like Kate, it opens it as an independent process, instead of subprocess. So the utils.execute() returns as soon as the editor is launched instead of return after the editor is closed. So, the environment is updated with config before editing.

Ah, this one is a bit worrying. Visual editors often will accept a flag that blocks the command until the editor is exited, e.g. subl --wait for Sublime Text. That would be useful for this particular scenario, e.g.,:

tutor config edit -s -e 'subl --wait'

This will fail with your current code, but could be fixed by running shlex.split on the -e argument.

All that said, with all details and nuances that these new flags make us consider, I feel that we are delaying the tutor config edit feature more than we need to. It would be nice to have the base command Sumac. @tecoholic how would you feel about omitting -s and -e for now, and opening a follow-up PR to add them?

Copy link
Author

@tecoholic tecoholic Dec 3, 2024

Choose a reason for hiding this comment

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

@kdmccormick Thanks for taking another look. I agree with your assessment about the flags being a bit suboptimal. That's the reason, I initially only considered them as future improvements.

So, I will roll back those bits and leave the bare command alone in this PR.

tutor/commands/config.py Outdated Show resolved Hide resolved
@tecoholic tecoholic force-pushed the tecoholic/add-config-edit-command branch from 00565bb to d3cd4c0 Compare November 14, 2024 02:32
@tecoholic
Copy link
Author

tecoholic commented Nov 14, 2024

@kdmccormick Thank you for the feedback. I added a changelog entry, new options -s and -e (explanation here), made the messages a bit more verbose. Kindly take a look.

@tecoholic
Copy link
Author

@DawoudSheraz I have addressed your comments about the docs and updated the PR.

Comment on lines 314 to 320
click.echo(
click.style(
"💡 You can automatically update the environment after editing by setting the flag -s.\n"
"e.g., `tutor config edit -s`",
fg="blue",
)
)
Copy link
Collaborator

Choose a reason for hiding this comment

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

Since the command's helptext already explains this, and we do not want to overwhelm the user with information, I don't think this message is necessary.

Suggested change
click.echo(
click.style(
"💡 You can automatically update the environment after editing by setting the flag -s.\n"
"e.g., `tutor config edit -s`",
fg="blue",
)
)

@@ -255,9 +259,41 @@ def patches_show(context: Context, name: str) -> None:
print(rendered)


@click.command(name="edit", help="Edit config.yml of the current environment")
Copy link
Collaborator

Choose a reason for hiding this comment

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

Thank you for spelling out those caveats.

Sometimes, when I do :wq in Neovim (Lazyvim config), it returns a non-zero error code. This prevents the "save" from happening.

Could you catch this error, and if --save was provided, warn the user that the editor exited non-zero and thus their config changes were not applied?

When the file gets opened in a GUI editor like Kate, it opens it as an independent process, instead of subprocess. So the utils.execute() returns as soon as the editor is launched instead of return after the editor is closed. So, the environment is updated with config before editing.

Ah, this one is a bit worrying. Visual editors often will accept a flag that blocks the command until the editor is exited, e.g. subl --wait for Sublime Text. That would be useful for this particular scenario, e.g.,:

tutor config edit -s -e 'subl --wait'

This will fail with your current code, but could be fixed by running shlex.split on the -e argument.

All that said, with all details and nuances that these new flags make us consider, I feel that we are delaying the tutor config edit feature more than we need to. It would be nice to have the base command Sumac. @tecoholic how would you feel about omitting -s and -e for now, and opening a follow-up PR to add them?

@tecoholic
Copy link
Author

@kdmccormick Updated the PR with simpler version.

P.S: I left a reply to the comment in the review. But, it doesn't show up here. So, adding a note here, just in case.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
Status: In review
Development

Successfully merging this pull request may close these issues.

4 participants