75 lines
2.5 KiB
Python
75 lines
2.5 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation; version 2 of the License.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU Library General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software
|
|
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
|
|
|
|
import fnmatch
|
|
|
|
|
|
def head_tail_split(name):
|
|
name_split = name.strip("/").split("/", 1)
|
|
if len(name_split) == 2:
|
|
head = name_split[0]
|
|
tail = name_split[1].strip("/")
|
|
else:
|
|
head, tail = name_split[0], None
|
|
return head, tail
|
|
|
|
|
|
class PathMatch(object):
|
|
def __init__(self, parent=None, desc=None):
|
|
self._patterns = {}
|
|
self._final_patterns = {}
|
|
self._values = []
|
|
|
|
def __setitem__(self, name, value):
|
|
head, tail = head_tail_split(name)
|
|
|
|
if tail is not None:
|
|
# recursion
|
|
if head not in self._patterns:
|
|
self._patterns[head] = PathMatch(parent=self, desc=head)
|
|
self._patterns[head][tail] = value
|
|
else:
|
|
if head not in self._final_patterns:
|
|
self._final_patterns[head] = PathMatch(parent=self, desc=head)
|
|
if value not in self._final_patterns[head]._values:
|
|
self._final_patterns[head]._values.append(value)
|
|
|
|
def __getitem__(self, name):
|
|
result = []
|
|
head, tail = head_tail_split(name)
|
|
for pattern in self._patterns:
|
|
if fnmatch.fnmatch(head, pattern):
|
|
if tail is None:
|
|
values = self._patterns[pattern]._values
|
|
else:
|
|
values = self._patterns[pattern][tail]
|
|
for value in values:
|
|
if value not in result:
|
|
result.append(value)
|
|
|
|
for pattern in self._final_patterns:
|
|
if tail is None:
|
|
x = head
|
|
else:
|
|
x = "%s/%s" % (head, tail)
|
|
if fnmatch.fnmatch(x, pattern):
|
|
values = self._final_patterns[pattern]._values
|
|
for value in values:
|
|
if value not in result:
|
|
result.append(value)
|
|
return result
|