forked from openlp/openlp
Add tests for OpenSongImport, and fixes so that they pass
This commit is contained in:
parent
d62b92718d
commit
e6162e033f
|
@ -107,9 +107,14 @@ class OpenSongImport(SongImport):
|
||||||
"""
|
"""
|
||||||
Initialise the class.
|
Initialise the class.
|
||||||
"""
|
"""
|
||||||
SongImport.__init__(self, manager, **kwargs)
|
super(OpenSongImport, self).__init__(manager, **kwargs)
|
||||||
|
|
||||||
def do_import(self):
|
def do_import(self):
|
||||||
|
"""
|
||||||
|
Receive a single file or a list of files to import.
|
||||||
|
"""
|
||||||
|
if not isinstance(self.import_source, list):
|
||||||
|
return
|
||||||
self.import_wizard.progress_bar.setMaximum(len(self.import_source))
|
self.import_wizard.progress_bar.setMaximum(len(self.import_source))
|
||||||
for filename in self.import_source:
|
for filename in self.import_source:
|
||||||
if self.stop_import_flag:
|
if self.stop_import_flag:
|
||||||
|
@ -141,19 +146,39 @@ class OpenSongImport(SongImport):
|
||||||
'author': self.parse_author,
|
'author': self.parse_author,
|
||||||
'title': 'title',
|
'title': 'title',
|
||||||
'aka': 'alternate_title',
|
'aka': 'alternate_title',
|
||||||
'hymn_number': 'song_number'
|
'hymn_number': self.parse_song_book_name_and_number,
|
||||||
|
'user1': self.add_comment,
|
||||||
|
'user2': self.add_comment,
|
||||||
|
'user3': self.add_comment
|
||||||
}
|
}
|
||||||
for attr, fn_or_string in list(decode.items()):
|
for attr, fn_or_string in list(decode.items()):
|
||||||
if attr in fields:
|
if attr in fields:
|
||||||
ustring = str(root.__getattr__(attr))
|
ustring = str(root.__getattr__(attr))
|
||||||
if isinstance(fn_or_string, str):
|
if isinstance(fn_or_string, str):
|
||||||
|
match = re.match('(\D*)(\d+.*)', ustring)
|
||||||
|
if match:
|
||||||
|
setattr(self, fn_or_string, int(ustring))
|
||||||
|
else:
|
||||||
setattr(self, fn_or_string, ustring)
|
setattr(self, fn_or_string, ustring)
|
||||||
else:
|
else:
|
||||||
fn_or_string(ustring)
|
fn_or_string(ustring)
|
||||||
if 'theme' in fields and str(root.theme) not in self.topics:
|
# Themes look like "God: Awe/Wonder", but we just want
|
||||||
self.topics.append(str(root.theme))
|
# "Awe" and "Wonder". We use a set to ensure each topic
|
||||||
if 'alttheme' in fields and str(root.alttheme) not in self.topics:
|
# is only added once, in case it is already there, which
|
||||||
self.topics.append(str(root.alttheme))
|
# is actually quite likely if the alttheme is set
|
||||||
|
topics = set(self.topics)
|
||||||
|
if 'theme' in fields:
|
||||||
|
theme = str(root.theme)
|
||||||
|
subthemes = theme[theme.find(':')+1:].split('/')
|
||||||
|
for topic in subthemes:
|
||||||
|
topics.add(topic.strip())
|
||||||
|
if 'alttheme' in fields:
|
||||||
|
theme = str(root.alttheme)
|
||||||
|
subthemes = theme[theme.find(':')+1:].split('/')
|
||||||
|
for topic in subthemes:
|
||||||
|
topics.add(topic.strip())
|
||||||
|
self.topics = list(topics)
|
||||||
|
self.topics.sort()
|
||||||
# data storage while importing
|
# data storage while importing
|
||||||
verses = {}
|
verses = {}
|
||||||
# keep track of verses appearance order
|
# keep track of verses appearance order
|
||||||
|
@ -209,8 +234,9 @@ class OpenSongImport(SongImport):
|
||||||
# Tidy text and remove the ____s from extended words
|
# Tidy text and remove the ____s from extended words
|
||||||
this_line = self.tidy_text(this_line)
|
this_line = self.tidy_text(this_line)
|
||||||
this_line = this_line.replace('_', '')
|
this_line = this_line.replace('_', '')
|
||||||
this_line = this_line.replace('|', '\n')
|
this_line = this_line.replace('||', '\n[---]\n')
|
||||||
this_line = this_line.strip()
|
this_line = this_line.strip()
|
||||||
|
this_line = this_line.replace('|', '\n')
|
||||||
verses[verse_tag][verse_num][inst].append(this_line)
|
verses[verse_tag][verse_num][inst].append(this_line)
|
||||||
# done parsing
|
# done parsing
|
||||||
# add verses in original order
|
# add verses in original order
|
||||||
|
|
|
@ -188,6 +188,55 @@ class SongImport(QtCore.QObject):
|
||||||
self.title = lines[0]
|
self.title = lines[0]
|
||||||
self.add_verse(text)
|
self.add_verse(text)
|
||||||
|
|
||||||
|
def parse_song_book_name_and_number(self, book_and_number):
|
||||||
|
"""
|
||||||
|
Build the book name and song number from a single string
|
||||||
|
"""
|
||||||
|
# Turn 'Spring Harvest 1997 No. 34' or
|
||||||
|
# 'Spring Harvest 1997 (34)' or
|
||||||
|
# 'Spring Harvest 1997 34' into
|
||||||
|
# Book name:'Spring Harvest 1997' and
|
||||||
|
# Song number: 34
|
||||||
|
#
|
||||||
|
# Also, turn 'NRH231.' into
|
||||||
|
# Book name:'NRH' and
|
||||||
|
# Song number: 231
|
||||||
|
|
||||||
|
book_and_number = book_and_number.strip()
|
||||||
|
if book_and_number == '':
|
||||||
|
return
|
||||||
|
book_and_number = book_and_number.replace('No.', ' ')
|
||||||
|
if ' ' in book_and_number:
|
||||||
|
parts = book_and_number.split(' ')
|
||||||
|
self.song_book_name = ' '.join(parts[:-1])
|
||||||
|
self.song_number = parts[-1].strip('()')
|
||||||
|
else:
|
||||||
|
# Something like 'ABC123.'
|
||||||
|
match = re.match(r'(.*\D)(\d+)', book_and_number)
|
||||||
|
match_num = re.match(r'(\d+)', book_and_number)
|
||||||
|
if match:
|
||||||
|
# Name and number
|
||||||
|
self.song_book_name = match.group(1)
|
||||||
|
self.song_number = match.group(2)
|
||||||
|
# These last two cases aren't tested yet, but
|
||||||
|
# are here in an attempt to do something vaguely
|
||||||
|
# sensible if we get a string in a different format
|
||||||
|
elif match_num:
|
||||||
|
# Number only
|
||||||
|
self.song_number = match_num.group(1)
|
||||||
|
else:
|
||||||
|
# Name only
|
||||||
|
self.song_book_name = book_and_number
|
||||||
|
|
||||||
|
def add_comment(self, comment):
|
||||||
|
"""
|
||||||
|
Build the comments field
|
||||||
|
"""
|
||||||
|
if self.comments.find(comment) >= 0:
|
||||||
|
return
|
||||||
|
if comment != '':
|
||||||
|
self.comments += comment.strip() + '\n'
|
||||||
|
|
||||||
def add_copyright(self, copyright):
|
def add_copyright(self, copyright):
|
||||||
"""
|
"""
|
||||||
Build the copyright field
|
Build the copyright field
|
||||||
|
|
|
@ -56,13 +56,13 @@ class SongImportTestHelper(TestCase):
|
||||||
'openlp.plugins.songs.lib.%s.%s.add_verse' % (self.importer_module_name, self.importer_class_name))
|
'openlp.plugins.songs.lib.%s.%s.add_verse' % (self.importer_module_name, self.importer_class_name))
|
||||||
self.finish_patcher = patch(
|
self.finish_patcher = patch(
|
||||||
'openlp.plugins.songs.lib.%s.%s.finish' % (self.importer_module_name, self.importer_class_name))
|
'openlp.plugins.songs.lib.%s.%s.finish' % (self.importer_module_name, self.importer_class_name))
|
||||||
self.parse_author_patcher = patch(
|
self.add_author_patcher = patch(
|
||||||
'openlp.plugins.songs.lib.%s.%s.parse_author' % (self.importer_module_name, self.importer_class_name))
|
'openlp.plugins.songs.lib.%s.%s.add_author' % (self.importer_module_name, self.importer_class_name))
|
||||||
self.song_import_patcher = patch('openlp.plugins.songs.lib.%s.SongImport' % self.importer_module_name)
|
self.song_import_patcher = patch('openlp.plugins.songs.lib.%s.SongImport' % self.importer_module_name)
|
||||||
self.mocked_add_copyright = self.add_copyright_patcher.start()
|
self.mocked_add_copyright = self.add_copyright_patcher.start()
|
||||||
self.mocked_add_verse = self.add_verse_patcher.start()
|
self.mocked_add_verse = self.add_verse_patcher.start()
|
||||||
self.mocked_finish = self.finish_patcher.start()
|
self.mocked_finish = self.finish_patcher.start()
|
||||||
self.mocked_parse_author = self.parse_author_patcher.start()
|
self.mocked_add_author = self.add_author_patcher.start()
|
||||||
self.mocked_song_importer = self.song_import_patcher.start()
|
self.mocked_song_importer = self.song_import_patcher.start()
|
||||||
self.mocked_manager = MagicMock()
|
self.mocked_manager = MagicMock()
|
||||||
self.mocked_import_wizard = MagicMock()
|
self.mocked_import_wizard = MagicMock()
|
||||||
|
@ -75,7 +75,7 @@ class SongImportTestHelper(TestCase):
|
||||||
self.add_copyright_patcher.stop()
|
self.add_copyright_patcher.stop()
|
||||||
self.add_verse_patcher.stop()
|
self.add_verse_patcher.stop()
|
||||||
self.finish_patcher.stop()
|
self.finish_patcher.stop()
|
||||||
self.parse_author_patcher.stop()
|
self.add_author_patcher.stop()
|
||||||
self.song_import_patcher.stop()
|
self.song_import_patcher.stop()
|
||||||
|
|
||||||
def load_external_result_data(self, file_name):
|
def load_external_result_data(self, file_name):
|
||||||
|
@ -112,7 +112,7 @@ class SongImportTestHelper(TestCase):
|
||||||
self.assertIsNone(importer.do_import(), 'do_import should return None when it has completed')
|
self.assertIsNone(importer.do_import(), 'do_import should return None when it has completed')
|
||||||
self.assertEqual(importer.title, title, 'title for %s should be "%s"' % (source_file_name, title))
|
self.assertEqual(importer.title, title, 'title for %s should be "%s"' % (source_file_name, title))
|
||||||
for author in author_calls:
|
for author in author_calls:
|
||||||
self.mocked_parse_author.assert_any_call(author)
|
self.mocked_add_author.assert_any_call(author)
|
||||||
if song_copyright:
|
if song_copyright:
|
||||||
self.mocked_add_copyright.assert_called_with(song_copyright)
|
self.mocked_add_copyright.assert_called_with(song_copyright)
|
||||||
if ccli_number:
|
if ccli_number:
|
||||||
|
@ -132,7 +132,7 @@ class SongImportTestHelper(TestCase):
|
||||||
self.assertEqual(importer.song_number, song_number, 'song_number for %s should be %s' %
|
self.assertEqual(importer.song_number, song_number, 'song_number for %s should be %s' %
|
||||||
(source_file_name, song_number))
|
(source_file_name, song_number))
|
||||||
if verse_order_list:
|
if verse_order_list:
|
||||||
self.assertEqual(importer.verse_order_list, [], 'verse_order_list for %s should be %s' %
|
self.assertEqual(importer.verse_order_list, verse_order_list, 'verse_order_list for %s should be %s' %
|
||||||
(source_file_name, verse_order_list))
|
(source_file_name, verse_order_list))
|
||||||
self.mocked_finish.assert_called_with()
|
self.mocked_finish.assert_called_with()
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,51 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<song>
|
||||||
|
<title>Amazing Grace (Demonstration)</title>
|
||||||
|
<author>John Newton, Edwin Excell & John P. Rees</author>
|
||||||
|
<copyright>Public Domain </copyright>
|
||||||
|
<presentation>V1 V2 V3 V4 V5</presentation>
|
||||||
|
<capo print="false"></capo>
|
||||||
|
<tempo></tempo>
|
||||||
|
<ccli>22025</ccli>
|
||||||
|
<theme>God: Assurance/Grace/Salvation</theme>
|
||||||
|
<alttheme>Worship: Praise</alttheme>
|
||||||
|
<user1> </user1>
|
||||||
|
<user2> </user2>
|
||||||
|
<user3> </user3>
|
||||||
|
<lyrics>[V]
|
||||||
|
. D D7 G D
|
||||||
|
1A______ma________zing grace! How sweet the sound!
|
||||||
|
2’Twas grace that taught my heart to fear,
|
||||||
|
3The Lord has pro____mised good to me,
|
||||||
|
4Thro' ma________ny dan____gers, toils and snares
|
||||||
|
5When we’ve been there ten thou__sand years,
|
||||||
|
|
||||||
|
. Bm E A A7
|
||||||
|
1That saved a wretch like me!
|
||||||
|
2And grace my fears re___lieved.
|
||||||
|
3His Word my hope se___cures.
|
||||||
|
4I have al___rea____dy come.
|
||||||
|
5Bright shi___ning as the sun,
|
||||||
|
|
||||||
|
. D D7 G D
|
||||||
|
1I once was lost, but now am found;
|
||||||
|
2How pre___cious did that grace ap____pear,
|
||||||
|
3He will my shield and por___tion be
|
||||||
|
4’Tis grace that brought me safe thus far,
|
||||||
|
5We’ve no less days to sing God’s praise,
|
||||||
|
|
||||||
|
. Bm A G D
|
||||||
|
1Was blind, but now I see.
|
||||||
|
2The hour I first be_lieved.
|
||||||
|
3As long as life en_dures.
|
||||||
|
4And grace will lead me home.
|
||||||
|
5Than when we first be_gun.
|
||||||
|
|
||||||
|
</lyrics>
|
||||||
|
<hymn_number>Demonstration Songs 0</hymn_number>
|
||||||
|
<key></key>
|
||||||
|
<aka></aka>
|
||||||
|
<key_line></key_line>
|
||||||
|
<time_sig></time_sig>
|
||||||
|
<style index="default_style"></style>
|
||||||
|
</song>
|
|
@ -0,0 +1,42 @@
|
||||||
|
{
|
||||||
|
"authors": [
|
||||||
|
"John Newton",
|
||||||
|
"Edwin Excell",
|
||||||
|
"John P. Rees"
|
||||||
|
],
|
||||||
|
"ccli_number": 22025,
|
||||||
|
"comments": "\n\n\n",
|
||||||
|
"copyright": "Public Domain ",
|
||||||
|
"song_book_name": "Demonstration Songs",
|
||||||
|
"song_number": 0,
|
||||||
|
"title": "Amazing Grace (Demonstration)",
|
||||||
|
"topics": [
|
||||||
|
"Assurance",
|
||||||
|
"Grace",
|
||||||
|
"Praise",
|
||||||
|
"Salvation"
|
||||||
|
],
|
||||||
|
"verse_order_list": [],
|
||||||
|
"verses": [
|
||||||
|
[
|
||||||
|
"Amazing grace! How sweet the sound!\nThat saved a wretch like me!\nI once was lost, but now am found;\nWas blind, but now I see.",
|
||||||
|
"v1"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"'Twas grace that taught my heart to fear,\nAnd grace my fears relieved.\nHow precious did that grace appear,\nThe hour I first believed.",
|
||||||
|
"v2"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"The Lord has promised good to me,\nHis Word my hope secures.\nHe will my shield and portion be\nAs long as life endures.",
|
||||||
|
"v3"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"Thro' many dangers, toils and snares\nI have already come.\n'Tis grace that brought me safe thus far,\nAnd grace will lead me home.",
|
||||||
|
"v4"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"When we've been there ten thousand years,\nBright shining as the sun,\nWe've no less days to sing God's praise,\nThan when we first begun.",
|
||||||
|
"v5"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
}
|
|
@ -0,0 +1,45 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<song>
|
||||||
|
<title>Beautiful Garden Of Prayer (Demonstration)</title>
|
||||||
|
<author>Eleanor Allen Schroll & James H. Fillmore</author>
|
||||||
|
<copyright>Public Domain </copyright>
|
||||||
|
<presentation>V1 C V2 C V3 C</presentation>
|
||||||
|
<capo print="false"></capo>
|
||||||
|
<tempo></tempo>
|
||||||
|
<ccli>60252</ccli>
|
||||||
|
<theme>God: Prayer/Devotion</theme>
|
||||||
|
<alttheme>Prayer: Prayer/Devotion</alttheme>
|
||||||
|
<user1></user1>
|
||||||
|
<user2></user2>
|
||||||
|
<user3></user3>
|
||||||
|
<lyrics>[V1]
|
||||||
|
There's a garden where Jesus is waiting,
|
||||||
|
There's a place that is wondrously fair.
|
||||||
|
For it glows with the light of His presence,|
|
||||||
|
'Tis the beautiful garden of prayer.
|
||||||
|
|
||||||
|
[V2]
|
||||||
|
There's a garden where Jesus is waiting,
|
||||||
|
And I go with my burden and care.
|
||||||
|
Just to learn from His lips, words of comfort,|
|
||||||
|
In the beautiful garden of prayer.
|
||||||
|
|
||||||
|
[V3]
|
||||||
|
There's a garden where Jesus is waiting,
|
||||||
|
And He bids you to come meet Him there,
|
||||||
|
Just to bow and receive a new blessing,|
|
||||||
|
In the beautiful garden of prayer.
|
||||||
|
|
||||||
|
[C]
|
||||||
|
O the beautiful garden, the garden of prayer,
|
||||||
|
O the beautiful garden of prayer.
|
||||||
|
There my Savior awaits, and He opens the gates||
|
||||||
|
To the beautiful garden of prayer.
|
||||||
|
</lyrics>
|
||||||
|
<hymn_number>DS0</hymn_number>
|
||||||
|
<key></key>
|
||||||
|
<aka></aka>
|
||||||
|
<key_line></key_line>
|
||||||
|
<time_sig></time_sig>
|
||||||
|
<style index="default_style"></style>
|
||||||
|
</song>
|
|
@ -0,0 +1,35 @@
|
||||||
|
{
|
||||||
|
"authors": [
|
||||||
|
"Eleanor Allen Schroll",
|
||||||
|
"James H. Fillmore"
|
||||||
|
],
|
||||||
|
"ccli_number": 60252,
|
||||||
|
"comments": "",
|
||||||
|
"copyright": "Public Domain ",
|
||||||
|
"song_book_name": "DS",
|
||||||
|
"song_number": 0,
|
||||||
|
"title": "Beautiful Garden Of Prayer (Demonstration)",
|
||||||
|
"topics": [
|
||||||
|
"Devotion",
|
||||||
|
"Prayer"
|
||||||
|
],
|
||||||
|
"verse_order_list": ["v1", "c1", "v2", "c1", "v3", "c1"],
|
||||||
|
"verses": [
|
||||||
|
[
|
||||||
|
"There's a garden where Jesus is waiting,\nThere's a place that is wondrously fair.\nFor it glows with the light of His presence,\n\n'Tis the beautiful garden of prayer.",
|
||||||
|
"v1"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"There's a garden where Jesus is waiting,\nAnd I go with my burden and care.\nJust to learn from His lips, words of comfort,\n\nIn the beautiful garden of prayer.",
|
||||||
|
"v2"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"There's a garden where Jesus is waiting,\nAnd He bids you to come meet Him there,\nJust to bow and receive a new blessing,\n\nIn the beautiful garden of prayer.",
|
||||||
|
"v3"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"O the beautiful garden, the garden of prayer,\nO the beautiful garden of prayer.\nThere my Savior awaits, and He opens the gates\n[---]\nTo the beautiful garden of prayer.",
|
||||||
|
"c1"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
}
|
Loading…
Reference in New Issue