Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
75 commits
Select commit Hold shift + click to select a range
e321184
Update SonarCloud configuration and coverage report paths.
discreteds Aug 25, 2024
0f82a3b
Docstring updates (#17)
discreteds Sep 5, 2024
5219aa8
Add post-init reinit, and improved settings parameter init (#18)
discreteds Sep 21, 2024
b8aea8d
Merge remote-tracking branch 'origin/develop' into develop
discreteds Sep 21, 2024
88153a3
fix: update settings_functions to handle default value for settings_c…
discreteds Oct 2, 2024
34e2aab
chore: update .gitignore file
discreteds Oct 2, 2024
6ee5920
feat: Add function to clone and checkout repositories
discreteds Oct 5, 2024
1a1606e
```
discreteds Feb 11, 2025
ee84de7
MAJOR Refactoring of Settings (#20)
discreteds Feb 11, 2025
dc3fe25
```
discreteds Feb 11, 2025
48ce143
``` (#21)
discreteds Feb 12, 2025
08f843e
feat: implement GPG authentication settings (#22)
discreteds Feb 13, 2025
aa34a19
```
discreteds Feb 16, 2025
dc4c1af
```
discreteds Feb 28, 2025
aa292d1
```
discreteds Mar 11, 2025
b4d4e2b
```
discreteds Mar 11, 2025
57e1a77
```
discreteds Mar 27, 2025
afd98ff
Adds initial project documentation and configuration
discreteds Apr 22, 2025
fb4f502
Updates version and adds CalVer badge
discreteds Apr 22, 2025
6b25a59
Fixed bug in tests
discreteds Apr 23, 2025
de73ae4
update to dummy s3 config
discreteds Apr 23, 2025
c404d6e
Ruff Linting fixes
discreteds Apr 23, 2025
2887d62
remove conda yaml
discreteds Apr 24, 2025
26c3ba0
update actions for release
discreteds Apr 25, 2025
1254d1a
Merge branch 'main' into develop
discreteds Apr 30, 2025
f1a1d36
release/25.5.0
discreteds May 1, 2025
7b32819
Merge branch 'main' into develop
discreteds May 15, 2025
2ce6b2b
Updates SBOM generation and adds wheel publishing
discreteds May 15, 2025
ef8e700
🧪 Comprehensive test refactoring and code improvements (#27)
discreteds Aug 22, 2025
70cbd5e
📝 Add comprehensive decorator refactoring documentation
discreteds Aug 28, 2025
6a608b6
✨ Implement @mountainash_settings decorator for Pydantic BaseSettings
discreteds Aug 29, 2025
9401b4a
✅ Add comprehensive test suite for @mountainash_settings decorator
discreteds Aug 29, 2025
17ed9fb
📝 Add decorator project documentation and working example
discreteds Aug 29, 2025
eb41b5e
📚 Expand JIT security pattern and ecosystem analysis documentation
discreteds Aug 29, 2025
2bf45e1
🧪 Fix and clean up decorator test failures
discreteds Sep 2, 2025
f01cd10
✅ Add comprehensive decorator vs subclass parity tests with file-base…
discreteds Sep 2, 2025
628861c
📚 Add comprehensive decorator usage examples and patterns
discreteds Sep 2, 2025
24be6c0
✨ Complete Phase 2 decorator implementation with all advanced features
discreteds Sep 2, 2025
96d4771
🐛 Fix runtime override behavior in get_settings function
discreteds Sep 2, 2025
9b7ccb0
📝 Complete comprehensive decorator refactoring documentation
discreteds Sep 2, 2025
bfff06d
📝 Remove decorator pattern from documentation
discreteds Sep 3, 2025
384a0cf
🔥 Remove decorator import from package exports
discreteds Sep 3, 2025
d37c1d1
🗑️ Remove deprecated decorator implementation and tests
discreteds Sep 3, 2025
4f7a139
♻️ Clean up decorator-related code references
discreteds Sep 3, 2025
ed6aa69
♻️ Update examples to use MountainAshBaseSettings pattern
discreteds Sep 3, 2025
33a662f
updates
discreteds Sep 28, 2025
5ba347f
🐛 Fix circular import issues using TYPE_CHECKING and lazy imports
discreteds Oct 3, 2025
352fe0f
🐛 Fix cache key and config file sorting bugs
discreteds Oct 3, 2025
89ca9d6
♻️ Refactor test infrastructure with centralized fixtures
discreteds Oct 3, 2025
8ded4b6
✅ Add comprehensive test coverage for core modules
discreteds Oct 3, 2025
1a37bc0
🗑️ Remove deprecated and obsolete test files
discreteds Oct 3, 2025
850c562
🔖 Bump version to 25.8.0
discreteds Oct 8, 2025
9a9014a
✨ Add support for dotfiles in FileTypeRegistry
discreteds Oct 8, 2025
ea53027
✅ Add comprehensive test coverage for dotfile support
discreteds Oct 8, 2025
4e04bd9
➖ Remove mountainash-utils-os dependency
discreteds Oct 18, 2025
4244fee
♻️ Refactor path templating to use UPath architecture
discreteds Oct 18, 2025
0932ef6
📝 Add UPath path templating documentation and examples
discreteds Oct 18, 2025
8f6ecec
✅ Remove PLATFORM_SLASH test assertion
discreteds Oct 18, 2025
efe7589
Fixes type annotation for kwargs
discreteds Oct 25, 2025
a20ecf3
main into develop after release (#30)
discreteds Oct 28, 2025
c54acc9
Merge branch 'feature/upath-path-templating' into develop
discreteds Oct 28, 2025
51c83ef
Add architecture evaluation spec for core design validation
discreteds Apr 2, 2026
42eb420
Add architecture cleanup implementation plan
discreteds Apr 2, 2026
ce4feb2
fix: prevent mutation of cached settings in SettingsManager.get_setti…
discreteds Apr 2, 2026
4506897
fix: classify secrets_dir as structural parameter in hash/eq
discreteds Apr 2, 2026
2706e46
refactor: remove namespace field from settings architecture
discreteds Apr 2, 2026
cd9e250
refactor: collapse merge framework into SettingsParameters.merge()
discreteds Apr 2, 2026
013bc07
refactor: remove SettingsUtils facade class
discreteds Apr 2, 2026
619d2eb
cleanup: normalize kwargs once at SettingsParameters.create() boundary
discreteds Apr 2, 2026
38eef0d
cleanup: remove dead code from settings_cache modules
discreteds Apr 2, 2026
c247bc3
Add principles document design spec for mountainash-settings
discreteds Apr 2, 2026
68ad93f
fix: restore super().post_init() call in AppSettings
discreteds Apr 2, 2026
079394d
Bump version to 26.4.0
discreteds Apr 3, 2026
a02dcc0
chore: disable mountainash-constants dependency and bump hatch versions
discreteds Apr 14, 2026
81f4fb4
cleanup: remove unused imports across settings modules
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
8 changes: 4 additions & 4 deletions .github/config/mountainash_dependencies.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@

# Private Package Dependencies
dependencies:
- name: mountainash-constants
org-name: mountainash-io
# - name: mountainash-constants
# org-name: mountainash-io
# - name: mountainash-data
# org-name: mountainash-io
# - name: mountainash-settings
Expand All @@ -16,8 +16,8 @@ dependencies:
# org-name: mountainash-io
# - name: mountainash-utils-hamilton
# org-name: mountainash-io
- name: mountainash-utils-os
org-name: mountainash-io
# - name: mountainash-utils-os
# org-name: mountainash-io
# - name: mountainash-utils-rules
# org-name: mountainash-io
# - name: mountainash-utils-ssh
Expand Down
144 changes: 66 additions & 78 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,45 +97,40 @@ jobs:
echo "MANUAL_RELEASE_TYPE=" >> $GITHUB_ENV
fi



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

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

# Checkout Mountain Ash Dependencies
- name: Load Dependencies
id: deps
uses: ./.github/actions/load-dependencies
with:
config-path: .github/config/mountainash_dependencies.yml



- name: Checkout Dependencies
uses: ./.github/actions/checkout-dependencies
with:
dependencies: ${{ steps.deps.outputs.dependencies }}
target-branch: ${{ env.TARGET_BRANCH }}
default-branch: ${{ env.FALLBACK_BRANCH }}
token: ${{ secrets.CLONE_PRIVATE_REPOS_TOKEN }}
org-name: ${{ env.ORGNAME }}
# - name: Load Dependencies
# id: deps
# uses: ./.github/actions/load-dependencies
# with:
# config-path: .github/config/mountainash_dependencies.yml

# - name: Checkout Dependencies
# uses: ./.github/actions/checkout-dependencies
# with:
# dependencies: ${{ steps.deps.outputs.dependencies }}
# target-branch: ${{ env.TARGET_BRANCH }}
# default-branch: ${{ env.FALLBACK_BRANCH }}
# token: ${{ secrets.CLONE_PRIVATE_REPOS_TOKEN }}
# org-name: ${{ env.ORGNAME }}

# ======================================================
# 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 @@ -165,12 +155,12 @@ jobs:
"https://api.github.com/repos/${{ github.repository }}/releases" | \
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 @@ -395,46 +383,46 @@ jobs:
# Configure git
git config --global user.name "GitHub Actions"
git config --global user.email "actions@github.com"

# Clone the wheels repository
git clone https://x-access-token:${{ secrets.CLONE_PRIVATE_REPOS_TOKEN }}@github.com/${{ env.ORGNAME }}/mountainash-wheels.git wheels-repo

# Go to the wheels repository
cd wheels-repo

# Generate a unique branch name using a timestamp
TIMESTAMP=$(date +%Y%m%d%H%M%S)
BRANCH_NAME="release/${{ env.PACKAGE_NAME }}-${{ env.VERSION }}-${TIMESTAMP}"

# Create a new branch for this release
git checkout -b $BRANCH_NAME

# Create package directory if it doesn't exist
mkdir -p ${{ env.PACKAGE_NAME }}

# Copy the newly built wheel to the repository
cp ../${{ steps.build.outputs.WHEEL_FILE }} ${{ env.PACKAGE_NAME }}/

# Add the new wheel file
git add .

# Commit the changes
git commit -m "Add ${{ steps.build.outputs.WHEEL_FILENAME }} to wheels repository"

# Push the branch to the repository
git push -u origin $BRANCH_NAME

# Export the branch name for later steps
echo "WHEELS_BRANCH=${BRANCH_NAME}" >> $GITHUB_ENV

- name: Create Pull Request
run: |
# Create a simpler PR body
PR_BODY="This PR adds the following wheel file to the wheels repository:\n- ${{ steps.build.outputs.WHEEL_FILENAME }}\n\nThis was automatically generated from the release workflow of ${{ github.repository }}."

# Properly escape the PR body for JSON
PR_BODY_ESCAPED=$(echo "$PR_BODY" | jq -Rs .)

# Create the PR
PR_RESPONSE=$(curl -X POST \
-H "Authorization: token ${{ secrets.CLONE_PRIVATE_REPOS_TOKEN }}" \
Expand All @@ -446,13 +434,13 @@ jobs:
\"head\": \"${WHEELS_BRANCH}\",
\"base\": \"main\"
}")

echo "API Response: $PR_RESPONSE"

# Extract PR URL and number
PR_URL=$(echo "$PR_RESPONSE" | jq -r '.html_url')
PR_NUMBER=$(echo "$PR_RESPONSE" | jq -r '.number')

# Add labels to the PR
if [ "$PR_NUMBER" != "null" ]; then
curl -X POST \
Expand All @@ -462,11 +450,11 @@ jobs:
-d '{
"labels": ["automated", "wheel"]
}'

echo "PR_URL=${PR_URL}" >> $GITHUB_ENV
echo "::notice::Pull Request created: ${PR_URL}"
else
echo "::error::Failed to create Pull Request"
echo "$PR_RESPONSE"
exit 1
fi
fi
Loading
Loading