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 + ); + } +}