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:32 UTC

[freemarker-generator] branch FREEMARKER-163 created (now 75e9e2d)

This is an automated email from the ASF dual-hosted git repository.

sgoeschl pushed a change to branch FREEMARKER-163
in repository https://gitbox.apache.org/repos/asf/freemarker-generator.git.


      at 75e9e2d  FREEMARKER-163 Integrate Java Faker library for test data generation

This branch includes the following new commits:

     new 75e9e2d  FREEMARKER-163 Integrate Java Faker library for test data generation

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[freemarker-generator] 01/01: FREEMARKER-163 Integrate Java Faker library for test data generation

Posted by sg...@apache.org.
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();
+    }
+}