diff --git a/resources/META-INF/plugin.xml b/resources/META-INF/plugin.xml
index 4837ddaf9..5e59edae9 100644
--- a/resources/META-INF/plugin.xml
+++ b/resources/META-INF/plugin.xml
@@ -657,6 +657,7 @@
+
diff --git a/resources/fileTemplates/internal/Magento Module Readme File MD.md.ft b/resources/fileTemplates/internal/Magento Module Readme File MD.md.ft
new file mode 100644
index 000000000..ecdb72f2d
--- /dev/null
+++ b/resources/fileTemplates/internal/Magento Module Readme File MD.md.ft
@@ -0,0 +1,10 @@
+# ${PACKAGE}_${MODULE_NAME} module
+
+
diff --git a/resources/fileTemplates/internal/Magento Module Readme File MD.md.html b/resources/fileTemplates/internal/Magento Module Readme File MD.md.html
new file mode 100644
index 000000000..144eaf961
--- /dev/null
+++ b/resources/fileTemplates/internal/Magento Module Readme File MD.md.html
@@ -0,0 +1,31 @@
+
+
+
+
+
+ Magento readme file for module.
+ |
+
+
+
+
+ Predefined variables will take the following values: |
+
+
+ ${PACKAGE} |
+ |
+ Module's package name. Also known as Vendor name. |
+
+
+ ${MODULE_NAME} |
+ |
+ Module's name. |
+
+
+
+
diff --git a/src/com/magento/idea/magento2plugin/actions/generation/data/ModuleReadmeMdData.java b/src/com/magento/idea/magento2plugin/actions/generation/data/ModuleReadmeMdData.java
new file mode 100644
index 000000000..f7d383cf4
--- /dev/null
+++ b/src/com/magento/idea/magento2plugin/actions/generation/data/ModuleReadmeMdData.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+package com.magento.idea.magento2plugin.actions.generation.data;
+
+import com.intellij.psi.PsiDirectory;
+import org.jetbrains.annotations.NotNull;
+
+public class ModuleReadmeMdData {
+
+ private final String packageName;
+ private final String moduleName;
+ private final PsiDirectory baseDir;
+
+ /**
+ * Constructor.
+ *
+ * @param packageName String
+ * @param moduleName String
+ * @param baseDir PsiDirectory
+ */
+ public ModuleReadmeMdData(
+ final @NotNull String packageName,
+ final @NotNull String moduleName,
+ final @NotNull PsiDirectory baseDir
+ ) {
+ this.packageName = packageName;
+ this.moduleName = moduleName;
+ this.baseDir = baseDir;
+ }
+
+ public @NotNull String getPackageName() {
+ return packageName;
+ }
+
+ public @NotNull String getModuleName() {
+ return moduleName;
+ }
+
+ public @NotNull PsiDirectory getBaseDir() {
+ return baseDir;
+ }
+}
diff --git a/src/com/magento/idea/magento2plugin/actions/generation/dialog/NewModuleDialog.form b/src/com/magento/idea/magento2plugin/actions/generation/dialog/NewModuleDialog.form
index 2ee53342c..6a811c41e 100644
--- a/src/com/magento/idea/magento2plugin/actions/generation/dialog/NewModuleDialog.form
+++ b/src/com/magento/idea/magento2plugin/actions/generation/dialog/NewModuleDialog.form
@@ -3,10 +3,10 @@
-
+
-
+
@@ -51,7 +51,7 @@
-
+
@@ -199,6 +199,14 @@
+
+
+
+
+
+
+
+
diff --git a/src/com/magento/idea/magento2plugin/actions/generation/dialog/NewModuleDialog.java b/src/com/magento/idea/magento2plugin/actions/generation/dialog/NewModuleDialog.java
index 407e4d99c..4217a8a5c 100644
--- a/src/com/magento/idea/magento2plugin/actions/generation/dialog/NewModuleDialog.java
+++ b/src/com/magento/idea/magento2plugin/actions/generation/dialog/NewModuleDialog.java
@@ -11,6 +11,7 @@
import com.intellij.psi.PsiFile;
import com.magento.idea.magento2plugin.actions.generation.NewModuleAction;
import com.magento.idea.magento2plugin.actions.generation.data.ModuleComposerJsonData;
+import com.magento.idea.magento2plugin.actions.generation.data.ModuleReadmeMdData;
import com.magento.idea.magento2plugin.actions.generation.data.ModuleRegistrationPhpData;
import com.magento.idea.magento2plugin.actions.generation.data.ModuleXmlData;
import com.magento.idea.magento2plugin.actions.generation.dialog.validator.annotation.FieldValidation;
@@ -19,6 +20,7 @@
import com.magento.idea.magento2plugin.actions.generation.dialog.validator.rule.NotEmptyRule;
import com.magento.idea.magento2plugin.actions.generation.dialog.validator.rule.StartWithNumberOrCapitalLetterRule;
import com.magento.idea.magento2plugin.actions.generation.generator.ModuleComposerJsonGenerator;
+import com.magento.idea.magento2plugin.actions.generation.generator.ModuleReadmeMdGenerator;
import com.magento.idea.magento2plugin.actions.generation.generator.ModuleRegistrationPhpGenerator;
import com.magento.idea.magento2plugin.actions.generation.generator.ModuleXmlGenerator;
import com.magento.idea.magento2plugin.indexes.ModuleIndex;
@@ -35,6 +37,7 @@
import java.util.List;
import java.util.Vector;
import javax.swing.JButton;
+import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JList;
@@ -101,6 +104,7 @@ public class NewModuleDialog extends AbstractDialog implements ListSelectionList
private JButton buttonOK;
private JButton buttonCancel;
+ private JCheckBox moduleReadmeMdCheckbox;
@NotNull
private final Project project;
@@ -191,6 +195,11 @@ private void generateFiles() {
if (registrationPhp == null) {
return;
}
+
+ if (isCreateModuleReadme()) {
+ generateReadmeMd();
+ }
+
generateModuleXml();
}
@@ -228,6 +237,14 @@ private void generateModuleXml() {
), project).generate(NewModuleAction.actionName, true);
}
+ private void generateReadmeMd() {
+ new ModuleReadmeMdGenerator(new ModuleReadmeMdData(
+ getPackageName(),
+ getModuleName(),
+ getBaseDir()
+ ), project).generate(NewModuleAction.actionName);
+ }
+
private PsiDirectory getBaseDir() {
if (detectedPackageName != null) {
return this.initialBaseDir.getParent();
@@ -319,6 +336,15 @@ public List getModuleDependencies() {
return moduleDependencies.getSelectedValuesList();
}
+ /**
+ * Getter for Module Readme Md Checkbox.
+ *
+ * @return Boolean
+ */
+ public Boolean isCreateModuleReadme() {
+ return this.moduleReadmeMdCheckbox.isSelected();
+ }
+
/**
* Open dialog.
*
diff --git a/src/com/magento/idea/magento2plugin/actions/generation/generator/ModuleReadmeMdGenerator.java b/src/com/magento/idea/magento2plugin/actions/generation/generator/ModuleReadmeMdGenerator.java
new file mode 100644
index 000000000..72c07614c
--- /dev/null
+++ b/src/com/magento/idea/magento2plugin/actions/generation/generator/ModuleReadmeMdGenerator.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+package com.magento.idea.magento2plugin.actions.generation.generator;
+
+import com.intellij.openapi.project.Project;
+import com.intellij.psi.PsiDirectory;
+import com.intellij.psi.PsiFile;
+import com.magento.idea.magento2plugin.actions.generation.data.ModuleReadmeMdData;
+import com.magento.idea.magento2plugin.actions.generation.generator.util.FileFromTemplateGenerator;
+import com.magento.idea.magento2plugin.magento.files.ModuleReadmeMdFile;
+import java.util.Properties;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+public class ModuleReadmeMdGenerator extends FileGenerator {
+
+ private final ModuleReadmeMdData moduleReadmeMdData;
+ private final FileFromTemplateGenerator fileFromTemplateGenerator;
+
+ /**
+ * Construct generator.
+ *
+ * @param moduleReadmeMdData ModuleReadmeFileData
+ * @param project Project
+ */
+ public ModuleReadmeMdGenerator(
+ final @NotNull ModuleReadmeMdData moduleReadmeMdData,
+ final Project project
+ ) {
+ super(project);
+ this.moduleReadmeMdData = moduleReadmeMdData;
+ this.fileFromTemplateGenerator = new FileFromTemplateGenerator(project);
+ }
+
+ /**
+ * Generate file.
+ *
+ * @param actionName String
+ *
+ * @return PsiFile
+ */
+ @Override
+ public PsiFile generate(final String actionName) {
+ final PsiDirectory moduleDir = resolveModuleRoot(moduleReadmeMdData);
+
+ return fileFromTemplateGenerator.generate(
+ new ModuleReadmeMdFile(),
+ getAttributes(),
+ moduleDir == null ? moduleReadmeMdData.getBaseDir() : moduleDir,
+ actionName
+ );
+ }
+
+ /**
+ * Fill template properties.
+ *
+ * @param attributes Properties
+ */
+ @Override
+ protected void fillAttributes(final Properties attributes) {
+ attributes.setProperty("PACKAGE", moduleReadmeMdData.getPackageName());
+ attributes.setProperty("MODULE_NAME", moduleReadmeMdData.getModuleName());
+ }
+
+ private @Nullable PsiDirectory resolveModuleRoot(final @NotNull ModuleReadmeMdData data) {
+ final PsiDirectory packageDir = data.getBaseDir().findSubdirectory(data.getPackageName());
+
+ return packageDir == null ? null : packageDir.findSubdirectory(data.getModuleName());
+ }
+}
diff --git a/src/com/magento/idea/magento2plugin/magento/files/ModuleReadmeMdFile.java b/src/com/magento/idea/magento2plugin/magento/files/ModuleReadmeMdFile.java
new file mode 100644
index 000000000..cd0d27b8f
--- /dev/null
+++ b/src/com/magento/idea/magento2plugin/magento/files/ModuleReadmeMdFile.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+package com.magento.idea.magento2plugin.magento.files;
+
+import com.intellij.lang.Language;
+import com.intellij.lang.html.HTMLLanguage;
+
+public class ModuleReadmeMdFile implements ModuleFileInterface {
+
+ public static final String FILE_NAME = "README.md";
+ public static final String TEMPLATE = "Magento Module Readme File MD";
+
+ @Override
+ public String getFileName() {
+ return FILE_NAME;
+ }
+
+ @Override
+ public String getTemplate() {
+ return TEMPLATE;
+ }
+
+ @Override
+ public Language getLanguage() {
+ return HTMLLanguage.INSTANCE;
+ }
+}
diff --git a/testData/actions/generation/generator/ModuleReadmeMdGenerator/generateModuleReadmeMdFile/README.md b/testData/actions/generation/generator/ModuleReadmeMdGenerator/generateModuleReadmeMdFile/README.md
new file mode 100644
index 000000000..084c0b6e3
--- /dev/null
+++ b/testData/actions/generation/generator/ModuleReadmeMdGenerator/generateModuleReadmeMdFile/README.md
@@ -0,0 +1,10 @@
+# Foo_Bar module
+
+
diff --git a/tests/com/magento/idea/magento2plugin/actions/generation/generator/BaseGeneratorTestCase.java b/tests/com/magento/idea/magento2plugin/actions/generation/generator/BaseGeneratorTestCase.java
index e7205e5d9..c713e54ac 100644
--- a/tests/com/magento/idea/magento2plugin/actions/generation/generator/BaseGeneratorTestCase.java
+++ b/tests/com/magento/idea/magento2plugin/actions/generation/generator/BaseGeneratorTestCase.java
@@ -53,6 +53,15 @@ protected void assertGeneratedFileIsCorrect(
assertEquals(expectedFile.getName(), resultFile.getName());
}
+ @SuppressWarnings({"PMD.JUnitAssertionsShouldIncludeMessage"})
+ protected void assertGeneratedFileIsCorrect(
+ final PsiFile expectedFile,
+ final PsiFile resultFile
+ ) {
+ assertEquals(expectedFile.getText(), resultFile.getText());
+ assertEquals(expectedFile.getName(), resultFile.getName());
+ }
+
protected PsiDirectory getProjectDirectory() {
return myFixture.getPsiManager().findDirectory(
GetProjectBasePath.execute(myFixture.getProject())
diff --git a/tests/com/magento/idea/magento2plugin/actions/generation/generator/ModuleReadmeMdGeneratorTest.java b/tests/com/magento/idea/magento2plugin/actions/generation/generator/ModuleReadmeMdGeneratorTest.java
new file mode 100644
index 000000000..d4c130cf8
--- /dev/null
+++ b/tests/com/magento/idea/magento2plugin/actions/generation/generator/ModuleReadmeMdGeneratorTest.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+package com.magento.idea.magento2plugin.actions.generation.generator;
+
+import com.intellij.psi.PsiFile;
+import com.magento.idea.magento2plugin.actions.generation.data.ModuleReadmeMdData;
+import com.magento.idea.magento2plugin.magento.files.ModuleReadmeMdFile;
+
+public final class ModuleReadmeMdGeneratorTest extends BaseGeneratorTestCase {
+
+ /**
+ * Test module README.md file generation.
+ */
+ public void testGenerateModuleReadmeMdFile() {
+ final PsiFile expectedFile = myFixture.configureByFile(
+ getFixturePath(ModuleReadmeMdFile.FILE_NAME)
+ );
+ final ModuleReadmeMdGenerator generator = new ModuleReadmeMdGenerator(
+ new ModuleReadmeMdData(
+ "Foo",
+ "Bar",
+ getProjectDirectory()
+ ),
+ myFixture.getProject()
+ );
+ final PsiFile generatedFile = generator.generate("test");
+
+ assertGeneratedFileIsCorrect(
+ expectedFile,
+ generatedFile
+ );
+ }
+}