blob: 0f6ec8eb7a17c7b05a745231950e44dacd0c3f76 [file] [log] [blame]
"use strict";(self.webpackChunkdocs_v_2=self.webpackChunkdocs_v_2||[]).push([[8888],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>g});var r=n(67294);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){i(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function l(e,t){if(null==e)return{};var n,r,i=function(e,t){if(null==e)return{};var n,r,i={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,i=e.mdxType,o=e.originalType,s=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),u=c(n),m=i,g=u["".concat(s,".").concat(m)]||u[m]||d[m]||o;return n?r.createElement(g,a(a({ref:t},p),{},{components:n})):r.createElement(g,a({ref:t},p))}));function g(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var o=n.length,a=new Array(o);a[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[u]="string"==typeof e?e:i,a[1]=l;for(var c=2;c<o;c++)a[c]=n[c];return r.createElement.apply(null,a)}return r.createElement.apply(null,n)}m.displayName="MDXCreateElement"},79320:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>d,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var r=n(83117),i=(n(67294),n(3905));const o={title:"Pre-commit Hooks and Linting",hide_title:!0,sidebar_position:6,version:1},a=void 0,l={unversionedId:"contributing/hooks-and-linting",id:"contributing/hooks-and-linting",title:"Pre-commit Hooks and Linting",description:"Git Hooks",source:"@site/docs/contributing/hooks-and-linting.mdx",sourceDirName:"contributing",slug:"/contributing/hooks-and-linting",permalink:"/docs/contributing/hooks-and-linting",draft:!1,editUrl:"https://github.com/apache/superset/tree/master/docs/docs/contributing/hooks-and-linting.mdx",tags:[],version:"current",sidebarPosition:6,frontMatter:{title:"Pre-commit Hooks and Linting",hide_title:!0,sidebar_position:6,version:1},sidebar:"tutorialSidebar",previous:{title:"Running a Local Flask Backend",permalink:"/docs/contributing/local-backend"},next:{title:"Conventions and Typing",permalink:"/docs/contributing/conventions-and-typing"}},s={},c=[{value:"Git Hooks",id:"git-hooks",level:2},{value:"Linting",id:"linting",level:2},{value:"Python",id:"python",level:3},{value:"TypeScript",id:"typescript",level:3}],p={toc:c},u="wrapper";function d(e){let{components:t,...n}=e;return(0,i.kt)(u,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h2",{id:"git-hooks"},"Git Hooks"),(0,i.kt)("p",null,"Superset uses Git pre-commit hooks courtesy of ",(0,i.kt)("a",{parentName:"p",href:"https://pre-commit.com/"},"pre-commit"),". To install run the following:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"pip3 install -r requirements/integration.txt\npre-commit install\n")),(0,i.kt)("p",null,"A series of checks will now run when you make a git commit."),(0,i.kt)("p",null,"Alternatively it is possible to run pre-commit via tox:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"tox -e pre-commit\n")),(0,i.kt)("p",null,"Or by running pre-commit manually:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"pre-commit run --all-files\n")),(0,i.kt)("h2",{id:"linting"},"Linting"),(0,i.kt)("h3",{id:"python"},"Python"),(0,i.kt)("p",null,"We use ",(0,i.kt)("a",{parentName:"p",href:"https://pylint.org/"},"Pylint")," for linting which can be invoked via:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"# for python\ntox -e pylint\n")),(0,i.kt)("p",null,"In terms of best practices please avoid blanket disabling of Pylint messages globally (via ",(0,i.kt)("inlineCode",{parentName:"p"},".pylintrc"),") or top-level within the file header, albeit there being a few exceptions. Disabling should occur inline as it prevents masking issues and provides context as to why said message is disabled."),(0,i.kt)("p",null,"Additionally, the Python code is auto-formatted using ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/python/black"},"Black")," which\nis configured as a pre-commit hook. There are also numerous ",(0,i.kt)("a",{parentName:"p",href:"https://black.readthedocs.io/en/stable/integrations/editors.html"},"editor integrations")),(0,i.kt)("h3",{id:"typescript"},"TypeScript"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"cd superset-frontend\nnpm ci\nnpm run lint\n")),(0,i.kt)("p",null,"If using the eslint extension with vscode, put the following in your workspace ",(0,i.kt)("inlineCode",{parentName:"p"},"settings.json")," file:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'"eslint.workingDirectories": [\n "superset-frontend"\n]\n')))}d.isMDXComponent=!0}}]);