Get line numbers of YAML elements

Line numbers, the text of an item and text of surrounding lines can be grabbed from returned YAML objects - using .start_line, .end_line, lines(), lines_before(x) and lines_after(x).

Example yaml_snippet:

y: p
# Some comment
    
a: |
  x

# Another comment
b: y
c: a

d: b
from strictyaml import Map, Str, YAMLValidationError, load
from ensure import Ensure

schema = Map({"y": Str(), "a": Str(), "b": Str(), "c": Str(), "d": Str()})

snippet = load(yaml_snippet, schema)

If there is preceding comment for an item the start line includes it:

Ensure(snippet["a"].start_line).equals(2)
Ensure(snippet["d"].start_line).equals(9)

If there is a trailing comment the end line includes it:

Ensure(snippet["a"].end_line).equals(6)
Ensure(snippet["d"].end_line).equals(10)

You can grab the start line of a key:

Ensure(snippet.keys()[1].start_line).equals(2)

Start line and end line of whole snippet:

Ensure(snippet.start_line).equals(1)
Ensure(snippet.end_line).equals(10)

Grabbing a line before an item:

Ensure(snippet['a'].lines_before(1)).equals("y: p")

Grabbing a line after an item:

Ensure(snippet['a'].lines_after(4)).equals("b: y\nc: a\n\nd: b")

Grabbing the lines of an item including comments before and after:

print(load(yaml_snippet, schema)['a'].lines())
# Some comment
a: |
  x

# Another comment

Executable specification

Page automatically generated from whatline.story.