added contains tag, adding tag, and removing tag functions

This commit is contained in:
Karl Voit 2013-05-14 18:22:37 +02:00
parent aecb5b4ed7
commit b8039e2d7c
2 changed files with 157 additions and 5 deletions

View file

@ -1,6 +1,6 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Time-stamp: <2013-05-09 17:40:38 vk>
# Time-stamp: <2013-05-14 18:20:58 vk>
## TODO:
## * fix parts marked with «FIXXME»
@ -22,11 +22,13 @@ import logging
from optparse import OptionParser
## debugging: for setting a breakpoint: pdb.set_trace()
#import pdb
import pdb
PROG_VERSION_NUMBER = u"0.1"
PROG_VERSION_DATE = u"2013-05-09"
INVOCATION_TIME = time.strftime("%Y-%m-%dT%H:%M:%S", time.gmtime())
FILENAME_TAG_SEPARATOR = u' -- '
BETWEEN_TAG_SEPARATOR = u' '
USAGE = u"\n\
" + sys.argv[0] + u"\n\
@ -41,7 +43,12 @@ https://github.com/novoid/FIXXME\n\
## file names containing tags matches following regular expression
FILE_WITH_TAGS_REGEX = re.compile(".* -- (.*).(.*)$")
FILE_WITH_TAGS_REGEX = re.compile("(.*)" + FILENAME_TAG_SEPARATOR + "(.*)\.(.*)$")
FILE_WITH_TAGS_REGEX_FILENAME_INDEX = 1 ## component.group(1)
FILE_WITH_TAGS_REGEX_TAGLIST_INDEX = 2
FILE_WITH_TAGS_REGEX_EXTENSION_INDEX = 3
FILE_WITH_EXTENSION_REGEX = re.compile("(.*)\.(.*)$")
@ -92,6 +99,105 @@ def error_exit(errorcode, text):
sys.exit(errorcode)
def contains_tag(filename, tagname=False):
"""
Returns true if tagname is a tag within filename. If tagname is
empty, return if filename contains any tag at all.
@param filename: an unicode string containing a file name
@param tagname: (optional) an unicode string containing a tag name
@param return: True|False
"""
assert filename.__class__ == str or \
filename.__class__ == unicode
if tagname:
assert tagname.__class__ == str or \
tagname.__class__ == unicode
components = re.match(FILE_WITH_TAGS_REGEX, filename)
if not tagname:
return components!=None
elif not components:
logging.debug("file [%s] does not match FILE_WITH_TAGS_REGEX" % filename)
return False
else:
tags = components.group(FILE_WITH_TAGS_REGEX_TAGLIST_INDEX).split(BETWEEN_TAG_SEPARATOR)
return tagname in tags
def adding_tag_to_filename(filename, tagname):
"""
Returns string of file name with tagname as additional tag.
@param filename: an unicode string containing a file name
@param tagname: an unicode string containing a tag name
@param return: an unicode string of filename containing tagname
"""
assert filename.__class__ == str or \
filename.__class__ == unicode
assert tagname.__class__ == str or \
tagname.__class__ == unicode
if contains_tag(filename) == False:
logging.debug("adding_tag_to_filename(%s, %s): no tag found so far" % (filename, tagname))
components = re.match(FILE_WITH_EXTENSION_REGEX, filename)
old_filename = components.group(1)
extension = components.group(2)
return old_filename + FILENAME_TAG_SEPARATOR + tagname + u'.' + extension
elif contains_tag(filename, tagname):
logging.debug("adding_tag_to_filename(%s, %s): tag already found in filename" % (filename, tagname))
return filename
else:
logging.debug("adding_tag_to_filename(%s, %s): add as additional tag to existing list of tags" % \
(filename, tagname))
components = re.match(FILE_WITH_EXTENSION_REGEX, filename)
old_filename = components.group(1)
extension = components.group(2)
return old_filename + BETWEEN_TAG_SEPARATOR + tagname + u'.' + extension
def removing_tag_from_filename(filename, tagname):
"""
Returns string of file name with tagname removed as tag.
@param filename: an unicode string containing a file name
@param tagname: an unicode string containing a tag name
@param return: an unicode string of filename without tagname
"""
if not contains_tag(filename, tagname):
return filename
components = re.match(FILE_WITH_TAGS_REGEX, filename)
if not components:
logging.debug("file [%s] does not match FILE_WITH_TAGS_REGEX" % filename)
return filename
else:
tags = components.group(FILE_WITH_TAGS_REGEX_TAGLIST_INDEX).split(BETWEEN_TAG_SEPARATOR)
old_filename = components.group(FILE_WITH_TAGS_REGEX_FILENAME_INDEX)
extension = components.group(FILE_WITH_TAGS_REGEX_EXTENSION_INDEX)
if len(tags) < 2:
logging.debug("given tagname is the only tag -> remove all tags and FILENAME_TAG_SEPARATOR as well")
return old_filename + u'.' + extension
else:
## still tags left
return old_filename + FILENAME_TAG_SEPARATOR + \
BETWEEN_TAG_SEPARATOR.join([tag for tag in tags if tag != tagname]) + \
u'.' + extension
def query_folder(folder, list_of_files_found):
"""Walk the folder and its sub-folders and collect files matching

View file

@ -1,7 +1,8 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Time-stamp: <2013-05-09 17:41:54 vk>
# Time-stamp: <2013-05-14 18:21:24 vk>
## invoke tests using following command line:
## ~/src/vktag % PYTHONPATH="~/src/vktag:" tests/unit_tests.py --verbose
import unittest
@ -11,7 +12,52 @@ import tempfile
import os.path
from shutil import rmtree
class TestFoo(unittest.TestCase):
class TestMethods(unittest.TestCase):
def setUp(self):
pass
def test_contains_tag(self):
self.assertEqual(filetag.contains_tag(u'Some file name -- foo.jpeg', u'foo'), True)
self.assertEqual(filetag.contains_tag(u'Some file name -- foo bar.jpeg', u'foo'), True)
self.assertEqual(filetag.contains_tag(u'Some file name -- bar foo.jpeg', u'foo'), True)
self.assertEqual(filetag.contains_tag(u'Some file name -- foobar.jpeg', u'foo'), False)
self.assertEqual(filetag.contains_tag(u'Some file name -- foo.jpeg', u'bar'), False)
self.assertEqual(filetag.contains_tag(u'Some foo file name -- bar.jpeg', u'foo'), False)
## without tagname -> check if any tags are found:
self.assertEqual(filetag.contains_tag(u'Some file name -- foo.jpeg'), True)
self.assertEqual(filetag.contains_tag(u'Some file name -- foo bar.jpeg'), True)
self.assertEqual(filetag.contains_tag(u'Some file name.jpeg'), False)
def test_adding_tag_to_filename(self):
self.assertEqual(filetag.adding_tag_to_filename(u'Some file name.jpeg', u'bar'), \
u'Some file name -- bar.jpeg')
self.assertEqual(filetag.adding_tag_to_filename(u'Some file name -- foo.jpeg', u'bar'), \
u'Some file name -- foo bar.jpeg')
self.assertEqual(filetag.adding_tag_to_filename(u'Some file name -- foo.jpeg', u'foo'), \
u'Some file name -- foo.jpeg')
def test_removing_tag_from_filename(self):
self.assertEqual(filetag.removing_tag_from_filename(u'Some file name -- bar.jpeg', u'bar'), \
u'Some file name.jpeg')
self.assertEqual(filetag.removing_tag_from_filename(u'Some file name -- foo bar.jpeg', u'bar'), \
u'Some file name -- foo.jpeg')
self.assertEqual(filetag.removing_tag_from_filename(u'Some file name -- bar.jpeg', u'foo'), \
u'Some file name -- bar.jpeg')
def tearDown(self):
pass
class NO_TestFiles(unittest.TestCase):
tempdir = None
testfile_without_tags = 'file_without_tags.txt'