summaryrefslogtreecommitdiff
path: root/lib/gitlab/graphql/docs/helper.rb
blob: 0dd28b32511276329d619a841ea9cab0d86c3ac7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# frozen_string_literal: true

return if Rails.env.production?

module Gitlab
  module Graphql
    module Docs
      # Helper with functions to be used by HAML templates
      # This includes graphql-docs gem helpers class.
      # You can check the included module on: https://github.com/gjtorikian/graphql-docs/blob/v1.6.0/lib/graphql-docs/helpers.rb
      module Helper
        include GraphQLDocs::Helpers

        def auto_generated_comment
          <<-MD.strip_heredoc
            <!---
              This documentation is auto generated by a script.

              Please do not edit this file directly, check compile_docs task on lib/tasks/gitlab/graphql.rake.
            --->
          MD
        end

        def sorted_fields(fields)
          fields.sort_by { |field| field[:name] }
        end

        def render_field(field)
          '| %s | %s | %s |' % [
            render_field_name(field),
            render_field_type(field[:type][:info]),
            render_field_description(field)
            ]
        end

        def render_field_name(field)
          rendered_name = "`#{field[:name]}`"
          rendered_name += ' **{warning-solid}**' if field[:is_deprecated]
          rendered_name
        end

        # Returns the field description. If the field has been deprecated,
        # the deprecation reason will be returned in place of the description.
        def render_field_description(field)
          return field[:description] unless field[:is_deprecated]

          "**Deprecated:** #{field[:deprecation_reason]}"
        end

        # Some fields types are arrays of other types and are displayed
        # on docs wrapped in square brackets, for example: [String!].
        # This makes GitLab docs renderer thinks they are links so here
        # we change them to be rendered as: String! => Array.
        def render_field_type(type)
          array_type = type[/\[(.+)\]/, 1]

          if array_type
            "#{array_type} => Array"
          else
            type
          end
        end

        # We are ignoring connections and built in types for now,
        # they should be added when queries are generated.
        def objects
          graphql_object_types.select do |object_type|
            !object_type[:name]["Connection"] &&
              !object_type[:name]["Edge"] &&
              !object_type[:name]["__"]
          end
        end
      end
    end
  end
end