Skip to content
代码片段 群组 项目
提交 a449177a 编辑于 作者: John Mason's avatar John Mason 提交者: Peter Leitzen
浏览文件

Add search namespace rubocop

上级 b581221d
No related branches found
No related tags found
无相关合并请求
......@@ -966,3 +966,16 @@ Cop/FeatureFlagUsage:
Style/ArgumentsForwarding:
Enabled: true
AllowOnlyRestArgument: false
Search/NamespacedClass:
Enabled: true
Exclude:
- 'config/**/*.rb'
- 'db/**/*.rb'
- 'ee/db/**/*.rb'
- 'ee/bin/**/*'
- 'ee/elastic/**/*.rb' # Advanced Search migrations issue: <>
- 'scripts/**/*'
- 'spec/migrations/**/*.rb'
- 'app/experiments/**/*_experiment.rb'
- 'ee/app/experiments/**/*_experiment.rb'
\ No newline at end of file
---
Search/NamespacedClass:
Exclude:
- 'app/controllers/concerns/search_rate_limitable.rb'
- 'app/controllers/search_controller.rb'
- 'app/graphql/resolvers/concerns/project_search_arguments.rb'
- 'app/graphql/resolvers/concerns/search_arguments.rb'
- 'app/graphql/types/issuable_searchable_field_enum.rb'
- 'app/helpers/enable_search_settings_helper.rb'
- 'app/helpers/search_helper.rb'
- 'app/models/concerns/optionally_search.rb'
- 'app/models/concerns/pg_full_text_searchable.rb'
- 'app/models/issues/search_data.rb'
- 'app/presenters/packages/nuget/search_results_presenter.rb'
- 'app/presenters/search_service_presenter.rb'
- 'app/services/packages/conan/search_service.rb'
- 'app/services/packages/nuget/search_service.rb'
- 'app/services/search_service.rb'
- 'ee/app/controllers/admin/elasticsearch_controller.rb'
- 'ee/app/controllers/ee/search_controller.rb'
- 'ee/app/graphql/types/iteration_searchable_field_enum.rb'
- 'ee/app/helpers/ee/search_helper.rb'
- 'ee/app/models/concerns/elastic/application_versioned_search.rb'
- 'ee/app/models/concerns/elastic/namespace_update.rb'
- 'ee/app/models/concerns/elastic/projects_search.rb'
- 'ee/app/models/concerns/elastic/repositories_search.rb'
- 'ee/app/models/concerns/elastic/snippets_search.rb'
- 'ee/app/models/concerns/elastic/wiki_repositories_search.rb'
- 'ee/app/models/concerns/elasticsearch_indexed_container.rb'
- 'ee/app/models/concerns/zoekt/searchable_repository.rb'
- 'ee/app/models/elastic/group_index_status.rb'
- 'ee/app/models/elastic/index_setting.rb'
- 'ee/app/models/elastic/migration_record.rb'
- 'ee/app/models/elastic/reindexing_slice.rb'
- 'ee/app/models/elastic/reindexing_subtask.rb'
- 'ee/app/models/elastic/reindexing_task.rb'
- 'ee/app/models/elasticsearch_indexed_namespace.rb'
- 'ee/app/models/elasticsearch_indexed_project.rb'
- 'ee/app/models/zoekt/indexed_namespace.rb'
- 'ee/app/models/zoekt/shard.rb'
- 'ee/app/presenters/ee/search_service_presenter.rb'
- 'ee/app/services/ee/search_service.rb'
- 'ee/app/services/elastic/bookkeeping_shard_service.rb'
- 'ee/app/services/elastic/cluster_reindexing_service.rb'
- 'ee/app/services/elastic/data_migration_service.rb'
- 'ee/app/services/elastic/index_projects_by_id_service.rb'
- 'ee/app/services/elastic/index_projects_by_range_service.rb'
- 'ee/app/services/elastic/index_projects_service.rb'
- 'ee/app/services/elastic/indexing_control_service.rb'
- 'ee/app/services/elastic/process_bookkeeping_service.rb'
- 'ee/app/services/elastic/process_initial_bookkeeping_service.rb'
- 'ee/app/services/integrations/slack_options/label_search_handler.rb'
- 'ee/app/services/integrations/slack_options/user_search_handler.rb'
- 'ee/app/services/protected_environments/search_service.rb'
- 'ee/app/workers/concerns/elastic/bulk_cron_worker.rb'
- 'ee/app/workers/concerns/elastic/indexing_control.rb'
- 'ee/app/workers/concerns/elastic/migration_backfill_helper.rb'
- 'ee/app/workers/concerns/elastic/migration_helper.rb'
- 'ee/app/workers/concerns/elastic/migration_obsolete.rb'
- 'ee/app/workers/concerns/elastic/migration_options.rb'
- 'ee/app/workers/concerns/elastic/migration_remove_fields_helper.rb'
- 'ee/app/workers/concerns/elastic/migration_state.rb'
- 'ee/app/workers/concerns/elastic/migration_update_mappings_helper.rb'
- 'ee/app/workers/elastic/migration_worker.rb'
- 'ee/app/workers/elastic/namespace_update_worker.rb'
- 'ee/app/workers/elastic/project_transfer_worker.rb'
- 'ee/app/workers/elastic_association_indexer_worker.rb'
- 'ee/app/workers/elastic_cluster_reindexing_cron_worker.rb'
- 'ee/app/workers/elastic_commit_indexer_worker.rb'
- 'ee/app/workers/elastic_delete_project_worker.rb'
- 'ee/app/workers/elastic_full_index_worker.rb'
- 'ee/app/workers/elastic_index_bulk_cron_worker.rb'
- 'ee/app/workers/elastic_index_initial_bulk_cron_worker.rb'
- 'ee/app/workers/elastic_indexing_control_worker.rb'
- 'ee/app/workers/elastic_namespace_indexer_worker.rb'
- 'ee/app/workers/elastic_namespace_rollout_worker.rb'
- 'ee/app/workers/elastic_remove_expired_namespace_subscriptions_from_index_cron_worker.rb'
- 'ee/app/workers/zoekt/indexer_worker.rb'
- 'ee/lib/api/elasticsearch_indexed_namespaces.rb'
- 'ee/lib/ee/api/helpers/search_helpers.rb'
- 'ee/lib/ee/gitlab/group_search_results.rb'
- 'ee/lib/ee/gitlab/search/parsed_query.rb'
- 'ee/lib/ee/gitlab/search_context.rb'
- 'ee/lib/ee/gitlab/search_results.rb'
- 'ee/lib/ee/gitlab/snippet_search_results.rb'
- 'ee/lib/elastic/as_json.rb'
- 'ee/lib/elastic/class_proxy_util.rb'
- 'ee/lib/elastic/instance_proxy_util.rb'
- 'ee/lib/elastic/latest/application_class_proxy.rb'
- 'ee/lib/elastic/latest/application_instance_proxy.rb'
- 'ee/lib/elastic/latest/commit_config.rb'
- 'ee/lib/elastic/latest/config.rb'
- 'ee/lib/elastic/latest/custom_language_analyzers.rb'
- 'ee/lib/elastic/latest/document_should_be_deleted_from_index_error.rb'
- 'ee/lib/elastic/latest/git_class_proxy.rb'
- 'ee/lib/elastic/latest/git_instance_proxy.rb'
- 'ee/lib/elastic/latest/issue_class_proxy.rb'
- 'ee/lib/elastic/latest/issue_config.rb'
- 'ee/lib/elastic/latest/issue_instance_proxy.rb'
- 'ee/lib/elastic/latest/merge_request_class_proxy.rb'
- 'ee/lib/elastic/latest/merge_request_config.rb'
- 'ee/lib/elastic/latest/merge_request_instance_proxy.rb'
- 'ee/lib/elastic/latest/milestone_class_proxy.rb'
- 'ee/lib/elastic/latest/milestone_instance_proxy.rb'
- 'ee/lib/elastic/latest/note_class_proxy.rb'
- 'ee/lib/elastic/latest/note_config.rb'
- 'ee/lib/elastic/latest/note_instance_proxy.rb'
- 'ee/lib/elastic/latest/project_class_proxy.rb'
- 'ee/lib/elastic/latest/project_instance_proxy.rb'
- 'ee/lib/elastic/latest/project_wiki_class_proxy.rb'
- 'ee/lib/elastic/latest/project_wiki_instance_proxy.rb'
- 'ee/lib/elastic/latest/query_context.rb'
- 'ee/lib/elastic/latest/repository_class_proxy.rb'
- 'ee/lib/elastic/latest/repository_instance_proxy.rb'
- 'ee/lib/elastic/latest/routing.rb'
- 'ee/lib/elastic/latest/snippet_class_proxy.rb'
- 'ee/lib/elastic/latest/snippet_instance_proxy.rb'
- 'ee/lib/elastic/latest/state_filter.rb'
- 'ee/lib/elastic/latest/user_class_proxy.rb'
- 'ee/lib/elastic/latest/user_config.rb'
- 'ee/lib/elastic/latest/user_instance_proxy.rb'
- 'ee/lib/elastic/metrics_update_service.rb'
- 'ee/lib/elastic/migration.rb'
- 'ee/lib/elastic/multi_version_class_proxy.rb'
- 'ee/lib/elastic/multi_version_instance_proxy.rb'
- 'ee/lib/elastic/multi_version_util.rb'
- 'ee/lib/elastic/timeout_error.rb'
- 'ee/lib/elastic/v12p1/application_class_proxy.rb'
- 'ee/lib/elastic/v12p1/application_instance_proxy.rb'
- 'ee/lib/elastic/v12p1/config.rb'
- 'ee/lib/elastic/v12p1/issue_class_proxy.rb'
- 'ee/lib/elastic/v12p1/issue_instance_proxy.rb'
- 'ee/lib/elastic/v12p1/merge_request_class_proxy.rb'
- 'ee/lib/elastic/v12p1/merge_request_instance_proxy.rb'
- 'ee/lib/elastic/v12p1/milestone_class_proxy.rb'
- 'ee/lib/elastic/v12p1/milestone_instance_proxy.rb'
- 'ee/lib/elastic/v12p1/note_class_proxy.rb'
- 'ee/lib/elastic/v12p1/note_instance_proxy.rb'
- 'ee/lib/elastic/v12p1/project_class_proxy.rb'
- 'ee/lib/elastic/v12p1/project_instance_proxy.rb'
- 'ee/lib/elastic/v12p1/project_wiki_class_proxy.rb'
- 'ee/lib/elastic/v12p1/project_wiki_instance_proxy.rb'
- 'ee/lib/elastic/v12p1/repository_class_proxy.rb'
- 'ee/lib/elastic/v12p1/repository_instance_proxy.rb'
- 'ee/lib/elastic/v12p1/routing.rb'
- 'ee/lib/elastic/v12p1/snippet_class_proxy.rb'
- 'ee/lib/elastic/v12p1/snippet_instance_proxy.rb'
- 'ee/lib/elastic/v12p1/user_class_proxy.rb'
- 'ee/lib/elastic/v12p1/user_instance_proxy.rb'
- 'ee/lib/gem_extensions/elasticsearch/model/adapter/active_record/importing.rb'
- 'ee/lib/gem_extensions/elasticsearch/model/adapter/multiple/records.rb'
- 'ee/lib/gem_extensions/elasticsearch/model/client.rb'
- 'ee/lib/gem_extensions/elasticsearch/model/indexing/instance_methods.rb'
- 'ee/lib/gem_extensions/elasticsearch/model/response/records.rb'
- 'ee/lib/gitlab/elastic/bool_expr.rb'
- 'ee/lib/gitlab/elastic/bulk_indexer.rb'
- 'ee/lib/gitlab/elastic/client.rb'
- 'ee/lib/gitlab/elastic/document_reference.rb'
- 'ee/lib/gitlab/elastic/elasticsearch_enabled_cache.rb'
- 'ee/lib/gitlab/elastic/expr_name.rb'
- 'ee/lib/gitlab/elastic/group_search_results.rb'
- 'ee/lib/gitlab/elastic/helper.rb'
- 'ee/lib/gitlab/elastic/indexer.rb'
- 'ee/lib/gitlab/elastic/project_search_results.rb'
- 'ee/lib/gitlab/elastic/search_results.rb'
- 'ee/lib/gitlab/elastic/snippet_search_results.rb'
- 'ee/lib/gitlab/metrics/global_search_indexing_slis.rb'
- 'ee/lib/gitlab/metrics/samplers/global_search_sampler.rb'
- 'ee/lib/gitlab/search/aggregation.rb'
- 'ee/lib/gitlab/search/aggregation_parser.rb'
- 'ee/lib/gitlab/search/client.rb'
- 'ee/lib/gitlab/search/index_curator.rb'
- 'ee/lib/gitlab/search/recent_epics.rb'
- 'ee/lib/gitlab/usage/metrics/instrumentations/advanced_search/build_type_metric.rb'
- 'ee/lib/gitlab/usage/metrics/instrumentations/advanced_search/distribution_metric.rb'
- 'ee/lib/gitlab/usage/metrics/instrumentations/advanced_search/lucene_version_metric.rb'
- 'ee/lib/gitlab/usage/metrics/instrumentations/advanced_search/version_metric.rb'
- 'ee/lib/gitlab/zoekt/search_results.rb'
- 'ee/lib/system_check/app/advanced_search_migrations_check.rb'
- 'ee/lib/system_check/app/search_check.rb'
- 'ee/lib/zoekt/logger.rb'
- 'ee/spec/support/elastic.rb'
- 'ee/spec/support/elastic_query_name_inspector.rb'
- 'ee/spec/support/helpers/elasticsearch_helpers.rb'
- 'ee/spec/support/helpers/search_results_helpers.rb'
- 'ee/spec/support/zoekt.rb'
- 'lib/api/entities/nuget/search_result.rb'
- 'lib/api/entities/nuget/search_result_version.rb'
- 'lib/api/entities/nuget/search_results.rb'
- 'lib/api/helpers/search_helpers.rb'
- 'lib/gitlab/background_migration/backfill_imported_issue_search_data.rb'
- 'lib/gitlab/background_migration/backfill_issue_search_data.rb'
- 'lib/gitlab/elasticsearch/logger.rb'
- 'lib/gitlab/empty_search_results.rb'
- 'lib/gitlab/github_import/clients/search_repos.rb'
- 'lib/gitlab/group_search_results.rb'
- 'lib/gitlab/instrumentation/elasticsearch_transport.rb'
- 'lib/gitlab/instrumentation/global_search_api.rb'
- 'lib/gitlab/instrumentation/zoekt.rb'
- 'lib/gitlab/metrics/elasticsearch_rack_middleware.rb'
- 'lib/gitlab/metrics/global_search_slis.rb'
- 'lib/gitlab/project_search_results.rb'
- 'lib/gitlab/redacted_search_results_logger.rb'
- 'lib/gitlab/search/abuse_detection.rb'
- 'lib/gitlab/search/abuse_validators/no_abusive_coercion_from_string_validator.rb'
- 'lib/gitlab/search/abuse_validators/no_abusive_term_length_validator.rb'
- 'lib/gitlab/search/found_blob.rb'
- 'lib/gitlab/search/found_wiki_page.rb'
- 'lib/gitlab/search/params.rb'
- 'lib/gitlab/search/parsed_query.rb'
- 'lib/gitlab/search/query.rb'
- 'lib/gitlab/search/recent_issues.rb'
- 'lib/gitlab/search/recent_items.rb'
- 'lib/gitlab/search/recent_merge_requests.rb'
- 'lib/gitlab/search/sort_options.rb'
- 'lib/gitlab/search_context.rb'
- 'lib/gitlab/search_results.rb'
- 'lib/gitlab/slash_commands/issue_search.rb'
- 'lib/gitlab/slash_commands/presenters/issue_search.rb'
- 'lib/gitlab/snippet_search_results.rb'
- 'lib/gitlab/usage_data_counters/search_counter.rb'
- 'lib/peek/views/elasticsearch.rb'
- 'lib/peek/views/zoekt.rb'
- 'qa/qa/ee/page/admin/settings/component/elasticsearch.rb'
- 'qa/qa/ee/resource/settings/elasticsearch.rb'
- 'qa/qa/ee/scenario/test/integration/elasticsearch.rb'
- 'qa/qa/page/search/results.rb'
- 'qa/qa/runtime/search.rb'
- 'spec/support/helpers/filtered_search_helpers.rb'
- 'spec/support/helpers/search_helpers.rb'
- 'spec/support/helpers/search_settings_helpers.rb'
# frozen_string_literal: true
module RuboCop
module Cop
module Search
# Cop that enforces use of Search namespace for search related code.
#
# @example
# # bad
# class MySearchClass
# end
#
# # good
# module Search
# class MySearchClass
# end
# end
class NamespacedClass < RuboCop::Cop::Base
MSG = 'Search related code must be declared inside Search top level namespace. For more info: https://gitlab.com/gitlab-org/gitlab/-/issues/398207'
# These namespaces are considered acceptable.
# Note: Nested namespace like Foo::Bar are also supported.
PERMITTED_NAMESPACES = %w[Search EE::Search API::Search EE::API::Search RuboCop::Cop::Search]
.map { |x| x.split('::') }.freeze
SEARCH_REGEXES = [
/elastic/i,
/zoekt/i,
/search/i
].freeze
def on_module(node)
add_identifiers(node)
run_search_namespace_cop(node) if node.child_nodes.none? { |n| n.module_type? || n.class_type? }
end
def on_class(node)
add_identifiers(node)
run_search_namespace_cop(node)
end
private
def run_search_namespace_cop(node)
add_offense(node.loc.name) if !namespace_allowed? && namespace_search_related?
end
def add_identifiers(node)
identifiers.concat(identifiers_for(node))
end
def identifiers
@identifiers ||= []
end
def identifiers_for(node)
source = node.respond_to?(:identifier) ? node.identifier.source : node.source
source.sub(/^::/, '').split('::')
end
def namespace_allowed?
PERMITTED_NAMESPACES.any? do |namespaces|
identifiers.first(namespaces.size) == namespaces
end
end
def namespace_search_related?
SEARCH_REGEXES.any? { |x| x.match?(identifiers.join('::')) }
end
end
end
end
end
# frozen_string_literal: true
require 'rubocop_spec_helper'
require_relative '../../../../rubocop/cop/search/namespaced_class'
RSpec.describe RuboCop::Cop::Search::NamespacedClass, feature_category: :global_search do
%w[Search Zoekt Elastic].each do |keyword|
context 'when Search root namespace is not used' do
it 'flags a class definition without Search namespace' do
expect_offense(<<~'SOURCE', keyword: keyword, msg: described_class::MSG)
class My%{keyword}Class
^^^{keyword}^^^^^ %{msg}
end
SOURCE
expect_offense(<<~'SOURCE', keyword: keyword, msg: described_class::MSG)
class %{keyword}::MyClass < ApplicationRecord
^{keyword}^^^^^^^^^ %{msg}
def some_method
true
end
end
SOURCE
expect_offense(<<~'SOURCE', keyword: keyword, msg: described_class::MSG)
class MyClass < %{keyword}::Class
^^^^^^^ %{msg}
def some_method
true
end
end
SOURCE
end
it "flags a class definition with #{keyword} in root namespace module" do
expect_offense(<<~'SOURCE', keyword: keyword, msg: described_class::MSG)
module %{keyword}Module
class MyClass < ApplicationRecord
^^^^^^^ %{msg}
def some_method
true
end
end
end
SOURCE
end
it 'flags a module in EE module' do
expect_offense(<<~'SOURCE', keyword: keyword, msg: described_class::MSG)
module EE
module %{keyword}Controller
^{keyword}^^^^^^^^^^ %{msg}
def some_method
true
end
end
end
SOURCE
end
end
context 'when Search root namespace is used' do
it 'does not flag a class definition with Search as root namespace module' do
expect_no_offenses(<<~SOURCE, keyword: keyword)
module Search
class %{keyword}::MyClass < ApplicationRecord
def some_method
true
end
end
end
SOURCE
end
it 'does not a flag a class definition with Search as root namespace inline' do
expect_no_offenses(<<~SOURCE, keyword: keyword)
class Search::%{keyword}::MyClass < ApplicationRecord
def some_method
true
end
end
SOURCE
end
it 'does not a flag a class definition with Search as root namespace in EE' do
expect_no_offenses(<<~SOURCE, keyword: keyword)
module EE
module Search
class %{keyword}::MyClass < ApplicationRecord
def some_method
true
end
end
end
end
SOURCE
end
end
end
end
0% 加载中 .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册