see-less-ess-ess 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,6 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ - 1.9.2
5
+ - 1.8.7
6
+ script: bundle exec rspec
data/README.md CHANGED
@@ -1,6 +1,9 @@
1
1
  # See-less-ess-ess
2
2
 
3
- TODO: Write a gem description
3
+ [![Build Status](https://travis-ci.org/glenjamin/see-less-ess-ess.png)](https://travis-ci.org/glenjamin/see-less-ess-ess)
4
+
5
+ A compass extension that scans HTML files, makes a note of which tags and
6
+ classes are in use - and then removes anything else from the CSS file
4
7
 
5
8
  ## Installation
6
9
 
@@ -1,41 +1,53 @@
1
+ require 'set'
2
+
1
3
  require 'sass'
2
4
  require 'nokogiri'
3
5
 
4
6
  module SeeLessEssEss
5
- VERSION = '0.0.1'
7
+ VERSION = '0.0.2'
6
8
 
7
9
  class Extractor
8
- def initialize(location)
9
- @location = location
10
+ def initialize(glob)
11
+ @glob = glob
12
+ @extracted = false
10
13
  end
11
14
 
12
15
  def css_classes
13
- @css_classes ||= extract_css_classes!
16
+ extract_if_needed
17
+ @css_classes
18
+ end
19
+ def html_tags
20
+ extract_if_needed
21
+ @html_tags
14
22
  end
15
23
 
16
24
  protected
17
25
 
18
26
  def files
19
- Dir.glob("#{@location}/*.html")
27
+ Dir.glob(@glob)
20
28
  end
21
- def extract_css_classes!
22
- files.map do |file|
23
- collector = Collector.new()
29
+ def extract_if_needed
30
+ collector = Collector.new()
31
+ files.each do |file|
24
32
  parser = Nokogiri::HTML::SAX::Parser.new(collector)
25
- contents = open(file, 'rb').read
26
- parser.parse(contents)
27
- collector.css_classes
28
- end.flatten
33
+ parser.parse(open(file, 'rb').read)
34
+ end
35
+ @css_classes = collector.css_classes
36
+ @html_tags = collector.html_tags
29
37
  end
30
38
 
31
39
  class Collector < Nokogiri::XML::SAX::Document
32
40
  def css_classes
33
- @css_classes ||= []
41
+ @css_classes ||= Set.new
34
42
  end
35
- def start_element(name, attrs = [])
43
+ def html_tags
44
+ @html_tags ||= Set.new
45
+ end
46
+ def start_element(tag, attrs = [])
47
+ html_tags << tag
36
48
  attrs.each do |name, value|
37
49
  if name == "class"
38
- css_classes << value.split
50
+ css_classes.merge(value.split)
39
51
  end
40
52
  end
41
53
  end
@@ -61,13 +73,18 @@ module SeeLessEssEss
61
73
  def unused(simple)
62
74
  if simple.is_a?(Sass::Selector::Class)
63
75
  !css_classes_whitelist.include?(simple.name[0].to_s)
76
+ elsif simple.is_a?(Sass::Selector::Element)
77
+ !html_tags_whitelist.include?(simple.name[0].to_s)
64
78
  else
65
79
  false
66
80
  end
67
81
  end
68
82
 
69
83
  def css_classes_whitelist
70
- @whitelist ||= @extractor.css_classes + @used_classes
84
+ @class_whitelist ||= @extractor.css_classes + @used_classes
85
+ end
86
+ def html_tags_whitelist
87
+ @tag_whitelist ||= @extractor.html_tags
71
88
  end
72
89
  end
73
90
 
@@ -126,9 +143,9 @@ module SeeLessEssEss
126
143
  @@initialised = true
127
144
 
128
145
  Compass::Configuration.add_configuration_property(
129
- :templates_location, "Directory to scan for template files") do
146
+ :templates_glob, "Glob to scan for template files") do
130
147
 
131
- project_path
148
+ "#{project_path}/**/*.html"
132
149
  end
133
150
  Compass::Configuration.add_configuration_property(
134
151
  :used_css_classes, "CSS classes to explicity declare as 'used'") do
@@ -140,7 +157,7 @@ module SeeLessEssEss
140
157
  alias_method :_slss_to_tree, :_to_tree
141
158
  def _to_tree
142
159
  conf = Compass.configuration
143
- extractor = SeeLessEssEss::Extractor.new(conf.templates_location)
160
+ extractor = SeeLessEssEss::Extractor.new(conf.templates_glob)
144
161
  checker = SeeLessEssEss::Checker.new(extractor, conf.used_css_classes)
145
162
 
146
163
  tree = _slss_to_tree
@@ -1,8 +1,10 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
 
3
+ require File.expand_path('../lib/see-less-ess-ess', __FILE__)
4
+
3
5
  Gem::Specification.new do |gem|
4
6
  gem.name = "see-less-ess-ess"
5
- gem.version = '0.0.1'
7
+ gem.version = SeeLessEssEss::VERSION
6
8
  gem.authors = ["Glen Mailer"]
7
9
  gem.email = ["glenjamin@gmail.com"]
8
10
  gem.description = %q{Remove unused CSS rules from a compass project by scanning template files}
@@ -5,8 +5,10 @@ module SeeLessEssEss
5
5
  let(:extractor) do
6
6
  mock("Extractor").tap do |m|
7
7
  m.stub!(:css_classes).and_return(parsed_css_classes)
8
+ m.stub!(:html_tags).and_return(parsed_html_tags)
8
9
  end
9
10
  end
11
+ let(:parsed_html_tags) { %w(html head title body h1 p td) }
10
12
  let(:parsed_css_classes) { %w(row columns one two top-bar) }
11
13
  let(:used_css_classes) { %w(zebra) }
12
14
 
@@ -48,6 +50,16 @@ module SeeLessEssEss
48
50
  sequence(simple_sequence(className('class')))
49
51
  ).should be_true
50
52
  end
53
+ it "should reject ul" do
54
+ subject.does_not_use(
55
+ sequence(simple_sequence(tag('ul')))
56
+ ).should be_true
57
+ end
58
+ it "should reject ul.row" do
59
+ subject.does_not_use(
60
+ sequence(simple_sequence(tag('ul'),className('class')))
61
+ ).should be_true
62
+ end
51
63
  it "should reject .row .class" do
52
64
  subject.does_not_use(
53
65
  sequence(
@@ -3,12 +3,18 @@ require File.expand_path('../../lib/see-less-ess-ess.rb', __FILE__)
3
3
  module SeeLessEssEss
4
4
  describe "Extractor" do
5
5
 
6
- let(:subject) { Extractor.new(location) }
7
- let(:location) { File.expand_path('../fixtures', __FILE__) }
6
+ let(:subject) { Extractor.new(glob) }
7
+ let(:glob) { "#{File.expand_path('../fixtures', __FILE__)}/**/*.html" }
8
8
 
9
9
  it "should read all css classes from html files in location" do
10
+ subject.should have(6).css_classes
10
11
  subject.css_classes.should include(*%w(body1 body2 title main left lead))
11
12
  end
12
13
 
14
+ it "should read all tags from html files in location" do
15
+ subject.should have(6).html_tags
16
+ subject.html_tags.should include(*%w(html head title body h1 p))
17
+ end
18
+
13
19
  end
14
20
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: see-less-ess-ess
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
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: 2012-12-20 00:00:00.000000000 Z
12
+ date: 2012-12-21 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: sass
@@ -68,6 +68,7 @@ extra_rdoc_files: []
68
68
  files:
69
69
  - .gitignore
70
70
  - .rspec
71
+ - .travis.yml
71
72
  - Gemfile
72
73
  - LICENSE.txt
73
74
  - README.md