Description: <short summary of the patch>
 TODO: Put a short summary on the line above and replace this paragraph
 with a longer explanation of this change. Complete the meta-information
 with other relevant fields (see below for details). To make it easier, the
 information below has been extracted from the changelog. Adjust it or drop
 it.
 .
 pyxdg (0.26-3.0antix1) unstable; urgency=medium
 .
   * Upstream upload to fix duplicate menus
Author: anticapitalista <antix@operamail.com>

---
The information above should follow the Patch Tagging Guidelines, please
checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here
are templates for supplementary fields that you might want to add:

Origin: <vendor|upstream|other>, <url of original patch>
Bug: <url in upstream bugtracker>
Bug-Debian: https://bugs.debian.org/<bugnumber>
Bug-Ubuntu: https://launchpad.net/bugs/<bugnumber>
Forwarded: <no|not-needed|url proving that it has been forwarded>
Reviewed-By: <name and email of someone who approved the patch>
Last-Update: 2020-12-04

--- pyxdg-0.26.orig/test/fuzz-mime.py
+++ pyxdg-0.26/test/fuzz-mime.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 """Run this manually to test xdg.Mime.get_type2 against all files in a directory.
 
 Syntax: ./fuzz-mime.py /dir/to/test/
--- /dev/null
+++ pyxdg-0.26/test/menu-spec/menutest.py
@@ -0,0 +1,41 @@
+#! /usr/bin/env python3
+# coding=utf8
+"""
+Script to run the xdg menu-spec tests:
+$ git clone git://anongit.freedesktop.org/xdg/xdg-specs
+$ cd xdg-specs/menu/tests
+$ MENUTEST="/path/to/pyxdg/test/menu-spec/menutest.py" ./menutest
+"""
+
+from __future__ import print_function
+import os
+import sys
+
+
+__dir__ = os.path.dirname(os.path.abspath(__file__))
+sys.path.insert(0, '{}/../../'.format(__dir__))
+
+
+from xdg.Menu import XMLMenuBuilder, Menu, MenuEntry
+
+
+def print_directory(directory):
+    for entry in directory.getEntries():
+        if isinstance(entry, Menu):
+            print_directory(entry)
+        elif isinstance(entry, MenuEntry):
+            print_entry(entry, directory.getPath())
+
+
+def print_entry(entry, menupath):
+    filepath = entry.DesktopEntry.getFileName()
+    id = entry.DesktopFileID
+    menupath = menupath
+    print('{}/\t{}\t{}'.format(menupath, id, filepath))
+
+
+if __name__ == "__main__":
+    builder = XMLMenuBuilder()
+    root = builder.parse()
+    print_directory(root)
+    sys.exit(0)
--- pyxdg-0.26.orig/test/resources.py
+++ pyxdg-0.26/test/resources.py
@@ -4,6 +4,8 @@ written out to temporary files for the r
 """
 from __future__ import unicode_literals
 
+import sys
+
 # With additions from firefox.desktop, to test locale & unicode support
 gedit_desktop = """[Desktop Entry]
 Name=gedit
@@ -73,12 +75,12 @@ Type=Application
 
 # TryExec that should exist
 python_desktop = """[Desktop Entry]
-Name=Python 3
+Name=Python
 Comment=Dynamic programming language
-Exec=python3
-TryExec=python3
+Exec=%s
+TryExec=%s
 Type=Application
-"""
+""" % (sys.executable, sys.executable)
 
 recently_used = """<?xml version="1.0"?>
 <RecentFiles>
@@ -448,6 +450,46 @@ kde_legacy_menu = """<!DOCTYPE Menu PUBL
 </Menu>
 """
 
+layout_menu = """<!DOCTYPE Menu PUBLIC "-//freedesktop//DTD Menu 1.0//EN"
+ "http://www.freedesktop.org/standards/menu-spec/1.0/menu.dtd">
+<Menu>
+
+  <Name>Layout</Name>
+  <DefaultLayout show_empty="true">
+    <Merge type="menus"/>
+    <Merge type="files"/>
+    <Separator/>
+    <Menuname>More</Menuname>
+  </DefaultLayout>
+
+  <Menu>
+    <Name>More</Name>
+  </Menu>
+
+  <Menu>
+    <Name>Games</Name>
+    <Layout>
+      <Menuname>Steam</Menuname>
+      <Separator/>
+      <Merge type="menus"/>
+    </Layout>
+    <Menu>
+      <Name>Action</Name>
+    </Menu>
+    <Menu>
+      <Name>Steam</Name>
+    </Menu>
+    <Menu>
+      <Name>Arcade</Name>
+    </Menu>
+  </Menu>
+
+  <Menu>
+    <Name>Accessories</Name>
+  </Menu>
+</Menu>
+"""
+
 mime_globs2_a = """#globs2 MIME data file
 55:text/x-diff:*.patch
 50:text/x-c++src:*.C:cs
--- pyxdg-0.26.orig/test/test-desktop.py
+++ pyxdg-0.26/test/test-desktop.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/env python3
 # coding: utf-8
 from xdg.DesktopEntry import DesktopEntry
 from xdg.Exceptions import ValidationError, ParsingError, NoKeyError
@@ -51,9 +51,9 @@ class DesktopEntryTest(unittest.TestCase
     def test_values(self):
         entry = DesktopEntry(self.test_file)
         self.assertEqual(entry.getName(), 'gedit')
-        #self.assertEqual(entry.getGenericName(), 'Text Editor')
+        self.assertEqual(entry.getGenericName(), 'Text Editor')
         self.assertEqual(entry.getNoDisplay(), False)
-        #self.assertEqual(entry.getComment(), 'Edit text files')
+        self.assertEqual(entry.getComment(), 'Edit text files')
         self.assertEqual(entry.getIcon(), 'accessories-text-editor')
         self.assertEqual(entry.getHidden(), False)
         self.assertEqual(entry.getOnlyShowIn(), [])
--- pyxdg-0.26.orig/test/test-icon.py
+++ pyxdg-0.26/test/test-icon.py
@@ -1,10 +1,14 @@
-#!/usr/bin/python
+#!/usr/bin/env python3
 from xdg.IconTheme import IconTheme, getIconPath, getIconData
 import tempfile, shutil, os
 import unittest
 
 import resources
 
+example_dir = os.path.join(os.path.dirname(__file__), 'example')
+def example_file(filename):
+    return os.path.join(example_dir, filename)
+
 class IconThemeTest(unittest.TestCase):
     def test_find_icon_exists(self):
         print("Finding an icon that probably exists:")
@@ -16,7 +20,7 @@ class IconThemeTest(unittest.TestCase):
     
     def test_validate_icon_theme(self):
         theme = IconTheme()
-        theme.parse("/usr/share/icons/hicolor/index.theme")
+        theme.parse(example_file("index.theme"))
         theme.validate()
 
 class IconDataTest(unittest.TestCase):
--- pyxdg-0.26.orig/test/test-inifile.py
+++ pyxdg-0.26/test/test-inifile.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/env python3
 # coding: utf-8
 from xdg import IniFile
 from xdg.util import u
--- pyxdg-0.26.orig/test/test-menu.py
+++ pyxdg-0.26/test/test-menu.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/env python3
 from __future__ import print_function
 
 import io
@@ -27,35 +27,62 @@ def show_menu(menu, depth = 0):
             print(depth*"-" + "\x1b[01m" + entry.Name + "\x1b[0m")
     depth -= 1
 
+def entry_names(entries):
+    names = []
+    for entry in entries:
+        if isinstance(entry, xdg.Menu.Menu):
+            names.append(entry.getName())
+        elif isinstance(entry, xdg.Menu.MenuEntry):
+            names.append(entry.DesktopEntry.getName())
+        elif isinstance(entry, xdg.Menu.Separator):
+            names.append("---")
+        elif isinstance(entry, xdg.Menu.Header):
+            names.append(entry.Name)
+    return names
+
 class MenuTest(unittest.TestCase):
     def setUp(self):
         self.tmpdir = tempfile.mkdtemp()
         self.test_file = os.path.join(self.tmpdir, "applications.menu")
         with open(self.test_file, "w") as f:
             f.write(resources.applications_menu)
-    
+
     def tearDown(self):
         shutil.rmtree(self.tmpdir)
-    
+
     def test_parse_menu(self):
         menu = xdg.Menu.parse(self.test_file)
         show_menu(menu)
-        
+
         # Check these don't throw an error
         menu.getName()
         menu.getGenericName()
         menu.getComment()
         menu.getIcon()
-    
+
+    def test_parse_layout(self):
+        test_file = os.path.join(self.tmpdir, "layout.menu")
+        with io.open(test_file, "w") as f:
+            f.write(resources.layout_menu)
+        menu = xdg.Menu.parse(test_file)
+        show_menu(menu)
+
+        assert len(menu.Entries) == 4
+        assert entry_names(menu.Entries) == ["Accessories", "Games", "---", "More"]
+
+        games_menu = menu.getMenu("Games")
+        assert len(games_menu.Entries) == 4
+        assert entry_names(games_menu.Entries) == ["Steam", "---", "Action", "Arcade"]
+
     def test_unicode_menuentry(self):
         test_file = os.path.join(self.tmpdir, "unicode.desktop")
         with io.open(test_file, 'w', encoding='utf-8') as f:
             f.write(resources.unicode_desktop)
-        
+
         entry = xdg.Menu.MenuEntry(test_file)
         assert entry == entry
         assert not entry < entry
-    
+
     def test_empty_legacy_dirs(self):
         legacy_dir = os.path.join(self.tmpdir, "applnk")
         os.mkdir(legacy_dir)
@@ -64,22 +91,26 @@ class MenuTest(unittest.TestCase):
         test_file = os.path.join(self.tmpdir, "legacy.menu")
         with open(test_file, "w") as f:
             f.write(resources.legacy_menu.replace("legacy_dir", legacy_dir))
-        
+
         menu = xdg.Menu.parse(test_file)
-        
+
         # The menu should be empty besides the root named "Legacy"
         show_menu(menu)
-        
+
         assert len(menu.Entries) == 0
-    
+
     def test_kde_legacy_dirs(self):
         """This was failing on systems which didn't have kde-config installed.
         We just check that parsing doesn't throw an error.
-        
+
         See fd.o bug #56426.
         """
         test_file = os.path.join(self.tmpdir, "kde_legacy.menu")
         with open(test_file, "w") as f:
             f.write(resources.kde_legacy_menu)
-        
+
         menu = xdg.Menu.parse(test_file)
+
+
+if __name__ == '__main__':
+    unittest.main()
--- pyxdg-0.26.orig/test/test-mime.py
+++ pyxdg-0.26/test/test-mime.py
@@ -73,11 +73,10 @@ class MimeTest(MimeTestBase):
         self.check_mimetype(mystery_exe, 'application', 'executable')
         
         # Symlink
-        print("test-mime.py::test_get_type: skip symlink tests")
-        #self.check_mimetype(Mime.get_type(example_file("png_symlink")),
-        #                            'image', 'png')
-        #self.check_mimetype(Mime.get_type(example_file("png_symlink"), follow=False),
-        #                            'inode', 'symlink')
+        self.check_mimetype(Mime.get_type(example_file("png_symlink")),
+                                    'image', 'png')
+        self.check_mimetype(Mime.get_type(example_file("png_symlink"), follow=False),
+                                    'inode', 'symlink')
 
     def test_get_type2(self):
         # File that doesn't exist - use the name
@@ -114,11 +113,10 @@ class MimeTest(MimeTestBase):
         self.check_mimetype(mystery_exe, 'application', 'executable')
         
         # Symlink
-        print("test-mime.py::test_get_type2: skip symlink tests")
-        #self.check_mimetype(Mime.get_type2(example_file("png_symlink")),
-        #                            'image', 'png')
-        #self.check_mimetype(Mime.get_type2(example_file("png_symlink"), follow=False),
-        #                            'inode', 'symlink')
+        self.check_mimetype(Mime.get_type2(example_file("png_symlink")),
+                                    'image', 'png')
+        self.check_mimetype(Mime.get_type2(example_file("png_symlink"), follow=False),
+                                    'inode', 'symlink')
     
     def test_lookup(self):
         pdf1 = Mime.lookup("application/pdf")
--- pyxdg-0.26.orig/xdg/IniFile.py
+++ pyxdg-0.26/xdg/IniFile.py
@@ -8,7 +8,6 @@ from xdg.Exceptions import (ParsingError
                             debug)
 import xdg.Locale
 from xdg.util import u
-import gettext
 
 def is_ascii(s):
     """Return True if a string consists entirely of ASCII characters."""
@@ -23,7 +22,6 @@ class IniFile:
     fileExtension = ''
 
     filename = ''
-    gettext_domain = None
 
     tainted = False
 
@@ -58,38 +56,37 @@ class IniFile:
                 return
 
         # parse file
-        for line in fd:
-            line = line.strip()
-            # empty line
-            if not line:
-                continue
-            # comment
-            elif line[0] == '#':
-                continue
-            # new group
-            elif line[0] == '[':
-                currentGroup = line.lstrip("[").rstrip("]")
-                if debug and self.hasGroup(currentGroup):
-                    raise DuplicateGroupError(currentGroup, filename)
-                else:
-                    content[currentGroup] = {}
-            # key
-            else:
-                try:
-                    key, value = line.split("=", 1)
-                except ValueError:
-                    raise ParsingError("Invalid line: " + line, filename)
-                
-                key = key.strip() # Spaces before/after '=' should be ignored
-                try:
-                    if debug and self.hasKey(key, currentGroup):
-                        raise DuplicateKeyError(key, currentGroup, filename)
+        with fd:
+            for line in fd:
+                line = line.strip()
+                # empty line
+                if not line:
+                    continue
+                # comment
+                elif line[0] == '#':
+                    continue
+                # new group
+                elif line[0] == '[':
+                    currentGroup = line.lstrip("[").rstrip("]")
+                    if debug and self.hasGroup(currentGroup):
+                        raise DuplicateGroupError(currentGroup, filename)
                     else:
-                        content[currentGroup][key] = value.strip()
-                except (IndexError, UnboundLocalError):
-                    raise ParsingError("Parsing error on key, group missing", filename)
-
-        fd.close()
+                        content[currentGroup] = {}
+                # key
+                else:
+                    try:
+                        key, value = line.split("=", 1)
+                    except ValueError:
+                        raise ParsingError("Invalid line: " + line, filename)
+
+                    key = key.strip() # Spaces before/after '=' should be ignored
+                    try:
+                        if debug and self.hasKey(key, currentGroup):
+                            raise DuplicateKeyError(key, currentGroup, filename)
+                        else:
+                            content[currentGroup][key] = value.strip()
+                    except (IndexError, UnboundLocalError):
+                        raise ParsingError("Parsing error on key, group missing", filename)
 
         self.filename = filename
         self.tainted = False
@@ -103,11 +100,6 @@ class IniFile:
             else:
                 raise ParsingError("[%s]-Header missing" % headers[0], filename)
 
-        # check for gettext domain
-        e = self.content.get('Desktop Entry', {})
-        self.gettext_domain = e.get('X-GNOME-Gettext-Domain',
-            e.get('X-Ubuntu-Gettext-Domain', None))
-
     # start stuff to access the keys
     def get(self, key, group=None, locale=False, type="string", list=False, strict=False):
         # set default group
@@ -117,12 +109,7 @@ class IniFile:
         # return key (with locale)
         if (group in self.content) and (key in self.content[group]):
             if locale:
-                key = self.__addLocale(key, group)
-                if key.endswith(']') or not self.gettext_domain:
-                    # inline translations
-                    value = self.content[group][key]
-                else:
-                    value = gettext.dgettext(self.gettext_domain, self.content[group][key])
+                value = self.content[group][self.__addLocale(key, group)]
             else:
                 value = self.content[group][key]
         else:
--- pyxdg-0.26.orig/xdg/Menu.py
+++ pyxdg-0.26/xdg/Menu.py
@@ -21,6 +21,7 @@ import os
 import locale
 import subprocess
 import ast
+import sys
 try:
     import xml.etree.cElementTree as etree
 except ImportError:
@@ -35,6 +36,17 @@ import xdg.Locale
 import xdg.Config
 
 
+def _ast_const(name):
+    if sys.version_info >= (3, 4):
+        name = ast.literal_eval(name)
+        if sys.version_info >= (3, 8):
+            return ast.Constant(name)
+        else:
+            return ast.NameConstant(name)
+    else:
+        return ast.Name(id=name, ctx=ast.Load())
+
+
 def _strxfrm(s):
     """Wrapper around locale.strxfrm that accepts unicode strings on Python 2.
 
@@ -298,11 +310,11 @@ class Menu:
                     entry.Show = NO_EXEC
                     self.Visible -= 1
                 elif xdg.Config.windowmanager:
-                    if (entry.DesktopEntry.OnlyShowIn != [] and (
-                            xdg.Config.windowmanager not in entry.DesktopEntry.OnlyShowIn
+                    if (entry.DesktopEntry.getOnlyShowIn() != [] and (
+                            xdg.Config.windowmanager not in entry.DesktopEntry.getOnlyShowIn()
                         )
                     ) or (
-                        xdg.Config.windowmanager in entry.DesktopEntry.NotShowIn
+                        xdg.Config.windowmanager in entry.DesktopEntry.getNotShowIn()
                     ):
                         entry.Show = NOT_SHOW_IN
                         self.Visible -= 1
@@ -611,17 +623,8 @@ class XMLMenuBuilder(object):
             filename = _get_menu_file_path(filename)
         # use default if no filename given
         if not filename:
-            # Upstream's default, we leave it as default in case someone
-            # produces their own applications.menu and is depending on it.
             candidate = os.environ.get('XDG_MENU_PREFIX', '') + "applications.menu"
             filename = _get_menu_file_path(candidate)
-            # Since applications.menu isn't provided in Debian, we'll fallback
-            # to debian.menu, typically in /etc/xdg/menus/debian-menu.menu
-            # (Closes: #654978)
-            if not filename:
-                candidate = os.environ.get('XDG_MENU_PREFIX', '') + \
-                                           "debian-menu.menu"
-                filename = _get_menu_file_path(candidate)
         if not filename:
             raise ParsingError('File not found', "/etc/xdg/menus/%s" % candidate)
         # check if it is a .menu file
@@ -719,11 +722,12 @@ class XMLMenuBuilder(object):
             inline_header=_to_bool(node.attrib.get("inline_header", True)),
             inline_alias=_to_bool(node.attrib.get("inline_alias", False))
         )
+        order = []
         for child in node:
             tag, text = child.tag, child.text
             text = text.strip() if text else None
             if tag == "Menuname" and text:
-                layout.order.append([
+                order.append([
                     "Menuname",
                     text,
                     _to_bool(child.attrib.get("show_empty", False)),
@@ -733,14 +737,15 @@ class XMLMenuBuilder(object):
                     _to_bool(child.attrib.get("inline_alias", False))
                 ])
             elif tag == "Separator":
-                layout.order.append(['Separator'])
+                order.append(['Separator'])
             elif tag == "Filename" and text:
-                layout.order.append(["Filename", text])
+                order.append(["Filename", text])
             elif tag == "Merge":
-                layout.order.append([
+                order.append([
                     "Merge",
                     child.attrib.get("type", "all")
                 ])
+        layout.order = order
         return layout
 
     def parse_move(self, node):
@@ -763,7 +768,7 @@ class XMLMenuBuilder(object):
         if expr:
             tree.body = expr
         else:
-            tree.body = ast.Name('False', ast.Load())
+            tree.body = _ast_const('False')
         ast.fix_missing_locations(tree)
         return Rule(type, tree)
 
@@ -790,7 +795,7 @@ class XMLMenuBuilder(object):
             expr = self.parse_bool_op(node, ast.Or())
             return ast.UnaryOp(ast.Not(), expr) if expr else None
         elif tag == 'All':
-            return ast.Name('True', ast.Load())
+            return _ast_const('True')
         elif tag == 'Category':
             category = node.text
             return ast.Compare(
@@ -1003,8 +1008,8 @@ class XMLMenuBuilder(object):
                     menuentry = MenuEntry(directory, dir)
                     if not menu.Directory:
                         menu.Directory = menuentry
-                    elif menuentry.Type == MenuEntry.TYPE_SYSTEM:
-                        if menu.Directory.Type == MenuEntry.TYPE_USER:
+                    elif menuentry.getType() == MenuEntry.TYPE_SYSTEM:
+                        if menu.Directory.getType() == MenuEntry.TYPE_USER:
                             menu.Directory.Original = menuentry
             if menu.Directory:
                 break
--- pyxdg-0.26.orig/xdg/MenuEditor.py
+++ pyxdg-0.26/xdg/MenuEditor.py
@@ -54,7 +54,7 @@ class MenuEditor(object):
         try:
             self.tree = etree.parse(self.filename)
         except IOError:
-            root = etree.fromtring("""
+            root = etree.fromstring("""
 <!DOCTYPE Menu PUBLIC "-//freedesktop//DTD Menu 1.0//EN" "http://standards.freedesktop.org/menu-spec/menu-1.0.dtd">
     <Menu>
         <Name>Applications</Name>
--- pyxdg-0.26.orig/xdg/Mime.py
+++ pyxdg-0.26/xdg/Mime.py
@@ -749,14 +749,16 @@ def install_mime_info(application, packa
     file with the same name (if the contents are different)"""
     application += '.xml'
 
-    new_data = open(package_file).read()
+    with open(package_file) as f:
+        new_data = f.read()
 
     # See if the file is already installed
     package_dir = os.path.join('mime', 'packages')
     resource = os.path.join(package_dir, application)
     for x in BaseDirectory.load_data_paths(resource):
         try:
-            old_data = open(x).read()
+            with open(x) as f:
+                old_data = f.read()
         except:
             continue
         if old_data == new_data:
@@ -770,7 +772,8 @@ def install_mime_info(application, packa
     new_file = os.path.join(BaseDirectory.save_data_path(package_dir), application)
 
     # Write the file...
-    open(new_file, 'w').write(new_data)
+    with open(new_file, 'w') as f:
+        f.write(new_data)
 
     # Update the database...
     command = 'update-mime-database'
--- pyxdg-0.26.orig/xdg/RecentFiles.py
+++ pyxdg-0.26/xdg/RecentFiles.py
@@ -71,28 +71,27 @@ class RecentFiles:
         elif not filename:
             filename = self.filename
 
-        f = open(filename, "w")
-        fcntl.lockf(f, fcntl.LOCK_EX)
-        f.write('<?xml version="1.0"?>\n')
-        f.write("<RecentFiles>\n")
+        with open(filename, "w") as f:
+            fcntl.lockf(f, fcntl.LOCK_EX)
+            f.write('<?xml version="1.0"?>\n')
+            f.write("<RecentFiles>\n")
 
-        for r in self.RecentFiles:
-            f.write("  <RecentItem>\n")
-            f.write("    <URI>%s</URI>\n" % xml.sax.saxutils.escape(r.URI))
-            f.write("    <Mime-Type>%s</Mime-Type>\n" % r.MimeType)
-            f.write("    <Timestamp>%s</Timestamp>\n" % r.Timestamp)
-            if r.Private == True:
-                f.write("    <Private/>\n")
-            if len(r.Groups) > 0:
-                f.write("    <Groups>\n")
-                for group in r.Groups:
-                    f.write("      <Group>%s</Group>\n" % group)
-                f.write("    </Groups>\n")
-            f.write("  </RecentItem>\n")
+            for r in self.RecentFiles:
+                f.write("  <RecentItem>\n")
+                f.write("    <URI>%s</URI>\n" % xml.sax.saxutils.escape(r.URI))
+                f.write("    <Mime-Type>%s</Mime-Type>\n" % r.MimeType)
+                f.write("    <Timestamp>%s</Timestamp>\n" % r.Timestamp)
+                if r.Private == True:
+                    f.write("    <Private/>\n")
+                if len(r.Groups) > 0:
+                    f.write("    <Groups>\n")
+                    for group in r.Groups:
+                        f.write("      <Group>%s</Group>\n" % group)
+                    f.write("    </Groups>\n")
+                f.write("  </RecentItem>\n")
 
-        f.write("</RecentFiles>\n")
-        fcntl.lockf(f, fcntl.LOCK_UN)
-        f.close()
+            f.write("</RecentFiles>\n")
+            fcntl.lockf(f, fcntl.LOCK_UN)
 
     def getFiles(self, mimetypes=None, groups=None, limit=0):
         """Get a list of recently used files.
--- pyxdg-0.26.orig/xdg/__init__.py
+++ pyxdg-0.26/xdg/__init__.py
@@ -1,3 +1,3 @@
 __all__ = [ "BaseDirectory", "DesktopEntry", "Menu", "Exceptions", "IniFile", "IconTheme", "Locale", "Config", "Mime", "RecentFiles", "MenuEditor" ]
 
-__version__ = "0.26"
+__version__ = "0.27"
