Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Read package.json into extension #232 #236

Merged
merged 4 commits into from
May 14, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
}
}