package cbt import java.io._ import java.nio.file._ import java.net._ class Scaffold( logger: Logger ){ val lib = new Lib(logger) private def createFile( projectDirectory: File, fileName: String, code: String ){ val outputFile = projectDirectory ++ ("/" ++ fileName) Stage0Lib.write( outputFile, code, StandardOpenOption.CREATE_NEW ) import scala.Console._ println( GREEN ++ "Created " ++ fileName ++ RESET ) } private[cbt] def packageName(name: String) = { def stripNonAlPrefix = (_:String).dropWhile( !(('a' to 'z') ++ ('A' to 'Z') ++ Seq('_')).contains(_) ) def removeNonAlNumPlusSelected = "([^-a-zA-Z0-9_\\.\\\\/])".r.replaceAllIn(_:String, "") def replaceSpecialWithUnderscore = "([-\\. ])".r.replaceAllIn(_:String, "_") def removeRepeatedDots = "\\.+".r.replaceAllIn(_:String, ".") val transform = ( ( stripNonAlPrefix andThen removeNonAlNumPlusSelected andThen replaceSpecialWithUnderscore ).andThen( (_:String).replace("/",".").replace("\\",".").toLowerCase ) andThen removeRepeatedDots ) transform( name ) } private[cbt] def packageFromDirectory(directory: File) = { packageName( directory.getAbsolutePath.stripPrefix( lib.findOuterMostModuleDirectory( directory ).getParentFile.getAbsolutePath ) ) } private[cbt] def buildPackageFromDirectory(directory: File) = { val parts = packageFromDirectory(directory).split("\\.") ((parts.head ++ "_build") +: parts.tail).mkString(".") } def createMain( projectDirectory: File ): Unit = { createFile(projectDirectory, "Main.scala", s"""package ${packageFromDirectory(projectDirectory)} object Main{ def main( args: Array[String] ): Unit = { println( Console.GREEN ++ "Hello World" ++ Console.RESET ) } } """ ) } def createBuild( projectDirectory: File ): Unit = { createFile(projectDirectory, lib.buildDirectoryName++"/"++lib.buildFileName, s"""package ${buildPackageFromDirectory(projectDirectory)} import cbt._ class Build(val context: Context) extends BaseBuild{ override def dependencies = ( super.dependencies ++ // don't forget super.dependencies here for scala-library, etc. Seq( // source dependency // DirectoryDependency( projectDirectory ++ "/subProject" ) ) ++ // pick resolvers explicitly for individual dependencies (and their transitive dependencies) Resolver( mavenCentral, sonatypeReleases ).bind( // CBT-style Scala dependencies // ScalaDependency( "com.lihaoyi", "ammonite-ops", "0.5.5" ) // MavenDependency( "com.lihaoyi", "ammonite-ops_2.11", "0.5.5" ) // SBT-style dependencies // "com.lihaoyi" %% "ammonite-ops" % "0.5.5" // "com.lihaoyi" % "ammonite-ops_2.11" % "0.5.5" ) ) } """ ) } } object ScaffoldTest{ val scaffold = new Scaffold(new Logger(None,System.currentTimeMillis)) import scaffold._ def main(args: Array[String]): Unit = { def assertEquals[T](left: T, right: T) = { assert( left == right, left + " == " + right ) } assertEquals( packageName( "AsdfAsdfAsdf" ), "asdfasdfasdf" ) assertEquals( packageName( "_AsdfA4sdf" ), "_asdfa4sdf" ) assertEquals( packageName( "-AsdfAsdf" ), "asdfasdf" ) assertEquals( packageName( "asdf 4aSdf" ), "asdf4asdf" ) assertEquals( packageName( "&/(&%$&&/(asdf" ), "asdf" ) assertEquals( packageName( "AAA" ), "aaa" ) assertEquals( packageName( "/AAA/a_a/a.a" ), "aaa.a_a.a_a" ) } }