From 5f069d5951476697aa8e4bdcac0e996252c27cab Mon Sep 17 00:00:00 2001 From: Matthias Buchetics Date: Fri, 20 Sep 2019 14:37:52 +0200 Subject: [PATCH 1/4] added SwiftPackage entity and tests --- .../Entity/SwiftPackage.swift | 49 +++++++++++++++++ .../Entity/SwiftPackageManagerTests.swift | 53 +++++++++++++++++++ 2 files changed, 102 insertions(+) create mode 100644 Sources/LicensePlistCore/Entity/SwiftPackage.swift create mode 100644 Tests/LicensePlistTests/Entity/SwiftPackageManagerTests.swift diff --git a/Sources/LicensePlistCore/Entity/SwiftPackage.swift b/Sources/LicensePlistCore/Entity/SwiftPackage.swift new file mode 100644 index 00000000..daca5f9d --- /dev/null +++ b/Sources/LicensePlistCore/Entity/SwiftPackage.swift @@ -0,0 +1,49 @@ +// +// SwiftPackage.swift +// LicensePlistCore +// +// Created by Matthias Buchetics on 20.09.19. +// + +import Foundation + +public struct SwiftPackage: Decodable { + struct State: Decodable { + let branch: String? + let revision: String? + let version: String + } + + let package: String + let repositoryURL: String + let state: State +} + +public struct ResolvedPackages: Decodable { + struct Pins: Decodable { + let pins: [SwiftPackage] + } + + let object: Pins + let version: Int +} + +extension SwiftPackage { + + func toGitHub(renames: [String: String]) -> GitHub? { + let urlParts = repositoryURL + .replacingOccurrences(of: "https://", with: "") + .replacingOccurrences(of: "http://", with: "") + .components(separatedBy: "/") + + guard urlParts.count >= 3 else { return nil } + + let name = urlParts.last?.components(separatedBy: ".").first ?? "" + let owner = urlParts[urlParts.count - 2] + + return GitHub(name: name, + nameSpecified: renames[name], + owner: owner, + version: state.version) + } +} diff --git a/Tests/LicensePlistTests/Entity/SwiftPackageManagerTests.swift b/Tests/LicensePlistTests/Entity/SwiftPackageManagerTests.swift new file mode 100644 index 00000000..a7828215 --- /dev/null +++ b/Tests/LicensePlistTests/Entity/SwiftPackageManagerTests.swift @@ -0,0 +1,53 @@ +// +// SwiftPackageManagerTests.swift +// APIKit +// +// Created by Matthias Buchetics on 20.09.19. +// + +import Foundation +import XCTest +@testable import LicensePlistCore + +class SwiftPackageManagerTests: XCTestCase { + + func testDecoding() { + let jsonString = """ + { + "package": "APIKit", + "repositoryURL": "https://github.com/ishkawa/APIKit.git", + "state": { + "branch": null, + "revision": "86d51ecee0bc0ebdb53fb69b11a24169a69097ba", + "version": "4.1.0" + } + } + """ + + let data = jsonString.data(using: .utf8)! + let package = try! JSONDecoder().decode(SwiftPackage.self, from: data) + + XCTAssertEqual(package.package, "APIKit") + XCTAssertEqual(package.repositoryURL, "https://github.com/ishkawa/APIKit.git") + XCTAssertEqual(package.state.revision, "86d51ecee0bc0ebdb53fb69b11a24169a69097ba") + XCTAssertEqual(package.state.version, "4.1.0") + } + + func testConvertToGithub() { + let package = SwiftPackage(package: "Commander", repositoryURL: "https://github.com/kylef/Commander.git", state: SwiftPackage.State(branch: nil, revision: "e5b50ad7b2e91eeb828393e89b03577b16be7db9", version: "0.8.0")) + let result = package.toGitHub(renames: [:]) + XCTAssertEqual(result, GitHub(name: "Commander", nameSpecified: nil, owner: "kylef", version: "0.8.0")) + } + + func testRename() { + let package = SwiftPackage(package: "Commander", repositoryURL: "https://github.com/kylef/Commander.git", state: SwiftPackage.State(branch: nil, revision: "e5b50ad7b2e91eeb828393e89b03577b16be7db9", version: "0.8.0")) + let result = package.toGitHub(renames: ["Commander": "RenamedCommander"]) + XCTAssertEqual(result, GitHub(name: "Commander", nameSpecified: "RenamedCommander", owner: "kylef", version: "0.8.0")) + } + + func testInvalidURL() { + let package = SwiftPackage(package: "Google", repositoryURL: "http://www.google.com", state: SwiftPackage.State(branch: nil, revision: "", version: "0.0.0")) + let result = package.toGitHub(renames: [:]) + XCTAssertNil(result) + } +} From f8c324474959dd35d633f922f917c2c4ab4cdf27 Mon Sep 17 00:00:00 2001 From: Matthias Buchetics Date: Fri, 20 Sep 2019 14:57:37 +0200 Subject: [PATCH 2/4] Package.swift parsing, conversion to GitHub entity --- .../contents.xcworkspacedata | 7 +++ .../UserInterfaceState.xcuserstate | Bin 0 -> 35637 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 6 +++ .../xcschemes/xcschememanagement.plist | 42 ++++++++++++++++++ Sources/LicensePlist/main.swift | 4 +- Sources/LicensePlistCore/Consts.swift | 1 + Sources/LicensePlistCore/Entity/GitHub.swift | 2 + Sources/LicensePlistCore/Entity/Options.swift | 4 ++ .../LicensePlistCore/Entity/PlistInfo.swift | 9 ++++ .../Entity/SwiftPackage.swift | 11 ++++- Sources/LicensePlistCore/LicensePlist.swift | 11 +++++ .../Entity/PlistInfoTests.swift | 1 + .../Entity/SwiftPackageManagerTests.swift | 6 +++ 13 files changed, 102 insertions(+), 2 deletions(-) create mode 100644 .swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata create mode 100644 .swiftpm/xcode/package.xcworkspace/xcuserdata/matthias.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 .swiftpm/xcode/package.xcworkspace/xcuserdata/matthias.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist create mode 100644 .swiftpm/xcode/xcuserdata/matthias.xcuserdatad/xcschemes/xcschememanagement.plist diff --git a/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata b/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..919434a6 --- /dev/null +++ b/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/.swiftpm/xcode/package.xcworkspace/xcuserdata/matthias.xcuserdatad/UserInterfaceState.xcuserstate b/.swiftpm/xcode/package.xcworkspace/xcuserdata/matthias.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..008e36d7991715a404448e56073098c32e6a6798 GIT binary patch literal 35637 zcmeFacYIXE*FS#e_6;eUkX|>Hv`w<U z&aG%N87If52Pc#sXL=!QZXeJ&fCK8i~$;1@m31TWSi+F~3mUxbsOUx%05KD-q#4=(9 zv5)wOI7A#FJ|#{NCy6hJ)5O=rS>jvb0&$tRLi|8nCvFly6TcF_5q}VWA`(%ELp-ua z4#*j~Aa~?})F=kUqBx{M@hAZ$q9l}z(orVrgR;;7G!P9!d1x3Kj_OeZYD7(FG%_O# zvZ7`*28~A|nu2DanP?W8hvuX8Xam}aHlbJ1Yv^_K2HK3?MBC6#v;FDoSaBbBBzm0kx!G;$>+$q zcDh%861^VN^FNoQj|#sVFL%Qd2QhER{f|QyEluDx1oo`ciq+ zV9G#MQPorpWu$7UI?6=VQw@}vYN5tcQ>Z7Xsnjg$8EOT!l3GQrrq)nvsddyV)Ou;^rsN2-9)NeGRNt&X& z(Drl?9ZZMNp>!DCjSij-`|7o^&s|H{GAkrL}Z9t)nYwJzYr~=qkFJuAxn| zg|^bo^hA0RJ(+%rewtoFFQu2!%js5n1-+79MX#pU(Cg_p=y-_YmjZ|O_)b@~SVBmEowJAH?t7@DzTx-j-k5EIOVFriEs(~SvdBA7@f ziiu{_Obipt#4#EsgXzxnV0tornIX(jCZ8!_3Yj8i7*o#Zmw1#_DDlKF}`!+g!0 zWzI9VnO~XTnBSQ@%w6UW=1=Ax>%cm)POOr3W?k42Hk1uxyRqSH1RKdlvC(Wio4{tU z-Ps;&Kej)c%Ra{DvjuDkTgq0k)ocxGW-Y9h9nT8vG6s{gC~b{ggeye$IZuo@T#hudzR{*V$j#JM3M~lk?)dIUmlK^W*%v z08YgPazR`$7s5qyaa=N&!u8;Ka=o|`u9O?am2q0GoYQd?oSv)X3|tjwRBi@0lY5Sv%e~08ax1u%+$wH0_Zs&)_YSv%dzU-SeaU^ro#DRb&T{9t zZ@BZ^x7-EpBKIA4iTi=O$^F6o$=%}>ydB?#x963-EAPn%@xi>BPv8^zRK7dkgU{sq z@O}Ay`~ZF+KZGC37xBaR;e0i3;+uFYKZ&2r3%tlb$xr8B;+OJk`1Sk-{x$w}eha^q z-_F0o@8oy!d-?tR0sd?LEPsywhCk1L%U|Fx^55~7_^bR){tkavK`R&qtFTizD!dgw z3SWhv!e0@oh*Cr=)QT8|Mv6eEg48k$X}V}ydRBf1dwgcIR1Jg*?8 z&d_2hhQDq6dRU0wq_bFB2?xSaAO)(GP!i4pEuwb?wN~kxo1HVf(OhR~(&-J^jr!(# zLxWYT3`y#fn3|ZFoTH9Q&5BbeX2xZz)3V}I)d{JInK?EXo05G7c@4T^@c3Sq*bc_i_9JAZPfH8 z`Vf)JiA#x~c-_GvbnDr1M3foza;pb!|( z(D=C6%qEbJ^b-9RxdN?5qwO~+M%UC7o7LEWv4fM_Xcz(=Qq^d#x5N(8=?52#h-qpI z=#<7rd0$%#Ep1J%G3Y7{=KtT?+eU?@vaUzHPTy!5r-_TvB(;TFb>?b=wa2*BWNmVy z8d`6HLB^?YqPQ??W1~r5qcb*GdgvSLaqpN6F_qSs_V5^KblRrxQDP90M+_#06w55C z0fu^n{AjQgXocvZBk~FcOR}d8ngzrt%y0^cB4QXZoESljB#Ma=qEzq@JOwYo zTksKl1wX-G2v|py5nAb|g3uF{@KhzJgfQu+n-DIn5Cx$wE-?LTq0arX|WPBzK?~*%0R`uw}Y={HJS~v zISp1=F=Gce;ZC>2NF2QLs_}_baf()1^1oa$uwaYzAr&5%DooQV4gbp(wzX7RQt*QR zU|TOb^y~MyjueR%!g7)mI4e(fvazhy1mrQs{%#pO>odrB!Zz zMD@1iu49q>e_5zy2oBNd>wvpjVnN!|*EKdn13;*&*8!t2x1+QpB-30iiMJpM>di(8 zqz^XalGKn)t+MeE4f%hZ9MXJhBYcpq0mwH$NW?XXh%BwL=zot0keQ4P4_5V)R8@{v zS@FMDRcB_<&uH!6T=8JNx21af{g3hbpO}zbZySqxu==}F^|@MQ)&H#7|6#hwwLg5W zASBg2K&!O;pVa*jggt@~Rw883|5YadSFSQvKcem~Qr&~KO5Ojg6COGKomZs?#vLi8 zYKLl-WB+H>{#WB}L!BPPH`oL=njg^zZW1vCT4l}ujF?CEK^xQVj09U(NQVW;69s_; zjl7UI@tf02xxSyv^|CX=GUC|{Cy(NK_gs~?@omVN}PzyKMEictwF zMWav|(xP&t6O2NwP$!s#dZ9sR6qyW-3AT<&|>I8E;K$<0hjQbZL{~RD=F+j!% z78^h&V1PW1BJfABLciiqsM6jxWKW=JGA^D3T#Ug({50TV?1Q*K`)paBL33nO%m!4z z9_dk8Z0Q%EWf&DNpcm0gXdzmJ7NeKZ60}s9AUrNi6ebCi1wjynDZ&%$(DHUvtd>x* zPMF$`il-%1%={M>{~Q%tFe3ER$0WM}dhzpN&Tb4uU6B!qW0T;6#oyC^^1o|4|;v_nSK0}|QFVJc9CHe}T5uO!h z3v-0$gt@}=!aQNVuwWfJ+m4G15-u(YFSO%gp@fT<|HZ{W$HmVW7rzKE+HmnJ#>H=_ zJN^hS!D50xp-Q{9AtMQrl2AdCfQm&h#3Tc#So|O=(5JR6cBF%Z3ep}>vEWWqfe&$oqs0vKQG$ zhDRpAV-p_hY=FnB55gl@ZyWAha-a;40RWHJADzXPKA$Yb@F*Y)$s%$XIh-6pjwFl8 z5@ECOrm#iWD!e6Z6W$iK3-7EWN43F2M^=y^Zjc6HM;knL3GWMg;rWAq;qlMmF&e|e zEWB%jM>B@U7;-HB2=56yrBA5x38h1D@38v;GMStr14IOX?8c)#6#%m5L4d@6r5tY? z@)_haGDKzpL_U0UCR_UF$(J!i=8^Ns1>_6li{wk>LUIwgSlBNd5Dp3-35SG_g~P%p z!jX0465F~$uE6UGxmx(N4I(<>q_nPl{x3xSIYi#T5ZNpowLxSnhR9pwHu!88jtR%% za{@SsLg}bf*@kTwxktvvZotMVJj@>eHa>e08}$3OEC%zWPI`HEVlH=$geOm zj*}ygetq(hU`xYNvNO*K*ePkVu}J(TzL=` zif(OLD4yyfp@OmlR9t;@7F&8}$_G$ExlmmxSIUiYr#vW6%8T+Aeh{t;H-sOBpM;yj z&%!Ult#y>I4HZ-%Mgu#j0!3aP(f*gU)xYYB?2m_Bq|wygx`eU zrBA5RL&?|%tq0Xx#zil{#a%qeeE=7KJctW>(w3zk^_Yx{T)@S>M`y96A3_ylTnwf1 zsRF8yDx!u_!>JL}ND+ZHA1NYAM4%AEh=>&tCn8=%igi>;J3z`MfapbJXG4gH956&g zr2H2n{~RNY7$Z$0>S6UnA&HJ@5Qy&$5lB61ax zn~2;+gHK`Zt-{s-Ycd4*(18 zNITI=+L?BtyV9<-8x3qFT|^lo>Mo)lBI+rkULxu(qD&F>Sx0-?z(V_Bu+YF$vO2($ zBZH;?zhL>tV4^88_Ai%7ILw4y0`c?i3wT)g1oi2fdPQxJS3*$|9#~|tV zAV}^3PFX#3-p1QIQQL^?(w( z0Y%`Ch=$>12z~)W@d@s&yl)wz$IvY@WX560jKrfq0Yj$vLC7dmhRh6lCOwOOhJKcwP0yj9qvwjKOhj4{m5WFxq6!g#99tEBJ+Gaw zyd*(pv52ZW_=-_RjOky*{By*t#fVuaq8b}wHUMHC+#cITZ!^7B2FVr-l3G08+b~G# z9s~*fg)P&&^e!1BJ26P=|0a_y$A|P043d5He)<4?kp751M1M>lrauu;qllVBG+IPv z5m`iJ6;ZQ@#)xR_I{MRgkerl2^0^4tlClmhAnI`$B$NLI$v+3l1q_mlB5JXL8{EWde5s&+A43M*U zGPUJk7zSjU4)jeMjf_uaqXOTV56+!uT{Fp!I{|5(Fz(o&1NXKEl@7Eudd!`YSAj) zIu|eqw4_Z~@B0BFKov@F23wPoPAc_9(z8|>R5`|4DG{qS0R<*CsLnSvgLy)_^tGnZ zVjU(c+z%-mq|^6lY^(zd1x-S9f~}+DnPehz1(U!eGD#wuFQNq^dSL~V!lW{w1N@?h zwuop2o}Y0reD@o+fOaG{f&qQqf@aX1G`GkjTVSZh+P~0go)2VcQ}2Z~J`h!Cw3-Z( zMmE!n$yvqpW-^&ROcs+ZqL)OpOhhY1v_?c5MD(VO_I}I&OnZMOmjPwvg(6xcqQxti zfy^KVB%GH;v_u5`0-!zYf!gjPb%@#6Xa?x0&a4B)EUhx)?^DZl z4AYsK4Z*#6d12QRs!)&y!OB36cT#%$_=a_hN=i;i4NU8i z)3;y$+`$FIibqv9n8%Et*k;3~u!Q7CkPJM{7vwHX$HgQhmQcR{?~qQ9hvu# zP)J=;+J=PIlDrdT+H##;g}%~I1=S75Y#!*u+_13$Gd}4HfTaN2MFQ`KxMqvBv0g%u z6xb(@$cj^GloVJS1stz2*4ovX`qdZa735}v?NV-57L+S32ucN5Bl#a~v}+m-L2Z-D zxrQK|Yp{V737nw5!D{Z8pE+{G$YK@uCD_q>fH7wb;iS`BnlgtB8Hkxh0}zJ)-v95` zNwC<5f5#+ato!5s<2R-fzz(T)!KbCtqOT_i&^{!%OZq0Wl^_%$5FR|%+Jv9`!?SB$ zVSW}oml6bT-)nfn&Ob5D5wtfsj?eoiC^%6)uI;c$5Nhv&x{D)I)yb2>cN=q*{r@Ei`$tu=;R zJWkMO)Ip;)w-BD8KI#W^V?Is~`W1BdN<(&z98Oo&H4eZu1VQ+lmN5l5T%vh=O%|pT z>Y`89>K+>c&v5ll|7MJn&~L*7?t6?JBm6c(s0{%!je02rkA(?-@VGokXUCYy<@}`t zL`n5x%w|fZV1(7f2al{l>Qj0An&H_Bqf!N-4TKsH(?R855e22~dwho{p*lHh*8xJc zLHYK6sTQfXPte;+kJ;~gysBZ2cT-c@>c{UGnmS_fI2fMFyOl>wiH>_M?rPl1xD9bP zd%VSBpl*zY{Yaevu*3#Ye@RISu&4~|4<#NZM8?f2gLSw?B$TQR^{l)X8gNu!X zSQ`>>`)VN0ETz!3wYT&9!WdEkGCKGf=4i&wvkE!D%#>@AdBR_jBO#d9ReYQVRyQm&;WPwsbEqT>A@@W2X7d<1 zjK+T$Fj;mYT){hqKRBNVhY^VfFAEv4X6AqlFc=KUM}nQW9!9esdTcCsArip|c_uLj z{0=PyuR|-rf_D?x?7jsixbG7mg8!i-;CtvatS1+U?};14E#eMB;AO}Gbp?}}02GR% zz_U;)>WOl|n@~PjQIw-<@Fmm?s{2oX=b*WuJHH&QL$9N^B`-mrg3k0gbQ!z?{Z3M( zJ!s7OkzwEgD3#142Y`CyDDe6-njB9~C7%TyxK{A!vz2_G{0MZP&Vt{bUnqj=0=h1N z;Fl+r%Ay8S#o&j>OiiL@z}0mtwF!8@KDd-T3m$ZSqgl9bQqgJ{#r|{=c*PkFK5%By z3+c7=R`7Fk41C+%p#NkX;QS?uNrz4O2&S4D%S;3BGpm^`;A`dtbAh?VvaCCdPYR6N zNVb-p0RCWJW?yA@fzOxo>@OS#9$uori_2i}+hXOWaW8QjxSiZl@VW9UcvuPGtR=DS8FHQ zy=b?|?gP6o?QVAI(j}-%T9=_+j9r8-FLrsY%lkT&-w?wyLZsXh* zxxMRl)}3+>bI)}*xzBcg!~LZD?;d_0nH~m@=^mRrj(Xho^zrQNY4Duk`Ksp$&)>aN zUO8TMUe9^G<@J>}?H%bo)O)P=67LVZull(9WccWPX863}^MxOR&@;doFfU+dz!jC7DpO@ry{Ou&x)JCb z*gvp2aCzY2z&kFd3MX~Hon{XZeNBwg!c*`9o`y#Jc5l#ji`%wIpRnp8JQGW z6S*kzlPEGOIm#IIa@42MOmtdwLv(BODYd;iQ$0q#UVSdcJ!W9cl$f_-euxc;EslLI zc3a5iLX-rz5w8?2Z(tb-%PPeANk$ycx zol%$ZO2(z`-MSmPuk3!lM^F!4kL5ki_EhyO@42k!*%D$_^bebkWd@`I`L4^Y;~WEzlOcQgExVPvPvs(?#J$ z%|*M1ISnfvwr<$%;n~CI4nI30cErRHAC2@LX&kw&m@6Juyt??8lAMzHB^OGQN~e{c z9Mx^qxKRhnyvs~w?`oa2I_>6irhIt$E9G}}gLSRCUn+7d7FXQRXX#(ie_z?Va$e-qZf z`nMZg8tNMMHu^V?Yy7k+s%cu&+0p5v=a0T&9$;Q=L6%XLZB|#<4?Z+^1*+?bwY z7LECJ?69$$$2pH{7y zczVM0m!|(YqjJW zx#Q=ae}2&OTj#0f&6xM|eC_-L3lbMBeZlU9<`>SsIPk@7FNM4`=cT&~YZjhZ)MwGF zi+vYQUwr%J%9oEW>AhsrQop4$m;S!Yxa_m#{g!WS4QpMnf?Y9Y#l@AwR_QiwBVKEM z?aJ%rub+Hlz#F?ar*7W#X6T!Xw{+byV=LO)vh~JWHE*5WHgemiZ$I|-?(G@dx4aYc z&YB&8I~Kj`_U`QW?B1LD-o2gUcmA@gY1h^FtKUDrTf6)8o)LSF?;X1L@CO4v*#BYQ z5BKcL+_!UokNrCiq#t!GAWTRu+uc+27B!&^T|`DELXv?JR;?f&U| zM|&N8|5*0150B>_|L8>CiBC@!o&4-n>8Z1yRepBqbJOQPelg~YJEsK@;%9uN{A$4& z-!rXWM|}P2+2phDp36RW=$nFXPM_DG|NdLcw|6g0z36ap!FK`Qt-BO|X~*ThmycX2 zxpLwArtj}uop#On+TtI=e|YnH@9T$djJR>(NAr*OewuaD>*kuD6Mx?Q%aC8r+^WBI z=k|+}LOp5S;cngV(I!HmRfpB)S^#g*c9Ql6VR{pv(jr zWHCq}uY&yXCb$E68ytbW3r;{jBn}gwg9LIJq>n!kixj8}$RAE%$Qz7$gD1mm@MJg` z4Mhd02;`3vu;A1p9mpSZ(H6819YTlE5p)#fjxW&}bQYaQ7tnX;GI%2lB!kIN@I#mc zUIzz|dE{`i6nqUff=$5V;8Sn`Xy0!FKZ1M71LP6%7q+&d`hai1TxzK6yRJK3_qrZ+J?Z+D>o=~~U4L@D=SI8PyE(bJx<$A}yJfl+ zz`9r>OKc>P|3drk`{xGg4C^K5E{wp4e;G~)nnDb18&TU?`c!5n5xE+!7N#*zF^@6R z8MtSH3xSJ5GMZBG)UC#?@Pjo3al;o4(mUpEHvUPI7oSvc@d85Ut$*GlSM0p24}v%aEe{(swYJB zhTK_;nV02$F|;y^iJ@hMjg@dnr?aXwiRnqna++n#^1q(LGRp|?(WAT~-{!1ja+VX0 z0@dl_W-apy5h(>OXV!~on-DK2-PDm(4tRsfSqAy!FJQj-3b6)|{08i>8FwB!HID~4nn&+KD9AtKi>`W9D%FKqs%epBLXfhMf3r_ru`? zK|XkCX*6T+Ly}u4%)hkCo}H6IX6%p*dyaw=`;_>c`1ttjB((;9s}mEma@3h=aY^c| zz6o(TahaOLlr(V16JW!op}ofYi&1*Dx1$hTd{yYoxi+%p8^X>_>Krv;LSk~XN*y;b zS~Vd)Ns|~2sMDlOoG4#2ons~qcBcLRa=nz8^xs}Dxp2IEapVD4I-ya~>bL~?K1r+e zPfS)Nq^fY8DosL4nko){;**l$#2yGx6+vI7!`ycIiw7Uz-km#BZq^XE=7mt3&%TcC zJ?5lzc5!vbbMN6!7ngSx_~mZk`A~Vx)5{qy!la9y0=Nn`Gz`?WfXAAmqTFnG?T{9Z z&QbWnN03}6f)^52f%GK<$Pn;QoJeMY`Q{in zo0vr|18>8d$?fDGu*v!c&Lt4o-(Yzl9lQi%c_34g2y&=?AQcRt2Ej?iPzv8Iz`yoY zAK#mF`bQ0eRo}Ltf6H7WBGAm%5AVTNiJRFpss@q^^N8hxc6$Rk-SBMJEziNM#EU!7p*e7GefzLt-@8Y zvAO{lQ~($3R-CPalp?DU!i)wBR=JT~65^C?UBMD8OGK_>5lgZZOS6oKJ{8eX5gilJ zaS@$Z#d0jqDj>Fth)#;=cae0!@nkpLT$Sv46AH%OMB7^#1B?j#UP{U?K95M!7uW*a z5o~#$^EuvE*`bI4Zza-HP%WK(N7}!RbG1AmR9h*3S{|0dkeA# z;f1r=(${DL4I5Z)a~kk!3T?ukaC62rVdr6$x!^(7QV3ic+$ln^?77v({~yeX*XryR za9?TELPDGdSBS?Yp zcm+e&xwEp3RDvyIAv;{o2%G{^e~&XleeejC4a<>S657&^Vs)6rG*-)&OG&PY=m-2= z-f1_bX2*7n**Fp16x6n;3G76Wu~|^+`er#hNkl(mM~;$|%8Kk0II1^v^Ky2o2(BO6 zqn=`?<0ueFuPtX`&vUCI>KS%6j(S!^x0g#z#(nG3xv}^8iDKum3p!|fK}5fG(6*3W zL_{uI)=~Bnb~zr1r7TGMcSLlzm4%@Y(I0JH>NUFAU~U-#dRO(J2xo?=VUtovfsz1( z4AEKPcYC+2Wj7L$E7^7IE9`o9gNXhV(LIqQL=vrJH^E`^YwYVHNs1&TlC(%NxFPOM zW`hO#7^ZcB9-IMZ)igFrv(6V5Vr!1h(o)!%+W=e@Hd;e5HPQlIA`ynw;;?II7wKC8 zFnQ2~RzB3WAJRp+XQOJIn{e(R- z5=2ysq_ZiKJct{nMqQ=NLmqaZ4AWTJ39?7oW0EY@=HpZrO;A5z(-%USj! zUN6tVx^f;?6<3i2Vc>I-bduJSQ>$P#xdfjp?Dw#OkV^bZC6cg%(@J|E*)e!KD{fyj zaP56{pyL9V0RNePO<=422K!UTG`cC0&K=X}7W*rnk+($>`1Wri+4b+a-5;DC5xIf= zlfB0g9O6ih;%JWHSh#cHIfY0hCvUnB!I$o%QS z-x3GIZ1Zpa!?K#ysBhE_X{@wJErxXyBwp~vJ{Wv&gXCmvkb-UOvMr5rnEVnE>?*Y_ z$fGmU=?^Mu2H8s7;lA#^^*xL%N90)VCy{p^$Dm((_&fl&7TyJg= zz=O-=`fyoXHkZTo<@#~`xm@lsZU6>7G$BGHBSkVwB%?)AEs{WatVqU*q(&s;LDt&9 z<-xsO9+yXG@rMY+Cav&&q(~-+WRmnd0Z$M3g#~JC+KOY6CEUVvXcu{4GGKqymOpa==^!{A<*g_WG9?T|* zgCO%`oj+JMKt=<}P+uqQVJ&5l5pM`AeOl!6Jxpy|0K7~9pR~zG1??3}5+5*8cohRz z&DAUu$wY~lakX3>=mUa!W-C`q43!hq%SU1l8O`{#gm!6;8_iiTI?N)Ox}39$WE$?{ zz-Cy|hL{ai2D2I5e#25$4Lgwb36q=MM#MO|4ja-YaFbwl<{sxJie!dJc5lT-9avt* zWx7dC8{A-O83^xN0BIF8&+DMq14iVx$Fxbdea(&a?VD6v;ZJf;VM3>gWY6V9ARK)` znLh0~+oW*3ziAs!TfSM`vpC-~BH4R6H(Mk#B@kr~D{S8oNs_qSY0on`E4X>wd~ShA z_7TZ`BAMH990_;KFB2{+xP{yzZm~#aiDb4&=B!{Y5`i4ZBM0zSuP@jyK-nE?tEKo` z$3d17zG5N=>8e3UXs!g+-_i0`)JE?bZvDe5xeAqRf*mKWq`#mJ?!Dw!DW5Id8ypz- zJU|=w7G!%{Bp<`s24F!Q?>XD|eR#JQ+`FmweI>oe9U>w(!e#m{?tN}Iw};!yeZYOl z?c?@y2e^aWM^Y+#s)lXwRnfrhLyIWAhfvS z5vs5;l8z0rR821IMaF^rSc5mq7!P5^ZfM*CT&xvF?MuyI|zwF${!M#g&Nd@7pg>=fP9cZYs7B=Q%6`o_f z1Mf(5q4uCbyb~+~aD-+XJ=vo_j9RBKY2zxAl@c@Mop~2HIBU<)%6BD(b`EIkE#8fH zmp3OTcrV_Y=)(K(zPumr56UMhJ`ifKZRTw@KV=lVvwbPPp6oXZwMR#Nqf5!n%eJ<-_=Hd^jJ$ zNAj>r8%5G2k_{r+B$BWYz$!3C2tCHf@UhUUIP@DIU)(`Qkwl?L)(S6)BpfUHKSa(C z*XzvID(v__LhjQfK3P5-k?$tu%LTk^Y3pXAxs^}BqBdSJADPBRQW}cjLGY=^ETe8@ zyVPTg?n!RL(T&1!iNL>}zuS^!$)${zO0jL?+Zx@UT8fJRBgJ5;j0g7Wwn7F`$v7eQ zC_>iR4jgQe`Em_or5bGFszk1m{DL3Bj|2^+6225Vc@$s9Yx#2GIA6i*;oWe9_)4mU z=ufrqRV9^e@1g*a6(nH`7=z)>CkO@2^$qe7EzAKpDS05!SziM?VR%81IUm2b1CS4p z!}eZy7n;)m@7sVZ5G3av2(Q18iyMhW52&Xe-aF!AtFI#(=F?vaZqy5DN*86SNRAhX zuJ_vh$s=FG8$srRRS)mMY^b))h!uP-Ux$bNQ3-&xLDs)!lS{7Wp*{Fm>^}H+faiYZ z*~&NKivH{L@@yFm7md7GBqw(8JieI+Tk9447;ZN|P9!HutKj4n{CF5_SiA&0*dn}6 z1kc3*#)e8b$%j_R?5{t(9S8&|VB3=D<77*tm80c4r{FrD5XmV}=TUwdpyMh2X%Im{ z;m`~R5BHUX3lK?2yy`Q420xRZ#Xke-pXF!sbNJ`@x%~6|JbpeO2e+ZAz*}rcy063J zyMsVHTk%yN7Dd~(@%MKiY}o+|)=sY^0r{&zI?M)P8x!)^^v?Ii;(G4KvX70P4#BeB z4oD57IHejIgfam-DUs z3VtQON+dyQd|D)Dh~zAhe71wPt(7^&Q~!ZeY?SBm^oMbZH)KvR^FMNmw`5N7%tJZF z4!MTe4|0lQ{0L}I8E}T(M1LVoB%c!q8UG*fA3l6~wDS8f)E_o;AhfBu0*-d%BRI81 zdWDy5MLWnJ2V+|PBmNNoF@KoUa-083BwvWAAN?cm?K~K2FXyj_2{4KE9CYOQn^&^}x+cNy2AS7#T{vKFsldX@=08_txk(GfXAyC07 z;G9po(~w@0*T&s2D`-_HFa#eOC+F>=u$TAk_wh4{Gqx%maAv%ze=xF*c!iU~6^?E} zq1RdAqUb7;YeaIbNUjsfS5_+A6zL zN*e?D456v*j;vjZwpAAZhH6lqN)f0CQb2(lL~^4@ZW75?SHkNGA{56{ieAooQ|+2QSg9X6jJ@4MfZL@FKgZHf0O zVx{*~*$9tUB!Wz@ND#?4mV?hkgS7jFeYU01)OPKIn{P{xoGDUKWNWRsv8Y;5EYVW~)r$R{tDh9x);2pqLyj`8G>MZwz3U;lP0l!*dlf~=#-bRqu`E42lp}tc=zad_HlL++;~i7pJHdQ&#-gg-J|o_ z4R9)clD!7+4~>^J&EaSR-UB)t-UIqPya#k4x0qYPod$h#PZ0k7K$e|I|rphfJ3-LPlp_be1~R-u?{T`6C5TwOm+|*o^W{5 z;VFmd4l^B|ahUD!oWt`D^BuN1Y&m)j~qX9{KD}|$1_fSoeG?aoQ6A%blU2)$LRy7 zeNG3INyo(S{#chJyM7K+Bzqs@6cJB7>j_yi#7k5{8cXv;BZ+EqOth>fN!9B@6#XZeE z!@Y-lFZWFMGWUt@%iZ_5U-szY5$loXQSULvqs3!_$3%~59| ztI_LOuNS-)dM)-^;HLo|k-t^k)wash0*AA}(UWdJocpddR<@LGOX|J!mu6kYf zy6cU+DR0Kx&fDJG(Oc;q;2rJV%RAFM%R9%rpLeeJ0PjKGgF)B7(!0vL#=F+r-O^zo_kdD3U4&qkluzz*O|pLcye^x5xo(C3iPVV@&D zM}3a_ob$QpbIIq5&vl<4eQx^v;!FE-zOKGrzCONwzCperzG1%MzA3)hzQcV-`j+^P z^40q4eD%Ht-)di@@8iCcdRHts)m+s))dH}G zSg2a8TB3SgwOO@A^_J>w)jO(pRXbJhtM;fqP<<1K0z(7)1=a`74%{4gH1Nm3-vj>$ zycdLm?1H)mxdnLyc?J0d`2__81qMY1r37^k>KW8KC?}|2P;StGpyHrWLE0cw(C8pb zP;=1upvQwI1qng3gBF9e#p^+vgSG^{74&w{J3;RT?F@Q9=y=e{pwEK72>LSUOwie& zZ-TxJx)^jRmgt&(Ig{VS;LPA2+A;}@BA?YFALwbhv4(St; z9nv?XAY?>HaY$*1E<_(<2&oPk6VehgEo5fMGa<7>=7lT>c`;;R$hwfNAqPS}3i&wX zlaNnCj)j~EITiAG$mx(DLT-fo6!LS(t&m?seh;}D@@FU!N`?l6_6)5Eof`T|=%LUX zVNPK&VJTthVco-ehV=^@5|$rU7&a_yL|AcHX_zsrA*?CP95yzrC2T_2#IRXmv%?mL zEe~4}wkqtEunl3G!d?s88Fnb_>#%cS=ff_9eHV5)?EA25Vb{Zc>_&HEyYb!Zy4iPg z?56DI(#^G-J6M<`bt~*PuG_+HySjZ7&W4AEXNM089}=D)UKlF zf<4RVNNeQS$dZC zqROKxq6|^hQB$KEb>ST46dYF2ox>T)I zSEvo@8g-qzK|NYMRsEEDx_YMi8TD-ST=hKl0`*JkMe1$pQ|dc0elb}whM4IwYh(7s z9Emv=b28?$m~$~#Vy?y9h`AYaE9Tdj-(&8^DqD@1ZV;^F`5KT zk|tHtL(@ysN0Y57&0;=6#YQC@sg{DSyx@n6Q@N$^exP6$hgNQg>E zOz4r&JE2cPPC~zg+=KxMg$cTZs)U+^x`d_#b3${%*o0{b(-RgXEJ}DeVOheegf$7T zBy31{Ct-iW>4Y;0=Muh6_%7i}!nK4O2{#jNB`Ol_6CD$ki7tt*i5`hwi9U(`iK@gN ziKU4`Vr%05#4AaTN$RA5NkvH`l1h?BB~>LgCXG(ABsC|EO=?M+mNYZznWQ;M^OIgk zT9~vrX?@bBq<4~bfgRKbNe7b-C4G|gY0}xGYso}1mCPn9lI@e7l3kMBl0B1sl4FuJ z$qC8ep(QyjxqEWY9y~l;2YBru>=e zkm{Z4m#Rt)P7O;9Pfbo8lvax_<)K#f# zQ`e_%N_{b4UwHOGz7?R+DB;8=tl`ZFSn3w5@4-(hjD5oOUGb zSlSn9U!|Q*JD+wT-7`HQePDV~dU?7&y(-<9Zc1-VH>XcdpO!v7eOCJH^abfJr7uoj zn!Y^!VEV5aAz%ZRn30*0mr;~4BBLauEW?md16E-T8BG~2851(ZjAt|EXS|rPC}T;+ zs*JT6>oYcGyq2*!<6y?Aj58VMGQQ3DF5`!cA2WW=xSjD^ce1;pyGwWP{8jmD^Iy;3 zng3z_$N696f0utH|62Zy{G0i=@_#E}3ls(R1x^Jn1#ShN1>Oa{3MvbpE!bA@e!+o) zqXj1l&JU50NpMMW$-t74B~O($`9NmhLXyTe`3GKcC74V*=J>6mt8HpS$3=J zx3arhO3P{$T6?XdHc%U*&CvGI=4ktC2Wa!PMcNVC6748$t=6g)wNtfEX=iAk(azQ` z)-KhyYFBC3YG2X5rQNQ5SG!BQNBe>HsP=^RGwo^Z8SPo^HSG=UP3khDU-zPJo$h_z zLER_1qq^g|Q@XRdE4phHRE2$oe?@3TOhrn?;EKWuQ^nMZ=@oM;Hdkz`_`Kp`#g7#~ zSKO}nz2Xl&q3@!1&@1&WdN;kN-dmrnAFi*|SLBSQdA#zvfi@@&eg>5x*brujFhm(r4H<@>hD<}Yp)dG8 z8fF-2C^cveI?zj;2-lTQ7^WGf8)h2T8g>~zHe57ZHe5AaH~eJy#qg`)j^WQLR7F>D zRd!XuRbf>TRnb+kRhp{As^qHFstmAi>|K>rl~XmcYIN0;RZFY3SDmQ(v07OjP@PcS zzj|nOesxiGS#@Q#vD#d1sUB1PZ1tk*CDqHTS5~j7URV8b^~vf})n8P9SADhmdi77$ zx2u1vzEk~2jayAhO?FMcn#XDe)eNo~TGLqbc+KRRDK$^lJY6%RW=YMOnoTvY*SuNt zR?YUBeKm(`KCL-kbE@V{&AFQMH5Y3x)!Z^tMt5U?G1{15Og5$&yMxtbUt@pc0OKIz zFi;1pg&Wl-up}98oM@bEoMN16e8ITPxY4-Z_>u9j@l)e*<0<18#;=TLjpvOQjhBsA zjn`}KY8`5owJx=8wVt)!wZ63hwSl!EwcTnXYolvpYWvh0Y8Te7s@-3Evi5SFeVtET zX5GlT#=3=I;rUA4#=6()HrH*bd#`R!-G_At>JHU?UU#T~M**AJ-As~760*Z+Sto7+p(Q4mJMiV~#zOA$pDfmD(tMrA~a zQ9f8?lw~DFMz`PWy=TtMY>c!}MCmO^#FJ4_h}|Sh1WA-`7O7<W4G!V)}zWf;Z^Jc~8hh_~<#He(yUz}NT=JF%a}&^U^w7@9_NXdca{I7*@v zN~Lv_Mj3Q~fC{OcDyg0tsEKaVJ$gVb^oX8N2YsL(>Z8x}mA=zY`b7iuhlWBkLn}hr zq2r;-(1TDP$M6D9ZmNn}8` B?m7Sf literal 0 HcmV?d00001 diff --git a/.swiftpm/xcode/package.xcworkspace/xcuserdata/matthias.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/.swiftpm/xcode/package.xcworkspace/xcuserdata/matthias.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist new file mode 100644 index 00000000..513a1f9d --- /dev/null +++ b/.swiftpm/xcode/package.xcworkspace/xcuserdata/matthias.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -0,0 +1,6 @@ + + + diff --git a/.swiftpm/xcode/xcuserdata/matthias.xcuserdatad/xcschemes/xcschememanagement.plist b/.swiftpm/xcode/xcuserdata/matthias.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 00000000..09f249a0 --- /dev/null +++ b/.swiftpm/xcode/xcuserdata/matthias.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,42 @@ + + + + + SchemeUserState + + LicensePlist-Package.xcscheme_^#shared#^_ + + orderHint + 0 + + LicensePlistCore.xcscheme_^#shared#^_ + + orderHint + 1 + + license-plist.xcscheme_^#shared#^_ + + orderHint + 2 + + + SuppressBuildableAutocreation + + LicensePlistCore + + primary + + + LicensePlistTests + + primary + + + license-plist + + primary + + + + + diff --git a/Sources/LicensePlist/main.swift b/Sources/LicensePlist/main.swift index 3125230d..89527d71 100644 --- a/Sources/LicensePlist/main.swift +++ b/Sources/LicensePlist/main.swift @@ -12,6 +12,7 @@ private func loadConfig(configPath: URL) -> Config { let main = command(Option("cartfile-path", default: Consts.cartfileName), Option("pods-path", default: Consts.podsDirectoryName), + Option("package-path", default: Consts.packageName), Option("output-path", default: Consts.outputPath), Option("github-token", default: ""), Option("config-path", default: Consts.configPath), @@ -20,7 +21,7 @@ let main = command(Option("cartfile-path", default: Consts.cartfileName), Option("markdown-path", default: ""), Flag("force"), Flag("add-version-numbers"), - Flag("suppress-opening-directory")) { cartfile, podsPath, output, gitHubToken, configPath, prefix, htmlPath, markdownPath, force, version, suppressOpen in + Flag("suppress-opening-directory")) { cartfile, podsPath, packagePath, output, gitHubToken, configPath, prefix, htmlPath, markdownPath, force, version, suppressOpen in Logger.configure() var config = loadConfig(configPath: URL(fileURLWithPath: configPath)) @@ -30,6 +31,7 @@ let main = command(Option("cartfile-path", default: Consts.cartfileName), let options = Options(outputPath: URL(fileURLWithPath: output), cartfilePath: URL(fileURLWithPath: cartfile), podsPath: URL(fileURLWithPath: podsPath), + packagePath: URL(fileURLWithPath: packagePath), prefix: prefix, gitHubToken: gitHubToken.isEmpty ? nil : gitHubToken, htmlPath: htmlPath.isEmpty ? nil : URL(fileURLWithPath: htmlPath), diff --git a/Sources/LicensePlistCore/Consts.swift b/Sources/LicensePlistCore/Consts.swift index 245ab6af..e5afc03f 100644 --- a/Sources/LicensePlistCore/Consts.swift +++ b/Sources/LicensePlistCore/Consts.swift @@ -3,6 +3,7 @@ import Foundation public struct Consts { public static let cartfileName = "Cartfile" public static let podsDirectoryName = "Pods" + public static let packageName = "Package.swift" public static let prefix = "com.mono0926.LicensePlist" public static let outputPath = "\(prefix).Output" public static let configPath = "license_plist.yml" diff --git a/Sources/LicensePlistCore/Entity/GitHub.swift b/Sources/LicensePlistCore/Entity/GitHub.swift index 40c45c35..b252ddf1 100644 --- a/Sources/LicensePlistCore/Entity/GitHub.swift +++ b/Sources/LicensePlistCore/Entity/GitHub.swift @@ -28,6 +28,7 @@ extension GitHub { public static func load(_ content: String, renames: [String: String] = [:]) -> [GitHub] { return load(content, renames: renames, mark: "github ") } + public static func load(_ content: String, renames: [String: String], mark: String, quotes: String = "\"") -> [GitHub] { let r = load(content, renames: renames, mark: mark, quotes: quotes, version: true) if !r.isEmpty { @@ -35,6 +36,7 @@ extension GitHub { } return load(content, renames: renames, mark: mark, quotes: quotes, version: false) } + public static func load(_ content: String, renames: [String: String], mark: String, diff --git a/Sources/LicensePlistCore/Entity/Options.swift b/Sources/LicensePlistCore/Entity/Options.swift index 2416ce22..fedd8450 100644 --- a/Sources/LicensePlistCore/Entity/Options.swift +++ b/Sources/LicensePlistCore/Entity/Options.swift @@ -4,6 +4,7 @@ public struct Options { public let outputPath: URL public let cartfilePath: URL public let podsPath: URL + public let packagePath: URL public let prefix: String public let gitHubToken: String? public let htmlPath: URL? @@ -13,6 +14,7 @@ public struct Options { public static let empty = Options(outputPath: URL(fileURLWithPath: ""), cartfilePath: URL(fileURLWithPath: ""), podsPath: URL(fileURLWithPath: ""), + packagePath: URL(fileURLWithPath: ""), prefix: Consts.prefix, gitHubToken: nil, htmlPath: nil, @@ -22,6 +24,7 @@ public struct Options { public init(outputPath: URL, cartfilePath: URL, podsPath: URL, + packagePath: URL, prefix: String, gitHubToken: String?, htmlPath: URL?, @@ -30,6 +33,7 @@ public struct Options { self.outputPath = outputPath self.cartfilePath = cartfilePath self.podsPath = podsPath + self.packagePath = packagePath self.prefix = prefix self.gitHubToken = gitHubToken self.htmlPath = htmlPath diff --git a/Sources/LicensePlistCore/Entity/PlistInfo.swift b/Sources/LicensePlistCore/Entity/PlistInfo.swift index 4b36b4d6..2944eba4 100644 --- a/Sources/LicensePlistCore/Entity/PlistInfo.swift +++ b/Sources/LicensePlistCore/Entity/PlistInfo.swift @@ -32,6 +32,15 @@ struct PlistInfo { Log.info("Carthage License collect start") githubLibraries = options.config.apply(githubs: GitHub.load(cartfile ?? "", renames: options.config.renames)).sorted() } + + mutating func loadSwiftPackageLibraries(packageFile: String?) { + Log.info("Swift Package Manager License collect start") + + let packages = SwiftPackage.loadPackages(packageFile ?? "") + let packagesAsGithubLibraries = packages.compactMap { $0.toGitHub(renames: options.config.renames) }.sorted() + + githubLibraries = (githubLibraries ?? []) + packagesAsGithubLibraries + } mutating func loadManualLibraries() { Log.info("Manual License start") diff --git a/Sources/LicensePlistCore/Entity/SwiftPackage.swift b/Sources/LicensePlistCore/Entity/SwiftPackage.swift index daca5f9d..c771cba2 100644 --- a/Sources/LicensePlistCore/Entity/SwiftPackage.swift +++ b/Sources/LicensePlistCore/Entity/SwiftPackage.swift @@ -19,7 +19,7 @@ public struct SwiftPackage: Decodable { let state: State } -public struct ResolvedPackages: Decodable { +fileprivate struct ResolvedPackages: Decodable { struct Pins: Decodable { let pins: [SwiftPackage] } @@ -30,7 +30,16 @@ public struct ResolvedPackages: Decodable { extension SwiftPackage { + static func loadPackages(_ content: String) -> [SwiftPackage] { + guard let data = content.data(using: .utf8) else { return [] } + guard let resolvedPackages = try? JSONDecoder().decode(ResolvedPackages.self, from: data) else { return [] } + + return resolvedPackages.object.pins + } + func toGitHub(renames: [String: String]) -> GitHub? { + guard repositoryURL.contains("github.com") else { return nil } + let urlParts = repositoryURL .replacingOccurrences(of: "https://", with: "") .replacingOccurrences(of: "http://", with: "") diff --git a/Sources/LicensePlistCore/LicensePlist.swift b/Sources/LicensePlistCore/LicensePlist.swift index 179b7b95..8d461403 100644 --- a/Sources/LicensePlistCore/LicensePlist.swift +++ b/Sources/LicensePlistCore/LicensePlist.swift @@ -11,6 +11,7 @@ public final class LicensePlist { var info = PlistInfo(options: options) info.loadCocoaPodsLicense(acknowledgements: readPodsAcknowledgements(path: options.podsPath)) info.loadGitHubLibraries(cartfile: readCartfile(path: options.cartfilePath)) + info.loadSwiftPackageLibraries(packageFile: readSwiftPackages(path: options.packagePath)) info.loadManualLibraries() info.compareWithLatestSummary() info.downloadGitHubLicenses() @@ -35,6 +36,16 @@ private func readCartfile(path: URL) -> String? { return path.lp.read() } +private func readSwiftPackages(path: URL) -> String? { + if path.lastPathComponent != Consts.packageName { + fatalError("Invalid Package.swift name: \(path.lastPathComponent)") + } + if let content = path.deletingPathExtension().appendingPathExtension("resolved").lp.read() { + return content + } + return path.lp.read() +} + private func readPodsAcknowledgements(path: URL) -> [String] { if path.lastPathComponent != Consts.podsDirectoryName { fatalError("Invalid Pods name: \(path.lastPathComponent)") diff --git a/Tests/LicensePlistTests/Entity/PlistInfoTests.swift b/Tests/LicensePlistTests/Entity/PlistInfoTests.swift index 7c7bb1bb..dfa99cc2 100644 --- a/Tests/LicensePlistTests/Entity/PlistInfoTests.swift +++ b/Tests/LicensePlistTests/Entity/PlistInfoTests.swift @@ -12,6 +12,7 @@ class PlistInfoTests: XCTestCase { private let options = Options(outputPath: URL(fileURLWithPath: "test_result_dir"), cartfilePath: URL(fileURLWithPath: "test_result_dir"), podsPath: URL(fileURLWithPath: "test_result_dir"), + packagePath: URL(fileURLWithPath: "test_result_dir"), prefix: Consts.prefix, gitHubToken: nil, htmlPath: nil, diff --git a/Tests/LicensePlistTests/Entity/SwiftPackageManagerTests.swift b/Tests/LicensePlistTests/Entity/SwiftPackageManagerTests.swift index a7828215..c1fce608 100644 --- a/Tests/LicensePlistTests/Entity/SwiftPackageManagerTests.swift +++ b/Tests/LicensePlistTests/Entity/SwiftPackageManagerTests.swift @@ -50,4 +50,10 @@ class SwiftPackageManagerTests: XCTestCase { let result = package.toGitHub(renames: [:]) XCTAssertNil(result) } + + func testNonGithub() { + let package = SwiftPackage(package: "Bitbucket", repositoryURL: "https://mbuchetics@bitbucket.org/mbuchetics/adventofcode2018.git", state: SwiftPackage.State(branch: nil, revision: "", version: "0.0.0")) + let result = package.toGitHub(renames: [:]) + XCTAssertNil(result) + } } From 529c1c9c9868f12d0dd1405bbe202a25156e9528 Mon Sep 17 00:00:00 2001 From: Matthias Buchetics Date: Mon, 23 Sep 2019 11:39:11 +0200 Subject: [PATCH 3/4] additional tests --- .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++ .../UserInterfaceState.xcuserstate | Bin 35637 -> 40003 bytes .../Entity/SwiftPackage.swift | 4 +- .../Entity/SwiftPackageManagerTests.swift | 16 ++++ .../Resources/Package.resolved | 79 ++++++++++++++++++ 5 files changed, 105 insertions(+), 2 deletions(-) create mode 100644 .swiftpm/xcode/package.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Tests/LicensePlistTests/Resources/Package.resolved diff --git a/.swiftpm/xcode/package.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/.swiftpm/xcode/package.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/.swiftpm/xcode/package.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/.swiftpm/xcode/package.xcworkspace/xcuserdata/matthias.xcuserdatad/UserInterfaceState.xcuserstate b/.swiftpm/xcode/package.xcworkspace/xcuserdata/matthias.xcuserdatad/UserInterfaceState.xcuserstate index 008e36d7991715a404448e56073098c32e6a6798..a0371f38e64b3b61359c07d5d1377aefcc029c29 100644 GIT binary patch delta 19036 zcmaKz2Vj%M`}p6xcc-+Z(5C4gX&chL=`N+44TVx>n-1tmXS!G3qk|y|7(h`3T0kgM zL>ver%K?Hi1VM&?>3s8Ut4B&wTn1TK}UqC-xa4Z}LGvHL11+!rREQC5JKm=#N zR@esHVF#QEXTiBp4;R8ka4}p4m%|lsE$r68UGQtT8}5O7;Xb$@egnUS-@zZ?F?bxF zfoI`4cm-aCf5E@uOOhY~2}zQqNSb6w3D#gg(vGwz9Y}Z5gN!1h$rv)0j3Wn;@#J7K zflMS*$&uuEGLxJ@s>vL(j;tpe$VRe>Y$jVs9Vw8A)U}gy$v4Tj$i?J4t7LjFcxAfJ#=$!FxBECN7YjeR14Kkbx?0n^QigMyVMeDGxZU*h5DGM(VJI!WE8?ofBBd(?gE0rimjgL*_grv9V>&C?RvjP6fc(O$GS?L+(0ezZRw zKnK!6bTB=T*2U6s^dLHwPNRp=W9W3ckS?N&X$@UMm(pc)IbA_l(lvB5-A;GVGwFHs zeELIr4ZW7`rq|Ky=?(NodK0~w-b!z$zod82JL&!OH}tpkcl1y65&9(kD}9E3KtH7a zpdZnX=_mA4`WgKv{hWTuFbvCZj8w;1GX0qTj6LJPxG|oLk_lvjm|!M^31_01SY|Mj zz@#xln4yfC$zgJtJSLx+#!P1lm_nwADP}ZG2~*0HG387H)5tV2%}hHpkD1RbVBTi* z%tB@nvz%GMbTaFi4a`R7Gv;&V3uY&?n>oT9WsWh&8Qss!Ddr4wmN~~nweyl$mzy`8GY%m+bhO!B4BAdh}vngyUJCU8lPG+aD zQ`sywn^m(pYyn%yR_PSjdzAf!J;VOaUS_Yb57>w7AM7LcG5dsl%0A<0t`8^WtT;Jm%h_>GoHOUk`EmYS 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 delta 16460 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 diff --git a/Sources/LicensePlistCore/Entity/SwiftPackage.swift b/Sources/LicensePlistCore/Entity/SwiftPackage.swift index c771cba2..cef520c8 100644 --- a/Sources/LicensePlistCore/Entity/SwiftPackage.swift +++ b/Sources/LicensePlistCore/Entity/SwiftPackage.swift @@ -7,8 +7,8 @@ import Foundation -public struct SwiftPackage: Decodable { - struct State: Decodable { +public struct SwiftPackage: Decodable, Equatable { + struct State: Decodable, Equatable { let branch: String? let revision: String? let version: String diff --git a/Tests/LicensePlistTests/Entity/SwiftPackageManagerTests.swift b/Tests/LicensePlistTests/Entity/SwiftPackageManagerTests.swift index c1fce608..acffba30 100644 --- a/Tests/LicensePlistTests/Entity/SwiftPackageManagerTests.swift +++ b/Tests/LicensePlistTests/Entity/SwiftPackageManagerTests.swift @@ -56,4 +56,20 @@ class SwiftPackageManagerTests: XCTestCase { let result = package.toGitHub(renames: [:]) XCTAssertNil(result) } + + func testParse() { + let path = "https://raw.githubusercontent.com/mono0926/LicensePlist/master/Package.resolved" + //let path = "https://raw.githubusercontent.com/mono0926/LicensePlist/master/Tests/LicensePlistTests/Resources/Package.resolved" + let content = try! String(contentsOf: URL(string: path)!) + let packages = SwiftPackage.loadPackages(content) + + XCTAssertFalse(packages.isEmpty) + XCTAssertEqual(packages.count, 8) + + let packageFirst = packages.first! + XCTAssertEqual(packageFirst, SwiftPackage(package: "APIKit", repositoryURL: "https://github.com/ishkawa/APIKit.git", state: SwiftPackage.State(branch: nil, revision: "86d51ecee0bc0ebdb53fb69b11a24169a69097ba", version: "4.1.0"))) + let packageLast = packages.last! + XCTAssertEqual(packageLast, SwiftPackage(package: "Yaml", repositoryURL: "https://github.com/behrang/YamlSwift.git", state: SwiftPackage.State(branch: nil, revision: "287f5cab7da0d92eb947b5fd8151b203ae04a9a3", version: "3.4.4"))) + + } } diff --git a/Tests/LicensePlistTests/Resources/Package.resolved b/Tests/LicensePlistTests/Resources/Package.resolved new file mode 100644 index 00000000..7cb99a75 --- /dev/null +++ b/Tests/LicensePlistTests/Resources/Package.resolved @@ -0,0 +1,79 @@ +{ + "object": { + "pins": [ + { + "package": "APIKit", + "repositoryURL": "https://github.com/ishkawa/APIKit.git", + "state": { + "branch": null, + "revision": "86d51ecee0bc0ebdb53fb69b11a24169a69097ba", + "version": "4.1.0" + } + }, + { + "package": "Commander", + "repositoryURL": "https://github.com/kylef/Commander.git", + "state": { + "branch": null, + "revision": "e5b50ad7b2e91eeb828393e89b03577b16be7db9", + "version": "0.8.0" + } + }, + { + "package": "HeliumLogger", + "repositoryURL": "https://github.com/IBM-Swift/HeliumLogger.git", + "state": { + "branch": null, + "revision": "779865e83149a59894b14950aa83f70b7e81bc27", + "version": "1.8.1" + } + }, + { + "package": "LoggerAPI", + "repositoryURL": "https://github.com/IBM-Swift/LoggerAPI.git", + "state": { + "branch": null, + "revision": "e29073bb7cecf3673e56bcb16180e8fd0cb091f6", + "version": "1.8.1" + } + }, + { + "package": "Result", + "repositoryURL": "https://github.com/antitypical/Result.git", + "state": { + "branch": null, + "revision": "2ca499ba456795616fbc471561ff1d963e6ae160", + "version": "4.1.0" + } + }, + { + "package": "Spectre", + "repositoryURL": "https://github.com/kylef/Spectre.git", + "state": { + "branch": null, + "revision": "f14ff47f45642aa5703900980b014c2e9394b6e5", + "version": "0.9.0" + } + }, + { + "package": "HTMLEntities", + "repositoryURL": "https://github.com/IBM-Swift/swift-html-entities.git", + "state": { + "branch": null, + "revision": "3b778b3ab061684db024eaf38c576887b42918aa", + "version": "3.0.13" + } + }, + { + "package": "Yaml", + "repositoryURL": "https://github.com/behrang/YamlSwift.git", + "state": { + "branch": null, + "revision": "287f5cab7da0d92eb947b5fd8151b203ae04a9a3", + "version": "3.4.4" + } + } + ] + }, + "version": 1 +} From f0c43701cce9ac8432221943f07962220758934c Mon Sep 17 00:00:00 2001 From: Matthias Buchetics Date: Mon, 23 Sep 2019 11:44:31 +0200 Subject: [PATCH 4/4] removed xcode preferences --- .../contents.xcworkspacedata | 7 --- .../xcshareddata/IDEWorkspaceChecks.plist | 8 ---- .../UserInterfaceState.xcuserstate | Bin 40003 -> 0 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 6 --- .../xcschemes/xcschememanagement.plist | 42 ------------------ 5 files changed, 63 deletions(-) delete mode 100644 .swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata delete mode 100644 .swiftpm/xcode/package.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist delete mode 100644 .swiftpm/xcode/package.xcworkspace/xcuserdata/matthias.xcuserdatad/UserInterfaceState.xcuserstate delete mode 100644 .swiftpm/xcode/package.xcworkspace/xcuserdata/matthias.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist delete mode 100644 .swiftpm/xcode/xcuserdata/matthias.xcuserdatad/xcschemes/xcschememanagement.plist diff --git a/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata b/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 919434a6..00000000 --- a/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/.swiftpm/xcode/package.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/.swiftpm/xcode/package.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d98100..00000000 --- a/.swiftpm/xcode/package.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/.swiftpm/xcode/package.xcworkspace/xcuserdata/matthias.xcuserdatad/UserInterfaceState.xcuserstate b/.swiftpm/xcode/package.xcworkspace/xcuserdata/matthias.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index a0371f38e64b3b61359c07d5d1377aefcc029c29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40003 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±p2o)6HX_5k#H{IO2Ur`KPUW} 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 - - diff --git a/.swiftpm/xcode/xcuserdata/matthias.xcuserdatad/xcschemes/xcschememanagement.plist b/.swiftpm/xcode/xcuserdata/matthias.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index 09f249a0..00000000 --- a/.swiftpm/xcode/xcuserdata/matthias.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,42 +0,0 @@ - - - - - SchemeUserState - - LicensePlist-Package.xcscheme_^#shared#^_ - - orderHint - 0 - - LicensePlistCore.xcscheme_^#shared#^_ - - orderHint - 1 - - license-plist.xcscheme_^#shared#^_ - - orderHint - 2 - - - SuppressBuildableAutocreation - - LicensePlistCore - - primary - - - LicensePlistTests - - primary - - - license-plist - - primary - - - - -