rubocop-sketchup 0.5.0 → 0.6.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 (66) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +19 -19
  3. data/assets/output.html.erb +301 -301
  4. data/config/default.yml +355 -355
  5. data/lib/rubocop/sketchup/config.rb +63 -63
  6. data/lib/rubocop/sketchup/cop/deprecations/add_separator_to_menu.rb +25 -25
  7. data/lib/rubocop/sketchup/cop/deprecations/operation_next_transparent.rb +30 -30
  8. data/lib/rubocop/sketchup/cop/deprecations/require_all.rb +27 -27
  9. data/lib/rubocop/sketchup/cop/deprecations/set_texture_projection.rb +26 -26
  10. data/lib/rubocop/sketchup/cop/deprecations/show_ruby_panel.rb +25 -25
  11. data/lib/rubocop/sketchup/cop/deprecations/sketchup_set.rb +30 -30
  12. data/lib/rubocop/sketchup/cop/performance/openssl.rb +41 -41
  13. data/lib/rubocop/sketchup/cop/performance/operation_disable_ui.rb +33 -33
  14. data/lib/rubocop/sketchup/cop/performance/selection_bulk.rb +79 -79
  15. data/lib/rubocop/sketchup/cop/performance/type_check.rb +63 -63
  16. data/lib/rubocop/sketchup/cop/performance/typename.rb +24 -24
  17. data/lib/rubocop/sketchup/cop/requirements/api_namespace.rb +30 -30
  18. data/lib/rubocop/sketchup/cop/requirements/exit.rb +32 -32
  19. data/lib/rubocop/sketchup/cop/requirements/extension_namespace.rb +108 -108
  20. data/lib/rubocop/sketchup/cop/requirements/file_structure.rb +97 -97
  21. data/lib/rubocop/sketchup/cop/requirements/gem_install.rb +45 -45
  22. data/lib/rubocop/sketchup/cop/requirements/get_extension_license.rb +95 -95
  23. data/lib/rubocop/sketchup/cop/requirements/global_constants.rb +38 -38
  24. data/lib/rubocop/sketchup/cop/requirements/global_include.rb +42 -42
  25. data/lib/rubocop/sketchup/cop/requirements/global_methods.rb +65 -65
  26. data/lib/rubocop/sketchup/cop/requirements/global_variables.rb +95 -95
  27. data/lib/rubocop/sketchup/cop/requirements/language_handler_globals.rb +46 -46
  28. data/lib/rubocop/sketchup/cop/requirements/load_path.rb +83 -83
  29. data/lib/rubocop/sketchup/cop/requirements/minimal_registration.rb +73 -73
  30. data/lib/rubocop/sketchup/cop/requirements/observers_start_operation.rb +161 -161
  31. data/lib/rubocop/sketchup/cop/requirements/register_extension.rb +45 -45
  32. data/lib/rubocop/sketchup/cop/requirements/ruby_core_namespace.rb +291 -291
  33. data/lib/rubocop/sketchup/cop/requirements/ruby_stdlib_namespace.rb +634 -634
  34. data/lib/rubocop/sketchup/cop/requirements/shipped_extensions_namespace.rb +61 -61
  35. data/lib/rubocop/sketchup/cop/requirements/sketchup_extension.rb +119 -119
  36. data/lib/rubocop/sketchup/cop/requirements/sketchup_require.rb +163 -163
  37. data/lib/rubocop/sketchup/cop/suggestions/add_group.rb +49 -49
  38. data/lib/rubocop/sketchup/cop/suggestions/compatibility.rb +117 -117
  39. data/lib/rubocop/sketchup/cop/suggestions/dc_internals.rb +34 -34
  40. data/lib/rubocop/sketchup/cop/suggestions/file_encoding.rb +78 -78
  41. data/lib/rubocop/sketchup/cop/suggestions/model_entities.rb +58 -58
  42. data/lib/rubocop/sketchup/cop/suggestions/monkey_patched_api.rb +45 -45
  43. data/lib/rubocop/sketchup/cop/suggestions/operation_name.rb +103 -103
  44. data/lib/rubocop/sketchup/cop/suggestions/sketchup_find_support_file.rb +39 -39
  45. data/lib/rubocop/sketchup/cop/suggestions/tool_drawing_bounds.rb +44 -44
  46. data/lib/rubocop/sketchup/cop/suggestions/tool_invalidate.rb +66 -66
  47. data/lib/rubocop/sketchup/cop/suggestions/tool_user_input.rb +41 -41
  48. data/lib/rubocop/sketchup/cop/suggestions/toolbar_timer.rb +65 -65
  49. data/lib/rubocop/sketchup/cop.rb +111 -111
  50. data/lib/rubocop/sketchup/dc_globals.rb +24 -24
  51. data/lib/rubocop/sketchup/dc_methods.rb +130 -130
  52. data/lib/rubocop/sketchup/extension_project.rb +65 -65
  53. data/lib/rubocop/sketchup/features.rb +738 -738
  54. data/lib/rubocop/sketchup/formatter/extension_review.rb +259 -259
  55. data/lib/rubocop/sketchup/inject.rb +19 -19
  56. data/lib/rubocop/sketchup/namespace.rb +47 -47
  57. data/lib/rubocop/sketchup/namespace_checker.rb +46 -46
  58. data/lib/rubocop/sketchup/no_comment_disable.rb +17 -17
  59. data/lib/rubocop/sketchup/range_help.rb +52 -52
  60. data/lib/rubocop/sketchup/sketchup_version.rb +87 -87
  61. data/lib/rubocop/sketchup/tool_checker.rb +43 -43
  62. data/lib/rubocop/sketchup/version.rb +5 -5
  63. data/lib/rubocop/sketchup.rb +12 -12
  64. data/lib/rubocop-sketchup.rb +48 -48
  65. data/rubocop-sketchup.gemspec +27 -27
  66. metadata +4 -4
@@ -1,46 +1,46 @@
1
- # frozen_string_literal: true
2
-
3
- module RuboCop
4
- module SketchUp
5
- module NamespaceChecker
6
-
7
- def on_class(node)
8
- check_namespace(node)
9
- end
10
-
11
- def on_module(node)
12
- check_namespace(node)
13
- end
14
-
15
- def on_def(node)
16
- check_namespace(node)
17
- end
18
- alias on_defs on_def
19
-
20
- # Constant assignment.
21
- def on_casgn(node)
22
- check_namespace(node)
23
- end
24
-
25
- def check_namespace(node)
26
- return unless in_namespace?(node)
27
-
28
- add_offense(node, location: :name, severity: :error)
29
- end
30
-
31
- def in_namespace?(node)
32
- # parent_module_name might return nil if for instance a method is
33
- # defined within a block. (Apparently that is possible...)
34
- return false if node.parent_module_name.nil?
35
-
36
- namespace = SketchUp::Namespace.new(node.parent_module_name)
37
- namespaces.include?(namespace.first)
38
- end
39
-
40
- def namespaces
41
- raise NotImplementedError
42
- end
43
-
44
- end
45
- end
46
- end
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module SketchUp
5
+ module NamespaceChecker
6
+
7
+ def on_class(node)
8
+ check_namespace(node)
9
+ end
10
+
11
+ def on_module(node)
12
+ check_namespace(node)
13
+ end
14
+
15
+ def on_def(node)
16
+ check_namespace(node)
17
+ end
18
+ alias on_defs on_def
19
+
20
+ # Constant assignment.
21
+ def on_casgn(node)
22
+ check_namespace(node)
23
+ end
24
+
25
+ def check_namespace(node)
26
+ return unless in_namespace?(node)
27
+
28
+ add_offense(node, location: :name, severity: :error)
29
+ end
30
+
31
+ def in_namespace?(node)
32
+ # parent_module_name might return nil if for instance a method is
33
+ # defined within a block. (Apparently that is possible...)
34
+ return false if node.parent_module_name.nil?
35
+
36
+ namespace = SketchUp::Namespace.new(node.parent_module_name)
37
+ namespaces.include?(namespace.first)
38
+ end
39
+
40
+ def namespaces
41
+ raise NotImplementedError
42
+ end
43
+
44
+ end
45
+ end
46
+ end
@@ -1,17 +1,17 @@
1
- # frozen_string_literal: true
2
-
3
- module RuboCop
4
- module SketchUp
5
- module NoCommentDisable
6
-
7
- private
8
-
9
- # This forces the cop to be run even if there is a source code comment
10
- # that tries to disable it.
11
- def enabled_line?(_line_number)
12
- true
13
- end
14
-
15
- end
16
- end
17
- end
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module SketchUp
5
+ module NoCommentDisable
6
+
7
+ private
8
+
9
+ # This forces the cop to be run even if there is a source code comment
10
+ # that tries to disable it.
11
+ def enabled_line?(_line_number)
12
+ true
13
+ end
14
+
15
+ end
16
+ end
17
+ end
@@ -1,52 +1,52 @@
1
- # frozen_string_literal: true
2
-
3
- module RuboCop
4
- module Cop
5
- # Methods that calculate and return Parser::Source::Ranges
6
- module RangeHelp
7
-
8
- private
9
-
10
- def range_with_receiver(node)
11
- receiver = node.receiver
12
- loc_begin = if receiver.send_type?
13
- receiver.loc.selector.begin_pos
14
- else
15
- receiver.loc.expression.begin_pos
16
- end
17
- loc_end = node.loc.selector.end_pos
18
- range_between(loc_begin, loc_end)
19
- end
20
-
21
- def string_contents_range(node)
22
- begin_pos = node.loc.begin.end_pos
23
- end_pos = node.loc.end.begin_pos
24
- range_between(begin_pos, end_pos)
25
- end
26
-
27
- def arguments_range(node)
28
- begin_pos = node.arguments.first.loc.expression.begin_pos
29
- end_pos = node.arguments.last.loc.expression.end_pos
30
- range_between(begin_pos, end_pos)
31
- end
32
-
33
- def conditional_range(node)
34
- if node.modifier_form?
35
- range_between(node.loc.keyword.begin_pos,
36
- node.loc.expression.end_pos)
37
- else
38
- :expression
39
- end
40
- end
41
-
42
- def file_ext_range(argument_node)
43
- filename = argument_node.str_content
44
- ext_size = File.extname(filename).size
45
- end_pos = argument_node.loc.end.begin_pos
46
- begin_pos = end_pos - ext_size
47
- range_between(begin_pos, end_pos)
48
- end
49
-
50
- end
51
- end
52
- end
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ # Methods that calculate and return Parser::Source::Ranges
6
+ module RangeHelp
7
+
8
+ private
9
+
10
+ def range_with_receiver(node)
11
+ receiver = node.receiver
12
+ loc_begin = if receiver.send_type?
13
+ receiver.loc.selector.begin_pos
14
+ else
15
+ receiver.loc.expression.begin_pos
16
+ end
17
+ loc_end = node.loc.selector.end_pos
18
+ range_between(loc_begin, loc_end)
19
+ end
20
+
21
+ def string_contents_range(node)
22
+ begin_pos = node.loc.begin.end_pos
23
+ end_pos = node.loc.end.begin_pos
24
+ range_between(begin_pos, end_pos)
25
+ end
26
+
27
+ def arguments_range(node)
28
+ begin_pos = node.arguments.first.loc.expression.begin_pos
29
+ end_pos = node.arguments.last.loc.expression.end_pos
30
+ range_between(begin_pos, end_pos)
31
+ end
32
+
33
+ def conditional_range(node)
34
+ if node.modifier_form?
35
+ range_between(node.loc.keyword.begin_pos,
36
+ node.loc.expression.end_pos)
37
+ else
38
+ :expression
39
+ end
40
+ end
41
+
42
+ def file_ext_range(argument_node)
43
+ filename = argument_node.str_content
44
+ ext_size = File.extname(filename).size
45
+ end_pos = argument_node.loc.end.begin_pos
46
+ begin_pos = end_pos - ext_size
47
+ range_between(begin_pos, end_pos)
48
+ end
49
+
50
+ end
51
+ end
52
+ end
@@ -1,87 +1,87 @@
1
- # frozen_string_literal: true
2
-
3
- module RuboCop
4
- module SketchUp
5
- class SketchUpVersion
6
-
7
- include Comparable
8
-
9
- attr_reader :version, :maintenance
10
-
11
- class InvalidVersion < StandardError; end
12
-
13
- def initialize(version)
14
- @version, @maintenance = parse_version(version)
15
- end
16
-
17
- def <=>(other)
18
- if version == other.version
19
- maintenance <=> other.maintenance
20
- else
21
- version <=> other.version
22
- end
23
- end
24
-
25
- def to_s
26
- string_version = version < 2013 ? version.to_f : version.to_i
27
- if maintenance > 0
28
- "SketchUp #{string_version} M#{maintenance}"
29
- else
30
- "SketchUp #{string_version}"
31
- end
32
- end
33
-
34
- private
35
-
36
- VERSION_NUMBER_REGEX = /^(?:SketchUp )?([0-9.]+)(?: M(\d+))?$/
37
-
38
- # This list is compiled from the list of versions reported by YARD when
39
- # running the `versions` template;
40
- #
41
- # yardoc -t versions -f text
42
- #
43
- # TODO(thomthom): Push the version template to the API stubs repository.
44
- VALID_VERSIONS = [
45
- [2018, 0],
46
- [2017, 0],
47
- [2016, 1],
48
- [2016, 0],
49
- [2015, 0],
50
- [2014, 0],
51
- [2013, 0],
52
- [8.0, 2],
53
- [8.0, 1],
54
- [8.0, 0],
55
- [7.1, 1],
56
- [7.1, 0],
57
- [7.0, 1],
58
- [7.0, 0],
59
- [6.0, 0],
60
- ].freeze
61
-
62
- def parse_version(version)
63
- v = 0
64
- m = 0
65
- if version.is_a?(String)
66
- # Treat all LayOut versions as SketchUp versions for now.
67
- normalised_version = version.gsub('LayOut', 'SketchUp')
68
- result = normalised_version.match(VERSION_NUMBER_REGEX)
69
- if result
70
- v = result.captures[0].to_f
71
- m = (result.captures[1] || '0').to_i
72
- end
73
- elsif version.is_a?(Numeric)
74
- v = version
75
- m = 0
76
- end
77
- version_parts = [v, m]
78
- unless VALID_VERSIONS.include?(version_parts)
79
- raise InvalidVersion, "#{version} is not a valid SketchUp version"
80
- end
81
-
82
- version_parts
83
- end
84
-
85
- end
86
- end
87
- end
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module SketchUp
5
+ class SketchUpVersion
6
+
7
+ include Comparable
8
+
9
+ attr_reader :version, :maintenance
10
+
11
+ class InvalidVersion < StandardError; end
12
+
13
+ def initialize(version)
14
+ @version, @maintenance = parse_version(version)
15
+ end
16
+
17
+ def <=>(other)
18
+ if version == other.version
19
+ maintenance <=> other.maintenance
20
+ else
21
+ version <=> other.version
22
+ end
23
+ end
24
+
25
+ def to_s
26
+ string_version = version < 2013 ? version.to_f : version.to_i
27
+ if maintenance > 0
28
+ "SketchUp #{string_version} M#{maintenance}"
29
+ else
30
+ "SketchUp #{string_version}"
31
+ end
32
+ end
33
+
34
+ private
35
+
36
+ VERSION_NUMBER_REGEX = /^(?:SketchUp )?([0-9.]+)(?: M(\d+))?$/.freeze
37
+
38
+ # This list is compiled from the list of versions reported by YARD when
39
+ # running the `versions` template;
40
+ #
41
+ # yardoc -t versions -f text
42
+ #
43
+ # TODO(thomthom): Push the version template to the API stubs repository.
44
+ VALID_VERSIONS = [
45
+ [2018, 0],
46
+ [2017, 0],
47
+ [2016, 1],
48
+ [2016, 0],
49
+ [2015, 0],
50
+ [2014, 0],
51
+ [2013, 0],
52
+ [8.0, 2],
53
+ [8.0, 1],
54
+ [8.0, 0],
55
+ [7.1, 1],
56
+ [7.1, 0],
57
+ [7.0, 1],
58
+ [7.0, 0],
59
+ [6.0, 0],
60
+ ].freeze
61
+
62
+ def parse_version(version)
63
+ v = 0
64
+ m = 0
65
+ if version.is_a?(String)
66
+ # Treat all LayOut versions as SketchUp versions for now.
67
+ normalised_version = version.gsub('LayOut', 'SketchUp')
68
+ result = normalised_version.match(VERSION_NUMBER_REGEX)
69
+ if result
70
+ v = result.captures[0].to_f
71
+ m = (result.captures[1] || '0').to_i
72
+ end
73
+ elsif version.is_a?(Numeric)
74
+ v = version
75
+ m = 0
76
+ end
77
+ version_parts = [v, m]
78
+ unless VALID_VERSIONS.include?(version_parts)
79
+ raise InvalidVersion, "#{version} is not a valid SketchUp version"
80
+ end
81
+
82
+ version_parts
83
+ end
84
+
85
+ end
86
+ end
87
+ end
@@ -1,43 +1,43 @@
1
- # frozen_string_literal: true
2
-
3
- module RuboCop
4
- module SketchUp
5
- module ToolChecker
6
-
7
- def on_class(node)
8
- name, _base_class, body = *node
9
- return unless name.const_name.end_with?('Tool')
10
-
11
- check_body(body, node)
12
- end
13
-
14
- private
15
-
16
- # rubocop:disable Lint/UnusedMethodArgument
17
- def on_tool_class(class_node, body, body_methods)
18
- raise NotImplementedError, 'Implement this method'
19
- end
20
- # rubocop:enable Lint/UnusedMethodArgument
21
-
22
- def body_methods(body)
23
- return [body] if body.def_type?
24
- return unless body.begin_type?
25
-
26
- body.each_child_node(:def)
27
- end
28
-
29
- def check_body(body, class_node)
30
- return if body.nil? # Empty class etc.
31
-
32
- body_methods = body_methods(body)
33
-
34
- on_tool_class(class_node, body_methods)
35
- end
36
-
37
- def find_method(defs, method_name)
38
- defs.find { |def_node| def_node.method?(method_name) }
39
- end
40
-
41
- end
42
- end
43
- end
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module SketchUp
5
+ module ToolChecker
6
+
7
+ def on_class(node)
8
+ name, _base_class, body = *node
9
+ return unless name.const_name.end_with?('Tool')
10
+
11
+ check_body(body, node)
12
+ end
13
+
14
+ private
15
+
16
+ # rubocop:disable Lint/UnusedMethodArgument
17
+ def on_tool_class(class_node, body, body_methods)
18
+ raise NotImplementedError, 'Implement this method'
19
+ end
20
+ # rubocop:enable Lint/UnusedMethodArgument
21
+
22
+ def body_methods(body)
23
+ return [body] if body.def_type?
24
+ return unless body.begin_type?
25
+
26
+ body.each_child_node(:def)
27
+ end
28
+
29
+ def check_body(body, class_node)
30
+ return if body.nil? # Empty class etc.
31
+
32
+ body_methods = body_methods(body)
33
+
34
+ on_tool_class(class_node, body_methods)
35
+ end
36
+
37
+ def find_method(defs, method_name)
38
+ defs.find { |def_node| def_node.method?(method_name) }
39
+ end
40
+
41
+ end
42
+ end
43
+ end
@@ -1,5 +1,5 @@
1
- module RuboCop
2
- module SketchUp
3
- VERSION = '0.5.0'.freeze
4
- end
5
- end
1
+ module RuboCop
2
+ module SketchUp
3
+ VERSION = '0.6.0'.freeze
4
+ end
5
+ end
@@ -1,12 +1,12 @@
1
- require 'pathname'
2
-
3
- module RuboCop
4
- # RuboCop SketchUp project namespace
5
- module SketchUp
6
- PROJECT_ROOT = Pathname.new(__dir__).parent.parent.expand_path.freeze
7
- CONFIG_DEFAULT = PROJECT_ROOT.join('config', 'default.yml').freeze
8
- CONFIG = YAML.safe_load(CONFIG_DEFAULT.read).freeze
9
-
10
- private_constant(:CONFIG_DEFAULT, :PROJECT_ROOT)
11
- end
12
- end
1
+ require 'pathname'
2
+
3
+ module RuboCop
4
+ # RuboCop SketchUp project namespace
5
+ module SketchUp
6
+ PROJECT_ROOT = Pathname.new(__dir__).parent.parent.expand_path.freeze
7
+ CONFIG_DEFAULT = PROJECT_ROOT.join('config', 'default.yml').freeze
8
+ CONFIG = YAML.safe_load(CONFIG_DEFAULT.read).freeze
9
+
10
+ private_constant(:CONFIG_DEFAULT, :PROJECT_ROOT)
11
+ end
12
+ end
@@ -1,48 +1,48 @@
1
- require 'rubocop'
2
- require 'rubocop/sketchup'
3
- require 'rubocop/sketchup/version'
4
- require 'rubocop/sketchup/inject'
5
-
6
- require 'rubocop/sketchup/formatter/extension_review'
7
- require 'rubocop/sketchup/config'
8
- require 'rubocop/sketchup/cop'
9
- require 'rubocop/sketchup/dc_globals'
10
- require 'rubocop/sketchup/dc_methods'
11
- require 'rubocop/sketchup/extension_project'
12
- require 'rubocop/sketchup/features'
13
- require 'rubocop/sketchup/namespace'
14
- require 'rubocop/sketchup/namespace_checker'
15
- require 'rubocop/sketchup/no_comment_disable'
16
- require 'rubocop/sketchup/range_help'
17
- require 'rubocop/sketchup/sketchup_version'
18
- require 'rubocop/sketchup/tool_checker'
19
-
20
- RuboCop::SketchUp::Inject.defaults!
21
-
22
- # Monkey patching the built in formatter list to add a short alias for custom
23
- # formatters. Naughty! Naughty!
24
- class RuboCop::Formatter::FormatterSet
25
- formatters = BUILTIN_FORMATTERS_FOR_KEYS.dup
26
- formatters['extension_review'] =
27
- RuboCop::Formatter::ExtensionReviewFormatter
28
- verbose = $VERBOSE
29
- begin
30
- $VERBOSE = nil
31
- BUILTIN_FORMATTERS_FOR_KEYS = formatters.freeze
32
- ensure
33
- $VERBOSE = verbose
34
- end
35
- end
36
-
37
- # Make it easier to explore available methods on a method.
38
- class Object
39
- def methods!
40
- methods.sort - Object.class.instance_methods
41
- end
42
- end
43
-
44
- # Load all custom cops.
45
- pattern = File.join(__dir__, 'rubocop', 'sketchup', 'cop', '**/*rb')
46
- Dir.glob(pattern) { |file|
47
- require file
48
- }
1
+ require 'rubocop'
2
+ require 'rubocop/sketchup'
3
+ require 'rubocop/sketchup/version'
4
+ require 'rubocop/sketchup/inject'
5
+
6
+ require 'rubocop/sketchup/formatter/extension_review'
7
+ require 'rubocop/sketchup/config'
8
+ require 'rubocop/sketchup/cop'
9
+ require 'rubocop/sketchup/dc_globals'
10
+ require 'rubocop/sketchup/dc_methods'
11
+ require 'rubocop/sketchup/extension_project'
12
+ require 'rubocop/sketchup/features'
13
+ require 'rubocop/sketchup/namespace'
14
+ require 'rubocop/sketchup/namespace_checker'
15
+ require 'rubocop/sketchup/no_comment_disable'
16
+ require 'rubocop/sketchup/range_help'
17
+ require 'rubocop/sketchup/sketchup_version'
18
+ require 'rubocop/sketchup/tool_checker'
19
+
20
+ RuboCop::SketchUp::Inject.defaults!
21
+
22
+ # Monkey patching the built in formatter list to add a short alias for custom
23
+ # formatters. Naughty! Naughty!
24
+ class RuboCop::Formatter::FormatterSet
25
+ formatters = BUILTIN_FORMATTERS_FOR_KEYS.dup
26
+ formatters['extension_review'] =
27
+ RuboCop::Formatter::ExtensionReviewFormatter
28
+ verbose = $VERBOSE
29
+ begin
30
+ $VERBOSE = nil
31
+ BUILTIN_FORMATTERS_FOR_KEYS = formatters.freeze
32
+ ensure
33
+ $VERBOSE = verbose
34
+ end
35
+ end
36
+
37
+ # Make it easier to explore available methods on a method.
38
+ class Object
39
+ def methods!
40
+ methods.sort - Object.class.instance_methods
41
+ end
42
+ end
43
+
44
+ # Load all custom cops.
45
+ pattern = File.join(__dir__, 'rubocop', 'sketchup', 'cop', '**/*rb')
46
+ Dir.glob(pattern) { |file|
47
+ require file
48
+ }