Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 53 additions & 4 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -3,28 +3,59 @@ PATH
specs:
easol-canvas (2.2.0)
cli-ui (~> 1.5)
dartsass-rails (~> 0.4.0)
json-schema (~> 3)
liquid (~> 5.3)
nokogiri (~> 1.13)
sassc (~> 2.4)
thor (~> 1.2)

GEM
remote: https://rubygems.org/
specs:
actionpack (7.0.3.1)
actionview (= 7.0.3.1)
activesupport (= 7.0.3.1)
rack (~> 2.0, >= 2.2.0)
rack-test (>= 0.6.3)
rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.0, >= 1.2.0)
actionview (7.0.3.1)
activesupport (= 7.0.3.1)
builder (~> 3.1)
erubi (~> 1.4)
rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.1, >= 1.2.0)
activesupport (7.0.3.1)
concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (>= 1.6, < 2)
minitest (>= 5.1)
tzinfo (~> 2.0)
addressable (2.8.0)
public_suffix (>= 2.0.2, < 5.0)
ast (2.4.2)
builder (3.2.4)
cli-ui (1.5.1)
coderay (1.1.3)
concurrent-ruby (1.1.10)
crass (1.0.6)
dartsass-rails (0.4.0)
railties (>= 6.0.0)
diff-lcs (1.5.0)
ffi (1.15.5)
erubi (1.11.0)
i18n (1.12.0)
concurrent-ruby (~> 1.0)
json-schema (3.0.0)
addressable (>= 2.8)
liquid (5.4.0)
loofah (2.18.0)
crass (~> 1.0.2)
nokogiri (>= 1.5.9)
method_source (1.0.0)
minitest (5.16.3)
nokogiri (1.13.8-arm64-darwin)
racc (~> 1.4)
nokogiri (1.13.8-x86_64-linux)
racc (~> 1.4)
parallel (1.21.0)
parser (3.0.3.2)
ast (~> 2.4.1)
Expand All @@ -33,7 +64,23 @@ GEM
method_source (~> 1.0)
public_suffix (4.0.7)
racc (1.6.0)
rack (2.2.4)
rack-test (2.0.2)
rack (>= 1.3)
rails-dom-testing (2.0.3)
activesupport (>= 4.2.0)
nokogiri (>= 1.6)
rails-html-sanitizer (1.4.3)
loofah (~> 2.3)
railties (7.0.3.1)
actionpack (= 7.0.3.1)
activesupport (= 7.0.3.1)
method_source
rake (>= 12.2)
thor (~> 1.0)
zeitwerk (~> 2.5)
rainbow (3.0.0)
rake (13.0.6)
regexp_parser (2.2.0)
rexml (3.2.5)
rspec (3.10.0)
Expand Down Expand Up @@ -64,17 +111,19 @@ GEM
rubocop (>= 1.7.0, < 2.0)
rubocop-ast (>= 0.4.0)
ruby-progressbar (1.11.0)
sassc (2.4.0)
ffi (~> 1.9)
standard (1.5.0)
rubocop (= 1.23.0)
rubocop-performance (= 1.12.0)
thor (1.2.1)
tzinfo (2.0.5)
concurrent-ruby (~> 1.0)
unicode-display_width (2.1.0)
zeitwerk (2.6.0)

PLATFORMS
arm64-darwin-20
arm64-darwin-21
x86_64-linux

DEPENDENCIES
easol-canvas!
Expand Down
2 changes: 1 addition & 1 deletion canvas.gemspec
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,6 @@ Gem::Specification.new do |s|
s.add_dependency "nokogiri", "~> 1.13"
s.add_dependency "cli-ui", "~> 1.5"
s.add_dependency "liquid", "~> 5.3"
s.add_dependency "sassc", "~> 2.4"
s.add_dependency "dartsass-rails", "~> 0.4.0"
s.add_dependency "json-schema", "~> 3"
end
47 changes: 47 additions & 0 deletions lib/canvas/dartsass.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
# frozen_string_literal: true

require "open3"

module Canvas
# This is a thin wrapper around the dartsass binary as provided by
# dartsass-rails.
#
# It is compatible with SassC::Engine as much as we were using it, but 100%
# compatability is not a goal.
class DartSass
Error = Class.new(StandardError)

def initialize(css, config)
@css = css
@config = config
end

def render
stdout, stderr, status = Open3.capture3(*command, stdin_data: @css)

if status == 0
stdout
else
raise Error.new(stderr)
end
end

private

def command
[dartsass, "--stdin", style, *load_paths].compact
end

def dartsass
Gem.bin_path("dartsass-rails", "dartsass").shellescape
end

def style
(s = @config[:style]) && "--style=#{s.to_s.shellescape}"
end

def load_paths
Array(@config[:load_paths]).map { "--load-path=#{_1.shellescape}" }
end
end
end
6 changes: 3 additions & 3 deletions lib/canvas/validators/sass.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# frozen_string_literal: true

require "sassc"
require "canvas/dartsass"

module Canvas
module Validator
Expand All @@ -15,9 +15,9 @@ def initialize(file)
end

def validate
SassC::Engine.new(@file, style: :compressed).render
DartSass.new(@file, style: :compressed).render
true
rescue SassC::SyntaxError => e
rescue DartSass::Error => e
@errors = [e.message]
false
end
Expand Down
13 changes: 6 additions & 7 deletions spec/lib/canvas/checks/valid_sass_check_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -15,16 +15,15 @@
it "adds an offense when a file contains invalid Sass" do
copy_example_directory("alchemist")
subject.run
message = <<~MESSAGE.chop
Invalid Sass: assets/index.css - \n
Error: Undefined variable: "$gray-100".
on line 1:13 of stdin
>> h1 { color: $gray-100 }
MESSAGE

expect(subject.offenses).to match_array(
[
have_attributes(message: include(message.squeeze("\n")))
have_attributes(
message: include("Invalid Sass: assets/index.css") &
include("Error: Undefined variable") &
include("1:13") &
include("h1 { color: $gray-100 }")
)
]
)
end
Expand Down