# ---------------------------------------------------------------------------- # # | # | # C o n f i g F i l e G e n e r a t o r | # | # A system for extracting default config files for your scripts | # | # | # Author: |Anthony| | # Version: 0.2 | # dScript Version: 0.9.5-b1518 | # | # ---------------------------------------------------------------------------- # # # # ABOUT: # Use the ConfigFileGenerator for any scripts that use config files or # YAML file storage. It will generate any default files for you based on # what you define in the Configurations Script Container. # # ------------- # # USAGE: # # - Build your Configurations Script Container file as needed following the # examples shown here. # # - Run the ConfigFileGeneratorHelper to generate the files defined in the # Configurations Script Container. # - run s@ConfigFileGeneratorHelper def:%readID%|%basePath% # # #--- Configurations Script Container: # # The Configurations Script Container is the house for your default files. # It will be referenced when building your default files. # You are able to store any data needed inside this file. It can handle # recursive lists too. # # Naming the Container # * This is important! # # This script container should follow the naming convention: # YourScript_Configurations # %readID%_%basePath% # # We will refer to this later as %readID%_%basePath% # #--- Example: # # There is an example Configurations Script Container at the end of this # file that you can use to see how the ConfigFileGenerator works. # # There is also a command script supplied to make it easy to test. Assign # youself the denizen.cfg permission node to use the command: /cfg # # This will create 3 files inside /plugins/denizen/ConfigFileGeneratorTest # # You can also specify the any or all of 3 options for the /cfg command. # /cfg --dryrun --verbose --force # #__________ # ################################################################################ # # Config File Generator Helper # # This script tells the s@ConfigFileGenerator which files to generate based # on the script container you reference. # # Bare minimum usage: # - run s@ConfigFileGeneratorHelper def:%readID%|%basePath%|%dryrun%|%verbose%|%forcewrite% instantly # # # NOTES: # # - I want to update this so you can specify a single file to build from any # config container. Currently it tries to build every file but will not # overwrite existing files by default (you CAN specify the --force option) # 'ConfigFileGeneratorHelper': type: task debug: false script: - ^define readID '' - ^define basePath '' - ^define scriptPath '.relative_filename||null>' - ^define dryrun '>' - ^define verbose '>' - ^define forcewrite '>' - ^if { - announce "<&b>ConfigFileGenerator<&co> <&c> is not a valid readID." to_console - queue stop } - ^if { - yaml 'load:' 'id:%readID%' } else { - announce "<&b>ConfigFileGenerator<&co> <&c>%scriptPath% does not exist!" to_console - queue stop } - ^define keylist '' - ^if { - announce "<&b>ConfigFileGenerator<&co> <&c>The default config file is emtpy!" to_console - yaml unload 'id:%readID%' - queue stop } - ^foreach { - define node - inject s@ConfigFileGeneratorHelper p:buildFile } - ^announce "<&b>ConfigFileGenerator<&co> <&a> has Completed!" to_console - ^announce "<&b>ConfigFileGenerator<&co> <&a> has Completed!" to_flagged:ConfigFileGeneratorNotify - ^yaml unload 'id:%readID%' buildFile: - if ! || { - announce "<&b>ConfigFileGenerator<&co> <&3>Generating default %node%.yml file..." to_console - announce "<&b>ConfigFileGenerator<&co> <&3>Generating default %node%.yml file..." to_flagged:ConfigFileGeneratorNotify - announce "<&b>" to_flagged:ConfigFileGeneratorNotify - define writePath '%node%' - define writeID '%readID%_%node%' - yaml create 'id:%writeID%' - run s@ConfigFileGenerator def:|||||| instantly - if ! { - yaml 'savefile:%readID%/%node%.yml' 'id:%writeID%' - announce "<&b>ConfigFileGenerator<&co> <&a> %node%.yml Save Complete!" to_console - announce "<&b>ConfigFileGenerator<&co> <&a> %node%.yml Save Complete!" to_flagged:ConfigFileGeneratorNotify - announce "" to_flagged:ConfigFileGeneratorNotify - yaml unload 'id:%writeID%' } else { - announce "<&b>ConfigFileGenerator<&co> <&a> %node%.yml Dryrun Complete!" to_console - announce "<&b>ConfigFileGenerator<&co> <&a> %node%.yml Dryrun Complete!" to_flagged:ConfigFileGeneratorNotify - announce "" to_flagged:ConfigFileGeneratorNotify - yaml unload 'id:%writeID%' } } else { - announce "<&b>ConfigFileGenerator<&co> <&a> %node%.yml already exists!" to_console - announce "<&b>ConfigFileGenerator<&co> <&a> %node%.yml already exists!" to_flagged:ConfigFileGeneratorNotify } ################################################################################ # # Configuration File Generator # # # This script generates default config files based on the definitions passed to # it. It should be flexible enough to handle any script. # # You shouldn't ever really need to call this script directly. Just use the # ConfigFileGeneratorHelper to make your life easier! # # - run s@ConfigFileGenerator def:%readID%|%writeID%|%basePath%|%writePath%|%dryrun%|%verbose%|%forcewrite% instantly # 'ConfigFileGenerator': type: task debug: false definitions: readID|writeID|basePath|writePath|dryrun|verbose|forcewrite script: - ^define keylist '].list_keys[.]>' - ^if != null { - inject s@ConfigFileGenerator p:foreachKeylist instantly } else { - define entry '].read[.]>' - if || { - announce "<&b>ConfigFileGenerator<&co> <&a>Next Path<&co> <&b>." to_console - announce "<&b>ConfigFileGenerator<&co> <&a>Next Path<&co> <&b>." to_flagged:ConfigFileGeneratorNotify } - if ].is_list[.]> { - inject s@ConfigFileGenerator p:foreachEntrylist instantly } else { - inject s@ConfigFileGenerator p:singleEntry instantly } } foreachKeylist: - foreach { - define key '' - define oldWritePath '' - define writePath '%writePath%.%key%' - run s@ConfigFileGenerator def:|||||| instantly - define writePath '%oldWritePath%' } foreachEntrylist: - yaml 'write:%writePath%' 'id:%writeID%' - foreach { - if ! { - yaml set :->: 'id:' } - if || { - announce "<&b>ConfigFileGenerator<&co> <&9>%writePath%<&co> <&2>%value%" to_console - announce "<&b>ConfigFileGenerator<&co> <&9>%writePath%<&co> <&2>%value%" to_flagged:ConfigFileGeneratorNotify } } - if || { - announce "<&b>ConfigFileGenerator<&co> <&3>*-----*" to_flagged:ConfigFileGeneratorNotify - announce "" to_flagged:ConfigFileGeneratorNotify } singleEntry: - if { - yaml 'write:' 'value:' 'id:' } - if || { - announce "<&b>ConfigFileGenerator<&co> <&c>%writePath%<&co> <&e>%entry%" to_console - announce "<&b>ConfigFileGenerator<&co> <&c>%writePath%<&co> <&e>%entry%" to_flagged:ConfigFileGeneratorNotify - announce "<&b>ConfigFileGenerator<&co> <&4>*-----*" to_flagged:ConfigFileGeneratorNotify - announce "<&b>ConfigFileGenerator<&co> " to_flagged:ConfigFileGeneratorNotify } ################################################################################ # # Configuration File Generator Command # # Use this to build the example config files. You /could/ use it to build files # for other scripts, but use at your own risk! # # I suppose you could add something like this to accept container names... # # - if { # - define file ]> # } # else { # - narrate "<&4>You must specify the basePath!" # } # - if { # - define readID ]> # - narrate "%readID%" # } # else { # - narrate "<&4>You must specify the readID!" # } # 'ConfigFileGeneratorCommand': type: world debug: false events: on cfg command: - if ! queue stop - determine passively fulfilled - flag ConfigFileGeneratorNotify:true - define dryrun ']:true || false>' - define verbose ']:true || false>' - define forcewrite ']:true || false>' - run s@ConfigFileGeneratorHelper def:ConfigFileGeneratorTest|Configurations|%dryrun%|%verbose%|%forcewrite% instantly - flag ConfigFileGeneratorNotify:! ################################################################################ # # # Example Configurations Script Container # # # # This is how a Configurations Script Container should be structured. # # # # Each parent node under the script container defines a file name to generate. # # The child nodes that follow are the entries for that individual file. # # # # In this example, 3 files are generated in denizen/ConfigFileGeneratorTest/ # # # # Although the examples are a bit robotic, they clearly illustrate a range of # # usage scenarios. # #______________________________________________________________________________# # # #______________________________DO_NOT_EDIT_THIS_FILE___________________________# # # #______________________________________________________________________________# 'ConfigFileGeneratorTest_Configurations': type: task debug: false # ------ Single Value file container ------ # singleValues: keyA: 1 keyB: 0.1 keyC: -1 keyD: NaN keyE: This is a StRiNg! # ------ Single Lists file container ------ # singleLists: listA: - 1 - 0.1 - -1 - NaN - This is a StRiNg! listB: - 2 - 0.2 - -2 - nAn - This is a sTrInG! # ------ Recursive Lists file container ------ # recursiveLists: list1: list1A: list1A1: key1A1A: 1 list1A1A: - 1 - 2 list1A2: list1A2A: key1A2A1: 1 list1A2A1: - 1 - 2 list1B: - 1 - 2 list2: list2A: key2A1: 1 list2A1: - 1 - 2 list2B: key2B1: 1 list2B1: - 1 - 2 list2C: key2C1: 1 list2C1: - 1 - 2 ################################################################################