From 6db9956af260c1344223d095c05953122a927b35 Mon Sep 17 00:00:00 2001 From: Richard Kuhnt Date: Sun, 17 Feb 2019 16:28:47 +0100 Subject: [PATCH 1/3] validator/shimexe: Add -Fast Switch to build scripts --- supporting/shimexe/build.ps1 | 7 +++++-- supporting/validator/build.ps1 | 11 ++++++++--- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/supporting/shimexe/build.ps1 b/supporting/shimexe/build.ps1 index 98fe2968fc..0440184b43 100644 --- a/supporting/shimexe/build.ps1 +++ b/supporting/shimexe/build.ps1 @@ -1,8 +1,11 @@ +Param([Switch]$Fast) Push-Location $psscriptroot . "$psscriptroot\..\..\lib\install.ps1" -Write-Host "Install dependencies ..." -Invoke-Expression "$psscriptroot\install.ps1" +if(!$Fast) { + Write-Host "Install dependencies ..." + Invoke-Expression "$psscriptroot\install.ps1" +} $output = "$psscriptroot\bin" Write-Output 'Compiling shim.cs ...' diff --git a/supporting/validator/build.ps1 b/supporting/validator/build.ps1 index d5255f21ea..e14dd88bc1 100644 --- a/supporting/validator/build.ps1 +++ b/supporting/validator/build.ps1 @@ -1,11 +1,16 @@ +Param([Switch]$Fast) Push-Location $psscriptroot . "$psscriptroot\..\..\lib\install.ps1" -Write-Host "Install dependencies ..." -Invoke-Expression "$psscriptroot\install.ps1" +if(!$Fast) { + Write-Host "Install dependencies ..." + Invoke-Expression "$psscriptroot\install.ps1" +} $output = "$psscriptroot\bin" -Get-ChildItem "$psscriptroot\packages\Newtonsoft.*\lib\net45\*.dll" -File | ForEach-Object { Copy-Item $_ $output } +if(!$Fast) { + Get-ChildItem "$psscriptroot\packages\Newtonsoft.*\lib\net45\*.dll" -File | ForEach-Object { Copy-Item $_ $output } +} Write-Output 'Compiling Scoop.Validator.cs ...' & "$psscriptroot\packages\Microsoft.Net.Compilers\tools\csc.exe" /deterministic /platform:anycpu /nologo /optimize /target:library /reference:"$output\Newtonsoft.Json.dll","$output\Newtonsoft.Json.Schema.dll" /out:"$output\Scoop.Validator.dll" Scoop.Validator.cs Write-Output 'Compiling validator.cs ...' From 6c5c81793ff15e43570983b29533ec947b1e593e Mon Sep 17 00:00:00 2001 From: Richard Kuhnt Date: Sun, 17 Feb 2019 16:29:47 +0100 Subject: [PATCH 2/3] schema.json: Switch to JSON Schema Draft-07 --- schema.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/schema.json b/schema.json index a195d1b16e..8d3b0ee735 100644 --- a/schema.json +++ b/schema.json @@ -1,6 +1,6 @@ { "$id": "http://scoop.sh/draft/schema#", - "$schema": "http://json-schema.org/draft-04/schema#", + "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "definitions": { "hashPattern": { From 72d71ead953c5cd0626d266168f97f1550265d28 Mon Sep 17 00:00:00 2001 From: Richard Kuhnt Date: Sun, 17 Feb 2019 16:31:58 +0100 Subject: [PATCH 3/3] validator: Improve error reporting, add support for multiple files - Display clickable links to directly jump to error line - Display invalid JSON path - Dynamic error nesting - Support for validation multiple files e.g. `validator.exe .\schema.json .\bucket\*.json` or `validator.exe .\schema.json .\manifest1.json .\manifest2.json` --- supporting/validator/Scoop.Validator.cs | 44 +++++++++++---- supporting/validator/bin/Scoop.Validator.dll | Bin 7168 -> 7680 bytes supporting/validator/bin/checksum.sha256 | 4 +- supporting/validator/bin/checksum.sha512 | 4 +- supporting/validator/bin/validator.exe | Bin 4608 -> 5632 bytes supporting/validator/validator.cs | 54 ++++++++++++++----- test/Scoop-Manifest.Tests.ps1 | 5 +- 7 files changed, 84 insertions(+), 27 deletions(-) diff --git a/supporting/validator/Scoop.Validator.cs b/supporting/validator/Scoop.Validator.cs index b092dec348..e233dfcdfc 100644 --- a/supporting/validator/Scoop.Validator.cs +++ b/supporting/validator/Scoop.Validator.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.IO; +using System.Text; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Newtonsoft.Json.Schema; @@ -118,19 +119,44 @@ public bool Validate() this.Manifest.IsValid(this.Schema, out validationErrors); - if (validationErrors.Count > 0) + if (validationErrors.Count == 0) { - foreach (ValidationError error in validationErrors) - { - this.Errors.Add(String.Format("{0}{1}: {2}", (this.CI ? " [*] " : ""), this.ManifestFile.Name, error.Message)); - foreach (ValidationError childError in error.ChildErrors) - { - this.Errors.Add(String.Format((this.CI ? " [^] {0}{1}" : "{0}^ {1}"), new String(' ', this.ManifestFile.Name.Length + 2), childError.Message)); - } - } + return true; } + traverseErrors(validationErrors, this.CI ? 3 : 1); return (this.Errors.Count == 0); } + + public void traverseErrors(IList errors, int level = 1) { + if(errors == null) { + return; + } + foreach (ValidationError error in errors) + { + StringBuilder sb = new StringBuilder(); + sb.Insert(sb.Length, " ", level * 2); + sb.Insert(sb.Length, this.CI ? "[*] " : "- "); + sb.AppendFormat("Error: {0}\n", error.Message); + + sb.Insert(sb.Length, " ", level * 2); + sb.Insert(sb.Length, this.CI ? " [^] " : " "); + sb.AppendFormat("Line: {0}:{1}:{2}\n", this.ManifestFile.FullName, error.LineNumber, error.LinePosition); + + sb.Insert(sb.Length, " ", level * 2); + sb.Insert(sb.Length, this.CI ? " [^] " : " "); + sb.AppendFormat("Path: {0}/{1}", error.SchemaId, error.ErrorType); + + if(!this.CI) { + sb.Insert(sb.Length, "\n"); + } + + this.Errors.Add(sb.ToString()); + + if(error.ChildErrors != null || error.ChildErrors.Count > 0) { + traverseErrors(error.ChildErrors, level + 1); + } + } + } } } diff --git a/supporting/validator/bin/Scoop.Validator.dll b/supporting/validator/bin/Scoop.Validator.dll index d4e13403fc5145cd16a7aa6b3b4322629ab7c5eb..8cdb9b13a64463d65f7098d4609dc23e0b368fad 100644 GIT binary patch delta 2844 zcmb7GeQZ_b9e&>Pbx%)kPj62@Xz4|6TcD*M*h0quVWXACw&Ex&MUXKm?N#q~>1l6U zLv?s5E(VM<#lwtqS=8AuW^{?x;U60tote6XnYg(uX3XKTIEfNBGqcH{?s?yH%jzHd zV{h|5@9*RJ{ob$Nd2bJ|JG^n~X!WT_i#|ZET|jjrUo-<{G+3eW;nw5N>~uG_0^6iv zGjLWrUR5032SlkS=!geZT4S(V)H)|hq=~&Ocu+Km^5C?n74hJ0QC%@iqHLY)8ch6c z8PHq^h+uok=VyAf7lo(@OyhF4Nn2E}Sz4XRB{b=a8bn21IYq6GWXrDvoU%Dl&nzM? z^KHVqag-ELRq`>c(>Ot8vx)m@F@PeyN!05;$&Ryb4{esegmV7qb;PJ``%5`y&H%$k z`E7n8OKnBYnp;F9GfQuSnR%6iU!@3{Hz-H^YASxsf{_0vT421E=VF-W!v%S+Qr7CY ze#^kPnO?E`-aEoKK=A<$7-}Jzlr+!dbIHd zcs0mpKfr4^$nMA+WNYv3ZWr+tX@9>YvvE#w>yq#1gDQ&>8@S4ICT8~kP`$@6zxZbW?m{9h7vt4&^ z4+dy|QQr+0j`2k6)XxBX~V;%>)G`W;!<7qDa2clgb1llEV{~}9> zVM;%zmr7M>D~xmc67}T@+$5F>fp<_#{22Ab0tv2y zIjvlaQR@%2@@`|3&@ggMyHOa(9#QI~eKXR$p9gc=mvOU*APA}U5%dTf-_7~Hg+6N2 zIp2)fBl7TU&i4zkkJ^uOz8lOtgo86VU#IzXYOmyc=NXre*Rwh2B?ji>_c`ZjV?;#p zr<`xrn4tDv&Ns&$7T`+g!(%ui3eY1f43p?Hj|vylN_&9&jqz$;zNS4aVz?M;du^|n^PG_RzffifV+Gz&vP2D4 zS(d}R<9#C*(@>}9q1zBBB3h^*I%rYyN@5HWOK}XHS{%pGqbKkb)|2r=95mOW4PVnX z;dw0AZX`1ho!CxGFBvjhm&y=T@+>|w(#ZY_U(km6MgEmlJBt<`ZV7&edzo4{ClOcF zx9}FGunhI)NqQwVVx#dhwBkDRbsoD+J&7{?B(c@}t-?QGL`^@5tHz%xU!r#eeTs9{ zxJdame1wrKc4+@(z*XZ4*Z47~AHg}p5JC)?Y2=ChngyGCSSk{zAyz3|#i#9Mv5HrA zj#!EJ#b#x1Q`oO?QsI*dpHg^M;jF?73g1CiCWVlgP`Fv)K81%BKB@4m!V3zaNq#-H z;&wd4TNKcVK%F+tTiuCM#P8u*;w$2L;%(+>;@_407vm?CHGP_&BIAN>`L|}rd7V$- zCAl+#IzDvH`iL37*Mi&@8?^Ym{yd}#)hwt;&gQkjUPy6`uC@U z!f2h@H8i$nb+9%%6}>Y#c6;x@UC9IeU4t{fjNTxEJhwwxJ2DwRvtwd7*y?`U+~M<= zBKV_QpVya3A)UNCnGUSNxm@TrbeV9#1 zK;-Q~J@!(JAqPf6SGj4E+fHjC6ds+Hrutktb`^7HMns*VR&tF zCX&1fLeU|`q)DZbtF&Lb=PNraS}z>4o1feE?h7Y>bjc9hc;FO|=Q{~agp0C+Y;jNU rW^vpd%>4^W4(@9W=86|u!mOHPRyx9qa6O|{MxE&fm(Z;t#2--pKv delta 2158 zcmZ`)Yiv|S7(Fxh?%nOS-EMEY+X7ppN`ad2`T;AnMk2*+ zA%Nfm%0-MJ8X!akA5<$Pkf0z5icu6p1c|leczco zk2~8urg_x%mvYwy+twrAx{(`B6vKgZ5>||yP}+KMuCJ#An5l>g;Dl_=NlRJ;B+)<5 zK*-6F#m+oY;H|Vth54jATg4C&bUH+V=qw7pt> zD#R7XW%l+Dj=RJZD>4A^CXYHoJ0TLHon|__%vaj1Lsap2h@uGQbM%ML#v7zwj5v$i2eX<0GxTqUT*U6DNC zG4IfWok^*#VmHM(1@F%ZiuR5kckkZ4PH#f7l@Oz2Lq-NM7Q8EpIMFhv$kjhxVy<|q zO{lfwIzXH`BfQQ{t8i>1UoP)Opqsr%*)@%;m#~`rjEwpKDl7Aa1C^8klz{oHx)N6j1nPEh|XhaB>DW(<0 zPKMPxk5NED_4DHiW4jUP^S-5*rB9$hnYc^-EQAoa0+ZMa4{?b|A_j%BX9&Nj4lBJ) z9w954UmN#)(oe5G=4IY8q8UPBRiB$BOsv;li)S*LxCL9|-ZTsnZaA?_PZNrS2fO33 z&3KsJ{&;MU7%39)K|FRyjHY)u9{b#^5MCUQ$G$NqN9mr92hXrD5ohDUODs&pg?Oya zoXX?Z6^|`5Yv^5z$9~}qlW`{&!w$?B$*AV%0JPvI^BLj8e(i1IeEr;rQ+?ht5%uGG z%tftSDR|WQ?Qq%XH6e`_ms*{8+z{&Ey+VA@Ht;bw?|x1!^Z!sO#A*dT(>5`xPP3M{ z!DYI|^P5Vv(2wXviM9t5{ZJU-jK;|jwqTGE#+w+yjJ>#HK7#R>Eyv;j2FQubY!;Q6 zMWzPjTA@lSBx(C7HkeH~i89&DD>M2&2Rn)aE@3*pz{`|=&1^+Tr=G)U>_I*bn;ksS zzZxvU0rMR5|KR|u^f0T?VE)Le+p>dr%jnVyzu_`|=P=hXMOsu=3Ss2ol*rLI42jqw zh9NDA-RuV7n5fW!@fzzjwrJd=aj(V`8c%BM)_7SXgpv+xtkAefW3$FR8c%5K)(ENc zi!cr43%LOThS~-UlnvaMYCKPT18a%xqM6ufZd9o4CUYz8%d)}QkW^Q@k(+P`$M7}G zW(xeLeaUU*ozvHD;%#k{?rXPs_o&9}u&>?5GQ*jXT<*M@ysdq(Z?rIG)UR;rQl>f` zDULJS|B$oZU*H_`Z*~@>{*btIapS_tYnC@OHo$q(E@|IpTVi7BS`5cJEI=4*c|_Ln zP7Tvmzo*I8Xjc{yAa8zMWkcyUOdG;`D-GmGD_^Y3JA_oQOT$g7o?9 z>CW=>?C3n<3%T6^d#JF>?UA-8V2@Q+`Td^fQ<}V_e6E1Km>3o!jn|3k^MyhoD`3xK zwhxB1SJ*lJm<-v)WLfE$!f6XmYxiaL Q8gf!;dur$}(K_7yFB8~mb^rhX diff --git a/supporting/validator/bin/checksum.sha256 b/supporting/validator/bin/checksum.sha256 index 1247d597b3..7bad4aab3e 100644 --- a/supporting/validator/bin/checksum.sha256 +++ b/supporting/validator/bin/checksum.sha256 @@ -1,4 +1,4 @@ f58c374ffcaae4e36d740d90fbf7fe70d0abb7328cd9af3a0a7b70803e994ba4 *Newtonsoft.Json.dll 4ca0681df3755205cfd178aaa38f7fd6818c183c4d14c77cd77f8d777282a650 *Newtonsoft.Json.Schema.dll -e077a05608126d44938158da04fe2062513afedba666648ed185d3e25b50436e *Scoop.Validator.dll -cc82c9659716b564a69690a8b67e5472ea1e8e060b974306314acdd42767bf6d *validator.exe +55f1292b42fa2e8a7a4b3eb360fcfffe97be0fe043b4709979fcd37b8a400456 *Scoop.Validator.dll +6dfbe59d9f1c17d362bdd4509975ab40d96e09585aa8d0a1f5527dafbc1c3727 *validator.exe diff --git a/supporting/validator/bin/checksum.sha512 b/supporting/validator/bin/checksum.sha512 index c2ee0cd94c..8badefa03a 100644 --- a/supporting/validator/bin/checksum.sha512 +++ b/supporting/validator/bin/checksum.sha512 @@ -1,4 +1,4 @@ 7cbbbef742f56af80f1012d7da86fe5375ac05813045756fb45d0691c36ef13c069361457500ba4200157d5ee7922fd118bf4c0635e5192e3f8c6183fd580944 *Newtonsoft.Json.dll 2d9c630948c21b325af7b7ad3de9219a3fdcc23fa65270a0cdb78ea9609038434f6b741a968e9758f93782a3bab57efc3072429bdf84f8ad25a94bf5a8c4bc48 *Newtonsoft.Json.Schema.dll -15b0aa8b29f4e7d74ae3ff36ce7d72f6243a9b7f35890df3e549340c27edf37a73a9d16132254baf661a9aadc6fd5870d3b04452b78df79e3ccf9bee1c9bd788 *Scoop.Validator.dll -384d22bfb21b2767de862f95945dca91aefb4b5eca687d20e410dc64059c5402a13c085517cb807635ff07397fee9bda31b0fdc0090c24cb424f62b285ea0477 *validator.exe +6d89196ce01823093f5c3da98d34d41bc1733316d04e181d6f24982a373cc28487b8e4e74b54f5a665a550ad4a7fa6d7208d99de947b82b20e524747bdb41bdd *Scoop.Validator.dll +e9b2162b3e109291c61005a9088d9ebf30fb0307fa285ccf5c54aef05fb3c02944d9513f2557e75d670682b0f3ba67a4f8df3561c715eaa5daa077b591fb4d54 *validator.exe diff --git a/supporting/validator/bin/validator.exe b/supporting/validator/bin/validator.exe index 7f95ce9e088af7916d6085099dc548eedc5637dd..d63d78687a3644353f016ff13625f17ae85f110b 100644 GIT binary patch delta 2413 zcmb7GTWlQF8UD`k&g^)0Gx6+Z?SwdC>?F#@YdeOhQUbVXVjRcFAs6E`At16bQ?qDy zk25C2wB-SWgt+uOvo<6Z z5A9i<|NQ^=-_JR7v`1GS?Y{5M&WT6I{*JkE7M)0mJ|IoNYJeXVW}n{eJXip>Yv4z~ z2Z`B^YZeq+M;)>|+ACJupQLEwai*iYML{^xD`K@+6rB;B-f0@@v6WN8zzdzg zY32}=InC%@tFOMa&(K;8xB0pV57|m|$ zl6g87(pH{v3Ja`O#hUEk9vWDA_GM=iZX&psqFO+y$DuSkC)Mrly~sO+-9(;Q>{<&+ z-X&R;&yZ$K*Nj7{td^3l=_d1wv`w7z%+jnC{FcF7OXW1$O462X{;-$oX0z6&oeWDY z)~mh#bGGilxw)Dy1ImX_gb^NHF#TxN#&Okh{LS^Gp&Qw;=jvj)H0IeEJIufwDl$91`0;-JYDk3X;kPBPR8!_INgQj|C4_!i*KZi8%r0`ZaVHN zJ`wVlGD*)r&JgZSQuHW(z{WLv#aCZ{^9?mNHTM37D%m63x>~#3=B`a6Y>(qM&VEka zEq6rUO~K>E@3^nrKD@(K-&s90ewNcF_R$6Sa+&XlzLfcTnHDR42E51htma3!&h^Cma?aHo6G8eHs+wa7|KbjnHAv+u?{?Ont&%A z7eak3cW`ZL@OAJy$Dm%d0Wc)A6HgM&0@B2qn0|(TiiPlKVj`5&!bAaMu<@!mLH?M~ z$TA`(4#(QD7#do5#K=KDBHeh{E54!4|RTgh!H-O zyZCW&T&#F6wz(K^swpGcli}H?QaUP zMFo{&i0ub%Ww)&O+b-e;2d096`5L^MBFB)r&Rt4{I#sF05T$^08{=K;&%_pUZdaEA z235f!sL7iK4^9=!rSK59I(fJaeK-Ob0~qFG9U{OKeBfa8FSDzD6>1pg$@{4AuKW-l zu8O%Tuk25V))2<%zVF3*d3SnoqyChdy7&-mHck4E#qeS8ycj7F1Nm*E&5)ec`LCf2xc+6f6q(wjb($Kb0(78F@h!sF+j)EKKJv{N`N z%1RAR$U+P~q@6C3!%F~7D0c+%>V}D`DkFPxGw)|Vn_9g!V DW&)() delta 1186 zcmY*ZUuauZ82^1YX>xPZ+%##Ew5%OBt!rb_)OHg$6v1tVuDIHky2)hHrX{8+X>NCO zE31E&;=>qy7=}9(>ll0RNrxZ>^+9B)ZwkKpFvf)Wum=@@7&FyUpU`6zu)gW z-}%0CF4-F0dhFc`gXf$(ck$3}VGvOn2Xqo@(7qmSe|*xc4+Ap_J_pz^&jkUaAZa5VrO^9CrxQ^u6BwDimfi_9d9=}~YndH8%vCfz z+T&CiLL$djj2z>QLQ%I3&UTb8R)|Jy_F(u~B6bW#7{y<28j;aZ#5O712p6?XKAmTU zU8?FOWH!P5z+NpE_pSwVtxGI!=o}dhxUJUnu2XANn=0sb0Qi#g(203mX8p{8p~(|d z&vU*;{E@;(>h=<6WlSNHDNSdkzeRDN6GPk3gJ*snxZ$9+4^lxZ~d^uM?kO zRYLgQ_wVCniDR4bA$%oKF)$<%1Fuwvz8LxLsII*_k47|caB?CVS*1Nf;kZ+=tJnEH<>Bkh_;%7HOW`zDC zA7Kvb*zfZP$$Tcy@=H4^FQ5nC$}6bhM_IrboM)krAMw+TAqt0;cjHa^J=kGwCA@^- z7SH~l71;%E{*f)?5I^Rz0lzt)ohmgp)+$bUsa{!}z`w|~9fgk9n(pF+cRhT_8`JY% zT|c{bw(PE8*0HNjc@6WMO}Da!>2j@s`DNQ)_nwZt9Vk0h?}v!Be`aa5vh1Q-aTktm zI8LSEV%mPa@?zzz3wwQ`bY`PmueqB*xQJ!;DX)6(82M+K1S_au4P|z>iY9C{VEMSg zu-B+H;r>U%^eM(}BI~uIrIu=I=C`~1{yx?_d3o2k_e`NsF#O#2knPw2erKO3fF;-L9RFateVGF5bk!mVAA*Qa-fOLb9yMq>=fr&N!i#JZ6 z?0fQ-cQ{t^F2uT$mmdBDsCqtCYpb12YgdQ8Z(_%Ht)5ZYHO>1S+V!V)6Ft96dp!IP D{BgYc diff --git a/supporting/validator/validator.cs b/supporting/validator/validator.cs index 287d8f6d6c..4b0c735ce5 100644 --- a/supporting/validator/validator.cs +++ b/supporting/validator/validator.cs @@ -1,5 +1,8 @@ using System; +using System.Collections; +using System.Collections.Generic; using System.IO; +using System.Linq; namespace Scoop { @@ -7,27 +10,54 @@ public class Program { public static int Main(string[] args) { - bool ci = (args.Length == 3 && args[2] == "-ci"); - bool valid = false; + bool ci = String.Format("{0}", Environment.GetEnvironmentVariable("CI")).ToLower() == "true"; + bool valid = true; if (args.Length < 2) { - Console.WriteLine("Usage: validator.exe schema.json manifest.json"); + Console.WriteLine("Usage: validator.exe [...]"); return 1; } - Scoop.Validator validator = new Scoop.Validator(args[0], ci); - valid = validator.Validate(args[1]); - if (valid) - { - Console.WriteLine("Yay! {0} validates against the schema!", Path.GetFileName(args[1])); + IList manifests = args.ToList(); + String schema = manifests.First(); + manifests.RemoveAt(0); + String combinedArgs = String.Join("", manifests); + if(combinedArgs.Contains("*") || combinedArgs.Contains("?")) { + try { + var path = new Uri(Path.Combine(Directory.GetCurrentDirectory(), combinedArgs)).LocalPath; + var drive = Path.GetPathRoot(path); + var pattern = path.Replace(drive, ""); + manifests = Directory.GetFiles(drive, pattern).ToList(); + } catch (System.ArgumentException ex) { + Console.WriteLine("Invalid path provided! ({0})", ex.Message); + return 1; + } } - else - { - foreach (var error in validator.Errors) + + Scoop.Validator validator = new Scoop.Validator(schema, ci); + foreach(var manifest in manifests) { + if (validator.Validate(manifest)) + { + if(ci) { + Console.WriteLine(" [+] {0} validates against the schema!", Path.GetFileName(manifest)); + } else { + Console.WriteLine("- {0} validates against the schema!", Path.GetFileName(manifest)); + } + } + else { - Console.WriteLine(error); + if(ci) { + Console.WriteLine(" [-] {0} has {1} Error{2}!", Path.GetFileName(manifest), validator.Errors.Count, validator.Errors.Count > 1 ? "s" : ""); + } else { + Console.WriteLine("- {0} has {1} Error{2}!", Path.GetFileName(manifest), validator.Errors.Count, validator.Errors.Count > 1 ? "s" : ""); + } + valid = false; + foreach (var error in validator.Errors) + { + Console.WriteLine(error); + } } } diff --git a/test/Scoop-Manifest.Tests.ps1 b/test/Scoop-Manifest.Tests.ps1 index 7a4b4d8d26..7ff2750959 100644 --- a/test/Scoop-Manifest.Tests.ps1 +++ b/test/Scoop-Manifest.Tests.ps1 @@ -39,8 +39,8 @@ describe -Tag 'Manifests' "manifest-validation" { $validator = new-object Scoop.Validator($schema, $true) $validator.Validate("$working_dir/invalid_wget.json") | should -BeFalse $validator.Errors.Count | should -be 16 - $validator.Errors | select-object -First 1 | should -match "invalid_wget.*randomproperty.*properties\.$" - $validator.Errors | select-object -Last 1 | should -match "invalid_wget.*version\.$" + $validator.Errors | select-object -First 1 | should -match "Property 'randomproperty' has not been defined and the schema does not allow additional properties\." + $validator.Errors | select-object -Last 1 | should -match "Required properties are missing from object: version\." } } @@ -73,6 +73,7 @@ describe -Tag 'Manifests' "manifest-validation" { $validator.Validate($file.fullname) if ($validator.Errors.Count -gt 0) { + write-host -f red " [-] $_ has $($validator.Errors.Count) Error$(If($validator.Errors.Count -gt 1) { 's' })!" write-host -f yellow $validator.ErrorsAsString } $validator.Errors.Count | should -be 0