diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 0000000..08c3321 --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,27 @@ +on: + push: + branches: + - develop + - main + - feature/lint + pull_request: + types: [opened, synchronize, reopened, closed] + branches: + - develop +jobs: + lint: + if: github.event_name == 'push' || (github.event_name == 'pull_request' && github.event.action != 'closed') + runs-on: ubuntu-latest + name: Run the linter on the dataset + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-python@v2 + with: + python-version: 3.x + - name: Install prereqs + working-directory: lint + run: pip install -r requirements.txt + - name: Run linter + working-directory: lint + run: python lint.py + diff --git a/.github/workflows/spellcheck.yml b/.github/workflows/spellcheck.yml new file mode 100644 index 0000000..00283e2 --- /dev/null +++ b/.github/workflows/spellcheck.yml @@ -0,0 +1,28 @@ +on: + push: + branches: + - develop + - main + - feature/lint + pull_request: + types: [opened, synchronize, reopened, closed] + branches: + - develop +jobs: + lint: + if: github.event_name == 'push' || (github.event_name == 'pull_request' && github.event.action != 'closed') + runs-on: ubuntu-latest + name: Run cspell on the dataset using our saved dictionary of ignore words + steps: + - uses: actions/checkout@v2 + - name: Use Node.js + uses: actions/setup-node@v3 + with: + node-version: 18 + - name: Install cspell + working-directory: lint + run: npm install -g cspell + - name: Run spellcheck + working-directory: lint + run: cspell ../data/**/*.yaml + diff --git a/lint/cspell.json b/lint/cspell.json new file mode 100644 index 0000000..a7ee921 --- /dev/null +++ b/lint/cspell.json @@ -0,0 +1,6 @@ +{ + "dictionaries": ["en_us", "ids"], + "dictionaryDefinitions": [ + {"name": "ids", "path": "./ids.txt"} + ] +} diff --git a/lint/equip.schema.yaml b/lint/equip.schema.yaml new file mode 100644 index 0000000..7ff7844 --- /dev/null +++ b/lint/equip.schema.yaml @@ -0,0 +1,21 @@ +map(include("equip")) +--- +equip: + name: str() + description: str(required=False) + short_name: str(required=False) + haystack: include("haystack") + extends: str(required=False) + is_base: bool(required=False) + contains: list(str(), required=False) + attributes: list(str(), required=False) + points: list(str(), required=False) + points_base: list(str(), required=False) + ifc_class: str(required=False) + ifc_type: str(required=False) + functions: list(str(), required=False) + functions_base: list(str(), required=False) + brick_ontology: str(required=False) + google_ontology: str(required=False) + deprecated: bool(required=False) + kpi: list(str(), required=False) diff --git a/lint/ids.txt b/lint/ids.txt new file mode 100644 index 0000000..88c62d7 --- /dev/null +++ b/lint/ids.txt @@ -0,0 +1,986 @@ +ACFREQ +ACIA +ACIAVG +ACIB +ACIC +ACITTL +ACPF +ACPFA +ACPFAVG +ACPFB +ACPFC +ACSLVL +ACVA +ACVAB +ACVAVG +ACVB +ACVBC +ACVC +ACVCA +ACVLLAVG +ADFBK +ADPSP +AFLWSP +AHMS +AHUDFVCO +AHUDFVCOEC +AHUDFVCOECEFV +AHUDFVCOECPH +AHUDFVCOECPHEFV +AHUWSHP +AHUWSHPDZ +AIRCO +AIRDWP +AIRENTH +AIRHANDLER +airside +AIRSP +AIRTEMP +ALMSP +ALRMPT +ALRMPTCD +ALRMRESET +APPENE +APPPWR +ASNLNDCALL +ATPS +ATSP +ATWHP +Autowalk +AVCM +AVSYS +BAHTST +BANKBR +BATLLST +BATLVL +BATST +BCPSSCMD +BCPSSST +BDWM +BFWP +biotechnical +BLDSPR +BLDSPRSP +blowdown +Blowdown +BREAKRM +BRPR +BRSEL +BSMNT +BSPC +BSWPSSCMD +BSWPSSST +btus +BYPCHWFL +BYPD +BYPDCMD +BYPV +CAFC +CARDIR +CARDIRCMD +CARDRST +CARDRVST +CARLD +CARMD +CARNXTPOS +CARPOS +CCDAT +CDAFLW +CDDAT +CDDATSP +CDDCMD +CDDT +CHBZC +CHWBYPVCMD +CHWBYPVFBK +CHWC +CHWCOIL +CHWDC +CHWDPR +CHWDPRFL +CHWDPRSP +CHWDT +CHWFLWMNSP +CHWHWPL +CHWISOVCMD +CHWISOVFBK +CHWM +CHWP +CHWPL +CHWRT +CHWST +CHWV +CHWVCMD +CHWVFBK +CHWZC +CLASSRM +CLCMD +CLDEM +CLDEV +CLINET +CLREQ +CLSTG +CLSTGCT +CLSTS +CLTHRMPWR +CMLC +CMPFREQ +CMPRFET +CMPRFLT +CMPSPCMD +CMPSPFBK +CMPSSCMD +CMPST +CMST +CNDFFREQ +CNDFSPCMD +CNDRFLT +CNDRFPR +CNDRFSTT +Cnet +CNPST +CNTMDCFG +CNTRL +COGEN +Cogenerator +COMPNET +CONRM +COVCMD +COVFBK +CPULD +crac +CRAC +CRAH +CSTMGEN +CTBYPVCMD +CTFS +CTRLR +CTSEP +CTSFLT +CWBYPVCMD +CWBYPVFBK +CWCOIL +CWDPR +CWDPRSP +CWHXTC +CWISOVCMD +CWISOVFBK +CWLC +CWPL +CWRT +CWST +CWVCMD +CWVFBK +DACO +DADCMD +DADCMDCL +DADCMDOP +DADCTSPR +DADCTSPRSP +DADFBK +DADHRHSP +DADUCT +DADWP +DAFLW +DAFLWSP +DAHUMRHSP +DARH +DARHSP +DASDST +DATACTR +DATAHALL +Datapaths +DATCLSP +DATHTSP +DATSP +daylighting +Daylighting +deadband +Deadband +deaerator +Deaerator +deaerators +DEHW +DEVNET +DEVPT +DEWH +dewpoint +Dewpoint +DFANW +DFCMD +DFDVC +DFFREQ +DFMDSP +DFOVCMD +DFSPCMD +DFSPCMDH +DFSPCMDL +DFSPFBK +DFSS +DFST +DFVDC +DFVSC +DGWH +DHCMD +DHPWH +DHUM +DHWC +DHWDT +DHWHT +DHWM +DHWPL +DHWS +DHWST +DHWTT +DHXWH +DIGSIGN +DIMCMD +DISTCTR +DISTRIBUTIONBOARD +DLTLVLSP +DMPACT +doas +DOAS +DORMRM +DPRCMD +DPRCMDCL +DPRCMDOP +DPRFL +DPRREQ +DRSTS +DSPC +DTSP +ductwork +DVST +DWPR +DWSTS +DWTRTRT +DXCOIL +DXDC +DXZC +EADCMD +EADCTSPR +EADCTSPRSP +EADFBK +EADT +EAFC +EAFLW +EAFLWSP +EARH +ECCMD +ECENCMD +ECHWFL +ECHWFLST +ECHWISOVCMD +ECHWISOVFBK +ECHWT +ECMDSP +ECMODE +ECOALCKESP +ECOALCKTSP +ECWISOVCMD +ECWISOVFBK +ECWT +EDHWT +EDRM +EFANI +EFANP +EFANW +EFCMD +EFFCDAFLWSP +EFFDAFLWSP +EFFHDAFLWSP +EFFIAFLWSP +EFFREQ +EFFZTCLSP +EFFZTDB +EFFZTHTSP +EFFZTSP +EFLTLVLSP +EFSPCMD +EFSPFBK +EFSS +EFST +EFVSC +EHTOCMD +EHWFL +EHWISOVCMD +EHWISOVFBK +EHWT +EHXISOVCMD +EHXISOVFBK +ELDPRFL +elec +Elec +ELEC +ELECRM +ELVCALL +ELVGRP +ELVLND +ELVOOS +ELVST +EMOVC +ENCMD +ENDLC +ENERGYEXP +ENERGYIMP +ENERGYMETER +ENERGYNET +ENERPWR +ENLDSH +Environmment +EPMS +EPRTBAND +EPRTERR +EPRTST +ESCOOS +ESTWNDSPD +EVCLCMD +EVCLSTS +EVPRFET +EVPRFLT +EVPRFPR +EVPRFSTT +EVPRRLT +EWTSP +Façade +FANCMD +FANI +FANP +FANSPCMD +FANSPFBK +FANSPMD +FANSPMDCMD +FANST +FANW +FCUDACO +FCUVRFZC +FCUZC +FCUZCCO +FCUZCCOD +FCUZCHOE +feedwater +Feedwater +FIMS +FINOFF +FIREZONE +FLGST +flowrate +FLTCD +FLTDPR +FLTPT +FLTST +FODT +FOMFL +footcandle +footcandles +FOST +Freezestat +FRZST +FSTFOOD +FSUP +FTNSRM +GASMETER +GHCOIL +GLYCON +guidevane +HAFC +HCDAT +hcho +HDAFLW +HDDAT +HDDATSP +HDDCMD +HEALTHCARERM +HGRC +HLTH +HMCMD +HMLC +HOAST +Horiz +HPLD +HPZC +HRBYPDCMD +HRDAT +HRWC +HRWCMD +HRWSPCMD +HRWST +HTCMD +HTDEM +HTDT +HTEZC +HTGCLGV +HTGRHDB +HTGRHDBSP +HTGRHSP +HTGRHVCMD +HTGZC +HTREQ +HTSTG +HTSTGCT +HTSTS +HTTHRMPWR +HTZC +HUMIDITYSENSOR +hvac +HVAC +HVACMDCMD +HVACMDSP +HVACZONE +HVCPB +HVDP +HVSB +HVSP +HWBISOV +HWBLR +HWBPVCMD +HWBYPVCMD +HWCOIL +HWDC +HWDPR +HWDPRFL +HWDPRSP +HWDT +HWISOVCMD +HWISOVFBK +HWPL +HWRT +HWST +HWVCMD +HWVFBK +HWZC +HXISOVCMD +hydronic +Hydronic +IADCMD +IADCMDCL +IADCMDOP +IADFBK +IAFLW +IAFLWCLMNSP +IAFLWCLMXSP +IAFLWHTMNSP +IAFLWHTMXSP +IAFLWSP +IAQI +IAQZONE +IGVFBK +ILLUM +IPAAS +ISOADCMD +ISOVCMD +ITDEV +JMFLT +kgal +kilobtu +KPICODE +LABROOM +LCHWFL +LCHWFLOWSP +LCHWFLST +LCHWISOVCMD +LCHWISOVFBK +LCHWT +LCHWTSP +LCKRROOM +LCWFL +LCWFLSP +LCWISOVCMD +LCWISOVFBK +LCWT +LCWTSP +LDHWT +LDHWTSP +LDSHLTLVLSP +LHWFL +LHWFLSP +LHWISOVCMD +LHWISOVFBK +LHWT +LHWTSP +LHXISOVCMD +LHXISOVFBK +LIGHTSENSOR +linearvelocity +LKFLT +llows +LNDCALL +LNDDRST +LNIPCNT +LNOPCNT +LNPCS +loadshed +loadshedding +Loadshedding +LOCM +LSCTR +LSTP +LSTT +LTCH +LTCIR +LTCIRCMD +LTCLRT +LTCMD +LTGW +LTGZONE +LTLVL +LTLVLCMD +LTLVLSP +LTOCMODE +LTPC +LTSC +LTST +luminaire +LVCPB +LVDB +LVDP +LVLHFLT +LVLLFLT +LVSB +LWGW +LWISOVC +LWISOVCMD +LWISOVST +LWTC +MACO +MADUCT +MAENTH +MAFLTST +MAFLW +MARH +MATSP +MDAP +MDST +MDVCP +MECHRM +megabtu +MGMTS +MGZVB +MIXUSE +MKCARCALL +MKUPWVCMD +MLTFAM +MNOADSP +MOAFC +Modbus +MOVEMENTSENSOR +MTRG +multispeed +MUWM +MVSB +MXWVCMD +MXWVFBK +NGDPRFL +NGEN +NGFLOW +NGPWR +NGTEMP +NGVCMD +NGVOL +NOTDEFINED +OACLLCKTSP +OACO +OADCMD +OADFBK +OADUCT +OADWP +OAENTH +OAFLTST +OAFLW +OAFLWMNSP +OAFLWSP +OAHTLCKTSP +OALCKTSP +OARH +OATEMP +OATVOC +OAWBTEMP +OCCCDAFLWMNSP +OCCCDAFLWMXSP +OCCCMD +OCCCT +OCCDWTM +OCCEFFSP +OCCHDAFLWMNSP +OCCHDAFLWMXSP +OCCIAFLWCLMNSP +OCCIAFLWCLMXSP +OCCIAFLWHTMNSP +OCCIAFLWHTMXSP +OCCIAFLWMNSP +OCCIAFLWMXSP +OCCPS +OCCS +OCCSCHSP +OCCSNS +OCCST +OCCZCLDB +OCCZDB +OCCZHTDB +OCCZONE +OCCZRHSP +OCCZTCLSP +OCCZTHTSP +OCLTLVLSP +OFCMD +OFFBLD +OLTPC +OMALL +OPDIR +OPRP +OSPCHOSP +OTDEV +OTHOFF +OUTIL +OUTSPD +PARKSP +PARKSYS +PASALM +PCHWP +PCWP +PDSCV +PDZC +PERHYGIENE +PHANG +PHWP +PHWSC +PHWVCMD +PHYSSEC +PKED +PLBG +PLLCWFLOW +PLLCWFLSP +PLPM +PMLD +POECURR +POEETP +POEETS +POEPWR +powerfactor +PRCHWDPR +PRCHWDPRSP +PRECHWT +PRECST +PRECWT +PREHWT +PRHWDPR +PRHWDPRSP +PRKG +PRKLVL +PRKSP +PRKSPACT +PRKSPST +PRLCHWT +PRLCHWTSP +PRLCWT +PRLCWTSP +PRLENCMD +PRLHWT +PRLHWTSP +Profibus +PRREQ +PRTERR +PSPCMD +PSSCMD +PSSST +PTDSP +PTZCAM +PVCM +PVSC +PWRDMD +PWREXP +RACO +RACTSP +RADCMD +RADF +RADFBK +RADFE +RADRHSP +RADUCT +RADVCMD +RADWP +RAENTH +RAFLW +RAFLWSP +RAHRHSP +RAHTSP +RAPWR +RARH +RARHSP +RATSP +REACENE +REACPWR +realestatecore +REFCMD +refrig +Refrig +REGCARCALL +RELHUM +RETAILRM +RETST +REVVCMD +RFALRMH +RFANW +RFCMD +RFDCMD +RFFREQ +RFSPCMD +RFSPFBK +RFSS +RFST +RHSP +RHVCMD +RLAPCT +RLPWR +RLPWRA +RLPWRB +RLPWRC +RNTM +rollup +RTLS +RWFLW +RWST +SAVCO +SAVRH +SBCDAFLWMNSP +SBCDAFLWMXSP +SBCRFET +SBCRFLT +SBHDAFLWMNSP +SBHDAFLWMXSP +SBIAFLWCLMNSP +SBIAFLWCLMXSP +SBIAFLWHTMNSP +SBIAFLWHTMXSP +SBIAFLWMNSP +SBIAFLWMXSP +SBZTCLSP +SBZTHTSP +SCCHWDPR +SCCHWDPRSP +SCCWHXBYPVCMD +SCECHWT +SCECWT +SCEHWT +SCHWDPR +SCHWDPRSP +SCHWFL +SCHWP +SCLCHWT +SCLCHWTSP +SCLCWCTSP +SCLCWHTSP +SCLCWT +SCLCWTSP +SCLENCMD +SCLHWT +SCLHWTSP +SCWP +SDLD +SDNC +SDST +sectionalizer +Sectionalizer +SENIORLV +SEPP +setpoint +Setpoint +setpoints +SEUI +SFSS +SHCTR +SHDIR +SHPOS +SHPOSCMD +SHSC +SHTLTCMD +SHWFL +SHWP +SHZONE +SLLCWFLOW +SLLCWFLSP +SMPP +SPDREF +SPDSP +specificenthalpy +SPRV +SRVROOM +SSCMD +SSST +SSTN +STCNFLOW +STCNMASS +STCNMFLOW +STCNVOL +STDPRFL +STFLOW +STMASS +STMBLR +STMFLOW +stormwater +Stormwater +STRGRM +STRMALL +STRMS +STUDYRM +STVOL +subcooler +Subcooler +submeter +SUPC +SUPERMKT +SURS +Svideo +SWGR +SWISOVM +SWTC +SXWVCMD +SXWVFB +TCGM +TCHWEC +TCHWP +TECHSCI +TEEC +TEEEC +TEMPERATURESENSOR +TENGEC +TEWC +THERMEFF +THRMEN +THRMPWR +THRMSRCEN +THRMSRCPWR +THWEC +THWP +TLPM +TLSD +TNGEC +TPDSP +TRCHWDPR +TRCHWDPRSP +TRCHWFL +TRECHWT +TREHWT +TRHWDPR +TRHWDPRSP +TRHWFL +TRLCHWT +TRLHWT +TSTATFLCK +TSTATLCK +TSTATMDLCK +TSTATTLCK +TSTEC +tvoc +TVOC +TWHP +unitless +unocc +Unocc +unswitched +UOCCDAFLWMNSP +UOCCDAFLWMXSP +UOCCZDB +UOCHDAFLWMNSP +UOCHDAFLWMXSP +UOCIAFLWCLMNSP +UOCIAFLWCLMXSP +UOCIAFLWHTMNSP +UOCIAFLWHTMXSP +UOCIAFLWMNSP +UOCIAFLWMXSP +UOCLTLVLSP +UOCZRHSP +UOCZTCLSP +UOCZTHTSP +URGCLIN +UTILRM +vaporiser +VAVCDAFC +vavco +VAVCO +VAVEH +VAVFPP +VAVFPS +vavho +VAVHO +VAVPD +VAVPDRH +VAVRH +vavv +VAVV +VCMD +VCMDCL +VCMDOP +VFDFREQ +VFDSPCMD +VFDSPREF +VFDSSCMD +VMCDCL +VPOS +VRFOU +VRFOUACHP +VRFOUACHR +VRFOUAIR +VRFOUREF +VRFOUWCHP +VRFOUWCHR +VRFOUWTR +VRFSYS +WASTEWTR +WATERMETER +WCDSP +WDCMD +WDIFFPR +WDIFFPRSP +WDST +WDWSW +WECVCMD +WECVPOS +wetbulb +WFLOW +WFLOWSP +WFLWST +Whatshot +WIFIANT +WIFIAP +WIFIRTR +WLALRMH +WLALRML +WLHUB +WLVLSP +WNDSPD +WSHP +WSTWNDSPD +WTEMPSP +WTLVL +WTRTEMP +WTWHP +WVOL +XFMR +ZALMSP +ZCOALMSP +ZCOSP +ZDHRHSP +ZDPR +ZDWP +ZHUMRHSP +ZOCM +ZOVCMD +ZPCNT +ZPCS +ZRFSP +ZRHAVG +ZRHC +ZRHSP +ZSPC +ZSPR +ZSPRSP +ZTADJSP +ZTAVG +ZTCA +ZTHA +ZTSP +ZTVOC +ZTVOCSP diff --git a/lint/includes.schema.yaml b/lint/includes.schema.yaml new file mode 100644 index 0000000..224aeda --- /dev/null +++ b/lint/includes.schema.yaml @@ -0,0 +1,28 @@ +haystack: + type: list(str(), include("haystack_type_attr")) + type_optional: list(str(), include("haystack_type_attr"), required=False) + identification: list(str(equals="id"), str(equals="dis"), str(equals="navName"), include("identification"), required=False) + reference: list(str(), map(str()), required=False) + reference_optional: list(str(), map(str()), required=False) + measure_reference: list(str(), required=False) + output_reference: list(str(), required=False) + +identification: + id: str(required=False) + dis: str(required=False) + navName: str(required=False) + kind: include("kind", required=False) + dwgId: str(required=False) + unit: str(required=False) + unit_type: enum("mass", "volume", "volumetric_flow", "mass_flow", "electric_potential", "pressure", "temperature", "temperature_differential", required=False) + +haystack_type_attr: + phase: enum("A", "B", "C", "AB", "BC", "CA", required=False) + unit_type: str(required=False) + stage: Integer(required=False) + +google_ontology_full: + kind: include("kind", required=False) + unit: str(required=False) + +kind: enum("Bool", "Number", "Str", "List", required=False) diff --git a/lint/lint.py b/lint/lint.py new file mode 100644 index 0000000..0fcc055 --- /dev/null +++ b/lint/lint.py @@ -0,0 +1,26 @@ + +import os +import glob +import yamale + + +def validate_all(schema, pattern): + with open("includes.schema.yaml") as fp: + includes = fp.read() + with open(schema) as fp: + content = fp.read() + includes + schema = yamale.make_schema(content=content) + + for defs in glob.glob(pattern): + if "/ui/" in defs: + continue + print (defs) + data = yamale.make_data(defs) + yamale.validate(schema, data) + +if __name__ == '__main__': + validate_all("./tags.schema.yaml", "../data/*tags*.yaml") + validate_all("./point.schema.yaml", "../data/*/*point*.yaml") + validate_all("./equip.schema.yaml", "../data/*/equip.*.yaml") + + diff --git a/lint/point.schema.yaml b/lint/point.schema.yaml new file mode 100644 index 0000000..92371b4 --- /dev/null +++ b/lint/point.schema.yaml @@ -0,0 +1,17 @@ +map(include("point")) +--- +point: + name: str() + short_name: str(required=False) + description: str(required=False) + haystack: include("haystack") + is_base: bool(required=False) + extends: str(required=False) + alarms: list(str(), map(str()), required=False) + history: list(str(), required=False) + points: list(str(), required=False) + google_ontology: str(required=False) + google_ontology_full: list(str(), map(list(include("google_ontology_full"))), required=False) + brick_ontology: str(required=False) + deprecated: bool(required=False) + diff --git a/lint/requirements.txt b/lint/requirements.txt new file mode 100644 index 0000000..d28a60c --- /dev/null +++ b/lint/requirements.txt @@ -0,0 +1,2 @@ +PyYAML==6.0 +yamale==4.0.4 diff --git a/lint/tags.schema.yaml b/lint/tags.schema.yaml new file mode 100644 index 0000000..26fc75a --- /dev/null +++ b/lint/tags.schema.yaml @@ -0,0 +1,9 @@ +map(include('tag')) +--- +tag: + description: str() + type: enum("MARKER", "STRING", "NUMBER", "REF", "ENUM", "COORD", required=False) + source: enum("OAP", "HAY", "HAY3", "BIOT", required=False) + subtype: enum("FLOW", "MEASURE", "CONTAIN", required=False) + enum: list(str(), required=False) + fundamental_entity: bool(required=False)