This commit is contained in:
Tobias Warneke
2022-11-20 12:04:13 +01:00
parent 4cad0ea2b9
commit dc5ecb8ded
11 changed files with 41 additions and 40 deletions

View File

@@ -5,7 +5,9 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
This project uses a custom versioning scheme (and not [Semantic Versioning](https://semver.org/spec/v2.0.0.html)). This project uses a custom versioning scheme (and not [Semantic Versioning](https://semver.org/spec/v2.0.0.html)).
## [unreleased] ## [4.13]
* API change: due to Issue #159: the author of the algorithm is Eugene Myers, therefore classes and methods were renamed accordingly
### Changed ### Changed

View File

@@ -18,7 +18,7 @@ package com.github.difflib;
import com.github.difflib.algorithm.DiffAlgorithmFactory; import com.github.difflib.algorithm.DiffAlgorithmFactory;
import com.github.difflib.algorithm.DiffAlgorithmI; import com.github.difflib.algorithm.DiffAlgorithmI;
import com.github.difflib.algorithm.DiffAlgorithmListener; import com.github.difflib.algorithm.DiffAlgorithmListener;
import com.github.difflib.algorithm.myers.MeyersDiff; import com.github.difflib.algorithm.myers.MyersDiff;
import com.github.difflib.patch.AbstractDelta; import com.github.difflib.patch.AbstractDelta;
import com.github.difflib.patch.Patch; import com.github.difflib.patch.Patch;
import com.github.difflib.patch.PatchFailedException; import com.github.difflib.patch.PatchFailedException;
@@ -37,7 +37,7 @@ public final class DiffUtils {
/** /**
* This factory generates the DEFAULT_DIFF algorithm for all these routines. * This factory generates the DEFAULT_DIFF algorithm for all these routines.
*/ */
static DiffAlgorithmFactory DEFAULT_DIFF = MeyersDiff.factory(); static DiffAlgorithmFactory DEFAULT_DIFF = MyersDiff.factory();
public static void withDefaultDiffAlgorithmFactory(DiffAlgorithmFactory factory) { public static void withDefaultDiffAlgorithmFactory(DiffAlgorithmFactory factory) {
DEFAULT_DIFF = factory; DEFAULT_DIFF = factory;
@@ -95,7 +95,7 @@ public final class DiffUtils {
return DiffUtils.diff(source, target, return DiffUtils.diff(source, target,
DEFAULT_DIFF.create(equalizer)); DEFAULT_DIFF.create(equalizer));
} }
return DiffUtils.diff(source, target, new MeyersDiff<>()); return DiffUtils.diff(source, target, new MyersDiff<>());
} }
public static <T> Patch<T> diff(List<T> original, List<T> revised, public static <T> Patch<T> diff(List<T> original, List<T> revised,

View File

@@ -27,17 +27,17 @@ import java.util.Objects;
import java.util.function.BiPredicate; import java.util.function.BiPredicate;
/** /**
* A clean-room implementation of Eugene Meyers greedy differencing algorithm. * A clean-room implementation of Eugene Myers greedy differencing algorithm.
*/ */
public final class MeyersDiff<T> implements DiffAlgorithmI<T> { public final class MyersDiff<T> implements DiffAlgorithmI<T> {
private final BiPredicate<T, T> equalizer; private final BiPredicate<T, T> equalizer;
public MeyersDiff() { public MyersDiff() {
equalizer = Object::equals; equalizer = Object::equals;
} }
public MeyersDiff(final BiPredicate<T, T> equalizer) { public MyersDiff(final BiPredicate<T, T> equalizer) {
Objects.requireNonNull(equalizer, "equalizer must not be null"); Objects.requireNonNull(equalizer, "equalizer must not be null");
this.equalizer = equalizer; this.equalizer = equalizer;
} }
@@ -187,13 +187,13 @@ public final class MeyersDiff<T> implements DiffAlgorithmI<T> {
@Override @Override
public <T> DiffAlgorithmI<T> public <T> DiffAlgorithmI<T>
create() { create() {
return new MeyersDiff<T>(); return new MyersDiff<T>();
} }
@Override @Override
public <T> DiffAlgorithmI<T> public <T> DiffAlgorithmI<T>
create(BiPredicate < T, T > equalizer) { create(BiPredicate < T, T > equalizer) {
return new MeyersDiff<T>(equalizer); return new MyersDiff<T>(equalizer);
} }
}; };
} }

View File

@@ -30,15 +30,15 @@ import java.util.function.Consumer;
* *
* @author tw * @author tw
*/ */
public class MeyersDiffWithLinearSpace<T> implements DiffAlgorithmI<T> { public class MyersDiffWithLinearSpace<T> implements DiffAlgorithmI<T> {
private final BiPredicate<T, T> equalizer; private final BiPredicate<T, T> equalizer;
public MeyersDiffWithLinearSpace() { public MyersDiffWithLinearSpace() {
equalizer = Object::equals; equalizer = Object::equals;
} }
public MeyersDiffWithLinearSpace(final BiPredicate<T, T> equalizer) { public MyersDiffWithLinearSpace(final BiPredicate<T, T> equalizer) {
Objects.requireNonNull(equalizer, "equalizer must not be null"); Objects.requireNonNull(equalizer, "equalizer must not be null");
this.equalizer = equalizer; this.equalizer = equalizer;
} }
@@ -231,13 +231,13 @@ public class MeyersDiffWithLinearSpace<T> implements DiffAlgorithmI<T> {
@Override @Override
public <T> DiffAlgorithmI<T> public <T> DiffAlgorithmI<T>
create() { create() {
return new MeyersDiffWithLinearSpace<T>(); return new MyersDiffWithLinearSpace<T>();
} }
@Override @Override
public <T> DiffAlgorithmI<T> public <T> DiffAlgorithmI<T>
create(BiPredicate < T, T > equalizer) { create(BiPredicate < T, T > equalizer) {
return new MeyersDiffWithLinearSpace<T>(equalizer); return new MyersDiffWithLinearSpace<T>(equalizer);
} }
}; };
} }

View File

@@ -132,7 +132,7 @@ public class DiffUtilsTest {
} }
/** /**
* To test this, the greedy meyer algorithm is not suitable. * To test this, the greedy Myer algorithm is not suitable.
*/ */
@Test @Test
@Disabled @Disabled

View File

@@ -34,7 +34,7 @@ public class MyersDiffTest {
public void testDiffMyersExample1Forward() { public void testDiffMyersExample1Forward() {
List<String> original = Arrays.asList("A", "B", "C", "A", "B", "B", "A"); List<String> original = Arrays.asList("A", "B", "C", "A", "B", "B", "A");
List<String> revised = Arrays.asList("C", "B", "A", "B", "A", "C"); List<String> revised = Arrays.asList("C", "B", "A", "B", "A", "C");
final Patch<String> patch = Patch.generate(original, revised, new MeyersDiff<String>().computeDiff(original, revised, null)); final Patch<String> patch = Patch.generate(original, revised, new MyersDiff<String>().computeDiff(original, revised, null));
assertNotNull(patch); assertNotNull(patch);
assertEquals(4, patch.getDeltas().size()); assertEquals(4, patch.getDeltas().size());
assertEquals("Patch{deltas=[[DeleteDelta, position: 0, lines: [A, B]], [InsertDelta, position: 3, lines: [B]], [DeleteDelta, position: 5, lines: [B]], [InsertDelta, position: 7, lines: [C]]]}", patch.toString()); assertEquals("Patch{deltas=[[DeleteDelta, position: 0, lines: [A, B]], [InsertDelta, position: 3, lines: [B]], [DeleteDelta, position: 5, lines: [B]], [InsertDelta, position: 7, lines: [C]]]}", patch.toString());
@@ -47,7 +47,7 @@ public class MyersDiffTest {
List<String> logdata = new ArrayList<>(); List<String> logdata = new ArrayList<>();
final Patch<String> patch = Patch.generate(original, revised, final Patch<String> patch = Patch.generate(original, revised,
new MeyersDiff<String>().computeDiff(original, revised, new DiffAlgorithmListener() { new MyersDiff<String>().computeDiff(original, revised, new DiffAlgorithmListener() {
@Override @Override
public void diffStart() { public void diffStart() {
logdata.add("start"); logdata.add("start");

View File

@@ -30,13 +30,13 @@ import static org.junit.jupiter.api.Assertions.*;
* *
* @author tw * @author tw
*/ */
public class MeyersDiffWithLinearSpaceTest { public class MyersDiffWithLinearSpaceTest {
@Test @Test
public void testDiffMyersExample1Forward() { public void testDiffMyersExample1Forward() {
List<String> original = Arrays.asList("A", "B", "C", "A", "B", "B", "A"); List<String> original = Arrays.asList("A", "B", "C", "A", "B", "B", "A");
List<String> revised = Arrays.asList("C", "B", "A", "B", "A", "C"); List<String> revised = Arrays.asList("C", "B", "A", "B", "A", "C");
final Patch<String> patch = Patch.generate(original, revised, new MeyersDiffWithLinearSpace<String>().computeDiff(original, revised, null)); final Patch<String> patch = Patch.generate(original, revised, new MyersDiffWithLinearSpace<String>().computeDiff(original, revised, null));
assertNotNull(patch); assertNotNull(patch);
System.out.println(patch); System.out.println(patch);
assertEquals(5, patch.getDeltas().size()); assertEquals(5, patch.getDeltas().size());
@@ -50,7 +50,7 @@ public class MeyersDiffWithLinearSpaceTest {
List<String> logdata = new ArrayList<>(); List<String> logdata = new ArrayList<>();
final Patch<String> patch = Patch.generate(original, revised, final Patch<String> patch = Patch.generate(original, revised,
new MeyersDiffWithLinearSpace<String>().computeDiff(original, revised, new DiffAlgorithmListener() { new MyersDiffWithLinearSpace<String>().computeDiff(original, revised, new DiffAlgorithmListener() {
@Override @Override
public void diffStart() { public void diffStart() {
logdata.add("start"); logdata.add("start");
@@ -84,7 +84,7 @@ public class MeyersDiffWithLinearSpaceTest {
.collect(toList()); .collect(toList());
long start = System.currentTimeMillis(); long start = System.currentTimeMillis();
Patch<String> diff = DiffUtils.diff(old, newl, new MeyersDiffWithLinearSpace<String>()); Patch<String> diff = DiffUtils.diff(old, newl, new MyersDiffWithLinearSpace<String>());
long end = System.currentTimeMillis(); long end = System.currentTimeMillis();
System.out.println("Finished in " + (end - start) + "ms and resulted " + diff.getDeltas().size() + " deltas"); System.out.println("Finished in " + (end - start) + "ms and resulted " + diff.getDeltas().size() + " deltas");
} }

View File

@@ -22,14 +22,14 @@ import org.junit.jupiter.api.Test;
import com.github.difflib.DiffUtils; import com.github.difflib.DiffUtils;
public class WithMeyersDiffWithLinearSpacePatchTest { public class WithMyersDiffWithLinearSpacePatchTest {
@Test @Test
public void testPatch_Insert() { public void testPatch_Insert() {
final List<String> insertTest_from = Arrays.asList("hhh"); final List<String> insertTest_from = Arrays.asList("hhh");
final List<String> insertTest_to = Arrays.asList("hhh", "jjj", "kkk", "lll"); final List<String> insertTest_to = Arrays.asList("hhh", "jjj", "kkk", "lll");
final Patch<String> patch = DiffUtils.diff(insertTest_from, insertTest_to, new MeyersDiffWithLinearSpace<String>()); final Patch<String> patch = DiffUtils.diff(insertTest_from, insertTest_to, new MyersDiffWithLinearSpace<String>());
try { try {
assertEquals(insertTest_to, DiffUtils.patch(insertTest_from, patch)); assertEquals(insertTest_to, DiffUtils.patch(insertTest_from, patch));
} catch (PatchFailedException e) { } catch (PatchFailedException e) {
@@ -42,7 +42,7 @@ public class WithMeyersDiffWithLinearSpacePatchTest {
final List<String> deleteTest_from = Arrays.asList("ddd", "fff", "ggg", "hhh"); final List<String> deleteTest_from = Arrays.asList("ddd", "fff", "ggg", "hhh");
final List<String> deleteTest_to = Arrays.asList("ggg"); final List<String> deleteTest_to = Arrays.asList("ggg");
final Patch<String> patch = DiffUtils.diff(deleteTest_from, deleteTest_to, new MeyersDiffWithLinearSpace<String>()); final Patch<String> patch = DiffUtils.diff(deleteTest_from, deleteTest_to, new MyersDiffWithLinearSpace<String>());
try { try {
assertEquals(deleteTest_to, DiffUtils.patch(deleteTest_from, patch)); assertEquals(deleteTest_to, DiffUtils.patch(deleteTest_from, patch));
} catch (PatchFailedException e) { } catch (PatchFailedException e) {
@@ -55,7 +55,7 @@ public class WithMeyersDiffWithLinearSpacePatchTest {
final List<String> changeTest_from = Arrays.asList("aaa", "bbb", "ccc", "ddd"); final List<String> changeTest_from = Arrays.asList("aaa", "bbb", "ccc", "ddd");
final List<String> changeTest_to = Arrays.asList("aaa", "bxb", "cxc", "ddd"); final List<String> changeTest_to = Arrays.asList("aaa", "bxb", "cxc", "ddd");
final Patch<String> patch = DiffUtils.diff(changeTest_from, changeTest_to, new MeyersDiffWithLinearSpace<String>()); final Patch<String> patch = DiffUtils.diff(changeTest_from, changeTest_to, new MyersDiffWithLinearSpace<String>());
try { try {
assertEquals(changeTest_to, DiffUtils.patch(changeTest_from, patch)); assertEquals(changeTest_to, DiffUtils.patch(changeTest_from, patch));
} catch (PatchFailedException e) { } catch (PatchFailedException e) {
@@ -166,7 +166,7 @@ public class WithMeyersDiffWithLinearSpacePatchTest {
final List<String> changeTest_from = Arrays.asList("aaa", "bbb", "ccc", "ddd"); final List<String> changeTest_from = Arrays.asList("aaa", "bbb", "ccc", "ddd");
final List<String> changeTest_to = Arrays.asList("aaa", "bxb", "cxc", "ddd"); final List<String> changeTest_to = Arrays.asList("aaa", "bxb", "cxc", "ddd");
final Patch<String> patch = DiffUtils.diff(changeTest_from, changeTest_to, new MeyersDiffWithLinearSpace<String>()); final Patch<String> patch = DiffUtils.diff(changeTest_from, changeTest_to, new MyersDiffWithLinearSpace<String>());
ByteArrayOutputStream baos = new ByteArrayOutputStream(); ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(baos); ObjectOutputStream out = new ObjectOutputStream(baos);
out.writeObject(patch); out.writeObject(patch);
@@ -189,7 +189,7 @@ public class WithMeyersDiffWithLinearSpacePatchTest {
final List<String> changeTest_from = Arrays.asList("aaa", "bbb", "ccc", "ddd"); final List<String> changeTest_from = Arrays.asList("aaa", "bbb", "ccc", "ddd");
final List<String> changeTest_to = Arrays.asList("aaa", "bxb", "cxc", "ddd"); final List<String> changeTest_to = Arrays.asList("aaa", "bxb", "cxc", "ddd");
final Patch<String> patch = DiffUtils.diff(changeTest_from, changeTest_to, new MeyersDiffWithLinearSpace<String>()); final Patch<String> patch = DiffUtils.diff(changeTest_from, changeTest_to, new MyersDiffWithLinearSpace<String>());
changeTest_from.set(2, "CDC"); changeTest_from.set(2, "CDC");

View File

@@ -14,8 +14,8 @@ import java.util.List;
import com.github.difflib.DiffUtils; import com.github.difflib.DiffUtils;
import com.github.difflib.algorithm.DiffAlgorithmFactory; import com.github.difflib.algorithm.DiffAlgorithmFactory;
import com.github.difflib.algorithm.myers.MeyersDiff; import com.github.difflib.algorithm.myers.MyersDiff;
import com.github.difflib.algorithm.myers.MeyersDiffWithLinearSpace; import com.github.difflib.algorithm.myers.MyersDiffWithLinearSpace;
import java.util.stream.Stream; import java.util.stream.Stream;
import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.ParameterizedTest;
@@ -25,14 +25,13 @@ import org.junit.jupiter.params.provider.MethodSource;
public class PatchWithAllDiffAlgorithmsTest { public class PatchWithAllDiffAlgorithmsTest {
private static Stream<Arguments> provideAlgorithms() { private static Stream<Arguments> provideAlgorithms() {
return Stream.of( return Stream.of(Arguments.of(MyersDiff.factory()),
Arguments.of(MeyersDiff.factory()), Arguments.of(MyersDiffWithLinearSpace.factory()));
Arguments.of(MeyersDiffWithLinearSpace.factory()));
} }
@AfterAll @AfterAll
public static void afterAll() { public static void afterAll() {
DiffUtils.withDefaultDiffAlgorithmFactory(MeyersDiff.factory()); DiffUtils.withDefaultDiffAlgorithmFactory(MyersDiff.factory());
} }
@ParameterizedTest @ParameterizedTest

View File

@@ -28,7 +28,7 @@ import org.junit.jupiter.api.Test;
* *
* @author tw * @author tw
*/ */
public class PatchWithMeyerDiffTest { public class PatchWithMyerDiffTest {
@Test @Test
public void testPatch_Change_withExceptionProcessor() { public void testPatch_Change_withExceptionProcessor() {

View File

@@ -16,8 +16,8 @@
package com.github.difflib.patch; package com.github.difflib.patch;
import com.github.difflib.DiffUtils; import com.github.difflib.DiffUtils;
import com.github.difflib.algorithm.myers.MeyersDiff; import com.github.difflib.algorithm.myers.MyersDiff;
import com.github.difflib.algorithm.myers.MeyersDiffWithLinearSpace; import com.github.difflib.algorithm.myers.MyersDiffWithLinearSpace;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.AfterAll;
@@ -30,16 +30,16 @@ import org.junit.jupiter.api.Test;
* *
* @author tw * @author tw
*/ */
public class PatchWithMeyerDiffWithLinearSpaceTest { public class PatchWithMyerDiffWithLinearSpaceTest {
@BeforeAll @BeforeAll
public static void setupClass() { public static void setupClass() {
DiffUtils.withDefaultDiffAlgorithmFactory(MeyersDiffWithLinearSpace.factory()); DiffUtils.withDefaultDiffAlgorithmFactory(MyersDiffWithLinearSpace.factory());
} }
@AfterAll @AfterAll
public static void resetClass() { public static void resetClass() {
DiffUtils.withDefaultDiffAlgorithmFactory(MeyersDiff.factory()); DiffUtils.withDefaultDiffAlgorithmFactory(MyersDiff.factory());
} }
@Test @Test