Skip to content

Latest commit

 

History

History
386 lines (352 loc) · 31.2 KB

README-ja.md

File metadata and controls

386 lines (352 loc) · 31.2 KB

クレートについて

In English

crates.io

APIドキュメント

これはスキーマをベースにしてランダムにダミーデータを生成することができるクレート(Schema-Based Random Data GENerator、i.e. SBRD GEN)です。 ライブラリとしてもCLIツールとしても利用可能です。

スキーマとスキーマのジェネレーターはスキーマについて、ジェネレーターとそのビルダーは指定可能なジェネレーターの一覧を参照してください。

なお、このプログラムはserdeを利用して、スキーマのパースと生成結果のフォーマット行っています。

ライブラリとして利用する場合

ライブラリとして使用する場合、単一のジェネレータで生成する方法スキーマを用いて複数のジェネレータを組み合わせる方法があります。

単一のジェネレータで生成する方法

生成結果を組み合わせるほどでもないときに単一のジェネレータで生成する方法を利用することができます。 もちろんスキーマを用いて複数のジェネレータを組み合わせる方法でも生成可能です。

利用方法は、次の通りです。

  1. GeneratorBuildernew_xx(xxは可変)でビルダーを用意します。nullを生成できるようにしたい場合は、nullableの指定を追加します。
  2. ビルダーをbuildしてジェネレータに変換する
  3. ジェネレータにシード種とコンテキストを渡してダミーデータを生成する

以下に、実際の記述例を記します。

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);
}

スキーマを用いて複数のジェネレータを組み合わせる方法

複数のジェネレータを利用したい場合は、こちらの方法を利用することができます。

利用方法は、次の通りです。

  1. 利用したいジェネレータのリストとしてParentGeneratorBuilderのリストを用意する。 このリストは上から順に生成に利用されるため、宣言する順番を間違えると生成した値を使ってキーを置き換えることのできるスクリプトフォーマットが正しく機能しないことになるので注意してください。
  2. 利用したいジェネレータの内、出力したいキーの一覧を用意する。
  3. 出力したいキーの一覧と利用したいジェネレータの一覧を引数に指定して、SchemaBuilderを構築する。
  4. 構築したSchemaBuilderbuildして、Schemaに変換する。
  5. 変換したSchemaで、generateしてダミーデータを生成、またはGeneratedValueWriterトレイトのwrite_xx(xxは可変)でWriterに書き込む。

実際の記述例は、all_builder.rsをご覧ください。

CLIツールとして利用する場合

CLIツールとして使用する場合、スキーマファイルのファイルパスを指定してダミーデータを生成することができます。 CLIではスキーマファイルのファイル形式や出力する個数、出力するフォーマットなどを指定することができます。詳しくはCLIのヘルプをご覧ください。

インストール

インストールする方法はいくつかありますが、代表なのはCargoを使ってインストールGitHubのリリースページからインストールです。

Cargoを使ってインストール

cargoコマンドが利用できる状態で以下のコマンドを叩いてください。 sbrd-gen --helpでヘルプメッセージが出力されればインストールは成功しています。

cargo install sbrd-gen
sbrd-gen --help

GitHubのリリースページからインストール

GitHubのリリースページからインストールする場合は、こちらから希望のバージョンをダウンロードします。 ダウンロードしたフォルダを展開後、バイナリファイルのパスを通して利用できるようにしてください。 sbrd-gen --helpでヘルプメッセージが出力されればインストールは成功しています。

CLIツールの使い方

実行ファイル(例えば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 : --type <OUTPUT_TYPE>
    • 指定2 : -t <OUTPUT_TYPE>
    • 説明 : 出力したいフォーマットを指定するオプションです。<OUTPUT_TYPE>に利用したいフォーマッターを指定します。
    • 利用可能オプション : yaml, json, csv, tsv
    • デフォルト : json
  • 出力数
    • 指定1 : --num <COUNT>
    • 指定2 : -n <COUNT>
    • 説明 : スキーマのkeysで指定したダミーデータのセットの個数を指定するオプションです。<COUNT>に個数を指定します。
    • デフォルト : 10
  • キーヘッダー出力させないことを表すフラグ
    • 指定 : --no-header
    • 説明 : 出力結果にキーを含めたくない場合に指定するオプションです。
  • スキーマのパースのみの実行
    • 指定 : --dry-run
    • 説明 : ダミーデータの出力をせずにスキーマのパースだけを行って終了することを指定するオプションです。
  • ヘルプ
    • 指定1 : --help
    • 指定2 : -h
    • 説明 : ヘルプを確認したいときに指定するオプションです。
  • バージョン
    • 指定1 : --version
    • 指定2 : -V
    • 説明 : バージョンを確認したいときに指定するオプションです。

スキーマについて

スキーマは、keysをキーとする出力したいキーのシークエンスと、generatorsをキーとするジェネレータのビルダーのシークエンスからなるマップ形式で指定します。 フォーマットは、YamlとJsonをサポートしています。

記述例については、all.yamlall.jsonをご覧ください。

値のコンテキスト

スキーマからダミーデータを生成するときは、スキーマに指定されたジェネレーターを上から順に実行します。 このとき生成された値は値のコンテキストと呼ばれるマップ形式のデータ構造に保存されます。 つまり、値のコンテキストで参照可能なペアは、参照時点で生成に成功したジェネレーターのキーと値のペアです。 この値のコンテキストは、出力したいキーからキーに紐づく値を取得するのに用いられたり、スクリプトフォーマットとして指定された"{key}"(括弧とキーの間にはスペース無し)という表記をその時点のコンテキストにあるkeyに紐づく値で置き換えてから評価したり、といった形などで利用されます。

親ジェネレーターのオプション一覧

親ジェネレーターはキーとビルダーのオプションからなるマップ形式で指定します。 構造体としてはParentGeneratorBuilderとなります。

キー

ジェネレーターを特定するためのキーで、keyをキーとした文字列として指定します。

スクリプトフォーマットを評価する際の置換キーとしても利用されます。

ビルダー

指定可能なジェネレーターの一覧で列挙されているジェネレーターのオプションを指定することができます。 生成されるジェネレータはタイプによって決まり、ほかのオプションも同様に解釈されます。

指定可能なジェネレーターの一覧

スキーマや単一のジェネレーターとして指定可能なジェネレーターは以下の通りです。

文字列構築系(build_stringモジュール)

他のジェネレーターの生成結果をもとに文字列を組み立てるジェネレーターの集まりからなるモジュールです。

分布系(distributionモジュール)

分布関数をもとに乱数を生成するジェネレーターの集まりからなるモジュールです。

  • normal generator
    • 説明 : 正規分布に従って乱数を生成するジェネレーターです。
    • 備考 : パラメーターで指定できるのは、実数型の平均(mean)と実数型の標準偏差(std_dev)です。デフォルトは、それぞれ0.0、1.0です。
    • 構造体 : NormalGenerator
    • タイプ : dist-normal
    • 必須オプション : タイプパラメーター
    • 指定可能オプション : タイプヌラブルパラメーター
    • 生成型 : 実数型

評価系(evalモジュール)

指定した式を評価して値を出力するジェネレーターの集まりからなるモジュールです。

  • eval generator
    • 説明 : 指定したスクリプトを評価した結果を出力するジェネレーターです。
    • 備考 : なし
    • 構造体 : EvalGenerator
    • タイプ : eval-int(整数型)、eval-real(実数型)、eval-bool(ブーリアン型)、eval-string(文字列型)
    • 必須オプション : タイプスクリプト
    • 指定可能オプション : タイプヌラブルスクリプト
    • 生成型 : 整数型(eval-int)、実数型(eval-real)、ブーリアン型(eval-bool)、文字列型(eval-string)

逐次変更系(incrementalモジュール)

実行するたびに一定量増加するといったように逐次的に変化するジェネレーターの集まりからなるモジュールです。

プリミティブ系(primitiveモジュール)

基本的な値を生成するジェネレーターの集まりからなるモジュールです。

  • int generator
    • 説明 : 指定された範囲で整数型を生成するジェネレーターです。デフォルトの範囲はi16の最小値(-32768)以上i16の最大値(32767)以下です。
    • 備考 : なし
    • 構造体 : IntGenerator
    • タイプ : int
    • 必須オプション : タイプ
    • 指定可能オプション : タイプヌラブル範囲(整数型)
    • 生成型 : 整数型
  • real generator
    • 説明 : 指定された範囲で実数型を生成するジェネレーターです。デフォルトの範囲はi16の最小値(-32768)以上i16の最大値(32767)以下です。
    • 備考 : 生成された値の絶対値が大きいほど小数点以下の字数が減り、絶対値が小さいほど小数点以下の字数が増えます。
    • 構造体 : RealGenerator
    • タイプ : real
    • 必須オプション : タイプ
    • 指定可能オプション : タイプヌラブル範囲(実数型)
    • 生成型 : 実数型
  • bool generator
    • 説明 : 50%の確率でtrueかfalseを生成するジェネレーターです。
    • 備考 : なし
    • 構造体 : BoolGenerator
    • タイプ : bool
    • 必須オプション : タイプ
    • 指定可能オプション : タイプヌラブル
    • 生成型 : ブーリアン型
  • 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
    • 説明 : フォーマットで指定したフォーマットで日付を生成するジェネレーターです。
    • 備考 : 範囲で指定する日付のフォーマットは"%Y-%m-%d"です。フォーマットのデフォルト値も同じフォーマットです。フォーマットについてはこちらをご覧ください。デフォルトの範囲は1900-01-01以上2151-01-01未満です、未指定の境界はデフォルト値が指定されたものとします。
    • 構造体 : DateGenerator
    • タイプ : date
    • 必須オプション : タイプ
    • 指定可能オプション : タイプヌラブル範囲(日付の文字列型)フォーマット
    • 生成型 : 文字列型
  • time generator
    • 説明 : フォーマットで指定したフォーマットで時刻を生成するジェネレーターです。
    • 備考 : 範囲で指定する日時のフォーマットは"%H:%M:%S"です。フォーマットのデフォルト値も同じフォーマットです。フォーマットについてはこちらをご覧ください。デフォルトの範囲は00:00:00以上23:59:59以下です、未指定の境界はデフォルト値が指定されたものとします。
    • 構造体 : TimeGenerator
    • タイプ : time
    • 必須オプション : タイプ
    • 指定可能オプション : タイプヌラブル範囲(時刻の文字列型)フォーマット
    • 生成型 : 文字列型
  • always null generator
    • 説明 : 常にnullを生成するジェネレーターです。
    • 備考 : なし
    • 構造体 : AlwaysNullGenerator
    • タイプ : always-null
    • 必須オプション : タイプ
    • 指定可能オプション : タイプヌラブル
    • 生成型 : Null型

子ジェネレーター乱択系(random_childrenモジュール)

子ジェネレーターの一覧を利用して値を生成するジェネレーターです。

値乱択系(random_valuesモジュール)

文字リスト値の一覧外部ファイルパスを利用して値を生成するジェネレーターの集まりからなるモジュールです。

ジェネレーターのオプション一覧

ジェネレーターを構築するのに指定できるオプションは次の通りです。 指定可能なオプションはジェネレーターによって違いますが、指定可能なオプション以外は無視されます。

タイプ

  • 説明 : 指定可能なジェネレーターの一覧で列挙されているジェネレーターのタイプ。ジェネレーターの種類を特定するために利用される。
  • 備考 : なし
  • 構造体 : 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とキーendendの値を含むことを表すフラグを値に持つキー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
  • 値型 : 整数型(非負)

LICENSE

MIT