jsmetric4java 0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. data/.gitignore +7 -0
  2. data/.rvmrc +1 -0
  3. data/Gemfile +8 -0
  4. data/README +16 -0
  5. data/Rakefile +37 -0
  6. data/bin/jsmetric4java +20 -0
  7. data/boot.rb +5 -0
  8. data/build +1 -0
  9. data/features/cyclometric_complexity/boolean_complexity_counting.feature +46 -0
  10. data/features/cyclometric_complexity/case_complexity_counting.feature +117 -0
  11. data/features/cyclometric_complexity/exception_complexity_counting.feature +81 -0
  12. data/features/cyclometric_complexity/function_detection.feature +128 -0
  13. data/features/cyclometric_complexity/if_else_complexity_counting.feature +178 -0
  14. data/features/cyclometric_complexity/loop_complexity_counting.feature +81 -0
  15. data/features/graphing/draw_basic_graph.feature +14 -0
  16. data/features/reporting/report.feature +13 -0
  17. data/features/sample_js_files_for_test/foobar.js +30 -0
  18. data/features/step_definitions/cyclometric_complexity_steps.rb +31 -0
  19. data/features/step_definitions/graph_steps.rb +10 -0
  20. data/features/step_definitions/reporting_steps.rb +14 -0
  21. data/features/support/env.rb +1 -0
  22. data/jsgraphlib/Curry-1.0.1.js +29 -0
  23. data/jsgraphlib/dracula_algorithms.js +599 -0
  24. data/jsgraphlib/dracula_graffle.js +106 -0
  25. data/jsgraphlib/dracula_graph.js +534 -0
  26. data/jsgraphlib/graphtest.html +57 -0
  27. data/jsgraphlib/jquery-1.4.2.min.js +154 -0
  28. data/jsgraphlib/jsgraphsource.js +12 -0
  29. data/jsgraphlib/raphael-min.js +7 -0
  30. data/jsgraphlib/seedrandom.js +266 -0
  31. data/jsmetric.gemspec +23 -0
  32. data/lib/cc_report.rb +24 -0
  33. data/lib/complexity_analyser.rb +90 -0
  34. data/lib/fulljslint.js +6100 -0
  35. data/lib/graphing/graph_analyser.rb +19 -0
  36. data/lib/js_lint.rb +23 -0
  37. data/lib/json2.js +480 -0
  38. data/lib/options.js +24 -0
  39. data/lib/report.rb +26 -0
  40. data/lib/utils.rb +18 -0
  41. data/lib/version.rb +3 -0
  42. data/spec/spec_helper.rb +1 -0
  43. data/tasks/dev.rb +4 -0
  44. data/tasks/run.rb +55 -0
  45. metadata +129 -0
data/.gitignore ADDED
@@ -0,0 +1,7 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
5
+ .idea
6
+ .DS_Store
7
+ vendor/cache
data/.rvmrc ADDED
@@ -0,0 +1 @@
1
+ rvm jruby@jsmetric4java
data/Gemfile ADDED
@@ -0,0 +1,8 @@
1
+ source "http://rubygems.org"
2
+ gemspec
3
+
4
+ group :development do
5
+ gem 'rake', '~> 0.8.7'
6
+ gem 'rspec', '~> 2.4.0'
7
+ gem 'cucumber', '~> 0.10.0'
8
+ end
data/README ADDED
@@ -0,0 +1,16 @@
1
+ [WARNING: This project is not yet ready for proper use. Its very much an alpha at the moment]
2
+
3
+ Dependencies: (Jruby 1.6.1 or greater)
4
+
5
+ *** Installation
6
+
7
+ $ gem install jsmetric4java
8
+
9
+
10
+ *** Usage
11
+
12
+ Cyclometric complexity for a file:
13
+ $ ./bin/jsmetric4java path_to_js_file
14
+
15
+ Cyclometric complexity for all .js files in a Directory
16
+ $ ./bin/jsmetric4java path_to_dir
data/Rakefile ADDED
@@ -0,0 +1,37 @@
1
+ require 'bundler'
2
+ require "bundler/setup"
3
+ require "rubygems"
4
+
5
+ Bundler::GemHelper.install_tasks
6
+
7
+ PROJECT_ROOT = File.expand_path("..", __FILE__)
8
+ $:.unshift "#{PROJECT_ROOT}/lib"
9
+
10
+ require 'rake'
11
+ require 'rake/testtask'
12
+ require 'rake/rdoctask'
13
+
14
+ # Cucumber configurations
15
+ require 'cucumber/rake/task'
16
+ Cucumber::Rake::Task.new do |t|
17
+ t.cucumber_opts = "--format pretty"
18
+ end
19
+
20
+ # RSpec
21
+
22
+ require 'rspec/core/rake_task'
23
+ RSpec::Core::RakeTask.new(:spec)
24
+
25
+
26
+ # other Project tasks
27
+ Dir[File.join(File.dirname(__FILE__),"tasks","*.rb")].each {|file| require file }
28
+
29
+ namespace :jsmetrics do
30
+ desc "master build"
31
+ task :build => [:spec, "cucumber"]
32
+ end
33
+
34
+ task :default => ["jsmetrics:build"]
35
+
36
+
37
+
data/bin/jsmetric4java ADDED
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "rubygems"
4
+ require "bundler/setup"
5
+
6
+ lib = File.expand_path(File.dirname(__FILE__) + '/../lib')
7
+ $LOAD_PATH.unshift(lib) if File.directory?(lib) && !$LOAD_PATH.include?(lib)
8
+
9
+
10
+ args = ARGV.dup
11
+ ARGV.clear
12
+ begin
13
+ file_path = args.shift.strip
14
+ rescue
15
+ puts "Missing js file or directory as argument"
16
+ exit false
17
+ end
18
+
19
+ require 'report'
20
+ puts Report.for file_path
data/boot.rb ADDED
@@ -0,0 +1,5 @@
1
+ require "rubygems"
2
+ require "bundler/setup"
3
+
4
+ Dir[File.join(File.dirname(__FILE__),"lib","*.rb")].each {|file| require file }
5
+ Dir[File.join(File.dirname(__FILE__),"lib","graphing","*.rb")].each {|file| require file }
data/build ADDED
@@ -0,0 +1 @@
1
+ bundle exec rake
@@ -0,0 +1,46 @@
1
+ @booloperator
2
+ Feature: Calculate complexity for code that includes BOOLEAN decisions
3
+
4
+ Scenario: IF statement with BOOLEAN &&
5
+ Given javascript code as:
6
+ """
7
+ function foo() {
8
+ var bar,baz;
9
+ if(bar && baz) {}
10
+ };
11
+ """
12
+ When I run the complexity analysis on it
13
+ Then the complexity is reported as "3"
14
+
15
+ Scenario: IF statement with BOOLEAN ||
16
+ Given javascript code as:
17
+ """
18
+ function foo() {
19
+ var bar,baz;
20
+ if(bar || baz) {}
21
+ };
22
+ """
23
+ When I run the complexity analysis on it
24
+ Then the complexity is reported as "3"
25
+
26
+ Scenario: IF statement with multiple BOOLEAN &&
27
+ Given javascript code as:
28
+ """
29
+ function foo() {
30
+ var bar,baz;
31
+ if(bar && baz && bar) {}
32
+ };
33
+ """
34
+ When I run the complexity analysis on it
35
+ Then the complexity is reported as "4"
36
+
37
+ Scenario: IF statement with multiple BOOLEAN operators
38
+ Given javascript code as:
39
+ """
40
+ function foo() {
41
+ var bar,baz;
42
+ if(bar && baz || bar && baz) {}
43
+ };
44
+ """
45
+ When I run the complexity analysis on it
46
+ Then the complexity is reported as "5"
@@ -0,0 +1,117 @@
1
+ @switch
2
+ Feature: Calculate CASE/DEFAULT complexity for a stand alone Javascript function
3
+
4
+ Scenario: SWITCH with DEFAULT only
5
+ Given javascript code as:
6
+ """
7
+ function foo() {
8
+ var bar;
9
+ switch(bar) {
10
+ default:
11
+ //do something
12
+ }
13
+ }
14
+ """
15
+ When I run the complexity analysis on it
16
+ Then the complexity is reported as "2"
17
+
18
+ Scenario: SWITCH with single CASE statement
19
+ Given javascript code as:
20
+ """
21
+ function foo() {
22
+ var bar;
23
+ switch(bar) {
24
+ case true:
25
+ //do something
26
+ }
27
+ }
28
+ """
29
+ When I run the complexity analysis on it
30
+ Then the complexity is reported as "2"
31
+
32
+ Scenario: SWITCH with single CASE and it breaks out the SWITCH statements
33
+ Given javascript code as:
34
+ """
35
+ function foo() {
36
+ var bar;
37
+ switch(bar) {
38
+ case true:
39
+ //do something
40
+ break;
41
+ }
42
+ }
43
+ """
44
+ When I run the complexity analysis on it
45
+ Then the complexity is reported as "2"
46
+
47
+ Scenario: SWITCH with multiple CASE and each breaks out the SWITCH
48
+ Given javascript code as:
49
+ """
50
+ function foo() {
51
+ var bar;
52
+ switch(bar) {
53
+ case true:
54
+ //do something
55
+ break;
56
+
57
+ case false:
58
+ //do something
59
+ break;
60
+ }
61
+ }
62
+ """
63
+ When I run the complexity analysis on it
64
+ Then the complexity is reported as "3"
65
+
66
+ Scenario: SWITCH with multiple CASE and neither break out the SWITCH
67
+ Given javascript code as:
68
+ """
69
+ function foo() {
70
+ var bar, temp;
71
+
72
+ switch(bar) {
73
+ case true:
74
+ temp = "first"
75
+ //do something
76
+
77
+ case false:
78
+ temp = "second"
79
+ //do something
80
+ }
81
+ }
82
+ """
83
+ When I run the complexity analysis on it
84
+ Then the complexity is reported as "3"
85
+
86
+
87
+ Scenario: SWITCH with multiple CASE with no-ops are considered as a single Case
88
+ Given javascript code as:
89
+ """
90
+ function foo() {
91
+ var bar, temp;
92
+
93
+ switch(bar) {
94
+ case true:
95
+ case false:
96
+ case "blah":
97
+ }
98
+ }
99
+ """
100
+ When I run the complexity analysis on it
101
+ Then the complexity is reported as "2"
102
+
103
+ Scenario: SWITCH with multiple CASE with no-ops and Default
104
+ Given javascript code as:
105
+ """
106
+ function foo() {
107
+ var bar, temp;
108
+
109
+ switch(bar) {
110
+ case true:
111
+ case false:
112
+ default:
113
+ }
114
+ }
115
+ """
116
+ When I run the complexity analysis on it
117
+ Then the complexity is reported as "3"
@@ -0,0 +1,81 @@
1
+ @exceptions
2
+ Feature: Calculate TRY/CATCH complexity for a stand alone Javascript function
3
+
4
+ Scenario: Single TRY CATCH in a function
5
+ Given javascript code as:
6
+ """
7
+ function foo() {
8
+ try
9
+ {
10
+ //Run some code here
11
+ }
12
+ catch(err)
13
+ {
14
+ //Handle errors here
15
+ }
16
+ }
17
+ """
18
+ When I run the complexity analysis on it
19
+ Then the complexity is reported as "2"
20
+
21
+ Scenario: Single TRY FINALLY in a function
22
+ Given javascript code as:
23
+ """
24
+ function foo() {
25
+ try
26
+ {
27
+ //Run some code here
28
+ }
29
+ finally
30
+ {
31
+ //Handle errors here
32
+ }
33
+ }
34
+ """
35
+ When I run the complexity analysis on it
36
+ Then the complexity is reported as "2"
37
+
38
+ Scenario: Single TRY CATCH FINALLY in a function
39
+ Given javascript code as:
40
+ """
41
+ function foo() {
42
+ try
43
+ {
44
+ //Run some code here
45
+ }
46
+ catch(err)
47
+ {
48
+ //Handle errors here
49
+ }
50
+ finally
51
+ {
52
+ //Handle errors here
53
+ }
54
+ }
55
+ """
56
+ When I run the complexity analysis on it
57
+ Then the complexity is reported as "3"
58
+
59
+ Scenario: Nested TRY inside a CATCH in a function
60
+ Given javascript code as:
61
+ """
62
+ function foo() {
63
+ try
64
+ {
65
+ //Run some code here
66
+ }
67
+ catch(err)
68
+ {
69
+
70
+ try
71
+ {
72
+ //Run some code here
73
+ }
74
+ catch (anotherErr)
75
+ {
76
+ //Handle errors here
77
+ }
78
+ }
79
+ """
80
+ When I run the complexity analysis on it
81
+ Then the complexity is reported as "3"
@@ -0,0 +1,128 @@
1
+ @functions
2
+ Feature: Calculate number of functions and their names for a stand alone Javascript snippet
3
+
4
+ Scenario: Only statements and no functions
5
+ Given javascript code as:
6
+ """
7
+ var foo = {} || "";
8
+ var baz = 2;
9
+ """
10
+ When I run the complexity analysis on it
11
+ Then the number of functions is reported as "0"
12
+
13
+ Scenario: Single javascript function
14
+ Given javascript code as:
15
+ """
16
+ function foo() {};
17
+ """
18
+ When I run the complexity analysis on it
19
+ Then the number of functions is reported as "1"
20
+ And the function name is "foo"
21
+
22
+ Scenario: Multiple javascript functions
23
+ Given javascript code as:
24
+ """
25
+ function foo() {};
26
+ function bar() {};
27
+ """
28
+ When I run the complexity analysis on it
29
+ Then the number of functions is reported as "2"
30
+ And the function names are:
31
+ | Name |
32
+ | foo |
33
+ | bar |
34
+
35
+
36
+ Scenario: Multiple javascript functions nested
37
+ Given javascript code as:
38
+ """
39
+ function foo() {
40
+ function bar() {};
41
+ };
42
+ """
43
+ When I run the complexity analysis on it
44
+ Then the number of functions is reported as "2"
45
+
46
+ Scenario: Single outer function with inner private function assigned to a var
47
+ Given javascript code as:
48
+ """
49
+ function foo() {
50
+ var baz = function() {};
51
+ };
52
+ """
53
+ When I run the complexity analysis on it
54
+ Then the number of functions is reported as "2"
55
+ And the function names are:
56
+ | Name |
57
+ | foo |
58
+ | baz |
59
+
60
+ Scenario: Single outer function with inner private function that is unassigned
61
+ Given javascript code as:
62
+ """
63
+ function foo() {
64
+ function bar() {};
65
+ };
66
+ """
67
+ When I run the complexity analysis on it
68
+ Then the number of functions is reported as "2"
69
+ And the function names are:
70
+ | Name |
71
+ | foo |
72
+ | bar |
73
+
74
+ Scenario: Single outer function with inner public function
75
+ Given javascript code as:
76
+ """
77
+ function foo() {
78
+ this.baz.flaz = function() {};
79
+ };
80
+ """
81
+ When I run the complexity analysis on it
82
+ Then the number of functions is reported as "2"
83
+ And the function names are:
84
+ | Name |
85
+ | foo |
86
+ | this.baz.flaz |
87
+
88
+ Scenario: Single outer Object with inner public function
89
+ Given javascript code as:
90
+ """
91
+ var foo = {
92
+ flaz : function() {},
93
+ blah : "",
94
+ baz : function() {}
95
+ };
96
+ """
97
+ When I run the complexity analysis on it
98
+ Then the number of functions is reported as "2"
99
+ And the function names are:
100
+ | Name |
101
+ | flaz |
102
+ | baz |
103
+
104
+ Scenario: Single outer function with inner annonymous function
105
+ Given javascript code as:
106
+ """
107
+ function foo() {
108
+ return function() {};
109
+ };
110
+ """
111
+ When I run the complexity analysis on it
112
+ Then the number of functions is reported as "2"
113
+ And the function names are:
114
+ | Name |
115
+ | foo |
116
+ | Annonymous |
117
+
118
+
119
+ Scenario: Single javascript function containing the string "function"
120
+ Given javascript code as:
121
+ """
122
+ function foo() {
123
+ return "function";
124
+ };
125
+ """
126
+ When I run the complexity analysis on it
127
+ Then the number of functions is reported as "1"
128
+ And the function name is "foo"
@@ -0,0 +1,178 @@
1
+ @ifelse
2
+ Feature: Calculate IF/ELSE complexity for a stand alone Javascript function
3
+
4
+ Scenario: No branches
5
+ Given javascript code as:
6
+ """
7
+ function foo() { };
8
+ """
9
+ When I run the complexity analysis on it
10
+ Then the complexity is reported as "1"
11
+
12
+ Scenario: Just one IF statement
13
+ Given javascript code as:
14
+ """
15
+ function foo() {
16
+ if (true) {
17
+ // do something
18
+ }
19
+ }
20
+ """
21
+ When I run the complexity analysis on it
22
+ Then the complexity is reported as "2"
23
+
24
+ Scenario: 2 sequential IF statements
25
+ Given javascript code as:
26
+ """
27
+ function foo() {
28
+ if (true) {
29
+ // do something
30
+ }
31
+ if (true) {
32
+ // do something else
33
+ }
34
+ }
35
+ """
36
+ When I run the complexity analysis on it
37
+ Then the complexity is reported as "3"
38
+
39
+ Scenario: 2 nested IF statements
40
+ Given javascript code as:
41
+ """
42
+ function foo() {
43
+ if (true) {
44
+ // do something
45
+ if (true) {
46
+ // do something else
47
+ }
48
+ }
49
+ }
50
+ """
51
+ When I run the complexity analysis on it
52
+ Then the complexity is reported as "3"
53
+
54
+ Scenario: A single IF with Else statement
55
+ Given javascript code as:
56
+ """
57
+ function foo() {
58
+ if (true) {
59
+ // do something
60
+ }
61
+ else {
62
+ // do something else
63
+ }
64
+ }
65
+ """
66
+ When I run the complexity analysis on it
67
+ Then the complexity is reported as "2"
68
+
69
+ Scenario: 2 nested IF/Else statements
70
+ Given javascript code as:
71
+ """
72
+ function foo() {
73
+ if (true) {
74
+ // do something
75
+ if (true) {
76
+ // do something else
77
+ }
78
+ else {
79
+ // do this
80
+ }
81
+ }
82
+ else {
83
+ // do that
84
+ }
85
+ }
86
+ """
87
+ When I run the complexity analysis on it
88
+ Then the complexity is reported as "3"
89
+
90
+ Scenario: An IF-ELSE-IF type scenario
91
+ Given javascript code as:
92
+ """
93
+ function foo() {
94
+ if (true) {
95
+ }
96
+ else if(true) {
97
+ // do that
98
+ }
99
+ }
100
+ """
101
+ When I run the complexity analysis on it
102
+ Then the complexity is reported as "3"
103
+
104
+ Scenario: An IF-ELSE-IF and then ELSE type scenario
105
+ Given javascript code as:
106
+ """
107
+ function foo() {
108
+ if (true) {
109
+ // do something
110
+ }
111
+ else if(true) {
112
+ // do this
113
+ }
114
+ else {
115
+ // do that
116
+ }
117
+ }
118
+ """
119
+ When I run the complexity analysis on it
120
+ Then the complexity is reported as "3"
121
+
122
+
123
+ Scenario: A nested IF-ELSE-IF type scenario
124
+ Given javascript code as:
125
+ """
126
+ function foo() {
127
+ if (true) {
128
+ if (true) {
129
+ }
130
+ else if(true) {
131
+ // do that
132
+ }
133
+ }
134
+ }
135
+ """
136
+ When I run the complexity analysis on it
137
+ Then the complexity is reported as "4"
138
+
139
+ Scenario: Multiple nested IF-ELSE-IF type scenario
140
+ Given javascript code as:
141
+ """
142
+ function foo() {
143
+ if (true) {
144
+ if (true) {
145
+ // do this
146
+ }
147
+ else if(true) {
148
+ // do that
149
+ }
150
+ }
151
+ else if(true) {
152
+ // do something
153
+ }
154
+ }
155
+ """
156
+ When I run the complexity analysis on it
157
+ Then the complexity is reported as "5"
158
+
159
+ Scenario: IF statement implied with ?
160
+ Given javascript code as:
161
+ """
162
+ function foo() {
163
+ (true)? true : false;
164
+ }
165
+ """
166
+ When I run the complexity analysis on it
167
+ Then the complexity is reported as "2"
168
+
169
+
170
+ Scenario: IF statement nested inside a ternary operator
171
+ Given javascript code as:
172
+ """
173
+ function foo() {
174
+ (true)? "" : (false) ? true :"" ;
175
+ }
176
+ """
177
+ When I run the complexity analysis on it
178
+ Then the complexity is reported as "3"