rubocop-sketchup 0.5.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
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
+ }