From 31f28a757075b5b8372abeeba1b4df8d2bd749cc Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Sun, 24 Feb 2013 19:13:50 +0100 Subject: [PATCH 01/16] fixed same short lines --- openlp/core/ui/slidecontroller.py | 14 +- openlp/plugins/songs/forms/editsongform.py | 14 +- openlp/plugins/songs/forms/editversedialog.py | 14 +- openlp/plugins/songs/forms/editverseform.py | 17 +-- openlp/plugins/songs/lib/__init__.py | 90 ++++++------- openlp/plugins/songs/lib/cclifileimport.py | 30 ++--- openlp/plugins/songs/lib/easyslidesimport.py | 12 +- openlp/plugins/songs/lib/ewimport.py | 24 ++-- .../plugins/songs/lib/foilpresenterimport.py | 36 +++--- openlp/plugins/songs/lib/mediaitem.py | 4 +- openlp/plugins/songs/lib/opensongimport.py | 19 ++- openlp/plugins/songs/lib/songbeamerimport.py | 58 ++++----- openlp/plugins/songs/lib/songimport.py | 6 +- .../plugins/songs/lib/songshowplusimport.py | 16 +-- openlp/plugins/songs/lib/sundayplusimport.py | 11 +- openlp/plugins/songs/lib/xml.py | 121 +++++++----------- 16 files changed, 216 insertions(+), 270 deletions(-) diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 84ea296d2..17c2e60fb 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -404,19 +404,19 @@ class SlideController(DisplayController): verse_type = sender_name[15:] if sender_name[:15] == u'shortcutAction_' else u'' if SONGS_PLUGIN_AVAILABLE: if verse_type == u'V': - self.current_shortcut = VerseType.TranslatedTags[VerseType.Verse] + self.current_shortcut = VerseType.translated_tags[VerseType.Verse] elif verse_type == u'C': - self.current_shortcut = VerseType.TranslatedTags[VerseType.Chorus] + self.current_shortcut = VerseType.translated_tags[VerseType.Chorus] elif verse_type == u'B': - self.current_shortcut = VerseType.TranslatedTags[VerseType.Bridge] + self.current_shortcut = VerseType.translated_tags[VerseType.Bridge] elif verse_type == u'P': - self.current_shortcut = VerseType.TranslatedTags[VerseType.PreChorus] + self.current_shortcut = VerseType.translated_tags[VerseType.PreChorus] elif verse_type == u'I': - self.current_shortcut = VerseType.TranslatedTags[VerseType.Intro] + self.current_shortcut = VerseType.translated_tags[VerseType.Intro] elif verse_type == u'E': - self.current_shortcut = VerseType.TranslatedTags[VerseType.Ending] + self.current_shortcut = VerseType.translated_tags[VerseType.Ending] elif verse_type == u'O': - self.current_shortcut = VerseType.TranslatedTags[VerseType.Other] + self.current_shortcut = VerseType.translated_tags[VerseType.Other] elif verse_type.isnumeric(): self.current_shortcut += verse_type self.current_shortcut = self.current_shortcut.upper() diff --git a/openlp/plugins/songs/forms/editsongform.py b/openlp/plugins/songs/forms/editsongform.py index f77f8d18e..501ee7eea 100644 --- a/openlp/plugins/songs/forms/editsongform.py +++ b/openlp/plugins/songs/forms/editsongform.py @@ -291,7 +291,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): verse_tags_translated = True if index is None: index = VerseType.from_tag(verse_tag) - verse[0][u'type'] = VerseType.Tags[index] + verse[0][u'type'] = VerseType.tags[index] if verse[0][u'label'] == u'': verse[0][u'label'] = u'1' verse_def = u'%s%s' % (verse[0][u'type'], verse[0][u'label']) @@ -303,7 +303,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): for count, verse in enumerate(verses): self.verseListWidget.setRowCount(self.verseListWidget.rowCount() + 1) item = QtGui.QTableWidgetItem(verse) - verse_def = u'%s%s' % (VerseType.Tags[VerseType.Verse], unicode(count + 1)) + verse_def = u'%s%s' % (VerseType.tags[VerseType.Verse], unicode(count + 1)) item.setData(QtCore.Qt.UserRole, verse_def) self.verseListWidget.setItem(count, 0, item) if self.song.verse_order: @@ -315,7 +315,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): verse_index = VerseType.from_translated_tag(verse_def[0], None) if verse_index is None: verse_index = VerseType.from_tag(verse_def[0]) - verse_tag = VerseType.TranslatedTags[verse_index].upper() + verse_tag = VerseType.translated_tags[verse_index].upper() translated.append(u'%s%s' % (verse_tag, verse_def[1:])) self.verseOrderEdit.setText(u' '.join(translated)) else: @@ -547,7 +547,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): verse_name = parts verse_num = u'1' verse_index = VerseType.from_loose_input(verse_name) - verse_tag = VerseType.Tags[verse_index] + verse_tag = VerseType.tags[verse_index] # Later we need to handle v1a as well. #regex = re.compile(r'(\d+\w.)') regex = re.compile(r'\D*(\d+)\D*') @@ -599,7 +599,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): if len(item) == 1: verse_index = VerseType.from_translated_tag(item, None) if verse_index is not None: - order.append(VerseType.Tags[verse_index] + u'1') + order.append(VerseType.tags[verse_index] + u'1') else: # it matches no verses anyway order.append(u'') @@ -609,7 +609,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): # it matches no verses anyway order.append(u'') else: - verse_tag = VerseType.Tags[verse_index] + verse_tag = VerseType.tags[verse_index] verse_num = item[1:].lower() order.append(verse_tag + verse_num) return order @@ -831,7 +831,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): ordertext = self.verseOrderEdit.text() order = [] for item in ordertext.split(): - verse_tag = VerseType.Tags[VerseType.from_translated_tag(item[0])] + verse_tag = VerseType.tags[VerseType.from_translated_tag(item[0])] verse_num = item[1:].lower() order.append(u'%s%s' % (verse_tag, verse_num)) self.song.verse_order = u' '.join(order) diff --git a/openlp/plugins/songs/forms/editversedialog.py b/openlp/plugins/songs/forms/editversedialog.py index e97a898f7..b694d046c 100644 --- a/openlp/plugins/songs/forms/editversedialog.py +++ b/openlp/plugins/songs/forms/editversedialog.py @@ -74,13 +74,13 @@ class Ui_EditVerseDialog(object): def retranslateUi(self, editVerseDialog): editVerseDialog.setWindowTitle(translate('SongsPlugin.EditVerseForm', 'Edit Verse')) self.verseTypeLabel.setText(translate('SongsPlugin.EditVerseForm', '&Verse type:')) - self.verseTypeComboBox.setItemText(VerseType.Verse, VerseType.TranslatedNames[VerseType.Verse]) - self.verseTypeComboBox.setItemText(VerseType.Chorus, VerseType.TranslatedNames[VerseType.Chorus]) - self.verseTypeComboBox.setItemText(VerseType.Bridge, VerseType.TranslatedNames[VerseType.Bridge]) - self.verseTypeComboBox.setItemText(VerseType.PreChorus, VerseType.TranslatedNames[VerseType.PreChorus]) - self.verseTypeComboBox.setItemText(VerseType.Intro, VerseType.TranslatedNames[VerseType.Intro]) - self.verseTypeComboBox.setItemText(VerseType.Ending, VerseType.TranslatedNames[VerseType.Ending]) - self.verseTypeComboBox.setItemText(VerseType.Other, VerseType.TranslatedNames[VerseType.Other]) + self.verseTypeComboBox.setItemText(VerseType.Verse, VerseType.translated_names[VerseType.Verse]) + self.verseTypeComboBox.setItemText(VerseType.Chorus, VerseType.translated_names[VerseType.Chorus]) + self.verseTypeComboBox.setItemText(VerseType.Bridge, VerseType.translated_names[VerseType.Bridge]) + self.verseTypeComboBox.setItemText(VerseType.PreChorus, VerseType.translated_names[VerseType.PreChorus]) + self.verseTypeComboBox.setItemText(VerseType.Intro, VerseType.translated_names[VerseType.Intro]) + self.verseTypeComboBox.setItemText(VerseType.Ending, VerseType.translated_names[VerseType.Ending]) + self.verseTypeComboBox.setItemText(VerseType.Other, VerseType.translated_names[VerseType.Other]) self.splitButton.setText(UiStrings().Split) self.splitButton.setToolTip(UiStrings().SplitToolTip) self.insertButton.setText(translate('SongsPlugin.EditVerseForm', '&Insert')) diff --git a/openlp/plugins/songs/forms/editverseform.py b/openlp/plugins/songs/forms/editverseform.py index 6e5c0127e..046c35c8b 100644 --- a/openlp/plugins/songs/forms/editverseform.py +++ b/openlp/plugins/songs/forms/editverseform.py @@ -82,8 +82,7 @@ class EditVerseForm(QtGui.QDialog, Ui_EditVerseDialog): def onInsertButtonClicked(self): verse_type_index = self.verseTypeComboBox.currentIndex() - self.insertVerse(VerseType.Tags[verse_type_index], - self.verseNumberBox.value()) + self.insertVerse(VerseType.tags[verse_type_index], self.verseNumberBox.value()) def onVerseTypeComboBoxChanged(self): self.updateSuggestedVerseNumber() @@ -93,12 +92,11 @@ class EditVerseForm(QtGui.QDialog, Ui_EditVerseDialog): def updateSuggestedVerseNumber(self): """ - Adjusts the verse number SpinBox in regard to the selected verse type - and the cursor's position. + Adjusts the verse number SpinBox in regard to the selected verse type and the cursor's position. """ position = self.verseTextEdit.textCursor().position() text = self.verseTextEdit.toPlainText() - verse_name = VerseType.TranslatedNames[ + verse_name = VerseType.translated_names[ self.verseTypeComboBox.currentIndex()] if not text: return @@ -120,8 +118,7 @@ class EditVerseForm(QtGui.QDialog, Ui_EditVerseDialog): verse_num = 1 self.verseNumberBox.setValue(verse_num) - def setVerse(self, text, single=False, - tag=u'%s1' % VerseType.Tags[VerseType.Verse]): + def setVerse(self, text, single=False, tag=u'%s1' % VerseType.tags[VerseType.Verse]): self.hasSingleVerse = single if single: verse_type_index = VerseType.from_tag(tag[0], None) @@ -132,7 +129,7 @@ class EditVerseForm(QtGui.QDialog, Ui_EditVerseDialog): self.insertButton.setVisible(False) else: if not text: - text = u'---[%s:1]---\n' % VerseType.TranslatedNames[VerseType.Verse] + text = u'---[%s:1]---\n' % VerseType.translated_names[VerseType.Verse] self.verseTypeComboBox.setCurrentIndex(0) self.verseNumberBox.setValue(1) self.insertButton.setVisible(True) @@ -141,12 +138,12 @@ class EditVerseForm(QtGui.QDialog, Ui_EditVerseDialog): self.verseTextEdit.moveCursor(QtGui.QTextCursor.End) def getVerse(self): - return self.verseTextEdit.toPlainText(), VerseType.Tags[self.verseTypeComboBox.currentIndex()], \ + return self.verseTextEdit.toPlainText(), VerseType.tags[self.verseTypeComboBox.currentIndex()], \ unicode(self.verseNumberBox.value()) def getVerseAll(self): text = self.verseTextEdit.toPlainText() if not text.startswith(u'---['): - text = u'---[%s:1]---\n%s' % (VerseType.TranslatedNames[VerseType.Verse], text) + text = u'---[%s:1]---\n%s' % (VerseType.translated_names[VerseType.Verse], text) return text diff --git a/openlp/plugins/songs/lib/__init__.py b/openlp/plugins/songs/lib/__init__.py index c7c24533b..93342c617 100644 --- a/openlp/plugins/songs/lib/__init__.py +++ b/openlp/plugins/songs/lib/__init__.py @@ -37,8 +37,7 @@ from ui import SongStrings WHITESPACE = re.compile(r'[\W_]+', re.UNICODE) APOSTROPHE = re.compile(u'[\'`’ʻ′]', re.UNICODE) -PATTERN = re.compile(r"\\([a-z]{1,32})(-?\d{1,10})?[ ]?|\\'" - r"([0-9a-f]{2})|\\([^a-z])|([{}])|[\r\n]+|(.)", re.I) +PATTERN = re.compile(r"\\([a-z]{1,32})(-?\d{1,10})?[ ]?|\\'([0-9a-f]{2})|\\([^a-z])|([{}])|[\r\n]+|(.)", re.I) # RTF control words which specify a "destination" to be ignored. DESTINATIONS = frozenset(( u'aftncn', u'aftnsep', u'aftnsepc', u'annotation', u'atnauthor', @@ -138,8 +137,7 @@ CHARSET_MAPPING = { class VerseType(object): """ - VerseType provides an enumeration for the tags that may be associated - with verses in songs. + VerseType provides an enumeration for the tags that may be associated with verses in songs. """ Verse = 0 Chorus = 1 @@ -149,7 +147,7 @@ class VerseType(object): Ending = 5 Other = 6 - Names = [ + names = [ u'Verse', u'Chorus', u'Bridge', @@ -157,9 +155,9 @@ class VerseType(object): u'Intro', u'Ending', u'Other'] - Tags = [name[0].lower() for name in Names] + tags = [name[0].lower() for name in names] - TranslatedNames = [ + translated_names = [ translate('SongsPlugin.VerseType', 'Verse'), translate('SongsPlugin.VerseType', 'Chorus'), translate('SongsPlugin.VerseType', 'Bridge'), @@ -167,13 +165,12 @@ class VerseType(object): translate('SongsPlugin.VerseType', 'Intro'), translate('SongsPlugin.VerseType', 'Ending'), translate('SongsPlugin.VerseType', 'Other')] - TranslatedTags = [name[0].lower() for name in TranslatedNames] + tanslated_tags = [name[0].lower() for name in translated_names] @staticmethod def translated_tag(verse_tag, default=Other): """ - Return the translated UPPERCASE tag for a given tag, - used to show translated verse tags in UI + Return the translated UPPERCASE tag for a given tag, used to show translated verse tags in UI ``verse_tag`` The string to return a VerseType for @@ -182,11 +179,11 @@ class VerseType(object): Default return value if no matching tag is found """ verse_tag = verse_tag[0].lower() - for num, tag in enumerate(VerseType.Tags): + for num, tag in enumerate(VerseType.tags): if verse_tag == tag: - return VerseType.TranslatedTags[num].upper() - if default in VerseType.TranslatedTags: - return VerseType.TranslatedTags[default].upper() + return VerseType.tanslated_tags[num].upper() + if default in VerseType.tanslated_tags: + return VerseType.tanslated_tags[default].upper() @staticmethod def translated_name(verse_tag, default=Other): @@ -200,11 +197,11 @@ class VerseType(object): Default return value if no matching tag is found """ verse_tag = verse_tag[0].lower() - for num, tag in enumerate(VerseType.Tags): + for num, tag in enumerate(VerseType.tags): if verse_tag == tag: - return VerseType.TranslatedNames[num] - if default in VerseType.TranslatedNames: - return VerseType.TranslatedNames[default] + return VerseType.translated_names[num] + if default in VerseType.translated_names: + return VerseType.translated_names[default] @staticmethod def from_tag(verse_tag, default=Other): @@ -218,7 +215,7 @@ class VerseType(object): Default return value if no matching tag is found """ verse_tag = verse_tag[0].lower() - for num, tag in enumerate(VerseType.Tags): + for num, tag in enumerate(VerseType.tags): if verse_tag == tag: return num return default @@ -235,7 +232,7 @@ class VerseType(object): Default return value if no matching tag is found """ verse_tag = verse_tag[0].lower() - for num, tag in enumerate(VerseType.TranslatedTags): + for num, tag in enumerate(VerseType.translated_tags): if verse_tag == tag: return num return default @@ -252,7 +249,7 @@ class VerseType(object): Default return value if no matching tag is found """ verse_name = verse_name.lower() - for num, name in enumerate(VerseType.Names): + for num, name in enumerate(VerseType.names): if verse_name == name.lower(): return num return default @@ -266,7 +263,7 @@ class VerseType(object): The string to return a VerseType for """ verse_name = verse_name.lower() - for num, translation in enumerate(VerseType.TranslatedNames): + for num, translation in enumerate(VerseType.translated_names): if verse_name == translation.lower(): return num @@ -296,13 +293,11 @@ class VerseType(object): def retrieve_windows_encoding(recommendation=None): """ - Determines which encoding to use on an information source. The process uses - both automated detection, which is passed to this method as a - recommendation, and user confirmation to return an encoding. + Determines which encoding to use on an information source. The process uses both automated detection, which is + passed to this method as a recommendation, and user confirmation to return an encoding. ``recommendation`` - A recommended encoding discovered programmatically for the user to - confirm. + A recommended encoding discovered programmatically for the user to confirm. """ # map chardet result to compatible windows standard code page codepage_mapping = {'IBM866': u'cp866', 'TIS-620': u'cp874', @@ -355,24 +350,22 @@ def retrieve_windows_encoding(recommendation=None): def clean_string(string): """ - Strips punctuation from the passed string to assist searching + Strips punctuation from the passed string to assist searching. """ return WHITESPACE.sub(u' ', APOSTROPHE.sub(u'', string)).lower() def clean_title(title): """ - Cleans the song title by removing Unicode control chars groups C0 & C1, - as well as any trailing spaces + Cleans the song title by removing Unicode control chars groups C0 & C1, as well as any trailing spaces. """ return CONTROL_CHARS.sub(u'', title).rstrip() def clean_song(manager, song): """ - Cleans the search title, rebuilds the search lyrics, adds a default author - if the song does not have one and other clean ups. This should always - called when a new song is added or changed. + Cleans the search title, rebuilds the search lyrics, adds a default author if the song does not have one and other + clean ups. This should always called when a new song is added or changed. ``manager`` The song's manager. @@ -397,21 +390,20 @@ def clean_song(manager, song): song.search_title = clean_string(song.title) + u'@' + clean_string(song.alternate_title) # Only do this, if we the song is a 1.9.4 song (or older). if song.lyrics.find(u'') != -1: - # Remove the old "language" attribute from lyrics tag (prior to 1.9.5). - # This is not very important, but this keeps the database clean. This - # can be removed when everybody has cleaned his songs. + # Remove the old "language" attribute from lyrics tag (prior to 1.9.5). This is not very important, but this + # keeps the database clean. This can be removed when everybody has cleaned his songs. song.lyrics = song.lyrics.replace(u'', u'') verses = SongXML().get_verses(song.lyrics) song.search_lyrics = u' '.join([clean_string(verse[1]) for verse in verses]) # We need a new and clean SongXML instance. sxml = SongXML() - # Rebuild the song's verses, to remove any wrong verse names (for - # example translated ones), which might have been added prior to 1.9.5. + # Rebuild the song's verses, to remove any wrong verse names (for example translated ones), which might have + # been added prior to 1.9.5. # List for later comparison. compare_order = [] for verse in verses: - verse_type = VerseType.Tags[VerseType.from_loose_input(verse[0][u'type'])] + verse_type = VerseType.tags[VerseType.from_loose_input(verse[0][u'type'])] sxml.add_verse_to_lyrics( verse_type, verse[0][u'label'], @@ -422,15 +414,14 @@ def clean_song(manager, song): if verse[0][u'label'] == u'1': compare_order.append(verse_type.upper()) song.lyrics = unicode(sxml.extract_xml(), u'utf-8') - # Rebuild the verse order, to convert translated verse tags, which might - # have been added prior to 1.9.5. + # Rebuild the verse order, to convert translated verse tags, which might have been added prior to 1.9.5. if song.verse_order: order = CONTROL_CHARS.sub(u'', song.verse_order).strip().split() else: order = [] new_order = [] for verse_def in order: - verse_type = VerseType.Tags[ + verse_type = VerseType.tags[ VerseType.from_loose_input(verse_def[0])] if len(verse_def) > 1: new_order.append((u'%s%s' % (verse_type, verse_def[1:])).upper()) @@ -463,16 +454,16 @@ def get_encoding(font, font_table, default_encoding, failed=False): Finds an encoding to use. Asks user, if necessary. ``font`` - The number of currently active font. + The number of currently active font. ``font_table`` - Dictionary of fonts and respective encodings. + Dictionary of fonts and respective encodings. ``default_encoding`` - The default encoding to use when font_table is empty or no font is used. + The default encoding to use when font_table is empty or no font is used. ``failed`` - A boolean indicating whether the previous encoding didn't work. + A boolean indicating whether the previous encoding didn't work. """ encoding = None if font in font_table: @@ -494,10 +485,10 @@ def strip_rtf(text, default_encoding=None): http://stackoverflow.com/questions/188545 ``text`` - RTF-encoded text, a string. + RTF-encoded text, a string. ``default_encoding`` - Default encoding to use when no encoding is specified. + Default encoding to use when no encoding is specified. """ # Current font is the font tag we last met. font = u'' @@ -589,8 +580,7 @@ def strip_rtf(text, default_encoding=None): def natcmp(a, b): """ - Natural string comparison which mimics the behaviour of Python's internal - cmp function. + Natural string comparison which mimics the behaviour of Python's internal cmp function. """ if len(a) <= len(b): for i, key in enumerate(a): diff --git a/openlp/plugins/songs/lib/cclifileimport.py b/openlp/plugins/songs/lib/cclifileimport.py index d4ad0493a..e58903b49 100644 --- a/openlp/plugins/songs/lib/cclifileimport.py +++ b/openlp/plugins/songs/lib/cclifileimport.py @@ -188,13 +188,13 @@ class CCLIFileImport(SongImport): words_list = song_words.split(u'/t') for counter in range(len(field_list)): if field_list[counter].startswith(u'Ver'): - verse_type = VerseType.Tags[VerseType.Verse] + verse_type = VerseType.tags[VerseType.Verse] elif field_list[counter].startswith(u'Ch'): - verse_type = VerseType.Tags[VerseType.Chorus] + verse_type = VerseType.tags[VerseType.Chorus] elif field_list[counter].startswith(u'Br'): - verse_type = VerseType.Tags[VerseType.Bridge] + verse_type = VerseType.tags[VerseType.Bridge] else: - verse_type = VerseType.Tags[VerseType.Other] + verse_type = VerseType.tags[VerseType.Other] check_first_verse_line = True verse_text = unicode(words_list[counter]) verse_text = verse_text.replace(u'/n', u'\n') @@ -202,15 +202,15 @@ class CCLIFileImport(SongImport): verse_lines = verse_text.split(u'\n', 1) if check_first_verse_line: if verse_lines[0].startswith(u'(PRE-CHORUS'): - verse_type = VerseType.Tags[VerseType.PreChorus] + verse_type = VerseType.tags[VerseType.PreChorus] log.debug(u'USR verse PRE-CHORUS: %s', verse_lines[0]) verse_text = verse_lines[1] elif verse_lines[0].startswith(u'(BRIDGE'): - verse_type = VerseType.Tags[VerseType.Bridge] + verse_type = VerseType.tags[VerseType.Bridge] log.debug(u'USR verse BRIDGE') verse_text = verse_lines[1] elif verse_lines[0].startswith(u'('): - verse_type = VerseType.Tags[VerseType.Other] + verse_type = VerseType.tags[VerseType.Other] verse_text = verse_lines[1] if verse_text: self.addVerse(verse_text, verse_type) @@ -292,31 +292,31 @@ class CCLIFileImport(SongImport): verse_desc_parts = clean_line.split(u' ') if len(verse_desc_parts) == 2: if verse_desc_parts[0].startswith(u'Ver'): - verse_type = VerseType.Tags[VerseType.Verse] + verse_type = VerseType.tags[VerseType.Verse] elif verse_desc_parts[0].startswith(u'Ch'): - verse_type = VerseType.Tags[VerseType.Chorus] + verse_type = VerseType.tags[VerseType.Chorus] elif verse_desc_parts[0].startswith(u'Br'): - verse_type = VerseType.Tags[VerseType.Bridge] + verse_type = VerseType.tags[VerseType.Bridge] else: # we need to analyse the next line for # verse type, so set flag - verse_type = VerseType.Tags[VerseType.Other] + verse_type = VerseType.tags[VerseType.Other] check_first_verse_line = True verse_number = verse_desc_parts[1] else: - verse_type = VerseType.Tags[VerseType.Other] + verse_type = VerseType.tags[VerseType.Other] verse_number = 1 verse_start = True else: # check first line for verse type if check_first_verse_line: if line.startswith(u'(PRE-CHORUS'): - verse_type = VerseType.Tags[VerseType.PreChorus] + verse_type = VerseType.tags[VerseType.PreChorus] elif line.startswith(u'(BRIDGE'): - verse_type = VerseType.Tags[VerseType.Bridge] + verse_type = VerseType.tags[VerseType.Bridge] # Handle all other misc types elif line.startswith(u'('): - verse_type = VerseType.Tags[VerseType.Other] + verse_type = VerseType.tags[VerseType.Other] else: verse_text = verse_text + line check_first_verse_line = False diff --git a/openlp/plugins/songs/lib/easyslidesimport.py b/openlp/plugins/songs/lib/easyslidesimport.py index 36ffbeb63..e45edfcb0 100644 --- a/openlp/plugins/songs/lib/easyslidesimport.py +++ b/openlp/plugins/songs/lib/easyslidesimport.py @@ -175,12 +175,12 @@ class EasySlidesImport(SongImport): # if the regions are inside verses regionsInVerses = (regions and regionlines[regionlines.keys()[0]] > 1) MarkTypes = { - u'CHORUS': VerseType.Tags[VerseType.Chorus], - u'VERSE': VerseType.Tags[VerseType.Verse], - u'INTRO': VerseType.Tags[VerseType.Intro], - u'ENDING': VerseType.Tags[VerseType.Ending], - u'BRIDGE': VerseType.Tags[VerseType.Bridge], - u'PRECHORUS': VerseType.Tags[VerseType.PreChorus] + u'CHORUS': VerseType.tags[VerseType.Chorus], + u'VERSE': VerseType.tags[VerseType.Verse], + u'INTRO': VerseType.tags[VerseType.Intro], + u'ENDING': VerseType.tags[VerseType.Ending], + u'BRIDGE': VerseType.tags[VerseType.Bridge], + u'PRECHORUS': VerseType.tags[VerseType.PreChorus] } verses = {} # list as [region, versetype, versenum, instance] diff --git a/openlp/plugins/songs/lib/ewimport.py b/openlp/plugins/songs/lib/ewimport.py index 8a344c189..fbeac0449 100644 --- a/openlp/plugins/songs/lib/ewimport.py +++ b/openlp/plugins/songs/lib/ewimport.py @@ -178,7 +178,7 @@ class EasyWorshipSongImport(SongImport): if result is None: return words, self.encoding = result - verse_type = VerseType.Tags[VerseType.Verse] + verse_type = VerseType.tags[VerseType.Verse] for verse in SLIDE_BREAK_REGEX.split(words): verse = verse.strip() if not verse: @@ -187,17 +187,17 @@ class EasyWorshipSongImport(SongImport): first_line_is_tag = False # EW tags: verse, chorus, pre-chorus, bridge, tag, # intro, ending, slide - for type in VerseType.Names+[u'tag', u'slide']: - type = type.lower() + for tag in VerseType.tags + [u'tag', u'slide']: + tag = tag.lower() ew_tag = verse_split[0].strip().lower() - if ew_tag.startswith(type): - verse_type = type[0] - if type == u'tag' or type == u'slide': - verse_type = VerseType.Tags[VerseType.Other] + if ew_tag.startswith(tag): + verse_type = tag[0] + if tag == u'tag' or tag == u'slide': + verse_type = VerseType.tags[VerseType.Other] first_line_is_tag = True number_found = False # check if tag is followed by number and/or note - if len(ew_tag) > len(type): + if len(ew_tag) > len(tag): match = NUMBER_REGEX.search(ew_tag) if match: number = match.group() @@ -209,10 +209,7 @@ class EasyWorshipSongImport(SongImport): if not number_found: verse_type += u'1' break - self.addVerse( - verse_split[-1].strip() \ - if first_line_is_tag else verse, - verse_type) + self.addVerse(verse_split[-1].strip() if first_line_is_tag else verse, verse_type) if len(self.comments) > 5: self.comments += unicode(translate('SongsPlugin.EasyWorshipSongImport', '\n[above are Song Tags with notes imported from EasyWorship]')) @@ -224,8 +221,7 @@ class EasyWorshipSongImport(SongImport): self.memoFile.close() def findField(self, field_name): - return [i for i, x in enumerate(self.fieldDescs) - if x.name == field_name][0] + return [i for i, x in enumerate(self.fieldDescs) if x.name == field_name][0] def setRecordStruct(self, field_descs): # Begin with empty field struct list diff --git a/openlp/plugins/songs/lib/foilpresenterimport.py b/openlp/plugins/songs/lib/foilpresenterimport.py index d6c232b54..474edf733 100644 --- a/openlp/plugins/songs/lib/foilpresenterimport.py +++ b/openlp/plugins/songs/lib/foilpresenterimport.py @@ -412,13 +412,13 @@ class FoilPresenter(object): temp_sortnr_backup = 1 temp_sortnr_liste = [] verse_count = { - VerseType.Tags[VerseType.Verse]: 1, - VerseType.Tags[VerseType.Chorus]: 1, - VerseType.Tags[VerseType.Bridge]: 1, - VerseType.Tags[VerseType.Ending]: 1, - VerseType.Tags[VerseType.Other]: 1, - VerseType.Tags[VerseType.Intro]: 1, - VerseType.Tags[VerseType.PreChorus]: 1 + VerseType.tags[VerseType.Verse]: 1, + VerseType.tags[VerseType.Chorus]: 1, + VerseType.tags[VerseType.Bridge]: 1, + VerseType.tags[VerseType.Ending]: 1, + VerseType.tags[VerseType.Other]: 1, + VerseType.tags[VerseType.Intro]: 1, + VerseType.tags[VerseType.PreChorus]: 1 } for strophe in foilpresenterfolie.strophen.strophe: text = self._child(strophe.text_) if hasattr(strophe, u'text_') else u'' @@ -438,25 +438,25 @@ class FoilPresenter(object): temp_verse_name = re.compile(u'[0-9].*').sub(u'', verse_name) temp_verse_name = temp_verse_name[:3].lower() if temp_verse_name == u'ref': - verse_type = VerseType.Tags[VerseType.Chorus] + verse_type = VerseType.tags[VerseType.Chorus] elif temp_verse_name == u'r': - verse_type = VerseType.Tags[VerseType.Chorus] + verse_type = VerseType.tags[VerseType.Chorus] elif temp_verse_name == u'': - verse_type = VerseType.Tags[VerseType.Verse] + verse_type = VerseType.tags[VerseType.Verse] elif temp_verse_name == u'v': - verse_type = VerseType.Tags[VerseType.Verse] + verse_type = VerseType.tags[VerseType.Verse] elif temp_verse_name == u'bri': - verse_type = VerseType.Tags[VerseType.Bridge] + verse_type = VerseType.tags[VerseType.Bridge] elif temp_verse_name == u'cod': - verse_type = VerseType.Tags[VerseType.Ending] + verse_type = VerseType.tags[VerseType.Ending] elif temp_verse_name == u'sch': - verse_type = VerseType.Tags[VerseType.Ending] + verse_type = VerseType.tags[VerseType.Ending] elif temp_verse_name == u'pre': - verse_type = VerseType.Tags[VerseType.PreChorus] + verse_type = VerseType.tags[VerseType.PreChorus] elif temp_verse_name == u'int': - verse_type = VerseType.Tags[VerseType.Intro] + verse_type = VerseType.tags[VerseType.Intro] else: - verse_type = VerseType.Tags[VerseType.Other] + verse_type = VerseType.tags[VerseType.Other] verse_number = re.compile(u'[a-zA-Z.+-_ ]*').sub(u'', verse_name) # Foilpresenter allows e. g. "C", but we need "C1". if not verse_number: @@ -469,7 +469,7 @@ class FoilPresenter(object): if value == u''.join((verse_type, verse_number)): verse_number = unicode(int(verse_number) + 1) verse_type_index = VerseType.from_tag(verse_type[0]) - verse_type = VerseType.Names[verse_type_index] + verse_type = VerseType.tags[verse_type_index] temp_verse_order[verse_sortnr] = u''.join((verse_type[0], verse_number)) temp_verse_order_backup.append(u''.join((verse_type[0], diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index 68820f861..da706bdcb 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -430,7 +430,7 @@ class SongMediaItem(MediaManagerItem): verse_index = VerseType.from_string(verse_tag, None) if verse_index is None: verse_index = VerseType.from_tag(verse_tag) - verse_tag = VerseType.TranslatedTags[verse_index].upper() + verse_tag = VerseType.translated_tags[verse_index].upper() verse_def = u'%s%s' % (verse_tag, verse[0][u'label']) service_item.add_from_text(unicode(verse[1]), verse_def) else: @@ -445,7 +445,7 @@ class SongMediaItem(MediaManagerItem): verse_index = VerseType.from_translated_tag(verse[0][u'type']) else: verse_index = VerseType.from_tag(verse[0][u'type']) - verse_tag = VerseType.TranslatedTags[verse_index] + verse_tag = VerseType.translated_tags[verse_index] verse_def = u'%s%s' % (verse_tag, verse[0][u'label']) service_item.add_from_text(verse[1], verse_def) else: diff --git a/openlp/plugins/songs/lib/opensongimport.py b/openlp/plugins/songs/lib/opensongimport.py index 9eda898ae..e961fdf44 100644 --- a/openlp/plugins/songs/lib/opensongimport.py +++ b/openlp/plugins/songs/lib/opensongimport.py @@ -160,7 +160,7 @@ class OpenSongImport(SongImport): # keep track of verses appearance order our_verse_order = [] # default verse - verse_tag = VerseType.Tags[VerseType.Verse] + verse_tag = VerseType.tags[VerseType.Verse] verse_num = u'1' # for the case where song has several sections with same marker inst = 1 @@ -184,21 +184,18 @@ class OpenSongImport(SongImport): # drop the square brackets right_bracket = this_line.find(u']') content = this_line[1:right_bracket].lower() - # have we got any digits? - # If so, verse number is everything from the digits - # to the end (openlp does not have concept of part verses, so - # just ignore any non integers on the end (including floats)) + # have we got any digits? If so, verse number is everything from the digits to the end (openlp does not + # have concept of part verses, so just ignore any non integers on the end (including floats)) match = re.match(u'(\D*)(\d+)', content) if match is not None: verse_tag = match.group(1) verse_num = match.group(2) else: - # otherwise we assume number 1 and take the whole prefix as - # the verse tag + # otherwise we assume number 1 and take the whole prefix as the verse tag verse_tag = content verse_num = u'1' verse_index = VerseType.from_loose_input(verse_tag) if verse_tag else 0 - verse_tag = VerseType.Tags[verse_index] + verse_tag = VerseType.tags[verse_index] inst = 1 if [verse_tag, verse_num, inst] in our_verse_order and verse_num in verses.get(verse_tag, {}): inst = len(verses[verse_tag][verse_num]) + 1 @@ -236,8 +233,8 @@ class OpenSongImport(SongImport): # figure out the presentation order, if present if u'presentation' in fields and root.presentation: order = unicode(root.presentation) - # We make all the tags in the lyrics lower case, so match that here - # and then split into a list on the whitespace + # We make all the tags in the lyrics lower case, so match that here and then split into a list on the + # whitespace. order = order.lower().split() for verse_def in order: match = re.match(u'(\D*)(\d+.*)', verse_def) @@ -245,7 +242,7 @@ class OpenSongImport(SongImport): verse_tag = match.group(1) verse_num = match.group(2) if not verse_tag: - verse_tag = VerseType.Tags[VerseType.Verse] + verse_tag = VerseType.tags[VerseType.Verse] else: # Assume it's no.1 if there are no digits verse_tag = verse_def diff --git a/openlp/plugins/songs/lib/songbeamerimport.py b/openlp/plugins/songs/lib/songbeamerimport.py index 534b1d121..e9a9bac19 100644 --- a/openlp/plugins/songs/lib/songbeamerimport.py +++ b/openlp/plugins/songs/lib/songbeamerimport.py @@ -27,8 +27,7 @@ # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### """ -The :mod:`songbeamerimport` module provides the functionality for importing - SongBeamer songs into the OpenLP database. +The :mod:`songbeamerimport` module provides the functionality for importing SongBeamer songs into the OpenLP database. """ import chardet import codecs @@ -43,32 +42,31 @@ log = logging.getLogger(__name__) class SongBeamerTypes(object): MarkTypes = { - u'Refrain': VerseType.Tags[VerseType.Chorus], - u'Chorus': VerseType.Tags[VerseType.Chorus], - u'Vers': VerseType.Tags[VerseType.Verse], - u'Verse': VerseType.Tags[VerseType.Verse], - u'Strophe': VerseType.Tags[VerseType.Verse], - u'Intro': VerseType.Tags[VerseType.Intro], - u'Coda': VerseType.Tags[VerseType.Ending], - u'Ending': VerseType.Tags[VerseType.Ending], - u'Bridge': VerseType.Tags[VerseType.Bridge], - u'Interlude': VerseType.Tags[VerseType.Bridge], - u'Zwischenspiel': VerseType.Tags[VerseType.Bridge], - u'Pre-Chorus': VerseType.Tags[VerseType.PreChorus], - u'Pre-Refrain': VerseType.Tags[VerseType.PreChorus], - u'Pre-Bridge': VerseType.Tags[VerseType.Other], - u'Pre-Coda': VerseType.Tags[VerseType.Other], - u'Unbekannt': VerseType.Tags[VerseType.Other], - u'Unknown': VerseType.Tags[VerseType.Other], - u'Unbenannt': VerseType.Tags[VerseType.Other] + u'Refrain': VerseType.tags[VerseType.Chorus], + u'Chorus': VerseType.tags[VerseType.Chorus], + u'Vers': VerseType.tags[VerseType.Verse], + u'Verse': VerseType.tags[VerseType.Verse], + u'Strophe': VerseType.tags[VerseType.Verse], + u'Intro': VerseType.tags[VerseType.Intro], + u'Coda': VerseType.tags[VerseType.Ending], + u'Ending': VerseType.tags[VerseType.Ending], + u'Bridge': VerseType.tags[VerseType.Bridge], + u'Interlude': VerseType.tags[VerseType.Bridge], + u'Zwischenspiel': VerseType.tags[VerseType.Bridge], + u'Pre-Chorus': VerseType.tags[VerseType.PreChorus], + u'Pre-Refrain': VerseType.tags[VerseType.PreChorus], + u'Pre-Bridge': VerseType.tags[VerseType.Other], + u'Pre-Coda': VerseType.tags[VerseType.Other], + u'Unbekannt': VerseType.tags[VerseType.Other], + u'Unknown': VerseType.tags[VerseType.Other], + u'Unbenannt': VerseType.tags[VerseType.Other] } class SongBeamerImport(SongImport): """ - Import Song Beamer files(s) - Song Beamer file format is text based - in the beginning are one or more control tags written + Import Song Beamer files(s). Song Beamer file format is text based in the beginning are one or more control tags + written. """ HTML_TAG_PAIRS = [ (re.compile(u''), u'{st}'), @@ -113,7 +111,7 @@ class SongBeamerImport(SongImport): return self.setDefaults() self.currentVerse = u'' - self.currentVerseType = VerseType.Tags[VerseType.Verse] + self.currentVerseType = VerseType.tags[VerseType.Verse] read_verses = False file_name = os.path.split(file)[1] if os.path.isfile(file): @@ -137,7 +135,7 @@ class SongBeamerImport(SongImport): self.replaceHtmlTags() self.addVerse(self.currentVerse, self.currentVerseType) self.currentVerse = u'' - self.currentVerseType = VerseType.Tags[VerseType.Verse] + self.currentVerseType = VerseType.tags[VerseType.Verse] read_verses = True verse_start = True elif read_verses: @@ -155,8 +153,7 @@ class SongBeamerImport(SongImport): def replaceHtmlTags(self): """ - This can be called to replace SongBeamer's specific (html) tags with - OpenLP's specific (html) tags. + This can be called to replace SongBeamer's specific (html) tags with OpenLP's specific (html) tags. """ for pair in SongBeamerImport.HTML_TAG_PAIRS: self.currentVerse = pair[0].sub(pair[1], self.currentVerse) @@ -166,8 +163,7 @@ class SongBeamerImport(SongImport): Parses a meta data line. ``line`` - The line in the file. It should consist of a tag and a value - for this tag (unicode):: + The line in the file. It should consist of a tag and a value for this tag (unicode):: u'#Title=Nearer my God to Thee' """ @@ -272,8 +268,8 @@ class SongBeamerImport(SongImport): def checkVerseMarks(self, line): """ - Check and add the verse's MarkType. Returns ``True`` if the given line - contains a correct verse mark otherwise ``False``. + Check and add the verse's MarkType. Returns ``True`` if the given linE contains a correct verse mark otherwise + ``False``. ``line`` The line to check for marks (unicode). diff --git a/openlp/plugins/songs/lib/songimport.py b/openlp/plugins/songs/lib/songimport.py index f6a84945c..c4c9719fc 100644 --- a/openlp/plugins/songs/lib/songimport.py +++ b/openlp/plugins/songs/lib/songimport.py @@ -303,13 +303,13 @@ class SongImport(QtCore.QObject): sxml = SongXML() other_count = 1 for (verse_def, verse_text, lang) in self.verses: - if verse_def[0].lower() in VerseType.Tags: + if verse_def[0].lower() in VerseType.tags: verse_tag = verse_def[0].lower() else: - new_verse_def = u'%s%d' % (VerseType.Tags[VerseType.Other], other_count) + new_verse_def = u'%s%d' % (VerseType.tags[VerseType.Other], other_count) verses_changed_to_other[verse_def] = new_verse_def other_count += 1 - verse_tag = VerseType.Tags[VerseType.Other] + verse_tag = VerseType.tags[VerseType.Other] log.info(u'Versetype %s changing to %s', verse_def, new_verse_def) verse_def = new_verse_def sxml.add_verse_to_lyrics(verse_tag, verse_def[1:], verse_text, lang) diff --git a/openlp/plugins/songs/lib/songshowplusimport.py b/openlp/plugins/songs/lib/songshowplusimport.py index c5bb8832d..ae54ef726 100644 --- a/openlp/plugins/songs/lib/songshowplusimport.py +++ b/openlp/plugins/songs/lib/songshowplusimport.py @@ -152,11 +152,11 @@ class SongShowPlusImport(SongImport): elif block_key == CCLI_NO: self.ccliNumber = int(data) elif block_key == VERSE: - self.addVerse(unicode(data, u'cp1252'), "%s%s" % (VerseType.Tags[VerseType.Verse], verse_no)) + self.addVerse(unicode(data, u'cp1252'), "%s%s" % (VerseType.tags[VerseType.Verse], verse_no)) elif block_key == CHORUS: - self.addVerse(unicode(data, u'cp1252'), "%s%s" % (VerseType.Tags[VerseType.Chorus], verse_no)) + self.addVerse(unicode(data, u'cp1252'), "%s%s" % (VerseType.tags[VerseType.Chorus], verse_no)) elif block_key == BRIDGE: - self.addVerse(unicode(data, u'cp1252'), "%s%s" % (VerseType.Tags[VerseType.Bridge], verse_no)) + self.addVerse(unicode(data, u'cp1252'), "%s%s" % (VerseType.tags[VerseType.Bridge], verse_no)) elif block_key == TOPIC: self.topics.append(unicode(data, u'cp1252')) elif block_key == COMMENTS: @@ -192,19 +192,19 @@ class SongShowPlusImport(SongImport): verse_number = "1" verse_type = verse_type.lower() if verse_type == "verse": - verse_tag = VerseType.Tags[VerseType.Verse] + verse_tag = VerseType.tags[VerseType.Verse] elif verse_type == "chorus": - verse_tag = VerseType.Tags[VerseType.Chorus] + verse_tag = VerseType.tags[VerseType.Chorus] elif verse_type == "bridge": - verse_tag = VerseType.Tags[VerseType.Bridge] + verse_tag = VerseType.tags[VerseType.Bridge] elif verse_type == "pre-chorus": - verse_tag = VerseType.Tags[VerseType.PreChorus] + verse_tag = VerseType.tags[VerseType.PreChorus] else: if verse_name not in self.otherList: if ignore_unique: return None self.otherCount += 1 self.otherList[verse_name] = str(self.otherCount) - verse_tag = VerseType.Tags[VerseType.Other] + verse_tag = VerseType.tags[VerseType.Other] verse_number = self.otherList[verse_name] return verse_tag + verse_number diff --git a/openlp/plugins/songs/lib/sundayplusimport.py b/openlp/plugins/songs/lib/sundayplusimport.py index f773183b3..63d281e12 100644 --- a/openlp/plugins/songs/lib/sundayplusimport.py +++ b/openlp/plugins/songs/lib/sundayplusimport.py @@ -52,8 +52,7 @@ class SundayPlusImport(SongImport): """ Import Sunday Plus songs - The format examples can be found attached to bug report at - + The format examples can be found attached to bug report at """ def __init__(self, manager, **kwargs): @@ -90,7 +89,7 @@ class SundayPlusImport(SongImport): self.logError(u'File is malformed') return False i = 1 - verse_type = VerseType.Tags[VerseType.Verse] + verse_type = VerseType.tags[VerseType.Verse] while i < len(data): # Data is held as #name: value pairs inside groups marked as []. # Now we are looking for the name. @@ -137,8 +136,7 @@ class SundayPlusImport(SongImport): if name == 'MARKER_NAME': value = value.strip() if len(value): - verse_type = VerseType.Tags[ - VerseType.from_loose_input(value[0])] + verse_type = VerseType.tags[VerseType.from_loose_input(value[0])] if len(value) >= 2 and value[-1] in ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']: verse_type = "%s%s" % (verse_type, value[-1]) elif name == 'Hotkey': @@ -168,8 +166,7 @@ class SundayPlusImport(SongImport): self.copyright = u'Public Domain' continue processed_lines.append(line) - self.addVerse('\n'.join(processed_lines).strip(), - verse_type) + self.addVerse('\n'.join(processed_lines).strip(), verse_type) if end == -1: break i = end + 1 diff --git a/openlp/plugins/songs/lib/xml.py b/openlp/plugins/songs/lib/xml.py index 22a4d803f..8d6bbc032 100644 --- a/openlp/plugins/songs/lib/xml.py +++ b/openlp/plugins/songs/lib/xml.py @@ -97,10 +97,8 @@ class SongXML(object): Add a verse to the ```` tag. ``type`` - A string denoting the type of verse. Possible values are *v*, - *c*, *b*, *p*, *i*, *e* and *o*. - Any other type is **not** allowed, this also includes translated - types. + A string denoting the type of verse. Possible values are *v*, *c*, *b*, *p*, *i*, *e* and *o*. Any other + type is **not** allowed, this also includes translated types. ``number`` An integer denoting the number of the item, for example: verse 1. @@ -109,8 +107,7 @@ class SongXML(object): The actual text of the verse to be stored. ``lang`` - The verse's language code (ISO-639). This is not required, but - should be added if available. + The verse's language code (ISO-639). This is not required, but should be added if available. """ verse = etree.Element(u'verse', type=unicode(type), label=unicode(number)) @@ -128,24 +125,21 @@ class SongXML(object): def get_verses(self, xml): """ - Iterates through the verses in the XML and returns a list of verses - and their attributes. + Iterates through the verses in the XML and returns a list of verses and their attributes. ``xml`` The XML of the song to be parsed. The returned list has the following format:: - [[{'type': 'v', 'label': '1'}, - u"optional slide split 1[---]optional slide split 2"], + [[{'type': 'v', 'label': '1'}, u"optional slide split 1[---]optional slide split 2"], [{'lang': 'en', 'type': 'c', 'label': '1'}, u"English chorus"]] """ self.song_xml = None verse_list = [] if not xml.startswith(u'') self.lyrics = etree.SubElement(self.song_xml, u'lyrics') verses = xml.split(u'\n\n') @@ -176,11 +170,10 @@ class SongXML(object): class OpenLyrics(object): """ - This class represents the converter for OpenLyrics XML (version 0.8) - to/from a song. + This class represents the converter for OpenLyrics XML (version 0.8) to/from a song. - As OpenLyrics has a rich set of different features, we cannot support them - all. The following features are supported by the :class:`OpenLyrics` class: + As OpenLyrics has a rich set of different features, we cannot support them all. The following features are + supported by the :class:`OpenLyrics` class: ```` OpenLP does not support the attribute *type* and *lang*. @@ -189,8 +182,7 @@ class OpenLyrics(object): This property is not supported. ```` - The ```` property is fully supported. But comments in lyrics - are not supported. + The ```` property is fully supported. But comments in lyrics are not supported. ```` This property is fully supported. @@ -208,23 +200,20 @@ class OpenLyrics(object): This property is not supported. ```` - The attribute *part* is not supported. The *break* attribute is - supported. + The attribute *part* is not supported. The *break* attribute is supported. ```` This property is not supported. ```` - As OpenLP does only support one songbook, we cannot consider more than - one songbook. + As OpenLP does only support one songbook, we cannot consider more than one songbook. ```` This property is not supported. ```` - Topics, as they are called in OpenLP, are fully supported, whereby only - the topic text (e. g. Grace) is considered, but neither the *id* nor - *lang*. + Topics, as they are called in OpenLP, are fully supported, whereby only the topic text (e. g. Grace) is + considered, but neither the *id* nor *lang*. ```` This property is not supported. @@ -233,9 +222,8 @@ class OpenLyrics(object): This property is not supported. ```` - The attribute *translit* is not supported. Note, the attribute *lang* is - considered, but there is not further functionality implemented yet. The - following verse "types" are supported by OpenLP: + The attribute *translit* is not supported. Note, the attribute *lang* is considered, but there is not further + functionality implemented yet. The following verse "types" are supported by OpenLP: * v * c @@ -245,13 +233,10 @@ class OpenLyrics(object): * e * o - The verse "types" stand for *Verse*, *Chorus*, *Bridge*, *Pre-Chorus*, - *Intro*, *Ending* and *Other*. Any numeric value is allowed after the - verse type. The complete verse name in OpenLP always consists of the - verse type and the verse number. If not number is present *1* is - assumed. - OpenLP will merge verses which are split up by appending a letter to the - verse name, such as *v1a*. + The verse "types" stand for *Verse*, *Chorus*, *Bridge*, *Pre-Chorus*, *Intro*, *Ending* and *Other*. Any + numeric value is allowed after the verse type. The complete verse name in OpenLP always consists of the verse + type and the verse number. If not number is present *1* is assumed. OpenLP will merge verses which are split + up by appending a letter to the verse name, such as *v1a*. ```` OpenLP supports this property. @@ -359,17 +344,14 @@ class OpenLyrics(object): def _get_missing_tags(self, text): """ - Tests the given text for not closed formatting tags and returns a tuple - consisting of two unicode strings:: + Tests the given text for not closed formatting tags and returns a tuple consisting of two unicode strings:: (u'{st}{r}', u'{/r}{/st}') - The first unicode string are the start tags (for the next slide). The - second unicode string are the end tags. + The first unicode string are the start tags (for the next slide). The second unicode string are the end tags. ``text`` - The text to test. The text must **not** contain html tags, only - OpenLP formatting tags are allowed:: + The text to test. The text must **not** contain html tags, only OpenLP formatting tags are allowed:: {st}{r}Text text text """ @@ -379,9 +361,8 @@ class OpenLyrics(object): continue if text.count(tag[u'start tag']) != text.count(tag[u'end tag']): tags.append((text.find(tag[u'start tag']), tag[u'start tag'], tag[u'end tag'])) - # Sort the lists, so that the tags which were opened first on the first - # slide (the text we are checking) will be opened first on the next - # slide as well. + # Sort the lists, so that the tags which were opened first on the first slide (the text we are checking) will + # be opened first on the next slide as well. tags.sort(key=lambda tag: tag[0]) end_tags = [] start_tags = [] @@ -393,16 +374,15 @@ class OpenLyrics(object): def xml_to_song(self, xml, parse_and_temporary_save=False): """ - Create and save a song from OpenLyrics format xml to the database. Since - we also export XML from external sources (e. g. OpenLyrics import), we - cannot ensure, that it completely conforms to the OpenLyrics standard. + Create and save a song from OpenLyrics format xml to the database. Since we also export XML from external + sources (e. g. OpenLyrics import), we cannot ensure, that it completely conforms to the OpenLyrics standard. ``xml`` The XML to parse (unicode). ``parse_and_temporary_save`` - Switch to skip processing the whole song and storing the songs in - the database with a temporary flag. Defaults to ``False``. + Switch to skip processing the whole song and storing the songs in the database with a temporary flag. + Defaults to ``False``. """ # No xml get out of here. if not xml: @@ -448,8 +428,7 @@ class OpenLyrics(object): def _add_tag_to_formatting(self, tag_name, tags_element): """ - Add new formatting tag to the element ```` if the tag is not - present yet. + Add new formatting tag to the element ```` if the tag is not present yet. """ available_tags = FormattingTags.get_html_tags() start_tag = '{%s}' % tag_name @@ -469,8 +448,7 @@ class OpenLyrics(object): def _add_text_with_tags_to_lines(self, verse_element, text, tags_element): """ - Convert text with formatting tags from OpenLP format to OpenLyrics - format and append it to element ````. + Convert text with formatting tags from OpenLP format to OpenLyrics format and append it to element ````. """ start_tags = OpenLyrics.START_TAGS_REGEX.findall(text) end_tags = OpenLyrics.END_TAGS_REGEX.findall(text) @@ -478,8 +456,7 @@ class OpenLyrics(object): for tag in start_tags: # Tags already converted to xml structure. xml_tags = tags_element.xpath(u'tag/attribute::name') - # Some formatting tag has only starting part e.g.
. - # Handle this case. + # Some formatting tag has only starting part e.g.
. Handle this case. if tag in end_tags: text = text.replace(u'{%s}' % tag, u'' % tag) else: @@ -586,8 +563,8 @@ class OpenLyrics(object): def _process_formatting_tags(self, song_xml, temporary): """ - Process the formatting tags from the song and either add missing tags - temporary or permanently to the formatting tag list. + Process the formatting tags from the song and either add missing tags temporary or permanently to the + formatting tag list. """ if not hasattr(song_xml, u'format'): return @@ -608,8 +585,8 @@ class OpenLyrics(object): u'end html': tag.close.text if hasattr(tag, 'close') else u'', u'protected': False, } - # Add 'temporary' key in case the formatting tag should not be - # saved otherwise it is supposed that formatting tag is permanent. + # Add 'temporary' key in case the formatting tag should not be saved otherwise it is supposed that + # formatting tag is permanent. if temporary: openlp_tag[u'temporary'] = temporary found_tags.append(openlp_tag) @@ -620,15 +597,14 @@ class OpenLyrics(object): def _process_lines_mixed_content(self, element, newlines=True): """ - Converts the xml text with mixed content to OpenLP representation. - Chords are skipped and formatting tags are converted. + Converts the xml text with mixed content to OpenLP representation. Chords are skipped and formatting tags are + converted. ``element`` The property object (lxml.etree.Element). ``newlines`` - The switch to enable/disable processing of line breaks
. - The
is used since OpenLyrics 0.8. + The switch to enable/disable processing of line breaks
. The
is used since OpenLyrics 0.8. """ text = u'' use_endtag = True @@ -684,12 +660,10 @@ class OpenLyrics(object): lines = etree.tostring(lines) element = etree.XML(lines) - # OpenLyrics 0.8 uses
for new lines. - # Append text from "lines" element to verse text. + # OpenLyrics 0.8 uses
for new lines. Append text from "lines" element to verse text. if version > '0.7': text = self._process_lines_mixed_content(element) - # OpenLyrics version <= 0.7 contais elements to represent lines. - # First child element is tested. + # OpenLyrics version <= 0.7 contais elements to represent lines. First child element is tested. else: # Loop over the "line" elements removing comments and chords. for line in element: @@ -742,16 +716,15 @@ class OpenLyrics(object): text += u'\n[---]' verse_def = verse.get(u'name', u' ').lower() verse_tag, verse_number, verse_part = OpenLyrics.VERSE_TAG_SPLITTER.search(verse_def).groups() - if verse_tag not in VerseType.Tags: - verse_tag = VerseType.Tags[VerseType.Other] - # OpenLyrics allows e. g. "c", but we need "c1". However, this does - # not correct the verse order. + if verse_tag not in VerseType.tags: + verse_tag = VerseType.tags[VerseType.Other] + # OpenLyrics allows e. g. "c", but we need "c1". However, this does not correct the verse order. if not verse_number: verse_number = u'1' lang = verse.get(u'lang') translit = verse.get(u'translit') - # In OpenLP 1.9.6 we used v1a, v1b ... to represent visual slide - # breaks. In OpenLyrics 0.7 an attribute has been added. + # In OpenLP 1.9.6 we used v1a, v1b ... to represent visual slide breaks. In OpenLyrics 0.7 an attribute has + # been added. if song_xml.get(u'modifiedIn') in (u'1.9.6', u'OpenLP 1.9.6') and \ song_xml.get(u'version') == u'0.7' and (verse_tag, verse_number, lang, translit) in verses: verses[(verse_tag, verse_number, lang, translit, None)] += u'\n[---]\n' + text From 00451ebfe08d95f629c4ec2480d9250c9acff926 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Wed, 27 Feb 2013 12:04:05 +0100 Subject: [PATCH 02/16] moved SettingsManager --- openlp/core/lib/__init__.py | 1 - openlp/core/ui/thememanager.py | 7 +++---- openlp/core/utils/__init__.py | 7 ++++--- openlp/core/{lib => utils}/settingsmanager.py | 0 openlp/plugins/bibles/lib/manager.py | 4 ++-- openlp/plugins/images/lib/mediaitem.py | 7 +++---- 6 files changed, 12 insertions(+), 14 deletions(-) rename openlp/core/{lib => utils}/settingsmanager.py (100%) diff --git a/openlp/core/lib/__init__.py b/openlp/core/lib/__init__.py index a3d9cec4b..3b531fdec 100644 --- a/openlp/core/lib/__init__.py +++ b/openlp/core/lib/__init__.py @@ -393,7 +393,6 @@ from settings import Settings from listwidgetwithdnd import ListWidgetWithDnD from formattingtags import FormattingTags from spelltextedit import SpellTextEdit -from settingsmanager import SettingsManager from plugin import PluginStatus, StringContent, Plugin from pluginmanager import PluginManager from settingstab import SettingsTab diff --git a/openlp/core/ui/thememanager.py b/openlp/core/ui/thememanager.py index 96ebfa694..08ba44f96 100644 --- a/openlp/core/ui/thememanager.py +++ b/openlp/core/ui/thememanager.py @@ -38,14 +38,13 @@ import re from xml.etree.ElementTree import ElementTree, XML from PyQt4 import QtCore, QtGui -from openlp.core.lib import ImageSource, OpenLPToolbar, Registry, SettingsManager, Settings, UiStrings, \ - get_text_file_string, build_icon, translate, check_item_selected, check_directory_exists, create_thumb, \ - validate_thumb +from openlp.core.lib import ImageSource, OpenLPToolbar, Registry, Settings, UiStrings, get_text_file_string, \ + build_icon, translate, check_item_selected, check_directory_exists, create_thumb, validate_thumb from openlp.core.lib.theme import ThemeXML, BackgroundType, VerticalType, BackgroundGradientType from openlp.core.lib.ui import critical_error_message_box, create_widget_action from openlp.core.theme import Theme from openlp.core.ui import FileRenameForm, ThemeForm -from openlp.core.utils import AppLocation, delete_file, locale_compare, get_filesystem_encoding +from openlp.core.utils import AppLocation, SettingsManager, delete_file, locale_compare, get_filesystem_encoding log = logging.getLogger(__name__) diff --git a/openlp/core/utils/__init__.py b/openlp/core/utils/__init__.py index 104567039..c529fe34d 100644 --- a/openlp/core/utils/__init__.py +++ b/openlp/core/utils/__init__.py @@ -499,7 +499,8 @@ locale_direct_compare = locale.strcoll from languagemanager import LanguageManager from actions import ActionList +from settingsmanager import SettingsManager -__all__ = [u'AppLocation', u'ActionList', u'LanguageManager', u'get_application_version', u'check_latest_version', - u'add_actions', u'get_filesystem_encoding', u'get_web_page', u'get_uno_command', u'get_uno_instance', - u'delete_file', u'clean_filename', u'format_time', u'locale_compare', u'locale_direct_compare'] +__all__ = [u'AppLocation', u'ActionList', u'LanguageManager', u'SettingsManager', u'get_application_version', + u'check_latest_version', u'add_actions', u'get_filesystem_encoding', u'get_web_page', u'get_uno_command', + u'get_uno_instance', u'delete_file', u'clean_filename', u'format_time', u'locale_compare', u'locale_direct_compare'] diff --git a/openlp/core/lib/settingsmanager.py b/openlp/core/utils/settingsmanager.py similarity index 100% rename from openlp/core/lib/settingsmanager.py rename to openlp/core/utils/settingsmanager.py diff --git a/openlp/plugins/bibles/lib/manager.py b/openlp/plugins/bibles/lib/manager.py index d82e46965..38b5ea9c7 100644 --- a/openlp/plugins/bibles/lib/manager.py +++ b/openlp/plugins/bibles/lib/manager.py @@ -30,8 +30,8 @@ import logging import os -from openlp.core.lib import Registry, SettingsManager, Settings, translate -from openlp.core.utils import AppLocation, delete_file +from openlp.core.lib import Registry, Settings, translate +from openlp.core.utils import AppLocation, SettingsManager, delete_file from openlp.plugins.bibles.lib import parse_reference, get_reference_separator, LanguageSelection from openlp.plugins.bibles.lib.db import BibleDB, BibleMeta from csvbible import CSVBible diff --git a/openlp/plugins/images/lib/mediaitem.py b/openlp/plugins/images/lib/mediaitem.py index 2280120c1..7fe3088e4 100644 --- a/openlp/plugins/images/lib/mediaitem.py +++ b/openlp/plugins/images/lib/mediaitem.py @@ -32,11 +32,10 @@ import os from PyQt4 import QtCore, QtGui -from openlp.core.lib import MediaManagerItem, ItemCapabilities, Registry, SettingsManager, ServiceItemContext, \ - Settings, UiStrings, build_icon, check_item_selected, check_directory_exists, create_thumb, translate, \ - validate_thumb +from openlp.core.lib import MediaManagerItem, ItemCapabilities, Registry, ServiceItemContext, Settings, UiStrings, \ + build_icon, check_item_selected, check_directory_exists, create_thumb, translate, validate_thumb from openlp.core.lib.ui import critical_error_message_box -from openlp.core.utils import AppLocation, delete_file, locale_compare, get_images_filter +from openlp.core.utils import AppLocation, SettingsManager, delete_file, locale_compare, get_images_filter log = logging.getLogger(__name__) From 4d1d912aaa86f2aa405c07999ed760207702bb4b Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Wed, 27 Feb 2013 12:24:50 +0100 Subject: [PATCH 03/16] merged settingsmanager with applocation; moved applocation --- openlp/core/ui/thememanager.py | 10 +- openlp/core/utils/__init__.py | 111 +---------- openlp/core/utils/applocation.py | 184 ++++++++++++++++++ openlp/core/utils/settingsmanager.py | 66 ------- openlp/plugins/bibles/lib/manager.py | 4 +- openlp/plugins/images/lib/mediaitem.py | 4 +- .../openlp_core_utils/test_applocation.py | 22 +-- 7 files changed, 209 insertions(+), 192 deletions(-) create mode 100644 openlp/core/utils/applocation.py delete mode 100644 openlp/core/utils/settingsmanager.py diff --git a/openlp/core/ui/thememanager.py b/openlp/core/ui/thememanager.py index 08ba44f96..38074517e 100644 --- a/openlp/core/ui/thememanager.py +++ b/openlp/core/ui/thememanager.py @@ -44,7 +44,7 @@ from openlp.core.lib.theme import ThemeXML, BackgroundType, VerticalType, Backgr from openlp.core.lib.ui import critical_error_message_box, create_widget_action from openlp.core.theme import Theme from openlp.core.ui import FileRenameForm, ThemeForm -from openlp.core.utils import AppLocation, SettingsManager, delete_file, locale_compare, get_filesystem_encoding +from openlp.core.utils import AppLocation, delete_file, locale_compare, get_filesystem_encoding log = logging.getLogger(__name__) @@ -149,7 +149,7 @@ class ThemeManager(QtGui.QWidget): Import new themes downloaded by the first time wizard """ self.application.set_busy_cursor() - files = SettingsManager.get_files(self.settingsSection, u'.otz') + files = AppLocation.get_files(self.settingsSection, u'.otz') for theme_file in files: theme_file = os.path.join(self.path, theme_file) self.unzip_theme(theme_file, self.path) @@ -418,10 +418,10 @@ class ThemeManager(QtGui.QWidget): log.debug(u'Load themes from dir') self.theme_list = [] self.theme_list_widget.clear() - files = SettingsManager.get_files(self.settingsSection, u'.png') + files = AppLocation.get_files(self.settingsSection, u'.png') if first_time: self.first_time() - files = SettingsManager.get_files(self.settingsSection, u'.png') + files = AppLocation.get_files(self.settingsSection, u'.png') # No themes have been found so create one if not files: theme = ThemeXML() @@ -429,7 +429,7 @@ class ThemeManager(QtGui.QWidget): self._write_theme(theme, None, None) Settings().setValue(self.settingsSection + u'/global theme', theme.theme_name) self.config_updated() - files = SettingsManager.get_files(self.settingsSection, u'.png') + files = AppLocation.get_files(self.settingsSection, u'.png') # Sort the themes by its name considering language specific files.sort(key=lambda file_name: unicode(file_name), cmp=locale_compare) # now process the file list of png files diff --git a/openlp/core/utils/__init__.py b/openlp/core/utils/__init__.py index c529fe34d..cf4eb4675 100644 --- a/openlp/core/utils/__init__.py +++ b/openlp/core/utils/__init__.py @@ -50,7 +50,6 @@ if sys.platform != u'win32' and sys.platform != u'darwin': except ImportError: XDG_BASE_AVAILABLE = False -import openlp from openlp.core.lib import translate, check_directory_exists log = logging.getLogger(__name__) @@ -78,107 +77,6 @@ class VersionThread(QtCore.QThread): if LooseVersion(str(version)) > LooseVersion(str(app_version[u'full'])): Registry().execute(u'openlp_version_check', u'%s' % version) -class AppLocation(object): - """ - The :class:`AppLocation` class is a static class which retrieves a - directory based on the directory type. - """ - AppDir = 1 - ConfigDir = 2 - DataDir = 3 - PluginsDir = 4 - VersionDir = 5 - CacheDir = 6 - LanguageDir = 7 - - # Base path where data/config/cache dir is located - BaseDir = None - - @staticmethod - def get_directory(dir_type=1): - """ - Return the appropriate directory according to the directory type. - - ``dir_type`` - The directory type you want, for instance the data directory. - """ - if dir_type == AppLocation.AppDir: - return _get_frozen_path(os.path.abspath(os.path.split(sys.argv[0])[0]), os.path.split(openlp.__file__)[0]) - elif dir_type == AppLocation.PluginsDir: - app_path = os.path.abspath(os.path.split(sys.argv[0])[0]) - return _get_frozen_path(os.path.join(app_path, u'plugins'), - os.path.join(os.path.split(openlp.__file__)[0], u'plugins')) - elif dir_type == AppLocation.VersionDir: - return _get_frozen_path(os.path.abspath(os.path.split(sys.argv[0])[0]), os.path.split(openlp.__file__)[0]) - elif dir_type == AppLocation.LanguageDir: - app_path = _get_frozen_path(os.path.abspath(os.path.split(sys.argv[0])[0]), _get_os_dir_path(dir_type)) - return os.path.join(app_path, u'i18n') - elif dir_type == AppLocation.DataDir and AppLocation.BaseDir: - return os.path.join(AppLocation.BaseDir, 'data') - else: - return _get_os_dir_path(dir_type) - - @staticmethod - def get_data_path(): - """ - Return the path OpenLP stores all its data under. - """ - # Check if we have a different data location. - if Settings().contains(u'advanced/data path'): - path = Settings().value(u'advanced/data path') - else: - path = AppLocation.get_directory(AppLocation.DataDir) - check_directory_exists(path) - return os.path.normpath(path) - - @staticmethod - def get_section_data_path(section): - """ - Return the path a particular module stores its data under. - """ - data_path = AppLocation.get_data_path() - path = os.path.join(data_path, section) - check_directory_exists(path) - return path - - -def _get_os_dir_path(dir_type): - """ - Return a path based on which OS and environment we are running in. - """ - encoding = sys.getfilesystemencoding() - if sys.platform == u'win32': - if dir_type == AppLocation.DataDir: - return os.path.join(unicode(os.getenv(u'APPDATA'), encoding), u'openlp', u'data') - elif dir_type == AppLocation.LanguageDir: - return os.path.split(openlp.__file__)[0] - return os.path.join(unicode(os.getenv(u'APPDATA'), encoding), u'openlp') - elif sys.platform == u'darwin': - if dir_type == AppLocation.DataDir: - return os.path.join(unicode(os.getenv(u'HOME'), encoding), - u'Library', u'Application Support', u'openlp', u'Data') - elif dir_type == AppLocation.LanguageDir: - return os.path.split(openlp.__file__)[0] - return os.path.join(unicode(os.getenv(u'HOME'), encoding), u'Library', u'Application Support', u'openlp') - else: - if dir_type == AppLocation.LanguageDir: - prefixes = [u'/usr/local', u'/usr'] - for prefix in prefixes: - directory = os.path.join(prefix, u'share', u'openlp') - if os.path.exists(directory): - return directory - return os.path.join(u'/usr', u'share', u'openlp') - if XDG_BASE_AVAILABLE: - if dir_type == AppLocation.ConfigDir: - return os.path.join(unicode(BaseDirectory.xdg_config_home, encoding), u'openlp') - elif dir_type == AppLocation.DataDir: - return os.path.join(unicode(BaseDirectory.xdg_data_home, encoding), u'openlp') - elif dir_type == AppLocation.CacheDir: - return os.path.join(unicode(BaseDirectory.xdg_cache_home, encoding), u'openlp') - if dir_type == AppLocation.DataDir: - return os.path.join(unicode(os.getenv(u'HOME'), encoding), u'.openlp', u'data') - return os.path.join(unicode(os.getenv(u'HOME'), encoding), u'.openlp') - def _get_frozen_path(frozen_option, non_frozen_option): """ @@ -497,10 +395,11 @@ def locale_compare(string1, string2): locale_direct_compare = locale.strcoll +from applocation import AppLocation from languagemanager import LanguageManager from actions import ActionList -from settingsmanager import SettingsManager -__all__ = [u'AppLocation', u'ActionList', u'LanguageManager', u'SettingsManager', u'get_application_version', - u'check_latest_version', u'add_actions', u'get_filesystem_encoding', u'get_web_page', u'get_uno_command', - u'get_uno_instance', u'delete_file', u'clean_filename', u'format_time', u'locale_compare', u'locale_direct_compare'] + +__all__ = [u'AppLocation', u'ActionList', u'LanguageManager', u'get_application_version', u'check_latest_version', + u'add_actions', u'get_filesystem_encoding', u'get_web_page', u'get_uno_command', u'get_uno_instance', + u'delete_file', u'clean_filename', u'format_time', u'locale_compare', u'locale_direct_compare'] diff --git a/openlp/core/utils/applocation.py b/openlp/core/utils/applocation.py new file mode 100644 index 000000000..611e5b731 --- /dev/null +++ b/openlp/core/utils/applocation.py @@ -0,0 +1,184 @@ +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=120 tabstop=4 softtabstop=4 + +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # +# Copyright (c) 2008-2013 Raoul Snyman # +# Portions copyright (c) 2008-2013 Tim Bentley, Gerald Britton, Jonathan # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Erik Lundin, Edwin Lunando, Brian T. Meyer. # +# Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias Põldaru, # +# Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # +# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Dave Warnock, # +# Frode Woldsund, Martin Zibricky, Patrick Zimmermann # +# --------------------------------------------------------------------------- # +# 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 # +############################################################################### +""" +The :mod:`openlp.core.utils` module provides the utility libraries for OpenLP. +""" +import logging +import os +import re +import sys +import urllib2 + +from openlp.core.lib import Registry, Settings +from openlp.core.utils import _get_frozen_path + + +if sys.platform != u'win32' and sys.platform != u'darwin': + try: + from xdg import BaseDirectory + XDG_BASE_AVAILABLE = True + except ImportError: + XDG_BASE_AVAILABLE = False + +import openlp +from openlp.core.lib import translate, check_directory_exists + + +log = logging.getLogger(__name__) + + +class AppLocation(object): + """ + The :class:`AppLocation` class is a static class which retrieves a + directory based on the directory type. + """ + AppDir = 1 + ConfigDir = 2 + DataDir = 3 + PluginsDir = 4 + VersionDir = 5 + CacheDir = 6 + LanguageDir = 7 + + # Base path where data/config/cache dir is located + BaseDir = None + + @staticmethod + def get_directory(dir_type=1): + """ + Return the appropriate directory according to the directory type. + + ``dir_type`` + The directory type you want, for instance the data directory. + """ + if dir_type == AppLocation.AppDir: + return _get_frozen_path(os.path.abspath(os.path.split(sys.argv[0])[0]), os.path.split(openlp.__file__)[0]) + elif dir_type == AppLocation.PluginsDir: + app_path = os.path.abspath(os.path.split(sys.argv[0])[0]) + return _get_frozen_path(os.path.join(app_path, u'plugins'), + os.path.join(os.path.split(openlp.__file__)[0], u'plugins')) + elif dir_type == AppLocation.VersionDir: + return _get_frozen_path(os.path.abspath(os.path.split(sys.argv[0])[0]), os.path.split(openlp.__file__)[0]) + elif dir_type == AppLocation.LanguageDir: + app_path = _get_frozen_path(os.path.abspath(os.path.split(sys.argv[0])[0]), _get_os_dir_path(dir_type)) + return os.path.join(app_path, u'i18n') + elif dir_type == AppLocation.DataDir and AppLocation.BaseDir: + return os.path.join(AppLocation.BaseDir, 'data') + else: + return _get_os_dir_path(dir_type) + + @staticmethod + def get_data_path(): + """ + Return the path OpenLP stores all its data under. + """ + # Check if we have a different data location. + if Settings().contains(u'advanced/data path'): + path = Settings().value(u'advanced/data path') + else: + path = AppLocation.get_directory(AppLocation.DataDir) + check_directory_exists(path) + return os.path.normpath(path) + + @staticmethod + def get_files(section=None, extension=None): + """ + Get a list of files from the data files path. + + ``section`` + Defaults to *None*. The section of code getting the files - used to load from a section's data subdirectory. + + ``extension`` + Defaults to *None*. The extension to search for. + """ + path = AppLocation.get_data_path() + if section: + path = os.path.join(path, section) + try: + files = os.listdir(path) + except OSError: + return [] + if extension: + return [filename for filename in files if extension == os.path.splitext(filename)[1]] + else: + # no filtering required + return files + + @staticmethod + def get_section_data_path(section): + """ + Return the path a particular module stores its data under. + """ + data_path = AppLocation.get_data_path() + path = os.path.join(data_path, section) + check_directory_exists(path) + return path + + +def _get_os_dir_path(dir_type): + """ + Return a path based on which OS and environment we are running in. + """ + encoding = sys.getfilesystemencoding() + if sys.platform == u'win32': + if dir_type == AppLocation.DataDir: + return os.path.join(unicode(os.getenv(u'APPDATA'), encoding), u'openlp', u'data') + elif dir_type == AppLocation.LanguageDir: + return os.path.split(openlp.__file__)[0] + return os.path.join(unicode(os.getenv(u'APPDATA'), encoding), u'openlp') + elif sys.platform == u'darwin': + if dir_type == AppLocation.DataDir: + return os.path.join(unicode(os.getenv(u'HOME'), encoding), + u'Library', u'Application Support', u'openlp', u'Data') + elif dir_type == AppLocation.LanguageDir: + return os.path.split(openlp.__file__)[0] + return os.path.join(unicode(os.getenv(u'HOME'), encoding), u'Library', u'Application Support', u'openlp') + else: + if dir_type == AppLocation.LanguageDir: + prefixes = [u'/usr/local', u'/usr'] + for prefix in prefixes: + directory = os.path.join(prefix, u'share', u'openlp') + if os.path.exists(directory): + return directory + return os.path.join(u'/usr', u'share', u'openlp') + if XDG_BASE_AVAILABLE: + if dir_type == AppLocation.ConfigDir: + return os.path.join(unicode(BaseDirectory.xdg_config_home, encoding), u'openlp') + elif dir_type == AppLocation.DataDir: + return os.path.join(unicode(BaseDirectory.xdg_data_home, encoding), u'openlp') + elif dir_type == AppLocation.CacheDir: + return os.path.join(unicode(BaseDirectory.xdg_cache_home, encoding), u'openlp') + if dir_type == AppLocation.DataDir: + return os.path.join(unicode(os.getenv(u'HOME'), encoding), u'.openlp', u'data') + return os.path.join(unicode(os.getenv(u'HOME'), encoding), u'.openlp') + + + + + diff --git a/openlp/core/utils/settingsmanager.py b/openlp/core/utils/settingsmanager.py deleted file mode 100644 index 00bdda350..000000000 --- a/openlp/core/utils/settingsmanager.py +++ /dev/null @@ -1,66 +0,0 @@ -# -*- coding: utf-8 -*- -# vim: autoindent shiftwidth=4 expandtab textwidth=120 tabstop=4 softtabstop=4 - -############################################################################### -# OpenLP - Open Source Lyrics Projection # -# --------------------------------------------------------------------------- # -# Copyright (c) 2008-2013 Raoul Snyman # -# Portions copyright (c) 2008-2013 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # -# Meinert Jordan, Armin Köhler, Erik Lundin, Edwin Lunando, Brian T. Meyer. # -# Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias Põldaru, # -# Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Dave Warnock, # -# Frode Woldsund, Martin Zibricky, Patrick Zimmermann # -# --------------------------------------------------------------------------- # -# 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 # -############################################################################### -""" -Provide handling for persisting OpenLP settings. OpenLP uses QSettings to manage settings persistence. QSettings -provides a single API for saving and retrieving settings from the application but writes to disk in an OS dependant -format. -""" -import os - -from openlp.core.utils import AppLocation - - -class SettingsManager(object): - """ - Class to provide helper functions for the loading and saving of application settings. - """ - - @staticmethod - def get_files(section=None, extension=None): - """ - Get a list of files from the data files path. - - ``section`` - Defaults to *None*. The section of code getting the files - used to load from a section's data subdirectory. - - ``extension`` - Defaults to *None*. The extension to search for. - """ - path = AppLocation.get_data_path() - if section: - path = os.path.join(path, section) - try: - files = os.listdir(path) - except OSError: - return [] - if extension: - return [filename for filename in files if extension == os.path.splitext(filename)[1]] - else: - # no filtering required - return files diff --git a/openlp/plugins/bibles/lib/manager.py b/openlp/plugins/bibles/lib/manager.py index 38b5ea9c7..987817bdc 100644 --- a/openlp/plugins/bibles/lib/manager.py +++ b/openlp/plugins/bibles/lib/manager.py @@ -31,7 +31,7 @@ import logging import os from openlp.core.lib import Registry, Settings, translate -from openlp.core.utils import AppLocation, SettingsManager, delete_file +from openlp.core.utils import AppLocation, delete_file from openlp.plugins.bibles.lib import parse_reference, get_reference_separator, LanguageSelection from openlp.plugins.bibles.lib.db import BibleDB, BibleMeta from csvbible import CSVBible @@ -137,7 +137,7 @@ class BibleManager(object): BibleDB class. """ log.debug(u'Reload bibles') - files = SettingsManager.get_files(self.settingsSection, self.suffix) + files = AppLocation.get_files(self.settingsSection, self.suffix) if u'alternative_book_names.sqlite' in files: files.remove(u'alternative_book_names.sqlite') log.debug(u'Bible Files %s', files) diff --git a/openlp/plugins/images/lib/mediaitem.py b/openlp/plugins/images/lib/mediaitem.py index 7fe3088e4..fdc743f32 100644 --- a/openlp/plugins/images/lib/mediaitem.py +++ b/openlp/plugins/images/lib/mediaitem.py @@ -35,7 +35,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import MediaManagerItem, ItemCapabilities, Registry, ServiceItemContext, Settings, UiStrings, \ build_icon, check_item_selected, check_directory_exists, create_thumb, translate, validate_thumb from openlp.core.lib.ui import critical_error_message_box -from openlp.core.utils import AppLocation, SettingsManager, delete_file, locale_compare, get_images_filter +from openlp.core.utils import AppLocation, delete_file, locale_compare, get_images_filter log = logging.getLogger(__name__) @@ -106,7 +106,7 @@ class ImageMediaItem(MediaManagerItem): delete_file(os.path.join(self.servicePath, text.text())) self.listView.takeItem(row) self.main_window.incrementProgressBar() - SettingsManager.setValue(self.settingsSection + u'/images files', self.getFileList()) + AppLocation.setValue(self.settingsSection + u'/images files', self.getFileList()) self.main_window.finishedProgressBar() self.application.set_normal_cursor() self.listView.blockSignals(False) diff --git a/tests/functional/openlp_core_utils/test_applocation.py b/tests/functional/openlp_core_utils/test_applocation.py index f874de4db..b7f608966 100644 --- a/tests/functional/openlp_core_utils/test_applocation.py +++ b/tests/functional/openlp_core_utils/test_applocation.py @@ -15,10 +15,10 @@ class TestAppLocation(TestCase): """ Test the AppLocation.get_data_path() method """ - with patch(u'openlp.core.utils.Settings') as mocked_class, \ + with patch(u'openlp.core.utils.applocation.Settings') as mocked_class, \ patch(u'openlp.core.utils.AppLocation.get_directory') as mocked_get_directory, \ - patch(u'openlp.core.utils.check_directory_exists') as mocked_check_directory_exists, \ - patch(u'openlp.core.utils.os') as mocked_os: + patch(u'openlp.core.utils.applocation.check_directory_exists') as mocked_check_directory_exists, \ + patch(u'openlp.core.utils.applocation.os') as mocked_os: # GIVEN: A mocked out Settings class and a mocked out AppLocation.get_directory() mocked_settings = mocked_class.return_value mocked_settings.contains.return_value = False @@ -37,8 +37,8 @@ class TestAppLocation(TestCase): """ Test the AppLocation.get_data_path() method when a custom location is set in the settings """ - with patch(u'openlp.core.utils.Settings') as mocked_class,\ - patch(u'openlp.core.utils.os') as mocked_os: + with patch(u'openlp.core.utils.applocation.Settings') as mocked_class,\ + patch(u'openlp.core.utils.applocation.os') as mocked_os: # GIVEN: A mocked out Settings class which returns a custom data location mocked_settings = mocked_class.return_value mocked_settings.contains.return_value = True @@ -56,7 +56,7 @@ class TestAppLocation(TestCase): Test the AppLocation.get_section_data_path() method """ with patch(u'openlp.core.utils.AppLocation.get_data_path') as mocked_get_data_path, \ - patch(u'openlp.core.utils.check_directory_exists') as mocked_check_directory_exists: + patch(u'openlp.core.utils.applocation.check_directory_exists') as mocked_check_directory_exists: # GIVEN: A mocked out AppLocation.get_data_path() mocked_get_data_path.return_value = u'test/dir' mocked_check_directory_exists.return_value = True @@ -70,7 +70,7 @@ class TestAppLocation(TestCase): """ Test the AppLocation.get_directory() method for AppLocation.AppDir """ - with patch(u'openlp.core.utils._get_frozen_path') as mocked_get_frozen_path: + with patch(u'openlp.core.utils.applocation._get_frozen_path') as mocked_get_frozen_path: mocked_get_frozen_path.return_value = u'app/dir' # WHEN: We call AppLocation.get_directory directory = AppLocation.get_directory(AppLocation.AppDir) @@ -81,10 +81,10 @@ class TestAppLocation(TestCase): """ Test the AppLocation.get_directory() method for AppLocation.PluginsDir """ - with patch(u'openlp.core.utils._get_frozen_path') as mocked_get_frozen_path, \ - patch(u'openlp.core.utils.os.path.abspath') as mocked_abspath, \ - patch(u'openlp.core.utils.os.path.split') as mocked_split, \ - patch(u'openlp.core.utils.sys') as mocked_sys: + with patch(u'openlp.core.utils.applocation._get_frozen_path') as mocked_get_frozen_path, \ + patch(u'openlp.core.utils.applocation.os.path.abspath') as mocked_abspath, \ + patch(u'openlp.core.utils.applocation.os.path.split') as mocked_split, \ + patch(u'openlp.core.utils.applocation.sys') as mocked_sys: mocked_abspath.return_value = u'plugins/dir' mocked_split.return_value = [u'openlp'] mocked_get_frozen_path.return_value = u'plugins/dir' From 0f8836ac54935ea37cfcfdcdcc68c8fa39af080e Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Wed, 27 Feb 2013 12:29:24 +0100 Subject: [PATCH 04/16] removed not needed imports --- openlp/core/utils/__init__.py | 5 +++-- openlp/core/utils/applocation.py | 6 ++---- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/openlp/core/utils/__init__.py b/openlp/core/utils/__init__.py index cf4eb4675..6706750b5 100644 --- a/openlp/core/utils/__init__.py +++ b/openlp/core/utils/__init__.py @@ -39,9 +39,10 @@ from subprocess import Popen, PIPE import sys import urllib2 +from PyQt4 import QtGui, QtCore + from openlp.core.lib import Registry, Settings -from PyQt4 import QtGui, QtCore if sys.platform != u'win32' and sys.platform != u'darwin': try: @@ -50,7 +51,7 @@ if sys.platform != u'win32' and sys.platform != u'darwin': except ImportError: XDG_BASE_AVAILABLE = False -from openlp.core.lib import translate, check_directory_exists +from openlp.core.lib import translate log = logging.getLogger(__name__) APPLICATION_VERSION = {} diff --git a/openlp/core/utils/applocation.py b/openlp/core/utils/applocation.py index 611e5b731..e35b41fce 100644 --- a/openlp/core/utils/applocation.py +++ b/openlp/core/utils/applocation.py @@ -31,11 +31,9 @@ The :mod:`openlp.core.utils` module provides the utility libraries for OpenLP. """ import logging import os -import re import sys -import urllib2 -from openlp.core.lib import Registry, Settings +from openlp.core.lib import Settings from openlp.core.utils import _get_frozen_path @@ -47,7 +45,7 @@ if sys.platform != u'win32' and sys.platform != u'darwin': XDG_BASE_AVAILABLE = False import openlp -from openlp.core.lib import translate, check_directory_exists +from openlp.core.lib import check_directory_exists log = logging.getLogger(__name__) From 5b6f6ddee1f3369900cc4690f2cfccec9bb0f6cf Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Wed, 27 Feb 2013 12:31:06 +0100 Subject: [PATCH 05/16] removed not needed lines --- openlp/core/utils/applocation.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/openlp/core/utils/applocation.py b/openlp/core/utils/applocation.py index e35b41fce..7201cebe4 100644 --- a/openlp/core/utils/applocation.py +++ b/openlp/core/utils/applocation.py @@ -176,7 +176,3 @@ def _get_os_dir_path(dir_type): return os.path.join(unicode(os.getenv(u'HOME'), encoding), u'.openlp', u'data') return os.path.join(unicode(os.getenv(u'HOME'), encoding), u'.openlp') - - - - From 51eb93fe7552ea7b52b24fcde4200202902b5b64 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Wed, 27 Feb 2013 13:03:17 +0100 Subject: [PATCH 06/16] added test --- openlp/core/utils/applocation.py | 4 +- .../openlp_core_utils/test_applocation.py | 53 ++++++++++++++++--- 2 files changed, 48 insertions(+), 9 deletions(-) diff --git a/openlp/core/utils/applocation.py b/openlp/core/utils/applocation.py index 7201cebe4..fa4ce9958 100644 --- a/openlp/core/utils/applocation.py +++ b/openlp/core/utils/applocation.py @@ -113,7 +113,9 @@ class AppLocation(object): Defaults to *None*. The section of code getting the files - used to load from a section's data subdirectory. ``extension`` - Defaults to *None*. The extension to search for. + Defaults to *None*. The extension to search for. For example:: + + u'.png' """ path = AppLocation.get_data_path() if section: diff --git a/tests/functional/openlp_core_utils/test_applocation.py b/tests/functional/openlp_core_utils/test_applocation.py index b7f608966..36b9a76a4 100644 --- a/tests/functional/openlp_core_utils/test_applocation.py +++ b/tests/functional/openlp_core_utils/test_applocation.py @@ -1,12 +1,17 @@ """ Functional tests to test the AppLocation class and related methods. """ +import copy from unittest import TestCase from mock import patch from openlp.core.utils import AppLocation + +FILE_LIST = [u'file1', u'file2', u'file3.txt', u'file4.txt', u'file5.mp3', u'file6.mp3'] + + class TestAppLocation(TestCase): """ A test suite to test out various methods around the AppLocation class. @@ -16,9 +21,9 @@ class TestAppLocation(TestCase): Test the AppLocation.get_data_path() method """ with patch(u'openlp.core.utils.applocation.Settings') as mocked_class, \ - patch(u'openlp.core.utils.AppLocation.get_directory') as mocked_get_directory, \ - patch(u'openlp.core.utils.applocation.check_directory_exists') as mocked_check_directory_exists, \ - patch(u'openlp.core.utils.applocation.os') as mocked_os: + patch(u'openlp.core.utils.AppLocation.get_directory') as mocked_get_directory, \ + patch(u'openlp.core.utils.applocation.check_directory_exists') as mocked_check_directory_exists, \ + patch(u'openlp.core.utils.applocation.os') as mocked_os: # GIVEN: A mocked out Settings class and a mocked out AppLocation.get_directory() mocked_settings = mocked_class.return_value mocked_settings.contains.return_value = False @@ -38,7 +43,7 @@ class TestAppLocation(TestCase): Test the AppLocation.get_data_path() method when a custom location is set in the settings """ with patch(u'openlp.core.utils.applocation.Settings') as mocked_class,\ - patch(u'openlp.core.utils.applocation.os') as mocked_os: + patch(u'openlp.core.utils.applocation.os') as mocked_os: # GIVEN: A mocked out Settings class which returns a custom data location mocked_settings = mocked_class.return_value mocked_settings.contains.return_value = True @@ -51,12 +56,44 @@ class TestAppLocation(TestCase): mocked_settings.value.assert_called_with(u'advanced/data path') assert data_path == u'custom/dir', u'Result should be "custom/dir"' + def get_files_no_section_no_extension_test(self): + """ + Test the AppLocation.get_files() method with no parameters passed. + """ + with patch(u'openlp.core.utils.AppLocation.get_data_path') as mocked_get_data_path, \ + patch(u'openlp.core.utils.applocation.os.listdir') as mocked_listdir: + # GIVEN: Our mocked modules/methods. + mocked_get_data_path.return_value = u'test/dir' + mocked_listdir.return_value = copy.deepcopy(FILE_LIST) + + # When: Get the list of files. + result = AppLocation.get_files() + + # Then: check if the file lists are identically. + assert result == FILE_LIST, u'The file lists should be identically.' + + def get_files_test(self): + """ + Test the AppLocation.get_files() method with all parameters passed. + """ + with patch(u'openlp.core.utils.AppLocation.get_data_path') as mocked_get_data_path, \ + patch(u'openlp.core.utils.applocation.os.listdir') as mocked_listdir: + # GIVEN: Our mocked modules/methods. + mocked_get_data_path.return_value = u'test/dir' + mocked_listdir.return_value = copy.deepcopy(FILE_LIST) + + # When: Get the list of files. + result = AppLocation.get_files(u'section', u'.mp3') + + # Then: check if the file lists are identically. + assert result == [u'file5.mp3', u'file6.mp3'], u'The file lists should be identically.' + def get_section_data_path_test(self): """ Test the AppLocation.get_section_data_path() method """ with patch(u'openlp.core.utils.AppLocation.get_data_path') as mocked_get_data_path, \ - patch(u'openlp.core.utils.applocation.check_directory_exists') as mocked_check_directory_exists: + patch(u'openlp.core.utils.applocation.check_directory_exists') as mocked_check_directory_exists: # GIVEN: A mocked out AppLocation.get_data_path() mocked_get_data_path.return_value = u'test/dir' mocked_check_directory_exists.return_value = True @@ -82,9 +119,9 @@ class TestAppLocation(TestCase): Test the AppLocation.get_directory() method for AppLocation.PluginsDir """ with patch(u'openlp.core.utils.applocation._get_frozen_path') as mocked_get_frozen_path, \ - patch(u'openlp.core.utils.applocation.os.path.abspath') as mocked_abspath, \ - patch(u'openlp.core.utils.applocation.os.path.split') as mocked_split, \ - patch(u'openlp.core.utils.applocation.sys') as mocked_sys: + patch(u'openlp.core.utils.applocation.os.path.abspath') as mocked_abspath, \ + patch(u'openlp.core.utils.applocation.os.path.split') as mocked_split, \ + patch(u'openlp.core.utils.applocation.sys') as mocked_sys: mocked_abspath.return_value = u'plugins/dir' mocked_split.return_value = [u'openlp'] mocked_get_frozen_path.return_value = u'plugins/dir' From 20e26e7ea1a5343a996f594d1150d81786b47874 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Wed, 27 Feb 2013 13:41:04 +0100 Subject: [PATCH 07/16] attempt to fix test; naming errors --- openlp/core/utils/actions.py | 2 +- openlp/plugins/songs/lib/__init__.py | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/openlp/core/utils/actions.py b/openlp/core/utils/actions.py index 922aa7767..a1b2bff38 100644 --- a/openlp/core/utils/actions.py +++ b/openlp/core/utils/actions.py @@ -411,7 +411,7 @@ class ActionList(object): for existing_action in existing_actions: if action is existing_action: continue - if not global_context or existing_action in affected_actions: + if existing_action in affected_actions: return False if existing_action.shortcutContext() in [QtCore.Qt.WindowShortcut, QtCore.Qt.ApplicationShortcut]: return False diff --git a/openlp/plugins/songs/lib/__init__.py b/openlp/plugins/songs/lib/__init__.py index 93342c617..c6093eec7 100644 --- a/openlp/plugins/songs/lib/__init__.py +++ b/openlp/plugins/songs/lib/__init__.py @@ -165,7 +165,7 @@ class VerseType(object): translate('SongsPlugin.VerseType', 'Intro'), translate('SongsPlugin.VerseType', 'Ending'), translate('SongsPlugin.VerseType', 'Other')] - tanslated_tags = [name[0].lower() for name in translated_names] + translated_tags = [name[0].lower() for name in translated_names] @staticmethod def translated_tag(verse_tag, default=Other): @@ -181,9 +181,9 @@ class VerseType(object): verse_tag = verse_tag[0].lower() for num, tag in enumerate(VerseType.tags): if verse_tag == tag: - return VerseType.tanslated_tags[num].upper() - if default in VerseType.tanslated_tags: - return VerseType.tanslated_tags[default].upper() + return VerseType.translated_tags[num].upper() + if default in VerseType.translated_tags: + return VerseType.translated_tags[default].upper() @staticmethod def translated_name(verse_tag, default=Other): From c3e01dd719d97fc616926dff1a9e92c2b8d23e55 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Wed, 27 Feb 2013 14:01:42 +0100 Subject: [PATCH 08/16] fixed docs --- openlp/core/utils/applocation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openlp/core/utils/applocation.py b/openlp/core/utils/applocation.py index fa4ce9958..2f1cb45ba 100644 --- a/openlp/core/utils/applocation.py +++ b/openlp/core/utils/applocation.py @@ -27,7 +27,7 @@ # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### """ -The :mod:`openlp.core.utils` module provides the utility libraries for OpenLP. +The :mod:`openlp.core.utils.applocation` module provides an utility for OpenLP receiving the data path etc. """ import logging import os From e61d76ecff2c4155c0fcb5cba194929c56b98ae0 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Wed, 27 Feb 2013 22:40:55 +0100 Subject: [PATCH 09/16] fixed grammar --- .../openlp_core_lib/test_formattingtags.py | 12 ++++++------ tests/functional/openlp_core_lib/test_screen.py | 4 ++-- .../functional/openlp_core_utils/test_applocation.py | 8 ++++---- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/tests/functional/openlp_core_lib/test_formattingtags.py b/tests/functional/openlp_core_lib/test_formattingtags.py index 6c60be5ac..26d87f466 100644 --- a/tests/functional/openlp_core_lib/test_formattingtags.py +++ b/tests/functional/openlp_core_lib/test_formattingtags.py @@ -45,8 +45,8 @@ class TestFormattingTags(TestCase): FormattingTags.load_tags() new_tags_list = FormattingTags.get_html_tags() - # THEN: Lists should be identically. - assert old_tags_list == new_tags_list, u'The formatting tag lists should be identically.' + # THEN: Lists should be identical. + assert old_tags_list == new_tags_list, u'The formatting tag lists should be identical.' def get_html_tags_with_user_tags_test(self): """ @@ -69,16 +69,16 @@ class TestFormattingTags(TestCase): FormattingTags.add_html_tags([TAG]) new_tags_list = copy.deepcopy(FormattingTags.get_html_tags()) - # THEN: Lists should not be identically. + # THEN: Lists should not be identical. assert old_tags_list != new_tags_list, u'The lists should be different.' # THEN: Added tag and last tag should be the same. new_tag = new_tags_list.pop() - assert TAG == new_tag, u'Tags should be identically.' + assert TAG == new_tag, u'Tags should be identical.' # WHEN: Remove the new tag. FormattingTags.remove_html_tag(len(new_tags_list)) - # THEN: The lists should now be identically. - assert old_tags_list == FormattingTags.get_html_tags(), u'The lists should be identically.' + # THEN: The lists should now be identical. + assert old_tags_list == FormattingTags.get_html_tags(), u'The lists should be identical.' diff --git a/tests/functional/openlp_core_lib/test_screen.py b/tests/functional/openlp_core_lib/test_screen.py index d823a2469..4b4df8e9b 100644 --- a/tests/functional/openlp_core_lib/test_screen.py +++ b/tests/functional/openlp_core_lib/test_screen.py @@ -54,5 +54,5 @@ class TestScreenList(TestCase): new_screens = self.screens.screen_list assert len(old_screens) + 1 == len(new_screens), u'The new_screens list should be bigger.' - # THEN: The screens should be identically. - assert SCREEN == new_screens.pop(), u'The new screen should be identically to the screen defined above.' + # THEN: The screens should be identical. + assert SCREEN == new_screens.pop(), u'The new screen should be identical to the screen defined above.' diff --git a/tests/functional/openlp_core_utils/test_applocation.py b/tests/functional/openlp_core_utils/test_applocation.py index 36b9a76a4..d823b077c 100644 --- a/tests/functional/openlp_core_utils/test_applocation.py +++ b/tests/functional/openlp_core_utils/test_applocation.py @@ -69,8 +69,8 @@ class TestAppLocation(TestCase): # When: Get the list of files. result = AppLocation.get_files() - # Then: check if the file lists are identically. - assert result == FILE_LIST, u'The file lists should be identically.' + # Then: check if the file lists are identical. + assert result == FILE_LIST, u'The file lists should be identical.' def get_files_test(self): """ @@ -85,8 +85,8 @@ class TestAppLocation(TestCase): # When: Get the list of files. result = AppLocation.get_files(u'section', u'.mp3') - # Then: check if the file lists are identically. - assert result == [u'file5.mp3', u'file6.mp3'], u'The file lists should be identically.' + # Then: check if the file lists are identical. + assert result == [u'file5.mp3', u'file6.mp3'], u'The file lists should be identical.' def get_section_data_path_test(self): """ From 66a6502cdfe6dfea74f6008ae4712aededb5f413 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Thu, 28 Feb 2013 12:25:05 +0100 Subject: [PATCH 10/16] fixed bug #1116528 (Song Import Wizzard does not work in trunk) Fixes: https://launchpad.net/bugs/1116528 --- openlp/plugins/songs/forms/songimportform.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/openlp/plugins/songs/forms/songimportform.py b/openlp/plugins/songs/forms/songimportform.py index b635b309b..8e812f00e 100644 --- a/openlp/plugins/songs/forms/songimportform.py +++ b/openlp/plugins/songs/forms/songimportform.py @@ -35,7 +35,7 @@ import os from PyQt4 import QtCore, QtGui -from openlp.core.lib import Settings, UiStrings, translate +from openlp.core.lib import Registry, Settings, UiStrings, translate from openlp.core.lib.ui import critical_error_message_box from openlp.core.ui.wizard import OpenLPWizard, WizardStrings from openlp.plugins.songs.lib.importer import SongFormat, SongFormatSelect @@ -489,6 +489,16 @@ class SongImportForm(OpenLPWizard): self.formatWidgets[this_format][u'importWidget'] = importWidget return importWidget + def _get_main_window(self): + """ + Adds the main window to the class dynamically + """ + if not hasattr(self, u'_main_window'): + self._main_window = Registry().get(u'main_window') + return self._main_window + + main_window = property(_get_main_window) + class SongImportSourcePage(QtGui.QWizardPage): """ From dfa2eb1afe3749090a8aec08d06543617caafcb8 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Thu, 28 Feb 2013 15:15:17 +0100 Subject: [PATCH 11/16] fixed exception form not shown --- openlp/core/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openlp/core/__init__.py b/openlp/core/__init__.py index 3ad0e1348..adc4a250d 100644 --- a/openlp/core/__init__.py +++ b/openlp/core/__init__.py @@ -184,10 +184,10 @@ class OpenLP(QtGui.QApplication): ``traceback`` A traceback object with the details of where the exception occurred. """ - if not hasattr(self, u'mainWindow'): + if not hasattr(self, u'main_window'): log.exception(''.join(format_exception(exctype, value, traceback))) return - if not hasattr(self, u'exceptionForm'): + if not hasattr(self, u'exception_form'): self.exception_form = ExceptionForm(self.main_window) self.exception_form.exceptionTextEdit.setPlainText(''.join(format_exception(exctype, value, traceback))) self.set_normal_cursor() From 7feab25c3f8615e970d3de85375d1a080e39e712 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Thu, 28 Feb 2013 15:43:14 +0100 Subject: [PATCH 12/16] always log the exception --- openlp/core/__init__.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/openlp/core/__init__.py b/openlp/core/__init__.py index adc4a250d..d1112ab5c 100644 --- a/openlp/core/__init__.py +++ b/openlp/core/__init__.py @@ -184,9 +184,7 @@ class OpenLP(QtGui.QApplication): ``traceback`` A traceback object with the details of where the exception occurred. """ - if not hasattr(self, u'main_window'): - log.exception(''.join(format_exception(exctype, value, traceback))) - return + log.exception(''.join(format_exception(exctype, value, traceback))) if not hasattr(self, u'exception_form'): self.exception_form = ExceptionForm(self.main_window) self.exception_form.exceptionTextEdit.setPlainText(''.join(format_exception(exctype, value, traceback))) From 6ab1cc3c4bae2e79561ad97e0f76741d49e5bdc5 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Thu, 28 Feb 2013 22:36:55 +0100 Subject: [PATCH 13/16] added mock to check_dependencies --- scripts/check_dependencies.py | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/check_dependencies.py b/scripts/check_dependencies.py index 3485b8505..2e3eb08e1 100755 --- a/scripts/check_dependencies.py +++ b/scripts/check_dependencies.py @@ -91,6 +91,7 @@ OPTIONAL_MODULES = [ ('MySQLdb', ' (MySQL support)'), ('psycopg2', ' (PostgreSQL support)'), ('nose', ' (testing framework)'), + ('mock', ' (testing module)'), ] w = sys.stdout.write From 2c02420bee9bce274700951635ebeaedd48ede2c Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Fri, 1 Mar 2013 09:38:25 +0100 Subject: [PATCH 14/16] fixed AttributErrors (regressio) --- openlp/core/ui/printserviceform.py | 2 +- openlp/plugins/remotes/lib/httpserver.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/openlp/core/ui/printserviceform.py b/openlp/core/ui/printserviceform.py index 074b4d96a..d3ee179c6 100644 --- a/openlp/core/ui/printserviceform.py +++ b/openlp/core/ui/printserviceform.py @@ -406,7 +406,7 @@ class PrintServiceForm(QtGui.QDialog, Ui_PrintServiceDialog): # Only continue when we include the song's text. if not self.slideTextCheckBox.isChecked(): return - for item in self.service_manager.serviceItems: + for item in self.service_manager.service_items: # Trigger Audit requests Registry().register_function(u'print_service_started', [item[u'service_item']]) diff --git a/openlp/plugins/remotes/lib/httpserver.py b/openlp/plugins/remotes/lib/httpserver.py index 3b2c7439a..77aae2f87 100644 --- a/openlp/plugins/remotes/lib/httpserver.py +++ b/openlp/plugins/remotes/lib/httpserver.py @@ -255,7 +255,7 @@ class HttpConnection(object): current_unique_identifier = self.parent.current_item.unique_identifier else: current_unique_identifier = None - for item in self.service_manager.serviceItems: + for item in self.service_manager.service_items: service_item = item[u'service_item'] service_items.append({ u'id': unicode(service_item.unique_identifier), From 550dfe12fabb5e5f93ba8cb4cfc8568a46e248d5 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Fri, 1 Mar 2013 17:18:50 +0100 Subject: [PATCH 15/16] fixed/extended test --- tests/functional/openlp_core_utils/test_applocation.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/functional/openlp_core_utils/test_applocation.py b/tests/functional/openlp_core_utils/test_applocation.py index d823b077c..23e7c008c 100644 --- a/tests/functional/openlp_core_utils/test_applocation.py +++ b/tests/functional/openlp_core_utils/test_applocation.py @@ -83,7 +83,10 @@ class TestAppLocation(TestCase): mocked_listdir.return_value = copy.deepcopy(FILE_LIST) # When: Get the list of files. - result = AppLocation.get_files(u'section', u'.mp3') + result = AppLocation.get_files(u'sectidon', u'.mp3') + + # Then: Check if the section parameter was used correctly. + mocked_listdir.assert_called_with(u'test/dir/section') # Then: check if the file lists are identical. assert result == [u'file5.mp3', u'file6.mp3'], u'The file lists should be identical.' From fe251f96a0e054f1b12b62a23b27f4287273ad9c Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Fri, 1 Mar 2013 17:30:13 +0100 Subject: [PATCH 16/16] fixed test --- tests/functional/openlp_core_utils/test_applocation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/functional/openlp_core_utils/test_applocation.py b/tests/functional/openlp_core_utils/test_applocation.py index 23e7c008c..5473da8c0 100644 --- a/tests/functional/openlp_core_utils/test_applocation.py +++ b/tests/functional/openlp_core_utils/test_applocation.py @@ -83,7 +83,7 @@ class TestAppLocation(TestCase): mocked_listdir.return_value = copy.deepcopy(FILE_LIST) # When: Get the list of files. - result = AppLocation.get_files(u'sectidon', u'.mp3') + result = AppLocation.get_files(u'section', u'.mp3') # Then: Check if the section parameter was used correctly. mocked_listdir.assert_called_with(u'test/dir/section')