From c68c8920f2a7961188a0e13cc2dd21820575bdf7 Mon Sep 17 00:00:00 2001 From: Maxime Dezette <mdezette@ippon.fr> Date: Tue, 13 Oct 2020 16:43:44 +0200 Subject: [PATCH] Mustache replacer implementation --- .gitlab-ci.yml | 1 + README.md | 1 + mustache-replacer/.gitlab-ci.yml | 11 ++++++ mustache-replacer/README.md | 9 +++++ mustache-replacer/pom.xml | 29 +++++++++++++++ .../src/main/java/ArgumentReplacer.java | 27 ++++++++++++++ .../src/test/java/ArgumentReplacerTest.java | 35 +++++++++++++++++++ 7 files changed, 113 insertions(+) create mode 100644 mustache-replacer/.gitlab-ci.yml create mode 100644 mustache-replacer/README.md create mode 100644 mustache-replacer/pom.xml create mode 100644 mustache-replacer/src/main/java/ArgumentReplacer.java create mode 100644 mustache-replacer/src/test/java/ArgumentReplacerTest.java diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 2f145983..5f888029 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -10,3 +10,4 @@ include: - local: "/ugly-trivia/.gitlab-ci.yml" - local: "/borestop/.gitlab-ci.yml" - local: "/java-pagination-seven/.gitlab-ci.yml" + - local: "/mustache-replacer/.gitlab-ci.yml" diff --git a/README.md b/README.md index 587bf0c0..be83cf08 100644 --- a/README.md +++ b/README.md @@ -26,3 +26,4 @@ Ce dépôt Git a pour but de partager les différents ateliers pouvant être ré 8. [Borestop](/borestop) 9. [Java pagination Seven](/java-pagination-seven) 10. [PadBowl](https://gitlab.com/cdamon/padbowl) +11. [Mustache Replacer](/mustache-replacer) diff --git a/mustache-replacer/.gitlab-ci.yml b/mustache-replacer/.gitlab-ci.yml new file mode 100644 index 00000000..901a849a --- /dev/null +++ b/mustache-replacer/.gitlab-ci.yml @@ -0,0 +1,11 @@ +package-mustache-replacer: + variables: + PROJECT_FOLDER: "mustache-replacer" + extends: .java + only: + refs: + - master + - merge_requests + changes: + - ".gitlab-common-ci.yml" + - "mustache-replacer/**/*" diff --git a/mustache-replacer/README.md b/mustache-replacer/README.md new file mode 100644 index 00000000..68116cf7 --- /dev/null +++ b/mustache-replacer/README.md @@ -0,0 +1,9 @@ +# Mustache Replacer + +Résolution en TDD et avec explications d'un exercice de remplacement d'arguments dans une phrase. + +- **Auteurs** : Colin DAMON et Maxime DEZETTE +- **Date** : 13/10/2020 +- **Langage** : Java +- **Niveau** : Débutant +- **Replay** : [](#) diff --git a/mustache-replacer/pom.xml b/mustache-replacer/pom.xml new file mode 100644 index 00000000..ef88c1e2 --- /dev/null +++ b/mustache-replacer/pom.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <parent> + <version>1.0.0</version> + <groupId>fr.ippon.kata</groupId> + <artifactId>java-parent</artifactId> + <relativePath>../java-parent</relativePath> + </parent> + + <version>1.0.0-SNAPSHOT</version> + <artifactId>string-calculator</artifactId> + + <name>MustacheReplacer</name> + + <developers> + <developer> + <email>cdamon@ippon.fr</email> + <name>Colin DAMON</name> + </developer> + <developer> + <email>mdezette@ippon.fr</email> + <name>Maxime DEZETTE</name> + </developer> + </developers> +</project> diff --git a/mustache-replacer/src/main/java/ArgumentReplacer.java b/mustache-replacer/src/main/java/ArgumentReplacer.java new file mode 100644 index 00000000..68361634 --- /dev/null +++ b/mustache-replacer/src/main/java/ArgumentReplacer.java @@ -0,0 +1,27 @@ +import java.util.Map; +import java.util.function.BinaryOperator; + +public class ArgumentReplacer { + + public static final String BEGINING_MUSTACH = "\\{\\{\\s*"; + public static final String ENDING_MUSTACH = "\\s*\\}\\}"; + + public static String replace(String template, Map<String, String> arguments) { + if (needNoReplace(template, arguments)) { + return template; + } + + return arguments.entrySet().stream().reduce(template, ArgumentReplacer::replaceEntry, nothing()); + } + + private static boolean needNoReplace(String template, Map<String, String> arguments) { + return template == null || arguments == null; + } + private static String replaceEntry(String result, Map.Entry<String, String> entry) { + return result.replaceAll(BEGINING_MUSTACH + entry.getKey() + ENDING_MUSTACH, entry.getValue()); + } + + private static BinaryOperator<String> nothing() { + return (k, v) -> v; + } +} diff --git a/mustache-replacer/src/test/java/ArgumentReplacerTest.java b/mustache-replacer/src/test/java/ArgumentReplacerTest.java new file mode 100644 index 00000000..3b89e1d5 --- /dev/null +++ b/mustache-replacer/src/test/java/ArgumentReplacerTest.java @@ -0,0 +1,35 @@ +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.util.Map; + +import static org.assertj.core.api.Assertions.assertThat; + +class SampleTest { + + @Test + void shouldGetInputStringWithoutArgumentToReplace() { + + assertThat(ArgumentReplacer.replace("Bonjour Homer", null)).isEqualTo("Bonjour Homer"); + } + + @Test + void shouldGetInputStringWithArgumentReplaced() { + + assertThat(ArgumentReplacer.replace("Bonjour {{firstname}}", Map.of("firstname", "Homer"))).isEqualTo("Bonjour Homer"); + } + + @Test + void shouldGetNullResultWithoutTemplate(){ + + assertThat(ArgumentReplacer.replace(null, Map.of("firstname", "Homer"))).isNull(); + } + + @Test + void shouldGetInputStringReplacedWithSpace(){ + + assertThat(ArgumentReplacer.replace("Bonjour {{firstname}} {{ lastname }}", Map.of("firstname","Homer", "lastname", "Simpson"))).isEqualTo("Bonjour Homer Simpson"); + } + + +} -- GitLab