Commit f77c6e55 authored by Miek Gieben's avatar Miek Gieben Committed by GitHub

presubmit: test README.md sections (#3644)

Automatically submitted.
parent 510f2c50
...@@ -75,7 +75,7 @@ Each plugin should have a README.md explaining what the plugin does and how it i ...@@ -75,7 +75,7 @@ Each plugin should have a README.md explaining what the plugin does and how it i
file should have the following layout: file should have the following layout:
* Title: use the plugin's name * Title: use the plugin's name
* Subsection titled: "Named" * Subsection titled: "Name"
with *PLUGIN* - one line description. with *PLUGIN* - one line description.
* Subsection titled: "Description" has a longer description. * Subsection titled: "Description" has a longer description.
* Subsection titled: "Syntax", syntax and supported directives. * Subsection titled: "Syntax", syntax and supported directives.
......
...@@ -16,6 +16,8 @@ A plugin interested in the cancellation status should call `plugin.Done()` on th ...@@ -16,6 +16,8 @@ A plugin interested in the cancellation status should call `plugin.Done()` on th
context was canceled due to a timeout the plugin should not write anything back to the client and context was canceled due to a timeout the plugin should not write anything back to the client and
return a value indicating CoreDNS should not either; a zero return value should suffice for that. return a value indicating CoreDNS should not either; a zero return value should suffice for that.
## Syntax
~~~ txt ~~~ txt
cancel [TIMEOUT] cancel [TIMEOUT]
~~~ ~~~
......
...@@ -57,7 +57,7 @@ k8s_external [ZONE...] { ...@@ -57,7 +57,7 @@ k8s_external [ZONE...] {
* **APEX** is the name (DNS label) to use for the apex records; it defaults to `dns`. * **APEX** is the name (DNS label) to use for the apex records; it defaults to `dns`.
* `ttl` allows you to set a custom **TTL** for responses. The default is 5 (seconds). * `ttl` allows you to set a custom **TTL** for responses. The default is 5 (seconds).
# Examples ## Examples
Enable names under `example.org` to be resolved to in-cluster DNS addresses. Enable names under `example.org` to be resolved to in-cluster DNS addresses.
......
...@@ -37,6 +37,8 @@ will behave as follows: ...@@ -37,6 +37,8 @@ will behave as follows:
* `continue` will continue applying the next rule in the rule list. * `continue` will continue applying the next rule in the rule list.
* `stop` will consider the current rule the last rule and will not continue. The default behaviour is `stop` * `stop` will consider the current rule the last rule and will not continue. The default behaviour is `stop`
## Examples
### Name Field Rewrites ### Name Field Rewrites
The `rewrite` plugin offers the ability to match the name in the question section of The `rewrite` plugin offers the ability to match the name in the question section of
......
...@@ -10,6 +10,8 @@ With *secondary* you can transfer (via AXFR) a zone from another server. The ret ...@@ -10,6 +10,8 @@ With *secondary* you can transfer (via AXFR) a zone from another server. The ret
*not committed* to disk (a violation of the RFC). This means restarting CoreDNS will cause it to *not committed* to disk (a violation of the RFC). This means restarting CoreDNS will cause it to
retrieve all secondary zones. retrieve all secondary zones.
## Syntax
~~~ ~~~
secondary [ZONES...] secondary [ZONES...]
~~~ ~~~
......
...@@ -29,3 +29,7 @@ transfer [ZONE...] { ...@@ -29,3 +29,7 @@ transfer [ZONE...] {
* `to ` **HOST...** The hosts *transfer* will transfer to. Use `*` to permit * `to ` **HOST...** The hosts *transfer* will transfer to. Use `*` to permit
transfers to all hosts. transfers to all hosts.
## Examples
TODO
...@@ -2,10 +2,12 @@ package test ...@@ -2,10 +2,12 @@ package test
import ( import (
"bufio" "bufio"
"fmt"
"io/ioutil" "io/ioutil"
"os" "os"
"path/filepath" "path/filepath"
"strconv" "strconv"
"strings"
"testing" "testing"
"github.com/coredns/coredns/core/dnsserver" "github.com/coredns/coredns/core/dnsserver"
...@@ -39,6 +41,9 @@ PrivateKey: f03VplaIEA+KHI9uizlemUSbUJH86hPBPjmcUninPoM= ...@@ -39,6 +41,9 @@ PrivateKey: f03VplaIEA+KHI9uizlemUSbUJH86hPBPjmcUninPoM=
// # check-this-please // # check-this-please
// } // }
// ~~~ // ~~~
//
// While we're at it - we also check the README.md itself. It should at least have the sections:
// Name, Description, Syntax and Examples. See plugin.md for more details.
func TestReadme(t *testing.T) { func TestReadme(t *testing.T) {
port := 30053 port := 30053
caddy.Quiet = true caddy.Quiet = true
...@@ -59,6 +64,10 @@ func TestReadme(t *testing.T) { ...@@ -59,6 +64,10 @@ func TestReadme(t *testing.T) {
readme := filepath.Join(middle, d.Name()) readme := filepath.Join(middle, d.Name())
readme = filepath.Join(readme, "README.md") readme = filepath.Join(readme, "README.md")
if err := sectionsFromReadme(readme); err != nil {
t.Fatal(err)
}
inputs, err := corefileFromReadme(readme) inputs, err := corefileFromReadme(readme)
if err != nil { if err != nil {
continue continue
...@@ -118,6 +127,47 @@ func corefileFromReadme(readme string) ([]*Input, error) { ...@@ -118,6 +127,47 @@ func corefileFromReadme(readme string) ([]*Input, error) {
return input, nil return input, nil
} }
// sectionsFromReadme returns an error if the readme doesn't contains all
// mandatory sections. The check is basic, as we match each line, this mostly
// works, because markdown is such a simple format.
// We want: Name, Description, Syntax, Examples - in this order.
func sectionsFromReadme(readme string) error {
f, err := os.Open(readme)
if err != nil {
return nil // don't error when we can read the file
}
defer f.Close()
section := 0
s := bufio.NewScanner(f)
for s.Scan() {
line := s.Text()
switch section {
case 0:
if strings.HasPrefix(line, "## Name") {
section++
}
case 1:
if strings.HasPrefix(line, "## Description") {
section++
}
case 2:
if strings.HasPrefix(line, "## Syntax") {
section++
}
case 3:
if strings.HasPrefix(line, "## Examples") {
section++
}
}
}
if section != 4 {
return fmt.Errorf("Sections incomplete or ordered wrong: %q, want (at least): Name, Descripion, Syntax and Examples", readme)
}
return nil
}
func create(c map[string]string) { func create(c map[string]string) {
for name, content := range c { for name, content := range c {
ioutil.WriteFile(name, []byte(content), 0644) ioutil.WriteFile(name, []byte(content), 0644)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment