Skip to content
Snippets Groups Projects
reference_extractor.rb 1.4 KiB
Newer Older
  • Learn to ignore specific revisions
  • module Gitlab
      # Extract possible GFM references from an arbitrary String for further processing.
    
      class ReferenceExtractor < Banzai::ReferenceExtractor
    
        REFERABLES = %i(user issue label milestone merge_request snippet commit commit_range directly_addressed_user).freeze
    
        attr_accessor :project, :current_user, :author
    
        def initialize(project, current_user = nil)
    
          @project = project
    
    Douwe Maan's avatar
    Douwe Maan committed
          @current_user = current_user
    
    Douwe Maan's avatar
    Douwe Maan committed
          @references = {}
    
        def analyze(text, context = {})
          super(text, context.merge(project: project))
    
        def references(type)
          super(type, project, current_user)
        end
    
    
        def reset_memoized_values
          @references = {}
          super()
        end
    
    
        REFERABLES.each do |type|
    
          define_method("#{type}s") do
    
            @references[type] ||= references(type)
    
    Drew Blessing's avatar
    Drew Blessing committed
    
        def issues
          if project && project.jira_tracker?
    
            @references[:external_issue] ||= references(:external_issue)
    
    Drew Blessing's avatar
    Drew Blessing committed
          else
    
            @references[:issue] ||= references(:issue)
    
    Drew Blessing's avatar
    Drew Blessing committed
          end
        end
    
        def all
          REFERABLES.each { |referable| send(referable.to_s.pluralize) }
          @references.values.flatten
        end
    
    
        def self.references_pattern
          return @pattern if @pattern
    
          patterns = REFERABLES.map do |ref|
            ref.to_s.classify.constantize.try(:reference_pattern)
          end
    
          @pattern = Regexp.union(patterns.compact)
        end