{"payload":{"feedbackUrl":"https://github.com/orgs/community/discussions/53140","repo":{"id":443028550,"defaultBranch":"master","name":"extendable-pydantic","ownerLogin":"lmignon","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2021-12-30T09:31:15.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/544090?v=4","public":true,"private":false,"isOrgOwned":false},"refInfo":{"name":"","listCacheKey":"v0:1726738733.0","currentOid":""},"activityList":{"items":[{"before":"d59967213f95a84e333db2d00e6e079bd1eee5f0","after":"634cf50b570814236e4bb809d4dafc81f5f1f63d","ref":"refs/heads/master","pushedAt":"2024-09-19T09:38:18.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"lmignon","name":"Laurent Mignon (ACSONE)","path":"/lmignon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/544090?s=80&v=4"},"commit":{"message":"1.3.2","shortMessageHtmlLink":"1.3.2"}},{"before":"bffb656078b24861eb2d94bdf8f8a302a267b3a9","after":null,"ref":"refs/tags/v1.3.2","pushedAt":"2024-09-19T09:36:12.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"lmignon","name":"Laurent Mignon (ACSONE)","path":"/lmignon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/544090?s=80&v=4"}},{"before":"d59967213f95a84e333db2d00e6e079bd1eee5f0","after":null,"ref":"refs/heads/master-fastapi-compatibility","pushedAt":"2024-09-19T09:34:22.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"lmignon","name":"Laurent Mignon (ACSONE)","path":"/lmignon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/544090?s=80&v=4"}},{"before":"ffdc03a12b8acb8ca0f9b600e185a8fcadaf871a","after":"d59967213f95a84e333db2d00e6e079bd1eee5f0","ref":"refs/heads/master","pushedAt":"2024-09-19T09:33:07.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"lmignon","name":"Laurent Mignon (ACSONE)","path":"/lmignon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/544090?s=80&v=4"},"commit":{"message":"Fix compatibility issue with fastapi >= 0.112.3\n\n If fastapi is installed we path the method used to build the field definition from model to ensure that the registry is initialized. From version 0.112.3 the patched method 'create_response_field' has been renamed 'create_model_field'. This change ensure that this new method is also patched\n\n fixes #20","shortMessageHtmlLink":"Fix compatibility issue with fastapi >= 0.112.3"}},{"before":null,"after":"d59967213f95a84e333db2d00e6e079bd1eee5f0","ref":"refs/heads/master-fastapi-compatibility","pushedAt":"2024-09-19T07:46:55.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"lmignon","name":"Laurent Mignon (ACSONE)","path":"/lmignon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/544090?s=80&v=4"},"commit":{"message":"Fix compatibility issue with fastapi >= 0.112.3\n\n If fastapi is installed we path the method used to build the field definition from model to ensure that the registry is initialized. From version 0.112.3 the patched method 'create_response_field' has been renamed 'create_model_field'. This change ensure that this new method is also patched\n\n fixes #20","shortMessageHtmlLink":"Fix compatibility issue with fastapi >= 0.112.3"}},{"before":"351e39107eb932b0a1a4311c491c46f7b887dedd","after":"ffdc03a12b8acb8ca0f9b600e185a8fcadaf871a","ref":"refs/heads/master","pushedAt":"2024-09-10T11:29:49.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"lmignon","name":"Laurent Mignon (ACSONE)","path":"/lmignon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/544090?s=80&v=4"},"commit":{"message":"1.3.1","shortMessageHtmlLink":"1.3.1"}},{"before":"a7ebbbc8460dc160990d406f9cb06d9e2f5f064e","after":"351e39107eb932b0a1a4311c491c46f7b887dedd","ref":"refs/heads/master","pushedAt":"2024-09-10T08:46:07.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"lmignon","name":"Laurent Mignon (ACSONE)","path":"/lmignon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/544090?s=80&v=4"},"commit":{"message":"update pre-commit","shortMessageHtmlLink":"update pre-commit"}},{"before":"018a741baf6c8c929d2e01d4720decf0b406907d","after":"a7ebbbc8460dc160990d406f9cb06d9e2f5f064e","ref":"refs/heads/master","pushedAt":"2024-09-10T08:37:33.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"lmignon","name":"Laurent Mignon (ACSONE)","path":"/lmignon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/544090?s=80&v=4"},"commit":{"message":"Fix compatibility issue with fastapi >= 0.112.3\n\nIf fastapi is installed we path the method used to build the field definition from model to ensure that the registry is initialized. From version 0.112.3 the patched method 'create_response_field' has been renamed 'create_model_field'. This change ensure that this new method is also patched\n\nfixes #20","shortMessageHtmlLink":"Fix compatibility issue with fastapi >= 0.112.3"}},{"before":"74e5cf78708e4bfaa488a67059063948b7e49e48","after":"018a741baf6c8c929d2e01d4720decf0b406907d","ref":"refs/heads/master","pushedAt":"2024-09-10T08:36:33.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"lmignon","name":"Laurent Mignon (ACSONE)","path":"/lmignon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/544090?s=80&v=4"},"commit":{"message":"Fix compatibility issue with fastapi >= 0.112.3\n\nIf fastapi is installed we path the method used to build the field definition from model to ensure that the registry is initialized. From version 0.112.3 the patched method 'create_response_field' has been renamed 'create_model_field'. This change ensure that this new method is also patched\n\nfixes #20","shortMessageHtmlLink":"Fix compatibility issue with fastapi >= 0.112.3"}},{"before":"c2aeed00f567f5b10a6d7fc568122f8ce9502198","after":"74e5cf78708e4bfaa488a67059063948b7e49e48","ref":"refs/heads/master","pushedAt":"2023-11-23T08:53:53.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"lmignon","name":"Laurent Mignon (ACSONE)","path":"/lmignon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/544090?s=80&v=4"},"commit":{"message":"1.3.0","shortMessageHtmlLink":"1.3.0"}},{"before":"c9546293d005bf3e8ec2d85507a76ad808b00bc3","after":null,"ref":"refs/heads/master-recursive-mode-rebuild","pushedAt":"2023-11-23T08:51:05.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"lmignon","name":"Laurent Mignon (ACSONE)","path":"/lmignon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/544090?s=80&v=4"}},{"before":"55cd466f50dd464c51bed0e94160d280422b11c8","after":"c2aeed00f567f5b10a6d7fc568122f8ce9502198","ref":"refs/heads/master","pushedAt":"2023-11-23T08:51:00.000Z","pushType":"pr_merge","commitsCount":3,"pusher":{"login":"lmignon","name":"Laurent Mignon (ACSONE)","path":"/lmignon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/544090?s=80&v=4"},"commit":{"message":"Merge pull request #19 from lmignon/master-recursive-mode-rebuild\n\nEnsure recursive field annotation resolution","shortMessageHtmlLink":"Merge pull request #19 from lmignon/master-recursive-mode-rebuild"}},{"before":"1fd4b3515f3f36ffcb125208b2864603e9889b32","after":"c9546293d005bf3e8ec2d85507a76ad808b00bc3","ref":"refs/heads/master-recursive-mode-rebuild","pushedAt":"2023-11-23T08:48:24.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"lmignon","name":"Laurent Mignon (ACSONE)","path":"/lmignon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/544090?s=80&v=4"},"commit":{"message":"Fix problem with unresolved annotated types in the aggregated model.\n\nAt the end of the registry building process, the registry contains the aggregated\nmodel. Each aggregated model is the result of the build of a new class based on\na hierarchy of all the classes defined as 'extends' of the same base class. The\norder of the classes hierarchy is defined by the order in which the classes are\nloaded by the class loader or by a specific order defined by the developer when\nthe registry is built.\n\nThe last step of the build process is to resolve all the annotated types in the\naggregated model and rebuild the pydantic schema validator. This step is necessary\nbecause when the developer defines a model, some fields can be annotated with a\ntype that refers to a class that is an extendable class. It's therefore necessary\nto update the annotated type with the aggregated result of the specified\nextendable class and rebuild the pydantic schema validator to take into account\nthe new annotated types.\n\nPrior to this commit, the resolution of the annotated types was not done in a\nrecursive way and the rebuild of the pydantic schema validator was only done\njust after the resolution of an aggregated class. This means that if a class A\nis an extendable defining a fields annotated with a type that refers to a class\nB, and if the class B is an extendable class defining a field of type C,\nthe annotated type of the field of the class A was resolved with the aggregated\nmodel of the class B but we didn't resolve th annotated type of the field ot type\nB with the aggregated model of the type C. Therefore when the pydantic schema\nvalidator was rebuilt after the resolution of the class A, if the class B was\nnot yet resolved and therefore the pydantic schema validator was not rebuilt,\nthe new schema validator for the class A was not correct because it didn't take\ninto account the aggregated model of the class C nor the definition of extra\nfields of the aggregated model of the class B.\n\nThis commit changes the resolution of the annotated types to be recursive. Therefore\nwhen the pydantic schema validator is rebuilt, we are sure that all referenced\nsubtypes are resolved and defines a correct schema validator. In the\nsame time, when an aggregated class is resolved, it's marked as resolved to avoid\nto resolve it again and rebuild the pydantic schema validator again for nothing.\nIn addition to resolve the initial problem, this commit also improves\nthe performance of the build process because schema validators rebuilds are\ndone only once per aggregated class.","shortMessageHtmlLink":"Fix problem with unresolved annotated types in the aggregated model."}},{"before":"46184efea81a1de8d158acf3d5987c2587aca393","after":"1fd4b3515f3f36ffcb125208b2864603e9889b32","ref":"refs/heads/master-recursive-mode-rebuild","pushedAt":"2023-11-23T08:46:28.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"lmignon","name":"Laurent Mignon (ACSONE)","path":"/lmignon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/544090?s=80&v=4"},"commit":{"message":"Better control of model rebuild\n\nThe model only needs to be rebuilt when the resolution of field types in an extensible model modifies the field type. This modification only occurs if the field is itself of an extensible type. In this case, the original type is replaced by the class aggregated for the original type.","shortMessageHtmlLink":"Better control of model rebuild"}},{"before":"8f9fb7732348bbae0ee6d50116b544561a57b4e2","after":"46184efea81a1de8d158acf3d5987c2587aca393","ref":"refs/heads/master-recursive-mode-rebuild","pushedAt":"2023-11-21T07:07:19.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"lmignon","name":"Laurent Mignon (ACSONE)","path":"/lmignon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/544090?s=80&v=4"},"commit":{"message":"Better control of model rebuild\n\nThe model only needs to be rebuilt when the resolution of field types in an extensible model modifies the field type. This modification only occurs if the field is itself of an extensible type. In this case, the original type is replaced by the class aggregated for the original type.","shortMessageHtmlLink":"Better control of model rebuild"}},{"before":"bb7788e1404b99d404fcef5b364cb092c1706c0c","after":"8f9fb7732348bbae0ee6d50116b544561a57b4e2","ref":"refs/heads/master-recursive-mode-rebuild","pushedAt":"2023-11-20T22:26:32.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"lmignon","name":"Laurent Mignon (ACSONE)","path":"/lmignon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/544090?s=80&v=4"},"commit":{"message":"Ensure recursive field annotation resolution\n\nAt the end of the registry initialisation, we need to walk across all the fields defined on extendable models to replace the annoted orignal type by the one build into the registry if the field reference a extendable model. Once we replace the declared type buy the resolved one, we also need to rebuild the model schema to take into account this change. Prior to this change, the result was consistent. Indeed, the resolution mechanism was not applied recursively. As result the model rebuild for a class with a field declared as an extendable model type, could not contain the resolved definition of fields declared into this referenced extendable model type if the resolution of the last one was not already done. The resolution mechanism is now recursive and when a annotation is resolved, we ensure that the new type is also resolved.","shortMessageHtmlLink":"Ensure recursive field annotation resolution"}},{"before":"80743d5544de492e40195ac037110c0b73d2380d","after":"55cd466f50dd464c51bed0e94160d280422b11c8","ref":"refs/heads/master","pushedAt":"2023-11-20T22:25:50.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"lmignon","name":"Laurent Mignon (ACSONE)","path":"/lmignon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/544090?s=80&v=4"},"commit":{"message":"1.2.0","shortMessageHtmlLink":"1.2.0"}},{"before":null,"after":"bb7788e1404b99d404fcef5b364cb092c1706c0c","ref":"refs/heads/master-recursive-mode-rebuild","pushedAt":"2023-11-20T22:23:44.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"lmignon","name":"Laurent Mignon (ACSONE)","path":"/lmignon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/544090?s=80&v=4"},"commit":{"message":"Ensure recursive field annotation resolution\n\nAt the end of the registry, we need to walk across all the fields defined on extendable models to replace the annoted orignal type by the one build into the registry if the field reference a extendable model. Once we replace the declared type buy the resolved one, we also need to rebuild the model schema to take into account this change. Prior to this change, the result was consistent. Indeed, the resolution mechanism was not applied recursively. As result the model rebuild for a class with a field declared as an extendable model type, could not contain the resolved definition of fields declared into this referenced extendable model type if the resolution of the last one was not already done. The resolution mechanism is now recursive and when a annotation is resolved, we ensure that the new type is also resolved.","shortMessageHtmlLink":"Ensure recursive field annotation resolution"}},{"before":"d5bcfae726ca916586117fc60b3e9a63b7bb0069","after":null,"ref":"refs/heads/master-pydantic-2.5.0","pushedAt":"2023-11-13T17:43:17.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"lmignon","name":"Laurent Mignon (ACSONE)","path":"/lmignon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/544090?s=80&v=4"}},{"before":"4b8c7c375b962f96334679e7e49daf81ad97250c","after":"80743d5544de492e40195ac037110c0b73d2380d","ref":"refs/heads/master","pushedAt":"2023-11-13T17:43:13.000Z","pushType":"pr_merge","commitsCount":2,"pusher":{"login":"lmignon","name":"Laurent Mignon (ACSONE)","path":"/lmignon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/544090?s=80&v=4"},"commit":{"message":"Merge pull request #18 from lmignon/master-pydantic-2.5.0\n\nFix compatibility issue with pydantic 2.5.0","shortMessageHtmlLink":"Merge pull request #18 from lmignon/master-pydantic-2.5.0"}},{"before":"e2f6c1aaa99aebd1721fe263ca9a37218dbe9f32","after":"d5bcfae726ca916586117fc60b3e9a63b7bb0069","ref":"refs/heads/master-pydantic-2.5.0","pushedAt":"2023-11-13T17:39:27.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"lmignon","name":"Laurent Mignon (ACSONE)","path":"/lmignon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/544090?s=80&v=4"},"commit":{"message":"Fix compatibility issue with pydantic 2.5.0\n\nImport FieldInfo from its original package","shortMessageHtmlLink":"Fix compatibility issue with pydantic 2.5.0"}},{"before":"4a0ede3017a9b2d5a9421295d0e7175260da5d86","after":"e2f6c1aaa99aebd1721fe263ca9a37218dbe9f32","ref":"refs/heads/master-pydantic-2.5.0","pushedAt":"2023-11-13T17:38:24.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"lmignon","name":"Laurent Mignon (ACSONE)","path":"/lmignon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/544090?s=80&v=4"},"commit":{"message":"Fix compatibility issue with pydantic 2.5.0\n\nImport FieldInfo from its original package","shortMessageHtmlLink":"Fix compatibility issue with pydantic 2.5.0"}},{"before":null,"after":"4a0ede3017a9b2d5a9421295d0e7175260da5d86","ref":"refs/heads/master-pydantic-2.5.0","pushedAt":"2023-11-13T17:34:17.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"lmignon","name":"Laurent Mignon (ACSONE)","path":"/lmignon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/544090?s=80&v=4"},"commit":{"message":"Fix compatibility issue with pydantic 2.5.0\n\nImport FieldInfo from its original package","shortMessageHtmlLink":"Fix compatibility issue with pydantic 2.5.0"}},{"before":"92d7fd9f021603a5b2cb49f4e080264554342741","after":"4b8c7c375b962f96334679e7e49daf81ad97250c","ref":"refs/heads/master","pushedAt":"2023-10-11T10:03:53.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"lmignon","name":"Laurent Mignon (ACSONE)","path":"/lmignon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/544090?s=80&v=4"},"commit":{"message":"1.2.0","shortMessageHtmlLink":"1.2.0"}},{"before":"92d7fd9f021603a5b2cb49f4e080264554342741","after":null,"ref":"refs/tags/1.2.0","pushedAt":"2023-10-11T10:03:42.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"lmignon","name":"Laurent Mignon (ACSONE)","path":"/lmignon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/544090?s=80&v=4"}},{"before":"f31afa1a8542efa99a4f9a5b2e55dd305ec4505c","after":null,"ref":"refs/heads/master-strictextendable","pushedAt":"2023-10-11T10:00:28.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"lmignon","name":"Laurent Mignon (ACSONE)","path":"/lmignon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/544090?s=80&v=4"}},{"before":"bdfe3021feb53586db7df379a9ad3cdbb030bd20","after":"92d7fd9f021603a5b2cb49f4e080264554342741","ref":"refs/heads/master","pushedAt":"2023-10-11T09:59:59.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"lmignon","name":"Laurent Mignon (ACSONE)","path":"/lmignon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/544090?s=80&v=4"},"commit":{"message":"eases import of StrictExtendableBaseModel from root module root","shortMessageHtmlLink":"eases import of StrictExtendableBaseModel from root module root"}},{"before":"6bb0ad33c76ce4bfaf82419ada1982d78561b65a","after":"bdfe3021feb53586db7df379a9ad3cdbb030bd20","ref":"refs/heads/master","pushedAt":"2023-10-11T09:55:02.000Z","pushType":"pr_merge","commitsCount":3,"pusher":{"login":"lmignon","name":"Laurent Mignon (ACSONE)","path":"/lmignon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/544090?s=80&v=4"},"commit":{"message":"Merge pull request #17 from lmignon/master-strictextendable\n\n[ADD] StrictExtendableBaseModel: An ExtendableBaseModel with strict v…","shortMessageHtmlLink":"Merge pull request #17 from lmignon/master-strictextendable"}},{"before":"1bb07a51b80d29b31e1356dea08d6b387b0dd83d","after":"f31afa1a8542efa99a4f9a5b2e55dd305ec4505c","ref":"refs/heads/master-strictextendable","pushedAt":"2023-10-11T09:09:26.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"lmignon","name":"Laurent Mignon (ACSONE)","path":"/lmignon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/544090?s=80&v=4"},"commit":{"message":"Tests with py 3.12","shortMessageHtmlLink":"Tests with py 3.12"}},{"before":"21c6e8c88ab3e82a0b781a462dd9aa8eaf598699","after":"1bb07a51b80d29b31e1356dea08d6b387b0dd83d","ref":"refs/heads/master-strictextendable","pushedAt":"2023-10-11T09:05:35.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"lmignon","name":"Laurent Mignon (ACSONE)","path":"/lmignon","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/544090?s=80&v=4"},"commit":{"message":"Tests with py 3.12","shortMessageHtmlLink":"Tests with py 3.12"}}],"hasNextPage":true,"hasPreviousPage":false,"activityType":"all","actor":null,"timePeriod":"all","sort":"DESC","perPage":30,"startCursor":"Y3Vyc29yOnYyOpK7MjAyNC0wOS0xOVQwOTozODoxOC4wMDAwMDBazwAAAAS6qR93","endCursor":"Y3Vyc29yOnYyOpK7MjAyMy0xMC0xMVQwOTowNTozNS4wMDAwMDBazwAAAAOUZob9"}},"title":"Activity · lmignon/extendable-pydantic"}