File: changelog.rst

package info (click to toggle)
python-msgspec 0.19.0-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 6,356 kB
  • sloc: javascript: 23,944; ansic: 20,540; python: 20,465; makefile: 29; sh: 19
file content (570 lines) | stat: -rw-r--r-- 26,274 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
Changelog
=========

.. currentmodule:: msgspec

Version 0.19.0 (2024-12-27)
---------------------------

- Improve JSON encoding performance by up to 40% (:pr:`647`).
- Ensure `tuple` and `frozenset` default values are treated identically whether
  specified by value or ``default_factory`` (:pr:`653`).
- Fix memory leak of ``match_args`` in ``StructConfig`` object (:pr:`684`).
- Fix memory leak in ``Raw.copy()`` (:pr:`709`).
- Update ``decode`` signatures for PEP 688 (:pr:`740`).
- Generate ``__replace__`` method on ``Struct`` types, for use with
  `copy.replace` (:pr:`747`).
- Fix incorrect decoding of certain > 64 bit integers (:pr:`751`).
- Call ``__post_init__`` when converting from an object to a Struct
  (:pr:`752`).
- **BREAKING**: Expand buffer when ``encode_into`` is passed a buffer smaller
  than ``offset`` (:pr:`753`).
- Support `Raw` objects as inputs to `convert` (:pr:`754`).
- Error nicely when a dataclass *type* (instead of an *instance*) is passed to
  ``encode`` (:pr:`755`).
- Drop support for Python 3.8 (:pr:`756`, :pr:`763`).
- Add support for Python 3.13 (:pr:`711`).
- Remove deprecated ``from_builtins`` (:pr:`761`).
- Support encoding any ``Enum`` type whose ``.value`` is a supported type
  (:pr:`757`).
- Don't fail eagerly when processing generic types with unsupported
  ``__parameters__`` (:pr:`772`).
- Use ``eval_type_backport`` to backport type annotations to Python 3.9
  (:pr:`773`).

Version 0.18.6 (2024-01-21)
---------------------------

- Support coercing integral floats to ints when ``strict=False`` (:pr:`619`).
- Preserve leading ``_`` when renaming fields to camel or pascal case (:pr:`620`).
- Support zero-copy decoding binary fields to a ``memoryview`` (:pr:`624`).
- Fix a bug when inheriting from the same ``Generic`` base class multiple times
  (:pr:`626`).
- Add an ``order`` option to all encoders for enforcing deterministic/sorted
  ordering when encoding. This can help provide a more consistent or human
  readable output (:pr:`627`).
- Support inheriting from any slots-class when defining a new ``Struct`` type
  with ``gc=False`` (:pr:`635`).
- Automatically infer the input field naming convention when converting
  non-dict mappings or arbitrary objects to ``Struct`` types in
  ``msgspec.convert`` (:pr:`636`).

Version 0.18.5 (2023-12-12)
---------------------------

- Support unhashable ``Annotated`` metadata in `msgspec.inspect.type_info`
  (:pr:`566`).
- Fix bug preventing decoding dataclasses/attrs types with default values and
  ``slots=True, frozen=True`` (:pr:`569`).
- Support passing parametrized generic struct types to `msgspec.structs.fields`
  (:pr:`571`).
- Validate ``str`` constraints on dict keys when decoding msgpack (:pr:`577`).
- Support ``UUID`` subclasses as inputs to `msgspec.convert` (:pr:`592`).
- Call ``__eq__`` from generated ``__ne__`` if user defines manual ``__eq__``
  method on a ``Struct`` type (:pr:`593`).
- Include the ``Struct`` type in the generated hash (:pr:`595`).
- Add a ``cache_hash`` struct option (:pr:`596`).
- Fix a bug around caching of dataclass type info when dealing with subclasses
  of dataclasses (:pr:`599`).
- Add `msgspec.structs.force_setattr` (:pr:`600`).
- Support custom dict key types in JSON encoder and decoder (:pr:`602`).
- Include ``dict`` key constraints in generated JSON schema via the
  ``propertyNames`` field (:pr:`604`).
- Add a ``schema_hook`` for generating JSON schemas for custom types (:pr:`605`).
- Add support for Python 3.12's ``type`` aliases (:pr:`606`).

Version 0.18.4 (2023-10-04)
---------------------------

- Resolve an issue leading to periodic segfaults when importing ``msgspec`` on
  CPython 3.12 (:pr:`561`)

Version 0.18.3 (2023-10-03)
---------------------------

- Improve type annotation for ``Struct.__rich_repr__`` (:pr:`557`)
- Add pre-built wheels for Python 3.12 (:pr:`558`)

Version 0.18.2 (2023-08-26)
---------------------------

- Support ``Enum._missing_`` hooks for handling unknown enum values (:pr:`532`).
- Fix JSON encoding of `datetime.datetime` objects with `zoneinfo.ZoneInfo`
  timezone components (:pr:`534`).
- Add support for ``attrs`` `validators
  <https://www.attrs.org/en/stable/examples.html#validators>`__ (:pr:`538`).
- Relax datetime/time parsing format to allow some RFC3339 extensions from
  ISO8601 (:pr:`539`).

Version 0.18.1 (2023-08-16)
---------------------------

- Support custom ``builtin_types`` in `msgspec.to_builtins` (:pr:`517`).
- Try ``getattr`` before ``getitem`` when converting with
  ``from_attributes=True`` (:pr:`519`).
- More efficient module state access in top-level functions (:pr:`521`).

Version 0.18.0 (2023-08-10)
---------------------------

- Add a new `msgspec.json.Decoder.decode_lines` method for decoding
  newline-delimited JSON into a list of values (:pr:`485`).
- Support for decoding UUIDs from binary values (:pr:`499`).
- Support for encoding UUIDs in alternate formats (:pr:`499`).
- Overhaul how dataclasses are encoded to support more dataclass-like objects
  (:pr:`501`).
- Encode all declared fields on a dataclass (:pr:`501`).
- Support encoding ``edgedb.Object`` instances as dataclass-like objects
  (:pr:`501`).
- Improve performance when json decoding ``float`` values (:pr:`510`).
- Support for JSON encoding dicts with ``float`` keys (:pr:`510`).
- Support for JSON decoding dicts with ``float`` keys (:pr:`510`).
- Add ``float_hook`` to `msgspec.json.Decoder` to support changing the default
  for how JSON floats are decoded (:pr:`511`).

Version 0.17.0 (2023-07-11)
---------------------------

- Ensure ``None`` may be explicitly passed to `defstruct` for
  ``module``/``namespace``/``bases`` (:pr:`445`).
- Support decoding `datetime.datetime` values from ``int``/``float`` values
  (interpreted as seconds since the Unix epoch) when ``strict=False``
  (:pr:`452`).
- Support subclasses of collection types (``list``, ``dict``, ...) as inputs to
  `convert` (:pr:`453`).
- Support ``str`` subclasses as keys in `to_builtins` and all protocol
  ``encode`` methods (:pr:`454`).
- Improved performance when JSON encoding `decimal.Decimal` values (:pr:`455`).
- Improved performance when JSON encoding ``int``/``float`` values (:pr:`458`).
- Improved performance when JSON encoding ``str`` values (:pr:`459`).
- Wrap errors in ``dec_hook`` with a `ValidationError` (:pr:`460`).
- Support decoding `decimal.Decimal` values from numeric values (:pr:`463`)
- Support encoding `decimal.Decimal` values as numeric values (:pr:`465`).
- Support converting `decimal.Decimal` values to ``float`` in `convert`
  (:pr:`466`).
- Preliminary support for CPython 3.12 beta releases (:pr:`467`).
- Support decoding integers that don't fit into an ``int64``/``uint64``
  (:pr:`469`).
- Add a new optional ``__post_init__`` method for `Struct` types (:pr:`470`).
- Support decoding ``0``/``1`` into ``bool`` types when ``strict=False``
  (:pr:`471`).
- Wrap errors raised in ``__post_init__``/``__attrs_post_init__`` in a
  `ValidationError` when decoding (:pr:`472`).
- Add native support for encoding/decoding `datetime.timedelta` types
  (:pr:`475`).
- Add a new `msgspec.json.Encoder.encode_lines` method for encoding an iterable
  of values as newline-delimited JSON (:pr:`479`).

Version 0.16.0 (2023-06-12)
---------------------------

- Deprecate ``msgspec.from_builtins`` in favor of `msgspec.convert`. The new
  ``convert`` function provides a superset of the functionality available in
  the old ``from_builtins`` function (:pr:`431`).
- Add a ``from_attributes`` argument to `msgspec.convert` for allowing
  conversion between object types with matching attribute names. One use case
  for this is converting ORM objects to `Struct` or `dataclasses` types
  (:pr:`419`).
- Support passing generic ``Mapping`` objects as inputs to `msgspec.convert`.
  These may be coerced to `dict`/`Struct`/`dataclasses`/`attrs` types
  (:pr:`427`).
- Add a new ``strict`` keyword argument to all ``decode`` functions,
  ``Decoder`` classes, as well as `msgspec.convert`. This defaults to ``True``,
  setting it to false enables a wider set of coercion rules (e.g. coercing a
  `str` input to an `int`). See :ref:`strict-vs-lax` for more information
  (:pr:`434`).
- Support all :doc:`supported-types` as inputs to `msgspec.convert` (:pr:`431`,
  :pr:`418`).
- Passthrough input unchanged when coercing to `typing.Any` type in
  `msgspec.convert` (:pr:`435`).
- Support parametrizing ``Decoder`` types at runtime (:pr:`415`).
- Support encoding subclasses of ``UUID`` (:pr:`429`).

Version 0.15.1 (2023-05-19)
---------------------------

- Fix a reference counting bug introduced in 0.15.0 when decoding naive (no
  timezone) ``datetime``/``time`` objects in both the ``msgpack`` and ``json``
  decoders (:pr:`409`).
- Work around an upstream bug in CPython to properly support
  `typing.Required`/`typing.NotRequired` in `typing.TypedDict` when
  ``__future__.annotations`` is enabled (:pr:`410`).

Version 0.15.0 (2023-05-10)
---------------------------

- Add support for Generic `Struct` types (:pr:`386`, :pr:`393`).
- Add support for Generic `dataclasses` and `attrs <https://attrs.org>`__ types
  (:pr:`396`).
- Add support for Generic `typing.TypedDict` and `typing.NamedTuple` types
  (:pr:`398`).
- **BREAKING**: No longer normalize timezones to UTC when decoding `datetime`
  objects from JSON (:pr:`391`).
- Support decoding unhyphenated UUIDs (:pr:`392`).
- A few type annotation fixups (:pr:`383`, :pr:`387`).
- Dedent docstrings for descriptions when generating JSON schemas (:pr:`397`).
- Use a variant of ``__qualname__`` when auto-generating Struct tags rather
  than ``__name__`` (:pr:`399`).
- Fix bug when handling `typing.Literal` types containing a literal ``None``
  (:pr:`400`).
- Make all ``Encoder``/``Decoder`` methods threadsafe (:pr:`402`).
- **BREAKING**: Drop the ``write_buffer_size`` kwarg to ``Encoder`` (:pr:`402`).

Version 0.14.2 (2023-04-19)
---------------------------

- Remove ``__del__`` trashcan usage for structs with ``gc=False`` (:pr:`369`).
- Support overriding ``__setattr__`` in Struct types (:pr:`376`).
- Support encoding large integers in JSON (:pr:`378`).
- Fix a memory leak when msgpack decoding variable length tuples with more than
  16 elements (:pr:`380`).
- Remove JSON compatibility checks when constructing a
  ``msgspec.json.Decoder``. Trying to decode messages into types that JSON
  doesn't support will now error at decode time, rather than when the decoder
  is constructed (:pr:`381`).

Version 0.14.1 (2023-04-07)
---------------------------

- Further optimize decoding of JSON arrays into lists (:pr:`363`).
- Fix a bug preventing using structs configured with ``dict=True`` on Python
  3.11 (:pr:`365`).
- Avoid preallocating large lists/tuples in the msgpack decoder (:pr:`367`).

Version 0.14.0 (2023-04-02)
---------------------------

- Support encoding and decoding `attrs <https://attrs.org>`__ types (:pr:`323`).
- Add ``repr_omit_defaults`` configuration option for omitting struct default
  values in the ``repr`` (:pr:`322`).
- Expose a struct's configuration through a ``__struct_config__`` attribute
  (:pr:`328`).
- Add `msgspec.structs.fields` utility function for inspecting the fields
  configured on a Struct (:pr:`330`).
- Add a ``dict`` configuration option for adding a ``__dict__`` attribute to a
  Struct (:pr:`331`).
- Allow non-struct mixins to be used with struct types (:pr:`332`).
- Fix a bug when defining both ``lt`` and ``gt`` constraints on an integer
  type (:pr:`335`).
- Fix a bug supporting fields defined with `msgspec.field()` with no arguments
  (:pr:`343`).
- Allow arbitrary input types to `msgspec.from_builtins` (:pr:`346`).
- Support decoding into subclasses of ``int`` & ``bytes`` in
  `msgspec.from_builtins` (:pr:`346`).
- Add `msgspec.UNSET` and `msgspec.UnsetType` for tracking unset fields. See the
  :ref:`docs <unset-type>` for more information (:pr:`350`).
- **BREAKING**: In the unlikely event you were using the previous
  ``msgspec.UNSET`` singleton to explicitly indicate no default value on struct
  types, you should now make use of `msgspec.NODEFAULT` instead (:pr:`350`).
- Improve struct type annotations now that ``mypy`` supports
  `typing.dataclass_transform` (:pr:`352`).
- Support `typing.Final` annotations for indicating that an object field should
  be treated as immutable (:pr:`354`).
- Add a ``name`` keyword option to `msgspec.field` for renaming a single field
  (:pr:`356`).
- **BREAKING**: The rules around class inheritance and a struct's ``rename``
  option have changed. See :pr:`356` for more information.

Version 0.13.1 (2023-02-09)
---------------------------

- Fix a memory leak in the JSON decoder introduced in 0.13.0, caused by a
  reference counting bug when decoding into ``Struct`` types (:pr:`312`).

Version 0.13.0 (2023-02-08)
---------------------------

- Add `to_builtins` function for converting messages composed of any supported
  type to ones composed of only simple builtin types commonly supported by
  Python serialization libraries (:pr:`258`).
- Add `from_builtins` function for converting and validating messages composed
  of simple builtin types to ones composed of any type msgspec supports
  (:pr:`266`, :pr:`302`).
- Add `msgspec.yaml` module for encoding/decoding YAML (:pr:`267`).
- Add `msgspec.toml` module for encoding/decoding TOML (:pr:`268`).
- Add `msgspec.structs.replace` function for creating a copy of an existing
  `Struct` with some changes applied (:pr:`262`).
- Add `msgspec.structs.asdict` and `msgspec.structs.astuple` functions for
  converting a struct instance to a `dict` or `tuple` respectively (:pr:`300`).
- Support arbitrarily nested `typing.NewType`/`typing.Annotated` types
  (:pr:`272`).
- Improve error message for invalid keyword arguments passed to
  ``Struct.__init__`` (:pr:`273`).
- Support ``default_factory`` configuration for `Struct` fields (:pr:`274`).
- **BREAKING**: With the exception of empty builtin collections (``[]``,
  ``{}``, ``set()``, ``bytearray()``), mutable default values in Struct types
  are no longer deepcopied when used. If a different mutable default value is
  needed, please configure a ``default_factory`` instead (:pr:`274`).
- Improve performance of creating Structs with default parameters (:pr:`274`).
- Support `typing.ClassVar` annotations of `Struct` types (:pr:`281`).
- Support encoding/decoding `decimal.Decimal` types (:pr:`288`).
- Support "abstract" type annotations like
  `collections.abc.MutableMapping`/`typing.MutableMapping` in decoders
  (:pr:`290`).
- Support any string-like or int-like type as a ``dict`` key when encoding or
  decoding JSON (:pr:`292`).
- Improved performance encoding large collections in JSON and MessagePack
  encoders (:pr:`294`, :pr:`298`).


Version 0.12.0 (2023-01-05)
---------------------------

- Support encoding ``set`` and ``frozenset`` subclasses (:pr:`249`).
- Support encoding/decoding `typing.NewType` types (:pr:`251`).
- Allow creating a `msgspec.Raw` object from a ``str`` (:pr:`252`).
- Add new experimental ``msgspec.inspect`` module for inspecting type
  annotations. This is intended to be used for building downstream tooling
  based on msgspec-compatible types. See :doc:`the docs <inspect>` for more
  information (:pr:`253`).
- Add new ``extra`` field to `msgspec.Meta`, for storing arbitrary user-defined
  metadata (:pr:`255`).
- Improved performance for JSON encoding strings (:pr:`256`).

Version 0.11.0 (2022-12-19)
---------------------------

- Improve performance of constructors for `Struct` types when using keyword
  arguments (:pr:`237`).
- Support :doc:`constraints` on dict keys for JSON (:pr:`239`).
- Add support for keyword-only arguments in `Struct` types, matching the
  behavior of ``kw_only`` for `dataclasses` (:pr:`242`).
- **BREAKING**: Change the parameter ordering rules used by `Struct` types to
  match the behavior of `dataclasses`. For most users this change shouldn't
  break anything. However, if your struct definitions have required fields
  after optional fields, you'll now get an error on import. This error can be
  fixed by either:

  - Reordering your fields so all required fields are before all optional
    fields
  - Using keyword-only parameters (by passing the ``kw_only=True`` option).

  See :ref:`struct-field-ordering` for more information (:pr:`242`).
- Support encoding/decoding dictionaries with integer keys for JSON (:pr:`243`).

Version 0.10.1 (2022-12-08)
---------------------------

- Ignore attributes with leading underscores (``"_"``) when encoding
  `dataclasses` (:pr:`234`)

Version 0.10.0 (2022-12-07)
---------------------------

- Add ``forbid_unknown_fields`` configuration option to `Struct` types (:pr:`210`)
- **BREAKING**: Encode all `enum` types by value, rather than name (:pr:`211`)
- Fix a bug in the JSON encoder when base64 encoding binary objects (:pr:`217`)
- Add support for encoding/decoding `dataclasses` (:pr:`218`)
- Add support for encoding/decoding `datetime.date` objects (:pr:`221`)
- Add support for encoding/decoding `uuid.UUID` objects (:pr:`222`)
- **BREAKING**: support encoding/decoding `datetime.datetime` values without
  timezones by default (:pr:`224`).
- Add a ``tz`` :doc:`constraint <constraints>` to require aware or naive
  datetime/time objects when decoding (:pr:`224`).
- Add support for encoding/decoding `datetime.time` objects (:pr:`225`)
- Add a `msgspec.json.format` utility for efficiently pretty-printing already
  encoded JSON documents (:pr:`226`).
- Support decoding JSON from strings instead of just bytes-like objects
  (:pr:`229`)

Version 0.9.1 (2022-10-27)
--------------------------

- Enable Python 3.11 builds (:pr:`205`)
- Support greater than microsecond resolution when parsing JSON timestamps (:pr:`201`)
- Work around a limitation in mypy for typed decoders (:pr:`191`)

Version 0.9.0 (2022-09-13)
--------------------------

- Support for :doc:`constraints <constraints>` during validation. For example,
  this allows ensuring a field is an integer >= 0. (:pr:`176`)
- New utilities for generating :doc:`JSON Schemas <jsonschema>` from type
  definitions (:pr:`181`)
- Support for pretty printing using `rich
  <https://rich.readthedocs.io/en/stable/pretty.html>`_ (:pr:`183`)
- Improve integer encoding performance (:pr:`170`)
- Builtin support for renaming fields using kebab-case (:pr:`175`)
- Support for passing a mapping when renaming fields (:pr:`185`)

Version 0.8.0 (2022-08-01)
--------------------------

- Support integer tag values when using :ref:`tagged unions
  <struct-tagged-unions>` (:pr:`135`).
- Support decoding into `typing.TypedDict` types (:pr:`142`).
- Support encoding/decoding `typing.NamedTuple` types (:pr:`161`).
- Test against CPython 3.11 prelease builds (:pr:`146`).
- Add `ValidationError` (a subclass of `DecodeError`) to allow differentiating
  between errors due to a message not matching the schema from those due to the
  message being invalid JSON (:pr:`155`).
- Support encoding subclasses of `list`/`dict` (:pr:`160`).
- Fix a bug preventing decoding custom types wrapped in a `typing.Optional`
  (:pr:`162`).

Version 0.7.1 (2022-06-27)
--------------------------

- Further reduce the size of packaged wheels (:pr:`130`).
- Add `weakref` support for `Struct` types through a new ``weakref``
  configuration option (:pr:`131`).
- Fix a couple unlikely (but possible) bugs in the deallocation routine for
  Struct types (:pr:`131`).

Version 0.7.0 (2022-06-20)
--------------------------

- Dramatically speedup JSON string decoding, up to 2x speedup in some cases
  (:pr:`118`).
- Adds a cache for decoding short (< 32 character) ASCII dict keys. This
  results in up to a 40% speedup when decoding many dicts with common keys
  using an untyped decoder. It's still recommended to define `Struct` types
  when your messages have a common structure, but in cases where no type is
  provided decoding is now much more performant (:pr:`120`, :pr:`121`).
- Adds ``order`` and ``eq`` configuration options for `Struct` types, mirroring
  the ``dataclasses`` options of the same name. Order comparisons for Struct
  types are very performant, roughly `10x to 70x faster
  <https://jcristharif.com/msgspec/benchmarks.html#benchmark-structs>`__ than
  alternative libraries (:pr:`122`).
- Speedup `Struct` decoding for both JSON and MessagePack, on average 20%
  faster (:pr:`119`).
- Various additional performance improvements, mostly to the JSON
  implementation (:pr:`100`, :pr:`101`, :pr:`102`).
- Add `defstruct` method for dynamically defining new `Struct` types at
  runtime (:pr:`105`).
- Fix ARM support and publish ARM wheels for Linux and Mac (:pr:`104`).
- Reduce published wheel sizes by stripping debug symbols (:pr:`113`).
- Fix a memory leak in ``Struct.__reduce__`` (:pr:`117`).
- **BREAKING**: Rename ``nogc`` struct option to ``gc``. To disable GC on a
  Struct instance you now want to specify ``gc=False`` instead of ``nogc=True``
  (:pr:`124`).


Version 0.6.0 (2022-04-06)
--------------------------

- Add a new `msgspec.Raw <https://jcristharif.com/msgspec/usage.html#raw>`__
  type for delayed decoding of message fields / serializing already encoded
  fields (:pr:`92`).
- Add ``omit_defaults`` option to ``Struct`` types (`docs
  <https://jcristharif.com/msgspec/structs.html#omitting-default-values>`__).
  If enabled, fields containing their respective default value will be omitted
  from serialized message. This improves both encode and decode performance
  (:pr:`94`).
- Add ``rename`` option to ``Struct`` types (`docs
  <https://jcristharif.com/msgspec/structs.html#renaming-field-names>`__) for
  altering the field names used for encoding. A major use of this is supporting
  ``camelCase`` JSON field names, while letting Python code use the more
  standard ``snake_case`` field names (:pr:`98`).
- Improve performance of ``nogc=True`` structs (`docs
  <https://jcristharif.com/msgspec/structs.html#disabling-garbage-collection-advanced>`__).
  GC is now avoided in more cases, and ``nogc=True`` structs use 16 fewer bytes
  per instance. Also added a `benchmark
  <https://jcristharif.com/msgspec/benchmarks.html#benchmark-garbage-collection>`__
  for how ``msgspec`` can interact with application GC usage (:pr:`93`).
- Cache creation of `tagged union
  <https://jcristharif.com/msgspec/structs.html#tagged-unions>`__ lookup
  tables, reducing memory usage for applications making heavy use of tagged
  unions (:pr:`91`).
- Support encoding and decoding ``frozenset`` instances (:pr:`95`).
- A smattering of other performance improvements.


Version 0.5.0 (2022-03-09)
--------------------------

- Support `tagged unions
  <https://jcristharif.com/msgspec/structs.html#tagged-unions>`__ for
  encoding/decoding a ``Union`` of ``msgspec.Struct`` types (:pr:`83`).
- Further improve encoding performance of ``enum.Enum`` instances by 20-30%
  (:pr:`84`).
- Reduce overhead of calling ``msgspec.json.decode``/``msgspec.msgpack.decode``
  with ``type=SomeStructType``. It's still faster to create a ``Decoder`` once
  and call ``decoder.decode`` multiple times, but for struct types the overhead
  of calling the top-level function is decreased significantly (:pr:`77`,
  :pr:`88`).
- **BREAKING**: Rename the Struct option ``asarray`` to ``array_like`` (:pr:`85`).


Version 0.4.2 (2022-02-28)
--------------------------

- Support ``typing.Literal`` string types as dict keys in JSON (:pr:`78`).
- Support Python 3.10 style unions (for example, ``int | float | None``)
  (:pr:`75`).
- Publish Python 3.10 wheels (:pr:`80`).


Version 0.4.1 (2022-02-23)
--------------------------

- Optimize decoding of ``Enum`` types, on average ~10x faster (:pr:`69`).
- Optimize decoding of ``IntEnum`` types, on average ~12x faster (:pr:`68`).
- Support decoding ``typing.Literal`` types (:pr:`71`).
- Add ``nogc`` option for ``Struct`` types, disabling the cyclic garbage
  collector for their instances (:pr:`72`).


Version 0.4.0 (2022-02-08)
--------------------------

- Moved MessagePack support to the ``msgspec.msgpack`` submodule (:pr:`56`).
- New JSON support available in ``msgspec.json`` (:pr:`56`).
- Improved error message generation to provide full path to the mistyped values
  (:pr:`56`).
- Renamed the ``immutable`` kwarg in ``msgspec.Struct`` to ``frozen`` to better
  match python conventions (:pr:`60`).
- Renamed ``EncodingError`` to ``EncodeError``/``DecodingError`` to
  ``DecodeError`` to better match python conventions (:pr:`61`).
- Improved ``pyright`` support, allowing more errors to be statically caught by
  their type checker (:pr:`60`).
- Adds support for Python 3.10 pattern matching on ``msgspec.Struct`` types
  (:pr:`53`).
- Adds support for decoding into ``typing.Union`` types (with a few
  restrictions) (:pr:`54`).
- General performance improvements across all encoders/decoders.


Version 0.3.2 (2021-07-23)
--------------------------

- Faster float encoding and decoding (:pr:`47`).
- General micro-optimizations for MessagePack encode/decode. This is most
  visible for large messages (:pr:`48`, :pr:`50`).


Version 0.3.1 (2021-07-12)
--------------------------

- Use a freelist for small structs to improve struct allocation time
  (:pr:`44`).
- Small performance improvements for struct serialization (:pr:`45`).


Version 0.3.0 (2021-07-07)
--------------------------

- Add ``Encoder.encode_into`` api, for encoding into an existing buffer without
  copying (:pr:`34`).
- Add support for encoding/decoding MessagePack extensions (:pr:`31`).
- Add support for encoding/decoding ``datetime`` objects (:pr:`36`).
- Add support for encoding/decoding custom objects without relying on
  MessagePack extensions (:pr:`32`, :pr:`33`).
- Add support for marking ``Struct`` types as hashable (:pr:`39`).
- Add support for serializing ``Struct`` types as MessagePack ``array`` objects
  rather than ``map`` objects (:pr:`39`).
- Several performance improvements. On average 50% faster encoding and 30%
  faster decoding.


Version 0.2.0 (2021-02-25)
--------------------------

- Add ``default`` callback to ``encode``/``Encoder`` (:pr:`21`).
- Fix bug in ``Encoder`` dealloc (:pr:`21`).


Version 0.1.0 (2021-02-23)
--------------------------

- Initial Release