Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
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
34 changes: 34 additions & 0 deletions .github/workflows/dotnet-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,40 @@ env:
SUMMARIZE_FAILURES: true # set to 'false' to disable summarizing failing tests

jobs:
dbf-contracts:
name: 'DBF contracts / ${{ matrix.os }} / ${{ matrix.framework }}'
runs-on: ${{ matrix.os }}
timeout-minutes: 15
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest]
framework: [net8.0, net10.0]
include:
- os: windows-latest
framework: net472
steps:
- uses: actions/checkout@v7
with:
persist-credentials: false
- uses: actions/setup-dotnet@v6
with:
dotnet-version: ${{ env.DOTNET_VERSION }}
- name: Read independent DBF fixtures and reopen CSV/XLSX output
shell: pwsh
run: |
$ErrorActionPreference = 'Stop'
$PSNativeCommandUseErrorActionPreference = $true
dotnet test OfficeIMO.Reader.Dbf.Tests/OfficeIMO.Reader.Dbf.Tests.csproj --configuration ${{ env.BUILD_CONFIGURATION }} --framework ${{ matrix.framework }} --filter 'Category!=Performance' --logger 'trx;LogFileName=dbf.trx' --results-directory TestResults/Dbf
- name: Upload test results
if: always()
uses: actions/upload-artifact@v7
with:
name: dbf-tests-${{ matrix.os }}-${{ matrix.framework }}
path: TestResults/Dbf
if-no-files-found: ignore
retention-days: 7

browser-exports:
name: 'Browser exports / Chromium, Firefox and WebKit'
runs-on: windows-latest
Expand Down
8 changes: 8 additions & 0 deletions Build/CompatibilityCatalog/ConversionApiCompileContract.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using OfficeIMO.Adf;
using DBAClientX.Dbf;
using OfficeIMO.AsciiDoc;
using OfficeIMO.Confluence;
using OfficeIMO.CSV;
Expand Down Expand Up @@ -165,6 +166,13 @@ internal static void Verify(
_ = ConfluenceContentConverter.ToHtml(confluencePage);
_ = ExcelDocumentCsvExtensions.ToExcelDocument(csv);
_ = ExcelSheetCsvExtensions.ToCsv(excel.Sheets[0]);
using (DbfDataReader dbf = DbfDataReader.Open(source))
using (StringWriter csvOutput = new StringWriter()) {
CsvDocument.WriteDataReader(csvOutput, dbf);
}
using (DbfDataReader dbf = DbfDataReader.Open(source)) {
_ = ExcelDocument.WriteDataReader(stream, dbf);
}
_ = OfficeIMO.Markup.Word.OfficeMarkupWordConverterExtensions.ToWordDocumentResult(officeMarkup);
_ = OfficeIMO.Markup.Excel.OfficeMarkupExcelConverterExtensions.ToExcelDocumentResult(officeMarkup);
_ = OfficeIMO.Markup.PowerPoint.OfficeMarkupPowerPointConverterExtensions.ToPowerPointPresentationResult(officeMarkup);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
<IsPackable>false</IsPackable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="DBAClientX.Dbf" Version="1.0.0" />
<ProjectReference Include="../../OfficeIMO.OpenDocument.Odg.Pdf/OfficeIMO.OpenDocument.Odg.Pdf.csproj" />
<ProjectReference Include="../../OfficeIMO.Adf/OfficeIMO.Adf.csproj" />
<ProjectReference Include="../../OfficeIMO.Confluence/OfficeIMO.Confluence.csproj" />
Expand Down
5 changes: 5 additions & 0 deletions Build/Test-AotProjectCoverage.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,11 @@ $nativeTools = @(
}
)
$nonNativeValidated = @(
[ordered]@{
name = 'OfficeIMO.Reader.Dbf'
classification = 'managed-cross-platform'
evidence = 'DBF ingestion is qualified through managed .NET 8 and 10 extraction and CSV/XLSX conversion tests; the DBAClientX.Dbf owner and Reader adapter are not rooted in a NativeAOT qualification host.'
}
[ordered]@{
name = 'OfficeIMO.OpenDocument.Odg.Pdf'
classification = 'managed-cross-platform'
Expand Down
1 change: 1 addition & 0 deletions Build/project.build.json
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@
"OfficeIMO.Reader.All": "3.4.X",
"OfficeIMO.Reader.AsciiDoc": "3.4.X",
"OfficeIMO.Reader.Csv": "3.4.X",
"OfficeIMO.Reader.Dbf": "3.4.X",
"OfficeIMO.Reader.DocBook": "3.4.X",
"OfficeIMO.Reader.Email": "3.4.X",
"OfficeIMO.Reader.Excel": "3.4.X",
Expand Down
2 changes: 1 addition & 1 deletion Docs/Compatibility/generated/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ dotnet run --framework net8.0 --project Build/CompatibilityCatalog/OfficeIMO.Com
| OfficeIMO.Excel.LegacyXls | 1 | 28 | [JSON](excel-legacy-xls.json) | [Markdown](excel-legacy-xls.md) |
| OfficeIMO.Excel.Xlsb | 1 | 20 | [JSON](excel-xlsb.json) | [Markdown](excel-xlsb.md) |
| OfficeIMO.PowerPoint.LegacyPpt | 1 | 56 | [JSON](powerpoint-legacy-ppt.json) | [Markdown](powerpoint-legacy-ppt.md) |
| OfficeIMO.Operations | 1 | 1385 | [JSON](package-operations.json) | [Markdown](package-operations.md) |
| OfficeIMO.Operations | 1 | 1387 | [JSON](package-operations.json) | [Markdown](package-operations.md) |
| OfficeIMO.Provenance | 1 | 11 | [JSON](provenance.json) | [Markdown](provenance.md) |
| OfficeIMO.ProtectedContent | 2 | 18 | [JSON](protected-content.json) | [Markdown](protected-content.md) |

Expand Down
40 changes: 40 additions & 0 deletions Docs/Compatibility/generated/conversion-routes.json
Original file line number Diff line number Diff line change
Expand Up @@ -1481,6 +1481,46 @@
"browserAvailable":false,
"agentDiscoverable":true
},
{
"id":"dbf-csv",
"source":"DBF/xBase",
"target":"CSV",
"inputKind":"File",
"sourceExtensions":[ ".dbf" ],
"targetExtension":".csv",
"packageId":"OfficeIMO.CSV",
"api":"DbfDataReader.Open(path), then CsvDocument.WriteDataReader(writer, reader, options)",
"description":"Export typed DBF rows and supported memos through DBAClientX.Dbf; binary values become Base64.",
"fidelity":"Semantic",
"textFormatting":"DataOnly",
"textFormattingContract":"DBF carries typed table values, not document typography or layout; binary values become Base64, and DBF indexes, deletion flags and native schema metadata are not exported.",
"supportLevel":"Targeted",
"supportEvidence":"Independent Python-produced dBASE III, FoxPro 2 and Visual FoxPro fixtures exercise typed rows, deleted-row filtering, DBT/FPT memos, binary Base64, CSV reopen, and streaming/buffered XLSX reopen and Open XML validation.",
"knownLimitations":"Requires DBAClientX.Dbf's bounded field profiles. Native application acceptance and Visual FoxPro 31/32 generations remain unqualified. Output omits DBF indexes, deletion flags and native schema metadata; CSV nulls need a selected marker, and XLSX follows Excel numeric precision and cell text limits.",
"resultContract":"void",
"browserAvailable":false,
"agentDiscoverable":true
},
{
"id":"dbf-xlsx",
"source":"DBF/xBase",
"target":"XLSX",
"inputKind":"File",
"sourceExtensions":[ ".dbf" ],
"targetExtension":".xlsx",
"packageId":"OfficeIMO.Excel",
"api":"DbfDataReader.Open(path), then ExcelDocument.WriteDataReader(stream, reader, options)",
"description":"Create a workbook from typed DBF rows and supported memos through DBAClientX.Dbf.",
"fidelity":"Editable",
"textFormatting":"DataOnly",
"textFormattingContract":"DBF carries typed table values, not document typography or layout; binary values become Base64, and DBF indexes, deletion flags and native schema metadata are not exported.",
"supportLevel":"Targeted",
"supportEvidence":"Independent Python-produced dBASE III, FoxPro 2 and Visual FoxPro fixtures exercise typed rows, deleted-row filtering, DBT/FPT memos, binary Base64, CSV reopen, and streaming/buffered XLSX reopen and Open XML validation.",
"knownLimitations":"Requires DBAClientX.Dbf's bounded field profiles. Native application acceptance and Visual FoxPro 31/32 generations remain unqualified. Output omits DBF indexes, deletion flags and native schema metadata; CSV nulls need a selected marker, and XLSX follows Excel numeric precision and cell text limits.",
"resultContract":"ExcelDataSetImportResult",
"browserAvailable":false,
"agentDiscoverable":true
},
{
"id":"officemarkup-docx",
"source":"OfficeIMO Markup",
Expand Down
2 changes: 2 additions & 0 deletions Docs/Compatibility/generated/conversion-routes.md
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,8 @@ Schema version: 9
| confluence-html | Confluence | HTML | OfficeIMO.Confluence | Semantic | SyntaxSubset | Preserves the text styling represented by the source and destination profiles; unsupported native decoration variants, arbitrary CSS presentation, and format-specific layout are reported or simplified. | Targeted | Materialized Confluence page and body fixtures exercise ADF and storage representations through the shared ADF, Markdown, and HTML converters with combined diagnostics. | This is content-body conversion, not live page synchronization; Confluence-only macros, layouts, extensions, and presentation outside the supported ADF/storage subset may be simplified. | No | `ConfluenceContentConverter.ToHtml(page)` | ConfluenceContentConversionResult<string> | Project a materialized Confluence page body to HTML with fidelity diagnostics. |
| csv-xlsx | CSV | XLSX | OfficeIMO.Excel.Csv | Editable | DataOnly | CSV and TSV carry values, delimiters, and records only; font family, size, color, emphasis, decoration, scripts, casing metadata, and layout are intentionally not representable. | Established | Delimited-data fixtures cover streams, files, delimiter detection, typed cell import, worksheet-range export, reopen behavior, and cancellation. | CSV and TSV have no font, rich-text, formula, multi-sheet, drawing, or layout model; those workbook semantics are intentionally absent from CSV output. | No | `CsvDocument.Load(stream).ToExcelDocument(options)` | ExcelDocument | Import delimited values into an editable workbook. |
| xlsx-csv | XLSX | CSV | OfficeIMO.Excel.Csv | Semantic | DataOnly | CSV and TSV carry values, delimiters, and records only; font family, size, color, emphasis, decoration, scripts, casing metadata, and layout are intentionally not representable. | Established | Delimited-data fixtures cover streams, files, delimiter detection, typed cell import, worksheet-range export, reopen behavior, and cancellation. | CSV and TSV have no font, rich-text, formula, multi-sheet, drawing, or layout model; those workbook semantics are intentionally absent from CSV output. | No | `ExcelDocument.Load(stream).Sheets[0].ToCsv(options)` | string | Export a worksheet used range as delimited values. |
| dbf-csv | DBF/xBase | CSV | OfficeIMO.CSV | Semantic | DataOnly | DBF carries typed table values, not document typography or layout; binary values become Base64, and DBF indexes, deletion flags and native schema metadata are not exported. | Targeted | Independent Python-produced dBASE III, FoxPro 2 and Visual FoxPro fixtures exercise typed rows, deleted-row filtering, DBT/FPT memos, binary Base64, CSV reopen, and streaming/buffered XLSX reopen and Open XML validation. | Requires DBAClientX.Dbf's bounded field profiles. Native application acceptance and Visual FoxPro 31/32 generations remain unqualified. Output omits DBF indexes, deletion flags and native schema metadata; CSV nulls need a selected marker, and XLSX follows Excel numeric precision and cell text limits. | No | `DbfDataReader.Open(path), then CsvDocument.WriteDataReader(writer, reader, options)` | void | Export typed DBF rows and supported memos through DBAClientX.Dbf; binary values become Base64. |
| dbf-xlsx | DBF/xBase | XLSX | OfficeIMO.Excel | Editable | DataOnly | DBF carries typed table values, not document typography or layout; binary values become Base64, and DBF indexes, deletion flags and native schema metadata are not exported. | Targeted | Independent Python-produced dBASE III, FoxPro 2 and Visual FoxPro fixtures exercise typed rows, deleted-row filtering, DBT/FPT memos, binary Base64, CSV reopen, and streaming/buffered XLSX reopen and Open XML validation. | Requires DBAClientX.Dbf's bounded field profiles. Native application acceptance and Visual FoxPro 31/32 generations remain unqualified. Output omits DBF indexes, deletion flags and native schema metadata; CSV nulls need a selected marker, and XLSX follows Excel numeric precision and cell text limits. | No | `DbfDataReader.Open(path), then ExcelDocument.WriteDataReader(stream, reader, options)` | ExcelDataSetImportResult | Create a workbook from typed DBF rows and supported memos through DBAClientX.Dbf. |
| officemarkup-docx | OfficeIMO Markup | DOCX | OfficeIMO.Markup.Word | Editable | EditableEquivalent | Authors editable native typography, including family, size, color, emphasis, decoration, script, and casing, in the generated Office document; diagnostics identify profile-specific approximations and omissions. | Established | Typed profile fixtures verify parser diagnostics, editable destination artifacts, font family/size/color, bold, italic, underline variants, strike, scripts, case transforms, small caps where native, and target-specific layout. | OfficeIMO Markup is a directed authoring format rather than a lossless Office round trip; unsupported blocks and destination-only effects are diagnosed, simplified, or omitted according to exporter options. | No | `OfficeMarkupParser.Parse(markup, options).Document.ToWordDocumentResult(exportOptions)` | OfficeMarkupConversionResult<WordDocument> | Render document-profile OfficeIMO Markup into an editable Word document. |
| officemarkup-xlsx | OfficeIMO Markup | XLSX | OfficeIMO.Markup.Excel | Editable | EditableEquivalent | Authors editable native typography, including family, size, color, emphasis, decoration, script, and casing, in the generated Office document; diagnostics identify profile-specific approximations and omissions. | Established | Typed profile fixtures verify parser diagnostics, editable destination artifacts, font family/size/color, bold, italic, underline variants, strike, scripts, case transforms, small caps where native, and target-specific layout. | OfficeIMO Markup is a directed authoring format rather than a lossless Office round trip; unsupported blocks and destination-only effects are diagnosed, simplified, or omitted according to exporter options. | No | `OfficeMarkupParser.Parse(markup, options).Document.ToExcelDocumentResult(exportOptions)` | OfficeMarkupConversionResult<ExcelDocument> | Render workbook-profile OfficeIMO Markup into an editable Excel workbook. |
| officemarkup-pptx | OfficeIMO Markup | PPTX | OfficeIMO.Markup.PowerPoint | Editable | EditableEquivalent | Authors editable native typography, including family, size, color, emphasis, decoration, script, and casing, in the generated Office document; diagnostics identify profile-specific approximations and omissions. | Established | Typed profile fixtures verify parser diagnostics, editable destination artifacts, font family/size/color, bold, italic, underline variants, strike, scripts, case transforms, small caps where native, and target-specific layout. | OfficeIMO Markup is a directed authoring format rather than a lossless Office round trip; unsupported blocks and destination-only effects are diagnosed, simplified, or omitted according to exporter options. | No | `OfficeMarkupParser.Parse(markup, options).Document.ToPowerPointPresentationResult(exportOptions)` | OfficeMarkupPowerPointConversionResult | Render presentation-profile OfficeIMO Markup into an editable PowerPoint presentation. |
Expand Down
28 changes: 28 additions & 0 deletions Docs/Compatibility/generated/package-operations.json
Original file line number Diff line number Diff line change
Expand Up @@ -772,6 +772,20 @@
"extensions":[".br",".brotli",".csv",".deflate",".gz",".gzip",".zlib"],
"limitation":""
},
{
"id":"conversion:dbf-csv",
"packageId":"OfficeIMO.CSV",
"formatId":"DBF/xBase",
"targetFormatId":"CSV",
"capabilityId":"dbf-csv",
"operation":"Convert",
"state":"Partial",
"publicApi":"DbfDataReader.Open(path), then CsvDocument.WriteDataReader(writer, reader, options)",
"evidence":"Independent Python-produced dBASE III, FoxPro 2 and Visual FoxPro fixtures exercise typed rows, deleted-row filtering, DBT/FPT memos, binary Base64, CSV reopen, and streaming/buffered XLSX reopen and Open XML validation.",
"sourceCatalog":"OfficeConversionCapabilityCatalog",
"extensions":[".dbf"],
"limitation":"Requires DBAClientX.Dbf's bounded field profiles. Native application acceptance and Visual FoxPro 31/32 generations remain unqualified. Output omits DBF indexes, deletion flags and native schema metadata; CSV nulls need a selected marker, and XLSX follows Excel numeric precision and cell text limits."
},
{
"id":"conversion:confluence-html",
"packageId":"OfficeIMO.Confluence",
Expand Down Expand Up @@ -2844,6 +2858,20 @@
"extensions":[".epub"],
"limitation":"Image output is intentionally flattened. Unsupported source structure, remote or missing resources, and advanced source-specific layout remain approximated or diagnosed."
},
{
"id":"conversion:dbf-xlsx",
"packageId":"OfficeIMO.Excel",
"formatId":"DBF/xBase",
"targetFormatId":"XLSX",
"capabilityId":"dbf-xlsx",
"operation":"Convert",
"state":"Partial",
"publicApi":"DbfDataReader.Open(path), then ExcelDocument.WriteDataReader(stream, reader, options)",
"evidence":"Independent Python-produced dBASE III, FoxPro 2 and Visual FoxPro fixtures exercise typed rows, deleted-row filtering, DBT/FPT memos, binary Base64, CSV reopen, and streaming/buffered XLSX reopen and Open XML validation.",
"sourceCatalog":"OfficeConversionCapabilityCatalog",
"extensions":[".dbf"],
"limitation":"Requires DBAClientX.Dbf's bounded field profiles. Native application acceptance and Visual FoxPro 31/32 generations remain unqualified. Output omits DBF indexes, deletion flags and native schema metadata; CSV nulls need a selected marker, and XLSX follows Excel numeric precision and cell text limits."
},
{
"id":"protection:vba-signature:excel:create",
"packageId":"OfficeIMO.Excel",
Expand Down
Loading
Loading