Skip to content

Commit 6439dac

Browse files
authored
Merge pull request #32 from easolhq/tc/dartsass
Switch to DartSass
2 parents 55a7c22 + db7b01e commit 6439dac

File tree

5 files changed

+110
-15
lines changed

5 files changed

+110
-15
lines changed

Gemfile.lock

Lines changed: 53 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,28 +3,59 @@ PATH
33
specs:
44
easol-canvas (2.2.0)
55
cli-ui (~> 1.5)
6+
dartsass-rails (~> 0.4.0)
67
json-schema (~> 3)
78
liquid (~> 5.3)
89
nokogiri (~> 1.13)
9-
sassc (~> 2.4)
1010
thor (~> 1.2)
1111

1212
GEM
1313
remote: https://rubygems.org/
1414
specs:
15+
actionpack (7.0.3.1)
16+
actionview (= 7.0.3.1)
17+
activesupport (= 7.0.3.1)
18+
rack (~> 2.0, >= 2.2.0)
19+
rack-test (>= 0.6.3)
20+
rails-dom-testing (~> 2.0)
21+
rails-html-sanitizer (~> 1.0, >= 1.2.0)
22+
actionview (7.0.3.1)
23+
activesupport (= 7.0.3.1)
24+
builder (~> 3.1)
25+
erubi (~> 1.4)
26+
rails-dom-testing (~> 2.0)
27+
rails-html-sanitizer (~> 1.1, >= 1.2.0)
28+
activesupport (7.0.3.1)
29+
concurrent-ruby (~> 1.0, >= 1.0.2)
30+
i18n (>= 1.6, < 2)
31+
minitest (>= 5.1)
32+
tzinfo (~> 2.0)
1533
addressable (2.8.0)
1634
public_suffix (>= 2.0.2, < 5.0)
1735
ast (2.4.2)
36+
builder (3.2.4)
1837
cli-ui (1.5.1)
1938
coderay (1.1.3)
39+
concurrent-ruby (1.1.10)
40+
crass (1.0.6)
41+
dartsass-rails (0.4.0)
42+
railties (>= 6.0.0)
2043
diff-lcs (1.5.0)
21-
ffi (1.15.5)
44+
erubi (1.11.0)
45+
i18n (1.12.0)
46+
concurrent-ruby (~> 1.0)
2247
json-schema (3.0.0)
2348
addressable (>= 2.8)
2449
liquid (5.4.0)
50+
loofah (2.18.0)
51+
crass (~> 1.0.2)
52+
nokogiri (>= 1.5.9)
2553
method_source (1.0.0)
54+
minitest (5.16.3)
2655
nokogiri (1.13.8-arm64-darwin)
2756
racc (~> 1.4)
57+
nokogiri (1.13.8-x86_64-linux)
58+
racc (~> 1.4)
2859
parallel (1.21.0)
2960
parser (3.0.3.2)
3061
ast (~> 2.4.1)
@@ -33,7 +64,23 @@ GEM
3364
method_source (~> 1.0)
3465
public_suffix (4.0.7)
3566
racc (1.6.0)
67+
rack (2.2.4)
68+
rack-test (2.0.2)
69+
rack (>= 1.3)
70+
rails-dom-testing (2.0.3)
71+
activesupport (>= 4.2.0)
72+
nokogiri (>= 1.6)
73+
rails-html-sanitizer (1.4.3)
74+
loofah (~> 2.3)
75+
railties (7.0.3.1)
76+
actionpack (= 7.0.3.1)
77+
activesupport (= 7.0.3.1)
78+
method_source
79+
rake (>= 12.2)
80+
thor (~> 1.0)
81+
zeitwerk (~> 2.5)
3682
rainbow (3.0.0)
83+
rake (13.0.6)
3784
regexp_parser (2.2.0)
3885
rexml (3.2.5)
3986
rspec (3.10.0)
@@ -64,17 +111,19 @@ GEM
64111
rubocop (>= 1.7.0, < 2.0)
65112
rubocop-ast (>= 0.4.0)
66113
ruby-progressbar (1.11.0)
67-
sassc (2.4.0)
68-
ffi (~> 1.9)
69114
standard (1.5.0)
70115
rubocop (= 1.23.0)
71116
rubocop-performance (= 1.12.0)
72117
thor (1.2.1)
118+
tzinfo (2.0.5)
119+
concurrent-ruby (~> 1.0)
73120
unicode-display_width (2.1.0)
121+
zeitwerk (2.6.0)
74122

75123
PLATFORMS
76124
arm64-darwin-20
77125
arm64-darwin-21
126+
x86_64-linux
78127

79128
DEPENDENCIES
80129
easol-canvas!

canvas.gemspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,6 @@ Gem::Specification.new do |s|
2222
s.add_dependency "nokogiri", "~> 1.13"
2323
s.add_dependency "cli-ui", "~> 1.5"
2424
s.add_dependency "liquid", "~> 5.3"
25-
s.add_dependency "sassc", "~> 2.4"
25+
s.add_dependency "dartsass-rails", "~> 0.4.0"
2626
s.add_dependency "json-schema", "~> 3"
2727
end

lib/canvas/dartsass.rb

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
# frozen_string_literal: true
2+
3+
require "open3"
4+
5+
module Canvas
6+
# This is a thin wrapper around the dartsass binary as provided by
7+
# dartsass-rails.
8+
#
9+
# It is compatible with SassC::Engine as much as we were using it, but 100%
10+
# compatability is not a goal.
11+
class DartSass
12+
Error = Class.new(StandardError)
13+
14+
def initialize(css, config)
15+
@css = css
16+
@config = config
17+
end
18+
19+
def render
20+
stdout, stderr, status = Open3.capture3(*command, stdin_data: @css)
21+
22+
if status == 0
23+
stdout
24+
else
25+
raise Error.new(stderr)
26+
end
27+
end
28+
29+
private
30+
31+
def command
32+
[dartsass, "--stdin", style, *load_paths].compact
33+
end
34+
35+
def dartsass
36+
Gem.bin_path("dartsass-rails", "dartsass").shellescape
37+
end
38+
39+
def style
40+
(s = @config[:style]) && "--style=#{s.to_s.shellescape}"
41+
end
42+
43+
def load_paths
44+
Array(@config[:load_paths]).map { "--load-path=#{_1.shellescape}" }
45+
end
46+
end
47+
end

lib/canvas/validators/sass.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# frozen_string_literal: true
22

3-
require "sassc"
3+
require "canvas/dartsass"
44

55
module Canvas
66
module Validator
@@ -15,9 +15,9 @@ def initialize(file)
1515
end
1616

1717
def validate
18-
SassC::Engine.new(@file, style: :compressed).render
18+
DartSass.new(@file, style: :compressed).render
1919
true
20-
rescue SassC::SyntaxError => e
20+
rescue DartSass::Error => e
2121
@errors = [e.message]
2222
false
2323
end

spec/lib/canvas/checks/valid_sass_check_spec.rb

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,15 @@
1515
it "adds an offense when a file contains invalid Sass" do
1616
copy_example_directory("alchemist")
1717
subject.run
18-
message = <<~MESSAGE.chop
19-
Invalid Sass: assets/index.css - \n
20-
Error: Undefined variable: "$gray-100".
21-
on line 1:13 of stdin
22-
>> h1 { color: $gray-100 }
23-
MESSAGE
2418

2519
expect(subject.offenses).to match_array(
2620
[
27-
have_attributes(message: include(message.squeeze("\n")))
21+
have_attributes(
22+
message: include("Invalid Sass: assets/index.css") &
23+
include("Error: Undefined variable") &
24+
include("1:13") &
25+
include("h1 { color: $gray-100 }")
26+
)
2827
]
2928
)
3029
end

0 commit comments

Comments
 (0)