From a93e2fff3c993d0097a0d9b000b900e74fbc5ad9 Mon Sep 17 00:00:00 2001 From: Saurabh Singh Date: Sat, 19 Jul 2025 06:00:15 +0000 Subject: [PATCH 01/10] Dev Container setup --- .devcontainer/Dockerfile | 69 ++++++++++++++++++ .devcontainer/devcontainer.json | 76 ++++++++++++++++++++ .devcontainer/post-create.sh | 89 +++++++++++++++++++++++ .dockerignore | 120 ++++++++++++++++++++++++++++++++ 4 files changed, 354 insertions(+) create mode 100644 .devcontainer/Dockerfile create mode 100644 .devcontainer/devcontainer.json create mode 100755 .devcontainer/post-create.sh create mode 100644 .dockerignore diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile new file mode 100644 index 00000000..9e818535 --- /dev/null +++ b/.devcontainer/Dockerfile @@ -0,0 +1,69 @@ +# Use Python 3.11 with Debian Bullseye as the base image +FROM mcr.microsoft.com/devcontainers/python:3.10-bullseye + +# Set environment variables +ENV DEBIAN_FRONTEND=noninteractive +ENV PYTHONPATH=/workspaces/mssql-python +ENV CMAKE_BUILD_TYPE=Debug + +# Install system dependencies +RUN apt-get update && apt-get install -y \ + # Build tools + build-essential \ + cmake \ + pkg-config \ + ninja-build \ + # Additional tools + curl \ + wget \ + git \ + vim \ + nano \ + htop \ + tree \ + jq \ + # Clean up + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +# Install Microsoft ODBC Driver for SQL Server +RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - \ + && curl https://packages.microsoft.com/config/debian/11/prod.list > /etc/apt/sources.list.d/mssql-release.list \ + && apt-get update \ + && ACCEPT_EULA=Y apt-get install -y msodbcsql18 \ + && ACCEPT_EULA=Y apt-get install -y mssql-tools18 \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +# Add mssql-tools to PATH +ENV PATH="$PATH:/opt/mssql-tools18/bin" + +# Upgrade pip and install common Python development tools +RUN python -m pip install --upgrade pip setuptools wheel \ + && pip install \ + black \ + flake8 \ + mypy \ + isort \ + pre-commit \ + twine \ + build \ + wheel \ + "pybind11[global]" \ + pytest-xdist \ + pytest-mock \ + "coverage[toml]" + +# Set the default user to vscode (created by the base image) +USER vscode + +# Set the working directory +WORKDIR /workspaces/mssql-python + +# Add helpful aliases to .bashrc +RUN echo 'alias ll="ls -alF"' >> ~/.bashrc \ + && echo 'alias la="ls -A"' >> ~/.bashrc \ + && echo 'alias l="ls -CF"' >> ~/.bashrc + +# Default command +CMD ["/bin/bash"] diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 00000000..a285a443 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,76 @@ +{ + "name": "MSSQL Python Driver", + "build": { + "dockerfile": "Dockerfile", + "context": "." + }, + // Configure tool-specific properties. + "customizations": { + // Configure properties specific to VS Code. + "vscode": { + // Set *default* container specific settings.json values on container create. + "settings": { + "python.defaultInterpreterPath": "/usr/local/bin/python", + "python.linting.enabled": true, + "python.linting.pylintEnabled": true, + "python.formatting.autopep8Path": "/usr/local/py-utils/bin/autopep8", + "python.formatting.blackPath": "/usr/local/py-utils/bin/black", + "python.formatting.yapfPath": "/usr/local/py-utils/bin/yapf", + "python.linting.banditPath": "/usr/local/py-utils/bin/bandit", + "python.linting.flake8Path": "/usr/local/py-utils/bin/flake8", + "python.linting.mypyPath": "/usr/local/py-utils/bin/mypy", + "python.linting.pycodestylePath": "/usr/local/py-utils/bin/pycodestyle", + "python.linting.pydocstylePath": "/usr/local/py-utils/bin/pydocstyle", + "python.linting.pylintPath": "/usr/local/py-utils/bin/pylint", + "cmake.configureOnOpen": false + }, + // Add the IDs of extensions you want installed when the container is created. + "extensions": [ + "ms-python.python", + "ms-python.vscode-pylance", + "ms-python.pylint", + "ms-toolsai.jupyter", + "ms-vscode.cmake-tools", + "ms-vscode.cpptools", + "ms-vscode.cpptools-extension-pack", + "github.copilot", + "github.copilot-chat", + "ms-vscode.test-adapter-converter", + "littlefoxteam.vscode-python-test-adapter", + "ms-azuretools.vscode-docker", + "ms-mssql.mssql", + ] + } + }, + // Features to add to the dev container. More info: https://containers.dev/features. + "features": { + "ghcr.io/devcontainers/features/git:1": {}, + "ghcr.io/devcontainers/features/github-cli:1": {}, + "ghcr.io/devcontainers/features/docker-in-docker:2": {}, + "ghcr.io/devcontainers/features/common-utils:2": { + "installZsh": true, + "configureZshAsDefaultShell": true, + "installOhMyZsh": true, + "upgradePackages": true, + "username": "vscode", + "userUid": "automatic", + "userGid": "automatic" + } + }, + // Use 'forwardPorts' to make a list of ports inside the container available locally. + "forwardPorts": [], + // Use 'postCreateCommand' to run commands after the container is created. + "postCreateCommand": "bash .devcontainer/post-create.sh", + // Use 'postStartCommand' to run commands after the container starts. + "postStartCommand": "", + // Configure tool-specific properties. + "remoteUser": "vscode", + // Set container environment variables + "containerEnv": { + "PYTHONPATH": "/workspaces/mssql-python", + "CMAKE_BUILD_TYPE": "Debug" + }, + // Mount the project directory + "workspaceMount": "source=${localWorkspaceFolder},target=/workspaces/mssql-python,type=bind,consistency=cached", + "workspaceFolder": "/workspaces/mssql-python", +} \ No newline at end of file diff --git a/.devcontainer/post-create.sh b/.devcontainer/post-create.sh new file mode 100755 index 00000000..c95080b0 --- /dev/null +++ b/.devcontainer/post-create.sh @@ -0,0 +1,89 @@ +#!/bin/bash + +# Post-create script for MSSQL Python Driver devcontainer +set -e + +echo "🚀 Setting up MSSQL Python Driver development environment..." + +# Update package lists +echo "📦 Updating package lists..." +sudo apt-get update + +# Install system dependencies required for the project +echo "🔧 Installing system dependencies..." +sudo apt-get install -y \ + python3 \ + python3-pip \ + python3-venv \ + python3-full \ + cmake \ + curl \ + wget \ + gnupg \ + software-properties-common \ + build-essential \ + python3-dev \ + pybind11-dev + +export TZ=UTC +ln -snf /usr/share/zoneinfo/\$TZ /etc/localtime && echo \$TZ > /etc/timezone + +# Install Microsoft ODBC Driver for SQL Server (required for mssql connectivity) +echo "🗄️ Installing Microsoft ODBC Driver for SQL Server..." +curl -sSL -O https://packages.microsoft.com/config/ubuntu/22.04/packages-microsoft-prod.deb +sudo dpkg -i packages-microsoft-prod.deb || true +rm packages-microsoft-prod.deb + +sudo apt-get update +# Install the driver +ACCEPT_EULA=Y sudo apt-get install -y msodbcsql18 +# optional: for bcp and sqlcmd +ACCEPT_EULA=Y sudo apt-get install -y mssql-tools18 +# optional: for unixODBC development headers +sudo apt-get install -y unixodbc-dev + +# Create a Python virtual environment +echo "🐍 Creating Python virtual environment..." +python3 -m venv /workspaces/mssql-python/opt/venv +source /workspaces/mssql-python/opt/venv/bin/activate + +# Install dependencies in the virtual environment +python -m pip install --upgrade pip +python -m pip install -r requirements.txt + +# Make the virtual environment globally available +echo 'source /workspaces/mssql-python/opt/venv/bin/activate' >> ~/.bashrc + +source /workspaces/mssql-python/opt/venv/bin/activate + +# Install project dependencies +echo "📚 Installing project dependencies..." +pip install -r requirements.txt + +# Create useful aliases +echo "⚡ Setting up aliases..." +cat >> ~/.bashrc << 'EOF' + +# MSSQL Python Driver aliases +alias ll='ls -alF' +alias la='ls -A' +alias l='ls -CF' +alias clean='find . -type f -name "*.pyc" -delete && find . -type d -name "__pycache__" -delete' + +EOF + +# Set up git configuration (if not already configured) +echo "🔧 Configuring git..." +if [ -z "$(git config --global user.name)" ]; then + echo "Git user name not set. You may want to configure it with:" + echo " git config --global user.name 'Your Name'" +fi +if [ -z "$(git config --global user.email)" ]; then + echo "Git user email not set. You may want to configure it with:" + echo " git config --global user.email 'your.email@example.com'" +fi + +# Display information about the environment +echo "" +echo "✅ Development environment setup complete!" + diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..06ca55f4 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,120 @@ +# Git +.git +.gitignore +.gitattributes + +# Python +__pycache__ +*.pyc +*.pyo +*.pyd +.Python +env +pip-log.txt +pip-delete-this-directory.txt +.tox +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.log +.git +.mypy_cache +.pytest_cache +.hypothesis + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg + +# PyInstaller +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ + +# Translations +*.mo +*.pot + +# Documentation +docs/_build/ + +# PyBuilder +target/ + +# IDEs +.vscode/ +.idea/ +*.swp +*.swo +*~ + +# OS +.DS_Store +.DS_Store? +._* +.Spotlight-V100 +.Trashes +ehthumbs.db +Thumbs.db + +# Temporary files +*.tmp +*.temp +*.log + +# Node.js (if any) +node_modules/ +npm-debug.log* + +# CMake +CMakeCache.txt +CMakeFiles/ +cmake_install.cmake +Makefile +*.cmake + +# Build artifacts +*.so +*.dll +*.dylib +*.pdb +*.obj +*.exe + +# Test results +test-results/ +.pytest_cache/ + +# Azure DevOps +.azure/ From 2383b7bc7a11140fe5acd80efa2c60120d8f5845 Mon Sep 17 00:00:00 2001 From: Saurabh Singh Date: Sat, 19 Jul 2025 06:36:59 +0000 Subject: [PATCH 02/10] REFACTOR: Simplify post-create script by removing redundant activation of virtual environment --- .devcontainer/post-create.sh | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/.devcontainer/post-create.sh b/.devcontainer/post-create.sh index c95080b0..58fd4643 100755 --- a/.devcontainer/post-create.sh +++ b/.devcontainer/post-create.sh @@ -26,7 +26,7 @@ sudo apt-get install -y \ pybind11-dev export TZ=UTC -ln -snf /usr/share/zoneinfo/\$TZ /etc/localtime && echo \$TZ > /etc/timezone +ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone # Install Microsoft ODBC Driver for SQL Server (required for mssql connectivity) echo "🗄️ Installing Microsoft ODBC Driver for SQL Server..." @@ -47,15 +47,11 @@ echo "🐍 Creating Python virtual environment..." python3 -m venv /workspaces/mssql-python/opt/venv source /workspaces/mssql-python/opt/venv/bin/activate -# Install dependencies in the virtual environment python -m pip install --upgrade pip -python -m pip install -r requirements.txt # Make the virtual environment globally available echo 'source /workspaces/mssql-python/opt/venv/bin/activate' >> ~/.bashrc -source /workspaces/mssql-python/opt/venv/bin/activate - # Install project dependencies echo "📚 Installing project dependencies..." pip install -r requirements.txt From 1f505849856ac1b21ef844a7107c1cf38f5a6ac2 Mon Sep 17 00:00:00 2001 From: Saurabh Singh <1623701+saurabh500@users.noreply.github.com> Date: Fri, 18 Jul 2025 23:44:00 -0700 Subject: [PATCH 03/10] Update .dockerignore Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .dockerignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.dockerignore b/.dockerignore index 06ca55f4..66939767 100644 --- a/.dockerignore +++ b/.dockerignore @@ -26,7 +26,6 @@ coverage.xml .hypothesis # Distribution / packaging -.Python build/ develop-eggs/ dist/ From 6f79cd296a55884193015ca5c329aa8627749bda Mon Sep 17 00:00:00 2001 From: Saurabh Singh <1623701+saurabh500@users.noreply.github.com> Date: Fri, 18 Jul 2025 23:44:07 -0700 Subject: [PATCH 04/10] Update .devcontainer/Dockerfile Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .devcontainer/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 9e818535..555d94fc 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -1,4 +1,4 @@ -# Use Python 3.11 with Debian Bullseye as the base image +# Use Python 3.10 with Debian Bullseye as the base image FROM mcr.microsoft.com/devcontainers/python:3.10-bullseye # Set environment variables From 1e4c8cc32984d9fc1ddcb9fdf074b955e983fcd0 Mon Sep 17 00:00:00 2001 From: Saurabh Singh <1623701+saurabh500@users.noreply.github.com> Date: Fri, 18 Jul 2025 23:44:22 -0700 Subject: [PATCH 05/10] Update .dockerignore Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .dockerignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.dockerignore b/.dockerignore index 66939767..18f680c6 100644 --- a/.dockerignore +++ b/.dockerignore @@ -52,9 +52,9 @@ pip-delete-this-directory.txt # Unit test / coverage reports htmlcov/ -.tox/ .coverage .coverage.* +.coverage.* .cache nosetests.xml coverage.xml From 92b1c1f722cf847b8887e67dcedeaab846f33691 Mon Sep 17 00:00:00 2001 From: Saurabh Singh <1623701+saurabh500@users.noreply.github.com> Date: Fri, 18 Jul 2025 23:44:34 -0700 Subject: [PATCH 06/10] Update .dockerignore Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .dockerignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.dockerignore b/.dockerignore index 18f680c6..75431372 100644 --- a/.dockerignore +++ b/.dockerignore @@ -20,7 +20,6 @@ nosetests.xml coverage.xml *.cover *.log -.git .mypy_cache .pytest_cache .hypothesis From 78d129f7fa0279a2a85fae9d46b8058533f8d86d Mon Sep 17 00:00:00 2001 From: Saurabh Singh <1623701+saurabh500@users.noreply.github.com> Date: Fri, 18 Jul 2025 23:44:43 -0700 Subject: [PATCH 07/10] Update .dockerignore Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .dockerignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.dockerignore b/.dockerignore index 75431372..20c2251a 100644 --- a/.dockerignore +++ b/.dockerignore @@ -47,7 +47,6 @@ wheels/ # Installer logs pip-log.txt -pip-delete-this-directory.txt # Unit test / coverage reports htmlcov/ From b5e940a513f9916f86494cdbf122286e1e5252a1 Mon Sep 17 00:00:00 2001 From: Saurabh Singh <1623701+saurabh500@users.noreply.github.com> Date: Fri, 18 Jul 2025 23:45:05 -0700 Subject: [PATCH 08/10] Update .devcontainer/devcontainer.json Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .devcontainer/devcontainer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index a285a443..4993120b 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -38,7 +38,7 @@ "ms-vscode.test-adapter-converter", "littlefoxteam.vscode-python-test-adapter", "ms-azuretools.vscode-docker", - "ms-mssql.mssql", + "ms-mssql.mssql" ] } }, From 306ae47c1f10f4591befe1f4404b7cddb0012a7c Mon Sep 17 00:00:00 2001 From: Saurabh Singh <1623701+saurabh500@users.noreply.github.com> Date: Fri, 18 Jul 2025 23:45:21 -0700 Subject: [PATCH 09/10] Update .devcontainer/devcontainer.json Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .devcontainer/devcontainer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 4993120b..8be46461 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -72,5 +72,5 @@ }, // Mount the project directory "workspaceMount": "source=${localWorkspaceFolder},target=/workspaces/mssql-python,type=bind,consistency=cached", - "workspaceFolder": "/workspaces/mssql-python", + "workspaceFolder": "/workspaces/mssql-python" } \ No newline at end of file From 386b81be3002486e52a878de11e9df145e1d629d Mon Sep 17 00:00:00 2001 From: Saurabh Singh <1623701+saurabh500@users.noreply.github.com> Date: Sat, 19 Jul 2025 11:41:47 -0700 Subject: [PATCH 10/10] Apply suggestions from code review Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .dockerignore | 2 -- 1 file changed, 2 deletions(-) diff --git a/.dockerignore b/.dockerignore index 20c2251a..8c2fe614 100644 --- a/.dockerignore +++ b/.dockerignore @@ -52,8 +52,6 @@ pip-log.txt htmlcov/ .coverage .coverage.* -.coverage.* -.cache nosetests.xml coverage.xml *.cover