commit ef8792327da870747c9cb569543a18d8e47b0fdc
parent 50e815a7229ff1e569c75e9a12f1f315dd5e4bec
Author: ashermorgan <59518073+ashermorgan@users.noreply.github.com>
Date: Wed, 21 Feb 2024 16:22:30 -0800
Move lines_per_slide parameter to assemble_slides
Diffstat:
2 files changed, 43 insertions(+), 15 deletions(-)
diff --git a/songs2slides/core.py b/songs2slides/core.py
@@ -55,7 +55,7 @@ def get_song_data(title: str, artist:str):
else:
raise Exception()
-def parse_song_lyrics(lyrics: str, lines_per_slide: int = 4):
+def parse_song_lyrics(lyrics: str, lines_per_slide: int):
"""
Parse slide contents from the raw lyrics of a song
@@ -66,7 +66,7 @@ def parse_song_lyrics(lyrics: str, lines_per_slide: int = 4):
lyrics : str
The song lyrics
lines_per_slide : int
- The maximum number of lines per slide (the default is 4)
+ The maximum number of lines per slide
Returns
-------
@@ -87,7 +87,7 @@ def parse_song_lyrics(lyrics: str, lines_per_slide: int = 4):
slides += ['']
line_count = 0
- elif line_count < lines_per_slide:
+ elif lines_per_slide is None or line_count < lines_per_slide:
# Add line to current slide
if line_count != 0: slides[-1] += '\n'
slides[-1] += line
@@ -103,7 +103,8 @@ def parse_song_lyrics(lyrics: str, lines_per_slide: int = 4):
return slides
-def assemble_slides(songs, title_slides = True, blank_slides = True):
+def assemble_slides(songs: list[SongData], lines_per_slide: int = 4,
+ title_slides: bool = True, blank_slides: bool = True):
"""
Assemble slides from a list of songs
@@ -111,6 +112,8 @@ def assemble_slides(songs, title_slides = True, blank_slides = True):
---------
songs : list of SongData
The songs
+ lines_per_slide : int
+ The maximum number of lines per slide (default: 4)
title_slides : bool
Whether to include title slides before songs (default: True)
blank_slides : bool
@@ -126,7 +129,7 @@ def assemble_slides(songs, title_slides = True, blank_slides = True):
for song in songs:
# Add slides for song
if title_slides: slides += [f'{song.title}']
- slides += parse_song_lyrics(song.lyrics.upper())
+ slides += parse_song_lyrics(song.lyrics.upper(), lines_per_slide)
if blank_slides: slides += ['']
# Remove trailing blank slides
diff --git a/tests/test_core.py b/tests/test_core.py
@@ -1,5 +1,5 @@
import unittest
-from unittest.mock import patch
+from unittest.mock import patch, call
from songs2slides import core
@@ -59,13 +59,13 @@ class TestCore(unittest.TestCase):
# Assert request was called
mocked_get.assert_called_with('api://lyrics/bar/foo')
- def test_parse_song_lyrics_default(self):
+ def test_parse_song_lyrics_basic(self):
# Declare song data and expected slides
lyrics = 'A\nB\nC\nD\nE\nF\n\nG\nH'
expected = ['A\nB\nC\nD', 'E\nF', 'G\nH']
# Get slide content
- result = core.parse_song_lyrics(lyrics)
+ result = core.parse_song_lyrics(lyrics, 4)
# Assert slides are correct
self.assertEqual(result, expected)
@@ -76,7 +76,7 @@ class TestCore(unittest.TestCase):
expected = ['A\nB\nC', 'D\nE\nF', 'G\nH']
# Get slide content
- result = core.parse_song_lyrics(lyrics, lines_per_slide = 3)
+ result = core.parse_song_lyrics(lyrics, 3)
# Assert slides are correct
self.assertEqual(result, expected)
@@ -87,7 +87,7 @@ class TestCore(unittest.TestCase):
expected = []
# Get slide content
- result = core.parse_song_lyrics(lyrics, lines_per_slide = 3)
+ result = core.parse_song_lyrics(lyrics, 4)
# Assert slides are correct
self.assertEqual(result, expected)
@@ -98,7 +98,7 @@ class TestCore(unittest.TestCase):
expected = ['A']
# Get slide content
- result = core.parse_song_lyrics(lyrics)
+ result = core.parse_song_lyrics(lyrics, 4)
# Assert slides are correct
self.assertEqual(result, expected)
@@ -109,7 +109,7 @@ class TestCore(unittest.TestCase):
expected = ['A\nB\nC\nD']
# Get slide content
- result = core.parse_song_lyrics(lyrics)
+ result = core.parse_song_lyrics(lyrics, 4)
# Assert slides are correct
self.assertEqual(result, expected)
@@ -120,7 +120,7 @@ class TestCore(unittest.TestCase):
expected = ['A\nB', '', 'C\nD']
# Get slide content
- result = core.parse_song_lyrics(lyrics)
+ result = core.parse_song_lyrics(lyrics, 4)
# Assert slides are correct
self.assertEqual(result, expected)
@@ -131,7 +131,7 @@ class TestCore(unittest.TestCase):
expected = ['A\nB\nC D\nE']
# Get slide content
- result = core.parse_song_lyrics(lyrics)
+ result = core.parse_song_lyrics(lyrics, 4)
# Assert slides are correct
self.assertEqual(result, expected)
@@ -142,7 +142,7 @@ class TestCore(unittest.TestCase):
expected = ['A', '', 'B']
# Get slide content
- result = core.parse_song_lyrics(lyrics)
+ result = core.parse_song_lyrics(lyrics, 4)
# Assert slides are correct
self.assertEqual(result, expected)
@@ -166,6 +166,9 @@ class TestCore(unittest.TestCase):
# Assert slides are correct
self.assertEqual(slides, expected)
+ # Assert parse_song_lyrics called
+ mocked_parse.assert_has_calls([call('L1', 4), call('L2', 4)])
+
def test_assemble_slides_default(self):
# Declare song data and expected slides
songs = [
@@ -183,6 +186,28 @@ class TestCore(unittest.TestCase):
# Assert slides are correct
self.assertEqual(slides, expected)
+ def test_assemble_slides_custom_lines_per_slide(self):
+ with patch('songs2slides.core.parse_song_lyrics') as mocked_parse:
+
+ # Mock parse_song_lyrics
+ mocked_parse.side_effect = [['aaa'], ['b1', 'b2']]
+
+ # Declare song data and expected slides
+ songs = [
+ core.SongData('T1', 'A1', 'l1'),
+ core.SongData('T2', 'A3', 'l2'),
+ ]
+ expected = ['T1', 'aaa', '', 'T2', 'b1', 'b2']
+
+ # Get slides
+ slides = core.assemble_slides(songs, lines_per_slide = 3)
+
+ # Assert slides are correct
+ self.assertEqual(slides, expected)
+
+ # Assert parse_song_lyrics called correctly
+ mocked_parse.assert_has_calls([call('L1', 3), call('L2', 3)])
+
def test_assemble_slides_no_title_slides(self):
# Declare song data and expected slides
songs = [