Changes made prior to 2021-03-09 may ever be added retrospectively, but consult Github Releases for the project in the indefinite meantime.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Planned for a future release
- Unreleased
- Releases
- 6.0.0 - 2026-02-12
- 5.1.0 - 2025-11-20
- 5.0.0 - 2025-09-10
- 4.2.0 - 2025-06-03
- 4.1.0 - 2025-03-28
- 4.0.1 - 2023-09-13
- 4.0.0 - 2023-09-11
- 3.3.0 - 2023-02-17
- 3.2.2 - 2022-09-23
- 3.2.1 - 2022-09-21
- 3.2.0 - 2022-09-20
- 3.1.0 - 2022-09-20
- 3.0.0 - 2022-08-26
- 2.9.0 - 2022-07-28
- 2.8.0 - 2022-05-13
- 2.7.2 - 2022-04-05
- 2.7.1 - 2022-03-10
- 2.6.1 - 2022-03-09
- 2.6.0 - 2022-02-24
-
Removal of
sepandmultivalparams fromDeduplicate::Fields(deprecated in 5.0.0) -
Removal of
sep&multivalparams fromClean::RegexpFindReplaceFieldVals(deprecated in 5.0.0) -
Removal of
multivalparam fromPrepend::ToFieldValue(deprecated in 5.0.0) -
Removal of
sep&multivalparams fromExplode::FieldValuesToNewRows(deprecated in 5.0.0)
These changes are merged into the main branch, but have not been released.
After merging pull requests (PRs) that are not immediately released into main, a tag is added appending the PR# to the current release.
For example, if the release version/tag is 3.2.1, and PR# 107 is merged without a new release, the state of the codebase after that merge will be tagged as 3.2.1.107.
-
When creating missing directories for Destination classes that write files, write the whole path to the target directory if it does not exist.
-
Do not warn about missing
delimparameter inPrepend::ToFieldValuetransform whenmultivalparam is not given. In PR#229 -
Make
Clean::DowncaseFieldValuesandDelete::EmptyFieldValuestransforms ignore nonexistent fields instead of failing. In PR#229 -
Fix interaction of occs, examples and compiling in
Deduplicate::Tabletransform. In PR#229
-
Removal of
sepparameter inCombineValues::FromFieldsWithDelimiterandCombineValues::FullRecord. In PR#214 -
Removal of
sepparameter inDeduplicate::GroupedFieldValues(deprecated in 3.3.0) -
Removal of
multivalparameter inCspace::NormalizeForId(deprecated in 3.3.0)
-
Report::Fieldstransform. In PR#223 -
Merge::IncrementingFieldtransform. In PR#217 -
FileRegistry.replace_entries method. In PR#216
-
Distinction between
:verboseand:debugjob verbosity. In PR#216 -
deduplicateparameter toCombineValues::FromFieldsWithDelimiter. In PR#214 -
positional_compareparameter toDelete::FieldValueIfEqualsOtherFieldtransform In PR#212 -
Ability to make
Deduplicate::Tablecompile all unique values of all fields in a duplicate row set, and write them into the kept row. In PR#211
-
Fix failure of
thor jobs tagged_andcommand related to pre-finalized registry Hashes being returned, rather than FileRegistryEntryObjects. In PR#226 -
Stop
Delete::FieldValueMatchingRegexptransform from failing if a given row does not contain one of the keys given infieldsparameter. In PR#225 -
Create directories for Destination classes that write files, if said directories do not exist. In PR#221
-
#203 - Iterative Cleanup Jobs with same name defined in BaseProject and DependentProject cause error on file registration
-
Added example value and occurrence count to Deduplicate::Table transform (PR#202)
-
Added
#replace_entry_x_with_entry_ymethod toFileRegistry(PR#204) -
Added
final_lookup_sourcesmethod in IterativeCleanup mixin, allowing for configurable pre/post transformation logic forcleanup_base_name__finaljob to include transforms that use lookup tables. (PR#209)
-
Role term and subordinate body subfields for meeting names fixed in default config.
-
IterativeCleanupnow automatically extends its extending module withDry::Configurableprior to defining settings that depend onDry::Configurable. (PR#192) -
Kiba::Extend::Job.output?no longer fails if given job returns Nil (PR#194) -
Reshape::FieldsToFieldGroupWithConstantconstant value is no longer added to rows with no values in the renamed/remapped value fields, when fieldmap length == 1. (PR#195)
-
MARC::LanguageCodeLookuptransform -
Ability to pass
findargument toClean::RegexpFindReplaceFieldValsas aRegexpobject. Not sure why this was not the default initial behavior, but here we are! (PR#196) -
Ability to pass
delimargument toAppend::ToFieldValueto trigger multi-value treatment (PR#200)
-
MARC name extraction transforms now supply "uniform title name" as a role term in fields having a $t value. This change supports the fact that some applications may not wish to treat these values as standalone names, and this makes it possible to filter out these values. (PR#199)
-
Simplification of requirements for
IterativeCleanupusage -
Complete documentation for
IterativeCleanup -
Switch to kramdown Markdown conversion for YARD
-
Nested
job.show_me,job.tell_me, andjob.verbosityconfig settings have been removed. (They were deprecated in 3.2.0) -
Kiba::Common::SourcesandKiba::Common::Destinationsare no longer supported. To use an external source or destination class, subclass it in aKiba::Extendsource or destination class that extendsKiba::Extend::SourceableorKiba::Extend::Destinationable(PR#139) -
Using a supplied file registry entry as the destination of a job raises an error, since the definition of a supplied entry is that it is not created by a job in the project. (PR#139)
-
Destinations::Marc(PR#138) -
Destinations::Lambda(PR#139)
-
Sources::CSV(PR#139) -
Sources::Enumerable(PR#139) -
Sources::JsonDir(PR#140)
-
Jobs::JsonToCsvJob(PR#140)
-
Clean::EnsureConsistentFields(PR#140) -
Delete::FieldnamesStartingWith(PR#156) -
Explode::RowsFromGroupedMultivalFields(PR#165) -
Fingerprint::FlagChanged(PR#155) -
Fingerprint::MergeCorrected(PR#157) -
Marc::FilterRecords::ById(PR#138) -
Marc::FilterRecords::WithLambda(PR#138) -
Marc::ExtractMeetingNameData(PR#164) -
Marc::ExtractOrgNameData(PR#137) -
Marc::ExtractPersonNameData(PR#137) -
Marc::ExtractNameData(PR#137) -
Marc::ExtractSubfieldsFromField(PR#141) -
Replace::NormWithMostFrequentlyUsedForm(PR#167) -
Sort::ByFieldValue(PR#151) -
Split::PublicationStatementtransform (PR#142)
Transforms::Helpers-
OrgNameChecker(PR#148) -
PersonNameChecker(PR#161)
-
CombineValues::FromFieldWithDelimitercan now takesources: :all, and will provide space as a defaultdelimif not provided (PR#147) -
CombineValues::FromFieldWithDelimitercan now takedelete_sourcesandprepend_source_field_nameargs (PR#147) -
:modeparameter added toJobs::BaseJob(PR#154, PR#157)
-
Utility classes to clean ISBD trailing punctuation from name and role term values extracted from MARC data (PR#141)
-
Kiba::Extend::Job.output?convenience method (PR#150) -
Job duration report (added to normal and verbose job run) (PR#154, PR#157)
-
IterativeCleanupmixin (PR#180)
-
Transforms that take an
actionargument now mix in the newActionArgumentablemodule and validate the argument values in a consistent way (PR#138) -
Name and role term values extracted from MARC data by subclasses of
Transforms::Marc::ExtractBaseNameDataare run throughUtils::MarcNameCleanerandUtils::MarcRoleTermCleaner(PR#141) -
Fingerprint::Addnow passes in default delim: U+241F / E2 90 9F / Symbol for Unit Separator (PR#155) -
Fingerprint::Decodenow passes in default delim (U+241F / E2 90 9F / Symbol for Unit Separator), and default prefix (fp) (PR#155) -
Fingerprint::FlagChangedcan now be passed anignore_fieldsparameter indicating fields included in the fingerprint, but which should not be compared to current values and flagged (PR#168)
-
Fixes #46 - CombineValues::FullRecord with multi-sources can result in different values (PR#147)
-
Fixes issue where job registry entry with a Marc source and CSV destination could not be used as a source or lookup in jobs (PR#137)
-
Fixes issue in
StringValue::ToArraytransform where delim=nil was not correctly being calculated (PR#145) -
Fixes #152: Fingerprint::Decode error: Encoding::CompatibilityError: incompatible character encodings: ASCII-8BIT and UTF-8 (PR#153)
-
Fixes #162: failure of
Delete::EmptyFieldstransform when passed a source with no rows -
Fixes #179: renaming field with same fieldname in
fromandtoresulted in the field being deleted (PR#181)
-
sepparameter will be replaced bydeliminCombineValues::FromFieldWithDelimiterandCombineValues::FullRecord(PR#147)
-
Adds
Kiba::Extend::ErrModmodule to be included intoKiba::Extend-specific error classes. This allows us to subclass each application-specific error to the semantically appropriate Ruby exception class, while retaining the ability to identify/scope/rescue only application-specific errors. (PR#138) -
Add
:infomethod toKiba::Extend::ErrModmodule, to print error type, message, and backtrace to STDOUT in a consistent way. (PR#141) -
Set up standardrb linting, with Kristina’s standard (ha) minor overrides (PR#169)
-
StringValue::ToArraytransform (PR#111) -
Two mixin modules to Transforms to support deprecating non-preferred parameter signatures:
-
Transforms::SepDeprecatable(PR#124) -
Transforms::MultivalPlusDelimDeprecatable(PR#124)
-
-
Utils::StringNormalizerservice class (PR#124) -
ignore_caseandnormalizedparameters forDeduplicate::GroupedFieldValues(PR#124) -
Options to
Clean::StripFieldstransform (PR#129):-
Ability to pass
fields: :allto strip all fields in a table -
Ability to turn on multivalue processing by passing in a
delimvalue
-
-
More country mappings to
Cspace::AddressCountrytransform (PR#132) -
Marcsource,MarcJob,Kiba::Extend::Marcconfiguration module,Utils::MarcIdExtractor, and an initialMarc::Extract245Titletransform (PR#134)
-
Catch
Merge::MultiRowLookuptransform created with emptyfieldmapand raise error on initialization, rather than letting it blow upUtils::Fieldsetlater (PR#127) -
Fix #121 (PR#122)
-
sepparameter inDeduplicate::GroupedFieldValues(PR#124) -
multivalparameter inCspace::NormalizeForId(PR#124)
-
Fraction::ToDecimaltransform (and supportingUtils::ExtractFractionsandData::ConvertibleFractionclasses) (PR#108) -
yardspecgem to support running YARD examples as RSpec tests (PR#107) -
Branch coverage to
simplecovsetup (PR#107)
-
Configurable pre-job task handling
-
Kiba::Extend::Registry::FileRegistry.finalizemethod -
Unnested
job_show_me,job_tell_me, andjob_verbosityconfig settings.
-
Add publicly readable
srcrowsandoutrowsonKiba::Extend::Jobs::BaseJob(inherited by all job types). This makes it possible to do things like this in client projects:
job = Kiba::Extend::Command::Run.job(:prep__objects)
puts "Some records omitted" if job.outrows < job.srcrowsThese attributes were previously only accessible via:
job.context.instance_variable_get(:@srcrows)-
See the list of deleted transforms, helpers, and params below.
-
Split::IntoMultipleColumnstransform: no longer removes spaces between split segments that end up collapsed left or right. This was a bug, but fixing it could cause jobs relying on that behavior (or introducing subsequent transforms to deal with it) to fail or generate unexpected results.
-
Warn::UnlessFieldValueMatchestransform -
multimodeparameter forUtils::FieldValueMatcher -
Support for passing Procs in as file registry entry values (or as a value in a :dest_special_opts Hash). See [NOTE under "File Registry Data hashes in your ETL application](https://lyrasis.github.io/kiba-extend/file.file_registry_entry.html#file-registry-data-hashes-in-your-etl-application)
-
delimparameter forReplace::FieldValueWithStaticMappingtransform
-
Split::IntoMultipleColumns: If empty string is passed in as the value to be split, all newly created fields will be nil
-
Split::IntoMultipleColumnsno longer removes existing spaces between segments that get right/left collapsed -
Fixes incorrect value splitting in
Split::IntoMultipleColumns -
Reshape::FieldsToFieldGroupWithConstantnow works with single source fields (i.e. listed infieldmapparam) with nil values
-
Transforms
-
Clean::DelimiterOnlyFields -
CombineValues::AcrossFieldGroup -
Reshape::CollapseMultipleFieldsToOneTypedFieldPair -
FilterRows::FieldValueGreaterThan
-
-
Transform Helpers
-
Helpers.delim_only? -
Helpers.field_values
-
-
Parameters
-
multivalandsepparameters fromReplace::FieldValueWithStaticMappingtransform
-
-
Removes Hash
conditionsparameter andsepparameter fromMerge::ConstantValueConditionaltransform, replacing with lambda Procconditionparameter. In PR#88 -
Only relevant if you have called global
Kiba::Extend::DELIMorKiba::Extend::CSVOPTfrom outside Kiba::Extend for some reason. These global constants were finally removed from the final few places they were being used within kiba-extend, and they have been removed from the application setup.
-
New service object classes in
Transforms::Helpersin PR#93:-
DelimOnlyChecker -
FieldValueGetter -
RowFieldEvennessChecker
-
-
New transforms:
-
Clean::EvenFieldValues(in PR#93) -
Collapse::FieldsToRepeatableFieldGroup(in PR#93) -
Collapse::FieldsToTypedFieldPair(in PR#93) -
Collapse::FieldsWithCustomFieldmap(in PR#93) -
Deduplicate::FlagAll(in PR#93) -
Delete::DelimiterOnlyFieldValues(in PR#93) -
Delete::EmptyFieldGroups(in PR#93) -
FilterRows::AllFieldsPopulated(in PR#85) -
FilterRows::AnyFieldsPopulated(in PR#85) -
FilterRows::WithLambda(in PR#85) -
Merge::ConstantValues(in PR#84) -
Replace::EmptyFieldValues(in PR#93) -
Reshape::FieldsToFieldGroupWithConstant(in PR#93) -
Warn::UnevenFields(in PR#93)
-
-
stripextracsv converter to do aggressive stripping of csv field values, without converting 'NULL' strings tonilValues. In PR#91 -
ignore_caseparameter toFilterRows::FieldMatchRegexptransform. Defaults tofalsefor backward compatibility. In PR#85
-
BUGFIX:
Utils::Lookup::RowSorterno longer fails if all rows given to sort have blank values. In PR#93 -
BUGFIX:
Clean::EmptyFieldGroupswas broken ifsep=|anduse_nullvalue=true. In PR#93 -
BUGFIX: No longer runs the same dependency job multiple times. In PR#90
-
In
Merge::ConstantValueConditionaltransform, lambda Proc is passed in ascondition, rather thanconditions. In PR#88 -
If source data is an ISO 3166 code,
Cspace::AddressCountrypasses that value through to target. Adds some more lookup keys to support client data set. In PR#87 -
Merge::ConstantValuewarns (once per transform) iftargetis an existing field containing any data. In PR#84 -
BUGFIX:
RowSorterchecks for presence ofsortfieldand raises error if it doesn’t exist, rather than trying to proceed and blowing up. In PR#83
-
Removes Hash
conditionsparameter andsepparameter fromMerge::ConstantValueConditionaltransform, replacing with lambda Procconditionparameter. In PR#88
-
Deprecates
Helpers.delim_only?, replacing withHelpers::DelimOnlyCheckerservice class. In PR#93 -
Deprecates
Clean::DelimiterOnlyFields, replacing withDelete::DelimiterOnlyFieldValues. In PR#93 -
Deprecates
Reshape::CollapseMultipleFieldsToOneTypedFieldPair, replacing withCollapse::FieldsToTypedFieldPair. In PR#93 -
Deprecates
CombineValues::AcrossFieldGroup, replacing withCollapse::FieldsWithCustomFieldmap. In PR#93 -
Deprecates
FilterRows::FieldValueGreaterThan. In PR#86
-
Count::MatchingRowsInLookuppreviously returned Integers. Now it defaults to returning Strings, since many of the transforms assume all field values will be strings. If you were callingCount::MatchingRowsInLookupin a job and working with the integer result as an integer within that job, this will be a breaking change. In PR#69
-
Lookup::RowSorterclass and the ability to pass it in as an argument toMerge::MultiRowLookuptransform to explicitly control the order in which matching rows are merged. In PR#82 -
Ability to pass in a Lambda as a
conditionsargument on transforms. This provides a more straightforward and infinitely flexible alternative to the horrible, poorly documented Hash expression of conditions. In PR#82 -
Add
Rename::Fieldstransform. In PR#75 -
Add
Name::SplitInvertedandName::ConvertInvertedToDirectFormtransforms. In PR#74 -
Add
Allablemixin module for transforms that acceptfields: :all. In PR#73 -
Add
Cspace::AddressCountrytransform. In PR#72. Made more configurable in PR#75 -
Add
null_placeholderparameter toMerge::MultiRowLookup, which will replace any blank values in merged field values with the given string. Useful for building repeating field groups in CollectionSpace migrations. In PR#70
-
Raise
LookupTypeErrorwhenMerge::MultiRowLookupis called withlookupparameter that is not a Hash. In PR#81 -
Improved exception handling when
MissingDependencyErroris raised. In PR#80 -
Improved error message for
Copy::Field. In PR#78 -
Add improved error handling in jobs when a transform raises a
Kiba::Extend::Error. In PR#77. -
Improved exception handling when
KeyNotRegisteredErroris raised, as per GH#64. In PR#79 -
More informative error message if you pass in a non-existent
usinghash when callingDeduplicate::Flagtransform. In PR#76 -
Rename::Fieldnow warns if thetofield already exists and will be overwritten. In PR#75 -
Use zeitwerk for autoloading. In PR#75. Bugfix for use in projects implemented in PR#76 via eager autoload.
-
Make
Delete::EmptyFieldValuesAllable. In PR#73 -
If given an "existing" field that does not exist,
Rename::Fieldtransform will warn about it, but not throw an exception. This supports building reusable jobs where the data may be slightly different from use to use. In PR#71 -
BUGFIX:
Clean::RegexpFindReplaceFieldValsnow skips non-string field values instead of trying to call:gsubon them and failing withNoMethodError. In PR#68
-
When setting up a file registry hash,
creatormay be aHashif you need to pass keyword arguments to your job. See File registry entry reference for more info and examples. In PR#67 -
When setting up a file registry hash,
creatormay be aModuleif the relevant job is a private instance method named with the configureddefault_job_method_name(The default is:job). See File registry entry reference for more info and examples. In PR#67 -
default_job_method_nameconfig setting. In PR#67 -
Fingerprint::AddandFingerprint::Decodetransforms. In PR#65 -
override_app_delim_checkparam toFingerprint::Addfor backward compatibility with a project I want to be able to use this transform. Defaults tofalse. PR#66
-
Kiba::Extend::Utils::MultiSourceNormalizerandKiba::Extend::Jobs::MultiSourcePrepJobto handle normalization of fields across multiple sources to be used in a multiple-source job with aKiba::Extend::Destinations::CSVdestination (in PR#60) -
explicit_noargument toKiba::Extend::Transforms::Deduplicate::Flag. Defaults totruefor backward compatibility (in PR#60) -
amazing_printdependency (in PR#61)
-
mvdelimkeyword argument removed fromPrepend::ToFieldValue, and replaced bymultivalanddelim
-
Changes to keyword argument names for
Delete::FieldValueIfEqualsOtherField(in PR#57)-
sepbecomesdelim -
case_sensitivebecomescasesensitive
-
-
multivalparameter added toCspace::NormalizeForIDtransform (in PR#49) -
new
Count::FieldValuestransform (in PR#50) -
new
Append::ConvertedValueAndUnittransform (in PR#51) -
preparation of the file registry:
-
test Clean::RegexpFindReplaceFieldVals to replace
\n(in PR#55) -
Helpers.empty?method, which returns true/false for a given string value (without treating delimiter values as special) (in PR#57) -
fieldskeyword argument toDelete::FieldsExcept, which should be used going forward instead ofkeepfields(in PR#57) -
nullvaluesetting toKiba::Extend.config. Default value is '%NULLVALUE%' (in PR#57) -
usenullkeyword argument toDelete::EmptyFieldValues(in PR#57) -
delimkeyword argument toDelete::EmptyFieldValues, which should be used going forward instead ofsep(in PR#57) -
documentation for
Deletetransforms (in PR#57) -
Delete::BlankFieldstransform (in PR#57)
-
move/alias
Merge::CountOfMatchingRowstoCount::MatchingRowsInLookup(in PR#50) -
Delete::FieldsExceptcan accept a single symbol as value forfieldskeyword argument (in PR#57) -
Delete::EmptyFieldValueswill default toKiba::Extend.delimas delimiter if none given explicitly (in PR#57) -
keyword argument names for
Delete::FieldValueIfEqualsOtherField(in PR#57)-
sepbecomesdelim -
case_sensitivebecomescasesensitive
-