aboutsummaryrefslogblamecommitdiff
path: root/stage2/Scaffold.scala
blob: 30ea73b4094af03771c4aaf1024ecb8b4da2f300 (plain) (tree)
1
2
3
4
5
6
7
8
9

                
                      
                 

                                 

                                                                                   
                                                          
                                                                      



                                                       






























                                                                                            




                                                                 

                          


                                                                                                    
                                           






                                                              
                  
                          
             
                                                                                                                                           
            
                                                    
                               

                                                                                         
                          
                                                                 
        

                                                                                                
                                     

                                                                       
 
                               

                                                      
     
   


     
   
 





























                                                                        
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"
    )
  }
}