FluentSeeder makes it easier to seed Fluent models. For testing purposes, it can create psuedo realistic random data for your models based on their property names and types using RandomFactory.
FluentSeeder is available through Swift Package Manager. To install, add the following to your Package.swift file.
let package = Package(
name: "YourProject",
dependencies: [
...
.package(url: "https://github.com/Appsaurus/FluentSeeder", from: "0.1.0"),
],
targets: [
//If just using for test purposes (recommended use case)
.testTarget(name: "YourAppTests", dependencies: ["FluentSeeder", ... ])
//Not recommended but still possible to use to seed your actual app.
.target(name: "YourApp", dependencies: ["FluentSeeder", ... ])
]
)
1. Import the library
import FluentSeeder
2. Implement Seeder
Registering and configuration of services, databases, and migrations can be done via overriding register(services:)
, configure(databases:)
and configure(migrations:)
respectively.
public class ExampleSeeder: Seeder{
public typealias Database = SQLiteDatabase
open static func seeds() -> [SeedProtocol]{
return [
//Seed models first
Seed<ExampleModel>(count: 50),
Seed<ExampleSiblingModel>(count: 25),
Seed<ExampleChildModel>(count: 10),
//Then relationships that depend on those models existing
SiblingSeed<ExampleModelSiblingPivot>(count: 10),
//You can seed parents for each child
ParentSeed<ExampleModel, ExampleChildModel>(at: \.optionalParentModelId)
//Or if you prefer to seed the relationship in the other direction (possibly for one-to-many relationship)
ChildSeed<ExampleModel, ExampleChildModel>.init(count: 3, at: \.optionalParentModelId)
]
}
}
3. Add your seeder's migration to the database
//Don't forget to add your model mirations first
migrations.add(model: ExampleModel.self, database: .sqlite)
migrations.add(model: ExampleSiblingModel.self, database: .sqlite)
migrations.add(model: ExampleChildModel.self, database: .sqlite)
migrations.add(model: ExampleModelSiblingPivot.self, database: .sqlite)
migrations.add(migration: ExampleSeeder.self, database: .sqlite)
By supplying a ModelFactory
to the Seed
initializer, you can customize how your model is initialized and override the default randmized data. For relationship seeds, you can supply querys to filter which models are included when creating relationships are formed. For SiblingSeed
you can optionally supply a leftQuery
and rightQuery
, and for ParentSeed
and ChildSeed
you can optionally supply parentQuery
and childQuery
. If no queries are provided, random samples are taken from each seeded model, or all models are iterated depending upon the direction of the seeded relationship.
We would love you to contribute to FluentSeeder, check the CONTRIBUTING file for more info.
FluentSeeder is available under the MIT license. See the LICENSE file for more info.