Skip to content

Commit

Permalink
Read package.json into extension #232
Browse files Browse the repository at this point in the history
  • Loading branch information
deepy committed May 2, 2022
1 parent d15f7ee commit 87e0b34
Show file tree
Hide file tree
Showing 4 changed files with 99 additions and 0 deletions.
1 change: 1 addition & 0 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ repositories {
}

dependencies {
api("com.fasterxml.jackson.core:jackson-databind:2.13.2.2")
testImplementation(platform("org.junit:junit-bom:5.6.2"))
testImplementation("org.junit.jupiter:junit-jupiter-api")
testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine")
Expand Down
1 change: 1 addition & 0 deletions src/main/kotlin/com/github/gradle/node/NodePlugin.kt
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ class NodePlugin : Plugin<Project> {
override fun apply(project: Project) {
this.project = project
val nodeExtension = NodeExtension.create(project)
project.extensions.create<PackageJsonExtension>(PackageJsonExtension.NAME, project)
addGlobalTypes()
addTasks()
addNpmRule()
Expand Down
47 changes: 47 additions & 0 deletions src/main/kotlin/com/github/gradle/node/PackageJsonExtension.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package com.github.gradle.node

import com.fasterxml.jackson.databind.JsonNode
import com.fasterxml.jackson.databind.ObjectMapper
import org.gradle.api.Project
import org.gradle.kotlin.dsl.property


open class PackageJsonExtension(project: Project) {
val node = project.objects.property<JsonNode>()

init {
node.finalizeValueOnRead()
node.set(project.provider { project.file("package.json").let(ObjectMapper()::readTree) })
}

val name = project.provider { node.get().get("name").asText() }

val version = project.provider { node.get().get("version").asText() }

val description = project.provider { node.get().get("description").asText() }

val homepage = project.provider { node.get().get("homepage").asText() }

val license = project.provider { node.get().get("license").asText() }

val private = project.provider { node.get().get("private").asBoolean() }

fun get(name: String): String {
return node.get().get(name).asText()
}

fun getBoolean(name: String): Boolean {
return node.get().get(name).asBoolean()
}

fun get(vararg name: String): String {
return name.fold(node.get()) { acc, next -> acc.get(next) }.asText()
}

companion object {
/**
* Extension name in Gradle
*/
const val NAME = "package.json"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
//file:noinspection GroovyPointlessBoolean
package com.github.gradle.node

import com.github.gradle.AbstractProjectTest

class PackageJsonExtensionTest extends AbstractProjectTest {
def 'check standard attributes'() {
when:
temporaryFolder.newFile("package.json") << """
{ "name": "test", "version": "1.10.2", "private": false }
"""
project.apply plugin: 'com.github.node-gradle.node'
project.evaluate()

then:
def ext = project.extensions.getByName('package.json') as PackageJsonExtension
ext.name.get() == "test"
ext.version.get() == "1.10.2"
ext.private.get() == false
}

def 'get raw attributes'() {
when:
temporaryFolder.newFile("package.json") << """
{ "name": "test", "version": "1.10.2", "private": false }
"""
project.apply plugin: 'com.github.node-gradle.node'
project.evaluate()

then:
def ext = project.extensions.getByName('package.json') as PackageJsonExtension
ext.get("name") == "test"
ext.getBoolean("private") == false
}

def 'get nested attributes'() {
when:
temporaryFolder.newFile("package.json") << """
{
"upper": { "lower": { "end": "done" } }
}
"""
project.apply plugin: 'com.github.node-gradle.node'
project.evaluate()

then:
def ext = project.extensions.getByName('package.json') as PackageJsonExtension
ext.get("upper", "lower", "end") == "done"
}
}

0 comments on commit 87e0b34

Please sign in to comment.