Story
skip this if you are not interested in the Why
Today I was working on a rewrite of a feature, heavily relying on a 3rd Party HTTP API response, no tests available yet, so I decided to bite the bullet and do what I felt like I had to do. Fortunately all the API connections are done in a way, so at least parts of the return values can be mocked, and no actual request has to be made, but you need to provide a valid response.
The response in this case happened to be a big map - 140+x lines of code after parsing the JSON response and running it through the Elixir Formatter. So I thought I was clever, and ran a real example, writing the response to a txt
file, and using File.write!(path, inspect(response)
, so I could copy-paste a real response into a fixture. The problem was that one part %{..., something_ids: Enum.map(raw["something"], & &1["id"]), ...
returned [123]
, which everyone intuitively knows equals to '{'
when inspected, because ?{ == [123]
.
I was running into weird bugs, because '{'
was passed down to an ecto query, which would of course find nothing with those ids, and I was banging my head against the wall, why the hell the changeset error was “invalid association” (a lot more going on behind the scenes, but you get the idea). So, I put IEx.pry
into multiple places, and saw the error in the fixture. I did not think much about it, replaced it with the value I knew it should be and… It still did not work.
Of course I put IO.inspect(something_ids)
in multiple places and always got '{'
. At that time I was already stressed out, because that was NOT the bug I was hunting, this was something in my test setup!
After some more head-banging-against-the-wall, I pasted a screen recording into our developer chat, asking what’s going on, and only 1 minute later someone said "does this explain anything? ?{ #=> [123]
, and I was very ready to bang my head even more, this time voluntarily, for being such an idiot.
Problem
I think I have a basic understanding of why a list of integers might be displayed as a string, but it gave us problems debugging multiple time now - in fact the guy who gave me the clue, was someone I had given the same clue a few months ago.
Not only debugging tends to get harder, if your outputs are displayed differently than what you would expect, but also admin UIs: I frequently use inspect
in interfaces, for example to display exq
failed jobs and the arguments, error message etc.
Question
I understand this might be a problem with internal representations, but is there any way to display a list of integers (that could, or could not) be a list of characters?
Sidenote
The universe decided to give me a headache with this, because incidentally, the original bug had the same error message.