Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'lib/gitlab/graphql/deprecations_base.rb')
-rw-r--r--lib/gitlab/graphql/deprecations_base.rb48
1 files changed, 48 insertions, 0 deletions
diff --git a/lib/gitlab/graphql/deprecations_base.rb b/lib/gitlab/graphql/deprecations_base.rb
new file mode 100644
index 00000000000..2ee14620907
--- /dev/null
+++ b/lib/gitlab/graphql/deprecations_base.rb
@@ -0,0 +1,48 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Graphql
+ # include DeprecationsBase at the end of the target module
+ module DeprecationsBase
+ NameDeprecation = Struct.new(:old_name, :new_name, :milestone, keyword_init: true)
+
+ def self.included(klass)
+ klass.extend(ClassMethods)
+
+ klass.const_set('OLD_GRAPHQL_NAME_MAP', klass::DEPRECATIONS.index_by do |d|
+ klass.map_graphql_name(d.old_name)
+ end.freeze)
+ klass.const_set('OLD_NAME_MAP', klass::DEPRECATIONS.index_by(&:old_name).freeze)
+ klass.const_set('NEW_NAME_MAP', klass::DEPRECATIONS.index_by(&:new_name).freeze)
+ end
+
+ module ClassMethods
+ def deprecated?(old_name)
+ self::OLD_NAME_MAP.key?(old_name)
+ end
+
+ def deprecation_for(old_name)
+ self::OLD_NAME_MAP[old_name]
+ end
+
+ def deprecation_by(new_name)
+ self::NEW_NAME_MAP[new_name]
+ end
+
+ # Returns the new `graphql_name` (Type#graphql_name) of a deprecated GID,
+ # or the `graphql_name` argument given if no deprecation applies.
+ def apply_to_graphql_name(graphql_name)
+ return graphql_name unless deprecation = self::OLD_GRAPHQL_NAME_MAP[graphql_name]
+
+ self.map_graphql_name(deprecation.new_name)
+ end
+
+ private
+
+ def map_graphql_name(name)
+ raise NotImplementedError, "Implement `#{__method__}` in #{self.name}"
+ end
+ end
+ end
+ end
+end