Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

qxzzxq/faker

Open more actions menu

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

74 Commits
74 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

faker

build codecov

Faker is a Scala library that can generate fake data.

This project is inspired by the other faker projects.

Get faker

This project does not have a stable release yet (maybe soon). To test faker, use the snapshot version:

<repositories>
  <repository>
    <id>ossrh-snapshots</id>
    <url>https://oss.sonatype.org/content/repositories/snapshots/</url>
  </repository>
</repositories>

<dependencies>
  <dependency>
    <groupId>dev.qinx</groupId>
    <artifactId>faker_2.12</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </dependency>
</dependencies>

Usage

Just add faker's annotations into a standard Scala case class and faker will handle the rest.

import java.time.LocalTime

import dev.qinx.faker.Faker
import dev.qinx.faker.annotation.base.{IntType, Text}
import dev.qinx.faker.annotation.datetime.{Date, Time}
import dev.qinx.faker.annotation.geo.{Lat, Lon}
import dev.qinx.faker.annotation.person.Name
import dev.qinx.faker.annotation.transport.Airport
import dev.qinx.faker.enums.Locale

case class MyClass1(@Date date: String,
                    @Time time: LocalTime,
                    @Airport(country = "FR") airportCode: String,
                    @Name(locale = Locale.zh_CN) nameCN: String,
                    @Text(pattern = "??-###") id: String,
                    int1: Int,
                    @IntType(seed = "123") int2: String,
                    @IntType(min = 0, max = 10) int3: Int)

new Faker[MyClass1] get 10 foreach println

// MyClass1(2014-01-13,18:17:11,ORY,平磊,bm-250,-1501092464,1018954901,1)
// MyClass1(2012-09-30,19:23:54,TLS,申秀芳,XK-741,-252380286,1295249578,9)
// MyClass1(1994-05-22,03:27:26,ORY,敬桂英,VY-110,1097976093,-1829099982,9)
// MyClass1(2008-02-02,03:09:18,ORY,苑波,YX-343,-43394488,1111887674,5)
// MyClass1(1973-07-31,10:57:45,ORY,迟俊,ah-905,1558683535,-1621910390,7)
// MyClass1(1984-04-09,04:24:45,BOD,芦秀珍,Uo-900,366140728,-1935747844,2)
// MyClass1(2016-05-01,03:42:27,MRS,季兰英,qV-446,-995036697,696711130,7)
// MyClass1(1977-10-08,10:04:50,MRS,荆红,pk-108,-1973051050,-1366603797,2)
// MyClass1(1974-09-16,23:26:43,BOD,廖秀梅,He-851,-462826625,1149563170,5)
// MyClass1(1981-04-19,08:03:33,BSL,韩超,hk-371,1977755351,1041944832,6)

Faker can also handle array (the support of other collections are still a WIP)

case class MyClass2(myClass1: Array[MyClass1])

val fake = new Faker[MyClass2].get()
fake.myClass1 foreach println
// MyClass1(1990-08-17,23:56:35,NCE,匡健,uE-846,838894708,1018954901,8)
// MyClass1(1974-10-16,01:45:04,BSL,傅雪,ch-192,1582091789,1295249578,8)
// MyClass1(1988-04-09,07:44:15,LYS,查雷,fx-476,1388926418,-1829099982,2)

// By default Faker generate an array of totalLength 3, you can adjust it by adding @ArrayType annotation
case class MyClass2Bis(@ArrayType(length = 10) myClass1: Array[MyClass1])

It's also possible to cross join one field to another to generate all the possible combinations. In such a use case, use the @Series annotation

case class CrossJoinExample(@Series(length = 2) @Date date: String,
                            @Series(length = 3, crossJoin = "date") @Text(pattern = "??-###") id: String,
                            @Series(id = "myInput", crossJoin = "id") name: String,
                            @FloatType(min = 10, max = 20) price: Float)

val faker = new Faker[CrossJoinExample]
faker.putSeries("myInput", Array("apple", "banana", "orange"))

import spark.implicits._  // to visualize as a spark dataset
faker.getDataSeries.toDS().show()
// +----------+------+------+---------+
// |      date|    id|  name|    price|
// +----------+------+------+---------+
// |1984-11-13|ym-025| apple|15.212642|
// |1984-11-13|ym-025|banana|17.103207|
// |1984-11-13|ym-025|orange|17.610806|
// |1984-11-13|eN-286| apple|11.953639|
// |1984-11-13|eN-286|banana|10.136742|
// |1984-11-13|eN-286|orange|12.635193|
// |1984-11-13|wA-500| apple| 12.24368|
// |1984-11-13|wA-500|banana|16.292076|
// |1984-11-13|wA-500|orange|15.748799|
// |1980-09-04|ym-025| apple| 16.94527|
// |1980-09-04|ym-025|banana| 18.91407|
// |1980-09-04|ym-025|orange|11.317879|
// |1980-09-04|eN-286| apple|19.948784|
// |1980-09-04|eN-286|banana|14.381845|
// |1980-09-04|eN-286|orange|16.428938|
// |1980-09-04|wA-500| apple|19.262041|
// |1980-09-04|wA-500|banana|10.533231|
// |1980-09-04|wA-500|orange|19.337175|
// +----------+------+------+---------+

Faker also provides the classic flavor API like the other faker libraries:

import dev.qinx.faker.Faker

Faker.person().name()
Faker.localDate()
Faker.array[String](5)
Faker.array[MyClass1](5)

Available Annotations

  • base
    • @IntType
    • @LongType
    • @FloatType
    • @DoubleType
    • @Text
    • @UpperCase
    • @LowerCase
    • @Digit
  • datetime
    • @Date
    • @Time
    • @DateTime
  • geo
    • @Lat
    • @Lon
  • person
    • @Name
  • transport
    • @Airport
  • company
    • @Company
  • data
    • @Series
    • @Gaussian
  • collection
    • @ArrayType

More features will be added.

Localization

Some annotations can handle locales, just configure the annotation with the corresponding Locale value like this:

@Name(locale = Locale.zh_CN)

Performance

Faker is thread safe, however the concurrent use may lead to poor performance (due to the limit of the Java Random class).

Releases

Packages

Used by

Contributors

Languages

Morty Proxy This is a proxified and sanitized view of the page, visit original site.