- Add max major version constraints to dependencies. #296
- Remove unused
syntax_treegems from development. #297 - Simplify tiered lines elider. #302
- Support elision for flat line trees. #300 by @gschlager
- Fix integration snippet indentation. #299 by @gschlager
- Abbreviate ActionDispatch::Request inspection. #294
- Add official Ruby 3.4 support. #289 by @olleolleolle
- Fix hash diffing algorithm. #293
- Fix bundler gem caching in CI. #289 by @olleolleolle
- Dropped support for Ruby 3.0, which reached EOL in April 2024. #280
- Add official Rails 7.1 support. #278
- Add official Rails 7.2 support. #279
- Add official Rails 8.0 support. #281
- Fix ActiveRecord's
attributes_for_super_diffand tree builders related to Active Records to handle models that do not have a primary key. #282 by @atranson-electra - Fix failure case for chained matchers. #288
- Fix
loggerdependency issues in CI. #277 - Updated permalink to rspec differ in README.md #258 by @sealocal
- Tweak
sqlite3andappraisaldev dependencies. #287
- Implement RSpec 3.13.0+ compatibility. #258
- Filter super_diff from RSpec backtrace. #275 by @FlorinPopaCodes
- Improve inspection of Module. #263 by @phorsuedzie
- Fix multiline string diff with blank lines. #266
- Improve inspection of Range objects. #267 by @lucaseras
- Skip diffing of more un-diffable types. #273 by @lucaseras
- Switch from Prettier to Rubocop. #269
- Fix outdated reference in documentation. #270 by @emmanuel-ferdman
- Replace Zeus with forking strategy for tests. #271
- Add better support for Data object diffing. #259
- Fall back on RSpec color mode when
SuperDiff.configuration.color_enabledis unspecified or nil. #261
- Removed several
SuperDiff::Csimethods. This will break any code that uses those parts of theSuperDiff::Csi(which is private in general). SuperDiff.configuration.color_enabled = nilused to disable color output. It now allows SuperDiff to determine whether to colorize output based on the environment (namely RSpec color mode and whether stdout is a TTY).
Note that since 0.12.0 has been yanked, changes for this version are listed alongside changes for 0.12.1. Also, changelog entries that were mistakenly omitted for 0.12.0 are included below as well.
- Create a proper space for docs, add info on architecture, and deploy docs
to a docsite automatically.
(#224,
#225,
#226,
#232,
#233,
#245)
- The
docs/directory now holds information on contributing, which was previously located atCONTRIBUTING.md, as well as information on using the gem, which was previously located inREADME.md. - However, crucially,
docs/also now includes a breakdown of how this project is structured and how the diffing engine works. This is hopefully helpful to people who want to submit changes to this project. - Additionally, starting with this release, the Markdown files in
docs/will published to a docsite, which can be viewed at https://splitwise.github.io/super_diff. - Publishing of the docsite is automated: when a new release is issued, a new version of the docsite will be published for that release under https://splitwise.github.io/super_diff/releases/RELEASE_VERSION. (https://splitwise.github.io/super_diff will always redirect to the latest release.)
- If any file in
docs/is modified in a pull request, a new version of the docsite will also be automatically deployed just for that pull request, located under https://splitwise.github.io/super_diff/branches/BRANCH_NAME/COMMIT_ID.
- The
- Support the use of primary keys other than
idwhen diffing ActiveRecord models. (#237)
- Remove rogue
ppstatement (#242)
- Reorganize codebase (#230)
- To be able to explain the architecture of this project more easily,
differs, inspection tree builders, operation tree builders, operation tree
flatteners, and operation trees for Ruby have now been relocated under a
Basicfeature module, located inlib/super_diff/basic, which mirrorslib/super_diff/active_record,lib/super_diff/active_support, andlib/super_diff/rspec. - Additionally, all of the files that were previously in
lib/super_diffhave been moved to aCoremodule, and to make the file structure a little flatter,InspectionTreeBuildersin various feature modules have been removed from theObjectInspectionnamespace. - To maintain backward compatibility, all of the original constants still exist, but they've been deprecated, and attempting to use them will result in a warning. They will be removed in a future version.
- For full transparency, here is the list of renames:
- The following constants that were previously available under
SuperDiffare now located underSuperDiff::Core:ColorizedDocumentExtensionsConfigurationGemVersionHelpersImplementationChecksLineRecursionGuardTieredLinesTieredLinesEliderTieredLinesFormatter
- Everything under
SuperDiff::Differsis now underSuperDiff::Basic::Differs - All error classes under
SuperDiff::Errorshave been moved out and are now directly underSuperDiff::Core SuperDiff::ObjectInspection::InspectionTreeis nowSuperDiff::Core::InspectionTree- Everything under
SuperDiff::ObjectInspection::InspectionTreeBuildersis now underSuperDiff::Core::InspectionTreeBuilders - Everything under
SuperDiff::ObjectInspection::Nodesis now underSuperDiff::Core::InspectionTreeNodes - Everything under
SuperDiff::OperationTreeBuildersis now underSuperDiff::Basic::OperationTreeBuilders - Everything under
SuperDiff::OperationTreeFlattenersis now underSuperDiff::Basic::OperationTreeFlatteners - Everything under
SuperDiff::OperationTreesis now underSuperDiff::Basic::OperationTrees - Everything under
SuperDiff::Operationshas been moved out and is now directly underSuperDiff::Core - Everything under
SuperDiff::ActiveRecord::ObjectInspection::InspectionTreeBuildersis now underSuperDiff::ActiveRecord::InspectionTreeBuilders- Everything under
SuperDiff::ActiveSupport::ObjectInspection::InspectionTreeBuildersis now underSuperDiff::ActiveSupport::InspectionTreeBuilders- Everything under
SuperDiff::RSpec::ObjectInspection::InspectionTreeBuildersis now underSuperDiff::RSpec::InspectionTreeBuilders
- The following constants that were previously available under
- To be able to explain the architecture of this project more easily,
differs, inspection tree builders, operation tree builders, operation tree
flatteners, and operation trees for Ruby have now been relocated under a
This release features the following contributors:
Thank you!
Warning
This release has been yanked, as it included changes that weren't properly logged in the changelog. This release wasn't ideal as it contained some leftover print statements, anyway.
- Support the use of primary keys other than
idwhen diffing ActiveRecord models. (#237)
This release features the following contributors:
Thank you!
- Change InspectionTree so that it no longer
instance_evals the block it takes. (#210)- If you have a custom InspectionTreeBuilder, you will need to change your
callmethod so that instead of looking like this:it looks something like this instead:def call SuperDiff::ObjectInspection::InspectionTree.new do as_lines_when_rendering_to_lines(collection_bookend: :open) do add_text object.inspect end end end
Note that the following methods yield a new InspectionTree, so the tree needs to be given a new name each time. It is conventional to usedef call SuperDiff::ObjectInspection::InspectionTree.new do |t1| t1.as_lines_when_rendering_to_lines(collection_bookend: :open) do |t2| t2.add_text object.inspect end end end
t1,t2, etc.:as_lines_when_rendering_to_linesas_prefix_when_rendering_to_linesas_prelude_when_rendering_to_linesas_single_linenestedonly_whenwhen_emptywhen_non_emptywhen_rendering_to_lineswhen_rendering_to_string
- If you have a custom InspectionTreeBuilder, you will need to change your
- Add inspector for RSpec describable matchers not otherwise handled by an explicit inspector. (#203, #219)
- Support diffing date-like objects, e.g.
Datevs.DateorDatevs.DateTime. (#198)
- Add inspector for ActiveSupport::OrderedOptions.
(#199)
- This prevents the gem from raising an error when the expected value is a
Rails response object, e.g.
expect(response).to be_forbidden.
- This prevents the gem from raising an error when the expected value is a
Rails response object, e.g.
- Include
extra_failure_linesfrom RSpec metadata in failure output. (#208) - Fix
match_arrayso that it truly accepts a non-array argument, to match RSpec behavior. (#213) - Fix
raise_errorso that it accepts an RSpec matcher argument. (#214)
- Improve wording in
raise_errorfailure messages. (#218)
This release features the following contributors:
Thank you!
- Drop support for Ruby 2.5, 2.6, and 2.7 as well as Rails 5.0, 5.1, and 5.2, as they have reached (or are about to reach) end-of-life. To use this gem, you must use at least Ruby 3.x, and if you're using Rails, Rails 6.x. (#187, #190)
- Fix diffing logic for
includematcher so that it knows how to compare fuzzy matcher objects with other kinds of objects. (#156) - Add a
key_enabledconfiguration option for disabling the key/legend in the diff output. (#166) - Add a
color_enabledconfiguration option for disabling color. (#138) - Update
super_diff/rails(and, by extension,super_diff/rspec-rails) so that the ActiveRecord-specific integration isn't loaded if ActiveRecord isn't available. (#188)
- Fix diff produced when comparing two floats (e.g.
expect(value).to eq(1.0)) so that it does not blow up with a NoMethodError (#146)
- Make
SuperDiff::VERSIONaccessible without requiringsuper_diff/version(#147)
- Diff formatters are now gone in favor of operation tree flatteners. If you
have a custom diff formatter, you will want to inherit from
SuperDiff::OperationTreeFlatteners::Base (or an appropriate subclass).
Additionally, the
add_extra_diff_formatter_classconfiguration option has disappeared; instead, operation tree classes are expected to have anoperation_tree_flattener_classmethod, which should return your custom operation tree flattener class. (#91)
-
Add the ability to compress long diffs by eliding sections of unchanged data (data which is present in both "expected" and "actual" values). This functionality is not enabled by default; rather, you will need to activate it. At a minimum, you will want to add this to your spec helper (or a support file if you so desire):
SuperDiff.configure { |config| config.diff_elision_enabled = true }
By default the elision will be pretty aggressive, but if you want to preserve more of the unchanged lines in the diff, you can set
diff_elision_maximum:SuperDiff.configure do |config| config.diff_elision_enabled = true config.diff_elision_maximum = 10 end
Here, the gem will try to keep at least 10 unchanged lines in between changed lines.
(#91)
-
Update inspection of Doubles to include stubbed methods and their values. (#91)
- Change how objects are inspected on a single line so that instance variables are always sorted. (#91)
- Make a tweak to how hashes are presented in diffs and inspections: a hash that has a mixture of symbols and strings will be presented as though all keys are strings (i.e. hashrocket syntax). (#91)
-
Add support for
hash_including,array_including,kind_of, andinstance_of, which come fromrspec-mocks. (#128) -
Update how Time-like values are displayed in diffs to include subseconds so that it is easy to tell the difference between two times that are extremely close to each other. (#130)
- Fix comparison involving hashes to prevent a case where the same key would show up twice in the diff (one as a "deleted" version and another as an "unchanged" version). (#129)
-
Rename SuperDiff::ObjectInspection.inspect to something less collision-y so that it can be inspected in IRB sessions. (#123)
-
Silence warnings. (#124)
- Fix compatibility issues with newer versions of
rspec-railswhich prevented the gem from being loaded. (#121)
-
You can now customize the colors that SuperDiff uses by adding this to your test setup:
SuperDiff.configure do |config| config.actual_color = :green config.expected_color = :red config.border_color = :yellow config.header_color = :yellow end
-
Ruby 3.0 is now supported. (#118)
- Resolve compatibility issues with RSpec 3.10. (#114)
- Fix diffs involving
contain_exactlyanda_collection_containing_exactlyso that if there are extra items in the actual value, they are shown with+s. (#106)
- Fix reliability issues with CI.
- Fix
rake specso that it works when run locally again.
- Fix
match_arrayso that it works when given a string. (#110)
- Include the license in the gemspec so that it is visible via tools such as
license_finder. (#111)
- Add missing standard library requires. (#98)
- Drop support for Ruby 2.4.
- Add dependency on
attr_extrasback as it was mistakenly removed in the previous release. (#92)
-
Do some reorganizing and rename some concepts in the code: "operational sequencer" changes to "operation tree builder" and "operation sequence" changes to "operation tree". Although super_diff is not yet at 1.0, this does result in breaking changes to the API, so:
-
If you are inheriting from
SuperDiff::OperationalSequencers::*, you will want to now inherit fromSuperDiff::OperationTreeBuilders::*. -
If you are inheriting from
SuperDiff::OperationSequence::*, you will want to now inherit fromSuperDiff::OperationTrees::*. -
If you are configuring the gem by saying:
SuperDiff::RSpec.configuration do |config| config.add_extra_operational_sequencer_class(SomeClass) config.add_extra_operation_sequence_class(SomeClass) end
you will want to change this to:
SuperDiff::RSpec.configuration do |config| config.add_extra_operation_tree_builder_class(SomeClass) config.add_extra_operation_tree_class(SomeClass) end
-
- Add inspectors for
an_instance_of,a_kind_of, anda_value_within. (#74)
- Get rid of warnings produced on Ruby 2.7.1. (#71)
- Fix diff produced by (incorrect) usage of
have_attributeswith a hash as the actual value. (#76)
-
Move configuration so that instead of using
SuperDiff::RSpec.configure do |config| # ... end
you can now say:
SuperDiff.configure do |config| # ... end
(#80)
-
Update diff between two hashes so that original ordering of keys is preserved. (#81)
- Fix
raise_errorwhen used with a regex. (#72)
- Fix multiple exception failures so that they work again. (#66)
- Support
match_arraymatcher. - Support
has_*matcher. - Be smarter about highlighting first line of failure message.
- Fix diffing of ActiveRecord objects in nested objects.
- Remove explicit dependency on ActiveRecord. (#64)
- Add useful diff representation of Time-like values. (#61)
- Fix tests so they run even with a global
--colorsetting. (#62)
Lots of fixes and new features!
- Fix how objects are displayed in diff output:
- Fix output of diffs so that objects are deeply pretty printed.
- Use Object#inspect as a fallback for single-line object inspection.
- Support diffing ordinary, "non-custom" objects (those that do not respond to
attributes_for_super_diff). - Add custom coloring/messaging to
includematcher. - Support pretty-printing
a_hash_includingobjects and diffing them with hashes. - Support pretty-printing
a_collection_includingobjects and diffing them with arrays. - Add custom coloring/messaging to
have_attributesmatcher. - Support pretty-printing
an_object_having_attributesobjects and diffing them with other objects. - Add a key/legend to the diff output so it's less confusing.
- Add custom coloring/messaging to
respond_tomatcher. - Add custom coloring/messaging to
raise_errormatcher. - Fix output from diff between a multi-line string with a single-line (and vice versa).
- Make sure that RSpec double objects are pretty-printed correctly Add custom
coloring/messaging to
contain_exactly. - Support pretty-printing
a_collection_containing_exactlyobjects and diffing them with other arrays. - Add support for diffing ActiveRecord models.
- Add support for diffing ActiveRecord::Relation objects with arrays.
- Fix output for diff between two completely different kinds of objects
- Support pretty-printing HashWithIndifferentAccess objects and diffing them with hashes.
- Detect and handle recursive data structures.
- Automatically disable color output when running tests non-interactively (e.g. on a CI service).
- Add custom coloring/messaging to
be_*matcher. - Fix representation of empty arrays, hashes, and objects in diffs so that they are always on single lines.
- Change colors in diffs and messages from red/green to magenta/yellow.
- Use bold to highlight "Failure/Error" instead of white so that output looks good on a light terminal color scheme
- Fix coloring for unhandled errors so that the whole message isn't colored in red, but only the first line.
Initial version!
- Support diffing primitives.
- Support diffing strings (single-line and multi-line).
- Support diffing arrays (simple and complex).
- Support diffing "custom objects" (i.e. objects that respond to
attributes_for_super_diff). - Add basic integration with RSpec.