diff --git a/.gitignore b/.gitignore index 0023a53..3d9d43e 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ DerivedData/ .swiftpm/configuration/registries.json .swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata .netrc +.nvim/* diff --git a/.nvim/xcodebuild/coverage.json b/.nvim/xcodebuild/coverage.json deleted file mode 100644 index d4e0a10..0000000 --- a/.nvim/xcodebuild/coverage.json +++ /dev/null @@ -1 +0,0 @@ -{"coveredLines":622,"executableLines":928,"lineCoverage":0.67025862068965514,"targets":[{"buildProductPath":"\/Users\/michael\/Library\/Developer\/Xcode\/DerivedData\/swift-cli-doc-dgihrbuebwxquzdknevkczbenunz\/Build\/Products\/Debug\/PackageFrameworks\/CliDoc_17A221B71A2434_PackageProduct.framework\/CliDoc_17A221B71A2434_PackageProduct","coveredLines":253,"executableLines":406,"files":[{"coveredLines":6,"executableLines":9,"functions":[{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":6,"name":"Label.init(_:)"},{"coveredLines":3,"executableLines":3,"executionCount":4,"lineCoverage":1,"lineNumber":11,"name":"Label.init(_:)"},{"coveredLines":3,"executableLines":3,"executionCount":4,"lineCoverage":1,"lineNumber":16,"name":"Label.body.getter"}],"lineCoverage":0.66666666666666663,"name":"Label.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Nodes\/Label.swift"},{"coveredLines":6,"executableLines":32,"functions":[{"coveredLines":3,"executableLines":3,"executionCount":27,"lineCoverage":1,"lineNumber":15,"name":"TextNode.render()"},{"coveredLines":3,"executableLines":3,"executionCount":65,"lineCoverage":1,"lineNumber":21,"name":"String.render()"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":27,"name":"String.body.getter"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":35,"name":"AnyTextNode.init(_:)"},{"coveredLines":0,"executableLines":1,"executionCount":0,"lineCoverage":0,"lineNumber":36,"name":"implicit closure #1 in AnyTextNode.init(_:)"},{"coveredLines":0,"executableLines":1,"executionCount":0,"lineCoverage":0,"lineNumber":39,"name":"AnyTextNode.body.getter"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":43,"name":"TextNode.eraseToAnyTextNode()"},{"coveredLines":0,"executableLines":4,"executionCount":0,"lineCoverage":0,"lineNumber":49,"name":"Optional.body.getter"},{"coveredLines":0,"executableLines":4,"executionCount":0,"lineCoverage":0,"lineNumber":57,"name":"Optional.render()"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":64,"name":"Array.body.getter"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":70,"name":"Array.render()"},{"coveredLines":0,"executableLines":1,"executionCount":0,"lineCoverage":0,"lineNumber":71,"name":"closure #1 in Array.render()"}],"lineCoverage":0.1875,"name":"TextNode.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/TextNode.swift"},{"coveredLines":14,"executableLines":17,"functions":[{"coveredLines":3,"executableLines":3,"executionCount":5,"lineCoverage":1,"lineNumber":5,"name":"TextNode.textStyle(_:)"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":10,"name":"TextNode.textStyle(_:)"},{"coveredLines":3,"executableLines":3,"executionCount":5,"lineCoverage":1,"lineNumber":22,"name":"StyleModifier.init(styles:)"},{"coveredLines":5,"executableLines":5,"executionCount":5,"lineCoverage":1,"lineNumber":27,"name":"StyleModifier.render(content:)"},{"coveredLines":3,"executableLines":3,"executionCount":5,"lineCoverage":1,"lineNumber":28,"name":"closure #1 in StyleModifier.render(content:)"}],"lineCoverage":0.82352941176470584,"name":"TextStyleModifier.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Modifiers\/TextStyleModifier.swift"},{"coveredLines":14,"executableLines":14,"functions":[{"coveredLines":3,"executableLines":3,"executionCount":4,"lineCoverage":1,"lineNumber":9,"name":"ShellCommand.style(_:)"},{"coveredLines":1,"executableLines":1,"executionCount":4,"lineCoverage":1,"lineNumber":17,"name":"static ShellCommandStyle<>.default.getter"},{"coveredLines":6,"executableLines":6,"executionCount":4,"lineCoverage":1,"lineNumber":22,"name":"DefaultShellCommandStyle.render(content:)"},{"coveredLines":4,"executableLines":4,"executionCount":4,"lineCoverage":1,"lineNumber":23,"name":"closure #1 in DefaultShellCommandStyle.render(content:)"}],"lineCoverage":1,"name":"ShellCommandStyle.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Modifiers\/ShellCommandStyle.swift"},{"coveredLines":0,"executableLines":19,"functions":[{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":4,"name":"TextNode.labelStyle(color:styles:)"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":8,"name":"TextNode.labelStyle(color:styles:)"},{"coveredLines":0,"executableLines":4,"executionCount":0,"lineCoverage":0,"lineNumber":21,"name":"LabelStyle.init(color:styles:)"},{"coveredLines":0,"executableLines":8,"executionCount":0,"lineCoverage":0,"lineNumber":27,"name":"LabelStyle.render(content:)"},{"coveredLines":0,"executableLines":1,"executionCount":0,"lineCoverage":0,"lineNumber":33,"name":"closure #1 in LabelStyle.render(content:)"}],"lineCoverage":0,"name":"LabelStyleModifier.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Modifiers\/LabelStyleModifier.swift"},{"coveredLines":7,"executableLines":11,"functions":[{"coveredLines":4,"executableLines":4,"executionCount":4,"lineCoverage":1,"lineNumber":13,"name":"ShellCommand.init(symbol:content:)"},{"coveredLines":3,"executableLines":3,"executionCount":2,"lineCoverage":1,"lineNumber":19,"name":"ShellCommand.body.getter"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":29,"name":"ShellCommand<>.init(_:symbol:)"},{"coveredLines":0,"executableLines":1,"executionCount":0,"lineCoverage":0,"lineNumber":30,"name":"closure #1 in ShellCommand<>.init(_:symbol:)"}],"lineCoverage":0.63636363636363635,"name":"ShellCommand.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Nodes\/ShellCommand.swift"},{"coveredLines":8,"executableLines":8,"functions":[{"coveredLines":4,"executableLines":4,"executionCount":8,"lineCoverage":1,"lineNumber":13,"name":"HStack.init(spacing:content:)"},{"coveredLines":3,"executableLines":3,"executionCount":8,"lineCoverage":1,"lineNumber":19,"name":"HStack.body.getter"},{"coveredLines":1,"executableLines":1,"executionCount":16,"lineCoverage":1,"lineNumber":20,"name":"closure #1 in HStack.body.getter"}],"lineCoverage":1,"name":"HStack.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Nodes\/HStack.swift"},{"coveredLines":25,"executableLines":47,"functions":[{"coveredLines":3,"executableLines":3,"executionCount":42,"lineCoverage":1,"lineNumber":5,"name":"static TextBuilder.buildPartialBlock(first:)"},{"coveredLines":3,"executableLines":3,"executionCount":16,"lineCoverage":1,"lineNumber":10,"name":"static TextBuilder.buildPartialBlock(accumulated:next:)"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":15,"name":"static TextBuilder.buildArray(_:)"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":20,"name":"static TextBuilder.buildBlock(_:)"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":25,"name":"static TextBuilder.buildEither(first:)"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":30,"name":"static TextBuilder.buildEither(second:)"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":35,"name":"static TextBuilder.buildOptional(_:)"},{"coveredLines":0,"executableLines":6,"executionCount":0,"lineCoverage":0,"lineNumber":45,"name":"EitherNode.body.getter"},{"coveredLines":9,"executableLines":9,"executionCount":16,"lineCoverage":1,"lineNumber":59,"name":"NodeContainer.init(nodes:)"},{"coveredLines":6,"executableLines":7,"executionCount":32,"lineCoverage":0.8571428571428571,"lineNumber":60,"name":"closure #1 in NodeContainer.init(nodes:)"},{"coveredLines":3,"executableLines":3,"executionCount":1,"lineCoverage":1,"lineNumber":70,"name":"NodeContainer.body.getter"},{"coveredLines":1,"executableLines":1,"executionCount":2,"lineCoverage":1,"lineNumber":71,"name":"closure #1 in NodeContainer.body.getter"}],"lineCoverage":0.53191489361702127,"name":"Builder.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Builder.swift"},{"coveredLines":0,"executableLines":16,"functions":[{"coveredLines":0,"executableLines":5,"executionCount":0,"lineCoverage":0,"lineNumber":17,"name":"Section.init(header:content:footer:)"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":23,"name":"Section.body.getter"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":33,"name":"Section<>.init(header:content:)"},{"coveredLines":0,"executableLines":1,"executionCount":0,"lineCoverage":0,"lineNumber":34,"name":"closure #1 in Section<>.init(header:content:)"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":43,"name":"Section<>.init(content:footer:)"},{"coveredLines":0,"executableLines":1,"executionCount":0,"lineCoverage":0,"lineNumber":44,"name":"closure #1 in Section<>.init(content:footer:)"}],"lineCoverage":0,"name":"Section.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Nodes\/Section.swift"},{"coveredLines":11,"executableLines":27,"functions":[{"coveredLines":0,"executableLines":4,"executionCount":0,"lineCoverage":0,"lineNumber":14,"name":"Note.init(_:content:)"},{"coveredLines":3,"executableLines":3,"executionCount":1,"lineCoverage":1,"lineNumber":20,"name":"Note.body.getter"},{"coveredLines":4,"executableLines":4,"executionCount":1,"lineCoverage":1,"lineNumber":31,"name":"Note<>.init(_:content:)"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":39,"name":"static Note<>.important(_:content:)"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":46,"name":"static Note<>.seeAlso(_:content:)"},{"coveredLines":3,"executableLines":3,"executionCount":1,"lineCoverage":1,"lineNumber":57,"name":"Note<>.init(_:content:)"},{"coveredLines":1,"executableLines":1,"executionCount":1,"lineCoverage":1,"lineNumber":58,"name":"closure #1 in Note<>.init(_:content:)"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":64,"name":"static Note<>.important(_:content:)"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":71,"name":"static Note<>.seeAlso(_:content:)"}],"lineCoverage":0.40740740740740738,"name":"Note.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Nodes\/Note.swift"},{"coveredLines":16,"executableLines":16,"functions":[{"coveredLines":3,"executableLines":3,"executionCount":1,"lineCoverage":1,"lineNumber":9,"name":"Note.noteStyle(_:)"},{"coveredLines":3,"executableLines":3,"executionCount":1,"lineCoverage":1,"lineNumber":17,"name":"static NoteStyleModifier<>.default.getter"},{"coveredLines":6,"executableLines":6,"executionCount":1,"lineCoverage":1,"lineNumber":24,"name":"DefaultNoteStyle.render(content:)"},{"coveredLines":4,"executableLines":4,"executionCount":1,"lineCoverage":1,"lineNumber":25,"name":"closure #1 in DefaultNoteStyle.render(content:)"}],"lineCoverage":1,"name":"NoteStyleModifier.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Modifiers\/NoteStyleModifier.swift"},{"coveredLines":13,"executableLines":23,"functions":[{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":17,"name":"NodeModifier.concat(_:)"},{"coveredLines":0,"executableLines":4,"executionCount":0,"lineCoverage":0,"lineNumber":26,"name":"ConcatModifier.render(content:)"},{"coveredLines":4,"executableLines":4,"executionCount":6,"lineCoverage":1,"lineNumber":40,"name":"ModifiedNode.init(content:modifier:)"},{"coveredLines":3,"executableLines":3,"executionCount":6,"lineCoverage":1,"lineNumber":47,"name":"ModifiedNode<>.body.getter"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":52,"name":"ModifiedNode<>.apply(_:)"},{"coveredLines":3,"executableLines":3,"executionCount":6,"lineCoverage":1,"lineNumber":58,"name":"ModifiedNode<>.render()"},{"coveredLines":3,"executableLines":3,"executionCount":6,"lineCoverage":1,"lineNumber":65,"name":"TextNode.modifier(_:)"}],"lineCoverage":0.56521739130434778,"name":"NodeModifier.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/NodeModifier.swift"},{"coveredLines":8,"executableLines":8,"functions":[{"coveredLines":4,"executableLines":4,"executionCount":9,"lineCoverage":1,"lineNumber":13,"name":"VStack.init(spacing:content:)"},{"coveredLines":3,"executableLines":3,"executionCount":9,"lineCoverage":1,"lineNumber":19,"name":"VStack.body.getter"},{"coveredLines":1,"executableLines":1,"executionCount":18,"lineCoverage":1,"lineNumber":20,"name":"closure #1 in VStack.body.getter"}],"lineCoverage":1,"name":"VStack.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Nodes\/VStack.swift"},{"coveredLines":17,"executableLines":20,"functions":[{"coveredLines":7,"executableLines":9,"executionCount":17,"lineCoverage":0.77777777777777779,"lineNumber":2,"name":"array(from:)"},{"coveredLines":9,"executableLines":9,"executionCount":17,"lineCoverage":1,"lineNumber":13,"name":"seperator(_:count:)"},{"coveredLines":1,"executableLines":1,"executionCount":17,"lineCoverage":1,"lineNumber":14,"name":"implicit closure #1 in seperator(_:count:)"},{"coveredLines":0,"executableLines":1,"executionCount":0,"lineCoverage":0,"lineNumber":14,"name":"implicit closure #2 in seperator(_:count:)"}],"lineCoverage":0.84999999999999998,"name":"Utils.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Utils.swift"},{"coveredLines":80,"executableLines":83,"functions":[{"coveredLines":7,"executableLines":7,"executionCount":1,"lineCoverage":1,"lineNumber":5,"name":"ExampleSection.style(_:)"},{"coveredLines":7,"executableLines":7,"executionCount":1,"lineCoverage":1,"lineNumber":13,"name":"ExampleSection.exampleStyle(_:)"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":23,"name":"Array.exampleStyle(_:)"},{"coveredLines":5,"executableLines":5,"executionCount":2,"lineCoverage":1,"lineNumber":39,"name":"ExampleSectionConfiguration.init(header:label:examples:)"},{"coveredLines":3,"executableLines":3,"executionCount":2,"lineCoverage":1,"lineNumber":51,"name":"ExampleConfiguration.init(examples:)"},{"coveredLines":3,"executableLines":3,"executionCount":1,"lineCoverage":1,"lineNumber":60,"name":"static ExampleSectionStyle<>.default(exampleStyle:)"},{"coveredLines":3,"executableLines":3,"executionCount":1,"lineCoverage":1,"lineNumber":66,"name":"static ExampleStyle<>.default.getter"},{"coveredLines":3,"executableLines":3,"executionCount":2,"lineCoverage":1,"lineNumber":77,"name":"DefaultExamplesStyle.init(exampleStyle:)"},{"coveredLines":9,"executableLines":9,"executionCount":2,"lineCoverage":1,"lineNumber":82,"name":"DefaultExamplesStyle.render(content:)"},{"coveredLines":7,"executableLines":7,"executionCount":2,"lineCoverage":1,"lineNumber":83,"name":"closure #1 in DefaultExamplesStyle.render(content:)"},{"coveredLines":4,"executableLines":4,"executionCount":2,"lineCoverage":1,"lineNumber":84,"name":"closure #1 in closure #1 in DefaultExamplesStyle.render(content:)"},{"coveredLines":10,"executableLines":10,"executionCount":1,"lineCoverage":1,"lineNumber":95,"name":"DefaultExampleStyle.render(content:)"},{"coveredLines":8,"executableLines":8,"executionCount":1,"lineCoverage":1,"lineNumber":96,"name":"closure #1 in DefaultExampleStyle.render(content:)"},{"coveredLines":6,"executableLines":6,"executionCount":2,"lineCoverage":1,"lineNumber":97,"name":"closure #1 in closure #1 in DefaultExampleStyle.render(content:)"},{"coveredLines":4,"executableLines":4,"executionCount":2,"lineCoverage":1,"lineNumber":98,"name":"closure #1 in closure #1 in closure #1 in DefaultExampleStyle.render(content:)"},{"coveredLines":1,"executableLines":1,"executionCount":2,"lineCoverage":1,"lineNumber":100,"name":"closure #1 in closure #1 in closure #1 in closure #1 in DefaultExampleStyle.render(content:)"}],"lineCoverage":0.96385542168674698,"name":"ExamplesStyle.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Modifiers\/ExamplesStyle.swift"},{"coveredLines":13,"executableLines":16,"functions":[{"coveredLines":5,"executableLines":5,"executionCount":2,"lineCoverage":1,"lineNumber":20,"name":"ExampleSection.init(examples:header:label:)"},{"coveredLines":3,"executableLines":3,"executionCount":1,"lineCoverage":1,"lineNumber":27,"name":"ExampleSection.body.getter"},{"coveredLines":3,"executableLines":3,"executionCount":2,"lineCoverage":1,"lineNumber":38,"name":"ExampleSection<>.init(header:label:examples:)"},{"coveredLines":1,"executableLines":1,"executionCount":2,"lineCoverage":1,"lineNumber":39,"name":"closure #1 in ExampleSection<>.init(header:label:examples:)"},{"coveredLines":1,"executableLines":1,"executionCount":2,"lineCoverage":1,"lineNumber":39,"name":"closure #2 in ExampleSection<>.init(header:label:examples:)"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":47,"name":"ExampleSection<>.init(header:label:examples:)"}],"lineCoverage":0.8125,"name":"ExampleSection.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Nodes\/ExampleSection.swift"},{"coveredLines":6,"executableLines":6,"functions":[{"coveredLines":3,"executableLines":3,"executionCount":1,"lineCoverage":1,"lineNumber":8,"name":"Group.init(content:)"},{"coveredLines":3,"executableLines":3,"executionCount":1,"lineCoverage":1,"lineNumber":13,"name":"Group.body.getter"}],"lineCoverage":1,"name":"Group.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Nodes\/Group.swift"},{"coveredLines":0,"executableLines":4,"functions":[{"coveredLines":0,"executableLines":1,"executionCount":0,"lineCoverage":0,"lineNumber":5,"name":"Empty.init()"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":8,"name":"Empty.body.getter"}],"lineCoverage":0,"name":"Empty.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Nodes\/Empty.swift"},{"coveredLines":9,"executableLines":9,"functions":[{"coveredLines":3,"executableLines":3,"executionCount":1,"lineCoverage":1,"lineNumber":5,"name":"TextNode.color(_:)"},{"coveredLines":3,"executableLines":3,"executionCount":1,"lineCoverage":1,"lineNumber":16,"name":"ColorModifier.init(color:)"},{"coveredLines":3,"executableLines":3,"executionCount":1,"lineCoverage":1,"lineNumber":21,"name":"ColorModifier.render(content:)"}],"lineCoverage":1,"name":"ColorModifier.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Modifiers\/ColorModifier.swift"},{"coveredLines":0,"executableLines":21,"functions":[{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":4,"name":"Section.style(_:)"},{"coveredLines":0,"executableLines":5,"executionCount":0,"lineCoverage":0,"lineNumber":15,"name":"SectionConfiguration.init(header:content:footer:)"},{"coveredLines":0,"executableLines":1,"executionCount":0,"lineCoverage":0,"lineNumber":25,"name":"static SectionStyle<>.default.getter"},{"coveredLines":0,"executableLines":7,"executionCount":0,"lineCoverage":0,"lineNumber":30,"name":"DefaultSectionStyle.render(content:)"},{"coveredLines":0,"executableLines":5,"executionCount":0,"lineCoverage":0,"lineNumber":31,"name":"closure #1 in DefaultSectionStyle.render(content:)"}],"lineCoverage":0,"name":"SectionStyle.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Modifiers\/SectionStyle.swift"}],"lineCoverage":0.62315270935960587,"name":"CliDoc"},{"buildProductPath":"\/Users\/michael\/Library\/Developer\/Xcode\/DerivedData\/swift-cli-doc-dgihrbuebwxquzdknevkczbenunz\/Build\/Products\/Debug\/CliDocTests.xctest\/Contents\/MacOS\/CliDocTests","coveredLines":369,"executableLines":522,"files":[{"coveredLines":6,"executableLines":9,"functions":[{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":6,"name":"Label.init(_:)"},{"coveredLines":3,"executableLines":3,"executionCount":4,"lineCoverage":1,"lineNumber":11,"name":"Label.init(_:)"},{"coveredLines":3,"executableLines":3,"executionCount":4,"lineCoverage":1,"lineNumber":16,"name":"Label.body.getter"}],"lineCoverage":0.66666666666666663,"name":"Label.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Nodes\/Label.swift"},{"coveredLines":6,"executableLines":32,"functions":[{"coveredLines":3,"executableLines":3,"executionCount":27,"lineCoverage":1,"lineNumber":15,"name":"TextNode.render()"},{"coveredLines":3,"executableLines":3,"executionCount":65,"lineCoverage":1,"lineNumber":21,"name":"String.render()"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":27,"name":"String.body.getter"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":35,"name":"AnyTextNode.init(_:)"},{"coveredLines":0,"executableLines":1,"executionCount":0,"lineCoverage":0,"lineNumber":36,"name":"implicit closure #1 in AnyTextNode.init(_:)"},{"coveredLines":0,"executableLines":1,"executionCount":0,"lineCoverage":0,"lineNumber":39,"name":"AnyTextNode.body.getter"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":43,"name":"TextNode.eraseToAnyTextNode()"},{"coveredLines":0,"executableLines":4,"executionCount":0,"lineCoverage":0,"lineNumber":49,"name":"Optional.body.getter"},{"coveredLines":0,"executableLines":4,"executionCount":0,"lineCoverage":0,"lineNumber":57,"name":"Optional.render()"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":64,"name":"Array.body.getter"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":70,"name":"Array.render()"},{"coveredLines":0,"executableLines":1,"executionCount":0,"lineCoverage":0,"lineNumber":71,"name":"closure #1 in Array.render()"}],"lineCoverage":0.1875,"name":"TextNode.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/TextNode.swift"},{"coveredLines":14,"executableLines":17,"functions":[{"coveredLines":3,"executableLines":3,"executionCount":5,"lineCoverage":1,"lineNumber":5,"name":"TextNode.textStyle(_:)"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":10,"name":"TextNode.textStyle(_:)"},{"coveredLines":3,"executableLines":3,"executionCount":5,"lineCoverage":1,"lineNumber":22,"name":"StyleModifier.init(styles:)"},{"coveredLines":5,"executableLines":5,"executionCount":5,"lineCoverage":1,"lineNumber":27,"name":"StyleModifier.render(content:)"},{"coveredLines":3,"executableLines":3,"executionCount":5,"lineCoverage":1,"lineNumber":28,"name":"closure #1 in StyleModifier.render(content:)"}],"lineCoverage":0.82352941176470584,"name":"TextStyleModifier.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Modifiers\/TextStyleModifier.swift"},{"coveredLines":116,"executableLines":116,"functions":[{"coveredLines":5,"executableLines":5,"executionCount":1,"lineCoverage":1,"lineNumber":6,"name":"closure #1 in variable initialization expression of setupRainbow"},{"coveredLines":8,"executableLines":8,"executionCount":1,"lineCoverage":1,"lineNumber":13,"name":"testGroup()"},{"coveredLines":4,"executableLines":4,"executionCount":1,"lineCoverage":1,"lineNumber":15,"name":"closure #1 in testGroup()"},{"coveredLines":8,"executableLines":8,"executionCount":1,"lineCoverage":1,"lineNumber":23,"name":"testHStack()"},{"coveredLines":4,"executableLines":4,"executionCount":1,"lineCoverage":1,"lineNumber":25,"name":"closure #1 in testHStack()"},{"coveredLines":11,"executableLines":11,"executionCount":1,"lineCoverage":1,"lineNumber":33,"name":"testVStack()"},{"coveredLines":4,"executableLines":4,"executionCount":1,"lineCoverage":1,"lineNumber":35,"name":"closure #1 in testVStack()"},{"coveredLines":8,"executableLines":8,"executionCount":1,"lineCoverage":1,"lineNumber":46,"name":"testNote()"},{"coveredLines":17,"executableLines":17,"executionCount":1,"lineCoverage":1,"lineNumber":56,"name":"testExamples()"},{"coveredLines":18,"executableLines":18,"executionCount":1,"lineCoverage":1,"lineNumber":75,"name":"testExamplesWithCustomExampleOnlyStyle()"},{"coveredLines":10,"executableLines":10,"executionCount":1,"lineCoverage":1,"lineNumber":95,"name":"CustomExampleOnlyStyle.render(content:)"},{"coveredLines":8,"executableLines":8,"executionCount":1,"lineCoverage":1,"lineNumber":96,"name":"closure #1 in CustomExampleOnlyStyle.render(content:)"},{"coveredLines":6,"executableLines":6,"executionCount":2,"lineCoverage":1,"lineNumber":97,"name":"closure #1 in closure #1 in CustomExampleOnlyStyle.render(content:)"},{"coveredLines":4,"executableLines":4,"executionCount":2,"lineCoverage":1,"lineNumber":98,"name":"closure #1 in closure #1 in closure #1 in CustomExampleOnlyStyle.render(content:)"},{"coveredLines":1,"executableLines":1,"executionCount":2,"lineCoverage":1,"lineNumber":100,"name":"closure #1 in closure #1 in closure #1 in closure #1 in CustomExampleOnlyStyle.render(content:)"}],"lineCoverage":1,"name":"CliDocTests.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Tests\/CliDocTests\/CliDocTests.swift"},{"coveredLines":14,"executableLines":14,"functions":[{"coveredLines":3,"executableLines":3,"executionCount":4,"lineCoverage":1,"lineNumber":9,"name":"ShellCommand.style(_:)"},{"coveredLines":1,"executableLines":1,"executionCount":4,"lineCoverage":1,"lineNumber":17,"name":"static ShellCommandStyle<>.default.getter"},{"coveredLines":6,"executableLines":6,"executionCount":4,"lineCoverage":1,"lineNumber":22,"name":"DefaultShellCommandStyle.render(content:)"},{"coveredLines":4,"executableLines":4,"executionCount":4,"lineCoverage":1,"lineNumber":23,"name":"closure #1 in DefaultShellCommandStyle.render(content:)"}],"lineCoverage":1,"name":"ShellCommandStyle.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Modifiers\/ShellCommandStyle.swift"},{"coveredLines":0,"executableLines":19,"functions":[{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":4,"name":"TextNode.labelStyle(color:styles:)"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":8,"name":"TextNode.labelStyle(color:styles:)"},{"coveredLines":0,"executableLines":4,"executionCount":0,"lineCoverage":0,"lineNumber":21,"name":"LabelStyle.init(color:styles:)"},{"coveredLines":0,"executableLines":8,"executionCount":0,"lineCoverage":0,"lineNumber":27,"name":"LabelStyle.render(content:)"},{"coveredLines":0,"executableLines":1,"executionCount":0,"lineCoverage":0,"lineNumber":33,"name":"closure #1 in LabelStyle.render(content:)"}],"lineCoverage":0,"name":"LabelStyleModifier.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Modifiers\/LabelStyleModifier.swift"},{"coveredLines":7,"executableLines":11,"functions":[{"coveredLines":4,"executableLines":4,"executionCount":4,"lineCoverage":1,"lineNumber":13,"name":"ShellCommand.init(symbol:content:)"},{"coveredLines":3,"executableLines":3,"executionCount":2,"lineCoverage":1,"lineNumber":19,"name":"ShellCommand.body.getter"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":29,"name":"ShellCommand<>.init(_:symbol:)"},{"coveredLines":0,"executableLines":1,"executionCount":0,"lineCoverage":0,"lineNumber":30,"name":"closure #1 in ShellCommand<>.init(_:symbol:)"}],"lineCoverage":0.63636363636363635,"name":"ShellCommand.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Nodes\/ShellCommand.swift"},{"coveredLines":8,"executableLines":8,"functions":[{"coveredLines":4,"executableLines":4,"executionCount":8,"lineCoverage":1,"lineNumber":13,"name":"HStack.init(spacing:content:)"},{"coveredLines":3,"executableLines":3,"executionCount":8,"lineCoverage":1,"lineNumber":19,"name":"HStack.body.getter"},{"coveredLines":1,"executableLines":1,"executionCount":16,"lineCoverage":1,"lineNumber":20,"name":"closure #1 in HStack.body.getter"}],"lineCoverage":1,"name":"HStack.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Nodes\/HStack.swift"},{"coveredLines":0,"executableLines":16,"functions":[{"coveredLines":0,"executableLines":5,"executionCount":0,"lineCoverage":0,"lineNumber":17,"name":"Section.init(header:content:footer:)"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":23,"name":"Section.body.getter"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":33,"name":"Section<>.init(header:content:)"},{"coveredLines":0,"executableLines":1,"executionCount":0,"lineCoverage":0,"lineNumber":34,"name":"closure #1 in Section<>.init(header:content:)"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":43,"name":"Section<>.init(content:footer:)"},{"coveredLines":0,"executableLines":1,"executionCount":0,"lineCoverage":0,"lineNumber":44,"name":"closure #1 in Section<>.init(content:footer:)"}],"lineCoverage":0,"name":"Section.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Nodes\/Section.swift"},{"coveredLines":25,"executableLines":47,"functions":[{"coveredLines":3,"executableLines":3,"executionCount":42,"lineCoverage":1,"lineNumber":5,"name":"static TextBuilder.buildPartialBlock(first:)"},{"coveredLines":3,"executableLines":3,"executionCount":16,"lineCoverage":1,"lineNumber":10,"name":"static TextBuilder.buildPartialBlock(accumulated:next:)"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":15,"name":"static TextBuilder.buildArray(_:)"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":20,"name":"static TextBuilder.buildBlock(_:)"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":25,"name":"static TextBuilder.buildEither(first:)"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":30,"name":"static TextBuilder.buildEither(second:)"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":35,"name":"static TextBuilder.buildOptional(_:)"},{"coveredLines":0,"executableLines":6,"executionCount":0,"lineCoverage":0,"lineNumber":45,"name":"EitherNode.body.getter"},{"coveredLines":9,"executableLines":9,"executionCount":16,"lineCoverage":1,"lineNumber":59,"name":"NodeContainer.init(nodes:)"},{"coveredLines":6,"executableLines":7,"executionCount":32,"lineCoverage":0.8571428571428571,"lineNumber":60,"name":"closure #1 in NodeContainer.init(nodes:)"},{"coveredLines":3,"executableLines":3,"executionCount":1,"lineCoverage":1,"lineNumber":70,"name":"NodeContainer.body.getter"},{"coveredLines":1,"executableLines":1,"executionCount":2,"lineCoverage":1,"lineNumber":71,"name":"closure #1 in NodeContainer.body.getter"}],"lineCoverage":0.53191489361702127,"name":"Builder.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Builder.swift"},{"coveredLines":11,"executableLines":27,"functions":[{"coveredLines":0,"executableLines":4,"executionCount":0,"lineCoverage":0,"lineNumber":14,"name":"Note.init(_:content:)"},{"coveredLines":3,"executableLines":3,"executionCount":1,"lineCoverage":1,"lineNumber":20,"name":"Note.body.getter"},{"coveredLines":4,"executableLines":4,"executionCount":1,"lineCoverage":1,"lineNumber":31,"name":"Note<>.init(_:content:)"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":39,"name":"static Note<>.important(_:content:)"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":46,"name":"static Note<>.seeAlso(_:content:)"},{"coveredLines":3,"executableLines":3,"executionCount":1,"lineCoverage":1,"lineNumber":57,"name":"Note<>.init(_:content:)"},{"coveredLines":1,"executableLines":1,"executionCount":1,"lineCoverage":1,"lineNumber":58,"name":"closure #1 in Note<>.init(_:content:)"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":64,"name":"static Note<>.important(_:content:)"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":71,"name":"static Note<>.seeAlso(_:content:)"}],"lineCoverage":0.40740740740740738,"name":"Note.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Nodes\/Note.swift"},{"coveredLines":16,"executableLines":16,"functions":[{"coveredLines":3,"executableLines":3,"executionCount":1,"lineCoverage":1,"lineNumber":9,"name":"Note.noteStyle(_:)"},{"coveredLines":3,"executableLines":3,"executionCount":1,"lineCoverage":1,"lineNumber":17,"name":"static NoteStyleModifier<>.default.getter"},{"coveredLines":6,"executableLines":6,"executionCount":1,"lineCoverage":1,"lineNumber":24,"name":"DefaultNoteStyle.render(content:)"},{"coveredLines":4,"executableLines":4,"executionCount":1,"lineCoverage":1,"lineNumber":25,"name":"closure #1 in DefaultNoteStyle.render(content:)"}],"lineCoverage":1,"name":"NoteStyleModifier.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Modifiers\/NoteStyleModifier.swift"},{"coveredLines":8,"executableLines":8,"functions":[{"coveredLines":4,"executableLines":4,"executionCount":9,"lineCoverage":1,"lineNumber":13,"name":"VStack.init(spacing:content:)"},{"coveredLines":3,"executableLines":3,"executionCount":9,"lineCoverage":1,"lineNumber":19,"name":"VStack.body.getter"},{"coveredLines":1,"executableLines":1,"executionCount":18,"lineCoverage":1,"lineNumber":20,"name":"closure #1 in VStack.body.getter"}],"lineCoverage":1,"name":"VStack.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Nodes\/VStack.swift"},{"coveredLines":13,"executableLines":23,"functions":[{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":17,"name":"NodeModifier.concat(_:)"},{"coveredLines":0,"executableLines":4,"executionCount":0,"lineCoverage":0,"lineNumber":26,"name":"ConcatModifier.render(content:)"},{"coveredLines":4,"executableLines":4,"executionCount":6,"lineCoverage":1,"lineNumber":40,"name":"ModifiedNode.init(content:modifier:)"},{"coveredLines":3,"executableLines":3,"executionCount":6,"lineCoverage":1,"lineNumber":47,"name":"ModifiedNode<>.body.getter"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":52,"name":"ModifiedNode<>.apply(_:)"},{"coveredLines":3,"executableLines":3,"executionCount":6,"lineCoverage":1,"lineNumber":58,"name":"ModifiedNode<>.render()"},{"coveredLines":3,"executableLines":3,"executionCount":6,"lineCoverage":1,"lineNumber":65,"name":"TextNode.modifier(_:)"}],"lineCoverage":0.56521739130434778,"name":"NodeModifier.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/NodeModifier.swift"},{"coveredLines":9,"executableLines":9,"functions":[{"coveredLines":3,"executableLines":3,"executionCount":1,"lineCoverage":1,"lineNumber":5,"name":"TextNode.color(_:)"},{"coveredLines":3,"executableLines":3,"executionCount":1,"lineCoverage":1,"lineNumber":16,"name":"ColorModifier.init(color:)"},{"coveredLines":3,"executableLines":3,"executionCount":1,"lineCoverage":1,"lineNumber":21,"name":"ColorModifier.render(content:)"}],"lineCoverage":1,"name":"ColorModifier.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Modifiers\/ColorModifier.swift"},{"coveredLines":13,"executableLines":16,"functions":[{"coveredLines":5,"executableLines":5,"executionCount":2,"lineCoverage":1,"lineNumber":20,"name":"ExampleSection.init(examples:header:label:)"},{"coveredLines":3,"executableLines":3,"executionCount":1,"lineCoverage":1,"lineNumber":27,"name":"ExampleSection.body.getter"},{"coveredLines":3,"executableLines":3,"executionCount":2,"lineCoverage":1,"lineNumber":38,"name":"ExampleSection<>.init(header:label:examples:)"},{"coveredLines":1,"executableLines":1,"executionCount":2,"lineCoverage":1,"lineNumber":39,"name":"closure #1 in ExampleSection<>.init(header:label:examples:)"},{"coveredLines":1,"executableLines":1,"executionCount":2,"lineCoverage":1,"lineNumber":39,"name":"closure #2 in ExampleSection<>.init(header:label:examples:)"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":47,"name":"ExampleSection<>.init(header:label:examples:)"}],"lineCoverage":0.8125,"name":"ExampleSection.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Nodes\/ExampleSection.swift"},{"coveredLines":0,"executableLines":4,"functions":[{"coveredLines":0,"executableLines":1,"executionCount":0,"lineCoverage":0,"lineNumber":5,"name":"Empty.init()"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":8,"name":"Empty.body.getter"}],"lineCoverage":0,"name":"Empty.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Nodes\/Empty.swift"},{"coveredLines":0,"executableLines":21,"functions":[{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":4,"name":"Section.style(_:)"},{"coveredLines":0,"executableLines":5,"executionCount":0,"lineCoverage":0,"lineNumber":15,"name":"SectionConfiguration.init(header:content:footer:)"},{"coveredLines":0,"executableLines":1,"executionCount":0,"lineCoverage":0,"lineNumber":25,"name":"static SectionStyle<>.default.getter"},{"coveredLines":0,"executableLines":7,"executionCount":0,"lineCoverage":0,"lineNumber":30,"name":"DefaultSectionStyle.render(content:)"},{"coveredLines":0,"executableLines":5,"executionCount":0,"lineCoverage":0,"lineNumber":31,"name":"closure #1 in DefaultSectionStyle.render(content:)"}],"lineCoverage":0,"name":"SectionStyle.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Modifiers\/SectionStyle.swift"},{"coveredLines":6,"executableLines":6,"functions":[{"coveredLines":3,"executableLines":3,"executionCount":1,"lineCoverage":1,"lineNumber":8,"name":"Group.init(content:)"},{"coveredLines":3,"executableLines":3,"executionCount":1,"lineCoverage":1,"lineNumber":13,"name":"Group.body.getter"}],"lineCoverage":1,"name":"Group.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Nodes\/Group.swift"},{"coveredLines":80,"executableLines":83,"functions":[{"coveredLines":7,"executableLines":7,"executionCount":1,"lineCoverage":1,"lineNumber":5,"name":"ExampleSection.style(_:)"},{"coveredLines":7,"executableLines":7,"executionCount":1,"lineCoverage":1,"lineNumber":13,"name":"ExampleSection.exampleStyle(_:)"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":23,"name":"Array.exampleStyle(_:)"},{"coveredLines":5,"executableLines":5,"executionCount":2,"lineCoverage":1,"lineNumber":39,"name":"ExampleSectionConfiguration.init(header:label:examples:)"},{"coveredLines":3,"executableLines":3,"executionCount":2,"lineCoverage":1,"lineNumber":51,"name":"ExampleConfiguration.init(examples:)"},{"coveredLines":3,"executableLines":3,"executionCount":1,"lineCoverage":1,"lineNumber":60,"name":"static ExampleSectionStyle<>.default(exampleStyle:)"},{"coveredLines":3,"executableLines":3,"executionCount":1,"lineCoverage":1,"lineNumber":66,"name":"static ExampleStyle<>.default.getter"},{"coveredLines":3,"executableLines":3,"executionCount":2,"lineCoverage":1,"lineNumber":77,"name":"DefaultExamplesStyle.init(exampleStyle:)"},{"coveredLines":9,"executableLines":9,"executionCount":2,"lineCoverage":1,"lineNumber":82,"name":"DefaultExamplesStyle.render(content:)"},{"coveredLines":7,"executableLines":7,"executionCount":2,"lineCoverage":1,"lineNumber":83,"name":"closure #1 in DefaultExamplesStyle.render(content:)"},{"coveredLines":4,"executableLines":4,"executionCount":2,"lineCoverage":1,"lineNumber":84,"name":"closure #1 in closure #1 in DefaultExamplesStyle.render(content:)"},{"coveredLines":10,"executableLines":10,"executionCount":1,"lineCoverage":1,"lineNumber":95,"name":"DefaultExampleStyle.render(content:)"},{"coveredLines":8,"executableLines":8,"executionCount":1,"lineCoverage":1,"lineNumber":96,"name":"closure #1 in DefaultExampleStyle.render(content:)"},{"coveredLines":6,"executableLines":6,"executionCount":2,"lineCoverage":1,"lineNumber":97,"name":"closure #1 in closure #1 in DefaultExampleStyle.render(content:)"},{"coveredLines":4,"executableLines":4,"executionCount":2,"lineCoverage":1,"lineNumber":98,"name":"closure #1 in closure #1 in closure #1 in DefaultExampleStyle.render(content:)"},{"coveredLines":1,"executableLines":1,"executionCount":2,"lineCoverage":1,"lineNumber":100,"name":"closure #1 in closure #1 in closure #1 in closure #1 in DefaultExampleStyle.render(content:)"}],"lineCoverage":0.96385542168674698,"name":"ExamplesStyle.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Modifiers\/ExamplesStyle.swift"},{"coveredLines":17,"executableLines":20,"functions":[{"coveredLines":7,"executableLines":9,"executionCount":17,"lineCoverage":0.77777777777777779,"lineNumber":2,"name":"array(from:)"},{"coveredLines":9,"executableLines":9,"executionCount":17,"lineCoverage":1,"lineNumber":13,"name":"seperator(_:count:)"},{"coveredLines":1,"executableLines":1,"executionCount":17,"lineCoverage":1,"lineNumber":14,"name":"implicit closure #1 in seperator(_:count:)"},{"coveredLines":0,"executableLines":1,"executionCount":0,"lineCoverage":0,"lineNumber":14,"name":"implicit closure #2 in seperator(_:count:)"}],"lineCoverage":0.84999999999999998,"name":"Utils.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Utils.swift"}],"lineCoverage":0.7068965517241379,"name":"CliDocTests"}]} diff --git a/.nvim/xcodebuild/devices.json b/.nvim/xcodebuild/devices.json deleted file mode 100644 index b1afe3e..0000000 --- a/.nvim/xcodebuild/devices.json +++ /dev/null @@ -1 +0,0 @@ -{"projectFile": "/Volumes/Bucket/Repos/swift-cli-doc/Package.swift", "scheme": "swift-cli-doc", "devices": [{"platform": "macOS", "name": "My Mac", "arch": "arm64e", "id": "00008103-000E79D011EA001E"}]} diff --git a/.nvim/xcodebuild/report.json b/.nvim/xcodebuild/report.json deleted file mode 100644 index b8abde3..0000000 --- a/.nvim/xcodebuild/report.json +++ /dev/null @@ -1 +0,0 @@ -{"testsCount": 6, "xcresultFilepath": "/Users/michael/Library/Developer/Xcode/DerivedData/swift-cli-doc-dgihrbuebwxquzdknevkczbenunz/Logs/Test/Test-swift-cli-doc-2024.12.04_17-02-40--0500.xcresult", "failedTestsCount": 0, "tests": {"CliDocTests:_Global": [{"target": "CliDocTests", "name": "testGroup", "testResult": "passed", "swiftTestingId": "CliDocTests/testGroup", "class": "_Global", "time": "0.00031 seconds", "success": true}, {"target": "CliDocTests", "name": "testHStack", "testResult": "passed", "swiftTestingId": "CliDocTests/testHStack", "class": "_Global", "time": "0.000081 seconds", "success": true}, {"target": "CliDocTests", "name": "testVStack", "testResult": "passed", "swiftTestingId": "CliDocTests/testVStack", "class": "_Global", "time": "0.000049 seconds", "success": true}, {"target": "CliDocTests", "name": "testNote", "testResult": "passed", "swiftTestingId": "CliDocTests/testNote", "class": "_Global", "time": "0.00027 seconds", "success": true}, {"target": "CliDocTests", "name": "testExamples", "testResult": "passed", "swiftTestingId": "CliDocTests/testExamples", "class": "_Global", "time": "0.00027 seconds", "success": true}, {"target": "CliDocTests", "name": "testExamplesWithCustomExampleOnlyStyle", "testResult": "passed", "swiftTestingId": "CliDocTests/testExamplesWithCustomExampleOnlyStyle", "class": "_Global", "time": "0.00016 seconds", "success": true}]}, "buildWarnings": [], "usesSwiftTesting": true, "testErrors": [], "buildErrors": []} diff --git a/.nvim/xcodebuild/settings.json b/.nvim/xcodebuild/settings.json deleted file mode 100644 index 724065b..0000000 --- a/.nvim/xcodebuild/settings.json +++ /dev/null @@ -1 +0,0 @@ -{"platform": "macOS", "workingDirectory": "/Volumes/Bucket/Repos/swift-cli-doc", "swiftPackage": "/Volumes/Bucket/Repos/swift-cli-doc/Package.swift", "deviceName": "My Mac", "destination": "00008103-000E79D011EA001E", "lastBuildTime": 7, "scheme": "swift-cli-doc"} diff --git a/.nvim/xcodebuild/test-explorer.json b/.nvim/xcodebuild/test-explorer.json deleted file mode 100644 index bc70a22..0000000 --- a/.nvim/xcodebuild/test-explorer.json +++ /dev/null @@ -1 +0,0 @@ -[{"status": "passed", "hidden": false, "name": "CliDocTests", "classes": [{"status": "passed", "hidden": false, "id": "CliDocTests/_Global", "name": "_Global", "tests": [{"status": "passed", "hidden": false, "name": "testExamples", "id": "CliDocTests/_Global/testExamples", "swiftTestingId": "CliDocTests/testExamples", "kind": "test"}, {"status": "passed", "hidden": false, "name": "testExamplesWithCustomExampleOnlyStyle", "id": "CliDocTests/_Global/testExamplesWithCustomExampleOnlyStyle", "swiftTestingId": "CliDocTests/testExamplesWithCustomExampleOnlyStyle", "kind": "test"}, {"status": "passed", "hidden": false, "name": "testGroup", "id": "CliDocTests/_Global/testGroup", "swiftTestingId": "CliDocTests/testGroup", "kind": "test"}, {"status": "passed", "hidden": false, "name": "testHStack", "id": "CliDocTests/_Global/testHStack", "swiftTestingId": "CliDocTests/testHStack", "kind": "test"}, {"status": "passed", "hidden": false, "name": "testNote", "id": "CliDocTests/_Global/testNote", "swiftTestingId": "CliDocTests/testNote", "kind": "test"}, {"status": "passed", "hidden": false, "name": "testVStack", "id": "CliDocTests/_Global/testVStack", "swiftTestingId": "CliDocTests/testVStack", "kind": "test"}], "swiftTestingId": "CliDocTests", "kind": "class"}], "id": "CliDocTests", "kind": "target"}] diff --git a/Sources/CliDoc/Nodes/Empty.swift b/Sources/CliDoc/BaseNodes/Empty.swift similarity index 100% rename from Sources/CliDoc/Nodes/Empty.swift rename to Sources/CliDoc/BaseNodes/Empty.swift diff --git a/Sources/CliDoc/Nodes/Group.swift b/Sources/CliDoc/BaseNodes/Group.swift similarity index 100% rename from Sources/CliDoc/Nodes/Group.swift rename to Sources/CliDoc/BaseNodes/Group.swift diff --git a/Sources/CliDoc/Nodes/HStack.swift b/Sources/CliDoc/BaseNodes/HStack.swift similarity index 84% rename from Sources/CliDoc/Nodes/HStack.swift rename to Sources/CliDoc/BaseNodes/HStack.swift index 11002d8..018cd31 100644 --- a/Sources/CliDoc/Nodes/HStack.swift +++ b/Sources/CliDoc/BaseNodes/HStack.swift @@ -17,6 +17,7 @@ public struct HStack: TextNode { @inlinable public var body: some TextNode { - content.map { $0.render() }.joined(separator: separator.render()) + content.removingEmptys() + .joined(separator: separator.render()) } } diff --git a/Sources/CliDoc/Nodes/Section.swift b/Sources/CliDoc/BaseNodes/Section.swift similarity index 100% rename from Sources/CliDoc/Nodes/Section.swift rename to Sources/CliDoc/BaseNodes/Section.swift diff --git a/Sources/CliDoc/Nodes/VStack.swift b/Sources/CliDoc/BaseNodes/VStack.swift similarity index 84% rename from Sources/CliDoc/Nodes/VStack.swift rename to Sources/CliDoc/BaseNodes/VStack.swift index f715e3b..c611ff4 100644 --- a/Sources/CliDoc/Nodes/VStack.swift +++ b/Sources/CliDoc/BaseNodes/VStack.swift @@ -17,6 +17,7 @@ public struct VStack: TextNode { @inlinable public var body: some TextNode { - content.map { $0.render() }.joined(separator: separator.render()) + content.removingEmptys() + .joined(separator: separator.render()) } } diff --git a/Sources/CliDoc/Modifiers/ExamplesStyle.swift b/Sources/CliDoc/Modifiers/ExamplesStyle.swift deleted file mode 100644 index 74b9bfb..0000000 --- a/Sources/CliDoc/Modifiers/ExamplesStyle.swift +++ /dev/null @@ -1,105 +0,0 @@ -import Rainbow - -public extension ExampleSection { - - func style(_ style: S) -> some TextNode { - style.render(content: .init( - header: header, - label: label, - examples: examples - )) - } - - func exampleStyle(_ style: S) -> some TextNode { - DefaultExamplesStyle(exampleStyle: style).render(content: .init( - header: header, - label: label, - examples: examples - )) - } -} - -extension Array where Element == ExampleSection.Example { - func exampleStyle(_ style: S) -> some TextNode { - style.render(content: .init(examples: self)) - } -} - -public struct ExampleSectionConfiguration { - @usableFromInline - let header: any TextNode - - @usableFromInline - let label: any TextNode - - @usableFromInline - let examples: [ExampleSection.Example] - - @usableFromInline - init(header: any TextNode, label: any TextNode, examples: [ExampleSection.Example]) { - self.header = header - self.label = label - self.examples = examples - } -} - -public struct ExampleConfiguration { - @usableFromInline - let examples: [ExampleSection.Example] - - @usableFromInline - init(examples: [ExampleSection.Example]) { - self.examples = examples - } -} - -public protocol ExampleSectionStyle: NodeModifier where Content == ExampleSectionConfiguration {} -public protocol ExampleStyle: NodeModifier where Content == ExampleConfiguration {} - -public extension ExampleSectionStyle where Self == DefaultExamplesStyle { - static func `default`(exampleStyle: any ExampleStyle = .default) -> Self { - DefaultExamplesStyle(exampleStyle: exampleStyle) - } -} - -public extension ExampleStyle where Self == DefaultExampleStyle { - static var `default`: Self { - DefaultExampleStyle() - } -} - -public struct DefaultExamplesStyle: ExampleSectionStyle { - - @usableFromInline - let exampleStyle: any ExampleStyle - - @inlinable - public init(exampleStyle: any ExampleStyle = .default) { - self.exampleStyle = exampleStyle - } - - @inlinable - public func render(content: ExampleSectionConfiguration) -> some TextNode { - VStack(spacing: 2) { - HStack { - content.header - content.label - } - exampleStyle.render(content: .init(examples: content.examples)) - } - } -} - -public struct DefaultExampleStyle: ExampleStyle { - - public func render(content: ExampleConfiguration) -> some TextNode { - VStack(spacing: 2) { - content.examples.map { example in - VStack { - Label(example.label.green.bold) - ShellCommand { example.example }.style(.default) - } - } - } - } -} diff --git a/Sources/CliDoc/Modifiers/SectionStyle.swift b/Sources/CliDoc/Modifiers/SectionStyle.swift index a38d39b..a314a16 100644 --- a/Sources/CliDoc/Modifiers/SectionStyle.swift +++ b/Sources/CliDoc/Modifiers/SectionStyle.swift @@ -31,7 +31,7 @@ public struct DefaultSectionStyle: SectionStyle { VStack { content.header content.content - content.footer.textStyle(.italic) + content.footer } } } diff --git a/Sources/CliDoc/Nodes/ExampleSection.swift b/Sources/CliDoc/Nodes/ExampleSection.swift index b2d4678..2f50f02 100644 --- a/Sources/CliDoc/Nodes/ExampleSection.swift +++ b/Sources/CliDoc/Nodes/ExampleSection.swift @@ -4,23 +4,32 @@ public struct ExampleSection: TextNode { public typealias Example = (label: String, example: String) @usableFromInline - let examples: [Example] - - @usableFromInline - let header: Header - - @usableFromInline - let label: Label + let configuration: ExampleSectionConfiguration @inlinable public init( examples: [Example], - @TextBuilder header: () -> Header, + @TextBuilder title: () -> Header, @TextBuilder label: () -> Label ) { - self.examples = examples - self.header = header() - self.label = label() + self.configuration = .init( + title: title(), + label: label(), + examples: examples + ) + } + + @inlinable + public init( + _ title: @autoclosure () -> Header, + label: @autoclosure () -> Label, + examples: [Example] + ) { + self.init( + examples: examples, + title: title, + label: label + ) } @inlinable @@ -29,23 +38,105 @@ public struct ExampleSection: TextNode { } } -public extension ExampleSection where Header == String, Label == String { - @inlinable - init( - header: String = "Examples:".yellow.bold, - label: String = "Some common usage examples.", - examples: [Example] - ) { - self.init(examples: examples) { header } label: { label } - } +/// The type-erased configuration of an ``ExampleSection`` +public struct ExampleSectionConfiguration { + @usableFromInline + let title: any TextNode - @inlinable - init( - header: String = "Examples:".yellow.bold, - label: String = "Some common usage examples.", - examples: Example... - ) { - self.init(header: header, label: label, examples: examples) - } + @usableFromInline + let label: any TextNode + @usableFromInline + let examples: [ExampleSection.Example] + + @usableFromInline + init(title: any TextNode, label: any TextNode, examples: [ExampleSection.Example]) { + self.title = title + self.label = label + self.examples = examples + } +} + +// MARK: - Style + +public extension ExampleSection { + + func style(_ style: S) -> some TextNode { + style.render(content: configuration) + } + + func exampleStyle(_ style: S) -> some TextNode { + DefaultExamplesStyle(exampleStyle: style).render(content: configuration) + } +} + +extension Array where Element == ExampleSection.Example { + func exampleStyle(_ style: S) -> some TextNode { + style.render(content: .init(examples: self)) + } +} + +public struct ExampleConfiguration { + @usableFromInline + let examples: [ExampleSection.Example] + + @usableFromInline + init(examples: [ExampleSection.Example]) { + self.examples = examples + } +} + +public protocol ExampleSectionStyle: NodeModifier where Content == ExampleSectionConfiguration {} +public protocol ExampleStyle: NodeModifier where Content == ExampleConfiguration {} + +public extension ExampleSectionStyle where Self == DefaultExamplesStyle { + static func `default`(exampleStyle: any ExampleStyle = .default) -> Self { + DefaultExamplesStyle(exampleStyle: exampleStyle) + } +} + +public extension ExampleStyle where Self == DefaultExampleStyle { + static var `default`: Self { + DefaultExampleStyle() + } +} + +public struct DefaultExamplesStyle: ExampleSectionStyle { + + @usableFromInline + let exampleStyle: any ExampleStyle + + @inlinable + public init(exampleStyle: any ExampleStyle = .default) { + self.exampleStyle = exampleStyle + } + + @inlinable + public func render(content: ExampleSectionConfiguration) -> some TextNode { + VStack(spacing: 2) { + HStack { + content.title + .color(.yellow) + .textStyle(.bold) + + content.label + .textStyle(.italic) + } + exampleStyle.render(content: .init(examples: content.examples)) + } + } +} + +public struct DefaultExampleStyle: ExampleStyle { + + public func render(content: ExampleConfiguration) -> some TextNode { + VStack(spacing: 2) { + content.examples.map { example in + VStack { + Label(example.label.green.bold) + ShellCommand { example.example }.style(.default) + } + } + } + } } diff --git a/Sources/CliDoc/Utils.swift b/Sources/CliDoc/Utils.swift index 2acd04b..d6fbe5d 100644 --- a/Sources/CliDoc/Utils.swift +++ b/Sources/CliDoc/Utils.swift @@ -19,3 +19,18 @@ func seperator(_ separator: String, count: Int) -> any TextNode { } return output } + +extension Array where Element == (any TextNode) { + + @usableFromInline + func removingEmptys() -> [String] { + compactMap { node in + let string = node.render() + if string == "" { + return nil + } + return string + } + } + +} diff --git a/Tests/CliDocTests/CliDocTests.swift b/Tests/CliDocTests/CliDocTests.swift index 95a66a1..71e2fe1 100644 --- a/Tests/CliDocTests/CliDocTests.swift +++ b/Tests/CliDocTests/CliDocTests.swift @@ -56,11 +56,13 @@ func testNote() { func testExamples() { #expect(setupRainbow) let examples = ExampleSection( + "Examples:", + label: "Some common usage examples.", examples: [("First", "ls -lah"), ("Second", "find . -name foo")] ) let expected = """ - \("Examples:".yellow.bold) Some common usage examples. + \("Examples:".yellow.bold)\(" ")\("Some common usage examples.".italic) \("First".green.bold) $ \("ls -lah".italic) @@ -68,19 +70,22 @@ func testExamples() { \("Second".green.bold) $ \("find . -name foo".italic) """ - #expect(examples.render() == expected) + let result = printIfNotEqual(examples.render(), expected) + #expect(result) } @Test func testExamplesWithCustomExampleOnlyStyle() { #expect(setupRainbow) let examples = ExampleSection( + "Examples:", + label: "Some common usage examples.", examples: [("First", "ls -lah"), ("Second", "find . -name foo")] ) .exampleStyle(CustomExampleOnlyStyle()) let expected = """ - \("Examples:".yellow.bold) Some common usage examples. + \("Examples:".applyingStyle(.bold).applyingColor(.yellow)) \("Some common usage examples.".italic) \("First".red) $ \("ls -lah".italic) @@ -88,7 +93,73 @@ func testExamplesWithCustomExampleOnlyStyle() { \("Second".red) $ \("find . -name foo".italic) """ - #expect(examples.render() == expected) + let result = printIfNotEqual(examples.render(), expected) + #expect(result) +} + +@Test( + arguments: SectionArg.arguments +) +func testSection(arg: SectionArg) { + #expect(setupRainbow) + printIfNotEqual(arg.section.render(), arg.expected) + #expect(arg.section.render() == arg.expected) +} + +struct SectionArg: @unchecked Sendable { + let section: any TextNode + let expected: String + + static var arguments: [Self] { + [ + .init( + section: Section { + "Header" + } content: { + "Content" + } footer: { + "Footer" + }, + expected: """ + Header + Content + Footer + """ + ), + .init( + section: Section { + "Content" + } footer: { + "Footer" + }, + expected: """ + Content + Footer + """ + ), + .init( + section: Section { + "Header" + } content: { + "Content" + }, + expected: """ + Header + Content + """ + ) + ] + } +} + +@discardableResult +func printIfNotEqual(_ lhs: String, _ rhs: String) -> Bool { + guard lhs == rhs else { + print(lhs) + print(rhs) + return false + } + return true } struct CustomExampleOnlyStyle: ExampleStyle { @@ -96,7 +167,7 @@ struct CustomExampleOnlyStyle: ExampleStyle { VStack(spacing: 2) { content.examples.map { example in VStack { - Label(example.label.red) + example.label.red ShellCommand { example.example } } }