rubocop-sketchup 1.2.0 → 1.4.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 (70) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +20 -19
  3. data/assets/output.html.erb +301 -301
  4. data/config/default.yml +379 -379
  5. data/lib/rubocop/sketchup/config.rb +63 -63
  6. data/lib/rubocop/sketchup/cop/bugs/material_name.rb +108 -108
  7. data/lib/rubocop/sketchup/cop/bugs/render_mode.rb +72 -72
  8. data/lib/rubocop/sketchup/cop/bugs/uniform_scaling.rb +36 -36
  9. data/lib/rubocop/sketchup/cop/deprecations/add_separator_to_menu.rb +25 -25
  10. data/lib/rubocop/sketchup/cop/deprecations/operation_next_transparent.rb +30 -30
  11. data/lib/rubocop/sketchup/cop/deprecations/require_all.rb +27 -27
  12. data/lib/rubocop/sketchup/cop/deprecations/set_texture_projection.rb +26 -26
  13. data/lib/rubocop/sketchup/cop/deprecations/show_ruby_panel.rb +25 -25
  14. data/lib/rubocop/sketchup/cop/deprecations/sketchup_set.rb +30 -30
  15. data/lib/rubocop/sketchup/cop/performance/openssl.rb +41 -41
  16. data/lib/rubocop/sketchup/cop/performance/operation_disable_ui.rb +33 -33
  17. data/lib/rubocop/sketchup/cop/performance/selection_bulk.rb +79 -79
  18. data/lib/rubocop/sketchup/cop/performance/type_check.rb +63 -63
  19. data/lib/rubocop/sketchup/cop/performance/typename.rb +24 -24
  20. data/lib/rubocop/sketchup/cop/requirements/api_namespace.rb +30 -30
  21. data/lib/rubocop/sketchup/cop/requirements/exit.rb +33 -33
  22. data/lib/rubocop/sketchup/cop/requirements/extension_namespace.rb +125 -125
  23. data/lib/rubocop/sketchup/cop/requirements/file_structure.rb +97 -97
  24. data/lib/rubocop/sketchup/cop/requirements/gem_install.rb +45 -45
  25. data/lib/rubocop/sketchup/cop/requirements/get_extension_license.rb +95 -95
  26. data/lib/rubocop/sketchup/cop/requirements/global_constants.rb +38 -38
  27. data/lib/rubocop/sketchup/cop/requirements/global_include.rb +42 -42
  28. data/lib/rubocop/sketchup/cop/requirements/global_methods.rb +65 -65
  29. data/lib/rubocop/sketchup/cop/requirements/global_variables.rb +95 -95
  30. data/lib/rubocop/sketchup/cop/requirements/language_handler_globals.rb +46 -46
  31. data/lib/rubocop/sketchup/cop/requirements/load_path.rb +83 -83
  32. data/lib/rubocop/sketchup/cop/requirements/minimal_registration.rb +73 -73
  33. data/lib/rubocop/sketchup/cop/requirements/observers_start_operation.rb +161 -161
  34. data/lib/rubocop/sketchup/cop/requirements/register_extension.rb +45 -45
  35. data/lib/rubocop/sketchup/cop/requirements/ruby_core_namespace.rb +291 -291
  36. data/lib/rubocop/sketchup/cop/requirements/ruby_stdlib_namespace.rb +634 -634
  37. data/lib/rubocop/sketchup/cop/requirements/shipped_extensions_namespace.rb +61 -61
  38. data/lib/rubocop/sketchup/cop/requirements/sketchup_extension.rb +119 -119
  39. data/lib/rubocop/sketchup/cop/requirements/sketchup_require.rb +150 -149
  40. data/lib/rubocop/sketchup/cop/suggestions/add_group.rb +49 -49
  41. data/lib/rubocop/sketchup/cop/suggestions/compatibility.rb +128 -128
  42. data/lib/rubocop/sketchup/cop/suggestions/dc_internals.rb +34 -34
  43. data/lib/rubocop/sketchup/cop/suggestions/file_encoding.rb +78 -78
  44. data/lib/rubocop/sketchup/cop/suggestions/model_entities.rb +58 -58
  45. data/lib/rubocop/sketchup/cop/suggestions/monkey_patched_api.rb +45 -45
  46. data/lib/rubocop/sketchup/cop/suggestions/operation_name.rb +137 -137
  47. data/lib/rubocop/sketchup/cop/suggestions/sketchup_find_support_file.rb +39 -39
  48. data/lib/rubocop/sketchup/cop/suggestions/tool_drawing_bounds.rb +45 -45
  49. data/lib/rubocop/sketchup/cop/suggestions/tool_invalidate.rb +68 -68
  50. data/lib/rubocop/sketchup/cop/suggestions/tool_user_input.rb +41 -41
  51. data/lib/rubocop/sketchup/cop/suggestions/toolbar_timer.rb +65 -65
  52. data/lib/rubocop/sketchup/cop.rb +110 -110
  53. data/lib/rubocop/sketchup/dc_globals.rb +24 -24
  54. data/lib/rubocop/sketchup/dc_methods.rb +130 -130
  55. data/lib/rubocop/sketchup/extension_project.rb +65 -65
  56. data/lib/rubocop/sketchup/features.rb +1477 -1420
  57. data/lib/rubocop/sketchup/formatter/extension_review.rb +269 -269
  58. data/lib/rubocop/sketchup/inject.rb +19 -19
  59. data/lib/rubocop/sketchup/namespace.rb +49 -49
  60. data/lib/rubocop/sketchup/namespace_checker.rb +103 -46
  61. data/lib/rubocop/sketchup/no_comment_disable.rb +17 -17
  62. data/lib/rubocop/sketchup/range_help.rb +52 -52
  63. data/lib/rubocop/sketchup/sketchup_target_range.rb +75 -75
  64. data/lib/rubocop/sketchup/sketchup_version.rb +129 -128
  65. data/lib/rubocop/sketchup/tool_checker.rb +41 -43
  66. data/lib/rubocop/sketchup/version.rb +7 -7
  67. data/lib/rubocop/sketchup.rb +14 -14
  68. data/lib/rubocop-sketchup.rb +53 -53
  69. data/rubocop-sketchup.gemspec +29 -29
  70. metadata +8 -8
@@ -1,45 +1,45 @@
1
- # frozen_string_literal: true
2
-
3
- module RuboCop
4
- module Cop
5
- module SketchupRequirements
6
- # It's tempting to use gems in an extension. However, there are issues if
7
- # consuming them via Gem.install;
8
- #
9
- # * Net::HTTP is unreliable. (SSL certificate issues, OpenSSL performance
10
- # freeze under Windows)
11
- # * Compiled extensions cannot be installed like this as they require
12
- # DevKit.
13
- # * While downloading and installing SketchUp freezes. (Bad thing if done
14
- # automatically upon loading the extensions - especially without user
15
- # notice. It's easy to think SU have stopped working)
16
- # * Version collisions. If multiple extensions want to use different
17
- # versions of a gem they will clash if the versions aren't compatible
18
- # with the features they use.
19
- #
20
- # They only way to ensure extensions doesn't clash is to namespace
21
- # everything into extension namespace. This means making a copy of the
22
- # gem you want to use and wrap it in your own namespace.
23
- class GemInstall < SketchUp::Cop
24
-
25
- include RangeHelp
26
- include SketchUp::NoCommentDisable
27
-
28
- MSG = '`Gem.install` is unreliable in SketchUp, and can cause '\
29
- 'extensions to clash.'
30
-
31
- # Reference: http://rubocop.readthedocs.io/en/latest/development/
32
- def_node_matcher :gem_install?, <<-PATTERN
33
- (send (const nil? :Gem) :install ...)
34
- PATTERN
35
-
36
- def on_send(node)
37
- return unless gem_install?(node)
38
-
39
- range = range_with_receiver(node)
40
- add_offense(node, location: range)
41
- end
42
- end
43
- end
44
- end
45
- end
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module SketchupRequirements
6
+ # It's tempting to use gems in an extension. However, there are issues if
7
+ # consuming them via Gem.install;
8
+ #
9
+ # * Net::HTTP is unreliable. (SSL certificate issues, OpenSSL performance
10
+ # freeze under Windows)
11
+ # * Compiled extensions cannot be installed like this as they require
12
+ # DevKit.
13
+ # * While downloading and installing SketchUp freezes. (Bad thing if done
14
+ # automatically upon loading the extensions - especially without user
15
+ # notice. It's easy to think SU have stopped working)
16
+ # * Version collisions. If multiple extensions want to use different
17
+ # versions of a gem they will clash if the versions aren't compatible
18
+ # with the features they use.
19
+ #
20
+ # They only way to ensure extensions doesn't clash is to namespace
21
+ # everything into extension namespace. This means making a copy of the
22
+ # gem you want to use and wrap it in your own namespace.
23
+ class GemInstall < SketchUp::Cop
24
+
25
+ include RangeHelp
26
+ include SketchUp::NoCommentDisable
27
+
28
+ MSG = '`Gem.install` is unreliable in SketchUp, and can cause ' \
29
+ 'extensions to clash.'
30
+
31
+ # Reference: http://rubocop.readthedocs.io/en/latest/development/
32
+ def_node_matcher :gem_install?, <<-PATTERN
33
+ (send (const nil? :Gem) :install ...)
34
+ PATTERN
35
+
36
+ def on_send(node)
37
+ return unless gem_install?(node)
38
+
39
+ range = range_with_receiver(node)
40
+ add_offense(node, location: range)
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -1,95 +1,95 @@
1
- # frozen_string_literal: true
2
-
3
- module RuboCop
4
- module Cop
5
- module SketchupRequirements
6
- # Don't attempt to kill the Ruby interpreter by calling `exit` or `exit!`.
7
- # SketchUp will trap `exit` and prevent that, with a message in the
8
- # console. But `exit!` is not trapped and with terminate SketchUp without
9
- # shutting down cleanly.
10
- #
11
- # Use `return`, `next`, `break` or `raise` instead.
12
- class GetExtensionLicense < SketchUp::Cop
13
-
14
- include RangeHelp
15
- include SketchUp::NoCommentDisable
16
-
17
- MSG_INVALID = 'Invalid extension GUID'
18
-
19
- MSG_WRONG_TYPE = 'Only pass in extension GUID from local string '\
20
- 'literals.'
21
-
22
- MSG_TRAILING_SPACE = 'Extra space in extension GUID'
23
-
24
- def_node_matcher :get_extension_license, <<-PATTERN
25
- (send
26
- (const
27
- (const nil? :Sketchup) :Licensing) :get_extension_license
28
- $_)
29
- PATTERN
30
-
31
- # rubocop:disable Layout/LineLength
32
- EXTENSION_ID_PATTERN = /^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/.freeze
33
- # rubocop:enable Layout/LineLength
34
-
35
- def on_send(node)
36
- argument = get_extension_license(node)
37
- return unless argument
38
-
39
- if argument.lvar_type?
40
- variable_name = argument.children.first
41
- assignment_node = find_assignment(node, variable_name)
42
- argument = assignment_node.children.last if assignment_node
43
- end
44
-
45
- if argument.str_type?
46
- validate_extension_id(argument)
47
- else
48
- location = argument.loc.expression
49
- add_offense(node, location: location, message: MSG_WRONG_TYPE)
50
- end
51
- end
52
-
53
- private
54
-
55
- def find_assignment(node, variable_name)
56
- scope = node
57
- until scope.parent.nil?
58
- scope = scope.parent
59
- scope.each_child_node { |child|
60
- # next unless child.is_a?(RuboCop::AST::Node)
61
- next unless child.lvasgn_type?
62
- next unless child.children.first == variable_name
63
-
64
- return child
65
- }
66
- end
67
- nil
68
- end
69
-
70
- def validate_extension_id(node)
71
- extension_id = node.str_content
72
-
73
- # Trailing spaces
74
- if extension_id.rstrip.size < extension_id.size
75
- end_pos = node.loc.end.begin_pos
76
- begin_pos = node.loc.begin.end_pos + extension_id.rstrip.size
77
- range = range_between(begin_pos, end_pos)
78
- add_offense(node, location: range, message: MSG_TRAILING_SPACE)
79
- return false
80
- end
81
-
82
- # Invalid format.
83
- unless EXTENSION_ID_PATTERN.match?(extension_id)
84
- range = string_contents_range(node)
85
- add_offense(node, location: range, message: MSG_INVALID)
86
- return false
87
- end
88
-
89
- true
90
- end
91
-
92
- end
93
- end
94
- end
95
- end
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module SketchupRequirements
6
+ # Don't attempt to kill the Ruby interpreter by calling `exit` or `exit!`.
7
+ # SketchUp will trap `exit` and prevent that, with a message in the
8
+ # console. But `exit!` is not trapped and with terminate SketchUp without
9
+ # shutting down cleanly.
10
+ #
11
+ # Use `return`, `next`, `break` or `raise` instead.
12
+ class GetExtensionLicense < SketchUp::Cop
13
+
14
+ include RangeHelp
15
+ include SketchUp::NoCommentDisable
16
+
17
+ MSG_INVALID = 'Invalid extension GUID'
18
+
19
+ MSG_WRONG_TYPE = 'Only pass in extension GUID from local string ' \
20
+ 'literals.'
21
+
22
+ MSG_TRAILING_SPACE = 'Extra space in extension GUID'
23
+
24
+ def_node_matcher :get_extension_license, <<-PATTERN
25
+ (send
26
+ (const
27
+ (const nil? :Sketchup) :Licensing) :get_extension_license
28
+ $_)
29
+ PATTERN
30
+
31
+ # rubocop:disable Layout/LineLength
32
+ EXTENSION_ID_PATTERN = /^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/.freeze
33
+ # rubocop:enable Layout/LineLength
34
+
35
+ def on_send(node)
36
+ argument = get_extension_license(node)
37
+ return unless argument
38
+
39
+ if argument.lvar_type?
40
+ variable_name = argument.children.first
41
+ assignment_node = find_assignment(node, variable_name)
42
+ argument = assignment_node.children.last if assignment_node
43
+ end
44
+
45
+ if argument.str_type?
46
+ validate_extension_id(argument)
47
+ else
48
+ location = argument.loc.expression
49
+ add_offense(node, location: location, message: MSG_WRONG_TYPE)
50
+ end
51
+ end
52
+
53
+ private
54
+
55
+ def find_assignment(node, variable_name)
56
+ scope = node
57
+ until scope.parent.nil?
58
+ scope = scope.parent
59
+ scope.each_child_node { |child|
60
+ # next unless child.is_a?(RuboCop::AST::Node)
61
+ next unless child.lvasgn_type?
62
+ next unless child.children.first == variable_name
63
+
64
+ return child
65
+ }
66
+ end
67
+ nil
68
+ end
69
+
70
+ def validate_extension_id(node)
71
+ extension_id = node.str_content
72
+
73
+ # Trailing spaces
74
+ if extension_id.rstrip.size < extension_id.size
75
+ end_pos = node.loc.end.begin_pos
76
+ begin_pos = node.loc.begin.end_pos + extension_id.rstrip.size
77
+ range = range_between(begin_pos, end_pos)
78
+ add_offense(node, location: range, message: MSG_TRAILING_SPACE)
79
+ return false
80
+ end
81
+
82
+ # Invalid format.
83
+ unless EXTENSION_ID_PATTERN.match?(extension_id)
84
+ range = string_contents_range(node)
85
+ add_offense(node, location: range, message: MSG_INVALID)
86
+ return false
87
+ end
88
+
89
+ true
90
+ end
91
+
92
+ end
93
+ end
94
+ end
95
+ end
@@ -1,38 +1,38 @@
1
- # frozen_string_literal: true
2
-
3
- module RuboCop
4
- module Cop
5
- module SketchupRequirements
6
- # Extensions in SketchUp all share the same Ruby environment on the user's
7
- # machine. Because of this it's important that each extension isolate
8
- # itself to avoid clashing with other extensions.
9
- #
10
- # Extensions submitted to Extension Warehouse is expected to not define
11
- # global constants.
12
- class GlobalConstants < SketchUp::Cop
13
-
14
- include SketchUp::NoCommentDisable
15
- include SketchUp
16
-
17
- MSG = 'Do not introduce global constants.'
18
-
19
- def_node_matcher :namespaced_constant?, <<-PATTERN
20
- (casgn
21
- (const _ _) ...
22
- )
23
- PATTERN
24
-
25
- # Constant assignment.
26
- def on_casgn(node)
27
- return if namespaced_constant?(node)
28
-
29
- namespace = Namespace.new(node.parent_module_name)
30
- return unless namespace.top_level?
31
-
32
- add_offense(node, location: :name)
33
- end
34
-
35
- end
36
- end
37
- end
38
- end
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module SketchupRequirements
6
+ # Extensions in SketchUp all share the same Ruby environment on the user's
7
+ # machine. Because of this it's important that each extension isolate
8
+ # itself to avoid clashing with other extensions.
9
+ #
10
+ # Extensions submitted to Extension Warehouse is expected to not define
11
+ # global constants.
12
+ class GlobalConstants < SketchUp::Cop
13
+
14
+ include SketchUp::NoCommentDisable
15
+ include SketchUp
16
+
17
+ MSG = 'Do not introduce global constants.'
18
+
19
+ def_node_matcher :namespaced_constant?, <<-PATTERN
20
+ (casgn
21
+ (const _ _) ...
22
+ )
23
+ PATTERN
24
+
25
+ # Constant assignment.
26
+ def on_casgn(node)
27
+ return if namespaced_constant?(node)
28
+
29
+ namespace = Namespace.new(node.parent_module_name)
30
+ return unless namespace.top_level?
31
+
32
+ add_offense(node, location: :name)
33
+ end
34
+
35
+ end
36
+ end
37
+ end
38
+ end
@@ -1,42 +1,42 @@
1
- # frozen_string_literal: true
2
-
3
- module RuboCop
4
- module Cop
5
- module SketchupRequirements
6
- # Extensions in SketchUp all share the same Ruby environment on the user's
7
- # machine. Because of this it's important that each extension isolate
8
- # itself to avoid clashing with other extensions.
9
- #
10
- # Extensions submitted to Extension Warehouse is expected to not pollute
11
- # the global namespace by including mix-in modules.
12
- class GlobalInclude < SketchUp::Cop
13
-
14
- include SketchUp::NoCommentDisable
15
- include SketchUp
16
-
17
- MSG = 'Do not include into global namespace.'
18
-
19
- def_node_matcher :is_include?, <<-PATTERN
20
- (send nil? :include ...)
21
- PATTERN
22
-
23
- def on_send(node)
24
- return unless global_include?(node)
25
-
26
- add_offense(node, location: :selector)
27
- end
28
-
29
- private
30
-
31
- def global_include?(node)
32
- is_include?(node) && global_namespace?(node)
33
- end
34
-
35
- def global_namespace?(node)
36
- %w[Kernel Object].include?(node.parent_module_name)
37
- end
38
-
39
- end
40
- end
41
- end
42
- end
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module SketchupRequirements
6
+ # Extensions in SketchUp all share the same Ruby environment on the user's
7
+ # machine. Because of this it's important that each extension isolate
8
+ # itself to avoid clashing with other extensions.
9
+ #
10
+ # Extensions submitted to Extension Warehouse is expected to not pollute
11
+ # the global namespace by including mix-in modules.
12
+ class GlobalInclude < SketchUp::Cop
13
+
14
+ include SketchUp::NoCommentDisable
15
+ include SketchUp
16
+
17
+ MSG = 'Do not include into global namespace.'
18
+
19
+ def_node_matcher :is_include?, <<-PATTERN
20
+ (send nil? :include ...)
21
+ PATTERN
22
+
23
+ def on_send(node)
24
+ return unless global_include?(node)
25
+
26
+ add_offense(node, location: :selector)
27
+ end
28
+
29
+ private
30
+
31
+ def global_include?(node)
32
+ is_include?(node) && global_namespace?(node)
33
+ end
34
+
35
+ def global_namespace?(node)
36
+ %w[Kernel Object].include?(node.parent_module_name)
37
+ end
38
+
39
+ end
40
+ end
41
+ end
42
+ end
@@ -1,65 +1,65 @@
1
- # frozen_string_literal: true
2
-
3
- module RuboCop
4
- module Cop
5
- module SketchupRequirements
6
- # Extensions in SketchUp all share the same Ruby environment on the user's
7
- # machine. Because of this it's important that each extension isolate
8
- # itself to avoid clashing with other extensions.
9
- #
10
- # Extensions submitted to Extension Warehouse is expected to not define
11
- # global methods.
12
- class GlobalMethods < SketchUp::Cop
13
-
14
- include SketchUp::NoCommentDisable
15
- include SketchUp
16
-
17
- MSG = 'Do not introduce global methods.'
18
-
19
- # Reference: http://www.rubydoc.info/gems/rubocop/RuboCop/NodePattern
20
- #
21
- # Matchers for methods defined with this syntax:
22
- #
23
- # def Example.foo
24
- # end
25
- #
26
- # def (Example::Foo).bar
27
- # end
28
-
29
- def_node_matcher :class_method?, <<-PATTERN
30
- (defs
31
- (const _ _) ...
32
- )
33
- PATTERN
34
-
35
- def_node_matcher :class_method, <<-PATTERN
36
- (defs
37
- {
38
- (const nil? $_)
39
- (const (const nil? $_) ...)
40
- }
41
- ...
42
- )
43
- PATTERN
44
-
45
- def on_def(node)
46
- if class_method?(node)
47
- class_method_parent = class_method(node)
48
- namespace = Namespace.new(class_method_parent.to_s)
49
- else
50
- # If a method is defined inside a block then parent_module_name
51
- # will return nil.
52
- return if node.parent_module_name.nil?
53
-
54
- namespace = Namespace.new(node.parent_module_name)
55
- end
56
- return unless namespace.top_level?
57
-
58
- add_offense(node, location: :name)
59
- end
60
- alias on_defs on_def
61
-
62
- end
63
- end
64
- end
65
- end
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module SketchupRequirements
6
+ # Extensions in SketchUp all share the same Ruby environment on the user's
7
+ # machine. Because of this it's important that each extension isolate
8
+ # itself to avoid clashing with other extensions.
9
+ #
10
+ # Extensions submitted to Extension Warehouse is expected to not define
11
+ # global methods.
12
+ class GlobalMethods < SketchUp::Cop
13
+
14
+ include SketchUp::NoCommentDisable
15
+ include SketchUp
16
+
17
+ MSG = 'Do not introduce global methods.'
18
+
19
+ # Reference: http://www.rubydoc.info/gems/rubocop/RuboCop/NodePattern
20
+ #
21
+ # Matchers for methods defined with this syntax:
22
+ #
23
+ # def Example.foo
24
+ # end
25
+ #
26
+ # def (Example::Foo).bar
27
+ # end
28
+
29
+ def_node_matcher :class_method?, <<-PATTERN
30
+ (defs
31
+ (const _ _) ...
32
+ )
33
+ PATTERN
34
+
35
+ def_node_matcher :class_method, <<-PATTERN
36
+ (defs
37
+ {
38
+ (const nil? $_)
39
+ (const (const nil? $_) ...)
40
+ }
41
+ ...
42
+ )
43
+ PATTERN
44
+
45
+ def on_def(node)
46
+ if class_method?(node)
47
+ class_method_parent = class_method(node)
48
+ namespace = Namespace.new(class_method_parent.to_s)
49
+ else
50
+ # If a method is defined inside a block then parent_module_name
51
+ # will return nil.
52
+ return if node.parent_module_name.nil?
53
+
54
+ namespace = Namespace.new(node.parent_module_name)
55
+ end
56
+ return unless namespace.top_level?
57
+
58
+ add_offense(node, location: :name)
59
+ end
60
+ alias on_defs on_def
61
+
62
+ end
63
+ end
64
+ end
65
+ end