/Rakefile

https://github.com/cordoval/genghis · Rakefile · 162 lines · 134 code · 22 blank · 6 comment · 2 complexity · 22c4ee772e8761e6eb4b07b3dcbe1a68 MD5 · raw file

  1. require 'rake/clean'
  2. require 'rake/packagetask'
  3. require 'yaml'
  4. require 'erb'
  5. require 'less'
  6. require 'rainpress'
  7. require 'uglifier'
  8. require 'closure-compiler'
  9. require 'html_compressor'
  10. require 'digest/md5'
  11. require 'base64'
  12. # sweet mixin action
  13. class String
  14. def unindent
  15. gsub(/^#{self[/\A\s*/]}/, '')
  16. end
  17. end
  18. desc "Compile Genghis"
  19. task :build => 'build:all'
  20. namespace :build do
  21. desc "Compile Genghis CSS assets"
  22. task :css => [ 'tmp/style.css' ]
  23. desc "Compile Genghis JavaScript assets"
  24. task :js => [ 'tmp/script.js' ]
  25. task :all => [ 'genghis.php', 'build:js', 'build:css' ]
  26. end
  27. directory 'tmp'
  28. file 'tmp/style.css' => FileList['tmp', 'src/css/*.less'] do
  29. File.open('tmp/style.css', 'w') do |file|
  30. file << <<-doc.unindent
  31. /**
  32. * Genghis
  33. *
  34. * The single-file MongoDB admin app
  35. *
  36. * http://genghisapp.com
  37. *
  38. * @author Justin Hileman <justin@justinhileman.info>
  39. */
  40. doc
  41. parser = Less::Parser.new(:paths => ['./src/css'], :filename => 'src/css/style.less')
  42. css = parser.parse(File.read('src/css/style.less')).to_css
  43. file << (ENV['NOCOMPRESS'] ? css : Rainpress.compress(css))
  44. end
  45. end
  46. script_files = FileList[
  47. # vendor libraries
  48. 'src/js/jquery.js',
  49. 'src/js/jquery.hoverintent.js',
  50. 'src/js/jquery.tablesorter.js',
  51. 'src/js/bootstrap-modal.js',
  52. 'src/js/underscore.js',
  53. 'src/js/backbone.js',
  54. 'vendor/ace/ace-uncompressed.js',
  55. 'vendor/ace/mode-json.js',
  56. 'vendor/ace/theme-git_hubby.js',
  57. 'vendor/apprise/apprise-1.5.full.js',
  58. 'vendor/bootstrap/js/bootstrap-twipsy.js',
  59. # extensions
  60. 'src/js/extensions.js',
  61. # genghis app
  62. 'src/js/genghis/bootstrap.js',
  63. 'src/js/genghis/util.js',
  64. 'src/js/genghis/base/**/*',
  65. 'src/js/genghis/models/**/*',
  66. 'src/js/genghis/collections/**/*',
  67. 'src/js/genghis/views/**/*',
  68. 'src/js/genghis/router.js'
  69. ]
  70. file 'tmp/script.js' => ['tmp'] + script_files do
  71. # ugly = Uglifier.new(:copyright => false)
  72. ugly = Closure::Compiler.new
  73. File.open('tmp/script.js', 'w') do |file|
  74. file << <<-doc.unindent
  75. /**
  76. * Genghis
  77. *
  78. * The single-file MongoDB admin app
  79. *
  80. * http://genghisapp.com
  81. *
  82. * @author Justin Hileman <justin@justinhileman.info>
  83. */
  84. doc
  85. js_src = script_files.map{ |s| File.read(s) }.join(";\n")
  86. file << (ENV['NOCOMPRESS'] ? js_src : ugly.compile(js_src))
  87. end
  88. end
  89. file 'tmp/index.html.mustache' => FileList[
  90. 'tmp', 'src/templates/partials/*.html.js',
  91. 'src/templates/index.html.mustache.erb', 'src/img/favicon.png'
  92. ] do
  93. File.open('tmp/index.html.mustache', 'w') do |file|
  94. packer = HtmlCompressor::HtmlCompressor.new
  95. # include partials
  96. templates = FileList['src/templates/partials/*.html.js'].map do |name|
  97. {
  98. :name => name.sub(/^src\/templates\/partials\/(.*)\.html\.js$/, '\1'),
  99. :content => ENV['NOCOMPRESS'] ? File.read(name) : packer.compress(File.read(name))
  100. }
  101. end
  102. favicon_uri = "data:image/png;base64,#{Base64.encode64(File.read('src/img/favicon.png'))}"
  103. index = ERB.new(File.read('src/templates/index.html.mustache.erb')).result(binding)
  104. if ENV['NOCOMPRESS']
  105. file << index
  106. else
  107. file << packer.compress(index)
  108. end
  109. end
  110. end
  111. file 'tmp/error.html.mustache' => FileList['tmp', 'src/templates/index.html.mustache.erb'] do
  112. File.open('tmp/error.html.mustache', 'w') do |file|
  113. packer = HtmlCompressor::HtmlCompressor.new
  114. tpl = ERB.new(File.read('src/templates/error.html.mustache.erb')).result(binding)
  115. if ENV['NOCOMPRESS']
  116. file << tpl
  117. else
  118. file << packer.compress(tpl)
  119. end
  120. end
  121. end
  122. include_files = FileList['src/php/**/*.php']
  123. asset_files = ['tmp/index.html.mustache', 'tmp/error.html.mustache', 'tmp/style.css', 'tmp/script.js']
  124. file 'genghis.php' => include_files + asset_files do
  125. File.open('genghis.php', 'w') do |file|
  126. template = ERB.new(File.read('src/templates/genghis.php.erb'))
  127. includes = include_files.map { |inc| ENV['NOCOMPRESS'] ? File.read(inc) : `php -w #{inc}` }
  128. assets = asset_files.map do |asset|
  129. content = File.read(asset)
  130. { :name => asset.sub(/^tmp\//, ''), :content => content, :etag => Digest::MD5.hexdigest(content) }
  131. end
  132. file << template.result(binding)
  133. end
  134. end
  135. Rake::PackageTask.new('genghis', :noversion) do |p|
  136. p.need_tar = true
  137. p.package_files.include('genghis.php', '.htaccess', 'README.markdown')
  138. end
  139. CLEAN.include('tmp/*')
  140. CLOBBER.include('tmp/*', 'genghis.php')