diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 46baec3..3f7fcc3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,17 +13,20 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - java: [ '13' ] - scala: [ '2.13.10' ] + java: [ '17' ] + scala: [ '2.13.15' ] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Set up JDK - uses: actions/setup-java@v2 + uses: actions/setup-java@v4 with: - java-version: ${{ matrix.java }} - distribution: 'zulu' + distribution: temurin + java-version: ${{matrix.java}} + cache: sbt - name: print Java version run: java -version + - name: Setup sbt launcher + uses: sbt/setup-sbt@v1 - name: setup apibuilder config run: mkdir ~/.apibuilder && echo "[default]" > ~/.apibuilder/config - name: Build diff --git a/src/main/scala/io/apibuilder/validation/MultiService.scala b/src/main/scala/io/apibuilder/validation/MultiService.scala index 133dd76..64c01be 100644 --- a/src/main/scala/io/apibuilder/validation/MultiService.scala +++ b/src/main/scala/io/apibuilder/validation/MultiService.scala @@ -167,14 +167,20 @@ object MultiService { } } + /** + * Allow a client to read from for example s3 by providing a reader already constructed from the + * stream. + */ + def fromZipFileReader(reader: ZipFileReader): ValidatedNec[String, Seq[ApiBuilderService]] = { + val fileSorter = FileOrder(reader.entries.find(_.name.toLowerCase() == OrderByFileName).map(_.file)) + reader.entries + .filter { e => ZipFileReader.isJsonFile(e.name) } + .sortBy { e => fileSorter.sortOrder(e.name) } + .map { e => ApiBuilderService.fromFile(e.file) } + .sequence + } + private def servicesFromZip(url: String): ValidatedNec[String, Seq[ApiBuilderService]] = { - ZipFileReader.fromUrl(url).andThen { reader => - val fileSorter = FileOrder(reader.entries.find(_.name.toLowerCase() == OrderByFileName).map(_.file)) - reader.entries - .filter { e => ZipFileReader.isJsonFile(e.name) } - .sortBy { e => fileSorter.sortOrder(e.name) } - .map { e => ApiBuilderService.fromFile(e.file) } - .sequence - } + ZipFileReader.fromUrl(url).andThen(fromZipFileReader) } } diff --git a/src/test/scala/io/apibuilder/validation/MultiServiceZipSpec.scala b/src/test/scala/io/apibuilder/validation/MultiServiceZipSpec.scala index 3db5bf8..41b10e2 100644 --- a/src/test/scala/io/apibuilder/validation/MultiServiceZipSpec.scala +++ b/src/test/scala/io/apibuilder/validation/MultiServiceZipSpec.scala @@ -1,14 +1,15 @@ package io.apibuilder.validation -import java.io.File import io.apibuilder.builders.ApiBuilderServiceBuilders +import io.apibuilder.helpers._ import io.apibuilder.spec.v0.models.json._ import io.apibuilder.spec.v0.models.{Method, Service} import io.apibuilder.validation.zip.ZipFileBuilder -import io.apibuilder.helpers._ -import play.api.libs.json._ import org.scalatest.matchers.must.Matchers import org.scalatest.wordspec.AnyWordSpec +import play.api.libs.json._ + +import java.io.File class MultiServiceZipSpec extends AnyWordSpec with Matchers with ApiBuilderServiceBuilders @@ -60,9 +61,6 @@ class MultiServiceZipSpec extends AnyWordSpec with Matchers } "Able to download service from the internet" in { - expectValidNec { - MultiService.fromUrl("file:///tmp/specs/api.spec.billing.json") - } expectValidNec { MultiService.fromUrl("https://cdn.flow.io/util/lib-apibuilder/specs.zip") }