You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@freemarker.apache.org by sg...@apache.org on 2020/11/09 12:15:33 UTC
[freemarker-generator] 01/01: FREEMARKER-163 Integrate Java Faker
library for test data generation
This is an automated email from the ASF dual-hosted git repository.
sgoeschl pushed a commit to branch FREEMARKER-163
in repository https://gitbox.apache.org/repos/asf/freemarker-generator.git
commit 75e9e2dcd474f3f9c8186c68e0ed80bce69038be
Author: Siegfried Goeschl <si...@gmail.com>
AuthorDate: Mon Nov 9 13:14:38 2020 +0100
FREEMARKER-163 Integrate Java Faker library for test data generation
---
.../src/app/config/freemarker-generator.properties | 3 +-
.../examples/templates/javafaker/csv/testdata.ftl | 47 ++++++++++++++++
.../src/app/scripts/run-examples.bat | 6 ++
.../src/app/scripts/run-examples.sh | 7 +++
.../markdown/cli/introduction/getting-started.md | 61 ++++++++-------------
.../site/markdown/cli/usage/generating-testdata.md | 60 ++++++++++++++++++++
.../src/site/markdown/index.md | 1 +
.../freemarker/generator/cli/ExamplesTest.java | 5 ++
freemarker-generator-tools/pom.xml | 6 ++
.../generator/tools/javafaker/JavaFakerTool.java | 64 ++++++++++++++++++++++
.../tools/javafaker/JavaFakerToolTest.java | 43 +++++++++++++++
11 files changed, 264 insertions(+), 39 deletions(-)
diff --git a/freemarker-generator-cli/src/app/config/freemarker-generator.properties b/freemarker-generator-cli/src/app/config/freemarker-generator.properties
index fd4a8f9..25b7029 100644
--- a/freemarker-generator-cli/src/app/config/freemarker-generator.properties
+++ b/freemarker-generator-cli/src/app/config/freemarker-generator.properties
@@ -14,13 +14,11 @@
## See the License for the specific language governing permissions and
## limitations under the License.
## ---------------------------------------------------------------------------
-
#############################################################################
# General FreeMarker Configuration
# See https://freemarker.apache.org/docs/api/freemarker/template/Configuration.html#setSetting-java.lang.String-java.lang.String-
#############################################################################
# freemarker.configuration.setting.locale=JVM default
-
#############################################################################
# Configure FreeMarker Tools (name -> implementation class)
#############################################################################
@@ -31,6 +29,7 @@ freemarker.tools.exec=org.apache.freemarker.generator.tools.commonsexec.CommonsE
freemarker.tools.freemarker=org.apache.freemarker.generator.tools.freemarker.FreeMarkerTool
freemarker.tools.grok=org.apache.freemarker.generator.tools.grok.GrokTool
freemarker.tools.gson=org.apache.freemarker.generator.tools.gson.GsonTool
+freemarker.tools.javafaker=org.apache.freemarker.generator.tools.javafaker.JavaFakerTool
freemarker.tools.jsonpath=org.apache.freemarker.generator.tools.jsonpath.JsonPathTool
freemarker.tools.jsoup=org.apache.freemarker.generator.tools.jsoup.JsoupTool
freemarker.tools.properties=org.apache.freemarker.generator.tools.properties.PropertiesTool
diff --git a/freemarker-generator-cli/src/app/examples/templates/javafaker/csv/testdata.ftl b/freemarker-generator-cli/src/app/examples/templates/javafaker/csv/testdata.ftl
new file mode 100644
index 0000000..86bc223
--- /dev/null
+++ b/freemarker-generator-cli/src/app/examples/templates/javafaker/csv/testdata.ftl
@@ -0,0 +1,47 @@
+<#ftl output_format="plainText" strip_whitespace=true>
+<#--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-->
+<#import "/freemarker-generator/lib/commons-csv.ftl" as csv />
+<#assign timeUnits = tools.javafaker.timeUnits>
+<#assign faker = tools.javafaker.faker>
+<#assign csvTargetFormat = csv.targetFormat()>
+<#assign csvPrinter = tools.csv.printer(csvTargetFormat)>
+<#assign csvHeaders = ['ID','CUSTOMER_ID','FIRST_NAME','LAST_NAME','EMAIL','IBAN','CREATED_AT']>
+<#compress>
+ <#if csvTargetFormat.getSkipHeaderRecord()>
+ ${csvPrinter.printRecord(csvHeaders)}<#t>
+ </#if>
+ <#list 1..10 as i>
+ <#assign id = tools.uuid.randomUUID()>
+ <#assign customerId = faker.bothify("?#######")>
+ <#assign firstName = faker.name().firstName()>
+ <#assign lastName = faker.name().lastName()>
+ <#assign email = firstName + "." + lastName + "@gmail.com">
+ <#assign iban = faker.finance().iban("AT")>
+ <#assign createAt = faker.date().past(3650, timeUnits["DAYS"])>
+
+ ${csvPrinter.printRecord(
+ id,
+ customerId,
+ firstName,
+ lastName,
+ email?lower_case
+ iban,
+ createAt?datetime?iso_local
+ )}<#t>
+ </#list>
+</#compress>
\ No newline at end of file
diff --git a/freemarker-generator-cli/src/app/scripts/run-examples.bat b/freemarker-generator-cli/src/app/scripts/run-examples.bat
index c472333..4bb5e5e 100644
--- a/freemarker-generator-cli/src/app/scripts/run-examples.bat
+++ b/freemarker-generator-cli/src/app/scripts/run-examples.bat
@@ -127,6 +127,12 @@ echo "examples\templates\html\txt\licence.ftl"
%FREEMARKER_CMD% -t examples\templates\html\txt\licence.ftl examples\data\html\dependencies.html > target\out\licence.txt
REM =========================================================================
+REM Java Faker
+REM =========================================================================
+echo "examples/templates/javafaker/csv/testdata.ftl"
+%FREEMARKER_CMD% -t examples/templates/javafaker/csv/testdata.ftl > target/out/testdata.csv
+
+REM =========================================================================
REM JSON
REM =========================================================================
diff --git a/freemarker-generator-cli/src/app/scripts/run-examples.sh b/freemarker-generator-cli/src/app/scripts/run-examples.sh
index 89f86e7..316a098 100755
--- a/freemarker-generator-cli/src/app/scripts/run-examples.sh
+++ b/freemarker-generator-cli/src/app/scripts/run-examples.sh
@@ -147,6 +147,13 @@ echo "examples/templates/html/txt/licence.ftl"
$FREEMARKER_CMD -t examples/templates/html/txt/licence.ftl examples/data/html/dependencies.html > target/out/licence.txt || { echo >&2 "Test failed. Aborting."; exit 1; }
#############################################################################
+# Java Faker
+#############################################################################
+
+echo "examples/templates/javafaker/csv/testdata.ftl"
+$FREEMARKER_CMD -t examples/templates/javafaker/csv/testdata.ftl > target/out/testdata.csv || { echo >&2 "Test failed. Aborting."; exit 1; }
+
+#############################################################################
# JSON
#############################################################################
diff --git a/freemarker-generator-cli/src/site/markdown/cli/introduction/getting-started.md b/freemarker-generator-cli/src/site/markdown/cli/introduction/getting-started.md
index 74deace..f1bc312 100644
--- a/freemarker-generator-cli/src/site/markdown/cli/introduction/getting-started.md
+++ b/freemarker-generator-cli/src/site/markdown/cli/introduction/getting-started.md
@@ -91,53 +91,40 @@ to better understand `Apache FreeMarker Generator`
FreeMarker Generator Information
------------------------------------------------------------------------------
FreeMarker version : 2.3.30
-Template name : templates/info.ftl
+Template name : info.ftl
Language : en
Locale : en_US
-Timestamp : Jun 26, 2020 10:44:15 AM
+Timestamp : Nov 9, 2020 1:13:21 PM
Output encoding : UTF-8
Output format : plainText
FreeMarker Generator Template Loader Directories
------------------------------------------------------------------------------
-[#1] /Users/sgoeschl/work/github/apache/freemarker-generator
-[#2] /Users/sgoeschl/.freemarker-generator
-[#3] /Applications/Java/freemarker-generator-2.0.0
-
-FreeMarker Generator Tools
-------------------------------------------------------------------------------
-- CSVTool : Process CSV files using Apache Commons CSV (see https://commons.apache.org/proper/commons-csv/)
-- DataFrameTool : Bridge to [nRo/DataFrame](https://github.com/nRo/DataFrame)
-- ExcelTool : Process Excels files (XLS, XLSX) using Apache POI (see https://poi.apache.org)
-- ExecTool : Execute command line tools using Apache Commons Exec (see https://commons.apache.org/proper/commons-exec/)
-- FreeMarkerTool : Expose advanced Apache FreeMarker classes
-- GrokTool : Process text files using Grok expressions (see https://github.com/thekrakken/java-grok)
-- GsonTool : Process JSON files using GSON (see https://github.com/google/gson)
-- JsonPathTool : Process JSON files using Java JSON Path (see https://github.com/json-path/JsonPath)
-- JsoupTool : Process HTML files using Jsoup (see https://jsoup.org)
-- PropertiesTool : Process JDK properties files
-- SystemTool : Expose System-related utility methods
-- UUIDTool : Create UUIDs
-- XmlTool : Process XML files using Apache FreeMarker (see https://freemarker.apache.org/docs/xgui.html)
-- YamlTool : Process YAML files using SnakeYAML(see https://bitbucket.org/asomov/snakeyaml/wiki/Home)
+[#1] /Users/sgoeschl/.freemarker-generator/templates
+[#2] /Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/templates
FreeMarker Generator Data Model
---------------------------------------------------------------------------
-- CSVTool
-- DataFrameTool
-- DataSources
-- ExcelTool
-- ExecTool
-- FreeMarkerTool
-- GrokTool
-- GsonTool
-- JsonPathTool
-- JsoupTool
-- PropertiesTool
-- SystemTool
-- UUIDTool
-- XmlTool
-- YamlTool
+- dataSources
+- tools
+
+FreeMarker Generator Tools
+------------------------------------------------------------------------------
+- csv : Process CSV files using Apache Commons CSV (see https://commons.apache.org/proper/commons-csv/)
+- dataframe : Bridge to [nRo/DataFrame](https://github.com/nRo/DataFrame)
+- excel : Process Excels files (XLS, XLSX) using Apache POI (see https://poi.apache.org)
+- exec : Execute command line tools using Apache Commons Exec (see https://commons.apache.org/proper/commons-exec/)
+- freemarker : Expose advanced Apache FreeMarker classes
+- grok : Process text files using Grok expressions (see https://github.com/thekrakken/java-grok)
+- gson : Process JSON files using GSON (see https://github.com/google/gson)
+- javafaker : Generate test data using Java Faker (see https://github.com/DiUS/java-faker)
+- jsonpath : Process JSON files using Java JSON Path (see https://github.com/json-path/JsonPath)
+- jsoup : Process HTML files using Jsoup (see https://jsoup.org)
+- properties : Process JDK properties files
+- system : Expose System-related utility methods
+- uuid : Create UUIDs
+- xml : Process XML files using Apache FreeMarker (see https://freemarker.apache.org/docs/xgui.html)
+- yaml : Process YAML files using SnakeYAML(see https://bitbucket.org/asomov/snakeyaml/wiki/Home)
```
* The "FreeMarker Generator Information" section provides insights into configuration and currently processed template.
diff --git a/freemarker-generator-cli/src/site/markdown/cli/usage/generating-testdata.md b/freemarker-generator-cli/src/site/markdown/cli/usage/generating-testdata.md
new file mode 100644
index 0000000..eedd1b9
--- /dev/null
+++ b/freemarker-generator-cli/src/site/markdown/cli/usage/generating-testdata.md
@@ -0,0 +1,60 @@
+## Generating Test Data
+
+The generation of test data is supported by [Java Faker](https://github.com/DiUS/java-faker).
+
+Let's assume that you need to populate a user table based on a CSV file
+
+```
+freemarker-generator -t examples/templates/javafaker/csv/testdata.ftl
+```
+
+will generate
+
+```
+ID,CUSTOMER_ID,FIRST_NAME,LAST_NAME,EMAIL,IBAN,CREATED_AT
+7e522b5c-1c7f-4195-8585-2268cc7f152a,l1671977,Eddy,Schuster,eddy.schuster@gmail.com,AT101071425404684529,2019-05-18T17:28:30+02:00
+701db208-923b-4100-a02b-4d574b0b703d,e5229102,Mark,Rogahn,mark.rogahn@gmail.com,AT491398501778297253,2014-06-16T21:48:24+02:00
+d5e99c0f-0117-42f9-83a2-33052656e9d6,g0941131,Randall,Cronin,randall.cronin@gmail.com,AT788431029877229377,2016-01-08T05:12:26+01:00
+e2b44ea6-4033-45c9-b9c3-bc9c8f6bc3fe,o4440179,Arthur,Reichel,arthur.reichel@gmail.com,AT767530622367679157,2013-04-07T12:56:13+02:00
+d0dd2806-fe11-487c-9d9b-22dd3ec1abc4,i5706274,Elroy,Sawayn,elroy.sawayn@gmail.com,AT459308883343277427,2017-02-06T01:53:34+01:00
+d36d6851-e961-4f07-9fcc-f7a0702fa6b6,s5645599,Jerald,Nitzsche,jerald.nitzsche@gmail.com,AT366350952237029663,2015-06-14T21:43:32+02:00
+6b9999cf-5aed-4e12-bc6e-e88a7973154d,n4220945,Grant,Bayer,grant.bayer@gmail.com,AT275651850312588466,2020-07-18T15:07:07+02:00
+5fd8286e-cc2f-4fe9-bf56-2245d1bf0c34,t0311536,Edison,Hoppe,edison.hoppe@gmail.com,AT847505633045057210,2017-04-23T23:26:42+02:00
+e0638c76-f130-4daa-9c62-40304101c8ab,b7209087,Nicky,Cole,nicky.cole@gmail.com,AT127017906823575933,2014-08-30T20:38:11+02:00
+c35e2b24-9b9b-4fb0-b25b-72af93301da5,a0087873,Raleigh,Leffler,raleigh.leffler@gmail.com,AT140117255798582963,2016-04-04T12:12:29+02:00
+```
+
+using the following FreeMarker template
+
+```
+<#import "/freemarker-generator/lib/commons-csv.ftl" as csv />
+<#assign timeUnits = tools.javafaker.timeUnits>
+<#assign faker = tools.javafaker.faker>
+<#assign csvTargetFormat = csv.targetFormat()>
+<#assign csvPrinter = tools.csv.printer(csvTargetFormat)>
+<#assign csvHeaders = ['ID','CUSTOMER_ID','FIRST_NAME','LAST_NAME','EMAIL','IBAN','CREATED_AT']>
+<#compress>
+ <#if csvTargetFormat.getSkipHeaderRecord()>
+ ${csvPrinter.printRecord(csvHeaders)}<#t>
+ </#if>
+ <#list 1..10 as i>
+ <#assign id = tools.uuid.randomUUID()>
+ <#assign customerId = faker.bothify("?#######")>
+ <#assign firstName = faker.name().firstName()>
+ <#assign lastName = faker.name().lastName()>
+ <#assign email = firstName + "." + lastName + "@gmail.com">
+ <#assign iban = faker.finance().iban("AT")>
+ <#assign createAt = faker.date().past(3650, timeUnits["DAYS"])>
+
+ ${csvPrinter.printRecord(
+ id,
+ customerId,
+ firstName,
+ lastName,
+ email?lower_case
+ iban,
+ createAt?datetime?iso_local
+ )}<#t>
+ </#list>
+</#compress>
+```
diff --git a/freemarker-generator-cli/src/site/markdown/index.md b/freemarker-generator-cli/src/site/markdown/index.md
index 1b33d5c..9a6ecc4 100644
--- a/freemarker-generator-cli/src/site/markdown/index.md
+++ b/freemarker-generator-cli/src/site/markdown/index.md
@@ -30,6 +30,7 @@
* [Transforming Directories](cli/usage/transforming-directories.html)
* [Using DataFrames](cli/usage/using-dataframes.html)
* [Transforming CSV](cli/usage/transforming-csv.html)
+* [Generating Test Data](cli/usage/generating-testdata.html)
### Advanced Topics
diff --git a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ExamplesTest.java b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ExamplesTest.java
index a2e7c79..b44d94e 100644
--- a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ExamplesTest.java
+++ b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ExamplesTest.java
@@ -113,6 +113,11 @@ public class ExamplesTest extends AbstractMainTest {
}
@Test
+ public void shouldRunJavaFakerExamples() throws IOException {
+ assertValid(execute("-PCSV_TARGET_DELIMITER=SEMICOLON -t src/app/examples/templates/javafaker/csv/testdata.ftl"));
+ }
+
+ @Test
public void shouldRunInteractiveTemplateExamples() throws IOException {
assertValid(execute("-i ${tools.jsonpath.parse(dataSources?values[0]).read(\"$.info.title\")} src/app/examples/data/json/swagger-spec.json"));
assertValid(execute("-i ${tools.xml.parse(dataSources?values[0])[\"recipients/person[1]/name\"]} src/app/examples/data/xml/recipients.xml"));
diff --git a/freemarker-generator-tools/pom.xml b/freemarker-generator-tools/pom.xml
index 2d590a2..c533a6d 100644
--- a/freemarker-generator-tools/pom.xml
+++ b/freemarker-generator-tools/pom.xml
@@ -93,6 +93,12 @@
<artifactId>gson</artifactId>
<version>2.8.6</version>
</dependency>
+ <!-- Java Faker -->
+ <dependency>
+ <groupId>com.github.javafaker</groupId>
+ <artifactId>javafaker</artifactId>
+ <version>1.0.2</version>
+ </dependency>
<!-- JsonPath Tool -->
<dependency>
<groupId>com.jayway.jsonpath</groupId>
diff --git a/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/javafaker/JavaFakerTool.java b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/javafaker/JavaFakerTool.java
new file mode 100644
index 0000000..0dd2b46
--- /dev/null
+++ b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/javafaker/JavaFakerTool.java
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.tools.javafaker;
+
+import com.github.javafaker.Faker;
+
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+public class JavaFakerTool {
+
+ private Faker faker;
+ private Map<String, TimeUnit> timeUnitMap;
+
+ public synchronized Faker getFaker() {
+ if (faker == null) {
+ faker = new Faker(Locale.getDefault());
+ timeUnitMap = createTimeUnitMap();
+ }
+
+ return faker;
+ }
+
+ public synchronized Map<String, TimeUnit> getTimeUnits() {
+ if (timeUnitMap == null) {
+ timeUnitMap = createTimeUnitMap();
+ }
+
+ return timeUnitMap;
+ }
+
+ @Override
+ public String toString() {
+ return "Generate test data using Java Faker (see https://github.com/DiUS/java-faker)";
+ }
+
+ private static Map<String, TimeUnit> createTimeUnitMap() {
+ final Map<String, TimeUnit> result = new HashMap<>();
+ result.put("MICROSECONDS", TimeUnit.MICROSECONDS);
+ result.put("MILLISECONDS", TimeUnit.MILLISECONDS);
+ result.put("SECONDS", TimeUnit.SECONDS);
+ result.put("MINUTES", TimeUnit.MINUTES);
+ result.put("HOURS", TimeUnit.HOURS);
+ result.put("DAYS", TimeUnit.DAYS);
+ return result;
+ }
+
+}
diff --git a/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/javafaker/JavaFakerToolTest.java b/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/javafaker/JavaFakerToolTest.java
new file mode 100644
index 0000000..e378cd6
--- /dev/null
+++ b/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/javafaker/JavaFakerToolTest.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.freemarker.generator.tools.javafaker;
+
+import com.github.javafaker.Faker;
+import org.junit.Test;
+
+import java.util.concurrent.TimeUnit;
+
+import static junit.framework.TestCase.assertTrue;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+
+public class JavaFakerToolTest {
+
+ private final Faker faker = javaFakerTool().getFaker();
+
+ @Test
+ public void shouldCreateFakeData() {
+ assertFalse(faker.name().fullName().isEmpty());
+ assertFalse(faker.internet().emailAddress().isEmpty());
+ assertNotNull(faker.date().past(12, TimeUnit.DAYS));
+ assertTrue(faker.finance().iban("AT").startsWith("AT"));
+ }
+
+ private static final JavaFakerTool javaFakerTool() {
+ return new JavaFakerTool();
+ }
+}