{"id":20644230,"url":"https://github.com/senselogic/basil","last_synced_at":"2025-08-09T19:34:55.402Z","repository":{"id":114209578,"uuid":"90480978","full_name":"SenseLogic/BASIL","owner":"SenseLogic","description":"Database designer and filler.","archived":false,"fork":false,"pushed_at":"2025-04-13T11:19:05.000Z","size":9819,"stargazers_count":10,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-04-16T02:08:13.351Z","etag":null,"topics":["automatic","cql","crystal","data","database","design","english","generation","golang","ipsum","lorem","random","rust","sql","textual","uml"],"latest_commit_sha":null,"homepage":"","language":"D","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/SenseLogic.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2017-05-06T17:51:40.000Z","updated_at":"2025-04-13T11:19:09.000Z","dependencies_parsed_at":"2023-09-22T01:23:37.258Z","dependency_job_id":"7a6d1609-7dec-4a25-b4f8-b1bed77ce4dc","html_url":"https://github.com/SenseLogic/BASIL","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SenseLogic%2FBASIL","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SenseLogic%2FBASIL/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SenseLogic%2FBASIL/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SenseLogic%2FBASIL/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/SenseLogic","download_url":"https://codeload.github.com/SenseLogic/BASIL/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249183104,"owners_count":21226142,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["automatic","cql","crystal","data","database","design","english","generation","golang","ipsum","lorem","random","rust","sql","textual","uml"],"created_at":"2024-11-16T16:15:27.558Z","updated_at":"2025-04-16T02:08:24.934Z","avatar_url":"https://github.com/SenseLogic.png","language":"D","readme":"![](https://github.com/senselogic/BASIL/blob/master/LOGO/basil.png)\n\n# Basil\n\nDatabase designer and filler.\n\n## Features\n\n*   Describes database schemas through a concise textual specification.\n*   Fills the database with user provided data.\n*   Generates the remaining data based on the column names, types and properties.\n*   Exports the database schema and data in the following formats :\n    *   UML\n    *   SQL\n    *   CQL\n*   Instantiates database access code for the following languages :\n    *   Generis (types, routes, requests, queries, responses)\n    *   Phoenix (queries)\n    *   Cibyl (types)\n    *   Crystal (types)\n    *   C# (types)\n    *   Dart (types)\n    *   Javascript (types)\n    *   Rust (types)\n\n## Sample SQL schema file\n\n```cpp\nBLOG | count 5\n\n    SECTION | dropped\n\n        Id : UINT64 | key, unique, incremented\n        Number : UINT64\n        Slug : STRING = \"{{Name:slug_case}}\"\n        Name : STRING | capacity 45\n        Text : STRING\n        Image : STRING | capacity 45\n\n        ImageIndex : UINT64 | !stored\n\n    USER | dropped\n\n        Id : UINT64 | key, unique, incremented\n        FirstName : STRING | capacity 45\n        LastName : STRING | capacity 45\n        Email : STRING | capacity 45, mapped\n        Pseudonym : STRING | capacity 45\n        Password : STRING | capacity 45\n        Phone : STRING | capacity 45\n        Street : STRING\n        City : STRING | capacity 45\n        Code : STRING | capacity 45\n        Region : STRING | capacity 45\n        Country : STRING | capacity 45\n        Company : STRING | capacity 45\n        ItIsAdministrator : BOOL\n\n    ARTICLE | dropped, count 15\n\n        Id : UINT64 | key, unique, incremented\n        SectionId : SECTION.Id | indexed, ascending 2\n        UserId : USER.Id | indexed, ascending 1\n        Slug : STRING = \"{{Title:slug_case}}\"\n        Title : STRING\n        Text : STRING\n        Image : STRING | capacity 45\n        Date : DATE | generated\n\n        Section : POINTER[ SECTION ] | !stored\n        User : POINTER[ USER ] | !stored\n        ImageIndex : UINT64 | !stored\n\n    COMMENT | count 30, sorted\n\n        Id : UINT64 | key, unique, incremented\n        ArticleId : ARTICLE.Id | indexed\n        UserId : USER.Id | indexed\n        Text : STRING = \"{{english 2 4 5 7}}\"\n        DateTime : DATETIME | generated, descending\n\n        Article : POINTER[ ARTICLE ] | !stored\n        User : POINTER[ USER ] | !stored\n\n    SUBSCRIBER\n\n        Id : UINT64 | key, unique, incremented\n        Name : STRING | capacity 45\n        Email : STRING | capacity 45, indexed, accessed\n```\n\n![](https://github.com/senselogic/BASIL/blob/master/SAMPLE/SQL/blog.png)\n\n## Sample CQL schema file\n\n```cpp\nBLOG | count 5\n\n    SECTION | dropped\n\n        Uuid : UUID | key, unique\n        Number : UINT64\n        Slug : STRING = \"{{Name:slug_case}}\"\n        Name : STRING\n        Text : STRING\n        Image : STRING\n\n        ImageIndex : UINT64 | !stored\n\n    USER | dropped\n\n        Uuid : UUID | key, unique\n        FirstName : STRING\n        LastName : STRING\n        Email : STRING\n        Pseudonym : STRING\n        Password : STRING\n        Phone : STRING\n        Street : STRING\n        City : STRING\n        Code : STRING\n        Region : STRING\n        Country : STRING\n        Company : STRING\n        ItIsAdministrator : BOOL\n\n    ARTICLE | dropped, count 15\n\n        Uuid : UUID | key, unique\n        SectionUuid : SECTION.Uuid | indexed\n        UserUuid : USER.Uuid | indexed\n        Slug : STRING = \"{{Title:slug_case}}\"\n        Title : STRING\n        Text : STRING\n        Image : STRING\n        Date : DATE\n\n        Section : POINTER[ SECTION ] | !stored\n        User : POINTER[ USER ] | !stored\n        ImageIndex : UINT64 | !stored\n\n    COMMENT | count 30\n\n        Uuid : UUID | key, unique\n        ArticleUuid : ARTICLE.Uuid | indexed\n        UserUuid : USER.Uuid | indexed\n        Text : STRING = \"{{english 2 4 5 7}}\"\n        DateTime : DATETIME\n\n        Article : POINTER[ ARTICLE ] | !stored\n        User : POINTER[ USER ] | !stored\n\n    SUBSCRIBER\n\n        Uuid : UUID | key, unique\n        Name : STRING\n        Email : STRING\n```\n\n![](https://github.com/senselogic/BASIL/blob/master/SAMPLE/CQL/blog.png)\n\n## Sample data file\n\n```\nSECTION\n\n    Number Name\n\n        1 ~ Sports\n        2 ~ Gaming\n        3 ~ Entertainment\n        4 ~ Science\n        5 ~ History\n        6 ~ Travel\n        7 ~ Finance\n\nUSER\n\n    Uuid FirstName LastName Email Pseudonym Password ItIsAdministrator\n\n        #RickDeckard ~ Rick ~ Deckard\n            ~ rick.deckard@mail.com ~ rick.deckard ~ b-263-54 ~ true\n\n        #RachaelTyrell ~ Rachael ~ Tyrell\n            ~ rachael.tyrell@outlook.com ~ rachael.tyrell ~ nexus-7 ~ false\n\n        #ArthurDent ~ Arthur ~ Dent\n            ~ arthur.dent@gmail.com ~ arthur.dent ~ 42 ~ false\n```\n\n## Sample template file\n\n```go\n\u003c#%%PHX/test_{#variable#}_table.phx\n\u003cpre\u003e\nTable :\n    {#name#} : {#type#} / {#attribute#} / {#variable#} / {#style#} / {#title#} / {#sentence#} / {#locution#}\n        Properties : {#has_button#} {#button_size#}\n        Columns : \u003c%{%name%}\u003c~!{%is_last%}\u003c\u003e, ~\u003e%\u003e\n        Key columns : \u003c@{%name%}\u003c~!{%is_last_key%}\u003c\u003e, ~\u003e@\u003e\n        Non key columns : \u003c${%name%}\u003c~!{%is_last_non_key%}\u003c\u003e, ~\u003e$\u003e\n        Stored columns : \u003c%^{%name%}\u003c~!{%is_last_stored%}\u003c\u003e, ~\u003e^%\u003e\n        Non Stored columns : \u003c%°{%name%}\u003c~!{%is_last_non_stored%}\u003c\u003e, ~\u003e°%\u003e\n        Stored key columns : \u003c@^{%name%}\u003c~!{%is_last_stored_key%}\u003c\u003e, ~\u003e^@\u003e\n        Non Stored key columns : \u003c@°{%name%}\u003c~!{%is_last_non_stored_key%}\u003c\u003e, ~\u003e°@\u003e\n        Stored non key columns : \u003c$^{%name%}\u003c~!{%is_last_stored_non_key%}\u003c\u003e, ~\u003e^$\u003e\n        Non Stored non key columns : \u003c$°{%name%}\u003c~!{%is_last_non_stored_non_key%}\u003c\u003e, ~\u003e°$\u003e\n        Columns :\u003c%\n            {%name%} : {%attribute%} / {%variable%} / {%style%} / {%title%} / {%sentence%} / {%locution%}\n                Properties : {%has_button%} {%button_size%}\n                Go : {%go_type%} {%go_name%}\n                PHP : {%php_type%} {%php_name%}\n                Crystal : {%crystal_type%} {%crystal_name%}\n                C# : {%csharp_type%} {%csharp_name%}\n                Rust : {%rust_type%} {%rust_name%}%\u003e\n\u003c/pre\u003e\n#\u003e\n%%test_tables.gs\npackage main;\n\n// -- IMPORTS\n\nimport \"fmt\";\n\n// -- FUNCTIONS\n\nfunc main(\n    )\n{\n    fmt.Println( \"Tables : \u003c#{#name#}\u003c~!{#is_last#}\u003c\u003e, ~\u003e#\u003e\" );\n    fmt.Println( \"Stored tables : \u003c#^{#name#}\u003c~!{#is_last_stored#}\u003c\u003e, ~\u003e^#\u003e\" );\n    fmt.Println( \"Non stored tables : \u003c#°{#name#}\u003c~!{#is_last_non_stored#}\u003c\u003e, ~\u003e°#\u003e\" );\n    fmt.Println( \"Tables :\" );\u003c#\n    fmt.Println( \"    {#name#} :\" );\n    fmt.Println( \"        Columns : \u003c%{%name%}\u003c~!{%is_last%}\u003c\u003e, ~\u003e%\u003e\" );\n    fmt.Println( \"        Key columns : \u003c@{%name%}\u003c~!{%is_last_key%}\u003c\u003e, ~\u003e@\u003e\" );\n    fmt.Println( \"        Non key columns : \u003c${%name%}\u003c~!{%is_last_non_key%}\u003c\u003e, ~\u003e$\u003e\" );\n    fmt.Println( \"        Stored columns : \u003c%^{%name%}\u003c~!{%is_last_stored%}\u003c\u003e, ~\u003e^%\u003e\" );\n    fmt.Println( \"        Non stored columns : \u003c%°{%name%}\u003c~!{%is_last_non_stored%}\u003c\u003e, ~\u003e°%\u003e\" );\n    fmt.Println( \"        Stored key columns : \u003c@^{%name%}\u003c~!{%is_last_stored_key%}\u003c\u003e, ~\u003e^@\u003e\" );\n    fmt.Println( \"        Non stored key columns : \u003c@°{%name%}\u003c~!{%is_last_non_stored_key%}\u003c\u003e, ~\u003e°@\u003e\" );\n    fmt.Println( \"        Stored non key columns : \u003c$^{%name%}\u003c~!{%is_last_stored_non_key%}\u003c\u003e, ~\u003e^$\u003e\" );\n    fmt.Println( \"        Non stored kon key columns : \u003c$°{%name%}\u003c~!{%is_last_non_stored_non_key%}\u003c\u003e, ~\u003e°$\u003e\" );#\u003e\n}\n%%test_types.go\npackage main;\n\n// -- TYPES\n\u003c#\ntype {#go_type#} struct {\u003c%\n    {%go_name%} {%go_type%};%\u003e\n}\u003c~!{#is_last#}\u003c\u003e\n\n// ~~\n~\u003e#\u003e\n%%test_types.cs\n// -- IMPORTS\n\nusing System;\nusing System.Collections.Generic;\n\n// -- TYPES\n\u003c#\n{#csharp_type_declaration#}\n{\n{#csharp_attribute_declaration#}}\u003c~!{#is_last#}\u003c\u003e\n\n// ~~\n~\u003e#\u003e\n```\n\n## Schema file syntax\n\n\u003cpre\u003e\n# \u003ci\u003esingle-line comment\u003c/i\u003e\n\n##\n    \u003ci\u003emultiline comment\u003c/i\u003e\n##\n\n@include file.bs\n\n\u003ci\u003edatabase name\u003c/i\u003e [| \u003ci\u003edatabase property\u003c/i\u003e, \u003ci\u003edatabase property\u003c/i\u003e, ...]\n\n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003ci\u003etable name\u003c/i\u003e [| \u003ci\u003etable property\u003c/i\u003e, \u003ci\u003etable property\u003c/i\u003e, ...]\n\n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003ci\u003ecolumn name\u003c/i\u003e : \u003ci\u003ecolumn type\u003c/i\u003e [= \"\u003ci\u003ecolumn template:filter:...|...\u003c/i\u003e\"] [| \u003ci\u003ecolumn property\u003c/i\u003e, \u003ci\u003ecolumn property\u003c/i\u003e, ...]\n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;..\n\n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;...\n\u003c/pre\u003e\n\n### Database properties\n\n\u003cpre\u003e\n[!]dropped\ncount \u003ci\u003erow count\u003c/i\u003e\n\u003c/pre\u003e\n\n### Table properties\n\n\u003cpre\u003e\n[!]stored\n[!]saved\n[!]edited\n[!]managed\n[!]sorted\n[!]dropped\ncount \u003ci\u003erow count\u003c/i\u003e\n\n[!]\u003ci\u003ecustom property name\u003c/i\u003e\n\u003ci\u003ecustom property name\u003c/i\u003e \u003ci\u003ecustom property value\u003c/i\u003e\n\u003c/pre\u003e\n\n### Column template functions\n\n\u003cpre\u003e\nnatural \u003ci\u003eminimum value\u003c/i\u003e \u003ci\u003emaximum value\u003c/i\u003e \u003ci\u003edigit count\u003c/i\u003e\ninteger \u003ci\u003eminimum value\u003c/i\u003e \u003ci\u003emaximum value\u003c/i\u003e\nreal \u003ci\u003eminimum value\u003c/i\u003e \u003ci\u003emaximum value\u003c/i\u003e [\u003ci\u003eprecision\u003c/i\u003e]\ndate \u003ci\u003eminimum year\u003c/i\u003e \u003ci\u003emaximum year\u003c/i\u003e\ntime \u003ci\u003eminimum hour\u003c/i\u003e \u003ci\u003emaximum hour\u003c/i\u003e\nblob \u003ci\u003ehexadecimal digit count\u003c/i\u003e\ntuid\nuuid\nisbn\ntag_list \u003ci\u003eminimum word count\u003c/i\u003e  \u003ci\u003emaximum word count\u003c/i\u003e\nenglish \u003ci\u003eminimum sentence count\u003c/i\u003e \u003ci\u003emaximum sentence count\u003c/i\u003e \u003ci\u003eminimum word count\u003c/i\u003e \u003ci\u003emaximum word count\u003c/i\u003e\nfrench \u003ci\u003eminimum sentence count\u003c/i\u003e \u003ci\u003emaximum sentence count\u003c/i\u003e \u003ci\u003eminimum word count\u003c/i\u003e \u003ci\u003emaximum word count\u003c/i\u003e\ngerman \u003ci\u003eminimum sentence count\u003c/i\u003e \u003ci\u003emaximum sentence count\u003c/i\u003e \u003ci\u003eminimum word count\u003c/i\u003e \u003ci\u003emaximum word count\u003c/i\u003e\nlatin \u003ci\u003eminimum sentence count\u003c/i\u003e \u003ci\u003emaximum sentence count\u003c/i\u003e \u003ci\u003eminimum word count\u003c/i\u003e \u003ci\u003emaximum word count\u003c/i\u003e\nspanish \u003ci\u003eminimum sentence count\u003c/i\u003e \u003ci\u003emaximum sentence count\u003c/i\u003e \u003ci\u003eminimum word count\u003c/i\u003e \u003ci\u003emaximum word count\u003c/i\u003e\nname \u003ci\u003eminimum letter count\u003c/i\u003e \u003ci\u003emaximum letter count\u003c/i\u003e\nfirst_name\nlast_name\nfull_name\npassword\nphone_number\nstreet_name\nstreet_address\ncity_code\ncity_name\nregion_name\ncountry_name\ncountry_code\ncompany_name\nimage_file_name\naudio_file_name\nvideo_file_name\nfile_name\nfolder_path\n\u003ci\u003ecolumn name\u003c/i\u003e\n.\u003ci\u003ecolumn name\u003c/i\u003e\n\u003ci\u003etable name\u003c/i\u003e.\u003ci\u003ecolumn name\u003c/i\u003e\n\u003c/pre\u003e\n\n### Column template filters\n\n\u003cpre\u003e\nfloor [\u003ci\u003eprecision\u003c/i\u003e]\nceil [\u003ci\u003eprecision\u003c/i\u003e]\nround [\u003ci\u003eprecision\u003c/i\u003e]\nadd \u003ci\u003ecolumn name\u003c/i\u003e\nadd \u003ci\u003einteger\u003c/i\u003e\nadd \u003ci\u003eminimum integer\u003c/i\u003e \u003ci\u003emaximum integer\u003c/i\u003e\nadd \u003ci\u003ereal\u003c/i\u003e\nadd \u003ci\u003eminimum real\u003c/i\u003e \u003ci\u003emaximum real\u003c/i\u003e\nadd_product \u003ci\u003ecolumn name or real\u003c/i\u003e ...\nsubstract \u003ci\u003einteger\u003c/i\u003e\nsubstract \u003ci\u003eminimum integer\u003c/i\u003e \u003ci\u003emaximum integer\u003c/i\u003e\nsubstract \u003ci\u003ereal\u003c/i\u003e\nsubstract \u003ci\u003eminimum real\u003c/i\u003e \u003ci\u003emaximum real\u003c/i\u003e\nsubstract \u003ci\u003ecolumn name\u003c/i\u003e\nsubstract_product \u003ci\u003ecolumn name or real\u003c/i\u003e ...\nmultiply \u003ci\u003ecolumn name\u003c/i\u003e\nmultiply \u003ci\u003einteger\u003c/i\u003e\nmultiply \u003ci\u003eminimum integer\u003c/i\u003e \u003ci\u003emaximum integer\u003c/i\u003e\nmultiply \u003ci\u003ereal\u003c/i\u003e\nmultiply \u003ci\u003eminimum real\u003c/i\u003e \u003ci\u003emaximum real\u003c/i\u003e\ndivide \u003ci\u003ecolumn name\u003c/i\u003e\ndivide \u003ci\u003einteger\u003c/i\u003e\ndivide \u003ci\u003eminimum integer\u003c/i\u003e \u003ci\u003emaximum integer\u003c/i\u003e\ndivide \u003ci\u003ereal\u003c/i\u003e\ndivide \u003ci\u003eminimum real\u003c/i\u003e \u003ci\u003emaximum real\u003c/i\u003e\nset \u003ci\u003evalue\u003c/i\u003e\nprefix \u003ci\u003eseparator\u003c/i\u003e\nadd_prefix \u003ci\u003eprefix\u003c/i\u003e\nremove_prefix \u003ci\u003eprefix\u003c/i\u003e\nreplace_prefix \u003ci\u003eold prefix\u003c/i\u003e \u003ci\u003enew content\u003c/i\u003e\nsuffix \u003ci\u003eseparator\u003c/i\u003e\nadd_suffix \u003ci\u003esuffix\u003c/i\u003e\nremove_suffix \u003ci\u003esuffix\u003c/i\u003e\nreplace_suffix \u003ci\u003eold suffix\u003c/i\u003e \u003ci\u003enew suffix\u003c/i\u003e\nremove \u003ci\u003econtent\u003c/i\u003e\nreplace \u003ci\u003eold content\u003c/i\u003e \u003ci\u003enew content\u003c/i\u003e\nplural\nunaccented\nupper_case\nlower_case\npascal_case\nsnake_case\nkebab_case\ntype_case\nattribute_case\nvariable_case\nstyle_case\nsentence_case\nlocution_case\nslug_case\nsearch_case\nfetch \u003ci\u003etable name\u003c/i\u003e \u003ci\u003ekey column name\u003c/i\u003e \u003ci\u003evalue column name\u003c/i\u003e\nif this|\u003ci\u003ecolumn name\u003c/i\u003e|\u003ci\u003evalue\u003c/i\u003e =|!=|contains|!contains|has_prefix|!has_prefix|has_suffix|!has_suffix this|\u003ci\u003ecolumn name\u003c/i\u003e|\u003ci\u003evalue\u003c/i\u003e\nswitch this|\u003ci\u003ecolumn name\u003c/i\u003e|\u003ci\u003evalue\u003c/i\u003e \u003ci\u003eold value\u003c/i\u003e \u003ci\u003enew value\u003c/i\u003e ...\n\u003c/pre\u003e\n\n### Column template characters\n\n\u003cpre\u003e\n\\s : space character\n\\n : linefeed character\n\\r : return character\n\\t : tabulation character\n\\v : void string\n\u003c/pre\u003e\n\n### Column properties\n\n\u003cpre\u003e\n[!]stored\n[!]added\n[!]edited\n[!]checked\nkey\npartitioned\nclustered\nindexed\nfiltered\ngrouped\nmapped\naccessed\nprocessed\nstatic\nprivate\nrequired\nincremented\nconstrained\nlinked \u003ci\u003etable name\u003c/i\u003e\noptional\nexhaustive\nexhaustive \u003ci\u003eforeign column name\u003c/i\u003e \u003ci\u003esibling column name\u003c/i\u003e\nascending [\u003ci\u003eorder index\u003c/i\u003e]\ndescending [\u003ci\u003eorder index\u003c/i\u003e]\ngenerated\nupdated\ncapacity \u003ci\u003emaximum character count\u003c/i\u003e\nprecision \u003ci\u003emaximum digit count\u003c/i\u003e\nsqlname \u003ci\u003esql column name\u003c/i\u003e\ncqlname \u003ci\u003ecql column name\u003c/i\u003e\ngoname \u003ci\u003ego field name\u003c/i\u003e\ncrystalname \u003ci\u003ecrystal field name\u003c/i\u003e\ncsharpname \u003ci\u003ecsharp field name\u003c/i\u003e\nrustname \u003ci\u003erust field name\u003c/i\u003e\ncount \u003ci\u003eminimum element count\u003c/i\u003e \u003ci\u003emaximum element count\u003c/i\u003e\ncount \u003ci\u003eelement count\u003c/i\u003e\n\n[!]\u003ci\u003ecustom property name\u003c/i\u003e\n\u003ci\u003ecustom property name\u003c/i\u003e \u003ci\u003ecustom property value\u003c/i\u003e\n\u003c/pre\u003e\n\n### Field name suffixes\n\n\u003cpre\u003e\nId\nYear\nTitle\nSlug\nText\nFirstName\nLastName\nName\nPseudonym\nPassword\nEmail\nPhone\nStreet\nAddress\nCode\nCity\nRegion\nCountryCode\nCountry\nCompany\nImage\nFile\nFolder\nAuthor\nIsbn\nTags\n\u003c/pre\u003e\n\nThe `Pseudonym` column is based on the prior `Email` column if it exists.\n\nThe `Email`, `Login` and `Pseudonym` columns are based on the prior `FirstName` and `LastName` columns if they exist.\n\nThe `Slug` column is based on the prior `Title` or `Name` column if it exists.\n\n### Column types\n\n\u003cpre\u003e\nBOOL\nINT8\nUINT8\nINT16\nUINT16\nINT32\nUINT32\nINT64\nUINT64\nFLOAT32\nFLOAT64\nDECIMAL\nSTRING\nSTRING8\nSTRING16\nSTRING24\nSTRING32\nTIMESTAMP\nDATETIME\nDATE\nTIME\nTUID\nUUID\nBLOB\n\u003ci\u003etable name\u003c/i\u003e.\u003ci\u003ecolumn name\u003c/i\u003e\nTUPLE[ \u003ci\u003efield type\u003c/i\u003e, \u003ci\u003efield type\u003c/i\u003e, ... ]\nTUPLE[ \u003ci\u003efield name\u003c/i\u003e : \u003ci\u003efield type\u003c/i\u003e, \u003ci\u003efield name\u003c/i\u003e : \u003ci\u003efield type\u003c/i\u003e, ... ]\nLIST[ \u003ci\u003eelement type\u003c/i\u003e ]\nLIST[ \u003ci\u003eelement name\u003c/i\u003e : \u003ci\u003eelement type\u003c/i\u003e ]\nSET[ \u003ci\u003eelement type\u003c/i\u003e ]\nSET[ \u003ci\u003eelement name\u003c/i\u003e : \u003ci\u003eelement type\u003c/i\u003e ]\nMAP[ \u003ci\u003ekey type\u003c/i\u003e, \u003ci\u003eelement type\u003c/i\u003e ]\nMAP[ \u003ci\u003ekey name\u003c/i\u003e : \u003ci\u003ekey type\u003c/i\u003e, \u003ci\u003eelement name\u003c/i\u003e : \u003ci\u003eelement type\u003c/i\u003e ]\nOBJECT\nARRAY[ \u003ci\u003eelement type\u003c/i\u003e ] | !stored\nPOINTER[ \u003ci\u003eelement type\u003c/i\u003e ] | !stored\n\u003c/pre\u003e\n\n## Data file syntax\n\n\u003cpre\u003e\n@include file.bd\n\n\u003ci\u003etable name\u003c/i\u003e\n\n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003ci\u003ecolumn name\u003c/i\u003e \u003ci\u003ecolumn name\u003c/i\u003e ...\n\n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003ci\u003ecolumn value\u003c/i\u003e ~ \u003ci\u003ecolumn value\u003c/i\u003e ~ ...\n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;...\n\n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;...\n\n...\n\u003c/pre\u003e\n\n\u003cpre\u003e\n%identifier : MD5 hash TUID\n% : null TUID\n#identifier : MD5 hash UUID\n# : null UUID\n~ : value separator\n{ } : collection delimiter\n{ \u003ci\u003evalue\u003c/i\u003e ~ \u003ci\u003evalue\u003c/i\u003e ~ ... } : tuple\n{ \u003ci\u003evalue\u003c/i\u003e ~ \u003ci\u003evalue\u003c/i\u003e ~ ...} : list\n{ \u003ci\u003evalue\u003c/i\u003e ~ \u003ci\u003evalue\u003c/i\u003e ~ ...} : set\n{ { \u003ci\u003ekey\u003c/i\u003e ~ \u003ci\u003evalue\u003c/i\u003e } ~ { \u003ci\u003ekey\u003c/i\u003e ~ \u003ci\u003evalue\u003c/i\u003e } ~ ... } : map\n^ : unremovable space\n× : empty string\n§ : new line placeholder\n\\ : escape character\n\u003c/pre\u003e\n\n## Template file syntax\n\n```\n%%output file path\n\n\u003c#content for each table#\u003e\n\u003c#^content for each stored table^#\u003e\n\u003c#°content for each non stored table°#\u003e\n\u003c#§content for each edited table§#\u003e\n\n\u003c%content for each column%\u003e\n\u003c@content for each key column@\u003e\n\u003c$content for each non key column$\u003e\n\n\u003c%^content for each stored column^%\u003e\n\u003c@^content for each stored key column^@\u003e\n\u003c$^content for each stored non key column^$\u003e\n\n\u003c%°content for each non stored column°%\u003e\n\u003c@°content for each non stored key column°@\u003e\n\u003c$°content for each non stored non key column°$\u003e\n\n\u003c%¨content for each added column¨%\u003e\n\u003c@¨content for each added key column¨@\u003e\n\u003c$¨content for each added non key column¨$\u003e\n\n\u003c%§content for each edited column§%\u003e\n\u003c@§content for each edited key column§@\u003e\n\u003c$§content for each edited non key column§$\u003e\n\n\u003c~Equals\u003c\u003efirst text\u003c\u003esecond text\u003c\u003etext if same texts~\u003e\n\u003c~Equals\u003c\u003efirst text\u003c\u003esecond text\u003c\u003etext if same texts\u003c\u003etext if not same texts~\u003e\n\n\u003c~!Equals\u003c\u003efirst text\u003c\u003esecond text\u003c\u003etext if not same texts~\u003e\n\u003c~!Equals\u003c\u003efirst text\u003c\u003esecond text\u003c\u003etext if not same texts\u003c\u003etext if same texts~\u003e\n\n\u003c~HasPrefix\u003c\u003etext\u003c\u003eprefix\u003c\u003etext if prefix found~\u003e\n\u003c~HasPrefix\u003c\u003etext\u003c\u003eprefix\u003c\u003etext if prefix found\u003c\u003etext if prefix not found~\u003e\n\n\u003c~!HasPrefix\u003c\u003etext\u003c\u003eprefix\u003c\u003etext if prefix not found~\u003e\n\u003c~!HasPrefix\u003c\u003etext\u003c\u003eprefix\u003c\u003etext if prefix not found\u003c\u003etext if prefix found~\u003e\n\n\u003c~HasSuffix\u003c\u003etext\u003c\u003esuffix\u003c\u003etext if suffix found~\u003e\n\u003c~HasSuffix\u003c\u003etext\u003c\u003esuffix\u003c\u003etext if suffix found\u003c\u003etext if suffix not found~\u003e\n\n\u003c~!HasSuffix\u003c\u003etext\u003c\u003esuffix\u003c\u003etext if suffix not found~\u003e\n\u003c~!HasSuffix\u003c\u003etext\u003c\u003esuffix\u003c\u003etext if suffix not found\u003c\u003etext if suffix found~\u003e\n\n\u003c~Contains\u003c\u003etext\u003c\u003econtent\u003c\u003etext if content found~\u003e\n\u003c~Contains\u003c\u003etext\u003c\u003econtent\u003c\u003etext if content found\u003c\u003etext if content not found~\u003e\n\n\u003c~!Contains\u003c\u003etext\u003c\u003econtent\u003c\u003etext if content not found~\u003e\n\u003c~!Contains\u003c\u003etext\u003c\u003econtent\u003c\u003etext if content not found\u003c\u003etext if content found~\u003e\n\n\u003c~IsLinux\u003c\u003etext for Linux platform~\u003e\n\u003c~IsLinux\u003c\u003etext for Linux platform\u003c\u003etext for other platforms~\u003e\n\n\u003c~IsMacOS\u003c\u003etext for MacOS platform~\u003e\n\u003c~IsMacOS\u003c\u003etext for MacOS platform\u003c\u003etext for other platforms~\u003e\n\n\u003c~IsWindows\u003c\u003etext for Windows platform~\u003e\n\u003c~IsWindows\u003c\u003etext for Windows platform\u003c\u003etext for other platforms~\u003e\n\n\u003c~RemovePrefix\u003c\u003etext\u003c\u003eprefix~\u003e\n\u003c~ReplacePrefix\u003c\u003etext\u003c\u003eold prefix\u003c\u003enew prefix~\u003e\n\n\u003c~RemoveSuffix\u003c\u003etext\u003c\u003esuffix~\u003e\n\u003c~ReplaceSuffix\u003c\u003etext\u003c\u003eold suffix\u003c\u003enew suffix~\u003e\n\n\u003c~Remove\u003c\u003etext\u003c\u003econtent~\u003e\n\u003c~Replace\u003c\u003etext\u003c\u003eold content\u003c\u003enew content~\u003e\n\n\u003c~Quote\u003c\u003etext~\u003e\n\u003c~Unquote\u003c\u003etext~\u003e\n\n\u003c~LowerCase\u003c\u003etext~\u003e\n\u003c~UpperCase\u003c\u003etext~\u003e\n\u003c~PascalCase\u003c\u003etext~\u003e\n\u003c~SnakeCase\u003c\u003etext~\u003e\n\u003c~KebabCase\u003c\u003etext~\u003e\n\u003c~TypeCase\u003c\u003etext~\u003e\n\u003c~AttributeCase\u003c\u003etext~\u003e\n\u003c~VariableCase\u003c\u003etext~\u003e\n\u003c~StyleCase\u003c\u003etext~\u003e\n\u003c~TitleCase\u003c\u003etext~\u003e\n\u003c~SentenceCase\u003c\u003etext~\u003e\n\u003c~LocutionCase\u003c\u003etext~\u003e\n\u003c~SlugCase\u003c\u003etext~\u003e\n\n\u003c~Plural\u003c\u003etext~\u003e\n\n\u003c~Split\u003c\u003evariable name\u003c\u003evalue text\u003c\u003evalue separator\u003c\u003etemplate text~\u003e\n\u003c~Map\u003c\u003evariable name\u003c\u003evalue text\u003c\u003evalue separator\u003c\u003etemplate text~\u003e\n\u003c~Map\u003c\u003evariable name\u003c\u003evalue text\u003c\u003evalue separator\u003c\u003esub value separator\u003c\u003etemplate text~\u003e\n\n\u003c~boolean expression\u003c\u003etext if condition is true~\u003e\n\u003c~boolean expression\u003c\u003etext if condition is true\u003c\u003etext if condition is false~\u003e\n\n{#name#}\n{#attribute#}\n{#variable#}\n{#style#}\n{#title#}\n{#sentence#}\n{#locution#}\n{#go_type#}\n{#go_attribute#}\n{#go_variable#}\n{#php_type#}\n{#php_attribute#}\n{#php_variable#}\n{#crystal_type#}\n{#csharp_type#}\n{#csharp_attribute#}\n{#csharp_variable#}\n{#rust_type#}\n{#javascript_type#}\n{#javascript_attribute#}\n{#key_attribute#}\n{#key_variable#}\n{#go_attribute_declaration#}\n{#go_type_declaration#}\n{#generis_attribute_declaration#}\n{#generis_type_declaration#}\n{#crystal_attribute_declaration#}\n{#crystal_type_declaration#}\n{#cibyl_attribute_declaration#}\n{#cibyl_type_declaration#}\n{#csharp_attribute_declaration#}\n{#csharp_type_declaration#}\n{#javascript_attribute_declaration#}\n{#javascript_type_declaration#}\n{#rust_attribute_declaration#}\n{#rust_type_declaration#}\n{#is_stored#}\n{#is_non_stored#}\n{#is_edited#}\n{#is_non_edited#}\n{#is_first#}\n{#is_first_stored#}\n{#is_first_non_stored#}\n{#is_first_edited#}\n{#is_first_non_edited#}\n{#is_last#}\n{#is_last_stored#}\n{#is_last_non_stored#}\n{#is_last_edited#}\n{#is_last_non_edited#}\n{#column_count#}\n{#stored_column_count#}\n\n{#\u003ci\u003ecustom property name\u003c/i\u003e#}\n{#?\u003ci\u003ecustom property name\u003c/i\u003e#}\n\n{%name%}\n{%attribute%}\n{%variable%}\n{%style%}\n{%title%}\n{%sentence%}\n{%locution%}\n{%stored_name%}\n{%stored_type%}\n{%cql_name%}\n{%cql_type%}\n{%sql_name%}\n{%sql_type%}\n{%go_name%}\n{%go_type%}\n{%go_attribute%}\n{%go_variable%}\n{%php_name%}\n{%php_type%}\n{%php_attribute%}\n{%php_variable%}\n{%php_default%}\n{%crystal_name%}\n{%crystal_type%}\n{%csharp_name%}\n{%csharp_type%}\n{%csharp_attribute%}\n{%csharp_variable%}\n{%rust_name%}\n{%rust_type%}\n{%javascript_name%}\n{%is_boolean%}\n{%is_natural%}\n{%is_integer%}\n{%is_real%}\n{%is_number%}\n{%is_string%}\n{%is_datetime%}\n{%is_date%}\n{%is_time%}\n{%is_tuid%}\n{%is_uuid%}\n{%is_scalar%}\n{%is_blob%}\n{%is_tuple%}\n{%is_list%}\n{%is_set%}\n{%is_map%}\n{%is_object%}\n{%is_compound%}\n{%is_key%}\n{%is_non_key%}\n{%is_stored%}\n{%is_non_stored%}\n{%is_stored_key%}\n{%is_non_stored_key%}\n{%is_stored_non_key%}\n{%is_non_stored_non_key%}\n{%is_added%}\n{%is_non_added%}\n{%is_added_key%}\n{%is_non_added_key%}\n{%is_added_non_key%}\n{%is_non_added_non_key%}\n{%is_edited%}\n{%is_non_edited%}\n{%is_edited_key%}\n{%is_non_edited_key%}\n{%is_edited_non_key%}\n{%is_non_edited_non_key%}\n{%is_incremented%}\n{%is_first%}\n{%is_first_key%}\n{%is_first_non_key%}\n{%is_first_stored%}\n{%is_first_non_stored%}\n{%is_first_stored_key%}\n{%is_first_non_stored_key%}\n{%is_first_stored_non_key%}\n{%is_first_non_stored_non_key%}\n{%is_first_added%}\n{%is_first_non_added%}\n{%is_first_added_key%}\n{%is_first_non_added_key%}\n{%is_first_added_non_key%}\n{%is_first_non_added_non_key%}\n{%is_first_edited%}\n{%is_first_non_edited%}\n{%is_first_edited_key%}\n{%is_first_non_edited_key%}\n{%is_first_edited_non_key%}\n{%is_first_non_edited_non_key%}\n{%is_first_incremented%}\n{%is_first_non_incremented%}\n{%is_last%}\n{%is_last_key%}\n{%is_last_non_key%}\n{%is_last_stored%}\n{%is_last_non_stored%}\n{%is_last_stored_key%}\n{%is_last_non_stored_key%}\n{%is_last_stored_non_key%}\n{%is_last_non_stored_non_key%}\n{%is_last_added%}\n{%is_last_non_added%}\n{%is_last_added_key%}\n{%is_last_non_added_key%}\n{%is_last_added_non_key%}\n{%is_last_non_added_non_key%}\n{%is_last_edited%}\n{%is_last_non_edited%}\n{%is_last_edited_key%}\n{%is_last_non_edited_key%}\n{%is_last_edited_non_key%}\n{%is_last_non_edited_non_key%}\n{%is_last_incremented%}\n{%is_last_non_incremented%}\n\n{%\u003ci\u003ecustom property name\u003c/i\u003e%}\n{%?\u003ci\u003ecustom property name\u003c/i\u003e%}\n\n%\\%ignored tag\n\u003c\\#ignored tags#\\\u003e\n\u003c\\%ignored tags%\\\u003e\n\u003c\\@ignored tags@\\\u003e\n\u003c\\$ignored tags$\\\u003e\n\u003c\\#^ignored tags^#\\\u003e\n\u003c\\%^ignored tags^%\\\u003e\n\u003c\\@^ignored tags^@\\\u003e\n\u003c\\$^ignored tags^$\\\u003e\n\u003c\\#°ignored tags°#\\\u003e\n\u003c\\%°ignored tags°%\\\u003e\n\u003c\\@°ignored tags°@\\\u003e\n\u003c\\$°ignored tags°$\\\u003e\n\u003c\\~ignored\u003c\\\u003etags~\\\u003e\n{\\#ignored tags#\\}\n{\\%ignored tags%\\}\n```\n\n### Boolean expression syntax\n\n```\ntrue\nfalse\n!...\n... \u0026\u0026 ...\n... || ...\n( ... )\n```\n\n## Installation\n\nInstall the [DMD 2 compiler](https://dlang.org/download.html) (using the MinGW setup option on Windows).\n\nBuild the executable with the following command line :\n\n```bash\ndmd -m64 basil.d\n```\n\nThe UML diagrams can be drawn using [PlantText](https://www.planttext.com/) or [PlantUML](http://plantuml.com/).\n\n## Command line\n\n```\nbasil [options] script_file.bs [script_file.bs|bd|bt|csv ...]\n```\n\n### File extensions\n\n```\n.bs : schema\n.bd, .csv : data\n.bt : template\n```\n\n### Options\n\n```\n--prefix : output file name prefix\n--suffix : output file name suffix\n--uml : generate an UML schema file\n--mysql : generate MySQL schema and data files\n--postgresql : generate PostgreSQL schema and data files\n--cassandra : generate Cassandra schema and data files\n--json : generate a JSON data file\n--csv : generate CSV data files\n--go : generate a Go type file\n--generis : generate Generis type, query, response, request and route files\n--phoenix : generate Phoenix query files\n--crystal : generate a Crystal type file\n--csharp : generate a C# type file\n--dart : generate Dart type files\n--javascript : generate a Javascript type file\n--rust : generate a Rust type file\n--ignore-drop : ignore drop command\n--force-drop : force drop command\n--exclude-command \u003ccommand_name\u003e\n--verbose : show processed content\n```\n\nThe `--mysql`, `--postgresql` and `--cassandra` are mutually exclusive.\n\n### Examples\n\n```bash\nbasil --uml blog.bs\n```\n\nGenerates `blog.uml` from `blog.bs`.\n\n```bash\nbasil --uml --mysql --go blog.bs\n```\n\nGenerates `blog.uml`, `blog.sql`, `blog_schema.sql`, `blog_data.sql`, `blog_sql_type.go` from `blog.bs`.\n\n```bash\nbasil --uml --cassandra --go blog.bs blog.bt\n```\n\nGenerates `blog.uml`, `blog.cql`, `blog_schema.cql`, `blog_data.cql`, `blog_sql_type.go` from `blog.bs`, and other custom files from `blog.bt`.\n\n## Version\n\n8.0\n\n## Author\n\nEric Pelzer (ecstatic.coder@gmail.com).\n\n## License\n\nThis project is licensed under the GNU General Public License version 3.\n\nSee the [LICENSE.md](LICENSE.md) file for details.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsenselogic%2Fbasil","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsenselogic%2Fbasil","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsenselogic%2Fbasil/lists"}