CSV Plugin prototype
Source Code​
https://github.com/pact-foundation/pact-plugins/tree/main/plugins
This is an example plugin supporting creating and matching comma-separated value text payloads.
Building the plugin​
The plugin is built with Rust. Just run cargo build --release. This will create the plugin binary file pact-plugin-csv
in the target/release/ directory.
Installing the plugin​
The plugin binary and manifest file pact-plugin.json need to be copied into the $HOME/.pact/plugins/csv-0.0.1 directory. You can download
those from the release for the plugin.
Running with a development version of the plugin​
If you build the plugin without the --release, this will create a debug version in the target/debug directory.
Copy the manifest file pact-plugin.json into the $HOME/.pact/plugins/csv-0.0.1 directory. If you
then edit that file, and set the entryPoint to the absolute path of the pact-plugin-csv binary in target/debug,
you can then make changes to the plugin, build it, and then all test projects will use that version.
Example Projects​
There are three example projects in examples/csv that use this plugin:
- csv-consumer-jvm - consumer written in Java
- csv-consumer-rust - consumer written in Rust
- csv-provider - provider written in Rust
CSV matching definitions​
The plugin matches the columns of the CSV data using matching rule definitions. The columns can be specified by header (if the CSV has a header row) or by index (starting with 1).
Using the CSV from the example projects, it has 3 columns: Name, Number and Date. The matching rules can be specified by (in pseudo config)
If using headers:
"response.contents": {
  "pact:content-type": "text/csv",                               // Set the content type to CSV
  "csvHeaders": true,                                            // We have a header row
  "column:Name": "matching(type,'Name')",                        // Column with header Name must match by type (which is actually useless with CSV)
  "column:Number", "matching(number,100)",                       // Column with header Number must match a number format
  "column:Date", "matching(datetime, 'yyyy-MM-dd','2000-01-01')" // Column with header Date must match an ISO format yyyy-MM-dd
}
Without headers:
"response.contents": {
  "pact:content-type": "text/csv",
  "csvHeaders": false,
  "column:1": "matching(type,'Name')",
  "column:2": "matching(number,100)",
  "column:3": "matching(datetime, 'yyyy-MM-dd','2000-01-01')"
}
Compatibility​
Supported Platforms
| OS | Architecture | Supported | Pact CSV Plugin Version | 
|---|---|---|---|
| OSX | x86_64 | ✅ | All | 
| Linux | x86_64 | ✅ | All | 
| Windows | x86_64 | ✅ | All | 
| OSX | arm64 | ✅ | >=0.0.1 | 
| Linux | arm64 | ✅ | >=0.0.4 | 
| Windows | arm64 | ✅ | >=0.0.6 | 
| Alpine | x86_64 | ✅ | >=0.0.6 | 
| Alpine | arm64 | ✅ | >=0.0.6 | 
Note: From v0.0.6, Linux executables are statically built with musl and as designed to work against glibc (eg, Debian) and musl (eg, Alpine) based distos.