├── .gitattributes ├── .gitignore ├── README.md ├── docs ├── 1-run_scripts_cmd_line.md ├── 2-git_version_control │ ├── archive_branch.sh │ ├── git_dif_excel_workaround.md │ ├── git_lfs.md │ ├── index.md │ ├── sync_git_branches.sh │ └── useful_git_commands.md ├── 3-edit_with_vscode.md ├── 4-mambaforge_python_env.md ├── 5-poetry_package_manager.md ├── css │ └── custom_style.css ├── img │ ├── add-ssh-host.png │ ├── bitbucket_settings.png │ ├── code_logo.png │ ├── conda-bashrc.png │ ├── conda-cmd.png │ ├── conda-init.png │ ├── conda-install-done.png │ ├── conda-license.png │ ├── conda-loc.png │ ├── conda-profile.png │ ├── conda_deps_installed.png │ ├── conda_env_created.png │ ├── enter-ssh-pw.png │ ├── enter-ssh-pw2.png │ ├── git-excel-changes.png │ ├── git-log.png │ ├── git-rebase1.png │ ├── git-rebase2.png │ ├── git-rebase3.png │ ├── git-rebase4.png │ ├── git-rebase5.png │ ├── git-rebase6.png │ ├── git-rebase7.png │ ├── git-rebase8.png │ ├── git-rebase9.png │ ├── git_settings.png │ ├── github_connected_wsl.png │ ├── host-added.png │ ├── install_vscode_ext_in_wsl.png │ ├── json-viewer-extension.png │ ├── jupyter-extension.png │ ├── markdown-extension.png │ ├── medium_article.png │ ├── no-excel-change.png │ ├── notebook-access-error.png │ ├── open-ssh-folder.png │ ├── open_wsl_folder.png │ ├── orig-excel.png │ ├── pdf-extension.png │ ├── poetry-init1.png │ ├── poetry-init2.png │ ├── poetry-install1.png │ ├── poetry-install2.png │ ├── poetry_add.png │ ├── poetry_add_file_updates.png │ ├── poetry_install_output.png │ ├── post_poetry_install.png │ ├── prettify-json-extension.png │ ├── python-env-manager-extension.png │ ├── python-extension.png │ ├── rainbow-csv-extension.png │ ├── remote-edit-tab.png │ ├── remote-ssh-pkg.png │ ├── remove-git-exclusion.png │ ├── reset_wsl_pw.png │ ├── ssh connected.png │ ├── ssh-clone-success.png │ ├── ssh-connect-command.png │ ├── ssh-success.png │ ├── ssh_clone.png │ ├── ssh_keygen.png │ ├── start-ubuntu-install.png │ ├── start_ssh_agent_wsl.png │ ├── terminal_formatting.png │ ├── test.png │ ├── ubuntu-install-done.png │ ├── update-ssh-file.png │ ├── updated-excel.png │ ├── vscode_wsl.png │ ├── windows-feature.png │ ├── wsl-1.png │ ├── wsl-3.png │ ├── wsl-4.png │ ├── wsl-5.png │ ├── wsl-no-distros.png │ ├── wsl-targets.png │ ├── wsl_2.png │ ├── wsl_install_git.png │ ├── wsl_keygen.png │ ├── wsl_terminal.png │ ├── wsl_terminal2.png │ └── wsl_username.png └── index.md ├── excel_to_text_dump.py ├── git_dif_excel_demo.xlsx ├── mkdocs.yml ├── poetry.lock ├── pyproject.toml └── sync_or_create_all_mds.py /.gitattributes: -------------------------------------------------------------------------------- 1 | *.xlsx diff=excel 2 | *.xls diff=excel -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | 3 | # mkdocs 4 | site/ 5 | 6 | # script markdowns 7 | archive_branch.md 8 | sync_git_branches.md -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## View the documentation at: https://jillvillany.github.io/python-dev-setup/ 2 | 3 | ### To create the documentation site 4 | 5 | ``` 6 | conda create -n python-dev-setup python=3.9 -y 7 | conda activate python-dev-setup 8 | poetry install --no-root 9 | python sync_or_create_all_mds.py 10 | mkdocs gh-deploy 11 | ``` 12 | 13 | ### To view a working version of the documentation site 14 | 15 | ``` 16 | mkdocs serve 17 | ``` -------------------------------------------------------------------------------- /docs/1-run_scripts_cmd_line.md: -------------------------------------------------------------------------------- 1 | ## Mac 2 | 3 | Mac's Terminal app is ideal for this because Mac has a Linux based OS and most apps are deployed to Linux machines in Production due to their cost effectiveness.  4 | 5 | 6 | ## Windows 7 | 8 | Since Window's is not a Linux based OS, you can set up a Linux virtual environment with WSL. 9 | 10 | ### Set Up a WSL Environment 11 | 12 | [WSL Article Reference](https://docs.microsoft.com/en-us/windows/wsl/install) 13 | 14 | NOTE: If you already have a legacy version of WSL installed (i.e. WSL1 instead of WSL2), uninstall it so you can follow the install steps below 15 | 16 | 17 | 1. Enable Virtual Machine Platform Windows Feature (if not already done) 18 | - img 19 | 2. Ensure virtualization is enabled in the Bios: https://support.microsoft.com/en-us/windows/enable-virtualization-on-windows-11-pcs-c5578302-6e43-4b4b-a449-8ced115f58e1 20 | 3. Run Windows PowerShell as an administrator and select yes to the prompt asking if you want to allow the app to make changes to your device 21 | - img 22 | 4. Run the command `wsl --install` 23 | - This will take a few minutes, but on successful complete, you should see the below output 24 | - img 25 | 5. Restart your computer 26 | 6. If you see an Ubunutu terminal loaded when you log back in 27 | - img 28 | - Close out of the Ubuntu window, and open PowerShell 29 | - Run the command `wsl -l -v` to list your installed Linux Distributions and you should see something like the following 30 | - NOTE: The star next to the Ubuntu-20.40 distribution means this is the default distribution that will be used when launching WSL 31 | - img 32 | - To launch your default Linux distribution from PowerShell, simply run the command `wsl` 33 | - img 34 | 7. If you don't see an Ubuntu shell, you likely don't have any distributions installed. 35 | - img 36 | - Install an Ubuntu distribution with the command `wsl --install -d ubuntu` 37 | - img 38 | - Create a username and password when prompted. 39 | - **NOTE:** Be sure to save the username and password you use for this linux distribution - each distro has a dif one and this is what has sudo access 40 | - When the install completes you will see 41 | - img 42 | 43 | ## Format Your Terminal 44 | 45 | No matter the command line interface (CLI) used, it helps to format your CLI to work well with Git so that you know what branch you are working on and don't accidentally commit code to the wrong branch. 46 | 47 | ### `.bashrc` vs. `.bash_profile` 48 | 49 | The code below accounts for proper formatting using both the `.bashrc` and `.bash_profile`. This is important because `.bashrc` is used for inactive logins (i.e. task run in the background like a cron job or VSCode logging into your terminal), and `.bash_profile` is used when you are actively logging in. 50 | 51 | **NOTE:** Code below found in [this Medium article](https://medium.com/@charlesdobson/how-to-customize-your-macos-terminal-7cce5823006e) 52 | 53 | 1. Open your terminal of choice (i.e. Mac users default terminal/ Windows users WSL) 54 | 2. Cd to your home directory 55 | - ```cd ~``` 56 | 3. Create `.bash_profile` file if it doesn't already exist 57 | - ```touch .bash_profile``` 58 | 4. Open `.bash_profile` 59 | - Mac: ```open .bash_profile``` 60 | - WSL: ```notepad .bash_profile``` 61 | - Linux: ```vim .bash_profile``` 62 | 5. Add this line to the bottom of the file 63 | - ```source ~/.bashrc``` 64 | - NOTE: In vim, type `i` to enter INSERT mode and then right click to paster the copied text. Press `esc` to exit INSERT mode. Type `:wq` and press enter to save and close the file. 65 | 6. Create `.bashrc` file if it doesn't already exist 66 | 7. Open `.bashrc` 67 | 8. Add this line to the bottom of the file 68 | - ```source ~/.bash_prompt``` 69 | 9. Create `.bash_prompt file` 70 | 10. Open `.bash_prompt` file 71 | 11. Add these lines to your file 72 | ``` 73 | #!/usr/bin/env bash 74 | 75 | # GIT FUNCTIONS 76 | git_branch() { 77 | git branch 2>/dev/null | sed -e '/^[^*]/d' -e 's/* \\(.*$ \\(.*\\)/ (\\1)/' 78 | } 79 | 80 | # TERMINAL PROMPT 81 | PS1="\[\e[0;93m\]\u\[\e[m\]" # username 82 | PS1+=" " # space 83 | PS1+="\[\e[0;95m\]\W\[\e[m\]" # current directory 84 | PS1+=" " # space 85 | PS1+="\[\e[0;92m\]\$(git_branch)\[\e[m\]" # current branch 86 | PS1+=" " # space 87 | PS1+=">> " # end prompt 88 | export PS1; 89 | 90 | export CLICOLOR=1 91 | export LSCOLORS=ExFxBxDxCxegedabagacad 92 | ``` 93 | 12. Relaunch you terminal and navigate to a git repo (i.e. this python-dev-setup repo). You will now see your terminal prompt formatted with your username, current folder and repo branch 94 | - Mac: 95 | - img 96 | - WSL: 97 | - img 98 | - img 99 | -------------------------------------------------------------------------------- /docs/2-git_version_control/archive_branch.sh: -------------------------------------------------------------------------------- 1 | # This script takes one input: 2 | # branch name 3 | # To archive a branch in this repo run: ./archive_branch.sh branch_name 4 | 5 | # capture the standard output of a command so it can be retrieved with ret 6 | cap () { tee /tmp/capture.out; } 7 | 8 | # return the output of the most recent command that was captured by cap 9 | ret () { cat /tmp/capture.out; } 10 | 11 | # checkout master to make sure not on the branch archiving 12 | git checkout main 13 | git pull 14 | # redirect error message to stdout so can be captured 15 | git tag archive/$1 $1 2>/tmp/capture.out | cap 16 | echo $(ret) 17 | 18 | if [[ $(ret) == *"Failed to resolve"* ]]; then 19 | # try checking out the branch first 20 | git checkout $1 2>/tmp/capture.out | cap 21 | echo $(ret) 22 | if [[ $(ret) == *"did not match any file"* ]]; 23 | then 24 | echo "ERROR REASON: $1 branch doesn't exist" 25 | exit 0 26 | fi 27 | git checkout master 28 | git tag archive/$1 $1 2>/tmp/capture.out | cap 29 | echo $(ret) 30 | if [[ $(ret) == *"already exists"* ]]; then 31 | echo Tag already exists, specify new name: 32 | read newTag 33 | git tag archive/$newTag $1 2>/tmp/capture.out | cap 34 | echo $(ret) 35 | if [[ $(ret) == *"already exists"* ]]; then 36 | echo ERROR REASON: New tag name already exists 37 | exit 0 38 | fi 39 | fi 40 | elif [[ $(ret) == *"already exists"* ]]; then 41 | echo Tag already exists, specify new name: 42 | read newTag 43 | git tag archive/$newTag $1 2>/tmp/capture.out | cap 44 | echo $(ret) 45 | if [[ $(ret) == *"already exists"* ]]; then 46 | echo ERROR REASON: New tag name already exists 47 | exit 0 48 | fi 49 | else 50 | echo tag archive/$1 created successfully 51 | fi 52 | 53 | git push origin --tags 54 | git branch -d $1 55 | git push -d origin $1 -------------------------------------------------------------------------------- /docs/2-git_version_control/git_dif_excel_workaround.md: -------------------------------------------------------------------------------- 1 | Git does not natively support showing the differences in binary files such as Excel files. 2 |
3 |
4 | This causes a variety of problems including: 5 | 6 | - Unsure if file actually edited - VS Code will usually mark the file modified once it is opened 7 | - Unsure what changes were made 8 | 9 | To ease the inconvenience of this, you can make your own custom diff tool. 10 | 11 | ## Setup Steps 12 | 13 | 1. Create "excel_to_text_dump.py" with the following code 14 | ``` 15 | from io import StringIO 16 | import sys 17 | 18 | import pandas as pd 19 | 20 | 21 | for sheet_name in pd.ExcelFile(sys.argv[1]).sheet_names: 22 | output = StringIO() 23 | print('Sheet: %s' % sheet_name) 24 | pd.read_excel(sys.argv[1], sheet_name=sheet_name)\ 25 | .to_csv(output, 26 | header=True, 27 | index=False) 28 | print(output.getvalue()) 29 | ``` 30 | 31 | 2. Add to .gitattributes file 32 | ``` 33 | *.xlsx diff=excel 34 | *.xls diff=excel 35 | ``` 36 | 3. Update .git/config file
37 | This creates a filter to convert the file to text so that it can still be compared with git diff 38 | 39 | ``` 40 | [diff "excel"] 41 | textconv = python {absolute path to file} 42 | ``` 43 | 44 | **NOTE:** The `.git` folder is a hidden folder 45 | 46 | - To view the folder in Mac Finder: 47 | - `shift + cmd + .` 48 | - To view the folder in VS Code: 49 | - Go into VS Code's Preferences > Settings 50 | - Search for `files.exclude` and remove the `**/.git` item 51 | - 52 | 53 | ## Push .gitattributes and Excel file 54 | 55 | In order for the .gitattributes to take effect it must first at least be committed. 56 | 57 | ## Run git diff 58 | 59 | If there is no output, you know it is just because the file was open. For example: 60 | ``` 61 | git diff git_dif_excel_demo.xlsx 62 | ``` 63 | 64 | 65 | If there were changes,for example changing the text classification of a review in one row from "positive" to "neutral", the output will look like this: 66 | 67 | - File before modifications: 68 | - 69 | - File after modifications: 70 | - 71 | - Git diff output 72 | - 73 | 74 | ## Handle merge conflicts 75 | You can choose to use the version of the file on your active branch (--ours) or the branch you are merging in (--theirs) 76 | 77 | For example: 78 | ``` 79 | git checkout --ours {path to file} 80 | git add {path to file} 81 | ``` 82 | -------------------------------------------------------------------------------- /docs/2-git_version_control/git_lfs.md: -------------------------------------------------------------------------------- 1 | ## Git LFS 2 | 3 | Git LFS is used to for large file storage. 4 | 5 | - Download and install: [Git Large File Storage ](https://git-lfs.github.com/) 6 | 7 | ### Install Git LFS on Linux 8 | 1. Navigate to [https://github.com/git-lfs/git-lfs/releases](https://github.com/git-lfs/git-lfs/releases) 9 | 2. Download the package .rpm file for your Linux Distribution 10 | 3. Switch to root user `sudo su` 11 | 4. Install the package 12 | ``` 13 | rpm -iv {absolute path to .rpm file} 14 | ``` 15 | 5. Install git lfs 16 | ``` 17 | git lfs install 18 | ``` 19 | 20 | ### Fetch all git lfs files 21 | **NOTE:** Use this command if you installed Git LFS after cloning the repo 22 | ``` 23 | git lfs fetch --all 24 | ``` 25 | 26 | ### Track a file with git lfs 27 | This will add the file paths to the .gitattributes file
28 | **NOTE:** The .gitattibutes file must be committed before it takes effect 29 | 30 | ``` 31 | git lfs track {path to file} 32 | ``` 33 | 34 | ### See files currently tracked 35 | ``` 36 | git lfs ls-files 37 | ``` 38 | 39 | ### See lfs files committed or staged for commit 40 | ``` 41 | git lfs status 42 | ``` -------------------------------------------------------------------------------- /docs/2-git_version_control/index.md: -------------------------------------------------------------------------------- 1 | ## Install 2 | ### Mac 3 | 4 | 1. Install Apple Xcode developer tools 5 | - ```xcode-select --install``` 6 | 2. Download Homebrew: https://brew.sh/ 7 | - Homebrew helps you easily manage installs on a Mac from command-line 8 | 3. Install git using homebrew
9 | - ```brew install git``` 10 | 11 | ### Windows 12 | 13 | 1. From PowerShell, open your Ubuntu Linux distribution with `wsl` and run the command ` apt install git` 14 | - img 15 | - NOTE: If you forgot your password (or were not prompted to set one upon initial WSL install), you can reset your password using the following steps: 16 | - Exit the Linux distribution you are in with the command `exit` 17 | - Re-enter the Linux distribution as the root user `wsl -u root` 18 | - Enter the command `passwd {your username}` and type in the new password 19 | - img 20 | - NOTE: your username is what you saw in the command prompt when you weren't at the root 21 | - img 22 | - Exit the Linux Distribution with `exit` 23 | 24 | ### Red Hat Linux 25 | 26 | 1. Switch to the super user (a.k.a root user) 27 | - ```sudo su``` 28 | 2. Enter your password 29 | 3. Install git 30 | - ```yum install git``` 31 | 4. Switch back to a normal user 32 | - ```exit``` 33 | 34 | ## Set Git Username and Email 35 | 36 | In order to commit/ push code to Git you must configure your username and email. 37 | 38 | 1. `git config --global user.name {your username}` 39 | 2. `git config --global user.email {your email}` 40 | 41 | ## Configure SSH Auth 42 | 43 | To easily authenticate with Github/ Bitbucket (i.e. not need to enter your username/ password every time you pull/push to the repo) you can set up SSH authentication. 44 | 45 | Setting up git authentication on a personal machine (i.e. one that only you will be using) is very simple. However, if multiple user may be using the machine (i.e. a Linux Machine shared by a development team) you will want to follow a few additional step so that commits can be distinguished by user. 46 | 47 | 48 | ### Personal Machine SSH Auth 49 | 50 | 1. Create an SSH key pair with the command `ssh-keygen` and press enter to accept all the default 51 | - img 52 | 2. Copy the content of the id_rsa.pub file using the `cat {path to your file}` command 53 | - For example, `cat ~/.ssh/id_rsa.pub` 54 | 3. See the [Machine Type Agnostic Steps](#machine-type-agnostic-steps) section for remaining steps 55 | 56 | ### Shared Machine SSH Auth 57 | 58 | 1. Create an SSH key pair with the command `ssh-keygen`, adding your git profile to the end of the id_rsa file name instead of accepting all default 59 | - For example: 60 | `Users/jillvillany/.ssh/id_rsa_jillvillany` 61 | - img 62 | 2. Navigate to where the ssh key pair was created using the `cd {path to ssh folder}` command 63 | - For example: `cd Users/jillvillany/.ssh` 64 | 3. Create the config file 65 | ``` 66 | touch config 67 | vim config 68 | ``` 69 | - **NOTE:** Git username vairable is case sensitive 70 | - If using Github, add the below to your config file: 71 | ``` 72 | Host github-{git username} 73 | HostName github.com 74 | IdentityFile ~/.ssh/id_rsa_{git username} 75 | IdentitiesOnly yes 76 | ``` 77 | - If using Github Enterprise (i.e. IBM), add the below to yuur config file: 78 | ``` 79 | Host github-{git username} 80 | HostName github.ibm.com 81 | IdentityFile ~/.ssh/id_rsa_{git username} 82 | IdentitiesOnly yes 83 | ``` 84 | - If Bitbucket: 85 | ``` 86 | Host bitbucket.org-{git username} 87 | HostName bitbucket.org 88 | User git 89 | IdentityFile ~/.ssh/id_rsa_{git username} 90 | IdentitiesOnly yes 91 | ``` 92 | - **NOTE:** If you have other users to add, create similar entries below in the file 93 | 4. Copy the contents of the `id_rsa_{git username}.pub` file using the `cat id_rsa_{git username}.pub` command 94 | 95 | ### Machine Type Agnostic Steps 96 | 97 | 5. Add SSH key in Github or Bitbucket 98 | - In Github: 99 | - Navigate to Settings > SSH and GPG keys 100 | - img 101 | - Click New SSH key and add the contents of your `id_rsa_{git username}.pub` file in the key field 102 | - In Bitbucket: 103 | - Navigate to personal settings 104 | - img 105 | - Select SSH Key > Add Key add the contents of your `id_rsa_{git username}.pub` file in the key field 106 | 6. Add the SSH key to the SSH agent 107 | ``` 108 | ssh-add ~/.ssh/id_rsa_{git username} 109 | ``` 110 | - NOTE: if you get an error about connecting to the ssh agent, you need to start the agent in the background with `eval $(ssh-agent -s)` 111 | - img 112 | 7. Test your SSH connection 113 | - If on a personal machine: 114 | - Github: ```ssh -T git@github.com``` 115 | - img 116 | - Github Enterprise (i.e. IBM): ```ssh -T git@github.ibm.com``` 117 | - Bitbucket: ```ssh -T git@bitbucket.org``` 118 | - If on a shared machine: 119 | - Github: ```ssh -T git@github-{your username}``` 120 | - Github Enterprise (i.e. IBM): ```ssh -T git@github.ibm-{your username}``` 121 | - Bitbucket: ```ssh -T git@bitbucket.org-{your username}``` 122 | -------------------------------------------------------------------------------- /docs/2-git_version_control/sync_git_branches.sh: -------------------------------------------------------------------------------- 1 | # return the output of the most recent command that was captured by cap 2 | ret () { cat /tmp/capture.out; } 3 | 4 | # checkout source branch -> named master or main based on bitbucket/ github use 5 | # Use &> to capture both stdout and stderr 6 | git checkout master &> /tmp/capture.out 7 | switch_master_out=$(ret) 8 | if [[ $switch_master_out == *"error: pathspec 'master' did not match any file(s) known to git"* ]]; then 9 | source_branch="main" 10 | else 11 | source_branch="master" 12 | fi 13 | echo "Using $source_branch for source branch name" 14 | echo 15 | 16 | # error: pathspec 'master' did not match any file(s) known to git 17 | git pull 18 | 19 | # After fetching, remove any remote-tracking branches which no longer exist on the remote 20 | echo 21 | echo "Removing any remote-tracking branches which no longer exist on the remote..." 22 | git fetch --prune 23 | 24 | #### checkout and pull all the remote branches #### 25 | echo 26 | echo "CHECKING LOCAL AND REMOTE BRANCHES SYNCED..." 27 | 28 | git branch -r &> /tmp/capture.out 29 | # echo "$(ret)" 30 | 31 | remote_branches_string=$(ret) 32 | IFS=$'\n' read -rd '' -a remote_branches_array <<<"$remote_branches_string" 33 | 34 | # potential source branch names: head, main, master 35 | source_branch_regex="(\s*(head|main|master)\s*|.*(origin/head|origin/main|origin/master).*)" 36 | 37 | echo 38 | for branch in "${remote_branches_array[@]}" 39 | do 40 | # NOTE: important to put the longer string on the left 41 | if ! [[ $branch =~ $source_branch_regex ]]; then 42 | # replace origin with empty str 43 | branch_name=$(echo $branch | sed 's/origin\///') 44 | # split on space and take first element - for origin/head -> origin/master 45 | branch_name_array=($branch_name) 46 | branch_name=$(echo ${branch_name_array[0]}) 47 | echo "BRANCH NAME: $branch_name" 48 | git checkout $branch_name 49 | git pull 50 | fi 51 | done 52 | 53 | #### Clean up local branches that no longer have an upstream ref #### 54 | echo 55 | echo "CHECKING IF LOCAL BRANCHES NEED CLEAN-UP..." 56 | git checkout $source_branch 57 | git branch &> /tmp/capture.out 58 | # echo "$(ret)" 59 | 60 | local_branches_string=$(ret) 61 | IFS=$'\n' read -rd '' -a local_branches_array <<<"$local_branches_string" 62 | 63 | echo 64 | for branch in "${local_branches_array[@]}" 65 | do 66 | if ! [[ $branch =~ $source_branch_regex ]]; then 67 | echo "BRANCH NAME: $branch" 68 | git checkout $branch &> /tmp/capture.out 69 | branch_checkout_msg=$(ret) 70 | echo $branch_checkout_msg 71 | if [[ $branch_checkout_msg == *"the upstream is gone"* ]]; then 72 | git checkout $source_branch 73 | git branch -D $branch 74 | echo "Deleted $branch" 75 | fi 76 | git pull &> /tmp/capture.out 77 | branch_pull_msg=$(ret) 78 | echo $branch_pull_msg 79 | if [[ $branch_pull_msg == *"no such ref was fetched"* ]]; then 80 | git checkout $source_branch 81 | git branch -D $branch 82 | echo "Deleted $branch" 83 | elif [[ $branch_pull_msg == *"There is no tracking information for the current branch"* ]]; then 84 | git checkout $source_branch 85 | git branch -D $branch 86 | echo "Deleted $branch" 87 | fi 88 | fi 89 | done 90 | -------------------------------------------------------------------------------- /docs/2-git_version_control/useful_git_commands.md: -------------------------------------------------------------------------------- 1 | ## Get Repo 2 | ### Clone repo with SSH auth 3 | 4 | **IMP NOTE:** If you are an SSH config file so multiple git users can be on the same machine (i.e. as done in instructions above), you must modify the SSH URL git provides 5 | 6 | For example, in `git@github.com:jillvillany/python-dev-setup.git` replace ".com" with "-{username}" -> `git@github-jillvillany:jillvillany/python-dev-setup.git` 7 | 8 | 1. Select SSH when you clone the code and copy the URL 9 | - img 10 | 2. Enter the command ```git clone {SSH URL}``` 11 | - For example: `git clone git@github.com:jillvillany/python-dev-setup.git` 12 | - img 13 | 14 | ### Switch Repo to SSH auth 15 | 16 | 1. Set the remote URL to the URL used with ssh 17 | - ```git remote set-url origin {SSH URL}``` 18 | 2. Now try ```git push``` 19 | 3. Answer yes to the prompt and you will see git connects/ shows everything up to date without prompting for username/ password 20 | - img 21 | 22 | ### Maintain a Forked Repo 23 | 24 | To sync your forked version of the repo with the most updated version of the main repo: 25 | 26 | 1. ```git checkout master``` 27 | 2. If not already done: ```git remote add upstream {ssh url}``` 28 | 3. ```git fetch upstream``` 29 | 4. ```git rebase upstream/master``` 30 | 5. ```git push -u origin``` 31 | 32 | 33 | ## File Changes 34 | 35 | ### Add new/ modified files 36 | ``` 37 | git pull  38 | git add {relative file path} 39 | git commit -m "commit message" 40 | git push 41 | ``` 42 | **IMPORTANT:** If multiple users are working in the directory, be sure to set the git config user.email before pushing so that commits belong to the user that made the change 43 | ``` 44 | git config user.email {your email} 45 | ``` 46 | 47 | ### Amend last commit message 48 | ``` 49 | git commit --amend 50 | ``` 51 | 52 | ### See text of unpushed commit 53 | ``` 54 | git cherry -v 55 | ``` 56 | 57 | ### Undo all local changes to the checked out branch 58 | ``` 59 | git stash 60 | ``` 61 | 62 | ### Undo local changes to a particular file 63 | ``` 64 | git checkout --{file name} 65 | ``` 66 | 67 | ## Branches 68 | 69 | ### Create & Publish a New Branch 70 | ``` 71 | git checkout -b {branch name} {branch making new branch from} 72 | git push -u origin {branch name} 73 | ``` 74 | 75 | ### Archive & Delete a Branch 76 | 77 | ``` 78 | git tag archive/{branchname} {branchname} 79 | git push origin --tags 80 | git branch -d {branchname} 81 | git push -d origin {branch_name} 82 | ``` 83 | 84 | **NOTE:** If need to delete a created tag 85 | 86 | ``` 87 | git tag -d 88 | ``` 89 | 90 | #### archive_branch.sh 91 | The process of archiving numerous branches can get tedious. See the archive_branch.sh script for an automated way to archive branches. 92 | 93 | ### Restore an archived branch 94 | ``` 95 | git checkout -b {branch name} archive/{archived branch name} 96 | ``` 97 | 98 | ## Merges 99 | 100 | ### Abort a merge 101 | ``` 102 | git merge --abort 103 | ``` 104 | 105 | ### Ours vs Theirs 106 | You can choose to use the version of the file on your active branch (--ours) or the branch you are merging in (--theirs) 107 | 108 | For example: 109 | ``` 110 | git checkout --ours {path to file} 111 | git add {path to file} 112 | ``` 113 | 114 | ## Undo 115 | ### Revert to a previous commit 116 | ``` 117 | git revert {commit hash} 118 | ``` 119 | - **NOTE:** See [this stack overflow post](https://stackoverflow.com/questions/4114095/how-do-i-revert-a-git-repository-to-a-previous-commit) for more details 120 | 121 | ### Revert specific file to previous commit 122 | [Reference: https://ohshitgit.com/](https://ohshitgit.com/) 123 | ``` 124 | # find a hash for a commit before the file was changed 125 | git log 126 | # use the arrow keys to scroll up and down in history 127 | # once you've found your commit, save the hash 128 | git checkout [saved hash] -- path/to/file 129 | # the old version of the file will be in your index 130 | git commit -m "Wow, you don't have to copy-paste to undo" 131 | ``` 132 | 133 | ### Undo last commit - keep changes in staged 134 | ``` 135 | git reset HEAD~ --soft 136 | ``` 137 | 138 | ### Remove file added before last commit 139 | If you accidentally add a file with PII or a file that should be stored with git-lfs, this is super helpful! 140 | 141 | See the following Medium Article for context: [Tutorial: Removing Large Files from Git](https://medium.com/analytics-vidhya/tutorial-removing-large-files-from-git-78dbf4cf83a#:~:text=If%20the%20large%20file%20was,HEAD%20to%20edit%20the%20commit) 142 | 143 | 1. Identify the commit before the mistake was made 144 | ``` 145 | git log 146 | ``` 147 | 148 | This will show you all the commits from the branch you are on with the latest first: 149 | 150 | 151 | Once you find the last good commit - in this case the "git updates" commit before the "bad file" was added - close out of the git log by typing `wq` 152 | 153 | 2. Initiate a rebase between the last good commit and the current commit 154 | ``` 155 | git rebase -i cffbcbcaf2d46a6c60e730c3f580646727bf9a57 156 | ``` 157 | **IMPORTANT NOTE:** You can abort a rebase at any time with `git rebase --abort` 158 | 159 | 3. You will be brought into vim where all the commits after the last good commit (here the first 3 lines) are displayed. All the other stuff is just instructions. 160 | 161 | 162 | 4. You want to edit the first commit with the bad file and pick (i.e. keep without changes) the other two. 163 | - Type `i` to enter insert mode 164 | - Delete pick and write edit 165 | - Press `esc` to exit insert mode 166 | - Type `:wq` to save 167 | - 168 | 169 | 5. You are now in a detached, temporary space 170 | 171 | 172 | 6. Remove the file from git 173 | ``` 174 | git rm --cached bad_file.xlsx 175 | ``` 176 | 177 | 178 | 7. Delete the file (or add it to git lfs files ). You need to do this becuase if you git status, you will see the file as an untracked file. 179 | 180 | - **NOTE:** The steps for adding a file to git lfs are: 181 | - `git lfs track {path to file}` 182 | - This should update your `.gitattributes` file - run `git status` to check 183 | - `git add .gitattribtues` 184 | - `git add {path to file}` 185 | 186 | 8. Now that you are done with the changes to the commit, amend the commit: 187 | ``` 188 | git commit --amend 189 | ``` 190 | 191 | 9. Use vim to edit the text of the commit from "bad file and formatting updates" to "formatting updates" 192 | - Type `i` to enter insert mode 193 | - Press `esc` to exit insert mode 194 | - Type `:wq` to close and save 195 | 196 | 197 | 10. Once you save and close the commit amend, you will see the below: 198 | 199 | 200 | 11. Continue the rebase (it will go until the next edit commit or complete if nothing left to edit). In our case, we have nothing else to edit, so the rebase completes successfully. 201 | ``` 202 | git rebase --continue 203 | ``` 204 | 205 | 206 | If you `git log` again, you will see that commit message is updated but the rest of the history looks the same 207 | 208 | 209 | 12. Push your rebased branch to the remote 210 | ``` 211 | git push --force 212 | ``` 213 | 214 | 215 | ## Compare 216 | ### Compare your local branch to origin 217 | ``` 218 | git diff origin/branch name 219 | ``` -------------------------------------------------------------------------------- /docs/3-edit_with_vscode.md: -------------------------------------------------------------------------------- 1 | ## Install 2 | 3 | 1. [Download Vscode](https://code.visualstudio.com/download) 4 | 2. Install the extensions below (optional): 5 | 6 | - Python 7 | - Extension ID: ms-python.python 8 | - img 9 | - Python Environment Manager 10 | - Extension ID: donjayamanne.python-environment-manager 11 | - img 12 | - Jupyter 13 | - Extension ID: ms-toolsai.jupyter 14 | - img 15 | - Prettify JSON 16 | - Extension ID: mohsen1.prettify-json 17 | - img 18 | - JSON Viewer 19 | - Extension ID: ccimage.jsonviewer 20 | - img 21 | - Markdown Preview Enhanced 22 | - Extension ID: shd101wyy.markdown-preview-enhanced 23 | - img 24 | - Rainbow CSV 25 | - Extension ID: mechatroner.rainbow-csv 26 | - img 27 | - vscode-pdf 28 | - Extension ID: tomoki1207.pdf 29 | - img 30 | - Remote-SSH 31 | - Extension ID: ms-vscode-remote.remote-ssh 32 | - img 33 | - WSL (only if using Windows WSL) 34 | - Extension ID: ms-vscode-remote.remote-wsl 35 | - img 36 | 37 | **NOTE:** If you are using a remote WSL or SSH server, you will also need to install these packages there. 38 | 39 | 40 | ## Use VSCode with WSL 41 | 42 | 1. Once you install the WSL extension, navigate to the Remote Explorer tab and connect to your WSL distribution 43 | - img 44 | 2. Navigate to open a folder as you normally would 45 | - img 46 | 3. Install VSCode extensions that are installed locally by navigating to the marketplace and clicking the `Install in WSL:Ubuntu` button 47 | - img 48 | 49 | ## Configure Remote-SSH Editing 50 | 51 | When project files are hosted on a Linux Machine, you can easily edit/ debug them as you would local files by taking advantage of VS Code's Remote-SSH extension. 52 | 53 | To use SSH to connect to a remote Linux machine: 54 | 55 | 1. Open the Command Palette 56 | - Mac: `shift + cmd + P` 57 | - Windows: `shift + ctrl + P` 58 | 2. Search for/ Select Remote-SSH: Add New SSH Host.. 59 | - img 60 | 3. Enter the ssh connection command 61 | - `ssh {username}@{ip}` 62 | - img 63 | 4. Select the ssh file to update 64 | - img 65 | 5. You will see a pop-up in the bottom right corner that the host has been added 66 | - img 67 | 6. In the Remote Explorer tab, you will now see your new SSH Target. Click the plus folder icon to "Connect to Host in New Window" 68 | - img 69 | 7. A new window will open and you will be prompted to enter your password 70 | - img 71 | 8. Choose the folder in the remote machine you want to open and select "OK" 72 | - img 73 | 9. You will be prompted for your password one more time 74 | - img 75 | 10. Upon successful connection, you will see the remote machine's ip as well as the git branch you are currently on (if opened to a git repo) in the bottom left corner 76 | - img 77 | 78 | You can now easily edit and debug your code as you would locally. 79 | 80 | ### Note on High Security Remote Machines 81 | If you are connecting to the remote machine with a normal user (i.e. non-root user) you will may get access errors when trying to run a ipynb file depending on the user's permissions. 82 | 83 | img 84 | 85 | This happens because, in a Unix/Linux system, you can’t bind to external facing ports without super user/root access. 86 | 87 | If you do not have an environment controlled with Puppet, you can try editing the user's permissions to not need password authentication when entering root user mode. However, it is easiest to just test small code snippets in a noteboook file locally. 88 | 89 | For more information, see [https://code.visualstudio.com/docs/remote/ssh](https://code.visualstudio.com/docs/remote/ssh) 90 | 91 | -------------------------------------------------------------------------------- /docs/4-mambaforge_python_env.md: -------------------------------------------------------------------------------- 1 | ## Install 2 | ### Mac 3 | 4 | 1. Install `wget` 5 | ```bash 6 | brew install wget 7 | ``` 8 | 2. Install Mambaforge 9 | ```bash 10 | wget "https://github.com/conda-forge/miniforge/releases/latest/download/Mambaforge-$(uname)-$(uname -m).sh" 11 | bash Mambaforge-$(uname)-$(uname -m).sh 12 | ``` 13 | 14 | ### Windows WSL/ Linux 15 | 16 | 1. Install `wget` 17 | ```bash 18 | sudo apt install wget 19 | ``` 20 | 2. Install Mambaforge 21 | ```bash 22 | wget "https://github.com/conda-forge/miniforge/releases/latest/download/Mambaforge-$(uname)-$(uname -m).sh" 23 | bash Mambaforge-$(uname)-$(uname -m).sh 24 | source ~/.bashrc 25 | ``` 26 | 27 | ## Shared Install Instructions 28 | 1. Respond to install prompts 29 | - Accepts the license 30 | - img 31 | - Accept the default install location 32 | - img 33 | - Accept default to not update shell profile 34 | - img 35 | - img 36 | 2. Run `conda init` 37 | - img 38 | - This will add the conda init to your `.bashrc` file 39 | - img 40 | 3. If not done already, add sourcing `.bashrc` to your `.bash_profile` so conda is initialized when your terminal loads 41 | ``` 42 | source ~/.bashrc 43 | ``` 44 | 4. Now when you open your terminal and run the command `conda` you will see: 45 | - img 46 | 47 | ## Useful Mambaforge Commands 48 | 49 | - Create new conda python virtual environment 50 | * Note: If it asks you to select y/n, enter "y" 51 | ```bash 52 | conda create -n {name} python={version} 53 | ``` 54 | - Activate conda environment 55 | ```bash 56 | conda activate {name} 57 | ``` 58 | - Deactivate conda environment 59 | ```bash 60 | source deactivate 61 | ``` 62 | -------------------------------------------------------------------------------- /docs/5-poetry_package_manager.md: -------------------------------------------------------------------------------- 1 | 2 | ## Install 3 | 4 | - Install `poetry` with the following command: 5 | ```curl -sSL https://install.python-poetry.org | python3 -``` 6 | - Restart your terminal 7 | - Enter `poetry` and you should see a list of commands returned 8 | 9 | **NOTE:** If that install doesn't work for you, use this workaround: 10 | 11 | - Activate the conda environment for your project 12 | - Run `pip install poetry==1.7` 13 | 14 | ## Specify Project Dependencies 15 | 16 | When you are first creating the project, you will use `poetry init` to interactively create the `pyproject.toml` file. 17 | 18 | For example, to create specify this project's dependencies, I followed the steps below: 19 | 20 | 1. Create a conda environment with the same name as the project folder 21 | 22 | - `conda create -n python-dev-setup python=3.9` 23 | - img 24 | 25 | 2. Run `poetry init` 26 | 27 | - Press enter to accept the defaults until you get to the questions on defining dependencies interactivaly 28 | - img 29 | - I find it easier to specificy the dependencies individually later vs. at this step. So, I enter no to both questions and then press enter to confirm generation. 30 | - img 31 | 32 | 3. You will now see a `pyproject.toml` file created 33 | 34 | **NOTE:** If you are converting a project that currently uses a `requirements.txt` file, you can just fill in the template below instead of using poetry init: 35 | 36 | ``` 37 | [tool.poetry] 38 | name = "{repo/project name}" 39 | version = "1.0.0" 40 | description = "{free text description}" 41 | readme = "README.md" 42 | repository = "{git repo link}" 43 | documentation = "{site url if applicable}" 44 | authors = [ 45 | "{full name} <{email}>" 46 | ] 47 | 48 | [tool.poetry.dependencies] 49 | python = "=={Python version}" 50 | 51 | [tool.poetry.dev-dependencies] 52 | 53 | [build-system] 54 | requires = ["poetry-core>=1.0.0"] 55 | build-backend = "poetry.core.masonry.api" 56 | ``` 57 | 58 | ## Create poetry.lock file 59 | 60 | The first time you run `poetry install` or add a package with `poetry add {package name}`, the `poetry.lock` file is created 61 | 62 | After adding the dependencies needed with `poetry add`, push the `pyproject.toml` and `poetry.lock` files to the remote repo. 63 | 64 | ## Install Project Dependencies 65 | 66 | 67 | Now that the lock file is created, other team members can simply: 68 | 69 | 1. Create a conda environment using python version 3.9 70 | 2. Run `poetry install` 71 | 72 | After these steps, they will be working with the same dependencies you are using! 73 | 74 | ## Useful Poetry Commands 75 | 76 | ### Install requirements 77 | ``` 78 | poetry install 79 | ``` 80 | 81 | ### Add a package 82 | This will install the latest package version. The `pyproject.toml` will show a version greater than or equal to the version is required and the `poetry.lock` file will update to specify the specific version installed. 83 | 84 | - Add the latest version fo the package meeting other project depencies: 85 | - `poetry add {package name}` 86 | - Install specific version of the package: 87 | - `poetry add {package name}={version}` 88 | - Install a model from a URL: 89 | - `poetry add {package name}@{url}` 90 | - Install an editable local package: 91 | - `poetry add --editable {relative path to package}` 92 | 93 | ### Remove a package 94 | This will update the `pyproject.toml` and `poetry.lock` files 95 | ``` 96 | poetry remove {package name} 97 | ``` 98 | 99 | ### Convert `poetry.lock` file to `requirements.txt` 100 | ``` 101 | poetry export -f requirements.txt -o requirements.txt --without-hashes 102 | ``` 103 | 104 | ## Troubleshooting 105 | 106 | If poetry is endlessly searching for a package to install, try deleting the `poetry.lock` file and running `poetry install` again 107 | -------------------------------------------------------------------------------- /docs/css/custom_style.css: -------------------------------------------------------------------------------- 1 | th { 2 | font-weight: bold; 3 | } 4 | 5 | .df-div { 6 | overflow-x:auto; 7 | } 8 | 9 | .codehilite code{ 10 | background-color: white; 11 | } 12 | 13 | /* format like code */ 14 | .md-typeset mark { 15 | background-color:#f5f5f5; 16 | color: #404e56; 17 | padding: 2px 18 | } 19 | 20 | /* format medium link embed */ 21 | .medium-link { 22 | border-style: solid; 23 | border-color: #404e56; 24 | padding: 10px; 25 | width: 100%; 26 | margin: 0 auto; 27 | display: -webkit-flex; /* Safari */ 28 | display: flex; /* Standard syntax */ 29 | } 30 | 31 | .article-info { 32 | width: 75%; 33 | float: left 34 | } 35 | 36 | .article-img { 37 | width: 25%; 38 | float: right 39 | } 40 | -------------------------------------------------------------------------------- /docs/img/add-ssh-host.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/add-ssh-host.png -------------------------------------------------------------------------------- /docs/img/bitbucket_settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/bitbucket_settings.png -------------------------------------------------------------------------------- /docs/img/code_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/code_logo.png -------------------------------------------------------------------------------- /docs/img/conda-bashrc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/conda-bashrc.png -------------------------------------------------------------------------------- /docs/img/conda-cmd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/conda-cmd.png -------------------------------------------------------------------------------- /docs/img/conda-init.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/conda-init.png -------------------------------------------------------------------------------- /docs/img/conda-install-done.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/conda-install-done.png -------------------------------------------------------------------------------- /docs/img/conda-license.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/conda-license.png -------------------------------------------------------------------------------- /docs/img/conda-loc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/conda-loc.png -------------------------------------------------------------------------------- /docs/img/conda-profile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/conda-profile.png -------------------------------------------------------------------------------- /docs/img/conda_deps_installed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/conda_deps_installed.png -------------------------------------------------------------------------------- /docs/img/conda_env_created.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/conda_env_created.png -------------------------------------------------------------------------------- /docs/img/enter-ssh-pw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/enter-ssh-pw.png -------------------------------------------------------------------------------- /docs/img/enter-ssh-pw2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/enter-ssh-pw2.png -------------------------------------------------------------------------------- /docs/img/git-excel-changes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/git-excel-changes.png -------------------------------------------------------------------------------- /docs/img/git-log.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/git-log.png -------------------------------------------------------------------------------- /docs/img/git-rebase1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/git-rebase1.png -------------------------------------------------------------------------------- /docs/img/git-rebase2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/git-rebase2.png -------------------------------------------------------------------------------- /docs/img/git-rebase3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/git-rebase3.png -------------------------------------------------------------------------------- /docs/img/git-rebase4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/git-rebase4.png -------------------------------------------------------------------------------- /docs/img/git-rebase5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/git-rebase5.png -------------------------------------------------------------------------------- /docs/img/git-rebase6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/git-rebase6.png -------------------------------------------------------------------------------- /docs/img/git-rebase7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/git-rebase7.png -------------------------------------------------------------------------------- /docs/img/git-rebase8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/git-rebase8.png -------------------------------------------------------------------------------- /docs/img/git-rebase9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/git-rebase9.png -------------------------------------------------------------------------------- /docs/img/git_settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/git_settings.png -------------------------------------------------------------------------------- /docs/img/github_connected_wsl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/github_connected_wsl.png -------------------------------------------------------------------------------- /docs/img/host-added.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/host-added.png -------------------------------------------------------------------------------- /docs/img/install_vscode_ext_in_wsl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/install_vscode_ext_in_wsl.png -------------------------------------------------------------------------------- /docs/img/json-viewer-extension.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/json-viewer-extension.png -------------------------------------------------------------------------------- /docs/img/jupyter-extension.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/jupyter-extension.png -------------------------------------------------------------------------------- /docs/img/markdown-extension.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/markdown-extension.png -------------------------------------------------------------------------------- /docs/img/medium_article.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/medium_article.png -------------------------------------------------------------------------------- /docs/img/no-excel-change.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/no-excel-change.png -------------------------------------------------------------------------------- /docs/img/notebook-access-error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/notebook-access-error.png -------------------------------------------------------------------------------- /docs/img/open-ssh-folder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/open-ssh-folder.png -------------------------------------------------------------------------------- /docs/img/open_wsl_folder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/open_wsl_folder.png -------------------------------------------------------------------------------- /docs/img/orig-excel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/orig-excel.png -------------------------------------------------------------------------------- /docs/img/pdf-extension.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/pdf-extension.png -------------------------------------------------------------------------------- /docs/img/poetry-init1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/poetry-init1.png -------------------------------------------------------------------------------- /docs/img/poetry-init2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/poetry-init2.png -------------------------------------------------------------------------------- /docs/img/poetry-install1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/poetry-install1.png -------------------------------------------------------------------------------- /docs/img/poetry-install2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/poetry-install2.png -------------------------------------------------------------------------------- /docs/img/poetry_add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/poetry_add.png -------------------------------------------------------------------------------- /docs/img/poetry_add_file_updates.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/poetry_add_file_updates.png -------------------------------------------------------------------------------- /docs/img/poetry_install_output.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/poetry_install_output.png -------------------------------------------------------------------------------- /docs/img/post_poetry_install.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/post_poetry_install.png -------------------------------------------------------------------------------- /docs/img/prettify-json-extension.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/prettify-json-extension.png -------------------------------------------------------------------------------- /docs/img/python-env-manager-extension.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/python-env-manager-extension.png -------------------------------------------------------------------------------- /docs/img/python-extension.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/python-extension.png -------------------------------------------------------------------------------- /docs/img/rainbow-csv-extension.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/rainbow-csv-extension.png -------------------------------------------------------------------------------- /docs/img/remote-edit-tab.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/remote-edit-tab.png -------------------------------------------------------------------------------- /docs/img/remote-ssh-pkg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/remote-ssh-pkg.png -------------------------------------------------------------------------------- /docs/img/remove-git-exclusion.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/remove-git-exclusion.png -------------------------------------------------------------------------------- /docs/img/reset_wsl_pw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/reset_wsl_pw.png -------------------------------------------------------------------------------- /docs/img/ssh connected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/ssh connected.png -------------------------------------------------------------------------------- /docs/img/ssh-clone-success.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/ssh-clone-success.png -------------------------------------------------------------------------------- /docs/img/ssh-connect-command.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/ssh-connect-command.png -------------------------------------------------------------------------------- /docs/img/ssh-success.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/ssh-success.png -------------------------------------------------------------------------------- /docs/img/ssh_clone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/ssh_clone.png -------------------------------------------------------------------------------- /docs/img/ssh_keygen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/ssh_keygen.png -------------------------------------------------------------------------------- /docs/img/start-ubuntu-install.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/start-ubuntu-install.png -------------------------------------------------------------------------------- /docs/img/start_ssh_agent_wsl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/start_ssh_agent_wsl.png -------------------------------------------------------------------------------- /docs/img/terminal_formatting.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/terminal_formatting.png -------------------------------------------------------------------------------- /docs/img/test.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/test.png -------------------------------------------------------------------------------- /docs/img/ubuntu-install-done.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/ubuntu-install-done.png -------------------------------------------------------------------------------- /docs/img/update-ssh-file.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/update-ssh-file.png -------------------------------------------------------------------------------- /docs/img/updated-excel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/updated-excel.png -------------------------------------------------------------------------------- /docs/img/vscode_wsl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/vscode_wsl.png -------------------------------------------------------------------------------- /docs/img/windows-feature.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/windows-feature.png -------------------------------------------------------------------------------- /docs/img/wsl-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/wsl-1.png -------------------------------------------------------------------------------- /docs/img/wsl-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/wsl-3.png -------------------------------------------------------------------------------- /docs/img/wsl-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/wsl-4.png -------------------------------------------------------------------------------- /docs/img/wsl-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/wsl-5.png -------------------------------------------------------------------------------- /docs/img/wsl-no-distros.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/wsl-no-distros.png -------------------------------------------------------------------------------- /docs/img/wsl-targets.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/wsl-targets.png -------------------------------------------------------------------------------- /docs/img/wsl_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/wsl_2.png -------------------------------------------------------------------------------- /docs/img/wsl_install_git.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/wsl_install_git.png -------------------------------------------------------------------------------- /docs/img/wsl_keygen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/wsl_keygen.png -------------------------------------------------------------------------------- /docs/img/wsl_terminal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/wsl_terminal.png -------------------------------------------------------------------------------- /docs/img/wsl_terminal2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/wsl_terminal2.png -------------------------------------------------------------------------------- /docs/img/wsl_username.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/docs/img/wsl_username.png -------------------------------------------------------------------------------- /docs/index.md: -------------------------------------------------------------------------------- 1 | ## Table of Contents 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 13 | 19 | 25 | 26 | 27 | 28 | 29 | 42 | 43 | 44 | 45 | 46 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 65 | 66 | 67 | 74 | 75 |
TaskRecommended ToolContent
11 | 1. Run Scripts from Command Line 12 | 14 |
    15 |
  • Mac Users: Terminal
  • 16 |
  • Windows Users: WSL
  • 17 |
18 |
20 | 24 |
2. Version Control Your CodeGit 30 | 41 |
3. Edit and Debug Your CodeVS Code 47 | 52 |
4. Manage Your Python VersionMambaforge 58 | 62 |
5. Manage Your Python Package VersionsPoetry 68 | 73 |
76 | 77 | ## Overview 78 | 79 | To have a good environment setup, you must have tools to efficiently perform the following 5 tasks: 80 | 81 | 1. Run scripts from command line 82 | 2. Version control your code 83 | 3. Edit and debug your code 84 | 4. Manage the Python version you use to run your code 85 | 5. Manage the Python package versions you use to run your code 86 | 87 | A good environment setup is key to many things including: 88 | 89 | - Team collaboration 90 | - Production Readiness 91 | - Time saving 92 | 93 | In this site, tool recommendations, install/ configuration instructions and common commands are provided to ensure you can easily create a setup you'll love. 94 | 95 | For more details see the following Medium Article: 96 | 97 | 98 | 107 | 108 | -------------------------------------------------------------------------------- /excel_to_text_dump.py: -------------------------------------------------------------------------------- 1 | from io import StringIO 2 | import sys 3 | 4 | import pandas as pd 5 | 6 | 7 | for sheet_name in pd.ExcelFile(sys.argv[1]).sheet_names: 8 | output = StringIO() 9 | print('Sheet: %s' % sheet_name) 10 | pd.read_excel(sys.argv[1], sheet_name=sheet_name)\ 11 | .to_csv(output, 12 | header=True, 13 | index=False) 14 | print(output.getvalue()) 15 | -------------------------------------------------------------------------------- /git_dif_excel_demo.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jillvillany/python-dev-setup/4a3635455bd8329d186c0cb3770f0b98c60972a0/git_dif_excel_demo.xlsx -------------------------------------------------------------------------------- /mkdocs.yml: -------------------------------------------------------------------------------- 1 | # Project information 2 | site_name: 'Python Dev Setup' 3 | site_description: '' 4 | site_author: '@jillvillany' 5 | site_url: 'https://jillvillany.github.io/python-dev-setup/' 6 | 7 | # Copyright 8 | # copyright: '© 2021 ' 9 | 10 | # Repository 11 | repo_name: 'python-dev-setup' 12 | repo_url: 'https://github.com/jillvillany/python-dev-setup' 13 | 14 | # Configuration 15 | docs_dir: 'docs' 16 | theme: 17 | name: material 18 | font: 19 | text: IBM Plex Sans 20 | code: IBM Plex Mono 21 | logo: img/code_logo.png 22 | favicon: img/code_logo.png 23 | language: en 24 | features: 25 | - navigation.instant 26 | - navigation.top 27 | - navigation.tracking 28 | - navigation.indexes 29 | palette: 30 | - scheme: default 31 | primary: indigo 32 | accent: pink 33 | toggle: 34 | icon: material/brightness-7 35 | name: Switch to dark mode 36 | - scheme: slate 37 | primary: gray 38 | accent: white 39 | toggle: 40 | icon: material/brightness-4 41 | name: Switch to light mode 42 | 43 | # Extensions 44 | markdown_extensions: 45 | - admonition 46 | - codehilite 47 | - footnotes 48 | # snippets extension with check_paths needed if inserting code snippets into markdowns 49 | - pymdownx.snippets: 50 | check_paths: true 51 | - toc: 52 | permalink: true 53 | separator: '-' 54 | toc_depth: 4 55 | # needed for the code formatting in md files 56 | - attr_list 57 | - pymdownx.highlight 58 | - pymdownx.superfences 59 | 60 | plugins: 61 | - search: 62 | separator: '[\s\-\.]+' 63 | lang: 64 | - en 65 | 66 | # Customization 67 | extra_javascript: 68 | - 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.6/MathJax.js?config=TeX-MML-AM_CHTML' 69 | extra_css: 70 | - 'css/custom_style.css' 71 | extra: 72 | analytics: 73 | provider: google 74 | property: G-2VRMGL6YZV 75 | manifest: 'manifest.json' 76 | social: 77 | - icon: 'fontawesome/brands/github-alt' 78 | link: '' 79 | - icon: 'fontawesome/brands/twitter' 80 | link: '' 81 | consent: 82 | cookies: 83 | 84 | 85 | 86 | # Page tree 87 | nav: 88 | - Home: index.md 89 | - 1. Run Scripts from Command Line: 1-run_scripts_cmd_line.md 90 | - 2. Version Control Your Code: 91 | - Git Version Control: 2-git_version_control/index.md 92 | - Useful Git Commands: 2-git_version_control/useful_git_commands.md 93 | - Git Diff Excel Workaround: 2-git_version_control/git_dif_excel_workaround.md 94 | - archive_branch.sh: 2-git_version_control/archive_branch.md 95 | - sync_git_branches.sh: 2-git_version_control/sync_git_branches.md 96 | - Git LFS: 2-git_version_control/git_lfs.md 97 | - 3. Edit and Debug Your Code: 3-edit_with_vscode.md 98 | - 4. Manage Your Python Version: 4-mambaforge_python_env.md 99 | - 5. Manage Your Python Package Versions: 5-poetry_package_manager.md 100 | -------------------------------------------------------------------------------- /poetry.lock: -------------------------------------------------------------------------------- 1 | [[package]] 2 | name = "click" 3 | version = "8.1.3" 4 | description = "Composable command line interface toolkit" 5 | category = "main" 6 | optional = false 7 | python-versions = ">=3.7" 8 | 9 | [package.dependencies] 10 | colorama = {version = "*", markers = "platform_system == \"Windows\""} 11 | 12 | [[package]] 13 | name = "colorama" 14 | version = "0.4.5" 15 | description = "Cross-platform colored terminal text." 16 | category = "main" 17 | optional = false 18 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 19 | 20 | [[package]] 21 | name = "et-xmlfile" 22 | version = "1.1.0" 23 | description = "An implementation of lxml.xmlfile for the standard library" 24 | category = "main" 25 | optional = false 26 | python-versions = ">=3.6" 27 | 28 | [[package]] 29 | name = "ghp-import" 30 | version = "2.1.0" 31 | description = "Copy your docs directly to the gh-pages branch." 32 | category = "main" 33 | optional = false 34 | python-versions = "*" 35 | 36 | [package.dependencies] 37 | python-dateutil = ">=2.8.1" 38 | 39 | [package.extras] 40 | dev = ["twine", "markdown", "flake8", "wheel"] 41 | 42 | [[package]] 43 | name = "importlib-metadata" 44 | version = "4.12.0" 45 | description = "Read metadata from Python packages" 46 | category = "main" 47 | optional = false 48 | python-versions = ">=3.7" 49 | 50 | [package.dependencies] 51 | zipp = ">=0.5" 52 | 53 | [package.extras] 54 | docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"] 55 | perf = ["ipython"] 56 | testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.3)", "packaging", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "importlib-resources (>=1.3)"] 57 | 58 | [[package]] 59 | name = "jinja2" 60 | version = "3.1.2" 61 | description = "A very fast and expressive template engine." 62 | category = "main" 63 | optional = false 64 | python-versions = ">=3.7" 65 | 66 | [package.dependencies] 67 | MarkupSafe = ">=2.0" 68 | 69 | [package.extras] 70 | i18n = ["Babel (>=2.7)"] 71 | 72 | [[package]] 73 | name = "markdown" 74 | version = "3.3.7" 75 | description = "Python implementation of Markdown." 76 | category = "main" 77 | optional = false 78 | python-versions = ">=3.6" 79 | 80 | [package.dependencies] 81 | importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} 82 | 83 | [package.extras] 84 | testing = ["coverage", "pyyaml"] 85 | 86 | [[package]] 87 | name = "markupsafe" 88 | version = "2.1.1" 89 | description = "Safely add untrusted strings to HTML/XML markup." 90 | category = "main" 91 | optional = false 92 | python-versions = ">=3.7" 93 | 94 | [[package]] 95 | name = "mergedeep" 96 | version = "1.3.4" 97 | description = "A deep merge function for 🐍." 98 | category = "main" 99 | optional = false 100 | python-versions = ">=3.6" 101 | 102 | [[package]] 103 | name = "mkdocs" 104 | version = "1.3.1" 105 | description = "Project documentation with Markdown." 106 | category = "main" 107 | optional = false 108 | python-versions = ">=3.6" 109 | 110 | [package.dependencies] 111 | click = ">=3.3" 112 | ghp-import = ">=1.0" 113 | importlib-metadata = ">=4.3" 114 | Jinja2 = ">=2.10.2" 115 | Markdown = ">=3.2.1,<3.4" 116 | mergedeep = ">=1.3.4" 117 | packaging = ">=20.5" 118 | PyYAML = ">=3.10" 119 | pyyaml-env-tag = ">=0.1" 120 | watchdog = ">=2.0" 121 | 122 | [package.extras] 123 | i18n = ["babel (>=2.9.0)"] 124 | 125 | [[package]] 126 | name = "mkdocs-material" 127 | version = "8.4.0" 128 | description = "Documentation that simply works" 129 | category = "main" 130 | optional = false 131 | python-versions = ">=3.7" 132 | 133 | [package.dependencies] 134 | jinja2 = ">=3.0.2" 135 | markdown = ">=3.2" 136 | mkdocs = ">=1.3.0" 137 | mkdocs-material-extensions = ">=1.0.3" 138 | pygments = ">=2.12" 139 | pymdown-extensions = ">=9.4" 140 | 141 | [[package]] 142 | name = "mkdocs-material-extensions" 143 | version = "1.0.3" 144 | description = "Extension pack for Python Markdown." 145 | category = "main" 146 | optional = false 147 | python-versions = ">=3.6" 148 | 149 | [[package]] 150 | name = "numpy" 151 | version = "1.23.2" 152 | description = "NumPy is the fundamental package for array computing with Python." 153 | category = "main" 154 | optional = false 155 | python-versions = ">=3.8" 156 | 157 | [[package]] 158 | name = "openpyxl" 159 | version = "3.0.10" 160 | description = "A Python library to read/write Excel 2010 xlsx/xlsm files" 161 | category = "main" 162 | optional = false 163 | python-versions = ">=3.6" 164 | 165 | [package.dependencies] 166 | et-xmlfile = "*" 167 | 168 | [[package]] 169 | name = "packaging" 170 | version = "21.3" 171 | description = "Core utilities for Python packages" 172 | category = "main" 173 | optional = false 174 | python-versions = ">=3.6" 175 | 176 | [package.dependencies] 177 | pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" 178 | 179 | [[package]] 180 | name = "pandas" 181 | version = "1.4.3" 182 | description = "Powerful data structures for data analysis, time series, and statistics" 183 | category = "main" 184 | optional = false 185 | python-versions = ">=3.8" 186 | 187 | [package.dependencies] 188 | numpy = [ 189 | {version = ">=1.18.5", markers = "platform_machine != \"aarch64\" and platform_machine != \"arm64\" and python_version < \"3.10\""}, 190 | {version = ">=1.19.2", markers = "platform_machine == \"aarch64\" and python_version < \"3.10\""}, 191 | {version = ">=1.20.0", markers = "platform_machine == \"arm64\" and python_version < \"3.10\""}, 192 | {version = ">=1.21.0", markers = "python_version >= \"3.10\""}, 193 | ] 194 | python-dateutil = ">=2.8.1" 195 | pytz = ">=2020.1" 196 | 197 | [package.extras] 198 | test = ["hypothesis (>=5.5.3)", "pytest (>=6.0)", "pytest-xdist (>=1.31)"] 199 | 200 | [[package]] 201 | name = "pygments" 202 | version = "2.13.0" 203 | description = "Pygments is a syntax highlighting package written in Python." 204 | category = "main" 205 | optional = false 206 | python-versions = ">=3.6" 207 | 208 | [package.extras] 209 | plugins = ["importlib-metadata"] 210 | 211 | [[package]] 212 | name = "pymdown-extensions" 213 | version = "9.5" 214 | description = "Extension pack for Python Markdown." 215 | category = "main" 216 | optional = false 217 | python-versions = ">=3.7" 218 | 219 | [package.dependencies] 220 | markdown = ">=3.2" 221 | 222 | [[package]] 223 | name = "pyparsing" 224 | version = "3.0.9" 225 | description = "pyparsing module - Classes and methods to define and execute parsing grammars" 226 | category = "main" 227 | optional = false 228 | python-versions = ">=3.6.8" 229 | 230 | [package.extras] 231 | diagrams = ["railroad-diagrams", "jinja2"] 232 | 233 | [[package]] 234 | name = "python-dateutil" 235 | version = "2.8.2" 236 | description = "Extensions to the standard Python datetime module" 237 | category = "main" 238 | optional = false 239 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" 240 | 241 | [package.dependencies] 242 | six = ">=1.5" 243 | 244 | [[package]] 245 | name = "pytz" 246 | version = "2022.2.1" 247 | description = "World timezone definitions, modern and historical" 248 | category = "main" 249 | optional = false 250 | python-versions = "*" 251 | 252 | [[package]] 253 | name = "pyyaml" 254 | version = "6.0" 255 | description = "YAML parser and emitter for Python" 256 | category = "main" 257 | optional = false 258 | python-versions = ">=3.6" 259 | 260 | [[package]] 261 | name = "pyyaml-env-tag" 262 | version = "0.1" 263 | description = "A custom YAML tag for referencing environment variables in YAML files. " 264 | category = "main" 265 | optional = false 266 | python-versions = ">=3.6" 267 | 268 | [package.dependencies] 269 | pyyaml = "*" 270 | 271 | [[package]] 272 | name = "six" 273 | version = "1.16.0" 274 | description = "Python 2 and 3 compatibility utilities" 275 | category = "main" 276 | optional = false 277 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" 278 | 279 | [[package]] 280 | name = "watchdog" 281 | version = "2.1.9" 282 | description = "Filesystem events monitoring" 283 | category = "main" 284 | optional = false 285 | python-versions = ">=3.6" 286 | 287 | [package.extras] 288 | watchmedo = ["PyYAML (>=3.10)"] 289 | 290 | [[package]] 291 | name = "zipp" 292 | version = "3.8.1" 293 | description = "Backport of pathlib-compatible object wrapper for zip files" 294 | category = "main" 295 | optional = false 296 | python-versions = ">=3.7" 297 | 298 | [package.extras] 299 | docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)", "jaraco.tidelift (>=1.4)"] 300 | testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.3)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)"] 301 | 302 | [metadata] 303 | lock-version = "1.1" 304 | python-versions = "^3.9" 305 | content-hash = "e0026472f3ab2e0fa846d50d290fe5960f9095c6ceb1034d8813c8dea836cb1a" 306 | 307 | [metadata.files] 308 | click = [ 309 | {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, 310 | {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, 311 | ] 312 | colorama = [ 313 | {file = "colorama-0.4.5-py2.py3-none-any.whl", hash = "sha256:854bf444933e37f5824ae7bfc1e98d5bce2ebe4160d46b5edf346a89358e99da"}, 314 | {file = "colorama-0.4.5.tar.gz", hash = "sha256:e6c6b4334fc50988a639d9b98aa429a0b57da6e17b9a44f0451f930b6967b7a4"}, 315 | ] 316 | et-xmlfile = [] 317 | ghp-import = [ 318 | {file = "ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343"}, 319 | {file = "ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619"}, 320 | ] 321 | importlib-metadata = [ 322 | {file = "importlib_metadata-4.12.0-py3-none-any.whl", hash = "sha256:7401a975809ea1fdc658c3aa4f78cc2195a0e019c5cbc4c06122884e9ae80c23"}, 323 | {file = "importlib_metadata-4.12.0.tar.gz", hash = "sha256:637245b8bab2b6502fcbc752cc4b7a6f6243bb02b31c5c26156ad103d3d45670"}, 324 | ] 325 | jinja2 = [ 326 | {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, 327 | {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, 328 | ] 329 | markdown = [ 330 | {file = "Markdown-3.3.7-py3-none-any.whl", hash = "sha256:f5da449a6e1c989a4cea2631aa8ee67caa5a2ef855d551c88f9e309f4634c621"}, 331 | {file = "Markdown-3.3.7.tar.gz", hash = "sha256:cbb516f16218e643d8e0a95b309f77eb118cb138d39a4f27851e6a63581db874"}, 332 | ] 333 | markupsafe = [ 334 | {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, 335 | {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, 336 | {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, 337 | {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"}, 338 | {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"}, 339 | {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"}, 340 | {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"}, 341 | {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"}, 342 | {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"}, 343 | {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"}, 344 | {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"}, 345 | {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"}, 346 | {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"}, 347 | {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"}, 348 | {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"}, 349 | {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"}, 350 | {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"}, 351 | {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"}, 352 | {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"}, 353 | {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"}, 354 | {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"}, 355 | {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"}, 356 | {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"}, 357 | {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"}, 358 | {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"}, 359 | {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"}, 360 | {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"}, 361 | {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"}, 362 | {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"}, 363 | {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"}, 364 | {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"}, 365 | {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"}, 366 | {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"}, 367 | {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"}, 368 | {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"}, 369 | {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"}, 370 | {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"}, 371 | {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"}, 372 | {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"}, 373 | {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, 374 | ] 375 | mergedeep = [ 376 | {file = "mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307"}, 377 | {file = "mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8"}, 378 | ] 379 | mkdocs = [] 380 | mkdocs-material = [] 381 | mkdocs-material-extensions = [ 382 | {file = "mkdocs-material-extensions-1.0.3.tar.gz", hash = "sha256:bfd24dfdef7b41c312ede42648f9eb83476ea168ec163b613f9abd12bbfddba2"}, 383 | {file = "mkdocs_material_extensions-1.0.3-py3-none-any.whl", hash = "sha256:a82b70e533ce060b2a5d9eb2bc2e1be201cf61f901f93704b4acf6e3d5983a44"}, 384 | ] 385 | numpy = [] 386 | openpyxl = [] 387 | packaging = [ 388 | {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, 389 | {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, 390 | ] 391 | pandas = [ 392 | {file = "pandas-1.4.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d51674ed8e2551ef7773820ef5dab9322be0828629f2cbf8d1fc31a0c4fed640"}, 393 | {file = "pandas-1.4.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:16ad23db55efcc93fa878f7837267973b61ea85d244fc5ff0ccbcfa5638706c5"}, 394 | {file = "pandas-1.4.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:958a0588149190c22cdebbc0797e01972950c927a11a900fe6c2296f207b1d6f"}, 395 | {file = "pandas-1.4.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e48fbb64165cda451c06a0f9e4c7a16b534fcabd32546d531b3c240ce2844112"}, 396 | {file = "pandas-1.4.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f803320c9da732cc79210d7e8cc5c8019aad512589c910c66529eb1b1818230"}, 397 | {file = "pandas-1.4.3-cp310-cp310-win_amd64.whl", hash = "sha256:2893e923472a5e090c2d5e8db83e8f907364ec048572084c7d10ef93546be6d1"}, 398 | {file = "pandas-1.4.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:24ea75f47bbd5574675dae21d51779a4948715416413b30614c1e8b480909f81"}, 399 | {file = "pandas-1.4.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d5ebc990bd34f4ac3c73a2724c2dcc9ee7bf1ce6cf08e87bb25c6ad33507e318"}, 400 | {file = "pandas-1.4.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d6c0106415ff1a10c326c49bc5dd9ea8b9897a6ca0c8688eb9c30ddec49535ef"}, 401 | {file = "pandas-1.4.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78b00429161ccb0da252229bcda8010b445c4bf924e721265bec5a6e96a92e92"}, 402 | {file = "pandas-1.4.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6dfbf16b1ea4f4d0ee11084d9c026340514d1d30270eaa82a9f1297b6c8ecbf0"}, 403 | {file = "pandas-1.4.3-cp38-cp38-win32.whl", hash = "sha256:48350592665ea3cbcd07efc8c12ff12d89be09cd47231c7925e3b8afada9d50d"}, 404 | {file = "pandas-1.4.3-cp38-cp38-win_amd64.whl", hash = "sha256:605d572126eb4ab2eadf5c59d5d69f0608df2bf7bcad5c5880a47a20a0699e3e"}, 405 | {file = "pandas-1.4.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a3924692160e3d847e18702bb048dc38e0e13411d2b503fecb1adf0fcf950ba4"}, 406 | {file = "pandas-1.4.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:07238a58d7cbc8a004855ade7b75bbd22c0db4b0ffccc721556bab8a095515f6"}, 407 | {file = "pandas-1.4.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:755679c49460bd0d2f837ab99f0a26948e68fa0718b7e42afbabd074d945bf84"}, 408 | {file = "pandas-1.4.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41fc406e374590a3d492325b889a2686b31e7a7780bec83db2512988550dadbf"}, 409 | {file = "pandas-1.4.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d9382f72a4f0e93909feece6fef5500e838ce1c355a581b3d8f259839f2ea76"}, 410 | {file = "pandas-1.4.3-cp39-cp39-win32.whl", hash = "sha256:0daf876dba6c622154b2e6741f29e87161f844e64f84801554f879d27ba63c0d"}, 411 | {file = "pandas-1.4.3-cp39-cp39-win_amd64.whl", hash = "sha256:721a3dd2f06ef942f83a819c0f3f6a648b2830b191a72bbe9451bcd49c3bd42e"}, 412 | {file = "pandas-1.4.3.tar.gz", hash = "sha256:2ff7788468e75917574f080cd4681b27e1a7bf36461fe968b49a87b5a54d007c"}, 413 | ] 414 | pygments = [] 415 | pymdown-extensions = [ 416 | {file = "pymdown_extensions-9.5-py3-none-any.whl", hash = "sha256:ec141c0f4983755349f0c8710416348d1a13753976c028186ed14f190c8061c4"}, 417 | {file = "pymdown_extensions-9.5.tar.gz", hash = "sha256:3ef2d998c0d5fa7eb09291926d90d69391283561cf6306f85cd588a5eb5befa0"}, 418 | ] 419 | pyparsing = [ 420 | {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, 421 | {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, 422 | ] 423 | python-dateutil = [ 424 | {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, 425 | {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, 426 | ] 427 | pytz = [] 428 | pyyaml = [ 429 | {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, 430 | {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, 431 | {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, 432 | {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, 433 | {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, 434 | {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, 435 | {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, 436 | {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, 437 | {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, 438 | {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, 439 | {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, 440 | {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, 441 | {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, 442 | {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, 443 | {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, 444 | {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, 445 | {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, 446 | {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, 447 | {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, 448 | {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, 449 | {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, 450 | {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, 451 | {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, 452 | {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, 453 | {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, 454 | {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, 455 | {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, 456 | {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, 457 | {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, 458 | {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, 459 | {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, 460 | {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, 461 | {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, 462 | ] 463 | pyyaml-env-tag = [ 464 | {file = "pyyaml_env_tag-0.1-py3-none-any.whl", hash = "sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069"}, 465 | {file = "pyyaml_env_tag-0.1.tar.gz", hash = "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb"}, 466 | ] 467 | six = [ 468 | {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, 469 | {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, 470 | ] 471 | watchdog = [ 472 | {file = "watchdog-2.1.9-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a735a990a1095f75ca4f36ea2ef2752c99e6ee997c46b0de507ba40a09bf7330"}, 473 | {file = "watchdog-2.1.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b17d302850c8d412784d9246cfe8d7e3af6bcd45f958abb2d08a6f8bedf695d"}, 474 | {file = "watchdog-2.1.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ee3e38a6cc050a8830089f79cbec8a3878ec2fe5160cdb2dc8ccb6def8552658"}, 475 | {file = "watchdog-2.1.9-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:64a27aed691408a6abd83394b38503e8176f69031ca25d64131d8d640a307591"}, 476 | {file = "watchdog-2.1.9-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:195fc70c6e41237362ba720e9aaf394f8178bfc7fa68207f112d108edef1af33"}, 477 | {file = "watchdog-2.1.9-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:bfc4d351e6348d6ec51df007432e6fe80adb53fd41183716017026af03427846"}, 478 | {file = "watchdog-2.1.9-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8250546a98388cbc00c3ee3cc5cf96799b5a595270dfcfa855491a64b86ef8c3"}, 479 | {file = "watchdog-2.1.9-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:117ffc6ec261639a0209a3252546b12800670d4bf5f84fbd355957a0595fe654"}, 480 | {file = "watchdog-2.1.9-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:97f9752208f5154e9e7b76acc8c4f5a58801b338de2af14e7e181ee3b28a5d39"}, 481 | {file = "watchdog-2.1.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:247dcf1df956daa24828bfea5a138d0e7a7c98b1a47cf1fa5b0c3c16241fcbb7"}, 482 | {file = "watchdog-2.1.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:226b3c6c468ce72051a4c15a4cc2ef317c32590d82ba0b330403cafd98a62cfd"}, 483 | {file = "watchdog-2.1.9-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d9820fe47c20c13e3c9dd544d3706a2a26c02b2b43c993b62fcd8011bcc0adb3"}, 484 | {file = "watchdog-2.1.9-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:70af927aa1613ded6a68089a9262a009fbdf819f46d09c1a908d4b36e1ba2b2d"}, 485 | {file = "watchdog-2.1.9-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ed80a1628cee19f5cfc6bb74e173f1b4189eb532e705e2a13e3250312a62e0c9"}, 486 | {file = "watchdog-2.1.9-py3-none-manylinux2014_aarch64.whl", hash = "sha256:9f05a5f7c12452f6a27203f76779ae3f46fa30f1dd833037ea8cbc2887c60213"}, 487 | {file = "watchdog-2.1.9-py3-none-manylinux2014_armv7l.whl", hash = "sha256:255bb5758f7e89b1a13c05a5bceccec2219f8995a3a4c4d6968fe1de6a3b2892"}, 488 | {file = "watchdog-2.1.9-py3-none-manylinux2014_i686.whl", hash = "sha256:d3dda00aca282b26194bdd0adec21e4c21e916956d972369359ba63ade616153"}, 489 | {file = "watchdog-2.1.9-py3-none-manylinux2014_ppc64.whl", hash = "sha256:186f6c55abc5e03872ae14c2f294a153ec7292f807af99f57611acc8caa75306"}, 490 | {file = "watchdog-2.1.9-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:083171652584e1b8829581f965b9b7723ca5f9a2cd7e20271edf264cfd7c1412"}, 491 | {file = "watchdog-2.1.9-py3-none-manylinux2014_s390x.whl", hash = "sha256:b530ae007a5f5d50b7fbba96634c7ee21abec70dc3e7f0233339c81943848dc1"}, 492 | {file = "watchdog-2.1.9-py3-none-manylinux2014_x86_64.whl", hash = "sha256:4f4e1c4aa54fb86316a62a87b3378c025e228178d55481d30d857c6c438897d6"}, 493 | {file = "watchdog-2.1.9-py3-none-win32.whl", hash = "sha256:5952135968519e2447a01875a6f5fc8c03190b24d14ee52b0f4b1682259520b1"}, 494 | {file = "watchdog-2.1.9-py3-none-win_amd64.whl", hash = "sha256:7a833211f49143c3d336729b0020ffd1274078e94b0ae42e22f596999f50279c"}, 495 | {file = "watchdog-2.1.9-py3-none-win_ia64.whl", hash = "sha256:ad576a565260d8f99d97f2e64b0f97a48228317095908568a9d5c786c829d428"}, 496 | {file = "watchdog-2.1.9.tar.gz", hash = "sha256:43ce20ebb36a51f21fa376f76d1d4692452b2527ccd601950d69ed36b9e21609"}, 497 | ] 498 | zipp = [] 499 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "python-dev-setup" 3 | version = "0.1.0" 4 | description = "" 5 | authors = ["Jill Villany "] 6 | 7 | [tool.poetry.dependencies] 8 | python = "^3.9" 9 | mkdocs = "^1.3.1" 10 | mkdocs-material = "^8.4.0" 11 | mkdocs-material-extensions = "^1.0.3" 12 | pandas = "^1.4.3" 13 | openpyxl = "^3.0.10" 14 | 15 | [tool.poetry.dev-dependencies] 16 | 17 | [build-system] 18 | requires = ["poetry-core>=1.0.0"] 19 | build-backend = "poetry.core.masonry.api" 20 | -------------------------------------------------------------------------------- /sync_or_create_all_mds.py: -------------------------------------------------------------------------------- 1 | import os 2 | import re 3 | 4 | directory = "docs/" 5 | 6 | """ 7 | Handle Conversion of SH files 8 | """ 9 | file_list = list() 10 | 11 | for root, subdirectories, files in os.walk(directory): 12 | for file in files: 13 | if file.endswith('.sh'): 14 | fp = os.path.join(root, file) 15 | file_list.append(fp) 16 | 17 | i = 1 18 | file_count = len(file_list) 19 | for i,file in enumerate(file_list): 20 | with open(file) as f: 21 | text = f.read() 22 | f.close() 23 | 24 | fname = file.split('/')[-1] 25 | 26 | if file.endswith('.sh'): 27 | md = "```bash\n" + text + "\n```" 28 | md_fn = file.replace(".sh", ".md") 29 | 30 | with open(md_fn, "w") as f: 31 | f.write(md) 32 | f.close() 33 | 34 | print('{} of {} wrote {}'.format(i, file_count,md_fn)) 35 | i+=1 36 | --------------------------------------------------------------------------------