rubomatic-html 1.1.0.pre.rc.4 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.adoc +25 -1
- data/config/default.yml +28 -0
- data/docs/cops/style/README.adoc +9 -0
- data/docs/cops/style/no_fields_for/README.adoc +28 -0
- data/docs/cops/style/no_form_for/README.adoc +28 -0
- data/docs/cops/style/no_form_tag/README.adoc +28 -0
- data/docs/cops/style/no_on_before_unload/README.adoc +29 -0
- data/docs/cops/style/no_on_click/README.adoc +29 -0
- data/docs/cops/style/no_on_drag/README.adoc +29 -0
- data/docs/cops/style/no_on_load/README.adoc +29 -0
- data/docs/cops/style/no_on_unload/README.adoc +29 -0
- data/docs/cops/style/no_on_wheel/README.adoc +29 -0
- data/exe/rubomatic-html +1 -1
- data/lib/rubomatic-html/cop/base.rb +58 -0
- data/lib/rubomatic-html/cop/cops.rb +19 -0
- data/lib/rubomatic-html/cop/layout/base.rb +17 -0
- data/lib/rubomatic-html/cop/layout/line_length.rb +28 -0
- data/lib/rubomatic-html/cop/layout/multiple_line_breaks.rb +42 -0
- data/lib/rubomatic-html/cop/layout/trailing_whitespace.rb +28 -0
- data/lib/rubomatic-html/cop/style/base.rb +17 -0
- data/lib/rubomatic-html/cop/style/no_fields_for.rb +28 -0
- data/lib/rubomatic-html/cop/style/no_form_for.rb +28 -0
- data/lib/rubomatic-html/cop/style/no_form_tag.rb +28 -0
- data/lib/rubomatic-html/cop/style/no_on_attribute.rb +31 -0
- data/lib/rubomatic-html/cop/style/no_on_before_unload.rb +27 -0
- data/lib/rubomatic-html/cop/style/no_on_click.rb +27 -0
- data/lib/rubomatic-html/cop/style/no_on_drag.rb +27 -0
- data/lib/rubomatic-html/cop/style/no_on_load.rb +27 -0
- data/lib/rubomatic-html/cop/style/no_on_unload.rb +27 -0
- data/lib/rubomatic-html/cop/style/no_on_wheel.rb +27 -0
- data/lib/rubomatic-html/cop/style/partial_instance_variable.rb +44 -0
- data/lib/rubomatic-html/generator/cop_readme_injector.rb +48 -0
- data/lib/rubomatic-html/generator/dept_readme_injector.rb +111 -0
- data/lib/rubomatic-html/generator.rb +330 -0
- data/lib/rubomatic-html/inject.rb +19 -0
- data/lib/rubomatic-html/runner.rb +129 -0
- data/lib/rubomatic-html/version.rb +5 -0
- data/lib/rubomatic-html.rb +11 -1
- metadata +49 -20
- data/lib/rubomatic/html/cop/base.rb +0 -42
- data/lib/rubomatic/html/cop/cops.rb +0 -9
- data/lib/rubomatic/html/cop/layout/base.rb +0 -19
- data/lib/rubomatic/html/cop/layout/line_length.rb +0 -26
- data/lib/rubomatic/html/cop/layout/multiple_line_breaks.rb +0 -40
- data/lib/rubomatic/html/cop/layout/trailing_whitespace.rb +0 -26
- data/lib/rubomatic/html/cop/style/base.rb +0 -19
- data/lib/rubomatic/html/cop/style/partial_instance_variable.rb +0 -28
- data/lib/rubomatic/html/version.rb +0 -7
- data/lib/rubomatic/html.rb +0 -115
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubomaticHtml
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
class NoOnAttribute < RubomaticHtml::Cop::Style::Base
|
7
|
+
# @return [String]
|
8
|
+
attr_accessor :html_attr
|
9
|
+
|
10
|
+
# @see super
|
11
|
+
def run_for_line(line, index)
|
12
|
+
# `onclick:` or `onclick=`
|
13
|
+
has_on_click = line.match?(/#{html_attr}[:=]/i)
|
14
|
+
|
15
|
+
# `:onclick=>` or `:onclick =>`
|
16
|
+
has_on_click ||= line.match?(/:#{html_attr} ?=>/i)
|
17
|
+
|
18
|
+
# `'onclick'=>` or `'onclick' =>`
|
19
|
+
has_on_click ||= line.match?(/'#{html_attr}' ?=>/i)
|
20
|
+
|
21
|
+
# `"onclick"=>` or `"onclick" =>`
|
22
|
+
has_on_click ||= line.match?(/"#{html_attr}" ?=>/i)
|
23
|
+
|
24
|
+
return unless has_on_click
|
25
|
+
|
26
|
+
puts("#{file}:#{index}: might use an #{html_attr} attribute")
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubomaticHtml
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
class NoOnBeforeUnload < RubomaticHtml::Cop::Style::NoOnAttribute
|
7
|
+
class << self
|
8
|
+
# @see super
|
9
|
+
def abstract_cop?
|
10
|
+
false
|
11
|
+
end
|
12
|
+
|
13
|
+
# @see super
|
14
|
+
def name
|
15
|
+
[department, 'NoOnBeforeUnload'].join('/')
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def initialize(...)
|
20
|
+
super(...)
|
21
|
+
|
22
|
+
@html_attr = 'onbeforeunload'
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubomaticHtml
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
class NoOnClick < RubomaticHtml::Cop::Style::NoOnAttribute
|
7
|
+
class << self
|
8
|
+
# @see super
|
9
|
+
def abstract_cop?
|
10
|
+
false
|
11
|
+
end
|
12
|
+
|
13
|
+
# @see super
|
14
|
+
def name
|
15
|
+
[department, 'NoOnClick'].join('/')
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def initialize(...)
|
20
|
+
super(...)
|
21
|
+
|
22
|
+
@html_attr = 'onclick'
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubomaticHtml
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
class NoOnDrag < RubomaticHtml::Cop::Style::NoOnAttribute
|
7
|
+
class << self
|
8
|
+
# @see super
|
9
|
+
def abstract_cop?
|
10
|
+
false
|
11
|
+
end
|
12
|
+
|
13
|
+
# @see super
|
14
|
+
def name
|
15
|
+
[department, 'NoOnDrag'].join('/')
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def initialize(...)
|
20
|
+
super(...)
|
21
|
+
|
22
|
+
@html_attr = 'ondrag'
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubomaticHtml
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
class NoOnLoad < RubomaticHtml::Cop::Style::NoOnAttribute
|
7
|
+
class << self
|
8
|
+
# @see super
|
9
|
+
def abstract_cop?
|
10
|
+
false
|
11
|
+
end
|
12
|
+
|
13
|
+
# @see super
|
14
|
+
def name
|
15
|
+
[department, 'NoOnLoad'].join('/')
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def initialize(...)
|
20
|
+
super(...)
|
21
|
+
|
22
|
+
@html_attr = 'onload'
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubomaticHtml
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
class NoOnUnload < RubomaticHtml::Cop::Style::NoOnAttribute
|
7
|
+
class << self
|
8
|
+
# @see super
|
9
|
+
def abstract_cop?
|
10
|
+
false
|
11
|
+
end
|
12
|
+
|
13
|
+
# @see super
|
14
|
+
def name
|
15
|
+
[department, 'NoOnUnload'].join('/')
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def initialize(...)
|
20
|
+
super(...)
|
21
|
+
|
22
|
+
@html_attr = 'onunload'
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubomaticHtml
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
class NoOnWheel < RubomaticHtml::Cop::Style::NoOnAttribute
|
7
|
+
class << self
|
8
|
+
# @see super
|
9
|
+
def abstract_cop?
|
10
|
+
false
|
11
|
+
end
|
12
|
+
|
13
|
+
# @see super
|
14
|
+
def name
|
15
|
+
[department, 'NoOnWheel'].join('/')
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def initialize(...)
|
20
|
+
super(...)
|
21
|
+
|
22
|
+
@html_attr = 'onwheel'
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubomaticHtml
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
class PartialInstanceVariable < RubomaticHtml::Cop::Style::Base
|
7
|
+
class << self
|
8
|
+
# @see super
|
9
|
+
def abstract_cop?
|
10
|
+
false
|
11
|
+
end
|
12
|
+
|
13
|
+
# @see super
|
14
|
+
def name
|
15
|
+
[department, 'PartialInstanceVariable'].join('/')
|
16
|
+
end
|
17
|
+
|
18
|
+
# @see super
|
19
|
+
def allowed_config_transform
|
20
|
+
super.merge({ 'AllowedIdentifiers' => :allowed_identifiers }).freeze
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
# @see super
|
25
|
+
def run_for_line(line, index)
|
26
|
+
return unless File.basename(file).match?(/^_/i)
|
27
|
+
|
28
|
+
return unless line.match?(/@/i)
|
29
|
+
|
30
|
+
return if allowed_identifiers.any? { |ai| line[/@.+/].start_with?(ai) }
|
31
|
+
|
32
|
+
puts("#{file}:#{index}: uses an instance variable")
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
# @return [Array<String>]
|
38
|
+
def allowed_identifiers
|
39
|
+
@allowed_identifiers ||= Array(config.dig(:allowed_identifiers))
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubomaticHtml
|
4
|
+
class Generator
|
5
|
+
class CopReadmeInjector < DeptReadmeInjector
|
6
|
+
TEMPLATE =
|
7
|
+
'* xref:./%{cop_folder}/README.adoc[``%{department}/%{cop}``]'
|
8
|
+
|
9
|
+
# :nodoc:
|
10
|
+
def initialize(badge:, **kwargs)
|
11
|
+
super(badge: badge, **kwargs)
|
12
|
+
|
13
|
+
@cop = badge.cop_name
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
# @return [String]
|
19
|
+
attr_reader :cop
|
20
|
+
|
21
|
+
# @see super
|
22
|
+
def new_readme_entry
|
23
|
+
format(TEMPLATE, {
|
24
|
+
department_folder: snake_case(department),
|
25
|
+
cop_folder: snake_case(cop),
|
26
|
+
department: department,
|
27
|
+
cop: cop
|
28
|
+
})
|
29
|
+
end
|
30
|
+
|
31
|
+
# @see super
|
32
|
+
def line_is_good?(line)
|
33
|
+
return true if super
|
34
|
+
|
35
|
+
matches = line.match(target_regex)
|
36
|
+
|
37
|
+
return false if matches.nil?
|
38
|
+
|
39
|
+
department == matches[:department] && cop < matches[:cop]
|
40
|
+
end
|
41
|
+
|
42
|
+
# @see super
|
43
|
+
def target_regex
|
44
|
+
%r{\* xref:\./[a-z_]+/README\.adoc\[``(?<department>[a-zA-Z_]+)/(?<cop>[a-zA-Z_]+)``\]}
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,111 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubomaticHtml
|
4
|
+
class Generator
|
5
|
+
class DeptReadmeInjector
|
6
|
+
TEMPLATE = '* xref:./docs/cops/%{department_folder}/README.adoc[``%{department}``]'
|
7
|
+
|
8
|
+
# :nodoc:
|
9
|
+
def initialize(readme_file_path:, badge:, department:)
|
10
|
+
@readme_file_path = readme_file_path
|
11
|
+
@badge = badge
|
12
|
+
@department = department
|
13
|
+
@output = output
|
14
|
+
end
|
15
|
+
|
16
|
+
# Performs the actual string injection into the file
|
17
|
+
# modified version of `inject` from RuboCop::Cop::Generator::ConfigurationInjector
|
18
|
+
# Named `inject_string` becuase rubocop thought when called it was `Array#inject`
|
19
|
+
#
|
20
|
+
# @return [void]
|
21
|
+
#
|
22
|
+
def inject_string
|
23
|
+
if readme_entries.none?("#{new_readme_entry}\n")
|
24
|
+
target_line = find_target_line
|
25
|
+
|
26
|
+
if target_line
|
27
|
+
readme_entries.insert(target_line, "#{new_readme_entry}\n")
|
28
|
+
else
|
29
|
+
readme_entries.push(new_readme_entry)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
File.write(readme_file_path, readme_entries.join(''))
|
34
|
+
|
35
|
+
yield if block_given?
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
# @return [String]
|
41
|
+
attr_reader :readme_file_path
|
42
|
+
# @return [RuboCop::Cop::Badge]
|
43
|
+
attr_reader :badge
|
44
|
+
# @return [String]
|
45
|
+
attr_reader :department
|
46
|
+
# @return [*] Default $stdout
|
47
|
+
attr_reader :output
|
48
|
+
|
49
|
+
# Lines in <department>/README.adoc
|
50
|
+
#
|
51
|
+
# @return [Array<String>]
|
52
|
+
#
|
53
|
+
def readme_entries
|
54
|
+
@readme_entries ||= File.readlines(readme_file_path)
|
55
|
+
end
|
56
|
+
|
57
|
+
# Modified version from Rubocop::Cop::Generator::ConfigurationInjector
|
58
|
+
#
|
59
|
+
# @return [String]
|
60
|
+
#
|
61
|
+
def new_readme_entry
|
62
|
+
format(TEMPLATE, {
|
63
|
+
department_folder: snake_case(department),
|
64
|
+
department: department
|
65
|
+
})
|
66
|
+
end
|
67
|
+
|
68
|
+
# Modified version from Rubocop::Cop::Generator::ConfigurationInjector
|
69
|
+
#
|
70
|
+
# @return [Integer, Nil]
|
71
|
+
#
|
72
|
+
def find_target_line
|
73
|
+
readme_entries.find_index do |line|
|
74
|
+
line_is_good?(line)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
# Determines if the given line is the same type we're trying to add and if it's alphabetically before
|
79
|
+
#
|
80
|
+
# @return [Boolean]
|
81
|
+
#
|
82
|
+
def line_is_good?(line)
|
83
|
+
matches = line.match(target_regex)
|
84
|
+
|
85
|
+
return false if matches.nil?
|
86
|
+
|
87
|
+
department < line.match(target_regex)[:department]
|
88
|
+
end
|
89
|
+
|
90
|
+
# Regex to look for in the readme
|
91
|
+
#
|
92
|
+
# @return [Regexp]
|
93
|
+
#
|
94
|
+
def target_regex
|
95
|
+
%r{\* xref:\./docs/cops/[a-z_]+/README\.adoc\[``(?<department>[a-zA-Z_]+)``\]}
|
96
|
+
end
|
97
|
+
|
98
|
+
# Copied from Rubocop::Cop::Generator
|
99
|
+
#
|
100
|
+
# @return [String]
|
101
|
+
#
|
102
|
+
def snake_case(camel_case_string)
|
103
|
+
camel_case_string
|
104
|
+
.gsub('RSpec', 'Rspec')
|
105
|
+
.gsub(%r{([^A-Z/])([A-Z]+)}, '\1_\2')
|
106
|
+
.gsub(%r{([A-Z])([A-Z][^A-Z\d/]+)}, '\1_\2')
|
107
|
+
.downcase
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|