mirror of
https://github.com/novoid/filetags.git
synced 2026-02-16 22:04:15 +00:00
added contains tag, adding tag, and removing tag functions
This commit is contained in:
parent
aecb5b4ed7
commit
b8039e2d7c
2 changed files with 157 additions and 5 deletions
112
filetag.py
112
filetag.py
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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'
|
||||
|
|
|
|||
Loading…
Reference in a new issue