Use a more readable form to display parameters

This commit is contained in:
Fred Tingaud 2022-02-01 13:25:23 +01:00 committed by GitHub
parent a5a9904a80
commit 7d868d3f35
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
447 changed files with 4350 additions and 2599 deletions

View File

@ -21,6 +21,14 @@ include::supported_languages.adoc[]
**** `rules/Sxxxx/[LANGUAGE]/rule.adoc`: asciidoc file used to generate the `Sxxxx` rule description for programming language `[LANGUAGE]`. It can include parts from `*.adoc` files located in the parent directory.
**** `rules/Sxxxx/[LANGUAGE]/metadata.json`: metadatas for the specific language. Each key at the top will completely override the key of the `metadata.json` file of the parent directory.
== Rule description file
Refer to the <<docs/description.adoc#,documentation about rules description>> for the content of the rule.adoc file.
== Metadata file
Refer to the <<docs/metadata.adoc#,documentation about the metadata file>> for the content of the metadata.json file.
== Non-content modifications
Refer to the <<docs/testing.adoc#,documentation about testing>> if you plan to change something else than rules.
@ -225,37 +233,6 @@ It is infeasible to synchronize the implementation of the rule for all the langu
.. Bob merges the rule implementation in Cobol analyzer.
.. If Bob had opened an RSPEC PR with changes, he merges it once the rule is implemented in the analyzer.
== `quickfix` field
Every active rule that is not a security hotspot must specify the availability of a quick fix for its issues.
`metadata.json` must feature a `quickfix` field with one of the following values:
* `unknown`: the feasibility of producing a quick fix is not evaluated.
* `infeasible`: it is not feasible to propose a quick fix for any of the issues, for whatever reason.
* `targeted`: it is possible to implement quick fixes for this rule, but none are implemented right now.
* `partial`: some of the issues produced by the rule propose a quick fix, but not all.
* `covered`: all the issues produced by the rule propose a quick fix.
[NOTE]
====
A `covered` rule is still not guaranteed to provide a quick fix for a particular issue (for instance, if a fix location would be inside a macro expansion or in a different file from the issue location). The rule is said to have a `partial` quick fix only if there exists a family of issues that cannot have a quick fix.
For instance, on one hand, if a rule detects two functions that are dangerous to use, `A` and `B`, and `A` has an obvious replacement (and therefore a quick fix) while `B` does not, the field should be set to `partial`.
On the other hand, if a quick fix could be easily proposed for both `A` and `B`, but the fix location might be inside a macro expansion, or in a different file from the issue location (and hence not feasible given the current SonarLint capabilities), this should not prevent the rule from being tagged as `covered`.
====
== Comment a rule
Comments and links that were created on Jira have been gathered in a `comments-and-links.adoc` file for each concerned rule. +
You can add a comment anywhere in a rule by adding the following lines in the `*.adoc` file:
[source]
----
\ifdef::env-github,rspecator-view[]
John Doe (9 Jun 2021, 15:49): my comment on the rule
\endif::env-github,rspecator-view[]
----
This way, your comment will only be visible in GitHub preview and on the Search Page (and will not be visible for the user).
== Untriaged Pull Requests
Untriaged PRs are the ones without any GitHub label assigned to them.

View File

@ -7,32 +7,30 @@ pipenv install
cd ..
# Compute the set of affected rules
git fetch origin $CIRRUS_DEFAULT_BRANCH
git fetch origin "$CIRRUS_DEFAULT_BRANCH"
branch_base_sha=$(git merge-base FETCH_HEAD HEAD)
echo "Comparing against the merge-base: $branch_base_sha"
changeset=$(git diff --name-only $branch_base_sha..HEAD)
changeset=$(git diff --name-only "$branch_base_sha"..HEAD)
affected_rules=$(printf '%s\n' "$changeset" | grep '/S[0-9]\+/' | sed 's:\(.*/S[0-9]\+\)/.*:\1:' | sort | uniq)
affected_tooling=$(printf '%s\n' "$changeset" | grep -v '/S[0-9]\+/')
if [ ! -z "$affected_tooling" ]; then
if [ -n "$affected_tooling" ]; then
echo "Some rpec tools are changed, validating all rules"
affected_rules=rules/*
fi
./ci/generate_html.sh
exit_code=0
./ci/generate_html.sh
cd rspec-tools
# validate sections in asciidoc
if pipenv run rspec-tools check-sections --d ../out; then
echo "Sections are fine"
if pipenv run rspec-tools check-description --d ../out; then
echo "rule.adoc is fine"
else
echo "ERROR: incorrect section names or invalid level-0 headers"
echo "ERROR: rule.adoc is not valid"
exit_code=1
fi
cd ..
for dir in $affected_rules
do
if [ ! -d "$dir" ]; then
@ -40,9 +38,9 @@ do
continue
fi
dir=${dir%*/}
echo ${dir##*/}
echo "${dir##*/}"
subdircount=$(find $dir -maxdepth 1 -type d | wc -l)
subdircount=$(find "$dir" -maxdepth 1 -type d | wc -l)
# check if there are language specializations
if [[ "$subdircount" -eq 1 ]]
@ -56,23 +54,23 @@ do
fi
else
#validate asciidoc
supportedLanguages=$(sed 's/ or//' supported_languages.adoc | tr -d '`,')
for language in $dir/*/
supportedLanguages=$(sed 's/ or//' supported_languages.adoc | tr -d '`,')
for language in $dir/*/
do
language=${language%*/}
echo ${language##*/}
if [[ ! "${supportedLanguages[@]}" =~ "${language##*/}" ]]; then
echo "ERROR: ${language##*/} is not a supported language"
exit_code=1
echo "${language##*/}"
if [[ ! "${supportedLanguages[*]}" == *"${language##*/}"* ]]; then
echo "ERROR: ${language##*/} is not a supported language"
exit_code=1
fi
RULE="$language/rule.adoc"
if test -f $RULE; then
if test -f "$RULE"; then
echo "$RULE exists."
TMP_ADOC="$language/tmp.adoc"
echo "== Description" > $TMP_ADOC
cat $RULE >> $TMP_ADOC
if asciidoctor --failure-level=WARNING -o /dev/null $TMP_ADOC; then
if asciidoctor -a rspecator-view --failure-level=WARNING -o /dev/null $TMP_ADOC; then
echo "== Description" > "$TMP_ADOC"
cat "$RULE" >> "$TMP_ADOC"
if asciidoctor --failure-level=WARNING -o /dev/null "$TMP_ADOC"; then
if asciidoctor -a rspecator-view --failure-level=WARNING -o /dev/null "$TMP_ADOC"; then
echo "$RULE syntax is fine"
else
echo "ERROR: $RULE has incorrect asciidoc in rspecator-view mode"
@ -82,17 +80,26 @@ do
echo "ERROR: $RULE has incorrect asciidoc"
exit_code=1
fi
rm $TMP_ADOC
rm "$TMP_ADOC"
else
echo "ERROR: no asciidoc file $RULE"
exit_code=1
fi
done
# Check that all adoc are included
find "$dir" -name "*.adoc" -execdir sh -c 'grep -h "include::" "$1" | grep -v "rule.adoc" | sed "s/include::\(.*\)\[\]/\1/" | xargs -r -I@ realpath "$PWD/@"' shell {} \; > included
find "$dir" -name "*.adoc" ! -name 'rule.adoc' -exec sh -c 'realpath $1' shell {} \; > created
orphans=$(comm -1 -3 <(sort -u included) <(sort -u created))
if [[ -n "$orphans" ]]; then
printf 'ERROR: These adoc files are not included anywhere:\n-----\n%s\n-----\n' "$orphans"
exit_code=1
fi
rm -f included created
fi
done
echo "Finished."
if (( $exit_code == 0 )); then
if (( exit_code == 0 )); then
echo "Success"
else
echo "There were errors"

71
docs/description.adoc Normal file
View File

@ -0,0 +1,71 @@
= Rule Description
This document describes how `+rule.adoc+` and its dependencies should be structured.
== Sections
There should be no first level titles (`+= Title+`) in your adoc.
The following are the only allowed second level titles for H2:
include::section_names.adoc[]
Third level titles are not checked.
== Parameters
Parameters should be listed in a subsection as follow:
....
=== Parameters
.name
****
_TYPE_
----
default value
----
Description of what the parameter does.
****
.name2
****
----
another default value
----
Description of what this second parameter does.
****
.name3
****
_TYPE_
Description of what this third parameter does.
****
.name4
****
Description of what this fourth parameter does.
****
....
The parameter name and the description are mandatory. The type and default value are not.
The parameter name with a `.` before will be the title of the block below marked by `****`.
We always use `----` around the default parameter to avoid having a special character confuse AsciiDoctor and to create a visual consistency for all parameters.
== Comment a rule
Comments and links that were created on Jira have been gathered in a `comments-and-links.adoc` file for each concerned rule. +
You can add a comment anywhere in a rule by adding the following lines in the `*.adoc` file:
[source]
----
\ifdef::env-github,rspecator-view[]
John Doe (9 Jun 2021, 15:49): my comment on the rule
\endif::env-github,rspecator-view[]
----
This way, your comment will only be visible in GitHub preview and on the Search Page (and will not be visible for the user).

23
docs/metadada.adoc Normal file
View File

@ -0,0 +1,23 @@
= Rule Metadata
This document describes how `+metadata.json+` should be structured.
== `quickfix` field
Every active rule that is not a security hotspot must specify the availability of a quick fix for its issues.
`metadata.json` must feature a `quickfix` field with one of the following values:
* `unknown`: the feasibility of producing a quick fix is not evaluated.
* `infeasible`: it is not feasible to propose a quick fix for any of the issues, for whatever reason.
* `targeted`: it is possible to implement quick fixes for this rule, but none are implemented right now.
* `partial`: some of the issues produced by the rule propose a quick fix, but not all.
* `covered`: all the issues produced by the rule propose a quick fix.
[NOTE]
====
A `covered` rule is still not guaranteed to provide a quick fix for a particular issue (for instance, if a fix location would be inside a macro expansion or in a different file from the issue location). The rule is said to have a `partial` quick fix only if there exists a family of issues that cannot have a quick fix.
For instance, on one hand, if a rule detects two functions that are dangerous to use, `A` and `B`, and `A` has an obvious replacement (and therefore a quick fix) while `B` does not, the field should be set to `partial`.
On the other hand, if a quick fix could be easily proposed for both `A` and `B`, but the fix location might be inside a macro expansion, or in a different file from the issue location (and hence not feasible given the current SonarLint capabilities), this should not prevent the rule from being tagged as `covered`.
====

9
docs/section_names.adoc Normal file
View File

@ -0,0 +1,9 @@
* Noncompliant Code Example
* Compliant Solution
* See
* See Also
* Exceptions
* Sensitive Code Example
* Ask Yourself Whether
* Recommended Secure Coding Practices
* Deprecated

View File

@ -15,6 +15,8 @@ import { RuleMetadata } from './types';
import './hljs-humanoid-light.css';
const PARAMETER_INTERNAL_MARGIN = 0.5;
const useStyles = makeStyles((theme) => ({
'@global': {
h1: {
@ -33,6 +35,22 @@ const useStyles = makeStyles((theme) => ({
},
hr: {
color: '#F9F9FB'
},
'.sidebarblock': {
'& .title': {
marginTop: theme.spacing(2),
color: '#25699D'
},
'& pre': {
marginLeft: '1rem',
marginTop: theme.spacing(PARAMETER_INTERNAL_MARGIN),
marginBottom: theme.spacing(PARAMETER_INTERNAL_MARGIN)
},
'& p': {
marginLeft: '1rem',
marginTop: theme.spacing(PARAMETER_INTERNAL_MARGIN),
marginBottom: theme.spacing(PARAMETER_INTERNAL_MARGIN)
}
}
},
ruleBar: {

View File

@ -8,7 +8,7 @@ from rspec_tools.errors import RuleNotFoundError, RuleValidationError
from rspec_tools.create_rule import create_new_rule, add_language_to_rule
from rspec_tools.rules import RulesRepository
from rspec_tools.validation.metadata import validate_rule_metadata
from rspec_tools.validation.description import validate_section_names, validate_section_levels
from rspec_tools.validation.description import validate_section_names, validate_section_levels, validate_parameters
from rspec_tools.coverage import update_coverage_for_all_repos, update_coverage_for_repo, update_coverage_for_repo_version
from rspec_tools.notify_failure_on_slack import notify_slack
@ -70,13 +70,13 @@ def validate_rules_metadata(rules):
@cli.command()
@click.option('--d', required=True)
@click.argument('rules', nargs=-1)
def check_sections(d, rules):
'''Validate the section names.'''
def check_description(d, rules):
'''Validate the rule.adoc description.'''
out_dir = Path(__file__).parent.parent.joinpath(d)
rule_repository = RulesRepository(rules_path=out_dir)
error_counter = 0
for rule in rule_repository.rules:
if rules and rule.key not in rules:
if rules and rule.id not in rules:
continue
for lang_spec_rule in rule.specializations:
try:
@ -89,6 +89,11 @@ def check_sections(d, rules):
except RuleValidationError as e:
click.echo(e.message, err=True)
error_counter += 1
try:
validate_parameters(lang_spec_rule)
except RuleValidationError as e:
click.echo(e.message, err=True)
error_counter += 1
if error_counter > 0:
fatal_error(f"Validation failed due to {error_counter} errors")

View File

@ -1,5 +1,6 @@
import json
from bs4 import BeautifulSoup
from pathlib import Path
from typing import Final
from rspec_tools.errors import RuleValidationError
@ -10,19 +11,12 @@ from rspec_tools.rules import LanguageSpecificRule
# in the migrated RSPECs.
# Further work required to shorten the list by renaming the sections in some RSPECS
# to keep only on version for each title.
ACCEPTED_SECTION_NAMES: Final[list[str]] = ['Noncompliant Code Example',
'Compliant Solution',
'See',
'See Also',
'Exceptions',
'Sensitive Code Example',
'Ask Yourself Whether',
'Recommended Secure Coding Practices',
'Deprecated']
SECTION_NAMES_PATH = Path(__file__).parent.parent.parent.parent.joinpath('docs/section_names.adoc')
SECTION_NAMES_FILE = SECTION_NAMES_PATH.read_text(encoding='utf-8').split('\n')
ACCEPTED_SECTION_NAMES: Final[list[str]] = [s.replace('* ', '').strip() for s in SECTION_NAMES_FILE if s.strip()]
def validate_section_names(rule_language: LanguageSpecificRule):
descr = rule_language.description
for h2 in descr.findAll('h2'):
for h2 in descr.find_all('h2'):
name = h2.text.strip()
if name not in ACCEPTED_SECTION_NAMES:
raise RuleValidationError(f'Rule {rule_language.id} has unconventional header "{name}"')
@ -32,3 +26,24 @@ def validate_section_levels(rule_language: LanguageSpecificRule):
if h1 is not None:
name = h1.text.strip()
raise RuleValidationError(f'Rule {rule_language.id} has level-0 header "{name}"')
def validate_one_parameter(child, id):
if child.name != 'div' or child['class'][0] != 'sidebarblock':
raise RuleValidationError(f'Rule {id} should use `****` blocks for each parameter')
for div_child in child.children:
if div_child.name is not None:
if div_child['class'][0] != 'content':
raise RuleValidationError(f'Rule {id} should use `****` blocks for each parameter')
if div_child.p is None:
raise RuleValidationError(f'Rule {id} should have a description for each parameter')
if div_child.find('div', 'title') is None:
raise RuleValidationError(f'Rule {id} should have a parameter name declared with `.name` before the bock, for each parameter')
def validate_parameters(rule_language: LanguageSpecificRule):
for h3 in rule_language.description.find_all('h3'):
name = h3.text.strip()
if name == 'Parameters':
for child in h3.parent.children:
if child.name is None or child == h3 or child.name == 'hr':
continue
validate_one_parameter(child, rule_language.id)

View File

@ -7,3 +7,8 @@ import pytest
def mockrules():
'''Provides a path to test rules resources.'''
return Path(__file__).parent.joinpath('resources', 'rules')
@pytest.fixture
def mockinvalidrules():
'''Provides a path to test rules resources.'''
return Path(__file__).parent.joinpath('resources', 'invalid-rules')

View File

@ -0,0 +1,6 @@
{
"title": "Function names should comply with a naming convention",
"defaultQualityProfiles": [
]
}

View File

@ -0,0 +1,21 @@
= Invalid header level
Shared naming conventions allow teams to collaborate efficiently. This rule checks that all function names match a provided regular expression.
== Invalid header
== Noncompliant Code Example
With default provided regular expression: ``++^[a-z][a-zA-Z0-9]*$++``:
----
void DoSomething (void);
----
=== Parameters
*format*: STRING [ `+^([A-Z0-9_]*|[a-z0-9_]*)$+` ]
Regular expression used to check the [method|function|subroutine] names against
*param2*: INTEGER [ `+42+` ]::
Some integer

View File

@ -0,0 +1,53 @@
<body class="book">
<div id="header">
<h1>Invalid header level</h1>
</div>
<div id="content">
<div id="preamble">
<div class="sectionbody">
<div class="paragraph">
<p>Shared naming conventions allow teams to collaborate efficiently. This rule checks that all function names match a provided regular expression.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_invalid_header">Invalid header</h2>
<div class="sectionbody">
</div>
</div>
<div class="sect1">
<h2 id="_noncompliant_code_example">Noncompliant Code Example</h2>
<div class="sectionbody">
<div class="paragraph">
<p>With default provided regular expression: <code>^[a-z][a-zA-Z0-9]*$</code>:</p>
</div>
<div class="listingblock">
<div class="content">
<pre>void DoSomething (void);</pre>
</div>
</div>
<div class="sect2">
<h3 id="_parameters">Parameters</h3>
<div class="paragraph">
<p><strong>format</strong>: STRING [ <code>^([A-Z0-9_]*|[a-z0-9_]*)$</code> ]
Regular expression used to check the [method|function|subroutine] names against</p>
</div>
<div class="dlist">
<dl>
<dt class="hdlist1"><strong>param2</strong>: INTEGER [ <code>42</code> ]</dt>
<dd>
<p>Some integer</p>
</dd>
</dl>
</div>
</div>
</div>
</div>
</div>
<div id="footer">
<div id="footer-text">
Last updated 2022-01-28 19:05:40 +0100
</div>
</div>
</body>

View File

@ -0,0 +1,6 @@
{
"title": "Function names should comply with a naming convention",
"defaultQualityProfiles": [
]
}

View File

@ -0,0 +1,25 @@
= Invalid header level
Shared naming conventions allow teams to collaborate efficiently. This rule checks that all function names match a provided regular expression.
== Invalid header
== Noncompliant Code Example
With default provided regular expression: ``++^[a-z][a-zA-Z0-9]*$++``:
----
void DoSomething (void);
----
=== Parameters
****
*format*
_STRING_
----
^([A-Z0-9_]*|[a-z0-9_]*)$
----
Regular expression used to check the [method|function|subroutine] names against
****

View File

@ -0,0 +1,45 @@
<div id="preamble">
<div class="sectionbody">
<div class="paragraph">
<p>Shared naming conventions allow teams to collaborate efficiently. This rule checks that all function names match a provided regular expression.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_invalid_header">Invalid header</h2>
<div class="sectionbody">
</div>
</div>
<div class="sect1">
<h2 id="_noncompliant_code_example">Noncompliant Code Example</h2>
<div class="sectionbody">
<div class="paragraph">
<p>With default provided regular expression: <code>^[a-z][a-zA-Z0-9]*$</code>:</p>
</div>
<div class="listingblock">
<div class="content">
<pre>void DoSomething (void);</pre>
</div>
</div>
<div class="sect2">
<h3 id="_parameters">Parameters</h3>
<div class="sidebarblock">
<div class="content">
<div class="paragraph">
<p><strong>format</strong>
<em>STRING</em></p>
</div>
<div class="listingblock">
<div class="content">
<pre>^([A-Z0-9_]*|[a-z0-9_]*)$</pre>
</div>
</div>
<div class="paragraph">
<p>Regular expression used to check the [method|function|subroutine] names against</p>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,6 @@
{
"title": "Function names should comply with a naming convention",
"defaultQualityProfiles": [
]
}

View File

@ -0,0 +1,22 @@
= Invalid header level
Shared naming conventions allow teams to collaborate efficiently. This rule checks that all function names match a provided regular expression.
== Invalid header
== Noncompliant Code Example
With default provided regular expression: ``++^[a-z][a-zA-Z0-9]*$++``:
----
void DoSomething (void);
----
=== Parameters
.format
****
----
^([A-Z0-9_]*|[a-z0-9_]*)$
----
****

View File

@ -0,0 +1,39 @@
<div id="preamble">
<div class="sectionbody">
<div class="paragraph">
<p>Shared naming conventions allow teams to collaborate efficiently. This rule checks that all function names match a provided regular expression.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_invalid_header">Invalid header</h2>
<div class="sectionbody">
</div>
</div>
<div class="sect1">
<h2 id="_noncompliant_code_example">Noncompliant Code Example</h2>
<div class="sectionbody">
<div class="paragraph">
<p>With default provided regular expression: <code>^[a-z][a-zA-Z0-9]*$</code>:</p>
</div>
<div class="listingblock">
<div class="content">
<pre>void DoSomething (void);</pre>
</div>
</div>
<div class="sect2">
<h3 id="_parameters">Parameters</h3>
<div class="sidebarblock">
<div class="content">
<div class="title">format</div>
<div class="listingblock">
<div class="content">
<pre>^([A-Z0-9_]*|[a-z0-9_]*)$</pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@ -1,447 +1,3 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
<head>
<meta charset="UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<meta name="generator" content="Asciidoctor 2.0.12"/>
<title>Noncompliant Code Example</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700"/>
<style>
/* Asciidoctor default stylesheet | MIT License | https://asciidoctor.org */
/* Uncomment @import statement to use as custom stylesheet */
/*@import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700";*/
article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}
audio,video{display:inline-block}
audio:not([controls]){display:none;height:0}
html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}
a{background:none}
a:focus{outline:thin dotted}
a:active,a:hover{outline:0}
h1{font-size:2em;margin:.67em 0}
abbr[title]{border-bottom:1px dotted}
b,strong{font-weight:bold}
dfn{font-style:italic}
hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}
mark{background:#ff0;color:#000}
code,kbd,pre,samp{font-family:monospace;font-size:1em}
pre{white-space:pre-wrap}
q{quotes:"\201C" "\201D" "\2018" "\2019"}
small{font-size:80%}
sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}
sup{top:-.5em}
sub{bottom:-.25em}
img{border:0}
svg:not(:root){overflow:hidden}
figure{margin:0}
fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}
legend{border:0;padding:0}
button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}
button,input{line-height:normal}
button,select{text-transform:none}
button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}
button[disabled],html input[disabled]{cursor:default}
input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}
button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}
textarea{overflow:auto;vertical-align:top}
table{border-collapse:collapse;border-spacing:0}
*,*::before,*::after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
html,body{font-size:100%}
body{background:#fff;color:rgba(0,0,0,.8);padding:0;margin:0;font-family:"Noto Serif","DejaVu Serif",serif;font-weight:400;font-style:normal;line-height:1;position:relative;cursor:auto;tab-size:4;word-wrap:anywhere;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}
a:hover{cursor:pointer}
img,object,embed{max-width:100%;height:auto}
object,embed{height:100%}
img{-ms-interpolation-mode:bicubic}
.left{float:left!important}
.right{float:right!important}
.text-left{text-align:left!important}
.text-right{text-align:right!important}
.text-center{text-align:center!important}
.text-justify{text-align:justify!important}
.hide{display:none}
img,object,svg{display:inline-block;vertical-align:middle}
textarea{height:auto;min-height:50px}
select{width:100%}
.subheader,.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{line-height:1.45;color:#7a2518;font-weight:400;margin-top:0;margin-bottom:.25em}
div,dl,dt,dd,ul,ol,li,h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0}
a{color:#2156a5;text-decoration:underline;line-height:inherit}
a:hover,a:focus{color:#1d4b8f}
a img{border:0}
p{font-family:inherit;font-weight:400;font-size:1em;line-height:1.6;margin-bottom:1.25em;text-rendering:optimizeLegibility}
p aside{font-size:.875em;line-height:1.35;font-style:italic}
h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{font-family:"Open Sans","DejaVu Sans",sans-serif;font-weight:300;font-style:normal;color:#ba3925;text-rendering:optimizeLegibility;margin-top:1em;margin-bottom:.5em;line-height:1.0125em}
h1 small,h2 small,h3 small,#toctitle small,.sidebarblock>.content>.title small,h4 small,h5 small,h6 small{font-size:60%;color:#e99b8f;line-height:0}
h1{font-size:2.125em}
h2{font-size:1.6875em}
h3,#toctitle,.sidebarblock>.content>.title{font-size:1.375em}
h4,h5{font-size:1.125em}
h6{font-size:1em}
hr{border:solid #dddddf;border-width:1px 0 0;clear:both;margin:1.25em 0 1.1875em;height:0}
em,i{font-style:italic;line-height:inherit}
strong,b{font-weight:bold;line-height:inherit}
small{font-size:60%;line-height:inherit}
code{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;color:rgba(0,0,0,.9)}
ul,ol,dl{font-size:1em;line-height:1.6;margin-bottom:1.25em;list-style-position:outside;font-family:inherit}
ul,ol{margin-left:1.5em}
ul li ul,ul li ol{margin-left:1.25em;margin-bottom:0;font-size:1em}
ul.square li ul,ul.circle li ul,ul.disc li ul{list-style:inherit}
ul.square{list-style-type:square}
ul.circle{list-style-type:circle}
ul.disc{list-style-type:disc}
ol li ul,ol li ol{margin-left:1.25em;margin-bottom:0}
dl dt{margin-bottom:.3125em;font-weight:bold}
dl dd{margin-bottom:1.25em}
abbr,acronym{text-transform:uppercase;font-size:90%;color:rgba(0,0,0,.8);border-bottom:1px dotted #ddd;cursor:help}
abbr{text-transform:none}
blockquote{margin:0 0 1.25em;padding:.5625em 1.25em 0 1.1875em;border-left:1px solid #ddd}
blockquote cite{display:block;font-size:.9375em;color:rgba(0,0,0,.6)}
blockquote cite::before{content:"\2014 \0020"}
blockquote cite a,blockquote cite a:visited{color:rgba(0,0,0,.6)}
blockquote,blockquote p{line-height:1.6;color:rgba(0,0,0,.85)}
@media screen and (min-width:768px){h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2}
h1{font-size:2.75em}
h2{font-size:2.3125em}
h3,#toctitle,.sidebarblock>.content>.title{font-size:1.6875em}
h4{font-size:1.4375em}}
table{background:#fff;margin-bottom:1.25em;border:solid 1px #dedede;word-wrap:normal}
table thead,table tfoot{background:#f7f8f7}
table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:.5em .625em .625em;font-size:inherit;color:rgba(0,0,0,.8);text-align:left}
table tr th,table tr td{padding:.5625em .625em;font-size:inherit;color:rgba(0,0,0,.8)}
table tr.even,table tr.alt{background:#f8f8f7}
table thead tr th,table tfoot tr th,table tbody tr td,table tr td,table tfoot tr td{line-height:1.6}
h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2;word-spacing:-.05em}
h1 strong,h2 strong,h3 strong,#toctitle strong,.sidebarblock>.content>.title strong,h4 strong,h5 strong,h6 strong{font-weight:400}
.center{margin-left:auto;margin-right:auto}
.stretch{width:100%}
.clearfix::before,.clearfix::after,.float-group::before,.float-group::after{content:" ";display:table}
.clearfix::after,.float-group::after{clear:both}
:not(pre).nobreak{word-wrap:normal}
:not(pre).nowrap{white-space:nowrap}
:not(pre).pre-wrap{white-space:pre-wrap}
:not(pre):not([class^=L])>code{font-size:.9375em;font-style:normal!important;letter-spacing:0;padding:.1em .5ex;word-spacing:-.15em;background:#f7f7f8;-webkit-border-radius:4px;border-radius:4px;line-height:1.45;text-rendering:optimizeSpeed}
pre{color:rgba(0,0,0,.9);font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;line-height:1.45;text-rendering:optimizeSpeed}
pre code,pre pre{color:inherit;font-size:inherit;line-height:inherit}
pre>code{display:block}
pre.nowrap,pre.nowrap pre{white-space:pre;word-wrap:normal}
em em{font-style:normal}
strong strong{font-weight:400}
.keyseq{color:rgba(51,51,51,.8)}
kbd{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;display:inline-block;color:rgba(0,0,0,.8);font-size:.65em;line-height:1.45;background:#f7f7f7;border:1px solid #ccc;-webkit-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em white inset;box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em #fff inset;margin:0 .15em;padding:.2em .5em;vertical-align:middle;position:relative;top:-.1em;white-space:nowrap}
.keyseq kbd:first-child{margin-left:0}
.keyseq kbd:last-child{margin-right:0}
.menuseq,.menuref{color:#000}
.menuseq b:not(.caret),.menuref{font-weight:inherit}
.menuseq{word-spacing:-.02em}
.menuseq b.caret{font-size:1.25em;line-height:.8}
.menuseq i.caret{font-weight:bold;text-align:center;width:.45em}
b.button::before,b.button::after{position:relative;top:-1px;font-weight:400}
b.button::before{content:"[";padding:0 3px 0 2px}
b.button::after{content:"]";padding:0 2px 0 3px}
p a>code:hover{color:rgba(0,0,0,.9)}
#header,#content,#footnotes,#footer{width:100%;margin-left:auto;margin-right:auto;margin-top:0;margin-bottom:0;max-width:62.5em;*zoom:1;position:relative;padding-left:.9375em;padding-right:.9375em}
#header::before,#header::after,#content::before,#content::after,#footnotes::before,#footnotes::after,#footer::before,#footer::after{content:" ";display:table}
#header::after,#content::after,#footnotes::after,#footer::after{clear:both}
#content{margin-top:1.25em}
#content::before{content:none}
#header>h1:first-child{color:rgba(0,0,0,.85);margin-top:2.25rem;margin-bottom:0}
#header>h1:first-child+#toc{margin-top:8px;border-top:1px solid #dddddf}
#header>h1:only-child,body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #dddddf;padding-bottom:8px}
#header .details{border-bottom:1px solid #dddddf;line-height:1.45;padding-top:.25em;padding-bottom:.25em;padding-left:.25em;color:rgba(0,0,0,.6);display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap}
#header .details span:first-child{margin-left:-.125em}
#header .details span.email a{color:rgba(0,0,0,.85)}
#header .details br{display:none}
#header .details br+span::before{content:"\00a0\2013\00a0"}
#header .details br+span.author::before{content:"\00a0\22c5\00a0";color:rgba(0,0,0,.85)}
#header .details br+span#revremark::before{content:"\00a0|\00a0"}
#header #revnumber{text-transform:capitalize}
#header #revnumber::after{content:"\00a0"}
#content>h1:first-child:not([class]){color:rgba(0,0,0,.85);border-bottom:1px solid #dddddf;padding-bottom:8px;margin-top:0;padding-top:1rem;margin-bottom:1.25rem}
#toc{border-bottom:1px solid #e7e7e9;padding-bottom:.5em}
#toc>ul{margin-left:.125em}
#toc ul.sectlevel0>li>a{font-style:italic}
#toc ul.sectlevel0 ul.sectlevel1{margin:.5em 0}
#toc ul{font-family:"Open Sans","DejaVu Sans",sans-serif;list-style-type:none}
#toc li{line-height:1.3334;margin-top:.3334em}
#toc a{text-decoration:none}
#toc a:active{text-decoration:underline}
#toctitle{color:#7a2518;font-size:1.2em}
@media screen and (min-width:768px){#toctitle{font-size:1.375em}
body.toc2{padding-left:15em;padding-right:0}
#toc.toc2{margin-top:0!important;background:#f8f8f7;position:fixed;width:15em;left:0;top:0;border-right:1px solid #e7e7e9;border-top-width:0!important;border-bottom-width:0!important;z-index:1000;padding:1.25em 1em;height:100%;overflow:auto}
#toc.toc2 #toctitle{margin-top:0;margin-bottom:.8rem;font-size:1.2em}
#toc.toc2>ul{font-size:.9em;margin-bottom:0}
#toc.toc2 ul ul{margin-left:0;padding-left:1em}
#toc.toc2 ul.sectlevel0 ul.sectlevel1{padding-left:0;margin-top:.5em;margin-bottom:.5em}
body.toc2.toc-right{padding-left:0;padding-right:15em}
body.toc2.toc-right #toc.toc2{border-right-width:0;border-left:1px solid #e7e7e9;left:auto;right:0}}
@media screen and (min-width:1280px){body.toc2{padding-left:20em;padding-right:0}
#toc.toc2{width:20em}
#toc.toc2 #toctitle{font-size:1.375em}
#toc.toc2>ul{font-size:.95em}
#toc.toc2 ul ul{padding-left:1.25em}
body.toc2.toc-right{padding-left:0;padding-right:20em}}
#content #toc{border-style:solid;border-width:1px;border-color:#e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;-webkit-border-radius:4px;border-radius:4px}
#content #toc>:first-child{margin-top:0}
#content #toc>:last-child{margin-bottom:0}
#footer{max-width:none;background:rgba(0,0,0,.8);padding:1.25em}
#footer-text{color:rgba(255,255,255,.8);line-height:1.44}
#content{margin-bottom:.625em}
.sect1{padding-bottom:.625em}
@media screen and (min-width:768px){#content{margin-bottom:1.25em}
.sect1{padding-bottom:1.25em}}
.sect1:last-child{padding-bottom:0}
.sect1+.sect1{border-top:1px solid #e7e7e9}
#content h1>a.anchor,h2>a.anchor,h3>a.anchor,#toctitle>a.anchor,.sidebarblock>.content>.title>a.anchor,h4>a.anchor,h5>a.anchor,h6>a.anchor{position:absolute;z-index:1001;width:1.5ex;margin-left:-1.5ex;display:block;text-decoration:none!important;visibility:hidden;text-align:center;font-weight:400}
#content h1>a.anchor::before,h2>a.anchor::before,h3>a.anchor::before,#toctitle>a.anchor::before,.sidebarblock>.content>.title>a.anchor::before,h4>a.anchor::before,h5>a.anchor::before,h6>a.anchor::before{content:"\00A7";font-size:.85em;display:block;padding-top:.1em}
#content h1:hover>a.anchor,#content h1>a.anchor:hover,h2:hover>a.anchor,h2>a.anchor:hover,h3:hover>a.anchor,#toctitle:hover>a.anchor,.sidebarblock>.content>.title:hover>a.anchor,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4:hover>a.anchor,h4>a.anchor:hover,h5:hover>a.anchor,h5>a.anchor:hover,h6:hover>a.anchor,h6>a.anchor:hover{visibility:visible}
#content h1>a.link,h2>a.link,h3>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h4>a.link,h5>a.link,h6>a.link{color:#ba3925;text-decoration:none}
#content h1>a.link:hover,h2>a.link:hover,h3>a.link:hover,#toctitle>a.link:hover,.sidebarblock>.content>.title>a.link:hover,h4>a.link:hover,h5>a.link:hover,h6>a.link:hover{color:#a53221}
details,.audioblock,.imageblock,.literalblock,.listingblock,.stemblock,.videoblock{margin-bottom:1.25em}
details>summary:first-of-type{cursor:pointer;display:list-item;outline:none;margin-bottom:.75em}
.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{text-rendering:optimizeLegibility;text-align:left;font-family:"Noto Serif","DejaVu Serif",serif;font-size:1rem;font-style:italic}
table.tableblock.fit-content>caption.title{white-space:nowrap;width:0}
.paragraph.lead>p,#preamble>.sectionbody>[class="paragraph"]:first-of-type p{font-size:1.21875em;line-height:1.6;color:rgba(0,0,0,.85)}
table.tableblock #preamble>.sectionbody>[class="paragraph"]:first-of-type p{font-size:inherit}
.admonitionblock>table{border-collapse:separate;border:0;background:none;width:100%}
.admonitionblock>table td.icon{text-align:center;width:80px}
.admonitionblock>table td.icon img{max-width:none}
.admonitionblock>table td.icon .title{font-weight:bold;font-family:"Open Sans","DejaVu Sans",sans-serif;text-transform:uppercase}
.admonitionblock>table td.content{padding-left:1.125em;padding-right:1.25em;border-left:1px solid #dddddf;color:rgba(0,0,0,.6);word-wrap:anywhere}
.admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0}
.exampleblock>.content{border-style:solid;border-width:1px;border-color:#e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#fff;-webkit-border-radius:4px;border-radius:4px}
.exampleblock>.content>:first-child{margin-top:0}
.exampleblock>.content>:last-child{margin-bottom:0}
.sidebarblock{border-style:solid;border-width:1px;border-color:#dbdbd6;margin-bottom:1.25em;padding:1.25em;background:#f3f3f2;-webkit-border-radius:4px;border-radius:4px}
.sidebarblock>:first-child{margin-top:0}
.sidebarblock>:last-child{margin-bottom:0}
.sidebarblock>.content>.title{color:#7a2518;margin-top:0;text-align:center}
.exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0}
.literalblock pre,.listingblock>.content>pre{-webkit-border-radius:4px;border-radius:4px;overflow-x:auto;padding:1em;font-size:.8125em}
@media screen and (min-width:768px){.literalblock pre,.listingblock>.content>pre{font-size:.90625em}}
@media screen and (min-width:1280px){.literalblock pre,.listingblock>.content>pre{font-size:1em}}
.literalblock pre,.listingblock>.content>pre:not(.highlight),.listingblock>.content>pre[class="highlight"],.listingblock>.content>pre[class^="highlight "]{background:#f7f7f8}
.literalblock.output pre{color:#f7f7f8;background:rgba(0,0,0,.9)}
.listingblock>.content{position:relative}
.listingblock code[data-lang]::before{display:none;content:attr(data-lang);position:absolute;font-size:.75em;top:.425rem;right:.5rem;line-height:1;text-transform:uppercase;color:inherit;opacity:.5}
.listingblock:hover code[data-lang]::before{display:block}
.listingblock.terminal pre .command::before{content:attr(data-prompt);padding-right:.5em;color:inherit;opacity:.5}
.listingblock.terminal pre .command:not([data-prompt])::before{content:"$"}
.listingblock pre.highlightjs{padding:0}
.listingblock pre.highlightjs>code{padding:1em;-webkit-border-radius:4px;border-radius:4px}
.listingblock pre.prettyprint{border-width:0}
.prettyprint{background:#f7f7f8}
pre.prettyprint .linenums{line-height:1.45;margin-left:2em}
pre.prettyprint li{background:none;list-style-type:inherit;padding-left:0}
pre.prettyprint li code[data-lang]::before{opacity:1}
pre.prettyprint li:not(:first-child) code[data-lang]::before{display:none}
table.linenotable{border-collapse:separate;border:0;margin-bottom:0;background:none}
table.linenotable td[class]{color:inherit;vertical-align:top;padding:0;line-height:inherit;white-space:normal}
table.linenotable td.code{padding-left:.75em}
table.linenotable td.linenos{border-right:1px solid currentColor;opacity:.35;padding-right:.5em}
pre.pygments .lineno{border-right:1px solid currentColor;opacity:.35;display:inline-block;margin-right:.75em}
pre.pygments .lineno::before{content:"";margin-right:-.125em}
.quoteblock{margin:0 1em 1.25em 1.5em;display:table}
.quoteblock:not(.excerpt)>.title{margin-left:-1.5em;margin-bottom:.75em}
.quoteblock blockquote,.quoteblock p{color:rgba(0,0,0,.85);font-size:1.15rem;line-height:1.75;word-spacing:.1em;letter-spacing:0;font-style:italic;text-align:justify}
.quoteblock blockquote{margin:0;padding:0;border:0}
.quoteblock blockquote::before{content:"\201c";float:left;font-size:2.75em;font-weight:bold;line-height:.6em;margin-left:-.6em;color:#7a2518;text-shadow:0 1px 2px rgba(0,0,0,.1)}
.quoteblock blockquote>.paragraph:last-child p{margin-bottom:0}
.quoteblock .attribution{margin-top:.75em;margin-right:.5ex;text-align:right}
.verseblock{margin:0 1em 1.25em}
.verseblock pre{font-family:"Open Sans","DejaVu Sans",sans;font-size:1.15rem;color:rgba(0,0,0,.85);font-weight:300;text-rendering:optimizeLegibility}
.verseblock pre strong{font-weight:400}
.verseblock .attribution{margin-top:1.25rem;margin-left:.5ex}
.quoteblock .attribution,.verseblock .attribution{font-size:.9375em;line-height:1.45;font-style:italic}
.quoteblock .attribution br,.verseblock .attribution br{display:none}
.quoteblock .attribution cite,.verseblock .attribution cite{display:block;letter-spacing:-.025em;color:rgba(0,0,0,.6)}
.quoteblock.abstract blockquote::before,.quoteblock.excerpt blockquote::before,.quoteblock .quoteblock blockquote::before{display:none}
.quoteblock.abstract blockquote,.quoteblock.abstract p,.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{line-height:1.6;word-spacing:0}
.quoteblock.abstract{margin:0 1em 1.25em;display:block}
.quoteblock.abstract>.title{margin:0 0 .375em;font-size:1.15em;text-align:center}
.quoteblock.excerpt>blockquote,.quoteblock .quoteblock{padding:0 0 .25em 1em;border-left:.25em solid #dddddf}
.quoteblock.excerpt,.quoteblock .quoteblock{margin-left:0}
.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{color:inherit;font-size:1.0625rem}
.quoteblock.excerpt .attribution,.quoteblock .quoteblock .attribution{color:inherit;text-align:left;margin-right:0}
p.tableblock:last-child{margin-bottom:0}
td.tableblock>.content{margin-bottom:1.25em;word-wrap:anywhere}
td.tableblock>.content>:last-child{margin-bottom:-1.25em}
table.tableblock,th.tableblock,td.tableblock{border:0 solid #dedede}
table.grid-all>*>tr>*{border-width:1px}
table.grid-cols>*>tr>*{border-width:0 1px}
table.grid-rows>*>tr>*{border-width:1px 0}
table.frame-all{border-width:1px}
table.frame-ends{border-width:1px 0}
table.frame-sides{border-width:0 1px}
table.frame-none>colgroup+*>:first-child>*,table.frame-sides>colgroup+*>:first-child>*{border-top-width:0}
table.frame-none>:last-child>:last-child>*,table.frame-sides>:last-child>:last-child>*{border-bottom-width:0}
table.frame-none>*>tr>:first-child,table.frame-ends>*>tr>:first-child{border-left-width:0}
table.frame-none>*>tr>:last-child,table.frame-ends>*>tr>:last-child{border-right-width:0}
table.stripes-all tr,table.stripes-odd tr:nth-of-type(odd),table.stripes-even tr:nth-of-type(even),table.stripes-hover tr:hover{background:#f8f8f7}
th.halign-left,td.halign-left{text-align:left}
th.halign-right,td.halign-right{text-align:right}
th.halign-center,td.halign-center{text-align:center}
th.valign-top,td.valign-top{vertical-align:top}
th.valign-bottom,td.valign-bottom{vertical-align:bottom}
th.valign-middle,td.valign-middle{vertical-align:middle}
table thead th,table tfoot th{font-weight:bold}
tbody tr th{background:#f7f8f7}
tbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{color:rgba(0,0,0,.8);font-weight:bold}
p.tableblock>code:only-child{background:none;padding:0}
p.tableblock{font-size:1em}
ol{margin-left:1.75em}
ul li ol{margin-left:1.5em}
dl dd{margin-left:1.125em}
dl dd:last-child,dl dd:last-child>:last-child{margin-bottom:0}
ol>li p,ul>li p,ul dd,ol dd,.olist .olist,.ulist .ulist,.ulist .olist,.olist .ulist{margin-bottom:.625em}
ul.checklist,ul.none,ol.none,ul.no-bullet,ol.no-bullet,ol.unnumbered,ul.unstyled,ol.unstyled{list-style-type:none}
ul.no-bullet,ol.no-bullet,ol.unnumbered{margin-left:.625em}
ul.unstyled,ol.unstyled{margin-left:0}
ul.checklist{margin-left:.625em}
ul.checklist li>p:first-child>.fa-square-o:first-child,ul.checklist li>p:first-child>.fa-check-square-o:first-child{width:1.25em;font-size:.8em;position:relative;bottom:.125em}
ul.checklist li>p:first-child>input[type="checkbox"]:first-child{margin-right:.25em}
ul.inline{display:-ms-flexbox;display:-webkit-box;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap;list-style:none;margin:0 0 .625em -1.25em}
ul.inline>li{margin-left:1.25em}
.unstyled dl dt{font-weight:400;font-style:normal}
ol.arabic{list-style-type:decimal}
ol.decimal{list-style-type:decimal-leading-zero}
ol.loweralpha{list-style-type:lower-alpha}
ol.upperalpha{list-style-type:upper-alpha}
ol.lowerroman{list-style-type:lower-roman}
ol.upperroman{list-style-type:upper-roman}
ol.lowergreek{list-style-type:lower-greek}
.hdlist>table,.colist>table{border:0;background:none}
.hdlist>table>tbody>tr,.colist>table>tbody>tr{background:none}
td.hdlist1,td.hdlist2{vertical-align:top;padding:0 .625em}
td.hdlist1{font-weight:bold;padding-bottom:1.25em}
td.hdlist2{word-wrap:anywhere}
.literalblock+.colist,.listingblock+.colist{margin-top:-.5em}
.colist td:not([class]):first-child{padding:.4em .75em 0;line-height:1;vertical-align:top}
.colist td:not([class]):first-child img{max-width:none}
.colist td:not([class]):last-child{padding:.25em 0}
.thumb,.th{line-height:0;display:inline-block;border:solid 4px #fff;-webkit-box-shadow:0 0 0 1px #ddd;box-shadow:0 0 0 1px #ddd}
.imageblock.left{margin:.25em .625em 1.25em 0}
.imageblock.right{margin:.25em 0 1.25em .625em}
.imageblock>.title{margin-bottom:0}
.imageblock.thumb,.imageblock.th{border-width:6px}
.imageblock.thumb>.title,.imageblock.th>.title{padding:0 .125em}
.image.left,.image.right{margin-top:.25em;margin-bottom:.25em;display:inline-block;line-height:0}
.image.left{margin-right:.625em}
.image.right{margin-left:.625em}
a.image{text-decoration:none;display:inline-block}
a.image object{pointer-events:none}
sup.footnote,sup.footnoteref{font-size:.875em;position:static;vertical-align:super}
sup.footnote a,sup.footnoteref a{text-decoration:none}
sup.footnote a:active,sup.footnoteref a:active{text-decoration:underline}
#footnotes{padding-top:.75em;padding-bottom:.75em;margin-bottom:.625em}
#footnotes hr{width:20%;min-width:6.25em;margin:-.25em 0 .75em;border-width:1px 0 0}
#footnotes .footnote{padding:0 .375em 0 .225em;line-height:1.3334;font-size:.875em;margin-left:1.2em;margin-bottom:.2em}
#footnotes .footnote a:first-of-type{font-weight:bold;text-decoration:none;margin-left:-1.05em}
#footnotes .footnote:last-of-type{margin-bottom:0}
#content #footnotes{margin-top:-.625em;margin-bottom:0;padding:.75em 0}
.gist .file-data>table{border:0;background:#fff;width:100%;margin-bottom:0}
.gist .file-data>table td.line-data{width:99%}
div.unbreakable{page-break-inside:avoid}
.big{font-size:larger}
.small{font-size:smaller}
.underline{text-decoration:underline}
.overline{text-decoration:overline}
.line-through{text-decoration:line-through}
.aqua{color:#00bfbf}
.aqua-background{background:#00fafa}
.black{color:#000}
.black-background{background:#000}
.blue{color:#0000bf}
.blue-background{background:#0000fa}
.fuchsia{color:#bf00bf}
.fuchsia-background{background:#fa00fa}
.gray{color:#606060}
.gray-background{background:#7d7d7d}
.green{color:#006000}
.green-background{background:#007d00}
.lime{color:#00bf00}
.lime-background{background:#00fa00}
.maroon{color:#600000}
.maroon-background{background:#7d0000}
.navy{color:#000060}
.navy-background{background:#00007d}
.olive{color:#606000}
.olive-background{background:#7d7d00}
.purple{color:#600060}
.purple-background{background:#7d007d}
.red{color:#bf0000}
.red-background{background:#fa0000}
.silver{color:#909090}
.silver-background{background:#bcbcbc}
.teal{color:#006060}
.teal-background{background:#007d7d}
.white{color:#bfbfbf}
.white-background{background:#fafafa}
.yellow{color:#bfbf00}
.yellow-background{background:#fafa00}
span.icon>.fa{cursor:default}
a span.icon>.fa{cursor:inherit}
.admonitionblock td.icon [class^="fa icon-"]{font-size:2.5em;text-shadow:1px 1px 2px rgba(0,0,0,.5);cursor:default}
.admonitionblock td.icon .icon-note::before{content:"\f05a";color:#19407c}
.admonitionblock td.icon .icon-tip::before{content:"\f0eb";text-shadow:1px 1px 2px rgba(155,155,0,.8);color:#111}
.admonitionblock td.icon .icon-warning::before{content:"\f071";color:#bf6900}
.admonitionblock td.icon .icon-caution::before{content:"\f06d";color:#bf3400}
.admonitionblock td.icon .icon-important::before{content:"\f06a";color:#bf0000}
.conum[data-value]{display:inline-block;color:#fff!important;background:rgba(0,0,0,.8);-webkit-border-radius:50%;border-radius:50%;text-align:center;font-size:.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans","DejaVu Sans",sans-serif;font-style:normal;font-weight:bold}
.conum[data-value] *{color:#fff!important}
.conum[data-value]+b{display:none}
.conum[data-value]::after{content:attr(data-value)}
pre .conum[data-value]{position:relative;top:-.125em}
b.conum *{color:inherit!important}
.conum:not([data-value]):empty{display:none}
dt,th.tableblock,td.content,div.footnote{text-rendering:optimizeLegibility}
h1,h2,p,td.content,span.alt{letter-spacing:-.01em}
p strong,td.content strong,div.footnote strong{letter-spacing:-.005em}
p,blockquote,dt,td.content,span.alt{font-size:1.0625rem}
p{margin-bottom:1.25rem}
.sidebarblock p,.sidebarblock dt,.sidebarblock td.content,p.tableblock{font-size:1em}
.exampleblock>.content{background:#fffef7;border-color:#e0e0dc;-webkit-box-shadow:0 1px 4px #e0e0dc;box-shadow:0 1px 4px #e0e0dc}
.print-only{display:none!important}
@page{margin:1.25cm .75cm}
@media print{*{-webkit-box-shadow:none!important;box-shadow:none!important;text-shadow:none!important}
html{font-size:80%}
a{color:inherit!important;text-decoration:underline!important}
a.bare,a[href^="#"],a[href^="mailto:"]{text-decoration:none!important}
a[href^="http:"]:not(.bare)::after,a[href^="https:"]:not(.bare)::after{content:"(" attr(href) ")";display:inline-block;font-size:.875em;padding-left:.25em}
abbr[title]::after{content:" (" attr(title) ")"}
pre,blockquote,tr,img,object,svg{page-break-inside:avoid}
thead{display:table-header-group}
svg{max-width:100%}
p,blockquote,dt,td.content{font-size:1em;orphans:3;widows:3}
h2,h3,#toctitle,.sidebarblock>.content>.title{page-break-after:avoid}
#header,#content,#footnotes,#footer{max-width:none}
#toc,.sidebarblock,.exampleblock>.content{background:none!important}
#toc{border-bottom:1px solid #dddddf!important;padding-bottom:0!important}
body.book #header{text-align:center}
body.book #header>h1:first-child{border:0!important;margin:2.5em 0 1em}
body.book #header .details{border:0!important;display:block;padding:0!important}
body.book #header .details span:first-child{margin-left:0!important}
body.book #header .details br{display:block}
body.book #header .details br+span::before{content:none!important}
body.book #toc{border:0!important;text-align:left!important;padding:0!important;margin:0!important}
body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-break-before:always}
.listingblock code[data-lang]::before{display:block}
#footer{padding:0 .9375em}
.hide-on-print{display:none!important}
.print-only{display:block!important}
.hide-for-print{display:none!important}
.show-for-print{display:inherit!important}}
@media print,amzn-kf8{#header>h1:first-child{margin-top:1.25rem}
.sect1{padding:0!important}
.sect1+.sect1{border:0}
#footer{background:none}
#footer-text{color:rgba(0,0,0,.6);font-size:.9em}}
@media amzn-kf8{#header,#content,#footnotes,#footer{padding:0}}
</style>
</head>
<body class="article">
<div id="header">
</div>
<div id="content">
<div class="paragraph">
<p>Shared naming conventions allow teams to collaborate efficiently. This rule checks that all function names match a provided regular expression.</p>
</div>
@ -472,11 +28,3 @@ ENDMETHOD.</pre>
</div>
</div>
</div>
</div>
<div id="footer">
<div id="footer-text">
Last updated 2021-01-28 17:34:39 +0100
</div>
</div>
</body>
</html>

View File

@ -0,0 +1,26 @@
<div class="paragraph">
<p>Shared naming conventions allow teams to collaborate efficiently. This rule checks that all function names match a provided regular expression.</p>
</div>
<div class="sect1">
<h2 id="_noncompliant_code_example">Noncompliant Code Example</h2>
<div class="sectionbody">
<div class="paragraph">
<p>With provided regular expression <code>^[a-z][a-zA-Z0-9_]*$</code>:</p>
</div>
<div class="listingblock">
<div class="content">
<pre>public void DoSomething(){...}</pre>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_compliant_solution">Compliant Solution</h2>
<div class="sectionbody">
<div class="listingblock">
<div class="content">
<pre>public void doSomething(){...}</pre>
</div>
</div>
</div>
</div>

View File

@ -13,3 +13,25 @@ void DoSomething (void);
----
void doSomething (void);
----
=== Parameters
.format
****
_STRING_
----
^([A-Z0-9_]*|[a-z0-9_]*)$
----
Regular expression used to check the [method|function|subroutine] names against
****
.param2
****
----
42
----
Some integer
****

View File

@ -1,4 +1,3 @@
<body>
<div class="paragraph">
<p>Shared naming conventions allow teams to collaborate efficiently. This rule checks that all function names match a provided regular expression.</p>
</div>
@ -23,6 +22,37 @@
<pre>void doSomething (void);</pre>
</div>
</div>
<div class="sect2">
<h3 id="_parameters">Parameters</h3>
<div class="sidebarblock">
<div class="content">
<div class="title">format</div>
<div class="paragraph">
<p><em>STRING</em></p>
</div>
<div class="listingblock">
<div class="content">
<pre>^([A-Z0-9_]*|[a-z0-9_]*)$</pre>
</div>
</div>
<div class="paragraph">
<p>Regular expression used to check the [method|function|subroutine] names against</p>
</div>
</div>
</div>
<div class="sidebarblock">
<div class="content">
<div class="title">param2</div>
<div class="listingblock">
<div class="content">
<pre>42</pre>
</div>
</div>
<div class="paragraph">
<p>Some integer</p>
</div>
</div>
</div>
</div>
</div>
</div>
</body>

View File

@ -0,0 +1,58 @@
<div class="paragraph">
<p>Shared naming conventions allow teams to collaborate efficiently. This rule checks whether or not method and property names are PascalCased. To reduce noise, two consecutive upper case characters are allowed unless they form the whole name. So, <code>MyXMethod</code> is compliant, but <code>XM</code> on its own is not.</p>
</div>
<div class="sect1">
<h2 id="_noncompliant_code_example">Noncompliant Code Example</h2>
<div class="sectionbody">
<div class="listingblock">
<div class="content">
<pre>public int doSomething() {...}</pre>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_compliant_solution">Compliant Solution</h2>
<div class="sectionbody">
<div class="listingblock">
<div class="content">
<pre>public int DoSomething() {...}</pre>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_exceptions">Exceptions</h2>
<div class="sectionbody">
<div class="ulist">
<ul>
<li>
<p>The rule ignores members in types that are marked with <code>ComImportAttribute</code> or <code>InterfaceTypeAttribute</code>.</p>
</li>
<li>
<p>The rule ignores <code>extern</code> methods.</p>
</li>
<li>
<p>The rule allows for two-letter acronyms in which both letters are capitalized, as shown in the following identifier: <code>ExecuteOnUIThread</code>.</p>
</li>
<li>
<p>Furthermore, when <code>'_'</code> character is found in a name, the camel casing is not enforced.</p>
</li>
</ul>
</div>
<div class="listingblock">
<div class="content">
<pre>void My_method(){...} // valid
void My_method_(){...} // invalid, leading and trailing underscores are reported</pre>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_see">See</h2>
<div class="sectionbody">
<div class="paragraph">
<p><a href="https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/capitalization-conventions">Microsoft Capitalization Conventions</a></p>
</div>
</div>
</div>

View File

@ -0,0 +1,26 @@
<div class="paragraph">
<p>Shared naming conventions allow teams to collaborate efficiently. This rule checks that all function names match a provided regular expression.</p>
</div>
<div class="sect1">
<h2 id="_noncompliant_code_example">Noncompliant Code Example</h2>
<div class="sectionbody">
<div class="paragraph">
<p>With default provided regular expression: ^[a-z][a-zA-Z0-9]*$</p>
</div>
<div class="listingblock">
<div class="content">
<pre>function DoSomething(){...}</pre>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_compliant_solution">Compliant Solution</h2>
<div class="sectionbody">
<div class="listingblock">
<div class="content">
<pre>function doSomething(){...}</pre>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,30 @@
<div class="paragraph">
<p>Shared naming conventions allow teams to collaborate efficiently. This rule checks that all function names match a provided regular expression.</p>
</div>
<div class="sect1">
<h2 id="_noncompliant_code_example">Noncompliant Code Example</h2>
<div class="sectionbody">
<div class="paragraph">
<p>With default provided regular expression: <code>^(_|[a-zA-Z0-9]+)$</code>:</p>
</div>
<div class="listingblock">
<div class="content">
<pre>func execute_all() {
...
}</pre>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_compliant_solution">Compliant Solution</h2>
<div class="sectionbody">
<div class="listingblock">
<div class="content">
<pre>func executeAll() {
...
}</pre>
</div>
</div>
</div>
</div>

View File

@ -1,447 +1,3 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="generator" content="Asciidoctor 2.0.12">
<title>Noncompliant Code Example</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700">
<style>
/* Asciidoctor default stylesheet | MIT License | https://asciidoctor.org */
/* Uncomment @import statement to use as custom stylesheet */
/*@import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700";*/
article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}
audio,video{display:inline-block}
audio:not([controls]){display:none;height:0}
html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}
a{background:none}
a:focus{outline:thin dotted}
a:active,a:hover{outline:0}
h1{font-size:2em;margin:.67em 0}
abbr[title]{border-bottom:1px dotted}
b,strong{font-weight:bold}
dfn{font-style:italic}
hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}
mark{background:#ff0;color:#000}
code,kbd,pre,samp{font-family:monospace;font-size:1em}
pre{white-space:pre-wrap}
q{quotes:"\201C" "\201D" "\2018" "\2019"}
small{font-size:80%}
sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}
sup{top:-.5em}
sub{bottom:-.25em}
img{border:0}
svg:not(:root){overflow:hidden}
figure{margin:0}
fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}
legend{border:0;padding:0}
button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}
button,input{line-height:normal}
button,select{text-transform:none}
button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}
button[disabled],html input[disabled]{cursor:default}
input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}
button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}
textarea{overflow:auto;vertical-align:top}
table{border-collapse:collapse;border-spacing:0}
*,*::before,*::after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
html,body{font-size:100%}
body{background:#fff;color:rgba(0,0,0,.8);padding:0;margin:0;font-family:"Noto Serif","DejaVu Serif",serif;font-weight:400;font-style:normal;line-height:1;position:relative;cursor:auto;tab-size:4;word-wrap:anywhere;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}
a:hover{cursor:pointer}
img,object,embed{max-width:100%;height:auto}
object,embed{height:100%}
img{-ms-interpolation-mode:bicubic}
.left{float:left!important}
.right{float:right!important}
.text-left{text-align:left!important}
.text-right{text-align:right!important}
.text-center{text-align:center!important}
.text-justify{text-align:justify!important}
.hide{display:none}
img,object,svg{display:inline-block;vertical-align:middle}
textarea{height:auto;min-height:50px}
select{width:100%}
.subheader,.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{line-height:1.45;color:#7a2518;font-weight:400;margin-top:0;margin-bottom:.25em}
div,dl,dt,dd,ul,ol,li,h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0}
a{color:#2156a5;text-decoration:underline;line-height:inherit}
a:hover,a:focus{color:#1d4b8f}
a img{border:0}
p{font-family:inherit;font-weight:400;font-size:1em;line-height:1.6;margin-bottom:1.25em;text-rendering:optimizeLegibility}
p aside{font-size:.875em;line-height:1.35;font-style:italic}
h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{font-family:"Open Sans","DejaVu Sans",sans-serif;font-weight:300;font-style:normal;color:#ba3925;text-rendering:optimizeLegibility;margin-top:1em;margin-bottom:.5em;line-height:1.0125em}
h1 small,h2 small,h3 small,#toctitle small,.sidebarblock>.content>.title small,h4 small,h5 small,h6 small{font-size:60%;color:#e99b8f;line-height:0}
h1{font-size:2.125em}
h2{font-size:1.6875em}
h3,#toctitle,.sidebarblock>.content>.title{font-size:1.375em}
h4,h5{font-size:1.125em}
h6{font-size:1em}
hr{border:solid #dddddf;border-width:1px 0 0;clear:both;margin:1.25em 0 1.1875em;height:0}
em,i{font-style:italic;line-height:inherit}
strong,b{font-weight:bold;line-height:inherit}
small{font-size:60%;line-height:inherit}
code{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;color:rgba(0,0,0,.9)}
ul,ol,dl{font-size:1em;line-height:1.6;margin-bottom:1.25em;list-style-position:outside;font-family:inherit}
ul,ol{margin-left:1.5em}
ul li ul,ul li ol{margin-left:1.25em;margin-bottom:0;font-size:1em}
ul.square li ul,ul.circle li ul,ul.disc li ul{list-style:inherit}
ul.square{list-style-type:square}
ul.circle{list-style-type:circle}
ul.disc{list-style-type:disc}
ol li ul,ol li ol{margin-left:1.25em;margin-bottom:0}
dl dt{margin-bottom:.3125em;font-weight:bold}
dl dd{margin-bottom:1.25em}
abbr,acronym{text-transform:uppercase;font-size:90%;color:rgba(0,0,0,.8);border-bottom:1px dotted #ddd;cursor:help}
abbr{text-transform:none}
blockquote{margin:0 0 1.25em;padding:.5625em 1.25em 0 1.1875em;border-left:1px solid #ddd}
blockquote cite{display:block;font-size:.9375em;color:rgba(0,0,0,.6)}
blockquote cite::before{content:"\2014 \0020"}
blockquote cite a,blockquote cite a:visited{color:rgba(0,0,0,.6)}
blockquote,blockquote p{line-height:1.6;color:rgba(0,0,0,.85)}
@media screen and (min-width:768px){h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2}
h1{font-size:2.75em}
h2{font-size:2.3125em}
h3,#toctitle,.sidebarblock>.content>.title{font-size:1.6875em}
h4{font-size:1.4375em}}
table{background:#fff;margin-bottom:1.25em;border:solid 1px #dedede;word-wrap:normal}
table thead,table tfoot{background:#f7f8f7}
table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:.5em .625em .625em;font-size:inherit;color:rgba(0,0,0,.8);text-align:left}
table tr th,table tr td{padding:.5625em .625em;font-size:inherit;color:rgba(0,0,0,.8)}
table tr.even,table tr.alt{background:#f8f8f7}
table thead tr th,table tfoot tr th,table tbody tr td,table tr td,table tfoot tr td{line-height:1.6}
h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2;word-spacing:-.05em}
h1 strong,h2 strong,h3 strong,#toctitle strong,.sidebarblock>.content>.title strong,h4 strong,h5 strong,h6 strong{font-weight:400}
.center{margin-left:auto;margin-right:auto}
.stretch{width:100%}
.clearfix::before,.clearfix::after,.float-group::before,.float-group::after{content:" ";display:table}
.clearfix::after,.float-group::after{clear:both}
:not(pre).nobreak{word-wrap:normal}
:not(pre).nowrap{white-space:nowrap}
:not(pre).pre-wrap{white-space:pre-wrap}
:not(pre):not([class^=L])>code{font-size:.9375em;font-style:normal!important;letter-spacing:0;padding:.1em .5ex;word-spacing:-.15em;background:#f7f7f8;-webkit-border-radius:4px;border-radius:4px;line-height:1.45;text-rendering:optimizeSpeed}
pre{color:rgba(0,0,0,.9);font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;line-height:1.45;text-rendering:optimizeSpeed}
pre code,pre pre{color:inherit;font-size:inherit;line-height:inherit}
pre>code{display:block}
pre.nowrap,pre.nowrap pre{white-space:pre;word-wrap:normal}
em em{font-style:normal}
strong strong{font-weight:400}
.keyseq{color:rgba(51,51,51,.8)}
kbd{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;display:inline-block;color:rgba(0,0,0,.8);font-size:.65em;line-height:1.45;background:#f7f7f7;border:1px solid #ccc;-webkit-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em white inset;box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em #fff inset;margin:0 .15em;padding:.2em .5em;vertical-align:middle;position:relative;top:-.1em;white-space:nowrap}
.keyseq kbd:first-child{margin-left:0}
.keyseq kbd:last-child{margin-right:0}
.menuseq,.menuref{color:#000}
.menuseq b:not(.caret),.menuref{font-weight:inherit}
.menuseq{word-spacing:-.02em}
.menuseq b.caret{font-size:1.25em;line-height:.8}
.menuseq i.caret{font-weight:bold;text-align:center;width:.45em}
b.button::before,b.button::after{position:relative;top:-1px;font-weight:400}
b.button::before{content:"[";padding:0 3px 0 2px}
b.button::after{content:"]";padding:0 2px 0 3px}
p a>code:hover{color:rgba(0,0,0,.9)}
#header,#content,#footnotes,#footer{width:100%;margin-left:auto;margin-right:auto;margin-top:0;margin-bottom:0;max-width:62.5em;*zoom:1;position:relative;padding-left:.9375em;padding-right:.9375em}
#header::before,#header::after,#content::before,#content::after,#footnotes::before,#footnotes::after,#footer::before,#footer::after{content:" ";display:table}
#header::after,#content::after,#footnotes::after,#footer::after{clear:both}
#content{margin-top:1.25em}
#content::before{content:none}
#header>h1:first-child{color:rgba(0,0,0,.85);margin-top:2.25rem;margin-bottom:0}
#header>h1:first-child+#toc{margin-top:8px;border-top:1px solid #dddddf}
#header>h1:only-child,body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #dddddf;padding-bottom:8px}
#header .details{border-bottom:1px solid #dddddf;line-height:1.45;padding-top:.25em;padding-bottom:.25em;padding-left:.25em;color:rgba(0,0,0,.6);display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap}
#header .details span:first-child{margin-left:-.125em}
#header .details span.email a{color:rgba(0,0,0,.85)}
#header .details br{display:none}
#header .details br+span::before{content:"\00a0\2013\00a0"}
#header .details br+span.author::before{content:"\00a0\22c5\00a0";color:rgba(0,0,0,.85)}
#header .details br+span#revremark::before{content:"\00a0|\00a0"}
#header #revnumber{text-transform:capitalize}
#header #revnumber::after{content:"\00a0"}
#content>h1:first-child:not([class]){color:rgba(0,0,0,.85);border-bottom:1px solid #dddddf;padding-bottom:8px;margin-top:0;padding-top:1rem;margin-bottom:1.25rem}
#toc{border-bottom:1px solid #e7e7e9;padding-bottom:.5em}
#toc>ul{margin-left:.125em}
#toc ul.sectlevel0>li>a{font-style:italic}
#toc ul.sectlevel0 ul.sectlevel1{margin:.5em 0}
#toc ul{font-family:"Open Sans","DejaVu Sans",sans-serif;list-style-type:none}
#toc li{line-height:1.3334;margin-top:.3334em}
#toc a{text-decoration:none}
#toc a:active{text-decoration:underline}
#toctitle{color:#7a2518;font-size:1.2em}
@media screen and (min-width:768px){#toctitle{font-size:1.375em}
body.toc2{padding-left:15em;padding-right:0}
#toc.toc2{margin-top:0!important;background:#f8f8f7;position:fixed;width:15em;left:0;top:0;border-right:1px solid #e7e7e9;border-top-width:0!important;border-bottom-width:0!important;z-index:1000;padding:1.25em 1em;height:100%;overflow:auto}
#toc.toc2 #toctitle{margin-top:0;margin-bottom:.8rem;font-size:1.2em}
#toc.toc2>ul{font-size:.9em;margin-bottom:0}
#toc.toc2 ul ul{margin-left:0;padding-left:1em}
#toc.toc2 ul.sectlevel0 ul.sectlevel1{padding-left:0;margin-top:.5em;margin-bottom:.5em}
body.toc2.toc-right{padding-left:0;padding-right:15em}
body.toc2.toc-right #toc.toc2{border-right-width:0;border-left:1px solid #e7e7e9;left:auto;right:0}}
@media screen and (min-width:1280px){body.toc2{padding-left:20em;padding-right:0}
#toc.toc2{width:20em}
#toc.toc2 #toctitle{font-size:1.375em}
#toc.toc2>ul{font-size:.95em}
#toc.toc2 ul ul{padding-left:1.25em}
body.toc2.toc-right{padding-left:0;padding-right:20em}}
#content #toc{border-style:solid;border-width:1px;border-color:#e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;-webkit-border-radius:4px;border-radius:4px}
#content #toc>:first-child{margin-top:0}
#content #toc>:last-child{margin-bottom:0}
#footer{max-width:none;background:rgba(0,0,0,.8);padding:1.25em}
#footer-text{color:rgba(255,255,255,.8);line-height:1.44}
#content{margin-bottom:.625em}
.sect1{padding-bottom:.625em}
@media screen and (min-width:768px){#content{margin-bottom:1.25em}
.sect1{padding-bottom:1.25em}}
.sect1:last-child{padding-bottom:0}
.sect1+.sect1{border-top:1px solid #e7e7e9}
#content h1>a.anchor,h2>a.anchor,h3>a.anchor,#toctitle>a.anchor,.sidebarblock>.content>.title>a.anchor,h4>a.anchor,h5>a.anchor,h6>a.anchor{position:absolute;z-index:1001;width:1.5ex;margin-left:-1.5ex;display:block;text-decoration:none!important;visibility:hidden;text-align:center;font-weight:400}
#content h1>a.anchor::before,h2>a.anchor::before,h3>a.anchor::before,#toctitle>a.anchor::before,.sidebarblock>.content>.title>a.anchor::before,h4>a.anchor::before,h5>a.anchor::before,h6>a.anchor::before{content:"\00A7";font-size:.85em;display:block;padding-top:.1em}
#content h1:hover>a.anchor,#content h1>a.anchor:hover,h2:hover>a.anchor,h2>a.anchor:hover,h3:hover>a.anchor,#toctitle:hover>a.anchor,.sidebarblock>.content>.title:hover>a.anchor,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4:hover>a.anchor,h4>a.anchor:hover,h5:hover>a.anchor,h5>a.anchor:hover,h6:hover>a.anchor,h6>a.anchor:hover{visibility:visible}
#content h1>a.link,h2>a.link,h3>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h4>a.link,h5>a.link,h6>a.link{color:#ba3925;text-decoration:none}
#content h1>a.link:hover,h2>a.link:hover,h3>a.link:hover,#toctitle>a.link:hover,.sidebarblock>.content>.title>a.link:hover,h4>a.link:hover,h5>a.link:hover,h6>a.link:hover{color:#a53221}
details,.audioblock,.imageblock,.literalblock,.listingblock,.stemblock,.videoblock{margin-bottom:1.25em}
details>summary:first-of-type{cursor:pointer;display:list-item;outline:none;margin-bottom:.75em}
.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{text-rendering:optimizeLegibility;text-align:left;font-family:"Noto Serif","DejaVu Serif",serif;font-size:1rem;font-style:italic}
table.tableblock.fit-content>caption.title{white-space:nowrap;width:0}
.paragraph.lead>p,#preamble>.sectionbody>[class="paragraph"]:first-of-type p{font-size:1.21875em;line-height:1.6;color:rgba(0,0,0,.85)}
table.tableblock #preamble>.sectionbody>[class="paragraph"]:first-of-type p{font-size:inherit}
.admonitionblock>table{border-collapse:separate;border:0;background:none;width:100%}
.admonitionblock>table td.icon{text-align:center;width:80px}
.admonitionblock>table td.icon img{max-width:none}
.admonitionblock>table td.icon .title{font-weight:bold;font-family:"Open Sans","DejaVu Sans",sans-serif;text-transform:uppercase}
.admonitionblock>table td.content{padding-left:1.125em;padding-right:1.25em;border-left:1px solid #dddddf;color:rgba(0,0,0,.6);word-wrap:anywhere}
.admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0}
.exampleblock>.content{border-style:solid;border-width:1px;border-color:#e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#fff;-webkit-border-radius:4px;border-radius:4px}
.exampleblock>.content>:first-child{margin-top:0}
.exampleblock>.content>:last-child{margin-bottom:0}
.sidebarblock{border-style:solid;border-width:1px;border-color:#dbdbd6;margin-bottom:1.25em;padding:1.25em;background:#f3f3f2;-webkit-border-radius:4px;border-radius:4px}
.sidebarblock>:first-child{margin-top:0}
.sidebarblock>:last-child{margin-bottom:0}
.sidebarblock>.content>.title{color:#7a2518;margin-top:0;text-align:center}
.exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0}
.literalblock pre,.listingblock>.content>pre{-webkit-border-radius:4px;border-radius:4px;overflow-x:auto;padding:1em;font-size:.8125em}
@media screen and (min-width:768px){.literalblock pre,.listingblock>.content>pre{font-size:.90625em}}
@media screen and (min-width:1280px){.literalblock pre,.listingblock>.content>pre{font-size:1em}}
.literalblock pre,.listingblock>.content>pre:not(.highlight),.listingblock>.content>pre[class="highlight"],.listingblock>.content>pre[class^="highlight "]{background:#f7f7f8}
.literalblock.output pre{color:#f7f7f8;background:rgba(0,0,0,.9)}
.listingblock>.content{position:relative}
.listingblock code[data-lang]::before{display:none;content:attr(data-lang);position:absolute;font-size:.75em;top:.425rem;right:.5rem;line-height:1;text-transform:uppercase;color:inherit;opacity:.5}
.listingblock:hover code[data-lang]::before{display:block}
.listingblock.terminal pre .command::before{content:attr(data-prompt);padding-right:.5em;color:inherit;opacity:.5}
.listingblock.terminal pre .command:not([data-prompt])::before{content:"$"}
.listingblock pre.highlightjs{padding:0}
.listingblock pre.highlightjs>code{padding:1em;-webkit-border-radius:4px;border-radius:4px}
.listingblock pre.prettyprint{border-width:0}
.prettyprint{background:#f7f7f8}
pre.prettyprint .linenums{line-height:1.45;margin-left:2em}
pre.prettyprint li{background:none;list-style-type:inherit;padding-left:0}
pre.prettyprint li code[data-lang]::before{opacity:1}
pre.prettyprint li:not(:first-child) code[data-lang]::before{display:none}
table.linenotable{border-collapse:separate;border:0;margin-bottom:0;background:none}
table.linenotable td[class]{color:inherit;vertical-align:top;padding:0;line-height:inherit;white-space:normal}
table.linenotable td.code{padding-left:.75em}
table.linenotable td.linenos{border-right:1px solid currentColor;opacity:.35;padding-right:.5em}
pre.pygments .lineno{border-right:1px solid currentColor;opacity:.35;display:inline-block;margin-right:.75em}
pre.pygments .lineno::before{content:"";margin-right:-.125em}
.quoteblock{margin:0 1em 1.25em 1.5em;display:table}
.quoteblock:not(.excerpt)>.title{margin-left:-1.5em;margin-bottom:.75em}
.quoteblock blockquote,.quoteblock p{color:rgba(0,0,0,.85);font-size:1.15rem;line-height:1.75;word-spacing:.1em;letter-spacing:0;font-style:italic;text-align:justify}
.quoteblock blockquote{margin:0;padding:0;border:0}
.quoteblock blockquote::before{content:"\201c";float:left;font-size:2.75em;font-weight:bold;line-height:.6em;margin-left:-.6em;color:#7a2518;text-shadow:0 1px 2px rgba(0,0,0,.1)}
.quoteblock blockquote>.paragraph:last-child p{margin-bottom:0}
.quoteblock .attribution{margin-top:.75em;margin-right:.5ex;text-align:right}
.verseblock{margin:0 1em 1.25em}
.verseblock pre{font-family:"Open Sans","DejaVu Sans",sans;font-size:1.15rem;color:rgba(0,0,0,.85);font-weight:300;text-rendering:optimizeLegibility}
.verseblock pre strong{font-weight:400}
.verseblock .attribution{margin-top:1.25rem;margin-left:.5ex}
.quoteblock .attribution,.verseblock .attribution{font-size:.9375em;line-height:1.45;font-style:italic}
.quoteblock .attribution br,.verseblock .attribution br{display:none}
.quoteblock .attribution cite,.verseblock .attribution cite{display:block;letter-spacing:-.025em;color:rgba(0,0,0,.6)}
.quoteblock.abstract blockquote::before,.quoteblock.excerpt blockquote::before,.quoteblock .quoteblock blockquote::before{display:none}
.quoteblock.abstract blockquote,.quoteblock.abstract p,.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{line-height:1.6;word-spacing:0}
.quoteblock.abstract{margin:0 1em 1.25em;display:block}
.quoteblock.abstract>.title{margin:0 0 .375em;font-size:1.15em;text-align:center}
.quoteblock.excerpt>blockquote,.quoteblock .quoteblock{padding:0 0 .25em 1em;border-left:.25em solid #dddddf}
.quoteblock.excerpt,.quoteblock .quoteblock{margin-left:0}
.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{color:inherit;font-size:1.0625rem}
.quoteblock.excerpt .attribution,.quoteblock .quoteblock .attribution{color:inherit;text-align:left;margin-right:0}
p.tableblock:last-child{margin-bottom:0}
td.tableblock>.content{margin-bottom:1.25em;word-wrap:anywhere}
td.tableblock>.content>:last-child{margin-bottom:-1.25em}
table.tableblock,th.tableblock,td.tableblock{border:0 solid #dedede}
table.grid-all>*>tr>*{border-width:1px}
table.grid-cols>*>tr>*{border-width:0 1px}
table.grid-rows>*>tr>*{border-width:1px 0}
table.frame-all{border-width:1px}
table.frame-ends{border-width:1px 0}
table.frame-sides{border-width:0 1px}
table.frame-none>colgroup+*>:first-child>*,table.frame-sides>colgroup+*>:first-child>*{border-top-width:0}
table.frame-none>:last-child>:last-child>*,table.frame-sides>:last-child>:last-child>*{border-bottom-width:0}
table.frame-none>*>tr>:first-child,table.frame-ends>*>tr>:first-child{border-left-width:0}
table.frame-none>*>tr>:last-child,table.frame-ends>*>tr>:last-child{border-right-width:0}
table.stripes-all tr,table.stripes-odd tr:nth-of-type(odd),table.stripes-even tr:nth-of-type(even),table.stripes-hover tr:hover{background:#f8f8f7}
th.halign-left,td.halign-left{text-align:left}
th.halign-right,td.halign-right{text-align:right}
th.halign-center,td.halign-center{text-align:center}
th.valign-top,td.valign-top{vertical-align:top}
th.valign-bottom,td.valign-bottom{vertical-align:bottom}
th.valign-middle,td.valign-middle{vertical-align:middle}
table thead th,table tfoot th{font-weight:bold}
tbody tr th{background:#f7f8f7}
tbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{color:rgba(0,0,0,.8);font-weight:bold}
p.tableblock>code:only-child{background:none;padding:0}
p.tableblock{font-size:1em}
ol{margin-left:1.75em}
ul li ol{margin-left:1.5em}
dl dd{margin-left:1.125em}
dl dd:last-child,dl dd:last-child>:last-child{margin-bottom:0}
ol>li p,ul>li p,ul dd,ol dd,.olist .olist,.ulist .ulist,.ulist .olist,.olist .ulist{margin-bottom:.625em}
ul.checklist,ul.none,ol.none,ul.no-bullet,ol.no-bullet,ol.unnumbered,ul.unstyled,ol.unstyled{list-style-type:none}
ul.no-bullet,ol.no-bullet,ol.unnumbered{margin-left:.625em}
ul.unstyled,ol.unstyled{margin-left:0}
ul.checklist{margin-left:.625em}
ul.checklist li>p:first-child>.fa-square-o:first-child,ul.checklist li>p:first-child>.fa-check-square-o:first-child{width:1.25em;font-size:.8em;position:relative;bottom:.125em}
ul.checklist li>p:first-child>input[type="checkbox"]:first-child{margin-right:.25em}
ul.inline{display:-ms-flexbox;display:-webkit-box;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap;list-style:none;margin:0 0 .625em -1.25em}
ul.inline>li{margin-left:1.25em}
.unstyled dl dt{font-weight:400;font-style:normal}
ol.arabic{list-style-type:decimal}
ol.decimal{list-style-type:decimal-leading-zero}
ol.loweralpha{list-style-type:lower-alpha}
ol.upperalpha{list-style-type:upper-alpha}
ol.lowerroman{list-style-type:lower-roman}
ol.upperroman{list-style-type:upper-roman}
ol.lowergreek{list-style-type:lower-greek}
.hdlist>table,.colist>table{border:0;background:none}
.hdlist>table>tbody>tr,.colist>table>tbody>tr{background:none}
td.hdlist1,td.hdlist2{vertical-align:top;padding:0 .625em}
td.hdlist1{font-weight:bold;padding-bottom:1.25em}
td.hdlist2{word-wrap:anywhere}
.literalblock+.colist,.listingblock+.colist{margin-top:-.5em}
.colist td:not([class]):first-child{padding:.4em .75em 0;line-height:1;vertical-align:top}
.colist td:not([class]):first-child img{max-width:none}
.colist td:not([class]):last-child{padding:.25em 0}
.thumb,.th{line-height:0;display:inline-block;border:solid 4px #fff;-webkit-box-shadow:0 0 0 1px #ddd;box-shadow:0 0 0 1px #ddd}
.imageblock.left{margin:.25em .625em 1.25em 0}
.imageblock.right{margin:.25em 0 1.25em .625em}
.imageblock>.title{margin-bottom:0}
.imageblock.thumb,.imageblock.th{border-width:6px}
.imageblock.thumb>.title,.imageblock.th>.title{padding:0 .125em}
.image.left,.image.right{margin-top:.25em;margin-bottom:.25em;display:inline-block;line-height:0}
.image.left{margin-right:.625em}
.image.right{margin-left:.625em}
a.image{text-decoration:none;display:inline-block}
a.image object{pointer-events:none}
sup.footnote,sup.footnoteref{font-size:.875em;position:static;vertical-align:super}
sup.footnote a,sup.footnoteref a{text-decoration:none}
sup.footnote a:active,sup.footnoteref a:active{text-decoration:underline}
#footnotes{padding-top:.75em;padding-bottom:.75em;margin-bottom:.625em}
#footnotes hr{width:20%;min-width:6.25em;margin:-.25em 0 .75em;border-width:1px 0 0}
#footnotes .footnote{padding:0 .375em 0 .225em;line-height:1.3334;font-size:.875em;margin-left:1.2em;margin-bottom:.2em}
#footnotes .footnote a:first-of-type{font-weight:bold;text-decoration:none;margin-left:-1.05em}
#footnotes .footnote:last-of-type{margin-bottom:0}
#content #footnotes{margin-top:-.625em;margin-bottom:0;padding:.75em 0}
.gist .file-data>table{border:0;background:#fff;width:100%;margin-bottom:0}
.gist .file-data>table td.line-data{width:99%}
div.unbreakable{page-break-inside:avoid}
.big{font-size:larger}
.small{font-size:smaller}
.underline{text-decoration:underline}
.overline{text-decoration:overline}
.line-through{text-decoration:line-through}
.aqua{color:#00bfbf}
.aqua-background{background:#00fafa}
.black{color:#000}
.black-background{background:#000}
.blue{color:#0000bf}
.blue-background{background:#0000fa}
.fuchsia{color:#bf00bf}
.fuchsia-background{background:#fa00fa}
.gray{color:#606060}
.gray-background{background:#7d7d7d}
.green{color:#006000}
.green-background{background:#007d00}
.lime{color:#00bf00}
.lime-background{background:#00fa00}
.maroon{color:#600000}
.maroon-background{background:#7d0000}
.navy{color:#000060}
.navy-background{background:#00007d}
.olive{color:#606000}
.olive-background{background:#7d7d00}
.purple{color:#600060}
.purple-background{background:#7d007d}
.red{color:#bf0000}
.red-background{background:#fa0000}
.silver{color:#909090}
.silver-background{background:#bcbcbc}
.teal{color:#006060}
.teal-background{background:#007d7d}
.white{color:#bfbfbf}
.white-background{background:#fafafa}
.yellow{color:#bfbf00}
.yellow-background{background:#fafa00}
span.icon>.fa{cursor:default}
a span.icon>.fa{cursor:inherit}
.admonitionblock td.icon [class^="fa icon-"]{font-size:2.5em;text-shadow:1px 1px 2px rgba(0,0,0,.5);cursor:default}
.admonitionblock td.icon .icon-note::before{content:"\f05a";color:#19407c}
.admonitionblock td.icon .icon-tip::before{content:"\f0eb";text-shadow:1px 1px 2px rgba(155,155,0,.8);color:#111}
.admonitionblock td.icon .icon-warning::before{content:"\f071";color:#bf6900}
.admonitionblock td.icon .icon-caution::before{content:"\f06d";color:#bf3400}
.admonitionblock td.icon .icon-important::before{content:"\f06a";color:#bf0000}
.conum[data-value]{display:inline-block;color:#fff!important;background:rgba(0,0,0,.8);-webkit-border-radius:50%;border-radius:50%;text-align:center;font-size:.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans","DejaVu Sans",sans-serif;font-style:normal;font-weight:bold}
.conum[data-value] *{color:#fff!important}
.conum[data-value]+b{display:none}
.conum[data-value]::after{content:attr(data-value)}
pre .conum[data-value]{position:relative;top:-.125em}
b.conum *{color:inherit!important}
.conum:not([data-value]):empty{display:none}
dt,th.tableblock,td.content,div.footnote{text-rendering:optimizeLegibility}
h1,h2,p,td.content,span.alt{letter-spacing:-.01em}
p strong,td.content strong,div.footnote strong{letter-spacing:-.005em}
p,blockquote,dt,td.content,span.alt{font-size:1.0625rem}
p{margin-bottom:1.25rem}
.sidebarblock p,.sidebarblock dt,.sidebarblock td.content,p.tableblock{font-size:1em}
.exampleblock>.content{background:#fffef7;border-color:#e0e0dc;-webkit-box-shadow:0 1px 4px #e0e0dc;box-shadow:0 1px 4px #e0e0dc}
.print-only{display:none!important}
@page{margin:1.25cm .75cm}
@media print{*{-webkit-box-shadow:none!important;box-shadow:none!important;text-shadow:none!important}
html{font-size:80%}
a{color:inherit!important;text-decoration:underline!important}
a.bare,a[href^="#"],a[href^="mailto:"]{text-decoration:none!important}
a[href^="http:"]:not(.bare)::after,a[href^="https:"]:not(.bare)::after{content:"(" attr(href) ")";display:inline-block;font-size:.875em;padding-left:.25em}
abbr[title]::after{content:" (" attr(title) ")"}
pre,blockquote,tr,img,object,svg{page-break-inside:avoid}
thead{display:table-header-group}
svg{max-width:100%}
p,blockquote,dt,td.content{font-size:1em;orphans:3;widows:3}
h2,h3,#toctitle,.sidebarblock>.content>.title{page-break-after:avoid}
#header,#content,#footnotes,#footer{max-width:none}
#toc,.sidebarblock,.exampleblock>.content{background:none!important}
#toc{border-bottom:1px solid #dddddf!important;padding-bottom:0!important}
body.book #header{text-align:center}
body.book #header>h1:first-child{border:0!important;margin:2.5em 0 1em}
body.book #header .details{border:0!important;display:block;padding:0!important}
body.book #header .details span:first-child{margin-left:0!important}
body.book #header .details br{display:block}
body.book #header .details br+span::before{content:none!important}
body.book #toc{border:0!important;text-align:left!important;padding:0!important;margin:0!important}
body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-break-before:always}
.listingblock code[data-lang]::before{display:block}
#footer{padding:0 .9375em}
.hide-on-print{display:none!important}
.print-only{display:block!important}
.hide-for-print{display:none!important}
.show-for-print{display:inherit!important}}
@media print,amzn-kf8{#header>h1:first-child{margin-top:1.25rem}
.sect1{padding:0!important}
.sect1+.sect1{border:0}
#footer{background:none}
#footer-text{color:rgba(0,0,0,.6);font-size:.9em}}
@media amzn-kf8{#header,#content,#footnotes,#footer{padding:0}}
</style>
</head>
<body class="article">
<div id="header">
</div>
<div id="content">
<div class="paragraph">
<p>Shared naming conventions allow teams to collaborate efficiently. This rule checks that all method names match a provided regular expression.</p>
</div>
@ -482,11 +38,3 @@ public int Do_Something(){...}</pre>
</div>
</div>
</div>
</div>
<div id="footer">
<div id="footer-text">
Last updated 2021-01-28 17:34:39 +0100
</div>
</div>
</body>
</html>

View File

@ -0,0 +1,26 @@
<div class="paragraph">
<p>Shared naming conventions allow teams to collaborate efficiently. This rule checks that all function names match a provided regular expression.</p>
</div>
<div class="sect1">
<h2 id="_noncompliant_code_example">Noncompliant Code Example</h2>
<div class="sectionbody">
<div class="paragraph">
<p>With the default regular expression <code>^[a-z][a-zA-Z0-9]*$</code>:</p>
</div>
<div class="listingblock">
<div class="content">
<pre>function DoSomething(){...} // Noncompliant</pre>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_compliant_solution">Compliant Solution</h2>
<div class="sectionbody">
<div class="listingblock">
<div class="content">
<pre>function doSomething(){...}</pre>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,3 @@
<div class="paragraph">
<p>Shared naming conventions allow teams to collaborate efficiently. This rule checks that all function names match a provided regular expression.</p>
</div>

View File

@ -0,0 +1,45 @@
<div class="paragraph">
<p>Shared naming conventions allow teams to collaborate efficiently. This rule checks that all function names match a provided regular expression.</p>
</div>
<div class="sect1">
<h2 id="_noncompliant_code_example">Noncompliant Code Example</h2>
<div class="sectionbody">
<div class="paragraph">
<p>With default provided regular expression: <code>^[a-z][a-zA-Z0-9]*$</code>:</p>
</div>
<div class="listingblock">
<div class="content">
<pre>function DoSomething(){...}</pre>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_compliant_solution">Compliant Solution</h2>
<div class="sectionbody">
<div class="listingblock">
<div class="content">
<pre>function doSomething(){...}</pre>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_exceptions">Exceptions</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Methods with an <code>@inheritdoc</code> annotation, as well as magic methods (<code>__construct()</code>, <code>__destruct()</code>, <code>__call()</code>, <code>__callStatic()</code>, <code>__get()</code>, <code>__set()</code>, <code>__isset()</code>, <code>__unset()</code>, <code>__sleep()</code>, <code>__wakeup()</code>, <code>__toString()</code>, <code>__invoke()</code>, <code>__set_state()</code>, <code>__clone()</code>, <code>__debugInfo()</code>) are ignored.</p>
</div>
<div class="listingblock">
<div class="content">
<pre>function __construct(){...}
function __destruct(){...}
/**
* {@inheritdoc}
*/
function myFunc(){...}</pre>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,30 @@
<div class="paragraph">
<p>Sharing some naming conventions is a key point to make it possible for a team to efficiently collaborate. This rule allows to check that all method names match a provided regular expression.</p>
</div>
<div class="sect1">
<h2 id="_noncompliant_code_example">Noncompliant Code Example</h2>
<div class="sectionbody">
<div class="paragraph">
<p>With default provided regular expression: <code>^[a-z_][a-z0-9_]*$</code></p>
</div>
<div class="listingblock">
<div class="content">
<pre>class MyClass:
def MyMethod(a,b):
...</pre>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_compliant_solution">Compliant Solution</h2>
<div class="sectionbody">
<div class="listingblock">
<div class="content">
<pre>class MyClass:
def my_method(a,b):
...</pre>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,46 @@
<div class="paragraph">
<p>Sharing some naming conventions is a key point to make it possible for a team to efficiently collaborate. This rule allows to check that all subroutine names match a provided regular expression.</p>
</div>
<div class="sect1">
<h2 id="_noncompliant_code_example">Noncompliant Code Example</h2>
<div class="sectionbody">
<div class="paragraph">
<p>With default provided regular expression <code>^SR[a-zA-Z0-9]*$</code>:</p>
</div>
<div class="listingblock">
<div class="content">
<pre>C XXXXX BEGSR
...
C ENDSR</pre>
</div>
</div>
<div class="listingblock">
<div class="content">
<pre> /free
begsr yyyy;
endsr;
/end-free{code}</pre>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_compliant_solution">Compliant Solution</h2>
<div class="sectionbody">
<div class="listingblock">
<div class="content">
<pre>C SR102 BEGSR
...
C ENDSR</pre>
</div>
</div>
<div class="listingblock">
<div class="content">
<pre> /free
begsr SR103;
endsr;
/end-free</pre>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,3 @@
<div class="paragraph">
<p>Shared naming conventions allow teams to collaborate efficiently. This rule checks that all function names match a provided regular expression.</p>
</div>

View File

@ -0,0 +1,30 @@
<div class="paragraph">
<p>Shared naming conventions allow teams to collaborate efficiently. This rule checks that all function names match a provided regular expression.</p>
</div>
<div class="sect1">
<h2 id="_noncompliant_code_example">Noncompliant Code Example</h2>
<div class="sectionbody">
<div class="paragraph">
<p>With default provided regular expression:</p>
</div>
<div class="listingblock">
<div class="content">
<pre>def DoSomething( ) : Unit = { // Noncompliant
// ...
}</pre>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_compliant_solution">Compliant Solution</h2>
<div class="sectionbody">
<div class="listingblock">
<div class="content">
<pre>def doSomething( ) : Unit = {
// ...
}</pre>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,3 @@
<div class="paragraph">
<p>Shared naming conventions allow teams to collaborate efficiently. This rule checks that all function names match a provided regular expression.</p>
</div>

View File

@ -6,9 +6,10 @@ from click.testing import CliRunner
from rspec_tools.cli import cli
from rspec_tools.rules import RulesRepository
import os
class TestCLIValidateRulesMetadata:
'''Unit test for the Command Line Interface.'''
'''Unit tests for metadata validation through Command Line Interface.'''
def _run(self, rules: List[str]):
runner = CliRunner()
@ -54,3 +55,29 @@ class TestCLIValidateRulesMetadata:
assert 'Rule scala:S502 has invalid metadata : \'remediation\' is a required property' in result.output
assert 'Validation failed due to 2 errors out of 2 analyzed rules' in result.output
assert result.exit_code == 1
class TestCLIValidateDescription:
'''Unit tests for description validation through Command Line Interface.'''
def _run(self, rules: List[str]):
runner = CliRunner()
mock_path = os.path.realpath(Path(__file__).parent.joinpath('resources', 'rules'))
arguments = ['check-description', '--d', mock_path] + rules
return runner.invoke(cli, arguments)
def _run_invalid(self, rules: List[str]):
runner = CliRunner()
mock_path = os.path.realpath(Path(__file__).parent.joinpath('resources', 'invalid-rules'))
arguments = ['check-description', '--d', mock_path] + rules
return runner.invoke(cli, arguments)
def test_valid_rule(self):
result = self._run(['S100'])
assert result.output == ''
assert result.exit_code == 0
def test_invalid_rule(self):
result = self._run_invalid(['S100'])
assert 'Validation failed due to 7 errors' in result.output
assert result.exit_code == 1

View File

@ -2,43 +2,63 @@ from pathlib import Path
from unittest.mock import patch, PropertyMock
import pytest
import re
from rspec_tools.errors import RuleValidationError
from copy import deepcopy
from rspec_tools.rules import LanguageSpecificRule, RulesRepository
from rspec_tools.validation.description import validate_section_names, validate_section_levels
from rspec_tools.validation.description import validate_section_names, validate_section_levels, validate_parameters
@pytest.fixture
def rule_language(mockrules: Path):
rule = RulesRepository(rules_path=mockrules).get_rule('S100')
return rule.get_language('cfamily')
def _rule_language(rule_id, language):
rule = RulesRepository(rules_path=mockrules).get_rule(rule_id)
return rule.get_language(language)
return _rule_language
def test_valid_sections_passes_validation(rule_language: LanguageSpecificRule):
@pytest.fixture
def invalid_rule(mockinvalidrules: Path):
def _invalid_rule(rule_id, language):
rule = RulesRepository(rules_path=mockinvalidrules).get_rule(rule_id)
return rule.get_language(language)
return _invalid_rule
def test_valid_sections_passes_validation(rule_language):
'''Check that description with standard sections is considered valid.'''
validate_section_names(rule_language)
validate_section_names(rule_language('S100', 'cfamily'))
def test_unexpected_section_fails_validation(rule_language: LanguageSpecificRule):
'''Check that unconventional section header breaks validation.'''
invalid_description = deepcopy(rule_language.description)
invalid_header = invalid_description.new_tag('h2')
invalid_header.string = 'Invalid header'
invalid_description.body.insert(1, invalid_header)
with pytest.raises(RuleValidationError, match=fr'^Rule {rule_language.id} has unconventional header "Invalid header"'):
with patch.object(LanguageSpecificRule, 'description', new_callable=PropertyMock) as mock:
mock.return_value = invalid_description
validate_section_names(rule_language)
def test_unexpected_section_fails_validation(invalid_rule):
rule = invalid_rule('S100', 'cfamily')
with pytest.raises(RuleValidationError, match=fr'^Rule {rule.id} has unconventional header "Invalid header"'):
validate_section_names(rule)
def test_valid_section_levels_passes_validation(rule_language: LanguageSpecificRule):
'''Check that description with standard sections levels is considered valid.'''
validate_section_levels(rule_language)
def test_valid_section_levels_passes_validation(rule_language):
'''Check that description with correct formatting is considered valid.'''
validate_section_levels(rule_language('S100', 'cfamily'))
def test_level_0_section_fails_validation(rule_language: LanguageSpecificRule):
'''Check that level-0 section header breaks validation.'''
invalid_description = deepcopy(rule_language.description)
invalid_header = invalid_description.new_tag('h1')
invalid_header.string = 'Invalid header level'
invalid_description.body.insert(1, invalid_header)
with pytest.raises(RuleValidationError, match=fr'^Rule {rule_language.id} has level-0 header "Invalid header level"'):
with patch.object(LanguageSpecificRule, 'description', new_callable=PropertyMock) as mock:
mock.return_value = invalid_description
validate_section_levels(rule_language)
def test_level_0_section_fails_validation(invalid_rule):
rule = invalid_rule('S100', 'cfamily')
with pytest.raises(RuleValidationError, match=fr'^Rule {rule.id} has level-0 header "Invalid header level"'):
validate_section_levels(rule)
def test_parameters_passes_validation(rule_language):
'''Check that correctly formed parameters are considered valid.'''
validate_parameters(rule_language('S100', 'cfamily'))
def test_parameters_fails_validation_missing_block(invalid_rule):
'''Check that description with unexpected tag breaks validation.'''
rule = invalid_rule('S100', 'cfamily')
with pytest.raises(RuleValidationError, match=fr'^Rule {rule.id} should use `\*\*\*\*` blocks for each parameter'):
validate_parameters(rule)
def test_parameters_fails_validation_missing_title(invalid_rule):
rule = invalid_rule('S100', 'csharp')
'''Check that parameters without key as title breaks validation.'''
with pytest.raises(RuleValidationError, match=fr'^Rule {rule.id} should have a parameter name declared with `.name` before the bock, for each parameter'):
validate_parameters(rule)
def test_parameters_fails_validation_missing_description(invalid_rule):
rule = invalid_rule('S100', 'java')
'''Check that parameters without any description break validation.'''
with pytest.raises(RuleValidationError, match=fr'^Rule {rule.id} should have a description for each parameter'):
validate_parameters(rule)

View File

@ -1,8 +1,12 @@
=== Parameters
* key = format
* Description: Regular expression used to check the [method|function|subroutine] names against
* Default: ^([A-Z0-9_]*|[a-z0-9_]*)$
* Type: STRING
.format
****
_STRING_
----
^([A-Z0-9_]*|[a-z0-9_]*)$
----
Regular expression used to check the [method|function|subroutine] names against
****

View File

@ -1,8 +1,12 @@
=== Parameters
* key = format
* description = Regular expression used to check the function names against
* default = ^[a-z][a-zA-Z0-9]*$
* type = STRING
.format
****
_STRING_
----
^[a-z][a-zA-Z0-9]*$
----
Regular expression used to check the function names against
****

View File

@ -1,8 +1,12 @@
=== Parameters
* key = format
* Description: Regular expression used to check the [method|function|subroutine] names against
* Default value: ^[a-z][a-zA-Z0-9]*$
* Type: STRING
.format
****
_STRING_
----
^[a-z][a-zA-Z0-9]*$
----
Regular expression used to check the [method|function|subroutine] names against
****

View File

@ -1,8 +1,12 @@
=== Parameters
* key = format
* Description: Regular expression used to check the function names against
* Default value: ^[a-zA-Z0-9]+$
* Type: STRING
.format
****
_STRING_
----
^[a-zA-Z0-9]+$
----
Regular expression used to check the function names against
****

View File

@ -1,8 +1,12 @@
=== Parameters
* key = format
* Description: Regular expression used to check the method names against
* Default value: ^[a-z][a-zA-Z0-9]*$
* Type: STRING
.format
****
_STRING_
----
^[a-z][a-zA-Z0-9]*$
----
Regular expression used to check the method names against
****

View File

@ -1,8 +1,12 @@
=== Parameters
* key = format
* Description: Regular expression used to check the [method|function|subroutine] names against
* Default value: ^[_a-z][a-zA-Z0-9]*$
* Type: STRING
.format
****
_STRING_
----
^[_a-z][a-zA-Z0-9]*$
----
Regular expression used to check the [method|function|subroutine] names against
****

View File

@ -1,7 +1,11 @@
=== Parameters
* key = format
* Description: Regular expression used to check the [method|function|subroutine] names against
* Default: ^[a-z][a-zA-Z0-9]*$
.format
****
----
^[a-z][a-zA-Z0-9]*$
----
Regular expression used to check the [method|function|subroutine] names against
****

View File

@ -1,8 +1,12 @@
=== Parameters
* key = format
* description = Regular expression used to check the [method|function|subroutine] names against
* default = ^[a-z_][a-z0-9_]*$
* type = STRING
.format
****
_STRING_
----
^[a-z_][a-z0-9_]*$
----
Regular expression used to check the [method|function|subroutine] names against
****

View File

@ -1,7 +1,11 @@
=== Parameters
* key = format
* Description: Regular expression used to check the subroutine names against
* Default: ^SR[a-zA-Z0-9]*$
.format
****
----
^SR[a-zA-Z0-9]*$
----
Regular expression used to check the subroutine names against
****

View File

@ -1,8 +1,12 @@
=== Parameters
* key = format
* Description: Regular expression used to check the function
* Default: [a-z_][a-z0-9_]\{2,}$
* Type: STRING
.format
****
_STRING_
----
[a-z_][a-z0-9_]\{2,}$
----
Regular expression used to check the function
****

View File

@ -1,8 +1,12 @@
=== Parameters
* key = format
* Description: Regular expression used to check the function names against
* Default value: ^[a-z][a-zA-Z0-9]*$
* Type: STRING
.format
****
_STRING_
----
^[a-z][a-zA-Z0-9]*$
----
Regular expression used to check the function names against
****

View File

@ -1,7 +1,11 @@
=== Parameters
* key = format
* Description : Regular expression used to check the class names against.
* Default: ^([A-Z0-9_]*|[a-z0-9_]*)$
.format
****
----
^([A-Z0-9_]*|[a-z0-9_]*)$
----
Regular expression used to check the class names against.
****

View File

@ -1,8 +1,12 @@
=== Parameters
* key = format
* description = Regular expression used to check the class names against.
* default = ^[A-Z][a-zA-Z0-9]*$
* type = STRING
.format
****
_STRING_
----
^[A-Z][a-zA-Z0-9]*$
----
Regular expression used to check the class names against.
****

View File

@ -1,7 +1,11 @@
=== Parameters
* key = format
* Description : Regular expression used to check the class names against.
* Default value : ^[A-Z][a-zA-Z0-9]*$
.format
****
----
^[A-Z][a-zA-Z0-9]*$
----
Regular expression used to check the class names against.
****

View File

@ -1,7 +1,11 @@
=== Parameters
* key = format
* Description : Regular expression used to check the class names against.
* Default value : ^[A-Z][a-zA-Z0-9]*$
.format
****
----
^[A-Z][a-zA-Z0-9]*$
----
Regular expression used to check the class names against.
****

View File

@ -1,7 +1,11 @@
=== Parameters
* key = format
* Description : Regular expression used to check the class names against.
* Default value : ^[A-Z][a-zA-Z0-9]*$
.format
****
----
^[A-Z][a-zA-Z0-9]*$
----
Regular expression used to check the class names against.
****

View File

@ -1,7 +1,11 @@
=== Parameters
* key = format
* Description : Regular expression used to check the class names against.
* Default value : ^[A-Z][a-zA-Z0-9]*$
.format
****
----
^[A-Z][a-zA-Z0-9]*$
----
Regular expression used to check the class names against.
****

View File

@ -1,7 +1,11 @@
=== Parameters
* key = format
* Description : Regular expression used to check the class names against.
* Default value : ^[A-Z][a-zA-Z0-9]*$
.format
****
----
^[A-Z][a-zA-Z0-9]*$
----
Regular expression used to check the class names against.
****

View File

@ -1,7 +1,11 @@
=== Parameters
* key = format
* description = Regular expression used to check the class names against.
* default = ^_?([A-Z_][a-zA-Z0-9]{empty}*|[a-z_][a-z0-9_]{empty}*)$
.format
****
----
^_?([A-Z_][a-zA-Z0-9]{empty}*|[a-z_][a-z0-9_]{empty}*)$
----
Regular expression used to check the class names against.
****

View File

@ -1,7 +1,11 @@
=== Parameters
* key = format
* Description : Regular expression used to check the class names against.
* Default value : ^[A-Z][a-zA-Z0-9]*$
.format
****
----
^[A-Z][a-zA-Z0-9]*$
----
Regular expression used to check the class names against.
****

View File

@ -1,8 +1,12 @@
=== Parameters
* key = format
* description = Regular expression used to check the class names against.
* default = ^([A-Z]{1,3}[a-z0-9]+)*([A-Z]{2})?$
* type = STRING
.format
****
_STRING_
----
^([A-Z]{1,3}[a-z0-9]+)*([A-Z]{2})?$
----
Regular expression used to check the class names against.
****

View File

@ -1,8 +1,11 @@
=== Parameters
* key = maximumLineLength
Description: The maximum authorized line length
Default Value: 80
.maximumLineLength
****
----
80
----
The maximum authorized line length
****

View File

@ -1,8 +1,11 @@
=== Parameters
* key = maximumLineLength
Description: The maximum authorized line length.
Default Value: 200
.maximumLineLength
****
----
200
----
The maximum authorized line length.
****

View File

@ -1,8 +1,11 @@
=== Parameters
* key = maximumLineLength
Description: The maximum authorized line length.
Default Value: 80
.maximumLineLength
****
----
80
----
The maximum authorized line length.
****

View File

@ -1,8 +1,11 @@
=== Parameters
* key = maximumLineLength
Description: The maximum authorized line length.
Default Value: 200
.maximumLineLength
****
----
200
----
The maximum authorized line length.
****

View File

@ -1,7 +1,11 @@
=== Parameters
* key = maxLength
* description = The maximum authorized line length.
* default = 120
.maxLength
****
----
120
----
The maximum authorized line length.
****

View File

@ -0,0 +1,11 @@
=== Parameters
.maximumLineLength
****
----
180
----
The maximum authorized line length.
****

View File

@ -8,7 +8,7 @@ ifdef::env-github,rspecator-view[]
include::../message.adoc[]
include::../parameters.adoc[]
include::parameters.adoc[]
'''
== Comments And Links

View File

@ -1,12 +1,11 @@
=== Parameters
* key = maximumLineLength
Description: The maximum authorized line length.
Default Value: 120
Default Value for JavaScript: 180
Default Value for T-SQL: 200
.maximumLineLength
****
----
120
----
The maximum authorized line length.
****

View File

@ -0,0 +1,11 @@
=== Parameters
.maximumLineLength
****
----
200
----
The maximum authorized line length.
****

View File

@ -8,7 +8,7 @@ ifdef::env-github,rspecator-view[]
include::../message.adoc[]
include::../parameters.adoc[]
include::parameters.adoc[]
'''
== Comments And Links

View File

@ -1,8 +1,12 @@
=== Parameters
* key = maximumLineLength
* description = The maximum authorized line length.
* default = 200
* type = INTEGER
.maximumLineLength
****
_INTEGER_
----
200
----
The maximum authorized line length.
****

View File

@ -1,8 +1,12 @@
=== Parameters
* key = maximumFileLocThreshold
* description = The maximum authorized lines
* default = 1000
* type = INTEGER
.maximumFileLocThreshold
****
_INTEGER_
----
1000
----
The maximum authorized lines
****

View File

@ -1,8 +1,11 @@
=== Parameters
* key = Max
Description: Maximum authorized lines of code in a file.
Default Value: 1000
.Max
****
----
1000
----
Maximum authorized lines of code in a file.
****

View File

@ -1,8 +1,11 @@
=== Parameters
* key = maximumFileLocThreshold
Description: Maximum authorized lines in a file.
Default Value: 1000
.maximumFileLocThreshold
****
----
1000
----
Maximum authorized lines in a file.
****

View File

@ -1,7 +1,11 @@
=== Parameters
* key = excludeFunctions
* description: 'true' if functions should handle all exceptions, 'flase if they can let some propagate
* default: false
.excludeFunctions
****
----
false
----
'true' if functions should handle all exceptions, 'flase if they can let some propagate
****

View File

@ -1,7 +1,11 @@
=== Parameters
* key = markAll
* description: Mark all tab errors
* default: false
.markAll
****
----
false
----
Mark all tab errors
****

View File

@ -1,8 +1,11 @@
=== Parameters
* key = packagesToDetect
Default: DBMS_SYS_SQL,DBMS_BACKUP_RESTORE,DBMS_LOB,DBMS_NAMESPACE,DBMS_SCHEDULER,DBMS_RANDOM,EMD_SYSTEM,UTL_FILE,UTL_HTTP,UTL_SMTP,UTL_TCP
Description: List of packages that should be detected
.packagesToDetect
****
----
DBMS_SYS_SQL,DBMS_BACKUP_RESTORE,DBMS_LOB,DBMS_NAMESPACE,DBMS_SCHEDULER,DBMS_RANDOM,EMD_SYSTEM,UTL_FILE,UTL_HTTP,UTL_SMTP,UTL_TCP
----
List of packages that should be detected
****

View File

@ -1,7 +1,11 @@
=== Parameters
* key = max
* Description: Maximum number of allowed conditional operators in an expression
* Default Value : 3
.max
****
----
3
----
Maximum number of allowed conditional operators in an expression
****

View File

@ -1,7 +1,11 @@
=== Parameters
* key = max
* Description: Maximum number of allowed conditional operators in an expression
* Default Value : 3
.max
****
----
3
----
Maximum number of allowed conditional operators in an expression
****

View File

@ -1,8 +1,12 @@
=== Parameters
* key = max
* description = Maximum authorized number of parameters
* default = 7
* type = INTEGER
.max
****
_INTEGER_
----
7
----
Maximum authorized number of parameters
****

View File

@ -1,7 +1,11 @@
=== Parameters
* key = max
* description = Maximum authorized number of parameters
* default = 7
.max
****
----
7
----
Maximum authorized number of parameters
****

View File

@ -1,10 +1,20 @@
=== Parameters
* key = max
** Description: Maximum authorized number of parameters
** Default Value: 7
* key: constructorMax
** Description: Maximum authorized number of parameters for a constructor
** default: 7
.max
****
----
7
----
Maximum authorized number of parameters
****
.constructorMax
****
----
7
----
Maximum authorized number of parameters for a constructor
****

View File

@ -1,7 +1,11 @@
=== Parameters
* key = maximumParameterCount
* description = Maximum authorized number of parameters
* default = 8
.maximumParameterCount
****
----
8
----
Maximum authorized number of parameters
****

View File

@ -1,7 +1,11 @@
=== Parameters
* key = parameters
* description: The maximum number of function and procedure parameters allowed.
* default: 10
.parameters
****
----
10
----
The maximum number of function and procedure parameters allowed.
****

View File

@ -1,7 +1,11 @@
=== Parameters
* key = max
* description = Maximum authorized number of parameters
* default = 13
.max
****
----
13
----
Maximum authorized number of parameters
****

View File

@ -1,7 +1,11 @@
=== Parameters
* key = max
* Description: Maximum authorized number of parameters
* Default Value: 10
.max
****
----
10
----
Maximum authorized number of parameters
****

View File

@ -1,8 +1,11 @@
=== Parameters
* key = exceptions
description: Comma separated list of allowed exceptions
default: -1,0,1
.exceptions
****
----
-1,0,1
----
Comma separated list of allowed exceptions
****

View File

@ -1,7 +1,10 @@
=== Parameters
* key = exceptions
* default = -1,0,1,2
* type = STRING
.exceptions
****
_STRING_
----
-1,0,1,2
----
****

View File

@ -1,12 +1,22 @@
=== Parameters
* key = max
* description = Maximum depth of the inheritance tree. (Number)
* default = 5
* type = Integer
* key = filteredClasses
* description = Comma-separated list of classes or records to be filtered out of the count of inheritance. Depth counting will stop when a filtered class or record is reached. For example: System.Windows.Controls.UserControl, System.Windows.*
* default = ""
* type = String
.max
****
_Integer_
----
5
----
Maximum depth of the inheritance tree. (Number)
****
.filteredClasses
****
_String_
----
""
----
Comma-separated list of classes or records to be filtered out of the count of inheritance. Depth counting will stop when a filtered class or record is reached. For example: System.Windows.Controls.UserControl, System.Windows.*
****

View File

@ -1,19 +1,22 @@
=== Parameters
* key = max
Description: Maximum depth of the inheritance tree. (Number)
.max
****
_Integer_
Default Value: 5
----
5
----
Type: Integer
Key: filteredClasses
Description: Classes to be filtered out of the count of inheritance. Depth counting will stop when a filtered class is reached. Ex value: java.fwk.AbstractFwkClass, java.fwkPackage.*
Default Value: ""
Type: String
Maximum depth of the inheritance tree. (Number)
****
.filteredClasses
****
_String_
----
""
----
Classes to be filtered out of the count of inheritance. Depth counting will stop when a filtered class is reached. Ex value: java.fwk.AbstractFwkClass, java.fwkPackage.*
****

View File

@ -1,7 +1,11 @@
=== Parameters
* key = braceStyle
* Description : enforced brace-style: 1tbs, stroustrup or allman.
* Default value : 1tbs
.braceStyle
****
----
1tbs
----
enforced brace-style: 1tbs, stroustrup or allman.
****

View File

@ -0,0 +1,12 @@
=== Parameters
.format
****
_String_
----
YIF_[A-Za-z]+
----
Regular expression used to check the interface names against.
****

View File

@ -26,7 +26,7 @@ ifdef::env-github,rspecator-view[]
include::../message.adoc[]
include::../parameters.adoc[]
include::parameters.adoc[]
'''
== Comments And Links

View File

@ -1,12 +1,12 @@
=== Parameters
* key = format
Description: Regular expression used to check the interface names against.
Default: ^[A-Z][a-zA-Z0-9]*$
ABAP default: YIF_[A-Za-z]+
type: String
.format
****
_String_
----
^[A-Z][a-zA-Z0-9]*$
----
Regular expression used to check the interface names against.
****

View File

@ -1,10 +1,12 @@
=== Parameters
* key = format
Description: Regular expression used to check the protocol names against.
Default: ^[A-Z][a-zA-Z0-9]*$
type: String
.format
****
_String_
----
^[A-Z][a-zA-Z0-9]*$
----
Regular expression used to check the protocol names against.
****

View File

@ -1,8 +1,12 @@
=== Parameters
* key = format
* description = Regular expression used to check the interface names against.
* default = ^I([A-Z]{1,3}[a-z0-9]+)*([A-Z]{2})?$
* type = STRING
.format
****
_STRING_
----
^I([A-Z]{1,3}[a-z0-9]+)*([A-Z]{2})?$
----
Regular expression used to check the interface names against.
****

View File

@ -1,7 +1,11 @@
=== Parameters
* key = max
* Description : Maximum allowed return statements per method
* Default value: 3
.max
****
----
3
----
Maximum allowed return statements per method
****

View File

@ -1,7 +1,11 @@
=== Parameters
* key = max
* Description : Maximum allowed return statements per function
* Default value: 3
.max
****
----
3
----
Maximum allowed return statements per function
****

View File

@ -1,10 +1,11 @@
=== Parameters
* key = format
Description: Regular expression used to check the constant names against.
Default Value: ^[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$
Python default: (([A-Z_][A-Z0-9_]*)|(__.*__))$
.format
****
----
^[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$
----
Regular expression used to check the constant names against.
****

View File

@ -1,7 +1,11 @@
=== Parameters
* key = regexp
* description: The regular expression the name should match.
* default: [a-zA-Z]([a-zA-Z0-9_]*[a-zA-Z0-9])?
.regexp
****
----
[a-zA-Z]([a-zA-Z0-9_]*[a-zA-Z0-9])?
----
The regular expression the name should match.
****

View File

@ -0,0 +1,11 @@
=== Parameters
.format
****
----
(([A-Z_][A-Z0-9_]*)|(__.*__))$
----
Regular expression used to check the constant names against.
****

View File

@ -8,7 +8,7 @@ ifdef::env-github,rspecator-view[]
include::../message.adoc[]
include::../parameters.adoc[]
include::parameters.adoc[]
'''
== Comments And Links

View File

@ -1,8 +1,11 @@
=== Parameters
* key = format
Description: Regular expression used to check the constant names against.
Default Value: ^[a-z][a-zA-Z0-9]*$
.format
****
----
^[a-z][a-zA-Z0-9]*$
----
Regular expression used to check the constant names against.
****

Some files were not shown because too many files have changed in this diff Show More