diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile new file mode 100644 index 00000000..555d94fc --- /dev/null +++ b/.devcontainer/Dockerfile @@ -0,0 +1,69 @@ +# Use Python 3.10 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..8be46461 --- /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..58fd4643 --- /dev/null +++ b/.devcontainer/post-create.sh @@ -0,0 +1,85 @@ +#!/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 + +python -m pip install --upgrade pip + +# Make the virtual environment globally available +echo 'source /workspaces/mssql-python/opt/venv/bin/activate' >> ~/.bashrc + +# 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..8c2fe614 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,115 @@ +# 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 +.mypy_cache +.pytest_cache +.hypothesis + +# Distribution / packaging +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 + +# Unit test / coverage reports +htmlcov/ +.coverage +.coverage.* +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/