From 83a505a94a1c8e3a6331ef6e8d9e276c03e52a51 Mon Sep 17 00:00:00 2001 From: yan Date: Wed, 3 Jul 2019 19:33:19 +0500 Subject: [PATCH 1/7] issue-222: - copied code to Search --- .../scala/codesearch/core/search/Search.scala | 99 ++++++++++++------- 1 file changed, 66 insertions(+), 33 deletions(-) diff --git a/core/src/main/scala/codesearch/core/search/Search.scala b/core/src/main/scala/codesearch/core/search/Search.scala index b49fe43..b07b9a6 100644 --- a/core/src/main/scala/codesearch/core/search/Search.scala +++ b/core/src/main/scala/codesearch/core/search/Search.scala @@ -10,15 +10,15 @@ import cats.syntax.option._ import codesearch.core.config.{Config, SnippetConfig} import codesearch.core.index.directory.СindexDirectory import codesearch.core.index.repository.Extensions -import codesearch.core.search.Search.{CSearchPage, CSearchResult, CodeSnippet, Package, PackageResult, snippetConfig} +import codesearch.core.regex.RegexConstructor +import codesearch.core.search.Search.{CSearchPage, CSearchResult, CodeSnippet, ErrorResponse, Package, PackageResult, Response, SearchByIndexResult, snippetConfig} import codesearch.core.search.SnippetsGrouper.SnippetInfo import codesearch.core.util.Helper.readFileAsync import fs2.{Pipe, Stream} import io.chrisdavenport.log4cats.SelfAwareStructuredLogger import io.chrisdavenport.log4cats.slf4j.Slf4jLogger -import codesearch.core.regex.RegexConstructor -import scala.sys.process.Process +import scala.sys.process.{Process, ProcessLogger} trait Search { @@ -29,21 +29,33 @@ trait Search { implicit val root: NioPath = cindexDir.root - def search(request: SearchRequest): IO[CSearchPage] = { - for { - lines <- csearch(request) - results <- Stream - .emits(lines) - .through(SnippetsGrouper.groupLines(snippetConfig)) - .drop(snippetConfig.pageSize * (request.page - 1)) - .take(snippetConfig.pageSize) - .evalMap(createSnippet) - .through(groupByPackage) - .compile - .toList - } yield CSearchPage(results.sortBy(_.pack.name), lines.size) + def search(request: SearchRequest): IO[Response] = { + checkRegexpForValid(request.query).attempt.flatMap { + case Left(error) => + IO(createErrorResponse(error)) + case Right(_) => + val entity = csearch(request) + for { + results <- Stream + .emits(entity.lists) + .through(SnippetsGrouper.groupLines(snippetConfig)) + .drop(snippetConfig.pageSize * (request.page - 1)) + .take(snippetConfig.pageSize) + .evalMap(createSnippet) + .through(groupByPackage) + .compile + .toList + } yield CSearchPage(results.sortBy(_.pack.name), entity.lists.length) + } } + def checkRegexpForValid(regexp: String): IO[Pattern] = { + IO { Pattern.compile(regexp) } + } + + private def createErrorResponse(error: Throwable): ErrorResponse = + ErrorResponse(error.getMessage.substring(0, 1).toUpperCase + error.getMessage.substring(1, error.getMessage.length)) + /** * Build package name and path to remote repository * @@ -69,14 +81,15 @@ trait Search { */ protected def buildRepUrl(packageName: String, version: String): String - private def csearch(request: SearchRequest): IO[List[String]] = { + private def csearch(request: SearchRequest): SearchByIndexResult = { val indexDir = cindexDir.indexDirAs[String] val env = ("CSEARCHINDEX", indexDir) - - for { - _ <- logger.debug(s"running CSEARCHINDEX=$indexDir ${arguments(request).mkString(" ")}") - results <- IO((Process(arguments(request), None, env) #| Seq("head", "-1001")).lineStream.toList) - } yield results + var stderr = new String + val log = ProcessLogger((o: String) => o, (e: String) => stderr = e) + val test = for { + results <- IO((Process(arguments(request), None, env) #| Seq("head", "-1001")).lineStream_!(log).toList) + } yield SearchByIndexResult(results, ErrorResponse(stderr)) + test.unsafeRunSync() } private def arguments(request: SearchRequest): List[String] = { @@ -148,17 +161,6 @@ object Search { .map(_.snippetConfig) .unsafeRunSync() - /** - * result of searching - * - * @param data code snippets grouped by package - * @param total number of total matches - */ - final case class CSearchPage( - data: Seq[PackageResult], - total: Int - ) - /** * * @param relativePath path into package sources @@ -203,4 +205,35 @@ object Search { pack: Package, result: CodeSnippet ) + + + sealed trait Response + /** + * result of searching + * + * @param data code snippets grouped by package + * @param total number of total matches + */ + final case class CSearchPage( + data: Seq[PackageResult], + total: Int + ) extends Response + + final case class SearchByIndexResult(lists: List[String], error: ErrorResponse) + final case class ErrorResponse(message: String) extends Response + final case class SuccessResponse( + updated: String, + packages: Seq[PackageResult], + query: String, + filter: Option[String], + filePath: Option[String], + insensitive: Boolean, + space: Boolean, + precise: Boolean, + sources: Boolean, + page: Int, + totalMatches: Int, + callURI: String, + lang: String + ) extends Response } From 3e092002fa08ebba6e9e823de973f8201c3ba73f Mon Sep 17 00:00:00 2001 From: yan Date: Sat, 6 Jul 2019 20:43:08 +0500 Subject: [PATCH 2/7] issue-222: - copied code from old branch --- .../web/controllers/SearchController.scala | 36 +++--- .../app/views/searchBoxError.scala.html | 107 ++++++++++++++++++ web-server/app/views/searchResults.scala.html | 44 ++++--- 3 files changed, 148 insertions(+), 39 deletions(-) create mode 100644 web-server/app/views/searchBoxError.scala.html diff --git a/web-server/app/codesearch/web/controllers/SearchController.scala b/web-server/app/codesearch/web/controllers/SearchController.scala index 2f2dcd1..90dc132 100644 --- a/web-server/app/codesearch/web/controllers/SearchController.scala +++ b/web-server/app/codesearch/web/controllers/SearchController.scala @@ -5,7 +5,7 @@ import cats.instances.future._ import codesearch.core.db.DefaultDB import codesearch.core.index.directory.Directory import codesearch.core.model.DefaultTable -import codesearch.core.search.Search.CSearchPage +import codesearch.core.search.Search.{CSearchPage, ErrorResponse, SuccessResponse} import codesearch.core.search.{Search, SearchRequest} import codesearch.core.util.Helper import com.github.marlonlom.utilities.timeago.TimeAgo @@ -33,7 +33,7 @@ trait SearchController[V <: DefaultTable] { self: InjectedController => updated = TimeAgo.using(updated.getTime), lang = lang ) - ) + ) ) } @@ -57,21 +57,27 @@ trait SearchController[V <: DefaultTable] { self: InjectedController => case CSearchPage(results, total) => Ok( views.html.searchResults( - updated = TimeAgo.using(updated.getTime), - packages = results, - query = searchRequest.query, - filter = searchRequest.filter, - filePath = searchRequest.filePath, - insensitive = searchRequest.insensitive, - space = searchRequest.spaceInsensitive, - precise = searchRequest.preciseMatch, - sources = searchRequest.sourcesOnly, - page = searchRequest.page, - totalMatches = total, - callURI = searchRequest.callURI(host).toString, - lang = lang + response = SuccessResponse( + updated = TimeAgo.using(updated.getTime), + packages = results, + query = searchRequest.query, + filter = searchRequest.filter, + filePath = searchRequest.filePath, + insensitive = searchRequest.insensitive, + space = searchRequest.spaceInsensitive, + precise = searchRequest.preciseMatch, + sources = searchRequest.sourcesOnly, + page = searchRequest.page, + totalMatches = total, + callURI = searchRequest.callURI(host).toString, + lang = lang + ) ) ) + case er @ ErrorResponse(_) => + Ok( + views.html.searchResults(er) + ) } unsafeToFuture } } diff --git a/web-server/app/views/searchBoxError.scala.html b/web-server/app/views/searchBoxError.scala.html new file mode 100644 index 0000000..c5ca03a --- /dev/null +++ b/web-server/app/views/searchBoxError.scala.html @@ -0,0 +1,107 @@ +@(errorMessageT: String) + +
+
+
+
Please provide a string to search for.
+ @if(errorMessageT.nonEmpty) { +
️⚠️ @{errorMessageT}
+ } +
+ +
+ +
+
+
3+ characters are required.
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+ diff --git a/web-server/app/views/searchResults.scala.html b/web-server/app/views/searchResults.scala.html index c949666..2a799e7 100644 --- a/web-server/app/views/searchResults.scala.html +++ b/web-server/app/views/searchResults.scala.html @@ -1,29 +1,25 @@ -@import codesearch.core.search.Search.PackageResult - +@import codesearch.core.search.{ErrorResponse, Response, SuccessResponse} @( - updated: String, - packages: Seq[PackageResult], - query: String, - filter: Option[String], - filePath: Option[String], - insensitive: Boolean, - space: Boolean, - precise: Boolean, - sources: Boolean, - page: Int, - totalMatches: Int, - callURI: String, - lang: String +response: Response ) - @headExtra = { - - - - } +@headExtra = { + + + +} - @wrapper(s"Codesearch | $lang", headExtra) { - @searchBox(s"/$lang/search", query, filter, filePath, insensitive, space, precise, sources) - @resultFrame(lang, insensitive, space, precise, query, updated, packages, totalMatches) - @pagination(page, totalMatches, callURI) +@response match { + case SuccessResponse(updated, packages, query, filter, filePath, insensitive, space, precise, sources, page, totalMatches, callURI, lang) => { + @wrapper(s"Codesearch | $lang", headExtra) { + @searchBox(s"/$lang/search", query, filter, filePath, insensitive, space, precise, sources) + @resultFrame(lang, insensitive, space, precise, query, updated, packages, totalMatches) + @pagination(page, totalMatches, callURI) + } + } + case ErrorResponse(message) => { + @wrapper(s"Codesearch ", headExtra) { + @searchBoxError(message) + } } + } From a89efa92df2db18d51a9a657ad295a2d1b18c30f Mon Sep 17 00:00:00 2001 From: yan Date: Sat, 6 Jul 2019 20:51:35 +0500 Subject: [PATCH 3/7] issue-222: - copied code from old branch --- project/Builder.scala | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/project/Builder.scala b/project/Builder.scala index 0c1f677..aad0014 100644 --- a/project/Builder.scala +++ b/project/Builder.scala @@ -50,7 +50,8 @@ object Builder { "org.codehaus.janino" % "janino" % "3.0.11", "com.typesafe.play" %% "play-json" % "2.6.9", "com.github.mpilquist" %% "simulacrum" % "0.13.0", - "org.typelevel" %% "cats-core" % "1.2.0" + "org.typelevel" %% "cats-core" % "1.2.0", + "com.google.re2j" % "re2j" % "1.2" ) ) From 34fa505c8ff849bb71e86eddaac976e436cb04d1 Mon Sep 17 00:00:00 2001 From: yan Date: Sat, 6 Jul 2019 20:56:35 +0500 Subject: [PATCH 4/7] issue-222: - massive scalafmt edit --- .../scala/codesearch/core/db/DefaultDB.scala | 3 +- .../core/index/directory/Extractor.scala | 11 +++-- .../core/index/repository/Downloader.scala | 1 - .../core/regex/lexer/Tokenizer.scala | 8 ++-- .../scala/codesearch/core/search/Search.scala | 3 +- .../core/search/SearchRequest.scala | 6 ++- .../core/regex/lexer/TokenizerSpec.scala | 42 ++++++++++++------- .../core/search/SnippetsGrouperSpec.scala | 6 +-- .../test/scala/integration/TestFixture.scala | 4 +- .../web/controllers/Application.scala | 9 ++-- .../web/controllers/NpmSearcher.scala | 3 +- 11 files changed, 59 insertions(+), 37 deletions(-) diff --git a/core/src/main/scala/codesearch/core/db/DefaultDB.scala b/core/src/main/scala/codesearch/core/db/DefaultDB.scala index d23bda7..27ee86b 100644 --- a/core/src/main/scala/codesearch/core/db/DefaultDB.scala +++ b/core/src/main/scala/codesearch/core/db/DefaultDB.scala @@ -24,7 +24,8 @@ trait DefaultDB[T <: DefaultTable] { pack.name, pack.version, new Timestamp(System.currentTimeMillis()) - )) + ) + ) IO.fromFuture(IO(db.run(insOrUpdate))) } diff --git a/core/src/main/scala/codesearch/core/index/directory/Extractor.scala b/core/src/main/scala/codesearch/core/index/directory/Extractor.scala index 0cb2eea..bf3a172 100644 --- a/core/src/main/scala/codesearch/core/index/directory/Extractor.scala +++ b/core/src/main/scala/codesearch/core/index/directory/Extractor.scala @@ -1,6 +1,5 @@ package codesearch.core.index.directory -import java.io.File import java.nio.file.Path import cats.effect.Sync @@ -45,9 +44,13 @@ private[index] trait Extractor { val dir = unarchived.toFile dir.listFiles .filter(_.isDirectory) - .foreach(_.listFiles.foreach(file => - if (file.isDirectory) moveDirectoryToDirectory(file, dir, false) - else moveFileToDirectory(file, dir, false))) + .foreach( + _.listFiles.foreach( + file => + if (file.isDirectory) moveDirectoryToDirectory(file, dir, false) + else moveFileToDirectory(file, dir, false) + ) + ) unarchived } } diff --git a/core/src/main/scala/codesearch/core/index/repository/Downloader.scala b/core/src/main/scala/codesearch/core/index/repository/Downloader.scala index 38c3bff..fc05a16 100644 --- a/core/src/main/scala/codesearch/core/index/repository/Downloader.scala +++ b/core/src/main/scala/codesearch/core/index/repository/Downloader.scala @@ -1,6 +1,5 @@ package codesearch.core.index.repository -import java.io.File import java.nio.ByteBuffer import java.nio.file.Path import java.nio.file.StandardOpenOption.{CREATE, TRUNCATE_EXISTING} diff --git a/core/src/main/scala/codesearch/core/regex/lexer/Tokenizer.scala b/core/src/main/scala/codesearch/core/regex/lexer/Tokenizer.scala index dfbbda5..831ed0c 100644 --- a/core/src/main/scala/codesearch/core/regex/lexer/Tokenizer.scala +++ b/core/src/main/scala/codesearch/core/regex/lexer/Tokenizer.scala @@ -1,8 +1,8 @@ package codesearch.core.regex.lexer -import fastparse._ -import NoWhitespace._ import codesearch.core.regex.lexer.tokens._ +import fastparse.NoWhitespace._ +import fastparse._ object Tokenizer { @@ -46,5 +46,7 @@ object Tokenizer { private def parserAnyStringBeforeSpecialSymbol[_: P] = P((!" " ~ !specialSymbols ~ AnyChar).rep(1).!.map(Literal)) private def parseStringWithSpecialSymbols[_: P] = - P(parserEscaped | parserCharSet | parserAnyStringBeforeSpecialSymbol | parseSpaces | parseRepetitionSeq | parserSpecialSymbol).rep + P( + parserEscaped | parserCharSet | parserAnyStringBeforeSpecialSymbol | parseSpaces | parseRepetitionSeq | parserSpecialSymbol + ).rep } diff --git a/core/src/main/scala/codesearch/core/search/Search.scala b/core/src/main/scala/codesearch/core/search/Search.scala index b07b9a6..ddc1725 100644 --- a/core/src/main/scala/codesearch/core/search/Search.scala +++ b/core/src/main/scala/codesearch/core/search/Search.scala @@ -2,6 +2,7 @@ package codesearch.core.search import java.net.URLDecoder import java.nio.file.{Path => NioPath} +import java.util.regex.Pattern import ammonite.ops.{Path, pwd} import cats.data.NonEmptyVector @@ -206,8 +207,8 @@ object Search { result: CodeSnippet ) - sealed trait Response + /** * result of searching * diff --git a/core/src/main/scala/codesearch/core/search/SearchRequest.scala b/core/src/main/scala/codesearch/core/search/SearchRequest.scala index 82e3025..a408ccf 100644 --- a/core/src/main/scala/codesearch/core/search/SearchRequest.scala +++ b/core/src/main/scala/codesearch/core/search/SearchRequest.scala @@ -32,7 +32,9 @@ case class SearchRequest( def stringify(x: Boolean): String = if (x) "on" else "off" uri"$host/$lang/search?query=$query&filter=$filter&filePath=$filePath&insensitive=${stringify(insensitive)}&space=${stringify( - spaceInsensitive)}&precise=${stringify(preciseMatch)}&sources=${stringify(sourcesOnly)}" + spaceInsensitive + ) + }&precise=${stringify(preciseMatch)}&sources=${stringify(sourcesOnly)}" } } @@ -57,7 +59,7 @@ object SearchRequest { isEnabled(spaceInsensitive), isEnabled(preciseMatch), isEnabled(sourcesOnly), - page.toInt, + page.toInt ) } diff --git a/core/src/test/scala/codesearch/core/regex/lexer/TokenizerSpec.scala b/core/src/test/scala/codesearch/core/regex/lexer/TokenizerSpec.scala index 690c6cd..b5bce59 100644 --- a/core/src/test/scala/codesearch/core/regex/lexer/TokenizerSpec.scala +++ b/core/src/test/scala/codesearch/core/regex/lexer/TokenizerSpec.scala @@ -1,8 +1,9 @@ package codesearch.core.regex.lexer -import scala.io.Source -import org.scalatest.{FreeSpec, Matchers} import codesearch.core.regex.lexer.tokens._ +import org.scalatest.{FreeSpec, Matchers} + +import scala.io.Source class TokenizerSpec extends FreeSpec with Matchers { @@ -25,17 +26,21 @@ class TokenizerSpec extends FreeSpec with Matchers { testParseAndRender( "Hello World + ?", - Seq(Literal("Hello"), - Space(" "), - Literal("World"), - Space(" "), - SpecialSymbol("+"), - Space(" "), - SpecialSymbol("?")) + Seq( + Literal("Hello"), + Space(" "), + Literal("World"), + Space(" "), + SpecialSymbol("+"), + Space(" "), + SpecialSymbol("?") + ) ) - testParseAndRender("Hello World [^Gared]", - Seq(Literal("Hello"), Space(" "), Literal("World"), Space(" "), CharSet("[^Gared]"))) + testParseAndRender( + "Hello World [^Gared]", + Seq(Literal("Hello"), Space(" "), Literal("World"), Space(" "), CharSet("[^Gared]")) + ) testParseAndRender( "Hello World [^Gared] (Bale) \\Symbol", @@ -101,12 +106,16 @@ class TokenizerSpec extends FreeSpec with Matchers { testParseAndRender("|", Seq(SpecialSymbol("|"))) testParseAndRender("^", Seq(SpecialSymbol("^"))) testParseAndRender("$", Seq(SpecialSymbol("$"))) - testParseAndRender("ax.,.c", - Seq(Literal("ax"), SpecialSymbol("."), Literal(","), SpecialSymbol("."), Literal("c"))) + testParseAndRender( + "ax.,.c", + Seq(Literal("ax"), SpecialSymbol("."), Literal(","), SpecialSymbol("."), Literal("c")) + ) testParseAndRender("a|^", Seq(Literal("a"), SpecialSymbol("|"), SpecialSymbol("^"))) testParseAndRender("a|b", Seq(Literal("a"), SpecialSymbol("|"), Literal("b"))) - testParseAndRender("(a)|b", - Seq(SpecialSymbol("("), Literal("a"), SpecialSymbol(")"), SpecialSymbol("|"), Literal("b"))) + testParseAndRender( + "(a)|b", + Seq(SpecialSymbol("("), Literal("a"), SpecialSymbol(")"), SpecialSymbol("|"), Literal("b")) + ) testParseAndRender("a*", Seq(Literal("a"), SpecialSymbol("*"))) testParseAndRender("a??", Seq(Literal("a"), SpecialSymbol("?"), SpecialSymbol("?"))) } @@ -121,7 +130,8 @@ class TokenizerSpec extends FreeSpec with Matchers { testParseAndRender("a{2,3}", Seq(Literal("a"), RepetitionSeq("{2,3}"))) testParseAndRender( "a{2, 3}", - Seq(Literal("a"), SpecialSymbol("{"), Literal("2,"), Space(" "), Literal("3"), SpecialSymbol("}"))) + Seq(Literal("a"), SpecialSymbol("{"), Literal("2,"), Space(" "), Literal("3"), SpecialSymbol("}")) + ) testParseAndRender("a{,3}", Seq(Literal("a"), SpecialSymbol("{"), Literal(",3"), SpecialSymbol("}"))) testParseAndRender("a{2,}", Seq(Literal("a"), RepetitionSeq("{2,}"))) testParseAndRender("a{,}", Seq(Literal("a"), SpecialSymbol("{"), Literal(","), SpecialSymbol("}"))) diff --git a/core/src/test/scala/codesearch/core/search/SnippetsGrouperSpec.scala b/core/src/test/scala/codesearch/core/search/SnippetsGrouperSpec.scala index 14152a8..fe24da7 100644 --- a/core/src/test/scala/codesearch/core/search/SnippetsGrouperSpec.scala +++ b/core/src/test/scala/codesearch/core/search/SnippetsGrouperSpec.scala @@ -14,7 +14,7 @@ class SnippetsGrouperSpec extends WordSpec with Matchers { "3models/0.3.0/Graphics/Model/DirectX.hs:14:import Data.Attoparsec.ByteString.Char8 as A", "3models/0.3.0/Graphics/Model/DirectX.hs:15:import qualified Data.ByteString as B", "3models/0.3.0/Graphics/Model/DirectX.hs:16:import Data.Traversable", - "3models/0.3.0/Graphics/Model/DirectX.hs:17:import Data.Word", + "3models/0.3.0/Graphics/Model/DirectX.hs:17:import Data.Word" ) val snippets: List[SnippetInfo] = fs2.Stream @@ -37,7 +37,7 @@ class SnippetsGrouperSpec extends WordSpec with Matchers { val matchedLines = Seq( "3models/0.3.0/Graphics/Model/DirectX.hs:28:} deriving Show", - "3models/0.3.0/Graphics/Model/DirectX.hs:39:} deriving Show", + "3models/0.3.0/Graphics/Model/DirectX.hs:39:} deriving Show" ) val snippets: List[SnippetInfo] = fs2.Stream @@ -64,7 +64,7 @@ class SnippetsGrouperSpec extends WordSpec with Matchers { val matchedLines = Seq( "3models/0.3.0/Graphics/Model/DirectX.hs:14:import Data.Attoparsec.ByteString.Char8 as A", - "3models/0.3.0/Graphics/Model/Obj.hs:16:import Data.Attoparsec.ByteString.Char8 as A", + "3models/0.3.0/Graphics/Model/Obj.hs:16:import Data.Attoparsec.ByteString.Char8 as A" ) val snippets: List[SnippetInfo] = fs2.Stream diff --git a/core/src/test/scala/integration/TestFixture.scala b/core/src/test/scala/integration/TestFixture.scala index 50cd9d9..b65a3f8 100644 --- a/core/src/test/scala/integration/TestFixture.scala +++ b/core/src/test/scala/integration/TestFixture.scala @@ -5,7 +5,7 @@ import java.nio.ByteBuffer import java.nio.file.Paths import cats.effect.{IO, Resource} -import codesearch.core.{BlockingEC, config} +import codesearch.core.BlockingEC import codesearch.core.config._ import com.softwaremill.sttp.SttpBackend import com.softwaremill.sttp.asynchttpclient.fs2.AsyncHttpClientFs2Backend @@ -33,7 +33,7 @@ trait TestFixture { port = 5432, name = "sourcesdb", user = "postgres", - password = "postgres", + password = "postgres" ), SnippetConfig( pageSize = 30, diff --git a/web-server/app/codesearch/web/controllers/Application.scala b/web-server/app/codesearch/web/controllers/Application.scala index 2926820..38b434f 100644 --- a/web-server/app/codesearch/web/controllers/Application.scala +++ b/web-server/app/codesearch/web/controllers/Application.scala @@ -30,15 +30,18 @@ class Application @Inject()( .zip(NpmDB.updated.zip(NpmDB.getSize)) .zip(GemDB.updated.zip(GemDB.getSize)) .map { - case ((((updatedHackage, sizeHackage), (updatedCrates, sizeCrates)), (updatedNpm, sizeNpm)), - (updatedGem, sizeGem)) => + case ( + (((updatedHackage, sizeHackage), (updatedCrates, sizeCrates)), (updatedNpm, sizeNpm)), + (updatedGem, sizeGem) + ) => Ok( views.html.index( LangInfo(updatedHackage.getTime, sizeHackage), LangInfo(updatedCrates.getTime, sizeCrates), LangInfo(updatedGem.getTime, sizeGem), LangInfo(updatedNpm.getTime, sizeNpm) - )) + ) + ) } } diff --git a/web-server/app/codesearch/web/controllers/NpmSearcher.scala b/web-server/app/codesearch/web/controllers/NpmSearcher.scala index 39cf278..8361972 100644 --- a/web-server/app/codesearch/web/controllers/NpmSearcher.scala +++ b/web-server/app/codesearch/web/controllers/NpmSearcher.scala @@ -16,6 +16,7 @@ class NpmSearcher @Inject()( ) extends InjectedController with SearchController[NpmTable] { override def db: DefaultDB[NpmTable] = new NpmDB { val db = database } override lazy val searchEngine: JavaScriptSearch = new JavaScriptSearch( - JavaScriptCindex(Paths.get("./index/cindex/"))) + JavaScriptCindex(Paths.get("./index/cindex/")) + ) override def lang: String = "js" } From ab3199c811853cdf130cdb3dd3239e0c1cd3838f Mon Sep 17 00:00:00 2001 From: yan Date: Sun, 7 Jul 2019 22:06:06 +0500 Subject: [PATCH 5/7] issue-222: - format code - removed unsed code --- core/src/main/scala/codesearch/core/search/Search.scala | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/core/src/main/scala/codesearch/core/search/Search.scala b/core/src/main/scala/codesearch/core/search/Search.scala index ddc1725..f63cbd6 100644 --- a/core/src/main/scala/codesearch/core/search/Search.scala +++ b/core/src/main/scala/codesearch/core/search/Search.scala @@ -19,7 +19,7 @@ import fs2.{Pipe, Stream} import io.chrisdavenport.log4cats.SelfAwareStructuredLogger import io.chrisdavenport.log4cats.slf4j.Slf4jLogger -import scala.sys.process.{Process, ProcessLogger} +import scala.sys.process.Process trait Search { @@ -85,11 +85,10 @@ trait Search { private def csearch(request: SearchRequest): SearchByIndexResult = { val indexDir = cindexDir.indexDirAs[String] val env = ("CSEARCHINDEX", indexDir) - var stderr = new String - val log = ProcessLogger((o: String) => o, (e: String) => stderr = e) val test = for { - results <- IO((Process(arguments(request), None, env) #| Seq("head", "-1001")).lineStream_!(log).toList) - } yield SearchByIndexResult(results, ErrorResponse(stderr)) + _ <- logger.debug(s"running CSEARCHINDEX=$indexDir ${arguments(request).mkString(" ")}") + results <- IO((Process(arguments(request), None, env) #| Seq("head", "-1001")).lineStream.toList) + } yield SearchByIndexResult(results, ErrorResponse("Regular expression is wrong. Check it")) test.unsafeRunSync() } From 905e541a6bf0f864cf0377615cffae665050d3b2 Mon Sep 17 00:00:00 2001 From: yan Date: Sun, 7 Jul 2019 22:27:31 +0500 Subject: [PATCH 6/7] issue-222: - fixed imports --- web-server/app/views/searchResults.scala.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web-server/app/views/searchResults.scala.html b/web-server/app/views/searchResults.scala.html index 2a799e7..91e5913 100644 --- a/web-server/app/views/searchResults.scala.html +++ b/web-server/app/views/searchResults.scala.html @@ -1,4 +1,4 @@ -@import codesearch.core.search.{ErrorResponse, Response, SuccessResponse} +@import codesearch.core.search.Search.{Response, ErrorResponse, SuccessResponse} @( response: Response ) From 1e561440dd6446003d1a628eab1b51d57bd852f8 Mon Sep 17 00:00:00 2001 From: yan Date: Mon, 29 Jul 2019 12:10:58 +0500 Subject: [PATCH 7/7] issue-222: - added in test new response types --- .../test/scala/integration/IntegrationSpecBase.scala | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/core/src/test/scala/integration/IntegrationSpecBase.scala b/core/src/test/scala/integration/IntegrationSpecBase.scala index be38f0a..d9f52ba 100644 --- a/core/src/test/scala/integration/IntegrationSpecBase.scala +++ b/core/src/test/scala/integration/IntegrationSpecBase.scala @@ -1,10 +1,10 @@ package integration -import codesearch.core.search.Search.PackageResult +import codesearch.core.search.Search.{PackageResult, SuccessResponse} import codesearch.core.search.{Search, SearchRequest} -import slick.jdbc.PostgresProfile.api._ import com.dimafeng.testcontainers.PostgreSQLContainer import org.scalatest.Matchers +import slick.jdbc.PostgresProfile.api._ trait IntegrationSpecBase extends Matchers { @@ -21,7 +21,11 @@ trait IntegrationSpecBase extends Matchers { .search(lookFor) .unsafeRunSync() - searchResult.total shouldBe totalResults - searchResult.data shouldBe result + searchResult match { + case x: SuccessResponse => { + x.totalMatches shouldBe totalResults + x.packages shouldBe result + } + } } }