Skip to content

Conversion from snake_case to camelCase in subfields is not happening #343

Open
@wiredmatt

Description

@wiredmatt

Hi, it seems like subquery fields are not being converted to camelcase when sending the request to graphql.

Repro

from codex import CodexClient, TokenInput
from codex.custom_queries import Query
from codex.custom_fields import SocialLinksFields, EnhancedTokenFields, TokenInfoFields, ExchangeFields
from uw_ai_backend.core.config import get_settings
import asyncio
import logging
import httpx

settings = get_settings()

async def log_request(request: httpx.Request):
    print(f"Request event hook: {request.method} {request.url} {request.content} - Waiting for response")

http_client = httpx.AsyncClient(event_hooks={
    'request': [log_request]
})

codex_client = CodexClient(
    url=settings.CODEX_URL, 
    headers={ "Authorization": settings.CODEX_API_KEY },
    http_client=http_client
)

logging.basicConfig(
    format="%(levelname)s [%(asctime)s] %(name)s - %(message)s",
    datefmt="%Y-%m-%d %H:%M:%S",
    level=logging.DEBUG
)

def get_token_details_query(dto: TokenInput):
    return Query.token(dto).fields(
        # METADATA
        EnhancedTokenFields.info().fields(
            TokenInfoFields.address,
            TokenInfoFields.name,
            TokenInfoFields.symbol,
            TokenInfoFields.network_id,
            TokenInfoFields.description,
            TokenInfoFields.is_scam,
            TokenInfoFields.total_supply,
            TokenInfoFields.circulating_supply,
            TokenInfoFields.image_thumb_url,
            TokenInfoFields.image_small_url,
        ),
        # METADATA

        # EXCHANGES
        EnhancedTokenFields.exchanges().fields(
            ExchangeFields.id,
            ExchangeFields.address,
            ExchangeFields.network_id,
            ExchangeFields.name,
            ExchangeFields.trade_url
        ),
        # EXCHANGES

        # SOCIAL LINKS
        EnhancedTokenFields.social_links().fields(
            SocialLinksFields.website
        ),
        # SOCIAL LINKS
    )

async def test_get_token_details():
    dto = TokenInput(
        address="0x532f27101965dd16442e59d40670faf5ebb142e4", # brett
        networkId=8453 # base
    )

    query = get_token_details_query(dto)

    response = await codex_client.query(
        query,
        operation_name="get_token_details"
    )

    print(response)

def main():
    asyncio.run(test_get_token_details())

social_links should be converted to socialLinks, however see the logs:

Request event hook: POST https://graph.defined.fi/graphql b'{"query": "query get_token_details($input_0: TokenInput!) {\\n  token(input: $input_0) {\\n    info {\\n      address\\n      name\\n      symbol\\n      networkId\\n      description\\n      isScam\\n      totalSupply\\n      circulatingSupply\\n      imageThumbUrl\\n      imageSmallUrl\\n    }\\n    exchanges {\\n      id\\n      address\\n      networkId\\n      name\\n      tradeUrl\\n    }\\n    social_links {\\n      website\\n    }\\n  }\\n}", "operationName": "get_token_details", "variables": {"input_0": {"address": "0x532f27101965dd16442e59d40670faf5ebb142e4", "networkId": 8453}}}' - Waiting for response

I tried using the convert_to_snake_case config parameter but that seems to be ignored, as the generated code is still outputted in camelcase.

[tool.ariadne-codegen]
schema_path = "graphql_src/codex/schema.graphql"
convert_to_snake_case = false # this is not making any difference
client_name = "CodexClient"
client_file_name = "client"
target_package_name = "codex"
enable_custom_operations = true

This is the graphql query with which this is happening:

query {
  token(input: {address:"0x532f27101965dd16442e59d40670faf5ebb142e4", networkId:8453}) {
    info {
      address
      name
      symbol
      description
      isScam
      totalSupply
      circulatingSupply
      imageThumbUrl
      imageSmallUrl
    }
    socialLinks {
      telegram
      twitter
      website
    }
  }
}

Activity

wiredmatt

wiredmatt commented on Jan 24, 2025

@wiredmatt
Author
wiredmatt

wiredmatt commented on Jan 24, 2025

@wiredmatt
Author

Yup that seems to be it, if you set it to convert_to_snake_case=self.convert_to_snake_case the subquery gets named correctly in the generated code.

class EnhancedTokenFields(GraphQLField):
    address: "EnhancedTokenGraphQLField" = EnhancedTokenGraphQLField("address")
    cmcId: "EnhancedTokenGraphQLField" = EnhancedTokenGraphQLField("cmcId")
    decimals: "EnhancedTokenGraphQLField" = EnhancedTokenGraphQLField("decimals")
    id: "EnhancedTokenGraphQLField" = EnhancedTokenGraphQLField("id")
    isScam: "EnhancedTokenGraphQLField" = EnhancedTokenGraphQLField("isScam")
    name: "EnhancedTokenGraphQLField" = EnhancedTokenGraphQLField("name")
    networkId: "EnhancedTokenGraphQLField" = EnhancedTokenGraphQLField("networkId")
    symbol: "EnhancedTokenGraphQLField" = EnhancedTokenGraphQLField("symbol")
    totalSupply: "EnhancedTokenGraphQLField" = EnhancedTokenGraphQLField("totalSupply")

    @classmethod
    def socialLinks(cls) -> "SocialLinksFields":
        return SocialLinksFields("socialLinks") # good here
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

      Conversion from snake_case to camelCase in subfields is not happening · Issue #343 · mirumee/ariadne-codegen