require 'rubygems' require 'rake' $LOAD_PATH.unshift File.expand_path("../lib", __FILE__) require 'rspec' require 'rspec/core/rake_task' RSpec::Core::RakeTask.new(:spec) do |spec| spec.rspec_opts = ["--color"] spec.pattern = "spec/**/*_spec.rb" end desc "Build gem locally" task :build do system "gem build jsduck.gemspec" end desc "Install gem locally" task :install => :build do system "gem install --user-install jsduck" end def load_sdk_vars if File.exists?("sdk-vars.rb") require "sdk-vars.rb" else puts "Error: sdk-vars.rb not found." puts puts "Please create file sdk-vars.rb and define constants SDK_DIR and OUT_DIR in it." puts puts "For example:" puts puts " SDK_DIR='/path/to/SDK'" puts " OUT_DIR='/path/to/ouput/dir'" puts " EXT_DIR='/path/to/ext/dir'" exit 1 end end def run_jsduck(extra_options) # Pass multiple arguments to system, so we'll take advantage of the built-in escaping system(*[ "ruby", "bin/jsduck", # --external=Error to ignore the Error class that Ext.Error extends. "--external", "Error", "--guides", "#{SDK_DIR}/guides", "--examples", "#{SDK_DIR}/extjs/doc-resources", "--guides-order", "getting,class,application,layouts,data,grid,tree,drawing,forms,components,theming,direct", "--categories", "#{SDK_DIR}/extjs/doc-resources/categories.json", "--output", "#{OUT_DIR}", ].concat(extra_options)) # Finally copy over the images that documentation links to. system "cp -r #{SDK_DIR}/extjs/doc-resources #{OUT_DIR}/doc-resources" system "cp -r #{SDK_DIR}/platform/doc-resources/* #{OUT_DIR}/doc-resources" end desc "Run JSDuck on ExtJS SDK" task :sdk do load_sdk_vars run_jsduck([ "--extjs-path", "extjs/ext-debug.js", # to create symbolic links to template files instead of copying them over. # Useful for development. Turn off for deployment. "--template-links", "#{SDK_DIR}/extjs/src", "#{SDK_DIR}/platform/src", "#{SDK_DIR}/platform/core/src", ]) end def run_jsduck_export(extra_options, ext_dir) load_sdk_vars rev = `git rev-parse HEAD`.slice(0, 7) head_html = <<-EOHTML EOHTML run_jsduck([ "--title", "Ext JS 4.0.2a API Documentation", "--footer", "ExtJS 4.0.2a Documentation from Sencha. Generated with JSDuck revison #{rev}", "--head-html", head_html, "#{SDK_DIR}/extjs/src", "#{SDK_DIR}/platform/src", "#{SDK_DIR}/platform/core/src", ].concat(extra_options)) # Empty th extjs dir system "rm #{OUT_DIR}/extjs" system "mkdir -p #{OUT_DIR}/extjs/resources/css" system "mkdir -p #{OUT_DIR}/extjs/resources/themes/images" # Clean up SASS files system "rm -rf #{OUT_DIR}/resources/sass" system "rm -rf #{OUT_DIR}/resources/.sass-cache" # Copy over ext-all.js for Docs app system "cp #{EXT_DIR}/ext-all.js #{OUT_DIR}/extjs" # Copy the standard ExtJS files for use with inline examples system "cp #{EXT_DIR}/ext-all-debug.js #{OUT_DIR}/extjs" system "cp #{EXT_DIR}/resources/css/ext-all.css #{OUT_DIR}/extjs/resources/css" system "cp -r #{EXT_DIR}/resources/themes/images/default #{OUT_DIR}/extjs/resources/themes/images" end desc "Run JSDuck on ExtJS SDK to create release version of docs app" task :export do load_sdk_vars run_jsduck_export([ "--body-html", <<-EOHTML EOHTML ], EXT_DIR) end desc "Run JSDuck on ExtJS SDK to create live docs app" task :live_docs do load_sdk_vars run_jsduck_export([ "--body-html", <<-EOHTML EOHTML ], "#{SDK_DIR}/extjs/build/sdk") end desc "Run JSDuck on the Docs app itself" task :docs do load_sdk_vars run_jsduck([ "--template-links", "#{SDK_DIR}/extjs/src", "#{SDK_DIR}/platform/src", "#{SDK_DIR}/platform/core/src", "template/app", "template/app.js", ]) end # Reads in all CSS files referenced between BEGIN CSS and END CSS markers. # Deletes those input CSS files and writes out concatenated CSS to # resources/css/app.css # Finally replaces the CSS section with to that one CSS file. def combine_css(html, base_dir) css_section_re = /.*/m css = [] css_section_re.match(html)[0].each_line do |line| if line =~ /') end # Same thing for JavaScript, result is written to: app.js def combine_js(html, base_dir) js_section_re = /.*/m js = [] js_section_re.match(html)[0].each_line do |line| if line =~ /') end # Note: This should be run *after* running the :export or :live_docs task desc "Compresses JavaScript and CSS files in output dir" task :compress do load_sdk_vars # Create JSB3 file for Docs app system("sencha", "create", "jsb", "-a", "#{OUT_DIR}/index.html", "-p", "#{OUT_DIR}/app.jsb3") # Concatenate files listed in JSB3 file system("sencha", "build", "-p", "#{OUT_DIR}/app.jsb3", "-d", OUT_DIR) # Replace Copyright information in compressed file, writing new version to original app.js copy = 'Generated by JSDuck: https:\/\/github.com\/senchalabs\/jsduck' system("sed 's/^Copyright.*Company Name$/#{copy}/' #{OUT_DIR}/app-all.js > #{OUT_DIR}/app.js") # Remove intermediate build files system("rm", "#{OUT_DIR}/app.jsb3") system("rm", "#{OUT_DIR}/all-classes.js") system("rm", "#{OUT_DIR}/app-all.js") # Remove the entire app/ dir system("rm", "-r", "#{OUT_DIR}/app") # Concatenate CSS and JS files referenced in index.html file html = IO.read("#{OUT_DIR}/index.html") html = combine_css(html, OUT_DIR) html = combine_js(html, OUT_DIR) File.open("#{OUT_DIR}/index.html", 'w') {|f| f.write(html) } end task :default => :spec