style_stats 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +31 -0
- data/exe/style_stats +2 -0
- data/lib/style_stats.rb +13 -9
- data/lib/style_stats/cli.rb +18 -2
- data/lib/style_stats/configuration.rb +43 -0
- data/lib/style_stats/css.rb +13 -4
- data/lib/style_stats/css/analyze.rb +170 -36
- data/lib/style_stats/css/fetch.rb +8 -5
- data/lib/style_stats/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b9e2bb1732c0e4cdc94c37b106056de61bb4ba31
|
4
|
+
data.tar.gz: f48c01ac18fe8dd45dddce5484a196efd0908c9f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0d22610c40f6a56429988720e4799dac8b7dbff11bdb2003a4e8ff1c74b4d7c1a3ac9f20caaf9a42de392f2b6bd91c9f1a03f3bdf858ab0e1a484220905082c6
|
7
|
+
data.tar.gz: 628ce17c2809742c77557c706ec86a8bd120de9aa14a0b6ee5eb02ea847e4700b7a0425a7853eb70461f13017b410cab2747c02c2c9f2f03f6cff970a9df8fd1
|
data/README.md
CHANGED
@@ -131,6 +131,37 @@ $ style_stats http://example.com/
|
|
131
131
|
$ style_stats foo.css -f <json|html|md>
|
132
132
|
```
|
133
133
|
|
134
|
+
:## CLI Reference
|
135
|
+
|
136
|
+
Help:
|
137
|
+
|
138
|
+
```shell
|
139
|
+
$ style_stats --help
|
140
|
+
Usage: style_stats [options] <file ...>
|
141
|
+
-h, --help output usage information
|
142
|
+
-V, --version output the version number
|
143
|
+
-c, --config <path> set configurations
|
144
|
+
-f, --format <format> set the output format <json|html|md>
|
145
|
+
-m, --mobile [name] set the mobile user agent
|
146
|
+
--user-anget <string> set the user agent</string></format></path>
|
147
|
+
```
|
148
|
+
|
149
|
+
Example:
|
150
|
+
|
151
|
+
```shell
|
152
|
+
$ style_stats path/to/stylesheet.css -c style_stats.yml
|
153
|
+
┌────────────────────────────┬────────┐
|
154
|
+
│ Style Sheets │ 1 │
|
155
|
+
├────────────────────────────┼────────┤
|
156
|
+
│ Size │ 19.0KB │
|
157
|
+
├────────────────────────────┼────────┤
|
158
|
+
│ Gzipped Size │ 3.7KB │
|
159
|
+
├────────────────────────────┼────────┤
|
160
|
+
│ Total Unique Font Families │ 3 │
|
161
|
+
└────────────────────────────┴────────┘
|
162
|
+
```
|
163
|
+
|
164
|
+
|
134
165
|
## Development
|
135
166
|
|
136
167
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake rspec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment. Run `bundle exec style_stats` to use the gem in this directory, ignoring other installed copies of this gem.
|
data/exe/style_stats
CHANGED
@@ -17,6 +17,8 @@ opt.on('-V', '--version', 'output the version number') do |v|
|
|
17
17
|
exit
|
18
18
|
end
|
19
19
|
|
20
|
+
|
21
|
+
opt.on('-c', '--config <path>', 'set configurations') { |v| options[:config] = v }
|
20
22
|
opt.on('-f', '--format <format>', 'set the output format <json|html|md>') { |v| options[:format] = v }
|
21
23
|
opt.on('-m', '--mobile [name]', 'set the mobile user agent') { |v| options[:user_agent] = v || 'ios' }
|
22
24
|
opt.on('--user-anget <string>', 'set the user agent') { |v| options[:user_agent] = v }
|
data/lib/style_stats.rb
CHANGED
@@ -4,8 +4,17 @@ require 'open-uri'
|
|
4
4
|
require 'css_parser'
|
5
5
|
require 'json'
|
6
6
|
require 'command_line_reporter'
|
7
|
+
require 'yaml'
|
7
8
|
|
8
9
|
class StyleStats
|
10
|
+
def self.configure(&block)
|
11
|
+
yield(configuration)
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.configuration
|
15
|
+
@_configuration ||= StyleStats::Configuration.new
|
16
|
+
end
|
17
|
+
|
9
18
|
def initialize(paths, options = {})
|
10
19
|
paths = [paths] unless paths.is_a?(Array)
|
11
20
|
|
@@ -16,22 +25,16 @@ class StyleStats
|
|
16
25
|
end.flatten
|
17
26
|
|
18
27
|
@css = files.inject(Css.new) do |css, file|
|
19
|
-
css.merge!(Css.new(file
|
28
|
+
css.merge!(Css.new(file))
|
20
29
|
end
|
21
30
|
end
|
22
31
|
|
23
32
|
def render
|
24
|
-
Template.new(@css,
|
33
|
+
Template.new(@css, options).render
|
25
34
|
end
|
26
35
|
|
27
36
|
private
|
28
|
-
def
|
29
|
-
{
|
30
|
-
user_agent: @options[:user_agent]
|
31
|
-
}
|
32
|
-
end
|
33
|
-
|
34
|
-
def template_options
|
37
|
+
def options
|
35
38
|
{
|
36
39
|
format: @options[:format]
|
37
40
|
}
|
@@ -39,6 +42,7 @@ class StyleStats
|
|
39
42
|
end
|
40
43
|
|
41
44
|
require 'style_stats/version'
|
45
|
+
require 'style_stats/configuration'
|
42
46
|
require 'style_stats/path_parser'
|
43
47
|
require 'style_stats/css'
|
44
48
|
require 'style_stats/template'
|
data/lib/style_stats/cli.rb
CHANGED
@@ -3,6 +3,11 @@ class StyleStats
|
|
3
3
|
class << self
|
4
4
|
def run(files, option)
|
5
5
|
@options = option
|
6
|
+
StyleStats.configure do |config|
|
7
|
+
config.options[:requestOptions][:headers]['User-Agent'] = user_agent
|
8
|
+
config.options.merge!(configuration)
|
9
|
+
end
|
10
|
+
|
6
11
|
stylestats = StyleStats.new(files, options)
|
7
12
|
stylestats.render
|
8
13
|
rescue StyleStats::RequestError
|
@@ -16,8 +21,7 @@ class StyleStats
|
|
16
21
|
private
|
17
22
|
def options
|
18
23
|
{
|
19
|
-
format: @options[:format]
|
20
|
-
user_agent: user_agent
|
24
|
+
format: @options[:format]
|
21
25
|
}
|
22
26
|
end
|
23
27
|
|
@@ -31,6 +35,18 @@ class StyleStats
|
|
31
35
|
@options[:user_agent]
|
32
36
|
end
|
33
37
|
end
|
38
|
+
|
39
|
+
def configuration
|
40
|
+
config = case File.extname(@options[:config].to_s)
|
41
|
+
when '.yml', '.yaml'
|
42
|
+
YAML.load_file(@options[:config])
|
43
|
+
when '.json'
|
44
|
+
json = File.read(@options[:config])
|
45
|
+
JSON.parse(json)
|
46
|
+
else
|
47
|
+
{}
|
48
|
+
end
|
49
|
+
end
|
34
50
|
end
|
35
51
|
end
|
36
52
|
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
class StyleStats
|
2
|
+
class Configuration
|
3
|
+
def options
|
4
|
+
@options ||= {
|
5
|
+
published: true,
|
6
|
+
stylesheets: true,
|
7
|
+
paths: true,
|
8
|
+
stylesheets: true,
|
9
|
+
styleElements: true,
|
10
|
+
size: true,
|
11
|
+
dataUriSize: true,
|
12
|
+
ratioOfDataUriSize: true,
|
13
|
+
gzippedSize: true,
|
14
|
+
rules: true,
|
15
|
+
selectors: true,
|
16
|
+
declarations: true,
|
17
|
+
simplicity: true,
|
18
|
+
averageOfIdentifier: true,
|
19
|
+
mostIdentifier: true,
|
20
|
+
mostIdentifierSelector: true,
|
21
|
+
averageOfCohesion: true,
|
22
|
+
lowestCohesion: true,
|
23
|
+
lowestCohesionSelector: true,
|
24
|
+
totalUniqueFontSizes: true,
|
25
|
+
uniqueFontSizes: true,
|
26
|
+
totalUniqueFontFamilies: true,
|
27
|
+
uniqueFontFamilies: true,
|
28
|
+
totalUniqueColors: true,
|
29
|
+
uniqueColors: true,
|
30
|
+
idSelectors: true,
|
31
|
+
universalSelectors: true,
|
32
|
+
unqualifiedAttributeSelectors: true,
|
33
|
+
javascriptSpecificSelectors: "[#\\.]js\\-",
|
34
|
+
userSpecifiedSelectors: false,
|
35
|
+
importantKeywords: true,
|
36
|
+
floatProperties: true,
|
37
|
+
propertiesCount: 10,
|
38
|
+
mediaQueries: true,
|
39
|
+
requestOptions: { headers: {} }
|
40
|
+
}
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
data/lib/style_stats/css.rb
CHANGED
@@ -8,7 +8,7 @@ class StyleStats
|
|
8
8
|
class Css
|
9
9
|
attr_accessor :path, :paths, :rules, :media_types, :selectors, :stylesheets, :elements
|
10
10
|
|
11
|
-
def initialize(path = nil
|
11
|
+
def initialize(path = nil)
|
12
12
|
self.path = path
|
13
13
|
self.paths = path ? [path] : []
|
14
14
|
self.rules = []
|
@@ -17,7 +17,6 @@ class StyleStats
|
|
17
17
|
self.stylesheets = []
|
18
18
|
self.elements = []
|
19
19
|
|
20
|
-
@options = options
|
21
20
|
parse if path
|
22
21
|
end
|
23
22
|
|
@@ -61,7 +60,17 @@ class StyleStats
|
|
61
60
|
when :unqualified
|
62
61
|
selectors.count { |selector| selector.name.match(/\[.+\]$/) }
|
63
62
|
when :js
|
64
|
-
|
63
|
+
if StyleStats.configuration.options[:javascriptSpecificSelectors]
|
64
|
+
selectors.count { |selector| selector.name.match(/#{StyleStats.configuration.options[:javascriptSpecificSelectors]}/) }
|
65
|
+
else
|
66
|
+
0
|
67
|
+
end
|
68
|
+
when :user
|
69
|
+
if StyleStats.configuration.options[:userSpecifiedSelectors]
|
70
|
+
selectors.count { |selector| selector.name.match(/#{StyleStats.configuration.options[:userSpecifiedSelectors]}/) }
|
71
|
+
else
|
72
|
+
0
|
73
|
+
end
|
65
74
|
else
|
66
75
|
selectors.count
|
67
76
|
end
|
@@ -96,7 +105,7 @@ class StyleStats
|
|
96
105
|
|
97
106
|
private
|
98
107
|
def parse
|
99
|
-
fetch = Fetch.new(self.path
|
108
|
+
fetch = Fetch.new(self.path)
|
100
109
|
|
101
110
|
self.stylesheets = fetch.stylesheets
|
102
111
|
self.elements = fetch.elements
|
@@ -1,42 +1,176 @@
|
|
1
1
|
class StyleStats
|
2
2
|
class Css
|
3
3
|
def analyze
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
4
|
+
@result = {}
|
5
|
+
@selector = sort_selector_by_declarations_count.first
|
6
|
+
@most_indentifier_selector = selectors.first || StyleStats::Css::Selector.new("")
|
7
|
+
analyze_published
|
8
|
+
analyze_paths
|
9
|
+
analyze_stylesheets
|
10
|
+
analyze_style_elements
|
11
|
+
analyze_size
|
12
|
+
analyze_data_uri_size
|
13
|
+
analyze_ratio_of_data_uri_size
|
14
|
+
analyze_gzipped_size
|
15
|
+
analyze_rules
|
16
|
+
analyze_selectors
|
17
|
+
analyze_declarations
|
18
|
+
analyze_simplicity
|
19
|
+
analyze_average_of_identifier
|
20
|
+
analyze_most_identifier
|
21
|
+
analyze_most_identifier_selector
|
22
|
+
analyze_average_of_cohesion
|
23
|
+
analyze_lowest_cohesion
|
24
|
+
analyze_lowest_cohesion_selector
|
25
|
+
analyze_total_unique_font_sizes
|
26
|
+
analyze_unique_font_sizes
|
27
|
+
analyze_total_unique_font_families
|
28
|
+
analyze_unique_font_families
|
29
|
+
analyze_total_unique_colors
|
30
|
+
analyze_unique_colors
|
31
|
+
analyze_id_selectors
|
32
|
+
analyze_universal_selectors
|
33
|
+
analyze_unqualified_attribute_selectors
|
34
|
+
analyze_javascript_specific_selectors
|
35
|
+
analyze_user_specific_selectors
|
36
|
+
analyze_important_keywords
|
37
|
+
analyze_fload_properties
|
38
|
+
analyze_properties_count
|
39
|
+
analyze_media_queries
|
40
|
+
@result
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
def analyze_published
|
45
|
+
@result["Published"] = Time.now if StyleStats.configuration.options[:published]
|
46
|
+
end
|
47
|
+
|
48
|
+
def analyze_paths
|
49
|
+
@result["Paths"] = paths if StyleStats.configuration.options[:paths]
|
50
|
+
end
|
51
|
+
|
52
|
+
def analyze_stylesheets
|
53
|
+
@result["Style Sheets"] = stylesheets.count if StyleStats.configuration.options[:stylesheets]
|
54
|
+
end
|
55
|
+
|
56
|
+
def analyze_style_elements
|
57
|
+
@result["Style Elements"] = elements.count if StyleStats.configuration.options[:styleElements]
|
58
|
+
end
|
59
|
+
|
60
|
+
def analyze_size
|
61
|
+
@result["Size"] = size if StyleStats.configuration.options[:size]
|
62
|
+
end
|
63
|
+
|
64
|
+
def analyze_data_uri_size
|
65
|
+
@result["Data URI Size"] = data_uri_size if StyleStats.configuration.options[:dataUriSize]
|
66
|
+
end
|
67
|
+
|
68
|
+
def analyze_ratio_of_data_uri_size
|
69
|
+
@result["Ratio of Data URI Size"] = "#{data_uri_size.fdiv(size).round(1) * 100}%" if StyleStats.configuration.options[:ratioOfDataUriSize]
|
70
|
+
end
|
71
|
+
|
72
|
+
def analyze_gzipped_size
|
73
|
+
@result["Gzipped Size"] = gzipped_size if StyleStats.configuration.options[:gzippedSize]
|
74
|
+
end
|
75
|
+
|
76
|
+
def analyze_rules
|
77
|
+
@result["Rules"] = rules.count if StyleStats.configuration.options[:rules]
|
78
|
+
end
|
79
|
+
|
80
|
+
def analyze_selectors
|
81
|
+
@result["Selectors"] = selectors.count if StyleStats.configuration.options[:selectors]
|
82
|
+
end
|
83
|
+
|
84
|
+
def analyze_declarations
|
85
|
+
@result["Declarations"] = declarations.count if StyleStats.configuration.options[:declarations]
|
86
|
+
end
|
87
|
+
|
88
|
+
def analyze_simplicity
|
89
|
+
@result["Simplicity"] = "#{rules.count.fdiv(selectors.count).round(1) * 100}%" if StyleStats.configuration.options[:simplicity]
|
90
|
+
end
|
91
|
+
|
92
|
+
def analyze_average_of_identifier
|
93
|
+
@result["Average of Identifier"] = selectors.map(&:identifier_count).inject(0, :+).fdiv(selectors.count).round(3) if StyleStats.configuration.options[:averageOfIdentifier]
|
94
|
+
end
|
95
|
+
|
96
|
+
def analyze_most_identifier
|
97
|
+
@result["Most Identifier"] = @most_indentifier_selector.identifier_count if StyleStats.configuration.options[:mostIdentifier]
|
98
|
+
end
|
99
|
+
|
100
|
+
def analyze_most_identifier_selector
|
101
|
+
@result["Most Identifier Selector"] = @most_indentifier_selector.name if StyleStats.configuration.options[:mostIdentifierSelector]
|
102
|
+
end
|
103
|
+
|
104
|
+
def analyze_average_of_cohesion
|
105
|
+
@result["Average of Cohesion"] = declarations.count.fdiv(rules.count).round(3) if StyleStats.configuration.options[:averageOfCohesion]
|
106
|
+
end
|
107
|
+
|
108
|
+
def analyze_lowest_cohesion
|
109
|
+
@result["Lowest Cohesion"] = @selector.declarations.count if StyleStats.configuration.options[:lowestCohesion]
|
110
|
+
end
|
111
|
+
|
112
|
+
def analyze_lowest_cohesion_selector
|
113
|
+
@result["Lowest Cohesion Selector"] = @selector.name if StyleStats.configuration.options[:lowestCohesionSelector]
|
114
|
+
end
|
115
|
+
|
116
|
+
def analyze_total_unique_font_sizes
|
117
|
+
@result["Total Unique Font Sizes"] = self["font-size"][:values].count if StyleStats.configuration.options[:totalUniqueFontSizes]
|
118
|
+
end
|
119
|
+
|
120
|
+
def analyze_unique_font_sizes
|
121
|
+
@result["Unique Font Sizes"] = self["font-size"][:values] if StyleStats.configuration.options[:uniqueFontSizes]
|
122
|
+
end
|
123
|
+
|
124
|
+
def analyze_total_unique_font_families
|
125
|
+
@result["Total Unique Font Families"] = self["font-family"][:values].count if StyleStats.configuration.options[:totalUniqueFontFamilies]
|
126
|
+
end
|
127
|
+
|
128
|
+
def analyze_unique_font_families
|
129
|
+
@result["Unique Font Families"] = self["font-family"][:values] if StyleStats.configuration.options[:uniqueFontFamilies]
|
130
|
+
end
|
131
|
+
|
132
|
+
def analyze_total_unique_colors
|
133
|
+
@result["Total Unique Colors"] = self["color"][:values].count if StyleStats.configuration.options[:totalUniqueColors]
|
134
|
+
end
|
135
|
+
|
136
|
+
def analyze_unique_colors
|
137
|
+
@result["Unique Colors"] = self["color"][:values] if StyleStats.configuration.options[:uniqueColors]
|
138
|
+
end
|
139
|
+
|
140
|
+
def analyze_id_selectors
|
141
|
+
@result["ID Selectors"] = selectors_count(:id) if StyleStats.configuration.options[:idSelectors]
|
142
|
+
end
|
143
|
+
|
144
|
+
def analyze_universal_selectors
|
145
|
+
@result["Universal Selectors"] = selectors_count(:universal) if StyleStats.configuration.options[:universalSelectors]
|
146
|
+
end
|
147
|
+
|
148
|
+
def analyze_unqualified_attribute_selectors
|
149
|
+
@result["Unqualified Attribute Selectors"] = selectors_count(:unqualified) if StyleStats.configuration.options[:unqualifiedAttributeSelectors]
|
150
|
+
end
|
151
|
+
|
152
|
+
def analyze_javascript_specific_selectors
|
153
|
+
@result["JavaScript Specific Selectors"] = selectors_count(:js) if StyleStats.configuration.options[:javascriptSpecificSelectors]
|
154
|
+
end
|
155
|
+
|
156
|
+
def analyze_user_specific_selectors
|
157
|
+
@result["User Specific Selectors"] = selectors_count(:user) if StyleStats.configuration.options[:userSpecificSelectors]
|
158
|
+
end
|
159
|
+
|
160
|
+
def analyze_important_keywords
|
161
|
+
@result["Important Keywords"] = declarations_count(:important) if StyleStats.configuration.options[:importantKeywords]
|
162
|
+
end
|
163
|
+
|
164
|
+
def analyze_fload_properties
|
165
|
+
@result["Float Properties"] = declarations_count(:float) if StyleStats.configuration.options[:floatProperties]
|
166
|
+
end
|
167
|
+
|
168
|
+
def analyze_properties_count
|
169
|
+
@result["Properties Count"] = aggregate_declaration.declarations.sort { |(_, v1), (_, v2)| v2[:count] <=> v1[:count] }.take(10).map{ |property, declaration| "#{property}: #{declaration[:count]}" } if StyleStats.configuration.options[:propertiesCount]
|
170
|
+
end
|
171
|
+
|
172
|
+
def analyze_media_queries
|
173
|
+
@result["Media Queries"] = media_types.count if StyleStats.configuration.options[:mediaQueries]
|
40
174
|
end
|
41
175
|
end
|
42
176
|
end
|
@@ -2,10 +2,9 @@ class StyleStats::Css
|
|
2
2
|
class Fetch
|
3
3
|
attr_accessor :stylesheets, :elements
|
4
4
|
|
5
|
-
def initialize(path
|
5
|
+
def initialize(path)
|
6
6
|
self.stylesheets = []
|
7
7
|
self.elements = []
|
8
|
-
@options = options
|
9
8
|
get(path)
|
10
9
|
end
|
11
10
|
|
@@ -19,7 +18,7 @@ class StyleStats::Css
|
|
19
18
|
end
|
20
19
|
|
21
20
|
def request(path)
|
22
|
-
file = open(path,
|
21
|
+
file = open(path, headers)
|
23
22
|
case file.content_type
|
24
23
|
when 'text/css'
|
25
24
|
self.stylesheets.push(file.read)
|
@@ -49,8 +48,12 @@ class StyleStats::Css
|
|
49
48
|
end
|
50
49
|
end
|
51
50
|
|
52
|
-
def
|
53
|
-
|
51
|
+
def headers
|
52
|
+
if StyleStats.configuration.options[:requestOptions][:headers]['User-Agent']
|
53
|
+
StyleStats.configuration.options[:requestOptions][:headers]
|
54
|
+
else
|
55
|
+
{ 'User-Agent' => "Ruby/StyleStats #{StyleStats::VERSION}" }
|
56
|
+
end
|
54
57
|
end
|
55
58
|
end
|
56
59
|
end
|
data/lib/style_stats/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: style_stats
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- shiro16
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-10-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: oga
|
@@ -116,6 +116,7 @@ files:
|
|
116
116
|
- exe/style_stats
|
117
117
|
- lib/style_stats.rb
|
118
118
|
- lib/style_stats/cli.rb
|
119
|
+
- lib/style_stats/configuration.rb
|
119
120
|
- lib/style_stats/css.rb
|
120
121
|
- lib/style_stats/css/aggregate_declaration.rb
|
121
122
|
- lib/style_stats/css/analyze.rb
|
@@ -155,4 +156,3 @@ signing_key:
|
|
155
156
|
specification_version: 4
|
156
157
|
summary: StyleStats is a library to collect CSS statistics!
|
157
158
|
test_files: []
|
158
|
-
has_rdoc:
|