Merge lp:~sam92/openlp/worshipassistant-import into lp:openlp

Proposed by Samuel Mehrbrodt
Status: Merged
Approved by: Tim Bentley
Approved revision: 2405
Merged at revision: 2396
Proposed branch: lp:~sam92/openlp/worshipassistant-import
Merge into: lp:openlp
Diff against target: 558 lines (+360/-24)
14 files modified
openlp/plugins/bibles/lib/http.py (+2/-2)
openlp/plugins/songs/lib/cclifileimport.py (+1/-1)
openlp/plugins/songs/lib/importer.py (+22/-9)
openlp/plugins/songs/lib/worshipassistantimport.py (+171/-0)
tests/functional/openlp_plugins/songs/test_opensongimport.py (+3/-3)
tests/functional/openlp_plugins/songs/test_propresenterimport.py (+1/-1)
tests/functional/openlp_plugins/songs/test_songshowplusimport.py (+3/-3)
tests/functional/openlp_plugins/songs/test_worshipassistantimport.py (+56/-0)
tests/helpers/songfileimport.py (+1/-1)
tests/resources/worshipassistantsongs/du_herr.csv (+30/-0)
tests/resources/worshipassistantsongs/du_herr.json (+21/-0)
tests/resources/worshipassistantsongs/would_you_be_free.csv (+30/-0)
tests/resources/worshipassistantsongs/would_you_be_free.json (+19/-0)
tests/utils/test_bzr_tags.py (+0/-4)
To merge this branch: bzr merge lp:~sam92/openlp/worshipassistant-import
Reviewer Review Type Date Requested Status
Raoul Snyman Approve
Tomas Groth Approve
Tim Bentley Approve
Review via email: mp+224956@code.launchpad.net

This proposal supersedes a proposal from 2014-06-26.

To post a comment you must log in.
Revision history for this message
Tomas Groth (tomasgroth) wrote : Posted in a previous version of this proposal

See inline comments.

review: Needs Fixing
Revision history for this message
Samuel Mehrbrodt (sam92) wrote : Posted in a previous version of this proposal

I responded to one issue inline, will fix the others.
Thanks!

Revision history for this message
Tomas Groth (tomasgroth) wrote : Posted in a previous version of this proposal

Looks good to me :)
But after talking to Raoul I'm not sure the bzr tags test needs fixing after all..

Revision history for this message
Tomas Groth (tomasgroth) : Posted in a previous version of this proposal
review: Approve
Revision history for this message
Tim Bentley (trb143) : Posted in a previous version of this proposal
review: Needs Fixing
Revision history for this message
Tim Bentley (trb143) :
review: Approve
Revision history for this message
Tomas Groth (tomasgroth) :
review: Approve
Revision history for this message
Raoul Snyman (raoul-snyman) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'openlp/plugins/bibles/lib/http.py'
2--- openlp/plugins/bibles/lib/http.py 2014-05-02 06:42:17 +0000
3+++ openlp/plugins/bibles/lib/http.py 2014-06-30 07:21:09 +0000
4@@ -225,7 +225,7 @@
5 url_book_name = urllib.parse.quote(book_name.encode("utf-8"))
6 url_params = 'search=%s+%s&version=%s' % (url_book_name, chapter, version)
7 soup = get_soup_for_bible_ref(
8- 'http://www.biblegateway.com/passage/?%s' % url_params,
9+ 'http://legacy.biblegateway.com/passage/?%s' % url_params,
10 pre_parse_regex=r'<meta name.*?/>', pre_parse_substitute='')
11 if not soup:
12 return None
13@@ -252,7 +252,7 @@
14 """
15 log.debug('BGExtract.get_books_from_http("%s")', version)
16 url_params = urllib.parse.urlencode({'action': 'getVersionInfo', 'vid': '%s' % version})
17- reference_url = 'http://www.biblegateway.com/versions/?%s#books' % url_params
18+ reference_url = 'http://legacy.biblegateway.com/versions/?%s#books' % url_params
19 page = get_web_page(reference_url)
20 if not page:
21 send_error_message('download')
22
23=== modified file 'openlp/plugins/songs/lib/cclifileimport.py'
24--- openlp/plugins/songs/lib/cclifileimport.py 2014-05-21 14:47:44 +0000
25+++ openlp/plugins/songs/lib/cclifileimport.py 2014-06-30 07:21:09 +0000
26@@ -64,7 +64,7 @@
27 filename = str(filename)
28 log.debug('Importing CCLI File: %s', filename)
29 if os.path.isfile(filename):
30- detect_file = open(filename, 'r')
31+ detect_file = open(filename, 'rb')
32 detect_content = detect_file.read(2048)
33 try:
34 str(detect_content, 'utf-8')
35
36=== modified file 'openlp/plugins/songs/lib/importer.py'
37--- openlp/plugins/songs/lib/importer.py 2014-06-09 10:27:17 +0000
38+++ openlp/plugins/songs/lib/importer.py 2014-06-30 07:21:09 +0000
39@@ -50,6 +50,7 @@
40 from .foilpresenterimport import FoilPresenterImport
41 from .zionworximport import ZionWorxImport
42 from .propresenterimport import ProPresenterImport
43+from .worshipassistantimport import WorshipAssistantImport
44 # Imports that might fail
45
46
47@@ -167,8 +168,9 @@
48 SongsOfFellowship = 16
49 SundayPlus = 17
50 WordsOfWorship = 18
51- WorshipCenterPro = 19
52- ZionWorx = 20
53+ WorshipAssistant = 19
54+ WorshipCenterPro = 20
55+ ZionWorx = 21
56
57 # Set optional attribute defaults
58 __defaults__ = {
59@@ -321,6 +323,16 @@
60 'prefix': 'wordsOfWorship',
61 'filter': '%s (*.wsg *.wow-song)' % translate('SongsPlugin.ImportWizardForm', 'Words Of Worship Song Files')
62 },
63+ WorshipAssistant: {
64+ 'class': WorshipAssistantImport,
65+ 'name': 'Worship Assistant 0',
66+ 'prefix': 'worshipAssistant',
67+ 'selectMode': SongFormatSelect.SingleFile,
68+ 'filter': '%s (*.csv)' % translate('SongsPlugin.ImportWizardForm', 'Worship Assistant Files'),
69+ 'comboBoxText': translate('SongsPlugin.ImportWizardForm', 'Worship Assistant (CSV)'),
70+ 'descriptionText': translate('SongsPlugin.ImportWizardForm',
71+ 'In Worship Assistant, export your Database to a CSV file.')
72+ },
73 WorshipCenterPro: {
74 'name': 'WorshipCenter Pro',
75 'prefix': 'worshipCenterPro',
76@@ -370,16 +382,17 @@
77 SongFormat.SongsOfFellowship,
78 SongFormat.SundayPlus,
79 SongFormat.WordsOfWorship,
80+ SongFormat.WorshipAssistant,
81 SongFormat.WorshipCenterPro,
82 SongFormat.ZionWorx
83 ]
84
85 @staticmethod
86- def get(format, *attributes):
87+ def get(song_format, *attributes):
88 """
89 Return requested song format attribute(s).
90
91- :param format: A song format from SongFormat.
92+ :param song_format: A song format from SongFormat.
93 :param attributes: Zero or more song format attributes from SongFormat.
94
95 Return type depends on number of supplied attributes:
96@@ -389,23 +402,23 @@
97 :>1: Return tuple of requested attribute values.
98 """
99 if not attributes:
100- return SongFormat.__attributes__.get(format)
101+ return SongFormat.__attributes__.get(song_format)
102 elif len(attributes) == 1:
103 default = SongFormat.__defaults__.get(attributes[0])
104- return SongFormat.__attributes__[format].get(attributes[0], default)
105+ return SongFormat.__attributes__[song_format].get(attributes[0], default)
106 else:
107 values = []
108 for attr in attributes:
109 default = SongFormat.__defaults__.get(attr)
110- values.append(SongFormat.__attributes__[format].get(attr, default))
111+ values.append(SongFormat.__attributes__[song_format].get(attr, default))
112 return tuple(values)
113
114 @staticmethod
115- def set(format, attribute, value):
116+ def set(song_format, attribute, value):
117 """
118 Set specified song format attribute to the supplied value.
119 """
120- SongFormat.__attributes__[format][attribute] = value
121+ SongFormat.__attributes__[song_format][attribute] = value
122
123
124 SongFormat.set(SongFormat.SongsOfFellowship, 'availability', HAS_SOF)
125
126=== added file 'openlp/plugins/songs/lib/worshipassistantimport.py'
127--- openlp/plugins/songs/lib/worshipassistantimport.py 1970-01-01 00:00:00 +0000
128+++ openlp/plugins/songs/lib/worshipassistantimport.py 2014-06-30 07:21:09 +0000
129@@ -0,0 +1,171 @@
130+# -*- coding: utf-8 -*-
131+# vim: autoindent shiftwidth=4 expandtab textwidth=120 tabstop=4 softtabstop=4
132+
133+###############################################################################
134+# OpenLP - Open Source Lyrics Projection #
135+# --------------------------------------------------------------------------- #
136+# Copyright (c) 2008-2014 Raoul Snyman #
137+# Portions copyright (c) 2008-2014 Tim Bentley, Gerald Britton, Jonathan #
138+# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, #
139+# Meinert Jordan, Armin Köhler, Erik Lundin, Edwin Lunando, Brian T. Meyer. #
140+# Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias Põldaru, #
141+# Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, #
142+# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Dave Warnock, #
143+# Frode Woldsund, Martin Zibricky, Patrick Zimmermann #
144+# --------------------------------------------------------------------------- #
145+# This program is free software; you can redistribute it and/or modify it #
146+# under the terms of the GNU General Public License as published by the Free #
147+# Software Foundation; version 2 of the License. #
148+# #
149+# This program is distributed in the hope that it will be useful, but WITHOUT #
150+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or #
151+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for #
152+# more details. #
153+# #
154+# You should have received a copy of the GNU General Public License along #
155+# with this program; if not, write to the Free Software Foundation, Inc., 59 #
156+# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
157+###############################################################################
158+"""
159+The :mod:`worshipassistantimport` module provides the functionality for importing
160+Worship Assistant songs into the OpenLP database.
161+"""
162+import chardet
163+import csv
164+import logging
165+import re
166+
167+from openlp.core.common import translate
168+from openlp.plugins.songs.lib import VerseType
169+from openlp.plugins.songs.lib.songimport import SongImport
170+
171+log = logging.getLogger(__name__)
172+
173+EMPTY_STR = 'NULL'
174+
175+
176+class WorshipAssistantImport(SongImport):
177+ """
178+ The :class:`WorshipAssistantImport` class provides the ability to import songs
179+ from Worship Assistant, via a dump of the database to a CSV file.
180+
181+ The following fields are in the exported CSV file:
182+
183+ * ``SONGNR`` Song ID (Discarded by importer)
184+ * ``TITLE`` Song title
185+ * ``AUTHOR`` Song author.
186+ * ``COPYRIGHT`` Copyright information
187+ * ``FIRSTLINE`` Unknown (Discarded by importer)
188+ * ``PRIKEY`` Primary chord key (Discarded by importer)
189+ * ``ALTKEY`` Alternate chord key (Discarded by importer)
190+ * ``TEMPO`` Tempo (Discarded by importer)
191+ * ``FOCUS`` Unknown (Discarded by importer)
192+ * ``THEME`` Theme (Discarded by importer)
193+ * ``SCRIPTURE`` Associated scripture (Discarded by importer)
194+ * ``ACTIVE`` Boolean value (Discarded by importer)
195+ * ``SONGBOOK`` Boolean value (Discarded by importer)
196+ * ``TIMESIG`` Unknown (Discarded by importer)
197+ * ``INTRODUCED`` Date the song was created (Discarded by importer)
198+ * ``LASTUSED`` Date the song was last used (Discarded by importer)
199+ * ``TIMESUSED`` How many times the song was used (Discarded by importer)
200+ * ``CCLINR`` CCLI Number
201+ * ``USER1`` User Field 1 (Discarded by importer)
202+ * ``USER2`` User Field 2 (Discarded by importer)
203+ * ``USER3`` User Field 3 (Discarded by importer)
204+ * ``USER4`` User Field 4 (Discarded by importer)
205+ * ``USER5`` User Field 5 (Discarded by importer)
206+ * ``ROADMAP`` Verse order used for the presentation
207+ * ``FILELINK1`` Associated file 1 (Discarded by importer)
208+ * ``OVERMAP`` Verse order used for printing (Discarded by importer)
209+ * ``FILELINK2`` Associated file 2 (Discarded by importer)
210+ * ``LYRICS`` The song lyrics used for printing (Discarded by importer, LYRICS2 is used instead)
211+ * ``INFO`` Unknown (Discarded by importer)
212+ * ``LYRICS2`` The song lyrics used for the presentation
213+ * ``BACKGROUND`` Custom background (Discarded by importer)
214+ """
215+ def do_import(self):
216+ """
217+ Receive a CSV file to import.
218+ """
219+ # Get encoding
220+ detect_file = open(self.import_source, 'rb')
221+ detect_content = detect_file.read()
222+ details = chardet.detect(detect_content)
223+ detect_file.close()
224+ songs_file = open(self.import_source, 'r', encoding=details['encoding'])
225+ songs_reader = csv.DictReader(songs_file)
226+ try:
227+ records = list(songs_reader)
228+ except csv.Error as e:
229+ self.log_error(translate('SongsPlugin.WorshipAssistantImport', 'Error reading CSV file.'),
230+ translate('SongsPlugin.WorshipAssistantImport', 'Line %d: %s') %
231+ (songs_reader.line_num, e))
232+ return
233+ num_records = len(records)
234+ log.info('%s records found in CSV file' % num_records)
235+ self.import_wizard.progress_bar.setMaximum(num_records)
236+ for index, record in enumerate(records, 1):
237+ if self.stop_import_flag:
238+ return
239+ # Ensure that all keys are uppercase
240+ record = dict((field.upper(), value) for field, value in record.items())
241+ # The CSV file has a line in the middle of the file where the headers are repeated.
242+ # We need to skip this line.
243+ if record['TITLE'] == "TITLE" and record['AUTHOR'] == 'AUTHOR' and record['LYRICS2'] == 'LYRICS2':
244+ continue
245+ self.set_defaults()
246+ verse_order_list = []
247+ try:
248+ self.title = record['TITLE']
249+ if record['AUTHOR'] != EMPTY_STR:
250+ self.parse_author(record['AUTHOR'])
251+ print(record['AUTHOR'])
252+ if record['COPYRIGHT'] != EMPTY_STR:
253+ self.add_copyright(record['COPYRIGHT'])
254+ if record['CCLINR'] != EMPTY_STR:
255+ self.ccli_number = record['CCLINR']
256+ if record['ROADMAP'] != EMPTY_STR:
257+ verse_order_list = record['ROADMAP'].split(',')
258+ lyrics = record['LYRICS2']
259+ except UnicodeDecodeError as e:
260+ self.log_error(translate('SongsPlugin.WorshipAssistantImport', 'Record %d' % index),
261+ translate('SongsPlugin.WorshipAssistantImport', 'Decoding error: %s') % e)
262+ continue
263+ except TypeError as e:
264+ self.log_error(translate('SongsPlugin.WorshipAssistantImport',
265+ 'File not valid WorshipAssistant CSV format.'), 'TypeError: %s' % e)
266+ return
267+ verse = ''
268+ for line in lyrics.splitlines():
269+ if line.startswith('['): # verse marker
270+ # drop the square brackets
271+ right_bracket = line.find(']')
272+ content = line[1:right_bracket].lower()
273+ match = re.match('(\D*)(\d+)', content)
274+ if match is not None:
275+ verse_tag = match.group(1)
276+ verse_num = match.group(2)
277+ else:
278+ # otherwise we assume number 1 and take the whole prefix as the verse tag
279+ verse_tag = content
280+ verse_num = '1'
281+ verse_index = VerseType.from_loose_input(verse_tag) if verse_tag else 0
282+ verse_tag = VerseType.tags[verse_index]
283+ # Update verse order when the verse name has changed
284+ if content != verse_tag + verse_num:
285+ for i in range(len(verse_order_list)):
286+ if verse_order_list[i].lower() == content.lower():
287+ verse_order_list[i] = verse_tag + verse_num
288+ elif line and not line.isspace():
289+ verse += line + '\n'
290+ elif verse:
291+ self.add_verse(verse, verse_tag+verse_num)
292+ verse = ''
293+ if verse:
294+ self.add_verse(verse, verse_tag+verse_num)
295+ if verse_order_list:
296+ self.verse_order_list = verse_order_list
297+ if not self.finish():
298+ self.log_error(translate('SongsPlugin.WorshipAssistantImport', 'Record %d') % index
299+ + (': "' + self.title + '"' if self.title else ''))
300+ songs_file.close()
301
302=== modified file 'tests/functional/openlp_plugins/songs/test_opensongimport.py'
303--- tests/functional/openlp_plugins/songs/test_opensongimport.py 2014-04-30 20:39:40 +0000
304+++ tests/functional/openlp_plugins/songs/test_opensongimport.py 2014-06-30 07:21:09 +0000
305@@ -52,11 +52,11 @@
306 """
307 Test that loading an OpenSong file works correctly on various files
308 """
309- self.file_import(os.path.join(TEST_PATH, 'Amazing Grace'),
310+ self.file_import([os.path.join(TEST_PATH, 'Amazing Grace')],
311 self.load_external_result_data(os.path.join(TEST_PATH, 'Amazing Grace.json')))
312- self.file_import(os.path.join(TEST_PATH, 'Beautiful Garden Of Prayer'),
313+ self.file_import([os.path.join(TEST_PATH, 'Beautiful Garden Of Prayer')],
314 self.load_external_result_data(os.path.join(TEST_PATH, 'Beautiful Garden Of Prayer.json')))
315- self.file_import(os.path.join(TEST_PATH, 'One, Two, Three, Four, Five'),
316+ self.file_import([os.path.join(TEST_PATH, 'One, Two, Three, Four, Five')],
317 self.load_external_result_data(os.path.join(TEST_PATH, 'One, Two, Three, Four, Five.json')))
318
319
320
321=== modified file 'tests/functional/openlp_plugins/songs/test_propresenterimport.py'
322--- tests/functional/openlp_plugins/songs/test_propresenterimport.py 2014-06-09 10:27:17 +0000
323+++ tests/functional/openlp_plugins/songs/test_propresenterimport.py 2014-06-30 07:21:09 +0000
324@@ -50,5 +50,5 @@
325 """
326 Test that loading an ProPresenter file works correctly
327 """
328- self.file_import(os.path.join(TEST_PATH, 'Amazing Grace.pro4'),
329+ self.file_import([os.path.join(TEST_PATH, 'Amazing Grace.pro4')],
330 self.load_external_result_data(os.path.join(TEST_PATH, 'Amazing Grace.json')))
331
332=== modified file 'tests/functional/openlp_plugins/songs/test_songshowplusimport.py'
333--- tests/functional/openlp_plugins/songs/test_songshowplusimport.py 2014-05-11 04:45:30 +0000
334+++ tests/functional/openlp_plugins/songs/test_songshowplusimport.py 2014-06-30 07:21:09 +0000
335@@ -53,11 +53,11 @@
336 """
337 Test that loading a SongShow Plus file works correctly on various files
338 """
339- self.file_import(os.path.join(TEST_PATH, 'Amazing Grace.sbsong'),
340+ self.file_import([os.path.join(TEST_PATH, 'Amazing Grace.sbsong')],
341 self.load_external_result_data(os.path.join(TEST_PATH, 'Amazing Grace.json')))
342- self.file_import(os.path.join(TEST_PATH, 'Beautiful Garden Of Prayer.sbsong'),
343+ self.file_import([os.path.join(TEST_PATH, 'Beautiful Garden Of Prayer.sbsong')],
344 self.load_external_result_data(os.path.join(TEST_PATH, 'Beautiful Garden Of Prayer.json')))
345- self.file_import(os.path.join(TEST_PATH, 'a mighty fortress is our god.sbsong'),
346+ self.file_import([os.path.join(TEST_PATH, 'a mighty fortress is our god.sbsong')],
347 self.load_external_result_data(os.path.join(TEST_PATH, 'a mighty fortress is our god.json')))
348
349
350
351=== added file 'tests/functional/openlp_plugins/songs/test_worshipassistantimport.py'
352--- tests/functional/openlp_plugins/songs/test_worshipassistantimport.py 1970-01-01 00:00:00 +0000
353+++ tests/functional/openlp_plugins/songs/test_worshipassistantimport.py 2014-06-30 07:21:09 +0000
354@@ -0,0 +1,56 @@
355+# -*- coding: utf-8 -*-
356+# vim: autoindent shiftwidth=4 expandtab textwidth=120 tabstop=4 softtabstop=4
357+
358+###############################################################################
359+# OpenLP - Open Source Lyrics Projection #
360+# --------------------------------------------------------------------------- #
361+# Copyright (c) 2008-2013 Raoul Snyman #
362+# Portions copyright (c) 2008-2013 Tim Bentley, Gerald Britton, Jonathan #
363+# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, #
364+# Meinert Jordan, Armin Köhler, Erik Lundin, Edwin Lunando, Brian T. Meyer. #
365+# Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias Põldaru, #
366+# Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, #
367+# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Dave Warnock, #
368+# Frode Woldsund, Martin Zibricky, Patrick Zimmermann #
369+# --------------------------------------------------------------------------- #
370+# This program is free software; you can redistribute it and/or modify it #
371+# under the terms of the GNU General Public License as published by the Free #
372+# Software Foundation; version 2 of the License. #
373+# #
374+# This program is distributed in the hope that it will be useful, but WITHOUT #
375+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or #
376+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for #
377+# more details. #
378+# #
379+# You should have received a copy of the GNU General Public License along #
380+# with this program; if not, write to the Free Software Foundation, Inc., 59 #
381+# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
382+###############################################################################
383+"""
384+The :mod:`worshipassistantimport` module provides the functionality for importing
385+WorshipAssistant song files into the current installation database.
386+"""
387+
388+import os
389+
390+from tests.helpers.songfileimport import SongImportTestHelper
391+
392+TEST_PATH = os.path.abspath(
393+ os.path.join(os.path.dirname(__file__), '..', '..', '..', 'resources', 'worshipassistantsongs'))
394+
395+
396+class TestWorshipAssistantFileImport(SongImportTestHelper):
397+
398+ def __init__(self, *args, **kwargs):
399+ self.importer_class_name = 'WorshipAssistantImport'
400+ self.importer_module_name = 'worshipassistantimport'
401+ super(TestWorshipAssistantFileImport, self).__init__(*args, **kwargs)
402+
403+ def test_song_import(self):
404+ """
405+ Test that loading an Worship Assistant file works correctly
406+ """
407+ self.file_import(os.path.join(TEST_PATH, 'du_herr.csv'),
408+ self.load_external_result_data(os.path.join(TEST_PATH, 'du_herr.json')))
409+ self.file_import(os.path.join(TEST_PATH, 'would_you_be_free.csv'),
410+ self.load_external_result_data(os.path.join(TEST_PATH, 'would_you_be_free.json')))
411
412=== modified file 'tests/helpers/songfileimport.py'
413--- tests/helpers/songfileimport.py 2014-06-04 04:54:44 +0000
414+++ tests/helpers/songfileimport.py 2014-06-30 07:21:09 +0000
415@@ -95,7 +95,7 @@
416 importer.topics = []
417
418 # WHEN: Importing the source file
419- importer.import_source = [source_file_name]
420+ importer.import_source = source_file_name
421 add_verse_calls = self._get_data(result_data, 'verses')
422 author_calls = self._get_data(result_data, 'authors')
423 ccli_number = self._get_data(result_data, 'ccli_number')
424
425=== added directory 'tests/resources/worshipassistantsongs'
426=== added file 'tests/resources/worshipassistantsongs/du_herr.csv'
427--- tests/resources/worshipassistantsongs/du_herr.csv 1970-01-01 00:00:00 +0000
428+++ tests/resources/worshipassistantsongs/du_herr.csv 2014-06-30 07:21:09 +0000
429@@ -0,0 +1,30 @@
430+"SongID","SongNr","Title","Author","Copyright","FirstLine","PriKey","AltKey","Tempo","Focus","Theme","Scripture","Active","Songbook","TimeSig","Introduced","LastUsed","TimesUsed","CCLINr","User1","User2","User3","User4","User5","Roadmap","Overmap","FileLink1","FileLink2","Updated","Lyrics","Info","Lyrics2","Background"
431+"4ee399dc-edda-4aa9-891e-a859ca093c78","NULL","Du, Herr, verläßt mich nicht","Carl Brockhaus / Johann Georg Bäßler 1806","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","1","1","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","NULL","2014-06-25 12:15:28.317","","NULL","[1]
432+Du, Herr, verläßt mich nicht.
433+Auf Dich mein Herz allein vertraut,
434+Mein Auge glaubend auf Dich schaut.
435+Du bist mein Heil, mein Licht,
436+Mein Fels, mein sichrer Hort.
437+Bin ich versucht, gibt's Not und Leid,
438+Du bleibst mein Trost, mein Arm im Streit,
439+Mein Licht am dunklen Ort.
440+
441+[2]
442+Ich weiß, daß Du mich liebst.
443+Bist mir in jeder Lage nah',
444+Wohin ich gehe – Du bist da,
445+Ja, Du mir alles gibst.
446+Ich überlaß mich Dir;
447+Denn Du, Herr, kennst mich ganz und gar
448+Und führst mich sicher, wunderbar,
449+Und bist selbst alles mir.
450+
451+[3]
452+In dieser Wüste hier
453+Find't nirgend meine Seele Ruh',
454+Denn meine Ruh' bist, Jesu, Du.
455+Wohl mir, ich geh' zu Dir!
456+Bald werd' ich bei Dir sein,
457+Bald mit den Deinen ewiglich
458+Anbeten, loben, preisen Dich,
459+Mich Deiner stets erfreun.","NULL"
460
461=== added file 'tests/resources/worshipassistantsongs/du_herr.json'
462--- tests/resources/worshipassistantsongs/du_herr.json 1970-01-01 00:00:00 +0000
463+++ tests/resources/worshipassistantsongs/du_herr.json 2014-06-30 07:21:09 +0000
464@@ -0,0 +1,21 @@
465+{
466+ "authors": [
467+ "Carl Brockhaus / Johann Georg Bäßler 1806"
468+ ],
469+ "title": "Du, Herr, verläßt mich nicht",
470+ "verse_order_list": [],
471+ "verses": [
472+ [
473+ "Du, Herr, verläßt mich nicht.\nAuf Dich mein Herz allein vertraut,\nMein Auge glaubend auf Dich schaut.\nDu bist mein Heil, mein Licht,\nMein Fels, mein sichrer Hort.\nBin ich versucht, gibt's Not und Leid,\nDu bleibst mein Trost, mein Arm im Streit,\nMein Licht am dunklen Ort.\n",
474+ "v1"
475+ ],
476+ [
477+ "Ich weiß, daß Du mich liebst.\nBist mir in jeder Lage nah',\nWohin ich gehe – Du bist da,\nJa, Du mir alles gibst.\nIch überlaß mich Dir;\nDenn Du, Herr, kennst mich ganz und gar\nUnd führst mich sicher, wunderbar,\nUnd bist selbst alles mir.\n",
478+ "v2"
479+ ],
480+ [
481+ "In dieser Wüste hier\nFind't nirgend meine Seele Ruh',\nDenn meine Ruh' bist, Jesu, Du.\nWohl mir, ich geh' zu Dir!\nBald werd' ich bei Dir sein,\nBald mit den Deinen ewiglich\nAnbeten, loben, preisen Dich,\nMich Deiner stets erfreun.\n",
482+ "v3"
483+ ]
484+ ]
485+}
486
487=== added file 'tests/resources/worshipassistantsongs/would_you_be_free.csv'
488--- tests/resources/worshipassistantsongs/would_you_be_free.csv 1970-01-01 00:00:00 +0000
489+++ tests/resources/worshipassistantsongs/would_you_be_free.csv 2014-06-30 07:21:09 +0000
490@@ -0,0 +1,30 @@
491+SONGNR,TITLE,AUTHOR,COPYRIGHT,FIRSTLINE,PRIKEY,ALTKEY,TEMPO,FOCUS,THEME,SCRIPTURE,ACTIVE,SONGBOOK,TIMESIG,INTRODUCED,LASTUSED,TIMESUSED,CCLINR,USER1,USER2,USER3,USER4,USER5,ROADMAP,FILELINK1,OVERMAP,FILELINK2,LYRICS,INFO,LYRICS2,Background
492+"7","Would You Be Free","Jones, Lewis E.","Public Domain","Would you be free from your burden of sin?","G","","Moderate","Only To Others","","","N","Y","","1899-12-30","1899-12-30","","","","","","","","1,C,1","","","",".G C G
493+ Would you be free from your burden of sin?
494+. D D7 G
495+ There's power in the blood, power in the blood
496+. C G
497+ Would you o'er evil a victory win?
498+. D D7 G
499+ There's wonderful power in the blood
500+
501+.G C G
502+ There is power, power, wonder working power
503+.D G
504+ In the blood of the Lamb
505+. C G
506+ There is power, power, wonder working power
507+. D G
508+ In the precious blood of the Lamb
509+","","[1]
510+Would you be free from your burden of sin?
511+There's power in the blood, power in the blood
512+Would you o'er evil a victory win?
513+There's wonderful power in the blood
514+
515+[C]
516+There is power, power, wonder working power
517+In the blood of the Lamb
518+There is power, power, wonder working power
519+In the precious blood of the Lamb
520+",""
521
522=== added file 'tests/resources/worshipassistantsongs/would_you_be_free.json'
523--- tests/resources/worshipassistantsongs/would_you_be_free.json 1970-01-01 00:00:00 +0000
524+++ tests/resources/worshipassistantsongs/would_you_be_free.json 2014-06-30 07:21:09 +0000
525@@ -0,0 +1,19 @@
526+{
527+ "authors": [
528+ "Jones",
529+ "Lewis E"
530+ ],
531+ "title": "Would You Be Free",
532+ "verse_order_list": ["v1", "c1", "v1"],
533+ "copyright": "Public Domain",
534+ "verses": [
535+ [
536+ "Would you be free from your burden of sin? \nThere's power in the blood, power in the blood \nWould you o'er evil a victory win? \nThere's wonderful power in the blood \n",
537+ "v1"
538+ ],
539+ [
540+ "There is power, power, wonder working power \nIn the blood of the Lamb \nThere is power, power, wonder working power \nIn the precious blood of the Lamb \n",
541+ "c1"
542+ ]
543+ ]
544+}
545
546=== modified file 'tests/utils/test_bzr_tags.py'
547--- tests/utils/test_bzr_tags.py 2014-05-03 15:34:13 +0000
548+++ tests/utils/test_bzr_tags.py 2014-06-30 07:21:09 +0000
549@@ -50,10 +50,6 @@
550 ['1.9.11', '2039'],
551 ['1.9.12', '2063'],
552 ['2.0', '2118'],
553- ['2.0.1', '?'],
554- ['2.0.2', '?'],
555- ['2.0.3', '?'],
556- ['2.0.4', '?'],
557 ['2.1.0', '2119']
558 ]
559