{
  "appeals": 1,
  "budgets": {
    "baseline_limit_s": 600,
    "verification_timeout_s": 600,
    "worker": {
      "max_completion_tokens": 96000,
      "max_turns": 60,
      "max_wall_seconds": 1500.0,
      "prompt_token_budget": 160000
    }
  },
  "issue": "Mixin Strategy Produces Invalid Queries\n### Summary\r\nThe Mixins feature is a great idea for extending the functionality of generated classes, however the mixin directive is not removed from the final generated query, resulting in errors returned from remote APIs.\r\n\r\n\r\n### Example\r\nLet's say that we simply want to validate that a mixin has been applied by returning a message:\r\n\r\n```python\r\nclass RepositoryMixin:\r\n    def test_mixin(self):\r\n        return \"This is a mixin for the Repository object!\"\r\n```\r\nWe then add it to the config TOML and include it in our GraphQL query:\r\n\r\n```toml\r\nfiles_to_include = [\r\n    \"./codegen/github_enterprise/mixins/repository_mixin.py\",\r\n]\r\n```\r\n\r\n```gql\r\nquery get_repository($repo_owner: String!, $repo_name: String!) {\r\n  repository(name: $repo_name, owner: $repo_owner)\r\n    @mixin(from: \".repository_mixin\", import: \"RepositoryMixin\") {\r\n    nameWithOwner\r\n    description\r\n  }\r\n}\r\n```\r\n\r\nLooking at the generated Pydantic `BaseModel` we can see that the mixin was applied successfully:\r\n\r\n```python\r\nclass GetRepositoryRepository(BaseModel, RepositoryMixin):\r\n    name_with_owner: str = Field(alias=\"nameWithOwner\")\r\n    description: Optional[str]\r\n```\r\n\r\nHowever, the final generated query in the final generated GraphQL Client still contains the mixin directive used previously to generate our Pydantic model that inherits the mixin:\r\n\r\n<img width=\"801\" alt=\"codegen-bad-generated-query\" src=\"https://github.com/mirumee/ariadne-codegen/assets/31744764/da4ae62c-4e13-4b09-88f1-7c5b40487bce\">\r\n<br />\r\n<br />\r\n\r\nExecuting the `GithubEnterpriseClient.get_repository` method with this query results in `GraphQLClientHttpError: HTTP status code: 500`. Removing the mixin from the generated query fixes the error and returns the requested data, which contains a Repository on which you can successfully call the `Repository.test_mixin` method and get the expected output: `This is a mixin for the Repository object.`\r\n\r\n### Fix\r\n\r\n\r\n- Is the `@mixin` directive intended to be used exclusively at generation-time to inject the proper class into the inheritance chain of a given Pydantic model? \r\n  - If yes, then can this issue be fixed by simply programming the codegen business logic to remove the mixin from the final generated query in the GraphQL client? \r\n  - If no,  what is the use-case of preserving the mixin in the final generated query and how can one use it without remote API errors?\r\n\r\n\r\n",
  "source": {
    "image": "docker.io/swerebenchv2/mirumee-ariadne-codegen:159-b09a532",
    "platform": "linux/amd64",
    "python": "python",
    "setup": [
      "python -c 'import base64; from pathlib import Path; Path('\"'\"'/tmp/receipts-mirumee__ariadne-codegen-159-test.patch'\"'\"').write_bytes(base64.b64decode('\"'\"'ZGlmZiAtLWdpdCBhL3Rlc3RzL2NsaWVudF9nZW5lcmF0b3JzL3Jlc3VsdF90eXBlc19nZW5lcmF0b3IvdGVzdF9nZXRfb3BlcmF0aW9uX2FzX3N0ci5weSBiL3Rlc3RzL2NsaWVudF9nZW5lcmF0b3JzL3Jlc3VsdF90eXBlc19nZW5lcmF0b3IvdGVzdF9nZXRfb3BlcmF0aW9uX2FzX3N0ci5weQppbmRleCBiYTkyNGQ3Li40NzcyMGFmIDEwMDY0NAotLS0gYS90ZXN0cy9jbGllbnRfZ2VuZXJhdG9ycy9yZXN1bHRfdHlwZXNfZ2VuZXJhdG9yL3Rlc3RfZ2V0X29wZXJhdGlvbl9hc19zdHIucHkKKysrIGIvdGVzdHMvY2xpZW50X2dlbmVyYXRvcnMvcmVzdWx0X3R5cGVzX2dlbmVyYXRvci90ZXN0X2dldF9vcGVyYXRpb25fYXNfc3RyLnB5CkBAIC03LDYgKzcsNyBAQCBmcm9tIGdyYXBocWwgaW1wb3J0ICgKICAgICBwYXJzZSwKICkKIAorZnJvbSBhcmlhZG5lX2NvZGVnZW4uY2xpZW50X2dlbmVyYXRvcnMuY29uc3RhbnRzIGltcG9ydCBNSVhJTl9OQU1FCiBmcm9tIGFyaWFkbmVfY29kZWdlbi5jbGllbnRfZ2VuZXJhdG9ycy5yZXN1bHRfdHlwZXMgaW1wb3J0IFJlc3VsdFR5cGVzR2VuZXJhdG9yCiAKIGZyb20gLi4udXRpbHMgaW1wb3J0IGZvcm1hdF9ncmFwaHFsX3N0cgpAQCAtMTU4LDMgKzE1OSwzOSBAQCBkZWYgdGVzdF9nZXRfb3BlcmF0aW9uX2FzX3N0cl9yZXR1cm5zX3N0cl93aXRoX2ZyYWdtZW50X3VzZWRfYnlfYW5vdGhlcl9mcmFnbWVudAogCiAgICAgYXNzZXJ0ICJmcmFnbWVudCBUZXN0RnJhZ21lbnQgb24gQ3VzdG9tVHlwZSIgaW4gcmVzdWx0CiAgICAgYXNzZXJ0ICJmcmFnbWVudCBOZXN0ZWRGcmFnbWVudCBvbiBDdXN0b21UeXBlMiIgaW4gcmVzdWx0CisKKworZGVmIHRlc3RfZ2V0X29wZXJhdGlvbl9hc19zdHJfcmV0dXJuc19yZXByZXNlbnRhdGlvbl93aXRob3V0X21peGluX2RpcmVjdGl2ZSgpOgorICAgIHF1ZXJ5X3N0ciA9IGZvcm1hdF9ncmFwaHFsX3N0cigKKyAgICAgICAgIiIiCisgICAgICAgIHF1ZXJ5IEN1c3RvbVF1ZXJ5IHsKKyAgICAgICAgICAgIHF1ZXJ5MiBAbWl4aW4oZnJvbTogIi5taXhpbnMiLCBpbXBvcnQ6ICJUZXN0TWl4aW4iKSB7CisgICAgICAgICAgICAgICAgaWQKKyAgICAgICAgICAgICAgICBmaWVsZDEgQG1peGluKGZyb206ICIubWl4aW5zIiwgaW1wb3J0OiAiVGVzdE1peGluMSIpIHsKKyAgICAgICAgICAgICAgICAgICAgZmllbGRhCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpZWxkMiBAbWl4aW4oZnJvbTogIi5taXhpbnMiLCBpbXBvcnQ6ICJUZXN0TWl4aW4yIikgeworICAgICAgICAgICAgICAgICAgICBmaWVsZGIKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIiIiCisgICAgKQorICAgIGdlbmVyYXRvciA9IFJlc3VsdFR5cGVzR2VuZXJhdG9yKAorICAgICAgICBzY2hlbWE9YnVpbGRfYXN0X3NjaGVtYShwYXJzZShTQ0hFTUFfU1RSKSksCisgICAgICAgIG9wZXJhdGlvbl9kZWZpbml0aW9uPWNhc3QoCisgICAgICAgICAgICBPcGVyYXRpb25EZWZpbml0aW9uTm9kZSwgcGFyc2UocXVlcnlfc3RyKS5kZWZpbml0aW9uc1swXQorICAgICAgICApLAorICAgICAgICBlbnVtc19tb2R1bGVfbmFtZT0iZW51bXMiLAorICAgICkKKworICAgIHJlc3VsdCA9IGdlbmVyYXRvci5nZXRfb3BlcmF0aW9uX2FzX3N0cigpCisKKyAgICBhc3NlcnQgTUlYSU5fTkFNRSBub3QgaW4gcmVzdWx0CisgICAgIyB0ZXN0cyB0aGF0IG9wZXJhdGlvbiBkZWZpbml0aW9uIHN0aWxsIGNvbnRhaW5zIG1peGluIGRpcmVjdGl2ZQorICAgIGZpZWxkX3F1ZXJ5MiA9IGdlbmVyYXRvci5vcGVyYXRpb25fZGVmaW5pdGlvbi5zZWxlY3Rpb25fc2V0LnNlbGVjdGlvbnNbMF0KKyAgICBmaWVsZF9maWVsZDEgPSBmaWVsZF9xdWVyeTIuc2VsZWN0aW9uX3NldC5zZWxlY3Rpb25zWzFdCisgICAgZmllbGRfZmllbGQyID0gZmllbGRfcXVlcnkyLnNlbGVjdGlvbl9zZXQuc2VsZWN0aW9uc1syXQorICAgIGFzc2VydCBmaWVsZF9xdWVyeTIuZGlyZWN0aXZlc1swXS5uYW1lLnZhbHVlID09IE1JWElOX05BTUUKKyAgICBhc3NlcnQgZmllbGRfZmllbGQxLmRpcmVjdGl2ZXNbMF0ubmFtZS52YWx1ZSA9PSBNSVhJTl9OQU1FCisgICAgYXNzZXJ0IGZpZWxkX2ZpZWxkMi5kaXJlY3RpdmVzWzBdLm5hbWUudmFsdWUgPT0gTUlYSU5fTkFNRQpkaWZmIC0tZ2l0IGEvdGVzdHMvbWFpbi9jbGllbnRzL2V4dGVuZGVkX21vZGVscy9leHBlY3RlZF9jbGllbnQvY2xpZW50LnB5IGIvdGVzdHMvbWFpbi9jbGllbnRzL2V4dGVuZGVkX21vZGVscy9leHBlY3RlZF9jbGllbnQvY2xpZW50LnB5CmluZGV4IDVkZjk1ZmQuLjRkOTI1MDkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL21haW4vY2xpZW50cy9leHRlbmRlZF9tb2RlbHMvZXhwZWN0ZWRfY2xpZW50L2NsaWVudC5weQorKysgYi90ZXN0cy9tYWluL2NsaWVudHMvZXh0ZW5kZWRfbW9kZWxzL2V4cGVjdGVkX2NsaWVudC9jbGllbnQucHkKQEAgLTEyLDcgKzEyLDcgQEAgY2xhc3MgQ2xpZW50KEFzeW5jQmFzZUNsaWVudCk6CiAgICAgICAgIHF1ZXJ5ID0gZ3FsKAogICAgICAgICAgICAgIiIiCiAgICAgICAgICAgICBxdWVyeSBnZXRRdWVyeUEgewotICAgICAgICAgICAgICBxdWVyeUEgQG1peGluKGZyb206ICIubWl4aW5zX2EiLCBpbXBvcnQ6ICJNaXhpbkEiKSBAbWl4aW4oZnJvbTogIi5jb21tb25fbWl4aW5zIiwgaW1wb3J0OiAiQ29tbW9uTWl4aW4iKSB7CisgICAgICAgICAgICAgIHF1ZXJ5QSB7CiAgICAgICAgICAgICAgICAgZmllbGRBCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTI3LDcgKzI3LDcgQEAgY2xhc3MgQ2xpZW50KEFzeW5jQmFzZUNsaWVudCk6CiAgICAgICAgIHF1ZXJ5ID0gZ3FsKAogICAgICAgICAgICAgIiIiCiAgICAgICAgICAgICBxdWVyeSBnZXRRdWVyeUIgewotICAgICAgICAgICAgICBxdWVyeUIgQG1peGluKGZyb206ICIubWl4aW5zX2IiLCBpbXBvcnQ6ICJNaXhpbkIiKSBAbWl4aW4oZnJvbTogIi5jb21tb25fbWl4aW5zIiwgaW1wb3J0OiAiQ29tbW9uTWl4aW4iKSB7CisgICAgICAgICAgICAgIHF1ZXJ5QiB7CiAgICAgICAgICAgICAgICAgZmllbGRCCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0K'\"'\"'))'",
      "git apply /tmp/receipts-mirumee__ariadne-codegen-159-test.patch"
    ],
    "workdir": "/ariadne-codegen"
  },
  "spec_paths": [
    "tests/client_generators/result_types_generator/test_get_operation_as_str.py",
    "tests/main/clients/extended_models/expected_client/client.py"
  ],
  "spec_tests": [
    "tests/client_generators/result_types_generator/test_get_operation_as_str.py::test_get_operation_as_str_returns_representation_without_mixin_directive"
  ],
  "suite_scope": "--no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning tests/client_generators/result_types_generator/test_get_operation_as_str.py tests/main/clients/extended_models/expected_client/client.py"
}
