blob: 26cd64aa41c6135198a38a8119e13af80e88fc8b [file] [log] [blame]
"use strict";(self.webpackChunkdocs_v_2=self.webpackChunkdocs_v_2||[]).push([[9892],{95788:(e,n,t)=>{t.d(n,{Iu:()=>p,yg:()=>d});var r=t(11504);function i(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function o(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function a(e){for(var n=1;n<arguments.length;n++){var t=null!=arguments[n]?arguments[n]:{};n%2?o(Object(t),!0).forEach((function(n){i(e,n,t[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):o(Object(t)).forEach((function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))}))}return e}function l(e,n){if(null==e)return{};var t,r,i=function(e,n){if(null==e)return{};var t,r,i={},o=Object.keys(e);for(r=0;r<o.length;r++)t=o[r],n.indexOf(t)>=0||(i[t]=e[t]);return i}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)t=o[r],n.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(i[t]=e[t])}return i}var s=r.createContext({}),c=function(e){var n=r.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):a(a({},n),e)),t},p=function(e){var n=c(e.components);return r.createElement(s.Provider,{value:n},e.children)},u="mdxType",g={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},m=r.forwardRef((function(e,n){var t=e.components,i=e.mdxType,o=e.originalType,s=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),u=c(t),m=i,d=u["".concat(s,".").concat(m)]||u[m]||g[m]||o;return t?r.createElement(d,a(a({ref:n},p),{},{components:t})):r.createElement(d,a({ref:n},p))}));function d(e,n){var t=arguments,i=n&&n.mdxType;if("string"==typeof e||i){var o=t.length,a=new Array(o);a[0]=m;var l={};for(var s in n)hasOwnProperty.call(n,s)&&(l[s]=n[s]);l.originalType=e,l[u]="string"==typeof e?e:i,a[1]=l;for(var c=2;c<o;c++)a[c]=t[c];return r.createElement.apply(null,a)}return r.createElement.apply(null,t)}m.displayName="MDXCreateElement"},50936:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>s,contentTitle:()=>a,default:()=>g,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var r=t(86404),i=(t(11504),t(95788));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 g(e){let{components:n,...t}=e;return(0,i.yg)(u,(0,r.c)({},p,t,{components:n,mdxType:"MDXLayout"}),(0,i.yg)("h2",{id:"git-hooks"},"Git Hooks"),(0,i.yg)("p",null,"Superset uses Git pre-commit hooks courtesy of ",(0,i.yg)("a",{parentName:"p",href:"https://pre-commit.com/"},"pre-commit"),". To install run the following:"),(0,i.yg)("pre",null,(0,i.yg)("code",{parentName:"pre",className:"language-bash"},"pip3 install -r requirements/integration.txt\npre-commit install\n")),(0,i.yg)("p",null,"A series of checks will now run when you make a git commit."),(0,i.yg)("p",null,"Alternatively it is possible to run pre-commit via tox:"),(0,i.yg)("pre",null,(0,i.yg)("code",{parentName:"pre",className:"language-bash"},"tox -e pre-commit\n")),(0,i.yg)("p",null,"Or by running pre-commit manually:"),(0,i.yg)("pre",null,(0,i.yg)("code",{parentName:"pre",className:"language-bash"},"pre-commit run --all-files\n")),(0,i.yg)("h2",{id:"linting"},"Linting"),(0,i.yg)("h3",{id:"python"},"Python"),(0,i.yg)("p",null,"We use ",(0,i.yg)("a",{parentName:"p",href:"https://pylint.org/"},"Pylint")," for linting which can be invoked via:"),(0,i.yg)("pre",null,(0,i.yg)("code",{parentName:"pre",className:"language-bash"},"# for python\ntox -e pylint\n")),(0,i.yg)("p",null,"In terms of best practices please avoid blanket disabling of Pylint messages globally (via ",(0,i.yg)("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.yg)("p",null,"Additionally, the Python code is auto-formatted using ",(0,i.yg)("a",{parentName:"p",href:"https://github.com/python/black"},"Black")," which\nis configured as a pre-commit hook. There are also numerous ",(0,i.yg)("a",{parentName:"p",href:"https://black.readthedocs.io/en/stable/integrations/editors.html"},"editor integrations")),(0,i.yg)("h3",{id:"typescript"},"TypeScript"),(0,i.yg)("pre",null,(0,i.yg)("code",{parentName:"pre",className:"language-bash"},"cd superset-frontend\nnpm ci\n# run eslint checks\nnpm run eslint -- .\n# run tsc (typescript) checks\nnpm run type\n")),(0,i.yg)("p",null,"If using the eslint extension with vscode, put the following in your workspace ",(0,i.yg)("inlineCode",{parentName:"p"},"settings.json")," file:"),(0,i.yg)("pre",null,(0,i.yg)("code",{parentName:"pre",className:"language-json"},'"eslint.workingDirectories": [\n "superset-frontend"\n]\n')))}g.isMDXComponent=!0}}]);