From 845001cf65e530a22cb28de4299d5070f039e5b7 Mon Sep 17 00:00:00 2001 From: Natalie Weizenbaum Date: Thu, 15 Mar 2018 16:04:43 -0700 Subject: [PATCH] Download version information for all implementations --- .gitignore | 4 +- Gemfile | 1 + Gemfile.lock | 4 +- Rakefile | 221 ++++++++++++++++++++++++++-------------- helpers/sass_helpers.rb | 2 +- 5 files changed, 152 insertions(+), 80 deletions(-) diff --git a/.gitignore b/.gitignore index 443d909..e53051c 100644 --- a/.gitignore +++ b/.gitignore @@ -9,7 +9,9 @@ bundle /Icon "Icon\r" .ruby-version -/.sass +/.dart-sass +/.libsass +/.ruby-sass /.sass-cache *.scssc /source/assets/css/vendor diff --git a/Gemfile b/Gemfile index b7cdd50..bf4332e 100644 --- a/Gemfile +++ b/Gemfile @@ -17,6 +17,7 @@ gem 'rack-contrib' gem 'rack-rewrite' gem 'rake' gem 'redcarpet', '~> 3.3.3' +gem 'semantic', '~> 1.6' gem 'susy', '~> 2.2.9' gem 'therubyracer', '~> 0.12.3' gem 'typogruby', '~> 1.0.18' diff --git a/Gemfile.lock b/Gemfile.lock index db15555..ad199d0 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -136,6 +136,7 @@ GEM sass (3.4.25) sassy-maps (0.4.0) sass (~> 3.3) + semantic (1.6.1) sprockets (2.12.4) hike (~> 1.2) multi_json (~> 1.0) @@ -187,6 +188,7 @@ DEPENDENCIES rack-rewrite rake redcarpet (~> 3.3.3) + semantic (~> 1.6) susy (~> 2.2.9) therubyracer (~> 0.12.3) typogruby (~> 1.0.18) @@ -198,4 +200,4 @@ RUBY VERSION ruby 2.4.1p111 BUNDLED WITH - 1.15.2 + 1.16.1 diff --git a/Rakefile b/Rakefile index 27f7a52..1dc293c 100644 --- a/Rakefile +++ b/Rakefile @@ -1,93 +1,160 @@ +require 'semantic' +require 'yaml' require 'yard' namespace :sass do - # Check out the latest stable version of Ruby Sass into the .sass directory. - task :checkout do - unless Dir.exists?(".sass") - sh %{git clone git://github.com/sass/sass .sass} + # Adds an implementation's version number to data/version.yml. + def add_version(impl, version) + path = 'data/version.yml' + yaml = File.exist?(path) ? YAML.load(File.read(path)) : {} + yaml[impl] = version + File.open(path, 'w') {|f| f.write(YAML.dump(yaml))} + end + + # Returns the latest tag in the current Git repository that's a valid semantic + # version and is not a pre-release version *unless* only pre-release versions + # are available. + def latest_stable_tag + tags = `git tag`.strip.split("\n").map do |v| + begin + Semantic::Version.new(v) + rescue ArgumentError + nil + end + end.compact.sort.reverse + (tags.find {|t| !t.pre} || tags.first).to_s + end + + namespace :dart do + # Check out the latest commit of Dart Sass into the .dart-sass directory. + task :checkout do + unless Dir.exists?(".dart-sass") + sh %{git clone git://github.com/sass/dart-sass .dart-sass} + end + + Dir.chdir(".dart-sass") do + sh %{git fetch} + if ENV["DART_SASS_REVISION"] + sh %{git checkout #{ENV["DART_SASS_REVISION"]}} + else + sh %{git checkout origin/master} + end + end end - Dir.chdir(".sass") do - sh %{git fetch} - if ENV["SASS_REVISION"] - sh %{git checkout #{ENV["SASS_REVISION"]}} - else - sh %{git checkout origin/stable} - # Check out the most recent released stable version - sh %{git checkout #{File.read("VERSION").strip}} - end + task :version => :checkout do + add_version 'dart', Dir.chdir(".dart-sass") {latest_stable_tag} end end - task :version => :checkout do - require 'yaml' - version = File.read(".sass/VERSION").strip - name = File.read(".sass/VERSION_NAME").strip - File.open('data/version.yml', 'w') {|f| f.write(YAML.dump({'number' => version, 'name' => name}))} - end + namespace :libsass do + # Check out the latest commit of Dart Sass into the .libsass directory. + task :checkout do + unless Dir.exists?(".libsass") + sh %{git clone git://github.com/sass/libsass .libsass} + end - YARD::Rake::YardocTask.new(:doc) do |t| - t.before = lambda do - t.files = FileList.new('.sass/lib/**/*.rb') do |list| - list.exclude('.sass/lib/sass/plugin/merb.rb') - list.exclude('.sass/lib/sass/plugin/rails.rb') - end.to_a - t.options += FileList.new('.sass/yard/*.rb').to_a.map {|f| ['-e', f]}.flatten - files = FileList.new('.sass/doc-src/*').to_a.sort_by {|s| s.size} + %w[.sass/MIT-LICENSE .sass/VERSION] - t.options << '--files' << files.join(',') - t.options << '--main' << '.sass/README.md' - t.options << '--template-path' << 'yard' + Dir.chdir(".libsass") do + sh %{git fetch} + if ENV["LIBSASS_REVISION"] + sh %{git checkout #{ENV["LIBSASS_REVISION"]}} + else + sh %{git checkout origin/master} + end + end end - t.after = lambda do - sh %{rm -rf source/documentation} - sh %{mv doc source/documentation} - Dir['source/documentation/**/*.html'].each do |path| - contents = File.read(path) - File.open(path, 'w') {|file| file.write(contents.gsub(%r{css/common\.css}, '../assets/css/docs.css'))} - end - - require 'nokogiri' - doc = Nokogiri::HTML(File.read('source/documentation/file.SASS_REFERENCE.html')) - - doc.css("#filecontents").css("h1, h2, h3, h4, h5, h6").each do |h| - next if h.inner_text.empty? - h['id'] = - case h.inner_text - when "Referencing Parent Selectors: &"; "parent-selector" - when /^Comments:/; "comments" - when "Strings"; "sass-script-strings" - when "Division and /"; "division-and-slash" - when /^Subtraction,/; "subtraction" - when "& in SassScript"; "parent-script" - when "@-Rules and Directives"; "directives" - when "@extend-Only Selectors"; "placeholders" - when "@extend-Only Selectors"; "placeholders" - when "@each"; "each-directive" - when "Multiple Assignment"; "each-multi-assign" - when "Mixin Directives"; "mixins" - when /^Defining a Mixin:/; "defining_a_mixin" - when /^Including a Mixin:/; "including_a_mixin" - when "Arguments"; "mixin-arguments" - when "Passing Content Blocks to a Mixin"; "mixin-content" - else - h.inner_text.downcase.gsub(/[^a-z _-]/, '').gsub(' ', '_') - end - end - - # Give each option an anchor. - doc.css("#filecontents li p strong code").each do |c| - c['id'] = c.inner_text.gsub(/:/, '') + '-option' - end - - File.write('source/documentation/file.SASS_REFERENCE.html', doc.to_html) + task :version => :checkout do + add_version 'libsass', Dir.chdir(".libsass") {latest_stable_tag} end end - Rake::Task['sass:doc'].prerequisites.insert(0, 'sass:checkout') - Rake::Task['sass:doc'].instance_variable_set('@comment', nil) - desc "Import information from Sass." - task :import => [:doc, :version] + namespace :ruby do + # Check out the latest stable version of Ruby Sass into the .ruby-sass directory. + task :checkout do + unless Dir.exists?(".ruby-sass") + sh %{git clone git://github.com/sass/sass .ruby-sass} + end + + Dir.chdir(".ruby-sass") do + sh %{git fetch} + if ENV["RUBY_SASS_REVISION"] + sh %{git checkout #{ENV["RUBY_SASS_REVISION"]}} + else + sh %{git checkout origin/stable} + # Check out the most recent released stable version + sh %{git checkout #{File.read("VERSION").strip}} + end + end + end + + task :version => :checkout do + add_version 'ruby', File.read(".ruby-sass/VERSION").strip + end + + YARD::Rake::YardocTask.new(:doc) do |t| + t.before = lambda do + t.files = FileList.new('.ruby-sass/lib/**/*.rb') do |list| + list.exclude('.ruby-sass/lib/sass/plugin/merb.rb') + list.exclude('.ruby-sass/lib/sass/plugin/rails.rb') + end.to_a + t.options += FileList.new('.ruby-sass/yard/*.rb').to_a.map {|f| ['-e', f]}.flatten + files = FileList.new('.ruby-sass/doc-src/*').to_a.sort_by {|s| s.size} + %w[.ruby-sass/MIT-LICENSE .ruby-sass/VERSION] + t.options << '--files' << files.join(',') + t.options << '--main' << '.ruby-sass/README.md' + t.options << '--template-path' << 'yard' + end + + t.after = lambda do + sh %{rm -rf source/documentation} + sh %{mv doc source/documentation} + Dir['source/documentation/**/*.html'].each do |path| + contents = File.read(path) + File.open(path, 'w') {|file| file.write(contents.gsub(%r{css/common\.css}, '../assets/css/docs.css'))} + end + + require 'nokogiri' + doc = Nokogiri::HTML(File.read('source/documentation/file.SASS_REFERENCE.html')) + + doc.css("#filecontents").css("h1, h2, h3, h4, h5, h6").each do |h| + next if h.inner_text.empty? + h['id'] = + case h.inner_text + when "Referencing Parent Selectors: &"; "parent-selector" + when /^Comments:/; "comments" + when "Strings"; "sass-script-strings" + when "Division and /"; "division-and-slash" + when /^Subtraction,/; "subtraction" + when "& in SassScript"; "parent-script" + when "@-Rules and Directives"; "directives" + when "@extend-Only Selectors"; "placeholders" + when "@extend-Only Selectors"; "placeholders" + when "@each"; "each-directive" + when "Multiple Assignment"; "each-multi-assign" + when "Mixin Directives"; "mixins" + when /^Defining a Mixin:/; "defining_a_mixin" + when /^Including a Mixin:/; "including_a_mixin" + when "Arguments"; "mixin-arguments" + when "Passing Content Blocks to a Mixin"; "mixin-content" + else + h.inner_text.downcase.gsub(/[^a-z _-]/, '').gsub(' ', '_') + end + end + + # Give each option an anchor. + doc.css("#filecontents li p strong code").each do |c| + c['id'] = c.inner_text.gsub(/:/, '') + '-option' + end + + File.write('source/documentation/file.SASS_REFERENCE.html', doc.to_html) + end + end + Rake::Task['sass:ruby:doc'].prerequisites.insert(0, 'sass:ruby:checkout') + Rake::Task['sass:ruby:doc'].instance_variable_set('@comment', nil) + end + + desc "Import information from Sass implementations." + task :import => ["dart:version", "libsass:version", "ruby:version", "ruby:doc"] end desc "Build the middleman-controlled portion of the site." @@ -101,6 +168,6 @@ task "build" => ["sass:import", :middleman] # Build the site on Heroku, then clean up unnecessary intermediate files. task "assets:precompile" => :build do # Clean up unneccessary files to reduce slug size. - sh %{rm -rf .sass .yardoc} + sh %{rm -rf .dart-sass .libsass .ruby-sass .yardoc} sh %{bundle install --without=development} end diff --git a/helpers/sass_helpers.rb b/helpers/sass_helpers.rb index eed1a30..36970a7 100644 --- a/helpers/sass_helpers.rb +++ b/helpers/sass_helpers.rb @@ -48,7 +48,7 @@ module SassHelpers # Returns the version for the given implementation (`:dart`, `:ruby`, or # `:libsass`), or `nil` if it hasn't been made available yet. def impl_version(impl) - nil + data.version && data.version[impl] end # Returns the URL tag for the latest release of the given implementation.