8000 plotly.py/contributing.md at master · acegg/plotly.py · GitHub
[go: up one dir, main page]

Skip to content
{"payload":{"allShortcutsEnabled":false,"fileTree":{"":{"items":[{"name":"plotly","path":"plotly","contentType":"directory"},{"name":"specs","path":"specs","contentType":"directory"},{"name":"submodules","path":"submodules","contentType":"directory"},{"name":"test","path":"test","contentType":"directory"},{"name":".gitignore","path":".gitignore","contentType":"file"},{"name":".gitmodules","path":".gitmodules","contentType":"file"},{"name":"CHANGELOG.md","path":"CHANGELOG.md","contentType":"file"},{"name":"CODE_OF_CONDUCT.md","path":"CODE_OF_CONDUCT.md","contentType":"file"},{"name":"LICENSE.txt","path":"LICENSE.txt","contentType":"file"},{"name":"README.md","path":"README.md","contentType":"file"},{"name":"README.rst","path":"README.rst","contentType":"file"},{"name":"bld.bat","path":"bld.bat","contentType":"file"},{"name":"build.sh","path":"build.sh","contentType":"file"},{"name":"build_for_conda.md","path":"build_for_conda.md","contentType":"file"},{"name":"circle.yml","path":"circle.yml","contentType":"file"},{"name":"compatibility.md","path":"compatibility.md","contentType":"file"},{"name":"contributing.md","path":"contributing.md","contentType":"file"},{"name":"make_instructions.txt","path":"make_instructions.txt","contentType":"file"},{"name":"makefile","path":"makefile","contentType":"file"},{"name":"meta.yaml","path":"meta.yaml","contentType":"file"},{"name":"optional-requirements.txt","path":"optional-requirements.txt","contentType":"file"},{"name":"requirements.txt","path":"requirements.txt","contentType":"file"},{"name":"setup.cfg","path":"setup.cfg","contentType":"file"},{"name":"setup.py","path":"setup.py","contentType":"file"},{"name":"tox.ini","path":"tox.ini","contentType":"file"},{"name":"update_graph_objs.py","path":"update_graph_objs.py","contentType":"file"}],"totalCount":26}},"fileTreeProcessingTime":11.441923,"foldersToFetch":[],"incompleteFileTree":false,"repo":{"id":120885093,"defaultBranch":"master","name":"plotly.py","ownerLogin":"acegg","currentUserCanPush":false,"isFork":true,"isEmpty":false,"createdAt":"2018-02-09T09:24:56.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/13128172?v=4","public":true,"private":false,"isOrgOwned":false},"codeLineWrapEnabled":false,"symbolsExpanded":false,"treeExpanded":true,"refInfo":{"name":"master","listCacheKey":"v0:1621142406.9760158","canEdit":false,"refType":"branch","currentOid":"f761e2abc1bcf2a9e38ff15578ec1debc08eeab0"},"path":"contributing.md","currentUser":null,"blob":{"rawLines":null,"stylingDirectives":null,"colorizedLines":null,"csv":null,"csvError":null,"dependabotInfo":{"showConfigurationBanner":false,"configFilePath":null,"networkDependabotPath":"/acegg/plotly.py/network/updates","dismissConfigurationNoticePath":"/settings/dismiss-notice/dependabot_configuration_notice","configurationNoticeDismissed":null},"displayName":"contributing.md","displayUrl":"https://github.com/acegg/plotly.py/blob/master/contributing.md?raw=true","headerInfo":{"blobSize":"8.77 KB","deleteTooltip":"You must be signed in to make or propose changes","editTooltip":"You must be signed in to make or propose changes","ghDesktopPath":"https://desktop.github.com","isGitLfs":false,"onBranch":true,"shortPath":"7faae06","siteNavLoginPath":"/login?return_to=https%3A%2F%2Fgithub.com%2Facegg%2Fplotly.py%2Fblob%2Fmaster%2Fcontributing.md","isCSV":false,"isRichtext":true,"toc":[{"level":1,"text":"Contributing","anchor":"contributing","htmlText":"Contributing"},{"level":2,"text":"Code of Conduct","anchor":"code-of-conduct","htmlText":"Code of Conduct"},{"level":2,"text":"Have a Bug Report?","anchor":"have-a-bug-report","htmlText":"Have a Bug Report?"},{"level":2,"text":"Have Questions about Plotly?","anchor":"have-questions-about-plotly","htmlText":"Have Questions about Plotly?"},{"level":2,"text":"Setup","anchor":"setup","htmlText":"Setup"},{"level":3,"text":"Fork, Clone, Setup Your Version of the Plotly Python API","anchor":"fork-clone-setup-your-version-of-the-plotly-python-api","htmlText":"Fork, Clone, Setup Your Version of the Plotly Python API"},{"level":3,"text":"Submodules","anchor":"submodules","htmlText":"Submodules"},{"level":3,"text":"Making a Development Branch","anchor":"making-a-development-branch","htmlText":"Making a Development Branch"},{"level":3,"text":"Pull Request When Ready","anchor":"pull-request-when-ready","htmlText":"Pull Request When Ready"},{"level":2,"text":"Suggestions","anchor":"suggestions","htmlText":"Suggestions"},{"level":3,"text":"Local Python","anchor":"local-python","htmlText":"Local Python"},{"level":3,"text":"Virtualenv","anchor":"virtualenv","htmlText":"Virtualenv"},{"level":3,"text":"Alter Your PYTHONPATH","anchor":"alter-your-pythonpath","htmlText":"Alter Your PYTHONPATH"},{"level":3,"text":"Why?","anchor":"why","htmlText":"Why?"},{"level":2,"text":"Dependencies","anchor":"dependencies","htmlText":"Dependencies"},{"level":3,"text":"Dependencies and Virtualenv","anchor":"dependencies-and-virtualenv","htmlText":"Dependencies and Virtualenv"},{"level":2,"text":"Testing","anchor":"testing","htmlText":"Testing"},{"level":3,"text":"Running Tests with nose","anchor":"running-tests-with-nose","htmlText":"Running Tests with nose"},{"level":3,"text":"Running tests with tox","anchor":"running-tests-with-tox","htmlText":"Running tests with tox"},{"level":3,"text":"Writing Tests","anchor":"writing-tests","htmlText":"Writing Tests"},{"level":4,"text":"Publishing to Pip","anchor":"publishing-to-pip","htmlText":"Publishing to Pip"},{"level":1,"text":"Contributing to the Figure Factories","anchor":"contributing-to-the-figure-factories","htmlText":"Contributing to the Figure Factories"}],"lineInfo":{"truncatedLoc":"220","truncatedSloc":"141"},"mode":"file"},"image":false,"isCodeownersFile":null,"isPlain":false,"isValidLegacyIssueTemplate":false,"issueTemplate":null,"discussionTemplate":null,"language":"Markdown","languageID":222,"large":false,"planSupportInfo":{"repoIsFork":null,"repoOwnedByCurrentUser":null,"requestFullPath":"/acegg/plotly.py/blob/master/contributing.md","showFreeOrgGatedFeatureMessage":null,"showPlanSupportBanner":null,"upgradeDataAttributes":null,"upgradePath":null},"publishBannersInfo":{"dismissActionNoticePath":"/settings/dismiss-notice/publish_action_from_dockerfile","releasePath":"/acegg/plotly.py/releases/new?marketplace=true","showPublishActionBanner":false},"rawBlobUrl":"https://github.com/acegg/plotly.py/raw/refs/heads/master/contributing.md","renderImageOrRaw":false,"richText":"\u003carticle class=\"markdown-body entry-content container-lg\" itemprop=\"text\"\u003e\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch1 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eContributing\u003c/h1\u003e\u003ca id=\"user-content-contributing\" class=\"anchor\" aria-label=\"Permalink: Contributing\" href=\"#contributing\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe bottom line. Follow your Nose, or our Nose. Write-run-love tests ✊.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eCode of Conduct\u003c/h2\u003e\u003ca id=\"user-content-code-of-conduct\" class=\"anchor\" aria-label=\"Permalink: Code of Conduct\" href=\"#code-of-conduct\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eCheck out the \u003ca href=\"/acegg/plotly.py/blob/master/CODE_OF_CONDUCT.md\"\u003eCode of Conduct\u003c/a\u003e. Don't tl:dr; it, but the general idea is to be nice.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eHave a Bug Report?\u003c/h2\u003e\u003ca id=\"user-content-have-a-bug-report\" class=\"anchor\" aria-label=\"Permalink: Have a Bug Report?\" href=\"#have-a-bug-report\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eOpen an issue! Go to \u003ca href=\"https://github.com/plotly/plotly.py/issues\"\u003ehttps://github.com/plotly/plotly.py/issues\u003c/a\u003e. It's possible that your issue was already addressed. If it wasn't, open it. We also accept PRs; take a look at the steps below for instructions on how to do this.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eHave Questions about Plotly?\u003c/h2\u003e\u003ca id=\"user-content-have-questions-about-plotly\" class=\"anchor\" aria-label=\"Permalink: Have Questions about Plotly?\" href=\"#have-questions-about-plotly\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eCheck out our Support App: \u003ca href=\"https://support.plot.ly/libraries/python\" rel=\"nofollow\"\u003ehttps://support.plot.ly/libraries/python\u003c/a\u003e or Community Forum: \u003ca href=\"https://community.plot.ly/\" rel=\"nofollow\"\u003ehttps://community.plot.ly/\u003c/a\u003e.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eSetup\u003c/h2\u003e\u003ca id=\"user-content-setup\" class=\"anchor\" aria-label=\"Permalink: Setup\" href=\"#setup\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eFork, Clone, Setup Your Version of the Plotly Python API\u003c/h3\u003e\u003ca id=\"user-content-fork-clone-setup-your-version-of-the-plotly-python-api\" class=\"anchor\" aria-label=\"Permalink: Fork, Clone, Setup Your Version of the Plotly Python API\" href=\"#fork-clone-setup-your-version-of-the-plotly-python-api\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eFirst, you'll need to \u003cem\u003eget\u003c/em\u003e our project. This is the appropriate \u003cem\u003eclone\u003c/em\u003e command (if you're unfamiliar with this process, \u003ca href=\"https://help.github.com/articles/fork-a-repo\"\u003ehttps://help.github.com/articles/fork-a-repo\u003c/a\u003e):\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eDO THIS (in the directory where you want the repo to live)\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"git clone https://github.com/your_github_username/plotly.py.git\"\u003e\u003cpre\u003egit clone https://github.com/your_github_username/plotly.py.git\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eSubmodules\u003c/h3\u003e\u003ca id=\"user-content-submodules\" class=\"anchor\" aria-label=\"Permalink: Submodules\" href=\"#submodules\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eSecond, this project uses git submodules! They're both helpful and, at times, difficult to work with. The good news is you probably don't need to think about them! Just run the following shell command to make sure that your local repo is wired properly:\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eDO THIS (run this command in your new \u003ccode\u003eplotly.py\u003c/code\u003e directory)\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"make setup_subs\"\u003e\u003cpre\u003emake setup_subs\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThat's going to initialize the submodules we use in this project, update them so that they're synced to the proper commit, and copy files to the appropriate locations in your local repo.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eHere's what you need to know: changes to any files inside the following directories \u003cstrong\u003ewill get overwritten\u003c/strong\u003e. These are synced with the submodules, if you need to change functionality there, you will need to make a pull request in the appropriate sub project repository.\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003echunked_requests\u003c/li\u003e\n\u003cli\u003egraph_reference\u003c/li\u003e\n\u003cli\u003emplexporter\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eAdditionally, there are some project shortcuts that live in the \u003ccode\u003emakefile\u003c/code\u003e file. You can read all about this in the \u003ccode\u003emake_instructions.txt\u003c/code\u003e file. OR, just run:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"make readme\"\u003e\u003cpre\u003emake readme\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eMaking a Development Branch\u003c/h3\u003e\u003ca id=\"user-content-making-a-development-branch\" class=\"anchor\" aria-label=\"Permalink: Making a Development Branch\" href=\"#making-a-development-branch\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThird, \u003cem\u003edon't\u003c/em\u003e work in the \u003ccode\u003emaster\u003c/code\u003e branch. As soon as you get your master branch ready, run:\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eDO THIS (but change the branch name)\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"git checkout -b my-dev-branch\"\u003e\u003cpre\u003egit checkout -b my-dev-branch\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e... where you should give your branch a more descriptive name than \u003ccode\u003emy-dev-branch\u003c/code\u003e\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003ePull Request When Ready\u003c/h3\u003e\u003ca id=\"user-content-pull-request-when-ready\" class=\"anchor\" aria-label=\"Permalink: Pull Request When Ready\" href=\"#pull-request-when-ready\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eOnce you've made your changes (and hopefully written some tests...), make that pull request!\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eSuggestions\u003c/h2\u003e\u003ca id=\"user-content-suggestions\" class=\"anchor\" aria-label=\"Permalink: Suggestions\" href=\"#suggestions\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eLocal Python\u003c/h3\u003e\u003ca id=\"user-content-local-python\" class=\"anchor\" aria-label=\"Permalink: Local Python\" href=\"#local-python\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eSetting up Python versions that \u003cem\u003edon't\u003c/em\u003e require you to use \u003ccode\u003esudo\u003c/code\u003e is a good idea. In addition, the core Python on your machine may not be the Python that we've developed in! Here are some nice guides for Mac, Windows, and Linux:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"http://docs.python-guide.org/en/latest/starting/install/osx/\" rel=\"nofollow\"\u003ehttp://docs.python-guide.org/en/latest/starting/install/osx/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://docs.python-guide.org/en/latest/starting/install/win/\" rel=\"nofollow\"\u003ehttp://docs.python-guide.org/en/latest/starting/install/win/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://docs.python-guide.org/en/latest/starting/install/linux/\" rel=\"nofollow\"\u003ehttp://docs.python-guide.org/en/latest/starting/install/linux/\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eVirtualenv\u003c/h3\u003e\u003ca id=\"user-content-virtualenv\" class=\"anchor\" aria-label=\"Permalink: Virtualenv\" href=\"#virtualenv\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eVirtualenv is a way to create Python environments on your machine that know nothing about one another. This is really helpful for ironing out dependency-problems arising from different versions of packages. Here's a nice guide on how to do this: \u003ca href=\"http://docs.python-guide.org/en/latest/dev/virtualenvs/\" rel=\"nofollow\"\u003ehttp://docs.python-guide.org/en/latest/dev/virtualenvs/\u003c/a\u003e\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eAlter Your PYTHONPATH\u003c/h3\u003e\u003ca id=\"user-content-alter-your-pythonpath\" class=\"anchor\" aria-label=\"Permalink: Alter Your PYTHONPATH\" href=\"#alter-your-pythonpath\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe PYTHONPATH variable in your shell tells Python where to look for modules. Since you'll be developing, it'll be a pain to need to \u003cem\u003einstall\u003c/em\u003e Python every time you need to test some functionality (or at least ensure you're running code from the right directory...). You can easily make this change from a shell:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"export PYTHONPATH=\u0026quot;/path/to/local/repo:$PYTHONPATH\u0026quot;\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e PYTHONPATH=\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e/path/to/local/repo:\u003cspan class=\"pl-smi\"\u003e$PYTHONPATH\u003c/span\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eNote, that's non-permanent. When you close the shell, that variable definition disappears. Also, \u003ccode\u003epath/to/local/repo\u003c/code\u003e is \u003cem\u003eyour\u003c/em\u003e specific repository path (e.g., \u003ccode\u003e/Users/andrew/projects/python-api\u003c/code\u003e).\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eWhy?\u003c/h3\u003e\u003ca id=\"user-content-why\" class=\"anchor\" aria-label=\"Permalink: Why?\" href=\"#why\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eNow you can run the following code and be guaranteed to have a working development version that you can make changes to on-the-fly, test, and be confident will not break on other's machines!\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"pip install -r requirements.txt\npip install -r optional-requirements.txt\nexport PYTHONPATH=\u0026quot;/path/to/local/repo:$PYTHONPATH\u0026quot;\"\u003e\u003cpre\u003epip install -r requirements.txt\npip install -r optional-requirements.txt\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e PYTHONPATH=\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e/path/to/local/repo:\u003cspan class=\"pl-smi\"\u003e$PYTHONPATH\u003c/span\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eDependencies\u003c/h2\u003e\u003ca id=\"user-content-dependencies\" class=\"anchor\" aria-label=\"Permalink: Dependencies\" href=\"#dependencies\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThere's a short list of core dependencies you'll need installed in your Python environment to have any sort of fun with Plotly's Python API (see \u003ccode\u003erequirements.txt\u003c/code\u003e). Additionally, you're likely to have even more fun if you install some other requirements (see \u003ccode\u003eoptional-requirements.txt\u003c/code\u003e).\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eDependencies and Virtualenv\u003c/h3\u003e\u003ca id=\"user-content-dependencies-and-virtualenv\" class=\"anchor\" aria-label=\"Permalink: Dependencies and Virtualenv\" href=\"#dependencies-and-virtualenv\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eIf you decided to follow the suggestion about about the Virtualenv \u003cem\u003eand\u003c/em\u003e you've run \u003ccode\u003esource bin/activate\u003c/code\u003e within your new virtualenv directory to activate it--you can run the following to install the core dependencies:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"pip install -r requirements.txt\"\u003e\u003cpre\u003epip install -r requirements.txt\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eTo install the optional dependencies:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\ 8EC6 " dir=\"auto\" data-snippet-clipboard-copy-content=\"pip install -r optional-requirements.txt\"\u003e\u003cpre\u003epip install -r optional-requirements.txt\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eTesting\u003c/h2\u003e\u003ca id=\"user-content-testing\" class=\"anchor\" aria-label=\"Permalink: Testing\" href=\"#testing\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eWe take advantage of two tools to run tests:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"https://tox.readthedocs.io/en/latest/\" rel=\"nofollow\"\u003e\u003ccode\u003etox\u003c/code\u003e\u003c/a\u003e, which is both a virtualenv management and test tool.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://nose.readthedocs.org/en/latest/\" rel=\"nofollow\"\u003e\u003ccode\u003enose\u003c/code\u003e\u003c/a\u003e, which is is an extension of Python's unittest\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eRunning Tests with \u003ccode\u003enose\u003c/code\u003e\u003c/h3\u003e\u003ca id=\"user-content-running-tests-with-nose\" class=\"anchor\" aria-label=\"Permalink: Running Tests with nose\" href=\"#running-tests-with-nose\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eSince our tests cover \u003cem\u003eall\u003c/em\u003e the functionality, to prevent tons of errors from showing up and having to parse through a messy output, you'll need to install \u003ccode\u003eoptional-requirements.txt\u003c/code\u003e as explained above.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eAfter you've done that, go ahead and follow (y)our Nose!\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"nosetests -w plotly/tests\"\u003e\u003cpre\u003enosetests -w plotly/tests\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eOr for more \u003cem\u003everbose\u003c/em\u003e output:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"nosetests -w plotly/tests -v\"\u003e\u003cpre\u003enosetests -w plotly/tests -v\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eEither of those will run \u003cem\u003eevery\u003c/em\u003e test we've written for the Python API. You can get more granular by running something like:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"nosetests -w plotly/tests/test_plotly\"\u003e\u003cpre\u003enosetests -w plotly/tests/test_plotly\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e... or even more granular by running something like:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"nosetests plotly/tests/test_plotly/test_plot.py\"\u003e\u003cpre\u003enosetests plotly/tests/test_plotly/test_plot.py\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eRunning tests with \u003ccode\u003etox\u003c/code\u003e\u003c/h3\u003e\u003ca id=\"user-content-running-tests-with-tox\" class=\"anchor\" aria-label=\"Permalink: Running tests with tox\" href=\"#running-tests-with-tox\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eRunning tests with tox is much more powerful, but requires a bit more setup.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eYou'll need to export an environment variable for \u003cem\u003eeach\u003c/em\u003e tox environment you wish to test with. For example, if you want to test with \u003ccode\u003ePython 2.7\u003c/code\u003e and\n\u003ccode\u003ePython 3.4\u003c/code\u003e, but only care to check the \u003ccode\u003ecore\u003c/code\u003e specs, you would need to ensure that the following variables are exported:\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"export PLOTLY_TOX_PYTHON_27=\u0026lt;python binary\u0026gt;\nexport PLOTLY_TOX_PYTHON_34=\u0026lt;python binary\u0026gt;\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003eexport PLOTLY_TOX_PYTHON_27=\u0026lt;python binary\u0026gt;\nexport PLOTLY_TOX_PYTHON_34=\u0026lt;python binary\u0026gt;\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eWhere the \u003ccode\u003e\u0026lt;python binary\u003c/code\u003e is going to be specific to your development setup. As a more complete example, you might have this loaded in a \u003ccode\u003e.bash_profile\u003c/code\u003e (or equivalent shell loader):\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"############\n# tox envs #\n############\n\nexport PLOTLY_TOX_PYTHON_27=python2.7\nexport PLOTLY_TOX_PYTHON_34=python3.4\nexport TOXENV=py27-core,py34-core\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e###########\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e tox envs #\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e###########\u003c/span\u003e\n\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e PLOTLY_TOX_PYTHON_27=python2.7\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e PLOTLY_TOX_PYTHON_34=python3.4\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e TOXENV=py27-core,py34-core\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eWhere \u003ccode\u003eTOXENV\u003c/code\u003e is the environment list you want to use when invoking \u003ccode\u003etox\u003c/code\u003e from the command line. Note that the \u003ccode\u003ePLOTLY_TOX_*\u003c/code\u003e pattern is used to pass in variables for use in the \u003ccode\u003etox.ini\u003c/code\u003e file. Though this is a little setup, intensive, you'll get the following benefits:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003etox\u003c/code\u003e will automatically manage a virtual env for each environment you want to test in.\u003c/li\u003e\n\u003cli\u003eYou only have to run \u003ccode\u003etox\u003c/code\u003e and know that the module is working in both \u003ccode\u003ePython 2\u003c/code\u003e and \u003ccode\u003ePython 3\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eFinally, \u003ccode\u003etox\u003c/code\u003e allows you to pass in additional command line arguments that are formatted in (by us) in the \u003ccode\u003etox.ini\u003c/code\u003e file, see \u003ccode\u003e{posargs}\u003c/code\u003e. This is setup to help with our \u003ccode\u003enose attr\u003c/code\u003e configuration. To run only tests that are \u003cem\u003enot\u003c/em\u003e tagged with \u003ccode\u003eslow\u003c/code\u003e, you could use the following command:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"tox -- -a '!slow'\"\u003e\u003cpre\u003etox -- -a \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e!slow\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eNote that anything after \u003ccode\u003e--\u003c/code\u003e is substituted in for \u003ccode\u003e{posargs}\u003c/code\u003e in the tox.ini. For completeness, because it's reasonably confusing, if you want to force a match for \u003cem\u003emultiple\u003c/em\u003e \u003ccode\u003enose attr\u003c/code\u003e tags, you comma-separate the tags like so:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"tox -- -a '!slow','!matplotlib'\"\u003e\u003cpre\u003etox -- -a \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e!slow\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e\u003c/span\u003e,\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e!matplotlib\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eWriting Tests\u003c/h3\u003e\u003ca id=\"user-content-writing-tests\" class=\"anchor\" aria-label=\"Permalink: Writing Tests\" href=\"#writing-tests\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eYou're \u003cem\u003estrongly\u003c/em\u003e encouraged to write tests that check your added functionality.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eWhen you write a new test anywhere under the \u003ccode\u003etests\u003c/code\u003e directory, if your PR gets accepted, that test will run in a virtual machine to ensure that future changes don't break your contributions!\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eTest accounts include: \u003ccode\u003ePythonTest\u003c/code\u003e, \u003ccode\u003ePlotlyImageTest\u003c/code\u003e, and \u003ccode\u003ePlotlyStageTest\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003ePublishing to Pip\u003c/h4\u003e\u003ca id=\"user-content-publishing-to-pip\" class=\"anchor\" aria-label=\"Permalink: Publishing to Pip\" href=\"#publishing-to-pip\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eYou'll need the credentials file \u003ccode\u003e~/.pypirc\u003c/code\u003e. Request access from @theengineear and @chriddyp. Then, from inside the repository:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"(plotly.py) $ git checkout master\n(plotly.py) $ git stash\n(plotly.py) $ git pull origin master\n(plotly.py) $ python setup.py sdist upload # upload to pip\"\u003e\u003cpre\u003e(plotly.py) $ git checkout master\n(plotly.py) $ git stash\n(plotly.py) $ git pull origin master\n(plotly.py) $ python setup.py sdist upload \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e upload to pip\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eAfter it has uploaded, move to another directly and double+triple check that you are able to upgrade ok:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"$ pip install plotly --upgrade\"\u003e\u003cpre\u003e$ pip install plotly --upgrade\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eAnd ask one of your friends to do it too. Our tests should catch any issues, but you never know.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u0026lt;3 Team Plotly\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch1 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eContributing to the Figure Factories\u003c/h1\u003e\u003ca id=\"user-content-contributing-to-the-figure-factories\" class=\"anchor\" aria-label=\"Permalink: Contributing to the Figure Factories\" href=\"#contributing-to-the-figure-factories\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eIf you are interested in contributing to the ever-growing Plotly figure factory library in Python, check out the \u003ca href=\"https://github.com/plotly/plotly.py/blob/master/plotly/figure_factory/README.md\"\u003edocumentation\u003c/a\u003e to learn how.\u003c/p\u003e\n\u003c/article\u003e","renderedFileInfo":null,"shortPath":null,"symbolsEnabled":true,"tabSize":8,"topBannersInfo":{"overridingGlobalFundingFile":false,"globalPreferredFundingPath":null,"showInvalidCitationWarning":false,"citationHelpUrl":"https://docs.github.com/github/creating-cloning-and-archiving-repositories/creating-a-repository-on-github/about-citation-files","actionsOnboardingTip":null},"truncated":false,"viewable":true,"workflowRedirectUrl":null,"symbols":{"timed_out":false,"not_analyzed":false,"symbols":[{"name":"Contributing","kind":"section_1","ident_start":2,"ident_end":14,"extent_start":0,"extent_end":8713,"fully_qualified_name":"Contributing","ident_utf16":{"start":{"line_number":0,"utf16_col":2},"end":{"line_number":0,"utf16_col":14}},"extent_utf16":{"start":{"line_number":0,"utf16_col":0},"end":{"line_number":218,"utf16_col":0}}},{"name":"Code of Conduct","kind":"section_2","ident_start":97,"ident_end":112,"extent_start":94,"extent_end":221,"fully_qualified_name":"Code of Conduct","ident_utf16":{"start":{"line_number":4,"utf16_col":3},"end":{"line_number":4,"utf16_col":18}},"extent_utf16":{"start":{"line_number":4,"utf16_col":0},"end":{"line_number":8,"utf16_col":0}}},{"name":"Have a Bug Report?","kind":"section_2","ident_start":224,"ident_end":242,"extent_start":221,"extent_end":473,"fully_qualified_name":"Have a Bug Report?","ident_utf16":{"start":{"line_number":8,"utf16_col":3},"end":{"line_number":8,"utf16_col":21}},"extent_utf16":{"start":{"line_number":8,"utf16_col":0},"end":{"line_number":12,"utf16_col":0}}},{"name":"Have Questions about Plotly?","kind":"section_2","ident_start":476,"ident_end":504,"extent_start":473,"extent_end":623,"fully_qualified_name":"Have Questions about Plotly?","ident_utf16":{"start":{"line_number":12,"utf16_col":3},"end":{"line_number":12,"utf16_col":31}},"extent_utf16":{"start":{"line_number":12,"utf16_col":0},"end":{"line_number":16,"utf16_col":0}}},{"name":"Setup","kind":"section_2","ident_start":626,"ident_end":631,"extent_start":623,"extent_end":2488,"fully_qualified_name":"Setup","ident_utf16":{"start":{"line_number":16,"utf16_col":3},"end":{"line_number":16,"utf16_col":8}},"extent_utf16":{"start":{"line_number":16,"utf16_col":0},"end":{"line_number":66,"utf16_col":0}}},{"name":"Fork, Clone, Setup Your Version of the Plotly Python API","kind":"section_3","ident_start":637,"ident_end":693,"extent_start":633,"extent_end":1006,"fully_qualified_name":"Fork, Clone, Setup Your Version of the Plotly Python API","ident_utf16":{"start":{"line_number":18,"utf16_col":4},"end":{"line_number":18,"utf16_col":60}},"extent_utf16":{"start":{"line_number":18,"utf16_col":0},"end":{"line_number":28,"utf16_col":0}}},{"name":"Submodules","kind":"section_3","ident_start":1010,"ident_end":1020,"extent_start":1006,"extent_end":2069,"fully_qualified_name":"Submodules","ident_utf16":{"start":{"line_number":28,"utf16_col":4},"end":{"line_number":28,"utf16_col":14}},"extent_utf16":{"start":{"line_number":28,"utf16_col":0},"end":{"line_number":51,"utf16_col":0}}},{"name":"Making a Development Branch","kind":"section_3","ident_start":2073,"ident_end":2100,"extent_start":2069,"extent_end":2365,"fully_qualified_name":"Making a Development Branch","ident_utf16":{"start":{"line_number":51,"utf16_col":4},"end":{"line_number":51,"utf16_col":31}},"extent_utf16":{"start":{"line_number":51,"utf16_col":0},"end":{"line_number":62,"utf16_col":0}}},{"name":"Pull Request When Ready","kind":"section_3","ident_start":2369,"ident_end":2392,"extent_start":2365,"extent_end":2488,"fully_qualified_name":"Pull Request When Ready","ident_utf16":{"start":{"line_number":62,"utf16_col":4},"end":{"line_number":62,"utf16_col":27}},"extent_utf16":{"start":{"line_number":62,"utf16_col":0},"end":{"line_number":66,"utf16_col":0}}},{"name":"Suggestions","kind":"section_2","ident_start":2491,"ident_end":2502,"extent_start":2488,"extent_end":4204,"fully_qualified_name":"Suggestions","ident_utf16":{"start":{"line_number":66,"utf16_col":3},"end":{"line_number":66,"utf16_col":14}},"extent_utf16":{"start":{"line_number":66,"utf16_col":0},"end":{"line_number":96,"utf16_col":0}}},{"name":"Local Python","kind":"section_3","ident_start":2508,"ident_end":2520,"extent_start":2504,"extent_end":2942,"fully_qualified_name":"Local Python","ident_utf16":{"start":{"line_number":68,"utf16_col":4},"end":{"line_number":68,"utf16_col":16}},"extent_utf16":{"start":{"line_number":68,"utf16_col":0},"end":{"line_number":74,"utf16_col":0}}},{"name":"Virtualenv","kind":"section_3","ident_start":2946,"ident_end":2956,"extent_start":2942,"extent_end":3260,"fully_qualified_name":"Virtualenv","ident_utf16":{"start":{"line_number":74,"utf16_col":4},"end":{"line_number":74,"utf16_col":14}},"extent_utf16":{"start":{"line_number":74,"utf16_col":0},"end":{"line_number":77,"utf16_col":0}}},{"name":"Alter Your PYTHONPATH","kind":"section_3","ident_start":3264,"ident_end":3285,"extent_start":3260,"extent_end":3864,"fully_qualified_name":"Alter Your PYTHONPATH","ident_utf16":{"start":{"line_number":77,"utf16_col":4},"end":{"line_number":77,"utf16_col":25}},"extent_utf16":{"start":{"line_number":77,"utf16_col":0},"end":{"line_number":86,"utf16_col":0}}},{"name":"Why?","kind":"section_3","ident_start":3868,"ident_end":3872,"extent_start":3864,"extent_end":4204,"fully_qualified_name":"Why?","ident_utf16":{"start":{"line_number":86,"utf16_col":4},"end":{"line_number":86,"utf16_col":8}},"extent_utf16":{"start":{"line_number":86,"utf16_col":0},"end":{"line_number":96,"utf16_col":0}}},{"name":"Dependencies","kind":"section_2","ident_start":4207,"ident_end":4219,"extent_start":4204,"extent_end":4903,"fully_qualified_name":"Dependencies","ident_utf16":{"start":{"line_number":96,"utf16_col":3},"end":{"line_number":96,"utf16_col":15}},"extent_utf16":{"start":{"line_number":96,"utf16_col":0},"end":{"line_number":114,"utf16_col":0}}},{"name":"Dependencies and Virtualenv","kind":"section_3","ident_start":4516,"ident_end":4543,"extent_start":4512,"extent_end":4903,"fully_qualified_name":"Dependencies and Virtualenv","ident_utf16":{"start":{"line_number":100,"utf16_col":4},"end":{"line_number":100,"utf16_col":31}},"extent_utf16":{"start":{"line_number":100,"utf16_col":0},"end":{"line_number":114,"utf16_col":0}}},{"name":"Testing","kind":"section_2","ident_start":4906,"ident_end":4913,"extent_start":4903,"extent_end":8713,"fully_qualified_name":"Testing","ident_utf16":{"start":{"line_number":114,"utf16_col":3},"end":{"line_number":114,"utf16_col":10}},"extent_utf16":{"start":{"line_number":114,"utf16_col":0},"end":{"line_number":218,"utf16_col":0}}},{"name":"Running Tests with `nose`","kind":"section_3","ident_start":5168,"ident_end":5193,"extent_start":5164,"extent_end":5862,"fully_qualified_name":"Running Tests with `nose`","ident_utf16":{"start":{"line_number":121,"utf16_col":4},"end":{"line_number":121,"utf16_col":29}},"extent_utf16":{"start":{"line_number":121,"utf16_col":0},"end":{"line_number":149,"utf16_col":0}}},{"name":"Running tests with `tox`","kind":"section_3","ident_start":5866,"ident_end":5890,"extent_start":5862,"extent_end":7753,"fully_qualified_name":"Running tests with `tox`","ident_utf16":{"start":{"line_number":149,"utf16_col":4},"end":{"line_number":149,"utf16_col":28}},"extent_utf16":{"start":{"line_number":149,"utf16_col":0},"end":{"line_number":190,"utf16_col":0}}},{"name":"Writing Tests","kind":"section_3","ident_start":7757,"ident_end":7770,"extent_start":7753,"extent_end":8713,"fully_qualified_name":"Writing Tests","ident_utf16":{"start":{"line_number":190,"utf16_col":4},"end":{"line_number":190,"utf16_col":17}},"extent_utf16":{"start":{"line_number":190,"utf16_col":0},"end":{"line_number":218,"utf16_col":0}}},{"name":"Publishing to Pip","kind":"section_4","ident_start":8134,"ident_end":8151,"extent_start":8129,"extent_end":8713,"fully_qualified_name":"Publishing to Pip","ident_utf16":{"start":{"line_number":198,"utf16_col":5},"end":{"line_number":198,"utf16_col":22}},"extent_utf16":{"start":{"line_number":198,"utf16_col":0},"end":{"line_number":218,"utf16_col":0}}},{"name":"Contributing to the Figure Factories","kind":"section_1","ident_start":8715,"ident_end":8751,"extent_start":8713,"extent_end":8976,"fully_qualified_name":"Contributing to the Figure Factories","ident_utf16":{"start":{"line_number":218,"utf16_col":2},"end":{"line_number":218,"utf16_col":38}},"extent_utf16":{"start":{"line_number":218,"utf16_col":0},"end":{"line_number":220,"utf16_col":0}}}]}},"copilotInfo":null,"copilotAccessAllowed":false,"modelsAccessAllowed":false,"modelsRepoIntegrationEnabled":false,"csrf_tokens":{"/acegg/plotly.py/branches":{"post":"ltB9Jl83voWeytokH7ylRSojzBb4c3zPFn7qHRx9Mr3xZsQlBso72IvBxyKeAsa3yCui-7S9b-iP6W7zOXC1Og"},"/repos/preferences":{"post":"9KruGUJBRHUIDrPvLNXMhk253IWPioCd7tvj2xqDpJ54eg_RnC_N8WeEtJrEsgwPwRj5wKeEvC5jRO1v4YL1Bw"}}},"title":"plotly.py/contributing.md at master · acegg/plotly.py","appPayload":{"helpUrl":"https://docs.github.com","findFileWorkerPath":"/assets-cdn/worker/find-file-worker-263cab1760dd.js","findInFileWorkerPath":"/assets-cdn/worker/find-in-file-worker-1b17b3e7786a.js","githubDevUrl":null,"enabled_features":{"code_nav_ui_events":false,"react_blob_overlay":false,"accessible_code_button":true}}}
0