Skip to content

Commit

Permalink
Merge pull request #236 from node-gradle/packagejson-extension
Browse files Browse the repository at this point in the history
Read package.json into extension #232
  • Loading branch information
deepy authored May 14, 2022
2 parents d15f7ee + 12e2bd1 commit 876331d
Show file tree
Hide file tree
Showing 5 changed files with 168 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
67 changes: 67 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,67 @@
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
import org.gradle.util.GradleVersion

/**
* Provides a parsed view of package.json
*/
open class PackageJsonExtension(project: Project) {

/**
* Raw JsonNode returned by Jackson, this may be removed in a future release
*/
val node = project.objects.property<JsonNode>()

init {
if (GradleVersion.current() >= GradleVersion.version("6.1")) {
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() }

/**
* Get the text value of a given field
*/
fun get(name: String): String? {
return node.get().get(name)?.asText()
}

/**
* Get the boolean value of a given field
*/
fun getBoolean(name: String): Boolean? {
return node.get().get(name)?.asBoolean()
}

/**
* Get the text value of a field containing nested objects
*
* e.g. <pre>{ "outer": { "inner": "nested } }</pre>
*/
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,65 @@
//file:noinspection GroovyPointlessBoolean
package com.github.gradle.node

import com.github.gradle.AbstractProjectTest
import org.gradle.api.internal.provider.MissingValueException

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 missing attribute'() {
when:
temporaryFolder.newFile("package.json") << """
{ "name": "test", "version": "1.10.2", "private": false }
"""
project.apply plugin: 'com.github.node-gradle.node'
project.evaluate()
def ext = project.extensions.getByName('package.json') as PackageJsonExtension
ext.homepage.get() == null

then:
thrown(MissingValueException)
}

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"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.github.gradle.node

import com.github.gradle.AbstractIntegTest
import com.github.gradle.RunWithMultipleGradleVersions
import org.gradle.testkit.runner.TaskOutcome
import org.junit.Assume

@RunWithMultipleGradleVersions
class PackageJsonExtension_integTest extends AbstractIntegTest {

def 'check standard attribute'() {
given:
Assume.assumeTrue(isConfigurationCacheEnabled())
copyResources("fixtures/npm-env/")
copyResources("fixtures/env/")
createFile("build.gradle") << """
def nameProvider = project.extensions.getByName("${PackageJsonExtension.NAME}").name
tasks.register('printPackageJsonName') {
inputs.property('name', nameProvider)
doLast {
println nameProvider.get()
}
}
"""

when:
def result1 = build(":printPackageJsonName")
def result2 = build(":printPackageJsonName")

then:
result1.task(":printPackageJsonName").outcome == TaskOutcome.SUCCESS
result2.task(":printPackageJsonName").outcome == TaskOutcome.SUCCESS
}
}

0 comments on commit 876331d

Please sign in to comment.