Skip to content

Commit c1982df

Browse files
committed
feat: expose field to configure run configuration environment
fixes #253
1 parent e452fa1 commit c1982df

15 files changed

+124
-21
lines changed

src/main/kotlin/com/emberjs/cli/EmberCli.kt

+4
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ class EmberCli(val project: Project, vararg val parameters: String) {
1111

1212
var workDirectory: String? = null
1313
var nodeInterpreter: String? = null
14+
var env: Map<String, String>? = null
1415

1516
private fun nodeCommandLine(): GeneralCommandLine {
1617
val interpreterRef = NodeJsInterpreterRef.create(nodeInterpreter)
@@ -39,6 +40,9 @@ class EmberCli(val project: Project, vararg val parameters: String) {
3940
}
4041

4142
return commandLine.also {
43+
if (env != null) {
44+
it.withEnvironment(env)
45+
}
4246
it.addParameters(*parameters)
4347
it.withWorkDirectory(workDirectory)
4448
}

src/main/kotlin/com/emberjs/configuration/EmberCommandLineState.kt

+5-4
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,16 @@ open class EmberCommandLineState(environment: ExecutionEnvironment) : CommandLin
1616
val argList = configuration.options.toCommandLineOptions()
1717

1818
val workingDirectory =
19-
// if module configured, use that as workDirectory
20-
configuration.module?.moduleFile?.parentModule?.path ?:
21-
environment.dataContext?.getData(LangDataKeys.MODULE)?.emberRoot?.path ?:
22-
environment.project.basePath
19+
// if module configured, use that as workDirectory
20+
configuration.module?.moduleFile?.parentModule?.path
21+
?: environment.dataContext?.getData(LangDataKeys.MODULE)?.emberRoot?.path
22+
?: environment.project.basePath
2323

2424
val cmd = EmberCli(environment.project, configuration.command, *argList)
2525
.apply {
2626
workDirectory = workingDirectory
2727
nodeInterpreter = configuration.nodeInterpreter
28+
env = configuration.env
2829
}
2930
.commandLine()
3031
.apply {

src/main/kotlin/com/emberjs/configuration/EmberConfiguration.kt

+1
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,5 @@ interface EmberConfiguration {
77
val options: EmberOptions
88
var module: Module?
99
var nodeInterpreter: String?
10+
var env: Map<String, String>?
1011
}

src/main/kotlin/com/emberjs/configuration/EmberConfigurationBase.kt

+7
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ abstract class EmberConfigurationBase(project: Project, factory: ConfigurationFa
1313
EmberConfiguration {
1414
override var module: Module? = null
1515
override var nodeInterpreter: String? = null
16+
override var env: Map<String, String>? = null
1617

1718
override fun writeExternal(element: Element) {
1819
super.writeExternal(element)
@@ -30,6 +31,11 @@ abstract class EmberConfigurationBase(project: Project, factory: ConfigurationFa
3031
is String -> ElementUtils.writeString(element, "node-interpreter", nodeInterpreter!!)
3132
else -> ElementUtils.removeField(element, "node-interpreter")
3233
}
34+
35+
when (env) {
36+
is Map -> ElementUtils.writeEnv(element, env!!)
37+
else -> ElementUtils.removeEnv(element)
38+
}
3339
}
3440

3541
override fun readExternal(element: Element) {
@@ -44,6 +50,7 @@ abstract class EmberConfigurationBase(project: Project, factory: ConfigurationFa
4450
ElementUtils.readString(element, "node-interpreter")?.let { elementNodeInterpreter ->
4551
nodeInterpreter = elementNodeInterpreter
4652
}
53+
ElementUtils.readEnv(element)?.let { env = it }
4754
}
4855

4956
}

src/main/kotlin/com/emberjs/configuration/OptionsField.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ abstract class OptionsField<T>(
55
val field: String,
66
val cmdlineOptionName: String
77
) {
8-
abstract var value : T
8+
abstract var value: T
99

1010
abstract fun writeTo(component: Any)
1111
abstract fun readFrom(component: Any)

src/main/kotlin/com/emberjs/configuration/serve/ui/EmberServeSettingsEditor.form

+16-2
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<grid id="27dc6" binding="myPanel" layout-manager="GridLayoutManager" row-count="3" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
44
<margin top="0" left="0" bottom="0" right="0"/>
55
<constraints>
6-
<xy x="20" y="20" width="659" height="463"/>
6+
<xy x="20" y="20" width="659" height="498"/>
77
</constraints>
88
<properties/>
99
<border type="none"/>
@@ -325,7 +325,7 @@
325325
</component>
326326
</children>
327327
</grid>
328-
<grid id="12771" layout-manager="GridLayoutManager" row-count="2" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
328+
<grid id="12771" layout-manager="GridLayoutManager" row-count="3" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
329329
<margin top="0" left="0" bottom="0" right="0"/>
330330
<constraints>
331331
<grid row="0" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
@@ -364,6 +364,20 @@
364364
<border type="none"/>
365365
<children/>
366366
</grid>
367+
<component id="700f8" class="javax.swing.JLabel">
368+
<constraints>
369+
<grid row="2" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
370+
</constraints>
371+
<properties>
372+
<text resource-bundle="com/emberjs/locale/EmberServeConfigurationEditor" key="environment.variables"/>
373+
</properties>
374+
</component>
375+
<component id="20402" class="com.intellij.execution.configuration.EnvironmentVariablesTextFieldWithBrowseButton" binding="myEnvVars">
376+
<constraints>
377+
<grid row="2" column="1" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
378+
</constraints>
379+
<properties/>
380+
</component>
367381
</children>
368382
</grid>
369383
</children>

src/main/kotlin/com/emberjs/configuration/serve/ui/EmberServeSettingsEditor.kt

+7
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import com.emberjs.configuration.serve.EmberServeConfiguration
44
import com.emberjs.configuration.serve.EmberServeOptions
55
import com.emberjs.project.EmberModuleType
66
import com.intellij.application.options.ModulesComboBox
7+
import com.intellij.execution.configuration.EnvironmentVariablesTextFieldWithBrowseButton
78
import com.intellij.javascript.nodejs.interpreter.NodeJsInterpreterField
89
import com.intellij.javascript.nodejs.interpreter.NodeJsInterpreterRef
910
import com.intellij.openapi.options.SettingsEditor
@@ -47,6 +48,7 @@ class EmberServeSettingsEditor(
4748
private var myModulesComboBox: ModulesComboBox? = null
4849
private var myNodeSettingsPanel: JPanel? = null
4950
private var myNodeInterpreterField: NodeJsInterpreterField? = null
51+
private var myEnvVars: EnvironmentVariablesTextFieldWithBrowseButton? = null
5052

5153
private val bundle: ResourceBundle = ResourceBundle.getBundle("com.emberjs.locale.EmberServeConfigurationEditor")
5254

@@ -88,6 +90,10 @@ class EmberServeSettingsEditor(
8890
is String -> NodeJsInterpreterRef.create(configuration.nodeInterpreter)
8991
else -> NodeJsInterpreterRef.createProjectRef()
9092
}
93+
94+
configuration.env?.let {
95+
myEnvVars?.envs = it
96+
}
9197
}
9298

9399
override fun applyEditorTo(configuration: EmberServeConfiguration) {
@@ -96,6 +102,7 @@ class EmberServeSettingsEditor(
96102
}
97103
configuration.module = myModulesComboBox?.selectedModule
98104
configuration.nodeInterpreter = myNodeInterpreterField?.interpreterRef?.referenceName
105+
configuration.env = myEnvVars?.envs
99106
}
100107

101108
@NotNull

src/main/kotlin/com/emberjs/configuration/test/EmberTestCommandLineState.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ import com.intellij.execution.configurations.RunConfiguration
99
import com.intellij.execution.process.ProcessHandler
1010
import com.intellij.execution.runners.ExecutionEnvironment
1111
import com.intellij.execution.runners.ProgramRunner
12-
import com.intellij.execution.testframework.sm.SMTestRunnerConnectionUtil
1312
import com.intellij.execution.testframework.autotest.ToggleAutoTestAction
13+
import com.intellij.execution.testframework.sm.SMTestRunnerConnectionUtil
1414
import com.intellij.execution.testframework.sm.SMTestRunnerConnectionUtil.createAndAttachConsole
1515

1616
class EmberTestCommandLineState(environment: ExecutionEnvironment) : EmberCommandLineState(environment) {

src/main/kotlin/com/emberjs/configuration/test/EmberTestConfiguration.kt

+3-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@ import com.emberjs.configuration.EmberConfigurationBase
44
import com.emberjs.configuration.test.ui.EmberTestSettingsEditor
55
import com.intellij.execution.ExecutionException
66
import com.intellij.execution.Executor
7-
import com.intellij.execution.configurations.*
7+
import com.intellij.execution.configurations.ConfigurationFactory
8+
import com.intellij.execution.configurations.RunConfiguration
9+
import com.intellij.execution.configurations.RunProfileState
810
import com.intellij.execution.runners.ExecutionEnvironment
911
import com.intellij.openapi.options.SettingsEditor
1012
import com.intellij.openapi.project.Project

src/main/kotlin/com/emberjs/configuration/test/EmberTestOptions.kt

+8-8
Original file line numberDiff line numberDiff line change
@@ -60,17 +60,17 @@ class EmberTestOptions : EmberOptions {
6060
.filter {
6161
// allow any fields that aren't LAUNCH, FILTER, MODULE
6262
!arrayOf("LAUNCH", "FILTER", "MODULE").contains(it.field) ||
63-
// allow any LAUNCH if LAUNCH_OPTION is CUSTOM
64-
it.field == "LAUNCH" && launchOption.value == LaunchType.CUSTOM.value ||
65-
// allow any FILTER if FILTER_OPTION is FILTER
66-
it.field =="FILTER" && filterOption.value == FilterType.FILTER.value ||
67-
// allow any MODULE if FILTER_OPTION is MODULE
68-
it.field =="MODULE" && filterOption.value == FilterType.MODULE.value
63+
// allow any LAUNCH if LAUNCH_OPTION is CUSTOM
64+
it.field == "LAUNCH" && launchOption.value == LaunchType.CUSTOM.value ||
65+
// allow any FILTER if FILTER_OPTION is FILTER
66+
it.field == "FILTER" && filterOption.value == FilterType.FILTER.value ||
67+
// allow any MODULE if FILTER_OPTION is MODULE
68+
it.field == "MODULE" && filterOption.value == FilterType.MODULE.value
6969
}
7070
.filter { optionsField ->
7171
optionsField.cmdlineOptionName.isNotEmpty() &&
72-
optionsField.value != optionsField.default &&
73-
optionsField.value.toString().isNotEmpty()
72+
optionsField.value != optionsField.default &&
73+
optionsField.value.toString().isNotEmpty()
7474
}
7575
.map { "--${it.cmdlineOptionName}=${it.value}" }
7676
.toTypedArray()

src/main/kotlin/com/emberjs/configuration/test/ui/EmberTestSettingsEditor.form

+16-2
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<grid id="27dc6" binding="myPanel" layout-manager="GridLayoutManager" row-count="4" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
44
<margin top="0" left="0" bottom="0" right="0"/>
55
<constraints>
6-
<xy x="20" y="20" width="560" height="641"/>
6+
<xy x="20" y="20" width="560" height="676"/>
77
</constraints>
88
<properties/>
99
<border type="none"/>
@@ -327,7 +327,7 @@
327327
</grid>
328328
</children>
329329
</grid>
330-
<grid id="74127" layout-manager="GridLayoutManager" row-count="2" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
330+
<grid id="74127" layout-manager="GridLayoutManager" row-count="3" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
331331
<margin top="0" left="0" bottom="0" right="0"/>
332332
<constraints>
333333
<grid row="0" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="1" fill="1" indent="0" use-parent-layout="false"/>
@@ -366,6 +366,20 @@
366366
<border type="none"/>
367367
<children/>
368368
</grid>
369+
<component id="5eca9" class="javax.swing.JLabel">
370+
<constraints>
371+
<grid row="2" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
372+
</constraints>
373+
<properties>
374+
<text resource-bundle="com/emberjs/locale/EmberTestConfigurationEditor" key="environment.variables"/>
375+
</properties>
376+
</component>
377+
<component id="a02b3" class="com.intellij.execution.configuration.EnvironmentVariablesTextFieldWithBrowseButton" binding="myEnvVars">
378+
<constraints>
379+
<grid row="2" column="1" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
380+
</constraints>
381+
<properties/>
382+
</component>
369383
</children>
370384
</grid>
371385
</children>

src/main/kotlin/com/emberjs/configuration/test/ui/EmberTestSettingsEditor.kt

+7
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import com.emberjs.configuration.test.LaunchType
77
import com.emberjs.configuration.utils.PublicStringAddEditDeleteListPanel
88
import com.emberjs.project.EmberModuleType
99
import com.intellij.application.options.ModulesComboBox
10+
import com.intellij.execution.configuration.EnvironmentVariablesTextFieldWithBrowseButton
1011
import com.intellij.javascript.nodejs.interpreter.NodeJsInterpreterField
1112
import com.intellij.javascript.nodejs.interpreter.NodeJsInterpreterRef
1213
import com.intellij.openapi.options.ConfigurationException
@@ -62,6 +63,7 @@ class EmberTestSettingsEditor(
6263
private var myModulesComboBox: ModulesComboBox? = null
6364
private var myNodeSettingsPanel: JPanel? = null
6465
private var myNodeInterpreterField: NodeJsInterpreterField? = null
66+
private var myEnvVars: EnvironmentVariablesTextFieldWithBrowseButton? = null
6567

6668
val bundle: ResourceBundle = ResourceBundle.getBundle("com.emberjs.locale.EmberTestConfigurationEditor")
6769
val launchers: MutableList<String> = mutableListOf()
@@ -128,6 +130,10 @@ class EmberTestSettingsEditor(
128130
is String -> NodeJsInterpreterRef.create(configuration.nodeInterpreter)
129131
else -> NodeJsInterpreterRef.createProjectRef()
130132
}
133+
134+
configuration.env?.let {
135+
myEnvVars?.envs = it
136+
}
131137
}
132138

133139
@Throws(ConfigurationException::class)
@@ -138,6 +144,7 @@ class EmberTestSettingsEditor(
138144

139145
configuration.module = myModulesComboBox?.selectedModule
140146
configuration.nodeInterpreter = myNodeInterpreterField?.interpreterRef?.referenceName
147+
configuration.env = myEnvVars?.envs
141148
}
142149

143150
@NotNull

src/main/kotlin/com/emberjs/configuration/utils/ElementUtils.kt

+44
Original file line numberDiff line numberDiff line change
@@ -46,5 +46,49 @@ class ElementUtils {
4646
}
4747
?.let { it.parent.removeContent(it) }
4848
}
49+
50+
/**
51+
* ENV uses the following structure:
52+
* <envs>
53+
* <env name="FOO" value="BAR" />
54+
* </envs>
55+
*/
56+
fun readEnv(element: Element): Map<String, String>? {
57+
val env = mutableMapOf<String, String>()
58+
val envs = element.children
59+
.find { it.name === "envs" } ?: return null
60+
61+
envs.let {
62+
it.children
63+
.filter { it.name === "env" }
64+
.forEach {
65+
env[it.getAttributeValue("name")] = it.getAttributeValue("value")
66+
}
67+
}
68+
69+
return env;
70+
}
71+
72+
fun removeEnv(element: Element) {
73+
element.children
74+
.find { it.name === "envs" }
75+
?.let { it.parentElement.removeContent(it) }
76+
}
77+
78+
fun writeEnv(element: Element, map: Map<String, String>) {
79+
val envs = org.jdom.Element("envs")
80+
81+
// do nothing if map is empty
82+
if (map.size == 0) return
83+
84+
map.forEach {
85+
val env = org.jdom.Element("env")
86+
env.setAttribute("name", it.key)
87+
env.setAttribute("value", it.value)
88+
envs.addContent(env)
89+
}
90+
91+
element.addContent(envs)
92+
}
4993
}
5094
}

src/main/resources/com/emberjs/locale/EmberServeConfigurationEditor.properties

+2-1
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,5 @@ proxy.transparentProxy=Transparent proxy:
2828

2929
configuration.title=Serve configuration:
3030

31-
node.interpreter=Node interpreter:
31+
node.interpreter=Node interpreter:
32+
environment.variables=Environment variables:

src/main/resources/com/emberjs/locale/EmberTestConfigurationEditor.properties

+2-1
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,5 @@ filter.option.filter=Filter
2929

3030
configuration.title=Test configuration:
3131

32-
node.interpreter=Node interpreter:
32+
node.interpreter=Node interpreter:
33+
environment.variables=Environment variables:

0 commit comments

Comments
 (0)