diff --git a/src/ExoRepo/YQ.class.st b/src/ExoRepo/YQ.class.st new file mode 100644 index 0000000..2424ca3 --- /dev/null +++ b/src/ExoRepo/YQ.class.st @@ -0,0 +1,53 @@ +" +The `External` tag is related on its dependency on other programming languages and frameworks, +though the dependency should be loaded by just loading a small binary with no dependencies. +" +Class { + #name : #YQ, + #superclass : #Object, + #category : #'ExoRepo-External' +} + +{ #category : #accessing } +YQ class >> binaryDownloadLinkFor: operativeSystem on: processor [ + | binaryName binaryDownloadData | + binaryName := 'yq_', operativeSystem , '_', processor. + binaryDownloadData := ((self lastReleaseData at: 'assets') + select: [:each | (each at: 'name') beginsWith: binaryName ]) first. + ^ binaryDownloadData at: 'browser_download_url' +] + +{ #category : #accessing } +YQ class >> binaryFile [ + "Starting with location on Arch Linux and its derivates. Multidistro and multiOS support should be added." + Smalltalk os isWindows ifFalse: [^ FileLocator root / 'usr/bin/yq']. + ^ FileLocator home / 'scoop/shims/yq.exe' +] + +{ #category : #accessing } +YQ class >> install [ + ^ self lastReleaseData +] + +{ #category : #accessing } +YQ class >> jsonToYaml: aDictionary [ + | jsonFile | + self binaryFile exists ifFalse: [ YQ install]. + jsonFile := MarkupFile exportAsFileOn: FileLocator temp / 'data.json' containing: aDictionary. + (Smalltalk os isUnix or: [ Smalltalk os isMacOS ]) + ifTrue: [ + OSSUnixSubprocess new + shellCommand: 'cat ', jsonFile fullName,' | yq -y'; + redirectStdout; + runAndWaitOnExitDo: [ :command :outString | + ^ outString + ]]. + Smalltalk os isWindows + ifTrue: [ ^ LibC resultOfCommand: 'yq -p=json ', jsonFile fullName ]. +] + +{ #category : #accessing } +YQ class >> lastReleaseData [ + ^ (STONJSON + fromString: 'https://api.github.com/repos/mikefarah/yq/releases' asUrl retrieveContents) first +]