songs2slides

A tool that automatically finds song lyrics and creates lyric slideshows
git clone https://git.ashermorgan.net/songs2slides/
Log | Files | Refs | README

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:
Msongs2slides/core.py | 13++++++++-----
Mtests/test_core.py | 45+++++++++++++++++++++++++++++++++++----------
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 = [