summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.github/styles/Google/AMPM.yml9
-rw-r--r--.github/styles/Google/Acronyms.yml64
-rw-r--r--.github/styles/Google/Colons.yml7
-rw-r--r--.github/styles/Google/Contractions.yml28
-rw-r--r--.github/styles/Google/DateFormat.yml9
-rw-r--r--.github/styles/Google/Ellipses.yml7
-rw-r--r--.github/styles/Google/EmDash.yml8
-rw-r--r--.github/styles/Google/EnDash.yml7
-rw-r--r--.github/styles/Google/Exclamation.yml7
-rw-r--r--.github/styles/Google/FirstPerson.yml11
-rw-r--r--.github/styles/Google/Gender.yml9
-rw-r--r--.github/styles/Google/GenderBias.yml45
-rw-r--r--.github/styles/Google/HeadingPunctuation.yml8
-rw-r--r--.github/styles/Google/Headings.yml26
-rw-r--r--.github/styles/Google/Hyphens.yml8
-rw-r--r--.github/styles/Google/Latin.yml9
-rw-r--r--.github/styles/Google/LyHyphens.yml8
-rw-r--r--.github/styles/Google/OptionalPlurals.yml7
-rw-r--r--.github/styles/Google/Ordinal.yml7
-rw-r--r--.github/styles/Google/OxfordComma.yml7
-rw-r--r--.github/styles/Google/Parens.yml7
-rw-r--r--.github/styles/Google/Passive.yml184
-rw-r--r--.github/styles/Google/Periods.yml7
-rw-r--r--.github/styles/Google/Quotes.yml7
-rw-r--r--.github/styles/Google/Ranges.yml7
-rw-r--r--.github/styles/Google/Semicolons.yml8
-rw-r--r--.github/styles/Google/Slang.yml11
-rw-r--r--.github/styles/Google/Spacing.yml8
-rw-r--r--.github/styles/Google/Spelling.yml8
-rw-r--r--.github/styles/Google/Units.yml7
-rw-r--r--.github/styles/Google/Will.yml7
-rw-r--r--.github/styles/Google/WordList.yml79
-rw-r--r--.github/styles/Google/meta.json16
-rw-r--r--.github/styles/Google/vocab.txt0
-rw-r--r--.github/styles/VyOS/Terminology.yml9
-rw-r--r--.github/vyos-linter.py162
-rw-r--r--.github/workflows/main.yml32
-rw-r--r--.gitmodules4
-rw-r--r--vale.ini16
39 files changed, 870 insertions, 0 deletions
diff --git a/.github/styles/Google/AMPM.yml b/.github/styles/Google/AMPM.yml
new file mode 100644
index 00000000..fbdc6e4f
--- /dev/null
+++ b/.github/styles/Google/AMPM.yml
@@ -0,0 +1,9 @@
+extends: existence
+message: "Use 'AM' or 'PM' (preceded by a space)."
+link: 'https://developers.google.com/style/word-list'
+level: error
+nonword: true
+tokens:
+ - '\d{1,2}[AP]M'
+ - '\d{1,2} ?[ap]m'
+ - '\d{1,2} ?[aApP]\.[mM]\.'
diff --git a/.github/styles/Google/Acronyms.yml b/.github/styles/Google/Acronyms.yml
new file mode 100644
index 00000000..f41af018
--- /dev/null
+++ b/.github/styles/Google/Acronyms.yml
@@ -0,0 +1,64 @@
+extends: conditional
+message: "Spell out '%s', if it's unfamiliar to the audience."
+link: 'https://developers.google.com/style/abbreviations'
+level: suggestion
+ignorecase: false
+# Ensures that the existence of 'first' implies the existence of 'second'.
+first: '\b([A-Z]{3,5})\b'
+second: '(?:\b[A-Z][a-z]+ )+\(([A-Z]{3,5})\)'
+# ... with the exception of these:
+exceptions:
+ - API
+ - ASP
+ - CLI
+ - CPU
+ - CSS
+ - CSV
+ - DEBUG
+ - DOM
+ - DPI
+ - FAQ
+ - GCC
+ - GDB
+ - GET
+ - GPU
+ - GTK
+ - GUI
+ - HTML
+ - HTTP
+ - HTTPS
+ - IDE
+ - JAR
+ - JSON
+ - JSX
+ - LESS
+ - LLDB
+ - NET
+ - NOTE
+ - NVDA
+ - OSS
+ - PATH
+ - PDF
+ - PHP
+ - POST
+ - RAM
+ - REPL
+ - RSA
+ - SCM
+ - SCSS
+ - SDK
+ - SQL
+ - SSH
+ - SSL
+ - SVG
+ - TBD
+ - TCP
+ - TODO
+ - URI
+ - URL
+ - USB
+ - UTF
+ - XML
+ - XSS
+ - YAML
+ - ZIP
diff --git a/.github/styles/Google/Colons.yml b/.github/styles/Google/Colons.yml
new file mode 100644
index 00000000..9a4b4b4a
--- /dev/null
+++ b/.github/styles/Google/Colons.yml
@@ -0,0 +1,7 @@
+extends: existence
+message: "'%s' should be in lowercase."
+link: 'https://developers.google.com/style/colons'
+nonword: true
+level: warning
+tokens:
+ - ':\s[A-Z]'
diff --git a/.github/styles/Google/Contractions.yml b/.github/styles/Google/Contractions.yml
new file mode 100644
index 00000000..905a39f4
--- /dev/null
+++ b/.github/styles/Google/Contractions.yml
@@ -0,0 +1,28 @@
+extends: substitution
+message: "Feel free to use '%s' instead of '%s'."
+link: 'https://developers.google.com/style/contractions'
+level: suggestion
+ignorecase: true
+swap:
+ are not: aren't
+ cannot: can't
+ could not: couldn't
+ did not: didn't
+ do not: don't
+ does not: doesn't
+ has not: hasn't
+ have not: haven't
+ how is: how's
+ is not: isn't
+ it is: it's
+ should not: shouldn't
+ that is: that's
+ they are: they're
+ was not: wasn't
+ we are: we're
+ we have: we've
+ were not: weren't
+ what is: what's
+ when is: when's
+ where is: where's
+ will not: won't
diff --git a/.github/styles/Google/DateFormat.yml b/.github/styles/Google/DateFormat.yml
new file mode 100644
index 00000000..e9d227fa
--- /dev/null
+++ b/.github/styles/Google/DateFormat.yml
@@ -0,0 +1,9 @@
+extends: existence
+message: "Use 'July 31, 2016' format, not '%s'."
+link: 'https://developers.google.com/style/dates-times'
+ignorecase: true
+level: error
+nonword: true
+tokens:
+ - '\d{1,2}(?:\.|/)\d{1,2}(?:\.|/)\d{4}'
+ - '\d{1,2} (?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)|May|Jun(?:e)|Jul(?:y)|Aug(?:ust)|Sep(?:tember)?|Oct(?:ober)|Nov(?:ember)?|Dec(?:ember)?) \d{4}'
diff --git a/.github/styles/Google/Ellipses.yml b/.github/styles/Google/Ellipses.yml
new file mode 100644
index 00000000..436e6177
--- /dev/null
+++ b/.github/styles/Google/Ellipses.yml
@@ -0,0 +1,7 @@
+extends: existence
+message: "In general, don't use an ellipsis."
+link: 'https://developers.google.com/style/ellipses'
+nonword: true
+level: warning
+tokens:
+ - '\.\.\.'
diff --git a/.github/styles/Google/EmDash.yml b/.github/styles/Google/EmDash.yml
new file mode 100644
index 00000000..c6018db1
--- /dev/null
+++ b/.github/styles/Google/EmDash.yml
@@ -0,0 +1,8 @@
+extends: existence
+message: "Don't put a space before or after an em dash."
+link: 'https://developers.google.com/style/dashes'
+nonword: true
+level: error
+tokens:
+ - '\s—'
+ - '—\s'
diff --git a/.github/styles/Google/EnDash.yml b/.github/styles/Google/EnDash.yml
new file mode 100644
index 00000000..194876aa
--- /dev/null
+++ b/.github/styles/Google/EnDash.yml
@@ -0,0 +1,7 @@
+extends: existence
+message: "Use an em dash ('—') instead of '–'."
+link: 'https://developers.google.com/style/dashes'
+nonword: true
+level: error
+tokens:
+ - '–'
diff --git a/.github/styles/Google/Exclamation.yml b/.github/styles/Google/Exclamation.yml
new file mode 100644
index 00000000..c4db380b
--- /dev/null
+++ b/.github/styles/Google/Exclamation.yml
@@ -0,0 +1,7 @@
+extends: existence
+message: "Don't use exclamation points in text."
+link: 'https://developers.google.com/style/exclamation-points'
+nonword: true
+level: error
+tokens:
+ - '!'
diff --git a/.github/styles/Google/FirstPerson.yml b/.github/styles/Google/FirstPerson.yml
new file mode 100644
index 00000000..d2290611
--- /dev/null
+++ b/.github/styles/Google/FirstPerson.yml
@@ -0,0 +1,11 @@
+extends: existence
+message: "Avoid first-person pronouns such as '%s'."
+link: 'https://developers.google.com/style/pronouns#personal-pronouns'
+ignorecase: true
+level: warning
+nonword: true
+tokens:
+ - (?:^|\s)I\s
+ - \bme\b
+ - \bus\b
+ - \bours\b
diff --git a/.github/styles/Google/Gender.yml b/.github/styles/Google/Gender.yml
new file mode 100644
index 00000000..c8486181
--- /dev/null
+++ b/.github/styles/Google/Gender.yml
@@ -0,0 +1,9 @@
+extends: existence
+message: "Don't use '%s' as a gender-neutral pronoun."
+link: 'https://developers.google.com/style/pronouns#gender-neutral-pronouns'
+level: error
+ignorecase: true
+tokens:
+ - he/she
+ - s/he
+ - \(s\)he
diff --git a/.github/styles/Google/GenderBias.yml b/.github/styles/Google/GenderBias.yml
new file mode 100644
index 00000000..261cfb66
--- /dev/null
+++ b/.github/styles/Google/GenderBias.yml
@@ -0,0 +1,45 @@
+extends: substitution
+message: "Consider using '%s' instead of '%s'."
+link: 'https://developers.google.com/style/inclusive-documentation'
+ignorecase: true
+level: error
+swap:
+ (?:alumna|alumnus): graduate
+ (?:alumnae|alumni): graduates
+ air(?:m[ae]n|wom[ae]n): pilot(s)
+ anchor(?:m[ae]n|wom[ae]n): anchor(s)
+ authoress: author
+ camera(?:m[ae]n|wom[ae]n): camera operator(s)
+ chair(?:m[ae]n|wom[ae]n): chair(s)
+ congress(?:m[ae]n|wom[ae]n): member(s) of congress
+ door(?:m[ae]|wom[ae]n): concierge(s)
+ draft(?:m[ae]n|wom[ae]n): drafter(s)
+ fire(?:m[ae]n|wom[ae]n): firefighter(s)
+ fisher(?:m[ae]n|wom[ae]n): fisher(s)
+ fresh(?:m[ae]n|wom[ae]n): first-year student(s)
+ garbage(?:m[ae]n|wom[ae]n): waste collector(s)
+ lady lawyer: lawyer
+ ladylike: courteous
+ landlord: building manager
+ mail(?:m[ae]n|wom[ae]n): mail carriers
+ man and wife: husband and wife
+ man enough: strong enough
+ mankind: human kind
+ manmade: manufactured
+ manpower: personnel
+ men and girls: men and women
+ middle(?:m[ae]n|wom[ae]n): intermediary
+ news(?:m[ae]n|wom[ae]n): journalist(s)
+ ombuds(?:man|woman): ombuds
+ oneupmanship: upstaging
+ poetess: poet
+ police(?:m[ae]n|wom[ae]n): police officer(s)
+ repair(?:m[ae]n|wom[ae]n): technician(s)
+ sales(?:m[ae]n|wom[ae]n): salesperson or sales people
+ service(?:m[ae]n|wom[ae]n): soldier(s)
+ steward(?:ess)?: flight attendant
+ tribes(?:m[ae]n|wom[ae]n): tribe member(s)
+ waitress: waiter
+ woman doctor: doctor
+ woman scientist[s]?: scientist(s)
+ work(?:m[ae]n|wom[ae]n): worker(s)
diff --git a/.github/styles/Google/HeadingPunctuation.yml b/.github/styles/Google/HeadingPunctuation.yml
new file mode 100644
index 00000000..5c39abbf
--- /dev/null
+++ b/.github/styles/Google/HeadingPunctuation.yml
@@ -0,0 +1,8 @@
+extends: existence
+message: "Don't put a period at the end of a heading."
+link: 'https://developers.google.com/style/capitalization#capitalization-in-titles-and-headings'
+nonword: true
+level: warning
+scope: heading
+tokens:
+ - '[a-z0-9][.](?:\s|$)'
diff --git a/.github/styles/Google/Headings.yml b/.github/styles/Google/Headings.yml
new file mode 100644
index 00000000..5afb968d
--- /dev/null
+++ b/.github/styles/Google/Headings.yml
@@ -0,0 +1,26 @@
+extends: capitalization
+message: "'%s' should use sentence-style capitalization."
+link: 'https://developers.google.com/style/capitalization#capitalization-in-titles-and-headings'
+level: warning
+scope: heading
+match: $sentence
+exceptions:
+ - Azure
+ - CLI
+ - Code
+ - Cosmos
+ - Docker
+ - Emmet
+ - I
+ - Kubernetes
+ - Linux
+ - macOS
+ - Marketplace
+ - MongoDB
+ - REPL
+ - Studio
+ - TypeScript
+ - URLs
+ - Visual
+ - VS
+ - Windows
diff --git a/.github/styles/Google/Hyphens.yml b/.github/styles/Google/Hyphens.yml
new file mode 100644
index 00000000..f9779637
--- /dev/null
+++ b/.github/styles/Google/Hyphens.yml
@@ -0,0 +1,8 @@
+extends: existence
+message: "Don't place a space on either side of a hyphen (unless it's suspended)."
+link: 'https://developers.google.com/style/hyphens'
+level: warning
+nonword: true
+tokens:
+ - '\s-'
+ - '-\s'
diff --git a/.github/styles/Google/Latin.yml b/.github/styles/Google/Latin.yml
new file mode 100644
index 00000000..f032b349
--- /dev/null
+++ b/.github/styles/Google/Latin.yml
@@ -0,0 +1,9 @@
+extends: substitution
+message: "Use '%s' instead of '%s'."
+link: 'https://developers.google.com/style/abbreviations'
+ignorecase: true
+level: error
+nonword: true
+swap:
+ '\b(?:eg|e\.g\.)[\s,]': for example
+ '\b(?:ie|i\.e\.)[\s,]': that is
diff --git a/.github/styles/Google/LyHyphens.yml b/.github/styles/Google/LyHyphens.yml
new file mode 100644
index 00000000..d5b6a942
--- /dev/null
+++ b/.github/styles/Google/LyHyphens.yml
@@ -0,0 +1,8 @@
+extends: existence
+message: "'%s' doesn't need a hyphen."
+link: 'https://developers.google.com/style/hyphens'
+level: error
+ignorecase: false
+nonword: true
+tokens:
+ - '\s[^\s-]+ly-'
diff --git a/.github/styles/Google/OptionalPlurals.yml b/.github/styles/Google/OptionalPlurals.yml
new file mode 100644
index 00000000..7058932f
--- /dev/null
+++ b/.github/styles/Google/OptionalPlurals.yml
@@ -0,0 +1,7 @@
+extends: existence
+message: "Don't use plurals in parentheses such as in '%s'."
+link: 'https://developers.google.com/style/plurals-parentheses'
+level: error
+nonword: true
+tokens:
+ - '\b\w+\(s\)'
diff --git a/.github/styles/Google/Ordinal.yml b/.github/styles/Google/Ordinal.yml
new file mode 100644
index 00000000..8c429e0f
--- /dev/null
+++ b/.github/styles/Google/Ordinal.yml
@@ -0,0 +1,7 @@
+extends: existence
+message: "Spell out all ordinal numbers ('%s') in text."
+link: 'https://developers.google.com/style/numbers'
+level: error
+nonword: true
+tokens:
+ - \d+(?:st|th|rd)
diff --git a/.github/styles/Google/OxfordComma.yml b/.github/styles/Google/OxfordComma.yml
new file mode 100644
index 00000000..98b07113
--- /dev/null
+++ b/.github/styles/Google/OxfordComma.yml
@@ -0,0 +1,7 @@
+extends: existence
+message: "Use the Oxford comma in '%s'."
+link: 'https://developers.google.com/style/commas'
+scope: sentence
+level: warning
+tokens:
+ - '(?:[^,]+,){1,}\s\w+\sand'
diff --git a/.github/styles/Google/Parens.yml b/.github/styles/Google/Parens.yml
new file mode 100644
index 00000000..3b8711d0
--- /dev/null
+++ b/.github/styles/Google/Parens.yml
@@ -0,0 +1,7 @@
+extends: existence
+message: "Use parentheses judiciously."
+link: 'https://developers.google.com/style/parentheses'
+nonword: true
+level: suggestion
+tokens:
+ - '\(.+\)'
diff --git a/.github/styles/Google/Passive.yml b/.github/styles/Google/Passive.yml
new file mode 100644
index 00000000..3265890e
--- /dev/null
+++ b/.github/styles/Google/Passive.yml
@@ -0,0 +1,184 @@
+extends: existence
+link: 'https://developers.google.com/style/voice'
+message: "In general, use active voice instead of passive voice ('%s')."
+ignorecase: true
+level: suggestion
+raw:
+ - \b(am|are|were|being|is|been|was|be)\b\s*
+tokens:
+ - '[\w]+ed'
+ - awoken
+ - beat
+ - become
+ - been
+ - begun
+ - bent
+ - beset
+ - bet
+ - bid
+ - bidden
+ - bitten
+ - bled
+ - blown
+ - born
+ - bought
+ - bound
+ - bred
+ - broadcast
+ - broken
+ - brought
+ - built
+ - burnt
+ - burst
+ - cast
+ - caught
+ - chosen
+ - clung
+ - come
+ - cost
+ - crept
+ - cut
+ - dealt
+ - dived
+ - done
+ - drawn
+ - dreamt
+ - driven
+ - drunk
+ - dug
+ - eaten
+ - fallen
+ - fed
+ - felt
+ - fit
+ - fled
+ - flown
+ - flung
+ - forbidden
+ - foregone
+ - forgiven
+ - forgotten
+ - forsaken
+ - fought
+ - found
+ - frozen
+ - given
+ - gone
+ - gotten
+ - ground
+ - grown
+ - heard
+ - held
+ - hidden
+ - hit
+ - hung
+ - hurt
+ - kept
+ - knelt
+ - knit
+ - known
+ - laid
+ - lain
+ - leapt
+ - learnt
+ - led
+ - left
+ - lent
+ - let
+ - lighted
+ - lost
+ - made
+ - meant
+ - met
+ - misspelt
+ - mistaken
+ - mown
+ - overcome
+ - overdone
+ - overtaken
+ - overthrown
+ - paid
+ - pled
+ - proven
+ - put
+ - quit
+ - read
+ - rid
+ - ridden
+ - risen
+ - run
+ - rung
+ - said
+ - sat
+ - sawn
+ - seen
+ - sent
+ - set
+ - sewn
+ - shaken
+ - shaven
+ - shed
+ - shod
+ - shone
+ - shorn
+ - shot
+ - shown
+ - shrunk
+ - shut
+ - slain
+ - slept
+ - slid
+ - slit
+ - slung
+ - smitten
+ - sold
+ - sought
+ - sown
+ - sped
+ - spent
+ - spilt
+ - spit
+ - split
+ - spoken
+ - spread
+ - sprung
+ - spun
+ - stolen
+ - stood
+ - stridden
+ - striven
+ - struck
+ - strung
+ - stuck
+ - stung
+ - stunk
+ - sung
+ - sunk
+ - swept
+ - swollen
+ - sworn
+ - swum
+ - swung
+ - taken
+ - taught
+ - thought
+ - thrived
+ - thrown
+ - thrust
+ - told
+ - torn
+ - trodden
+ - understood
+ - upheld
+ - upset
+ - wed
+ - wept
+ - withheld
+ - withstood
+ - woken
+ - won
+ - worn
+ - wound
+ - woven
+ - written
+ - wrung
diff --git a/.github/styles/Google/Periods.yml b/.github/styles/Google/Periods.yml
new file mode 100644
index 00000000..d24a6a6c
--- /dev/null
+++ b/.github/styles/Google/Periods.yml
@@ -0,0 +1,7 @@
+extends: existence
+message: "Don't use periods with acronyms or initialisms such as '%s'."
+link: 'https://developers.google.com/style/abbreviations'
+level: error
+nonword: true
+tokens:
+ - '\b(?:[A-Z]\.){3,}'
diff --git a/.github/styles/Google/Quotes.yml b/.github/styles/Google/Quotes.yml
new file mode 100644
index 00000000..3cb6f1ab
--- /dev/null
+++ b/.github/styles/Google/Quotes.yml
@@ -0,0 +1,7 @@
+extends: existence
+message: "Commas and periods go inside quotation marks."
+link: 'https://developers.google.com/style/quotation-marks'
+level: error
+nonword: true
+tokens:
+ - '"[^"]+"[.,?]'
diff --git a/.github/styles/Google/Ranges.yml b/.github/styles/Google/Ranges.yml
new file mode 100644
index 00000000..3ec045e7
--- /dev/null
+++ b/.github/styles/Google/Ranges.yml
@@ -0,0 +1,7 @@
+extends: existence
+message: "Don't add words such as 'from' or 'between' to describe a range of numbers."
+link: 'https://developers.google.com/style/hyphens'
+nonword: true
+level: warning
+tokens:
+ - '(?:from|between)\s\d+\s?-\s?\d+'
diff --git a/.github/styles/Google/Semicolons.yml b/.github/styles/Google/Semicolons.yml
new file mode 100644
index 00000000..bb8b85b4
--- /dev/null
+++ b/.github/styles/Google/Semicolons.yml
@@ -0,0 +1,8 @@
+extends: existence
+message: "Use semicolons judiciously."
+link: 'https://developers.google.com/style/semicolons'
+nonword: true
+scope: sentence
+level: suggestion
+tokens:
+ - ';'
diff --git a/.github/styles/Google/Slang.yml b/.github/styles/Google/Slang.yml
new file mode 100644
index 00000000..63f4c248
--- /dev/null
+++ b/.github/styles/Google/Slang.yml
@@ -0,0 +1,11 @@
+extends: existence
+message: "Don't use internet slang abbreviations such as '%s'."
+link: 'https://developers.google.com/style/abbreviations'
+ignorecase: true
+level: error
+tokens:
+ - 'tl;dr'
+ - ymmv
+ - rtfm
+ - imo
+ - fwiw
diff --git a/.github/styles/Google/Spacing.yml b/.github/styles/Google/Spacing.yml
new file mode 100644
index 00000000..5f209a9f
--- /dev/null
+++ b/.github/styles/Google/Spacing.yml
@@ -0,0 +1,8 @@
+extends: existence
+message: "'%s' should have one space."
+link: 'https://developers.google.com/style/sentence-spacing'
+level: error
+nonword: true
+tokens:
+ - '[.?!] {2,}[A-Z]'
+ - '[.?!][A-Z]'
diff --git a/.github/styles/Google/Spelling.yml b/.github/styles/Google/Spelling.yml
new file mode 100644
index 00000000..57acb884
--- /dev/null
+++ b/.github/styles/Google/Spelling.yml
@@ -0,0 +1,8 @@
+extends: existence
+message: "In general, use American spelling instead of '%s'."
+link: 'https://developers.google.com/style/spelling'
+ignorecase: true
+level: warning
+tokens:
+ - '(?:\w+)nised?'
+ - '(?:\w+)logue'
diff --git a/.github/styles/Google/Units.yml b/.github/styles/Google/Units.yml
new file mode 100644
index 00000000..220de3e9
--- /dev/null
+++ b/.github/styles/Google/Units.yml
@@ -0,0 +1,7 @@
+extends: existence
+message: "Put a nonbreaking space between the number and the unit in '%s'."
+link: 'https://developers.google.com/style/units-of-measure'
+nonword: true
+level: error
+tokens:
+ - \d+(?:GB|TB|MB)
diff --git a/.github/styles/Google/Will.yml b/.github/styles/Google/Will.yml
new file mode 100644
index 00000000..128a9183
--- /dev/null
+++ b/.github/styles/Google/Will.yml
@@ -0,0 +1,7 @@
+extends: existence
+message: "Avoid using '%s'."
+link: 'https://developers.google.com/style/tense'
+ignorecase: true
+level: warning
+tokens:
+ - will
diff --git a/.github/styles/Google/WordList.yml b/.github/styles/Google/WordList.yml
new file mode 100644
index 00000000..d5d6bea5
--- /dev/null
+++ b/.github/styles/Google/WordList.yml
@@ -0,0 +1,79 @@
+extends: substitution
+message: "Use %s instead of '%s'."
+link: 'https://developers.google.com/style/word-list'
+level: warning
+ignorecase: false
+swap:
+ '(?:API Console|dev|developer) key': "'API key'"
+ '(?:cell ?phone|smart ?phone)': "'phone' or 'mobile phone'"
+ '(?:dev|developer|APIs) console': "'API console'"
+ '(?:e-mail|Email|E-mail)': "'email'"
+ '(?:file ?path|path ?name)': "'path'"
+ '(?:kill|terminate)': "'stop', 'exit', 'cancel', or 'end'"
+ '(?:OAuth ?2|Oauth)': "'OAuth 2.0'"
+ '(?:ok|Okay)': "'OK' or 'okay'"
+ '(?:WiFi|wifi)': "'Wi-Fi'"
+ '[\.]+apk': "'APK'"
+ '3\-D': "'3D'"
+ 'Google (?:I\-O|IO)': "'Google I/O'"
+ 'tap (?:&|and) hold': "'touch & hold'"
+ 'un(?:check|select)': "'clear'"
+ abort: "'stop', 'exit', 'cancel' or 'end'"
+ above: "'preceding'"
+ account name: "'username'"
+ action bar: "'app bar'"
+ admin: "'administrator'"
+ Ajax: "'AJAX'"
+ Android device: "'Android-powered device'"
+ android: "'Android'"
+ API explorer: "'APIs Explorer'"
+ application: "'app'"
+ approx\.: "'approximately'"
+ authN: "'authentication'"
+ authZ: "'authorization'"
+ autoupdate: "'automatically update'"
+ cellular data: "'mobile data'"
+ cellular network: "'mobile network'"
+ chapter: "'documents', 'pages', 'sections'"
+ check box: "'checkbox'"
+ check: "'select'"
+ CLI: "'command-line tool'"
+ click on: "'click' or 'click in'"
+ Cloud: "'Google Cloud Platform' or 'GCP'"
+ Container Engine: "'Kubernetes Engine'"
+ content type: "'media type'"
+ curated roles: "'predefined roles'"
+ data are: "'data is'"
+ Developers Console: "'Google API Console' or 'API Console'"
+ disabled?: "'turn off' or 'off'"
+ ephemeral IP address: "'ephemeral external IP address'"
+ fewer data: "'less data'"
+ file name: "'filename'"
+ firewalls: "'firewall rules'"
+ functionality: "'capability' or 'feature'"
+ Google account: "'Google Account'"
+ Google accounts: "'Google Accounts'"
+ Googling: "'search with Google'"
+ grayed-out: "'unavailable'"
+ HTTPs: "'HTTPS'"
+ in order to: "'to'"
+ ingest: "'import' or 'load'"
+ k8s: "'Kubernetes'"
+ long press: "'touch & hold'"
+ network IP address: "'internal IP address'"
+ omnibox: "'address bar'"
+ open-source: "'open source'"
+ overview screen: "'recents screen'"
+ regex: "'regular expression'"
+ SHA1: "'SHA-1' or 'HAS-SHA1'"
+ sign into: "'sign in to'"
+ sign-?on: "'single sign-on'"
+ static IP address: "'static external IP address'"
+ stylesheet: "'style sheet'"
+ synch: "'sync'"
+ tablename: "'table name'"
+ tablet: "'device'"
+ touch: "'tap'"
+ url: "'URL'"
+ vs\.: "'versus'"
+ World Wide Web: "'web'"
diff --git a/.github/styles/Google/meta.json b/.github/styles/Google/meta.json
new file mode 100644
index 00000000..3ae5fb21
--- /dev/null
+++ b/.github/styles/Google/meta.json
@@ -0,0 +1,16 @@
+{
+ "author": "Joseph Kato",
+ "description": "A Vale-compatible implementation of the Microsoft Writing Style Guide.",
+ "email": "support@errata.ai",
+ "lang": "en",
+ "url": "https://github.com/errata-ai/Google/releases/latest/download/Google.zip",
+ "feed": "https://github.com/errata-ai/Google/releases.atom",
+ "issues": "https://github.com/errata-ai/Google/issues/new",
+ "license": "MIT",
+ "name": "Google",
+ "sources": [
+ "https://developers.google.com/style/"
+ ],
+ "vale_version": ">=1.0.0",
+ "coverage": 0.0
+}
diff --git a/.github/styles/Google/vocab.txt b/.github/styles/Google/vocab.txt
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/.github/styles/Google/vocab.txt
diff --git a/.github/styles/VyOS/Terminology.yml b/.github/styles/VyOS/Terminology.yml
new file mode 100644
index 00000000..cd0c5089
--- /dev/null
+++ b/.github/styles/VyOS/Terminology.yml
@@ -0,0 +1,9 @@
+extends: substitution
+message: Prefer '%s' over '%s'
+ignorecase: false
+level: error
+swap:
+ vyos: VyOS
+ Vyos: VyOS
+ VYOS: VyOS
+ Gre: GRE \ No newline at end of file
diff --git a/.github/vyos-linter.py b/.github/vyos-linter.py
new file mode 100644
index 00000000..05bb6bbb
--- /dev/null
+++ b/.github/vyos-linter.py
@@ -0,0 +1,162 @@
+import os
+import re
+import ipaddress
+import sys
+import ast
+
+IPV4SEG = r'(?:25[0-5]|(?:2[0-4]|1{0,1}[0-9]){0,1}[0-9])'
+IPV4ADDR = r'(?:(?:' + IPV4SEG + r'\.){3,3}' + IPV4SEG + r')'
+IPV6SEG = r'(?:(?:[0-9a-fA-F]){1,4})'
+IPV6GROUPS = (
+ r'(?:' + IPV6SEG + r':){7,7}' + IPV6SEG, # 1:2:3:4:5:6:7:8
+ r'(?:\s' + IPV6SEG + r':){1,7}:', # 1:: 1:2:3:4:5:6:7::
+ r'(?:' + IPV6SEG + r':){1,6}:' + IPV6SEG, # 1::8 1:2:3:4:5:6::8 1:2:3:4:5:6::8
+ r'(?:' + IPV6SEG + r':){1,5}(?::' + IPV6SEG + r'){1,2}', # 1::7:8 1:2:3:4:5::7:8 1:2:3:4:5::8
+ r'(?:' + IPV6SEG + r':){1,4}(?::' + IPV6SEG + r'){1,3}', # 1::6:7:8 1:2:3:4::6:7:8 1:2:3:4::8
+ r'(?:' + IPV6SEG + r':){1,3}(?::' + IPV6SEG + r'){1,4}', # 1::5:6:7:8 1:2:3::5:6:7:8 1:2:3::8
+ r'(?:' + IPV6SEG + r':){1,2}(?::' + IPV6SEG + r'){1,5}', # 1::4:5:6:7:8 1:2::4:5:6:7:8 1:2::8
+ IPV6SEG + r':(?:(?::' + IPV6SEG + r'){1,6})', # 1::3:4:5:6:7:8 1::3:4:5:6:7:8 1::8
+ r':(?:(?::' + IPV6SEG + r'){1,7}|:)', # ::2:3:4:5:6:7:8 ::2:3:4:5:6:7:8 ::8 ::
+ r'fe80:(?::' + IPV6SEG + r'){0,4}%[0-9a-zA-Z]{1,}', # fe80::7:8%eth0 fe80::7:8%1 (link-local IPv6 addresses with zone index)
+ r'::(?:ffff(?::0{1,4}){0,1}:){0,1}[^\s:]' + IPV4ADDR, # ::255.255.255.255 ::ffff:255.255.255.255 ::ffff:0:255.255.255.255 (IPv4-mapped IPv6 addresses and IPv4-translated addresses)
+ r'(?:' + IPV6SEG + r':){1,4}:[^\s:]' + IPV4ADDR, # 2001:db8:3:4::192.0.2.33 64:ff9b::192.0.2.33 (IPv4-Embedded IPv6 Address)
+)
+IPV6ADDR = '|'.join(['(?:{})'.format(g) for g in IPV6GROUPS[::-1]]) # Reverse rows for greedy match
+
+MAC = r'([0-9A-F]{2}[:-]){5}([0-9A-F]{2})'
+
+NUMBER = r"([\s']\d+[\s'])"
+
+
+def lint_mac(cnt, line):
+ mac = re.search(MAC, line, re.I)
+ if mac is not None:
+ mac = mac.group()
+ u_mac = re.search(r'((00)[:-](53)([:-][0-9A-F]{2}){4})', mac, re.I)
+ m_mac = re.search(r'((90)[:-](10)([:-][0-9A-F]{2}){4})', mac, re.I)
+ if u_mac is None and m_mac is None:
+ return (f"Use MAC reserved for Documentation (RFC7042): {mac}", cnt, 'error')
+
+
+def lint_ipv4(cnt, line):
+ ip = re.search(IPV4ADDR, line, re.I)
+ if ip is not None:
+ ip = ipaddress.ip_address(ip.group().strip(' '))
+ # https://docs.python.org/3/library/ipaddress.html#ipaddress.IPv4Address.is_private
+ if ip.is_private is False and ip.is_multicast is False:
+ return (f"Use IPv4 reserved for Documentation (RFC 5737) or private Space: {ip}", cnt, 'error')
+
+
+def lint_ipv6(cnt, line):
+ ip = re.search(IPV6ADDR, line, re.I)
+ if ip is not None:
+ ip = ipaddress.ip_address(ip.group().strip(' '))
+ # https://docs.python.org/3/library/ipaddress.html#ipaddress.IPv4Address.is_private
+ if ip.is_private is False and ip.is_multicast is False:
+ return (f"Use IPv6 reserved for Documentation (RFC 3849) or private Space: {ip}", cnt, 'error')
+
+
+def lint_AS(cnt, line):
+ number = re.search(NUMBER, line, re.I)
+ if number:
+ pass
+ # find a way to detect AS numbers
+
+
+def lint_linelen(cnt, line):
+ if len(line) > 80:
+ return (f"Line too long: len={len(line)}", cnt, 'warning')
+
+
+def handle_file(path, file):
+ errors = []
+ path = '/'.join(path)
+ filepath = f"{path}/{file}"
+ try:
+ with open(filepath) as fp:
+ line = fp.readline()
+ cnt = 1
+ while line:
+ err_mac = lint_mac(cnt, line.strip())
+ err_ip4 = lint_ipv4(cnt, line.strip())
+ err_ip6 = lint_ipv6(cnt, line.strip())
+ err_len = lint_linelen(cnt, line.strip())
+ if err_mac:
+ errors.append(err_mac)
+ if err_ip4:
+ errors.append(err_ip4)
+ if err_ip6:
+ errors.append(err_ip6)
+ if err_len:
+ errors.append(err_len)
+ line = fp.readline()
+ cnt += 1
+ finally:
+ fp.close()
+
+ if len(errors) > 0:
+ print(f"File: {filepath}")
+ for error in errors:
+ print(error)
+ print('')
+ return False
+
+def handle_file_action(filepath):
+ errors = []
+ try:
+ with open(filepath) as fp:
+ line = fp.readline()
+ cnt = 1
+ while line:
+ err_mac = lint_mac(cnt, line.strip())
+ err_ip4 = lint_ipv4(cnt, line.strip())
+ err_ip6 = lint_ipv6(cnt, line.strip())
+ err_len = lint_linelen(cnt, line.strip())
+ if err_mac:
+ errors.append(err_mac)
+ if err_ip4:
+ errors.append(err_ip4)
+ if err_ip6:
+ errors.append(err_ip6)
+ if err_len:
+ errors.append(err_len)
+ line = fp.readline()
+ cnt += 1
+ finally:
+ fp.close()
+
+ if len(errors) > 0:
+ '''
+ "::{$type} file={$filename},line={$line},col=$column::{$log}"
+ '''
+ print(f"File: {filepath}")
+ for error in errors:
+ print(f"::{error[2]} file={filepath},line={error[1]}::{error[0]}")
+ print('')
+ return False
+
+
+def main():
+ bool_error = True
+ print('start')
+ try:
+ files = ast.literal_eval(sys.argv[1])
+ for file in files:
+ print(file)
+ if file[-4:] == ".rst":
+ if handle_file_action(file) is False:
+ bool_error = False
+ except Exception as e:
+ print(e)
+ for root, dirs, files in os.walk("../docs"):
+ path = root.split(os.sep)
+ for file in files:
+ if file[-4:] == ".rst":
+ if handle_file(path, file) is False:
+ bool_error = False
+ return bool_error
+
+
+if __name__ == "__main__":
+ if main() == False:
+ exit(1)
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
new file mode 100644
index 00000000..b6797ce0
--- /dev/null
+++ b/.github/workflows/main.yml
@@ -0,0 +1,32 @@
+name: Linting
+on:
+ pull_request:
+
+jobs:
+ lint:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2
+
+ - name: File Changes
+ id: file_changes
+ uses: trilom/file-changes-action@v1.2.3
+
+ - name: Vale
+ uses: errata-ai/vale-action@v1.3.0
+ with:
+ files: '${{ steps.file_changes.outputs.files_modified }}'
+
+ - name: Set up Python
+ uses: actions/setup-python@v2
+ with:
+ python-version: '3.x'
+
+ - name: run python based linter
+ run: python .github/vyos-linter.py '${{ steps.file_changes.outputs.files_modified }}'
+
+ env:
+ GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
+
+
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 00000000..d3d92138
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,4 @@
+[submodule "docs/_include/vyos-1x"]
+ path = docs/_include/vyos-1x
+ url = https://github.com/vyos/vyos-1x
+ branch = current
diff --git a/vale.ini b/vale.ini
new file mode 100644
index 00000000..b7dde1d8
--- /dev/null
+++ b/vale.ini
@@ -0,0 +1,16 @@
+StylesPath = .github/styles
+MinAlertLevel = suggestion
+
+SkippedScopes = script, style, pre, figure, img, a, code
+
+
+[*.rst]
+BasedOnStyles = VyOS, Google
+
+Google.DateFormat = YES
+vale.GenderBias = NO
+vale.Hedging = NO
+vale.Redundancy = NO
+vale.Repetition = YES
+vale.Uncomparables = NO
+proselint.GenderBias = NO \ No newline at end of file