Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
66 commits
Select commit Hold shift + click to select a range
1a3e334
why-is-case_when-using-numpyselect-rather-than-pandascase_when
mborodii-prog Mar 23, 2026
0e96347
added more tests
mborodii-prog Mar 30, 2026
32fe3b5
PR #951 in the wrong location
mborodii-prog Apr 10, 2026
0c01e3e
add_log_indo_when_wrangle_finished
mborodii-prog Apr 1, 2026
38fc717
update tests
mborodii-prog Apr 1, 2026
b0da5fa
include timeranges into log
mborodii-prog Apr 14, 2026
e0bd5ec
Fix tests
mborodii-prog Apr 17, 2026
b82aa6f
Coalesce broken with all floats
mborodii-prog Apr 22, 2026
080c522
bug coalesce with 0 and False values
mborodii-prog Apr 22, 2026
90b2fd6
Merge branch 'main' into add_log_indo_when_wrangle_finished
mborodii-prog May 12, 2026
18523db
Remove wildcard expansion assertion in test
mborodii-prog May 12, 2026
0b22bcc
Merge pull request #954 from wrangleworks/add_log_indo_when_wrangle_f…
mborodii-prog May 12, 2026
d40b8ae
Merge pull request #964 from wrangleworks/963-pr-951-in-the-wrong-loc…
mborodii-prog May 18, 2026
af6f677
Merge branch 'main' into 969-bug-coalesce-broken-with-all-floats
mborodii-prog May 18, 2026
2142fb4
import library
mborodii-prog May 18, 2026
9cf8c91
Merge pull request #970 from wrangleworks/969-bug-coalesce-broken-wit…
mborodii-prog May 19, 2026
bf7bd51
Merge main into PR #945 and resolve conflicts
mborodii-prog May 19, 2026
f1fdc38
Address PR review comments
mborodii-prog May 19, 2026
8b27b8c
Merge pull request #947 from wrangleworks/945-why-is-case_when-using-…
mborodii-prog May 20, 2026
1254400
Extract.ai renaming columns bug fixes (#989)
mborodii-prog May 27, 2026
6987f72
The Akeneo connector should also be able to read. (#979)
mborodii-prog Jun 9, 2026
23710c6
Fix: evaluate if condition before column validatio (#1000)
mborodii-prog Jun 10, 2026
22b0592
Move optional packages to separate requirements file (#939)
mborodii-prog Jun 11, 2026
5406c2a
Accept path objects in read / write / run recipe (#988)
mborodii-prog Jun 17, 2026
72dcbec
Add missing container test dependencies (#1009)
mborodii-prog Jun 24, 2026
9cdfd16
Remove illegal characters when writing to Excel (#1004)
mborodii-prog Jun 24, 2026
e143694
feat: add additional logging information (#965)
mborodii-prog Jun 25, 2026
350d1dd
Add pipeline to create the release candidate package (#999)
lmolotii Jun 25, 2026
00aad94
remove redundant run of the unit tests
lmolotii Jun 25, 2026
966fc6d
Merge pull request #1025 from wrangleworks/release-candidate-workflow
lmolotii Jun 25, 2026
9187972
adjust the configuration of the test-container + migrage from node20 …
lmolotii Jun 25, 2026
6f24733
fix issue with container tests by rewrite of the mock (#1027)
lmolotii Jun 26, 2026
91639f6
Remove macOS testing from everyday main-branch CI (#1017)
mborodii-prog Jun 27, 2026
e61f75c
fix: rename s3.upload_files parameters for clarity (#1003)
mborodii-prog Jun 27, 2026
50feb23
refactored connector concurrency tests (#1029)
ebhills Jun 27, 2026
64534a2
enable package build on main branch
lmolotii Jun 29, 2026
a077594
Merge pull request #1030 from wrangleworks/flow-adjustment
lmolotii Jun 29, 2026
b434280
Add ability to trigger the deploy job directly from the wranglerspy r…
lmolotii Jun 29, 2026
72d0c16
add train.delete to delete a model by model_id
mborodii-prog May 26, 2026
6cbcc51
Add create-and-delete integration tests for all train types
mborodii-prog Jun 30, 2026
f53b300
Fix delete endpoint URL and mock HTTP call in tests
mborodii-prog Jun 30, 2026
393115c
Restore correct delete URL and mock HTTP call in tests
mborodii-prog Jun 30, 2026
74b94c8
825 add connectors for duckdb access (#1024)
mborodii-prog Jun 30, 2026
369dfff
build full version of the package (#1035)
lmolotii Jul 1, 2026
ab58149
Add split.dictionary to_lists mode (#1021)
mborodii-prog Jul 1, 2026
624aa4f
Add n parameter to lookup for multi-match retrieval (#1001)
mborodii-prog Jul 2, 2026
8817e20
Create Column should NOT error if column exists (#957)
mborodii-prog Jul 2, 2026
673b076
Fix where skipping wrangles when all rows are filtered ou (#1007)
mborodii-prog Jul 2, 2026
6196673
Add sort fallback for mixed-type columns (#1066)
mborodii-prog Jul 21, 2026
45fba97
allow rename to skip missing inputs when output exists (#1068)
mborodii-prog Jul 21, 2026
45dcdcf
perf: speed up convert_case function (#949)
mborodii-prog Jul 21, 2026
61457b4
Add ignored output_files directory (#1028)
ebhills Jul 21, 2026
6f1bf4b
Output empty string when extract use labels does not get a match mae …
mborodii-prog Jul 21, 2026
8a28a56
fix failing test (#1078)
mborodii-prog Jul 22, 2026
51e1523
1010 consistent response orientation for extracts (#1032)
mborodii-prog Jul 24, 2026
72e41bd
Remove Python 3.12 from version matrix in publish main workflow
ebhills Jul 25, 2026
fdc5e02
convert.from_json and convert.from_yaml accept default as a list when…
mborodii-prog Jul 26, 2026
e0bf8b2
Update Devcontainer to support Local Windows/WSL Developement (#1091)
ebhills Jul 27, 2026
396b6c4
Add publish dev schema step (#1090)
mborodii-prog Jul 27, 2026
87889c2
update extract.codes recipe schema to match the Wrangles-Extract-Code…
mborodii-prog Jul 27, 2026
41720eb
Fixed the recipe schema so nested `recipe:` wrangles accept `where`
mborodii-prog Jul 27, 2026
e590205
Merge pull request #997 from wrangleworks/991-enhancement-delete_wran…
ebhills Jul 28, 2026
7122db1
Merge pull request #1093 from wrangleworks/fix/recipe-schema-nested-w…
ebhills Jul 28, 2026
cc5cf50
Fix extract.custom outputting a string instead of a list
mborodii-prog Jul 29, 2026
26f007e
Fix extract.custom outputting a string instead of a list
ebhills Jul 31, 2026
7dad7dc
Merge origin/main into dev staging destination
ebhills Aug 2, 2026
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
48 changes: 48 additions & 0 deletions .devcontainer/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
# WranglesPY development container

The shared `devcontainer.json` is intentionally host-neutral. VS Code on Windows
and GitHub Codespaces both use the same Python 3.13 container definition.

## Windows with Docker Desktop

Docker Desktop's Linux engine must be ready before VS Code evaluates the
devcontainer. From the repository root, run:

```powershell
.\.devcontainer\wait-for-docker.ps1
```

The helper starts Docker Desktop when necessary and waits until the selected
Docker context can reach a Linux server. When it reports that Docker is ready,
open the repository in VS Code and run:

```text
Dev Containers: Reopen in Container
```

Use `Dev Containers: Rebuild Container` after changing `devcontainer.json` or
the dependency files.

`Dev Containers: Attach to Running Container...` remains useful as a recovery
option when this repository's container is already running. It is not the
normal workflow because attaching does not necessarily apply this repository's
creation commands and VS Code customizations.

## GitHub Codespaces

Create or reopen the Codespace normally. Codespaces reads
`.devcontainer/devcontainer.json` directly. The Windows readiness helper is not
referenced by the configuration and does not run in Codespaces.

## Quick diagnosis

Before reopening locally, both commands should succeed:

```powershell
docker context show
docker version
```

`docker version` must show a Linux server section. A missing
`dockerDesktopLinuxEngine` named pipe means Docker Desktop is still starting,
not that `devcontainer.json` selected the wrong engine.
28 changes: 19 additions & 9 deletions .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
@@ -1,38 +1,48 @@
// For format details, see https://aka.ms/devcontainer.json. For config options, see the
// README at: https://github.com/devcontainers/templates/tree/main/src/python
{
"name": "Python 3",
"name": "WranglesPY (Python 3.13)",

// Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile
"image": "mcr.microsoft.com/devcontainers/python:1-3.12-bookworm",
"image": "mcr.microsoft.com/devcontainers/python:1-3.13-bookworm",

// Features to add to the dev container. More info: https://containers.dev/features.
// "features": {},

// Use 'forwardPorts' to make a list of ports inside the container available locally.
// "forwardPorts": [],

"onCreateCommand": "pip install pytest==9.0.2 lorem pytest-mock",
"postCreateCommand": "pip3 install --user -r requirements.txt",
"remoteUser": "vscode",
"remoteEnv": {
"PATH": "${containerEnv:PATH}:/home/vscode/.local/bin"
},

// Mirror the full CI test environment and install this checkout in editable mode.
"postCreateCommand": "python -m pip install --user --upgrade pip && python -m pip install --user -r requirements-full.txt pytest==9.0.2 pytest-mock -e .",

// Configure tool-specific properties.
"customizations": {
"vscode": {
"extensions": [
"redhat.vscode-yaml",
"GitHub.copilot"
"GitHub.copilot",
"editorconfig.editorconfig",
"ms-python.python",
"ms-python.vscode-pylance"
],
"settings": {
"files.eol": "\n",
"files.associations": {
"*.recipe": "yaml"
},
"yaml.schemas": {
"https://public.wrangle.works/schema/recipes/schema.json": ["*.wrgl.yml", "*.wrgl.yaml", "*.recipe"]
},
"python.defaultInterpreterPath": "/usr/local/bin/python",
"python.testing.pytestArgs": ["tests"],
"python.testing.unittestEnabled": false,
"python.testing.pytestEnabled": true
"python.testing.pytestEnabled": true
}
}
}

// Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root.
// "remoteUser": "root"
}
52 changes: 52 additions & 0 deletions .devcontainer/wait-for-docker.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
[CmdletBinding()]
param(
[ValidateRange(10, 600)]
[int]$TimeoutSeconds = 180
)

$ErrorActionPreference = 'Stop'

if (-not (Get-Command docker -ErrorAction SilentlyContinue)) {
throw 'Docker CLI was not found. Install or repair Docker Desktop before opening the dev container.'
}

function Get-DockerServerOs {
$serverOs = docker version --format '{{.Server.Os}}' 2>$null
if ($LASTEXITCODE -eq 0) {
return $serverOs.Trim()
}

return $null
}

$serverOs = Get-DockerServerOs
if (-not $serverOs) {
$dockerDesktopPath = Join-Path $env:ProgramFiles 'Docker\Docker\Docker Desktop.exe'
if (-not (Test-Path -LiteralPath $dockerDesktopPath)) {
throw "Docker Desktop is not responding and was not found at '$dockerDesktopPath'."
}

Write-Host 'Starting Docker Desktop...'
Start-Process -FilePath $dockerDesktopPath
}

$deadline = (Get-Date).AddSeconds($TimeoutSeconds)
Write-Host "Waiting up to $TimeoutSeconds seconds for the Docker Linux engine..."

do {
$serverOs = Get-DockerServerOs
if ($serverOs -eq 'linux') {
$context = docker context show
Write-Host "Docker is ready (context: $context, server: linux)."
Write-Host "In VS Code, run 'Dev Containers: Reopen in Container'."
exit 0
}

if ($serverOs) {
throw "Docker is running a '$serverOs' engine. Switch Docker Desktop to Linux containers and try again."
}

Start-Sleep -Seconds 2
} while ((Get-Date) -lt $deadline)

throw "Docker Desktop did not expose its Linux engine within $TimeoutSeconds seconds. Check Docker Desktop before retrying."
13 changes: 13 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
root = true

[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true

[*.{bat,cmd}]
end_of_line = crlf

[*.md]
trim_trailing_whitespace = false
19 changes: 19 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Keep all text files LF in both Git and the working tree
* text=auto eol=lf

# Windows command scripts genuinely require/prefer CRLF
*.bat text eol=crlf
*.cmd text eol=crlf

# Explicit binary exclusions
*.png -text
*.jpg -text
*.jpeg -text
*.gif -text
*.ico -text
*.pdf -text
*.zip -text
*.tar -text
*.gz -text
*.bz2 -text
*.7z -text
2 changes: 1 addition & 1 deletion .github/agents/test.agent.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ You are a **Software Development Engineer in Test (SDET)** for a Python data wra
## 📚 Project Knowledge

### Tech Stack
- **Core:** Python 3.10–3.13, pytest, pandas, numpy, polars
- **Core:** Python 3.11–3.13, pytest, pandas, numpy, polars
- **Data:** SQLAlchemy, boto3, pymongo, Pydantic
- **Templates:** Jinja2

Expand Down
29 changes: 15 additions & 14 deletions .github/copilot-instructions.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,14 @@

## Tech Stack

- **Python:** 3.10, 3.11, 3.12, 3.13 (multi-version support)
- **Python:** 3.11, 3.12, 3.13 (multi-version support)
- **Core Dependencies:** pandas (>=2.0), numpy, polars (1.33.0), pyyaml
- **Database Connectors:** sqlalchemy, pymssql, psycopg2-binary, pymysql, pymongo
- **Cloud/External:** boto3 (AWS S3), simple-salesforce, fabric (SFTP)
- **Data Formats:** openpyxl (Excel), xlsxwriter
- **AI/ML:** OpenAI integration, Hugging Face models
- **Testing:** pytest (7.4.4), pytest-mock, lorem (test data generation)
- **Containerization:** Docker (Python 3.10.16-slim-bookworm base)
- **Testing:** pytest (9.0.2), pytest-mock, lorem (test data generation)
- **Containerization:** Production Docker image uses Python 3.11-slim-bookworm; development container uses Python 3.13-bookworm

## Project Structure

Expand Down Expand Up @@ -57,11 +57,12 @@ WranglesPY/

## Installation & Setup

### Standard Installation
### Development Installation
```bash
pip install --upgrade pip
pip install pytest==7.4.4 lorem pytest-mock
pip install -r requirements.txt
pip install pytest==9.0.2 pytest-mock
pip install -r requirements-full.txt
pip install -e .
```

### macOS-specific Requirements
Expand All @@ -74,9 +75,9 @@ pip install -r requirements.txt

### Development Container
The project includes a `.devcontainer/devcontainer.json` for VS Code:
- Base image: `mcr.microsoft.com/devcontainers/python:1-3.12-bullseye`
- Auto-installs pytest, lorem, pytest-mock on creation
- Includes YAML schema validation for `.wrgl.yml` files
- Base image: `mcr.microsoft.com/devcontainers/python:1-3.13-bookworm`
- Auto-installs the full test dependencies and the package in editable mode
- Includes YAML schema validation for `.wrgl.yml` and `.recipe` files
- Configured for pytest test discovery

## Testing
Expand Down Expand Up @@ -173,7 +174,7 @@ def test_function_error():
## Recipe System

### Recipe File Format
Recipes use YAML with `.wrgl.yml` or `.wrgl.yaml` extensions:
Recipes use YAML with `.wrgl.yml`, `.wrgl.yaml` or `.recipe` extensions:

```yaml
read:
Expand All @@ -197,10 +198,10 @@ wrangles.recipe recipe.wrgl.yml

# From Python
import wrangles
wrangles.recipe.run('recipe.wrgl.yml')
wrangles.recipe.run('my_recipe.wrgl.yml')

# With custom functions
wrangles.recipe recipe.wrgl.yml -f custom_functions.py
wrangles.recipe my_other_recipe.recipe -f custom_functions.py
```

### Custom Functions
Expand All @@ -213,8 +214,8 @@ Custom functions can be added to recipes:

### GitHub Actions Workflows
- **publish-main.yml:** Main CI pipeline
- Pytest on multiple OS (Ubuntu, Windows, macOS-14, macOS-latest)
- Tests Python 3.10, 3.11, 3.12, 3.13
- Pytest on multiple OS (Ubuntu, Windows)
- Tests Python 3.11, 3.13
- Test pip installation
- Generate and test JSON schema
- Build and push Docker image
Expand Down
Loading