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,108 +1,108 @@
1
- # frozen_string_literal: true
2
-
3
- require 'rubocop/sketchup/cop/requirements/api_namespace'
4
- require 'rubocop/sketchup/cop/requirements/ruby_core_namespace'
5
- require 'rubocop/sketchup/cop/requirements/ruby_stdlib_namespace'
6
-
7
- module RuboCop
8
- module Cop
9
- module SketchupRequirements
10
- # Extensions in SketchUp all share the same Ruby environment on the user's
11
- # machine. Because of this it's important that each extension isolate
12
- # itself to avoid clashing with other extensions.
13
- #
14
- # Extensions submitted to Extension Warehouse is expected to use only one
15
- # root module.
16
- #
17
- # @example Good - this contains everything in the extension.
18
- # module MyExtension
19
- # class Foo
20
- # end
21
- # class Bar
22
- # end
23
- # end
24
- #
25
- # @example Better - this further reduce chance of clashing.
26
- # module MyCompany
27
- # module MyExtension
28
- # class Foo
29
- # end
30
- # class Bar
31
- # end
32
- # end
33
- # end
34
- class ExtensionNamespace < SketchUp::Cop
35
-
36
- include SketchUp::NoCommentDisable
37
- include SketchUp
38
-
39
- def on_class(node)
40
- check_class_or_module(node)
41
- end
42
-
43
- def on_module(node)
44
- check_class_or_module(node)
45
- end
46
-
47
- def check_class_or_module(node)
48
- name = node.defined_module_name
49
- parent = Namespace.new(node.parent_module_name)
50
- namespace = parent.join(name)
51
- # Don't want to process anything that aren't top level namespaces.
52
- return unless parent.top_level?
53
- # Don't check excluded namespaces.
54
- return if exempted?(namespace)
55
-
56
- check_namespace(node, namespace)
57
- end
58
-
59
- # Class variables are normally frowned upon since they leak through all
60
- # instances. However, in this case this is exactly what we want.
61
- # The Cop picks up the first top level namespace it encounters and then
62
- # keep track of whether it detects more top level namespaces.
63
- @@namespace = nil
64
- def check_namespace(node, namespace)
65
- # Make sure the namespace isn't part of reserved namespaces that other
66
- # cops are checking.
67
- return if reserved?(namespace)
68
-
69
- # Remember the first namespace encountered and log an offence if
70
- # more top level namespaces are registered.
71
- top = namespace.first
72
- @@namespace ||= top
73
- return if @@namespace == top
74
-
75
- add_offense(node, location: :name)
76
- end
77
-
78
- def reserved?(namespace)
79
- top = namespace.first
80
- return true if RubyCoreNamespace::NAMESPACES.include?(top)
81
- return true if RubyStdLibNamespace::NAMESPACES.include?(top)
82
- return true if ApiNamespace::NAMESPACES.include?(top)
83
-
84
- false
85
- end
86
-
87
- def message(node)
88
- namespace = Namespace.new(node.defined_module_name).from_root
89
- format('Use a single root namespace. '\
90
- '(Found `%<found>s`; Previously found `%<expected>s`)',
91
- found: namespace, expected: @@namespace)
92
- end
93
-
94
- def exempted?(namespace)
95
- namespace_exceptions.include?(namespace.first)
96
- end
97
-
98
- def namespace_exceptions
99
- exceptions = cop_config['Exceptions'] || []
100
- return exceptions if exceptions.is_a?(Array)
101
-
102
- raise 'exceptions needs to be an array of strings!'
103
- end
104
-
105
- end
106
- end
107
- end
108
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'rubocop/sketchup/cop/requirements/api_namespace'
4
+ require 'rubocop/sketchup/cop/requirements/ruby_core_namespace'
5
+ require 'rubocop/sketchup/cop/requirements/ruby_stdlib_namespace'
6
+
7
+ module RuboCop
8
+ module Cop
9
+ module SketchupRequirements
10
+ # Extensions in SketchUp all share the same Ruby environment on the user's
11
+ # machine. Because of this it's important that each extension isolate
12
+ # itself to avoid clashing with other extensions.
13
+ #
14
+ # Extensions submitted to Extension Warehouse is expected to use only one
15
+ # root module.
16
+ #
17
+ # @example Good - this contains everything in the extension.
18
+ # module MyExtension
19
+ # class Foo
20
+ # end
21
+ # class Bar
22
+ # end
23
+ # end
24
+ #
25
+ # @example Better - this further reduce chance of clashing.
26
+ # module MyCompany
27
+ # module MyExtension
28
+ # class Foo
29
+ # end
30
+ # class Bar
31
+ # end
32
+ # end
33
+ # end
34
+ class ExtensionNamespace < SketchUp::Cop
35
+
36
+ include SketchUp::NoCommentDisable
37
+ include SketchUp
38
+
39
+ def on_class(node)
40
+ check_class_or_module(node)
41
+ end
42
+
43
+ def on_module(node)
44
+ check_class_or_module(node)
45
+ end
46
+
47
+ def check_class_or_module(node)
48
+ name = node.defined_module_name
49
+ parent = Namespace.new(node.parent_module_name)
50
+ namespace = parent.join(name)
51
+ # Don't want to process anything that aren't top level namespaces.
52
+ return unless parent.top_level?
53
+ # Don't check excluded namespaces.
54
+ return if exempted?(namespace)
55
+
56
+ check_namespace(node, namespace)
57
+ end
58
+
59
+ # Class variables are normally frowned upon since they leak through all
60
+ # instances. However, in this case this is exactly what we want.
61
+ # The Cop picks up the first top level namespace it encounters and then
62
+ # keep track of whether it detects more top level namespaces.
63
+ @@namespace = nil
64
+ def check_namespace(node, namespace)
65
+ # Make sure the namespace isn't part of reserved namespaces that other
66
+ # cops are checking.
67
+ return if reserved?(namespace)
68
+
69
+ # Remember the first namespace encountered and log an offence if
70
+ # more top level namespaces are registered.
71
+ top = namespace.first
72
+ @@namespace ||= top
73
+ return if @@namespace == top
74
+
75
+ add_offense(node, location: :name)
76
+ end
77
+
78
+ def reserved?(namespace)
79
+ top = namespace.first
80
+ return true if RubyCoreNamespace::NAMESPACES.include?(top)
81
+ return true if RubyStdLibNamespace::NAMESPACES.include?(top)
82
+ return true if ApiNamespace::NAMESPACES.include?(top)
83
+
84
+ false
85
+ end
86
+
87
+ def message(node)
88
+ namespace = Namespace.new(node.defined_module_name).from_root
89
+ format('Use a single root namespace. '\
90
+ '(Found `%<found>s`; Previously found `%<expected>s`)',
91
+ found: namespace, expected: @@namespace)
92
+ end
93
+
94
+ def exempted?(namespace)
95
+ namespace_exceptions.include?(namespace.first)
96
+ end
97
+
98
+ def namespace_exceptions
99
+ exceptions = cop_config['Exceptions'] || []
100
+ return exceptions if exceptions.is_a?(Array)
101
+
102
+ raise 'exceptions needs to be an array of strings!'
103
+ end
104
+
105
+ end
106
+ end
107
+ end
108
+ end
@@ -1,97 +1,97 @@
1
- # frozen_string_literal: true
2
-
3
- module RuboCop
4
- module Cop
5
- module SketchupRequirements
6
- # Check that the extension conform to expected file structure with a
7
- # single root .rb file and a support folder with matching name.
8
- #
9
- # Make sure to match upper and lower case characters between the root .rb
10
- # file and the support folder.
11
- #
12
- # @example
13
- # SketchUp/Plugins
14
- # + ex_hello_world.rb
15
- # + ex_hello_world
16
- # + main.rb
17
- # + ...
18
- class FileStructure < SketchUp::Cop
19
-
20
- include SketchUp::NoCommentDisable
21
- include SketchUp::ExtensionProject
22
- include RangeHelp
23
-
24
- IGNORED_DIRECTORIES = %w[
25
- __MACOSX
26
- ].freeze
27
-
28
- def investigate(processed_source)
29
- return if already_run?
30
-
31
- # Using range similar to RuboCop::Cop::Naming::Filename (file_name.rb)
32
- range = source_range(processed_source.buffer, 1, 0)
33
-
34
- # Find all root Ruby files in the source directory.
35
- pattern = "#{source_path}/*.rb"
36
- root_ruby_files = Dir.glob(pattern)
37
-
38
- # Ensure there is only one root Ruby file.
39
- if root_ruby_files.size != 1
40
- msg = 'Extensions must have exactly one root Ruby (.rb) file. '\
41
- 'Found: %d'
42
- add_offense(nil,
43
- location: range,
44
- message: format(msg, root_ruby_files.size))
45
- return
46
- end
47
-
48
- # Find the root file and collect the sub-directories.
49
- root_file = root_ruby_files.first
50
- extension_basename = File.basename(root_file, '.*')
51
- sub_folders = source_path.children.select(&:directory?)
52
- sub_folders.reject! { |folder|
53
- IGNORED_DIRECTORIES.include?(folder.basename.to_s)
54
- }
55
-
56
- # Ensure there is only one sub-directory.
57
- if sub_folders.size != 1
58
- msg = 'Extensions must have exactly one support directory. Found %d'
59
- add_offense(nil,
60
- location: range,
61
- message: format(msg, sub_folders.size))
62
- return
63
- end
64
-
65
- # Ensure support directory's name match the root Ruby file.
66
- support_directory = sub_folders.first
67
- unless support_directory.basename.to_s == extension_basename
68
- msg = 'Extensions must have a support directory matching the name '\
69
- 'of the root Ruby file. Expected %s, found %s'
70
- msg = format(msg, extension_basename, support_directory.basename)
71
- add_offense(nil,
72
- location: range,
73
- message: msg)
74
- end
75
- end
76
-
77
- private
78
-
79
- @@already_run = false
80
-
81
- def already_run?
82
- return true if @@already_run
83
-
84
- @@already_run = true
85
- false
86
- end
87
-
88
- # rubocop:disable Lint/IneffectiveAccessModifier
89
- def self.reset
90
- @@already_run = false
91
- end
92
- # rubocop:enable Lint/IneffectiveAccessModifier
93
-
94
- end
95
- end
96
- end
97
- end
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module SketchupRequirements
6
+ # Check that the extension conform to expected file structure with a
7
+ # single root .rb file and a support folder with matching name.
8
+ #
9
+ # Make sure to match upper and lower case characters between the root .rb
10
+ # file and the support folder.
11
+ #
12
+ # @example
13
+ # SketchUp/Plugins
14
+ # + ex_hello_world.rb
15
+ # + ex_hello_world
16
+ # + main.rb
17
+ # + ...
18
+ class FileStructure < SketchUp::Cop
19
+
20
+ include SketchUp::NoCommentDisable
21
+ include SketchUp::ExtensionProject
22
+ include RangeHelp
23
+
24
+ IGNORED_DIRECTORIES = %w[
25
+ __MACOSX
26
+ ].freeze
27
+
28
+ def investigate(processed_source)
29
+ return if already_run?
30
+
31
+ # Using range similar to RuboCop::Cop::Naming::Filename (file_name.rb)
32
+ range = source_range(processed_source.buffer, 1, 0)
33
+
34
+ # Find all root Ruby files in the source directory.
35
+ pattern = "#{source_path}/*.rb"
36
+ root_ruby_files = Dir.glob(pattern)
37
+
38
+ # Ensure there is only one root Ruby file.
39
+ if root_ruby_files.size != 1
40
+ msg = 'Extensions must have exactly one root Ruby (.rb) file. '\
41
+ 'Found: %d'
42
+ add_offense(nil,
43
+ location: range,
44
+ message: format(msg, root_ruby_files.size))
45
+ return
46
+ end
47
+
48
+ # Find the root file and collect the sub-directories.
49
+ root_file = root_ruby_files.first
50
+ extension_basename = File.basename(root_file, '.*')
51
+ sub_folders = source_path.children.select(&:directory?)
52
+ sub_folders.reject! { |folder|
53
+ IGNORED_DIRECTORIES.include?(folder.basename.to_s)
54
+ }
55
+
56
+ # Ensure there is only one sub-directory.
57
+ if sub_folders.size != 1
58
+ msg = 'Extensions must have exactly one support directory. Found %d'
59
+ add_offense(nil,
60
+ location: range,
61
+ message: format(msg, sub_folders.size))
62
+ return
63
+ end
64
+
65
+ # Ensure support directory's name match the root Ruby file.
66
+ support_directory = sub_folders.first
67
+ unless support_directory.basename.to_s == extension_basename
68
+ msg = 'Extensions must have a support directory matching the name '\
69
+ 'of the root Ruby file. Expected %s, found %s'
70
+ msg = format(msg, extension_basename, support_directory.basename)
71
+ add_offense(nil,
72
+ location: range,
73
+ message: msg)
74
+ end
75
+ end
76
+
77
+ private
78
+
79
+ @@already_run = false
80
+
81
+ def already_run?
82
+ return true if @@already_run
83
+
84
+ @@already_run = true
85
+ false
86
+ end
87
+
88
+ # rubocop:disable Lint/IneffectiveAccessModifier
89
+ def self.reset
90
+ @@already_run = false
91
+ end
92
+ # rubocop:enable Lint/IneffectiveAccessModifier
93
+
94
+ end
95
+ end
96
+ end
97
+ end
@@ -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.'.freeze
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.'.freeze
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