"use strict";(self.webpackChunkdocs_v_2=self.webpackChunkdocs_v_2||[]).push([[6552],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>b});var r=n(67294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(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?i(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):i(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function s(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var u=r.createContext({}),l=function(e){var t=r.useContext(u),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},p=function(e){var t=l(e.components);return r.createElement(u.Provider,{value:t},e.children)},c="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,o=e.mdxType,i=e.originalType,u=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),c=l(n),m=o,b=c["".concat(u,".").concat(m)]||c[m]||d[m]||i;return n?r.createElement(b,a(a({ref:t},p),{},{components:n})):r.createElement(b,a({ref:t},p))}));function b(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=n.length,a=new Array(i);a[0]=m;var s={};for(var u in t)hasOwnProperty.call(t,u)&&(s[u]=t[u]);s.originalType=e,s[c]="string"==typeof e?e:o,a[1]=s;for(var l=2;l<i;l++)a[l]=n[l];return r.createElement.apply(null,a)}return r.createElement.apply(null,n)}m.displayName="MDXCreateElement"},78918:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>a,default:()=>d,frontMatter:()=>i,metadata:()=>s,toc:()=>l});var r=n(83117),o=(n(67294),n(3905));const i={title:"Types of Contributions",hide_title:!0,sidebar_position:2,version:1},a=void 0,s={unversionedId:"contributing/types-of-contributions",id:"contributing/types-of-contributions",title:"Types of Contributions",description:"Types of Contributions",source:"@site/docs/contributing/types-of-contributions.mdx",sourceDirName:"contributing",slug:"/contributing/types-of-contributions",permalink:"/docs/contributing/types-of-contributions",draft:!1,editUrl:"https://github.com/apache/superset/tree/master/docs/docs/contributing/types-of-contributions.mdx",tags:[],version:"current",sidebarPosition:2,frontMatter:{title:"Types of Contributions",hide_title:!0,sidebar_position:2,version:1},sidebar:"tutorialSidebar",previous:{title:"Contributing to Superset",permalink:"/docs/contributing/contributing-page"},next:{title:"Pull Request Guidelines",permalink:"/docs/contributing/pull-request-guidelines"}},u={},l=[{value:"Types of Contributions",id:"types-of-contributions",level:2},{value:"Report Bug",id:"report-bug",level:3},{value:"Submit Ideas or Feature Requests",id:"submit-ideas-or-feature-requests",level:3},{value:"Fix Bugs",id:"fix-bugs",level:3},{value:"Implement Features",id:"implement-features",level:3},{value:"Improve Documentation",id:"improve-documentation",level:3},{value:"Add Translations",id:"add-translations",level:3},{value:"Ask Questions",id:"ask-questions",level:3}],p={toc:l},c="wrapper";function d(e){let{components:t,...n}=e;return(0,o.kt)(c,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h2",{id:"types-of-contributions"},"Types of Contributions"),(0,o.kt)("h3",{id:"report-bug"},"Report Bug"),(0,o.kt)("p",null,"The best way to report a bug is to file an issue on GitHub. Please include:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Your operating system name and version."),(0,o.kt)("li",{parentName:"ul"},"Superset version."),(0,o.kt)("li",{parentName:"ul"},"Detailed steps to reproduce the bug."),(0,o.kt)("li",{parentName:"ul"},"Any details about your local setup that might be helpful in troubleshooting.")),(0,o.kt)("p",null,"When posting Python stack traces, please quote them using\n",(0,o.kt)("a",{parentName:"p",href:"https://help.github.com/articles/creating-and-highlighting-code-blocks/"},"Markdown blocks"),"."),(0,o.kt)("p",null,(0,o.kt)("em",{parentName:"p"},"Please note that feature requests opened as GitHub Issues will be moved to Discussions.")),(0,o.kt)("h3",{id:"submit-ideas-or-feature-requests"},"Submit Ideas or Feature Requests"),(0,o.kt)("p",null,"The best way is to start an ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/apache/superset/discussions/categories/ideas"},'"Ideas" Discussion thread')," on GitHub:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Explain in detail how it would work."),(0,o.kt)("li",{parentName:"ul"},"Keep the scope as narrow as possible, to make it easier to implement."),(0,o.kt)("li",{parentName:"ul"},"Remember that this is a volunteer-driven project, and that your contributions are as welcome as anyone's :)")),(0,o.kt)("p",null,"To propose large features or major changes to codebase, and help usher in those changes, please create a ",(0,o.kt)("strong",{parentName:"p"},"Superset Improvement Proposal (SIP)"),". See template from ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/apache/superset/issues/5602"},"SIP-0")),(0,o.kt)("h3",{id:"fix-bugs"},"Fix Bugs"),(0,o.kt)("p",null,"Look through the GitHub issues. Issues tagged with ",(0,o.kt)("inlineCode",{parentName:"p"},"#bug")," are\nopen to whoever wants to implement them."),(0,o.kt)("h3",{id:"implement-features"},"Implement Features"),(0,o.kt)("p",null,"Look through the GitHub issues. Issues tagged with\n",(0,o.kt)("inlineCode",{parentName:"p"},"#feature")," is open to whoever wants to implement it."),(0,o.kt)("h3",{id:"improve-documentation"},"Improve Documentation"),(0,o.kt)("p",null,"Superset could always use better documentation,\nwhether as part of the official Superset docs,\nin docstrings, ",(0,o.kt)("inlineCode",{parentName:"p"},"docs/*.rst")," or even on the web as blog posts or\narticles. See ",(0,o.kt)("a",{parentName:"p",href:"#documentation"},"Documentation")," for more details."),(0,o.kt)("h3",{id:"add-translations"},"Add Translations"),(0,o.kt)("p",null,"If you are proficient in a non-English language, you can help translate\ntext strings from Superset's UI. You can jump into the existing\nlanguage dictionaries at\n",(0,o.kt)("inlineCode",{parentName:"p"},"superset/translations/<language_code>/LC_MESSAGES/messages.po"),", or\neven create a dictionary for a new language altogether.\nSee ",(0,o.kt)("a",{parentName:"p",href:"#translating"},"Translating")," for more details."),(0,o.kt)("h3",{id:"ask-questions"},"Ask Questions"),(0,o.kt)("p",null,"There is a dedicated ",(0,o.kt)("a",{parentName:"p",href:"https://stackoverflow.com/questions/tagged/apache-superset"},(0,o.kt)("inlineCode",{parentName:"a"},"apache-superset")," tag")," on ",(0,o.kt)("a",{parentName:"p",href:"https://stackoverflow.com/"},"StackOverflow"),". Please use it when asking questions."))}d.isMDXComponent=!0}}]);