From eeba513c92e388ecf0c312171584ea48ebdbc08b Mon Sep 17 00:00:00 2001 From: marhali Date: Fri, 28 Oct 2022 15:38:31 +0200 Subject: [PATCH 01/15] base for e2e tests --- .../settings/ProjectSettingsService.java | 2 +- .../easyi18n/e2e/EndToEndTestCase.java | 85 +++++++++++++++++++ .../easyi18n/e2e/TestSettingsState.java | 46 ++++++++++ 3 files changed, 132 insertions(+), 1 deletion(-) create mode 100644 src/test/java/de/marhali/easyi18n/e2e/EndToEndTestCase.java create mode 100644 src/test/java/de/marhali/easyi18n/e2e/TestSettingsState.java diff --git a/src/main/java/de/marhali/easyi18n/settings/ProjectSettingsService.java b/src/main/java/de/marhali/easyi18n/settings/ProjectSettingsService.java index 1cc0538..3363ec5 100644 --- a/src/main/java/de/marhali/easyi18n/settings/ProjectSettingsService.java +++ b/src/main/java/de/marhali/easyi18n/settings/ProjectSettingsService.java @@ -31,7 +31,7 @@ public class ProjectSettingsService implements PersistentStateComponent {}); + + // Compare file structure and contents + IOFileFilter fileFilter = TrueFileFilter.INSTANCE; + + File originalDirectory = new File(Objects.requireNonNull(settings.getLocalesDirectory())); + Collection originalFiles = FileUtils.listFiles(originalDirectory, fileFilter, fileFilter); + + File outputDirectory = tempPath.toFile(); + Collection outputFiles = FileUtils.listFiles(outputDirectory, fileFilter, fileFilter); + + assertEquals(originalFiles.size(), outputFiles.size()); + + Iterator originalFilesIterator = originalFiles.iterator(); + Iterator outputFilesIterator = outputFiles.iterator(); + + while(originalFilesIterator.hasNext()) { + File originalFile = originalFilesIterator.next(); + File outputFile = outputFilesIterator.next(); + + assertEquals(FileUtils.readFileToString(originalFile, CHARSET), + FileUtils.readFileToString(outputFile, CHARSET)); + } + } +} diff --git a/src/test/java/de/marhali/easyi18n/e2e/TestSettingsState.java b/src/test/java/de/marhali/easyi18n/e2e/TestSettingsState.java new file mode 100644 index 0000000..1804075 --- /dev/null +++ b/src/test/java/de/marhali/easyi18n/e2e/TestSettingsState.java @@ -0,0 +1,46 @@ +package de.marhali.easyi18n.e2e; + +import de.marhali.easyi18n.io.folder.FolderStrategyType; +import de.marhali.easyi18n.io.parser.ParserStrategyType; +import de.marhali.easyi18n.settings.presets.DefaultPreset; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * Settings base for end-to-end tests. + * @author marhali + */ +public class TestSettingsState extends DefaultPreset { + + private final String localesDirectory; + private final FolderStrategyType folderStrategy; + private final ParserStrategyType parserStrategy; + + public TestSettingsState(String localesDirectory, FolderStrategyType folderStrategy, ParserStrategyType parserStrategy) { + this.localesDirectory = localesDirectory; + this.folderStrategy = folderStrategy; + this.parserStrategy = parserStrategy; + } + + + @Override + public @Nullable String getLocalesDirectory() { + return localesDirectory; + } + + @Override + public @NotNull FolderStrategyType getFolderStrategy() { + return folderStrategy; + } + + @Override + public @NotNull ParserStrategyType getParserStrategy() { + return parserStrategy; + } + + @Override + public @NotNull String getFilePattern() { + return "*.*"; + } +} From fd53e80e07b6770141e853ba8fbd43eec4480ec0 Mon Sep 17 00:00:00 2001 From: marhali Date: Fri, 28 Oct 2022 15:39:23 +0200 Subject: [PATCH 02/15] first e2e test with single dir .properties files --- .../e2e/single/SinglePropertiesTest.java | 20 +++++++++++++++++++ .../resources/single/properties/de.properties | 1 + .../resources/single/properties/en.properties | 1 + 3 files changed, 22 insertions(+) create mode 100644 src/test/java/de/marhali/easyi18n/e2e/single/SinglePropertiesTest.java create mode 100644 src/test/resources/single/properties/de.properties create mode 100644 src/test/resources/single/properties/en.properties diff --git a/src/test/java/de/marhali/easyi18n/e2e/single/SinglePropertiesTest.java b/src/test/java/de/marhali/easyi18n/e2e/single/SinglePropertiesTest.java new file mode 100644 index 0000000..8420450 --- /dev/null +++ b/src/test/java/de/marhali/easyi18n/e2e/single/SinglePropertiesTest.java @@ -0,0 +1,20 @@ +package de.marhali.easyi18n.e2e.single; + +import de.marhali.easyi18n.e2e.EndToEndTestCase; +import de.marhali.easyi18n.e2e.TestSettingsState; +import de.marhali.easyi18n.io.folder.FolderStrategyType; +import de.marhali.easyi18n.io.parser.ParserStrategyType; + +/** + * End-to-end tests for single directory .properties files. + * @author marhali + */ +public class SinglePropertiesTest extends EndToEndTestCase { + public SinglePropertiesTest() { + super(new TestSettingsState( + "src/test/resources/single/properties", + FolderStrategyType.SINGLE, + ParserStrategyType.PROPERTIES) + ); + } +} \ No newline at end of file diff --git a/src/test/resources/single/properties/de.properties b/src/test/resources/single/properties/de.properties new file mode 100644 index 0000000..1d9c702 --- /dev/null +++ b/src/test/resources/single/properties/de.properties @@ -0,0 +1 @@ +title=Titel diff --git a/src/test/resources/single/properties/en.properties b/src/test/resources/single/properties/en.properties new file mode 100644 index 0000000..d372c89 --- /dev/null +++ b/src/test/resources/single/properties/en.properties @@ -0,0 +1 @@ +title=Title From acb284ff889b001b6133171180cc5d60973dc7e2 Mon Sep 17 00:00:00 2001 From: marhali Date: Fri, 28 Oct 2022 15:44:20 +0200 Subject: [PATCH 03/15] fix properties parsing Resolves #190 --- CHANGELOG.md | 8 +++++--- .../io/parser/properties/PropertiesParserStrategy.java | 4 +--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2934414..0707971 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,12 +3,14 @@ # easy-i18n Changelog ## [Unreleased] +### Fixed +- Parsing for .properties files ## [4.2.4] -### Changed -- Improved exception handling on syntax errors +### Changed +- Improved exception handling on syntax errors -### Fixed +### Fixed - Some settings are not retained on IDE restarts ## [4.2.3] diff --git a/src/main/java/de/marhali/easyi18n/io/parser/properties/PropertiesParserStrategy.java b/src/main/java/de/marhali/easyi18n/io/parser/properties/PropertiesParserStrategy.java index 936dbf8..007c788 100644 --- a/src/main/java/de/marhali/easyi18n/io/parser/properties/PropertiesParserStrategy.java +++ b/src/main/java/de/marhali/easyi18n/io/parser/properties/PropertiesParserStrategy.java @@ -47,9 +47,7 @@ public class PropertiesParserStrategy extends ParserStrategy { throw new SyntaxException(ex.getMessage(), file); } - if(!input.isEmpty()) { - PropertiesMapper.read(file.getLocale(), input, targetData, converter); - } + PropertiesMapper.read(file.getLocale(), input, targetData, converter); } } From d626771f21c6da50c1979c788f0190dfba5c75a2 Mon Sep 17 00:00:00 2001 From: marhali Date: Fri, 28 Oct 2022 15:59:25 +0200 Subject: [PATCH 04/15] run on per-test basis --- .../easyi18n/settings/ProjectSettingsServiceTest.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/test/java/de/marhali/easyi18n/settings/ProjectSettingsServiceTest.java b/src/test/java/de/marhali/easyi18n/settings/ProjectSettingsServiceTest.java index 94c774f..3aaad1a 100644 --- a/src/test/java/de/marhali/easyi18n/settings/ProjectSettingsServiceTest.java +++ b/src/test/java/de/marhali/easyi18n/settings/ProjectSettingsServiceTest.java @@ -5,14 +5,22 @@ import com.intellij.util.xmlb.XmlSerializerUtil; import de.marhali.easyi18n.settings.presets.DefaultPreset; +import org.jetbrains.annotations.NotNull; + /** * Tests for the project settings service itself. * @author marhali */ public class ProjectSettingsServiceTest extends BasePlatformTestCase { + + @Override + protected @NotNull String getTestName(boolean lowercaseFirstLetter) { + return lowercaseFirstLetter ? "projectSettingsServiceTest" : "ProjectSettingsServiceTest"; + } + public void testSettingsDefaultPreset() { ProjectSettingsState state = ProjectSettingsService.get(getProject()).getState(); - assertEquals(state, new ProjectSettingsState(new DefaultPreset())); + assertEquals(new ProjectSettingsState(new DefaultPreset()), state); } public void testPersistenceState() { From 7793ad6a867a9a0cf6b3b8b70e2469afae7dbf33 Mon Sep 17 00:00:00 2001 From: marhali Date: Fri, 28 Oct 2022 16:50:42 +0200 Subject: [PATCH 05/15] reset ont init --- .../easyi18n/settings/ProjectSettingsServiceTest.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/test/java/de/marhali/easyi18n/settings/ProjectSettingsServiceTest.java b/src/test/java/de/marhali/easyi18n/settings/ProjectSettingsServiceTest.java index 3aaad1a..5ccc4f9 100644 --- a/src/test/java/de/marhali/easyi18n/settings/ProjectSettingsServiceTest.java +++ b/src/test/java/de/marhali/easyi18n/settings/ProjectSettingsServiceTest.java @@ -5,8 +5,6 @@ import com.intellij.util.xmlb.XmlSerializerUtil; import de.marhali.easyi18n.settings.presets.DefaultPreset; -import org.jetbrains.annotations.NotNull; - /** * Tests for the project settings service itself. * @author marhali @@ -14,8 +12,9 @@ import org.jetbrains.annotations.NotNull; public class ProjectSettingsServiceTest extends BasePlatformTestCase { @Override - protected @NotNull String getTestName(boolean lowercaseFirstLetter) { - return lowercaseFirstLetter ? "projectSettingsServiceTest" : "ProjectSettingsServiceTest"; + protected void setUp() throws Exception { + super.setUp(); + ProjectSettingsService.get(getProject()).setState(new ProjectSettingsState()); } public void testSettingsDefaultPreset() { From 00c1e49fb48fe8a69576a01d0f424ac5712e1749 Mon Sep 17 00:00:00 2001 From: marhali Date: Fri, 28 Oct 2022 16:51:20 +0200 Subject: [PATCH 06/15] end-to-end tests --- .../easyi18n/e2e/TestSettingsState.java | 5 +++++ .../easyi18n/e2e/single/SingleJson5Test.java | 20 +++++++++++++++++++ .../easyi18n/e2e/single/SingleJsonTest.java | 20 +++++++++++++++++++ .../easyi18n/e2e/single/SingleYamlTest.java | 20 +++++++++++++++++++ src/test/resources/single/json/de.json | 11 ++++++++++ src/test/resources/single/json/en.json | 11 ++++++++++ src/test/resources/single/json5/de.json5 | 12 +++++++++++ src/test/resources/single/json5/en.json5 | 12 +++++++++++ .../resources/single/properties/de.properties | 1 + .../resources/single/properties/en.properties | 1 + src/test/resources/single/yaml/de.yaml | 3 +++ src/test/resources/single/yaml/en.yaml | 3 +++ 12 files changed, 119 insertions(+) create mode 100644 src/test/java/de/marhali/easyi18n/e2e/single/SingleJson5Test.java create mode 100644 src/test/java/de/marhali/easyi18n/e2e/single/SingleJsonTest.java create mode 100644 src/test/java/de/marhali/easyi18n/e2e/single/SingleYamlTest.java create mode 100644 src/test/resources/single/json/de.json create mode 100644 src/test/resources/single/json/en.json create mode 100644 src/test/resources/single/json5/de.json5 create mode 100644 src/test/resources/single/json5/en.json5 create mode 100644 src/test/resources/single/yaml/de.yaml create mode 100644 src/test/resources/single/yaml/en.yaml diff --git a/src/test/java/de/marhali/easyi18n/e2e/TestSettingsState.java b/src/test/java/de/marhali/easyi18n/e2e/TestSettingsState.java index 1804075..50b403b 100644 --- a/src/test/java/de/marhali/easyi18n/e2e/TestSettingsState.java +++ b/src/test/java/de/marhali/easyi18n/e2e/TestSettingsState.java @@ -43,4 +43,9 @@ public class TestSettingsState extends DefaultPreset { public @NotNull String getFilePattern() { return "*.*"; } + + @Override + public boolean isSorting() { + return false; + } } diff --git a/src/test/java/de/marhali/easyi18n/e2e/single/SingleJson5Test.java b/src/test/java/de/marhali/easyi18n/e2e/single/SingleJson5Test.java new file mode 100644 index 0000000..ff12ae9 --- /dev/null +++ b/src/test/java/de/marhali/easyi18n/e2e/single/SingleJson5Test.java @@ -0,0 +1,20 @@ +package de.marhali.easyi18n.e2e.single; + +import de.marhali.easyi18n.e2e.EndToEndTestCase; +import de.marhali.easyi18n.e2e.TestSettingsState; +import de.marhali.easyi18n.io.folder.FolderStrategyType; +import de.marhali.easyi18n.io.parser.ParserStrategyType; + +/** + * @author marhali + * End-to-end tests for single directory json5 files. + */ +public class SingleJson5Test extends EndToEndTestCase { + public SingleJson5Test() { + super(new TestSettingsState( + "src/test/resources/single/json5", + FolderStrategyType.SINGLE, + ParserStrategyType.JSON5) + ); + } +} diff --git a/src/test/java/de/marhali/easyi18n/e2e/single/SingleJsonTest.java b/src/test/java/de/marhali/easyi18n/e2e/single/SingleJsonTest.java new file mode 100644 index 0000000..68f0826 --- /dev/null +++ b/src/test/java/de/marhali/easyi18n/e2e/single/SingleJsonTest.java @@ -0,0 +1,20 @@ +package de.marhali.easyi18n.e2e.single; + +import de.marhali.easyi18n.e2e.EndToEndTestCase; +import de.marhali.easyi18n.e2e.TestSettingsState; +import de.marhali.easyi18n.io.folder.FolderStrategyType; +import de.marhali.easyi18n.io.parser.ParserStrategyType; + +/** + * End-to-end tests for single directory json files. + * @author marhali + */ +public class SingleJsonTest extends EndToEndTestCase { + public SingleJsonTest() { + super(new TestSettingsState( + "src/test/resources/single/json", + FolderStrategyType.SINGLE, + ParserStrategyType.JSON) + ); + } +} diff --git a/src/test/java/de/marhali/easyi18n/e2e/single/SingleYamlTest.java b/src/test/java/de/marhali/easyi18n/e2e/single/SingleYamlTest.java new file mode 100644 index 0000000..da609b9 --- /dev/null +++ b/src/test/java/de/marhali/easyi18n/e2e/single/SingleYamlTest.java @@ -0,0 +1,20 @@ +package de.marhali.easyi18n.e2e.single; + +import de.marhali.easyi18n.e2e.EndToEndTestCase; +import de.marhali.easyi18n.e2e.TestSettingsState; +import de.marhali.easyi18n.io.folder.FolderStrategyType; +import de.marhali.easyi18n.io.parser.ParserStrategyType; + +/** + * End-to-ends tests for single directory yaml files. + * @author marhali + */ +public class SingleYamlTest extends EndToEndTestCase { + public SingleYamlTest() { + super(new TestSettingsState( + "src/test/resources/single/yaml", + FolderStrategyType.SINGLE, + ParserStrategyType.YML) + ); + } +} diff --git a/src/test/resources/single/json/de.json b/src/test/resources/single/json/de.json new file mode 100644 index 0000000..f1fc643 --- /dev/null +++ b/src/test/resources/single/json/de.json @@ -0,0 +1,11 @@ +{ + "title": "Titel", + "number": 187, + "object": { + "title": "Titel" + }, + "array": [ + "element1", + "element2" + ] +} \ No newline at end of file diff --git a/src/test/resources/single/json/en.json b/src/test/resources/single/json/en.json new file mode 100644 index 0000000..6bd4fdd --- /dev/null +++ b/src/test/resources/single/json/en.json @@ -0,0 +1,11 @@ +{ + "title": "Title", + "number": -187, + "object": { + "title": "Title" + }, + "array": [ + "item1", + "item2" + ] +} \ No newline at end of file diff --git a/src/test/resources/single/json5/de.json5 b/src/test/resources/single/json5/de.json5 new file mode 100644 index 0000000..97dd2e8 --- /dev/null +++ b/src/test/resources/single/json5/de.json5 @@ -0,0 +1,12 @@ +{ + "title": "Titel", + "number": 187, + "hex": 0x187, + "object": { + "title": "Titel" + }, + "array": [ + "element1", + "element2" + ] +} \ No newline at end of file diff --git a/src/test/resources/single/json5/en.json5 b/src/test/resources/single/json5/en.json5 new file mode 100644 index 0000000..b9b1ea3 --- /dev/null +++ b/src/test/resources/single/json5/en.json5 @@ -0,0 +1,12 @@ +{ + "title": "Title", + "number": -187, + "hex": -0x187, + "object": { + "title": "Title" + }, + "array": [ + "item1", + "item2" + ] +} \ No newline at end of file diff --git a/src/test/resources/single/properties/de.properties b/src/test/resources/single/properties/de.properties index 1d9c702..eef6c09 100644 --- a/src/test/resources/single/properties/de.properties +++ b/src/test/resources/single/properties/de.properties @@ -1 +1,2 @@ +breakLine=eins\nzwei title=Titel diff --git a/src/test/resources/single/properties/en.properties b/src/test/resources/single/properties/en.properties index d372c89..513620f 100644 --- a/src/test/resources/single/properties/en.properties +++ b/src/test/resources/single/properties/en.properties @@ -1 +1,2 @@ +breakLine=first\nsecond title=Title diff --git a/src/test/resources/single/yaml/de.yaml b/src/test/resources/single/yaml/de.yaml new file mode 100644 index 0000000..56a01ea --- /dev/null +++ b/src/test/resources/single/yaml/de.yaml @@ -0,0 +1,3 @@ +title: Titel +nested: + title: Titel \ No newline at end of file diff --git a/src/test/resources/single/yaml/en.yaml b/src/test/resources/single/yaml/en.yaml new file mode 100644 index 0000000..ae4f07e --- /dev/null +++ b/src/test/resources/single/yaml/en.yaml @@ -0,0 +1,3 @@ +title: Title +nested: + title: Title \ No newline at end of file From c647489981f30f995ccd0790c1b47967dea1a959 Mon Sep 17 00:00:00 2001 From: marhali Date: Fri, 28 Oct 2022 17:29:29 +0200 Subject: [PATCH 07/15] support regex file patterns Resolves #191 --- CHANGELOG.md | 3 ++ .../easyi18n/io/folder/FolderStrategy.java | 5 +-- .../easyi18n/util/WildcardRegexMatcher.java | 23 +++++++++++++ src/main/resources/messages.properties | 2 +- .../easyi18n/WildcardRegexMatcherTest.java | 34 +++++++++++++++++++ 5 files changed, 64 insertions(+), 3 deletions(-) create mode 100644 src/main/java/de/marhali/easyi18n/util/WildcardRegexMatcher.java create mode 100644 src/test/java/de/marhali/easyi18n/WildcardRegexMatcherTest.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 0707971..a88c73e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,9 @@ # easy-i18n Changelog ## [Unreleased] +### Added +- Regex support for translation file patterns + ### Fixed - Parsing for .properties files diff --git a/src/main/java/de/marhali/easyi18n/io/folder/FolderStrategy.java b/src/main/java/de/marhali/easyi18n/io/folder/FolderStrategy.java index d9161fa..149be8a 100644 --- a/src/main/java/de/marhali/easyi18n/io/folder/FolderStrategy.java +++ b/src/main/java/de/marhali/easyi18n/io/folder/FolderStrategy.java @@ -7,8 +7,8 @@ import de.marhali.easyi18n.io.parser.ParserStrategyType; import de.marhali.easyi18n.model.TranslationData; import de.marhali.easyi18n.model.TranslationFile; import de.marhali.easyi18n.settings.ProjectSettings; +import de.marhali.easyi18n.util.WildcardRegexMatcher; -import org.apache.commons.io.FilenameUtils; import org.jetbrains.annotations.NotNull; import java.io.File; @@ -51,7 +51,8 @@ public abstract class FolderStrategy { * @return true if file matches and should be processed */ protected boolean isFileRelevant(@NotNull VirtualFile file) { - return !file.isDirectory() && FilenameUtils.wildcardMatch(file.getName(), this.settings.getFilePattern()); + return !file.isDirectory() + && WildcardRegexMatcher.matchWildcardRegex(file.getName(), settings.getFilePattern()); } /** diff --git a/src/main/java/de/marhali/easyi18n/util/WildcardRegexMatcher.java b/src/main/java/de/marhali/easyi18n/util/WildcardRegexMatcher.java new file mode 100644 index 0000000..0ef4d3d --- /dev/null +++ b/src/main/java/de/marhali/easyi18n/util/WildcardRegexMatcher.java @@ -0,0 +1,23 @@ +package de.marhali.easyi18n.util; + +import org.apache.commons.io.FilenameUtils; + +/** + * Utilities for wildcard / regex matching. + * @author marhali + */ +public class WildcardRegexMatcher { + public static boolean matchWildcardRegex(String string, String pattern) { + boolean wildcardMatch = FilenameUtils.wildcardMatchOnSystem(string, pattern); + + if(wildcardMatch) { + return true; + } + + try { + return string.matches(pattern); + } catch (Exception e) { + return false; + } + } +} diff --git a/src/main/resources/messages.properties b/src/main/resources/messages.properties index 9d46c0e..e7cdeb8 100644 --- a/src/main/resources/messages.properties +++ b/src/main/resources/messages.properties @@ -31,7 +31,7 @@ settings.resource.folder.items=Single Directory;Modularized: Locale / Namespace; settings.resource.folder.tooltip=What is the folder structure of your translation files? settings.resource.parser.items=JSON;JSON5;YAML;YML;Properties;ARB settings.resource.parser.tooltip=Which file parser should be used to process your translation files? -settings.resource.file-pattern.tooltip=Defines a wildcard matcher to filter relevant translation files. For example *.json, *.??? or *.*. +settings.resource.file-pattern.tooltip=Defines a wildcard matcher or regex pattern to filter relevant translation files. For example *.json, *.??? or *.*. settings.resource.nesting.title=Consider subdirectories for modularized translation files settings.resource.nesting.tooltip=Validates directories within a module and passes them as a submodule. settings.resource.sorting.title=Sort translation keys alphabetically diff --git a/src/test/java/de/marhali/easyi18n/WildcardRegexMatcherTest.java b/src/test/java/de/marhali/easyi18n/WildcardRegexMatcherTest.java new file mode 100644 index 0000000..f80d7db --- /dev/null +++ b/src/test/java/de/marhali/easyi18n/WildcardRegexMatcherTest.java @@ -0,0 +1,34 @@ +package de.marhali.easyi18n; + +import de.marhali.easyi18n.util.WildcardRegexMatcher; + +import org.junit.Assert; +import org.junit.Test; + +/** + * Unit tests for {@link WildcardRegexMatcher}. + * @author marhali + */ +public class WildcardRegexMatcherTest extends WildcardRegexMatcher { + @Test + public void testWildcard() { + Assert.assertTrue(matchWildcardRegex("en.json", "*.json")); + Assert.assertTrue(matchWildcardRegex("de.json", "*.json")); + Assert.assertFalse(matchWildcardRegex("index.html", "*.json")); + + Assert.assertTrue(matchWildcardRegex("en.json", "*.*")); + Assert.assertFalse(matchWildcardRegex("file", "*.*")); + + Assert.assertTrue(matchWildcardRegex("en.txt", "*.???")); + Assert.assertFalse(matchWildcardRegex("en.json", "*.???")); + } + + @Test + public void testRegex() { + Assert.assertTrue(matchWildcardRegex("en.json", "^(en|de)\\.json")); + Assert.assertFalse(matchWildcardRegex("gb.json", "^(en|de)\\.json")); + + Assert.assertTrue(matchWildcardRegex("en.jpg", "^.*\\.(jpg|JPG|gif|GIF)$")); + Assert.assertFalse(matchWildcardRegex("en.json", "^.*\\.(jpg|JPG|gif|GIF)$")); + } +} \ No newline at end of file From 059d1bcc25a571d9e4e02fbe6bc5dcf491afe5a0 Mon Sep 17 00:00:00 2001 From: marhali Date: Fri, 28 Oct 2022 20:17:16 +0200 Subject: [PATCH 08/15] correct e2e tests --- src/test/resources/single/json5/de.json5 | 6 +++--- src/test/resources/single/json5/en.json5 | 6 +++--- src/test/resources/single/yaml/de.yaml | 2 +- src/test/resources/single/yaml/en.yaml | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/test/resources/single/json5/de.json5 b/src/test/resources/single/json5/de.json5 index 97dd2e8..0ab4d40 100644 --- a/src/test/resources/single/json5/de.json5 +++ b/src/test/resources/single/json5/de.json5 @@ -3,10 +3,10 @@ "number": 187, "hex": 0x187, "object": { - "title": "Titel" + "title": "Titel", }, "array": [ "element1", - "element2" - ] + "element2", + ], } \ No newline at end of file diff --git a/src/test/resources/single/json5/en.json5 b/src/test/resources/single/json5/en.json5 index b9b1ea3..7b3ddec 100644 --- a/src/test/resources/single/json5/en.json5 +++ b/src/test/resources/single/json5/en.json5 @@ -3,10 +3,10 @@ "number": -187, "hex": -0x187, "object": { - "title": "Title" + "title": "Title", }, "array": [ "item1", - "item2" - ] + "item2", + ], } \ No newline at end of file diff --git a/src/test/resources/single/yaml/de.yaml b/src/test/resources/single/yaml/de.yaml index 56a01ea..8402087 100644 --- a/src/test/resources/single/yaml/de.yaml +++ b/src/test/resources/single/yaml/de.yaml @@ -1,3 +1,3 @@ title: Titel nested: - title: Titel \ No newline at end of file + title: Titel diff --git a/src/test/resources/single/yaml/en.yaml b/src/test/resources/single/yaml/en.yaml index ae4f07e..f3a1981 100644 --- a/src/test/resources/single/yaml/en.yaml +++ b/src/test/resources/single/yaml/en.yaml @@ -1,3 +1,3 @@ title: Title nested: - title: Title \ No newline at end of file + title: Title From 55a0a3366b44ee222c6cad0317817d9be9de1e9b Mon Sep 17 00:00:00 2001 From: marhali Date: Fri, 28 Oct 2022 20:17:34 +0200 Subject: [PATCH 09/15] default to indent 2 --- .../marhali/easyi18n/io/parser/json5/Json5ParserStrategy.java | 2 +- src/main/java/thito/nodeflow/config/Section.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/de/marhali/easyi18n/io/parser/json5/Json5ParserStrategy.java b/src/main/java/de/marhali/easyi18n/io/parser/json5/Json5ParserStrategy.java index 1baf0ec..70d9224 100644 --- a/src/main/java/de/marhali/easyi18n/io/parser/json5/Json5ParserStrategy.java +++ b/src/main/java/de/marhali/easyi18n/io/parser/json5/Json5ParserStrategy.java @@ -26,7 +26,7 @@ import java.util.Objects; public class Json5ParserStrategy extends ParserStrategy { private static final Json5 JSON5 = Json5.builder(builder -> - builder.allowInvalidSurrogate().trailingComma().indentFactor(4).build()); + builder.allowInvalidSurrogate().trailingComma().indentFactor(2).build()); public Json5ParserStrategy(@NotNull ProjectSettings settings) { super(settings); diff --git a/src/main/java/thito/nodeflow/config/Section.java b/src/main/java/thito/nodeflow/config/Section.java index 2d9283e..c06fabc 100644 --- a/src/main/java/thito/nodeflow/config/Section.java +++ b/src/main/java/thito/nodeflow/config/Section.java @@ -46,7 +46,7 @@ public interface Section { } static String toString(Section section) { DumperOptions options = new DumperOptions(); - options.setIndent(4); + options.setIndent(2); options.setAllowUnicode(true); options.setPrettyFlow(true); options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); From d85db1fd48b4258395fa466246625dcf6d5d749e Mon Sep 17 00:00:00 2001 From: marhali Date: Fri, 28 Oct 2022 20:48:31 +0200 Subject: [PATCH 10/15] only perform save all inside reload --- CHANGELOG.md | 3 +++ src/main/java/de/marhali/easyi18n/DataStore.java | 3 --- src/main/java/de/marhali/easyi18n/InstanceManager.java | 1 + .../java/de/marhali/easyi18n/service/FileChangeListener.java | 5 +---- src/test/java/de/marhali/easyi18n/e2e/EndToEndTestCase.java | 2 +- 5 files changed, 6 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a88c73e..0847f4e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,9 @@ ### Added - Regex support for translation file patterns +### Changed +- Reload function internally consolidated + ### Fixed - Parsing for .properties files diff --git a/src/main/java/de/marhali/easyi18n/DataStore.java b/src/main/java/de/marhali/easyi18n/DataStore.java index b335c88..db0bf31 100644 --- a/src/main/java/de/marhali/easyi18n/DataStore.java +++ b/src/main/java/de/marhali/easyi18n/DataStore.java @@ -49,9 +49,6 @@ public class DataStore { */ public void loadFromPersistenceLayer(@NotNull Consumer successResult) { ProjectSettings settings = ProjectSettingsService.get(project).getState(); - - ApplicationManager.getApplication().saveAll(); // Save opened files (required if new locales were added) - ApplicationManager.getApplication().runReadAction(() -> { try { this.data = new IOHandler(project, settings).read(); diff --git a/src/main/java/de/marhali/easyi18n/InstanceManager.java b/src/main/java/de/marhali/easyi18n/InstanceManager.java index 829c60a..8eddfae 100644 --- a/src/main/java/de/marhali/easyi18n/InstanceManager.java +++ b/src/main/java/de/marhali/easyi18n/InstanceManager.java @@ -72,6 +72,7 @@ public class InstanceManager { * Fetches data from persistence layer and notifies all endpoints via {@link DataBus}. */ public void reload() { + ApplicationManager.getApplication().saveAll(); // Save opened files (required if new locales were added) store.loadFromPersistenceLayer((success) -> bus.propagate().onUpdateData(store.getData())); } diff --git a/src/main/java/de/marhali/easyi18n/service/FileChangeListener.java b/src/main/java/de/marhali/easyi18n/service/FileChangeListener.java index 00ed6e2..88ce083 100644 --- a/src/main/java/de/marhali/easyi18n/service/FileChangeListener.java +++ b/src/main/java/de/marhali/easyi18n/service/FileChangeListener.java @@ -54,10 +54,7 @@ public class FileChangeListener implements AsyncFileListener { events.forEach((e) -> { if(e.getPath().contains(localesPath)) { // Perform reload logger.debug("Detected file change. Reloading instance..."); - InstanceManager manager = InstanceManager.get(project); - manager.store().loadFromPersistenceLayer((success) -> { - manager.bus().propagate().onUpdateData(manager.store().getData()); - }); + InstanceManager.get(project).reload(); } }); } diff --git a/src/test/java/de/marhali/easyi18n/e2e/EndToEndTestCase.java b/src/test/java/de/marhali/easyi18n/e2e/EndToEndTestCase.java index a5a7f2f..95a8c87 100644 --- a/src/test/java/de/marhali/easyi18n/e2e/EndToEndTestCase.java +++ b/src/test/java/de/marhali/easyi18n/e2e/EndToEndTestCase.java @@ -51,7 +51,7 @@ public abstract class EndToEndTestCase extends BasePlatformTestCase { public void testParseAndSerialize() throws IOException { // Read translation files based on the provided settings - InstanceManager.get(getProject()).reload(); + InstanceManager.get(getProject()).store().loadFromPersistenceLayer(success -> {}); // Save the cached translation data to a temporary output directory ProjectSettingsState out = new ProjectSettingsState(settings); From 2b4170ada0577d9a279dde1a1751bf8143b2f822 Mon Sep 17 00:00:00 2001 From: marhali Date: Fri, 28 Oct 2022 21:41:58 +0200 Subject: [PATCH 11/15] fix line endings --- src/test/resources/single/json/de.json | 20 ++++++++--------- src/test/resources/single/json/en.json | 20 ++++++++--------- src/test/resources/single/json5/de.json5 | 22 +++++++++---------- src/test/resources/single/json5/en.json5 | 22 +++++++++---------- .../resources/single/properties/de.properties | 4 ++-- .../resources/single/properties/en.properties | 4 ++-- src/test/resources/single/yaml/de.yaml | 6 ++--- src/test/resources/single/yaml/en.yaml | 6 ++--- 8 files changed, 52 insertions(+), 52 deletions(-) diff --git a/src/test/resources/single/json/de.json b/src/test/resources/single/json/de.json index f1fc643..145065b 100644 --- a/src/test/resources/single/json/de.json +++ b/src/test/resources/single/json/de.json @@ -1,11 +1,11 @@ -{ - "title": "Titel", - "number": 187, - "object": { - "title": "Titel" - }, - "array": [ - "element1", - "element2" - ] +{ + "title": "Titel", + "number": 187, + "object": { + "title": "Titel" + }, + "array": [ + "element1", + "element2" + ] } \ No newline at end of file diff --git a/src/test/resources/single/json/en.json b/src/test/resources/single/json/en.json index 6bd4fdd..b274e3a 100644 --- a/src/test/resources/single/json/en.json +++ b/src/test/resources/single/json/en.json @@ -1,11 +1,11 @@ -{ - "title": "Title", - "number": -187, - "object": { - "title": "Title" - }, - "array": [ - "item1", - "item2" - ] +{ + "title": "Title", + "number": -187, + "object": { + "title": "Title" + }, + "array": [ + "item1", + "item2" + ] } \ No newline at end of file diff --git a/src/test/resources/single/json5/de.json5 b/src/test/resources/single/json5/de.json5 index 0ab4d40..2f722ae 100644 --- a/src/test/resources/single/json5/de.json5 +++ b/src/test/resources/single/json5/de.json5 @@ -1,12 +1,12 @@ -{ - "title": "Titel", - "number": 187, - "hex": 0x187, - "object": { - "title": "Titel", - }, - "array": [ - "element1", - "element2", - ], +{ + "title": "Titel", + "number": 187, + "hex": 0x187, + "object": { + "title": "Titel", + }, + "array": [ + "element1", + "element2", + ], } \ No newline at end of file diff --git a/src/test/resources/single/json5/en.json5 b/src/test/resources/single/json5/en.json5 index 7b3ddec..3161f98 100644 --- a/src/test/resources/single/json5/en.json5 +++ b/src/test/resources/single/json5/en.json5 @@ -1,12 +1,12 @@ -{ - "title": "Title", - "number": -187, - "hex": -0x187, - "object": { - "title": "Title", - }, - "array": [ - "item1", - "item2", - ], +{ + "title": "Title", + "number": -187, + "hex": -0x187, + "object": { + "title": "Title", + }, + "array": [ + "item1", + "item2", + ], } \ No newline at end of file diff --git a/src/test/resources/single/properties/de.properties b/src/test/resources/single/properties/de.properties index eef6c09..da7cba4 100644 --- a/src/test/resources/single/properties/de.properties +++ b/src/test/resources/single/properties/de.properties @@ -1,2 +1,2 @@ -breakLine=eins\nzwei -title=Titel +breakLine=eins\nzwei +title=Titel diff --git a/src/test/resources/single/properties/en.properties b/src/test/resources/single/properties/en.properties index 513620f..f9b8eca 100644 --- a/src/test/resources/single/properties/en.properties +++ b/src/test/resources/single/properties/en.properties @@ -1,2 +1,2 @@ -breakLine=first\nsecond -title=Title +breakLine=first\nsecond +title=Title diff --git a/src/test/resources/single/yaml/de.yaml b/src/test/resources/single/yaml/de.yaml index 8402087..5e7a01e 100644 --- a/src/test/resources/single/yaml/de.yaml +++ b/src/test/resources/single/yaml/de.yaml @@ -1,3 +1,3 @@ -title: Titel -nested: - title: Titel +title: Titel +nested: + title: Titel diff --git a/src/test/resources/single/yaml/en.yaml b/src/test/resources/single/yaml/en.yaml index f3a1981..f9e21b7 100644 --- a/src/test/resources/single/yaml/en.yaml +++ b/src/test/resources/single/yaml/en.yaml @@ -1,3 +1,3 @@ -title: Title -nested: - title: Title +title: Title +nested: + title: Title From 1a4df58447d9d0836a371aa740790e8391b7c68b Mon Sep 17 00:00:00 2001 From: marhali Date: Fri, 28 Oct 2022 22:03:23 +0200 Subject: [PATCH 12/15] fix test on Windows --- .../easyi18n/e2e/EndToEndTestCase.java | 170 +++++++++--------- 1 file changed, 85 insertions(+), 85 deletions(-) diff --git a/src/test/java/de/marhali/easyi18n/e2e/EndToEndTestCase.java b/src/test/java/de/marhali/easyi18n/e2e/EndToEndTestCase.java index 95a8c87..36ef393 100644 --- a/src/test/java/de/marhali/easyi18n/e2e/EndToEndTestCase.java +++ b/src/test/java/de/marhali/easyi18n/e2e/EndToEndTestCase.java @@ -1,85 +1,85 @@ -package de.marhali.easyi18n.e2e; - -import com.intellij.testFramework.fixtures.BasePlatformTestCase; - -import de.marhali.easyi18n.InstanceManager; -import de.marhali.easyi18n.settings.ProjectSettings; -import de.marhali.easyi18n.settings.ProjectSettingsService; -import de.marhali.easyi18n.settings.ProjectSettingsState; - -import org.apache.commons.io.FileUtils; -import org.apache.commons.io.filefilter.IOFileFilter; -import org.apache.commons.io.filefilter.TrueFileFilter; - -import java.io.File; -import java.io.IOException; -import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.Collection; -import java.util.Iterator; -import java.util.Objects; - -/** - * End-to-end test case. - * @author marhali - */ -public abstract class EndToEndTestCase extends BasePlatformTestCase { - - private static final Charset CHARSET = StandardCharsets.UTF_8; - - private final ProjectSettings settings; - private Path tempPath; - - public EndToEndTestCase(ProjectSettings settings) { - this.settings = settings; - } - - @Override - protected void setUp() throws Exception { - super.setUp(); - ProjectSettingsService.get(getProject()).setState(new ProjectSettingsState(settings)); - tempPath = Files.createTempDirectory("tests-easyi18n-"); - } - - @Override - protected void tearDown() throws Exception { - FileUtils.deleteDirectory(tempPath.toFile()); - super.tearDown(); - } - - public void testParseAndSerialize() throws IOException { - // Read translation files based on the provided settings - InstanceManager.get(getProject()).store().loadFromPersistenceLayer(success -> {}); - - // Save the cached translation data to a temporary output directory - ProjectSettingsState out = new ProjectSettingsState(settings); - out.setLocalesDirectory(tempPath.toString()); - ProjectSettingsService.get(getProject()).setState(out); - - InstanceManager.get(getProject()).store().saveToPersistenceLayer(success -> {}); - - // Compare file structure and contents - IOFileFilter fileFilter = TrueFileFilter.INSTANCE; - - File originalDirectory = new File(Objects.requireNonNull(settings.getLocalesDirectory())); - Collection originalFiles = FileUtils.listFiles(originalDirectory, fileFilter, fileFilter); - - File outputDirectory = tempPath.toFile(); - Collection outputFiles = FileUtils.listFiles(outputDirectory, fileFilter, fileFilter); - - assertEquals(originalFiles.size(), outputFiles.size()); - - Iterator originalFilesIterator = originalFiles.iterator(); - Iterator outputFilesIterator = outputFiles.iterator(); - - while(originalFilesIterator.hasNext()) { - File originalFile = originalFilesIterator.next(); - File outputFile = outputFilesIterator.next(); - - assertEquals(FileUtils.readFileToString(originalFile, CHARSET), - FileUtils.readFileToString(outputFile, CHARSET)); - } - } -} +package de.marhali.easyi18n.e2e; + +import com.intellij.testFramework.fixtures.BasePlatformTestCase; + +import de.marhali.easyi18n.InstanceManager; +import de.marhali.easyi18n.settings.ProjectSettings; +import de.marhali.easyi18n.settings.ProjectSettingsService; +import de.marhali.easyi18n.settings.ProjectSettingsState; + +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.filefilter.IOFileFilter; +import org.apache.commons.io.filefilter.TrueFileFilter; + +import java.io.File; +import java.io.IOException; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Collection; +import java.util.Iterator; +import java.util.Objects; + +/** + * End-to-end test case. + * @author marhali + */ +public abstract class EndToEndTestCase extends BasePlatformTestCase { + + private static final Charset CHARSET = StandardCharsets.UTF_8; + + private final ProjectSettings settings; + private Path tempPath; + + public EndToEndTestCase(ProjectSettings settings) { + this.settings = settings; + } + + @Override + protected void setUp() throws Exception { + super.setUp(); + ProjectSettingsService.get(getProject()).setState(new ProjectSettingsState(settings)); + tempPath = Files.createTempDirectory("tests-easyi18n-"); + } + + @Override + protected void tearDown() throws Exception { + FileUtils.deleteDirectory(tempPath.toFile()); + super.tearDown(); + } + + public void testParseAndSerialize() throws IOException { + // Read translation files based on the provided settings + InstanceManager.get(getProject()).store().loadFromPersistenceLayer(success -> {}); + + // Save the cached translation data to a temporary output directory + ProjectSettingsState out = new ProjectSettingsState(settings); + out.setLocalesDirectory(tempPath.toString()); + ProjectSettingsService.get(getProject()).setState(out); + + InstanceManager.get(getProject()).store().saveToPersistenceLayer(success -> {}); + + // Compare file structure and contents + IOFileFilter fileFilter = TrueFileFilter.INSTANCE; + + File originalDirectory = new File(Objects.requireNonNull(settings.getLocalesDirectory())); + Collection originalFiles = FileUtils.listFiles(originalDirectory, fileFilter, fileFilter); + + File outputDirectory = tempPath.toFile(); + Collection outputFiles = FileUtils.listFiles(outputDirectory, fileFilter, fileFilter); + + assertEquals(originalFiles.size(), outputFiles.size()); + + Iterator originalFilesIterator = originalFiles.iterator(); + Iterator outputFilesIterator = outputFiles.iterator(); + + while(originalFilesIterator.hasNext()) { + File originalFile = originalFilesIterator.next(); + File outputFile = outputFilesIterator.next(); + + assertEquals(FileUtils.readFileToString(originalFile, CHARSET), + FileUtils.readFileToString(outputFile, CHARSET).replace("\r\n", "\n")); + } + } +} From 853f36dd551dcdcf7ecbb724babe8c06f59207db Mon Sep 17 00:00:00 2001 From: marhali Date: Fri, 28 Oct 2022 22:31:58 +0200 Subject: [PATCH 13/15] preserve file order for comparing --- .../easyi18n/e2e/EndToEndTestCase.java | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/test/java/de/marhali/easyi18n/e2e/EndToEndTestCase.java b/src/test/java/de/marhali/easyi18n/e2e/EndToEndTestCase.java index 36ef393..7a58781 100644 --- a/src/test/java/de/marhali/easyi18n/e2e/EndToEndTestCase.java +++ b/src/test/java/de/marhali/easyi18n/e2e/EndToEndTestCase.java @@ -17,8 +17,7 @@ import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; -import java.util.Collection; -import java.util.Iterator; +import java.util.Arrays; import java.util.Objects; /** @@ -64,22 +63,23 @@ public abstract class EndToEndTestCase extends BasePlatformTestCase { IOFileFilter fileFilter = TrueFileFilter.INSTANCE; File originalDirectory = new File(Objects.requireNonNull(settings.getLocalesDirectory())); - Collection originalFiles = FileUtils.listFiles(originalDirectory, fileFilter, fileFilter); + File[] originalFiles = FileUtils.listFiles(originalDirectory, fileFilter, fileFilter).toArray(new File[0]); File outputDirectory = tempPath.toFile(); - Collection outputFiles = FileUtils.listFiles(outputDirectory, fileFilter, fileFilter); + File[] outputFiles = FileUtils.listFiles(outputDirectory, fileFilter, fileFilter).toArray(new File[0]); - assertEquals(originalFiles.size(), outputFiles.size()); + Arrays.sort(originalFiles); + Arrays.sort(outputFiles); - Iterator originalFilesIterator = originalFiles.iterator(); - Iterator outputFilesIterator = outputFiles.iterator(); + assertEquals(originalFiles.length, outputFiles.length); - while(originalFilesIterator.hasNext()) { - File originalFile = originalFilesIterator.next(); - File outputFile = outputFilesIterator.next(); + for(int i = 0; i < originalFiles.length; i++) { + File originalFile = originalFiles[i]; + File outputFile = outputFiles[i]; - assertEquals(FileUtils.readFileToString(originalFile, CHARSET), - FileUtils.readFileToString(outputFile, CHARSET).replace("\r\n", "\n")); + // Replace originalFile with os-dependent line-separators + assertEquals(FileUtils.readFileToString(originalFile, CHARSET).replace("\n", System.lineSeparator()), + FileUtils.readFileToString(outputFile, CHARSET)); } } } From c1c7c921c2ce5839fef880a8ea726898011d28a3 Mon Sep 17 00:00:00 2001 From: marhali Date: Fri, 28 Oct 2022 22:50:49 +0200 Subject: [PATCH 14/15] support 2022.3 --- CHANGELOG.md | 1 + gradle.properties | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0847f4e..fbd8650 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ ## [Unreleased] ### Added +- Support for IntelliJ Platform version 2022.3 - Regex support for translation file patterns ### Changed diff --git a/gradle.properties b/gradle.properties index 0ce983e..777bdc8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -9,7 +9,7 @@ pluginVersion = 4.2.4 # See https://plugins.jetbrains.com/docs/intellij/build-number-ranges.html # for insight into build numbers and IntelliJ Platform versions. pluginSinceBuild = 203 -pluginUntilBuild = 222.* +pluginUntilBuild = 223 # IntelliJ Platform Properties -> https://github.com/JetBrains/gradle-intellij-plugin#intellij-platform-properties platformType = IU From 692065478522949a617cacae12e7ddb5a6a79067 Mon Sep 17 00:00:00 2001 From: marhali Date: Fri, 28 Oct 2022 22:51:12 +0200 Subject: [PATCH 15/15] prepare minor release --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 777bdc8..d171033 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,7 +4,7 @@ pluginGroup = de.marhali.easyi18n pluginName = easy-i18n # SemVer format -> https://semver.org -pluginVersion = 4.2.4 +pluginVersion = 4.3.0 # See https://plugins.jetbrains.com/docs/intellij/build-number-ranges.html # for insight into build numbers and IntelliJ Platform versions.