Implement mime.get_mime_parents using python
This is the only method pending implemented in c, then we can remove seven files previously used. Add a test for a corner case untested previously Signed-off-by: Gonzalo Odiard <godiard@sugarlabs.org>
This commit is contained in:
parent
faa0d42084
commit
b02ade879a
@ -29,8 +29,6 @@ from gi.repository import GLib
|
|||||||
from gi.repository import GdkPixbuf
|
from gi.repository import GdkPixbuf
|
||||||
from gi.repository import Gio
|
from gi.repository import Gio
|
||||||
|
|
||||||
from gi.repository import SugarExt
|
|
||||||
|
|
||||||
_ = lambda msg: gettext.dgettext('sugar-toolkit-gtk3', msg)
|
_ = lambda msg: gettext.dgettext('sugar-toolkit-gtk3', msg)
|
||||||
|
|
||||||
GENERIC_TYPE_TEXT = 'Text'
|
GENERIC_TYPE_TEXT = 'Text'
|
||||||
@ -50,6 +48,9 @@ def _get_supported_image_mime_types():
|
|||||||
|
|
||||||
_extensions = {}
|
_extensions = {}
|
||||||
_globs_timestamps = []
|
_globs_timestamps = []
|
||||||
|
_subclasses = {}
|
||||||
|
_subclasses_timestamps = []
|
||||||
|
|
||||||
_generic_types = [{
|
_generic_types = [{
|
||||||
'id': GENERIC_TYPE_TEXT,
|
'id': GENERIC_TYPE_TEXT,
|
||||||
'name': _('Text'),
|
'name': _('Text'),
|
||||||
@ -159,13 +160,42 @@ def get_mime_description(mime_type):
|
|||||||
|
|
||||||
|
|
||||||
def get_mime_parents(mime_type):
|
def get_mime_parents(mime_type):
|
||||||
return SugarExt.mime_list_mime_parents(mime_type)
|
global _subclasses
|
||||||
|
global _subclasses_timestamps
|
||||||
|
|
||||||
|
dirs = _get_mime_data_directories()
|
||||||
|
|
||||||
|
timestamps = []
|
||||||
|
subclasses_path_list = []
|
||||||
|
for f in dirs:
|
||||||
|
subclasses_path = os.path.join(f, 'mime', 'subclasses')
|
||||||
|
try:
|
||||||
|
mtime = os.stat(subclasses_path).st_mtime
|
||||||
|
timestamps.append([subclasses_path, mtime])
|
||||||
|
subclasses_path_list.append(subclasses_path)
|
||||||
|
except OSError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
if timestamps != _subclasses_timestamps:
|
||||||
|
_subclasses = {}
|
||||||
|
for subclasses_path in subclasses_path_list:
|
||||||
|
with open(subclasses_path) as parents_file:
|
||||||
|
for line in parents_file:
|
||||||
|
subclass, parent = line.split()
|
||||||
|
if subclass not in _subclasses.keys():
|
||||||
|
_subclasses[subclass] = [parent]
|
||||||
|
else:
|
||||||
|
_subclasses[subclass].append(parent)
|
||||||
|
|
||||||
|
_subclasses_timestamps = timestamps
|
||||||
|
|
||||||
|
if mime_type in _subclasses.keys():
|
||||||
|
return _subclasses[mime_type]
|
||||||
|
else:
|
||||||
|
return []
|
||||||
|
|
||||||
|
|
||||||
def get_primary_extension(mime_type):
|
def _get_mime_data_directories():
|
||||||
global _extensions
|
|
||||||
global _globs_timestamps
|
|
||||||
|
|
||||||
dirs = []
|
dirs = []
|
||||||
|
|
||||||
if 'XDG_DATA_HOME' in os.environ:
|
if 'XDG_DATA_HOME' in os.environ:
|
||||||
@ -177,6 +207,14 @@ def get_primary_extension(mime_type):
|
|||||||
dirs.extend(os.environ['XDG_DATA_DIRS'].split(':'))
|
dirs.extend(os.environ['XDG_DATA_DIRS'].split(':'))
|
||||||
else:
|
else:
|
||||||
dirs.extend(['/usr/local/share/', '/usr/share/'])
|
dirs.extend(['/usr/local/share/', '/usr/share/'])
|
||||||
|
return dirs
|
||||||
|
|
||||||
|
|
||||||
|
def get_primary_extension(mime_type):
|
||||||
|
global _extensions
|
||||||
|
global _globs_timestamps
|
||||||
|
|
||||||
|
dirs = _get_mime_data_directories()
|
||||||
|
|
||||||
timestamps = []
|
timestamps = []
|
||||||
globs_path_list = []
|
globs_path_list = []
|
||||||
|
@ -35,6 +35,10 @@ class TestMime(unittest.TestCase):
|
|||||||
self.assertListEqual(mime.get_mime_parents("image/svg+xml"),
|
self.assertListEqual(mime.get_mime_parents("image/svg+xml"),
|
||||||
["application/xml"])
|
["application/xml"])
|
||||||
|
|
||||||
|
# If the mime type don't have parents, should return a empty array
|
||||||
|
self.assertListEqual(mime.get_mime_parents("application/octet-stream"),
|
||||||
|
[])
|
||||||
|
|
||||||
def test_get_for_file(self):
|
def test_get_for_file(self):
|
||||||
self.assertEqual(mime.get_for_file(os.path.join(data_dir, "mime.svg")),
|
self.assertEqual(mime.get_for_file(os.path.join(data_dir, "mime.svg")),
|
||||||
'image/svg+xml')
|
'image/svg+xml')
|
||||||
|
Loading…
Reference in New Issue
Block a user