csscss 1.0.0 → 1.1.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/CHANGELOG.md +15 -0
- data/CONTRIBUTORS.md +4 -0
- data/Gemfile.lock +1 -1
- data/README.md +3 -0
- data/csscss.gemspec +3 -1
- data/lib/csscss/cli.rb +54 -36
- data/lib/csscss/parser/common.rb +6 -1
- data/lib/csscss/redundancy_analyzer.rb +2 -1
- data/lib/csscss/version.rb +1 -1
- data/test/csscss/parser/common_test.rb +10 -0
- data/test/csscss/redundancy_analyzer_test.rb +10 -1
- metadata +6 -8
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,18 @@
|
|
1
|
+
## 1.1.0 - 4/12/2013 ##
|
2
|
+
|
3
|
+
* Fixes bug where CLI --no-color wasn't respected
|
4
|
+
* Added ruby version requirement for >= 1.9
|
5
|
+
* Added CONTRIBUTORS.md
|
6
|
+
* Fixes bugs with urls that have dashes in them
|
7
|
+
* Fixes bugs with urls containing encoded data (usually images)
|
8
|
+
* Deprecates CSSCSS_DEBUG in favor of --show-parser-errors
|
9
|
+
* Fixes line/column output during parser errors
|
10
|
+
* --compass now grabs config.rb by default if it exists
|
11
|
+
* Adds --compass-with-config that lets users specify a config
|
12
|
+
* Fixes parser error bug when trying to parse blank files
|
13
|
+
* Fixes bug where rules from multiple files aren't consolidated
|
14
|
+
* Adds --no-match-shorthand to allow users to opt out of shorthand matching
|
15
|
+
|
1
16
|
## 1.0.0 - 4/7/2013 ##
|
2
17
|
|
3
18
|
* Allows the user to specify ignored properties and selectors
|
data/CONTRIBUTORS.md
ADDED
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
[](https://travis-ci.org/zmoazeni/csscss)
|
2
|
+
[](https://codeclimate.com/github/zmoazeni/csscss)
|
2
3
|
|
3
4
|
## What is it? ##
|
4
5
|
|
@@ -20,6 +21,8 @@ First you need to install it. It is currently packaged as a ruby gem:
|
|
20
21
|
|
21
22
|
$ gem install csscss
|
22
23
|
|
24
|
+
Note: csscss only works on ruby 1.9.x and up. It will have trouble with ruby 1.8.x.
|
25
|
+
|
23
26
|
Then you can run it in at the command line against CSS files.
|
24
27
|
|
25
28
|
$ csscss path/to/styles.css path/to/other-styles.css
|
data/csscss.gemspec
CHANGED
@@ -10,13 +10,15 @@ Gem::Specification.new do |gem|
|
|
10
10
|
gem.email = ["zach.moazeni@gmail.com"]
|
11
11
|
gem.summary = %q{A CSS redundancy analyzer that analyzes redundancy.}
|
12
12
|
gem.description = %q{csscss will parse any CSS files you give it and let you know which rulesets have duplicated declarations.}
|
13
|
-
gem.homepage = "http://zmoazeni.github.
|
13
|
+
gem.homepage = "http://zmoazeni.github.io/csscss/"
|
14
14
|
|
15
15
|
gem.files = `git ls-files`.split($/)
|
16
16
|
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
17
17
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
18
18
|
gem.require_paths = ["lib"]
|
19
19
|
|
20
|
+
gem.required_ruby_version = ">= 1.9"
|
21
|
+
|
20
22
|
gem.add_dependency "parslet", "~> 1.5"
|
21
23
|
gem.add_dependency "colorize"
|
22
24
|
end
|
data/lib/csscss/cli.rb
CHANGED
@@ -8,6 +8,7 @@ module Csscss
|
|
8
8
|
@compass = false
|
9
9
|
@ignored_properties = []
|
10
10
|
@ignored_selectors = []
|
11
|
+
@match_shorthand = true
|
11
12
|
end
|
12
13
|
|
13
14
|
def run
|
@@ -16,14 +17,14 @@ module Csscss
|
|
16
17
|
end
|
17
18
|
|
18
19
|
def execute
|
20
|
+
warn_old_debug_flag if ENV["CSSCSS_DEBUG"]
|
19
21
|
|
20
|
-
|
21
|
-
|
22
|
+
all_contents = @argv.map do |filename|
|
23
|
+
if %w(.scss .sass).include?(File.extname(filename).downcase) && !(filename =~ URI.regexp)
|
22
24
|
begin
|
23
25
|
require "sass"
|
24
26
|
rescue LoadError
|
25
|
-
|
26
|
-
exit 1
|
27
|
+
abort "Must install sass gem before parsing sass/scss files"
|
27
28
|
end
|
28
29
|
|
29
30
|
sass_options = {cache:false}
|
@@ -41,36 +42,31 @@ module Csscss
|
|
41
42
|
else
|
42
43
|
open(filename) {|f| f.read }
|
43
44
|
end
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
45
|
+
end.join("\n")
|
46
|
+
|
47
|
+
unless all_contents.strip.empty?
|
48
|
+
redundancies = RedundancyAnalyzer.new(all_contents).redundancies(
|
49
|
+
minimum: @minimum,
|
50
|
+
ignored_properties: @ignored_properties,
|
51
|
+
ignored_selectors: @ignored_selectors,
|
52
|
+
match_shorthand: @match_shorthand
|
53
|
+
)
|
54
|
+
|
55
|
+
if @json
|
56
|
+
puts JSONReporter.new(redundancies).report
|
53
57
|
else
|
54
|
-
|
55
|
-
|
56
|
-
end
|
58
|
+
report = Reporter.new(redundancies).report(verbose:@verbose, color:@color)
|
59
|
+
puts report unless report.empty?
|
57
60
|
end
|
58
61
|
end
|
59
62
|
|
60
|
-
if @json
|
61
|
-
puts JSONReporter.new(combined_redundancies).report
|
62
|
-
else
|
63
|
-
report = Reporter.new(combined_redundancies).report(verbose:@verbose, color:true)
|
64
|
-
puts report unless report.empty?
|
65
|
-
end
|
66
|
-
|
67
63
|
rescue Parslet::ParseFailed => e
|
68
|
-
line, column = e.cause.source.line_and_column
|
64
|
+
line, column = e.cause.source.line_and_column(e.cause.pos)
|
69
65
|
puts "Had a problem parsing the css at line: #{line}, column: #{column}".red
|
70
|
-
if ENV['CSSCSS_DEBUG'] == 'true'
|
66
|
+
if @show_parser_errors || ENV['CSSCSS_DEBUG'] == 'true'
|
71
67
|
puts e.cause.ascii_tree.red
|
72
68
|
else
|
73
|
-
puts "Run with
|
69
|
+
puts "Run with --show-parser-errors for verbose parser errors".red
|
74
70
|
end
|
75
71
|
exit 1
|
76
72
|
end
|
@@ -84,7 +80,7 @@ module Csscss
|
|
84
80
|
@verbose = v
|
85
81
|
end
|
86
82
|
|
87
|
-
opts.on("--[no-]color", "
|
83
|
+
opts.on("--[no-]color", "Colorize output (default is true)") do |c|
|
88
84
|
@color = c
|
89
85
|
end
|
90
86
|
|
@@ -105,21 +101,27 @@ module Csscss
|
|
105
101
|
exit
|
106
102
|
end
|
107
103
|
|
108
|
-
opts.on("--[no-]compass", "
|
109
|
-
if @compass = compass
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
104
|
+
opts.on("--[no-]compass", "Enable compass extensions when parsing sass/scss (default is false)") do |compass|
|
105
|
+
enable_compass if @compass = compass
|
106
|
+
end
|
107
|
+
|
108
|
+
opts.on("--compass-with-config config", "Enable compass extensions when parsing sass/scss and pass config file") do |config|
|
109
|
+
@compass = true
|
110
|
+
enable_compass(config)
|
111
|
+
end
|
112
|
+
|
113
|
+
opts.on("--[no-]match-shorthand", "Expands shorthand rules and matches on explicit rules (default is true)") do |match_shorthand|
|
114
|
+
@match_shorthand = match_shorthand
|
117
115
|
end
|
118
116
|
|
119
117
|
opts.on("-j", "--[no-]json", "Output results in JSON") do |j|
|
120
118
|
@json = j
|
121
119
|
end
|
122
120
|
|
121
|
+
opts.on("--show-parser-errors", "Print verbose parser errors") do |show_parser_errors|
|
122
|
+
@show_parser_errors = show_parser_errors
|
123
|
+
end
|
124
|
+
|
123
125
|
opts.on_tail("-h", "--help", "Show this message") do
|
124
126
|
print_help(opts)
|
125
127
|
end
|
@@ -137,6 +139,22 @@ module Csscss
|
|
137
139
|
exit
|
138
140
|
end
|
139
141
|
|
142
|
+
def warn_old_debug_flag
|
143
|
+
$stderr.puts "CSSCSS_DEBUG is now deprecated. Use --show-parser-errors instead".red
|
144
|
+
end
|
145
|
+
|
146
|
+
def enable_compass(config = nil)
|
147
|
+
require "compass"
|
148
|
+
|
149
|
+
if config
|
150
|
+
Compass.add_configuration(config)
|
151
|
+
else
|
152
|
+
Compass.add_configuration("config.rb") if File.exist?("config.rb")
|
153
|
+
end
|
154
|
+
rescue LoadError
|
155
|
+
abort "Must install compass gem before enabling its extensions"
|
156
|
+
end
|
157
|
+
|
140
158
|
class << self
|
141
159
|
def run(argv)
|
142
160
|
new(argv).run
|
data/lib/csscss/parser/common.rb
CHANGED
@@ -18,12 +18,17 @@ module Csscss
|
|
18
18
|
rule(:nada) { any.repeat.as(:nada) }
|
19
19
|
|
20
20
|
rule(:http) {
|
21
|
-
(match['a-zA-
|
21
|
+
(match['a-zA-Z0-9.:/\-'] | str('\(') | str('\)')).repeat >> space?
|
22
|
+
}
|
23
|
+
|
24
|
+
rule(:data) {
|
25
|
+
stri("data:") >> match['a-zA-Z0-9.:/+;,=\-'].repeat >> space?
|
22
26
|
}
|
23
27
|
|
24
28
|
rule(:url) {
|
25
29
|
stri("url") >> parens do
|
26
30
|
(any_quoted { http } >> space?) |
|
31
|
+
(any_quoted { data } >> space?) |
|
27
32
|
http
|
28
33
|
end
|
29
34
|
}
|
@@ -9,6 +9,7 @@ module Csscss
|
|
9
9
|
minimum = opts[:minimum]
|
10
10
|
ignored_properties = opts[:ignored_properties] || []
|
11
11
|
ignored_selectors = opts[:ignored_selectors] || []
|
12
|
+
match_shorthand = opts.fetch(:match_shorthand, true)
|
12
13
|
|
13
14
|
rule_sets = Parser::Css.parse(@raw_css)
|
14
15
|
matches = {}
|
@@ -20,7 +21,7 @@ module Csscss
|
|
20
21
|
rule_set.declarations.each do |dec|
|
21
22
|
next if ignored_properties.include?(dec.property)
|
22
23
|
|
23
|
-
if parser = shorthand_parser(dec.property)
|
24
|
+
if match_shorthand && parser = shorthand_parser(dec.property)
|
24
25
|
if new_decs = parser.parse(dec.property, dec.value)
|
25
26
|
if dec.property == "border"
|
26
27
|
%w(border-top border-right border-bottom border-left).each do |property|
|
data/lib/csscss/version.rb
CHANGED
@@ -115,6 +115,15 @@ module Csscss::Parser
|
|
115
115
|
@parser.http.must_parse 'foo\(bar\).jpg'
|
116
116
|
@parser.http.must_parse 'http://foo\(bar\).jpg'
|
117
117
|
@parser.http.must_parse 'http://foo.com/baz/\(bar\).jpg'
|
118
|
+
@parser.http.must_parse '//foo.com/foo.jpg'
|
119
|
+
@parser.http.must_parse 'https://foo.com/foo.jpg'
|
120
|
+
@parser.http.must_parse 'http://foo100.com/foo.jpg'
|
121
|
+
@parser.http.must_parse 'http://foo-bar.com/foo.jpg'
|
122
|
+
end
|
123
|
+
|
124
|
+
it "parses data" do
|
125
|
+
@parser.data.must_parse 'data:image/jpg;base64,IMGDATAGOESHERE=='
|
126
|
+
@parser.data.must_parse 'data:image/svg+xml;base64,IMGDATAGOESHERE4/5/h/1+=='
|
118
127
|
end
|
119
128
|
|
120
129
|
it "parses urls" do
|
@@ -124,6 +133,7 @@ module Csscss::Parser
|
|
124
133
|
@parser.url.must_parse "url('foo.jpg')"
|
125
134
|
@parser.url.must_parse "url('foo.jpg' )"
|
126
135
|
@parser.url.must_parse 'url(foo\(bar\).jpg)'
|
136
|
+
@parser.url.must_parse "url('data:image/svg+xml;base64,IMGDATAGOESHERE4/5/h/1+==')"
|
127
137
|
end
|
128
138
|
end
|
129
139
|
end
|
@@ -68,7 +68,7 @@ module Csscss
|
|
68
68
|
.baz {
|
69
69
|
margin: 3px 3px 30px 3px;
|
70
70
|
padding: 10px 30px;
|
71
|
-
background:
|
71
|
+
background: blue url(images/bg-bolt-inactive.png) no-repeat 99% 5px;
|
72
72
|
|
73
73
|
-webkit-border-radius: 4px;
|
74
74
|
-moz-border-radius: 4px;
|
@@ -184,6 +184,15 @@ module Csscss
|
|
184
184
|
})
|
185
185
|
end
|
186
186
|
|
187
|
+
it "doesn't match shorthand when explicitly turned off" do
|
188
|
+
css = %$
|
189
|
+
.foo { background-color: #fff }
|
190
|
+
.bar { background: #fff }
|
191
|
+
$
|
192
|
+
|
193
|
+
RedundancyAnalyzer.new(css).redundancies(match_shorthand:false).must_equal({})
|
194
|
+
end
|
195
|
+
|
187
196
|
it "3-way case consolidation" do
|
188
197
|
css = %$
|
189
198
|
.bar { background: #fff }
|
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.
|
4
|
+
version: 1.1.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-
|
12
|
+
date: 2013-04-12 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: parslet
|
@@ -55,6 +55,7 @@ files:
|
|
55
55
|
- .gitignore
|
56
56
|
- .travis.yml
|
57
57
|
- CHANGELOG.md
|
58
|
+
- CONTRIBUTORS.md
|
58
59
|
- Gemfile
|
59
60
|
- Gemfile.lock
|
60
61
|
- LICENSE.txt
|
@@ -106,7 +107,7 @@ files:
|
|
106
107
|
- test/csscss/types_test.rb
|
107
108
|
- test/just_parse.rb
|
108
109
|
- test/test_helper.rb
|
109
|
-
homepage: http://zmoazeni.github.
|
110
|
+
homepage: http://zmoazeni.github.io/csscss/
|
110
111
|
licenses: []
|
111
112
|
post_install_message:
|
112
113
|
rdoc_options: []
|
@@ -117,10 +118,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
117
118
|
requirements:
|
118
119
|
- - ! '>='
|
119
120
|
- !ruby/object:Gem::Version
|
120
|
-
version: '
|
121
|
-
segments:
|
122
|
-
- 0
|
123
|
-
hash: 2330083466520748341
|
121
|
+
version: '1.9'
|
124
122
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
125
123
|
none: false
|
126
124
|
requirements:
|
@@ -129,7 +127,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
129
127
|
version: '0'
|
130
128
|
segments:
|
131
129
|
- 0
|
132
|
-
hash:
|
130
|
+
hash: -506187209623006521
|
133
131
|
requirements: []
|
134
132
|
rubyforge_project:
|
135
133
|
rubygems_version: 1.8.25
|