Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
f656618
Add version of xdg_mime module
mhalano Apr 17, 2025
68f99c0
Fix xdg_mime_get since the command is different
mhalano Apr 17, 2025
2bac2c3
Add query parameter
mhalano Apr 19, 2025
8ad12d8
Fix order of parameters
mhalano Apr 19, 2025
652c959
Add myself to BOTMETA
mhalano Apr 19, 2025
dc73fb5
Add unit tests
mhalano Apr 19, 2025
4404de3
Fix the way we deal when there is no handler set
mhalano Apr 19, 2025
b112e41
Improve documentation
mhalano Apr 19, 2025
c04754b
Remove unused import
mhalano Apr 19, 2025
a67b389
Fix documentation
mhalano Apr 19, 2025
28324cb
Strip xdg-mime from version string
mhalano Apr 20, 2025
73ec66b
Fix information about version
mhalano Apr 20, 2025
f3167ca
Add error message sample
mhalano Apr 20, 2025
3ca5472
Add test to invalid handler
mhalano Apr 20, 2025
2de85db
Add support to multiple mime-types
mhalano Apr 21, 2025
9fce2db
Change the output parameter from handlers to handler
mhalano Apr 21, 2025
cec924c
Change tests related to multiple mime-type support
mhalano Apr 21, 2025
3abf43b
Small fixes
mhalano Apr 21, 2025
3892076
Stop using constant to enable changed state
mhalano Apr 21, 2025
3efd313
Add before_handlers and after_handlers
mhalano Apr 21, 2025
324dbee
Change tests to use before and after structures
mhalano Apr 21, 2025
80f94a9
Add a stronger message about using a non-installed handler
mhalano Apr 21, 2025
e3f5063
Manage some edge cases
mhalano Apr 21, 2025
2b1b834
Change error message to match the new value
mhalano Apr 21, 2025
9cd43ce
Add some fixes
mhalano Apr 21, 2025
610a4a3
Change some tests
mhalano Apr 21, 2025
b7d8ecc
Update plugins/modules/xdg_mime.py
mhalano Apr 21, 2025
bfe6e97
Remove a blank line
mhalano Apr 21, 2025
22e7e8d
Remove single quote
mhalano Apr 21, 2025
53357c4
Add xdg-mime to the version in the mocks
mhalano Apr 21, 2025
fc76766
Remove after_handlers and make code simpler
mhalano Apr 21, 2025
4465d07
Update tests to work without after_handlers
mhalano Apr 21, 2025
cf72cdd
Remove diff_params and clean output_params
mhalano Apr 21, 2025
47519ed
Make mime_type plural since it supports multiple items
mhalano Apr 21, 2025
10773de
Move the handler check to module init
mhalano Apr 21, 2025
3192ca8
Use anchors in the test to make yaml simpler
mhalano Apr 21, 2025
3c54db7
Update plugins/modules/xdg_mime.py
mhalano Apr 21, 2025
38795d5
Update plugins/modules/xdg_mime.py
mhalano Apr 21, 2025
2485af1
Update plugins/modules/xdg_mime.py
mhalano Apr 21, 2025
7cc3b85
Update plugins/modules/xdg_mime.py
mhalano Apr 21, 2025
1fb3b30
Update plugins/modules/xdg_mime.py
mhalano Apr 21, 2025
4ba456a
Update plugins/modules/xdg_mime.py
mhalano Apr 21, 2025
5301bee
Update plugins/modules/xdg_mime.py
mhalano Apr 21, 2025
0315a4d
Update plugins/modules/xdg_mime.py
mhalano Apr 21, 2025
c4266f0
Update plugins/modules/xdg_mime.py
mhalano Apr 21, 2025
b5664bc
Update plugins/modules/xdg_mime.py
mhalano Apr 21, 2025
8cf32c0
Add blank line to separe examples
mhalano Apr 23, 2025
20ad429
Update plugins/modules/xdg_mime.py
mhalano Apr 22, 2025
0c78dc7
Add a small homage to my late grandma
mhalano Apr 23, 2025
6c745c1
Update plugins/modules/xdg_mime.py
mhalano Apr 23, 2025
3421953
Fix pep8 problem with the homage
mhalano Apr 23, 2025
d9cfe4b
Remove trailing whitespace
mhalano Apr 23, 2025
1371c45
Update plugins/modules/xdg_mime.py
mhalano Apr 23, 2025
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
4 changes: 4 additions & 0 deletions .github/BOTMETA.yml
Original file line number Diff line number Diff line change
Expand Up @@ -417,6 +417,8 @@ files:
$module_utils/wdc_redfish_utils.py:
labels: wdc_redfish_utils
maintainers: $team_wdc
$module_utils/xdg_mime.py:
maintainers: mhalano
$module_utils/xenserver.py:
labels: xenserver
maintainers: bvitnik
Expand Down Expand Up @@ -1445,6 +1447,8 @@ files:
maintainers: dinoocch the-maldridge
$modules/xcc_:
maintainers: panyy3 renxulei
$modules/xdg_mime.py:
maintainers: mhalano
$modules/xenserver_:
maintainers: bvitnik
$modules/xenserver_facts.py:
Expand Down
36 changes: 36 additions & 0 deletions plugins/module_utils/xdg_mime.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2025, Marcos Alano <marcoshalano@gmail.com>
# Based on gio_mime module. Copyright (c) 2022, Alexei Znamensky <russoz@gmail.com>
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
# SPDX-License-Identifier: GPL-3.0-or-later

from __future__ import absolute_import, division, print_function
__metaclass__ = type

from ansible_collections.community.general.plugins.module_utils.cmd_runner import CmdRunner, cmd_runner_fmt


def xdg_mime_runner(module, **kwargs):
return CmdRunner(
module,
command=['xdg-mime'],
arg_formats=dict(
default=cmd_runner_fmt.as_fixed('default'),
query=cmd_runner_fmt.as_fixed('query'),
mime_types=cmd_runner_fmt.as_list(),
handler=cmd_runner_fmt.as_list(),
version=cmd_runner_fmt.as_fixed('--version'),
),
**kwargs
)


def xdg_mime_get(runner, mime_type):
def process(rc, out, err):
if not out.strip():
return None
out = out.splitlines()[0]
return out.split()[-1]

with runner("query default mime_types", output_process=process) as ctx:
return ctx.run(mime_types=mime_type)
144 changes: 144 additions & 0 deletions plugins/modules/xdg_mime.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,144 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
# Copyright (c) 2025, Marcos Alano <marcoshalano@gmail.com>
# Based on gio_mime module. Copyright (c) 2022, Alexei Znamensky <russoz@gmail.com>
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
# SPDX-License-Identifier: GPL-3.0-or-later

# In memory: This code is dedicated to my late grandmother, Maria Marlene. 1936-2025. Rest in peace, grandma.
# -Marcos Alano-

# TODO: Add support for diff mode

from __future__ import absolute_import, division, print_function
__metaclass__ = type

DOCUMENTATION = r"""
module: xdg_mime
author:
- "Marcos Alano (@mhalano)"
short_description: Set default handler for MIME types, for applications using XDG tools
version_added: 10.7.0
description:
- This module allows configuring the default handler for specific MIME types when you use applications that rely on XDG.
extends_documentation_fragment:
- community.general.attributes
attributes:
check_mode:
support: full
diff_mode:
support: none
options:
mime_types:
description:
- One or more MIME types for which a default handler will be set.
type: list
elements: str
required: true
handler:
description:
- Sets the default handler for the specified MIME types.
- The desktop file must be installed in the system.
If the desktop file is not installed, the module
does not fail, but the handler is not set either.
- You must pass a handler in the form V(*.desktop), otherwise the module fails.
type: str
required: true
notes:
- This module is a thin wrapper around C(xdg-mime) tool.
- See man xdg-mime(1) for more details.
seealso:
- name: C(xdg-mime) command manual page
description: Manual page for the command.
link: https://portland.freedesktop.org/doc/xdg-mime.html
- name: xdg-utils Documentation
description: Reference documentation for xdg-utils.
link: https://www.freedesktop.org/wiki/Software/xdg-utils/
"""

EXAMPLES = r"""
- name: Set Chrome as the default handler for HTTPS
community.general.xdg_mime:
mime_types: x-scheme-handler/https
handler: google-chrome.desktop
register: result

- name: Set Chrome as the default handler for both HTTP and HTTPS
community.general.xdg_mime:
mime_types:
- x-scheme-handler/http
- x-scheme-handler/https
handler: google-chrome.desktop
register: result
"""

RETURN = r"""
current_handlers:
description:
- Currently set handlers for the passed MIME types.
returned: success
type: list
elements: str
sample:
- google-chrome.desktop
- firefox.desktop
version:
description: Version of the C(xdg-mime) tool.
type: str
returned: always
sample: "1.2.1"
"""

from ansible_collections.community.general.plugins.module_utils.module_helper import ModuleHelper
from ansible_collections.community.general.plugins.module_utils.xdg_mime import xdg_mime_runner, xdg_mime_get


class XdgMime(ModuleHelper):
output_params = ['handler']

module = dict(
argument_spec=dict(
mime_types=dict(type='list', elements='str', required=True),
handler=dict(type='str', required=True),
),
supports_check_mode=True,
)
use_old_vardict = False

def __init_module__(self):
self.runner = xdg_mime_runner(self.module, check_rc=True)

with self.runner("version") as ctx:
rc, out, err = ctx.run()
self.vars.version = out.replace("xdg-mime ", "").strip()

if not self.vars.handler.endswith(".desktop"):
self.do_raise(msg="Handler must be a .desktop file")

self.vars.current_handlers = []
for mime in self.vars.mime_types:
handler_value = xdg_mime_get(self.runner, mime)
if not handler_value:
handler_value = ''
self.vars.current_handlers.append(handler_value)

def __run__(self):
check_mode_return = (0, 'Module executed in check mode', '')

if any(h != self.vars.handler for h in self.vars.current_handlers):
self.changed = True

if self.has_changed():
with self.runner.context(args_order="default handler mime_types", check_mode_skip=True, check_mode_return=check_mode_return) as ctx:
rc, out, err = ctx.run()
self.vars.stdout = out
self.vars.stderr = err
self.vars.set("run_info", ctx.run_info, verbosity=1)


def main():
XdgMime.execute()


if __name__ == '__main__':
main()
15 changes: 15 additions & 0 deletions tests/unit/plugins/modules/test_xdg_mime.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2025, Marcos Alano <marcoshalano@gmail.com>
# Based on gio_mime module. Copyright (c) 2022, Alexei Znamensky <russoz@gmail.com>
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
# SPDX-License-Identifier: GPL-3.0-or-later

from __future__ import (absolute_import, division, print_function)
__metaclass__ = type


from ansible_collections.community.general.plugins.modules import xdg_mime
from .uthelper import UTHelper, RunCommandMock


UTHelper.from_module(xdg_mime, __name__, mocks=[RunCommandMock])
89 changes: 89 additions & 0 deletions tests/unit/plugins/modules/test_xdg_mime.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2025, Marcos Alano <marcoshalano@gmail.com>
# Based on gio_mime module. Copyright (c) 2022, Alexei Znamensky <russoz@gmail.com>
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
# SPDX-License-Identifier: GPL-3.0-or-later

# TODO: add tests for setting multiple mime types at once
---
anchors:
environ: &env-def {environ_update: {LANGUAGE: C, LC_ALL: C}, check_rc: true}
input: &input
mime_types: x-scheme-handler/http
handler: google-chrome.desktop
get_version: &get_version
command: [/testbin/xdg-mime, --version]
environ: *env-def
rc: 0
out: "xdg-mime 1.2.1\n"
err: ''
query_mime_type: &query_mime_type
command: [/testbin/xdg-mime, query, default, x-scheme-handler/http]
environ: *env-def
rc: 0
out: ''
err: ''
set_handler: &set_handler
command: [/testbin/xdg-mime, default, google-chrome.desktop, x-scheme-handler/http]
environ: *env-def
rc: 0
out: ''
err: ''
test_cases:
- id: test_set_handler
input: *input
output:
current_handlers: ['']
changed: true
mocks:
run_command:
- *get_version
- *query_mime_type
- *set_handler
- id: test_set_handler_check
input: *input
output:
current_handlers: ['google-chrome.desktop']
changed: false
flags:
check: true
mocks:
run_command:
- *get_version
- <<: *query_mime_type
out: |
google-chrome.desktop
- id: test_set_handler_idempot
input: *input
output:
current_handlers: ['google-chrome.desktop']
changed: false
mocks:
run_command:
- *get_version
- <<: *query_mime_type
out: |
google-chrome.desktop
- id: test_set_handler_idempot_check
input: *input
output:
current_handlers: ['google-chrome.desktop']
changed: false
flags:
check: true
mocks:
run_command:
- *get_version
- <<: *query_mime_type
out: |
google-chrome.desktop
- id: test_set_invalid_handler
input:
<<: *input
handler: google-chrome.desktopX
output:
failed: true
msg: Handler must be a .desktop file
mocks:
run_command:
- *get_version