csscss 1.2.0 → 1.3.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.
data/.gitignore CHANGED
@@ -15,3 +15,4 @@ spec/reports
15
15
  test/tmp
16
16
  test/version_tmp
17
17
  tmp
18
+ _site
data/CHANGELOG.md CHANGED
@@ -1,3 +1,10 @@
1
+ ## 1.3.0 - 4/20/2013 ##
2
+
3
+ * Adds --require switch for user configuration
4
+ * Deprecates --compass-with-config config.rb in favor of --compass --require config.rb
5
+ * Ignores @import statements. Users will need to run csscss on those directly
6
+ * Adds --ignore-sass-mixins which won't match declarations coming from sass mixins
7
+
1
8
  ## 1.2.0 - 4/14/2013 ##
2
9
 
3
10
  * 0 and 0px are now reconciled as redundancies
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- csscss (1.2.0)
4
+ csscss (1.3.0)
5
5
  colorize
6
6
  parslet (~> 1.5)
7
7
 
data/lib/csscss/cli.rb CHANGED
@@ -9,6 +9,7 @@ module Csscss
9
9
  @ignored_properties = []
10
10
  @ignored_selectors = []
11
11
  @match_shorthand = true
12
+ @ignore_sass_mixins = false
12
13
  end
13
14
 
14
15
  def run
@@ -18,7 +19,7 @@ module Csscss
18
19
 
19
20
  private
20
21
  def execute
21
- warn_old_debug_flag if ENV["CSSCSS_DEBUG"]
22
+ deprecate("Use --show-parser-errors instead of CSSCSS_DEBUG") if ENV["CSSCSS_DEBUG"]
22
23
 
23
24
  all_contents= @argv.map do |filename|
24
25
  if filename =~ URI.regexp
@@ -71,48 +72,61 @@ module Csscss
71
72
  @verbose = v
72
73
  end
73
74
 
74
- opts.on("--[no-]color", "Colorize output (default is #{@color})") do |c|
75
+ opts.on("--[no-]color", "Colorize output", "(default is #{@color})") do |c|
75
76
  @color = c
76
77
  end
77
78
 
78
- opts.on("-n", "--num N", Integer, "Print matches with at least this many rules. Defaults to 3") do |n|
79
+ opts.on("-n", "--num N", Integer, "Print matches with at least this many rules.", "(default is 3)") do |n|
79
80
  @minimum = n
80
81
  end
81
82
 
82
- opts.on("--ignore-properties property1,property2,...", Array, "Ignore these properties when finding matches") do |ignored_properties|
83
- @ignored_properties = ignored_properties
83
+ opts.on("--[no-]match-shorthand", "Expand shorthand rules and matches on explicit rules", "(default is true)") do |match_shorthand|
84
+ @match_shorthand = match_shorthand
84
85
  end
85
86
 
86
- opts.on('--ignore-selectors "selector1","selector2",...', Array, "Ignore these selectors when finding matches") do |ignored_selectors|
87
- @ignored_selectors = ignored_selectors
87
+ opts.on("-j", "--[no-]json", "Output results in JSON") do |j|
88
+ @json = j
88
89
  end
89
90
 
90
- opts.on("-V", "--version", "Show version") do |v|
91
- puts opts.ver
92
- exit
91
+ opts.on("--ignore-sass-mixins", "EXPERIMENTAL: Ignore matches that come from including sass/scss mixins",
92
+ "This is an experimental feature and may not be included in future releases",
93
+ "(default is false)") do |ignore|
94
+ @ignore_sass_mixins = ignore
93
95
  end
94
96
 
95
97
  opts.on("--[no-]compass", "Enable compass extensions when parsing sass/scss (default is false)") do |compass|
96
98
  enable_compass if @compass = compass
97
99
  end
98
100
 
99
- opts.on("--compass-with-config config", "Enable compass extensions when parsing sass/scss and pass config file") do |config|
101
+ opts.on("--compass-with-config config", "Enable compass extensions when parsing sass/scss and pass config file",
102
+ "DEPRECATED: use --compass --require path/to/config.rb instead."
103
+ ) do |config|
104
+ deprecate("Use --compass --require #{config} instead of --compass-with-config #{config}")
100
105
  @compass = true
101
106
  enable_compass(config)
102
107
  end
103
108
 
104
- opts.on("--[no-]match-shorthand", "Expands shorthand rules and matches on explicit rules (default is true)") do |match_shorthand|
105
- @match_shorthand = match_shorthand
109
+ opts.on("--require file.rb", "Load ruby file before running csscss.", "Great for bootstrapping requires/configurations") do |file|
110
+ load file
106
111
  end
107
112
 
108
- opts.on("-j", "--[no-]json", "Output results in JSON") do |j|
109
- @json = j
113
+ opts.on("--ignore-properties property1,property2,...", Array, "Ignore these properties when finding matches") do |ignored_properties|
114
+ @ignored_properties = ignored_properties
115
+ end
116
+
117
+ opts.on('--ignore-selectors "selector1","selector2",...', Array, "Ignore these selectors when finding matches") do |ignored_selectors|
118
+ @ignored_selectors = ignored_selectors
110
119
  end
111
120
 
112
121
  opts.on("--show-parser-errors", "Print verbose parser errors") do |show_parser_errors|
113
122
  @show_parser_errors = show_parser_errors
114
123
  end
115
124
 
125
+ opts.on("-V", "--version", "Show version") do |v|
126
+ puts opts.ver
127
+ exit
128
+ end
129
+
116
130
  opts.on_tail("-h", "--help", "Show this message") do
117
131
  print_help(opts)
118
132
  end
@@ -129,20 +143,18 @@ module Csscss
129
143
  exit
130
144
  end
131
145
 
132
- def warn_old_debug_flag
133
- $stderr.puts "CSSCSS_DEBUG is now deprecated. Use --show-parser-errors instead".red
146
+ def deprecate(message)
147
+ $stderr.puts("DEPRECATED: #{message}".yellow)
134
148
  end
135
149
 
136
150
  def enable_compass(config = nil)
137
- require "compass"
151
+ abort 'Must install the "compass" gem before enabling its extensions' unless gem_installed?("compass")
138
152
 
139
153
  if config
140
154
  Compass.add_configuration(config)
141
155
  else
142
156
  Compass.add_configuration("config.rb") if File.exist?("config.rb")
143
157
  end
144
- rescue LoadError
145
- abort "Must install compass gem before enabling its extensions"
146
158
  end
147
159
 
148
160
  def windows_1_9
@@ -159,14 +171,17 @@ module Csscss
159
171
  end
160
172
 
161
173
  def load_sass_file(filename)
162
- if !gem_installed?("sass") then
163
- abort 'Must install the "sass" gem before parsing sass/scss files'
164
- end
174
+ abort 'Must install the "sass" gem before parsing sass/scss files' unless gem_installed?("sass")
165
175
 
166
176
  sass_options = {cache:false}
167
177
  sass_options[:load_paths] = Compass.configuration.sass_load_paths if @compass
168
178
  begin
169
- Sass::Engine.for_file(filename, sass_options).render
179
+ tree = Sass::Engine.for_file(filename, sass_options).to_tree
180
+ if @ignore_sass_mixins
181
+ require "csscss/sass_include_extensions"
182
+ Csscss::SassMixinVisitor.visit(tree)
183
+ end
184
+ tree.render
170
185
  rescue Sass::SyntaxError => e
171
186
  if e.message =~ /compass/ && !@compass
172
187
  puts "Enable --compass option to use compass's extensions"
@@ -178,10 +193,7 @@ module Csscss
178
193
  end
179
194
 
180
195
  def load_less_file(filename)
181
- if !gem_installed?("less") then
182
- abort 'Must install the "less" gem before parsing less files'
183
- end
184
-
196
+ abort 'Must install the "less" gem before parsing less files' unless gem_installed?("less")
185
197
  contents = load_css_file(filename)
186
198
  Less::Parser.new.parse(contents).to_css
187
199
  end
@@ -36,12 +36,30 @@ module Csscss
36
36
  space?
37
37
  }
38
38
 
39
+ rule(:mixin_attributes) {
40
+ (
41
+ str('/* CSSCSS START MIXIN') >>
42
+ (str('*/').absent? >> any).repeat >>
43
+ str('*/') >>
44
+ (str('/* CSSCSS END MIXIN').absent? >> any).repeat >>
45
+ str('/* CSSCSS END MIXIN') >>
46
+ (str('*/').absent? >> any).repeat >>
47
+ str('*/') >>
48
+ space?
49
+ ).as(:mixin)
50
+ }
51
+
39
52
  rule(:ruleset) {
40
53
  (
41
54
  match["^{}"].repeat(1).as(:selector) >>
42
55
  str("{") >>
43
56
  space? >>
44
- (comment | attribute | blank_attribute).repeat(0).as(:properties) >>
57
+ (
58
+ mixin_attributes |
59
+ comment |
60
+ attribute |
61
+ blank_attribute
62
+ ).repeat(0).as(:properties) >>
45
63
  str("}") >>
46
64
  space?
47
65
  ).as(:ruleset)
@@ -58,8 +76,22 @@ module Csscss
58
76
  ).as(:nested_ruleset)
59
77
  }
60
78
 
79
+ rule(:import) {
80
+ (
81
+ stri("@import") >>
82
+ match["^;"].repeat(1) >>
83
+ str(";") >>
84
+ space?
85
+ ).as(:import)
86
+ }
87
+
61
88
  rule(:blocks) {
62
- space? >> (comment | nested_ruleset | ruleset).repeat(1).as(:blocks) >> space?
89
+ space? >> (
90
+ comment |
91
+ import |
92
+ nested_ruleset |
93
+ ruleset
94
+ ).repeat(1).as(:blocks) >> space?
63
95
  }
64
96
 
65
97
  root(:blocks)
@@ -70,6 +102,9 @@ module Csscss
70
102
  rulesets
71
103
  }
72
104
 
105
+ rule(import: simple(:import)) { [] }
106
+ rule(mixin: simple(:mixin)) { nil }
107
+
73
108
  rule(comment: simple(:comment)) { nil }
74
109
 
75
110
  rule(ruleset: {
@@ -0,0 +1,19 @@
1
+ require "sass"
2
+
3
+ module Csscss
4
+ class SassMixinVisitor < Sass::Tree::Visitors::Base
5
+ def self.visit(root)
6
+ new.send(:visit, root)
7
+ end
8
+
9
+ def visit_mixindef(node)
10
+ begin_comment = Sass::Tree::CommentNode.new(["/* CSSCSS START MIXIN: #{node.name} */"], :normal)
11
+ end_comment = Sass::Tree::CommentNode.new(["/* CSSCSS END MIXIN: #{node.name} */"], :normal)
12
+
13
+ begin_comment.options = end_comment.options = {}
14
+
15
+ node.children.unshift(begin_comment)
16
+ node.children.push(end_comment)
17
+ end
18
+ end
19
+ end
@@ -1,3 +1,3 @@
1
1
  module Csscss
2
- VERSION = "1.2.0"
2
+ VERSION = "1.3.0"
3
3
  end
@@ -104,7 +104,7 @@ module Csscss::Parser
104
104
  ])
105
105
  end
106
106
 
107
- it "recognizes media queries" do
107
+ it "recognizes @media queries" do
108
108
  css = %$
109
109
  @media only screen {
110
110
  /* some comment */
@@ -129,12 +129,55 @@ module Csscss::Parser
129
129
  ])
130
130
  end
131
131
 
132
+ it "ignores @import statements" do
133
+ css = %$
134
+ @import "foo.css";
135
+ @import "bar.css";
136
+
137
+ /*
138
+ .x {
139
+ padding: 3px;
140
+ }
141
+ */
142
+
143
+ h1 {
144
+ outline: 1px;
145
+ }
146
+ $
147
+
148
+ trans(css).must_equal([
149
+ rs(sel("h1"), [dec("outline", "1px")])
150
+ ])
151
+ end
152
+
132
153
  it "ignores double semicolons" do
133
154
  trans("h1 { display:none;;}").must_equal([
134
155
  rs(sel("h1"), [dec("display", "none")])
135
156
  ])
136
157
  end
137
158
 
159
+ it "ignores mixin selectors" do
160
+ css = %$
161
+ h1 {
162
+ /* CSSCSS START MIXIN: foo */
163
+ font-family: serif;
164
+ font-size: 10px;
165
+ display: block;
166
+ /* CSSCSS END MIXIN: foo */
167
+
168
+ /* CSSCSS START MIXIN: bar */
169
+ outline: 1px;
170
+ /* CSSCSS END MIXIN: bar */
171
+
172
+ float: left;
173
+ }
174
+ $
175
+
176
+ trans(css).must_equal([
177
+ rs(sel("h1"), [dec("float", "left")])
178
+ ])
179
+ end
180
+
138
181
  it "parses attributes with encoded data that include semicolons" do
139
182
  trans(%$
140
183
  .foo1 {
@@ -0,0 +1,45 @@
1
+ require "test_helper"
2
+ require "csscss/sass_include_extensions"
3
+
4
+ module Csscss
5
+ describe "sass import extensions" do
6
+ it "should do something" do
7
+ scss =<<-SCSS
8
+ @mixin foo {
9
+ font: {
10
+ family: serif;
11
+ size: 10px;
12
+ }
13
+
14
+ display: block;
15
+ }
16
+
17
+ @mixin bar {
18
+ outline: 1px;
19
+ }
20
+
21
+ h1 {
22
+ @include foo;
23
+ @include bar;
24
+ }
25
+ SCSS
26
+
27
+
28
+ css =<<-CSS
29
+ h1 {
30
+ /* CSSCSS START MIXIN: foo */
31
+ font-family: serif;
32
+ font-size: 10px;
33
+ display: block;
34
+ /* CSSCSS END MIXIN: foo */
35
+ /* CSSCSS START MIXIN: bar */
36
+ outline: 1px;
37
+ /* CSSCSS END MIXIN: bar */ }
38
+ CSS
39
+
40
+ tree = Sass::Engine.new(scss, syntax: :scss).to_tree
41
+ Csscss::SassMixinVisitor.visit(tree)
42
+ tree.render.must_equal(css)
43
+ end
44
+ end
45
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: csscss
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.3.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-04-14 00:00:00.000000000 Z
12
+ date: 2013-04-20 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: parslet
@@ -85,6 +85,7 @@ files:
85
85
  - lib/csscss/parslet_optimizations.rb
86
86
  - lib/csscss/redundancy_analyzer.rb
87
87
  - lib/csscss/reporter.rb
88
+ - lib/csscss/sass_include_extensions.rb
88
89
  - lib/csscss/types.rb
89
90
  - lib/csscss/version.rb
90
91
  - test/csscss/json_reporter_test.rb
@@ -104,6 +105,7 @@ files:
104
105
  - test/csscss/parser/padding_test.rb
105
106
  - test/csscss/redundancy_analyzer_test.rb
106
107
  - test/csscss/reporter_test.rb
108
+ - test/csscss/sass_include_extensions_test.rb
107
109
  - test/csscss/types_test.rb
108
110
  - test/just_parse.rb
109
111
  - test/test_helper.rb
@@ -127,7 +129,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
127
129
  version: '0'
128
130
  segments:
129
131
  - 0
130
- hash: 4177886489285701178
132
+ hash: 2367732181301313903
131
133
  requirements: []
132
134
  rubyforge_project:
133
135
  rubygems_version: 1.8.25
@@ -152,6 +154,7 @@ test_files:
152
154
  - test/csscss/parser/padding_test.rb
153
155
  - test/csscss/redundancy_analyzer_test.rb
154
156
  - test/csscss/reporter_test.rb
157
+ - test/csscss/sass_include_extensions_test.rb
155
158
  - test/csscss/types_test.rb
156
159
  - test/just_parse.rb
157
160
  - test/test_helper.rb