{"payload":{"feedbackUrl":"https://github.com/orgs/community/discussions/53140","repo":{"id":332952543,"defaultBranch":"main","name":"msgspec","ownerLogin":"jcrist","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2021-01-26T02:53:57.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/2783717?v=4","public":true,"private":false,"isOrgOwned":false},"refInfo":{"name":"","listCacheKey":"v0:1716930063.0","currentOid":""},"activityList":{"items":[{"before":"0c8886f62b25e24c1e6ab5593391a30bedb76706","after":null,"ref":"refs/heads/error-on-32-bit-builds","pushedAt":"2024-05-28T21:01:03.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"jcrist","name":"Jim Crist-Harif","path":"/jcrist","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/2783717?s=80&v=4"}},{"before":"5e4068c726cded29ea2998c867bfbf2dd4cf350e","after":"2c37da090b2c5fcb2ecca9ae00274c67fabb85cf","ref":"refs/heads/main","pushedAt":"2024-05-28T21:01:00.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"jcrist","name":"Jim Crist-Harif","path":"/jcrist","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/2783717?s=80&v=4"},"commit":{"message":"Error when compiling for 32-bit windows builds","shortMessageHtmlLink":"Error when compiling for 32-bit windows builds"}},{"before":null,"after":"0c8886f62b25e24c1e6ab5593391a30bedb76706","ref":"refs/heads/error-on-32-bit-builds","pushedAt":"2024-05-28T20:38:47.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"jcrist","name":"Jim Crist-Harif","path":"/jcrist","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/2783717?s=80&v=4"},"commit":{"message":"Error when compiling for 32-bit windows builds","shortMessageHtmlLink":"Error when compiling for 32-bit windows builds"}},{"before":"98f865eef5faae0a131e37eb7058395fc53a5198","after":"2d37630544056272b2b5f275eefe96d3f7747c11","ref":"refs/heads/gh-pages","pushedAt":"2024-05-10T16:37:27.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"github-actions[bot]","name":null,"path":"/apps/github-actions","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/15368?s=80&v=4"},"commit":{"message":"deploy: 5e4068c726cded29ea2998c867bfbf2dd4cf350e","shortMessageHtmlLink":"deploy: 5e4068c"}},{"before":"13a06dd88bcf553bb0497da3b3f0a2a628627ed6","after":"5e4068c726cded29ea2998c867bfbf2dd4cf350e","ref":"refs/heads/main","pushedAt":"2024-05-10T16:36:43.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"jcrist","name":"Jim Crist-Harif","path":"/jcrist","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/2783717?s=80&v=4"},"commit":{"message":"Plug leak of \"match_args\" in StructMeta.\n\n\"match_args\" is set in StructMetaInfo and eventually StructMeta via -\n\n```\n info->match_args = PyTuple_GetSlice(info->fields, 0, nfields - nkwonly);\n```\n\nThis is incref'd before copying to StructMeta, and decref'd when\ncleaning up StructMetaInfo. There's no corresponding decref for\nStructMeta itself. This causes a leak that valgrind readily detects:\n\n```\nenv PYTHONMALLOC=malloc valgrind python3 -c 'import msgspec'\n...\n==576283== LEAK SUMMARY:\n==576283== definitely lost: 1,608 bytes in 26 blocks\n```\n\nWith the fix in place, we get:\n\n```\n==576086== LEAK SUMMARY:\n==576086== definitely lost: 0 bytes in 0 blocks\n```","shortMessageHtmlLink":"Plug leak of \"match_args\" in StructMeta."}},{"before":"52386c62dc14b73a126baedc9606f573682403f9","after":null,"ref":"refs/heads/omit-defaults-immutable-factories","pushedAt":"2024-03-10T07:53:33.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"jcrist","name":"Jim Crist-Harif","path":"/jcrist","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/2783717?s=80&v=4"}},{"before":"b44800c93eff7dbc948da569cc117b369b7fb81e","after":"13a06dd88bcf553bb0497da3b3f0a2a628627ed6","ref":"refs/heads/main","pushedAt":"2024-03-10T07:53:30.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"jcrist","name":"Jim Crist-Harif","path":"/jcrist","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/2783717?s=80&v=4"},"commit":{"message":"`omit_defaults` supports factory tuple/frozenset\n\nPreviously `omit_defaults` would only detect `tuple`/`frozenset` fields\ncontaining default values if the default was specified by value. We now\nalso support if these types are specified via `default_factory`.\n\nNote that since `tuple` and `frozenset` values are immutable there's no\nreal reason to prefer `default_factory` for defaults of these types.","shortMessageHtmlLink":"omit_defaults supports factory tuple/frozenset"}},{"before":"d52efca8230336da8ab7cbbec65282183da512bc","after":"52386c62dc14b73a126baedc9606f573682403f9","ref":"refs/heads/omit-defaults-immutable-factories","pushedAt":"2024-03-10T07:45:08.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"jcrist","name":"Jim Crist-Harif","path":"/jcrist","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/2783717?s=80&v=4"},"commit":{"message":"`omit_defaults` supports factory tuple/frozenset\n\nPreviously `omit_defaults` would only detect `tuple`/`frozenset` fields\ncontaining default values if the default was specified by value. We now\nalso support if these types are specified via `default_factory`.\n\nNote that since `tuple` and `frozenset` values are immutable there's no\nreal reason to prefer `default_factory` for defaults of these types.","shortMessageHtmlLink":"omit_defaults supports factory tuple/frozenset"}},{"before":"e938b0930e25ffa8b27648752d1b798169ec6ddc","after":"d52efca8230336da8ab7cbbec65282183da512bc","ref":"refs/heads/omit-defaults-immutable-factories","pushedAt":"2024-03-10T07:39:29.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"jcrist","name":"Jim Crist-Harif","path":"/jcrist","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/2783717?s=80&v=4"},"commit":{"message":"`omit_defaults` supports factory tuple/frozenset\n\nPreviously `omit_defaults` would only detect `tuple`/`frozenset` fields\ncontaining default values if the default was specified by value. We now\nalso support if these types are specified via `default_factory`.\n\nNote that since `tuple` and `frozenset` values are immutable there's no\nreal reason to prefer `default_factory` for defaults of these types.","shortMessageHtmlLink":"omit_defaults supports factory tuple/frozenset"}},{"before":null,"after":"e938b0930e25ffa8b27648752d1b798169ec6ddc","ref":"refs/heads/omit-defaults-immutable-factories","pushedAt":"2024-03-10T07:38:36.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"jcrist","name":"Jim Crist-Harif","path":"/jcrist","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/2783717?s=80&v=4"},"commit":{"message":"`omit_defaults` supports factory tuple/frozenset\n\nPreviously `omit_defaults` would only detect `tuple`/`frozenset` fields\ncontaining default values if the default was specified by value. We now\nalso support if these types are specified via `default_factory`.\n\nNote that since `tuple` and `frozenset` values are immutable there's no\nreal reason to prefer `default_factory` for defaults of these types.","shortMessageHtmlLink":"omit_defaults supports factory tuple/frozenset"}},{"before":"5c1900896f49aa0a7325e84cced2a64d74daa5db","after":null,"ref":"refs/heads/encoder-cleanups","pushedAt":"2024-02-23T12:42:03.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"jcrist","name":"Jim Crist-Harif","path":"/jcrist","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/2783717?s=80&v=4"}},{"before":"ac3ea04a407b61fcdfd103bd1cc5c12e8c7f4812","after":"b44800c93eff7dbc948da569cc117b369b7fb81e","ref":"refs/heads/main","pushedAt":"2024-02-23T12:41:57.000Z","pushType":"pr_merge","commitsCount":4,"pusher":{"login":"jcrist","name":"Jim Crist-Harif","path":"/jcrist","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/2783717?s=80&v=4"},"commit":{"message":"A few simplifications","shortMessageHtmlLink":"A few simplifications"}},{"before":null,"after":"5c1900896f49aa0a7325e84cced2a64d74daa5db","ref":"refs/heads/encoder-cleanups","pushedAt":"2024-02-23T04:09:34.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"jcrist","name":"Jim Crist-Harif","path":"/jcrist","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/2783717?s=80&v=4"},"commit":{"message":"A few simplifications","shortMessageHtmlLink":"A few simplifications"}},{"before":"99a8133b36a54fd7dee2d2d4c39bde8c29c02123","after":"98f865eef5faae0a131e37eb7058395fc53a5198","ref":"refs/heads/gh-pages","pushedAt":"2024-02-22T23:27:18.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"github-actions[bot]","name":null,"path":"/apps/github-actions","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/15368?s=80&v=4"},"commit":{"message":"deploy: ac3ea04a407b61fcdfd103bd1cc5c12e8c7f4812","shortMessageHtmlLink":"deploy: ac3ea04"}},{"before":"dffcc075a9edd450d46f862a25596b1375e76257","after":null,"ref":"refs/heads/add-recursion-test-from-orjson","pushedAt":"2024-02-22T23:26:42.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"jcrist","name":"Jim Crist-Harif","path":"/jcrist","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/2783717?s=80&v=4"}},{"before":"e1b889246a11816746f6fadd62a4ceda9e674999","after":"ac3ea04a407b61fcdfd103bd1cc5c12e8c7f4812","ref":"refs/heads/main","pushedAt":"2024-02-22T23:26:40.000Z","pushType":"pr_merge","commitsCount":2,"pusher":{"login":"jcrist","name":"Jim Crist-Harif","path":"/jcrist","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/2783717?s=80&v=4"},"commit":{"message":"Add tests for encoding/decoding highly recursive messages\n\nThis adds a test case found in the `orjson` repo to ensure that we\nproperly respect recursion limits when encoding or decoding deeply\nrecursive messages.\n\nNo code change is needed at this time, we properly manage recursion\nlimits already.","shortMessageHtmlLink":"Add tests for encoding/decoding highly recursive messages"}},{"before":"1ec33410facded4703fc823f5bc0e6a58351b360","after":"dffcc075a9edd450d46f862a25596b1375e76257","ref":"refs/heads/add-recursion-test-from-orjson","pushedAt":"2024-02-22T23:17:41.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"jcrist","name":"Jim Crist-Harif","path":"/jcrist","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/2783717?s=80&v=4"},"commit":{"message":"Add tests for encoding/decoding highly recursive messages\n\nThis adds a test case found in the `orjson` repo to ensure that we\nproperly respect recursion limits when encoding or decoding deeply\nrecursive messages.\n\nNo code change is needed at this time, we properly manage recursion\nlimits already.","shortMessageHtmlLink":"Add tests for encoding/decoding highly recursive messages"}},{"before":"fa1adff0d3652b02d9bea49a04e467e8a0031fa5","after":"1ec33410facded4703fc823f5bc0e6a58351b360","ref":"refs/heads/add-recursion-test-from-orjson","pushedAt":"2024-02-22T23:05:26.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"jcrist","name":"Jim Crist-Harif","path":"/jcrist","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/2783717?s=80&v=4"},"commit":{"message":"Bump cibuildwheel version\n\nRecent GitHub infrastructure changes require a new `cibuildwheel`\nrelease.","shortMessageHtmlLink":"Bump cibuildwheel version"}},{"before":"3be713c40ae7a7784de9aa59264ec0741660197b","after":"fa1adff0d3652b02d9bea49a04e467e8a0031fa5","ref":"refs/heads/add-recursion-test-from-orjson","pushedAt":"2024-02-22T23:00:13.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"jcrist","name":"Jim Crist-Harif","path":"/jcrist","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/2783717?s=80&v=4"},"commit":{"message":"Add tests for encoding/decoding highly recursive messages\n\nThis adds a test case found in the `orjson` repo to ensure that we\nproperly respect recursion limits when encoding or decoding deeply\nrecursive messages.\n\nNo code change is needed at this time, we properly manage recursion\nlimits already.","shortMessageHtmlLink":"Add tests for encoding/decoding highly recursive messages"}},{"before":null,"after":"3be713c40ae7a7784de9aa59264ec0741660197b","ref":"refs/heads/add-recursion-test-from-orjson","pushedAt":"2024-02-22T22:58:17.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"jcrist","name":"Jim Crist-Harif","path":"/jcrist","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/2783717?s=80&v=4"},"commit":{"message":"Add tests for encoding/decoding highly recursive messages\n\nThis adds a test case found in the `orjson` repo to ensure that we\nproperly respect recursion limits when encoding or decoding deeply\nrecursive messages.\n\nNo code change is needed at this time, we properly manage recursion\nlimits already.","shortMessageHtmlLink":"Add tests for encoding/decoding highly recursive messages"}},{"before":"9403ae88cf5f01e88eab75758802104c7401d51e","after":null,"ref":"refs/heads/add-recursive-schema-perf-test","pushedAt":"2024-01-25T23:59:38.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"jcrist","name":"Jim Crist-Harif","path":"/jcrist","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/2783717?s=80&v=4"}},{"before":"510d40160c5199fb562bc6f880e12f31cd697c6a","after":"e1b889246a11816746f6fadd62a4ceda9e674999","ref":"refs/heads/main","pushedAt":"2024-01-25T23:59:36.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"jcrist","name":"Jim Crist-Harif","path":"/jcrist","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/2783717?s=80&v=4"},"commit":{"message":"Add a deeply recursive schema/union test\n\nThis adds a test from [this pydantic\nissue](https://github.com/pydantic/pydantic/issues/8499) to ensure that\nwe don't error out when processing deeply recursive schemas with unions.\nNo code change is needed at this time, we process this schema\nefficiently already.","shortMessageHtmlLink":"Add a deeply recursive schema/union test"}},{"before":null,"after":"9403ae88cf5f01e88eab75758802104c7401d51e","ref":"refs/heads/add-recursive-schema-perf-test","pushedAt":"2024-01-25T23:44:29.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"jcrist","name":"Jim Crist-Harif","path":"/jcrist","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/2783717?s=80&v=4"},"commit":{"message":"Add a deeply recursive schema/union test\n\nThis adds a test from [this pydantic\nissue](https://github.com/pydantic/pydantic/issues/8499) to ensure that\nwe don't error out when processing deeply recursive schemas with unions.\nNo code change is needed at this time, we process this schema\nefficiently already.","shortMessageHtmlLink":"Add a deeply recursive schema/union test"}},{"before":"bd6766dcb696c3b6d92289ca9618a72ac283be30","after":"99a8133b36a54fd7dee2d2d4c39bde8c29c02123","ref":"refs/heads/gh-pages","pushedAt":"2024-01-22T03:58:13.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"github-actions[bot]","name":null,"path":"/apps/github-actions","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/15368?s=80&v=4"},"commit":{"message":"deploy: 510d40160c5199fb562bc6f880e12f31cd697c6a","shortMessageHtmlLink":"deploy: 510d401"}},{"before":"038d364e9d6e39bb9495e893f33c53787d5882e4","after":null,"ref":"refs/heads/update-changelog-0186","pushedAt":"2024-01-22T03:57:38.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"jcrist","name":"Jim Crist-Harif","path":"/jcrist","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/2783717?s=80&v=4"}},{"before":"de1a87ba15c021b00affbd353d0e984b8b94c106","after":"510d40160c5199fb562bc6f880e12f31cd697c6a","ref":"refs/heads/main","pushedAt":"2024-01-22T03:57:36.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"jcrist","name":"Jim Crist-Harif","path":"/jcrist","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/2783717?s=80&v=4"},"commit":{"message":"Update changelog for 0.18.6","shortMessageHtmlLink":"Update changelog for 0.18.6"}},{"before":"1ea7306a979d033c758eae06df492e5d4db9ef3f","after":"038d364e9d6e39bb9495e893f33c53787d5882e4","ref":"refs/heads/update-changelog-0186","pushedAt":"2024-01-22T03:55:45.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"jcrist","name":"Jim Crist-Harif","path":"/jcrist","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/2783717?s=80&v=4"},"commit":{"message":"Update changelog for 0.18.6","shortMessageHtmlLink":"Update changelog for 0.18.6"}},{"before":null,"after":"1ea7306a979d033c758eae06df492e5d4db9ef3f","ref":"refs/heads/update-changelog-0186","pushedAt":"2024-01-22T03:55:10.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"jcrist","name":"Jim Crist-Harif","path":"/jcrist","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/2783717?s=80&v=4"},"commit":{"message":"Update changelog for 0.18.6","shortMessageHtmlLink":"Update changelog for 0.18.6"}},{"before":"666c4279b659efe242f64d6b06037735cf122611","after":null,"ref":"refs/heads/from-attributes-infer-use-orig-names","pushedAt":"2024-01-22T03:29:57.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"jcrist","name":"Jim Crist-Harif","path":"/jcrist","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/2783717?s=80&v=4"}},{"before":"b08046b4a4e47b94ca5866d76fbf060f6d539cbb","after":"de1a87ba15c021b00affbd353d0e984b8b94c106","ref":"refs/heads/main","pushedAt":"2024-01-22T03:29:54.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"jcrist","name":"Jim Crist-Harif","path":"/jcrist","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/2783717?s=80&v=4"},"commit":{"message":"Infer naming convention when converting objects to structs\n\nStruct types support renaming of fields for encoding/decoding. A common\nuse of this is to enforce a camelCase convention in the serialized\nformat:\n\n```python\nimport msgspec\n\nclass Example(msgspec.Struct, rename=\"camel\"):\n field_one: int\n field_two: int\n\nx = Example(1, 2)\nprint(msgspec.json.encode(x))\n#> b'{\"fieldOne\":1,\"fieldTwo\":2}\n```\n\nPreviously when converting an object to a struct we'd always use the\nrenamed field names rather than the original names. This was true\nwhether the input was a `dict`, a non-dict mapping, mapping, or an\narbitrary object via attributes if `from_attributes=True`. The latter\ntwo inputs will rarely/never occur when coming from a serialization\nframework, but are more commonly used with database/ORM-like objects. In\nthis case it's more likely that the *original* attribute names are more\nuseful, as both the database and struct object representations are\ninternal to the application (unlike the serialized names which may have\nto match some external convention like camelCase).\n\nWe now infer the intended naming schem when a non-dict mapping or object\nis passed to `msgspec.convert` to convert to a `msgspec.Struct` type.\nThe inference process is as follows:\n\n- The attribute names are tried first\n\n- If an attribute name is present in the input AND the attribute name\n doesn't match the renamed name, then attribute names are used\n exclusively for the remainder of the conversion process.\n\n- If an attribute name isn't present AND the attribute name doesn't\n match the renamed name, then the renamed name is tried. If the renamed\n name is present, then renamed names are used exclusively for the\n remainder of the conversion process.\n\nA key point here is that inputs may not mix attribute and renamed names\ntogether - the inference process will decide to use either only one or\nthe other depending on what names are present. Using `Example` above:\n\n- An input with `field_one` and `field_two` would be valid\n\n- An input with `fieldOne` and `fieldTwo` would be valid\n\n- An input with `field_one` and `fieldTwo` would error saying\n `field_two` is missing.\n\n- An input with `fieldOne` and `field_two` would error saying `fieldTwo`\n is missing.\n\nThe overhead of this inference process is low - at worst only one excess\n`getattr` call is made to determine whether to use the original or\nrenamed names.\n\nTo reiterate, this change only affects object (non-dict mapping or\narbitrary object) inputs to `msgspec.convert` when converting to a\n`Struct` type. Inputs of other types like `dict` are still assumed to\nhave come from a serialization protocol and will always use the renamed\nnames.","shortMessageHtmlLink":"Infer naming convention when converting objects to structs"}}],"hasNextPage":true,"hasPreviousPage":false,"activityType":"all","actor":null,"timePeriod":"all","sort":"DESC","perPage":30,"cursor":"Y3Vyc29yOnYyOpK7MjAyNC0wNS0yOFQyMTowMTowMy4wMDAwMDBazwAAAARWSGcW","startCursor":"Y3Vyc29yOnYyOpK7MjAyNC0wNS0yOFQyMTowMTowMy4wMDAwMDBazwAAAARWSGcW","endCursor":"Y3Vyc29yOnYyOpK7MjAyNC0wMS0yMlQwMzoyOTo1NC4wMDAwMDBazwAAAAPlcC1g"}},"title":"Activity ยท jcrist/msgspec"}