OOB: Objektumok bash parancsértelmezőben

Súgó

A súgó és az OOB betöltése

Ehhez saját függvényt írunk a basic.oob (verzió: 1.0.7) fájl végére:

oob_help() { local f t; [[ -f $1.$oob_LANG ]] && f="$1.$oob_LANG" || f="$1.en"; t="$(<"$f")"; printf %b "$t\n"; }

A parancs először megkeresi a lokalizált súgófájlt úgy, hogy a súgófájl kiterjesztése jelzi a súgófájl nyelvét. Ha ilyen fájl nem létezik, akkor az angol nyelvú súgófájlt állítja be. Ezután a fájl tartalmát beolvassa egy helyi változóba, aminek a tartalmát kiírja. Az aktuális nyelv beállításához az oob_LANG változót kell beállítani, ezt mindjárt a basic.oob fájl elején megtesszük, így a fájl első két programsora így néz ki:

oob_HOME="${BASH_SOURCE%/*}" do=0  # define OOB home directory and descriptor of the root object
oob_LANG="${LANG:-${LANGUAGE:-${LC_ALL:-${LC_MESSAGES:-en}}}}" oob_LANG="${oob_LANG%%_*}"  # set localized language

Az oob_LANG változó felveszi a LANG bash változó értékét, ám ha az üres vagy nem létezik, akkor sorban megpróbálja felvenni a LANGUAGE, LC_ALL, LC_MESSAGES változók közül az elsőt, amelyik rendelkezik értékkel. Ha egyik sem, akkor marad az en, az angol nyelvi beállítás. Végül a változó végéről eltávolítja az esetleges kódlap beállítást.

A súgó meghívásához hozzá kell igazítsuk a betöltőfájlt, ám mielőtt ezt megtesszük, a basic.oob fájl végére beírunk egy új parancsot:

oob() {  # input: script, arguments  # result: run script
 [[ -z $1 ]] && return
 oob_SOURCE=( "$1" "${oob_SOURCE[@]}" ); shift  # add script name
 source "$oob_SOURCE" "$@" || oob_trap "Error in" "$oob_SOURCE"  # try execute the script
 unset -v oob_SOURCE[0]; oob_SOURCE=( "${oob_SOURCE[@]}" )  # remove script name
}  # oob()

Ha a parancsot argumentum nélkül hívjuk meg, akkor azonnal visszatér, egyébként az első argumentumot végrehajtandó szkriptként értelmezi és megpróbálja futtatni úgy, hogy a többi argumentumot átadja annak. Sikertelenség esetén hibaágra fut. Az oob_SOURCE tömb a bash BASH_SOURCE tömbjéhez hasonlóan, az oob parancs által futtatott szkriptek útvonalát tartalmazza fordított sorrendben.

Ezzel el is készültünk a basic.oob fájllal, így véglegesíthetjük a verziószámozást, vagyis a köztes verziószámot megemeljük:

#
# OOB internal
# basic.oob, version 1.1.0
# https://oob.xport.hu
# basic commands for Object Oriented Bash

Most hozzáigazítjuk a súgó meghívásához az oob indítófájlt:

#!/usr/bin/env bash
# OOB internal
# oob, version 1.1.0
# https://oob.xport.hu
# loads Object Oriented Bash and executes user script

oob_SOURCE=( "$(realpath "$BASH_SOURCE")" ); source "${oob_SOURCE%/oob}/basic.oob" || exit  # get OOB dir and load OOB
case $1 in
 -h|--help) shift; oob_help "$oob_HOME/MSG/oob-help" "$@";;  # load help for OOB
 *) oob "$@";;  # run user script
esac

Az oob fájl először létrehozza és inicializálja az oob_SOURCE tömböt a saját valódi elérési útvonalával. Ennek felhasználásával betölti a basic.oob fájlt. Ezután, ha az első argumentum (-h, --help) szerint a súgót kell betölteni, akkor meghívja az oob_help parancsot. Ha nem a súgó betöltése a cél, akkor a basic.oob fájlban az előbb létrehozott oob parancsot futtatja le.

A szkriptekben kiadott oob utasítások is már az oob parancsot fogják elindítani, nem az oob fájlt, így a szkriptek elérési útvonala bekerül az oob_SOURCE tömbbe.

Angol nyelvű súgó

A súgóba azokat a parancsokat írjuk be, amelyek a felhasználói interfész részei, a segédfüggvényeket nem. Írjuk meg az angol nyelű súgót az OOB mappájában az MSG almappába az oob-help.en fájlba:

 \e[92;1mUsage \e[37moob\e[92;1m command:\e[0m

   oob --help                                    this help page
   oob <script> <argument>...                    execute an user script
   #!/usr/bin/env oob                            using OOB in shebang

 \e[92;1mCommands in scripts for managing objects:\e[0m

   oob_ls [-dm] [<pattern>]...                   lists objects, attributes or methods
   oob_lss <pattern>                             returns array named oob_LSS with names of objects
   oob_anyObject <object>...                     returns with error if any object exists from arguments
   oob_allObjects <object>...                    returns with error if any object is missing from arguments
   oob_code [-odmc] <pattern>...                 outputs the code of objects, attributes, methods or classes
   oob_cp <new_object>=<pattern>...              creates new objects (and roles) based on the pattern
   oob_cp <object>_=<pattern>...                 copies roles to the objects
   oob_rm <object>...                            deletes objects and their roles
   oob_clone <target object>=<object>...         clones all attributes from object into target object

 \e[92;1mConstructor commands in scripts:\e[0m

   oob_new <objects>                             creates new objects from class-descriptors then create new ones
   oob_parents <pattern>...                      copies parent objects into the new class-descriptors
   oob_setTags -d|-m <name>=\x27<code>\x27...          creates new attributes and methods in class-descriptors
   oob_rmTags -d|-m <name>...                    deletes attributes and methods from new descriptors
   oob_cpTags -d|-m <name>=<tag>...              copies attributes and methods within class-descriptors
   oob_chgText <text> <pattern> [method]...      replaces text in methods of class-descriptors
   oob_chgTag -d|-m <tag> <pattern> [method]...  renames an attribute or a method in methods of class-descriptor

\e[92;1mOOB library commands in scripts:\e[0m

   oob_export <library name> <version> <text> <pattern>...      writes the file of OOB library
   oob_import <library name>...                                 imports OOB libraries

 \e[92;1mOptions usable in commands:\e[0m

   -o                                            objects
   -d                                            attributes
   -m                                            methods
   -c                                            classes

   the options can be combined, eg: -odmc

 \e[92;1mPatterns for object handler commands for OOB:\e[0m

   o_<object>                                    a single object
   o_<object>_@                                  the roles of the object
   o_<object>@                                   the object and its roles
   o_@                                           all object and roles
   o_<object>_+                                  the direct roles of the object
   o_<object>+                                   the object and its direct roles
   o_+                                           all top-level objects
   o_<pattern>-                                  objects matching the pattern from the front
   o_<object>_-                                  the direct roles of the object
   o_-                                           all top-level objects

 \e[92;1mUsable variables in scripts:\e[0m

   oob_SOURCE                                    array for executed scripts names
   oob_HOME                                      home folder for OOB

 \e[92;1mUsable variables in methods:\e[0m

   self                                          substitutes the current role name
   self_<attribute>                              substitutes the data member in the current role

Magyar nyelvű súgó

A magyar nyelű súgó az OOB mappájában az MSG almappában az oob-help.hu fájlban:

 \e[92;1mAz \e[37moob\e[92;1m parancs használata:\e[0m

   oob --help                                    ez a súgó oldal
   oob <szkript> <argumentum>...                 felhasználói szkript végrehajtása
   #!/usr/bin/env oob                            OOB használata shebang-ban

 \e[92;1mA szkriptekben használható objektumokat kezelő parancsok:\e[0m

   oob_ls [-dm] [<minta>]...                     listázza az objektumokat, az adattagokat vagy a metódusokat
   oob_lss <minta>...                            az oob_LSS tömbben visszaadja a megtalált objektumneveket
   oob_anyObject <objektum>...                   hibával tér vissza, ha valamelyik objektum létezik
   oob_allObjects <objektum>...                  hibával tér vissza, ha bármelyik objktum nem létezik
   oob_code [-odmc] <minta>...                   kiírja az objektumok, az adattagok, a metódusok vagy az osztályok kódját
   oob_cp <új objektum>=<minta>...               új objektumokat (és szerepeket) hoz létre a minta alapján
   oob_cp <objektum>_=<minta>...                 szerepeket másol az objektumhoz
   oob_rm <objektum>...                          objektumokat és a szerepeiket törli
   oob_clone <cél objektum>=<objektum>...        az összes adattagot bemásolja az objektumból a cél objektumba

 \e[92;1mA szkriptekben használható Konstruktor parancsok:\e[0m

   oob_new <objektum>...                         új objektumokat hoz létre a leírókból, utána újakat hoz létre
   oob_parents <minta>...                        a szülőobjektumokat bemásolja a leírókba
   oob_setTags -d|-m <név>=\x27<kód>\x27...            új adattagokat és metódusokat hoz létre a leírókban
   oob_rmTags -d|-m <név>...                     adattagokat és metódusokat töröl a leírókból
   oob_cpTags -d|-m <név>=<tag>...               adattagokat és metódusokat másol a leírókban
   oob_chgText <szöveg> <minta> [metódus]...     szöveget cserél a metódus leíróban
   oob_chgTag -d|-m <tag> <minta> [metódus]...   egy adattag vagy egy metódus nevét cseréli a metódus leíróban

 \e[92;1mA szkriptekben hssználható OOB könyvtár parancsok:\e[0m

   oob_export <könyvtár neve> <verzió> <szöveg> <szűrő>...      fájlba írja az OOB osztálykönyvtárat
   oob_import <könyvtár neve>...                                beolvassa az OOB osztálykönyvtárakat

 \e[92;1mA parancsokban használható opciók:\e[0m

   -o                                            objektum
   -d                                            adattag
   -m                                            metódus
   -c                                            osztály

   az opciók kombinálhatóak, például: -odmc

 \e[92;1mAz objektumkezelő parancsokban használható minták:\e[0m

   o_<objektum>                                  egy objektum
   o_<objektum>_@                                az objektum szerepei
   o_<objektum>@                                 az objektum és szerepei
   o_@                                           minden objektum és szerep
   o_<objektum>_+                                az objektum közvetlen szerepei
   o_<objektum>+                                 az objektum és közvetlen szerepei
   o_+                                           minden felső szintű objektum
   o_<minta>-                                    a mintára előlről illeszkedő objektumok
   o_<objektum>_-                                az objektum közvetlen szerepei
   o_-                                           minden felső szintű objektum

 \e[92;1mA stkriptekben használható változók:\e[0m

   oob_SOURCE                                    a végrehajtott szkriptek tömbje
   oob_HOME                                      az OOB saját könyvtára

 \e[92;1mA metódusokban használható változók:\e[0m

   self                                          az aktuális szerep nevét helyettesíti
   self_<adattag>                                az adattagot helyettesíti az aktuális szerepben

Az elkészült rendszer használatba vétele

Pezsgőt bonthatunk, elkészítettük az OOB rendszer használható verzióját. Ha van hozzáférésünk, akkor az oob, basic.oob, oob-help.sh fájlokat bemásolhatjuk az /usr/local/lib/oob könyvtárba. Az oob fájlhoz adjunk mindenkinek futtatási jogot és készítsünk szimbolikus linket hozzá az /usr/local/bin fájlba. Az angol és magyar súgófájlokat másoljuk be az /usr/local/lib/oob/MSG könyvtárba. Ezzel beillesztettük az OOB bash kiegészítést a számítógép rendszerébe.

Ha nincs hozzáférésünk a fenti könyvtárakhoz, akkor saját használatra igénybe vehetjük a $HOME/.local/lib/oob könyvtárat, a szimbolikus linkhez meg a $HOME/.local/bin vagy a $HOME/bin könyvtárat.

Az OOB rendszerben a szkriptekre jellemzően minden publikus. Ugyan lehetne privát adattagokat és metódusokat készíteni, azonban ez bonyolítaná és lassítaná a rendszert, ezért tudatosan elhagytuk ennek kidolgozását. Amúgy sem lehetne teljesen elrejteni a komponenseket, csak megnehezíteni tudnánk a lekérdezésüket.

A tanuláshoz és a használathoz sok sikert kíván a szerző: Kochis Pál Zoltán (pal@kochis.hu)

1 2 3 4 5 6 7 8 9