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 8073fb7
Show file tree
Hide file tree
Showing 23 changed files with 203 additions and 97 deletions.
11 changes: 9 additions & 2 deletions .github/workflows/cron.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ jobs:
strategy:
fail-fast: false
matrix:
cfengine: ["lucee@5", "lucee@6", "lucee@be", "adobe@2018", "adobe@2021", "adobe@2023", "adobe@be"]
cfengine: ["lucee@5", "lucee@6", "lucee@be", "adobe@2018", "adobe@2021", "adobe@2023", "adobe@be", "boxlang@be"]
coldbox: ["coldbox@6", "coldbox@7", "coldbox@be"]
javaVersion: ["openjdk8", "openjdk11"]
services:
Expand Down Expand Up @@ -51,7 +51,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
11 changes: 9 additions & 2 deletions .github/workflows/pr.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ jobs:
strategy:
fail-fast: false
matrix:
cfengine: ["lucee@5", "adobe@2018", "adobe@2021", "adobe@2023"]
cfengine: ["lucee@5", "adobe@2018", "adobe@2021", "adobe@2023", "boxlang@be"]
coldbox: ["coldbox@6", "coldbox@7", "coldbox@be"]
services:
mysql:
Expand Down Expand Up @@ -58,7 +58,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
11 changes: 9 additions & 2 deletions .github/workflows/prerelease.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ jobs:
strategy:
fail-fast: false
matrix:
cfengine: ["lucee@5", "adobe@2018", "adobe@2021", "adobe@2023"]
cfengine: ["lucee@5", "adobe@2018", "adobe@2021", "adobe@2023", "boxlang@be"]
coldbox: ["coldbox@6", "coldbox@7", "coldbox@be"]
services:
mysql:
Expand Down Expand Up @@ -52,7 +52,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
22 changes: 9 additions & 13 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ jobs:
strategy:
fail-fast: false
matrix:
cfengine: ["lucee@5", "adobe@2018", "adobe@2021", "adobe@2023"]
cfengine: ["lucee@5", "adobe@2018", "adobe@2021", "adobe@2023", "boxlang@be"]
coldbox: ["coldbox@6", "coldbox@7", "coldbox@be"]
services:
mysql:
Expand Down Expand Up @@ -53,7 +53,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 @@ -109,14 +116,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 }}"
4 changes: 2 additions & 2 deletions box.json
Original file line number Diff line number Diff line change
Expand Up @@ -28,13 +28,13 @@
},
"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
3 changes: 3 additions & 0 deletions server.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@
"app":{
"cfengine":"adobe@2018"
},
"JVM":{
"javaVersion":"openjdk21"
},
"web":{
"http":{
"port":"52482"
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()
} );
}

}
25 changes: 21 additions & 4 deletions tests/specs/integration/BaseEntity/ChildClassSpec.cfc
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ component extends="tests.resources.ModuleIntegrationSpec" {
} )
.save();

var memento = newJingle.getMemento();
var memento = newJingle.getMemento( iso8601Format = true );

expect( memento )
.toHaveKey( "id" )
Expand All @@ -43,9 +43,26 @@ component extends="tests.resources.ModuleIntegrationSpec" {
expect( newJingle.getId() ).notToBeNull();
expect( newJingle.isLoaded() ).toBeTrue();

var jingle = getInstance( "Jingle" ).findOrFail( newJingle.getId() );

expect( jingle.getMemento() ).toBe( newJingle.getMemento() );
var jingle = getInstance( "Jingle" ).findOrFail( newJingle.getId() );
var newMemento = jingle.getMemento();

expect( newMemento.keyArray() ).toBe( memento.keyArray() );
for ( var key in newMemento.keyArray() ) {
if ( isDate( newMemento[ key ] ) ) {
expect(
dateCompare(
newMemento[ key ],
memento[ key ],
"s"
)
).toBe(
0,
"Dates are not equal to the second. Left: #dateTimeFormat( newMemento[ key ], "MM/DD/YYYY HH:nn:ss" )# - Right: #dateTimeFormat( memento[ key ], "MM/DD/YYYY HH:nn:ss" )#"
);
} else {
expect( newMemento[ key ] ).toBe( memento[ key ] );
}
}
} );

it( "can update a child entity", function() {
Expand Down
6 changes: 3 additions & 3 deletions tests/specs/integration/BaseEntity/Events/PostDeleteSpec.cfc
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ component extends="tests.resources.ModuleIntegrationSpec" {
expect( request.quickPostDeleteCalled ).toHaveLength( 1 );
expect( request.quickPostDeleteCalled[ 1 ] ).toBeStruct();
expect( request.quickPostDeleteCalled[ 1 ] ).toHaveKey( "entity" );
expect( request.quickPostDeleteCalled[ 1 ].entity.getId() ).toBe( 1 );
expect( request.quickPostDeleteCalled[ 1 ].entity.id ).toBe( 1 );
structDelete( request, "quickPostDeleteCalled" );
} );

Expand All @@ -40,7 +40,7 @@ component extends="tests.resources.ModuleIntegrationSpec" {
expect( request.postDeleteCalled ).toHaveLength( 1 );
expect( request.postDeleteCalled[ 1 ] ).toBeStruct();
expect( request.postDeleteCalled[ 1 ] ).toHaveKey( "entity" );
expect( request.postDeleteCalled[ 1 ].entity.getId() ).toBe( 1 );
expect( request.postDeleteCalled[ 1 ].entity.id ).toBe( 1 );
structDelete( request, "postDeleteCalled" );
} );
} );
Expand All @@ -54,7 +54,7 @@ component extends="tests.resources.ModuleIntegrationSpec" {
prc
) {
param request.quickPostDeleteCalled = [];
arrayAppend( request.quickPostDeleteCalled, duplicate( arguments.interceptData ) );
arrayAppend( request.quickPostDeleteCalled, { "entity" : arguments.interceptData.entity.getMemento() } );
}

}
13 changes: 8 additions & 5 deletions tests/specs/integration/BaseEntity/Events/PostInsertSpec.cfc
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@ component extends="tests.resources.ModuleIntegrationSpec" {
expect( variables ).toHaveKey( "quickPostInsertCalled" );
expect( variables.quickPostInsertCalled ).toBeStruct();
expect( variables.quickPostInsertCalled ).toHaveKey( "entity" );
expect( variables.quickPostInsertCalled.entity.getTitle() ).toBe( "Rainbow Connection" );
expect( variables.quickPostInsertCalled.entity.isLoaded() ).toBeTrue();
expect( variables.quickPostInsertCalled.entity.title ).toBe( "Rainbow Connection" );
expect( variables.quickPostInsertCalled.isLoaded ).toBeTrue();
structDelete( variables, "quickPostInsertCalled" );
} );

Expand All @@ -39,8 +39,8 @@ component extends="tests.resources.ModuleIntegrationSpec" {
expect( request ).toHaveKey( "postInsertCalled" );
expect( request.postInsertCalled ).toBeStruct();
expect( request.postInsertCalled ).toHaveKey( "entity" );
expect( request.postInsertCalled.entity.getTitle() ).toBe( "Rainbow Connection" );
expect( request.postInsertCalled.entity.isLoaded() ).toBeTrue();
expect( request.postInsertCalled.entity.title ).toBe( "Rainbow Connection" );
expect( request.postInsertCalled.isLoaded ).toBeTrue();
structDelete( request, "postInsertCalled" );
} );
} );
Expand All @@ -53,7 +53,10 @@ component extends="tests.resources.ModuleIntegrationSpec" {
rc,
prc
) {
variables.quickPostInsertCalled = duplicate( arguments.interceptData );
variables.quickPostInsertCalled = {
"entity" : arguments.interceptData.entity.getMemento(),
"isLoaded" : arguments.interceptData.entity.isLoaded()
};
}

}
Loading

0 comments on commit 8073fb7

Please sign in to comment.