amplify-education / python-hcl2

MIT License
255 stars 56 forks source link

HCL interpolations within dict output contain single quotes #172

Open weaversam8 opened 1 month ago

weaversam8 commented 1 month ago

HCL only supports double quotes, but some interpolations may contain single quotes.

Example hcl:

block {
  type = list(
    object({
      id = string
    })
  )
}

Expected output:

{'block': [{'type': "${list(object({\"id\": \"${string}\"}))}", '__start_line__': 1, '__end_line__': 7}]}

Actual output (note the difference in quotes):

{'block': [{'type': "${list(object({'id': '${string}'}))}", '__start_line__': 1, '__end_line__': 7}]}

I plan to fix this in a future PR, just creating this issue for tracking purposes.

weaversam8 commented 1 month ago

This is actually true for many different Python datatypes - booleans appear in this output as True and False instead of the Terraform true and false.

eravin-duo commented 1 month ago

Thank you for maintaining this project, it has been a great help for my work!

I think I'm hitting this bug or something similar. I have a Terraform file with stuff like this in it:

SOMETHING_LIST = [for v in values({ for k, v in module.something.or_other : v["x"] => v["y"]... }) : v[0]]

When I parse the file with the hcl2 library it gave me this value:

${[for v in values({ for k, v in module.something.or_other : v["x"] => v["y"]... }) : v[0]]}

I added some code to remove the ${ } stuff and all was well until today, when I noticed the parse result now looks like this:

['${[for v in values({ for k, v in module.something.or_other : v["x"] => v["y"]... }) : v[0]]}']

In other words, I'm getting not only the unwanted ${ } but also an additional [' '] around the parse result.

After digging around and finding a different environment without the problem, I realized that the broken environment had lark 1.1.9 while the working one had lark 1.2.2. So I'm back to the first case with just the ${ } stuff.

I hope this data point is useful.