Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
57 commits
Select commit Hold shift + click to select a range
a15ccfc
Merge branch 'main' into develop
discreteds Apr 30, 2025
0fcd288
release/25.5.0
discreteds May 1, 2025
14a7729
merge feature into develop (#37)
discreteds Oct 28, 2025
b2e66e7
Add design spec for expression-based rules engine rearchitecture
discreteds Apr 3, 2026
5ae9afb
docs: add implementation plan for expression-based rules engine
discreteds Apr 3, 2026
17fa599
Task 1: clean slate — remove old engine code and update dependencies
discreteds Apr 3, 2026
9e4a970
feat: replace constants and dimension models with ibis-free implement…
discreteds Apr 3, 2026
00752e7
feat(context): replace ContextHelper class with extract_context_value…
discreteds Apr 6, 2026
c2eac0a
feat(compiler): add DimensionCompiler with EXACT strategy
discreteds Apr 6, 2026
95a1d5d
feat(compiler): implement RANGE and REGEX dimension strategies
discreteds Apr 6, 2026
9ea6773
feat(result): add RuleResult wrapper with convenience accessors for e…
discreteds Apr 6, 2026
61a96dd
feat(engine): replace RulesEngine with ExpressionRulesEngine for sing…
discreteds Apr 6, 2026
9433f8a
test(engine): add Tasks 9 and 10 — advanced features and custom expre…
discreteds Apr 6, 2026
609f46d
test(integration): add end-to-end hierarchical rules scenarios
discreteds Apr 6, 2026
36f2a40
feat: update public API, fixtures, and remove leftover old test files
discreteds Apr 6, 2026
8990411
style: fix unused imports in compiler.py and context.py
discreteds Apr 6, 2026
82f8906
docs: add design spec for extended match strategies
discreteds Apr 7, 2026
d3e1d9a
docs: add implementation plan for extended match strategies
discreteds Apr 7, 2026
48ff4d6
feat(constants): add 8 new MatchStrategy enum values
discreteds Apr 7, 2026
475f8ba
feat(dimension): add validation for new match strategies (Task 2)
discreteds Apr 7, 2026
1e5ebc7
feat(compiler): add NOT_EQUAL, GREATER_THAN, LESS_THAN match strategi…
discreteds Apr 7, 2026
9816f80
feat: add PREFIX strategy with shared _compile_string_match helper
discreteds Apr 7, 2026
03875a4
feat: add SUFFIX and CONTAINS match strategies
discreteds Apr 7, 2026
848cdd3
docs: add accumulator engine architecture analysis
discreteds Apr 7, 2026
625d801
test: add per-row regex test to TestRegexCompilation
discreteds Apr 7, 2026
10505a1
docs: add rules engine landscape & roadmap analysis
discreteds Apr 7, 2026
e24c69b
refactor(compiler): use clean string-match helper for CONTAINS and REGEX
discreteds Apr 7, 2026
e621b09
docs: correct additive rules engine analysis after PMX_DB review
discreteds Apr 7, 2026
e3dba06
docs: add Big 4 mortgage pricing engine case study
discreteds Apr 7, 2026
f01d644
Task 8: Add SET_MEMBERSHIP and SET_EXCLUSION match strategies
discreteds Apr 7, 2026
0e381b7
Task 9: Add fraud detection integration test for mixed strategies
discreteds Apr 7, 2026
6309620
Add backend agnosticism smoke tests for compiler strategies
discreteds Apr 7, 2026
7e65ced
docs: add match strategies catalog to CLAUDE.md
discreteds Apr 7, 2026
d300d56
docs: add design spec for backend-agnostic engine and result
discreteds Apr 8, 2026
748f5a7
docs: add implementation plan for backend-agnostic engine and result
discreteds Apr 8, 2026
915abe4
test(backend-purity): add import-check test + tag SET_MEMBERSHIP exce…
discreteds Apr 8, 2026
d45e242
refactor(engine): rewrite engine.py to be backend-agnostic via mounta…
discreteds Apr 8, 2026
e33e202
refactor(result): use mountainash.relations for all RuleResult accessors
discreteds Apr 8, 2026
296d0ac
docs: spec for cross-backend test parameterisation
discreteds Apr 8, 2026
d83fc74
docs: implementation plan for cross-backend test parameterisation
discreteds Apr 8, 2026
5845023
test: rewrite conftest for cross-backend parameterisation
discreteds Apr 8, 2026
a5348fd
fix: REGEX as one-hot; cast specificity; drop double collect
discreteds Apr 8, 2026
9c8683a
test(result): parametrize across all 7 backends
discreteds Apr 8, 2026
21d2af2
test(integration): parametrize all classes across backends
discreteds Apr 8, 2026
8ccf0d6
test(compiler): extend backend agnosticism smoke tests to 7 backends
discreteds Apr 8, 2026
45a83b7
test: link upstream-broken backend xfails to issues
discreteds Apr 8, 2026
10dc7c8
refactor: remove SET_MEMBERSHIP Polars workaround
discreteds Apr 8, 2026
7a0f32c
test: add #77 regression test, restore pandas/narwhals-pandas xfails
discreteds Apr 11, 2026
400915a
refactor: replace blanket backend xfails with surgical per-test markers
discreteds Apr 11, 2026
33ad540
fix: remove #77 xfails after upstream fix, restore #78 ibis-polars xf…
discreteds Apr 11, 2026
b839c7b
Merge pull request #38 from mountainash-io/feature/expression-based-e…
discreteds Apr 11, 2026
02f1ec8
release/26.4.0
discreteds Apr 11, 2026
a76b72e
Merge branch 'main' into release/26.4.0
discreteds Apr 11, 2026
1d138b8
ci: bump hatch 1.14.2→1.16.5, hatchling 1.25.0→1.29.0
discreteds Apr 11, 2026
96bda3b
chore: rename mountainash-expressions to mountainash in references
discreteds Apr 12, 2026
d902190
chore: clean up dependency config after mountainash rename
discreteds Apr 14, 2026
d0e9736
ci: add debug output to diagnose missing-dataframes error
discreteds Apr 14, 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
50 changes: 26 additions & 24 deletions .github/config/mountainash_dependencies.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,27 +2,29 @@

# Private Package Dependencies
dependencies:
# - name: mountainash-auth-settings
# org-name: mountainash-io
- name: mountainash-constants
org-name: mountainash-io
- name: mountainash-data
org-name: mountainash-io
- name: mountainash-settings
org-name: mountainash-io
- name: mountainash-utils-dataclasses
org-name: mountainash-io
# - name: mountainash-utils-factoryclasses
# org-name: mountainash-io
# - name: mountainash-utils-files
# org-name: mountainash-io
# - name: mountainash-utils-gpg
# org-name: mountainash-io
# - name: mountainash-utils-hamilton
# org-name: mountainash-io
- name: mountainash-utils-os
org-name: mountainash-io
# - name: mountainash-utils-rules
# org-name: mountainash-io
- name: mountainash-utils-ssh
org-name: mountainash-io
# - name: mountainash-auth-settings
# org-name: mountainash-io
# - name: mountainash-constants
# org-name: mountainash-io
- name: mountainash-data
org-name: mountainash-io
- name: mountainash
org-name: mountainash-io
- name: mountainash-settings
org-name: mountainash-io
# - name: mountainash-utils-dataclasses
# org-name: mountainash-io
# - name: mountainash-utils-factoryclasses
# org-name: mountainash-io
# - name: mountainash-utils-files
# org-name: mountainash-io
# - name: mountainash-utils-gpg
# org-name: mountainash-io
# - name: mountainash-utils-hamilton
# org-name: mountainash-io
# - name: mountainash-utils-os
# org-name: mountainash-io
# - name: mountainash-utils-rules
# org-name: mountainash-io
# - name: mountainash-utils-ssh
# org-name: mountainash-io
82 changes: 35 additions & 47 deletions .github/workflows/build-and-release-package.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,42 +4,40 @@ on:
pull_request:
types: [closed]
branches:
- 'main'
- 'develop'
- 'release*'
- 'feature*'
- 'bugfix*'
- 'hotfix*'
- "main"
- "develop"
- "release*"
- "feature*"
- "bugfix*"
- "hotfix*"

# Add manual workflow dispatch with fallback branch selection
workflow_dispatch:
inputs:

release_type:
description: 'Type of release to create'
description: "Type of release to create"
required: true
default: 'production'
type: 'choice'
default: "production"
type: "choice"
options:
- production
- rc
- beta
- beta

source_branch:
description: 'Branch containing code to release'
description: "Branch containing code to release"
required: true
default: 'main'
type: 'string'
default: "main"
type: "string"

fallback_branch:
description: 'Fallback branch to use for dependencies'
description: "Fallback branch to use for dependencies"
required: true
default: 'main'
default: "main"
type: choice
options:
- develop
- main

- develop
- main

jobs:
build-and-release:
Expand All @@ -50,12 +48,11 @@ jobs:
matrix:
os: [ubuntu-24.04]
python-version: ["3.12"]

env:
BUILD_ENV: 'build_github'
BUILD_ENV: "build_github"

steps:

# ======================================================
# INITIALIZE

Expand All @@ -70,22 +67,20 @@ jobs:
with:
python-version: ${{ matrix.python-version }}


- name: Checkout Repository (PR)
if: github.event_name == 'pull_request'
uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.merge_commit_sha }}
fetch-depth: 0

- name: Checkout Repository (Manual)
if: github.event_name == 'workflow_dispatch'
uses: actions/checkout@v4
with:
ref: ${{ github.event.inputs.source_branch }}
fetch-depth: 0


- name: Set Branch Vars
run: |
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
Expand All @@ -102,15 +97,13 @@ jobs:
echo "MANUAL_RELEASE_TYPE=" >> $GITHUB_ENV
fi



# ======================================================
# DEPENDENCIES

- name: Python Dependencies
run: |
pip install hatchling==1.25.0
pip install hatch==1.12.0
pip install hatchling==1.29.0
pip install hatch==1.16.5

# Checkout Mountain Ash Dependencies
- name: Load Dependencies
Expand All @@ -119,8 +112,6 @@ jobs:
with:
config-path: .github/config/mountainash_dependencies.yml



- name: Checkout Dependencies
uses: ./.github/actions/checkout-dependencies
with:
Expand All @@ -133,14 +124,13 @@ jobs:
# ======================================================
# CONFIGURE RELEASE


- name: Get Base Version
id: base_version
run: |
# BASE_VERSION=$(python -c "import sys; sys.path.append('src'); from ${{env.PACKAGE_SRCDIR}}.__version__ import __version__; print(__version__)")
BASE_VERSION=$(hatch version)
echo "BASE_VERSION=${BASE_VERSION}" >> $GITHUB_ENV

# Validate semantic version format
if [[ ! "$BASE_VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
echo "Error: Base version must be in semantic version format (X.Y.Z)"
Expand All @@ -156,7 +146,7 @@ jobs:
IS_PRERELEASE="true"
RELEASE_TITLE=""
RELEASE_DESCRIPTION=""

# Function to get latest version number
get_latest_version() {
local prefix="$1"
Expand All @@ -166,11 +156,11 @@ jobs:
jq -r --arg prefix "$prefix" --arg suffix "$suffix" \
"map(select(.tag_name | startswith(\$prefix) and contains(\$suffix))) | .[0].tag_name" || echo ""
}

# Check for manual workflow run
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
echo "Using manual release type: ${{ env.MANUAL_RELEASE_TYPE }}"

case "${{ env.MANUAL_RELEASE_TYPE }}" in
"production")
RELEASE_TYPE="production"
Expand Down Expand Up @@ -216,7 +206,7 @@ jobs:
exit 1
fi
;;

"develop")
RELEASE_TYPE="rc"
# Get latest RC number for this version
Expand All @@ -226,7 +216,7 @@ jobs:
RELEASE_TITLE="Release Candidate"
RELEASE_DESCRIPTION="Release candidate for testing and validation"
;;

*)
if [[ "{{ env.SOURCE_BRANCH }}" == feature/* || "$SOURCE_BRANCH" == bugfix/* ]]; then
RELEASE_TYPE="beta"
Expand All @@ -242,10 +232,10 @@ jobs:
;;
esac
fi

# Set full version
FULL_VERSION="${BASE_VERSION}${VERSION_SUFFIX:+$VERSION_SUFFIX}"

# Output all variables
{
echo "RELEASE_TYPE=${RELEASE_TYPE}"
Expand All @@ -255,7 +245,7 @@ jobs:
echo "RELEASE_TITLE=${RELEASE_TITLE}"
echo "RELEASE_DESCRIPTION=${RELEASE_DESCRIPTION}"
} >> $GITHUB_OUTPUT

echo "VERSION=${FULL_VERSION}" >> $GITHUB_ENV

- name: Validate Release
Expand All @@ -265,7 +255,7 @@ jobs:
echo "Error: Tag v${{ env.VERSION }} already exists"
exit 1
fi

# Check if release already exists
RELEASE_ID=$(curl -s -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
"https://api.github.com/repos/${{ github.repository }}/releases/tags/v${{ env.VERSION }}" \
Expand Down Expand Up @@ -304,7 +294,6 @@ jobs:
echo "Checking version from Hatch:"
hatch version


- name: Build Package
id: build
run: |
Expand Down Expand Up @@ -347,19 +336,18 @@ jobs:
prerelease: ${{ steps.release_config.outputs.IS_PRERELEASE }}
body: |
${{ steps.release_config.outputs.RELEASE_DESCRIPTION }}

## Release Details
- Type: ${{ steps.release_config.outputs.RELEASE_TYPE }}
- Source Branch: ${{ github.head_ref }}
- Target Branch: ${{ github.base_ref }}
- Version: ${{ env.VERSION }}

## Package Information
- Package: ${{ env.PACKAGE_NAME }}
- Base Version: ${{ env.BASE_VERSION }}
${{ steps.release_config.outputs.VERSION_SUFFIX && format('- Version Suffix: {0}', steps.release_config.outputs.VERSION_SUFFIX) || '' }}


- name: Upload Package
uses: actions/upload-release-asset@v1
env:
Expand Down Expand Up @@ -470,4 +458,4 @@ jobs:
echo "::error::Failed to create Pull Request"
echo "$PR_RESPONSE"
exit 1
fi
fi
35 changes: 25 additions & 10 deletions .github/workflows/main-release-build-dependencies.yml
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
# Pre-merge validation workflow
name: Validate Main Release PR - Build Dependencies
name: Validate Main Release PR - Build Dependencies

on:
pull_request:
branches:
- 'main'
- "main"

jobs:
main-release-build-dependencies:
Expand All @@ -14,12 +14,11 @@ jobs:
matrix:
os: [ubuntu-24.04]
python-version: ["3.12"]

env:
BUILD_ENV: 'build_github'
BUILD_ENV: "build_github"

steps:

# ======================================================
# INITIALIZE

Expand All @@ -32,7 +31,7 @@ jobs:
uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.merge_commit_sha }}
fetch-depth: 0 # Get the target branch name (branch PR was merged into)
fetch-depth: 0 # Get the target branch name (branch PR was merged into)

- name: Set Branch Vars
run: |
Expand All @@ -44,8 +43,8 @@ jobs:

- name: Python Dependencies
run: |
pip install hatchling==1.25.0
pip install hatch==1.12.0
pip install hatchling==1.29.0
pip install hatch==1.16.5

# Checkout Mountain Ash Dependencies
- name: Load Dependencies
Expand All @@ -61,12 +60,28 @@ jobs:
target-branch: ${{ env.TARGET_BRANCH }}
default-branch: main
token: ${{ secrets.CLONE_PRIVATE_REPOS_TOKEN }}
org-name: ${{ env.ORGNAME }}
org-name: ${{ env.ORGNAME }}

# ======================================================
# BUILD ARTIFACTS

- name: Debug Dep State
run: |
echo "== hatch.toml =="
cat hatch.toml
echo "== pyproject.toml =="
cat pyproject.toml
echo "== temp/ tree =="
ls -la temp/ || true
for d in temp/*/; do
echo "--- $d pyproject.toml ---"
grep -n "dataframes\|mountainash" "$d/pyproject.toml" || true
echo "--- $d hatch.toml ---"
grep -n "dataframes\|mountainash" "$d/hatch.toml" 2>/dev/null || true
done

- name: Setup Build Environment
env:
HATCH_VERBOSE: "2"
run: |
hatch env create ${{ env.BUILD_ENV }}

6 changes: 5 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -167,4 +167,8 @@ htmlcov/

#Sonarlint settings
.vscode/
.sonarlint/
.sonarlint/

#testing artifacts
junit.*
coverage.*
1 change: 1 addition & 0 deletions .hiivmind/github
Loading
Loading