bourbon 4.1.0 → 4.2.0

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.
Files changed (109) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +4 -3
  3. data/.hound.yml +4 -0
  4. data/.npmignore +5 -2
  5. data/.scss-lint.yml +175 -0
  6. data/LICENSE.md +6 -8
  7. data/README.md +13 -16
  8. data/Rakefile +6 -4
  9. data/app/assets/stylesheets/_bourbon-deprecated-upcoming.scss +16 -7
  10. data/app/assets/stylesheets/_bourbon.scss +28 -27
  11. data/app/assets/stylesheets/addons/_border-color.scss +26 -0
  12. data/app/assets/stylesheets/addons/_border-radius.scss +48 -0
  13. data/app/assets/stylesheets/addons/_border-style.scss +25 -0
  14. data/app/assets/stylesheets/addons/_border-width.scss +25 -0
  15. data/app/assets/stylesheets/addons/_buttons.scss +64 -0
  16. data/app/assets/stylesheets/addons/_clearfix.scss +17 -10
  17. data/app/assets/stylesheets/addons/_ellipsis.scss +22 -0
  18. data/app/assets/stylesheets/addons/_font-stacks.scss +31 -0
  19. data/app/assets/stylesheets/addons/_hide-text.scss +23 -8
  20. data/app/assets/stylesheets/addons/_margin.scss +26 -0
  21. data/app/assets/stylesheets/addons/_padding.scss +26 -0
  22. data/app/assets/stylesheets/addons/_position.scss +24 -2
  23. data/app/assets/stylesheets/addons/_prefixer.scss +36 -15
  24. data/app/assets/stylesheets/addons/_size.scss +30 -1
  25. data/app/assets/stylesheets/addons/_text-inputs.scss +112 -0
  26. data/app/assets/stylesheets/addons/_timing-functions.scss +7 -5
  27. data/app/assets/stylesheets/addons/_triangle.scss +11 -11
  28. data/app/assets/stylesheets/addons/_word-wrap.scss +19 -0
  29. data/app/assets/stylesheets/css3/_animation.scss +14 -23
  30. data/app/assets/stylesheets/css3/_appearance.scss +1 -1
  31. data/app/assets/stylesheets/css3/_backface-visibility.scss +0 -3
  32. data/app/assets/stylesheets/css3/_background-image.scss +1 -1
  33. data/app/assets/stylesheets/css3/_background.scss +3 -3
  34. data/app/assets/stylesheets/css3/_border-image.scss +3 -3
  35. data/app/assets/stylesheets/css3/_calc.scss +1 -1
  36. data/app/assets/stylesheets/css3/_columns.scss +8 -8
  37. data/app/assets/stylesheets/css3/_filter.scss +0 -1
  38. data/app/assets/stylesheets/css3/_flex-box.scss +16 -47
  39. data/app/assets/stylesheets/css3/_font-feature-settings.scss +1 -7
  40. data/app/assets/stylesheets/css3/_hyphens.scss +2 -2
  41. data/app/assets/stylesheets/css3/_image-rendering.scss +6 -6
  42. data/app/assets/stylesheets/css3/_keyframes.scss +1 -0
  43. data/app/assets/stylesheets/css3/_linear-gradient.scss +11 -11
  44. data/app/assets/stylesheets/css3/_radial-gradient.scss +14 -14
  45. data/app/assets/stylesheets/css3/_selection.scss +39 -11
  46. data/app/assets/stylesheets/css3/_transform.scss +5 -5
  47. data/app/assets/stylesheets/css3/_transition.scss +17 -23
  48. data/app/assets/stylesheets/css3/_user-select.scss +2 -2
  49. data/app/assets/stylesheets/functions/{_assign.scss → _assign-inputs.scss} +2 -2
  50. data/app/assets/stylesheets/functions/_contains-falsy.scss +20 -0
  51. data/app/assets/stylesheets/functions/_contains.scss +16 -2
  52. data/app/assets/stylesheets/functions/_is-length.scss +5 -1
  53. data/app/assets/stylesheets/functions/_is-light.scss +21 -0
  54. data/app/assets/stylesheets/functions/_is-number.scss +11 -0
  55. data/app/assets/stylesheets/functions/_is-size.scss +8 -1
  56. data/app/assets/stylesheets/functions/_px-to-em.scss +2 -2
  57. data/app/assets/stylesheets/functions/_px-to-rem.scss +2 -2
  58. data/app/assets/stylesheets/functions/_shade.scss +24 -0
  59. data/app/assets/stylesheets/functions/_strip-units.scss +15 -3
  60. data/app/assets/stylesheets/functions/_tint.scss +24 -0
  61. data/app/assets/stylesheets/functions/_transition-property-name.scss +14 -14
  62. data/app/assets/stylesheets/functions/_unpack.scss +18 -8
  63. data/app/assets/stylesheets/helpers/_convert-units.scss +2 -2
  64. data/app/assets/stylesheets/helpers/_directional-values.scss +96 -0
  65. data/app/assets/stylesheets/helpers/_font-source-declaration.scss +17 -9
  66. data/app/assets/stylesheets/helpers/_linear-gradient-parser.scss +1 -1
  67. data/app/assets/stylesheets/helpers/_linear-positions-parser.scss +1 -1
  68. data/app/assets/stylesheets/helpers/_radial-arg-parser.scss +10 -10
  69. data/app/assets/stylesheets/helpers/_radial-gradient-parser.scss +4 -4
  70. data/app/assets/stylesheets/helpers/_radial-positions-parser.scss +2 -2
  71. data/app/assets/stylesheets/helpers/_str-to-num.scss +3 -3
  72. data/app/assets/stylesheets/settings/_asset-pipeline.scss +6 -0
  73. data/app/assets/stylesheets/settings/_prefixer.scss +5 -2
  74. data/bourbon.gemspec +4 -2
  75. data/bower.json +8 -6
  76. data/lib/bourbon/version.rb +1 -1
  77. data/package.json +1 -1
  78. data/spec/bourbon/functions/assign_inputs_spec.rb +50 -0
  79. data/spec/bourbon/functions/contains_spec.rb +27 -0
  80. data/spec/bourbon/functions/is_length_spec.rb +49 -0
  81. data/spec/bourbon/functions/is_light_spec.rb +37 -0
  82. data/spec/bourbon/functions/is_number_spec.rb +43 -0
  83. data/spec/bourbon/functions/is_size_spec.rb +43 -0
  84. data/spec/bourbon/functions/modular_scale_spec.rb +43 -0
  85. data/spec/bourbon/functions/px_to_em_spec.rb +31 -0
  86. data/spec/fixtures/_setup.scss +1 -0
  87. data/spec/fixtures/functions/assign-inputs.scss +19 -0
  88. data/spec/fixtures/functions/contains.scss +28 -0
  89. data/spec/fixtures/functions/is-length.scss +35 -0
  90. data/spec/fixtures/functions/is-light.scss +29 -0
  91. data/spec/fixtures/functions/is-number.scss +31 -0
  92. data/spec/fixtures/functions/is-size.scss +31 -0
  93. data/spec/fixtures/functions/modular-scale.scss +29 -0
  94. data/spec/fixtures/functions/px-to-em.scss +17 -0
  95. data/spec/spec_helper.rb +22 -0
  96. data/spec/support/matchers/be_contained_in.rb +10 -0
  97. data/spec/support/matchers/have_rule.rb +35 -0
  98. data/spec/support/matchers/have_value.rb +15 -0
  99. data/spec/support/parser_support.rb +16 -0
  100. data/spec/support/sass_support.rb +10 -0
  101. metadata +100 -17
  102. data/app/assets/stylesheets/addons/_directional-values.scss +0 -111
  103. data/app/assets/stylesheets/addons/_font-family.scss +0 -5
  104. data/app/assets/stylesheets/addons/_html5-input-types.scss +0 -90
  105. data/app/assets/stylesheets/css3/_border-radius.scss +0 -22
  106. data/app/assets/stylesheets/css3/_box-sizing.scss +0 -4
  107. data/app/assets/stylesheets/functions/_color-lightness.scss +0 -13
  108. data/app/assets/stylesheets/functions/_tint-shade.scss +0 -9
  109. data/app/assets/stylesheets/helpers/_is-num.scss +0 -5
@@ -0,0 +1,50 @@
1
+ require "spec_helper"
2
+
3
+ describe "assign-inputs" do
4
+ before(:all) do
5
+ ParserSupport.parse_file("functions/assign-inputs")
6
+ @text_inputs_list = [
7
+ "input[type=\"password\"]",
8
+ "input[type=\"text\"]",
9
+ "textarea"
10
+ ]
11
+ end
12
+
13
+ context "expands plain text inputs" do
14
+ it "finds selectors" do
15
+ @text_inputs_list.each do |input|
16
+ expect(input).to have_rule("color: #ff0000")
17
+ end
18
+ end
19
+ end
20
+
21
+ context "expands text inputs with pseudo classes" do
22
+ it "finds selectors" do
23
+ list = @text_inputs_list.dup
24
+ list.map! { |input| input + ":active" }
25
+ list.each do |input|
26
+ expect(input).to have_rule("color: #00ff00")
27
+ end
28
+ end
29
+ end
30
+
31
+ context "expands text inputs when first in list" do
32
+ it "finds selectors" do
33
+ list = @text_inputs_list.dup
34
+ list.push "select"
35
+ list.each do |input|
36
+ expect(input).to have_rule("color: #0000ff")
37
+ end
38
+ end
39
+ end
40
+
41
+ context "expands text inputs when middle of list" do
42
+ it "finds selectors" do
43
+ list = @text_inputs_list.dup
44
+ list.unshift "input[type=\"file\"]"
45
+ list.each do |input|
46
+ expect(input).to have_rule("color: #ff00ff")
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,27 @@
1
+ require "spec_helper"
2
+
3
+ describe "contains" do
4
+ before(:all) do
5
+ ParserSupport.parse_file("functions/contains")
6
+ end
7
+
8
+ context "called on array with single item" do
9
+ it "contains item" do
10
+ expect(".single").to have_rule("color: #fff")
11
+ end
12
+
13
+ it "doesn't contain missing item" do
14
+ expect(".single-missing").to have_rule("color: #000")
15
+ end
16
+ end
17
+
18
+ context "called with array with multiple items" do
19
+ it "contains item" do
20
+ expect(".multiple").to have_rule("color: #fff")
21
+ end
22
+
23
+ it "doesn't contain missing item" do
24
+ expect(".multiple-missing").to have_rule("color: #000")
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,49 @@
1
+ require "spec_helper"
2
+
3
+ describe "is-length" do
4
+ before(:all) do
5
+ ParserSupport.parse_file("functions/is-length")
6
+ end
7
+
8
+ context "checks if unitless integer can be represented as a length" do
9
+ it "returns false" do
10
+ expect(".integer").not_to have_rule("color: #fff")
11
+ end
12
+ end
13
+
14
+ context "checks if px can be represented as a length" do
15
+ it "returns true" do
16
+ expect(".pixels").to have_rule("color: #fff")
17
+ end
18
+ end
19
+
20
+ context "checks if em can be represented as a length" do
21
+ it "returns true" do
22
+ expect(".ems").to have_rule("color: #fff")
23
+ end
24
+ end
25
+
26
+ context "checks if percent can be represented as a length" do
27
+ it "returns true" do
28
+ expect(".percent").to have_rule("color: #fff")
29
+ end
30
+ end
31
+
32
+ context "parses calculated values" do
33
+ it "returns true" do
34
+ expect(".calc").to have_rule("color: #fff")
35
+ end
36
+ end
37
+
38
+ context "checks if strings can be represented as a length" do
39
+ it "returns false" do
40
+ expect(".string").not_to have_rule("color: #fff")
41
+ end
42
+ end
43
+
44
+ context "checks if null can be represented as a length" do
45
+ it "returns false" do
46
+ expect(".null").not_to have_rule("color: #fff")
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,37 @@
1
+ require "spec_helper"
2
+
3
+ describe "is-light" do
4
+ before(:all) do
5
+ ParserSupport.parse_file("functions/is-light")
6
+ end
7
+
8
+ context "takes a light color" do
9
+ it "and returns true" do
10
+ expect(".pink").to have_rule("color: #000")
11
+ end
12
+ end
13
+
14
+ context "takes a medium-light color" do
15
+ it "and returns true" do
16
+ expect(".sky").to have_rule("color: #000")
17
+ end
18
+ end
19
+
20
+ context "takes a medium-dark color" do
21
+ it "and returns false" do
22
+ expect(".medium-gray").to have_rule("color: #fff")
23
+ end
24
+ end
25
+
26
+ context "takes a dark color" do
27
+ it "and returns false" do
28
+ expect(".charcoal").to have_rule("color: #fff")
29
+ end
30
+ end
31
+
32
+ context "takes a translucent color" do
33
+ it "and processes as an opaque color" do
34
+ expect(".translucent").to have_rule("color: #000")
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,43 @@
1
+ require "spec_helper"
2
+
3
+ describe "is-number" do
4
+ before(:all) do
5
+ ParserSupport.parse_file("functions/is-number")
6
+ end
7
+
8
+ context "called with integer" do
9
+ it "is a number" do
10
+ expect(".integer").to have_rule("line-height: 1")
11
+ end
12
+ end
13
+
14
+ context "called with px" do
15
+ it "is a number" do
16
+ expect(".px").to have_rule("line-height: 2px")
17
+ end
18
+ end
19
+
20
+ context "called with em" do
21
+ it "is a number" do
22
+ expect(".em").to have_rule("line-height: 3em")
23
+ end
24
+ end
25
+
26
+ context "called with rem" do
27
+ it "is a number" do
28
+ expect(".rem").to have_rule("line-height: 4rem")
29
+ end
30
+ end
31
+
32
+ context "called with percent" do
33
+ it "is a number" do
34
+ expect(".percent").to have_rule("line-height: 5%")
35
+ end
36
+ end
37
+
38
+ context "called with string" do
39
+ it "is not a number" do
40
+ expect(".string").to_not have_rule("line-height: \"stringy\"")
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,43 @@
1
+ require "spec_helper"
2
+
3
+ describe "is-size" do
4
+ before(:all) do
5
+ ParserSupport.parse_file("functions/is-size")
6
+ end
7
+
8
+ context "called with integer" do
9
+ it "is not a size" do
10
+ expect(".integer").to_not have_rule("margin-top: 1")
11
+ end
12
+ end
13
+
14
+ context "called with px" do
15
+ it "is a size" do
16
+ expect(".px").to have_rule("margin-top: 2px")
17
+ end
18
+ end
19
+
20
+ context "called with em" do
21
+ it "is a size" do
22
+ expect(".em").to have_rule("margin-top: 3em")
23
+ end
24
+ end
25
+
26
+ context "called with rem" do
27
+ it "is a size" do
28
+ expect(".rem").to have_rule("margin-top: 4rem")
29
+ end
30
+ end
31
+
32
+ context "called with percent" do
33
+ it "is a size" do
34
+ expect(".percent").to have_rule("margin-top: 5%")
35
+ end
36
+ end
37
+
38
+ context "called with string" do
39
+ it "is not a size" do
40
+ expect(".string").to_not have_rule("margin-top: \"stringy\"")
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,43 @@
1
+ require "spec_helper"
2
+
3
+ describe "modular-scale" do
4
+ before(:all) do
5
+ ParserSupport.parse_file("functions/modular-scale")
6
+ end
7
+
8
+ context "called with arguments (1, $value: 2em)" do
9
+ it "outputs double the first value from the default scale" do
10
+ expect(".one-base-two").to have_rule("font-size: 2.666em")
11
+ end
12
+ end
13
+
14
+ context "called with arguments (1, $value: 3em)" do
15
+ it "outputs triple the first value from the default scale" do
16
+ expect(".one-base-three").to have_rule("font-size: 3.999em")
17
+ end
18
+ end
19
+
20
+ context "called with arguments (1, $value: 4em 6em)" do
21
+ it "outputs quadruple the first value from the default scale" do
22
+ expect(".one-double-value").to have_rule("font-size: 1.12556em")
23
+ end
24
+ end
25
+
26
+ context "called with arguments (1, $ratio: $golden-ratio)" do
27
+ it "output the first value from the golden ratio scale" do
28
+ expect(".one-golden-ratio").to have_rule("font-size: 1.618em")
29
+ end
30
+ end
31
+
32
+ context "called with argument (2)" do
33
+ it "outputs the second value from the default scale" do
34
+ expect(".two-base-one").to have_rule("font-size: 1.77689em")
35
+ end
36
+ end
37
+
38
+ context "called with arguments (2, $value: 4em 6em)" do
39
+ it "outputs sextuple the second value from the default scale" do
40
+ expect(".two-double-value").to have_rule("font-size: 3.55378em")
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,31 @@
1
+ require "spec_helper"
2
+
3
+ describe "px-to-em" do
4
+ before(:all) do
5
+ ParserSupport.parse_file("functions/px-to-em")
6
+ end
7
+
8
+ context "called with unitless integer" do
9
+ it "outputs ems" do
10
+ expect(".unitless").to have_rule("font-size: 0.75em")
11
+ end
12
+ end
13
+
14
+ context "called with unitless integer and base" do
15
+ it "outputs ems" do
16
+ expect(".unitless-with-base").to have_rule("font-size: 0.66667em")
17
+ end
18
+ end
19
+
20
+ context "called with px" do
21
+ it "outputs ems" do
22
+ expect(".px").to have_rule("font-size: 1em")
23
+ end
24
+ end
25
+
26
+ context "called with px" do
27
+ it "outputs ems" do
28
+ expect(".px-with-base").to have_rule("font-size: 1.5em")
29
+ end
30
+ end
31
+ end
@@ -0,0 +1 @@
1
+ @import "app/assets/stylesheets/bourbon";
@@ -0,0 +1,19 @@
1
+ @import "setup";
2
+
3
+ #{assign-inputs($text-inputs-list)} {
4
+ color: #ff0000;
5
+ }
6
+
7
+ #{assign-inputs($text-inputs-list, active)} {
8
+ color: #00ff00;
9
+ }
10
+
11
+ #{assign-inputs($text-inputs-list)},
12
+ select {
13
+ color: #0000ff;
14
+ }
15
+
16
+ input[type="file"],
17
+ #{assign-inputs($text-inputs-list)} {
18
+ color: #ff00ff;
19
+ }
@@ -0,0 +1,28 @@
1
+ @import "setup";
2
+
3
+ $single: "apple";
4
+ $multiple: "pineapple", "banana", "cumquat";
5
+
6
+ @mixin color-contains($list, $values) {
7
+ @if contains($list, $values) {
8
+ color: #fff;
9
+ } @else {
10
+ color: #000;
11
+ }
12
+ }
13
+
14
+ .single {
15
+ @include color-contains($single, "apple");
16
+ }
17
+
18
+ .single-missing {
19
+ @include color-contains($single, "pear");
20
+ }
21
+
22
+ .multiple {
23
+ @include color-contains($multiple, "banana");
24
+ }
25
+
26
+ .multiple-missing {
27
+ @include color-contains($multiple, "strawberry");
28
+ }
@@ -0,0 +1,35 @@
1
+ @import "setup";
2
+
3
+ @mixin color-length($value) {
4
+ @if is-length($value) {
5
+ color: #fff;
6
+ }
7
+ }
8
+
9
+ .integer {
10
+ @include color-length(1);
11
+ }
12
+
13
+ .pixels {
14
+ @include color-length(10px);
15
+ }
16
+
17
+ .ems {
18
+ @include color-length(10em);
19
+ }
20
+
21
+ .percent {
22
+ @include color-length(10%);
23
+ }
24
+
25
+ .calc {
26
+ @include color-length(calc(2em - 5px));
27
+ }
28
+
29
+ .string {
30
+ @include color-length("stringy");
31
+ }
32
+
33
+ .null {
34
+ @include color-length(null);
35
+ }
@@ -0,0 +1,29 @@
1
+ @import "setup";
2
+
3
+ @mixin reverse-color($color) {
4
+ @if is-light($color) {
5
+ color: #000;
6
+ } @else {
7
+ color: #fff;
8
+ }
9
+ }
10
+
11
+ .pink {
12
+ @include reverse-color(#ffcccc);
13
+ }
14
+
15
+ .sky {
16
+ @include reverse-color(#aaeeff);
17
+ }
18
+
19
+ .medium-gray {
20
+ @include reverse-color(#888);
21
+ }
22
+
23
+ .charcoal {
24
+ @include reverse-color(#333);
25
+ }
26
+
27
+ .translucent {
28
+ @include reverse-color(rgba(#fff, 0.1));
29
+ }
@@ -0,0 +1,31 @@
1
+ @import "setup";
2
+
3
+ @mixin line-height($number) {
4
+ @if is-number($number) {
5
+ line-height: $number;
6
+ }
7
+ }
8
+
9
+ .integer {
10
+ @include line-height(1);
11
+ }
12
+
13
+ .px {
14
+ @include line-height(2px);
15
+ }
16
+
17
+ .em {
18
+ @include line-height(3em);
19
+ }
20
+
21
+ .rem {
22
+ @include line-height(4rem);
23
+ }
24
+
25
+ .percent {
26
+ @include line-height(5%);
27
+ }
28
+
29
+ .string {
30
+ @include line-height("stringy");
31
+ }
@@ -0,0 +1,31 @@
1
+ @import "setup";
2
+
3
+ @mixin size-margin($size) {
4
+ @if is-size($size) {
5
+ margin-top: $size;
6
+ }
7
+ }
8
+
9
+ .integer {
10
+ @include size-margin(1);
11
+ }
12
+
13
+ .px {
14
+ @include size-margin(2px);
15
+ }
16
+
17
+ .em {
18
+ @include size-margin(3em);
19
+ }
20
+
21
+ .rem {
22
+ @include size-margin(4rem);
23
+ }
24
+
25
+ .percent {
26
+ @include size-margin(5%);
27
+ }
28
+
29
+ .string {
30
+ @include size-margin("stringy");
31
+ }
@@ -0,0 +1,29 @@
1
+ @import "setup";
2
+
3
+ .one {
4
+ &-base-two {
5
+ font-size: modular-scale(1, $value: 2em);
6
+ }
7
+
8
+ &-base-three {
9
+ font-size: modular-scale(1, $value: 3em);
10
+ }
11
+
12
+ &-double-value {
13
+ font-size: modular-scale(1, $value: 1em 2em);
14
+ }
15
+
16
+ &-golden-ratio {
17
+ font-size: modular-scale(1, $ratio: $golden);
18
+ }
19
+ }
20
+
21
+ .two {
22
+ &-base-one {
23
+ font-size: modular-scale(2, $value: 1em);
24
+ }
25
+
26
+ &-double-value {
27
+ font-size: modular-scale(2, $value: 2em);
28
+ }
29
+ }
@@ -0,0 +1,17 @@
1
+ @import "setup";
2
+
3
+ .unitless {
4
+ font-size: em(12);
5
+ }
6
+
7
+ .unitless-with-base {
8
+ font-size: em(10, 15);
9
+ }
10
+
11
+ .px {
12
+ font-size: em(16px);
13
+ }
14
+
15
+ .px-with-base {
16
+ font-size: em(15px, 10px);
17
+ }
@@ -0,0 +1,22 @@
1
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
2
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
3
+ require "rspec"
4
+ require "bourbon"
5
+ require "aruba/api"
6
+ require "css_parser"
7
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
8
+
9
+ RSpec.configure do |config|
10
+ config.include SassSupport
11
+ config.include CssParser
12
+ config.include ParserSupport
13
+ config.include Aruba::Api
14
+
15
+ config.before(:all) do
16
+ generate_css
17
+ end
18
+
19
+ config.after(:all) do
20
+ clean_up
21
+ end
22
+ end
@@ -0,0 +1,10 @@
1
+ RSpec::Matchers.define :be_contained_in do |expected|
2
+ match do |actual|
3
+ @query = ParserSupport.parser.find_by_selector(actual, expected)
4
+ @query.any?
5
+ end
6
+
7
+ failure_message_for_should do |actual|
8
+ %{expected selector #{actual} to be container in #{expected}}
9
+ end
10
+ end
@@ -0,0 +1,35 @@
1
+ RSpec::Matchers.define :have_rule do |expected|
2
+ match do |selector|
3
+ @rules = rules_from_selector(selector)
4
+ @rules.include? expected
5
+ end
6
+
7
+ failure_message do |selector|
8
+ if @rules.empty?
9
+ %{no CSS for selector #{selector} were found}
10
+ else
11
+ rules = @rules.join("; ")
12
+ %{Expected selector #{selector} to have CSS rule "#{expected}".
13
+ Had "#{rules}".}
14
+ end
15
+ end
16
+
17
+ def rules_from_selector(selector)
18
+ rulesets = ParserSupport.parser.find_by_selector(selector)
19
+ if rulesets.empty?
20
+ []
21
+ else
22
+ rules(rulesets)
23
+ end
24
+ end
25
+
26
+ def rules(rulesets)
27
+ rules = []
28
+ rulesets.map do |ruleset|
29
+ ruleset.split(";").each do |rule|
30
+ rules << rule.strip
31
+ end
32
+ end
33
+ rules
34
+ end
35
+ end
@@ -0,0 +1,15 @@
1
+ RSpec::Matchers.define :have_value do |expected|
2
+ match do |variable|
3
+ selector_id = variable.sub("$", "#")
4
+ value_attribute = ParserSupport.parser.find_by_selector(selector_id)[0]
5
+
6
+ unless value_attribute.nil?
7
+ actual_value = value_attribute.split(':')[1].strip.sub(";", "")
8
+ actual_value == expected
9
+ end
10
+ end
11
+
12
+ failure_message_for_should do |variable_name|
13
+ %{expected variable #{variable_name} to have value "#{expected}"}
14
+ end
15
+ end
@@ -0,0 +1,16 @@
1
+ module ParserSupport
2
+ def self.parser
3
+ @parser ||= CssParser::Parser.new
4
+ end
5
+
6
+ def self.parse_file(identifier)
7
+ parser.load_file!("tmp/#{identifier}.css")
8
+ end
9
+
10
+ def self.show_contents(identifier)
11
+ css_file_contents = File.open("tmp/#{identifier}.css").read
12
+ css_file_contents.each_line do |line|
13
+ puts line
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,10 @@
1
+ module SassSupport
2
+ def generate_css
3
+ _mkdir("tmp")
4
+ `sass -I . --update spec/fixtures:tmp`
5
+ end
6
+
7
+ def clean_up
8
+ FileUtils.rm_rf("tmp")
9
+ end
10
+ end