mirror of
https://github.com/jpawlowski/hass.tibber_prices.git
synced 2026-03-30 05:13:40 +00:00
264 lines
No EOL
66 KiB
HTML
264 lines
No EOL
66 KiB
HTML
<!doctype html>
|
||
<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-refactoring-guide" data-has-hydrated="false">
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<meta name="generator" content="Docusaurus v3.9.2">
|
||
<title data-rh="true">Refactoring Guide | Tibber Prices - Developer Guide</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://jpawlowski.github.io/hass.tibber_prices/developer/img/social-card.png"><meta data-rh="true" name="twitter:image" content="https://jpawlowski.github.io/hass.tibber_prices/developer/img/social-card.png"><meta data-rh="true" property="og:url" content="https://jpawlowski.github.io/hass.tibber_prices/developer/refactoring-guide"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Refactoring Guide | Tibber Prices - Developer Guide"><meta data-rh="true" name="description" content="This guide explains how to plan and execute major refactorings in this project."><meta data-rh="true" property="og:description" content="This guide explains how to plan and execute major refactorings in this project."><link data-rh="true" rel="icon" href="/hass.tibber_prices/developer/img/logo.svg"><link data-rh="true" rel="canonical" href="https://jpawlowski.github.io/hass.tibber_prices/developer/refactoring-guide"><link data-rh="true" rel="alternate" href="https://jpawlowski.github.io/hass.tibber_prices/developer/refactoring-guide" hreflang="en"><link data-rh="true" rel="alternate" href="https://jpawlowski.github.io/hass.tibber_prices/developer/refactoring-guide" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Refactoring Guide","item":"https://jpawlowski.github.io/hass.tibber_prices/developer/refactoring-guide"}]}</script><link rel="preconnect" href="https://fonts.googleapis.com">
|
||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin="anonymous">
|
||
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Space+Grotesk:wght@500;600;700&display=swap"><link rel="stylesheet" href="/hass.tibber_prices/developer/assets/css/styles.be4f3d68.css">
|
||
<script src="/hass.tibber_prices/developer/assets/js/runtime~main.09b7b31a.js" defer="defer"></script>
|
||
<script src="/hass.tibber_prices/developer/assets/js/main.5eb4cf38.js" defer="defer"></script>
|
||
</head>
|
||
<body class="navigation-with-keyboard">
|
||
<svg style="display: none;"><defs>
|
||
<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
|
||
</defs></svg>
|
||
<script>!function(){var t=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",t||(window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light")),document.documentElement.setAttribute("data-theme-choice",t||"system")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/hass.tibber_prices/developer/img/logo.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/hass.tibber_prices/developer/"><div class="navbar__logo"><img src="/hass.tibber_prices/developer/img/logo.svg" alt="Tibber Prices Integration Logo" class="themedComponent_mlkZ themedComponent--light_NVdE"><img src="/hass.tibber_prices/developer/img/logo.svg" alt="Tibber Prices Integration Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU"></div><b class="navbar__title text--truncate">Tibber Prices HA</b></a><a class="navbar__item navbar__link" href="/hass.tibber_prices/developer/intro">Developer Guide</a><a href="https://jpawlowski.github.io/hass.tibber_prices/user/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">User Docs<svg width="13.5" height="13.5" aria-label="(opens in new tab)" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a class="navbar__item navbar__link" href="/hass.tibber_prices/developer/refactoring-guide">Next 🚧</a><a href="https://github.com/jpawlowski/hass.tibber_prices" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-label="(opens in new tab)" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search"><span aria-label="expand searchbar" role="button" class="search-icon" tabindex="0"></span><input id="search_input_react" type="search" placeholder="Loading..." aria-label="Search" class="navbar__search-input search-bar" disabled=""></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd"><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/hass.tibber_prices/developer/intro"><span title="Developer Documentation" class="linkLabel_WmDU">Developer Documentation</span></a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="true" href="/hass.tibber_prices/developer/architecture"><span title="🏗️ Architecture" class="categoryLinkLabel_W154">🏗️ Architecture</span></a></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/hass.tibber_prices/developer/architecture"><span title="Architecture" class="linkLabel_WmDU">Architecture</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/hass.tibber_prices/developer/timer-architecture"><span title="Timer Architecture" class="linkLabel_WmDU">Timer Architecture</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/hass.tibber_prices/developer/caching-strategy"><span title="Caching Strategy" class="linkLabel_WmDU">Caching Strategy</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/hass.tibber_prices/developer/api-reference"><span title="API Reference" class="linkLabel_WmDU">API Reference</span></a></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="true" href="/hass.tibber_prices/developer/setup"><span title="💻 Development" class="categoryLinkLabel_W154">💻 Development</span></a></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/hass.tibber_prices/developer/setup"><span title="Development Setup" class="linkLabel_WmDU">Development Setup</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/hass.tibber_prices/developer/coding-guidelines"><span title="Coding Guidelines" class="linkLabel_WmDU">Coding Guidelines</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/hass.tibber_prices/developer/critical-patterns"><span title="Critical Behavior Patterns - Testing Guide" class="linkLabel_WmDU">Critical Behavior Patterns - Testing Guide</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/hass.tibber_prices/developer/debugging"><span title="Debugging Guide" class="linkLabel_WmDU">Debugging Guide</span></a></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret menu__link--active" role="button" aria-expanded="true" href="/hass.tibber_prices/developer/period-calculation-theory"><span title="📐 Advanced Topics" class="categoryLinkLabel_W154">📐 Advanced Topics</span></a></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/hass.tibber_prices/developer/period-calculation-theory"><span title="Period Calculation Theory" class="linkLabel_WmDU">Period Calculation Theory</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/hass.tibber_prices/developer/refactoring-guide"><span title="Refactoring Guide" class="linkLabel_WmDU">Refactoring Guide</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/hass.tibber_prices/developer/performance"><span title="Performance Optimization" class="linkLabel_WmDU">Performance Optimization</span></a></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="true" href="/hass.tibber_prices/developer/contributing"><span title="📝 Contributing" class="categoryLinkLabel_W154">📝 Contributing</span></a></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/hass.tibber_prices/developer/contributing"><span title="Contributing Guide" class="linkLabel_WmDU">Contributing Guide</span></a></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="true" href="/hass.tibber_prices/developer/release-management"><span title="🚀 Release" class="categoryLinkLabel_W154">🚀 Release</span></a></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/hass.tibber_prices/developer/release-management"><span title="Release Notes Generation" class="linkLabel_WmDU">Release Notes Generation</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/hass.tibber_prices/developer/testing"><span title="Testing" class="linkLabel_WmDU">Testing</span></a></li></ul></li></ul></nav><button type="button" title="Collapse sidebar" aria-label="Collapse sidebar" class="button button--secondary button--outline collapseSidebarButton_PEFL"><svg width="20" height="20" aria-hidden="true" class="collapseSidebarButtonIcon_kv0_"><g fill="#7a7a7a"><path d="M9.992 10.023c0 .2-.062.399-.172.547l-4.996 7.492a.982.982 0 01-.828.454H1c-.55 0-1-.453-1-1 0-.2.059-.403.168-.551l4.629-6.942L.168 3.078A.939.939 0 010 2.528c0-.548.45-.997 1-.997h2.996c.352 0 .649.18.828.45L9.82 9.472c.11.148.172.347.172.55zm0 0"></path><path d="M19.98 10.023c0 .2-.058.399-.168.547l-4.996 7.492a.987.987 0 01-.828.454h-3c-.547 0-.996-.453-.996-1 0-.2.059-.403.168-.551l4.625-6.942-4.625-6.945a.939.939 0 01-.168-.55 1 1 0 01.996-.997h3c.348 0 .649.18.828.45l4.996 7.492c.11.148.168.347.168.55zm0 0"></path></g></svg></button></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="theme-doc-version-banner alert alert--warning margin-bottom--md" role="alert"><div>This is unreleased documentation for <!-- -->Tibber Prices - Developer Guide<!-- --> <b>Next 🚧</b> version.</div><div class="margin-top--md">For up-to-date documentation, see the <b><a href="/hass.tibber_prices/developer/refactoring-guide">latest version</a></b> (<!-- -->Next 🚧<!-- -->).</div></div><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/hass.tibber_prices/developer/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><span class="breadcrumbs__link">📐 Advanced Topics</span></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Refactoring Guide</span></li></ul></nav><span class="theme-doc-version-badge badge badge--secondary">Version: Next 🚧</span><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Refactoring Guide</h1></header>
|
||
<p>This guide explains how to plan and execute major refactorings in this project.</p>
|
||
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="when-to-plan-a-refactoring">When to Plan a Refactoring<a href="#when-to-plan-a-refactoring" class="hash-link" aria-label="Direct link to When to Plan a Refactoring" title="Direct link to When to Plan a Refactoring" translate="no"></a></h2>
|
||
<p>Not every code change needs a detailed plan. Create a refactoring plan when:</p>
|
||
<p>🔴 <strong>Major changes requiring planning:</strong></p>
|
||
<ul>
|
||
<li class="">Splitting modules into packages (>5 files affected, >500 lines moved)</li>
|
||
<li class="">Architectural changes (new packages, module restructuring)</li>
|
||
<li class="">Breaking changes (API changes, config format migrations)</li>
|
||
</ul>
|
||
<p>🟡 <strong>Medium changes that might benefit from planning:</strong></p>
|
||
<ul>
|
||
<li class="">Complex features with multiple moving parts</li>
|
||
<li class="">Changes affecting many files (>3 files, unclear best approach)</li>
|
||
<li class="">Refactorings with unclear scope</li>
|
||
</ul>
|
||
<p>🟢 <strong>Small changes - no planning needed:</strong></p>
|
||
<ul>
|
||
<li class="">Bug fixes (straightforward, <code><</code>100 lines)</li>
|
||
<li class="">Small features (<code><</code>3 files, clear approach)</li>
|
||
<li class="">Documentation updates</li>
|
||
<li class="">Cosmetic changes (formatting, renaming)</li>
|
||
</ul>
|
||
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-planning-process">The Planning Process<a href="#the-planning-process" class="hash-link" aria-label="Direct link to The Planning Process" title="Direct link to The Planning Process" translate="no"></a></h2>
|
||
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-create-a-planning-document">1. Create a Planning Document<a href="#1-create-a-planning-document" class="hash-link" aria-label="Direct link to 1. Create a Planning Document" title="Direct link to 1. Create a Planning Document" translate="no"></a></h3>
|
||
<p>Create a file in the <code>planning/</code> directory (git-ignored for free iteration):</p>
|
||
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Example:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">touch</span><span class="token plain"> planning/my-feature-refactoring-plan.md</span><br></span></code></pre></div></div>
|
||
<p><strong>Note:</strong> The <code>planning/</code> directory is git-ignored, so you can iterate freely without polluting git history.</p>
|
||
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-use-the-planning-template">2. Use the Planning Template<a href="#2-use-the-planning-template" class="hash-link" aria-label="Direct link to 2. Use the Planning Template" title="Direct link to 2. Use the Planning Template" translate="no"></a></h3>
|
||
<p>Every planning document should include:</p>
|
||
<div class="language-markdown codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-markdown codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token title important punctuation" style="color:#393A34">#</span><span class="token title important"> <Feature> Refactoring Plan</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token bold content">Status</span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token plain">: 🔄 PLANNING | 🚧 IN PROGRESS | ✅ COMPLETED | ❌ CANCELLED</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token bold content">Created</span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token plain">: YYYY-MM-DD</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token bold content">Last Updated</span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token plain">: YYYY-MM-DD</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token title important punctuation" style="color:#393A34">##</span><span class="token title important"> Problem Statement</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> What's the issue?</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> Why does it need fixing?</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> Current pain points</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token title important punctuation" style="color:#393A34">##</span><span class="token title important"> Proposed Solution</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> High-level approach</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> File structure (before/after)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> Module responsibilities</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token title important punctuation" style="color:#393A34">##</span><span class="token title important"> Migration Strategy</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> Phase-by-phase breakdown</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> File lifecycle (CREATE/MODIFY/DELETE/RENAME)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> Dependencies between phases</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> Testing checkpoints</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token title important punctuation" style="color:#393A34">##</span><span class="token title important"> Risks & Mitigation</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> What could go wrong?</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> How to prevent it?</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> Rollback strategy</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token title important punctuation" style="color:#393A34">##</span><span class="token title important"> Success Criteria</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> Measurable improvements</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> Testing requirements</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> Verification steps</span><br></span></code></pre></div></div>
|
||
<p>See <code>planning/README.md</code> for detailed template explanation.</p>
|
||
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-iterate-freely">3. Iterate Freely<a href="#3-iterate-freely" class="hash-link" aria-label="Direct link to 3. Iterate Freely" title="Direct link to 3. Iterate Freely" translate="no"></a></h3>
|
||
<p>Since <code>planning/</code> is git-ignored:</p>
|
||
<ul>
|
||
<li class="">Draft multiple versions</li>
|
||
<li class="">Get AI assistance without commit pressure</li>
|
||
<li class="">Refine until the plan is solid</li>
|
||
<li class="">No need to clean up intermediate versions</li>
|
||
</ul>
|
||
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-implementation-phase">4. Implementation Phase<a href="#4-implementation-phase" class="hash-link" aria-label="Direct link to 4. Implementation Phase" title="Direct link to 4. Implementation Phase" translate="no"></a></h3>
|
||
<p>Once plan is approved:</p>
|
||
<ul>
|
||
<li class="">Follow the phases defined in the plan</li>
|
||
<li class="">Test after each phase (don't skip!)</li>
|
||
<li class="">Update plan if issues discovered</li>
|
||
<li class="">Track progress through phase status</li>
|
||
</ul>
|
||
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-after-completion">5. After Completion<a href="#5-after-completion" class="hash-link" aria-label="Direct link to 5. After Completion" title="Direct link to 5. After Completion" translate="no"></a></h3>
|
||
<p><strong>Option A: Archive in docs/development/</strong>
|
||
If the plan has lasting value (successful pattern, reusable approach):</p>
|
||
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">mv</span><span class="token plain"> planning/my-feature-refactoring-plan.md docs/development/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">add</span><span class="token plain"> docs/development/my-feature-refactoring-plan.md</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> commit </span><span class="token parameter variable" style="color:#36acaa">-m</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"docs: archive successful refactoring plan"</span><br></span></code></pre></div></div>
|
||
<p><strong>Option B: Delete</strong>
|
||
If the plan served its purpose and code is the source of truth:</p>
|
||
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">rm</span><span class="token plain"> planning/my-feature-refactoring-plan.md</span><br></span></code></pre></div></div>
|
||
<p><strong>Option C: Keep locally (not committed)</strong>
|
||
For "why we didn't do X" reference:</p>
|
||
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">mkdir</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-p</span><span class="token plain"> planning/archive</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">mv</span><span class="token plain"> planning/my-feature-refactoring-plan.md planning/archive/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Still git-ignored, just organized</span><br></span></code></pre></div></div>
|
||
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="real-world-example">Real-World Example<a href="#real-world-example" class="hash-link" aria-label="Direct link to Real-World Example" title="Direct link to Real-World Example" translate="no"></a></h2>
|
||
<p>The <strong>sensor/ package refactoring</strong> (Nov 2025) is a successful example:</p>
|
||
<p><strong>Before:</strong></p>
|
||
<ul>
|
||
<li class=""><code>sensor.py</code> - 2,574 lines, hard to navigate</li>
|
||
</ul>
|
||
<p><strong>After:</strong></p>
|
||
<ul>
|
||
<li class=""><code>sensor/</code> package with 5 focused modules</li>
|
||
<li class="">Each module <code><</code>800 lines</li>
|
||
<li class="">Clear separation of concerns</li>
|
||
</ul>
|
||
<p><strong>Process:</strong></p>
|
||
<ol>
|
||
<li class="">Created <code>planning/module-splitting-plan.md</code> (now in <code>docs/development/</code>)</li>
|
||
<li class="">Defined 6 phases with clear file lifecycle</li>
|
||
<li class="">Implemented phase by phase</li>
|
||
<li class="">Tested after each phase</li>
|
||
<li class="">Documented in AGENTS.md</li>
|
||
<li class="">Moved plan to <code>docs/development/</code> as reference</li>
|
||
</ol>
|
||
<p><strong>Key learnings:</strong></p>
|
||
<ul>
|
||
<li class="">Temporary <code>_impl.py</code> files avoid Python package conflicts</li>
|
||
<li class="">Test after EVERY phase (don't accumulate changes)</li>
|
||
<li class="">Clear file lifecycle (CREATE/MODIFY/DELETE/RENAME)</li>
|
||
<li class="">Phase-by-phase approach enables safe rollback</li>
|
||
</ul>
|
||
<p><strong>Note:</strong> The complete module splitting plan was documented during implementation but has been superseded by the actual code structure.</p>
|
||
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="phase-by-phase-implementation">Phase-by-Phase Implementation<a href="#phase-by-phase-implementation" class="hash-link" aria-label="Direct link to Phase-by-Phase Implementation" title="Direct link to Phase-by-Phase Implementation" translate="no"></a></h2>
|
||
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-phases-matter">Why Phases Matter<a href="#why-phases-matter" class="hash-link" aria-label="Direct link to Why Phases Matter" title="Direct link to Why Phases Matter" translate="no"></a></h3>
|
||
<p>Breaking refactorings into phases:</p>
|
||
<ul>
|
||
<li class="">✅ Enables testing after each change (catch bugs early)</li>
|
||
<li class="">✅ Allows rollback to last good state</li>
|
||
<li class="">✅ Makes progress visible</li>
|
||
<li class="">✅ Reduces cognitive load (focus on one thing)</li>
|
||
<li class="">❌ Takes more time (but worth it!)</li>
|
||
</ul>
|
||
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="phase-structure">Phase Structure<a href="#phase-structure" class="hash-link" aria-label="Direct link to Phase Structure" title="Direct link to Phase Structure" translate="no"></a></h3>
|
||
<p>Each phase should:</p>
|
||
<ol>
|
||
<li class=""><strong>Have clear goal</strong> - What's being changed?</li>
|
||
<li class=""><strong>Document file lifecycle</strong> - CREATE/MODIFY/DELETE/RENAME</li>
|
||
<li class=""><strong>Define success criteria</strong> - How to verify it worked?</li>
|
||
<li class=""><strong>Include testing steps</strong> - What to test?</li>
|
||
<li class=""><strong>Estimate time</strong> - Realistic time budget</li>
|
||
</ol>
|
||
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="example-phase-documentation">Example Phase Documentation<a href="#example-phase-documentation" class="hash-link" aria-label="Direct link to Example Phase Documentation" title="Direct link to Example Phase Documentation" translate="no"></a></h3>
|
||
<div class="language-markdown codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-markdown codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token title important punctuation" style="color:#393A34">###</span><span class="token title important"> Phase 3: Extract Helper Functions (Session 3)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token bold content">Goal</span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token plain">: Move pure utility functions to helpers.py</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token bold content">File Lifecycle</span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token plain">:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> ✨ CREATE </span><span class="token code-snippet code keyword" style="color:#00009f">`sensor/helpers.py`</span><span class="token plain"> (utility functions)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> ✏️ MODIFY </span><span class="token code-snippet code keyword" style="color:#00009f">`sensor/core.py`</span><span class="token plain"> (import from helpers.py)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token bold content">Steps</span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token plain">:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">1.</span><span class="token plain"> Create sensor/helpers.py</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">2.</span><span class="token plain"> Move pure functions (no state, no self)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">3.</span><span class="token plain"> Add comprehensive docstrings</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">4.</span><span class="token plain"> Update imports in core.py</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token bold content">Estimated time</span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token plain">: 45 minutes</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token bold content">Success criteria</span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token plain">:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> ✅ All pure functions moved</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> ✅ </span><span class="token code-snippet code keyword" style="color:#00009f">`./scripts/lint-check`</span><span class="token plain"> passes</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> ✅ HA starts successfully</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> ✅ All entities work correctly</span><br></span></code></pre></div></div>
|
||
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="testing-strategy">Testing Strategy<a href="#testing-strategy" class="hash-link" aria-label="Direct link to Testing Strategy" title="Direct link to Testing Strategy" translate="no"></a></h2>
|
||
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="after-each-phase">After Each Phase<a href="#after-each-phase" class="hash-link" aria-label="Direct link to After Each Phase" title="Direct link to After Each Phase" translate="no"></a></h3>
|
||
<p>Minimum testing checklist:</p>
|
||
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 1. Linting passes</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">./scripts/lint-check</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 2. Home Assistant starts</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">./scripts/develop</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Watch for startup errors in logs</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 3. Integration loads</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Check: Settings → Devices & Services → Tibber Prices</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Verify: All entities appear</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 4. Basic functionality</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Test: Data updates without errors</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Check: Entity states update correctly</span><br></span></code></pre></div></div>
|
||
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="comprehensive-testing-final-phase">Comprehensive Testing (Final Phase)<a href="#comprehensive-testing-final-phase" class="hash-link" aria-label="Direct link to Comprehensive Testing (Final Phase)" title="Direct link to Comprehensive Testing (Final Phase)" translate="no"></a></h3>
|
||
<p>After completing all phases:</p>
|
||
<ul>
|
||
<li class="">Test all entities (sensors, binary sensors)</li>
|
||
<li class="">Test configuration flow (add/modify/remove)</li>
|
||
<li class="">Test options flow (change settings)</li>
|
||
<li class="">Test services (custom service calls)</li>
|
||
<li class="">Test error handling (disconnect API, invalid data)</li>
|
||
<li class="">Test caching (restart HA, verify cache loads)</li>
|
||
<li class="">Test time-based updates (quarter-hour refresh)</li>
|
||
</ul>
|
||
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="common-pitfalls">Common Pitfalls<a href="#common-pitfalls" class="hash-link" aria-label="Direct link to Common Pitfalls" title="Direct link to Common Pitfalls" translate="no"></a></h2>
|
||
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-skip-planning-for-large-changes">❌ Skip Planning for Large Changes<a href="#-skip-planning-for-large-changes" class="hash-link" aria-label="Direct link to ❌ Skip Planning for Large Changes" title="Direct link to ❌ Skip Planning for Large Changes" translate="no"></a></h3>
|
||
<p><strong>Problem:</strong> "This seems straightforward, I'll just start coding..."</p>
|
||
<p><strong>Result:</strong> Halfway through, realize the approach doesn't work. Wasted time.</p>
|
||
<p><strong>Solution:</strong> If unsure, spend 30 minutes on a rough plan. Better to plan and discard than get stuck.</p>
|
||
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-implement-all-phases-at-once">❌ Implement All Phases at Once<a href="#-implement-all-phases-at-once" class="hash-link" aria-label="Direct link to ❌ Implement All Phases at Once" title="Direct link to ❌ Implement All Phases at Once" translate="no"></a></h3>
|
||
<p><strong>Problem:</strong> "I'll do all phases, then test everything..."</p>
|
||
<p><strong>Result:</strong> 10+ files changed, 2000+ lines modified, hard to debug if something breaks.</p>
|
||
<p><strong>Solution:</strong> Test after EVERY phase. Commit after each successful phase.</p>
|
||
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-forget-to-update-documentation">❌ Forget to Update Documentation<a href="#-forget-to-update-documentation" class="hash-link" aria-label="Direct link to ❌ Forget to Update Documentation" title="Direct link to ❌ Forget to Update Documentation" translate="no"></a></h3>
|
||
<p><strong>Problem:</strong> Code is refactored, but AGENTS.md and docs/ still reference old structure.</p>
|
||
<p><strong>Result:</strong> AI/humans get confused by outdated documentation.</p>
|
||
<p><strong>Solution:</strong> Include "Documentation Phase" at the end of every refactoring plan.</p>
|
||
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-ignore-the-planning-directory">❌ Ignore the Planning Directory<a href="#-ignore-the-planning-directory" class="hash-link" aria-label="Direct link to ❌ Ignore the Planning Directory" title="Direct link to ❌ Ignore the Planning Directory" translate="no"></a></h3>
|
||
<p><strong>Problem:</strong> "I'll just create the plan in docs/ directly..."</p>
|
||
<p><strong>Result:</strong> Git history polluted with draft iterations, or pressure to "commit something" too early.</p>
|
||
<p><strong>Solution:</strong> Always use <code>planning/</code> for work-in-progress. Move to <code>docs/</code> only when done.</p>
|
||
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="integration-with-ai-development">Integration with AI Development<a href="#integration-with-ai-development" class="hash-link" aria-label="Direct link to Integration with AI Development" title="Direct link to Integration with AI Development" translate="no"></a></h2>
|
||
<p>This project uses AI heavily (GitHub Copilot, Claude). The planning process supports AI development:</p>
|
||
<p><strong>AI reads from:</strong></p>
|
||
<ul>
|
||
<li class=""><code>AGENTS.md</code> - Long-term memory, patterns, conventions (AI-focused)</li>
|
||
<li class=""><code>docs/development/</code> - Human-readable guides (human-focused)</li>
|
||
<li class=""><code>planning/</code> - Active refactoring plans (shared context)</li>
|
||
</ul>
|
||
<p><strong>AI updates:</strong></p>
|
||
<ul>
|
||
<li class=""><code>AGENTS.md</code> - When patterns change</li>
|
||
<li class=""><code>planning/*.md</code> - During refactoring implementation</li>
|
||
<li class=""><code>docs/development/</code> - After successful completion</li>
|
||
</ul>
|
||
<p><strong>Why separate AGENTS.md and docs/development/?</strong></p>
|
||
<ul>
|
||
<li class=""><code>AGENTS.md</code>: Technical, comprehensive, AI-optimized</li>
|
||
<li class=""><code>docs/development/</code>: Practical, focused, human-optimized</li>
|
||
<li class="">Both stay in sync but serve different audiences</li>
|
||
</ul>
|
||
<p>See <a href="https://github.com/jpawlowski/hass.tibber_prices/blob/v0.20.0/AGENTS.md" target="_blank" rel="noopener noreferrer" class="">AGENTS.md</a> section "Planning Major Refactorings" for AI-specific guidance.</p>
|
||
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tools-and-resources">Tools and Resources<a href="#tools-and-resources" class="hash-link" aria-label="Direct link to Tools and Resources" title="Direct link to Tools and Resources" translate="no"></a></h2>
|
||
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="planning-directory">Planning Directory<a href="#planning-directory" class="hash-link" aria-label="Direct link to Planning Directory" title="Direct link to Planning Directory" translate="no"></a></h3>
|
||
<ul>
|
||
<li class=""><code>planning/</code> - Git-ignored workspace for drafts</li>
|
||
<li class=""><code>planning/README.md</code> - Detailed planning documentation</li>
|
||
<li class=""><code>planning/*.md</code> - Active refactoring plans</li>
|
||
</ul>
|
||
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="example-plans">Example Plans<a href="#example-plans" class="hash-link" aria-label="Direct link to Example Plans" title="Direct link to Example Plans" translate="no"></a></h3>
|
||
<ul>
|
||
<li class=""><code>docs/development/module-splitting-plan.md</code> - ✅ Completed, archived</li>
|
||
<li class=""><code>planning/config-flow-refactoring-plan.md</code> - 🔄 Planned (1013 lines → 4 modules)</li>
|
||
<li class=""><code>planning/binary-sensor-refactoring-plan.md</code> - 🔄 Planned (644 lines → 4 modules)</li>
|
||
<li class=""><code>planning/coordinator-refactoring-plan.md</code> - 🔄 Planned (1446 lines, high complexity)</li>
|
||
</ul>
|
||
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="helper-scripts">Helper Scripts<a href="#helper-scripts" class="hash-link" aria-label="Direct link to Helper Scripts" title="Direct link to Helper Scripts" translate="no"></a></h3>
|
||
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">./scripts/lint-check </span><span class="token comment" style="color:#999988;font-style:italic"># Verify code quality</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">./scripts/develop </span><span class="token comment" style="color:#999988;font-style:italic"># Start HA for testing</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">./scripts/lint </span><span class="token comment" style="color:#999988;font-style:italic"># Auto-fix issues</span><br></span></code></pre></div></div>
|
||
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="faq">FAQ<a href="#faq" class="hash-link" aria-label="Direct link to FAQ" title="Direct link to FAQ" translate="no"></a></h2>
|
||
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="q-when-should-i-create-a-plan-vs-just-start-coding">Q: When should I create a plan vs. just start coding?<a href="#q-when-should-i-create-a-plan-vs-just-start-coding" class="hash-link" aria-label="Direct link to Q: When should I create a plan vs. just start coding?" title="Direct link to Q: When should I create a plan vs. just start coding?" translate="no"></a></h3>
|
||
<p><strong>A:</strong> If you're asking this question, you probably need a plan. 😊</p>
|
||
<p>Simple rule: If you can't describe the entire change in 3 sentences, create a plan.</p>
|
||
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="q-how-detailed-should-the-plan-be">Q: How detailed should the plan be?<a href="#q-how-detailed-should-the-plan-be" class="hash-link" aria-label="Direct link to Q: How detailed should the plan be?" title="Direct link to Q: How detailed should the plan be?" translate="no"></a></h3>
|
||
<p><strong>A:</strong> Detailed enough to execute without major surprises, but not a line-by-line script.</p>
|
||
<p>Good plan level:</p>
|
||
<ul>
|
||
<li class="">Lists all files affected (CREATE/MODIFY/DELETE)</li>
|
||
<li class="">Defines phases with clear boundaries</li>
|
||
<li class="">Includes testing strategy</li>
|
||
<li class="">Estimates time per phase</li>
|
||
</ul>
|
||
<p>Too detailed:</p>
|
||
<ul>
|
||
<li class="">Exact code snippets for every change</li>
|
||
<li class="">Line-by-line instructions</li>
|
||
</ul>
|
||
<p>Too vague:</p>
|
||
<ul>
|
||
<li class="">"Refactor sensor.py to be better"</li>
|
||
<li class="">No phase breakdown</li>
|
||
<li class="">No testing strategy</li>
|
||
</ul>
|
||
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="q-what-if-the-plan-changes-during-implementation">Q: What if the plan changes during implementation?<a href="#q-what-if-the-plan-changes-during-implementation" class="hash-link" aria-label="Direct link to Q: What if the plan changes during implementation?" title="Direct link to Q: What if the plan changes during implementation?" translate="no"></a></h3>
|
||
<p><strong>A:</strong> Update the plan! Planning documents are living documents.</p>
|
||
<p>If you discover:</p>
|
||
<ul>
|
||
<li class="">Better approach → Update "Proposed Solution"</li>
|
||
<li class="">More phases needed → Add to "Migration Strategy"</li>
|
||
<li class="">New risks → Update "Risks & Mitigation"</li>
|
||
</ul>
|
||
<p>Document WHY the plan changed (helps future refactorings).</p>
|
||
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="q-should-every-refactoring-follow-this-process">Q: Should every refactoring follow this process?<a href="#q-should-every-refactoring-follow-this-process" class="hash-link" aria-label="Direct link to Q: Should every refactoring follow this process?" title="Direct link to Q: Should every refactoring follow this process?" translate="no"></a></h3>
|
||
<p><strong>A:</strong> No! Use judgment:</p>
|
||
<ul>
|
||
<li class=""><strong>Small changes (<code><</code>100 lines, clear approach)</strong>: Just do it, no plan needed</li>
|
||
<li class=""><strong>Medium changes (unclear scope)</strong>: Write rough outline, refine if needed</li>
|
||
<li class=""><strong>Large changes (>500 lines, >5 files)</strong>: Full planning process</li>
|
||
</ul>
|
||
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="q-how-do-i-know-when-a-refactoring-is-successful">Q: How do I know when a refactoring is successful?<a href="#q-how-do-i-know-when-a-refactoring-is-successful" class="hash-link" aria-label="Direct link to Q: How do I know when a refactoring is successful?" title="Direct link to Q: How do I know when a refactoring is successful?" translate="no"></a></h3>
|
||
<p><strong>A:</strong> Check the "Success Criteria" from your plan:</p>
|
||
<p>Typical criteria:</p>
|
||
<ul>
|
||
<li class="">✅ All linting checks pass</li>
|
||
<li class="">✅ HA starts without errors</li>
|
||
<li class="">✅ All entities functional</li>
|
||
<li class="">✅ No regressions (existing features work)</li>
|
||
<li class="">✅ Code easier to understand/modify</li>
|
||
<li class="">✅ Documentation updated</li>
|
||
</ul>
|
||
<p>If you can't tick all boxes, the refactoring isn't done.</p>
|
||
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="summary">Summary<a href="#summary" class="hash-link" aria-label="Direct link to Summary" title="Direct link to Summary" translate="no"></a></h2>
|
||
<p><strong>Key takeaways:</strong></p>
|
||
<ol>
|
||
<li class=""><strong>Plan when scope is unclear</strong> (>500 lines, >5 files, breaking changes)</li>
|
||
<li class=""><strong>Use planning/ directory</strong> for free iteration (git-ignored)</li>
|
||
<li class=""><strong>Work in phases</strong> and test after each phase</li>
|
||
<li class=""><strong>Document file lifecycle</strong> (CREATE/MODIFY/DELETE/RENAME)</li>
|
||
<li class=""><strong>Update documentation</strong> after completion (AGENTS.md, docs/)</li>
|
||
<li class=""><strong>Archive or delete</strong> plan after implementation</li>
|
||
</ol>
|
||
<p><strong>Remember:</strong> Good planning prevents half-finished refactorings and makes rollback easier when things go wrong.</p>
|
||
<hr>
|
||
<p><strong>Next steps:</strong></p>
|
||
<ul>
|
||
<li class="">Read <code>planning/README.md</code> for detailed template</li>
|
||
<li class="">Check <code>docs/development/module-splitting-plan.md</code> for real example</li>
|
||
<li class="">Browse <code>planning/</code> for active refactoring plans</li>
|
||
</ul></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="row margin-top--sm theme-doc-footer-edit-meta-row"><div class="col noPrint_WFHX"><a href="https://github.com/jpawlowski/hass.tibber_prices/tree/main/docs/developer/docs/refactoring-guide.md" target="_blank" rel="noopener noreferrer" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit_Z9Sw" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"></path></g></svg>Edit this page</a></div><div class="col lastUpdated_JAkA"><span class="theme-last-updated">Last updated<!-- --> on <b><time datetime="2025-12-06T01:37:06.000Z" itemprop="dateModified">Dec 6, 2025</time></b></span></div></div></footer></article><nav class="docusaurus-mt-lg pagination-nav" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/hass.tibber_prices/developer/period-calculation-theory"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Period Calculation Theory</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/hass.tibber_prices/developer/performance"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">Performance Optimization</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_bqdL thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#when-to-plan-a-refactoring" class="table-of-contents__link toc-highlight">When to Plan a Refactoring</a></li><li><a href="#the-planning-process" class="table-of-contents__link toc-highlight">The Planning Process</a><ul><li><a href="#1-create-a-planning-document" class="table-of-contents__link toc-highlight">1. Create a Planning Document</a></li><li><a href="#2-use-the-planning-template" class="table-of-contents__link toc-highlight">2. Use the Planning Template</a></li><li><a href="#3-iterate-freely" class="table-of-contents__link toc-highlight">3. Iterate Freely</a></li><li><a href="#4-implementation-phase" class="table-of-contents__link toc-highlight">4. Implementation Phase</a></li><li><a href="#5-after-completion" class="table-of-contents__link toc-highlight">5. After Completion</a></li></ul></li><li><a href="#real-world-example" class="table-of-contents__link toc-highlight">Real-World Example</a></li><li><a href="#phase-by-phase-implementation" class="table-of-contents__link toc-highlight">Phase-by-Phase Implementation</a><ul><li><a href="#why-phases-matter" class="table-of-contents__link toc-highlight">Why Phases Matter</a></li><li><a href="#phase-structure" class="table-of-contents__link toc-highlight">Phase Structure</a></li><li><a href="#example-phase-documentation" class="table-of-contents__link toc-highlight">Example Phase Documentation</a></li></ul></li><li><a href="#testing-strategy" class="table-of-contents__link toc-highlight">Testing Strategy</a><ul><li><a href="#after-each-phase" class="table-of-contents__link toc-highlight">After Each Phase</a></li><li><a href="#comprehensive-testing-final-phase" class="table-of-contents__link toc-highlight">Comprehensive Testing (Final Phase)</a></li></ul></li><li><a href="#common-pitfalls" class="table-of-contents__link toc-highlight">Common Pitfalls</a><ul><li><a href="#-skip-planning-for-large-changes" class="table-of-contents__link toc-highlight">❌ Skip Planning for Large Changes</a></li><li><a href="#-implement-all-phases-at-once" class="table-of-contents__link toc-highlight">❌ Implement All Phases at Once</a></li><li><a href="#-forget-to-update-documentation" class="table-of-contents__link toc-highlight">❌ Forget to Update Documentation</a></li><li><a href="#-ignore-the-planning-directory" class="table-of-contents__link toc-highlight">❌ Ignore the Planning Directory</a></li></ul></li><li><a href="#integration-with-ai-development" class="table-of-contents__link toc-highlight">Integration with AI Development</a></li><li><a href="#tools-and-resources" class="table-of-contents__link toc-highlight">Tools and Resources</a><ul><li><a href="#planning-directory" class="table-of-contents__link toc-highlight">Planning Directory</a></li><li><a href="#example-plans" class="table-of-contents__link toc-highlight">Example Plans</a></li><li><a href="#helper-scripts" class="table-of-contents__link toc-highlight">Helper Scripts</a></li></ul></li><li><a href="#faq" class="table-of-contents__link toc-highlight">FAQ</a><ul><li><a href="#q-when-should-i-create-a-plan-vs-just-start-coding" class="table-of-contents__link toc-highlight">Q: When should I create a plan vs. just start coding?</a></li><li><a href="#q-how-detailed-should-the-plan-be" class="table-of-contents__link toc-highlight">Q: How detailed should the plan be?</a></li><li><a href="#q-what-if-the-plan-changes-during-implementation" class="table-of-contents__link toc-highlight">Q: What if the plan changes during implementation?</a></li><li><a href="#q-should-every-refactoring-follow-this-process" class="table-of-contents__link toc-highlight">Q: Should every refactoring follow this process?</a></li><li><a href="#q-how-do-i-know-when-a-refactoring-is-successful" class="table-of-contents__link toc-highlight">Q: How do I know when a refactoring is successful?</a></li></ul></li><li><a href="#summary" class="table-of-contents__link toc-highlight">Summary</a></li></ul></div></div></div></div></main></div></div></div><footer class="theme-layout-footer footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="theme-layout-footer-column col footer__col"><div class="footer__title">Documentation</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://jpawlowski.github.io/hass.tibber_prices/user/" target="_blank" rel="noopener noreferrer" class="footer__link-item">User Guide<svg width="13.5" height="13.5" aria-label="(opens in new tab)" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li><li class="footer__item"><a class="footer__link-item" href="/hass.tibber_prices/developer/intro">Developer Guide</a></li></ul></div><div class="theme-layout-footer-column col footer__col"><div class="footer__title">Community</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://github.com/jpawlowski/hass.tibber_prices/issues" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub Issues<svg width="13.5" height="13.5" aria-label="(opens in new tab)" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li><li class="footer__item"><a href="https://community.home-assistant.io/" target="_blank" rel="noopener noreferrer" class="footer__link-item">Home Assistant Community<svg width="13.5" height="13.5" aria-label="(opens in new tab)" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li></ul></div><div class="theme-layout-footer-column col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://github.com/jpawlowski/hass.tibber_prices" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-label="(opens in new tab)" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li><li class="footer__item"><a href="https://github.com/jpawlowski/hass.tibber_prices/releases" target="_blank" rel="noopener noreferrer" class="footer__link-item">Release Notes<svg width="13.5" height="13.5" aria-label="(opens in new tab)" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">Not affiliated with Tibber AS. Community-maintained custom integration. Built with Docusaurus.</div></div></div></footer></div>
|
||
</body>
|
||
</html> |