これはスキーマをベースにしてランダムにダミーデータを生成することができるクレート(Schema-Based Random Data GENerator、i.e. SBRD GEN)です。 ライブラリとしてもCLIツールとしても利用可能です。
スキーマとスキーマのジェネレーターはスキーマについて、ジェネレーターとそのビルダーは指定可能なジェネレーターの一覧を参照してください。
なお、このプログラムはserdeを利用して、スキーマのパースと生成結果のフォーマット行っています。
ライブラリとして使用する場合、単一のジェネレータで生成する方法とスキーマを用いて複数のジェネレータを組み合わせる方法があります。
生成結果を組み合わせるほどでもないときに単一のジェネレータで生成する方法を利用することができます。 もちろんスキーマを用いて複数のジェネレータを組み合わせる方法でも生成可能です。
利用方法は、次の通りです。
GeneratorBuilder
のnew_xx
(xxは可変)でビルダーを用意します。nullを生成できるようにしたい場合は、nullable
の指定を追加します。- ビルダーを
build
してジェネレータに変換する - ジェネレータにシード種とコンテキストを渡してダミーデータを生成する
以下に、実際の記述例を記します。
use rand::thread_rng;
use sbrd_gen::builder::GeneratorBuilder;
use sbrd_gen::value::DataValueMap;
fn main() {
let builder = GeneratorBuilder::new_int(Some((0..=100).into())).nullable();
let generator = builder.build().unwrap();
let generated_value = generator.generate(&mut thread_rng(), &DataValueMap::new()).unwrap();
println!("generated: {}", generated_value);
}
複数のジェネレータを利用したい場合は、こちらの方法を利用することができます。
利用方法は、次の通りです。
- 利用したいジェネレータのリストとして
ParentGeneratorBuilder
のリストを用意する。 このリストは上から順に生成に利用されるため、宣言する順番を間違えると生成した値を使ってキーを置き換えることのできるスクリプトやフォーマットが正しく機能しないことになるので注意してください。 - 利用したいジェネレータの内、出力したいキーの一覧を用意する。
- 出力したいキーの一覧と利用したいジェネレータの一覧を引数に指定して、
SchemaBuilder
を構築する。 - 構築した
SchemaBuilder
をbuild
して、Schema
に変換する。 - 変換した
Schema
で、generate
してダミーデータを生成、またはGeneratedValueWriter
トレイトのwrite_xx
(xxは可変)でWriterに書き込む。
実際の記述例は、all_builder.rsをご覧ください。
CLIツールとして使用する場合、スキーマファイルのファイルパスを指定してダミーデータを生成することができます。 CLIではスキーマファイルのファイル形式や出力する個数、出力するフォーマットなどを指定することができます。詳しくはCLIのヘルプをご覧ください。
インストールする方法はいくつかありますが、代表なのはCargoを使ってインストールとGitHubのリリースページからインストールです。
cargo
コマンドが利用できる状態で以下のコマンドを叩いてください。
sbrd-gen --help
でヘルプメッセージが出力されればインストールは成功しています。
cargo install sbrd-gen
sbrd-gen --help
GitHubのリリースページからインストールする場合は、こちらから希望のバージョンをダウンロードします。
ダウンロードしたフォルダを展開後、バイナリファイルのパスを通して利用できるようにしてください。
sbrd-gen --help
でヘルプメッセージが出力されればインストールは成功しています。
実行ファイル(例えばWindowsならsbrd-gen.exe
)にパスを通したうえでsbrd-gen [OPTIONS] <SCHEMA_FILE_PATH>
という文法でコマンドを実行します。
以下で、指定可能な引数やオプションを説明しますが、sbrd-gen --help
で表示されるヘルプメッセージでも閲覧可能です。
<SCHEMA_FILE_PATH>
: 生成に用いるスキーマを記したファイルのファイルパス。
- パーサー
- 指定1 :
--parser <PARSER_TYPE>
- 指定2 :
-p <PARSER_TYPE>
- 説明 : 利用したいパーサーの種類を指定するオプションです。
<PARSER_TYPE>
に利用したいパーサーの種類を指定します。 - 利用可能オプション : yaml, json
- デフォルト : yaml
- 指定1 :
- 出力タイプ
- 指定1 :
--type <OUTPUT_TYPE>
- 指定2 :
-t <OUTPUT_TYPE>
- 説明 : 出力したいフォーマットを指定するオプションです。
<OUTPUT_TYPE>
に利用したいフォーマッターを指定します。 - 利用可能オプション : yaml, json, csv, tsv
- デフォルト : json
- 指定1 :
- 出力数
- 指定1 :
--num <COUNT>
- 指定2 :
-n <COUNT>
- 説明 : スキーマの
keys
で指定したダミーデータのセットの個数を指定するオプションです。<COUNT>
に個数を指定します。 - デフォルト : 10
- 指定1 :
- キーヘッダー出力させないことを表すフラグ
- 指定 :
--no-header
- 説明 : 出力結果にキーを含めたくない場合に指定するオプションです。
- 指定 :
- スキーマのパースのみの実行
- 指定 :
--dry-run
- 説明 : ダミーデータの出力をせずにスキーマのパースだけを行って終了することを指定するオプションです。
- 指定 :
- ヘルプ
- 指定1 :
--help
- 指定2 :
-h
- 説明 : ヘルプを確認したいときに指定するオプションです。
- 指定1 :
- バージョン
- 指定1 :
--version
- 指定2 :
-V
- 説明 : バージョンを確認したいときに指定するオプションです。
- 指定1 :
スキーマは、keys
をキーとする出力したいキーのシークエンスと、generators
をキーとするジェネレータのビルダーのシークエンスからなるマップ形式で指定します。
フォーマットは、YamlとJsonをサポートしています。
記述例については、all.yamlやall.jsonをご覧ください。
スキーマからダミーデータを生成するときは、スキーマに指定されたジェネレーターを上から順に実行します。 このとき生成された値は値のコンテキストと呼ばれるマップ形式のデータ構造に保存されます。 つまり、値のコンテキストで参照可能なペアは、参照時点で生成に成功したジェネレーターのキーと値のペアです。 この値のコンテキストは、出力したいキーからキーに紐づく値を取得するのに用いられたり、スクリプトやフォーマットとして指定された"{key}"(括弧とキーの間にはスペース無し)という表記をその時点のコンテキストにあるkeyに紐づく値で置き換えてから評価したり、といった形などで利用されます。
親ジェネレーターはキーとビルダーのオプションからなるマップ形式で指定します。
構造体としてはParentGeneratorBuilder
となります。
ジェネレーターを特定するためのキーで、key
をキーとした文字列として指定します。
スクリプトやフォーマットを評価する際の置換キーとしても利用されます。
指定可能なジェネレーターの一覧で列挙されているジェネレーターのオプションを指定することができます。 生成されるジェネレータはタイプによって決まり、ほかのオプションも同様に解釈されます。
スキーマや単一のジェネレーターとして指定可能なジェネレーターは以下の通りです。
他のジェネレーターの生成結果をもとに文字列を組み立てるジェネレーターの集まりからなるモジュールです。
- duplicate permutation generator
- 説明 : 生成結果を組み合わせて文字列にするジェネレーターです。範囲指定で指定された回数だけ値を生成して区切り文字で貼り付けて文字列を作成します。区切り文字のデフォルトは空文字("")です。
- 備考 : なし
- 構造体 :
DuplicatePermutationGenerator
- タイプ : duplicate-permutation
- 必須オプション : タイプ、区切り文字、括弧内一つ以上(子ジェネレーターの一覧、文字リスト、値の一覧、外部ファイルパス)
- 指定可能オプション : タイプ、ヌラブル、範囲(整数型)、区切り文字、子ジェネレーターの一覧、文字リスト、値の一覧、外部ファイルパス
- 生成型 : 文字列型
- format generator
分布関数をもとに乱数を生成するジェネレーターの集まりからなるモジュールです。
- normal generator
指定した式を評価して値を出力するジェネレーターの集まりからなるモジュールです。
- eval generator
実行するたびに一定量増加するといったように逐次的に変化するジェネレーターの集まりからなるモジュールです。
- increment id generator
基本的な値を生成するジェネレーターの集まりからなるモジュールです。
- int generator
- real generator
- bool generator
- date time generator
- 説明 : フォーマットで指定したフォーマットで日時を生成するジェネレーターです。
- 備考 : 範囲で指定する日時のフォーマットは"%Y-%m-%d %H:%M:%S"です。フォーマットのデフォルト値も同じフォーマットです。フォーマットについてはこちらをご覧ください。デフォルトの範囲は1900-01-01 00:00:00以上2151-01-01 00:00:00未満で、未指定の境界はデフォルト値が指定されたものとします。
- 構造体 :
DateTimeGenerator
- タイプ : date-time
- 必須オプション : タイプ
- 指定可能オプション : タイプ、ヌラブル、範囲(日時の文字列型)、フォーマット
- 生成型 : 文字列型
- date generator
- time generator
- always null generator
子ジェネレーターの一覧を利用して値を生成するジェネレーターです。
- case when generator
- 説明 : 宣言順に条件を評価してtrueになった子ジェネレーターを利用して生成するジェネレーターです。
- 備考 : 条件に引っかからなかった場合のためにデフォルト条件(つまり、条件が未指定)の子ジェネレーターが必要です。
- 構造体 :
CaseWhenGenerator
- タイプ : case-when
- 必須オプション : タイプ、条件の指定がある子ジェネレーターの一覧
- 指定可能オプション : タイプ、ヌラブル、条件の指定がある子ジェネレーターの一覧
- 生成型 : 生成に利用した子ジェネレーターの生成型
- random child generator
- 説明 : ウェイトを考慮して乱択したジェネレーターを利用して生成するジェネレーターです。
- 備考 : なし
- 構造体 :
RandomChildGnerator
- タイプ : random-child
- 必須オプション : タイプ、ウェイトの指定がある子ジェネレーターの一覧
- 指定可能オプション : タイプ、ヌラブル、ウェイトの指定がある子ジェネレーターの一覧
- 生成型 : 生成に利用した子ジェネレーターの生成型
文字リストや値の一覧、外部ファイルパスを利用して値を生成するジェネレーターの集まりからなるモジュールです。
- select generator
- get value at generator
- 説明 : スクリプトを評価して取得したインデックスにある値を、入力された値の一覧から取得するジェネレーターです。
- 備考 : なし
- 構造体 :
GetValueAtGenerator
- タイプ : get-int-value-at(整数型)、get-real-value-at(実数型)、get-string-value(文字列型)
- 必須オプション : タイプ、スクリプト、括弧内一つ以上(文字リスト、値の一覧、外部ファイルパス)
- 指定可能オプション : タイプ、ヌラブル、スクリプト、文字リスト、値の一覧、外部ファイルパス
- 生成型 : 整数型(get-int-value-at)、実数型(get-real-value-at)、文字列型(get-string-value-at)
- get value index generator
ジェネレーターを構築するのに指定できるオプションは次の通りです。 指定可能なオプションはジェネレーターによって違いますが、指定可能なオプション以外は無視されます。
- 説明 : 指定可能なジェネレーターの一覧で列挙されているジェネレーターのタイプ。ジェネレーターの種類を特定するために利用される。
- 備考 : なし
- 構造体 :
GeneratorType
- キー名 :
type
- 値型 : 文字列型
- 説明 : ジェネレーターが生成する値に加えてnullを生成することができるかのフラグ。trueならnullを生成することができる。デフォルトはfalse。
- 備考 : なし
- 構造体 :
bool
- キー名 :
nulable
- 値型 : ブーリアン型
- 説明 : このフォーマットは、値のコンテキスト内のキーと値のペア(仮にそのペアを(key, value)とする。)を順番にフォーマット内の"{key}"や"{key:<format-option>}"(括弧とkey、コロンの間にはスペース無し)という文字列をフォーマットしたvalueで置き換えてから文字列として評価されます。文字'{'と'}'は二つ重ねればエスケープできますが、キーの指定として優先的にパースされるのでキーに'{'や'}'を利用するとキーがうまく特定できないので注意してください。なお、出力用のキーとしてなら問題なく利用できます。
- 備考 : 文法について詳しくはこのクレートのEvaluatorのAPIドキュメントを参照してください。
- 構造体 :
String
- キー名 :
format
- 値型 : 文字列型
- 説明 : このスクリプトは、値のコンテキスト内のキーと値のペア(仮にそのペアを(key, value)とする。)を順番にスクリプト内の"{key}"や"{key:<format-option>}"(括弧とkey、コロンの間にはスペース無し)という文字列をフォーマットしたvalueで置き換えてから式として評価されます。文字'{'と'}'は二つ重ねればエスケープできますが、キーの指定として優先的にパースされるのでキーに'{'や'}'を利用するとキーがうまく特定できないので注意してください。なお、出力用のキーとしてなら問題なく利用できます。
- 備考 : 文法や式について詳しくはこのクレートのEvaluatorのAPIドキュメントを参照してください。
- 構造体 :
String
- キー名 :
script
- 値型 : 文字列型
- 説明 : 文字列の構築などで区切りに使う文字列です。
- 備考 : なし
- 構造体 :
String
- キー名 :
separator
- 値型 : 文字列型
- 説明 : 繰り返し数の範囲や生成する値の範囲の指定に利用されるオプションです。
- 備考 : 範囲指定時に利用できる値型として利用可能なのは、整数型、実数型、文字列型、日時の文字列型、日付の文字列型、時刻の文字列型の6つです。日時関係の値の指定はそれぞれのプリミティブ系ジェネレーターを参照してください。
- 構造体 :
ValueBound
- キー名 :
range
- 値型 : 値型の値を値に持つキー
start
とキーend
、end
の値を含むことを表すフラグを値に持つキーinclude_end
からなるマップ形式であり、それぞれ任意指定です。include_end
のデフォルト値はtrueです。
- 説明 : ジェネレーターを実行するたびに更新される値の初期値と変化量を指定するためのオプションです。
- 備考 : 指定時に利用できる値型として利用可能なのは、整数型、実数型、文字列型、日時の文字列型、日付の文字列型、時刻の文字列型の6つです。値の指定は範囲の指定と同じです。
- 構造体 :
ValueStep
- キー名 :
increment
- 値型 : 初期値として値型の値を値に持つキー
initial
と、変化量を表す値型の値を値に持つキーstep
からなるマップ形式であり、initial
は必須、step
は任意指定です。
- 説明 : ジェネレーターのオプション一覧で指定されるジェネレーターのシークエンスを指定するオプションです。ここで指定するのは子ジェネレーターと呼ばれ、親ジェネレーターとは違い追加で子ジェネレーターのオプション一覧を指定することができます。
- 備考 : なし
- 構造体 :
Vec<ChildGeneratorBuilder>>
- キー名 :
children
- 値型 : 子ジェネレーターのシークエンス
- 説明 : 乱択の対象とする文字を列挙するオプションです。
- 備考 : なし
- 構造体 :
String
- キー名 :
chars
- 値型 : 文字列型
- 説明 : 乱択の対象とする値を列挙するオプションです。
- 備考 : 値型として利用可能なのは、整数型、実数型、文字列型です。
- 構造体 :
Vec<DataValue>
- キー名 :
values
- 値型 : 整数型、実数型、文字列型のどれかの型からなるシークエンス
- 説明 : 乱択の対象とする値を一行==一つの値として列挙するファイルのファイルパスを指定するオプションです。絶対パスのほかにスキーマファイルからの相対パスで指定することができます。
- 備考 : なし
- 構造体 :
PathBuf
- キー名 :
filepath
- 値型 : 文字列型
- 説明 : 分布関数を構築する際に必要なパラメーターを指定するためのオプションです。指定するキーと値については分布系の各ジェネレーターを参照してください。
- 備考 : なし
- 構造体 :
DataValueMap<String>
- キー名 :
parameters
- 値型 : マップ形式
子ジェネレーターは、ジェネレーターで指定可能なオプションに加えて次に列挙するオプションも指定することができます。
- 説明 : どの子ジェネレーターを利用するかの条件分岐の条件を指定するためのオプション。指定された場合スクリプトと同様に評価してtrue/falseを判定し、未指定の場合常にtrueを返します。
- 備考 : なし
- 構造体 :
String
- キー名 :
condition
- 値型 : 文字列型
- 説明 : 子ジェネレーターを乱択する際の重みを指定するためのオプション。重みが大きいほどよく選択される。デフォルトの重みは1。
- 備考 : なし
- 構造体 :
Weight
- キー名 :
weight
- 値型 : 整数型(非負)
MIT