tool-shed 0.0.5 → 0.0.7

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 (50) hide show
  1. data/README.md +45 -22
  2. data/bin/{as-asset-detector → as-asset-vacuum} +2 -2
  3. data/bin/{as-class-detector → as-class-vacuum} +2 -2
  4. data/bin/{as-style-detector → as-style-vacuum} +2 -2
  5. data/bin/as-vacuum +16 -0
  6. data/lib/shed/asdoc_package.rb +11 -11
  7. data/lib/shed/asset_vacuum.rb +85 -0
  8. data/lib/shed/{unused_class.rb → class_vacuum.rb} +18 -19
  9. data/lib/shed/manifest.rb +11 -12
  10. data/lib/shed/opts/asdoc_package_opts.rb +1 -1
  11. data/lib/shed/opts/asset_vacuum_opts.rb +22 -0
  12. data/lib/shed/opts/{unused_class_opts.rb → class_vacuum_opts.rb} +9 -12
  13. data/lib/shed/opts/manifest_opts.rb +2 -2
  14. data/lib/shed/opts/style_vacuum_opts.rb +31 -0
  15. data/lib/shed/opts/tool_opts.rb +8 -8
  16. data/lib/shed/style_vacuum.rb +92 -0
  17. data/lib/shed/tool.rb +43 -6
  18. data/lib/shed/version.rb +1 -1
  19. data/lib/tool_shed.rb +6 -6
  20. data/test/fixtures/unused-asset/assets/audio/referenced.mp3 +0 -0
  21. data/test/fixtures/unused-asset/assets/audio/un-referenced.mp3 +0 -0
  22. data/test/fixtures/unused-asset/assets/css/referenced-in-mxml.css +0 -0
  23. data/test/fixtures/unused-asset/assets/css/referenced.css +12 -0
  24. data/test/fixtures/unused-asset/assets/css/un-referenced.css +7 -0
  25. data/test/fixtures/unused-asset/assets/fonts/referenced-in-css.ttf +0 -0
  26. data/test/fixtures/unused-asset/assets/fonts/referenced-in-unused-css.ttf +0 -0
  27. data/test/fixtures/unused-asset/assets/img/referenced.gif +0 -0
  28. data/test/fixtures/unused-asset/assets/img/referenced.svg +0 -0
  29. data/test/fixtures/unused-asset/assets/img/un-referenced.gif +0 -0
  30. data/test/fixtures/unused-asset/assets/img/un-referenced.svg +0 -0
  31. data/test/fixtures/unused-asset/assets/swf/referenced-in-css.swf +0 -0
  32. data/test/fixtures/unused-asset/assets/swf/referenced.swf +0 -0
  33. data/test/fixtures/unused-asset/assets/swf/un-referenced.swf +0 -0
  34. data/test/fixtures/unused-asset/src/org/helvector/ToolBox.mxml +5 -0
  35. data/test/fixtures/unused-asset/src/org/helvector/ToolShed.as +7 -2
  36. data/test/unit/test_asdoc_package_opts.rb +1 -1
  37. data/test/unit/test_asset_vacuum.rb +77 -0
  38. data/test/unit/{test_unused_asset_opts.rb → test_asset_vacuum_opts.rb} +5 -7
  39. data/test/unit/{test_unused_class.rb → test_class_vacuum.rb} +7 -7
  40. data/test/unit/test_class_vacuum_opts.rb +51 -0
  41. data/test/unit/{test_unused_style.rb → test_style_vacuum.rb} +21 -15
  42. data/test/unit/test_style_vacuum_opts.rb +46 -0
  43. metadata +36 -22
  44. data/lib/shed/opts/unused_asset_opts.rb +0 -24
  45. data/lib/shed/opts/unused_style_opts.rb +0 -23
  46. data/lib/shed/unused_asset.rb +0 -93
  47. data/lib/shed/unused_style.rb +0 -114
  48. data/test/unit/test_unused_asset.rb +0 -69
  49. data/test/unit/test_unused_class_opts.rb +0 -59
  50. data/test/unit/test_unused_style_opts.rb +0 -31
data/README.md CHANGED
@@ -3,46 +3,70 @@
3
3
  A collection of utility scripts to help working with ActionScript and Flex
4
4
  projects. These scripts are under development, so **don't** expect reliability.
5
5
 
6
+ All tools have help available on the command line, to view use:
7
+
8
+ as-tool-name -h
9
+
6
10
  ### as-docp
7
11
 
8
- The `as-docp` tool is a utility that can be used to generate a flex config file
9
- from package level ASDoc files. For each package you want to document place your
10
- asdoc comments in a file with a .asdoc suffix. The `as-docp` tool can then be
11
- used to gather these together in a flex-config.xml file to pass to the asdoc
12
- tool when building your documentation.
12
+ The `as-docp` tool can be used to generate a `flex-config.xml` file from package
13
+ level ASDoc files. This can then be used by the `asdoc` tool when generating
14
+ ASDocs for your project.
15
+
16
+ To document a package create a single file with a `.asdoc` suffix to contain
17
+ your ASDoc comments.
18
+
19
+ Example use:
20
+
21
+ as-docp -s src -o tmp/asdocp-config.xml
13
22
 
14
23
  ### as-manifest
15
24
 
16
25
  Scans a specified source tree for ActionScript and MXML files and for each one
17
26
  found creates a manifest entry. When complete writes the results to disk.
18
27
 
19
- ### as-class-dector
28
+ Example use:
29
+
30
+ as-manifest
31
+ as-manifest -s source/main -o project-manifest.xml
32
+ as-manifest -f 'org.helvector'
33
+
34
+ ### as-class-vacuum
20
35
 
21
- This tool compares a mxmlc generated link-report against a manifest file
22
- created by the as-manifest tool to identify files that are in the project
23
- source tree but are no longer used by the application.
36
+ Compares a `mxmlc` generated `link-report.xml` against a `manifest.xml` file to
37
+ identify files that are in a project source tree but are no longer compiled
38
+ into the application.
24
39
 
25
- Before executing this script make sure the relevant link reports and manifest
26
- files have been generated.
40
+ Example use:
27
41
 
28
- ### as-style-dector
42
+ as-class-vacuum -s src/main -o report/vacuum/class.xml -l report/link/app-link-report.xml -m manifest.xml
29
43
 
30
- Detects styles that are not used in a Flex application.
44
+ To generate a link report via mxmlc use `mxmlc -link-report=report.xml`
31
45
 
32
- ### as-asset-dector
46
+ ### as-style-vacuum
33
47
 
34
- Under development. This script scans all ActionScript classes and CSS files in a
35
- project to identify assets, such as png files, that are in the project source
36
- tree but are no longer referenced by the application.
48
+ Loads all styles defined in **css** files (mxml isn't included) and identifies
49
+ styles that are not referenced in the source tree.
50
+
51
+ Example use:
52
+
53
+ as-style-vacuum -c source/assets -s source/main -o report/vacuum/style.xml
54
+
55
+ ### as-asset-vacuum
56
+
57
+ This script scans a source tree for assets of types `jpg, jpeg, png, otf, ttf,
58
+ swf, svg, mp3, gif` then searches all ActionScript, CSS and MXML files to
59
+ identify which assets are not referenced in the source files.
60
+
61
+ Example use:
62
+
63
+ as-asset-vacuum
64
+ as-asset-vacuum -s source/main -o report/vacuum/asset.xml
37
65
 
38
66
  ## Install
39
67
 
40
68
  gem install tool-shed
41
69
 
42
- ## Using
43
-
44
- Examples will follow once the tools are in a stable state.
45
-
46
70
  ## Authors
47
71
 
48
72
  [Simon Gregory](http://simongregory.com)
@@ -51,4 +75,3 @@ Examples will follow once the tools are in a stable state.
51
75
 
52
76
  Released under the MIT License. Please see the accompanying [LICENSE](LICENSE) document for
53
77
  details.
54
-
@@ -6,8 +6,8 @@ require 'tool_shed'
6
6
 
7
7
  begin
8
8
 
9
- opt = UnusedAssetOpts.parse(ARGV)
10
- UnusedAsset.new(opt)
9
+ opt = AssetVacuumOpts.parse(ARGV)
10
+ AssetVacuum.new(opt)
11
11
 
12
12
  rescue OptionParser::ParseError => e
13
13
 
@@ -6,8 +6,8 @@ require 'tool_shed'
6
6
 
7
7
  begin
8
8
 
9
- opt = UnusedClassOpts.parse(ARGV)
10
- UnusedClass.new(opt)
9
+ opt = ClassVacuumOpts.parse(ARGV)
10
+ ClassVacuum.new(opt)
11
11
 
12
12
  rescue OptionParser::ParseError => e
13
13
 
@@ -6,8 +6,8 @@ require 'tool_shed'
6
6
 
7
7
  begin
8
8
 
9
- opt = UnusedStyleOpts.parse(ARGV)
10
- UnusedStyle.new(opt)
9
+ opt = StyleVacuumOpts.parse(ARGV)
10
+ StyleVacuum.new(opt)
11
11
 
12
12
  rescue OptionParser::ParseError => e
13
13
 
data/bin/as-vacuum ADDED
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $LOAD_PATH.unshift File.dirname(__FILE__) + '/../lib'
4
+
5
+ require 'tool_shed'
6
+
7
+ begin
8
+
9
+ opt = VacuumOpts.parse(ARGV)
10
+ Vacuum.new(opt)
11
+
12
+ rescue OptionParser::ParseError => e
13
+
14
+ puts e
15
+
16
+ end
@@ -23,16 +23,16 @@ class ASDocPackage < Tool
23
23
  #
24
24
  # Scan the given path and it's child directories for all .asdoc files.
25
25
  #
26
- def scan(path)
27
- puts "Scanning '#{path}' for asdoc files..."
26
+ def scan(dir)
27
+ puts "Scanning '#{dir}' for asdoc files..."
28
28
 
29
29
  found = []
30
30
 
31
- Search.find_all(@asdoc,path,@excludes) do |p|
32
- found << {:path => p, :package => ProjectTools.package(p)}
31
+ Search.find_all(@asdoc,dir,@excludes) do |path|
32
+ found << {:path => path, :package => ProjectTools.package(path)}
33
33
  end
34
34
 
35
- found.each { |f| log("Adding #{f[:path]}") }
35
+ found.each { |file| log("Adding #{file[:path]}") }
36
36
 
37
37
  found
38
38
  end
@@ -46,8 +46,8 @@ class ASDocPackage < Tool
46
46
  if asdocs.empty?
47
47
  puts "No .asdoc files found."
48
48
  else
49
- @xml = create_xml(asdocs)
50
- to_disk(@xml)
49
+ create_xml(asdocs)
50
+ to_disk(xml)
51
51
  end
52
52
  end
53
53
 
@@ -56,9 +56,9 @@ class ASDocPackage < Tool
56
56
  # files.
57
57
  #
58
58
  def create_xml(asdocs)
59
- x = @header
60
- asdocs.each { |d| x << sprintf(@package, d[:package], IO.read(d[:path])) }
61
- x << @footer
62
- x
59
+ @xml = @header
60
+ asdocs.each { |asdoc| @xml << sprintf(@package, asdoc[:package], IO.read(asdoc[:path])) }
61
+ @xml << @footer
62
+ @xml
63
63
  end
64
64
  end
@@ -0,0 +1,85 @@
1
+ # encoding: utf-8
2
+
3
+ #
4
+ # This script scans all Actionscript classes and CSS files in a project to
5
+ # identify assets, like PNG files, that are in the project source tree but are
6
+ # no longer used by the application.
7
+ #
8
+ class AssetVacuum < Tool
9
+ attr_reader :assets, :declared, :unused
10
+
11
+ def initialize(opt,out=STDOUT)
12
+ super(opt,out)
13
+
14
+ @src = opt[:src]
15
+ @assets, @src_files, @declared = [], [], []
16
+
17
+ unless valid_opts
18
+ @out.puts "#{INVALID_OPTS} The source directory does not exist."
19
+ return
20
+ end
21
+
22
+ detect
23
+
24
+ @report = describe
25
+
26
+ to_disk(@report)
27
+ end
28
+
29
+ #
30
+ # Valid if the specified project directory exists.
31
+ #
32
+ def valid_opts
33
+ File.exist?(@src) rescue false
34
+ end
35
+
36
+ def detect
37
+ puts "Scanning project for assets that are unused..."
38
+
39
+ Search.find_all(/\.(jpg|jpeg|png|otf|ttf|swf|svg|mp3|gif)$/,@src,@excludes) do |path|
40
+ @assets << path
41
+ end
42
+
43
+ src_dec = scan_dirs(/\.(as|mxml|css)$/, @src, /Embed\(source=['"]([\w._\-\/]+)['"]/)
44
+ css_dec = scan_dirs(/\.(css)$/, @src, /:\s*url\(\s*['"](.*)['"]/)
45
+ mxml_dec = scan_dirs(/\.(mxml)$/, @src, /@Embed\(['"]([\w._\-\/]+)['"]/)
46
+
47
+ @declared = src_dec + css_dec + mxml_dec
48
+ @unused = []
49
+
50
+ @assets.each { |ass| @unused << ass unless is_asset_used(ass) }
51
+
52
+ summarise
53
+ end
54
+
55
+ private
56
+
57
+ #
58
+ # Summarise the collected data.
59
+ #
60
+ def summarise
61
+ puts "Used assets: #{@declared.length.to_s}"
62
+ puts "Unused assets: #{@unused.length.to_s}"
63
+ end
64
+
65
+ #
66
+ # Returns a string detailing the findings of the style detection.
67
+ #
68
+ def describe
69
+ desc = "#{generated_at} by as-asset-vacuum"
70
+ desc << add_desc("Assets declared in src", @declared)
71
+ desc << add_desc("Assets found in project but not referenced in source", @unused)
72
+ desc
73
+ end
74
+
75
+ def is_asset_used(file)
76
+ used = false
77
+ @declared.each { |declaration|
78
+ if File.basename(declaration) == File.basename(file)
79
+ used = true
80
+ end
81
+ }
82
+ used
83
+ end
84
+
85
+ end
@@ -8,7 +8,7 @@
8
8
  # Before executing this script make sure the relevant link reports and manifest
9
9
  # files have been generated.
10
10
  #
11
- class UnusedClass < Tool
11
+ class ClassVacuum < Tool
12
12
  attr_reader :report,
13
13
  :empty_packages,
14
14
  :unused_classes
@@ -22,7 +22,7 @@ class UnusedClass < Tool
22
22
  @manifest_regex = /<component id="(\w+)"/
23
23
 
24
24
  unless valid_opts
25
- @out.puts "#{INVALID_OPTS} One or all of the specified link report, manifest file, or source directory does not exist."
25
+ @out.puts "#{INVALID_OPTS} The link report, manifest file, or source directory does not exist."
26
26
  return
27
27
  end
28
28
 
@@ -46,37 +46,36 @@ class UnusedClass < Tool
46
46
  @unused_classes = @manifest_classes-@link_classes
47
47
  @empty_packages = empties(@src)
48
48
 
49
- puts "Unused classes: #{@unused_classes.length.to_s}"
50
- puts "Empty packages: #{@empty_packages.length.to_s}"
49
+ summarise
51
50
  end
52
51
 
53
52
  private
54
53
 
55
54
  #
56
- # Scans the path for empty directories and lists them.
55
+ # Summarise the collected data.
57
56
  #
58
- def empties(path)
59
- e = []
60
- Search.for_empties(path) { |p| e << p.sub( /^.*src\//, "") }
61
- e
57
+ def summarise
58
+ puts "Unused classes: #{@unused_classes.length.to_s}"
59
+ puts "Empty packages: #{@empty_packages.length.to_s}"
62
60
  end
63
61
 
64
62
  #
65
- # Returns a string detailing the findings of the unused class detection.
63
+ # Scans the path for empty directories and lists them.
66
64
  #
67
- def describe
68
- d = "as-class-vaccum Report. #{generated_at}\n\n"
69
- d << add_desc("classes are in the manifest but not in the link report:", @unused_classes)
70
- d << add_desc("packages appear to be empty:", @empty_packages)
71
- d
65
+ def empties(path)
66
+ empties = []
67
+ Search.for_empties(path) { |path| empties << path.sub( /^.*src\//, "") }
68
+ empties
72
69
  end
73
70
 
74
71
  #
75
- # Prints a description category.
72
+ # Returns a string detailing the findings of the class vacuumer.
76
73
  #
77
- def add_desc(txt,list)
78
- l = list.empty? ? '' : list.join("\n")
79
- "#{list.length} #{txt}\n#{l}\n\n"
74
+ def describe
75
+ desc = "#{generated_at} by as-class-vacuum"
76
+ desc << add_desc("Classes in the manifest but not the link report", @unused_classes)
77
+ desc << add_desc("Packages appear to be empty", @empty_packages)
78
+ desc
80
79
  end
81
80
 
82
81
  #
data/lib/shed/manifest.rb CHANGED
@@ -34,16 +34,16 @@ class Manifest < Tool
34
34
  # Search the provided path for as and mxml documents and return those found as
35
35
  # a list.
36
36
  #
37
- def scan(path)
38
- puts "Scanning '#{path}' for as and mxml files..."
37
+ def scan(dir)
38
+ puts "Scanning '#{dir}' for as and mxml files..."
39
39
 
40
40
  found = []
41
41
 
42
- Search.find_all(@filetypes,path,@excludes) do |p|
43
- ext = File.extname(p)
44
- cn = File.basename(p, ext)
42
+ Search.find_all(@filetypes,dir,@excludes) do |path|
43
+ ext = File.extname(path)
44
+ name = File.basename(path, ext)
45
45
 
46
- found << add(p, cn) if cn =~ /^[A-Z]/
46
+ found << add(path, name) if name =~ /^[A-Z]/
47
47
  end
48
48
 
49
49
  found = process(found) unless found.empty?
@@ -70,10 +70,10 @@ class Manifest < Tool
70
70
  if @components.empty?
71
71
  puts "No ActionScript or Mxml files found."
72
72
  else
73
- @xml = create_xml(@components)
73
+ create_xml(@components)
74
74
 
75
75
  #Open/Create the manifest file and write the output to it.
76
- to_disk(@xml)
76
+ to_disk(xml)
77
77
  end
78
78
  end
79
79
 
@@ -82,9 +82,8 @@ class Manifest < Tool
82
82
  # files.
83
83
  #
84
84
  def create_xml(comps)
85
- x = "<?xml version='1.0'?>\n<componentPackage>\n"
86
- comps.each { |c| x << "\t#{c[:xml]}\n" }
87
- x << "</componentPackage>"
88
- x
85
+ @xml = "<?xml version='1.0'?>\n<componentPackage>\n"
86
+ comps.each { |component| @xml << "\t#{component[:xml]}\n" }
87
+ @xml << "</componentPackage>"
89
88
  end
90
89
  end
@@ -15,7 +15,7 @@ class ASDocPackageOpts < ToolOpts
15
15
 
16
16
  def self.default_config
17
17
  dc = superclass.default_config
18
- dc[:output] = 'package-asdoc.xml'
18
+ dc[:output] = 'asdoc-package-config.xml'
19
19
  dc
20
20
  end
21
21
 
@@ -0,0 +1,22 @@
1
+ # encoding: utf-8
2
+
3
+ #
4
+ # Manages the command line interface for the assets vacuum tool.
5
+ #
6
+ class AssetVacuumOpts < ToolOpts
7
+
8
+ def self.name
9
+ "as-asset-vacuum"
10
+ end
11
+
12
+ def self.description
13
+ "ActionScript Asset Vacuum Tool"
14
+ end
15
+
16
+ def self.default_config
17
+ dc = superclass.default_config
18
+ dc[:output] = 'assets.txt'
19
+ dc
20
+ end
21
+
22
+ end
@@ -1,38 +1,35 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  #
4
- # Manages the command line interface for the unused classes detection tool.
4
+ # Manages the command line interface for the class vacuum tool.
5
5
  #
6
- class UnusedClassOpts < ToolOpts
6
+ class ClassVacuumOpts < ToolOpts
7
7
 
8
8
  def self.name
9
- "as-class-detector"
9
+ "as-class-vacuum"
10
10
  end
11
11
 
12
12
  def self.description
13
- "ActionScript unused class detection tool"
13
+ "ActionScript Class Vacuum Tool"
14
14
  end
15
15
 
16
16
  def self.default_config
17
17
  dc = superclass.default_config
18
- dc[:output] = 'class-vaccum.txt'
18
+ dc[:output] = 'class-vacuum.txt'
19
19
  dc[:manifest] = 'manifest.xml'
20
20
  dc[:link_report] = 'link-report.xml'
21
21
  dc
22
22
  end
23
23
 
24
- #
25
- # Add all mandatory arguments to the options parser.
26
- #
27
24
  def self.add_mandatory(op,config)
28
25
  superclass.add_mandatory(op,config)
29
26
 
30
- op.on("-m", "--manifest FILE", "Path to the source manifest file.") do |v|
31
- config[:manifest] = v
27
+ op.on("-m", "--manifest FILE", "Path to the source manifest file.") do |value|
28
+ config[:manifest] = value
32
29
  end
33
30
 
34
- op.on("-l", "--link-report FILE", "Path to the compiler link-report file.") do |v|
35
- config[:link_report] = v
31
+ op.on("-l", "--link-report FILE", "Path to the compiler link-report file.") do |value|
32
+ config[:link_report] = value
36
33
  end
37
34
  end
38
35
 
@@ -21,8 +21,8 @@ class ManifestOpts < ToolOpts
21
21
 
22
22
  def self.add_optional(op,config)
23
23
  superclass.add_optional(op,config)
24
- op.on("-f", "--filter [STRING]", String, "Package filter, in the form of 'org.helvector', to include in the generated manifest.") do |v|
25
- config[:filter] = v
24
+ op.on("-f", "--filter [STRING]", String, "Package filter, in the form of 'org.helvector', to include in the generated manifest.") do |value|
25
+ config[:filter] = value
26
26
  end
27
27
  end
28
28
 
@@ -0,0 +1,31 @@
1
+ # encoding: utf-8
2
+
3
+ #
4
+ # Manages the command line interface for the style vacuum tool.
5
+ #
6
+ class StyleVacuumOpts < ToolOpts
7
+
8
+ def self.name
9
+ "as-style-vacuum"
10
+ end
11
+
12
+ def self.description
13
+ "ActionScript Style Vacuum Tool"
14
+ end
15
+
16
+ def self.default_config
17
+ dc = superclass.default_config
18
+ dc[:output] = 'styles.txt'
19
+ dc[:css_dir] = 'style'
20
+ dc
21
+ end
22
+
23
+ def self.add_mandatory(op,config)
24
+ superclass.add_mandatory(op,config)
25
+
26
+ op.on("-c", "--css PATH", "Path to the directory containing css file/s.") do |value|
27
+ config[:css_dir] = value
28
+ end
29
+ end
30
+
31
+ end
@@ -64,20 +64,20 @@ class ToolOpts
64
64
  # Add all optional arguments to the options parser.
65
65
  #
66
66
  def self.add_optional(op,config)
67
- op.on("-s", "--source [PATH]", String, "Path to source folder, defaults to current directory.") do |v|
68
- config[:src] = v
67
+ op.on("-s", "--source [PATH]", String, "Path to source folder, defaults to current directory.") do |value|
68
+ config[:src] = value
69
69
  end
70
70
 
71
- op.on("-o", "--output [FILE]", String, "Path to output file, defaults to #{config[:output]}.") do |v|
72
- config[:output] = v
71
+ op.on("-o", "--output [FILE]", String, "Path to output file, defaults to #{config[:output]}.") do |value|
72
+ config[:output] = value
73
73
  end
74
74
 
75
- op.on("-v", "--verbose", "Run verbosely.") do |v|
76
- config[:verbose] = v
75
+ op.on("-v", "--verbose", "Run verbosely.") do |value|
76
+ config[:verbose] = value
77
77
  end
78
78
 
79
- op.on("--silent", "Supress all output.") do |v|
80
- config[:silent] = v
79
+ op.on("--silent", "Supress all output.") do |value|
80
+ config[:silent] = value
81
81
  end
82
82
  end
83
83
 
@@ -0,0 +1,92 @@
1
+ # encoding: utf-8
2
+
3
+ #
4
+ # Detects styles that are not used in a Flex application.
5
+ #
6
+ # This needs to be provided with a source directory to search for used styles,
7
+ # and a directory containing css files which will be loaded and parsed for
8
+ # style definitions.
9
+ #
10
+ # NOTE: This tool needs further work before it can be considerd to cover all
11
+ # use cases.
12
+ #
13
+ class StyleVacuum < Tool
14
+ attr_reader :report,
15
+ :declared,
16
+ :used,
17
+ :unused,
18
+ :undeclared
19
+
20
+ def initialize(opt,out=STDOUT)
21
+ super(opt,out)
22
+
23
+ @css_dir = opt[:css_dir]
24
+
25
+ @style_regex = /styleName\s*=\s*["']\s*\{?\s*([\w.]+)\s*\}?\s*["']/
26
+ @declared_regex = /^\.(\w+)/
27
+
28
+ @declared, @used, @unused, @undeclared = [], [], [], []
29
+
30
+ unless valid_opts
31
+ @out.puts "#{INVALID_OPTS} The specified css directory does not exist, or does not contain css files."
32
+ return
33
+ end
34
+
35
+ detect
36
+
37
+ @report = describe
38
+
39
+ to_disk(@report)
40
+ end
41
+
42
+ #
43
+ # Valid if we can find .css files in the specifed css_dir.
44
+ #
45
+ def valid_opts
46
+ return false unless File.exist?(@css_dir)
47
+
48
+ found = Dir.chdir("#{@css_dir}") { Dir.glob('*.css') }
49
+
50
+ found.length > 0
51
+ end
52
+
53
+ def detect
54
+ puts "Scanning project for styles..."
55
+
56
+ @declared = scan_dirs(/\.(css)/, @css_dir, @declared_regex)
57
+ @used = scan_dirs(/\.(as|mxml)/, @src, @style_regex)
58
+
59
+ #Find any style names used in the source which haven't been declared.
60
+ @undeclared = @used-@declared
61
+
62
+ #Find any style names declared in the css but not used in the src.
63
+ @unused = @declared-@used
64
+
65
+ summarise
66
+ end
67
+
68
+ private
69
+
70
+ #
71
+ # Summarise the collected data.
72
+ #
73
+ def summarise
74
+ puts "Declared styles: #{@declared.length.to_s}"
75
+ puts "Undeclared styles: #{@undeclared.length.to_s}"
76
+ puts "Used styles: #{@used.length.to_s}"
77
+ puts "Unused styles: #{@unused.length.to_s}"
78
+ end
79
+
80
+ #
81
+ # Returns a string detailing the findings of the style detection.
82
+ #
83
+ def describe
84
+ desc = "#{generated_at} by as-style-vacuum"
85
+ desc << add_desc("Styles declared in CSS", @declared)
86
+ desc << add_desc("Styles used in MXML",@used)
87
+ desc << add_desc("Styles declared but not used (in a styleName property)",@unused)
88
+ desc << add_desc("Styles used but not declared",@undeclared)
89
+ desc
90
+ end
91
+
92
+ end