ruby-watchr 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
data/.rvmrc ADDED
@@ -0,0 +1 @@
1
+ rvm use ruby-1.9.2-p180@watchr
data/Gemfile ADDED
@@ -0,0 +1,12 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in watchr.gemspec
4
+ gemspec
5
+
6
+ gem 'flog'
7
+ gem 'flay'
8
+ gem 'ruby2ruby'
9
+
10
+ gem 'rspec'
11
+ gem 'shoulda-matchers'
12
+ gem 'mocha'
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
data/lib/watchr.rb ADDED
@@ -0,0 +1,9 @@
1
+ require "watchr/version"
2
+ require 'watchr/flay_metric/report'
3
+ require 'watchr/flog_metric/report'
4
+ require 'watchr/paths'
5
+ require 'watchr/analyse'
6
+
7
+ module Watchr
8
+ # Your code goes here...
9
+ end
@@ -0,0 +1,42 @@
1
+ require 'watchr/paths'
2
+ require 'watchr/flay_metric/report'
3
+ require 'watchr/file_analyse'
4
+
5
+ module Watchr
6
+
7
+ #
8
+ # Code analyse information for a given path. Returns list of files,
9
+ # each containing its own detailed data for used metrics.
10
+ #
11
+ class Analyse
12
+
13
+ #
14
+ # Analysed file data.
15
+ #
16
+ attr_reader :files
17
+
18
+ #
19
+ # Run the analyse.
20
+ #
21
+ # @param {String} Path to code folders.
22
+ #
23
+ def initialize(path)
24
+ files = Paths.files_by_dirs(path)
25
+
26
+ # Flay essentially cant be done on file level because its first class
27
+ # citizen is duplication of code between files. Its done once for all
28
+ # the files in the analyse and results are injected to the proper file
29
+ # later.
30
+ flay = Watchr::FlayMetric::Report.new(files)
31
+
32
+ # Create report for each file.
33
+ @files = files.map do |file|
34
+ file_report = Watchr::FileAnalyse.new(file)
35
+ file_report.flay(flay.duplications_by_file(file))
36
+
37
+ file_report
38
+ end
39
+ end
40
+ end
41
+ end
42
+
@@ -0,0 +1,69 @@
1
+ require 'watchr/flog_metric/report'
2
+ require 'watchr/smell'
3
+ require 'watchr/smells_collector'
4
+
5
+ module Watchr
6
+ #
7
+ # Analyse for one given file. All the different metric analyse data are
8
+ # collected in order to output reasonable recommendations for a code
9
+ # improvements.
10
+ #
11
+ class FileAnalyse
12
+
13
+ attr_reader :path
14
+
15
+ #
16
+ # Craete new file analyse.
17
+ #
18
+ # @param {String} Path to file.
19
+ #
20
+ def initialize(path)
21
+ @path = path
22
+ @smells = SmellsCollector.new
23
+
24
+ flog_metric = FlogMetric::Report.new([path])
25
+ flog_metric.classes.each do |klass|
26
+ if klass.total_score > 150
27
+ @smells.add(
28
+ Smell.new(
29
+ Smell::VERY_COMPLEX_OBJECT,
30
+ klass.name,
31
+ [klass.location],
32
+ klass.total_score
33
+ )
34
+ )
35
+ end
36
+
37
+ if klass.total_score > 50
38
+ @smells.add(
39
+ Smell.new(
40
+ Smell::COMPLEX_OBJECT,
41
+ klass.name,
42
+ [klass.location],
43
+ klass.total_score
44
+ )
45
+ )
46
+ end
47
+ end
48
+ end
49
+
50
+ def smelly?
51
+ smells.any?
52
+ end
53
+
54
+ #
55
+ # Store the flay report, which was evaluated on global basis
56
+ # to check for duplications across multiple files.
57
+ #
58
+ # @param {Array.<Watchr::FlayMetric::Diff>} Duplication details.
59
+ # @return nil
60
+ #
61
+ def flay(report)
62
+ @flay_report = report
63
+ end
64
+
65
+ def smells
66
+ @smells.all
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,27 @@
1
+ module Watchr
2
+ module FlayMetric
3
+ class Diff
4
+ IDENTICAL = :identical
5
+
6
+ SIMILAR = :similar
7
+
8
+ attr_reader :locations, :match, :nodes, :bonus, :mass, :code
9
+
10
+ def initialize(same, nodes, bonus, mass)
11
+ @locations = []
12
+ @match = same ? IDENTICAL : SIMILAR
13
+ @nodes = nodes
14
+ @bonus = bonus
15
+ @mass = mass
16
+ end
17
+
18
+ def add_location(location)
19
+ @locations << location
20
+ end
21
+
22
+ def code=(code)
23
+ @code = code
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,54 @@
1
+ require 'flay'
2
+ require 'watchr/flay_metric/diff'
3
+ require 'watchr/location'
4
+
5
+ module Watchr
6
+ module FlayMetric
7
+ class Report < Flay
8
+ attr_reader :duplications
9
+
10
+ def initialize(path)
11
+ super(:mass => 12, :diff => true)
12
+
13
+ files = Flay.expand_dirs_to_files(path)
14
+
15
+ process(*files)
16
+ process_result
17
+ end
18
+
19
+ def total_score
20
+ total
21
+ end
22
+
23
+ def duplications_by_file(path)
24
+ duplications.find_all do |duplication|
25
+ false
26
+ # duplication.locations.any? {|location| location.file == path}
27
+ end
28
+ end
29
+
30
+ def process_result
31
+ @duplications = []
32
+
33
+ masses.sort_by { |h,m| [-m, hashes[h].first.file] }.each do |hash, mass|
34
+ nodes = hashes[hash]
35
+
36
+ same = identical[hash]
37
+ node = nodes.first
38
+ bonus = same ? nodes.size : 0
39
+
40
+ diff = Diff.new(same, nodes, bonus, mass)
41
+
42
+ nodes.each do |x|
43
+ diff.add_location(Location.new(x.file, x.line))
44
+ end
45
+
46
+ r2r = Ruby2Ruby.new
47
+ diff.code = n_way_diff(*nodes.map { |s| r2r.process(s.deep_clone) })
48
+
49
+ @duplications << diff
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,24 @@
1
+ module Watchr
2
+ class FlogReportClass
3
+ attr_reader :name, :methods, :total_score, :location
4
+
5
+ def initialize(name, score)
6
+ @name = name
7
+ @total_score = (10 * score).round / 10.0
8
+ @methods = []
9
+ end
10
+
11
+ def location
12
+ @location
13
+ end
14
+
15
+ def total_methods_score
16
+ @methods.reduce(0) {|sum, i| sum += i.total_score}
17
+ end
18
+
19
+ def add_method(method_report)
20
+ @methods << method_report
21
+ @location = Location.new(method_report.location.file)
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,17 @@
1
+ module Watchr
2
+ class FlogReportMethod
3
+ attr_reader :clazz, :name, :total_score, :location
4
+
5
+ def initialize(clazz, name, score, location)
6
+ @clazz = clazz
7
+ @full_name = name
8
+ @name = name.split(/#|::/).last
9
+ @total_score = (10 * score).round / 10.0
10
+ @location = location
11
+ end
12
+
13
+ def full_name
14
+ @full_name
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,84 @@
1
+ require 'flog'
2
+ require 'watchr/flog_metric/class'
3
+ require 'watchr/flog_metric/method'
4
+ require 'watchr/location'
5
+
6
+ module Watchr
7
+ module FlogMetric
8
+
9
+ #
10
+ # Seattle.rb Flog report.
11
+ #
12
+ class Report < Flog
13
+
14
+ #
15
+ # Generate flog report for a given files.
16
+ #
17
+ # @param {Array} Array of file paths.
18
+ #
19
+ def initialize(files)
20
+ super({})
21
+
22
+ flog(files)
23
+ process_result
24
+ end
25
+
26
+ #
27
+ # Get total complexity score.
28
+ #
29
+ # @return {Number} Score.
30
+ #
31
+ def total_score
32
+ (10 * total).round / 10.0
33
+ end
34
+
35
+ #
36
+ # Get list of class reports.
37
+ #
38
+ # @return {Array.<FlogReportClass>} List of class reports.
39
+ #
40
+ def classes
41
+ @classes
42
+ end
43
+
44
+ def classes_by_file(file)
45
+ classes.find_all {|klass| klass.file == file}
46
+ end
47
+
48
+ private
49
+
50
+ def process_result
51
+ @classes = []
52
+
53
+ scores = Hash.new 0
54
+ methods = Hash.new { |h,k| h[k] = [] }
55
+
56
+ each_by_score(nil) do |class_method, score, call_list|
57
+ klass = class_method.split(/#|::/)[0..-2].join('::')
58
+
59
+ methods[klass] << [class_method, score]
60
+ scores[klass] += score
61
+ end
62
+
63
+ scores.each do |klass, total|
64
+ clazz = FlogReportClass.new(klass, total)
65
+
66
+ methods[klass].each do |name, score|
67
+ next if name =~ /#none/
68
+
69
+ clazz.add_method(
70
+ FlogReportMethod.new(
71
+ clazz,
72
+ name,
73
+ score,
74
+ Location.from_path(method_locations[name])
75
+ )
76
+ )
77
+ end
78
+
79
+ @classes << clazz
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,18 @@
1
+ module Watchr
2
+ class Location
3
+ attr_reader :file, :line
4
+
5
+ def initialize(file, line = nil)
6
+ @file = file
7
+ @line = line
8
+ end
9
+
10
+ def self.from_path(path)
11
+ file, line = path.split(':')
12
+ line = line && line.to_i
13
+
14
+ Location.new(file, line)
15
+ end
16
+ end
17
+ end
18
+
@@ -0,0 +1,15 @@
1
+ module Watchr
2
+ module Paths
3
+ def self.files_by_dirs *dirs
4
+ extensions = ['rb']
5
+
6
+ dirs.flatten.map { |p|
7
+ if File.directory? p then
8
+ Dir[File.join(p, '**', "*.{#{extensions.join(',')}}")]
9
+ else
10
+ p
11
+ end
12
+ }.flatten.sort
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,63 @@
1
+ module Watchr
2
+ class Smell
3
+
4
+ #
5
+ # Method complexity is high.
6
+ #
7
+ COMPLEX_METHOD = :complex_method
8
+
9
+ #
10
+ # Method complexity is very high.
11
+ #
12
+ VERY_COMPLEX_METHOD = :very_complex_method
13
+
14
+ #
15
+ # Object (class / module) total complexity is high.
16
+ #
17
+ COMPLEX_OBJECT = :complex_object
18
+
19
+ #
20
+ # Object (class / module) total complexity is very high.
21
+ #
22
+ VERY_COMPLEX_OBJECT = :very_complex_object
23
+
24
+ #
25
+ # Code in multiple places is identical.
26
+ #
27
+ IDENTICAL_CODE = :identical_code
28
+
29
+ #
30
+ # Code in multiple places is similar (not identical).
31
+ #
32
+ SIMILAR_CODE = :similar_code
33
+
34
+ def initialize(type, context, description, locations)
35
+ @type = type
36
+ @context = context
37
+ @description = description
38
+ @locations = []
39
+
40
+ Array(locations).each {|l| add_location(l)}
41
+ end
42
+
43
+ def type
44
+ @type
45
+ end
46
+
47
+ def locations
48
+ @locations
49
+ end
50
+
51
+ def description
52
+ @description
53
+ end
54
+
55
+ def context
56
+ @context
57
+ end
58
+
59
+ def add_location(location)
60
+ @locations << location
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,19 @@
1
+ module Watchr
2
+ class SmellsCollector
3
+ def initialize
4
+ @smells = Set.new
5
+ end
6
+
7
+ def add(smell)
8
+ @smells.add(smell)
9
+ end
10
+
11
+ def all
12
+ @smells
13
+ end
14
+
15
+ def empty?
16
+ @smells.empty?
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,3 @@
1
+ module Watchr
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,21 @@
1
+ module Baz
2
+ class Foo
3
+ attr_reader :bar
4
+
5
+ def bar
6
+ if true == false
7
+ return false
8
+ else
9
+ return true
10
+ end
11
+ end
12
+
13
+ def self.bar
14
+ if true == false
15
+ return false
16
+ else
17
+ return true
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,9 @@
1
+ class Module
2
+ def bar
3
+ if true == false
4
+ return false
5
+ else
6
+ return true
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,18 @@
1
+ require 'rspec'
2
+ require 'shoulda/matchers/active_model'
3
+
4
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
5
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
6
+
7
+ # Requires supporting files with custom matchers and macros, etc,
8
+ # in ./support/ and its subdirectories.
9
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
10
+
11
+ # Include ActiveModel matchers from Shoulda into RSpec Matchers
12
+ module RSpec::Matchers
13
+ include Shoulda::Matchers::ActiveModel
14
+ end
15
+
16
+ RSpec.configure do |config|
17
+ config.mock_with :mocha
18
+ end
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+ require 'watchr/analyse'
3
+
4
+ describe Watchr::Analyse do
5
+ let(:analyse) { Watchr::Analyse.new('spec/fixtures/') }
6
+
7
+ describe '#files' do
8
+ subject { analyse.files }
9
+
10
+ its(:count) { should == 2 }
11
+ its(:first) { subject.class.should == Watchr::FileAnalyse }
12
+ end
13
+ end
@@ -0,0 +1,30 @@
1
+ require 'spec_helper'
2
+ require 'watchr/file_analyse'
3
+
4
+ describe Watchr::FileAnalyse do
5
+ let(:path) { 'spec/fixtures/class.rb' }
6
+
7
+ let(:file_analyse) { Watchr::FileAnalyse.new(path) }
8
+
9
+ describe '#path' do
10
+ subject { file_analyse.path }
11
+
12
+ it { should == path }
13
+ end
14
+
15
+ describe '#smelly?' do
16
+ subject { file_analyse.smelly? }
17
+
18
+ context 'with no smells' do
19
+ it { should be_false }
20
+ end
21
+
22
+ context 'with smells' do
23
+ let(:smell) { stub('smell') }
24
+
25
+ before { file_analyse.stubs(:smells).returns([smell]) }
26
+
27
+ it { should be_true }
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,30 @@
1
+ require 'spec_helper'
2
+ require 'watchr/flay_metric/report'
3
+
4
+ describe Watchr::FlayMetric::Report do
5
+ let(:report) {
6
+ Watchr::FlayMetric::Report.new('spec/fixtures/')
7
+ }
8
+
9
+ describe '#total_score' do
10
+ subject { report.total_score }
11
+
12
+ it { should == 52 }
13
+ end
14
+
15
+ describe '#duplications' do
16
+ describe '.first' do
17
+ subject { report.duplications.first }
18
+
19
+ describe 'locations' do
20
+ subject { report.duplications.first.locations }
21
+
22
+ its(:first) { subject.file.should == 'spec/fixtures/class.rb' }
23
+ its(:first) { subject.line.should == 5 }
24
+
25
+ its(:last) { subject.file.should == 'spec/fixtures/module.rb' }
26
+ its(:last) { subject.line.should == 2 }
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,90 @@
1
+ require 'spec_helper'
2
+ require 'watchr/flog_metric/report'
3
+
4
+ describe Watchr::FlogMetric::Report do
5
+ let(:flog_report) {
6
+ Watchr::FlogMetric::Report.new([
7
+ 'spec/fixtures/class.rb',
8
+ 'spec/fixtures/module.rb'
9
+ ])
10
+ }
11
+
12
+ describe '#total_score' do
13
+ subject { flog_report.total_score }
14
+
15
+ it { should == 6 }
16
+ end
17
+
18
+ describe '#classes' do
19
+ describe 'Foo' do
20
+ subject { flog_report.classes.first }
21
+
22
+ its(:name) { should == 'Baz::Foo' }
23
+ its(:total_score) { should == 4.5 }
24
+ its(:total_methods_score) { should == 3.4 }
25
+
26
+ describe '#location' do
27
+ subject { flog_report.classes.first.location }
28
+
29
+ its(:file) { should == 'spec/fixtures/class.rb' }
30
+ end
31
+
32
+
33
+ describe '.methods' do
34
+ describe '.last' do
35
+ subject { flog_report.classes.first.methods.last }
36
+
37
+ its(:name) { should == 'bar' }
38
+ its(:full_name) { should == 'Baz::Foo#bar' }
39
+ its(:total_score) { should == 1.7 }
40
+ its(:clazz) { should == flog_report.classes.first }
41
+
42
+ describe '#location' do
43
+ subject { flog_report.classes.first.methods.last.location }
44
+
45
+ its(:file) { should == 'spec/fixtures/class.rb' }
46
+ its(:line) { should == 5 }
47
+ end
48
+ end
49
+
50
+ describe '.first' do
51
+ subject { flog_report.classes.first.methods.first }
52
+
53
+ its(:name) { should == 'bar' }
54
+ its(:full_name) { should == 'Baz::Foo::bar' }
55
+ its(:total_score) { should == 1.7 }
56
+ its(:clazz) { should == flog_report.classes.first }
57
+
58
+ describe '#location' do
59
+ subject { flog_report.classes.first.methods.first.location }
60
+
61
+ its(:file) { should == 'spec/fixtures/class.rb' }
62
+ its(:line) { should == 13 }
63
+ end
64
+
65
+ end
66
+ end
67
+ end
68
+ end
69
+
70
+ describe '#by_file' do
71
+ subject { flog_report.classes_by_file('fixture') }
72
+
73
+ let(:classes) { [klass] }
74
+
75
+ before { flog_report.stubs(:classes).returns(classes) }
76
+
77
+ context 'with matching file' do
78
+ let(:klass) { stub('klass', :file => 'fixture') }
79
+
80
+ it { should include(klass) }
81
+ end
82
+
83
+ context 'without matching file' do
84
+ let(:klass) { stub('klass', :file => 'blah') }
85
+
86
+ it { should_not include(klass) }
87
+ end
88
+ end
89
+ end
90
+
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+ require 'watchr/location'
3
+
4
+ describe Watchr::Location do
5
+ let(:location) { Watchr::Location.new('foo.rb', 42) }
6
+
7
+ subject { location }
8
+
9
+ its(:file) { should == 'foo.rb' }
10
+ its(:line) { should == 42 }
11
+
12
+ describe '.from_path' do
13
+ subject { Watchr::Location.from_path(path) }
14
+
15
+ context 'with line' do
16
+ let(:path) { 'foo.rb:21' }
17
+
18
+ its(:file) { should == 'foo.rb' }
19
+ its(:line) { should == 21 }
20
+ end
21
+
22
+ context 'without line' do
23
+ let(:path) { 'foo.rb' }
24
+
25
+ its(:file) { should == 'foo.rb' }
26
+ its(:line) { should be_nil }
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,11 @@
1
+ require 'spec_helper'
2
+ require 'watchr/paths'
3
+
4
+ describe Watchr::Paths do
5
+ describe '.files_by_dirs' do
6
+
7
+ subject { Watchr::Paths.files_by_dirs('spec/fixtures/') }
8
+
9
+ it { should include('spec/fixtures/class.rb') }
10
+ end
11
+ end
@@ -0,0 +1,45 @@
1
+ require 'spec_helper'
2
+ require 'watchr/smell'
3
+
4
+ describe Watchr::Smell do
5
+
6
+ let(:type) { 'foo' }
7
+
8
+ let(:location) { 'location' }
9
+
10
+ let(:locations) { location }
11
+
12
+ let(:description) { 'description' }
13
+
14
+ let(:context) { 'context' }
15
+
16
+ let(:smell) { Watchr::Smell.new(type, context, description, locations) }
17
+
18
+ subject { smell }
19
+
20
+ describe '#type' do
21
+ its(:type) { should == type }
22
+ end
23
+
24
+ describe '#locations' do
25
+ subject { smell.locations }
26
+
27
+ context 'one location' do
28
+ it { should == [location] }
29
+ end
30
+
31
+ context 'multiple locations' do
32
+ let(:locations) { [location, location] }
33
+
34
+ it { should == [location, location] }
35
+ end
36
+ end
37
+
38
+ describe '#description' do
39
+ its(:description) { should == description }
40
+ end
41
+
42
+ describe '#context' do
43
+ its(:context) { should == context }
44
+ end
45
+ end
@@ -0,0 +1,42 @@
1
+ require 'spec_helper'
2
+ require 'watchr/smells_collector'
3
+
4
+ describe Watchr::SmellsCollector do
5
+ let(:collector) { Watchr::SmellsCollector.new }
6
+
7
+ describe '#all' do
8
+
9
+ subject { collector.all }
10
+
11
+ context 'with no smells' do
12
+ it { should be_empty }
13
+ end
14
+
15
+ context 'with smells' do
16
+ let(:smell) { stub('smell') }
17
+
18
+ before { collector.add(smell) }
19
+
20
+ it { should_not be_empty }
21
+ its(:first) { should == smell }
22
+ end
23
+ end
24
+
25
+ describe '#empty?' do
26
+ subject { collector.empty? }
27
+
28
+ context 'with no smells' do
29
+ it { should be_true }
30
+ end
31
+
32
+ context 'with smells' do
33
+ let(:smell) { stub('smell') }
34
+
35
+ before { collector.add(smell) }
36
+
37
+ it { should be_false }
38
+ end
39
+ end
40
+
41
+
42
+ end
data/watchr.gemspec ADDED
@@ -0,0 +1,27 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "watchr/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "ruby-watchr"
7
+ s.version = Watchr::VERSION
8
+ s.authors = ["Petr Janda"]
9
+ s.email = ["petrjanda@me.com"]
10
+ s.homepage = ""
11
+ s.summary = 'Ruby static code analysis'
12
+ s.description = 'Utility to gather summary of code smells according to multiple analysers.'
13
+
14
+ s.rubyforge_project = "watchr"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+
21
+ # specify any dependencies here; for example:
22
+ # s.add_development_dependency "rspec"
23
+ # s.add_runtime_dependency "rest-client"
24
+ s.add_dependency 'flog'
25
+ s.add_dependency 'flay'
26
+ s.add_dependency 'ruby2ruby'
27
+ end
metadata ADDED
@@ -0,0 +1,142 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ruby-watchr
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 0
8
+ - 1
9
+ version: 0.0.1
10
+ platform: ruby
11
+ authors:
12
+ - Petr Janda
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2012-07-05 00:00:00 +02:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: flog
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ segments:
29
+ - 0
30
+ version: "0"
31
+ type: :runtime
32
+ version_requirements: *id001
33
+ - !ruby/object:Gem::Dependency
34
+ name: flay
35
+ prerelease: false
36
+ requirement: &id002 !ruby/object:Gem::Requirement
37
+ none: false
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ segments:
42
+ - 0
43
+ version: "0"
44
+ type: :runtime
45
+ version_requirements: *id002
46
+ - !ruby/object:Gem::Dependency
47
+ name: ruby2ruby
48
+ prerelease: false
49
+ requirement: &id003 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ segments:
55
+ - 0
56
+ version: "0"
57
+ type: :runtime
58
+ version_requirements: *id003
59
+ description: Utility to gather summary of code smells according to multiple analysers.
60
+ email:
61
+ - petrjanda@me.com
62
+ executables: []
63
+
64
+ extensions: []
65
+
66
+ extra_rdoc_files: []
67
+
68
+ files:
69
+ - .gitignore
70
+ - .rspec
71
+ - .rvmrc
72
+ - Gemfile
73
+ - Rakefile
74
+ - lib/watchr.rb
75
+ - lib/watchr/analyse.rb
76
+ - lib/watchr/file_analyse.rb
77
+ - lib/watchr/flay_metric/diff.rb
78
+ - lib/watchr/flay_metric/report.rb
79
+ - lib/watchr/flog_metric/class.rb
80
+ - lib/watchr/flog_metric/method.rb
81
+ - lib/watchr/flog_metric/report.rb
82
+ - lib/watchr/location.rb
83
+ - lib/watchr/paths.rb
84
+ - lib/watchr/smell.rb
85
+ - lib/watchr/smells_collector.rb
86
+ - lib/watchr/version.rb
87
+ - spec/fixtures/class.rb
88
+ - spec/fixtures/module.rb
89
+ - spec/spec_helper.rb
90
+ - spec/watchr/analyse_spec.rb
91
+ - spec/watchr/file_analyse_spec.rb
92
+ - spec/watchr/flay/report_spec.rb
93
+ - spec/watchr/flog_metric/flog_matric/flog_report_spec.rb
94
+ - spec/watchr/location_spec.rb
95
+ - spec/watchr/paths_spec.rb
96
+ - spec/watchr/smell_spec.rb
97
+ - spec/watchr/smells_collector_spec.rb
98
+ - watchr.gemspec
99
+ has_rdoc: true
100
+ homepage: ""
101
+ licenses: []
102
+
103
+ post_install_message:
104
+ rdoc_options: []
105
+
106
+ require_paths:
107
+ - lib
108
+ required_ruby_version: !ruby/object:Gem::Requirement
109
+ none: false
110
+ requirements:
111
+ - - ">="
112
+ - !ruby/object:Gem::Version
113
+ segments:
114
+ - 0
115
+ version: "0"
116
+ required_rubygems_version: !ruby/object:Gem::Requirement
117
+ none: false
118
+ requirements:
119
+ - - ">="
120
+ - !ruby/object:Gem::Version
121
+ segments:
122
+ - 0
123
+ version: "0"
124
+ requirements: []
125
+
126
+ rubyforge_project: watchr
127
+ rubygems_version: 1.3.7
128
+ signing_key:
129
+ specification_version: 3
130
+ summary: Ruby static code analysis
131
+ test_files:
132
+ - spec/fixtures/class.rb
133
+ - spec/fixtures/module.rb
134
+ - spec/spec_helper.rb
135
+ - spec/watchr/analyse_spec.rb
136
+ - spec/watchr/file_analyse_spec.rb
137
+ - spec/watchr/flay/report_spec.rb
138
+ - spec/watchr/flog_metric/flog_matric/flog_report_spec.rb
139
+ - spec/watchr/location_spec.rb
140
+ - spec/watchr/paths_spec.rb
141
+ - spec/watchr/smell_spec.rb
142
+ - spec/watchr/smells_collector_spec.rb