From b7f91b9c4b16ab2d790911b40a2ce4ecc428d9fe Mon Sep 17 00:00:00 2001 From: Hugo Miguel Ferreira Date: Wed, 11 Dec 2019 17:32:45 +0000 Subject: [PATCH 01/15] Adding LifeCycle counting to the PostModifier. The CliSuite test is failing. --- .../META-INF/services/mdoc.PostModifier | 1 + .../scala/mdoc/docs/EvilplotModifier.scala | 11 ++++ .../scala/mdoc/docs/LifeCycleModifier.scala | 19 +++++++ mdoc/src/main/scala/mdoc/PostModifier.scala | 8 ++- .../scala/mdoc/internal/cli/MainOps.scala | 3 ++ .../mdoc/internal/markdown/Processor.scala | 2 + .../META-INF/services/mdoc.PostModifier | 2 + .../tests/markdown/EvilplotPostModifier.scala | 8 +++ .../tests/markdown/EvilplotPostModifier.scala | 11 ++++ .../tests/markdown/PostModifierSuite.scala | 20 +++++++ .../tests/markdown/EvilplotPostModifier.scala | 9 ++++ .../src/test/scala/tests/cli/CliSuite.scala | 42 +++++++++++++++ .../tests/markdown/BulletPostModifier.scala | 10 ++++ .../tests/markdown/LifeCycleModifier.scala | 53 +++++++++++++++++++ 14 files changed, 198 insertions(+), 1 deletion(-) create mode 100644 mdoc-docs/src/main/scala/mdoc/docs/LifeCycleModifier.scala create mode 100644 tests/unit/src/test/scala/tests/markdown/LifeCycleModifier.scala diff --git a/mdoc-docs/src/main/resources/META-INF/services/mdoc.PostModifier b/mdoc-docs/src/main/resources/META-INF/services/mdoc.PostModifier index eaf64a23e..b1ee8407f 100644 --- a/mdoc-docs/src/main/resources/META-INF/services/mdoc.PostModifier +++ b/mdoc-docs/src/main/resources/META-INF/services/mdoc.PostModifier @@ -1 +1,2 @@ mdoc.docs.EvilplotModifier +mdoc.docs.LifeCycleModifier diff --git a/mdoc-docs/src/main/scala/mdoc/docs/EvilplotModifier.scala b/mdoc-docs/src/main/scala/mdoc/docs/EvilplotModifier.scala index 31e38745e..b1311a0c8 100644 --- a/mdoc-docs/src/main/scala/mdoc/docs/EvilplotModifier.scala +++ b/mdoc-docs/src/main/scala/mdoc/docs/EvilplotModifier.scala @@ -3,7 +3,10 @@ package mdoc.docs import com.cibo.evilplot.geometry.Drawable import java.nio.file.Files import java.nio.file.Paths + import mdoc._ +import mdoc.internal.cli.{Exit, Settings} + import scala.meta.inputs.Position class EvilplotModifier extends PostModifier { @@ -36,4 +39,12 @@ class EvilplotModifier extends PostModifier { "" } } + + override def onStart(settings: Settings): Unit = () + + override def preProcess(ctx: PostModifierContext): Unit = () + + override def postProcess(ctx: PostModifierContext): Unit = () + + override def onExit(exit: Exit): Unit = () } diff --git a/mdoc-docs/src/main/scala/mdoc/docs/LifeCycleModifier.scala b/mdoc-docs/src/main/scala/mdoc/docs/LifeCycleModifier.scala new file mode 100644 index 000000000..96fc92cc8 --- /dev/null +++ b/mdoc-docs/src/main/scala/mdoc/docs/LifeCycleModifier.scala @@ -0,0 +1,19 @@ +package mdoc.docs + +import mdoc._ +import mdoc.internal.cli.{Exit, Settings} + +class LifeCycleModifier extends PostModifier { + val name = "lifecycle" + def process(ctx: PostModifierContext): String = { + "NOT IMPLEMENTED" + } + + override def onStart(settings: Settings): Unit = () + + override def preProcess(ctx: PostModifierContext): Unit = () + + override def postProcess(ctx: PostModifierContext): Unit = () + + override def onExit(exit: Exit): Unit = () +} diff --git a/mdoc/src/main/scala/mdoc/PostModifier.scala b/mdoc/src/main/scala/mdoc/PostModifier.scala index 9ec3053ee..6abed5dd7 100644 --- a/mdoc/src/main/scala/mdoc/PostModifier.scala +++ b/mdoc/src/main/scala/mdoc/PostModifier.scala @@ -1,11 +1,13 @@ package mdoc import java.util.ServiceLoader -import mdoc.internal.cli.Settings + +import mdoc.internal.cli.{Exit, Settings} import metaconfig.ConfDecoder import metaconfig.ConfEncoder import metaconfig.ConfError import metaconfig.generic.Surface + import scala.meta.inputs.Input import scala.meta.io.AbsolutePath import scala.collection.JavaConverters._ @@ -13,7 +15,11 @@ import scala.meta.io.RelativePath trait PostModifier { val name: String + def onStart(settings: Settings): Unit + def preProcess(ctx: PostModifierContext): Unit def process(ctx: PostModifierContext): String + def postProcess(ctx: PostModifierContext): Unit + def onExit(exit: Exit): Unit } object PostModifier { diff --git a/mdoc/src/main/scala/mdoc/internal/cli/MainOps.scala b/mdoc/src/main/scala/mdoc/internal/cli/MainOps.scala index 4c5fc3974..e2be5d7e3 100644 --- a/mdoc/src/main/scala/mdoc/internal/cli/MainOps.scala +++ b/mdoc/src/main/scala/mdoc/internal/cli/MainOps.scala @@ -146,6 +146,7 @@ final class MainOps( if (settings.watch) { startLivereload() } + context.settings.postModifiers.foreach(_.onStart(settings)) val isOk = generateCompleteSite() if (settings.isFileWatching) { waitingForFileChanges() @@ -153,6 +154,8 @@ final class MainOps( // exit code doesn't matter when file watching Exit.success } else { + context.settings.postModifiers.foreach( e => println(s"mod 2 = $e")) + context.settings.postModifiers.foreach(_.onExit(isOk)) isOk } } diff --git a/mdoc/src/main/scala/mdoc/internal/markdown/Processor.scala b/mdoc/src/main/scala/mdoc/internal/markdown/Processor.scala index 23e61eb69..337f5e461 100644 --- a/mdoc/src/main/scala/mdoc/internal/markdown/Processor.scala +++ b/mdoc/src/main/scala/mdoc/internal/markdown/Processor.scala @@ -171,7 +171,9 @@ class Processor(implicit ctx: Context) { inputFile, ctx.settings ) + modifier.preProcess(postCtx) val postRender = modifier.process(postCtx) + modifier.postProcess(postCtx) replaceNodeWithText(doc, block, postRender) case m: Modifier.Builtin => if (m.isPassthrough) { diff --git a/tests/unit/src/test/resources/META-INF/services/mdoc.PostModifier b/tests/unit/src/test/resources/META-INF/services/mdoc.PostModifier index d806d0ae8..7bf54ea85 100644 --- a/tests/unit/src/test/resources/META-INF/services/mdoc.PostModifier +++ b/tests/unit/src/test/resources/META-INF/services/mdoc.PostModifier @@ -1,2 +1,4 @@ tests.markdown.EvilplotPostModifier tests.markdown.BulletPostModifier +tests.markdown.LifeCycleModifier + diff --git a/tests/unit/src/test/scala-2.11/tests/markdown/EvilplotPostModifier.scala b/tests/unit/src/test/scala-2.11/tests/markdown/EvilplotPostModifier.scala index 127f1b7b2..2b2f12284 100644 --- a/tests/unit/src/test/scala-2.11/tests/markdown/EvilplotPostModifier.scala +++ b/tests/unit/src/test/scala-2.11/tests/markdown/EvilplotPostModifier.scala @@ -6,4 +6,12 @@ import mdoc.PostModifierContext class EvilplotPostModifier extends PostModifier { val name = "evilplot" def process(ctx: PostModifierContext): String = "" + + override def onStart(ctx: PostModifierContext): Unit = () + + override def preProcess(ctx: PostModifierContext): Unit = () + + override def postProcess(ctx: PostModifierContext): Unit = () + + override def onExit(ctx: PostModifierContext): Unit = () } diff --git a/tests/unit/src/test/scala-2.12/tests/markdown/EvilplotPostModifier.scala b/tests/unit/src/test/scala-2.12/tests/markdown/EvilplotPostModifier.scala index bfd3e3191..8514e3312 100644 --- a/tests/unit/src/test/scala-2.12/tests/markdown/EvilplotPostModifier.scala +++ b/tests/unit/src/test/scala-2.12/tests/markdown/EvilplotPostModifier.scala @@ -2,8 +2,10 @@ package tests.markdown import com.cibo.evilplot.geometry.Drawable import java.nio.file.Files + import mdoc.PostModifier import mdoc.PostModifierContext +import mdoc.internal.cli.{Exit, Settings} class EvilplotPostModifier extends PostModifier { val name = "evilplot" @@ -28,4 +30,13 @@ class EvilplotPostModifier extends PostModifier { "" } } + + override def onStart(settings: Settings): Unit = () + + override def preProcess(ctx: PostModifierContext): Unit = () + + override def postProcess(ctx: PostModifierContext): Unit = () + + override def onExit(exit: Exit): Unit = () + } diff --git a/tests/unit/src/test/scala-2.12/tests/markdown/PostModifierSuite.scala b/tests/unit/src/test/scala-2.12/tests/markdown/PostModifierSuite.scala index 3f7be5aac..34cb6ea39 100644 --- a/tests/unit/src/test/scala-2.12/tests/markdown/PostModifierSuite.scala +++ b/tests/unit/src/test/scala-2.12/tests/markdown/PostModifierSuite.scala @@ -53,4 +53,24 @@ class PostModifierSuite extends BaseMarkdownSuite { "error: expected int runtime value. Obtained message" ) + check( + "lifecycle-1", + """ + |```scala mdoc:lifecycle + |val x = "message" + |``` + """.stripMargin, + "numberOfStarts = 0 ; numberOfExists = 0 ; numberOfPreProcess = 1 ; numberOfPostProcess = 0" + ) + + check( + "lifecycle-2", + """ + |```scala mdoc:lifecycle + |val x = "message" + |``` + """.stripMargin, + "numberOfStarts = 0 ; numberOfExists = 0 ; numberOfPreProcess = 2 ; numberOfPostProcess = 1" + ) + } diff --git a/tests/unit/src/test/scala-2.13/tests/markdown/EvilplotPostModifier.scala b/tests/unit/src/test/scala-2.13/tests/markdown/EvilplotPostModifier.scala index 127f1b7b2..6c7bd75df 100644 --- a/tests/unit/src/test/scala-2.13/tests/markdown/EvilplotPostModifier.scala +++ b/tests/unit/src/test/scala-2.13/tests/markdown/EvilplotPostModifier.scala @@ -2,8 +2,17 @@ package tests.markdown import mdoc.PostModifier import mdoc.PostModifierContext +import mdoc.internal.cli.{Exit, Settings} class EvilplotPostModifier extends PostModifier { val name = "evilplot" def process(ctx: PostModifierContext): String = "" + + override def onStart(settings: Settings): Unit = () + + override def preProcess(ctx: PostModifierContext): Unit = () + + override def postProcess(ctx: PostModifierContext): Unit = () + + override def onExit(exit: Exit): Unit = () } diff --git a/tests/unit/src/test/scala/tests/cli/CliSuite.scala b/tests/unit/src/test/scala/tests/cli/CliSuite.scala index f13a03071..b860ad07c 100644 --- a/tests/unit/src/test/scala/tests/cli/CliSuite.scala +++ b/tests/unit/src/test/scala/tests/cli/CliSuite.scala @@ -1,7 +1,9 @@ package tests.cli import java.nio.file.Files + import mdoc.internal.BuildInfo +import tests.markdown.LifeCycleModifier class CliSuite extends BaseCliSuite { @@ -191,4 +193,44 @@ class CliSuite extends BaseCliSuite { |""".stripMargin ) + checkCli( + "lifeCycle", + """ + |/file1.md + |# file 1 + |One + |```scala mdoc:lifecycle + |val x1 = 1 + |``` + |/file2.md + |# file 2 + |Two + |```scala mdoc:lifecycle + |val x2 = 2 + |``` + | """.stripMargin, + """ + |/file1.md + |# file 1 + |One + |numberOfStarts = 1 ; numberOfExists = 0 ; numberOfPreProcess = 1 ; numberOfPostProcess = 0 + |/file2.md + |# file 2 + |Two + |numberOfStarts = 1 ; numberOfExists = 0 ; numberOfPreProcess = 2 ; numberOfPostProcess = 1 + """.stripMargin, // did not generate index.md + setup = { fixture => + println(s"fixture = $fixture") + }, + onStdout = { out => + assert(out.contains("Compiling 2 files to")) + assert(out.contains("Compiled in")) + assert(out.contains("(0 errors)")) + //assert( LifeCycleModifier.numberOfExists == 1) + println(s"?????????????????????????????????? $LifeCycleModifier") + println(LifeCycleModifier.numberOfExists) + } + ) + + } diff --git a/tests/unit/src/test/scala/tests/markdown/BulletPostModifier.scala b/tests/unit/src/test/scala/tests/markdown/BulletPostModifier.scala index 28a2710f0..085174e35 100644 --- a/tests/unit/src/test/scala/tests/markdown/BulletPostModifier.scala +++ b/tests/unit/src/test/scala/tests/markdown/BulletPostModifier.scala @@ -2,6 +2,7 @@ package tests.markdown import mdoc.PostModifier import mdoc.PostModifierContext +import mdoc.internal.cli.{Exit, Settings} class BulletPostModifier extends PostModifier { val name = "bullet" @@ -14,4 +15,13 @@ class BulletPostModifier extends PostModifier { "" } } + + override def onStart(settings: Settings): Unit = () + + override def preProcess(ctx: PostModifierContext): Unit = () + + override def postProcess(ctx: PostModifierContext): Unit = () + + override def onExit(exit: Exit): Unit = () + } diff --git a/tests/unit/src/test/scala/tests/markdown/LifeCycleModifier.scala b/tests/unit/src/test/scala/tests/markdown/LifeCycleModifier.scala new file mode 100644 index 000000000..63ca851cb --- /dev/null +++ b/tests/unit/src/test/scala/tests/markdown/LifeCycleModifier.scala @@ -0,0 +1,53 @@ +package tests.markdown + +import java.nio.file.Paths + +import mdoc._ +import mdoc.internal.cli.{Exit, Settings} + +object LifeCycleModifier { + var numberOfStarts = 0 + var numberOfExists = 0 + var numberOfPreProcess = 0 + var numberOfPostProcess = 0 +} + +class LifeCycleModifier extends PostModifier { + val name = "lifecycle" + //val c = LifeCycleModifier + var numberOfStarts = 0 + var numberOfExists = 0 + var numberOfPreProcess = 0 + var numberOfPostProcess = 0 + + def process(ctx: PostModifierContext): String = { + val relpath = Paths.get(ctx.info) + val out = ctx.outputFile.toNIO.getParent.resolve(relpath) + //val tmp = s"numberOfStarts = ${c.numberOfStarts} ; numberOfExists = ${c.numberOfExists} ; numberOfPreProcess = ${c.numberOfPreProcess} ; numberOfPostProcess = ${c.numberOfPostProcess}" + println(s"this = $this count @ $LifeCycleModifier") + val tmp = s"numberOfStarts = ${numberOfStarts} ; numberOfExists = ${numberOfExists} ; numberOfPreProcess = ${numberOfPreProcess} ; numberOfPostProcess = ${numberOfPostProcess}" + println(tmp) + tmp + } + + /* + override def onStart(settings: Settings): Unit = { c.numberOfStarts += 1 } + + override def preProcess(ctx: PostModifierContext): Unit = { c.numberOfPreProcess += 1} + + override def postProcess(ctx: PostModifierContext): Unit = { c.numberOfPostProcess += 1 } + + override def onExit(exit: Exit): Unit = { c.numberOfExists += 1} + */ + + override def onStart(settings: Settings): Unit = { numberOfStarts += 1 } + + override def preProcess(ctx: PostModifierContext): Unit = { numberOfPreProcess += 1} + + override def postProcess(ctx: PostModifierContext): Unit = { numberOfPostProcess += 1 } + + override def onExit(exit: Exit): Unit = { + numberOfExists += 1 + println(s"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! $this = $numberOfExists") + } +} From 898a744473eccdd3fbea9f44cbc30ce583b24490 Mon Sep 17 00:00:00 2001 From: Hugo Miguel Ferreira Date: Thu, 12 Dec 2019 17:06:42 +0000 Subject: [PATCH 02/15] Adding LifeCycle counting to the PostModifier. Added tests to 2 test suites. Added some documentation. --- docs/modifiers.md | 13 +++++ .../scala/mdoc/docs/LifeCycleModifier.scala | 41 +++++++++++++-- .../scala/mdoc/internal/cli/MainOps.scala | 1 - .../tests/markdown/PostModifierSuite.scala | 4 +- .../src/test/scala/tests/cli/CliSuite.scala | 16 +++--- .../tests/markdown/LifeCycleModifier.scala | 51 +++++++++---------- 6 files changed, 86 insertions(+), 40 deletions(-) diff --git a/docs/modifiers.md b/docs/modifiers.md index 99cade539..639597b33 100644 --- a/docs/modifiers.md +++ b/docs/modifiers.md @@ -301,6 +301,19 @@ val message = "hello world!" ``` ```` +In addition to the `process` method, the `PostModifier` trait also has several +life-cycle methods that signal when a `PostModifier` instance: +* Has started for the first time (`onStart`) when MDoc is launched; +* Just before compilation and processing occurs (`preProcess`) on each source +document file; +* Just after compilation and processing has finished (`postProcess`) on each +source document file; +* Has finished after processing the last source document file (`onExit`) +before MDoc terminates. +These methods can be used to initialize and deactivate resources required by +the `PostModifier` instances. + + ## StringModifier A `StringModifier` is a custom modifier that processes the plain text contents diff --git a/mdoc-docs/src/main/scala/mdoc/docs/LifeCycleModifier.scala b/mdoc-docs/src/main/scala/mdoc/docs/LifeCycleModifier.scala index 96fc92cc8..7220ae5f4 100644 --- a/mdoc-docs/src/main/scala/mdoc/docs/LifeCycleModifier.scala +++ b/mdoc-docs/src/main/scala/mdoc/docs/LifeCycleModifier.scala @@ -3,17 +3,48 @@ package mdoc.docs import mdoc._ import mdoc.internal.cli.{Exit, Settings} +/** + * Global counter used to test the [[mdoc.Main]] process counting. + */ +object LifeCycleCounter { + val numberOfStarts: ThreadLocal[Integer] = ThreadLocal.withInitial( () => 0 ) + val numberOfExists: ThreadLocal[Integer] = ThreadLocal.withInitial( () => 0 ) +} + class LifeCycleModifier extends PostModifier { val name = "lifecycle" + + // Starts and stops per instance + var numberOfStarts = 0 + var numberOfExists = 0 + // Pre and post processing per instance + var numberOfPreProcess = 0 + var numberOfPostProcess = 0 + def process(ctx: PostModifierContext): String = { - "NOT IMPLEMENTED" + // Used for checking the counting + s"numberOfStarts = $numberOfStarts ; numberOfExists = $numberOfExists ; numberOfPreProcess = $numberOfPreProcess ; numberOfPostProcess = $numberOfPostProcess" } - override def onStart(settings: Settings): Unit = () + /** + * This is called once when the [[mdoc.Main]] process starts + * @param settings CLI or API settings used by mdoc + */ + override def onStart(settings: Settings): Unit = { + numberOfStarts += 1 + LifeCycleCounter.numberOfStarts.set(LifeCycleCounter.numberOfStarts.get() + 1) + } - override def preProcess(ctx: PostModifierContext): Unit = () + override def preProcess(ctx: PostModifierContext): Unit = { numberOfPreProcess += 1} - override def postProcess(ctx: PostModifierContext): Unit = () + override def postProcess(ctx: PostModifierContext): Unit = { numberOfPostProcess += 1 } - override def onExit(exit: Exit): Unit = () + /** + * This is called once when the [[mdoc.Main]] process finsihes + * @param exit is the exit code returned by mdoc's processing + */ + override def onExit(exit: Exit): Unit = { + numberOfExists += 1 + LifeCycleCounter.numberOfExists.set(LifeCycleCounter.numberOfExists.get() + 1) + } } diff --git a/mdoc/src/main/scala/mdoc/internal/cli/MainOps.scala b/mdoc/src/main/scala/mdoc/internal/cli/MainOps.scala index e2be5d7e3..36d709250 100644 --- a/mdoc/src/main/scala/mdoc/internal/cli/MainOps.scala +++ b/mdoc/src/main/scala/mdoc/internal/cli/MainOps.scala @@ -154,7 +154,6 @@ final class MainOps( // exit code doesn't matter when file watching Exit.success } else { - context.settings.postModifiers.foreach( e => println(s"mod 2 = $e")) context.settings.postModifiers.foreach(_.onExit(isOk)) isOk } diff --git a/tests/unit/src/test/scala-2.12/tests/markdown/PostModifierSuite.scala b/tests/unit/src/test/scala-2.12/tests/markdown/PostModifierSuite.scala index 34cb6ea39..56fa88d81 100644 --- a/tests/unit/src/test/scala-2.12/tests/markdown/PostModifierSuite.scala +++ b/tests/unit/src/test/scala-2.12/tests/markdown/PostModifierSuite.scala @@ -63,6 +63,8 @@ class PostModifierSuite extends BaseMarkdownSuite { "numberOfStarts = 0 ; numberOfExists = 0 ; numberOfPreProcess = 1 ; numberOfPostProcess = 0" ) + // Process counts are per PostModifier instance, starts and exists per mdoc.Main process + // Because each test runs its own mdoc.Main process, the process counts are the same check( "lifecycle-2", """ @@ -70,7 +72,7 @@ class PostModifierSuite extends BaseMarkdownSuite { |val x = "message" |``` """.stripMargin, - "numberOfStarts = 0 ; numberOfExists = 0 ; numberOfPreProcess = 2 ; numberOfPostProcess = 1" + "numberOfStarts = 0 ; numberOfExists = 0 ; numberOfPreProcess = 1 ; numberOfPostProcess = 0" ) } diff --git a/tests/unit/src/test/scala/tests/cli/CliSuite.scala b/tests/unit/src/test/scala/tests/cli/CliSuite.scala index b860ad07c..102816f34 100644 --- a/tests/unit/src/test/scala/tests/cli/CliSuite.scala +++ b/tests/unit/src/test/scala/tests/cli/CliSuite.scala @@ -3,7 +3,7 @@ package tests.cli import java.nio.file.Files import mdoc.internal.BuildInfo -import tests.markdown.LifeCycleModifier +import tests.markdown.{LifeCycleCounter, LifeCycleModifier} class CliSuite extends BaseCliSuite { @@ -218,17 +218,21 @@ class CliSuite extends BaseCliSuite { |# file 2 |Two |numberOfStarts = 1 ; numberOfExists = 0 ; numberOfPreProcess = 2 ; numberOfPostProcess = 1 - """.stripMargin, // did not generate index.md + """.stripMargin, // process counts per PostModifier instance, starts and exists per mdoc.Main process setup = { fixture => - println(s"fixture = $fixture") + // Global thread local counter updated by all mdoc.Main process + // All tests in this test suite run sequentially but change the counter + // So make sure we start anew for this test + LifeCycleCounter.numberOfStarts.set(0) + LifeCycleCounter.numberOfExists.set(0) }, onStdout = { out => assert(out.contains("Compiling 2 files to")) assert(out.contains("Compiled in")) assert(out.contains("(0 errors)")) - //assert( LifeCycleModifier.numberOfExists == 1) - println(s"?????????????????????????????????? $LifeCycleModifier") - println(LifeCycleModifier.numberOfExists) + // Should start and stop one only once in this test (several times for test-suite) + assert( LifeCycleCounter.numberOfExists.get() == 1) + assert( LifeCycleCounter.numberOfStarts.get() == 1) } ) diff --git a/tests/unit/src/test/scala/tests/markdown/LifeCycleModifier.scala b/tests/unit/src/test/scala/tests/markdown/LifeCycleModifier.scala index 63ca851cb..a1d760378 100644 --- a/tests/unit/src/test/scala/tests/markdown/LifeCycleModifier.scala +++ b/tests/unit/src/test/scala/tests/markdown/LifeCycleModifier.scala @@ -1,53 +1,50 @@ package tests.markdown -import java.nio.file.Paths - import mdoc._ import mdoc.internal.cli.{Exit, Settings} -object LifeCycleModifier { - var numberOfStarts = 0 - var numberOfExists = 0 - var numberOfPreProcess = 0 - var numberOfPostProcess = 0 +/** + * Global counter used to test the [[mdoc.Main]] process counting. + */ +object LifeCycleCounter { + val numberOfStarts: ThreadLocal[Integer] = ThreadLocal.withInitial( () => 0 ) + val numberOfExists: ThreadLocal[Integer] = ThreadLocal.withInitial( () => 0 ) } class LifeCycleModifier extends PostModifier { val name = "lifecycle" - //val c = LifeCycleModifier + + // Starts and stops per instance var numberOfStarts = 0 var numberOfExists = 0 + // Pre and post processing per instance var numberOfPreProcess = 0 var numberOfPostProcess = 0 def process(ctx: PostModifierContext): String = { - val relpath = Paths.get(ctx.info) - val out = ctx.outputFile.toNIO.getParent.resolve(relpath) - //val tmp = s"numberOfStarts = ${c.numberOfStarts} ; numberOfExists = ${c.numberOfExists} ; numberOfPreProcess = ${c.numberOfPreProcess} ; numberOfPostProcess = ${c.numberOfPostProcess}" - println(s"this = $this count @ $LifeCycleModifier") - val tmp = s"numberOfStarts = ${numberOfStarts} ; numberOfExists = ${numberOfExists} ; numberOfPreProcess = ${numberOfPreProcess} ; numberOfPostProcess = ${numberOfPostProcess}" - println(tmp) - tmp + // Used for checking the counting + s"numberOfStarts = $numberOfStarts ; numberOfExists = $numberOfExists ; numberOfPreProcess = $numberOfPreProcess ; numberOfPostProcess = $numberOfPostProcess" } - /* - override def onStart(settings: Settings): Unit = { c.numberOfStarts += 1 } - - override def preProcess(ctx: PostModifierContext): Unit = { c.numberOfPreProcess += 1} - - override def postProcess(ctx: PostModifierContext): Unit = { c.numberOfPostProcess += 1 } - - override def onExit(exit: Exit): Unit = { c.numberOfExists += 1} - */ - - override def onStart(settings: Settings): Unit = { numberOfStarts += 1 } + /** + * This is called once when the [[mdoc.Main]] process starts + * @param settings CLI or API settings used by mdoc + */ + override def onStart(settings: Settings): Unit = { + numberOfStarts += 1 + LifeCycleCounter.numberOfStarts.set(LifeCycleCounter.numberOfStarts.get() + 1) + } override def preProcess(ctx: PostModifierContext): Unit = { numberOfPreProcess += 1} override def postProcess(ctx: PostModifierContext): Unit = { numberOfPostProcess += 1 } + /** + * This is called once when the [[mdoc.Main]] process finsihes + * @param exit is the exit code returned by mdoc's processing + */ override def onExit(exit: Exit): Unit = { numberOfExists += 1 - println(s"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! $this = $numberOfExists") + LifeCycleCounter.numberOfExists.set(LifeCycleCounter.numberOfExists.get() + 1) } } From e093bdc21de1c9029d5be9b15fc5c1eadc34aef6 Mon Sep 17 00:00:00 2001 From: Hugo Miguel Ferreira Date: Fri, 13 Dec 2019 13:27:55 +0000 Subject: [PATCH 03/15] Corrected LifeCycle PostModifier tests. Provided default values for the new life-cycle methods of the PostModifier trait. --- .../scala/mdoc/docs/LifeCycleModifier.scala | 22 +-- mdoc/src/main/scala/mdoc/PostModifier.scala | 8 +- .../tests/markdown/EvilplotPostModifier.scala | 6 +- .../test/scala/tests/cli/BaseCliSuite.scala | 130 ++++++++++++++++++ .../src/test/scala/tests/cli/CliSuite.scala | 22 ++- .../tests/markdown/LifeCycleModifier.scala | 21 +-- 6 files changed, 177 insertions(+), 32 deletions(-) diff --git a/mdoc-docs/src/main/scala/mdoc/docs/LifeCycleModifier.scala b/mdoc-docs/src/main/scala/mdoc/docs/LifeCycleModifier.scala index 7220ae5f4..a5a585f55 100644 --- a/mdoc-docs/src/main/scala/mdoc/docs/LifeCycleModifier.scala +++ b/mdoc-docs/src/main/scala/mdoc/docs/LifeCycleModifier.scala @@ -4,11 +4,11 @@ import mdoc._ import mdoc.internal.cli.{Exit, Settings} /** - * Global counter used to test the [[mdoc.Main]] process counting. - */ + * Global counter used to test the [[mdoc.Main]] process counting. + */ object LifeCycleCounter { - val numberOfStarts: ThreadLocal[Integer] = ThreadLocal.withInitial( () => 0 ) - val numberOfExists: ThreadLocal[Integer] = ThreadLocal.withInitial( () => 0 ) + val numberOfStarts: ThreadLocal[Integer] = ThreadLocal.withInitial(() => 0) + val numberOfExists: ThreadLocal[Integer] = ThreadLocal.withInitial(() => 0) } class LifeCycleModifier extends PostModifier { @@ -27,22 +27,22 @@ class LifeCycleModifier extends PostModifier { } /** - * This is called once when the [[mdoc.Main]] process starts - * @param settings CLI or API settings used by mdoc - */ + * This is called once when the [[mdoc.Main]] process starts + * @param settings CLI or API settings used by mdoc + */ override def onStart(settings: Settings): Unit = { numberOfStarts += 1 LifeCycleCounter.numberOfStarts.set(LifeCycleCounter.numberOfStarts.get() + 1) } - override def preProcess(ctx: PostModifierContext): Unit = { numberOfPreProcess += 1} + override def preProcess(ctx: PostModifierContext): Unit = { numberOfPreProcess += 1 } override def postProcess(ctx: PostModifierContext): Unit = { numberOfPostProcess += 1 } /** - * This is called once when the [[mdoc.Main]] process finsihes - * @param exit is the exit code returned by mdoc's processing - */ + * This is called once when the [[mdoc.Main]] process finsihes + * @param exit is the exit code returned by mdoc's processing + */ override def onExit(exit: Exit): Unit = { numberOfExists += 1 LifeCycleCounter.numberOfExists.set(LifeCycleCounter.numberOfExists.get() + 1) diff --git a/mdoc/src/main/scala/mdoc/PostModifier.scala b/mdoc/src/main/scala/mdoc/PostModifier.scala index 6abed5dd7..700a300e8 100644 --- a/mdoc/src/main/scala/mdoc/PostModifier.scala +++ b/mdoc/src/main/scala/mdoc/PostModifier.scala @@ -15,11 +15,11 @@ import scala.meta.io.RelativePath trait PostModifier { val name: String - def onStart(settings: Settings): Unit - def preProcess(ctx: PostModifierContext): Unit + def onStart(settings: Settings): Unit = () + def preProcess(ctx: PostModifierContext): Unit = () def process(ctx: PostModifierContext): String - def postProcess(ctx: PostModifierContext): Unit - def onExit(exit: Exit): Unit + def postProcess(ctx: PostModifierContext): Unit = () + def onExit(exit: Exit): Unit = () } object PostModifier { diff --git a/tests/unit/src/test/scala-2.11/tests/markdown/EvilplotPostModifier.scala b/tests/unit/src/test/scala-2.11/tests/markdown/EvilplotPostModifier.scala index 2b2f12284..1d27e79bb 100644 --- a/tests/unit/src/test/scala-2.11/tests/markdown/EvilplotPostModifier.scala +++ b/tests/unit/src/test/scala-2.11/tests/markdown/EvilplotPostModifier.scala @@ -2,16 +2,18 @@ package tests.markdown import mdoc.PostModifier import mdoc.PostModifierContext +import mdoc.internal.cli.{Exit, Settings} class EvilplotPostModifier extends PostModifier { val name = "evilplot" + def process(ctx: PostModifierContext): String = "" - override def onStart(ctx: PostModifierContext): Unit = () + override def onStart(settings: Settings): Unit = () override def preProcess(ctx: PostModifierContext): Unit = () override def postProcess(ctx: PostModifierContext): Unit = () - override def onExit(ctx: PostModifierContext): Unit = () + override def onExit(exit: Exit): Unit = () } diff --git a/tests/unit/src/test/scala/tests/cli/BaseCliSuite.scala b/tests/unit/src/test/scala/tests/cli/BaseCliSuite.scala index a579f06d4..d29d1e264 100644 --- a/tests/unit/src/test/scala/tests/cli/BaseCliSuite.scala +++ b/tests/unit/src/test/scala/tests/cli/BaseCliSuite.scala @@ -4,11 +4,14 @@ import java.io.ByteArrayOutputStream import java.io.PrintStream import java.nio.file.Files import java.nio.file.Path + import org.scalatest.FunSuite + import scala.meta.io.AbsolutePath import scala.meta.testkit.DiffAssertions import scala.meta.testkit.StringFS import mdoc.Main +import org.scalactic.source.Position case class CliFixture(in: Path, out: Path) @@ -46,4 +49,131 @@ abstract class BaseCliSuite extends FunSuite with DiffAssertions { onStdout(stdout) } } + + def assertOneSameOrPrintExpected(obtained: String, expected: List[String], title: String = "")( + implicit source: Position): Boolean = { + try assertAllDiff(obtained, expected, title) + catch { + case ex: Exception => + obtained.linesIterator.toList match { + case head +: tail => + println(" \"\"\"|" + head) + tail.foreach(line => println(" |" + line)) + case head +: Nil => + println(head) + case Nil => + println("obtained is empty") + } + throw ex + } + } + + // scala.meta.testkit.DiffAssertions + // Cannot access these because they are private + import collection.JavaConverters._ + import org.scalatest.exceptions.{StackDepthException, TestFailedException} + + + def splitIntoLines(string: String): Seq[String] = + string.trim.replace("\r\n", "\n").split("\n") + + def compareContents(original: String, revised: String): String = + compareContents(splitIntoLines(original), splitIntoLines(revised)) + + def compareContents(original: Seq[String], revised: Seq[String]): String = { + val diff = difflib.DiffUtils.diff(original.asJava, revised.asJava) + if (diff.getDeltas.isEmpty) "" + else + difflib.DiffUtils + .generateUnifiedDiff( + "obtained", + "expected", + original.asJava, + diff, + 1 + ) + .asScala + .mkString("\n") + } + + case class DiffFailure( + title: String, + expected: String, + obtained: String, + diff: String, + source: Position + ) extends TestFailedException( + { _: StackDepthException => + Some(title + "\n" + error2message(obtained, expected)) + }, + None, + source + ) + + def header[T](t: T): String = { + val line = s"=" * (t.toString.length + 3) + s"$line\n=> $t\n$line" + } + + def stripTrailingWhitespace(str: String): String = str.replaceAll(" \n", "∙\n") + + private def error2message(obtained: String, expected: String): String = { + val sb = new StringBuilder + if (obtained.length < 1000) { + sb.append( + s"""#${header("Obtained")} + #${stripTrailingWhitespace(obtained)} + # + #""".stripMargin('#') + ) + } + sb.append( + s"""#${header("Diff")} + #${stripTrailingWhitespace(compareContents(obtained, expected))}""".stripMargin('#') + ) + sb.toString() + } + + def assertAllDiff(obtained: String, expected: List[String], title: String = "")( + implicit source: Position): Boolean = { + val theSame = expected.filter( p => compareContents(obtained, p).isEmpty) + val result = expected.foldLeft("")( (acc,p) => acc + compareContents(obtained, p) ) + if (theSame.nonEmpty) true + else { + throw DiffFailure(title, expected.mkString(" OR \n"), obtained, result, source) + } + } + + def checkCliMulti( + name: String, + original: String, + expected: List[String], + extraArgs: Array[String] = Array.empty, + setup: CliFixture => Unit = _ => (), + expectedExitCode: Int = 0, + onStdout: String => Unit = _ => () + ): Unit = { + test(name) { + myStdout.reset() + val in = StringFS.fromString(original) + val out = Files.createTempDirectory("mdoc") + setup(CliFixture(in.toNIO, out)) + val args = Array[String]( + "--in", + in.toString, + "--out", + out.toString, + "--cwd", + in.toString, + "--site.version", + "1.0.0" + ) + val code = Main.process(args ++ extraArgs, new PrintStream(myStdout), in.toNIO) + val stdout = fansi.Str(myStdout.toString()).plainText + assert(code == expectedExitCode, stdout) + val obtained = StringFS.asString(AbsolutePath(out)) + assertOneSameOrPrintExpected(obtained, expected) + onStdout(stdout) + } + } } diff --git a/tests/unit/src/test/scala/tests/cli/CliSuite.scala b/tests/unit/src/test/scala/tests/cli/CliSuite.scala index 102816f34..af90e5ecc 100644 --- a/tests/unit/src/test/scala/tests/cli/CliSuite.scala +++ b/tests/unit/src/test/scala/tests/cli/CliSuite.scala @@ -193,7 +193,7 @@ class CliSuite extends BaseCliSuite { |""".stripMargin ) - checkCli( + checkCliMulti( "lifeCycle", """ |/file1.md @@ -209,6 +209,7 @@ class CliSuite extends BaseCliSuite { |val x2 = 2 |``` | """.stripMargin, + List( """ |/file1.md |# file 1 @@ -218,7 +219,17 @@ class CliSuite extends BaseCliSuite { |# file 2 |Two |numberOfStarts = 1 ; numberOfExists = 0 ; numberOfPreProcess = 2 ; numberOfPostProcess = 1 - """.stripMargin, // process counts per PostModifier instance, starts and exists per mdoc.Main process + """.stripMargin, + """ + |/file1.md + |# file 1 + |One + |numberOfStarts = 1 ; numberOfExists = 0 ; numberOfPreProcess = 2 ; numberOfPostProcess = 1 + |/file2.md + |# file 2 + |Two + |numberOfStarts = 1 ; numberOfExists = 0 ; numberOfPreProcess = 1 ; numberOfPostProcess = 0 + """.stripMargin), // process counts per PostModifier instance, starts and exists per mdoc.Main process setup = { fixture => // Global thread local counter updated by all mdoc.Main process // All tests in this test suite run sequentially but change the counter @@ -229,12 +240,11 @@ class CliSuite extends BaseCliSuite { onStdout = { out => assert(out.contains("Compiling 2 files to")) assert(out.contains("Compiled in")) - assert(out.contains("(0 errors)")) + assert(out.contains("(0 errors")) // Should start and stop one only once in this test (several times for test-suite) - assert( LifeCycleCounter.numberOfExists.get() == 1) - assert( LifeCycleCounter.numberOfStarts.get() == 1) + assert(LifeCycleCounter.numberOfExists.get() == 1) + assert(LifeCycleCounter.numberOfStarts.get() == 1) } ) - } diff --git a/tests/unit/src/test/scala/tests/markdown/LifeCycleModifier.scala b/tests/unit/src/test/scala/tests/markdown/LifeCycleModifier.scala index a1d760378..8e2ecea74 100644 --- a/tests/unit/src/test/scala/tests/markdown/LifeCycleModifier.scala +++ b/tests/unit/src/test/scala/tests/markdown/LifeCycleModifier.scala @@ -4,8 +4,11 @@ import mdoc._ import mdoc.internal.cli.{Exit, Settings} /** - * Global counter used to test the [[mdoc.Main]] process counting. - */ + * Global counter used to test the [[mdoc.Main]] process counting. + * Because tests can be executed concurrently, these need to be + * thread local. The following counters are used for testing within + * the same thread. + */ object LifeCycleCounter { val numberOfStarts: ThreadLocal[Integer] = ThreadLocal.withInitial( () => 0 ) val numberOfExists: ThreadLocal[Integer] = ThreadLocal.withInitial( () => 0 ) @@ -22,14 +25,14 @@ class LifeCycleModifier extends PostModifier { var numberOfPostProcess = 0 def process(ctx: PostModifierContext): String = { - // Used for checking the counting + // Used for checking the counting between threads s"numberOfStarts = $numberOfStarts ; numberOfExists = $numberOfExists ; numberOfPreProcess = $numberOfPreProcess ; numberOfPostProcess = $numberOfPostProcess" } /** - * This is called once when the [[mdoc.Main]] process starts - * @param settings CLI or API settings used by mdoc - */ + * This is called once when the [[mdoc.Main]] process starts + * @param settings CLI or API settings used by mdoc + */ override def onStart(settings: Settings): Unit = { numberOfStarts += 1 LifeCycleCounter.numberOfStarts.set(LifeCycleCounter.numberOfStarts.get() + 1) @@ -40,9 +43,9 @@ class LifeCycleModifier extends PostModifier { override def postProcess(ctx: PostModifierContext): Unit = { numberOfPostProcess += 1 } /** - * This is called once when the [[mdoc.Main]] process finsihes - * @param exit is the exit code returned by mdoc's processing - */ + * This is called once when the [[mdoc.Main]] process finishes + * @param exit is the exit code returned by mdoc's processing + */ override def onExit(exit: Exit): Unit = { numberOfExists += 1 LifeCycleCounter.numberOfExists.set(LifeCycleCounter.numberOfExists.get() + 1) From 342cf3e88b262c7999cb3cbf75c2f7c2957f51e8 Mon Sep 17 00:00:00 2001 From: Hugo Miguel Ferreira Date: Fri, 13 Dec 2019 13:47:25 +0000 Subject: [PATCH 04/15] Minor scalameta formatting. --- .../src/test/scala/tests/markdown/LifeCycleModifier.scala | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/unit/src/test/scala/tests/markdown/LifeCycleModifier.scala b/tests/unit/src/test/scala/tests/markdown/LifeCycleModifier.scala index 8e2ecea74..c2089b0d3 100644 --- a/tests/unit/src/test/scala/tests/markdown/LifeCycleModifier.scala +++ b/tests/unit/src/test/scala/tests/markdown/LifeCycleModifier.scala @@ -10,8 +10,8 @@ import mdoc.internal.cli.{Exit, Settings} * the same thread. */ object LifeCycleCounter { - val numberOfStarts: ThreadLocal[Integer] = ThreadLocal.withInitial( () => 0 ) - val numberOfExists: ThreadLocal[Integer] = ThreadLocal.withInitial( () => 0 ) + val numberOfStarts: ThreadLocal[Integer] = ThreadLocal.withInitial(() => 0) + val numberOfExists: ThreadLocal[Integer] = ThreadLocal.withInitial(() => 0) } class LifeCycleModifier extends PostModifier { @@ -38,7 +38,7 @@ class LifeCycleModifier extends PostModifier { LifeCycleCounter.numberOfStarts.set(LifeCycleCounter.numberOfStarts.get() + 1) } - override def preProcess(ctx: PostModifierContext): Unit = { numberOfPreProcess += 1} + override def preProcess(ctx: PostModifierContext): Unit = { numberOfPreProcess += 1 } override def postProcess(ctx: PostModifierContext): Unit = { numberOfPostProcess += 1 } From 302ba3ba8a6fa39a488f2958e322bf887b05bbd7 Mon Sep 17 00:00:00 2001 From: Hugo Miguel Ferreira Date: Fri, 13 Dec 2019 13:55:18 +0000 Subject: [PATCH 05/15] Another minor scalameta formatting. --- .../test/scala/tests/cli/BaseCliSuite.scala | 51 ++++++++++--------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/tests/unit/src/test/scala/tests/cli/BaseCliSuite.scala b/tests/unit/src/test/scala/tests/cli/BaseCliSuite.scala index d29d1e264..618be8f43 100644 --- a/tests/unit/src/test/scala/tests/cli/BaseCliSuite.scala +++ b/tests/unit/src/test/scala/tests/cli/BaseCliSuite.scala @@ -51,7 +51,8 @@ abstract class BaseCliSuite extends FunSuite with DiffAssertions { } def assertOneSameOrPrintExpected(obtained: String, expected: List[String], title: String = "")( - implicit source: Position): Boolean = { + implicit source: Position + ): Boolean = { try assertAllDiff(obtained, expected, title) catch { case ex: Exception => @@ -73,7 +74,6 @@ abstract class BaseCliSuite extends FunSuite with DiffAssertions { import collection.JavaConverters._ import org.scalatest.exceptions.{StackDepthException, TestFailedException} - def splitIntoLines(string: String): Seq[String] = string.trim.replace("\r\n", "\n").split("\n") @@ -97,18 +97,18 @@ abstract class BaseCliSuite extends FunSuite with DiffAssertions { } case class DiffFailure( - title: String, - expected: String, - obtained: String, - diff: String, - source: Position - ) extends TestFailedException( - { _: StackDepthException => - Some(title + "\n" + error2message(obtained, expected)) - }, - None, - source - ) + title: String, + expected: String, + obtained: String, + diff: String, + source: Position + ) extends TestFailedException( + { _: StackDepthException => + Some(title + "\n" + error2message(obtained, expected)) + }, + None, + source + ) def header[T](t: T): String = { val line = s"=" * (t.toString.length + 3) @@ -135,9 +135,10 @@ abstract class BaseCliSuite extends FunSuite with DiffAssertions { } def assertAllDiff(obtained: String, expected: List[String], title: String = "")( - implicit source: Position): Boolean = { - val theSame = expected.filter( p => compareContents(obtained, p).isEmpty) - val result = expected.foldLeft("")( (acc,p) => acc + compareContents(obtained, p) ) + implicit source: Position + ): Boolean = { + val theSame = expected.filter(p => compareContents(obtained, p).isEmpty) + val result = expected.foldLeft("")((acc, p) => acc + compareContents(obtained, p)) if (theSame.nonEmpty) true else { throw DiffFailure(title, expected.mkString(" OR \n"), obtained, result, source) @@ -145,14 +146,14 @@ abstract class BaseCliSuite extends FunSuite with DiffAssertions { } def checkCliMulti( - name: String, - original: String, - expected: List[String], - extraArgs: Array[String] = Array.empty, - setup: CliFixture => Unit = _ => (), - expectedExitCode: Int = 0, - onStdout: String => Unit = _ => () - ): Unit = { + name: String, + original: String, + expected: List[String], + extraArgs: Array[String] = Array.empty, + setup: CliFixture => Unit = _ => (), + expectedExitCode: Int = 0, + onStdout: String => Unit = _ => () + ): Unit = { test(name) { myStdout.reset() val in = StringFS.fromString(original) From d55f20fe21ef4b3fa7c32dd6976b2908ea9345c9 Mon Sep 17 00:00:00 2001 From: Hugo Miguel Ferreira Date: Fri, 13 Dec 2019 14:04:42 +0000 Subject: [PATCH 06/15] Another minor scalameta formatting. --- .../test/scala-2.11/tests/markdown/EvilplotPostModifier.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/src/test/scala-2.11/tests/markdown/EvilplotPostModifier.scala b/tests/unit/src/test/scala-2.11/tests/markdown/EvilplotPostModifier.scala index 1d27e79bb..8acf2c31f 100644 --- a/tests/unit/src/test/scala-2.11/tests/markdown/EvilplotPostModifier.scala +++ b/tests/unit/src/test/scala-2.11/tests/markdown/EvilplotPostModifier.scala @@ -6,7 +6,7 @@ import mdoc.internal.cli.{Exit, Settings} class EvilplotPostModifier extends PostModifier { val name = "evilplot" - + def process(ctx: PostModifierContext): String = "" override def onStart(settings: Settings): Unit = () From 40e1d544b30a5271aa7f05e4f96483f625d1adb8 Mon Sep 17 00:00:00 2001 From: Hugo Miguel Ferreira Date: Fri, 13 Dec 2019 14:08:09 +0000 Subject: [PATCH 07/15] Another minor scalameta formatting. --- .../src/test/scala/tests/cli/CliSuite.scala | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/tests/unit/src/test/scala/tests/cli/CliSuite.scala b/tests/unit/src/test/scala/tests/cli/CliSuite.scala index af90e5ecc..5f440808f 100644 --- a/tests/unit/src/test/scala/tests/cli/CliSuite.scala +++ b/tests/unit/src/test/scala/tests/cli/CliSuite.scala @@ -210,15 +210,15 @@ class CliSuite extends BaseCliSuite { |``` | """.stripMargin, List( - """ - |/file1.md - |# file 1 - |One - |numberOfStarts = 1 ; numberOfExists = 0 ; numberOfPreProcess = 1 ; numberOfPostProcess = 0 - |/file2.md - |# file 2 - |Two - |numberOfStarts = 1 ; numberOfExists = 0 ; numberOfPreProcess = 2 ; numberOfPostProcess = 1 + """ + |/file1.md + |# file 1 + |One + |numberOfStarts = 1 ; numberOfExists = 0 ; numberOfPreProcess = 1 ; numberOfPostProcess = 0 + |/file2.md + |# file 2 + |Two + |numberOfStarts = 1 ; numberOfExists = 0 ; numberOfPreProcess = 2 ; numberOfPostProcess = 1 """.stripMargin, """ |/file1.md @@ -229,7 +229,8 @@ class CliSuite extends BaseCliSuite { |# file 2 |Two |numberOfStarts = 1 ; numberOfExists = 0 ; numberOfPreProcess = 1 ; numberOfPostProcess = 0 - """.stripMargin), // process counts per PostModifier instance, starts and exists per mdoc.Main process + """.stripMargin + ), // process counts per PostModifier instance, starts and exists per mdoc.Main process setup = { fixture => // Global thread local counter updated by all mdoc.Main process // All tests in this test suite run sequentially but change the counter From b8005c96adc8ab39b2687d84c9b7c9a64d6075f1 Mon Sep 17 00:00:00 2001 From: Hugo Miguel Ferreira Date: Mon, 16 Dec 2019 11:29:00 +0000 Subject: [PATCH 08/15] PostModifier onStart now gets a MainSettings wrapper instead of the internal Settings class. --- .../scala/mdoc/docs/EvilplotModifier.scala | 4 ++-- .../scala/mdoc/docs/LifeCycleModifier.scala | 4 ++-- mdoc/src/main/scala/mdoc/Main.scala | 5 +++-- mdoc/src/main/scala/mdoc/MainSettings.scala | 2 +- mdoc/src/main/scala/mdoc/PostModifier.scala | 2 +- .../main/scala/mdoc/internal/cli/MainOps.scala | 18 ++++++++++-------- .../tests/markdown/EvilplotPostModifier.scala | 7 +++---- .../tests/markdown/EvilplotPostModifier.scala | 7 +++---- .../tests/markdown/EvilplotPostModifier.scala | 7 +++---- .../tests/markdown/BulletPostModifier.scala | 7 +++---- .../tests/markdown/LifeCycleModifier.scala | 4 ++-- 11 files changed, 33 insertions(+), 34 deletions(-) diff --git a/mdoc-docs/src/main/scala/mdoc/docs/EvilplotModifier.scala b/mdoc-docs/src/main/scala/mdoc/docs/EvilplotModifier.scala index b1311a0c8..612f8f305 100644 --- a/mdoc-docs/src/main/scala/mdoc/docs/EvilplotModifier.scala +++ b/mdoc-docs/src/main/scala/mdoc/docs/EvilplotModifier.scala @@ -5,7 +5,7 @@ import java.nio.file.Files import java.nio.file.Paths import mdoc._ -import mdoc.internal.cli.{Exit, Settings} +import mdoc.internal.cli.Exit import scala.meta.inputs.Position @@ -40,7 +40,7 @@ class EvilplotModifier extends PostModifier { } } - override def onStart(settings: Settings): Unit = () + override def onStart(settings: MainSettings): Unit = () override def preProcess(ctx: PostModifierContext): Unit = () diff --git a/mdoc-docs/src/main/scala/mdoc/docs/LifeCycleModifier.scala b/mdoc-docs/src/main/scala/mdoc/docs/LifeCycleModifier.scala index a5a585f55..2e52275bf 100644 --- a/mdoc-docs/src/main/scala/mdoc/docs/LifeCycleModifier.scala +++ b/mdoc-docs/src/main/scala/mdoc/docs/LifeCycleModifier.scala @@ -1,7 +1,7 @@ package mdoc.docs import mdoc._ -import mdoc.internal.cli.{Exit, Settings} +import mdoc.internal.cli.Exit /** * Global counter used to test the [[mdoc.Main]] process counting. @@ -30,7 +30,7 @@ class LifeCycleModifier extends PostModifier { * This is called once when the [[mdoc.Main]] process starts * @param settings CLI or API settings used by mdoc */ - override def onStart(settings: Settings): Unit = { + override def onStart(settings: MainSettings): Unit = { numberOfStarts += 1 LifeCycleCounter.numberOfStarts.set(LifeCycleCounter.numberOfStarts.get() + 1) } diff --git a/mdoc/src/main/scala/mdoc/Main.scala b/mdoc/src/main/scala/mdoc/Main.scala index a83ed7c37..93956459e 100644 --- a/mdoc/src/main/scala/mdoc/Main.scala +++ b/mdoc/src/main/scala/mdoc/Main.scala @@ -23,10 +23,11 @@ object Main { def process(args: Array[String], reporter: Reporter, cwd: Path): Int = { val base = Settings.default(AbsolutePath(cwd)) val ctx = Settings.fromCliArgs(args.toList, base) - MainOps.process(ctx, reporter) + val mainSettings = ctx.andThen(s => Configured.ok(new MainSettings(s, reporter)) ) + MainOps.process(mainSettings, reporter) } def process(settings: MainSettings): Int = { - MainOps.process(Configured.ok(settings.settings), settings.reporter) + MainOps.process(Configured.ok(settings), settings.reporter) } } diff --git a/mdoc/src/main/scala/mdoc/MainSettings.scala b/mdoc/src/main/scala/mdoc/MainSettings.scala index 53ba30f43..d8f5624ad 100644 --- a/mdoc/src/main/scala/mdoc/MainSettings.scala +++ b/mdoc/src/main/scala/mdoc/MainSettings.scala @@ -11,7 +11,7 @@ import scala.meta.io.AbsolutePath import mdoc.internal.cli.Settings import mdoc.internal.io.ConsoleReporter -final class MainSettings private ( +final class MainSettings private[mdoc] ( private[mdoc] val settings: Settings, private[mdoc] val reporter: Reporter ) { diff --git a/mdoc/src/main/scala/mdoc/PostModifier.scala b/mdoc/src/main/scala/mdoc/PostModifier.scala index 700a300e8..e3f073c13 100644 --- a/mdoc/src/main/scala/mdoc/PostModifier.scala +++ b/mdoc/src/main/scala/mdoc/PostModifier.scala @@ -15,7 +15,7 @@ import scala.meta.io.RelativePath trait PostModifier { val name: String - def onStart(settings: Settings): Unit = () + def onStart(settings: MainSettings): Unit = () def preProcess(ctx: PostModifierContext): Unit = () def process(ctx: PostModifierContext): String def postProcess(ctx: PostModifierContext): Unit = () diff --git a/mdoc/src/main/scala/mdoc/internal/cli/MainOps.scala b/mdoc/src/main/scala/mdoc/internal/cli/MainOps.scala index 36d709250..1f4aaa390 100644 --- a/mdoc/src/main/scala/mdoc/internal/cli/MainOps.scala +++ b/mdoc/src/main/scala/mdoc/internal/cli/MainOps.scala @@ -6,7 +6,8 @@ import io.methvin.watcher.DirectoryChangeEvent import java.nio.file.Files import java.nio.file.StandardCopyOption import java.util.concurrent.Executors -import mdoc.Reporter + +import mdoc.{MainSettings, Reporter} import mdoc.internal.BuildInfo import mdoc.internal.io.IO import mdoc.internal.io.MdocFileListener @@ -17,6 +18,7 @@ import mdoc.internal.markdown.LinkHygiene import mdoc.internal.markdown.Markdown import mdoc.internal.pos.DiffUtils import metaconfig.Configured + import scala.meta.Input import scala.meta.internal.io.FileIO import scala.meta.internal.io.PathIO @@ -146,7 +148,6 @@ final class MainOps( if (settings.watch) { startLivereload() } - context.settings.postModifiers.foreach(_.onStart(settings)) val isOk = generateCompleteSite() if (settings.isFileWatching) { waitingForFileChanges() @@ -154,7 +155,6 @@ final class MainOps( // exit code doesn't matter when file watching Exit.success } else { - context.settings.postModifiers.foreach(_.onExit(isOk)) isOk } } @@ -211,19 +211,19 @@ final class MainOps( } object MainOps { - def process(settings: Configured[Settings], reporter: Reporter): Int = { + def process(settings: Configured[MainSettings], reporter: Reporter): Int = { settings match { - case Configured.Ok(setting) if setting.help => + case Configured.Ok(setting) if setting.settings.help => reporter.println(Settings.help(BuildInfo.version, 80)) 0 - case Configured.Ok(setting) if setting.usage => + case Configured.Ok(setting) if setting.settings.usage => reporter.println(Settings.usage) 0 - case Configured.Ok(setting) if setting.version => + case Configured.Ok(setting) if setting.settings.version => reporter.println(Settings.version(BuildInfo.version)) 0 case els => - els.andThen(_.validate(reporter)) match { + els.andThen(_.settings.validate(reporter)) match { case Configured.NotOk(error) => error.all.foreach(message => reporter.error(message)) 1 @@ -231,8 +231,10 @@ object MainOps { if (ctx.settings.verbose) { ctx.reporter.setDebugEnabled(true) } + ctx.settings.postModifiers.foreach(_.onStart(settings.get)) val runner = new MainOps(ctx) val exit = runner.run() + ctx.settings.postModifiers.foreach(_.onExit(exit)) if (exit.isSuccess) { 0 } else { diff --git a/tests/unit/src/test/scala-2.11/tests/markdown/EvilplotPostModifier.scala b/tests/unit/src/test/scala-2.11/tests/markdown/EvilplotPostModifier.scala index 8acf2c31f..4fba79003 100644 --- a/tests/unit/src/test/scala-2.11/tests/markdown/EvilplotPostModifier.scala +++ b/tests/unit/src/test/scala-2.11/tests/markdown/EvilplotPostModifier.scala @@ -1,15 +1,14 @@ package tests.markdown -import mdoc.PostModifier -import mdoc.PostModifierContext -import mdoc.internal.cli.{Exit, Settings} +import mdoc.{MainSettings, PostModifier, PostModifierContext} +import mdoc.internal.cli.Exit class EvilplotPostModifier extends PostModifier { val name = "evilplot" def process(ctx: PostModifierContext): String = "" - override def onStart(settings: Settings): Unit = () + override def onStart(settings: MainSettings): Unit = () override def preProcess(ctx: PostModifierContext): Unit = () diff --git a/tests/unit/src/test/scala-2.12/tests/markdown/EvilplotPostModifier.scala b/tests/unit/src/test/scala-2.12/tests/markdown/EvilplotPostModifier.scala index 8514e3312..00ae0a0c3 100644 --- a/tests/unit/src/test/scala-2.12/tests/markdown/EvilplotPostModifier.scala +++ b/tests/unit/src/test/scala-2.12/tests/markdown/EvilplotPostModifier.scala @@ -3,9 +3,8 @@ package tests.markdown import com.cibo.evilplot.geometry.Drawable import java.nio.file.Files -import mdoc.PostModifier -import mdoc.PostModifierContext -import mdoc.internal.cli.{Exit, Settings} +import mdoc.{MainSettings, PostModifier, PostModifierContext} +import mdoc.internal.cli.Exit class EvilplotPostModifier extends PostModifier { val name = "evilplot" @@ -31,7 +30,7 @@ class EvilplotPostModifier extends PostModifier { } } - override def onStart(settings: Settings): Unit = () + override def onStart(settings: MainSettings): Unit = () override def preProcess(ctx: PostModifierContext): Unit = () diff --git a/tests/unit/src/test/scala-2.13/tests/markdown/EvilplotPostModifier.scala b/tests/unit/src/test/scala-2.13/tests/markdown/EvilplotPostModifier.scala index 6c7bd75df..c40fdb1f6 100644 --- a/tests/unit/src/test/scala-2.13/tests/markdown/EvilplotPostModifier.scala +++ b/tests/unit/src/test/scala-2.13/tests/markdown/EvilplotPostModifier.scala @@ -1,14 +1,13 @@ package tests.markdown -import mdoc.PostModifier -import mdoc.PostModifierContext -import mdoc.internal.cli.{Exit, Settings} +import mdoc.{MainSettings, PostModifier, PostModifierContext} +import mdoc.internal.cli.Exit class EvilplotPostModifier extends PostModifier { val name = "evilplot" def process(ctx: PostModifierContext): String = "" - override def onStart(settings: Settings): Unit = () + override def onStart(settings: MainSettings): Unit = () override def preProcess(ctx: PostModifierContext): Unit = () diff --git a/tests/unit/src/test/scala/tests/markdown/BulletPostModifier.scala b/tests/unit/src/test/scala/tests/markdown/BulletPostModifier.scala index 085174e35..b94152a26 100644 --- a/tests/unit/src/test/scala/tests/markdown/BulletPostModifier.scala +++ b/tests/unit/src/test/scala/tests/markdown/BulletPostModifier.scala @@ -1,8 +1,7 @@ package tests.markdown -import mdoc.PostModifier -import mdoc.PostModifierContext -import mdoc.internal.cli.{Exit, Settings} +import mdoc.{MainSettings, PostModifier, PostModifierContext} +import mdoc.internal.cli.Exit class BulletPostModifier extends PostModifier { val name = "bullet" @@ -16,7 +15,7 @@ class BulletPostModifier extends PostModifier { } } - override def onStart(settings: Settings): Unit = () + override def onStart(settings: MainSettings): Unit = () override def preProcess(ctx: PostModifierContext): Unit = () diff --git a/tests/unit/src/test/scala/tests/markdown/LifeCycleModifier.scala b/tests/unit/src/test/scala/tests/markdown/LifeCycleModifier.scala index c2089b0d3..6cfb52e6b 100644 --- a/tests/unit/src/test/scala/tests/markdown/LifeCycleModifier.scala +++ b/tests/unit/src/test/scala/tests/markdown/LifeCycleModifier.scala @@ -1,7 +1,7 @@ package tests.markdown import mdoc._ -import mdoc.internal.cli.{Exit, Settings} +import mdoc.internal.cli.Exit /** * Global counter used to test the [[mdoc.Main]] process counting. @@ -33,7 +33,7 @@ class LifeCycleModifier extends PostModifier { * This is called once when the [[mdoc.Main]] process starts * @param settings CLI or API settings used by mdoc */ - override def onStart(settings: Settings): Unit = { + override def onStart(settings: MainSettings): Unit = { numberOfStarts += 1 LifeCycleCounter.numberOfStarts.set(LifeCycleCounter.numberOfStarts.get() + 1) } From 6a45cfa31e326d3642857b40e94176cc7551b4fe Mon Sep 17 00:00:00 2001 From: Hugo Miguel Ferreira Date: Mon, 16 Dec 2019 11:36:55 +0000 Subject: [PATCH 09/15] PostModifier onStart now gets a MainSettings wrapper instead of the internal Settings class. --- mdoc/src/main/scala/mdoc/Main.scala | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/mdoc/src/main/scala/mdoc/Main.scala b/mdoc/src/main/scala/mdoc/Main.scala index 93956459e..e9a1f7aa2 100644 --- a/mdoc/src/main/scala/mdoc/Main.scala +++ b/mdoc/src/main/scala/mdoc/Main.scala @@ -8,7 +8,6 @@ import scala.meta.io.AbsolutePath import mdoc.internal.cli.MainOps import mdoc.internal.cli.Settings import mdoc.internal.io.ConsoleReporter -import mdoc.internal.markdown.Markdown object Main { @@ -23,7 +22,7 @@ object Main { def process(args: Array[String], reporter: Reporter, cwd: Path): Int = { val base = Settings.default(AbsolutePath(cwd)) val ctx = Settings.fromCliArgs(args.toList, base) - val mainSettings = ctx.andThen(s => Configured.ok(new MainSettings(s, reporter)) ) + val mainSettings = ctx.andThen(s => Configured.ok(new MainSettings(s, reporter))) MainOps.process(mainSettings, reporter) } def process(settings: MainSettings): Int = { From 8ba0ab094655ade62a492046e595d4ac1b74229c Mon Sep 17 00:00:00 2001 From: Hugo Miguel Ferreira Date: Mon, 16 Dec 2019 13:46:16 +0000 Subject: [PATCH 10/15] PostModifier onExit now gets an Int as an exit code. Removed use on internal Exit. --- mdoc-docs/src/main/scala/mdoc/docs/EvilplotModifier.scala | 3 +-- mdoc-docs/src/main/scala/mdoc/docs/LifeCycleModifier.scala | 3 +-- mdoc/src/main/scala/mdoc/PostModifier.scala | 4 ++-- mdoc/src/main/scala/mdoc/internal/cli/MainOps.scala | 5 +++-- .../scala-2.11/tests/markdown/EvilplotPostModifier.scala | 3 +-- .../scala-2.12/tests/markdown/EvilplotPostModifier.scala | 3 +-- .../scala-2.13/tests/markdown/EvilplotPostModifier.scala | 3 +-- .../src/test/scala/tests/markdown/BulletPostModifier.scala | 3 +-- .../src/test/scala/tests/markdown/LifeCycleModifier.scala | 2 +- 9 files changed, 12 insertions(+), 17 deletions(-) diff --git a/mdoc-docs/src/main/scala/mdoc/docs/EvilplotModifier.scala b/mdoc-docs/src/main/scala/mdoc/docs/EvilplotModifier.scala index 612f8f305..0c05d104f 100644 --- a/mdoc-docs/src/main/scala/mdoc/docs/EvilplotModifier.scala +++ b/mdoc-docs/src/main/scala/mdoc/docs/EvilplotModifier.scala @@ -5,7 +5,6 @@ import java.nio.file.Files import java.nio.file.Paths import mdoc._ -import mdoc.internal.cli.Exit import scala.meta.inputs.Position @@ -46,5 +45,5 @@ class EvilplotModifier extends PostModifier { override def postProcess(ctx: PostModifierContext): Unit = () - override def onExit(exit: Exit): Unit = () + override def onExit(exit: Int): Unit = () } diff --git a/mdoc-docs/src/main/scala/mdoc/docs/LifeCycleModifier.scala b/mdoc-docs/src/main/scala/mdoc/docs/LifeCycleModifier.scala index 2e52275bf..26de5c33e 100644 --- a/mdoc-docs/src/main/scala/mdoc/docs/LifeCycleModifier.scala +++ b/mdoc-docs/src/main/scala/mdoc/docs/LifeCycleModifier.scala @@ -1,7 +1,6 @@ package mdoc.docs import mdoc._ -import mdoc.internal.cli.Exit /** * Global counter used to test the [[mdoc.Main]] process counting. @@ -43,7 +42,7 @@ class LifeCycleModifier extends PostModifier { * This is called once when the [[mdoc.Main]] process finsihes * @param exit is the exit code returned by mdoc's processing */ - override def onExit(exit: Exit): Unit = { + override def onExit(exit: Int): Unit = { numberOfExists += 1 LifeCycleCounter.numberOfExists.set(LifeCycleCounter.numberOfExists.get() + 1) } diff --git a/mdoc/src/main/scala/mdoc/PostModifier.scala b/mdoc/src/main/scala/mdoc/PostModifier.scala index e3f073c13..9d83c61e0 100644 --- a/mdoc/src/main/scala/mdoc/PostModifier.scala +++ b/mdoc/src/main/scala/mdoc/PostModifier.scala @@ -2,7 +2,7 @@ package mdoc import java.util.ServiceLoader -import mdoc.internal.cli.{Exit, Settings} +import mdoc.internal.cli.Settings import metaconfig.ConfDecoder import metaconfig.ConfEncoder import metaconfig.ConfError @@ -19,7 +19,7 @@ trait PostModifier { def preProcess(ctx: PostModifierContext): Unit = () def process(ctx: PostModifierContext): String def postProcess(ctx: PostModifierContext): Unit = () - def onExit(exit: Exit): Unit = () + def onExit(exit: Int): Unit = () } object PostModifier { diff --git a/mdoc/src/main/scala/mdoc/internal/cli/MainOps.scala b/mdoc/src/main/scala/mdoc/internal/cli/MainOps.scala index 1f4aaa390..545b78367 100644 --- a/mdoc/src/main/scala/mdoc/internal/cli/MainOps.scala +++ b/mdoc/src/main/scala/mdoc/internal/cli/MainOps.scala @@ -234,12 +234,13 @@ object MainOps { ctx.settings.postModifiers.foreach(_.onStart(settings.get)) val runner = new MainOps(ctx) val exit = runner.run() - ctx.settings.postModifiers.foreach(_.onExit(exit)) - if (exit.isSuccess) { + val exitCode = if (exit.isSuccess) { 0 } else { 1 // error } + ctx.settings.postModifiers.foreach(_.onExit(exitCode)) + exitCode } } } diff --git a/tests/unit/src/test/scala-2.11/tests/markdown/EvilplotPostModifier.scala b/tests/unit/src/test/scala-2.11/tests/markdown/EvilplotPostModifier.scala index 4fba79003..d39b92476 100644 --- a/tests/unit/src/test/scala-2.11/tests/markdown/EvilplotPostModifier.scala +++ b/tests/unit/src/test/scala-2.11/tests/markdown/EvilplotPostModifier.scala @@ -1,7 +1,6 @@ package tests.markdown import mdoc.{MainSettings, PostModifier, PostModifierContext} -import mdoc.internal.cli.Exit class EvilplotPostModifier extends PostModifier { val name = "evilplot" @@ -14,5 +13,5 @@ class EvilplotPostModifier extends PostModifier { override def postProcess(ctx: PostModifierContext): Unit = () - override def onExit(exit: Exit): Unit = () + override def onExit(exit: Int): Unit = () } diff --git a/tests/unit/src/test/scala-2.12/tests/markdown/EvilplotPostModifier.scala b/tests/unit/src/test/scala-2.12/tests/markdown/EvilplotPostModifier.scala index 00ae0a0c3..972e0be83 100644 --- a/tests/unit/src/test/scala-2.12/tests/markdown/EvilplotPostModifier.scala +++ b/tests/unit/src/test/scala-2.12/tests/markdown/EvilplotPostModifier.scala @@ -4,7 +4,6 @@ import com.cibo.evilplot.geometry.Drawable import java.nio.file.Files import mdoc.{MainSettings, PostModifier, PostModifierContext} -import mdoc.internal.cli.Exit class EvilplotPostModifier extends PostModifier { val name = "evilplot" @@ -36,6 +35,6 @@ class EvilplotPostModifier extends PostModifier { override def postProcess(ctx: PostModifierContext): Unit = () - override def onExit(exit: Exit): Unit = () + override def onExit(exit: Int): Unit = () } diff --git a/tests/unit/src/test/scala-2.13/tests/markdown/EvilplotPostModifier.scala b/tests/unit/src/test/scala-2.13/tests/markdown/EvilplotPostModifier.scala index c40fdb1f6..90284fa50 100644 --- a/tests/unit/src/test/scala-2.13/tests/markdown/EvilplotPostModifier.scala +++ b/tests/unit/src/test/scala-2.13/tests/markdown/EvilplotPostModifier.scala @@ -1,7 +1,6 @@ package tests.markdown import mdoc.{MainSettings, PostModifier, PostModifierContext} -import mdoc.internal.cli.Exit class EvilplotPostModifier extends PostModifier { val name = "evilplot" @@ -13,5 +12,5 @@ class EvilplotPostModifier extends PostModifier { override def postProcess(ctx: PostModifierContext): Unit = () - override def onExit(exit: Exit): Unit = () + override def onExit(exit: Int): Unit = () } diff --git a/tests/unit/src/test/scala/tests/markdown/BulletPostModifier.scala b/tests/unit/src/test/scala/tests/markdown/BulletPostModifier.scala index b94152a26..dabe1a63f 100644 --- a/tests/unit/src/test/scala/tests/markdown/BulletPostModifier.scala +++ b/tests/unit/src/test/scala/tests/markdown/BulletPostModifier.scala @@ -1,7 +1,6 @@ package tests.markdown import mdoc.{MainSettings, PostModifier, PostModifierContext} -import mdoc.internal.cli.Exit class BulletPostModifier extends PostModifier { val name = "bullet" @@ -21,6 +20,6 @@ class BulletPostModifier extends PostModifier { override def postProcess(ctx: PostModifierContext): Unit = () - override def onExit(exit: Exit): Unit = () + override def onExit(exit: Int): Unit = () } diff --git a/tests/unit/src/test/scala/tests/markdown/LifeCycleModifier.scala b/tests/unit/src/test/scala/tests/markdown/LifeCycleModifier.scala index 6cfb52e6b..c8e12eebe 100644 --- a/tests/unit/src/test/scala/tests/markdown/LifeCycleModifier.scala +++ b/tests/unit/src/test/scala/tests/markdown/LifeCycleModifier.scala @@ -46,7 +46,7 @@ class LifeCycleModifier extends PostModifier { * This is called once when the [[mdoc.Main]] process finishes * @param exit is the exit code returned by mdoc's processing */ - override def onExit(exit: Exit): Unit = { + override def onExit(exit: Int): Unit = { numberOfExists += 1 LifeCycleCounter.numberOfExists.set(LifeCycleCounter.numberOfExists.get() + 1) } From 07c886fd92d65ac915043dc4a32017ddd23e7505 Mon Sep 17 00:00:00 2001 From: Hugo Miguel Ferreira Date: Mon, 16 Dec 2019 15:39:27 +0000 Subject: [PATCH 11/15] Added comments to PostModifier. Removed preProcess and postProcess from PostModifier. PostModifier.onExit now receives an Int as the exit code. --- .../scala/mdoc/docs/EvilplotModifier.scala | 4 --- .../scala/mdoc/docs/LifeCycleModifier.scala | 9 +------ mdoc/src/main/scala/mdoc/PostModifier.scala | 26 +++++++++++++++++-- .../mdoc/internal/markdown/Processor.scala | 2 -- .../tests/markdown/EvilplotPostModifier.scala | 4 --- .../tests/markdown/EvilplotPostModifier.scala | 4 --- .../tests/markdown/PostModifierSuite.scala | 14 +--------- .../tests/markdown/EvilplotPostModifier.scala | 4 --- .../src/test/scala/tests/cli/CliSuite.scala | 10 +++---- .../tests/markdown/BulletPostModifier.scala | 4 --- .../tests/markdown/LifeCycleModifier.scala | 10 +------ 11 files changed, 32 insertions(+), 59 deletions(-) diff --git a/mdoc-docs/src/main/scala/mdoc/docs/EvilplotModifier.scala b/mdoc-docs/src/main/scala/mdoc/docs/EvilplotModifier.scala index 0c05d104f..81e691b5f 100644 --- a/mdoc-docs/src/main/scala/mdoc/docs/EvilplotModifier.scala +++ b/mdoc-docs/src/main/scala/mdoc/docs/EvilplotModifier.scala @@ -41,9 +41,5 @@ class EvilplotModifier extends PostModifier { override def onStart(settings: MainSettings): Unit = () - override def preProcess(ctx: PostModifierContext): Unit = () - - override def postProcess(ctx: PostModifierContext): Unit = () - override def onExit(exit: Int): Unit = () } diff --git a/mdoc-docs/src/main/scala/mdoc/docs/LifeCycleModifier.scala b/mdoc-docs/src/main/scala/mdoc/docs/LifeCycleModifier.scala index 26de5c33e..11cf31672 100644 --- a/mdoc-docs/src/main/scala/mdoc/docs/LifeCycleModifier.scala +++ b/mdoc-docs/src/main/scala/mdoc/docs/LifeCycleModifier.scala @@ -16,13 +16,10 @@ class LifeCycleModifier extends PostModifier { // Starts and stops per instance var numberOfStarts = 0 var numberOfExists = 0 - // Pre and post processing per instance - var numberOfPreProcess = 0 - var numberOfPostProcess = 0 def process(ctx: PostModifierContext): String = { // Used for checking the counting - s"numberOfStarts = $numberOfStarts ; numberOfExists = $numberOfExists ; numberOfPreProcess = $numberOfPreProcess ; numberOfPostProcess = $numberOfPostProcess" + s"numberOfStarts = $numberOfStarts ; numberOfExists = $numberOfExists" } /** @@ -34,10 +31,6 @@ class LifeCycleModifier extends PostModifier { LifeCycleCounter.numberOfStarts.set(LifeCycleCounter.numberOfStarts.get() + 1) } - override def preProcess(ctx: PostModifierContext): Unit = { numberOfPreProcess += 1 } - - override def postProcess(ctx: PostModifierContext): Unit = { numberOfPostProcess += 1 } - /** * This is called once when the [[mdoc.Main]] process finsihes * @param exit is the exit code returned by mdoc's processing diff --git a/mdoc/src/main/scala/mdoc/PostModifier.scala b/mdoc/src/main/scala/mdoc/PostModifier.scala index 9d83c61e0..2deac6dd9 100644 --- a/mdoc/src/main/scala/mdoc/PostModifier.scala +++ b/mdoc/src/main/scala/mdoc/PostModifier.scala @@ -13,12 +13,34 @@ import scala.meta.io.AbsolutePath import scala.collection.JavaConverters._ import scala.meta.io.RelativePath +/** + * Interface of classes used for processing Markdown code fences. + * It provides method calls to set-up resources before processing + * sources, process code fences of all source files and release + * resource just before mdoc terminates. + * + */ trait PostModifier { val name: String + + /** + * This methods is called once just before mdoc starts processing all of the + * source files. Use this to set-up resources required by the post-modifier. + * + * @param settings setting set via the command line or directly vi the API + */ def onStart(settings: MainSettings): Unit = () - def preProcess(ctx: PostModifierContext): Unit = () def process(ctx: PostModifierContext): String - def postProcess(ctx: PostModifierContext): Unit = () + + /** + * This methods is called once just after mdoc finished processing all of the + * source files. Use this to release or deactivate any resources that are not + * required by the post-modifier anymore. + * + * @param exit a value of 0 indicates mdoc processed all files with no error. + * a value of 1 indicates mdoc processing resulted in at least + * one error. + */ def onExit(exit: Int): Unit = () } diff --git a/mdoc/src/main/scala/mdoc/internal/markdown/Processor.scala b/mdoc/src/main/scala/mdoc/internal/markdown/Processor.scala index 337f5e461..23e61eb69 100644 --- a/mdoc/src/main/scala/mdoc/internal/markdown/Processor.scala +++ b/mdoc/src/main/scala/mdoc/internal/markdown/Processor.scala @@ -171,9 +171,7 @@ class Processor(implicit ctx: Context) { inputFile, ctx.settings ) - modifier.preProcess(postCtx) val postRender = modifier.process(postCtx) - modifier.postProcess(postCtx) replaceNodeWithText(doc, block, postRender) case m: Modifier.Builtin => if (m.isPassthrough) { diff --git a/tests/unit/src/test/scala-2.11/tests/markdown/EvilplotPostModifier.scala b/tests/unit/src/test/scala-2.11/tests/markdown/EvilplotPostModifier.scala index d39b92476..9bd970ecd 100644 --- a/tests/unit/src/test/scala-2.11/tests/markdown/EvilplotPostModifier.scala +++ b/tests/unit/src/test/scala-2.11/tests/markdown/EvilplotPostModifier.scala @@ -9,9 +9,5 @@ class EvilplotPostModifier extends PostModifier { override def onStart(settings: MainSettings): Unit = () - override def preProcess(ctx: PostModifierContext): Unit = () - - override def postProcess(ctx: PostModifierContext): Unit = () - override def onExit(exit: Int): Unit = () } diff --git a/tests/unit/src/test/scala-2.12/tests/markdown/EvilplotPostModifier.scala b/tests/unit/src/test/scala-2.12/tests/markdown/EvilplotPostModifier.scala index 972e0be83..1018be59d 100644 --- a/tests/unit/src/test/scala-2.12/tests/markdown/EvilplotPostModifier.scala +++ b/tests/unit/src/test/scala-2.12/tests/markdown/EvilplotPostModifier.scala @@ -31,10 +31,6 @@ class EvilplotPostModifier extends PostModifier { override def onStart(settings: MainSettings): Unit = () - override def preProcess(ctx: PostModifierContext): Unit = () - - override def postProcess(ctx: PostModifierContext): Unit = () - override def onExit(exit: Int): Unit = () } diff --git a/tests/unit/src/test/scala-2.12/tests/markdown/PostModifierSuite.scala b/tests/unit/src/test/scala-2.12/tests/markdown/PostModifierSuite.scala index 56fa88d81..47e07b1b2 100644 --- a/tests/unit/src/test/scala-2.12/tests/markdown/PostModifierSuite.scala +++ b/tests/unit/src/test/scala-2.12/tests/markdown/PostModifierSuite.scala @@ -60,19 +60,7 @@ class PostModifierSuite extends BaseMarkdownSuite { |val x = "message" |``` """.stripMargin, - "numberOfStarts = 0 ; numberOfExists = 0 ; numberOfPreProcess = 1 ; numberOfPostProcess = 0" - ) - - // Process counts are per PostModifier instance, starts and exists per mdoc.Main process - // Because each test runs its own mdoc.Main process, the process counts are the same - check( - "lifecycle-2", - """ - |```scala mdoc:lifecycle - |val x = "message" - |``` - """.stripMargin, - "numberOfStarts = 0 ; numberOfExists = 0 ; numberOfPreProcess = 1 ; numberOfPostProcess = 0" + "numberOfStarts = 0 ; numberOfExists = 0" ) } diff --git a/tests/unit/src/test/scala-2.13/tests/markdown/EvilplotPostModifier.scala b/tests/unit/src/test/scala-2.13/tests/markdown/EvilplotPostModifier.scala index 90284fa50..0a56fd9ca 100644 --- a/tests/unit/src/test/scala-2.13/tests/markdown/EvilplotPostModifier.scala +++ b/tests/unit/src/test/scala-2.13/tests/markdown/EvilplotPostModifier.scala @@ -8,9 +8,5 @@ class EvilplotPostModifier extends PostModifier { override def onStart(settings: MainSettings): Unit = () - override def preProcess(ctx: PostModifierContext): Unit = () - - override def postProcess(ctx: PostModifierContext): Unit = () - override def onExit(exit: Int): Unit = () } diff --git a/tests/unit/src/test/scala/tests/cli/CliSuite.scala b/tests/unit/src/test/scala/tests/cli/CliSuite.scala index 5f440808f..b175c4588 100644 --- a/tests/unit/src/test/scala/tests/cli/CliSuite.scala +++ b/tests/unit/src/test/scala/tests/cli/CliSuite.scala @@ -194,7 +194,7 @@ class CliSuite extends BaseCliSuite { ) checkCliMulti( - "lifeCycle", + "lifeCycle-0", """ |/file1.md |# file 1 @@ -214,21 +214,21 @@ class CliSuite extends BaseCliSuite { |/file1.md |# file 1 |One - |numberOfStarts = 1 ; numberOfExists = 0 ; numberOfPreProcess = 1 ; numberOfPostProcess = 0 + |numberOfStarts = 1 ; numberOfExists = 0 |/file2.md |# file 2 |Two - |numberOfStarts = 1 ; numberOfExists = 0 ; numberOfPreProcess = 2 ; numberOfPostProcess = 1 + |numberOfStarts = 1 ; numberOfExists = 0 """.stripMargin, """ |/file1.md |# file 1 |One - |numberOfStarts = 1 ; numberOfExists = 0 ; numberOfPreProcess = 2 ; numberOfPostProcess = 1 + |numberOfStarts = 1 ; numberOfExists = 0 |/file2.md |# file 2 |Two - |numberOfStarts = 1 ; numberOfExists = 0 ; numberOfPreProcess = 1 ; numberOfPostProcess = 0 + |numberOfStarts = 1 ; numberOfExists = 0 """.stripMargin ), // process counts per PostModifier instance, starts and exists per mdoc.Main process setup = { fixture => diff --git a/tests/unit/src/test/scala/tests/markdown/BulletPostModifier.scala b/tests/unit/src/test/scala/tests/markdown/BulletPostModifier.scala index dabe1a63f..3682983a7 100644 --- a/tests/unit/src/test/scala/tests/markdown/BulletPostModifier.scala +++ b/tests/unit/src/test/scala/tests/markdown/BulletPostModifier.scala @@ -16,10 +16,6 @@ class BulletPostModifier extends PostModifier { override def onStart(settings: MainSettings): Unit = () - override def preProcess(ctx: PostModifierContext): Unit = () - - override def postProcess(ctx: PostModifierContext): Unit = () - override def onExit(exit: Int): Unit = () } diff --git a/tests/unit/src/test/scala/tests/markdown/LifeCycleModifier.scala b/tests/unit/src/test/scala/tests/markdown/LifeCycleModifier.scala index c8e12eebe..dfb00292c 100644 --- a/tests/unit/src/test/scala/tests/markdown/LifeCycleModifier.scala +++ b/tests/unit/src/test/scala/tests/markdown/LifeCycleModifier.scala @@ -1,7 +1,6 @@ package tests.markdown import mdoc._ -import mdoc.internal.cli.Exit /** * Global counter used to test the [[mdoc.Main]] process counting. @@ -20,13 +19,10 @@ class LifeCycleModifier extends PostModifier { // Starts and stops per instance var numberOfStarts = 0 var numberOfExists = 0 - // Pre and post processing per instance - var numberOfPreProcess = 0 - var numberOfPostProcess = 0 def process(ctx: PostModifierContext): String = { // Used for checking the counting between threads - s"numberOfStarts = $numberOfStarts ; numberOfExists = $numberOfExists ; numberOfPreProcess = $numberOfPreProcess ; numberOfPostProcess = $numberOfPostProcess" + s"numberOfStarts = $numberOfStarts ; numberOfExists = $numberOfExists" } /** @@ -38,10 +34,6 @@ class LifeCycleModifier extends PostModifier { LifeCycleCounter.numberOfStarts.set(LifeCycleCounter.numberOfStarts.get() + 1) } - override def preProcess(ctx: PostModifierContext): Unit = { numberOfPreProcess += 1 } - - override def postProcess(ctx: PostModifierContext): Unit = { numberOfPostProcess += 1 } - /** * This is called once when the [[mdoc.Main]] process finishes * @param exit is the exit code returned by mdoc's processing From 9d05586d01fafce9505e044002f4a1b58d67b097 Mon Sep 17 00:00:00 2001 From: Hugo Miguel Ferreira Date: Wed, 18 Dec 2019 09:39:04 +0000 Subject: [PATCH 12/15] Added public Exit wrapper for PostModifier onExit. --- .../scala/mdoc/docs/EvilplotModifier.scala | 2 +- .../scala/mdoc/docs/LifeCycleModifier.scala | 2 +- mdoc/src/main/scala/mdoc/Exit.scala | 18 ++++++++++++++++++ mdoc/src/main/scala/mdoc/PostModifier.scala | 2 +- .../main/scala/mdoc/internal/cli/MainOps.scala | 6 +++--- .../tests/markdown/EvilplotPostModifier.scala | 4 ++-- .../tests/markdown/EvilplotPostModifier.scala | 4 ++-- .../tests/markdown/EvilplotPostModifier.scala | 4 ++-- .../tests/markdown/BulletPostModifier.scala | 4 ++-- .../tests/markdown/LifeCycleModifier.scala | 2 +- 10 files changed, 33 insertions(+), 15 deletions(-) create mode 100644 mdoc/src/main/scala/mdoc/Exit.scala diff --git a/mdoc-docs/src/main/scala/mdoc/docs/EvilplotModifier.scala b/mdoc-docs/src/main/scala/mdoc/docs/EvilplotModifier.scala index 81e691b5f..5b1e7435a 100644 --- a/mdoc-docs/src/main/scala/mdoc/docs/EvilplotModifier.scala +++ b/mdoc-docs/src/main/scala/mdoc/docs/EvilplotModifier.scala @@ -41,5 +41,5 @@ class EvilplotModifier extends PostModifier { override def onStart(settings: MainSettings): Unit = () - override def onExit(exit: Int): Unit = () + override def onExit(exit: Exit): Unit = () } diff --git a/mdoc-docs/src/main/scala/mdoc/docs/LifeCycleModifier.scala b/mdoc-docs/src/main/scala/mdoc/docs/LifeCycleModifier.scala index 11cf31672..d373557cb 100644 --- a/mdoc-docs/src/main/scala/mdoc/docs/LifeCycleModifier.scala +++ b/mdoc-docs/src/main/scala/mdoc/docs/LifeCycleModifier.scala @@ -35,7 +35,7 @@ class LifeCycleModifier extends PostModifier { * This is called once when the [[mdoc.Main]] process finsihes * @param exit is the exit code returned by mdoc's processing */ - override def onExit(exit: Int): Unit = { + override def onExit(exit: Exit): Unit = { numberOfExists += 1 LifeCycleCounter.numberOfExists.set(LifeCycleCounter.numberOfExists.get() + 1) } diff --git a/mdoc/src/main/scala/mdoc/Exit.scala b/mdoc/src/main/scala/mdoc/Exit.scala new file mode 100644 index 000000000..0a055329d --- /dev/null +++ b/mdoc/src/main/scala/mdoc/Exit.scala @@ -0,0 +1,18 @@ +package mdoc + +import mdoc.internal.cli.{Exit => CliExit} + +final class Exit private[mdoc] (val exit: CliExit) { + def merge(other: Exit): Exit = Exit(exit.merge(other.exit)) + def isSuccess: Boolean = exit == CliExit.success + def isError: Boolean = exit == CliExit.error +} + +object Exit { + def apply(exit: CliExit): Exit = { + new Exit(exit) + } + def apply(): Exit = { + Exit(CliExit.success) + } +} diff --git a/mdoc/src/main/scala/mdoc/PostModifier.scala b/mdoc/src/main/scala/mdoc/PostModifier.scala index 2deac6dd9..6533907b6 100644 --- a/mdoc/src/main/scala/mdoc/PostModifier.scala +++ b/mdoc/src/main/scala/mdoc/PostModifier.scala @@ -41,7 +41,7 @@ trait PostModifier { * a value of 1 indicates mdoc processing resulted in at least * one error. */ - def onExit(exit: Int): Unit = () + def onExit(exit: Exit): Unit = () } object PostModifier { diff --git a/mdoc/src/main/scala/mdoc/internal/cli/MainOps.scala b/mdoc/src/main/scala/mdoc/internal/cli/MainOps.scala index 545b78367..a5dfcfe58 100644 --- a/mdoc/src/main/scala/mdoc/internal/cli/MainOps.scala +++ b/mdoc/src/main/scala/mdoc/internal/cli/MainOps.scala @@ -234,13 +234,13 @@ object MainOps { ctx.settings.postModifiers.foreach(_.onStart(settings.get)) val runner = new MainOps(ctx) val exit = runner.run() - val exitCode = if (exit.isSuccess) { + val exitCode = mdoc.Exit(exit) + ctx.settings.postModifiers.foreach(_.onExit(exitCode)) + if (exit.isSuccess) { 0 } else { 1 // error } - ctx.settings.postModifiers.foreach(_.onExit(exitCode)) - exitCode } } } diff --git a/tests/unit/src/test/scala-2.11/tests/markdown/EvilplotPostModifier.scala b/tests/unit/src/test/scala-2.11/tests/markdown/EvilplotPostModifier.scala index 9bd970ecd..024f2d330 100644 --- a/tests/unit/src/test/scala-2.11/tests/markdown/EvilplotPostModifier.scala +++ b/tests/unit/src/test/scala-2.11/tests/markdown/EvilplotPostModifier.scala @@ -1,6 +1,6 @@ package tests.markdown -import mdoc.{MainSettings, PostModifier, PostModifierContext} +import mdoc.{MainSettings, PostModifier, PostModifierContext, Exit} class EvilplotPostModifier extends PostModifier { val name = "evilplot" @@ -9,5 +9,5 @@ class EvilplotPostModifier extends PostModifier { override def onStart(settings: MainSettings): Unit = () - override def onExit(exit: Int): Unit = () + override def onExit(exit: Exit): Unit = () } diff --git a/tests/unit/src/test/scala-2.12/tests/markdown/EvilplotPostModifier.scala b/tests/unit/src/test/scala-2.12/tests/markdown/EvilplotPostModifier.scala index 1018be59d..b78eba353 100644 --- a/tests/unit/src/test/scala-2.12/tests/markdown/EvilplotPostModifier.scala +++ b/tests/unit/src/test/scala-2.12/tests/markdown/EvilplotPostModifier.scala @@ -3,7 +3,7 @@ package tests.markdown import com.cibo.evilplot.geometry.Drawable import java.nio.file.Files -import mdoc.{MainSettings, PostModifier, PostModifierContext} +import mdoc.{Exit, MainSettings, PostModifier, PostModifierContext} class EvilplotPostModifier extends PostModifier { val name = "evilplot" @@ -31,6 +31,6 @@ class EvilplotPostModifier extends PostModifier { override def onStart(settings: MainSettings): Unit = () - override def onExit(exit: Int): Unit = () + override def onExit(exit: Exit): Unit = () } diff --git a/tests/unit/src/test/scala-2.13/tests/markdown/EvilplotPostModifier.scala b/tests/unit/src/test/scala-2.13/tests/markdown/EvilplotPostModifier.scala index 0a56fd9ca..ad7517edd 100644 --- a/tests/unit/src/test/scala-2.13/tests/markdown/EvilplotPostModifier.scala +++ b/tests/unit/src/test/scala-2.13/tests/markdown/EvilplotPostModifier.scala @@ -1,6 +1,6 @@ package tests.markdown -import mdoc.{MainSettings, PostModifier, PostModifierContext} +import mdoc.{MainSettings, PostModifier, PostModifierContext, Exit} class EvilplotPostModifier extends PostModifier { val name = "evilplot" @@ -8,5 +8,5 @@ class EvilplotPostModifier extends PostModifier { override def onStart(settings: MainSettings): Unit = () - override def onExit(exit: Int): Unit = () + override def onExit(exit: Exit): Unit = () } diff --git a/tests/unit/src/test/scala/tests/markdown/BulletPostModifier.scala b/tests/unit/src/test/scala/tests/markdown/BulletPostModifier.scala index 3682983a7..7c10f08d6 100644 --- a/tests/unit/src/test/scala/tests/markdown/BulletPostModifier.scala +++ b/tests/unit/src/test/scala/tests/markdown/BulletPostModifier.scala @@ -1,6 +1,6 @@ package tests.markdown -import mdoc.{MainSettings, PostModifier, PostModifierContext} +import mdoc.{Exit, MainSettings, PostModifier, PostModifierContext} class BulletPostModifier extends PostModifier { val name = "bullet" @@ -16,6 +16,6 @@ class BulletPostModifier extends PostModifier { override def onStart(settings: MainSettings): Unit = () - override def onExit(exit: Int): Unit = () + override def onExit(exit: Exit): Unit = () } diff --git a/tests/unit/src/test/scala/tests/markdown/LifeCycleModifier.scala b/tests/unit/src/test/scala/tests/markdown/LifeCycleModifier.scala index dfb00292c..b50a0a05b 100644 --- a/tests/unit/src/test/scala/tests/markdown/LifeCycleModifier.scala +++ b/tests/unit/src/test/scala/tests/markdown/LifeCycleModifier.scala @@ -38,7 +38,7 @@ class LifeCycleModifier extends PostModifier { * This is called once when the [[mdoc.Main]] process finishes * @param exit is the exit code returned by mdoc's processing */ - override def onExit(exit: Int): Unit = { + override def onExit(exit: Exit): Unit = { numberOfExists += 1 LifeCycleCounter.numberOfExists.set(LifeCycleCounter.numberOfExists.get() + 1) } From 57984e66f5e3f751573f405e6bfcf769f1ea01d6 Mon Sep 17 00:00:00 2001 From: Hugo Miguel Ferreira Date: Sat, 28 Dec 2019 11:45:34 +0000 Subject: [PATCH 13/15] Public companion object Exit's apply method now package private. LifeCycleCounter now has a reset method that is used in the CliSuite test. --- mdoc/src/main/scala/mdoc/Exit.scala | 2 +- tests/unit/src/test/scala/tests/cli/CliSuite.scala | 3 +-- .../test/scala/tests/markdown/LifeCycleModifier.scala | 11 +++++++++++ 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/mdoc/src/main/scala/mdoc/Exit.scala b/mdoc/src/main/scala/mdoc/Exit.scala index 0a055329d..b62e9ffa0 100644 --- a/mdoc/src/main/scala/mdoc/Exit.scala +++ b/mdoc/src/main/scala/mdoc/Exit.scala @@ -9,7 +9,7 @@ final class Exit private[mdoc] (val exit: CliExit) { } object Exit { - def apply(exit: CliExit): Exit = { + private[mdoc] def apply(exit: CliExit): Exit = { new Exit(exit) } def apply(): Exit = { diff --git a/tests/unit/src/test/scala/tests/cli/CliSuite.scala b/tests/unit/src/test/scala/tests/cli/CliSuite.scala index b175c4588..52b16f225 100644 --- a/tests/unit/src/test/scala/tests/cli/CliSuite.scala +++ b/tests/unit/src/test/scala/tests/cli/CliSuite.scala @@ -235,8 +235,7 @@ class CliSuite extends BaseCliSuite { // Global thread local counter updated by all mdoc.Main process // All tests in this test suite run sequentially but change the counter // So make sure we start anew for this test - LifeCycleCounter.numberOfStarts.set(0) - LifeCycleCounter.numberOfExists.set(0) + LifeCycleCounter.reset() }, onStdout = { out => assert(out.contains("Compiling 2 files to")) diff --git a/tests/unit/src/test/scala/tests/markdown/LifeCycleModifier.scala b/tests/unit/src/test/scala/tests/markdown/LifeCycleModifier.scala index b50a0a05b..0655b8b00 100644 --- a/tests/unit/src/test/scala/tests/markdown/LifeCycleModifier.scala +++ b/tests/unit/src/test/scala/tests/markdown/LifeCycleModifier.scala @@ -11,8 +11,19 @@ import mdoc._ object LifeCycleCounter { val numberOfStarts: ThreadLocal[Integer] = ThreadLocal.withInitial(() => 0) val numberOfExists: ThreadLocal[Integer] = ThreadLocal.withInitial(() => 0) + + /** + * Reset counters to zero. + */ + def reset(): Unit = { + LifeCycleCounter.numberOfStarts.set(0) + LifeCycleCounter.numberOfExists.set(0) + } } +/** + * PostModifier used for testing the [[onStart()]] and [[onExit()]] calls. + */ class LifeCycleModifier extends PostModifier { val name = "lifecycle" From 55ed7e25f9353c316e5f439f2dd8ff1df695f425 Mon Sep 17 00:00:00 2001 From: Hugo Miguel Ferreira Date: Sat, 28 Dec 2019 11:57:39 +0000 Subject: [PATCH 14/15] Reformatting LifeCycleCounter due to reset method change. --- .../src/test/scala/tests/markdown/LifeCycleModifier.scala | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/unit/src/test/scala/tests/markdown/LifeCycleModifier.scala b/tests/unit/src/test/scala/tests/markdown/LifeCycleModifier.scala index 0655b8b00..2759099b3 100644 --- a/tests/unit/src/test/scala/tests/markdown/LifeCycleModifier.scala +++ b/tests/unit/src/test/scala/tests/markdown/LifeCycleModifier.scala @@ -13,8 +13,8 @@ object LifeCycleCounter { val numberOfExists: ThreadLocal[Integer] = ThreadLocal.withInitial(() => 0) /** - * Reset counters to zero. - */ + * Reset counters to zero. + */ def reset(): Unit = { LifeCycleCounter.numberOfStarts.set(0) LifeCycleCounter.numberOfExists.set(0) @@ -22,8 +22,8 @@ object LifeCycleCounter { } /** - * PostModifier used for testing the [[onStart()]] and [[onExit()]] calls. - */ + * PostModifier used for testing the [[onStart()]] and [[onExit()]] calls. + */ class LifeCycleModifier extends PostModifier { val name = "lifecycle" From 0bb50a113a3c42db90f925729b0fcc030c346a7f Mon Sep 17 00:00:00 2001 From: Hugo Miguel Ferreira Date: Sat, 28 Dec 2019 13:52:47 +0000 Subject: [PATCH 15/15] Removed unnecessary test in CliSuite. --- .../test/scala/tests/cli/BaseCliSuite.scala | 131 ------------------ .../src/test/scala/tests/cli/CliSuite.scala | 34 ++--- 2 files changed, 11 insertions(+), 154 deletions(-) diff --git a/tests/unit/src/test/scala/tests/cli/BaseCliSuite.scala b/tests/unit/src/test/scala/tests/cli/BaseCliSuite.scala index 618be8f43..a579f06d4 100644 --- a/tests/unit/src/test/scala/tests/cli/BaseCliSuite.scala +++ b/tests/unit/src/test/scala/tests/cli/BaseCliSuite.scala @@ -4,14 +4,11 @@ import java.io.ByteArrayOutputStream import java.io.PrintStream import java.nio.file.Files import java.nio.file.Path - import org.scalatest.FunSuite - import scala.meta.io.AbsolutePath import scala.meta.testkit.DiffAssertions import scala.meta.testkit.StringFS import mdoc.Main -import org.scalactic.source.Position case class CliFixture(in: Path, out: Path) @@ -49,132 +46,4 @@ abstract class BaseCliSuite extends FunSuite with DiffAssertions { onStdout(stdout) } } - - def assertOneSameOrPrintExpected(obtained: String, expected: List[String], title: String = "")( - implicit source: Position - ): Boolean = { - try assertAllDiff(obtained, expected, title) - catch { - case ex: Exception => - obtained.linesIterator.toList match { - case head +: tail => - println(" \"\"\"|" + head) - tail.foreach(line => println(" |" + line)) - case head +: Nil => - println(head) - case Nil => - println("obtained is empty") - } - throw ex - } - } - - // scala.meta.testkit.DiffAssertions - // Cannot access these because they are private - import collection.JavaConverters._ - import org.scalatest.exceptions.{StackDepthException, TestFailedException} - - def splitIntoLines(string: String): Seq[String] = - string.trim.replace("\r\n", "\n").split("\n") - - def compareContents(original: String, revised: String): String = - compareContents(splitIntoLines(original), splitIntoLines(revised)) - - def compareContents(original: Seq[String], revised: Seq[String]): String = { - val diff = difflib.DiffUtils.diff(original.asJava, revised.asJava) - if (diff.getDeltas.isEmpty) "" - else - difflib.DiffUtils - .generateUnifiedDiff( - "obtained", - "expected", - original.asJava, - diff, - 1 - ) - .asScala - .mkString("\n") - } - - case class DiffFailure( - title: String, - expected: String, - obtained: String, - diff: String, - source: Position - ) extends TestFailedException( - { _: StackDepthException => - Some(title + "\n" + error2message(obtained, expected)) - }, - None, - source - ) - - def header[T](t: T): String = { - val line = s"=" * (t.toString.length + 3) - s"$line\n=> $t\n$line" - } - - def stripTrailingWhitespace(str: String): String = str.replaceAll(" \n", "∙\n") - - private def error2message(obtained: String, expected: String): String = { - val sb = new StringBuilder - if (obtained.length < 1000) { - sb.append( - s"""#${header("Obtained")} - #${stripTrailingWhitespace(obtained)} - # - #""".stripMargin('#') - ) - } - sb.append( - s"""#${header("Diff")} - #${stripTrailingWhitespace(compareContents(obtained, expected))}""".stripMargin('#') - ) - sb.toString() - } - - def assertAllDiff(obtained: String, expected: List[String], title: String = "")( - implicit source: Position - ): Boolean = { - val theSame = expected.filter(p => compareContents(obtained, p).isEmpty) - val result = expected.foldLeft("")((acc, p) => acc + compareContents(obtained, p)) - if (theSame.nonEmpty) true - else { - throw DiffFailure(title, expected.mkString(" OR \n"), obtained, result, source) - } - } - - def checkCliMulti( - name: String, - original: String, - expected: List[String], - extraArgs: Array[String] = Array.empty, - setup: CliFixture => Unit = _ => (), - expectedExitCode: Int = 0, - onStdout: String => Unit = _ => () - ): Unit = { - test(name) { - myStdout.reset() - val in = StringFS.fromString(original) - val out = Files.createTempDirectory("mdoc") - setup(CliFixture(in.toNIO, out)) - val args = Array[String]( - "--in", - in.toString, - "--out", - out.toString, - "--cwd", - in.toString, - "--site.version", - "1.0.0" - ) - val code = Main.process(args ++ extraArgs, new PrintStream(myStdout), in.toNIO) - val stdout = fansi.Str(myStdout.toString()).plainText - assert(code == expectedExitCode, stdout) - val obtained = StringFS.asString(AbsolutePath(out)) - assertOneSameOrPrintExpected(obtained, expected) - onStdout(stdout) - } - } } diff --git a/tests/unit/src/test/scala/tests/cli/CliSuite.scala b/tests/unit/src/test/scala/tests/cli/CliSuite.scala index 52b16f225..0034ce70d 100644 --- a/tests/unit/src/test/scala/tests/cli/CliSuite.scala +++ b/tests/unit/src/test/scala/tests/cli/CliSuite.scala @@ -193,7 +193,7 @@ class CliSuite extends BaseCliSuite { |""".stripMargin ) - checkCliMulti( + checkCli( "lifeCycle-0", """ |/file1.md @@ -209,28 +209,16 @@ class CliSuite extends BaseCliSuite { |val x2 = 2 |``` | """.stripMargin, - List( - """ - |/file1.md - |# file 1 - |One - |numberOfStarts = 1 ; numberOfExists = 0 - |/file2.md - |# file 2 - |Two - |numberOfStarts = 1 ; numberOfExists = 0 - """.stripMargin, - """ - |/file1.md - |# file 1 - |One - |numberOfStarts = 1 ; numberOfExists = 0 - |/file2.md - |# file 2 - |Two - |numberOfStarts = 1 ; numberOfExists = 0 - """.stripMargin - ), // process counts per PostModifier instance, starts and exists per mdoc.Main process + """ + |/file1.md + |# file 1 + |One + |numberOfStarts = 1 ; numberOfExists = 0 + |/file2.md + |# file 2 + |Two + |numberOfStarts = 1 ; numberOfExists = 0 + """.stripMargin, // process counts per PostModifier instance, starts and exists per mdoc.Main process setup = { fixture => // Global thread local counter updated by all mdoc.Main process // All tests in this test suite run sequentially but change the counter