graphql-docs 1.2.0 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: aa92319fbde2fb092c1060c9b754edbc7967dffb
4
- data.tar.gz: 6559b9600700c459a582613b400e2fb52f7d0132
3
+ metadata.gz: '0779515b3313c00ee5bf7ba9a57592bd90a79d13'
4
+ data.tar.gz: 18b9ce93fc442cdf8c851dd0be0c6facf91f0d6e
5
5
  SHA512:
6
- metadata.gz: 73fa9af50971492828db578ea7f9118fda68fcc54a6854c33ea55def59363c5140f55893334c2a4d98467fe7ca08f18b5d3e81dfaa1c55b8f75986480ed391b4
7
- data.tar.gz: b1541dd0a1374b155612d737daf25a7ad0670d3f71363922199f012e72aab0a45d0b68eaeba2dda24a0111928b9bfb6ed8ac7b69ae8b0d98618933b90a3d336a
6
+ metadata.gz: 03dc4d16f2aa0c8000015a74a715429b8d8d4992fa8a3838d693d5d2bb90473435b3a22dadecb24642f6a620d8d53a35c37625021950a220278006f354051bb0
7
+ data.tar.gz: c5cb0870d13d1838fd199fd24da03cb84e88a6fe014fe251c17477e28e6910481182cd823a29edfa9d55fd091116fe36bd9ee4af9083ea73dba3db92942e915b
data/README.md CHANGED
@@ -102,6 +102,7 @@ In your ERB layouts, there are several helper methods you can use. The helper me
102
102
  To call these methods within templates, you must use the dot notation, such as `<%= slugify.(text) %>`.
103
103
 
104
104
  For `markdownify`, `CommonMarker` is not enabled by default (because it relies on native code). You will need to add `require 'commonmarker'` if you wish to use it.
105
+
105
106
  ## Configuration
106
107
 
107
108
  The following options are available:
@@ -118,7 +119,57 @@ The following options are available:
118
119
  | `renderer` | The rendering class to use. | `GraphQLDocs::Renderer`
119
120
  | `templates` | The templates to use when generating HTML. You may override any of the following keys: `default`, `includes`, `operations`, `objects`, `mutations`, `interfaces`, `enums`, `unions`, `input_objects`, `scalars`. | The defaults are found in _lib/graphql-docs/layouts/_.
120
121
  | `landing_pages` | The landing page to use when generating HTML for each type. You may override any of the following keys: `index`, `query`, `object`, `mutation`, `interface`, `enum`, `union`, `input_object`, `scalar`. | The defaults are found in _lib/graphql-docs/layouts/_.
121
- | `classes` | Additional class names you can provide to certain elements. | The full list is available in _lib/graphql-docs/configuration.rb/_.
122
+ | `classes` | Additional class names you can provide to certain elements. | The full list is available in _lib/graphql-docs/configuration.rb_.
123
+ | `notices` | A proc used to add notices to schema members. See *Customizing Notices* section below. | `nil` |
124
+
125
+ ### Customizing Notices
126
+
127
+ A notice is a block of CommonMark text that optionally has a title which is displayed above a schema member's description. The
128
+ look of a notice block can be controlled by specifying a custom class for it and then styled via CSS.
129
+
130
+ The `notices` option allows you to customize the notices that appear for a specific schema member using a proc.
131
+
132
+ The proc will be called for each schema member and needs to return an array of notices or an empty array if there are none.
133
+
134
+ A `notice` has the following options:
135
+
136
+ | Option | Description |
137
+ | :----- | :---------- |
138
+ | `body` | CommonMark body of the notice |
139
+ | `title` | Optional title of the notice |
140
+ | `class` | Optional CSS class for the wrapper `<div>` of the notice |
141
+ | `title_class` | Optional CSS class for the `<span>` of the notice's title |
142
+
143
+ Example of a `notices` proc that adds a notice to the `TeamDiscussion` type:
144
+
145
+ ```ruby
146
+ options[:notice] = (schema_member_path) -> {
147
+ notices = []
148
+
149
+ if schema_member_path == "TeamDiscussion"
150
+ notices << {
151
+ class: "preview-notice",
152
+ body: "Available via the [Team Discussion](/previews/team-discussion) preview.",
153
+ }
154
+ end
155
+
156
+ notices
157
+ }
158
+ ```
159
+
160
+ The format of `schema_member_path` is a dot delimited path to the schema member. For example:
161
+
162
+ ```ruby
163
+ "Author", # an object
164
+ "ExtraInfo" # an interface,
165
+ "Author.socialSecurityNumber" # a field
166
+ "Book.author.includeMiddleInitial" # an argument
167
+ "Likeable" # a union,
168
+ "Cover" # an enum
169
+ "Cover.DIGITAL" # an enum value
170
+ "BookOrder" # an input object
171
+ "Mutation.addLike" # a mutation
172
+ ```
122
173
 
123
174
  ## Development
124
175
 
@@ -51,7 +51,9 @@ module GraphQLDocs
51
51
 
52
52
  classes: {
53
53
  field_entry: '',
54
- deprecation_notice: ''
54
+ deprecation_notice: '',
55
+ notice: '',
56
+ notice_title: '',
55
57
  }
56
58
  }.freeze
57
59
  end
@@ -1,9 +1,7 @@
1
- # <%= type[:name] %>
1
+ <h1><%= type[:name] %></h1>
2
2
 
3
- <%= type[:description] %>
3
+ <%= include.('notices.html', notices: type[:notices]) %>
4
4
 
5
- <% unless type[:values].empty? %>
5
+ <%= type[:description] %>
6
6
 
7
7
  <%= include.('values.html', values: type[:values]) %>
8
-
9
- <% end %>
@@ -1,5 +1,7 @@
1
1
  <h1><%= type[:name] %></h1>
2
2
 
3
+ <%= include.('notices.html', notices: type[:notices]) %>
4
+
3
5
  <%= type[:description] %>
4
6
 
5
7
  <% unless type[:input_fields].nil? %>
@@ -1,5 +1,7 @@
1
1
  <h1><%= type[:name] %></h1>
2
2
 
3
+ <%= include.('notices.html', notices: type[:notices]) %>
4
+
3
5
  <%= type[:description] %>
4
6
 
5
7
  <% unless type[:implemented_by].empty? %>
@@ -1,5 +1,7 @@
1
1
  <h1><%= type[:name] %></h1>
2
2
 
3
+ <%= include.('notices.html', notices: type[:notices]) %>
4
+
3
5
  <%= type[:description] %>
4
6
 
5
7
  <% if !type[:input_fields].empty? %>
@@ -1,5 +1,7 @@
1
1
  <h1><%= type[:name] %></h1>
2
2
 
3
+ <%= include.('notices.html', notices: type[:notices]) %>
4
+
3
5
  <%= type[:description] %>
4
6
 
5
7
  <% unless type[:interfaces].empty? %>
@@ -1,9 +1,7 @@
1
- # <%= type[:name] %>
1
+ <h1><%= type[:name] %></h1>
2
2
 
3
- <%= type[:description] %>
3
+ <%= include.('notices.html', notices: type[:notices]) %>
4
4
 
5
- <% unless type[:possible_types].empty? %>
5
+ <%= type[:description] %>
6
6
 
7
7
  <%= include.('possible_types.html', possible_types: type[:possible_types]) %>
8
-
9
- <% end %>
@@ -4,6 +4,7 @@
4
4
  <span id="<%= slugify.(connection[:name]) %>" class="field-name connection-name"><%= connection[:name] %> (<a href="<%= base_url %>/<%= connection[:type][:path] %>"><code><%= connection[:type][:info] %></code></a>)</span>
5
5
 
6
6
  <div class="description-wrapper">
7
+ <%= include.('notices.html', notices: connection[:notices]) %>
7
8
  <p><%= connection[:description] %></p>
8
9
 
9
10
  <% unless connection[:arguments].empty? %>
@@ -11,6 +11,8 @@
11
11
  </div>
12
12
  <% end %>
13
13
 
14
+ <%= include.('notices.html', notices: field[:notices]) %>
15
+
14
16
  <%= markdownify.(field[:description]) %>
15
17
 
16
18
  <% unless field[:arguments].empty? %>
@@ -4,6 +4,8 @@
4
4
  <span id="<%= slugify.(field[:name]) %>" class="field-name"><%= field[:name] %> (<a href="<%= base_url %>/<%= field[:type][:path] %>"><code><%= field[:type][:info] %></code></a>)</span>
5
5
 
6
6
  <div class="description-wrapper">
7
+ <%= include.('notices.html', notices: field[:notices]) %>
8
+
7
9
  <%= field[:description] %>
8
10
 
9
11
  <% unless field[:arguments].empty? %>
@@ -0,0 +1,8 @@
1
+ <% notices.each do |notice| %>
2
+ <div class="notice <%= classes[:notice] %> <%= notice[:class] %>">
3
+ <% if notice[:title] %>
4
+ <span class="notice-title <%= classes[:notice_title] %> <%= notice[:title_class] %>"><%= notice[:title] %></span>
5
+ <% end %>
6
+ <%= markdownify.(notice[:body]) %>
7
+ </div>
8
+ <% end %>
@@ -5,6 +5,8 @@
5
5
  <h4 id="<%= slugify.(value[:name]) %>" class="name"><%= value[:name] %></h4>
6
6
 
7
7
  <div class="description-wrapper">
8
+ <%= include.('notices.html', notices: value[:notices]) %>
9
+
8
10
  <% if value[:is_deprecated] %>
9
11
  <div class="deprecation-notice <%= classes[:deprecation_notice] %>">
10
12
  <span class="deprecation-title">Deprecation notice</span>
@@ -8,6 +8,9 @@ module GraphQLDocs
8
8
 
9
9
  def initialize(schema, options)
10
10
  @options = options
11
+
12
+ @options[:notices] ||= -> (schema_member_path) { [] }
13
+
11
14
  @schema = GraphQL::Schema.from_definition(schema)
12
15
  @processed_schema = {
13
16
  operation_types: [],
@@ -25,6 +28,8 @@ module GraphQLDocs
25
28
  @schema.types.each_value do |object|
26
29
  data = {}
27
30
 
31
+ data[:notices] = @options[:notices].call(object.name)
32
+
28
33
  case object
29
34
  when ::GraphQL::ObjectType
30
35
  if object.name == 'Query'
@@ -32,7 +37,7 @@ module GraphQLDocs
32
37
  data[:description] = object.description
33
38
 
34
39
  data[:interfaces] = object.interfaces.map(&:name).sort
35
- data[:fields], data[:connections] = fetch_fields(object.fields)
40
+ data[:fields], data[:connections] = fetch_fields(object.fields, object.name)
36
41
 
37
42
  @processed_schema[:operation_types] << data
38
43
  elsif object.name == 'Mutation'
@@ -43,15 +48,17 @@ module GraphQLDocs
43
48
 
44
49
  object.fields.each_value do |mutation|
45
50
  h = {}
51
+
52
+ h[:notices] = @options[:notices].call([object.name, mutation.name].join('.'))
46
53
  h[:name] = mutation.name
47
54
  h[:description] = mutation.description
48
- h[:input_fields], _ = fetch_fields(mutation.arguments)
55
+ h[:input_fields], _ = fetch_fields(mutation.arguments, [object.name, mutation.name].join('.'))
49
56
 
50
57
  return_type = mutation.type
51
58
  if return_type.unwrap.respond_to?(:fields)
52
- h[:return_fields], _ = fetch_fields(return_type.unwrap.fields)
59
+ h[:return_fields], _ = fetch_fields(return_type.unwrap.fields, return_type.name)
53
60
  else # it is a scalar return type
54
- h[:return_fields], _ = fetch_fields({ "#{return_type.name}" => mutation })
61
+ h[:return_fields], _ = fetch_fields({ "#{return_type.name}" => mutation }, return_type.name)
55
62
  end
56
63
 
57
64
  @processed_schema[:mutation_types] << h
@@ -61,14 +68,14 @@ module GraphQLDocs
61
68
  data[:description] = object.description
62
69
 
63
70
  data[:interfaces] = object.interfaces.map(&:name).sort
64
- data[:fields], data[:connections] = fetch_fields(object.fields)
71
+ data[:fields], data[:connections] = fetch_fields(object.fields, object.name)
65
72
 
66
73
  @processed_schema[:object_types] << data
67
74
  end
68
75
  when ::GraphQL::InterfaceType
69
76
  data[:name] = object.name
70
77
  data[:description] = object.description
71
- data[:fields], data[:connections] = fetch_fields(object.fields)
78
+ data[:fields], data[:connections] = fetch_fields(object.fields, object.name)
72
79
 
73
80
  @processed_schema[:interface_types] << data
74
81
  when ::GraphQL::EnumType
@@ -77,6 +84,7 @@ module GraphQLDocs
77
84
 
78
85
  data[:values] = object.values.values.map do |val|
79
86
  h = {}
87
+ h[:notices] = @options[:notices].call([object.name, val.name].join('.'))
80
88
  h[:name] = val.name
81
89
  h[:description] = val.description
82
90
  unless val.deprecation_reason.nil?
@@ -97,7 +105,7 @@ module GraphQLDocs
97
105
  data[:name] = object.name
98
106
  data[:description] = object.description
99
107
 
100
- data[:input_fields], _ = fetch_fields(object.input_fields)
108
+ data[:input_fields], _ = fetch_fields(object.input_fields, object.name)
101
109
 
102
110
  @processed_schema[:input_object_types] << data
103
111
  when ::GraphQL::ScalarType
@@ -132,13 +140,14 @@ module GraphQLDocs
132
140
 
133
141
  private
134
142
 
135
- def fetch_fields(object_fields)
143
+ def fetch_fields(object_fields, parent_path)
136
144
  fields = []
137
145
  connections = []
138
146
 
139
147
  object_fields.each_value do |field|
140
148
  hash = {}
141
149
 
150
+ hash[:notices] = @options[:notices].call([parent_path, field.name].join('.'))
142
151
  hash[:name] = field.name
143
152
  hash[:description] = field.description
144
153
  if field.respond_to?(:deprecation_reason) && !field.deprecation_reason.nil?
@@ -1,3 +1,3 @@
1
1
  module GraphQLDocs
2
- VERSION = '1.2.0'
2
+ VERSION = '1.3.0'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: graphql-docs
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Garen Torikian
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-02-08 00:00:00.000000000 Z
11
+ date: 2018-02-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: graphql
@@ -280,6 +280,7 @@ files:
280
280
  - lib/graphql-docs/layouts/includes/connections.html
281
281
  - lib/graphql-docs/layouts/includes/fields.html
282
282
  - lib/graphql-docs/layouts/includes/input_fields.html
283
+ - lib/graphql-docs/layouts/includes/notices.html
283
284
  - lib/graphql-docs/layouts/includes/possible_types.html
284
285
  - lib/graphql-docs/layouts/includes/sidebar.html
285
286
  - lib/graphql-docs/layouts/includes/values.html