306 lines
18 KiB
HTML
306 lines
18 KiB
HTML
<!doctype html>
|
||
<!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
|
||
<!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
|
||
<!--[if IE 8]> <html class="no-js lt-ie9"> <![endif]-->
|
||
<!--[if gt IE 8]><!--> <html> <!--<![endif]-->
|
||
<head>
|
||
<meta charset="utf-8">
|
||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||
<title>Style guidelines - Home Assistant</title>
|
||
<meta name="author" content="Home Assistant">
|
||
<meta name="description" content="Details about styling your code.">
|
||
<meta name="viewport" content="width=device-width">
|
||
<link rel="canonical" href="/developers/development_guidelines/">
|
||
<meta property="fb:app_id" content="338291289691179">
|
||
<meta property="og:title" content="Style guidelines">
|
||
<meta property="og:site_name" content="Home Assistant">
|
||
<meta property="og:url" content="/developers/development_guidelines/">
|
||
<meta property="og:type" content="website">
|
||
<meta property="og:description" content="Details about styling your code.">
|
||
<meta property="og:image" content="https://home-assistant.io/images/default-social.png">
|
||
<meta name="twitter:card" content="summary_large_image">
|
||
<meta name="twitter:site" content="@home_assistant">
|
||
<meta name="twitter:title" content="Style guidelines">
|
||
<meta name="twitter:description" content="Details about styling your code.">
|
||
<meta name="twitter:image" content="https://home-assistant.io/images/default-social.png">
|
||
<link href="/stylesheets/screen.css" media="screen, projection" rel="stylesheet">
|
||
<link href="/atom.xml" rel="alternate" title="Home Assistant" type="application/atom+xml">
|
||
<link rel='shortcut icon' href='/images/favicon.ico' />
|
||
<link rel='icon' type='image/png' href='/images/favicon-192x192.png' sizes='192x192' />
|
||
</head>
|
||
<body >
|
||
<header class='site-header'>
|
||
<div class="grid-wrapper">
|
||
<div class="grid">
|
||
<div class="grid__item three-tenths lap-two-sixths palm-one-whole ha-title">
|
||
<a href="/" class="site-title">
|
||
<img width='40' src='/demo/favicon-192x192.png'>
|
||
<span>Home Assistant</span>
|
||
</a>
|
||
</div>
|
||
<div class="grid__item seven-tenths lap-four-sixths palm-one-whole">
|
||
<nav>
|
||
<input type="checkbox" id="toggle">
|
||
<label for="toggle" class="toggle" data-open="Main Menu" data-close="Close Menu"></label>
|
||
<ul class="menu pull-right">
|
||
<li><a href="/getting-started/">Getting started</a></li>
|
||
<li><a href="/components/">Components</a></li>
|
||
<li><a href="/docs/">Docs</a></li>
|
||
<li><a href="/cookbook/">Examples</a></li>
|
||
<li><a href="/developers/">Developers</a></li>
|
||
<li><a href="/blog/">Blog</a></li>
|
||
<li><a href="/help/">Need help?</a></li>
|
||
<li><a href='#' class='show-search'><i class="icon-search"></i></a></li>
|
||
</ul>
|
||
</nav>
|
||
<div class='search-container' style='display: none'>
|
||
<div class='search'>
|
||
<i class="icon-search"></i>
|
||
<input id='search' placeholder='Search the docs…'>
|
||
<a href='#' class='close'><i class="icon-remove-sign"></i></a>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</header>
|
||
<div class="grid-wrapper">
|
||
<div class="grid grid-center">
|
||
<div class="grid__item two-thirds lap-one-whole palm-one-whole">
|
||
<article class="page">
|
||
<header>
|
||
<h1 class="title indent">
|
||
Style guidelines
|
||
</h1>
|
||
</header>
|
||
<hr class="divider">
|
||
<p>Home Assistant enforces strict <a href="https://www.python.org/dev/peps/pep-0008/">PEP8 style</a> and <a href="https://www.python.org/dev/peps/pep-0257/">PEP 257 (Docstring Conventions)</a> compliance on all code submitted. We automatically test every pull request as part of the linting process with <a href="https://coveralls.io/github/home-assistant/home-assistant">Coveralls</a> and <a href="https://travis-ci.org/home-assistant/home-assistant">Travis CI</a>.</p>
|
||
<p>Summary of the most relevant points:</p>
|
||
<ul>
|
||
<li>Line length is limited to 79 characters (see below).</li>
|
||
<li>Use 4 spaces per indentation level. We don’t use tabs.</li>
|
||
<li>Comments should be full sentences and end with a period.</li>
|
||
<li><a href="https://www.python.org/dev/peps/pep-0008/#imports">Imports</a> should be ordered.</li>
|
||
<li>Constants and the content of lists and dictionaries should be in alphabetical order.</li>
|
||
<li>Avoid trailing whitespace but surround binary operators with a single space.</li>
|
||
<li>Line separator should be set to <code class="highlighter-rouge">LF</code>.</li>
|
||
</ul>
|
||
<p>The maximum line length comes directly from the <a href="https://www.python.org/dev/peps/pep-0008/#maximum-line-length">PEP8 style guide</a>, and is also used by the Python standard library. All code must pass these linting checks, and no exceptions will be made. There have already been numerous requests to increase the maximum line length, but after evaluating the options, the Home Assistant maintainers have decided to stay at 79 characters. This decision is final.</p>
|
||
<p>Those points may require that you adjust your IDE or editor settings.</p>
|
||
<h2><a class="title-link" name="our-recommandations" href="#our-recommandations"></a> Our recommandations</h2>
|
||
<p>For some cases <a href="https://www.python.org/dev/peps/">PEPs</a> don’t make a statement. This section covers our recommendations about the code style. Those points were collected from the exisiting code and based on what contributors and developers were using the most. This is basically a majority decision, thus you may not agree with it. But we would like to encourage you follow those recommandations to keep the code unified.</p>
|
||
<h3><a class="title-link" name="quotes" href="#quotes"></a> Quotes</h3>
|
||
<p>Use single quotes <code class="highlighter-rouge">'</code> for single word and <code class="highlighter-rouge">"</code> for multiple words or sentences.</p>
|
||
<div class="language-python highlighter-rouge"><pre class="highlight"><code><span class="n">ATTR_WATERLEVEL</span> <span class="o">=</span> <span class="s">'level'</span>
|
||
<span class="n">CONF_ATTRIBUTION</span> <span class="o">=</span> <span class="s">"Data provided by the WUnderground weather service"</span>
|
||
<span class="n">SENSOR_TYPES</span> <span class="o">=</span> <span class="p">{</span>
|
||
<span class="s">'alerts'</span><span class="p">:</span> <span class="p">[</span><span class="s">'Alerts'</span><span class="p">,</span> <span class="bp">None</span><span class="p">],</span>
|
||
<span class="p">}</span>
|
||
</code></pre>
|
||
</div>
|
||
<h3><a class="title-link" name="file-headers" href="#file-headers"></a> File headers</h3>
|
||
<p>The docstring in the file header should contain a link to the documentation to make it easy to find further information, especially about the configuration or details which are not mentioned in the code.</p>
|
||
<div class="language-python highlighter-rouge"><pre class="highlight"><code><span class="s">"""
|
||
Support for MQTT lights.
|
||
|
||
For more details about this platform, please refer to the documentation at
|
||
https://home-assistant.io/components/light.mqtt/
|
||
"""</span>
|
||
</code></pre>
|
||
</div>
|
||
<h3><a class="title-link" name="requirements" href="#requirements"></a> Requirements</h3>
|
||
<p>Please place <a href="/developers/code_review_platform/#1-requirements">Platform requirements</a> right after the imports.</p>
|
||
<div class="language-python highlighter-rouge"><pre class="highlight"><code><span class="p">[</span><span class="o">...</span><span class="p">]</span>
|
||
<span class="kn">from</span> <span class="nn">homeassistant.helpers.entity</span> <span class="kn">import</span> <span class="n">Entity</span>
|
||
|
||
<span class="n">REQUIREMENTS</span> <span class="o">=</span> <span class="p">[</span><span class="s">'xmltodict==0.11.0'</span><span class="p">]</span>
|
||
</code></pre>
|
||
</div>
|
||
<h3><a class="title-link" name="log-messages" href="#log-messages"></a> Log messages</h3>
|
||
<p>There is no need to add the platform or component name to the log messages. This will be added automatically. Like <code class="highlighter-rouge">syslog</code> messages there shouldn’t be no period at the end. Try to avoid brackets and additional quotes around the output to make it easier for users to parse the log. A widely style is shown below but you are free to compose the messages as you like.</p>
|
||
<div class="language-python highlighter-rouge"><pre class="highlight"><code><span class="n">_LOGGER</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s">"No route to device: </span><span class="si">%</span><span class="s">s"</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_resource</span><span class="p">)</span>
|
||
</code></pre>
|
||
</div>
|
||
<div class="language-bash highlighter-rouge"><pre class="highlight"><code>2017-05-01 14:28:07 ERROR <span class="o">[</span>homeassistant.components.sensor.arest] No route to device: 192.168.0.18
|
||
</code></pre>
|
||
</div>
|
||
<p>Don’t print out wrong API keys, tokens, usernames, or passwords.</p>
|
||
</article>
|
||
</div>
|
||
<aside id="sidebar" class="grid__item one-third lap-one-whole palm-one-whole">
|
||
<div class="grid">
|
||
<section class="aside-module grid__item one-whole lap-one-half">
|
||
<div class='edit-github'><a href='https://github.com/home-assistant/home-assistant.github.io/tree/current/source/developers/development_guidelines.markdown'>Edit this page on GitHub</a></div>
|
||
<div class='section'>
|
||
<h1 class="title delta">Development Guide</h1>
|
||
<ul class='divided sidebar-menu'>
|
||
<li>
|
||
<a href='/developers/'>Introduction </a>
|
||
<ul>
|
||
<li><a href='/developers/architecture/'>Architecture </a></li>
|
||
<li><a href='/developers/architecture_components/'>Components </a></li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<a href='/developers/development/'>Starting with Development </a>
|
||
<ul>
|
||
<li><a href='/developers/development_environment/'>Setting up Environment </a></li>
|
||
<li><a href='/developers/development_submitting/'>Submit your Work </a></li>
|
||
<li><a href='/developers/development_checklist/'>Checklist </a></li>
|
||
<li><a class='active' href='/developers/development_guidelines/'>Style guidelines </a></li>
|
||
<li><a href='/developers/development_testing/'>Testing </a></li>
|
||
<li><a href='/developers/development_catching_up/'>Catching up with Reality </a></li>
|
||
<li><a href='/developers/development_validation/'>Validation </a></li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<a href='/developers/development_101/'>Development 101 </a>
|
||
<ul>
|
||
<li><a href='/developers/development_hass_object/'>Hass object </a></li>
|
||
<li><a href='/developers/development_events/'>Events </a></li>
|
||
<li><a href='/developers/development_states/'>States </a></li>
|
||
<li><a href='/developers/development_services/'>Services </a></li>
|
||
<li><a href='/developers/development_config/'>Config </a></li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<a href='/developers/add_new_platform/'>Creating a new platform (to support a new device) </a>
|
||
<ul>
|
||
<li><a href='/developers/code_review_platform/'>Checklist creating a platform </a></li>
|
||
<li><a href='/developers/platform_example_sensor/'>Example sensor platform </a></li>
|
||
<li><a href='/developers/platform_example_light/'>Example light platform </a></li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<a href='/developers/creating_components/'>Adding a new component </a>
|
||
<ul>
|
||
<li><a href='/developers/code_review_component/'>Checklist creating a component </a></li>
|
||
<li><a href='/developers/component_loading/'>Loading components </a></li>
|
||
<li><a href='/developers/component_deps_and_reqs/'>Requirements & Dependencies </a></li>
|
||
<li><a href='/developers/component_events/'>Handling events </a></li>
|
||
<li><a href='/developers/component_states/'>States </a></li>
|
||
<li><a href='/developers/component_visibility/'>Visibility </a></li>
|
||
<li><a href='/developers/component_generic_discovery/'>Loading Platforms </a></li>
|
||
<li><a href='/developers/component_discovery/'>Component Discovery </a></li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<a href='/developers/intent/'>Intents (handling voice responses) </a>
|
||
<ul>
|
||
<li><a href='/developers/intent/firing/'>Firing intents </a></li>
|
||
<li><a href='/developers/intent/handling/'>Handling intents </a></li>
|
||
<li><a href='/developers/intent/conversation/'>Registering sentences </a></li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<a href='/developers/asyncio/'>Asynchronous Programming </a>
|
||
<ul>
|
||
<li><a href='/developers/asyncio_101/'>Introduction to asyncio </a></li>
|
||
<li><a href='/developers/asyncio_categorizing_functions/'>Categorizing Functions </a></li>
|
||
<li><a href='/developers/asyncio_working_with_async/'>Working with Async </a></li>
|
||
<li><a href='/developers/asyncio_misc/'>Miscellaneous </a></li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<a href='/developers/frontend/'>Frontend Development </a>
|
||
<ul>
|
||
<li><a href='/developers/frontend_add_card/'>Add State Card </a></li>
|
||
<li><a href='/developers/frontend_add_more_info/'>Add More Info Dialog </a></li>
|
||
<li><a href='/developers/frontend_creating_custom_panels/'>Add Custom Panels </a></li>
|
||
<li><a href='/developers/frontend_creating_custom_ui/'>Add Custom UI </a></li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<a href='/developers/hassio/architecture/'>Hass.io architecture </a>
|
||
<ul>
|
||
<li><a href='/developers/hassio/debugging/'>Debugging Hass.io </a></li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<a href='/developers/hassio/addon_development/'>Hass.io Add-on Development </a>
|
||
<ul>
|
||
<li><a href='/developers/hassio/addon_tutorial/'>Tutorial: Making your first add-on </a></li>
|
||
<li><a href='/developers/hassio/addon_config/'>Configuration </a></li>
|
||
<li><a href='/developers/hassio/addon_testing/'>Local Testing </a></li>
|
||
<li><a href='/developers/hassio/addon_publishing/'>Publishing </a></li>
|
||
<li><a href='/developers/hassio/addon_repository/'>Repositories </a></li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<a href='/developers/api/'>API </a>
|
||
<ul>
|
||
<li><a href='https://dev-docs.home-assistant.io/en/dev/'>Python API </a></li>
|
||
<li><a href='/developers/websocket_api/'>Websocket API </a></li>
|
||
<li><a href='/developers/rest_api/'>REST API </a></li>
|
||
<li><a href='/developers/python_api/'>Python REST API </a></li>
|
||
<li><a href='/developers/server_sent_events/'>Server-sent events </a></li>
|
||
</ul>
|
||
</li>
|
||
<li><a href='/developers/helpers/'>Online helpers </a></li>
|
||
<li><a href='/developers/website/'>Home-Assistant.io </a></li>
|
||
<li><a href='/developers/releasing/'>Releasing </a></li>
|
||
<li><a href='/developers/maintenance/'>Maintenance </a></li>
|
||
<li>
|
||
Governance
|
||
<ul>
|
||
<li><a href='/developers/cla/'>Contributor License Agreement </a></li>
|
||
<li><a href='/developers/code_of_conduct/'>Code of Conduct </a></li>
|
||
<li><a href='/developers/credits/'>Credits </a></li>
|
||
<li><a href='/developers/license/'>License </a></li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
</section>
|
||
</div>
|
||
</aside>
|
||
</div>
|
||
</div>
|
||
<footer>
|
||
<div class="grid-wrapper">
|
||
<div class="grid">
|
||
<div class="grid__item">
|
||
<div class="copyright">
|
||
<a rel="me" href='https://twitter.com/home_assistant'><i class="icon-twitter"></i></a>
|
||
<a rel="me" href='https://facebook.com/homeassistantio'><i class="icon-facebook"></i></a>
|
||
<a rel="me" href='https://plus.google.com/110560654828510104551'><i class="icon-google-plus"></i></a>
|
||
<a rel="me" href='https://github.com/home-assistant/home-assistant'><i class="icon-github"></i></a>
|
||
<div class="credit">
|
||
Contact us at <a href='mailto:hello@home-assistant.io'>hello@home-assistant.io</a> (no support!).<br>
|
||
Website powered by <a href='http://jekyllrb.com/'>Jekyll</a> and the <a href='https://github.com/coogie/oscailte'>Oscalite theme</a>.<br />
|
||
Hosted by <a href='https://pages.github.com/'>GitHub</a> and served by <a href='https://cloudflare.com'>CloudFlare</a>.
|
||
</div>
|
||
<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/"><img alt="Creative Commons License" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png" /></a><br /><span xmlns:dct="http://purl.org/dc/terms/" property="dct:title">home-assistant.io</span> is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/">Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License</a>.
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</footer>
|
||
<script>
|
||
var _gaq=[['_setAccount','UA-57927901-1'],['_trackPageview']];
|
||
(function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];
|
||
g.src=('https:'==location.protocol?'//ssl':'//www')+'.google-analytics.com/ga.js';
|
||
s.parentNode.insertBefore(g,s)}(document,'script'));
|
||
</script>
|
||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/docsearch.js/2/docsearch.min.css" />
|
||
<script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/2/docsearch.min.js"></script>
|
||
<script type="text/javascript">
|
||
docsearch({
|
||
apiKey: 'ae96d94b201c5444c8a443093edf3efb',
|
||
indexName: 'home-assistant',
|
||
inputSelector: '#search',
|
||
debug: false // Set debug to true if you want to inspect the dropdown
|
||
});
|
||
document.querySelector('.search .close').addEventListener('click', function(ev) {
|
||
ev.preventDefault();
|
||
document.querySelector('.search-container').style.display = 'none';
|
||
});
|
||
document.querySelector('.show-search').addEventListener('click', function(ev) {
|
||
ev.preventDefault();
|
||
document.querySelector('.search-container').style.display = 'block';
|
||
document.getElementById('toggle').checked = false;
|
||
document.querySelector('.search-container input').focus();
|
||
});
|
||
</script>
|
||
</body>
|
||
</html>
|