From 4d42c84ddb85114a14681ad1d99c837b27df9fc1 Mon Sep 17 00:00:00 2001 From: Carsten Tinggaard Date: Sun, 2 Nov 2008 15:19:49 +0000 Subject: [PATCH] Implemented Set-Get simple functions included test bzr-revno: 70 --- openlp/song/song.py | 287 +++++++++++++++++++++++++--- openlp/song/test/test_song_basic.py | 97 +++++++++- openlp/song/test/test_song_verse.py | 110 +++++++++++ 3 files changed, 467 insertions(+), 27 deletions(-) create mode 100644 openlp/song/test/test_song_verse.py diff --git a/openlp/song/song.py b/openlp/song/song.py index 19bd6e339..a66c4b9f5 100644 --- a/openlp/song/song.py +++ b/openlp/song/song.py @@ -18,17 +18,23 @@ Place, Suite 330, Boston, MA 02111-1307 USA import sys import os +from types import StringType, ListType, NoneType + sys.path.append(os.path.abspath("./../..")) from openlp.core.xmlrootclass import XmlRootClass -class SongException(Exception): - pass +class SongException(Exception): + pass class SongTitleError(SongException): pass - -blankSongXml = \ + +class SongTypeError(SongException): + pass + + +_blankSongXml = \ ''' BlankSong @@ -38,7 +44,7 @@ blankSongXml = \ 1 1 - 1 + 1 1 @@ -57,32 +63,33 @@ class Song(XmlRootClass) : """Initialize from given xml content xmlContent (string) -- xml formatted string - - attributes - title -- title of the song - searchableTitle -- title without punctuation chars - authorList -- list of authors - songCcliNo -- CCLI number for this song - copyright -- copyright string - showTitle -- 0: no show, 1: show - showAuthorList -- 0: no show, 1: show - showCopyright -- 0: no show, 1: show - showCcliNo -- 0: no show, 1: show - theme -- name of theme or blank - categoryArray -- list of user defined properties (hymn, gospel) - songBook -- name of originating book - songNumber -- number of the song, related to a songbook - comments -- free comment - verseOrder -- presentation order of the slides - lyrics -- simple or formatted (tbd) + + title -- title of the song + searchableTitle -- title without punctuation chars + authorList -- list of authors + songCcliNo -- CCLI number for this song + copyright -- copyright string + showTitle -- 0: no show, 1: show + showAuthorList -- 0: no show, 1: show + showCopyright -- 0: no show, 1: show + showSongCcliNo -- 0: no show, 1: show + theme -- name of theme or blank + categoryArray -- list of user defined properties (hymn, gospel) + songBook -- name of originating book + songNumber -- number of the song, related to a songbook + comments -- free comment + verseOrder -- presentation order of the slides + lyrics -- simple or formatted (tbd) """ super(Song, self).__init__() self._reset() + if xmlContent != None : + self._setFromXml(xmlContent, "Song") def _reset(self): """Reset all song attributes""" - global blankSongXml - self._setFromXml(blankSongXml, "Song") + global _blankSongXml + self._setFromXml(_blankSongXml, "Song") def _RemovePunctuation(self, title): """Remove the puntuation chars from title @@ -135,4 +142,234 @@ class Song(XmlRootClass) : f.close() self.FromText(textList) + def _assureString(self, s): + """Force a string is returned""" + if s == None : + r = "" + else : + r = str(s) + return r + + def _splitToList(self, aString): + """Split a string into a list - comma separated""" + res = [] + if aString != None : + lst = aString.split(',') + for l in lst : + # remove whitespace + res.append(l.strip()) + return res + + def _listToString(self, strOrList): + """Force a possibly list into a string""" + if type(strOrList) == StringType : + lst = self._splitToList(strOrList) + elif type(strOrList) == ListType : + lst = strOrList + elif type(strOrList) == NoneType : + lst = [] + else : + raise SongTypeError("Variable not String or List") + s = ", ".join(lst) + return s + + def GetCopyright(self): + """Return copyright info string""" + return self._assureString(self.copyright) + + def SetCopyright(self, copyright): + """Set the copyright string""" + self.copyright = copyright + + def GetSongCcliNo(self): + """Return the songCclino""" + return self._assureString(self.songCcliNo) + + def SetSongCcliNo(self, songCcliNo): + """Set the songCcliNo""" + self.songCcliNo = songCcliNo + + def GetTheme(self): + """Return the theme name for the song""" + return self._assureString(self.theme) + + def SetTheme(self, theme): + """Set the theme name (string)""" + self.theme = theme + + def GetSongBook(self): + """Return the songBook (string)""" + return self._assureString(self.songBook) + + def SetSongBook(self, songBook): + """Set the songBook (string)""" + self.songBook = songBook + + def GetSongNumber(self): + """Return the songNumber (string)""" + return self._assureString(self.songNumber) + + def SetSongNumber(self, songNumber): + """Set the songNumber (string)""" + self.songNumber = songNumber + + def GetComments(self): + """Return the comments (string)""" + return self._assureString(self.comments) + + def SetComments(self, comments): + """Set the comments (string)""" + self.comments = comments + + def GetVerseOrder(self): + """Get the verseOrder (string) - preferably space delimited""" + return self._assureString(self.verseOrder) + + def SetVerseOrder(self, verseOrder): + """Set the verseOrder (string) - space delimited""" + self.verseOrder = verseOrder + + def GetAuthorList(self, asOneString = True): + """Return the list of authors as a string + + asOneString + True -- string: + "John Newton, A Parker" + False -- list of strings + ["John Newton", "A Parker"] + """ + if asOneString : + res = self._assureString(self.authorList) + else : + res = self._splitToList(self.authorList) + return res + + def SetAuthorList(self, authorList): + """Set the authorList + + authorList -- a string or list of strings + """ + if authorList == None : + self.authorList = None + else : + self.authorList = self._listToString(authorList) + + def GetCategoryArray(self, asOneString = True): + """Return the list of categories as a string + + asOneString + True -- string: + "Hymn, Gospel" + False -- list of strings + ["Hymn", "Gospel"] + """ + if asOneString : + res = self._assureString(self.categoryArray) + else : + res = self._splitToList(self.categoryArray) + return res + + def SetCategoryArray(self, categoryArray): + """Set the categoryArray + + categoryArray -- a string or list of strings + """ + if categoryArray == None : + self.categoryArray = None + else : + self.categoryArray = self._listToString(categoryArray) + + def GetShowTitle(self): + """Return the showTitle flag (bool)""" + return self.showTitle + + def SetShowTitle(self, showTitle): + """Set the showTitle flag (bool)""" + self.showTitle = showTitle + + def GetShowAuthorList(self): + """Return the showAuthorList flag""" + return self.showAuthorList + + def SetShowAuthorList(self, showAuthorList): + """Set the showAuthorList flag (bool)""" + self.showAuthorList = showAuthorList + + def GetShowCopyright(self): + """Return the showCopyright flag""" + return self.showCopyright + + def SetShowCopyright(self, showCopyright): + """Set the showCopyright flag (bool)""" + self.showCopyright = showCopyright + + def GetShowSongCcliNo(self): + """Return the showSongCclino (string)""" + return self.showSongCcliNo + + def SetShowSongCcliNo(self, showSongCcliNo): + """Set the showSongCcliNo flag (bool)""" + self.showSongCcliNo = showSongCcliNo + + def GetLyrics(self): + """Return the lyrics as a list of strings + + this will return all the strings in the song + """ + return self.lyrics + + def SetLyrics(self, lyrics): + """Set the lyrics as a list of strings""" + # TODO: check font formatting + self.lyrics = lyrics + + def GetNumberOfVerses(self): + """Return the number of verses in the song (int)""" + numOfVerses = 0 + # + return numOfVerses + + def GetPreviewVerse(self, verseNumber): + """Return the preview text for specified verse number + + verseNumber -- 0: all verses, 1..n : specific verse + a list of strings are returned + """ + return [] + + def GetRenderVerse(self, verseNumber): + """Return the verse to be rendered including the additional + properties + + Returns a list as: + [theme (string), + title (string), + authorlist (string), + copyright (string), + cclino (string), + lyric-verse as a list of strings] + """ + res = [] + res.append(self.GetTheme()) + if self.showTitle : + title = self.GetTitle() + else : + title = "" + res.append(title) + if self.showAuthorList : + author = self.GetAuthorList(True) + else : + author = "" + res.append(author) + if self.showCopyright : + cpright = self.GetCopyright() + else : + cpright = "" + res.append(cpright) + if self.showSongCcliNo : + ccli = self.GetSongCcliNo() + else : + ccli = "" + res.append(ccli) + return res diff --git a/openlp/song/test/test_song_basic.py b/openlp/song/test/test_song_basic.py index 084245596..70e10a5b9 100644 --- a/openlp/song/test/test_song_basic.py +++ b/openlp/song/test/test_song_basic.py @@ -38,8 +38,7 @@ class Test_Basic(object): s = Song() r = s.__str__() l = r.split("\n") - #print r - assert(len(l) == 21) + assert(len(l) == 52) def test_asString(self): """Init: Empty asString - initial values""" @@ -84,3 +83,97 @@ class Test_Basic(object): s = Song() py.test.raises(SongTitleError, s.SetTitle, ",*") + def test_Copyright(self): + """Set a copyright string""" + s = Song() + assert(s.GetCopyright() == "") + s.SetCopyright("A B Car") + assert(s.GetCopyright() == "A B Car") + + def test_SongCclino(self): + """Set a SongCcliNo""" + s = Song() + assert(s.GetSongCcliNo() == "") + s.SetSongCcliNo(12345) + assert(s.GetSongCcliNo() == "12345") + + def test_SongBook(self): + """Set a songbook value""" + s = Song() + assert(s.GetSongBook() == "") + s.SetSongBook("Hymns") + assert(s.GetSongBook() == "Hymns") + + def test_SongNumber(self): + """Set a song number""" + s = Song() + assert(s.GetSongNumber() == "") + s.SetSongNumber(278) + assert(s.GetSongNumber() == "278") + + def test_Theme(self): + """Set a theme name""" + s = Song() + assert(s.GetTheme() == "") + s.SetTheme("Red") + assert(s.GetTheme() == "Red") + + def test_VerseOrder(self): + """Set a verse order""" + s = Song() + assert(s.GetVerseOrder() == "") + s.SetVerseOrder("V1 C V2") + assert(s.GetVerseOrder() == "V1 C V2") + + def test_Comments(self): + """Set a comment""" + s = Song() + assert(s.GetComments() == "") + s.SetComments("a comment") + assert(s.GetComments() == "a comment") + + def test_AuthorList(self): + """Set author lists""" + s = Song() + assert(s.GetAuthorList(True) == "") + assert(s.GetAuthorList(False) == []) + t1 = "John Newton" + s.SetAuthorList(t1) + assert(s.GetAuthorList(True) == t1) + assert(s.GetAuthorList(False) == [t1]) + s.SetAuthorList(" Peter Done , John Newton") + assert(s.GetAuthorList(True)== "Peter Done, John Newton") + assert(s.GetAuthorList(False) == ["Peter Done", "John Newton"]) + s.SetAuthorList(None) + assert(s.GetAuthorList(True) == "") + assert(s.GetAuthorList(False) == []) + s.SetAuthorList("") + assert(s.GetAuthorList(True) == "") + assert(s.GetAuthorList(False) == [""]) + s.SetAuthorList([]) + assert(s.GetAuthorList(True) == "") + assert(s.GetAuthorList(False) == [""]) + + def test_CategoryArray(self): + """Set categories""" + s = Song() + assert(s.GetCategoryArray(True) == "") + assert(s.GetCategoryArray(False) == []) + t1 = "Gospel" + s.SetCategoryArray(t1) + assert(s.GetCategoryArray(True) == t1) + assert(s.GetCategoryArray(False) == [t1]) + s.SetCategoryArray(" Gospel, Hymns ") + assert(s.GetCategoryArray(True) == "Gospel, Hymns") + assert(s.GetCategoryArray(False) == ["Gospel", "Hymns"]) + s.SetCategoryArray(None) + assert(s.GetCategoryArray(True) == "") + assert(s.GetCategoryArray(False) == []) + s.SetCategoryArray("") + assert(s.GetCategoryArray(True) == "") + assert(s.GetCategoryArray(False) == [""]) + s.SetCategoryArray([]) + assert(s.GetCategoryArray(True) == "") + assert(s.GetCategoryArray(False) == [""]) + + \ No newline at end of file diff --git a/openlp/song/test/test_song_verse.py b/openlp/song/test/test_song_verse.py new file mode 100644 index 000000000..fcdff3d0d --- /dev/null +++ b/openlp/song/test/test_song_verse.py @@ -0,0 +1,110 @@ +""" +OpenLP - Open Source Lyrics Projection +Copyright (c) 2008 Raoul Snyman +Portions copyright (c) 2008 Carsten Tinggaard + +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 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 py.test +import os +import sys +sys.path.append(os.path.abspath("./../../..")) + +from openlp.song import * + +class Test_Verse(object): + """Class for testing verses for preview and review""" + + def stdSong(self): + """Definition of a standard song""" + s = Song() + self.title = "A song" + self.author = "John Newton" + self.copyright = "Peter Hamil" + self.ccli = "123456" + s.SetLyrics(["# verse","a single line"]) + s.SetTitle(self.title) + s.SetCopyright(self.copyright) + s.SetAuthorList(self.author) + s.SetSongCcliNo(self.ccli) + return s + + def check_allfields(self, r, isblank = 0): + #[theme, title, author, cpright, ccli, lyrics] + if isblank == 1 : + assert(r[1] == "") + else : + assert(r[1] == self.title) + if isblank == 2 : + assert(r[2] == "") + else : + assert(r[2] == self.author) + if isblank == 3 : + assert(r[3] == "") + else : + assert(r[3] == self.copyright) + if isblank == 4 : + assert(r[4] == "") + else : + assert(r[4] == self.ccli) + + + def test_title_show_noshow(self): + """Test the show title flag""" + s = self.stdSong() + r = s.GetRenderVerse(1) + self.check_allfields(r) + s.SetShowTitle(False) + r = s.GetRenderVerse(1) + self.check_allfields(r, 1) + s.SetShowTitle(True) + r = s.GetRenderVerse(1) + self.check_allfields(r) + + def test_author_show_noshow(self): + """Test the show author flag""" + s = self.stdSong() + r = s.GetRenderVerse(1) + self.check_allfields(r) + s.SetShowAuthorList(False) + r = s.GetRenderVerse(1) + self.check_allfields(r, 2) + s.SetShowAuthorList(True) + r = s.GetRenderVerse(1) + self.check_allfields(r) + + def test_copyright_show_noshow(self): + """Test the show copyright flag""" + s = self.stdSong() + r = s.GetRenderVerse(1) + self.check_allfields(r) + s.SetShowCopyright(False) + r = s.GetRenderVerse(1) + self.check_allfields(r, 3) + s.SetShowCopyright(True) + r = s.GetRenderVerse(1) + self.check_allfields(r) + + def test_ccli_show_noshow(self): + """Test the show copyright flag""" + s = self.stdSong() + r = s.GetRenderVerse(1) + self.check_allfields(r) + s.SetShowSongCcliNo(False) + r = s.GetRenderVerse(1) + self.check_allfields(r, 4) + s.SetShowSongCcliNo(True) + r = s.GetRenderVerse(1) + self.check_allfields(r) + \ No newline at end of file