sass 3.3.0 → 3.4.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.yardopts +3 -1
- data/CODE_OF_CONDUCT.md +10 -0
- data/CONTRIBUTING.md +148 -0
- data/MIT-LICENSE +1 -1
- data/README.md +76 -62
- data/Rakefile +104 -24
- data/VERSION +1 -1
- data/VERSION_DATE +1 -1
- data/VERSION_NAME +1 -1
- data/bin/sass +1 -1
- data/bin/scss +1 -1
- data/extra/sass-spec-ref.sh +32 -0
- data/extra/update_watch.rb +1 -1
- data/lib/sass/cache_stores/filesystem.rb +9 -5
- data/lib/sass/cache_stores/memory.rb +4 -5
- data/lib/sass/callbacks.rb +2 -2
- data/lib/sass/css.rb +12 -13
- data/lib/sass/deprecation.rb +55 -0
- data/lib/sass/engine.rb +106 -70
- data/lib/sass/environment.rb +39 -19
- data/lib/sass/error.rb +17 -20
- data/lib/sass/exec/base.rb +199 -0
- data/lib/sass/exec/sass_convert.rb +283 -0
- data/lib/sass/exec/sass_scss.rb +440 -0
- data/lib/sass/exec.rb +5 -771
- data/lib/sass/features.rb +9 -2
- data/lib/sass/importers/base.rb +8 -3
- data/lib/sass/importers/filesystem.rb +30 -38
- data/lib/sass/logger/base.rb +8 -2
- data/lib/sass/logger/delayed.rb +50 -0
- data/lib/sass/logger.rb +8 -3
- data/lib/sass/media.rb +1 -4
- data/lib/sass/plugin/compiler.rb +224 -90
- data/lib/sass/plugin/configuration.rb +38 -22
- data/lib/sass/plugin/merb.rb +2 -2
- data/lib/sass/plugin/rack.rb +3 -3
- data/lib/sass/plugin/rails.rb +1 -1
- data/lib/sass/plugin/staleness_checker.rb +4 -4
- data/lib/sass/plugin.rb +6 -5
- data/lib/sass/script/css_lexer.rb +1 -1
- data/lib/sass/script/css_parser.rb +2 -3
- data/lib/sass/script/css_variable_warning.rb +52 -0
- data/lib/sass/script/functions.rb +739 -318
- data/lib/sass/script/lexer.rb +134 -54
- data/lib/sass/script/parser.rb +252 -56
- data/lib/sass/script/tree/funcall.rb +13 -6
- data/lib/sass/script/tree/interpolation.rb +127 -4
- data/lib/sass/script/tree/list_literal.rb +31 -4
- data/lib/sass/script/tree/literal.rb +4 -0
- data/lib/sass/script/tree/node.rb +21 -3
- data/lib/sass/script/tree/operation.rb +54 -1
- data/lib/sass/script/tree/selector.rb +26 -0
- data/lib/sass/script/tree/string_interpolation.rb +59 -38
- data/lib/sass/script/tree/variable.rb +1 -1
- data/lib/sass/script/tree.rb +1 -0
- data/lib/sass/script/value/base.rb +17 -14
- data/lib/sass/script/value/bool.rb +0 -5
- data/lib/sass/script/value/color.rb +78 -42
- data/lib/sass/script/value/helpers.rb +119 -2
- data/lib/sass/script/value/list.rb +0 -15
- data/lib/sass/script/value/map.rb +1 -1
- data/lib/sass/script/value/null.rb +0 -5
- data/lib/sass/script/value/number.rb +112 -31
- data/lib/sass/script/value/string.rb +102 -13
- data/lib/sass/script/value.rb +0 -1
- data/lib/sass/script.rb +3 -3
- data/lib/sass/scss/css_parser.rb +24 -4
- data/lib/sass/scss/parser.rb +290 -383
- data/lib/sass/scss/rx.rb +17 -9
- data/lib/sass/scss/static_parser.rb +306 -4
- data/lib/sass/scss.rb +0 -2
- data/lib/sass/selector/abstract_sequence.rb +35 -18
- data/lib/sass/selector/comma_sequence.rb +114 -19
- data/lib/sass/selector/pseudo.rb +266 -0
- data/lib/sass/selector/sequence.rb +146 -40
- data/lib/sass/selector/simple.rb +22 -33
- data/lib/sass/selector/simple_sequence.rb +122 -39
- data/lib/sass/selector.rb +57 -197
- data/lib/sass/shared.rb +2 -2
- data/lib/sass/source/map.rb +31 -14
- data/lib/sass/source/position.rb +4 -4
- data/lib/sass/stack.rb +2 -8
- data/lib/sass/supports.rb +10 -13
- data/lib/sass/tree/at_root_node.rb +1 -0
- data/lib/sass/tree/charset_node.rb +1 -1
- data/lib/sass/tree/comment_node.rb +1 -1
- data/lib/sass/tree/css_import_node.rb +9 -1
- data/lib/sass/tree/directive_node.rb +8 -2
- data/lib/sass/tree/error_node.rb +18 -0
- data/lib/sass/tree/extend_node.rb +1 -1
- data/lib/sass/tree/function_node.rb +9 -0
- data/lib/sass/tree/import_node.rb +6 -5
- data/lib/sass/tree/keyframe_rule_node.rb +15 -0
- data/lib/sass/tree/node.rb +5 -3
- data/lib/sass/tree/prop_node.rb +6 -7
- data/lib/sass/tree/rule_node.rb +26 -11
- data/lib/sass/tree/visitors/check_nesting.rb +56 -32
- data/lib/sass/tree/visitors/convert.rb +59 -44
- data/lib/sass/tree/visitors/cssize.rb +34 -30
- data/lib/sass/tree/visitors/deep_copy.rb +6 -1
- data/lib/sass/tree/visitors/extend.rb +15 -13
- data/lib/sass/tree/visitors/perform.rb +87 -50
- data/lib/sass/tree/visitors/set_options.rb +15 -1
- data/lib/sass/tree/visitors/to_css.rb +72 -43
- data/lib/sass/util/multibyte_string_scanner.rb +0 -2
- data/lib/sass/util/normalized_map.rb +0 -1
- data/lib/sass/util/subset_map.rb +2 -3
- data/lib/sass/util.rb +334 -154
- data/lib/sass/version.rb +7 -7
- data/lib/sass.rb +10 -8
- data/test/sass/cache_test.rb +62 -20
- data/test/sass/callbacks_test.rb +1 -1
- data/test/sass/compiler_test.rb +24 -11
- data/test/sass/conversion_test.rb +241 -50
- data/test/sass/css2sass_test.rb +73 -5
- data/test/sass/css_variable_test.rb +132 -0
- data/test/sass/encoding_test.rb +219 -0
- data/test/sass/engine_test.rb +343 -260
- data/test/sass/exec_test.rb +12 -2
- data/test/sass/extend_test.rb +333 -44
- data/test/sass/functions_test.rb +353 -260
- data/test/sass/importer_test.rb +40 -21
- data/test/sass/logger_test.rb +1 -1
- data/test/sass/more_results/more_import.css +1 -1
- data/test/sass/more_templates/more1.sass +10 -10
- data/test/sass/more_templates/more_import.sass +2 -2
- data/test/sass/plugin_test.rb +24 -21
- data/test/sass/results/compact.css +1 -1
- data/test/sass/results/complex.css +4 -4
- data/test/sass/results/expanded.css +1 -1
- data/test/sass/results/import.css +1 -1
- data/test/sass/results/import_charset_ibm866.css +2 -2
- data/test/sass/results/mixins.css +17 -17
- data/test/sass/results/nested.css +1 -1
- data/test/sass/results/parent_ref.css +2 -2
- data/test/sass/results/script.css +5 -5
- data/test/sass/results/scss_import.css +1 -1
- data/test/sass/script_conversion_test.rb +71 -39
- data/test/sass/script_test.rb +714 -123
- data/test/sass/scss/css_test.rb +213 -30
- data/test/sass/scss/rx_test.rb +8 -4
- data/test/sass/scss/scss_test.rb +766 -22
- data/test/sass/source_map_test.rb +263 -95
- data/test/sass/superselector_test.rb +210 -0
- data/test/sass/templates/_partial.sass +1 -1
- data/test/sass/templates/basic.sass +10 -10
- data/test/sass/templates/bork1.sass +1 -1
- data/test/sass/templates/bork5.sass +1 -1
- data/test/sass/templates/compact.sass +10 -10
- data/test/sass/templates/complex.sass +187 -187
- data/test/sass/templates/compressed.sass +10 -10
- data/test/sass/templates/expanded.sass +10 -10
- data/test/sass/templates/import.sass +2 -2
- data/test/sass/templates/importee.sass +3 -3
- data/test/sass/templates/mixins.sass +22 -22
- data/test/sass/templates/multiline.sass +4 -4
- data/test/sass/templates/nested.sass +13 -13
- data/test/sass/templates/parent_ref.sass +12 -12
- data/test/sass/templates/script.sass +70 -70
- data/test/sass/templates/scss_import.scss +2 -1
- data/test/sass/templates/subdir/nested_subdir/_nested_partial.sass +1 -1
- data/test/sass/templates/subdir/nested_subdir/nested_subdir.sass +2 -2
- data/test/sass/templates/subdir/subdir.sass +3 -3
- data/test/sass/templates/units.sass +10 -10
- data/test/sass/test_helper.rb +1 -1
- data/test/sass/util/multibyte_string_scanner_test.rb +11 -3
- data/test/sass/util/normalized_map_test.rb +1 -1
- data/test/sass/util/subset_map_test.rb +2 -2
- data/test/sass/util_test.rb +46 -45
- data/test/sass/value_helpers_test.rb +5 -7
- data/test/sass-spec.yml +3 -0
- data/test/test_helper.rb +7 -6
- data/vendor/listen/CHANGELOG.md +1 -228
- data/vendor/listen/Gemfile +5 -15
- data/vendor/listen/README.md +111 -77
- data/vendor/listen/Rakefile +0 -42
- data/vendor/listen/lib/listen/adapter.rb +195 -82
- data/vendor/listen/lib/listen/adapters/bsd.rb +27 -64
- data/vendor/listen/lib/listen/adapters/darwin.rb +21 -58
- data/vendor/listen/lib/listen/adapters/linux.rb +23 -55
- data/vendor/listen/lib/listen/adapters/polling.rb +25 -34
- data/vendor/listen/lib/listen/adapters/windows.rb +50 -46
- data/vendor/listen/lib/listen/directory_record.rb +96 -61
- data/vendor/listen/lib/listen/listener.rb +135 -37
- data/vendor/listen/lib/listen/turnstile.rb +9 -5
- data/vendor/listen/lib/listen/version.rb +1 -1
- data/vendor/listen/lib/listen.rb +33 -19
- data/vendor/listen/listen.gemspec +6 -0
- data/vendor/listen/spec/listen/adapter_spec.rb +43 -77
- data/vendor/listen/spec/listen/adapters/polling_spec.rb +8 -8
- data/vendor/listen/spec/listen/directory_record_spec.rb +81 -56
- data/vendor/listen/spec/listen/listener_spec.rb +128 -39
- data/vendor/listen/spec/listen_spec.rb +15 -21
- data/vendor/listen/spec/spec_helper.rb +4 -0
- data/vendor/listen/spec/support/adapter_helper.rb +52 -15
- data/vendor/listen/spec/support/directory_record_helper.rb +7 -5
- data/vendor/listen/spec/support/listeners_helper.rb +30 -7
- metadata +310 -300
- data/CONTRIBUTING +0 -3
- data/ext/mkrf_conf.rb +0 -27
- data/lib/sass/script/value/deprecated_false.rb +0 -55
- data/lib/sass/scss/script_lexer.rb +0 -15
- data/lib/sass/scss/script_parser.rb +0 -25
- data/vendor/listen/lib/listen/dependency_manager.rb +0 -126
- data/vendor/listen/lib/listen/multi_listener.rb +0 -143
- data/vendor/listen/spec/listen/dependency_manager_spec.rb +0 -107
- data/vendor/listen/spec/listen/multi_listener_spec.rb +0 -174
data/test/sass/scss/css_test.rb
CHANGED
@@ -6,7 +6,7 @@ require 'sass/scss/css_parser'
|
|
6
6
|
# These tests just test the parsing of CSS
|
7
7
|
# (both standard and any hacks we intend to support).
|
8
8
|
# Tests of SCSS-specific behavior go in scss_test.rb.
|
9
|
-
class ScssCssTest < Test
|
9
|
+
class ScssCssTest < MiniTest::Test
|
10
10
|
include ScssTestHelper
|
11
11
|
|
12
12
|
def test_basic_scss
|
@@ -94,7 +94,7 @@ foo {a /*: b; c */: d}
|
|
94
94
|
SCSS
|
95
95
|
end
|
96
96
|
|
97
|
-
def test_crazy_comments
|
97
|
+
def test_crazy_comments
|
98
98
|
# http://www.w3.org/Style/CSS/Test/CSS2.1/current/xhtml1/t040109-c17-comments-00-b.xht
|
99
99
|
assert_equal <<CSS, render(<<SCSS)
|
100
100
|
/* This is a CSS comment. */
|
@@ -499,10 +499,24 @@ SCSS
|
|
499
499
|
|
500
500
|
def test_import_directive
|
501
501
|
assert_parses '@import "foo.css";'
|
502
|
-
assert_parses "@import 'foo.css';"
|
503
502
|
assert_parses '@import url("foo.css");'
|
504
503
|
assert_parses "@import url('foo.css');"
|
505
504
|
assert_parses '@import url(foo.css);'
|
505
|
+
|
506
|
+
assert_equal <<CSS, render(<<SCSS)
|
507
|
+
@import "foo.css";
|
508
|
+
CSS
|
509
|
+
@import 'foo.css';
|
510
|
+
SCSS
|
511
|
+
end
|
512
|
+
|
513
|
+
def test_import_directive_with_backslash_newline
|
514
|
+
assert_equal <<CSS, render(<<SCSS)
|
515
|
+
@import "foobar.css";
|
516
|
+
CSS
|
517
|
+
@import "foo\\
|
518
|
+
bar.css";
|
519
|
+
SCSS
|
506
520
|
end
|
507
521
|
|
508
522
|
def test_string_import_directive_with_media
|
@@ -620,14 +634,14 @@ SCSS
|
|
620
634
|
|
621
635
|
def test_supports
|
622
636
|
assert_equal <<CSS, render(<<SCSS)
|
623
|
-
@supports (a: b) and (c: d) or (not (d: e)) and ((not (f: g)) or (not ((h: i) and (j: k)))) {
|
637
|
+
@supports (((a: b) and (c: d)) or (not (d: e))) and ((not (f: g)) or (not ((h: i) and (j: k)))) {
|
624
638
|
.foo {
|
625
639
|
a: b; } }
|
626
640
|
@supports (a: b) {
|
627
641
|
.foo {
|
628
642
|
a: b; } }
|
629
643
|
CSS
|
630
|
-
@supports (a: b) and (c: d) or (not (d: e)) and ((not (f: g)) or (not ((h: i) and (j: k)))) {
|
644
|
+
@supports (((a: b) and (c: d)) or (not (d: e))) and ((not (f: g)) or (not ((h: i) and (j: k)))) {
|
631
645
|
.foo {
|
632
646
|
a: b;
|
633
647
|
}
|
@@ -639,17 +653,100 @@ CSS
|
|
639
653
|
}
|
640
654
|
}
|
641
655
|
SCSS
|
656
|
+
end
|
642
657
|
|
658
|
+
def test_supports_with_prefix
|
643
659
|
assert_equal <<CSS, render(<<SCSS)
|
644
|
-
@-prefix-supports (a: b) and (c: d) or (not (d: e)) and ((not (f: g)) or (not ((h: i) and (j: k)))) {
|
660
|
+
@-prefix-supports (((a: b) and (c: d)) or (not (d: e))) and ((not (f: g)) or (not ((h: i) and (j: k)))) {
|
661
|
+
.foo {
|
662
|
+
a: b; } }
|
663
|
+
CSS
|
664
|
+
@-prefix-supports (((a: b) and (c: d)) or (not (d: e))) and ((not (f: g)) or (not ((h: i) and (j: k)))) {
|
665
|
+
.foo {
|
666
|
+
a: b;
|
667
|
+
}
|
668
|
+
}
|
669
|
+
SCSS
|
670
|
+
end
|
671
|
+
|
672
|
+
def test_supports_allows_similar_operators_without_parens
|
673
|
+
assert_equal <<CSS, render(<<SCSS)
|
674
|
+
@supports (a: b) and (c: d) and (e: f) {
|
675
|
+
.foo {
|
676
|
+
a: b; } }
|
677
|
+
@supports (a: b) or (c: d) or (e: f) {
|
645
678
|
.foo {
|
646
679
|
a: b; } }
|
647
680
|
CSS
|
648
|
-
|
681
|
+
@supports (a: b) and (c: d) and (e: f) {
|
649
682
|
.foo {
|
650
683
|
a: b;
|
651
684
|
}
|
652
685
|
}
|
686
|
+
|
687
|
+
@supports (a: b) or (c: d) or (e: f) {
|
688
|
+
.foo {
|
689
|
+
a: b;
|
690
|
+
}
|
691
|
+
}
|
692
|
+
SCSS
|
693
|
+
end
|
694
|
+
|
695
|
+
def test_keyframes
|
696
|
+
assert_equal <<CSS, render(<<SCSS)
|
697
|
+
@keyframes identifier {
|
698
|
+
0% {
|
699
|
+
top: 0;
|
700
|
+
left: 0; }
|
701
|
+
30% {
|
702
|
+
top: 50px; }
|
703
|
+
68%, 72% {
|
704
|
+
left: 50px; }
|
705
|
+
100% {
|
706
|
+
top: 100px;
|
707
|
+
left: 100%; } }
|
708
|
+
CSS
|
709
|
+
@keyframes identifier {
|
710
|
+
0% {top: 0; left: 0}
|
711
|
+
30% {top: 50px}
|
712
|
+
68%, 72% {left: 50px}
|
713
|
+
100% {top: 100px; left: 100%}
|
714
|
+
}
|
715
|
+
SCSS
|
716
|
+
end
|
717
|
+
|
718
|
+
def test_keyframes_with_empty_rules
|
719
|
+
assert_equal <<CSS, render(<<SCSS)
|
720
|
+
@keyframes identifier {
|
721
|
+
50% {
|
722
|
+
background-color: black; } }
|
723
|
+
CSS
|
724
|
+
@keyframes identifier {
|
725
|
+
0% {}
|
726
|
+
50% {background-color: black}
|
727
|
+
100% {}
|
728
|
+
}
|
729
|
+
SCSS
|
730
|
+
end
|
731
|
+
|
732
|
+
def test_keyframes_with_custom_identifiers
|
733
|
+
assert_equal <<CSS, render(<<SCSS)
|
734
|
+
@-skrollr-keyframes identifier {
|
735
|
+
center-top {
|
736
|
+
left: 100%; }
|
737
|
+
top-bottom {
|
738
|
+
left: 0%; } }
|
739
|
+
CSS
|
740
|
+
@-skrollr-keyframes identifier {
|
741
|
+
center-top {
|
742
|
+
left: 100%;
|
743
|
+
}
|
744
|
+
|
745
|
+
top-bottom {
|
746
|
+
left: 0%;
|
747
|
+
}
|
748
|
+
}
|
749
|
+
|
653
750
|
SCSS
|
654
751
|
end
|
655
752
|
|
@@ -662,6 +759,8 @@ SCSS
|
|
662
759
|
assert_selector_parses('E:not(s)')
|
663
760
|
assert_selector_parses('E:not(s1, s2)')
|
664
761
|
assert_selector_parses('E:matches(s1, s2)')
|
762
|
+
assert_selector_parses('E:has(s1, s2)')
|
763
|
+
assert_selector_parses('E:has(> s1, > s2)')
|
665
764
|
assert_selector_parses('E.warning')
|
666
765
|
assert_selector_parses('E#myid')
|
667
766
|
assert_selector_parses('E[foo]')
|
@@ -712,20 +811,22 @@ SCSS
|
|
712
811
|
assert_selector_parses('E:last-of-type')
|
713
812
|
assert_selector_parses('E:nth-last-of-type(n)')
|
714
813
|
assert_selector_parses('E:only-of-type')
|
715
|
-
assert_selector_parses('E:nth-
|
716
|
-
assert_selector_parses('E:nth-last-
|
717
|
-
assert_selector_parses('E:
|
718
|
-
assert_selector_parses('E:nth-
|
719
|
-
assert_selector_parses('E:nth-last-column(n)')
|
814
|
+
assert_selector_parses('E:nth-child(n of selector)')
|
815
|
+
assert_selector_parses('E:nth-last-child(n of selector)')
|
816
|
+
assert_selector_parses('E:nth-child(n)')
|
817
|
+
assert_selector_parses('E:nth-last-child(n)')
|
720
818
|
assert_selector_parses('E F')
|
721
819
|
assert_selector_parses('E > F')
|
722
820
|
assert_selector_parses('E + F')
|
723
821
|
assert_selector_parses('E ~ F')
|
724
|
-
assert_selector_parses('E /foo/ F')
|
725
|
-
assert_selector_parses('E! > F')
|
822
|
+
silence_warnings {assert_selector_parses('E /foo/ F')}
|
823
|
+
silence_warnings {assert_selector_parses('E! > F')}
|
726
824
|
|
727
|
-
assert_selector_parses('E /ns|foo/ F')
|
728
|
-
|
825
|
+
silence_warnings {assert_selector_parses('E /ns|foo/ F')}
|
826
|
+
|
827
|
+
# From http://dev.w3.org/csswg/css-scoping-1/
|
828
|
+
assert_selector_parses('E:host(s)')
|
829
|
+
assert_selector_parses('E:host-context(s)')
|
729
830
|
end
|
730
831
|
|
731
832
|
# Taken from http://dev.w3.org/csswg/selectors4/#overview, but without element
|
@@ -734,6 +835,8 @@ SCSS
|
|
734
835
|
assert_selector_parses(':not(s)')
|
735
836
|
assert_selector_parses(':not(s1, s2)')
|
736
837
|
assert_selector_parses(':matches(s1, s2)')
|
838
|
+
assert_selector_parses(':has(s1, s2)')
|
839
|
+
assert_selector_parses(':has(> s1, > s2)')
|
737
840
|
assert_selector_parses('.warning')
|
738
841
|
assert_selector_parses('#myid')
|
739
842
|
assert_selector_parses('[foo]')
|
@@ -784,11 +887,14 @@ SCSS
|
|
784
887
|
assert_selector_parses(':last-of-type')
|
785
888
|
assert_selector_parses(':nth-last-of-type(n)')
|
786
889
|
assert_selector_parses(':only-of-type')
|
787
|
-
assert_selector_parses(':nth-
|
788
|
-
assert_selector_parses(':nth-last-
|
789
|
-
assert_selector_parses(':
|
790
|
-
assert_selector_parses(':nth-
|
791
|
-
|
890
|
+
assert_selector_parses(':nth-child(n of selector)')
|
891
|
+
assert_selector_parses(':nth-last-child(n of selector)')
|
892
|
+
assert_selector_parses(':nth-child(n)')
|
893
|
+
assert_selector_parses(':nth-last-child(n)')
|
894
|
+
|
895
|
+
# From http://dev.w3.org/csswg/css-scoping-1/
|
896
|
+
assert_selector_parses(':host(s)')
|
897
|
+
assert_selector_parses(':host-context(s)')
|
792
898
|
end
|
793
899
|
|
794
900
|
def test_attribute_selectors_with_identifiers
|
@@ -828,15 +934,18 @@ SCSS
|
|
828
934
|
def test_selectors_containing_selectors
|
829
935
|
assert_selector_can_contain_selectors(':not(<sel>)')
|
830
936
|
assert_selector_can_contain_selectors(':current(<sel>)')
|
831
|
-
assert_selector_can_contain_selectors(':nth-
|
832
|
-
assert_selector_can_contain_selectors(':nth-last-
|
833
|
-
assert_selector_can_contain_selectors(':column(<sel>)')
|
937
|
+
assert_selector_can_contain_selectors(':nth-child(n of <sel>)')
|
938
|
+
assert_selector_can_contain_selectors(':nth-last-child(n of <sel>)')
|
834
939
|
assert_selector_can_contain_selectors(':-moz-any(<sel>)')
|
940
|
+
assert_selector_can_contain_selectors(':has(<sel>)')
|
941
|
+
assert_selector_can_contain_selectors(':has(+ <sel>)')
|
942
|
+
assert_selector_can_contain_selectors(':host(<sel>)')
|
943
|
+
assert_selector_can_contain_selectors(':host-context(<sel>)')
|
835
944
|
end
|
836
945
|
|
837
946
|
def assert_selector_can_contain_selectors(sel)
|
838
947
|
try = lambda {|subsel| assert_selector_parses(sel.gsub('<sel>', subsel))}
|
839
|
-
|
948
|
+
|
840
949
|
try['foo|bar']
|
841
950
|
try['*|bar']
|
842
951
|
|
@@ -888,11 +997,11 @@ SCSS
|
|
888
997
|
end
|
889
998
|
|
890
999
|
def test_expression_fallback_selectors
|
891
|
-
|
892
|
-
|
893
|
-
|
894
|
-
|
895
|
-
|
1000
|
+
assert_directive_parses('0%')
|
1001
|
+
assert_directive_parses('60%')
|
1002
|
+
assert_directive_parses('100%')
|
1003
|
+
assert_directive_parses('12px')
|
1004
|
+
assert_directive_parses('"foo"')
|
896
1005
|
end
|
897
1006
|
|
898
1007
|
def test_functional_pseudo_selectors
|
@@ -929,6 +1038,35 @@ SCSS
|
|
929
1038
|
assert_equal "E + F {\n a: b; }\n", render("E+F { a: b;} ")
|
930
1039
|
end
|
931
1040
|
|
1041
|
+
def test_escapes_in_selectors
|
1042
|
+
assert_selector_parses('.\!foo')
|
1043
|
+
assert_selector_parses('.\66 foo')
|
1044
|
+
assert_selector_parses('.\21 foo')
|
1045
|
+
end
|
1046
|
+
|
1047
|
+
def test_subject_selector_deprecation
|
1048
|
+
assert_warning(<<WARNING) {render(".foo .bar! .baz {a: b}")}
|
1049
|
+
DEPRECATION WARNING on line 1, column 1:
|
1050
|
+
The subject selector operator "!" is deprecated and will be removed in a future release.
|
1051
|
+
This operator has been replaced by ":has()" in the CSS spec.
|
1052
|
+
For example: .foo .bar:has(.baz)
|
1053
|
+
WARNING
|
1054
|
+
|
1055
|
+
assert_warning(<<WARNING) {render(".foo .bar! > .baz {a: b}")}
|
1056
|
+
DEPRECATION WARNING on line 1, column 1:
|
1057
|
+
The subject selector operator "!" is deprecated and will be removed in a future release.
|
1058
|
+
This operator has been replaced by ":has()" in the CSS spec.
|
1059
|
+
For example: .foo .bar:has(> .baz)
|
1060
|
+
WARNING
|
1061
|
+
|
1062
|
+
assert_warning(<<WARNING) {render(".foo .bar! {a: b}")}
|
1063
|
+
DEPRECATION WARNING on line 1, column 1:
|
1064
|
+
The subject selector operator "!" is deprecated and will be removed in a future release.
|
1065
|
+
This operator has been replaced by ":has()" in the CSS spec.
|
1066
|
+
For example: .foo .bar
|
1067
|
+
WARNING
|
1068
|
+
end
|
1069
|
+
|
932
1070
|
## Errors
|
933
1071
|
|
934
1072
|
def test_invalid_directives
|
@@ -1014,8 +1152,41 @@ SCSS
|
|
1014
1152
|
assert_equal 1, e.sass_line
|
1015
1153
|
end
|
1016
1154
|
|
1155
|
+
def test_newline_in_property_value
|
1156
|
+
assert_equal(<<CSS, render(<<SCSS))
|
1157
|
+
.foo {
|
1158
|
+
bar: "bazbang"; }
|
1159
|
+
CSS
|
1160
|
+
.foo {
|
1161
|
+
bar: "baz\\
|
1162
|
+
bang";
|
1163
|
+
}
|
1164
|
+
SCSS
|
1165
|
+
end
|
1166
|
+
|
1017
1167
|
## Regressions
|
1018
1168
|
|
1169
|
+
def test_very_long_comment_doesnt_take_forever
|
1170
|
+
string = 'asdf' * (100000)
|
1171
|
+
assert_equal(<<CSS, render(<<SCSS))
|
1172
|
+
/*
|
1173
|
+
#{string}
|
1174
|
+
*/
|
1175
|
+
CSS
|
1176
|
+
/*
|
1177
|
+
#{string}
|
1178
|
+
*/
|
1179
|
+
SCSS
|
1180
|
+
end
|
1181
|
+
|
1182
|
+
def test_long_unclosed_comment_doesnt_take_forever
|
1183
|
+
assert_raise_message(Sass::SyntaxError,
|
1184
|
+
'Invalid CSS after "/*": expected "/", was "//*************..."') {render(<<SCSS)}
|
1185
|
+
/*
|
1186
|
+
//**************************************************************************
|
1187
|
+
SCSS
|
1188
|
+
end
|
1189
|
+
|
1019
1190
|
def test_double_space_string
|
1020
1191
|
assert_equal(<<CSS, render(<<SCSS))
|
1021
1192
|
.a {
|
@@ -1088,6 +1259,18 @@ SCSS
|
|
1088
1259
|
#{selector} {
|
1089
1260
|
a: b; }
|
1090
1261
|
SCSS
|
1262
|
+
|
1263
|
+
assert_parses <<SCSS
|
1264
|
+
:not(#{selector}) {
|
1265
|
+
a: b; }
|
1266
|
+
SCSS
|
1267
|
+
end
|
1268
|
+
|
1269
|
+
def assert_directive_parses(param)
|
1270
|
+
assert_parses <<SCSS
|
1271
|
+
@unknown #{param} {
|
1272
|
+
a: b; }
|
1273
|
+
SCSS
|
1091
1274
|
end
|
1092
1275
|
|
1093
1276
|
def render(scss, options = {})
|
data/test/sass/scss/rx_test.rb
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
require File.dirname(__FILE__) + '/../../test_helper'
|
4
4
|
require 'sass/engine'
|
5
5
|
|
6
|
-
class ScssRxTest < Test
|
6
|
+
class ScssRxTest < MiniTest::Test
|
7
7
|
include Sass::SCSS::RX
|
8
8
|
|
9
9
|
def test_identifiers
|
@@ -26,6 +26,7 @@ class ScssRxTest < Test::Unit::TestCase
|
|
26
26
|
assert_match IDENT, "_foo" # Can put a _ before anything
|
27
27
|
assert_match IDENT, "_\xC3\xBFoo"
|
28
28
|
assert_match IDENT, "_\\f oo"
|
29
|
+
assert_match IDENT, "--foo" # "Custom" identifier
|
29
30
|
|
30
31
|
assert_match IDENT, "foo-bar"
|
31
32
|
assert_match IDENT, "f012-23"
|
@@ -59,7 +60,6 @@ class ScssRxTest < Test::Unit::TestCase
|
|
59
60
|
assert_no_match IDENT, ""
|
60
61
|
assert_no_match IDENT, "1foo"
|
61
62
|
assert_no_match IDENT, "-1foo"
|
62
|
-
assert_no_match IDENT, "--foo"
|
63
63
|
assert_no_match IDENT, "foo bar"
|
64
64
|
assert_no_match IDENT, "foo~bar"
|
65
65
|
|
@@ -141,16 +141,20 @@ class ScssRxTest < Test::Unit::TestCase
|
|
141
141
|
assert_equal "foo\\00007fbar", Sass::SCSS::RX.escape_ident("foo\177bar")
|
142
142
|
end
|
143
143
|
|
144
|
+
def test_no_static_hyphenated_units
|
145
|
+
assert_no_match STATIC_VALUE, "20px-20px"
|
146
|
+
end
|
147
|
+
|
144
148
|
private
|
145
149
|
|
146
150
|
def assert_match(rx, str)
|
147
|
-
|
151
|
+
refute_nil(match = rx.match(str))
|
148
152
|
assert_equal str.size, match[0].size
|
149
153
|
end
|
150
154
|
|
151
155
|
def assert_no_match(rx, str)
|
152
156
|
match = rx.match(str)
|
153
|
-
|
157
|
+
refute_equal str.size, match && match[0].size
|
154
158
|
end
|
155
159
|
|
156
160
|
end
|