Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix bytes concatination error in Client.search() #94

Merged
merged 8 commits into from
May 19, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion discogs_client/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,11 @@ def search(self, *query, **fields):
function are serialized into the request's query string.
"""
if query:
fields['q'] = ' '.join(query)
items = [
item.decode() if type(item) == bytes else item for item in query
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

maybe this can be simplified with str() ?

items = [str(item) for item in query]

Haven't tested if that would work but given the docs say bytes can be passed into it, i don't see why not

Copy link
Contributor Author

@JOJ0 JOJ0 May 18, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I tried that when I initially started to work on this issue. str() doesn't change the string type, bytes stay bytes and unicode stays unicode, thus it doesn't avoid different types concat errors. Not 100% sure anymore but I'll doublecheck later today or tomorrow.

Copy link
Contributor Author

@JOJ0 JOJ0 May 19, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmmm I did not recall entirely correct: It seems the join does work but its not usable on another end:

            items = [
                str(item) for item in query
            ]
            for item in items:
                print(item)
            fields['q'] = ' '.join(items)
            print(fields)
$ python -m unittest discogs_client.tests.test_models.ModelsTestCase.test_multiterm_mixed_search
trash
b'80'
{'q': "trash b'80'"}
E
======================================================================
ERROR: test_multiterm_mixed_search (discogs_client.tests.test_models.ModelsTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
 File "/home/jojo/git/discogs_client/discogs_client/tests/test_models.py", line 64, in test_multiterm_mixed_search
   self.assertEqual(len(results), 13)
 File "/home/jojo/git/discogs_client/discogs_client/models.py", line 363, in __len__
   return self.count
 File "/home/jojo/git/discogs_client/discogs_client/models.py", line 334, in count
   self._load_pagination_info()
 File "/home/jojo/git/discogs_client/discogs_client/models.py", line 289, in _load_pagination_info
   data = self.client._get(self._url_for_page(1))
 File "/home/jojo/git/discogs_client/discogs_client/client.py", line 113, in _get
   return self._request('GET', url)
 File "/home/jojo/git/discogs_client/discogs_client/client.py", line 110, in _request
   raise HTTPError(body['message'], status_code)
discogs_client.exceptions.HTTPError: 404: Resource not found.

----------------------------------------------------------------------
Ran 1 test in 0.001s

FAILED (errors=1)

But with the decode solution:

            items = [
                item.decode() if type(item) == bytes else item for item in query
            ]
            for item in items:
                print(item)
            fields['q'] = ' '.join(items)
            print(fields)
$ python -m unittest discogs_client.tests.test_models.ModelsTestCase.test_multiterm_mixed_search
trash
80
{'q': 'trash 80'}
.
----------------------------------------------------------------------
Ran 1 test in 0.001s

OK

]
fields['q'] = ' '.join(items)

return models.MixedPaginatedList(
self,
update_qs(self._base_url + '/database/search', fields),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"pagination": {"per_page": 50, "pages": 1, "page": 1, "urls": {}, "items": 13}, "results": [{"thumb": null, "title": "Trash80", "uri": "/artist/Trash80", "resource_url": "/artists/95780", "type": "artist", "id": 95780}, {"style": ["Electro", "Chiptune"], "thumb": "/image/R-90-1743771-1272253277.gif", "title": "Trash80 - Icarus", "country": "US", "format": ["CDr"], "uri": "/Trash80-Icarus/release/1743771", "label": "8bitpeoples", "catno": "8BP086", "year": "2008", "genre": ["Electronic"], "resource_url": "/releases/1743771", "type": "release", "id": 1743771}, {"style": ["Electro", "Chiptune"], "thumb": "/image/R-90-1346442-1211545307.gif", "title": "Trash80 - Icarus", "country": "US", "format": ["File"], "uri": "/Trash80-Icarus/release/1346442", "label": "8bitpeoples", "catno": "8BP086", "year": "2008", "genre": ["Electronic"], "resource_url": "/releases/1346442", "type": "release", "id": 1346442}, {"style": ["Chiptune"], "thumb": "/image/R-90-480740-1149028432.gif", "title": "Trash80 - Hologram", "country": "US", "format": ["File"], "uri": "/Trash80-Hologram/release/480740", "label": "8bitpeoples", "catno": "8BP037", "year": "2003", "genre": ["Electronic"], "resource_url": "/releases/480740", "type": "release", "id": 480740}, {"style": ["Modern Classical", "Chiptune", "Breaks", "Ambient"], "thumb": "/image/R-90-3329867-1326034108.jpeg", "title": "Trash80 & Dma-Sc - Darwinia Soundtrack", "country": "UK", "format": ["File"], "uri": "/Trash80-Dma-Sc-Darwinia-Soundtrack/release/3329867", "label": "Not On Label", "catno": "none", "year": "2005", "genre": ["Electronic"], "resource_url": "/releases/3329867", "type": "release", "id": 3329867}, {"style": ["Chiptune"], "thumb": "/image/R-90-1554401-1227991910.gif", "title": "Nullsleep - Unconditional Acceleration", "country": "US", "format": ["File"], "uri": "/Nullsleep-Unconditional-Acceleration/release/1554401", "label": "8bitpeoples", "catno": "8BP088", "year": "2008", "genre": ["Electronic"], "resource_url": "/releases/1554401", "type": "release", "id": 1554401}, {"style": ["Chiptune"], "thumb": "/image/R-90-2634760-1294296299.gif", "title": "Sievert - Chips, Dips And Facerips", "country": "US", "format": ["File"], "uri": "/Sievert-Chips-Dips-And-Facerips/release/2634760", "label": "8bitpeoples", "catno": "8BP113", "year": "2011", "genre": ["Electronic"], "resource_url": "/releases/2634760", "type": "release", "id": 2634760}, {"style": ["Chiptune"], "thumb": "/image/R-90-1554411-1228435569.jpeg", "title": "Minusbaby - Saudade For Beginners", "country": "US", "format": ["File", "CD"], "uri": "/Minusbaby-Saudade-For-Beginners/release/1554411", "label": "8bitpeoples", "catno": "8BP089", "year": "2008", "genre": ["Electronic"], "resource_url": "/releases/1554411", "type": "release", "id": 1554411}, {"style": ["Abstract", "Musique Concr\u00e8te", "Experimental"], "thumb": null, "title": "Larry Wendt - Sound Poems For An Era Of Reduced Expectations", "country": "US", "format": ["Cassette"], "uri": "/Larry-Wendt-Sound-Poems-For-An-Era-Of-Reduced-Expectations/release/2674683", "label": "Underwhich Audiographics", "catno": "5", "genre": ["Electronic", "Non-Music"], "resource_url": "/releases/2674683", "type": "release", "id": 2674683}, {"style": ["Breakbeat", "Interview", "Techno", "IDM", "Minimal"], "thumb": null, "title": "Datamat - Interjamp Realaudio Special", "country": "Germany", "format": ["File"], "uri": "/Datamat-Interjamp-Realaudio-Special/release/1994383", "label": "Interjamp Radio", "catno": "inter004", "year": "2004", "genre": ["Electronic", "Non-Music"], "resource_url": "/releases/1994383", "type": "release", "id": 1994383}, {"style": ["IDM", "Noise", "Experimental"], "thumb": "/image/R-90-132406-1177641432.jpeg", "title": "Various - One Minute Massacre Volume 1", "country": "", "format": ["CD"], "uri": "/Various-One-Minute-Massacre-Volume-1/release/132406", "label": "Soulseek Records", "catno": "SLSK002", "year": "2003", "genre": ["Electronic"], "resource_url": "/releases/132406", "type": "release", "id": 132406}, {"style": ["Chiptune", "Experimental"], "thumb": "/image/R-90-915735-1229262615.jpeg", "title": "Various - 8BP050", "country": "US", "format": ["CD", "File"], "uri": "/Various-8BP050/release/915735", "label": "8bitpeoples", "catno": "8BP050", "year": "2006", "genre": ["Electronic"], "resource_url": "/releases/915735", "type": "release", "id": 915735}, {"style": ["Electro", "Chiptune"], "thumb": "/image/R-90-1903567-1251600832.jpeg", "title": "Various - Blip Festival 2008: 32 Live Recordings", "country": "US", "format": ["CD"], "uri": "/Various-Blip-Festival-2008-32-Live-Recordings/release/1903567", "label": "8bitpeoples", "catno": "8BP100", "year": "2009", "genre": ["Electronic"], "resource_url": "/releases/1903567", "type": "release", "id": 1903567}]}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"pagination": {"per_page": 50, "pages": 1, "page": 1, "urls": {}, "items": 13}, "results": [{"thumb": null, "title": "Trash80", "uri": "/artist/Trash80", "resource_url": "/artists/95780", "type": "artist", "id": 95780}, {"style": ["Electro", "Chiptune"], "thumb": "/image/R-90-1743771-1272253277.gif", "title": "Trash80 - Icarus", "country": "US", "format": ["CDr"], "uri": "/Trash80-Icarus/release/1743771", "label": "8bitpeoples", "catno": "8BP086", "year": "2008", "genre": ["Electronic"], "resource_url": "/releases/1743771", "type": "release", "id": 1743771}, {"style": ["Electro", "Chiptune"], "thumb": "/image/R-90-1346442-1211545307.gif", "title": "Trash80 - Icarus", "country": "US", "format": ["File"], "uri": "/Trash80-Icarus/release/1346442", "label": "8bitpeoples", "catno": "8BP086", "year": "2008", "genre": ["Electronic"], "resource_url": "/releases/1346442", "type": "release", "id": 1346442}, {"style": ["Chiptune"], "thumb": "/image/R-90-480740-1149028432.gif", "title": "Trash80 - Hologram", "country": "US", "format": ["File"], "uri": "/Trash80-Hologram/release/480740", "label": "8bitpeoples", "catno": "8BP037", "year": "2003", "genre": ["Electronic"], "resource_url": "/releases/480740", "type": "release", "id": 480740}, {"style": ["Modern Classical", "Chiptune", "Breaks", "Ambient"], "thumb": "/image/R-90-3329867-1326034108.jpeg", "title": "Trash80 & Dma-Sc - Darwinia Soundtrack", "country": "UK", "format": ["File"], "uri": "/Trash80-Dma-Sc-Darwinia-Soundtrack/release/3329867", "label": "Not On Label", "catno": "none", "year": "2005", "genre": ["Electronic"], "resource_url": "/releases/3329867", "type": "release", "id": 3329867}, {"style": ["Chiptune"], "thumb": "/image/R-90-1554401-1227991910.gif", "title": "Nullsleep - Unconditional Acceleration", "country": "US", "format": ["File"], "uri": "/Nullsleep-Unconditional-Acceleration/release/1554401", "label": "8bitpeoples", "catno": "8BP088", "year": "2008", "genre": ["Electronic"], "resource_url": "/releases/1554401", "type": "release", "id": 1554401}, {"style": ["Chiptune"], "thumb": "/image/R-90-2634760-1294296299.gif", "title": "Sievert - Chips, Dips And Facerips", "country": "US", "format": ["File"], "uri": "/Sievert-Chips-Dips-And-Facerips/release/2634760", "label": "8bitpeoples", "catno": "8BP113", "year": "2011", "genre": ["Electronic"], "resource_url": "/releases/2634760", "type": "release", "id": 2634760}, {"style": ["Chiptune"], "thumb": "/image/R-90-1554411-1228435569.jpeg", "title": "Minusbaby - Saudade For Beginners", "country": "US", "format": ["File", "CD"], "uri": "/Minusbaby-Saudade-For-Beginners/release/1554411", "label": "8bitpeoples", "catno": "8BP089", "year": "2008", "genre": ["Electronic"], "resource_url": "/releases/1554411", "type": "release", "id": 1554411}, {"style": ["Abstract", "Musique Concr\u00e8te", "Experimental"], "thumb": null, "title": "Larry Wendt - Sound Poems For An Era Of Reduced Expectations", "country": "US", "format": ["Cassette"], "uri": "/Larry-Wendt-Sound-Poems-For-An-Era-Of-Reduced-Expectations/release/2674683", "label": "Underwhich Audiographics", "catno": "5", "genre": ["Electronic", "Non-Music"], "resource_url": "/releases/2674683", "type": "release", "id": 2674683}, {"style": ["Breakbeat", "Interview", "Techno", "IDM", "Minimal"], "thumb": null, "title": "Datamat - Interjamp Realaudio Special", "country": "Germany", "format": ["File"], "uri": "/Datamat-Interjamp-Realaudio-Special/release/1994383", "label": "Interjamp Radio", "catno": "inter004", "year": "2004", "genre": ["Electronic", "Non-Music"], "resource_url": "/releases/1994383", "type": "release", "id": 1994383}, {"style": ["IDM", "Noise", "Experimental"], "thumb": "/image/R-90-132406-1177641432.jpeg", "title": "Various - One Minute Massacre Volume 1", "country": "", "format": ["CD"], "uri": "/Various-One-Minute-Massacre-Volume-1/release/132406", "label": "Soulseek Records", "catno": "SLSK002", "year": "2003", "genre": ["Electronic"], "resource_url": "/releases/132406", "type": "release", "id": 132406}, {"style": ["Chiptune", "Experimental"], "thumb": "/image/R-90-915735-1229262615.jpeg", "title": "Various - 8BP050", "country": "US", "format": ["CD", "File"], "uri": "/Various-8BP050/release/915735", "label": "8bitpeoples", "catno": "8BP050", "year": "2006", "genre": ["Electronic"], "resource_url": "/releases/915735", "type": "release", "id": 915735}, {"style": ["Electro", "Chiptune"], "thumb": "/image/R-90-1903567-1251600832.jpeg", "title": "Various - Blip Festival 2008: 32 Live Recordings", "country": "US", "format": ["CD"], "uri": "/Various-Blip-Festival-2008-32-Live-Recordings/release/1903567", "label": "8bitpeoples", "catno": "8BP100", "year": "2009", "genre": ["Electronic"], "resource_url": "/releases/1903567", "type": "release", "id": 1903567}]}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"pagination": {"per_page": 50, "pages": 1, "page": 1, "urls": {}, "items": 13}, "results": [{"thumb": null, "title": "Trash80", "uri": "/artist/Trash80", "resource_url": "/artists/95780", "type": "artist", "id": 95780}, {"style": ["Electro", "Chiptune"], "thumb": "/image/R-90-1743771-1272253277.gif", "title": "Trash80 - Icarus", "country": "US", "format": ["CDr"], "uri": "/Trash80-Icarus/release/1743771", "label": "8bitpeoples", "catno": "8BP086", "year": "2008", "genre": ["Electronic"], "resource_url": "/releases/1743771", "type": "release", "id": 1743771}, {"style": ["Electro", "Chiptune"], "thumb": "/image/R-90-1346442-1211545307.gif", "title": "Trash80 - Icarus", "country": "US", "format": ["File"], "uri": "/Trash80-Icarus/release/1346442", "label": "8bitpeoples", "catno": "8BP086", "year": "2008", "genre": ["Electronic"], "resource_url": "/releases/1346442", "type": "release", "id": 1346442}, {"style": ["Chiptune"], "thumb": "/image/R-90-480740-1149028432.gif", "title": "Trash80 - Hologram", "country": "US", "format": ["File"], "uri": "/Trash80-Hologram/release/480740", "label": "8bitpeoples", "catno": "8BP037", "year": "2003", "genre": ["Electronic"], "resource_url": "/releases/480740", "type": "release", "id": 480740}, {"style": ["Modern Classical", "Chiptune", "Breaks", "Ambient"], "thumb": "/image/R-90-3329867-1326034108.jpeg", "title": "Trash80 & Dma-Sc - Darwinia Soundtrack", "country": "UK", "format": ["File"], "uri": "/Trash80-Dma-Sc-Darwinia-Soundtrack/release/3329867", "label": "Not On Label", "catno": "none", "year": "2005", "genre": ["Electronic"], "resource_url": "/releases/3329867", "type": "release", "id": 3329867}, {"style": ["Chiptune"], "thumb": "/image/R-90-1554401-1227991910.gif", "title": "Nullsleep - Unconditional Acceleration", "country": "US", "format": ["File"], "uri": "/Nullsleep-Unconditional-Acceleration/release/1554401", "label": "8bitpeoples", "catno": "8BP088", "year": "2008", "genre": ["Electronic"], "resource_url": "/releases/1554401", "type": "release", "id": 1554401}, {"style": ["Chiptune"], "thumb": "/image/R-90-2634760-1294296299.gif", "title": "Sievert - Chips, Dips And Facerips", "country": "US", "format": ["File"], "uri": "/Sievert-Chips-Dips-And-Facerips/release/2634760", "label": "8bitpeoples", "catno": "8BP113", "year": "2011", "genre": ["Electronic"], "resource_url": "/releases/2634760", "type": "release", "id": 2634760}, {"style": ["Chiptune"], "thumb": "/image/R-90-1554411-1228435569.jpeg", "title": "Minusbaby - Saudade For Beginners", "country": "US", "format": ["File", "CD"], "uri": "/Minusbaby-Saudade-For-Beginners/release/1554411", "label": "8bitpeoples", "catno": "8BP089", "year": "2008", "genre": ["Electronic"], "resource_url": "/releases/1554411", "type": "release", "id": 1554411}, {"style": ["Abstract", "Musique Concr\u00e8te", "Experimental"], "thumb": null, "title": "Larry Wendt - Sound Poems For An Era Of Reduced Expectations", "country": "US", "format": ["Cassette"], "uri": "/Larry-Wendt-Sound-Poems-For-An-Era-Of-Reduced-Expectations/release/2674683", "label": "Underwhich Audiographics", "catno": "5", "genre": ["Electronic", "Non-Music"], "resource_url": "/releases/2674683", "type": "release", "id": 2674683}, {"style": ["Breakbeat", "Interview", "Techno", "IDM", "Minimal"], "thumb": null, "title": "Datamat - Interjamp Realaudio Special", "country": "Germany", "format": ["File"], "uri": "/Datamat-Interjamp-Realaudio-Special/release/1994383", "label": "Interjamp Radio", "catno": "inter004", "year": "2004", "genre": ["Electronic", "Non-Music"], "resource_url": "/releases/1994383", "type": "release", "id": 1994383}, {"style": ["IDM", "Noise", "Experimental"], "thumb": "/image/R-90-132406-1177641432.jpeg", "title": "Various - One Minute Massacre Volume 1", "country": "", "format": ["CD"], "uri": "/Various-One-Minute-Massacre-Volume-1/release/132406", "label": "Soulseek Records", "catno": "SLSK002", "year": "2003", "genre": ["Electronic"], "resource_url": "/releases/132406", "type": "release", "id": 132406}, {"style": ["Chiptune", "Experimental"], "thumb": "/image/R-90-915735-1229262615.jpeg", "title": "Various - 8BP050", "country": "US", "format": ["CD", "File"], "uri": "/Various-8BP050/release/915735", "label": "8bitpeoples", "catno": "8BP050", "year": "2006", "genre": ["Electronic"], "resource_url": "/releases/915735", "type": "release", "id": 915735}, {"style": ["Electro", "Chiptune"], "thumb": "/image/R-90-1903567-1251600832.jpeg", "title": "Various - Blip Festival 2008: 32 Live Recordings", "country": "US", "format": ["CD"], "uri": "/Various-Blip-Festival-2008-32-Live-Recordings/release/1903567", "label": "8bitpeoples", "catno": "8BP100", "year": "2009", "genre": ["Electronic"], "resource_url": "/releases/1903567", "type": "release", "id": 1903567}]}
36 changes: 36 additions & 0 deletions discogs_client/tests/test_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,42 @@ def test_search(self):
self.assertTrue(isinstance(results[0], Artist))
self.assertTrue(isinstance(results[1], Release))

def test_bytes_search(self):
results = self.d.search(b'trash80')
self.assertEqual(len(results), 13)
self.assertTrue(isinstance(results[0], Artist))
self.assertTrue(isinstance(results[1], Release))

def test_multiterm_search(self):
results = self.d.search('trash', '80')
self.assertEqual(len(results), 13)
self.assertTrue(isinstance(results[0], Artist))
self.assertTrue(isinstance(results[1], Release))

def test_multiterm_bytes_search(self):
results = self.d.search(b'trash', b'80')
self.assertEqual(len(results), 13)
self.assertTrue(isinstance(results[0], Artist))
self.assertTrue(isinstance(results[1], Release))

def test_multiterm_mixed_search(self):
results = self.d.search('trash', b'80')
self.assertEqual(len(results), 13)
self.assertTrue(isinstance(results[0], Artist))
self.assertTrue(isinstance(results[1], Release))

def test_kwargs_search(self):
results = self.d.search(artist='trash80')
self.assertEqual(len(results), 13)
self.assertTrue(isinstance(results[0], Artist))
self.assertTrue(isinstance(results[1], Release))

def test_kwargs_multiterm_search(self):
results = self.d.search(title='icarus', artist='trash80')
self.assertEqual(len(results), 13)
self.assertTrue(isinstance(results[0], Artist))
self.assertTrue(isinstance(results[1], Release))

def test_utf8_search(self):
uni_string = 'caf\xe9'
try:
Expand Down