Skip to content

Commit df44bef

Browse files
authored
fix: strip Collapsed attribute from sanitized output (#182)
1 parent f5e2853 commit df44bef

12 files changed

Lines changed: 162 additions & 131 deletions

File tree

src/script_steps/parameters/boolean.rs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,11 @@ impl Boolean {
8686
}
8787

8888
pub fn display(self) -> Option<String> {
89+
// Collapsed is a UI-only flag (Script Workspace visual state) — never shown in output
90+
if self.name.as_deref() == Some("Collapsed") {
91+
return None;
92+
}
93+
8994
if self.should_hide_bool() {
9095
// Hidden booleans only show their name when the value is true
9196
return self.value.filter(|&v| v).and(self.name);
@@ -130,6 +135,27 @@ mod tests {
130135
);
131136
}
132137

138+
#[test]
139+
fn test_collapsed_returns_none() {
140+
let xml = r#"
141+
<Parameter type="Boolean">
142+
<Boolean type="Collapsed" id="0" value="False"></Boolean>
143+
</Parameter>
144+
"#;
145+
146+
let mut reader = Reader::from_str(xml.trim());
147+
let element = match reader.read_event() {
148+
Ok(Event::Start(e)) => e,
149+
_ => panic!("Wrong read event"),
150+
};
151+
152+
assert_eq!(
153+
Boolean::from_xml(&mut reader, &element, 0).display(),
154+
None,
155+
"Collapsed boolean should produce no output"
156+
);
157+
}
158+
133159
#[test]
134160
fn test_without_name() {
135161
let xml = r#"

src/utils/xml_utils.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,12 @@ pub fn start_element_to_string(e: &BytesStart, flags: &Flags) -> String {
2929
complete_tag.push_str(&local_name_to_string(e.name().as_ref()));
3030

3131
for attr in get_attributes(e) {
32-
if !flags.lossless && matches!(attr.0.as_str(), "nextvalue" | "UUID" | "index") {
32+
if !flags.lossless
33+
&& matches!(
34+
attr.0.as_str(),
35+
"nextvalue" | "UUID" | "index" | "Collapsed"
36+
)
37+
{
3338
continue;
3439
}
3540
complete_tag.push(' ');

tests/snapshots_db_lossless/Ooe/scripts_sanitized/SaXMLDelivery - ID 50/saxmlDelivery_createXml - ID 51.txt.snap

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -52,18 +52,18 @@ Set Variable [ $message ; "" ]
5252
Set Variable [ $data ; "{}" ]
5353

5454
# Send script to server via PSoS
55-
If [ Collapsed: OFF ; PatternCount ( Get ( ApplicationVersion ) ; "Server" ) = 0 // if not already running on fmse ]
55+
If [ PatternCount ( Get ( ApplicationVersion ) ; "Server" ) = 0 // if not already running on fmse ]
5656
# Only try to do this if file is hosted
57-
If [ Collapsed: OFF ; Get ( ConnectionState ) ≠ 0 ]
57+
If [ Get ( ConnectionState ) ≠ 0 ]
5858
Perform Script on Server [ By name ; ⚠️ PARAMETER "Parameter" NOT PARSED ⚠️ ; Wait for completion: ON ]
5959
Set Variable [ $errorCode ; Get ( LastError ) ]
6060
Set Variable [ $recordId ; JSONGetElement ( Get ( ScriptResult ) ; "data.recordId" ) ]
61-
If [ Collapsed: OFF ; $errorCode = 0 and not IsEmpty ( $recordId ) ]
61+
If [ $errorCode = 0 and not IsEmpty ( $recordId ) ]
6262
Enter Find Mode [ Pause: OFF ]
6363
Go to Layout [ Layout: "SaXMLDeliveryExecutionContext" ; Animation: None ]
6464
Set Field [ SaXMLDelivery::recordId ; $recordId ]
6565
Perform Find
66-
Else [ Collapsed: OFF ; Collapsed: OFF ]
66+
Else
6767
Go to Layout [ Layout: "SaXMLDeliveryExecutionContext" ; Animation: None ]
6868
Show All Records
6969
Show Omitted Only
@@ -75,7 +75,7 @@ End If
7575
# Validate privilege set - must be full access or must have access via the Data API
7676
# ■■■■■■■■■■ CONFIGURATION STEP (optional): Customize restrictions to run this script
7777
Set Variable [ $allowedPrivilegeSet ; Get ( AccountPrivilegeSetName ) = "[Full Access]" or not IsEmpty ( FilterValues ( Get ( AccountExtendedPrivileges ) ; "fmrest" ) ) ]
78-
If [ Collapsed: OFF ; not $allowedPrivilegeSet ]
78+
If [ not $allowedPrivilegeSet ]
7979
Exit Script [ JSONSetElement ( "" ; [ "errorCode" ; 9 ; JSONNumber ] ; [ "message" ; "Insufficient privileges" ; JSONString ] ) ]
8080
End If
8181

@@ -112,13 +112,13 @@ Set Error Capture [ ON ]
112112
# ====================================================================================================
113113

114114
# Set up context
115-
If [ Collapsed: OFF ; $errorCode = 0 ]
115+
If [ $errorCode = 0 ]
116116
Go to Layout [ Layout: "SaXMLDeliveryExecutionContext" ; Animation: None ]
117117
Set Variable [ $errorCode ; Get ( LastError ) ]
118118
End If
119119

120120
# Purge old records
121-
If [ Collapsed: OFF ; $errorCode = 0 ]
121+
If [ $errorCode = 0 ]
122122
# Delete records older than 3 months
123123
Set Variable [ $purgeDate[1] ; Let (
124124
today = Get ( CurrentDate ) ;
@@ -127,25 +127,25 @@ If [ Collapsed: OFF ; $errorCode = 0 ]
127127
Enter Find Mode [ Pause: OFF ]
128128
Set Field [ SaXMLDelivery::createTimestamp ; "<" & $purgeDate ]
129129
Perform Find
130-
If [ Collapsed: OFF ; Get ( FoundCount ) > 0 and Get ( LayoutTableName ) = GetValue ( Substitute ( GetFieldName ( SaXMLDelivery::xmlFile ) ; "::" ; ¶ ) ; 1 ) // belt and suspenders ]
130+
If [ Get ( FoundCount ) > 0 and Get ( LayoutTableName ) = GetValue ( Substitute ( GetFieldName ( SaXMLDelivery::xmlFile ) ; "::" ; ¶ ) ; 1 ) // belt and suspenders ]
131131
Delete All Records [ With dialog: OFF ]
132132
End If
133133
End If
134134

135135
# Create new record
136-
If [ Collapsed: OFF ; $errorCode = 0 ]
136+
If [ $errorCode = 0 ]
137137
New Record/Request
138138
Set Variable [ $errorCode ; Get ( LastError ) ]
139139
End If
140140

141141
# Create SaXML xml file on file system
142142
# 2024-10-07 mkos: Added support for $_includeDetailsForAnalysisTools
143-
If [ Collapsed: OFF ; $errorCode = 0 ]
143+
If [ $errorCode = 0 ]
144144
Set Variable [ $xmlPath ; Get ( TemporaryPath ) & Get ( FileName ) & ".xml" ]
145145
Set Variable [ $start ; Get ( CurrentTimeUTCMilliseconds ) ]
146-
If [ Collapsed: OFF ; $_includeDetailsForAnalysisTools ]
146+
If [ $_includeDetailsForAnalysisTools ]
147147
Save a Copy as XML [ Get ( WindowName ) ; ⚠️ PARAMETER "UniversalPathList" NOT PARSED ⚠️ ; Include details for analysis tools: ON ; Save each layout object&apos;s binary data under its node: OFF ]
148-
Else [ Collapsed: OFF ; Collapsed: OFF ]
148+
Else
149149
Save a Copy as XML [ Get ( WindowName ) ; ⚠️ PARAMETER "UniversalPathList" NOT PARSED ⚠️ ; Include details for analysis tools: OFF ; Save each layout object&apos;s binary data under its node: OFF ]
150150
End If
151151
Set Variable [ $errorCode ; Get ( LastError ) ]
@@ -155,13 +155,13 @@ End If
155155
# Upload xml file to container field
156156
# Note, we tried using the Read From Data File step, but it's not any faster, and it makes the code more complex, bc you have to read the file in chunks
157157
# 2024-07-17 mkos: Don't automatically encode url since ConvertFromFileMakerPath will already do that for us
158-
If [ Collapsed: OFF ; $errorCode = 0 ]
158+
If [ $errorCode = 0 ]
159159
Set Variable [ $start ; Get ( CurrentTimeUTCMilliseconds ) ]
160160
Insert from URL [ Verify SSL Certificates: OFF ; Select: ON ; With dialog: OFF ; Target: SaXMLDelivery::xmlFile ; ⚠️ PARAMETER "URL" NOT PARSED ⚠️ ]
161161
Set Variable [ $errorCode ; Get ( LastError ) ]
162162
Set Variable [ $timeToUpload[1] ; GetAsTime ( ( Get ( CurrentTimeUTCMilliseconds ) - $start ) / 1000 ) ]
163163
End If
164-
If [ Collapsed: OFF ; $errorCode = 0 ]
164+
If [ $errorCode = 0 ]
165165
Set Field [ SaXMLDelivery::timeToCreate ; $timeToCreate ]
166166
Set Field [ SaXMLDelivery::timeToUpload ; $timeToUpload ]
167167
Set Field [ SaXMLDelivery::sizeInBytes ; GetContainerAttribute ( SaXMLDelivery::xmlFile ; "filesize" ) ]
@@ -171,13 +171,13 @@ If [ Collapsed: OFF ; $errorCode = 0 ]
171171
End If
172172

173173
# Delete xml file in temp folder
174-
If [ Collapsed: OFF ; $errorCode = 0 ]
174+
If [ $errorCode = 0 ]
175175
Delete File [ ⚠️ PARAMETER "UniversalPathList" NOT PARSED ⚠️ ]
176176
Set Variable [ $errorCode ; Get ( LastError ) ]
177177
End If
178178

179179
# Handle error
180-
If [ Collapsed: OFF ; $errorCode > 1 and IsEmpty ( $message ) ]
180+
If [ $errorCode > 1 and IsEmpty ( $message ) ]
181181
Set Variable [ $message[1] ; // We would typically use a custom function here, but we wanted this script to have as few dependencies as possible
182182
/**
183183
* @SIGNATURE:
@@ -487,7 +487,7 @@ Let ( [
487487

488488
) ]
489489
End If
490-
If [ Collapsed: OFF ; not IsEmpty ( $message )
490+
If [ not IsEmpty ( $message )
491491
and PatternCount ( Get ( ApplicationVersion ) ; "Data API Engine" ) = 0
492492
and PatternCount ( Get ( ApplicationVersion ) ; "Server" ) = 0 ]
493493
Show Custom Dialog [ Message: $message ; Default Button: "OK" ]
@@ -504,8 +504,8 @@ Set Variable [ $data[1] ; JSONSetElement ( $data
504504
Set Variable [ $result[1] ; JSONSetElement ( "" ; [ "errorCode" ; $errorCode ; JSONNumber ] ; [ "message" ; $message ; JSONString ] ; [ "data" ; $data ; JSONObject ] ) ]
505505

506506
# In case of error, if we were able to get to the layout and create a new record, store $result in the record
507-
If [ Collapsed: OFF ; $errorCode > 1 ]
508-
If [ Collapsed: OFF ; Get ( LayoutTableName ) = GetValue ( Substitute ( GetFieldName ( SaXMLDelivery::xmlFile ) ; "::" ; ¶ ) ; 1 ) and not IsEmpty ( $recordId ) ]
507+
If [ $errorCode > 1 ]
508+
If [ Get ( LayoutTableName ) = GetValue ( Substitute ( GetFieldName ( SaXMLDelivery::xmlFile ) ; "::" ; ¶ ) ; 1 ) and not IsEmpty ( $recordId ) ]
509509
Set Field [ SaXMLDelivery::notes ; Get ( ScriptName ) & " script result:¶" & JSONFormatElements ( $result ) ]
510510
Commit Records/Requests [ Skip data entry validation ; With dialog: OFF ]
511511
End If
@@ -515,9 +515,9 @@ End If
515515
# END
516516
# ====================================================================================================
517517

518-
If [ Collapsed: OFF ; $parentScriptErrorCaptureState ]
518+
If [ $parentScriptErrorCaptureState ]
519519
Set Error Capture [ OFF ]
520-
Else [ Collapsed: OFF ; Collapsed: OFF ]
520+
Else
521521
Set Error Capture [ OFF ]
522522
End If
523523

tests/snapshots_db_lossless/Ooe/scripts_sanitized/SaXMLDelivery - ID 50/saxmlDelivery_runPipeline - ID 53.txt.snap

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ Set Variable [ $_silent[1] ; If (
4444

4545
# Validate privilege set - must be full access
4646
# ■■■■■■■■■■ CONFIGURATION STEP (optional): Customize restrictions to run this script
47-
If [ Collapsed: OFF ; Get ( AccountPrivilegeSetName ) ≠ "[Full Access]" ]
47+
If [ Get ( AccountPrivilegeSetName ) ≠ "[Full Access]" ]
4848
Exit Script [ JSONSetElement ( "" ; [ "errorCode" ; 9 ; JSONNumber ] ; [ "message" ; "Insufficient privileges" ; JSONString ] ) ]
4949
End If
5050

@@ -82,25 +82,25 @@ Set Variable [ $missingRequired[1] ; List (
8282
If ( IsEmpty ( $owner ) ; "git account owner" ) ;
8383
If ( IsEmpty ( FilterValues ( $gitService ; "Bitbucket¶GitHub" ) ) ; "git hosting service" ) ;
8484
) ]
85-
If [ Collapsed: OFF ; not IsEmpty ( $missingRequired ) ]
85+
If [ not IsEmpty ( $missingRequired ) ]
8686
Set Variable [ $errorCode[1] ; 5 ]
8787
Set Variable [ $message[1] ; "Missing config: " & Substitute ( $missingRequired ; ¶ ; ", " ) & "." ]
8888
End If
8989

9090
# Confirm action
91-
If [ Collapsed: OFF ; $errorCode = 0 ]
92-
If [ Collapsed: OFF ; not $_silent ]
91+
If [ $errorCode = 0 ]
92+
If [ not $_silent ]
9393
Show Custom Dialog [ Message: "Run " & $repoName & " pipeline?" ; Default Button: "OK" ; Button 2: "Cancel" ]
94-
If [ Collapsed: OFF ; Get ( LastMessageChoice ) ≠ 1 ]
94+
If [ Get ( LastMessageChoice ) ≠ 1 ]
9595
Set Variable [ $errorCode[1] ; 1 ]
9696
End If
9797
End If
9898
End If
9999

100100
# Prep api call
101101
# 2024-10-07 mkos: @todo add support for an 'includeDetailsForAnalysisTools' parameter by forwarding it to the bitbucket api
102-
If [ Collapsed: OFF ; $errorCode = 0 ]
103-
If [ Collapsed: OFF ; $gitService = "Bitbucket" ]
102+
If [ $errorCode = 0 ]
103+
If [ $gitService = "Bitbucket" ]
104104
# ref: https://developer.atlassian.com/cloud/bitbucket/rest/api-group-pipelines/#api-repositories-workspace-repo-slug-pipelines-post
105105
Set Variable [ $url[1] ; "https://api.bitbucket.org/2.0/repositories/" & $owner & "/" & $repoName & "/pipelines" ]
106106
Set Variable [ $requestBody[1] ; JSONSetElement ( ""
@@ -116,7 +116,7 @@ If [ Collapsed: OFF ; $errorCode = 0 ]
116116
& " --header " & Quote ( "Content-Type: application/json" )
117117
& " --data @$requestBody"
118118
& " --dump-header $responseHeaders" ]
119-
Else [ Collapsed: OFF ; Collapsed: OFF ]
119+
Else
120120
# GitHub
121121
Set Variable [ $url[1] ; "https://api.github.com/repos/" & $owner & "/" & $repoName & "/dispatches" ]
122122
Set Variable [ $requestBody[1] ; JSONSetElement ( ""
@@ -133,7 +133,7 @@ If [ Collapsed: OFF ; $errorCode = 0 ]
133133
End If
134134

135135
# Make api call to trigger pipeline
136-
If [ Collapsed: OFF ; $errorCode = 0 ]
136+
If [ $errorCode = 0 ]
137137
Insert from URL [ Verify SSL Certificates: ON ; Select: ON ; With dialog: OFF ; Target: $response ; ⚠️ PARAMETER "URL" NOT PARSED ⚠️ ; $curlOptions ]
138138
Set Variable [ $errorCode[1] ; Get ( LastError ) ]
139139
Set Variable [ $responseStatusCode[1] ; // We would typically use a custom function here, but we wanted this script to have as few dependencies as possible
@@ -169,7 +169,7 @@ Let ( [
169169
GetAsNumber ( code )
170170
) ]
171171
Set Variable [ $isErrorResponseStatusCode[1] ; not IsEmpty ( $responseStatusCode ) and ( $responseStatusCode < 200 or $responseStatusCode > 299 ) ]
172-
If [ Collapsed: OFF ; $gitService = "GitHub" and $errorCode = 10 and not $isErrorResponseStatusCode ]
172+
If [ $gitService = "GitHub" and $errorCode = 10 and not $isErrorResponseStatusCode ]
173173
# (10) Requested data is missing is expected with GitHub because they do not return a response body
174174
Set Variable [ $errorCode[1] ; 0 // reset ]
175175
End If
@@ -284,17 +284,17 @@ Let ( [
284284
End If
285285

286286
# Extract info from success response
287-
If [ Collapsed: OFF ; $errorCode = 0 and not $isErrorResponseStatusCode ]
288-
If [ Collapsed: OFF ; $gitService = "Bitbucket" ]
287+
If [ $errorCode = 0 and not $isErrorResponseStatusCode ]
288+
If [ $gitService = "Bitbucket" ]
289289
Set Variable [ $buildNumber[1] ; JSONGetElement ( $response ; "build_number" ) ]
290290
Set Variable [ $createdOn[1] ; JSONGetElement ( $response ; "created_on" ) ]
291291
Set Variable [ $repoUrl[1] ; JSONGetElement ( $response ; "repository.links.html.href" ) ]
292292
End If
293293
End If
294294

295295
# Build error $message
296-
If [ Collapsed: OFF ; IsEmpty ( $message ) ]
297-
If [ Collapsed: OFF ; $errorCode > 1 ]
296+
If [ IsEmpty ( $message ) ]
297+
If [ $errorCode > 1 ]
298298
Set Variable [ $message[1] ; // We would typically use a custom function here, but we wanted this script to have as few dependencies as possible
299299
/**
300300
* @SIGNATURE:
@@ -603,7 +603,7 @@ Let ( [
603603
"(" & errorCode & ") " & errorMessage
604604

605605
) ]
606-
Else If [ Collapsed: OFF ; $isErrorResponseStatusCode ]
606+
Else If [ $isErrorResponseStatusCode ]
607607
Set Variable [ $errorCode[1] ; 999 & $responseStatusCode ]
608608
Set Variable [ $responseStatusMessage[1] ; "(" & $responseStatusCode & ") " & Let (
609609

@@ -728,29 +728,29 @@ Let ( [
728728
End If
729729

730730
# Display $message
731-
If [ Collapsed: OFF ; not $_silent
731+
If [ not $_silent
732732
and PatternCount ( Get ( ApplicationVersion ) ; "Data API Engine" ) = 0
733733
and PatternCount ( Get ( ApplicationVersion ) ; "Server" ) = 0 ]
734-
If [ Collapsed: OFF ; $errorCode = 0 ]
735-
If [ Collapsed: OFF ; $gitService = "Bitbucket" ]
734+
If [ $errorCode = 0 ]
735+
If [ $gitService = "Bitbucket" ]
736736
Set Variable [ $message[1] ; "The " & Quote ( $repoName ) & " pipeline is running build # " & $buildNumber & ". View in browser?" ]
737737
Show Custom Dialog [ Message: $message ; Default Button: "Dismiss" ; Button 2: "View" ]
738-
If [ Collapsed: OFF ; Get ( LastMessageChoice ) = 2 ]
738+
If [ Get ( LastMessageChoice ) = 2 ]
739739
Set Variable [ $pipelineBuildUrl[1] ; $repoUrl & "/pipelines/results/" & $buildNumber ]
740740
Open URL [ In external browser: OFF ; With dialog: OFF ; ⚠️ PARAMETER "URL" NOT PARSED ⚠️ ]
741741
End If
742-
Else [ Collapsed: OFF ; Collapsed: OFF ]
742+
Else
743743
# GitHub
744744
Show Custom Dialog [ Message: "The " & Quote ( $repoName ) & " pipeline is running." ; Default Button: "OK" ]
745745
End If
746-
Else If [ Collapsed: OFF ; not IsEmpty ( $message ) ]
746+
Else If [ not IsEmpty ( $message ) ]
747747
Show Custom Dialog [ Title: "Error" ; Message: $message ; Default Button: "OK" ]
748748
End If
749749
End If
750750

751751
# Build $data
752-
If [ Collapsed: OFF ; $errorCode = 0 ]
753-
If [ Collapsed: OFF ; $gitService = "Bitbucket" ]
752+
If [ $errorCode = 0 ]
753+
If [ $gitService = "Bitbucket" ]
754754
Set Variable [ $data[1] ; JSONSetElement ( $data
755755
; [ "buildNumber" ; $buildNumber ; JSONString ]
756756
; [ "createdOn" ; $createdOn ; JSONString ]
@@ -764,9 +764,9 @@ End If
764764
# END
765765
# ====================================================================================================
766766

767-
If [ Collapsed: OFF ; $parentScriptErrorCaptureState ]
767+
If [ $parentScriptErrorCaptureState ]
768768
Set Error Capture [ OFF ]
769-
Else [ Collapsed: OFF ; Collapsed: OFF ]
769+
Else
770770
Set Error Capture [ OFF ]
771771
End If
772772

0 commit comments

Comments
 (0)