Hacker Newsnew | past | comments | ask | show | jobs | submit | firearm-halter's commentslogin

yep

    python-version:
        - 3.8
        - 3.9
        - 3.10
can be written:

    python-version:
        [3.8, 3.9, 3.10]

same is true for dictionaries.


The issue with YAML is that it does not unambiguously distinguish between number/booleans and strings. JSON does, but only for numbers, booleans, and nulls. But there are many data types that need to be conveyed. For example, dates and quantities (numbers with units, such as $3.14 or 47kΩ). Such things are left to the application to interpret. Even JSON does not unambiguously distinguish between integers and reals. Even so, JSON pays for its lack of ambiguity by requiring all strings to be quoted, which adds clutter and the requirement for quoting and escaping. Thus, supporting those extra types comes at a cost.

I think NestedText is unique in leaving all leaf values as strings, so it does not need quoting or escaping.

Everything involves a compromise. YAML provides a lack of clutter at the cost of ambiguity. JSON is unambiguous, but comes with visual clutter. In both cases there are still lots of types they cannot handle and so must be passed on to the application.

The compromise with NestedText is that it provides simplicity and a lack of clutter by not supporting any data types for leaf values other than string. Thus, all interpretation of the text is deferred to the application. But fundamentally that is the best place for it, because only the application understands the context and knows what is expected.


I think the important difference between NestedText and YAML is that NestedText does not try to convert the text to numbers or booleans. YAML converts on to True and 3.10 to 3.1, which in this case is undesired. NestedText keeps text as strings. The idea is that end application should be the one that determines if on is a string or a boolean and whether 3.10 is a string or a number.

Its all in the name. All leaf values are strings. It is literally nested text.


The person that creates the config file does not necessarily choose the config file format. In the example, github chose YAML and everyone using github actions must use it. YAML is error prone, as everyone that tests with Python is finding out as the add Python 3.10 to their regression tests. This is a plea to organizations like github to stop choosing YAML.


As not a Python programmer, I'm struggling to understand the issue.

Your (or blogger's) claim is that GitHub misparses the YAML actions config when it comes specifically to Python? Or that YAML is inherently inadequate to the task of representing Python's necessary actions?


The Python 3.10 issue is this, in yaml:

  Python_versions:
  - 3.8
  - 3.9
Then we add the new version in our yaml file:

  Python_versions:
  - 3.8
  - 3.9
  - 3.10
But now we discover that 3.10 is parsed as a float, just like the other ones were. But the problem is that 3.10 becomes 3.1, the equivalent float value! With 3.9 we didn't notice this problem.

I'm not sure what the name for this problem is.

It's something like.. an unfaithful but unintentionally working representation. Until it doesn't work anymore. The solution in YAML is to quote the values so that they become strings as intended.


How is that different from other formats? Take JSON:

    {"python_versions": [3.8, 3.9, 3.10]}
This is a problem in any config language that doesn't enforce types, and jf it does enforce types, you should've used quotes already (like you really should've been before 3.10 was added to the list).

Similar problems also exist in many config formats with scientific notation (2e345) or hexadecimal notation (0x12345) or octal notation (012345, no that's not a decimal number in many programming languages and config formats!).

What commonly supported alternative would you suggest for this use case?


The difference from JSON is that in JSON, you always have to write "" to get strings.

In YAML you can just write blah and and it becomes a string. Except when it doesn't, when it matches some other type of value.


Sure, if you ignore what the YAML documentation actually says.


> I'm not sure what the name for this problem is.

Not reading the manual? Same thing would happen in JSON.

Sure it's annoying but all the YAML docs I've ever read state that unquoted numbers are ints/floats.


YAML is a superset of JSON.

Which means anything that accepts YAML accepts JSON.

So you can write your Github action code in JSON (with a yml file extension).


> YAML is a superset of JSON.

That's false. http://p3rl.org/JSON::XS#JSON-and-YAML


Interesting. Thanks for bringing that to my attention.

It sounds like the differences are unlikely to be encountered in conventional config files, especially those written by hand.

From that link I understand the source of problems to be:

Object keys longer than 1024 "stream characters". But these wouldn't be valid in any other yaml syntax either.

Some Unicode characters in strings (characters outside of BMP).

An escape sequence that is technically valid in JSON but never required.


Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: