Skip to content

Commit

Permalink
feat: BoxLang compatibility
Browse files Browse the repository at this point in the history
This release adds compatibility with BoxLang. It is being
marked as a breaking change out of an abundance of caution,
even though no breaking changes were added.

BREAKING CHANGE: Added BoxLang compatibility
  • Loading branch information
elpete committed Feb 3, 2025
1 parent 54ca2aa commit 68dbfd4
Show file tree
Hide file tree
Showing 23 changed files with 228 additions and 109 deletions.
17 changes: 13 additions & 4 deletions .github/workflows/cron.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ jobs:
strategy:
fail-fast: false
matrix:
cfengine: ["lucee@5", "lucee@6", "lucee@be", "adobe@2018", "adobe@2021", "adobe@2023", "adobe@be"]
coldbox: ["coldbox@6", "coldbox@7", "coldbox@be"]
cfengine: ["lucee@5", "lucee@6", "lucee@be", "adobe@2018", "adobe@2023", "adobe@be", "boxlang@be"]
coldbox: ["coldbox@7", "coldbox@be"]
javaVersion: ["openjdk8", "openjdk11"]
services:
mysql:
Expand All @@ -35,7 +35,9 @@ jobs:
java-version: 11

- name: Set Up CommandBox
uses: elpete/[email protected]
uses: Ortus-Solutions/[email protected]
with:
install: commandbox-boxlang

- name: Install dependencies
run: |
Expand All @@ -51,7 +53,14 @@ jobs:
DB_USER: quick
DB_PASSWORD: quick
run: |
box server start cfengine=${{ matrix.cfengine }} javaVersion=${{ matrix.javaVersion }}
if [[ "${{ matrix.cfengine }}" == *"boxlang"* ]] ; then
box server start cfengine=${{ matrix.cfengine }} javaVersion=openjdk21_jdk
box run-script bx-modules:install
box server restart
else
box server start cfengine=${{ matrix.cfengine }} javaVersion=${{ matrix.javaVersion }}
fi
# Install Adobe 2021 cfpm modules
if [[ "${{ matrix.cfengine }}" == "adobe@2021" ]] ; then
box run-script install:2021
Expand Down
21 changes: 16 additions & 5 deletions .github/workflows/pr.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@ jobs:
strategy:
fail-fast: false
matrix:
cfengine: ["lucee@5", "adobe@2018", "adobe@2021", "adobe@2023"]
coldbox: ["coldbox@6", "coldbox@7", "coldbox@be"]
cfengine: ["lucee@5", "adobe@2018", "adobe@2023", "boxlang@be"]
coldbox: ["coldbox@7", "coldbox@be"]
services:
mysql:
image: mysql:5.7
Expand All @@ -42,7 +42,9 @@ jobs:
java-version: 11

- name: Set Up CommandBox
uses: elpete/[email protected]
uses: Ortus-Solutions/[email protected]
with:
install: commandbox-boxlang

- name: Install dependencies
run: |
Expand All @@ -58,7 +60,14 @@ jobs:
DB_USER: quick
DB_PASSWORD: quick
run: |
box server start cfengine=${{ matrix.cfengine }}
if [[ "${{ matrix.cfengine }}" == *"boxlang"* ]] ; then
box server start cfengine=${{ matrix.cfengine }} javaVersion=openjdk21_jdk
box run-script bx-modules:install
box server restart
else
box server start cfengine=${{ matrix.cfengine }}
fi
# Install Adobe 2021 cfpm modules
if [[ "${{ matrix.cfengine }}" == "adobe@2021" ]] ; then
box run-script install:2021
Expand Down Expand Up @@ -86,7 +95,9 @@ jobs:
java-version: 11

- name: Set Up CommandBox
uses: elpete/[email protected]
uses: Ortus-Solutions/[email protected]
with:
install: commandbox-boxlang

- name: Install CFFormat
run: box install commandbox-cfformat
Expand Down
17 changes: 13 additions & 4 deletions .github/workflows/prerelease.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@ jobs:
strategy:
fail-fast: false
matrix:
cfengine: ["lucee@5", "adobe@2018", "adobe@2021", "adobe@2023"]
coldbox: ["coldbox@6", "coldbox@7", "coldbox@be"]
cfengine: ["lucee@5", "adobe@2018", "adobe@2023", "boxlang@be"]
coldbox: ["coldbox@7", "coldbox@be"]
services:
mysql:
image: mysql:5.7
Expand All @@ -36,7 +36,9 @@ jobs:
java-version: 11

- name: Set Up CommandBox
uses: elpete/[email protected]
uses: Ortus-Solutions/[email protected]
with:
install: commandbox-boxlang

- name: Install dependencies
run: |
Expand All @@ -52,7 +54,14 @@ jobs:
DB_USER: quick
DB_PASSWORD: quick
run: |
box server start cfengine=${{ matrix.cfengine }}
if [[ "${{ matrix.cfengine }}" == *"boxlang"* ]] ; then
box server start cfengine=${{ matrix.cfengine }} javaVersion=openjdk21_jdk
box run-script bx-modules:install
box server restart
else
box server start cfengine=${{ matrix.cfengine }}
fi
# Install Adobe 2021 cfpm modules
if [[ "${{ matrix.cfengine }}" == "adobe@2021" ]] ; then
box run-script install:2021
Expand Down
32 changes: 16 additions & 16 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ jobs:
strategy:
fail-fast: false
matrix:
cfengine: ["lucee@5", "adobe@2018", "adobe@2021", "adobe@2023"]
coldbox: ["coldbox@6", "coldbox@7", "coldbox@be"]
cfengine: ["lucee@5", "adobe@2018", "adobe@2023", "boxlang@be"]
coldbox: ["coldbox@7", "coldbox@be"]
services:
mysql:
image: mysql:5.7
Expand All @@ -37,7 +37,9 @@ jobs:
java-version: 11

- name: Set Up CommandBox
uses: elpete/[email protected]
uses: Ortus-Solutions/[email protected]
with:
install: commandbox-boxlang

- name: Install dependencies
run: |
Expand All @@ -53,7 +55,14 @@ jobs:
DB_USER: quick
DB_PASSWORD: quick
run: |
box server start cfengine=${{ matrix.cfengine }}
if [[ "${{ matrix.cfengine }}" == *"boxlang"* ]] ; then
box server start cfengine=${{ matrix.cfengine }} javaVersion=openjdk21_jdk
box run-script bx-modules:install
box server restart
else
box server start cfengine=${{ matrix.cfengine }}
fi
# Install Adobe 2021 cfpm modules
if [[ "${{ matrix.cfengine }}" == "adobe@2021" ]] ; then
box run-script install:2021
Expand Down Expand Up @@ -87,7 +96,9 @@ jobs:
java-version: 11

- name: Set Up CommandBox
uses: elpete/[email protected]
uses: Ortus-Solutions/[email protected]
with:
install: commandbox-boxlang

- name: Install and Configure Semantic Release
run: |
Expand All @@ -109,14 +120,3 @@ jobs:
- name: Get Current Version
id: current_version
run: echo "::set-output name=version::`cat box.json | jq '.version' -r`"

- name: Upload API Docs to S3
uses: jakejarvis/s3-sync-action@master
with:
args: --acl public-read
env:
AWS_S3_BUCKET: "apidocs.ortussolutions.com"
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_ACCESS_SECRET }}
SOURCE_DIR: ".tmp/apidocs"
DEST_DIR: "${{ github.repository }}/${{ steps.current_version.outputs.version }}"
7 changes: 4 additions & 3 deletions box.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,17 +24,18 @@
"format:check":"cfformat check dsl/**/*.cfc,extras/**/*.cfc,models/**/*.cfc,tests/specs/**/*.cfc --verbose",
"format:watch":"cfformat watch dsl/**/*.cfc,extras/**/*.cfc,models/**/*.cfc,tests/specs/**/*.cfc",
"generateAPIDocs":"rm .tmp --recurse --force && docbox generate mapping=quick excludes=test|/modules|ModuleConfig|QuickCollection strategy-outputDir=.tmp/apidocs strategy-projectTitle=Quick",
"install:2021":"cfpm install document,feed,mysql,zip"
"install:2021":"cfpm install document,feed,mysql,zip",
"bx-modules:install":"install bx-compat-cfml@be,bx-esapi,bx-mysql"
},
"type":"modules",
"dependencies":{
"qb":"^11.0.1",
"qb":"^11.0.2",
"str":"^4.0.0",
"mementifier":"^3.0.0"
},
"devDependencies":{
"coldbox":"v7.3.0",
"testbox":"v6.1.0",
"testbox":"be",
"cfcollection":"^3.6.4",
"cfmigrations":"^4.0.0"
},
Expand Down
4 changes: 3 additions & 1 deletion models/BaseEntity.cfc
Original file line number Diff line number Diff line change
Expand Up @@ -3076,7 +3076,9 @@ component accessors="true" {
public any function ignoreLoadedGuard( required any callback ) {
variables._ignoreNotLoadedGuard = true;
try {
return arguments.callback();
var retval = arguments.callback();
variables._ignoreNotLoadedGuard = false;
return isNull( retval ) ? javacast( "null", "" ) : retval;
} finally {
variables._ignoreNotLoadedGuard = false;
}
Expand Down
4 changes: 4 additions & 0 deletions models/QuickBuilder.cfc
Original file line number Diff line number Diff line change
Expand Up @@ -1334,6 +1334,10 @@ component accessors="true" transientCache="false" {
qb.setColumns(
qb.getColumns()
.map( function( column ) {
if ( variables.qb.getUtils().isExpression( column ) ) {
return column;
}

if ( !qualifiedColumns.contains( column ) ) {
return column;
}
Expand Down
23 changes: 19 additions & 4 deletions models/QuickQB.cfc
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ component
combinator = "and",
negate = false
) {
if ( structKeyExists( arguments.query, "isQuickBuilder" ) ) {
if ( isStruct( arguments.query ) && structKeyExists( arguments.query, "isQuickBuilder" ) ) {
arguments.query = arguments.query.getQB();
}

Expand Down Expand Up @@ -359,7 +359,12 @@ component
combinator = "and",
negate = false
) {
if ( structKeyExists( arguments.query, "isQuickBuilder" ) ) {
if (
!isClosure( arguments.query ) && !isCustomFunction( arguments.query ) && structKeyExists(
arguments.query,
"isQuickBuilder"
)
) {
arguments.query = arguments.query.getQB();
}

Expand Down Expand Up @@ -857,7 +862,12 @@ component
"value" : ( isNull( arguments.value ) || getEntity().isNullValue( arguments.column, arguments.value ) ) ? "" : arguments.value,
"cfsqltype" : getEntity().attributeHasSqlType( arguments.column ) ? getEntity().retrieveSqlTypeForAttribute(
arguments.column
) : ( isNull( arguments.value ) ? "CF_SQL_VARCHAR" : getUtils().inferSqlType( arguments.value, variables.grammar ) ),
) : (
isNull( arguments.value ) ? "CF_SQL_VARCHAR" : getUtils().inferSqlType(
arguments.value,
variables.grammar
)
),
"null" : isNull( arguments.value ) || (
getEntity().canConvertToNull( arguments.column ) && getEntity().isNullValue(
arguments.column,
Expand All @@ -876,7 +886,12 @@ component
"value" : isNull( arguments.value ) ? "" : arguments.value,
"cfsqltype" : getEntity().attributeHasSqlType( arguments.column ) ? getEntity().retrieveSqlTypeForAttribute(
arguments.column
) : ( isNull( arguments.value ) ? "CF_SQL_VARCHAR" : getUtils().inferSqlType( arguments.value, variables.grammar ) ),
) : (
isNull( arguments.value ) ? "CF_SQL_VARCHAR" : getUtils().inferSqlType(
arguments.value,
variables.grammar
)
),
"null" : isNull( arguments.value ),
"nulls" : isNull( arguments.value )
};
Expand Down
5 changes: 4 additions & 1 deletion server.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
{
"app":{
"cfengine":"adobe@2018"
"cfengine":"adobe@2021"
},
"JVM":{
"javaVersion":"openjdk21"
},
"web":{
"http":{
Expand Down
2 changes: 1 addition & 1 deletion tests/index.cfm
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@
<meta charset="utf-8">
<meta name="generator" content="TestBox v#testbox.getVersion()#">
<title>TestBox Global Runner</title>
<script><cfinclude template="/testbox/system/reports/assets/js/jquery-3.3.1.min.js"></script>
<script src="/testbox/system/reports/assets/js/jquery-3.3.1.min.js"></script>
<script>
$(document).ready(function() {
Expand Down
36 changes: 28 additions & 8 deletions tests/resources/app/models/Song.cfc
Original file line number Diff line number Diff line change
Expand Up @@ -19,39 +19,59 @@ component extends="quick.models.BaseEntity" accessors="true" {
}

function preInsert( eventData ) {
request.preInsertCalled = duplicate( eventData );
request.preInsertCalled = {
"entity": arguments.eventData.entity.getMemento(),
"isLoaded": arguments.eventData.entity.isLoaded()
};
}

function postInsert( eventData ) {
request.postInsertCalled = duplicate( eventData );
request.postInsertCalled = {
"entity": eventData.entity.getMemento(),
"isLoaded": eventData.entity.isLoaded()
};
}

function preUpdate( eventData ) {
param request.preUpdateCalled = [];
arrayAppend( request.preUpdateCalled, duplicate( eventData ) );
arrayAppend( request.preUpdateCalled, {
"entity": eventData.entity.getMemento()
} );
}

function postUpdate( eventData ) {
param request.postUpdateCalled = [];
arrayAppend( request.postUpdateCalled, duplicate( eventData ) );
arrayAppend( request.postUpdateCalled, {
"entity": eventData.entity.getMemento()
} );
}

function preSave( eventData ) {
request.preSaveCalled = duplicate( eventData );
request.preSaveCalled = {
"entity": arguments.eventData.entity.getMemento(),
"isLoaded": arguments.eventData.entity.isLoaded()
};
}

function postSave( eventData ) {
request.postSaveCalled = duplicate( eventData );
request.postSaveCalled = {
"entity": arguments.eventData.entity.getMemento(),
"isLoaded": arguments.eventData.entity.isLoaded()
};
}

function preDelete( eventData ) {
param request.preDeleteCalled = [];
arrayAppend( request.preDeleteCalled, duplicate( eventData ) );
arrayAppend( request.preDeleteCalled, {
"entity": eventData.entity.getMemento()
} );
}

function postDelete( eventData ) {
param request.postDeleteCalled = [];
arrayAppend( request.postDeleteCalled, duplicate( eventData ) );
arrayAppend( request.postDeleteCalled, {
"entity": eventData.entity.getMemento()
} );
}

}
Loading

0 comments on commit 68dbfd4

Please sign in to comment.