Skip to content

gh-99631: Add custom loads and dumps support for the shelve module #118065

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

Merged
merged 75 commits into from
Jul 12, 2025
Merged
Changes from 1 commit
Commits
Show all changes
75 commits
Select commit Hold shift + click to select a range
e269c09
Use custom loads & dumps instead of custom pickler & unpickler for Shelf
furkanonder Apr 18, 2024
3465149
Allow custom loads & dumps instead of custom pickler & unpickler for …
furkanonder Apr 18, 2024
44b9fa1
Update documentation for serializer and deserializred functions
furkanonder Apr 18, 2024
f2eed32
Update Doc/library/shelve.rst
furkanonder Apr 20, 2024
b3e5723
Update Doc/library/shelve.rst
furkanonder Apr 20, 2024
53d5557
Update documentation for serializer and deserializer functions
furkanonder Apr 21, 2024
d496eab
Merge branch 'main' into issue-99631-2
furkanonder Apr 21, 2024
1e295ba
Fix lines according to PEP-8
furkanonder Apr 21, 2024
2011baa
Merge branch 'issue-99631-2' of github.com:furkanonder/cpython into i…
furkanonder Apr 21, 2024
3cbabe9
Fix doc according to line 80
furkanonder Apr 21, 2024
67b7340
Merge branch 'main' into issue-99631-2
furkanonder Apr 22, 2024
c6b43e2
Fix inline emphasis issue in docs
furkanonder Apr 23, 2024
52a90f7
Merge branch 'issue-99631-2' of github.com:furkanonder/cpython into i…
furkanonder Apr 23, 2024
4f79cf6
Update the definition of the open function.
furkanonder Jul 13, 2024
798fdb2
Pass the serializer and serializer arguments of Shelf.__init__ of Bsd…
furkanonder Jul 14, 2024
bb1150d
Add unittests for BsdDbShelf
furkanonder Jul 14, 2024
98d841b
Merge branch 'issue-99631-2' of github.com:furkanonder/cpython into i…
furkanonder Jul 14, 2024
1159bb6
Update BsdDbShelf's set_location, last and first functions
furkanonder Jul 14, 2024
4b4f1b6
Update BsdDbShelf's next and previous functions
furkanonder Jul 14, 2024
bc399fa
Merge branch 'main' into issue-99631-2
furkanonder Jul 15, 2024
41448d3
Refer to shelve.open function for the deserializer and serializer arg…
furkanonder Jul 15, 2024
fbbe5ea
Refer to shelve.open function for the deserializer and serializer arg…
furkanonder Jul 15, 2024
fdd3e8e
Merge branch 'main' into issue-99631-2
furkanonder Jul 15, 2024
6823ef2
📜🤖 Added by blurb_it.
blurb-it[bot] Jul 16, 2024
2affece
Update the versionchanged statements
furkanonder Jul 16, 2024
da8bc91
Merge branch 'issue-99631-2' of github.com:furkanonder/cpython into i…
furkanonder Jul 16, 2024
6bfebee
change type of num2
furkanonder Jul 16, 2024
82d58a7
Add test_custom_incomplete_serializer_and_deserializer case
furkanonder Jul 17, 2024
7dca8b4
Merge branch 'main' into issue-99631-2
furkanonder Jul 17, 2024
5f97676
Specify that the Shelf, DbfilenameShelf and BsdDbShelf class's takes …
furkanonder Jul 24, 2024
048daee
And and update the versionchanged's text
furkanonder Jul 24, 2024
00837d0
Update the news entry
furkanonder Jul 24, 2024
1292963
Update the versionchanged's text
furkanonder Jul 24, 2024
3431920
Merge branch 'issue-99631-2' of github.com:furkanonder/cpython into i…
furkanonder Jul 24, 2024
97a6d7c
Add new testcases to other bytes objects
furkanonder Jul 24, 2024
3becbc8
Add new testcases to test custom serializer protocl
furkanonder Jul 24, 2024
3a5d6ed
Add new testcases to other bytes objects
furkanonder Jul 24, 2024
fb74832
Delete comma from document
furkanonder Jul 24, 2024
d670c95
Update the description of open function
furkanonder Jul 25, 2024
f2e22eb
sort the imports
furkanonder Jul 27, 2024
e00a52f
add white space
furkanonder Jul 27, 2024
3af3f97
Don't use f-string in type(obj).__name__
furkanonder Jul 27, 2024
9d232e5
Don't use f-string in type(obj).__name__
furkanonder Jul 27, 2024
26fc959
Don't use f-string in type(obj).__name__
furkanonder Jul 27, 2024
ab005aa
Set shelve class argument only serializer and deserializer
furkanonder Jul 27, 2024
6052309
Update shelveError message
furkanonder Jul 27, 2024
87b66d5
pass serializer and deserializer as keyword argument to DbfilenameShelf
furkanonder Jul 27, 2024
0c2f255
Remove unused import
furkanonder Jul 27, 2024
3db0c8e
Update shelve testcases
furkanonder Jul 27, 2024
5c39d94
Remove memoryview testcases
furkanonder Jul 28, 2024
1ca1801
Add ShelveError to shelve's __all__
furkanonder Jul 28, 2024
5a42de1
Add ShelveError to shelve documentation
furkanonder Jul 28, 2024
b0a5ee3
Add blank lines after versionadded and versionchanged
furkanonder Jul 29, 2024
4202ede
Remove white space in test_shelve
furkanonder Jul 29, 2024
2827eb4
Add test_custom_incomplete_serializer_and_deserializer_bsd_db_shelf
furkanonder Jul 29, 2024
9918531
Merge branch 'issue-99631-2' of github.com:furkanonder/cpython into i…
furkanonder Jul 29, 2024
54188bd
Update the serializer and deserializer functions
furkanonder Jul 29, 2024
786a248
Move os.mkdir and addCleanup functions beginning of the testcases
furkanonder Jul 29, 2024
20c2450
Use self.assertIsNone when checking None types
furkanonder Jul 29, 2024
b3770ae
change the test order
furkanonder Jul 29, 2024
588623a
Merge branch 'main' into issue-99631-2
furkanonder Apr 19, 2025
4d9599b
Update shelve module version references from 3.14 to 3.15
furkanonder May 30, 2025
9b204b7
Merge branch 'main' into issue-99631-2
furkanonder May 30, 2025
8b06918
Change shelve module version references from 3.15 to next
furkanonder May 30, 2025
b0f0bbc
Change shelve module version references from 3.15 to next
furkanonder May 30, 2025
d1bb227
refactor nested context managers for better readability
furkanonder May 30, 2025
791743b
simplify assertRaises calls in test_missing_custom_deserializer & tes…
furkanonder May 30, 2025
6b4be8b
refactor nested context managers for better readability
furkanonder May 30, 2025
34a32b9
Add type_name_len helper and use shorter variable names to reduce lin…
furkanonder May 30, 2025
bf6f3aa
Merge branch 'main' into issue-99631-2
furkanonder May 30, 2025
4b000cd
Improve the description of the open function
furkanonder Jun 2, 2025
2dcda2a
Update the description of ShelveError
furkanonder Jun 2, 2025
00bfb01
Simplify conditional branches in serializer and deserializer functions
furkanonder Jun 2, 2025
23ea842
Merge branch 'main' into issue-99631-2
furkanonder Jun 2, 2025
4df9b58
Merge branch 'main' into issue-99631-2
furkanonder Jun 11, 2025
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
Prev Previous commit
Next Next commit
Add type_name_len helper and use shorter variable names to reduce lin…
…e wrapping
  • Loading branch information
furkanonder committed May 30, 2025
commit 34a32b9842ca2bd35b975ab81e91e404358b604f
146 changes: 63 additions & 83 deletions Lib/test/test_shelve.py
Original file line number Diff line number Diff line change
Expand Up @@ -269,6 +269,9 @@ def serializer(obj, protocol=None):
def deserializer(data):
return data.decode("utf-8")

def type_name_len(obj):
return f"{(len(type(obj).__name__))}"

for proto in range(pickle.HIGHEST_PROTOCOL + 1):
with self.subTest(proto=proto), shelve.BsdDbShelf(
berkeleydb.btopen(self.fn),
Expand All @@ -277,99 +280,77 @@ def deserializer(data):
deserializer=deserializer,
) as s:
bar = "bar"
bytes_data = b"Hello, world!"
bytearray_data = bytearray(b"\x00\x01\x02\x03\x04")
array_data = array.array("i", [1, 2, 3, 4, 5])
bytes_obj = b"Hello, world!"
bytearray_obj = bytearray(b"\x00\x01\x02\x03\x04")
arr_obj = array.array("i", [1, 2, 3, 4, 5])

s["foo"] = bar
s["bytes_data"] = bytes_data
s["bytearray_data"] = bytearray_data
s["array_data"] = array_data
s["bytes_data"] = bytes_obj
s["bytearray_data"] = bytearray_obj
s["array_data"] = arr_obj

if proto == 5:
self.assertEqual(
s["foo"], f"{len(type(bar).__name__)}"
)
self.assertEqual(
s["bytes_data"],
f"{len(type(bytes_data).__name__)}",
)
self.assertEqual(
s["bytearray_data"],
f"{len(type(bytearray_data).__name__)}",
)
self.assertEqual(
s["array_data"],
f"{len(type(array_data).__name__)}",
)

key, value = s.set_location(b"foo")
self.assertEqual("foo", key)
self.assertEqual(value, f"{len(type(bar).__name__)}")

key, value = s.previous()
self.assertEqual("bytes_data", key)
self.assertEqual(
value, f"{len(type(bytes_data).__name__)}"
)

key, value = s.previous()
self.assertEqual("bytearray_data", key)
self.assertEqual(
value, f"{len(type(bytearray_data).__name__)}"
)

key, value = s.previous()
self.assertEqual("array_data", key)
self.assertEqual(
value, f"{len(type(array_data).__name__)}"
)

key, value = s.next()
self.assertEqual("bytearray_data", key)
self.assertEqual(
value, f"{len(type(bytearray_data).__name__)}"
)

key, value = s.next()
self.assertEqual("bytes_data", key)
self.assertEqual(
value, f"{len(type(bytes_data).__name__)}"
)

key, value = s.first()
self.assertEqual("array_data", key)
self.assertEqual(
value, f"{len(type(array_data).__name__)}"
)
self.assertEqual(s["foo"], type_name_len(bar))
self.assertEqual(s["bytes_data"], type_name_len(bytes_obj))
self.assertEqual(s["bytearray_data"],
type_name_len(bytearray_obj))
self.assertEqual(s["array_data"], type_name_len(arr_obj))

k, v = s.set_location(b"foo")
self.assertEqual(k, "foo")
self.assertEqual(v, type_name_len(bar))

k, v = s.previous()
self.assertEqual(k, "bytes_data")
self.assertEqual(v, type_name_len(bytes_obj))

k, v = s.previous()
self.assertEqual(k, "bytearray_data")
self.assertEqual(v, type_name_len(bytearray_obj))

k, v = s.previous()
self.assertEqual(k, "array_data")
self.assertEqual(v, type_name_len(arr_obj))

k, v = s.next()
self.assertEqual(k, "bytearray_data")
self.assertEqual(v, type_name_len(bytearray_obj))

k, v = s.next()
self.assertEqual(k, "bytes_data")
self.assertEqual(v, type_name_len(bytes_obj))

k, v = s.first()
self.assertEqual(k, "array_data")
self.assertEqual(v, type_name_len(arr_obj))
else:
key, value = s.set_location(b"foo")
self.assertEqual("foo", key)
self.assertEqual(value, "str")
k, v = s.set_location(b"foo")
self.assertEqual(k, "foo")
self.assertEqual(v, "str")

key, value = s.previous()
self.assertEqual("bytes_data", key)
self.assertEqual(value, "bytes")
k, v = s.previous()
self.assertEqual(k, "bytes_data")
self.assertEqual(v, "bytes")

key, value = s.previous()
self.assertEqual("bytearray_data", key)
self.assertEqual(value, "bytearray")
k, v = s.previous()
self.assertEqual(k, "bytearray_data")
self.assertEqual(v, "bytearray")

key, value = s.previous()
self.assertEqual("array_data", key)
self.assertEqual(value, "array")
k, v = s.previous()
self.assertEqual(k, "array_data")
self.assertEqual(v, "array")

key, value = s.next()
self.assertEqual("bytearray_data", key)
self.assertEqual(value, "bytearray")
k, v = s.next()
self.assertEqual(k, "bytearray_data")
self.assertEqual(v, "bytearray")

key, value = s.next()
self.assertEqual("bytes_data", key)
self.assertEqual(value, "bytes")
k, v = s.next()
self.assertEqual(k, "bytes_data")
self.assertEqual(v, "bytes")

key, value = s.first()
self.assertEqual("array_data", key)
self.assertEqual(value, "array")
k, v = s.first()
self.assertEqual(k, "array_data")
self.assertEqual(v, "array")

self.assertEqual(s["foo"], "str")
self.assertEqual(s["bytes_data"], "bytes")
Expand Down Expand Up @@ -407,7 +388,6 @@ def deserializer(data):
self.assertEqual(s["foo"], "")
self.assertNotEqual(s["foo"], "bar")


def test_missing_custom_deserializer(self):
def serializer(obj, protocol=None):
pass
Expand Down
Loading
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy