reek 0.3.1 → 1.0.0

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 (96) hide show
  1. data/History.txt +20 -0
  2. data/README.txt +4 -80
  3. data/Rakefile +15 -4
  4. data/bin/reek +10 -16
  5. data/config/defaults.reek +53 -0
  6. data/lib/reek.rb +1 -21
  7. data/lib/reek/block_context.rb +37 -0
  8. data/lib/reek/class_context.rb +73 -0
  9. data/lib/reek/code_context.rb +47 -0
  10. data/lib/reek/code_parser.rb +204 -0
  11. data/lib/reek/exceptions.reek +13 -0
  12. data/lib/reek/if_context.rb +25 -0
  13. data/lib/reek/method_context.rb +85 -0
  14. data/lib/reek/module_context.rb +34 -0
  15. data/lib/reek/name.rb +42 -0
  16. data/lib/reek/object_refs.rb +3 -6
  17. data/lib/reek/options.rb +60 -40
  18. data/lib/reek/rake_task.rb +20 -29
  19. data/lib/reek/report.rb +16 -27
  20. data/lib/reek/sexp_formatter.rb +52 -0
  21. data/lib/reek/singleton_method_context.rb +27 -0
  22. data/lib/reek/smell_warning.rb +49 -0
  23. data/lib/reek/smells/control_couple.rb +21 -13
  24. data/lib/reek/smells/duplication.rb +23 -27
  25. data/lib/reek/smells/feature_envy.rb +18 -25
  26. data/lib/reek/smells/large_class.rb +32 -17
  27. data/lib/reek/smells/long_method.rb +24 -16
  28. data/lib/reek/smells/long_parameter_list.rb +25 -18
  29. data/lib/reek/smells/long_yield_list.rb +7 -9
  30. data/lib/reek/smells/nested_iterators.rb +13 -9
  31. data/lib/reek/smells/smell_detector.rb +66 -0
  32. data/lib/reek/smells/smells.rb +71 -10
  33. data/lib/reek/smells/uncommunicative_name.rb +49 -41
  34. data/lib/reek/smells/utility_function.rb +18 -18
  35. data/lib/reek/source.rb +116 -0
  36. data/lib/reek/spec.rb +146 -0
  37. data/lib/reek/stop_context.rb +62 -0
  38. data/lib/reek/yield_call_context.rb +14 -0
  39. data/reek.gemspec +42 -0
  40. data/spec/integration/reek_source_spec.rb +20 -0
  41. data/spec/{script_spec.rb → integration/script_spec.rb} +11 -24
  42. data/spec/reek/class_context_spec.rb +198 -0
  43. data/spec/reek/code_context_spec.rb +92 -0
  44. data/spec/reek/code_parser_spec.rb +44 -0
  45. data/spec/reek/config_spec.rb +42 -0
  46. data/spec/reek/if_context_spec.rb +17 -0
  47. data/spec/reek/method_context_spec.rb +52 -0
  48. data/spec/reek/module_context_spec.rb +38 -0
  49. data/spec/reek/options_spec.rb +2 -28
  50. data/spec/reek/report_spec.rb +6 -40
  51. data/spec/reek/sexp_formatter_spec.rb +31 -0
  52. data/spec/reek/singleton_method_context_spec.rb +17 -0
  53. data/spec/reek/smells/control_couple_spec.rb +10 -18
  54. data/spec/reek/smells/duplication_spec.rb +53 -32
  55. data/spec/reek/smells/feature_envy_spec.rb +87 -49
  56. data/spec/reek/smells/large_class_spec.rb +45 -4
  57. data/spec/reek/smells/long_method_spec.rb +25 -41
  58. data/spec/reek/smells/long_parameter_list_spec.rb +30 -76
  59. data/spec/reek/smells/nested_iterators_spec.rb +19 -29
  60. data/spec/reek/smells/smell_spec.rb +9 -18
  61. data/spec/reek/smells/uncommunicative_name_spec.rb +88 -53
  62. data/spec/reek/smells/utility_function_spec.rb +45 -44
  63. data/spec/samples/inline_spec.rb +40 -0
  64. data/spec/samples/optparse_spec.rb +100 -0
  65. data/spec/samples/redcloth_spec.rb +93 -0
  66. data/spec/spec_helper.rb +3 -1
  67. data/tasks/reek.rake +1 -10
  68. data/tasks/rspec.rake +16 -35
  69. metadata +43 -46
  70. data/lib/reek/checker.rb +0 -66
  71. data/lib/reek/class_checker.rb +0 -25
  72. data/lib/reek/file_checker.rb +0 -20
  73. data/lib/reek/method_checker.rb +0 -198
  74. data/lib/reek/printer.rb +0 -154
  75. data/lib/reek/smells/smell.rb +0 -56
  76. data/lib/reek/version.rb +0 -9
  77. data/setup.rb +0 -1585
  78. data/spec/integration_spec.rb +0 -30
  79. data/spec/reek/class_checker_spec.rb +0 -48
  80. data/spec/reek/method_checker_spec.rb +0 -67
  81. data/spec/reek/printer_spec.rb +0 -30
  82. data/spec/reek_source_spec.rb +0 -12
  83. data/spec/samples/inline.reek +0 -27
  84. data/spec/samples/optparse.reek +0 -79
  85. data/spec/samples/optparse/date.rb +0 -17
  86. data/spec/samples/optparse/shellwords.rb +0 -6
  87. data/spec/samples/optparse/time.rb +0 -10
  88. data/spec/samples/optparse/uri.rb +0 -6
  89. data/spec/samples/optparse/version.rb +0 -70
  90. data/spec/samples/redcloth.reek +0 -65
  91. data/tasks/samples.rake +0 -17
  92. data/website/index.html +0 -71
  93. data/website/index.txt +0 -40
  94. data/website/javascripts/rounded_corners_lite.inc.js +0 -285
  95. data/website/stylesheets/screen.css +0 -138
  96. data/website/template.rhtml +0 -48
@@ -1,30 +0,0 @@
1
- require File.dirname(__FILE__) + '/spec_helper.rb'
2
-
3
- describe 'Integration test:' do
4
- Dir['spec/samples/*.rb'].each do |source|
5
- describe source do
6
- before :each do
7
- @expected = IO.readlines(source.sub(/\.rb/, '.reek'))
8
- @expected.each {|line| line.chomp!}
9
- end
10
-
11
- it 'should report the correct smells' do
12
- actual = `ruby -Ilib bin/reek #{source} 2>/dev/null`.split(/\n/)
13
- @expected.zip(actual).each do |p|
14
- actual_line = p[1] ? p[1].chomp : p[1]
15
- actual_line.should == p[0]
16
- end
17
- actual.length.should == @expected.length
18
- end
19
-
20
- it 'should report the correct smells in smell order' do
21
- actual = `ruby -Ilib bin/reek --sort smell #{source} 2>/dev/null`.split(/\n/)
22
- @expected.sort.zip(actual).each do |p|
23
- actual_line = p[1] ? p[1].chomp : p[1]
24
- actual_line.should == p[0]
25
- end
26
- actual.length.should == @expected.length
27
- end
28
- end
29
- end
30
- end
@@ -1,48 +0,0 @@
1
- require File.dirname(__FILE__) + '/../spec_helper.rb'
2
-
3
- require 'reek/class_checker'
4
-
5
- include Reek
6
-
7
- describe ClassChecker do
8
-
9
- before(:each) do
10
- @rpt = []
11
- @cchk = ClassChecker.new(@rpt)
12
- end
13
-
14
- it 'should report Long Parameter List' do
15
- @cchk.check_source('class Inner; def simple(arga, argb, argc, argd) f(3);true end end')
16
- @rpt.length.should == 1
17
- @rpt[0].report.should match(/Inner#simple/)
18
- end
19
-
20
- it 'should report two different methods' do
21
- src = <<EOEX
22
- class Fred
23
- def simple(arga, argb, argc, argd) f(3);true end
24
- def simply(arga, argb, argc, argd) f(3);false end
25
- end
26
- EOEX
27
- @cchk.check_source(src)
28
- @rpt.length.should == 2
29
- @rpt[0].report.should match(/Fred#simple/)
30
- @rpt[1].report.should match(/Fred#simply/)
31
- end
32
-
33
- it 'should report many different methods' do
34
- src = <<EOEX
35
- class Fred
36
- def textile_bq(tag, atts, cite, content) f(3);end
37
- def textile_p(tag, atts, cite, content) f(3);end
38
- def textile_fn_(tag, num, atts, cite, content) f(3);end
39
- def textile_popup_help(name, windowW, windowH) f(3);end
40
- end
41
- EOEX
42
- @cchk.check_source(src)
43
- @rpt.length.should == 3
44
- @rpt[0].report.should match(/Fred#textile_bq/)
45
- @rpt[1].report.should match(/Fred#textile_p/)
46
- end
47
-
48
- end
@@ -1,67 +0,0 @@
1
- require File.dirname(__FILE__) + '/../spec_helper.rb'
2
-
3
- require 'reek/method_checker'
4
- require 'reek/report'
5
-
6
- include Reek
7
-
8
- describe MethodChecker, "with no method definitions" do
9
- before(:each) do
10
- @rpt = Report.new
11
- @cchk = MethodChecker.new(@rpt, 'Thing')
12
- end
13
-
14
- it 'should report no problems for empty source code' do
15
- @cchk.check_source('')
16
- @rpt.should be_empty
17
- end
18
-
19
- it 'should report no problems for empty class' do
20
- @cchk.check_source('class Fred; end')
21
- @rpt.should be_empty
22
- end
23
- end
24
-
25
- describe MethodChecker, 'when given a C extension' do
26
- before(:each) do
27
- @cchk = MethodChecker.new(Report.new, 'Thing')
28
- end
29
-
30
- it 'should ignore :cfunc' do
31
- @cchk.check_object(Enumerable)
32
- end
33
- end
34
-
35
- describe MethodChecker, 'when a yield is the receiver' do
36
- it 'should report no problems' do
37
- source = 'def values(*args)
38
- @to_sql += case
39
- when block_given? then " #{yield.to_sql}"
40
- else " values (#{args.to_sql})"
41
- end
42
- self
43
- end'
44
- rpt = Report.new
45
- chk = MethodChecker.new(rpt, 'Thing')
46
- chk.check_source(source)
47
- rpt.should be_empty
48
- end
49
- end
50
-
51
- describe MethodChecker, '#is_override?' do
52
- it 'should be false for non-override method' do
53
- MethodChecker.is_override?('String', 'gsub').should == false
54
- end
55
-
56
- it 'should be true for overriding method' do
57
- MethodChecker.is_override?('MethodChecker', 'to_s').should == true
58
- end
59
-
60
- it 'should be false for non-existent class' do
61
- MethodChecker.is_override?('Flibble', 'to_s').should == false
62
- end
63
-
64
- it 'should be true for smells' do
65
- MethodChecker.is_override?('UtilityFunction', 'recognise?').should == true
66
- end
67
- end
@@ -1,30 +0,0 @@
1
- require File.dirname(__FILE__) + '/../spec_helper.rb'
2
-
3
- require 'reek/checker'
4
- require 'reek/printer'
5
-
6
- include Reek
7
-
8
- def check(examples)
9
- examples.each do |actual|
10
- it "should format #{actual} correctly" do
11
- sexp = Checker.parse_tree_for(actual)[0]
12
- Printer.print(sexp).should == actual
13
- end
14
- end
15
- end
16
-
17
- describe Printer do
18
- check 'Alpha'
19
- check 'Alpha::Beta'
20
- check '@@fred'
21
- check '`ls`'
22
- check 'array[0]'
23
- check 'array[0, 1, 2]'
24
- check 'obj.method(arg1, arg2)'
25
- check 'obj.method'
26
- check '$1'
27
- check 'o=q.downcase'
28
- check 'true'
29
- check '"-#{q}xxx#{z.size}"'
30
- end
@@ -1,12 +0,0 @@
1
- require File.dirname(__FILE__) + '/spec_helper.rb'
2
-
3
- describe 'Reek source code:' do
4
- Dir['lib/**/*.rb'].each do |source|
5
- describe source do
6
- it 'should report no smells' do
7
- `ruby -Ilib bin/reek #{source}`.should == ''
8
- $?.exitstatus.should == 0
9
- end
10
- end
11
- end
12
- end
@@ -1,27 +0,0 @@
1
- [Duplication] C#build calls $?.==(0) more than once
2
- [Duplication] C#build calls Inline.directory more than once
3
- [Duplication] C#build calls io.puts more than once
4
- [Duplication] C#build calls io.puts(#endif) more than once
5
- [Duplication] C#build calls io.puts(#ifdef __cplusplus) more than once
6
- [Long Method] C#build has approx 61 statements
7
- [Nested Iterators] C#build has nested iterators
8
- [Uncommunicative Name] C#build uses the local variable name 't'
9
- [Uncommunicative Name] C#c uses the method name 'c'
10
- [Duplication] C#crap_for_windoze calls Config::CONFIG[libdir] more than once
11
- [Duplication] C#generate calls result.sub!((?-mix:\A\n), ) more than once
12
- [Duplication] C#generate calls signature[args] more than once
13
- [Duplication] C#generate calls signature[args].map more than once
14
- [Long Method] C#generate has approx 33 statements
15
- [Duplication] C#initialize calls stack.empty? more than once
16
- [Long Method] C#load_cache has approx 7 statements
17
- [Long Method] C#module_name has approx 6 statements
18
- [Feature Envy] C#module_name refers to md5 more than self
19
- [Long Method] C#parse_signature has approx 15 statements
20
- [Control Couple] C#parse_signature is controlled by argument raw
21
- [Utility Function] C#strip_comments doesn't depend on instance state
22
- [Feature Envy] C#strip_comments refers to src more than self
23
- [Large Class] Dir has 31 methods
24
- [Large Class] Module has 34 methods
25
- [Duplication] Module#inline calls Inline.const_get(lang) more than once
26
- [Long Method] Module#inline has approx 12 statements
27
- [Control Couple] Module#inline is controlled by argument options
@@ -1,79 +0,0 @@
1
- [Large Class] AmbiguousArgument has 52 methods
2
- [Long Parameter List] CompletingHash#complete has 4 parameters
3
- [Nested Iterators] CompletingHash#complete has nested iterators
4
- [Long Method] CompletingHash#getopts has approx 17 statements
5
- [Duplication] CompletingHash#make_switch calls default_style.guess(arg=a) more than once
6
- [Duplication] CompletingHash#make_switch calls long.<<(o=q.downcase) more than once
7
- [Duplication] CompletingHash#make_switch calls pattern.method(convert) more than once
8
- [Duplication] CompletingHash#make_switch calls pattern.method(convert).to_proc more than once
9
- [Duplication] CompletingHash#make_switch calls pattern.respond_to?(convert) more than once
10
- [Duplication] CompletingHash#make_switch calls q.downcase more than once
11
- [Duplication] CompletingHash#make_switch calls sdesc.<<("-#{q}") more than once
12
- [Long Method] CompletingHash#make_switch has approx 69 statements
13
- [Nested Iterators] CompletingHash#make_switch has nested iterators
14
- [Uncommunicative Name] CompletingHash#make_switch uses the local variable name 'a'
15
- [Uncommunicative Name] CompletingHash#make_switch uses the local variable name 'n'
16
- [Uncommunicative Name] CompletingHash#make_switch uses the local variable name 'o'
17
- [Uncommunicative Name] CompletingHash#make_switch uses the local variable name 'q'
18
- [Uncommunicative Name] CompletingHash#make_switch uses the local variable name 's'
19
- [Nested Iterators] CompletingHash#match has nested iterators
20
- [Duplication] CompletingHash#order calls argv[0] more than once
21
- [Feature Envy] CompletingHash#order refers to argv more than self
22
- [Duplication] CompletingHash#parse calls argv[0] more than once
23
- [Feature Envy] CompletingHash#parse refers to argv more than self
24
- [Duplication] CompletingHash#parse_in_order calls $!.set_option(arg, true) more than once
25
- [Duplication] CompletingHash#parse_in_order calls cb.call(val) more than once
26
- [Duplication] CompletingHash#parse_in_order calls setter.call(sw.switch_name, val) more than once
27
- [Duplication] CompletingHash#parse_in_order calls sw.block more than once
28
- [Duplication] CompletingHash#parse_in_order calls sw.switch_name more than once
29
- [Long Method] CompletingHash#parse_in_order has approx 30 statements
30
- [Nested Iterators] CompletingHash#parse_in_order has nested iterators
31
- [Control Couple] CompletingHash#parse_in_order is controlled by argument setter
32
- [Duplication] CompletingHash#permute calls argv[0] more than once
33
- [Feature Envy] CompletingHash#permute refers to argv more than self
34
- [Long Parameter List] CompletingHash#summarize has 4 parameters
35
- [Uncommunicative Name] CompletingHash#ver uses the local variable name 'v'
36
- [Control Couple] List#accept is controlled by argument pat
37
- [Feature Envy] List#accept refers to pat more than self
38
- [Uncommunicative Name] List#accept uses the parameter name 't'
39
- [Long Parameter List] List#complete has 4 parameters
40
- [Uncommunicative Name] List#reject uses the parameter name 't'
41
- [Long Parameter List] List#update has 5 parameters
42
- [Long Method] List#update has approx 6 statements
43
- [Control Couple] List#update is controlled by argument lopts
44
- [Control Couple] List#update is controlled by argument sopts
45
- [Uncommunicative Name] List#update uses the local variable name 'o'
46
- [Control Couple] NoArgument#parse is controlled by argument arg
47
- [Duplication] OptionParser#complete calls candidates.size more than once
48
- [Duplication] OptionParser#complete calls k.id2name more than once
49
- [Long Method] OptionParser#complete has approx 23 statements
50
- [Feature Envy] OptionParser#complete refers to candidates more than self
51
- [Uncommunicative Name] OptionParser#complete uses the local variable name 'k'
52
- [Uncommunicative Name] OptionParser#complete uses the local variable name 'v'
53
- [Utility Function] OptionParser#convert doesn't depend on instance state
54
- [Control Couple] OptionalArgument#parse is controlled by argument arg
55
- [Control Couple] ParseError#set_option is controlled by argument eq
56
- [Long Method] PlacedArgument#parse has approx 6 statements
57
- [Control Couple] RequiredArgument#parse is controlled by argument arg
58
- [Uncommunicative Name] Switch#add_banner uses the local variable name 's'
59
- [Long Parameter List] Switch#initialize has 7 parameters
60
- [Duplication] Switch#parse_arg calls s.length more than once
61
- [Long Method] Switch#parse_arg has approx 12 statements
62
- [Feature Envy] Switch#parse_arg refers to arg more than self
63
- [Uncommunicative Name] Switch#parse_arg uses the local variable name 'm'
64
- [Uncommunicative Name] Switch#parse_arg uses the local variable name 's'
65
- [Duplication] Switch#summarize calls block.max more than once
66
- [Duplication] Switch#summarize calls block.max.to_i more than once
67
- [Duplication] Switch#summarize calls indent.+(l) more than once
68
- [Duplication] Switch#summarize calls left.collect more than once
69
- [Duplication] Switch#summarize calls left.shift more than once
70
- [Duplication] Switch#summarize calls left[-1] more than once
71
- [Duplication] Switch#summarize calls s.length more than once
72
- [Long Parameter List] Switch#summarize has 5 parameters
73
- [Long Method] Switch#summarize has approx 27 statements
74
- [Nested Iterators] Switch#summarize has nested iterators
75
- [Feature Envy] Switch#summarize refers to left more than self
76
- [Uncommunicative Name] Switch#summarize uses the local variable name 'l'
77
- [Uncommunicative Name] Switch#summarize uses the local variable name 'r'
78
- [Uncommunicative Name] Switch#summarize uses the local variable name 's'
79
- [Long Yield List] Switch#summarize yields 4 parameters
@@ -1,17 +0,0 @@
1
- require 'optparse'
2
- require 'date'
3
-
4
- OptionParser.accept(DateTime) do |s,|
5
- begin
6
- DateTime.parse(s) if s
7
- rescue ArgumentError
8
- raise OptionParser::InvalidArgument, s
9
- end
10
- end
11
- OptionParser.accept(Date) do |s,|
12
- begin
13
- Date.parse(s) if s
14
- rescue ArgumentError
15
- raise OptionParser::InvalidArgument, s
16
- end
17
- end
@@ -1,6 +0,0 @@
1
- # -*- ruby -*-
2
-
3
- require 'shellwords'
4
- require 'optparse'
5
-
6
- OptionParser.accept(Shellwords) {|s,| Shellwords.shellwords(s)}
@@ -1,10 +0,0 @@
1
- require 'optparse'
2
- require 'time'
3
-
4
- OptionParser.accept(Time) do |s,|
5
- begin
6
- (Time.httpdate(s) rescue Time.parse(s)) if s
7
- rescue
8
- raise OptionParser::InvalidArgument, s
9
- end
10
- end
@@ -1,6 +0,0 @@
1
- # -*- ruby -*-
2
-
3
- require 'optparse'
4
- require 'uri'
5
-
6
- OptionParser.accept(URI) {|s,| URI.parse(s) if s}
@@ -1,70 +0,0 @@
1
- # OptionParser internal utility
2
-
3
- class << OptionParser
4
- def show_version(*pkg)
5
- progname = ARGV.options.program_name
6
- result = false
7
- show = proc do |klass, cname, version|
8
- str = "#{progname}"
9
- unless klass == ::Object and cname == :VERSION
10
- version = version.join(".") if Array === version
11
- str << ": #{klass}" unless klass == Object
12
- str << " version #{version}"
13
- end
14
- [:Release, :RELEASE].find do |rel|
15
- if klass.const_defined?(rel)
16
- str << " (#{klass.const_get(rel)})"
17
- end
18
- end
19
- puts str
20
- result = true
21
- end
22
- if pkg.size == 1 and pkg[0] == "all"
23
- self.search_const(::Object, /\AV(?:ERSION|ersion)\z/) do |klass, cname, version|
24
- unless cname[1] == ?e and klass.const_defined?(:Version)
25
- show.call(klass, cname.intern, version)
26
- end
27
- end
28
- else
29
- pkg.each do |pkg|
30
- begin
31
- pkg = pkg.split(/::|\//).inject(::Object) {|m, c| m.const_get(c)}
32
- v = case
33
- when pkg.const_defined?(:Version)
34
- pkg.const_get(n = :Version)
35
- when pkg.const_defined?(:VERSION)
36
- pkg.const_get(n = :VERSION)
37
- else
38
- n = nil
39
- "unknown"
40
- end
41
- show.call(pkg, n, v)
42
- rescue NameError
43
- end
44
- end
45
- end
46
- result
47
- end
48
-
49
- def each_const(path, klass = ::Object)
50
- path.split(/::|\//).inject(klass) do |klass, name|
51
- raise NameError, path unless Module === klass
52
- klass.constants.grep(/#{name}/i) do |c|
53
- klass.const_defined?(c) or next
54
- c = klass.const_get(c)
55
- end
56
- end
57
- end
58
-
59
- def search_const(klass, name)
60
- klasses = [klass]
61
- while klass = klasses.shift
62
- klass.constants.each do |cname|
63
- klass.const_defined?(cname) or next
64
- const = klass.const_get(cname)
65
- yield klass, cname, const if name === cname
66
- klasses << const if Module === const and const != ::Object
67
- end
68
- end
69
- end
70
- end
@@ -1,65 +0,0 @@
1
- [Long Method] RedCloth#block_markdown_bq has approx 6 statements
2
- [Utility Function] RedCloth#block_markdown_rule doesn't depend on instance state
3
- [Duplication] RedCloth#block_textile_lists calls depth.last more than once
4
- [Duplication] RedCloth#block_textile_lists calls depth.last.length more than once
5
- [Duplication] RedCloth#block_textile_lists calls depth[i] more than once
6
- [Duplication] RedCloth#block_textile_lists calls line_id.-(1) more than once
7
- [Duplication] RedCloth#block_textile_lists calls lines[line_id.-(1)] more than once
8
- [Duplication] RedCloth#block_textile_lists calls tl.length more than once
9
- [Long Method] RedCloth#block_textile_lists has approx 21 statements
10
- [Nested Iterators] RedCloth#block_textile_lists has nested iterators
11
- [Long Method] RedCloth#block_textile_table has approx 19 statements
12
- [Nested Iterators] RedCloth#block_textile_table has nested iterators
13
- [Long Method] RedCloth#blocks has approx 17 statements
14
- [Nested Iterators] RedCloth#blocks has nested iterators
15
- [Control Couple] RedCloth#blocks is controlled by argument deep_code
16
- [Control Couple] RedCloth#check_refs is controlled by argument text
17
- [Duplication] RedCloth#clean_html calls tags[tag] more than once
18
- [Utility Function] RedCloth#clean_html doesn't depend on instance state
19
- [Long Method] RedCloth#clean_html has approx 14 statements
20
- [Nested Iterators] RedCloth#clean_html has nested iterators
21
- [Feature Envy] RedCloth#clean_html refers to tags more than self
22
- [Long Method] RedCloth#clean_white_space has approx 7 statements
23
- [Feature Envy] RedCloth#clean_white_space refers to text more than self
24
- [Utility Function] RedCloth#flush_left doesn't depend on instance state
25
- [Feature Envy] RedCloth#flush_left refers to indt more than self
26
- [Feature Envy] RedCloth#flush_left refers to text more than self
27
- [Utility Function] RedCloth#footnote_ref doesn't depend on instance state
28
- [Long Method] RedCloth#glyphs_textile has approx 9 statements
29
- [Utility Function] RedCloth#h_align doesn't depend on instance state
30
- [Utility Function] RedCloth#htmlesc doesn't depend on instance state
31
- [Feature Envy] RedCloth#htmlesc refers to str more than self
32
- [Utility Function] RedCloth#incoming_entities doesn't depend on instance state
33
- [Nested Iterators] RedCloth#inline has nested iterators
34
- [Long Method] RedCloth#inline_markdown_link has approx 6 statements
35
- [Long Method] RedCloth#inline_markdown_reflink has approx 7 statements
36
- [Long Method] RedCloth#inline_textile_image has approx 16 statements
37
- [Long Method] RedCloth#inline_textile_link has approx 9 statements
38
- [Long Method] RedCloth#inline_textile_span has approx 8 statements
39
- [Nested Iterators] RedCloth#inline_textile_span has nested iterators
40
- [Utility Function] RedCloth#lT doesn't depend on instance state
41
- [Utility Function] RedCloth#no_textile doesn't depend on instance state
42
- [Feature Envy] RedCloth#no_textile refers to text more than self
43
- [Duplication] RedCloth#pba calls $1.length more than once
44
- [Long Method] RedCloth#pba has approx 22 statements
45
- [Control Couple] RedCloth#pba is controlled by argument text_in
46
- [Feature Envy] RedCloth#pba refers to style more than self
47
- [Feature Envy] RedCloth#pba refers to text more than self
48
- [Duplication] RedCloth#rip_offtags calls @pre_list.last more than once
49
- [Duplication] RedCloth#rip_offtags calls @pre_list.last.<<(line) more than once
50
- [Duplication] RedCloth#rip_offtags calls codepre.-(used_offtags.length) more than once
51
- [Duplication] RedCloth#rip_offtags calls codepre.-(used_offtags.length).>(0) more than once
52
- [Duplication] RedCloth#rip_offtags calls codepre.zero? more than once
53
- [Duplication] RedCloth#rip_offtags calls used_offtags.length more than once
54
- [Duplication] RedCloth#rip_offtags calls used_offtags[notextile] more than once
55
- [Long Method] RedCloth#rip_offtags has approx 22 statements
56
- [Feature Envy] RedCloth#rip_offtags refers to codepre more than self
57
- [Long Parameter List] RedCloth#textile_bq has 4 parameters
58
- [Control Couple] RedCloth#textile_bq is controlled by argument atts
59
- [Control Couple] RedCloth#textile_bq is controlled by argument cite
60
- [Long Parameter List] RedCloth#textile_fn_ has 5 parameters
61
- [Control Couple] RedCloth#textile_fn_ is controlled by argument atts
62
- [Long Parameter List] RedCloth#textile_p has 4 parameters
63
- [Control Couple] RedCloth#textile_p is controlled by argument atts
64
- [Long Method] RedCloth#to_html has approx 24 statements
65
- [Utility Function] RedCloth#v_align doesn't depend on instance state