flexpmd 1.2.1
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/Gemfile +10 -0
- data/Gemfile.lock +24 -0
- data/README.md +68 -0
- data/Rakefile +50 -0
- data/lib/flexpmd/base.rb +55 -0
- data/lib/flexpmd/cpd.rb +52 -0
- data/lib/flexpmd/metrics.rb +38 -0
- data/lib/flexpmd/pmd.rb +48 -0
- data/lib/flexpmd.rb +30 -0
- data/test/unit/flexpmd_test.rb +28 -0
- data/test/unit/test_helper.rb +21 -0
- metadata +111 -0
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
GEM
|
2
|
+
remote: http://rubygems.org/
|
3
|
+
specs:
|
4
|
+
archive-tar-minitar (0.5.2)
|
5
|
+
mocha (0.9.12)
|
6
|
+
open4 (1.1.0)
|
7
|
+
rake (0.9.2)
|
8
|
+
rubyzip (0.9.4)
|
9
|
+
shoulda (2.11.3)
|
10
|
+
sprout (1.1.15.pre)
|
11
|
+
archive-tar-minitar (= 0.5.2)
|
12
|
+
bundler (>= 0.9.19)
|
13
|
+
open4 (>= 0.9.6)
|
14
|
+
rake (>= 0.9.2)
|
15
|
+
rubyzip (= 0.9.4)
|
16
|
+
|
17
|
+
PLATFORMS
|
18
|
+
ruby
|
19
|
+
|
20
|
+
DEPENDENCIES
|
21
|
+
mocha
|
22
|
+
rake
|
23
|
+
shoulda
|
24
|
+
sprout (>= 1.1.15.pre)
|
data/README.md
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
# The FlexPMD Sprout Gem
|
2
|
+
|
3
|
+
This [RubyGem](http://docs.rubygems.org/read/book/7) contains a rake task to add support for [FlexPMD](http://opensource.adobe.com/wiki/display/flexpmd/FlexPMD) in [Project Sprouts](http://projectsprouts.org).
|
4
|
+
|
5
|
+
Functionality is only tested on OSX, it is *not expected* to work on Windows. You may be ok on Linux.
|
6
|
+
|
7
|
+
## Install
|
8
|
+
|
9
|
+
git clone [this repo]
|
10
|
+
cd sprout-flexpmd
|
11
|
+
bundle install
|
12
|
+
gem build flexpmd.gemspec
|
13
|
+
gem install flexpmd
|
14
|
+
|
15
|
+
#### Or
|
16
|
+
|
17
|
+
gem install flexpmd
|
18
|
+
|
19
|
+
## Usage
|
20
|
+
|
21
|
+
Add the following to your rake file
|
22
|
+
|
23
|
+
desc "Use FlexPMD to audit source code"
|
24
|
+
flexpmd 'report/pmd' do |t|
|
25
|
+
t.src = 'src'
|
26
|
+
end
|
27
|
+
|
28
|
+
desc "Use FlexCPD to detect copy pasted code"
|
29
|
+
flexcpd 'report/cpd.xml' do |t|
|
30
|
+
t.src = 'src'
|
31
|
+
t.minimum_tokens = 50
|
32
|
+
end
|
33
|
+
|
34
|
+
desc "Use FlexMetrics to generate code metrics for this project"
|
35
|
+
flexmetrics 'report/metrics.xml' do |t|
|
36
|
+
t.src = 'src'
|
37
|
+
end
|
38
|
+
|
39
|
+
task :audit => ['report/pmd', 'report/cpd.xml', 'report/metrics.xml']
|
40
|
+
|
41
|
+
Then invoke it with
|
42
|
+
|
43
|
+
rake audit
|
44
|
+
|
45
|
+
Output can be found in the `report/` directory created in the project root. This is best consumed via the relevant [Jenkins](http://jenkins-ci.org/) plugins.
|
46
|
+
|
47
|
+
## MIT License
|
48
|
+
|
49
|
+
Copyright 2011 Simon Gregory
|
50
|
+
|
51
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
52
|
+
a copy of this software and associated documentation files (the
|
53
|
+
'Software'), to deal in the Software without restriction, including
|
54
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
55
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
56
|
+
permit persons to whom the Software is furnished to do so, subject to
|
57
|
+
the following conditions:
|
58
|
+
|
59
|
+
The above copyright notice and this permission notice shall be
|
60
|
+
included in all copies or substantial portions of the Software.
|
61
|
+
|
62
|
+
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
63
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
64
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
65
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
66
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
67
|
+
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
68
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Rakefile
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
lib = File.expand_path('lib', File.dirname(__FILE__))
|
2
|
+
$:.unshift lib unless $:.include?(lib)
|
3
|
+
|
4
|
+
require 'rubygems'
|
5
|
+
require 'rake'
|
6
|
+
require 'rake/clean'
|
7
|
+
require 'rake/testtask'
|
8
|
+
require 'flexpmd'
|
9
|
+
|
10
|
+
#############################################################################
|
11
|
+
#
|
12
|
+
# Standard tasks
|
13
|
+
#
|
14
|
+
#############################################################################
|
15
|
+
|
16
|
+
Rake::TestTask.new(:test) do |t|
|
17
|
+
t.libs << "test/unit"
|
18
|
+
t.test_files = FileList["test/unit/*_test.rb"]
|
19
|
+
t.verbose = true
|
20
|
+
end
|
21
|
+
|
22
|
+
CLEAN.add '*.gem'
|
23
|
+
|
24
|
+
#############################################################################
|
25
|
+
#
|
26
|
+
# Packaging tasks
|
27
|
+
#
|
28
|
+
#############################################################################
|
29
|
+
|
30
|
+
task :release do
|
31
|
+
puts ""
|
32
|
+
print "Are you sure you want to relase FlexPMD #{FlexPMD::VERSION}? [y/N] "
|
33
|
+
exit unless STDIN.gets.index(/y/i) == 0
|
34
|
+
|
35
|
+
unless `git branch` =~ /^\* master$/
|
36
|
+
puts "You must be on the master branch to release!"
|
37
|
+
exit!
|
38
|
+
end
|
39
|
+
|
40
|
+
# Build gem and upload
|
41
|
+
sh "gem build flexpmd.gemspec"
|
42
|
+
sh "gem push flexpmd-#{FlexPMD::VERSION}.gem"
|
43
|
+
sh "rm flexpmd-#{FlexPMD::VERSION}.gem"
|
44
|
+
|
45
|
+
# Commit
|
46
|
+
sh "git commit --allow-empty -a -m 'v#{FlexPMD::VERSION}'"
|
47
|
+
sh "git tag v#{FlexPMD::VERSION}"
|
48
|
+
sh "git push origin master"
|
49
|
+
sh "git push origin v#{FlexPMD::VERSION}"
|
50
|
+
end
|
data/lib/flexpmd/base.rb
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
module Sprout::System
|
2
|
+
|
3
|
+
##
|
4
|
+
# Monkey patch the base system so we control the output to stderr.
|
5
|
+
#
|
6
|
+
class BaseSystem
|
7
|
+
|
8
|
+
##
|
9
|
+
# Creates a new process, executes the command
|
10
|
+
# and returns whatever the process wrote to stdout, or stderr.
|
11
|
+
#
|
12
|
+
def execute(tool, options='')
|
13
|
+
Sprout.stdout.puts("#{tool} #{options}")
|
14
|
+
runner = get_and_execute_process_runner(tool, options)
|
15
|
+
error = runner.read_err
|
16
|
+
result = runner.read
|
17
|
+
|
18
|
+
if(result.size > 0)
|
19
|
+
Sprout.stdout.puts result
|
20
|
+
end
|
21
|
+
|
22
|
+
if(error.size > 0)
|
23
|
+
# We expect the process to write to stderror so simply print it, we don't want Sprouts
|
24
|
+
# to stop executing.
|
25
|
+
Sprout.stdout.puts error
|
26
|
+
end
|
27
|
+
|
28
|
+
result || error
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
##
|
34
|
+
# Monkey patch the unix system so we can run tool with 'java -jar'.
|
35
|
+
#
|
36
|
+
class UnixSystem < BaseSystem
|
37
|
+
|
38
|
+
##
|
39
|
+
# Get a process runner and execute the provided +executable+,
|
40
|
+
# with the provided +options+.
|
41
|
+
#
|
42
|
+
# +executable+ String path to the external executable file.
|
43
|
+
#
|
44
|
+
# +options+ String commandline options to send to the +executable+.
|
45
|
+
#
|
46
|
+
def get_and_execute_process_runner tool, options=nil
|
47
|
+
runner = get_process_runner
|
48
|
+
raise Sprout::Errors::ExecutionError.new("[ERROR] Java is required for this tool to run.") unless `which java` =~ /java$/
|
49
|
+
runner.execute_open4 "java -Xms64m -Xmx768m -jar "+ clean_path(tool), options
|
50
|
+
runner
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
data/lib/flexpmd/cpd.rb
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
module FlexPMD
|
2
|
+
|
3
|
+
##
|
4
|
+
# Flex Copy and Paste Detector
|
5
|
+
#
|
6
|
+
# (-s|--sourceDirectory) <sourceDirectory>
|
7
|
+
# (-o|--outputFile) <outputFile>
|
8
|
+
# [(-m|--minimumTokens) <minimumTokens>]]
|
9
|
+
#
|
10
|
+
class FCPD < Sprout::Executable::Base
|
11
|
+
|
12
|
+
##
|
13
|
+
# The source directory to recursively audit
|
14
|
+
#
|
15
|
+
add_param :source_directory, Path, { :required => true, :shell_name => '-s' }
|
16
|
+
|
17
|
+
add_param_alias :s, :source_directory
|
18
|
+
|
19
|
+
add_param_alias :src, :source_directory
|
20
|
+
|
21
|
+
##
|
22
|
+
# The file to output results to.
|
23
|
+
#
|
24
|
+
add_param :output_file, File, { :shell_name => '-o', :file_task_name => true }
|
25
|
+
|
26
|
+
add_param_alias :o, :output_file
|
27
|
+
|
28
|
+
add_param_alias :output, :output_file
|
29
|
+
|
30
|
+
##
|
31
|
+
# The minmum length of matched portions of code. A token roughly translates to a word,
|
32
|
+
# method name, operator etc. As this is subjective experiment to find a useful value. 50 to
|
33
|
+
# 100 is a reasonable starting point, the lower the better.
|
34
|
+
#
|
35
|
+
add_param :minimum_tokens, Number, { :shell_name => '-m' }
|
36
|
+
|
37
|
+
add_param_alias :m, :minimum_tokens
|
38
|
+
|
39
|
+
##
|
40
|
+
# The default executable target.
|
41
|
+
#
|
42
|
+
set :executable, :flexcpd
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
def flexcpd *args, &block
|
49
|
+
exe = FlexPMD::FCPD.new
|
50
|
+
exe.to_rake(*args, &block)
|
51
|
+
exe
|
52
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module FlexPMD
|
2
|
+
|
3
|
+
##
|
4
|
+
# FlexMetrics API
|
5
|
+
#
|
6
|
+
# (-s|--sourceDirectory) <sourceDirectory>
|
7
|
+
# (-o|--outputDirectory) <outputDirectory>
|
8
|
+
#
|
9
|
+
class FlexMetrics < Sprout::Executable::Base
|
10
|
+
|
11
|
+
##
|
12
|
+
# The source path to run flexpmd against.
|
13
|
+
add_param :source_directory, Path, { :required => true, :shell_name => '-s' }
|
14
|
+
|
15
|
+
add_param_alias :s, :source_directory
|
16
|
+
|
17
|
+
add_param_alias :src, :source_directory
|
18
|
+
|
19
|
+
add_param :output_directory, File, { :shell_name => '-o', :file_task_name => true }
|
20
|
+
|
21
|
+
add_param_alias :o, :output_directory
|
22
|
+
|
23
|
+
add_param_alias :output, :output_directory
|
24
|
+
|
25
|
+
##
|
26
|
+
# The default executable target.
|
27
|
+
#
|
28
|
+
set :executable, :flexmetrics
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
def flexmetrics *args, &block
|
35
|
+
exe = FlexPMD::FlexMetrics.new
|
36
|
+
exe.to_rake(*args, &block)
|
37
|
+
exe
|
38
|
+
end
|
data/lib/flexpmd/pmd.rb
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
module FlexPMD
|
2
|
+
|
3
|
+
##
|
4
|
+
# FlexPMD API
|
5
|
+
#
|
6
|
+
# (-s|--sourceDirectory) <sourceDirectory>
|
7
|
+
# (-o|--outputDirectory) <outputDirectory>
|
8
|
+
#[(-r|--ruleSet) <ruleSet>]
|
9
|
+
#[(-e|--excludePackage) <excludePackage>]
|
10
|
+
#
|
11
|
+
class FPMD < Sprout::Executable::Base
|
12
|
+
|
13
|
+
##
|
14
|
+
# The source path to run flexpmd against.
|
15
|
+
add_param :source_directory, Path, { :required => true, :shell_name => '-s' }
|
16
|
+
|
17
|
+
add_param_alias :s, :source_directory
|
18
|
+
|
19
|
+
add_param_alias :src, :source_directory
|
20
|
+
|
21
|
+
add_param :output_directory, File, { :shell_name => '-o', :file_task_name => true }
|
22
|
+
|
23
|
+
add_param_alias :o, :output_directory
|
24
|
+
|
25
|
+
add_param_alias :output, :output_directory
|
26
|
+
|
27
|
+
add_param :rule_set, File, { :shell_name => '-r' }
|
28
|
+
|
29
|
+
add_param_alias :r, :rule_set
|
30
|
+
|
31
|
+
add_param :exclude_package, String, { :shell_name => '-e' }
|
32
|
+
|
33
|
+
add_param_alias :e, :exclude_package
|
34
|
+
|
35
|
+
##
|
36
|
+
# The default executable target.
|
37
|
+
#
|
38
|
+
set :executable, :flexpmd
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
def flexpmd *args, &block
|
45
|
+
exe = FlexPMD::FPMD.new
|
46
|
+
exe.to_rake(*args, &block)
|
47
|
+
exe
|
48
|
+
end
|
data/lib/flexpmd.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'sprout'
|
2
|
+
|
3
|
+
require 'flexpmd/pmd'
|
4
|
+
require 'flexpmd/cpd'
|
5
|
+
require 'flexpmd/metrics'
|
6
|
+
require 'flexpmd/base'
|
7
|
+
|
8
|
+
module FlexPMD
|
9
|
+
NAME = 'flexpmd'
|
10
|
+
JAR_VERSION = '1.2'
|
11
|
+
VERSION = "#{JAR_VERSION}.1"
|
12
|
+
MD5 = 'efd3fa459788fa3d32837628dc82e264'
|
13
|
+
ZIP = 'http://opensource.adobe.com/svn/opensource/flexpmd/maven-repository/release/com/adobe/ac/flex-pmd/1.2/flex-pmd-all-in-one-bundle-1.2.zip'
|
14
|
+
end
|
15
|
+
|
16
|
+
Sprout::Specification.new do |s|
|
17
|
+
|
18
|
+
s.name = FlexPMD::NAME
|
19
|
+
s.version = FlexPMD::JAR_VERSION
|
20
|
+
|
21
|
+
s.add_remote_file_target do |t|
|
22
|
+
t.platform = :universal
|
23
|
+
t.archive_type = :zip
|
24
|
+
t.url = FlexPMD::ZIP
|
25
|
+
t.md5 = FlexPMD::MD5
|
26
|
+
t.add_executable :flexpmd, "flex-pmd-command-line-#{FlexPMD::JAR_VERSION}.jar"
|
27
|
+
t.add_executable :flexcpd, "flex-pmd-cpd-command-line-#{FlexPMD::JAR_VERSION}.jar"
|
28
|
+
t.add_executable :flexmetrics, "flex-pmd-metrics-command-line-#{FlexPMD::JAR_VERSION}.jar"
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class FlexPMDTest < Test::Unit::TestCase
|
4
|
+
include Sprout::TestHelper
|
5
|
+
|
6
|
+
context "A FlexPMD tool" do
|
7
|
+
|
8
|
+
setup do
|
9
|
+
@fixture = File.join fixtures, 'flexpmd', 'tmp'
|
10
|
+
FileUtils.makedirs @fixture
|
11
|
+
@ruleset = File.join @fixture, 'ruleset.xml'
|
12
|
+
end
|
13
|
+
|
14
|
+
teardown do
|
15
|
+
remove_file @fixture
|
16
|
+
end
|
17
|
+
|
18
|
+
should "accept input" do
|
19
|
+
fpmd = FlexPMD::FPMD.new
|
20
|
+
fpmd.src = @fixture
|
21
|
+
fpmd.output = @app_desc
|
22
|
+
fpmd.rule_set = Dir.pwd
|
23
|
+
|
24
|
+
assert_equal "-s=#{@fixture} -r=#{Dir.pwd}", fpmd.to_shell
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require "rubygems"
|
2
|
+
require "bundler"
|
3
|
+
Bundler.require :default, :development
|
4
|
+
|
5
|
+
# These require statments *must* be in this order:
|
6
|
+
# http://bit.ly/bCC0Ew
|
7
|
+
# Somewhat surprised they're not being required by Bundler...
|
8
|
+
require 'shoulda'
|
9
|
+
require 'mocha'
|
10
|
+
|
11
|
+
lib = File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'lib'))
|
12
|
+
$:.unshift lib unless $:.include? lib
|
13
|
+
|
14
|
+
test = File.expand_path(File.join(File.dirname(__FILE__), '..'))
|
15
|
+
$:.unshift test unless $:.include? test
|
16
|
+
|
17
|
+
require 'sprout'
|
18
|
+
require 'sprout/test_helper'
|
19
|
+
|
20
|
+
require 'flexpmd'
|
21
|
+
|
metadata
ADDED
@@ -0,0 +1,111 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: flexpmd
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease:
|
5
|
+
version: 1.2.1
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Simon Gregory
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
|
13
|
+
date: 2011-06-26 00:00:00 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: sprout
|
17
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
18
|
+
none: false
|
19
|
+
requirements:
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 1.1.15.pre
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: *id001
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: rake
|
28
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
29
|
+
none: false
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: "0"
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: *id002
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: shoulda
|
39
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
40
|
+
none: false
|
41
|
+
requirements:
|
42
|
+
- - ">="
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: "0"
|
45
|
+
type: :development
|
46
|
+
prerelease: false
|
47
|
+
version_requirements: *id003
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: mocha
|
50
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
51
|
+
none: false
|
52
|
+
requirements:
|
53
|
+
- - ">="
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: "0"
|
56
|
+
type: :development
|
57
|
+
prerelease: false
|
58
|
+
version_requirements: *id004
|
59
|
+
description: Project Sprouts support for FlexPMD
|
60
|
+
email: projectsprouts@googlegroups.com
|
61
|
+
executables: []
|
62
|
+
|
63
|
+
extensions: []
|
64
|
+
|
65
|
+
extra_rdoc_files: []
|
66
|
+
|
67
|
+
files:
|
68
|
+
- Gemfile
|
69
|
+
- Gemfile.lock
|
70
|
+
- lib/flexpmd/base.rb
|
71
|
+
- lib/flexpmd/cpd.rb
|
72
|
+
- lib/flexpmd/metrics.rb
|
73
|
+
- lib/flexpmd/pmd.rb
|
74
|
+
- lib/flexpmd.rb
|
75
|
+
- Rakefile
|
76
|
+
- README.md
|
77
|
+
- test/unit/flexpmd_test.rb
|
78
|
+
- test/unit/test_helper.rb
|
79
|
+
homepage: http://projectsprouts.org
|
80
|
+
licenses: []
|
81
|
+
|
82
|
+
post_install_message:
|
83
|
+
rdoc_options: []
|
84
|
+
|
85
|
+
require_paths:
|
86
|
+
- lib
|
87
|
+
- lib
|
88
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ">="
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
hash: 73980266876539591
|
94
|
+
segments:
|
95
|
+
- 0
|
96
|
+
version: "0"
|
97
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
98
|
+
none: false
|
99
|
+
requirements:
|
100
|
+
- - ">="
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: 1.3.6
|
103
|
+
requirements: []
|
104
|
+
|
105
|
+
rubyforge_project:
|
106
|
+
rubygems_version: 1.8.5
|
107
|
+
signing_key:
|
108
|
+
specification_version: 3
|
109
|
+
summary: Code auditing for ActionScript and Flex
|
110
|
+
test_files: []
|
111
|
+
|