Module: Gitlab::Utils::Override
- Included in:
- API::Helpers::Packages::BasicAuthHelpers, AlertManagement::ProcessPrometheusAlertService, Analytics::UsageTrends::CountJobTriggerWorker, Analytics::UsageTrends::CounterJobWorker, Backup::Database, Backup::Files, Backup::Repositories, BlocksUnsafeSerialization, Boards::Lists::BaseUpdateService, Ci::Build, Ci::PipelineSchedule, Ci::Processable, Commit, DesignManagement::Repository, ExtractsPath, FinderWithCrossProjectAccess, Git::BranchHooksService, AlertManagement::Payload::Prometheus, Analytics::CycleAnalytics::Aggregated::LabelFilter, Analytics::CycleAnalytics::StageEvents::StageEvent, Asciidoc::IncludeProcessor, Auth::Atlassian::IdentityLinker, Auth::Ldap::User, Auth::Saml::IdentityLinker, Auth::Saml::User, BackgroundMigration::CopyCiBuildsColumnsToSecurityScans, BufferedIo, Ci::Config::External::File::Artifact, Ci::Config::External::File::Local, Ci::Config::External::File::Project, Ci::Config::Yaml::Tags::Base, Ci::Pipeline::Chain::Limit::Deployments, Diff::FileCollection::MergeRequestDiffBase, ExceptionsApp, Git::RuggedImpl::Blob::ClassMethods, Git::RuggedImpl::Commit, Git::RuggedImpl::Commit::ClassMethods, Git::RuggedImpl::Repository, Git::RuggedImpl::Tree::ClassMethods, GitAccessDesign, GitAccessProject, GitAccessSnippet, GitAccessWiki, HTTPConnectionAdapter, HealthChecks::MasterCheck, ImportExport::DesignRepoRestorer, ImportExport::DesignRepoSaver, ImportExport::WikiRepoSaver, Jira::HttpClient, Kubernetes::CiliumNetworkPolicy, Kubernetes::NetworkPolicy, NetHttpAdapter, Pagination::Keyset::InOperatorOptimization::OrderByColumnData, SidekiqDaemon::Monitor, SidekiqMiddleware::DuplicateJobs::Strategies::DeduplicatesWhenScheduling, Template::GitlabCiYmlTemplate, Tracking::Destinations::Snowplow, Tracking::Destinations::SnowplowMicro, Gitlab::UserAccessSnippet, GraphqlController, Group, GroupClusterablePresenter, GroupMember, Groups::ChildrenController, Groups::FeatureSetting, GroupsController, Import::BitbucketController, Import::BitbucketServerController, Import::FogbugzController, Import::GiteaController, Import::GithubController, Import::GitlabController, Import::ManifestController, InstanceClusterablePresenter, Integration, Integrations::Buildkite, Integrations::Datadog, Integrations::DroneCi, Integrations::Jenkins, Integrations::Jira, Integrations::Packagist, Integrations::Slack, Issue, IssueLinks::ListService, Issues::BaseService, Issues::MoveService, Jira::Requests::Projects::ListService, Ldap::OmniauthCallbacksController, Measurable, Members::InviteService, MergeRequest, MergeRequests::BaseService, MergeRequests::MergeToRefService, MergeRequests::UpdateService, Metrics::Dashboard::CustomMetricEmbedService, Metrics::Dashboard::TransientEmbedService, Note, PersonalAccessToken, Project, ProjectClusterablePresenter, ProjectFeature, ProjectHook, ProjectMember, Projects::Alerting::NotifyService, Projects::Analytics::CycleAnalytics::StagesController, Projects::BlobController, Projects::CycleAnalyticsController, Projects::GitGarbageCollectWorker, Projects::HashedStorage::MigrateAttachmentsService, Projects::RepositoryStorageMove, Projects::ScheduleBulkRepositoryShardMovesService, Projects::ServiceHookLogsController, Projects::SnippetsController, Projects::UpdateRepositoryStorageWorker, Resolvers::BaseResolver, ServiceHook, Sidebars::Menu, Sidebars::NilMenuItem, Sidebars::Panel, Snippet, Snippets::RepositoryStorageMove, Snippets::ScheduleBulkRepositoryShardMovesService, Snippets::UpdateRepositoryStorageWorker, Todos::Destroy::ConfidentialIssueService, Todos::Destroy::EntityLeaveService, Todos::Destroy::GroupPrivateService, Todos::Destroy::ProjectPrivateService, UserDetail, Users::AuthorizedBuildService, Users::AuthorizedCreateService, Users::RegistrationsBuildService, Wiki, Wikis::GitGarbageCollectWorker
- Defined in:
- lib/gitlab/utils/override.rb
Defined Under Namespace
Classes: Extension
Class Method Summary collapse
Instance Method Summary collapse
- #extended(mod = nil) ⇒ Object
- #included(base = nil) ⇒ Object
- #method_added(method_name) ⇒ Object
-
#override(method_name) ⇒ Object
Instead of writing patterns like this:.
- #prepended(base = nil) ⇒ Object
- #queue_verification(base, verify: false) ⇒ Object
Class Method Details
.extensions ⇒ Object
178 179 180 |
# File 'lib/gitlab/utils/override.rb', line 178 def self.extensions @extensions ||= {} end |
.verify! ⇒ Object
182 183 184 |
# File 'lib/gitlab/utils/override.rb', line 182 def self.verify! extensions.each_value(&:verify!) end |
Instance Method Details
#extended(mod = nil) ⇒ Object
153 154 155 156 157 158 159 160 161 162 163 |
# File 'lib/gitlab/utils/override.rb', line 153 def extended(mod = nil) super # Hack to resolve https://gitlab.com/gitlab-org/gitlab/-/issues/23932 is_not_concern_hack = (mod.is_a?(Class) || !name&.end_with?('::ClassMethods')) if mod && is_not_concern_hack queue_verification(mod.singleton_class) end end |
#included(base = nil) ⇒ Object
140 141 142 143 144 |
# File 'lib/gitlab/utils/override.rb', line 140 def included(base = nil) super queue_verification(base) if base end |
#method_added(method_name) ⇒ Object
126 127 128 129 130 131 132 133 134 135 136 137 138 |
# File 'lib/gitlab/utils/override.rb', line 126 def method_added(method_name) super return unless ENV['STATIC_VERIFICATION'] return unless Override.extensions[self]&.verify_override?(method_name) method_arity = instance_method(method_name).arity if is_a?(Class) Extension.verify_class!(self, method_name, method_arity) else # We delay the check for modules Override.extensions[self].add_method_name(method_name, method_arity) end end |
#override(method_name) ⇒ Object
Instead of writing patterns like this:
def f
raise NotImplementedError unless defined?(super)
true
end
We could write it like:
extend ::Gitlab::Utils::Override
override :f
def f
true
end
This would make sure we're overriding something. See: gitlab.com/gitlab-org/gitlab/issues/1819
119 120 121 122 123 124 |
# File 'lib/gitlab/utils/override.rb', line 119 def override(method_name) return unless ENV['STATIC_VERIFICATION'] Override.extensions[self] ||= Extension.new(self) Override.extensions[self].add_method_name(method_name) end |
#prepended(base = nil) ⇒ Object
146 147 148 149 150 151 |
# File 'lib/gitlab/utils/override.rb', line 146 def prepended(base = nil) super # prepend can override methods, thus we need to verify it like classes queue_verification(base, verify: true) if base end |
#queue_verification(base, verify: false) ⇒ Object
165 166 167 168 169 170 171 172 173 174 175 176 |
# File 'lib/gitlab/utils/override.rb', line 165 def queue_verification(base, verify: false) return unless ENV['STATIC_VERIFICATION'] # We could check for Class in `override` # This could be `nil` if `override` was never called. # We also force verification for prepend because it can also override # a method like a class, but not the cases for include or extend. # This includes Rails helpers but not limited to. if base.is_a?(Class) || verify Override.extensions[self]&.add_class(base) end end |