Skip to content
Merged
Show file tree
Hide file tree
Changes from 15 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 70 additions & 0 deletions .devcontainer/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
# Use Python 3.14 with Debian Bookworm as the base image
FROM mcr.microsoft.com/devcontainers/python:3.14-bookworm

# 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 | gpg --dearmor -o /usr/share/keyrings/microsoft-prod.gpg \
&& curl https://packages.microsoft.com/config/debian/12/prod.list > /etc/apt/sources.list.d/mssql-release.list \
&& sed -i 's/^deb /deb [signed-by=\/usr\/share\/keyrings\/microsoft-prod.gpg] /' /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"]
70 changes: 70 additions & 0 deletions .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
{
"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": "/workspaces/mssql-python/.venv/bin/python",
"python.terminal.activateEnvironment": true,
"editor.formatOnSave": true,
"[python]": {
"editor.defaultFormatter": "ms-python.black-formatter"
},
"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"
}
79 changes: 79 additions & 0 deletions .devcontainer/post-create.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
#!/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

# Note: ODBC Driver is already installed in the Dockerfile

# Create a Python virtual environment
echo "🐍 Creating Python virtual environment..."
python3 -m venv /workspaces/mssql-python/.venv
source /workspaces/mssql-python/.venv/bin/activate

python -m pip install --upgrade pip

# Make the virtual environment globally available
echo 'source /workspaces/mssql-python/.venv/bin/activate' >> ~/.bashrc

# Install project dependencies
echo "📚 Installing project dependencies..."
pip install -r requirements.txt

# Build the native extension
echo "🔨 Building native extension..."
cd /workspaces/mssql-python/mssql_python/pybind
./build.sh
cd /workspaces/mssql-python

# 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 '[email protected]'"
fi

# Display information about the environment
echo ""
echo "✅ Development environment setup complete!"

115 changes: 115 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -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/
Loading