matiso

matiso

I am building an API that needs to allow the user to download a yaml config file for an external application.
I’m not sure if I’m blind, or there is no Elixir library that converts a map (or struct) into YAML? All I can find is how to decode YAML and parse it into an Elixir data structure, but not the other way around.

Showing Posts 1 to 10

hubertlepicki

hubertlepicki

and there is a good reason for that: YAML is not a standardized format. In fact each and every implementation of YAML out there varies slightly. So when you generate YAML config file from most popular PHP library, it may or may not work as expected in most popular Ruby library etc.

I think @josevalim had a strong opinion on not using YAML in Elixir, and this sentiment has been picked up by the community, since the not any sort of standard argument is really good one. As a result we have a few parsers, since reading some legacy config files may be necessary - and no generators that I can see.

I’d probably generate some intermediate data format from my data (JSON?) and convert it to YAML with some external to Elixir tool (Ruby?).

NobbZ

NobbZ

By the book json is a subset of yaml, so if your clients yank parser adheres to the yaml standard, it will work…

matiso

matiso OP

You see, CSV happens to be implemented in the wildest ways, yet if customers / stakeholders of my project require a CSV export, they won’t be happy with an answer like yours.

I can understand that José does not want to use YAML FOR Elixir (e.g. he said you should not use it for Elixir configuration, and I totally agree with that). My use case is a different one. I’m building an API that needs to return a YAML file, because it is needed as a config for a separate application that I cannot change.

This, in my books, would qualify as an ugly workaround. Now I can’t say in the docs: “just curl https://foo/bar.yml > bar.yml” and you’re done! Now I’d need to deliver a script or tool to make the conversion and have the user possibly have the required runtime (or use Go, but then you have to publish a binary for every major desktop OS).

All this discussion about YAML being terrible is nice and entertaining, until you hit the real world. I’m not yet convinced of why not having a YAML generator in Elixir might be a good idea.

OvermindDL1

OvermindDL1

Yep, this is about the only thing that all YAML parsers should agree on, that they can take normal JSON too, after that they diverge all crazy, see:
https://github.com/cblp/yaml-sucks

Among many many others.

Really though, the YAML ‘spec’ is horrible beyond horrible, do not use it, do not look at it, ignore that utter crap.
JSON is not bad, bit wordy, but not bad.
I quite like TOML and HOSON both (for different purposes), but JSON is basically the standard.

I thought CSV was actually quite well defined, proper cell encapsulation and escapaing and all?
But he is right, one YAML file that works in one YAML importer may not work in another (see the yaml-sucks github link above, it tests those).

Just export JSON then, YAML can read JSON no problem. JSON is a subset of YAML so it not like it is some random addon to it, valid JSON is valid YAML.

Good luck with that, almost every YAML library gets it wrong so which do you want to base it on? Or do you want to write it from scratch in Elixir/Erlang itself, and if so dang good luck there, the YAML spec is utterly monstrous and you are near guaranteed to get a lot of it wrong because it has a lot of undefined behaviour…

hubertlepicki

hubertlepicki

OK. I was trying to give you the bigger picture on why you can’t find a library you need. I guess that’s not welcome. Good luck, mate! But most likely you need to write your own. Do publish it, there are other people who can benefit.

matiso

matiso OP

On the contrary! I’m very happy to get your feedback, and I always try to keep an open mind. And you are right: there is a reason YAML is considered bad for the lack of a proper specification. I’m aware of that. I was just trying to point out that, sometimes, you just need to implement a specific solution, you like it or not.

My takeaway from this discussion is that I should try using JSON as the response format and post-process it if there really is no other way around generating YAML. Thanks for the feedback!

michalmuskala

michalmuskala

Valid JSON is valid YAML. Any conforming YAML parser should be able to parse JSON. So if you don’t have any specific needs for the YAML format, doing something like:

"---\n" <> Poison.encode!(data)

will produce something any YAML parser will be able to process.

50kudos

50kudos

Sorry to continue here. @matiso what you ended up with, or now 2019 have you found a solution? I have a very strict requirement that is editing yaml and put it back (cry)

Would love to hear from you all.

yoran

yoran

@50kudos For what it’s worth, I found myself in a similar situation. I could parse YAML with yaml-elixir but didn’t have a way to write. So I wrote a short YAML writer myself.

def to_yaml(yaml_map, indentation \\ "") do
    yaml_map
    |> Map.keys
    |> Enum.map(
      fn key ->
        value = Map.fetch!(yaml_map, key)
        cond do
          is_bitstring(value) -> "#{indentation}#{key}: #{value}"
          is_number(value) -> "#{indentation}#{key}: #{value}"
          is_map(value) -> "#{indentation}#{key}:\n#{to_yaml(value, "#{indentation}  ")}"
        end
      end
    )
    |> Enum.join("\n")
end

You use it as follows:

YamlElixir.read_from_file!("file.yaml")
|> Map.put(:some_key, %{some_nested_key: 123})
|> to_yaml

It’s not perfect but it suits my purposes (reading and writing the app.yaml configuration file in Google App Engine).

Thought I’d share to help others who come here while searching, like I did!

Where Next? Top

Trending in Questions Top

water
I’m aware of 2 such projects, are there others? git: GitHub - team-alembic/realworld: A fullstack Phoenix LiveView application with back...
New
katta
I having some trouble figuring out if I have set myself too strict of standards for my production server. Currently I can handle 75% of r...
New
peck
Hi everyone. My team and I have been working on a fairly modest app based around video streaming and chat, but we’ve landed a customer t...
New
bradley
I really like the adapter patterns that ecto, nebulex, waffle, etc. use and would love find something similar for a key management servic...
New
unaware8150
Hello folks! So at work, we are seeing some situations where we have to define some “fixed” strings that are used across the codebase in...
New
Alvinkariuki
How Can I Optimise Compile Time Dependencies I have been building an elixir application for about 2 years now. Many modules and files ha...
New
leoschweizer
Hi, we run different LLM models across a cluster, with each node loading a configurable subset. Model-specific queues let nodes consume ...
New

Other Trending Topics Top

budgie
A little off-topic, but I feel like people here have a good head on their shoulders. I used to be quite good at making software. Was luc...
New
KristerV
Hey. Is there anyone here who creates agents in their apps? Not talking about using agents, but creating them. I’m finding it pretty diff...
New
mudasobwa
I fully migrated to my own harness from Anthropic/Gemini and I think it’s time to share it. Welcome DSH, the DeepSeek Harness, fully writ...
New
jimsynz
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
juhalehtonen
There has been a thread to discuss the Stack Overflow Developer Survey on this forum every year since 2018, so here’s yet another one for...
New
budgie
I love Elixir. It’s one of 2 programming languages I’ve ever fallen in love with. But I don’t use it anymore. Serverless was the promis...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews