graphql-docs 1.0.0.pre1 → 1.0.0.pre2

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: 2caa4bbf75cebf1a7829a2d840b9f0be679c202c
4
- data.tar.gz: 31c198f0974c6cfa3d95bc4dd7c61f39b6510a05
3
+ metadata.gz: f9ace666d5ef2589da4991e236b929b2fd0ec58b
4
+ data.tar.gz: 5273fb7bf7bab9f9c5e9fbd36e92006822e1e18d
5
5
  SHA512:
6
- metadata.gz: 83da234485764033976a3b9209a7f4a8f50cdc76b69977e8772d7ce06a1466b8983100c0498eba86e3157cd3660f89ef99ce56e0d285f511344faf1779da2f2a
7
- data.tar.gz: 9b94daf15048375627bd7248e2a30a5a93542226eb0304c72ba13a5ab090d9d5898414637650f93f802bc4fea1a086e6003355fd100643372780cca391c05a3f
6
+ metadata.gz: ad3dd49c668b82de48707dd84905b4951ecfcbb16795c690eaccb4b74276fad4fa2140530becdb38045c351802e863bd9ff27509ddd497ee7f549b5c8d420d80
7
+ data.tar.gz: 98b5241afd6d9b9c0b8024a0bfcae9393b70cf51f88a50031ed3e812126bc8bd8e97d29c58c805eaa7672c664e664a8ac93b1b97ffbd25c6ef3a89c08b2f17b9
data/README.md CHANGED
@@ -36,16 +36,15 @@ There are several phases going on the single `GraphQLDocs.build` call:
36
36
 
37
37
  * The GraphQL IDL file is read (if you passed `filename`) through `GraphQL::Client` (or simply read if you passed a string through `schema`).
38
38
  * `GraphQL::Parser` manipulates the IDL into a slightly saner format.
39
- * `GraphQL::Generator` takes that saner format and converts it into HTML.
40
- * `GraphQL::Renderer` technically runs as part of the generation phase. It passes the contents of each page through a Markdown renderer.
39
+ * `GraphQL::Generator` takes that saner format and begins the process of applying items to the HTML templates.
40
+ * `GraphQL::Renderer` technically runs as part of the generation phase. It passes the contents of each page and converts it into HTML.
41
41
 
42
42
  If you wanted to, you could break these calls up individually. For example:
43
43
 
44
44
  ``` ruby
45
45
  options = {}
46
46
  options[:filename] = "#{File.dirname(__FILE__)}/../data/graphql/schema.idl"
47
- my_renderer = MySuperCoolRenderer(options)
48
- options[:renderer] = my_renderer
47
+ options[:renderer] = MySuperCoolRenderer
49
48
 
50
49
  options = GraphQLDocs::Configuration::GRAPHQLDOCS_DEFAULTS.merge(options)
51
50
 
@@ -63,17 +62,23 @@ generator.generate
63
62
 
64
63
  By default, the HTML generation process uses ERB to layout the content. There are a bunch of default options provided for you, but feel free to override any of these. The *Configuration* section below has more information on what you can change.
65
64
 
66
- It also uses [html-pipeline](https://github.com/jch/html-pipeline) to perform the Markdown rendering by default. You can override this by providing a custom rendering class. `initialize` takes two arguments, the configuration options and the parsed schema. You must implement at least one method, `render`, which takes the GraphQL type, the name, and the layout contents. For example:
65
+ It also uses [html-pipeline](https://github.com/jch/html-pipeline) to perform the rendering by default. You can override this by providing a custom rendering class.You must implement two methods:
66
+
67
+ * `initialize` - Takes two arguments, the parsed `schema` and the configuration `options`.
68
+ * `render` Takes the contents of a template page. It also takes two optional kwargs, the GraphQL `type` and its `name`. For example:
67
69
 
68
70
  ``` ruby
69
71
  class CustomRenderer
70
- def initialize(options, parsed_schema)
71
- @options = options
72
+ def initialize(schema, options)
72
73
  @parsed_schema = parsed_schema
74
+ @options = options
73
75
  end
74
76
 
75
- def render(type, name, contents)
76
- contents.sub(/Repository/i, 'Meow Woof!')
77
+ def render(contents, type: nil, name: nil)
78
+ contents.sub(/Repository/i, '<strong>Meow Woof!</strong>')
79
+
80
+ opts[:content] = contents
81
+ @graphql_default_layout.result(OpenStruct.new(opts).instance_eval { binding })
77
82
  end
78
83
  end
79
84
 
@@ -83,13 +88,15 @@ options[:renderer] = CustomRenderer
83
88
  GraphQLDocs.build(options)
84
89
  ```
85
90
 
91
+ If your `render` method returns `nil`, the `Generator` will not attempt to write any HTML file.
92
+
86
93
  ### Helper methods
87
94
 
88
95
  In your ERB layouts, there are several helper methods you can use. The helper methods are:
89
96
 
90
97
  * `slugify(str)` - This slugifies the given string.
91
98
  * `include(filename, opts)` - This embeds a template from your `includes` folder, passing along the local options provided.
92
- * `markdown(string)` - This converts a string from Markdown to HTML.
99
+ * `markdownify(string)` - This converts a string into HTML via CommonMarker.
93
100
  * `graphql_operation_types`, `graphql_mutation_types`, `graphql_object_types`, `graphql_interface_types`, `graphql_enum_types`, `graphql_union_types`, `graphql_input_object_types`, `graphql_scalar_types` - Collections of the various GraphQL types.
94
101
 
95
102
  To call these methods within templates, you must use the dot notation, such as `<%= slugify.(text) %>`.
@@ -100,12 +107,8 @@ The following options are available:
100
107
 
101
108
  | Option | Description | Default |
102
109
  | :----- | :---------- | :------ |
103
- | `access_token` | Uses this token while making requests through `GraphQLDocs::Client`. | `nil` |
104
- | `headers` | Uses these headers while making requests through `GraphQLDocs::Client`. | `{}` |
105
- | `login` | Uses this login while making requests through `GraphQLDocs::Client`. | `nil` |
106
- | `password` | Uses this password while making requests through `GraphQLDocs::Client`. | `nil` |
107
- | `path` | `GraphQLDocs::Client` loads a JSON file found at this location, representing the response from an introspection query. | `nil` |
108
- | `url` | `GraphQLDocs::Client` makes a `POST` request to this URL, passing along the introspection query. | `nil` |
110
+ | `filename` | The location of your schema's IDL file. | `nil` |
111
+ | `schema` | A string representing a schema IDL file. | `nil` |
109
112
  | `output_dir` | The location of the output HTML. | `./output/` |
110
113
  | `use_default_styles` | Indicates if you want to use the default styles. | `true` |
111
114
  | `base_url` | Indicates the base URL to prepend for assets and links. | `""` |
@@ -114,7 +117,7 @@ The following options are available:
114
117
  | `renderer` | The rendering class to use. | `GraphQLDocs::Renderer`
115
118
  | `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/_.
116
119
  | `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/_.
117
- | `classes` | Additional class names you can provide to certain elements. | The full list is found in _lib/graphql-docs/configuration.rb/_.
120
+ | `classes` | Additional class names you can provide to certain elements. | The full list is available in _lib/graphql-docs/configuration.rb/_.
118
121
 
119
122
  ## Development
120
123
 
@@ -11,7 +11,7 @@ module GraphQLDocs
11
11
  @parsed_schema = parsed_schema
12
12
  @options = options
13
13
 
14
- @renderer = @options[:renderer].new(@options, @parsed_schema)
14
+ @renderer = @options[:renderer].new(@parsed_schema, @options)
15
15
 
16
16
  @graphql_operation_template = ERB.new(File.read(@options[:templates][:operation]))
17
17
  @graphql_object_template = ERB.new(File.read(@options[:templates][:objects]))
@@ -88,10 +88,8 @@ module GraphQLDocs
88
88
  unless @options[:landing_pages][:query].nil?
89
89
  query_landing_page = @options[:landing_pages][:query]
90
90
  query_landing_page = File.read(query_landing_page)
91
- if @renderer.respond_to?(:has_yaml?) && \
92
- @renderer.has_yaml?(query_landing_page) && \
93
- @renderer.respond_to?(:yaml_split)
94
- pieces = @renderer.yaml_split(query_landing_page)
91
+ if has_yaml?(query_landing_page)
92
+ pieces = yaml_split(query_landing_page)
95
93
  pieces[2] = pieces[2].chomp
96
94
  metadata = pieces[1, 3].join("\n")
97
95
  query_landing_page = pieces[4]
@@ -108,6 +106,7 @@ module GraphQLDocs
108
106
  def create_graphql_object_pages
109
107
  graphql_object_types.each do |object_type|
110
108
  opts = default_generator_options(type: object_type)
109
+
111
110
  contents = @graphql_object_template.result(OpenStruct.new(opts).instance_eval { binding })
112
111
  write_file('object', object_type[:name], contents)
113
112
  end
@@ -186,10 +185,43 @@ module GraphQLDocs
186
185
  FileUtils.mkdir_p(path)
187
186
  end
188
187
 
188
+ if has_yaml?(contents)
189
+ # Split data
190
+ meta, contents = split_into_metadata_and_contents(contents)
191
+ @options = @options.merge(meta)
192
+ end
193
+
189
194
  # normalize spacing so that CommonMarker doesn't treat it as `pre`
190
195
  contents.gsub!(/^\s*$/, '')
191
- contents = @renderer.render(type, name, contents.gsub(/^\s{4}/m, ' '))
196
+ contents.gsub!(/^\s{4}/m, ' ')
197
+
198
+ contents = @renderer.render(contents, type: type, name: name)
192
199
  File.write(File.join(path, 'index.html'), contents) unless contents.nil?
193
200
  end
201
+
202
+ def split_into_metadata_and_contents(contents)
203
+ opts = {}
204
+ pieces = yaml_split(contents)
205
+ if pieces.size < 4
206
+ raise RuntimeError.new(
207
+ "The file '#{content_filename}' appears to start with a metadata section (three or five dashes at the top) but it does not seem to be in the correct format.",
208
+ )
209
+ end
210
+ # Parse
211
+ begin
212
+ meta = YAML.load(pieces[2]) || {}
213
+ rescue Exception => e # rubocop:disable Lint/RescueException
214
+ raise "Could not parse YAML for #{name}: #{e.message}"
215
+ end
216
+ [meta, pieces[4]]
217
+ end
218
+
219
+ def has_yaml?(contents)
220
+ contents =~ /\A-{3,5}\s*$/
221
+ end
222
+
223
+ def yaml_split(contents)
224
+ contents.split(/^(-{5}|-{3})[ \t]*\r?\n?/, 3)
225
+ end
194
226
  end
195
227
  end
@@ -1,5 +1,3 @@
1
- require 'commonmarker'
2
-
3
1
  module GraphQLDocs
4
2
  module Helpers
5
3
  SLUGIFY_PRETTY_REGEXP = Regexp.new("[^[:alnum:]._~!$&'()+,;=@]+").freeze
@@ -18,9 +16,9 @@ module GraphQLDocs
18
16
  template.result(OpenStruct.new(opts.merge(helper_methods)).instance_eval { binding })
19
17
  end
20
18
 
21
- def markdown(string)
19
+ def markdownify(string)
22
20
  return '' if string.nil?
23
- ::CommonMarker.render_html(string, :DEFAULT)
21
+ ::CommonMarker.render_html(string, :DEFAULT).strip
24
22
  end
25
23
 
26
24
  def graphql_operation_types
@@ -63,10 +61,8 @@ module GraphQLDocs
63
61
  return @templates[filename] unless @templates[filename].nil?
64
62
 
65
63
  contents = File.read(File.join(@options[:templates][:includes], filename))
66
- # normalize spacing so that CommonMarker doesn't treat it as `pre`
67
- template = contents.gsub(/^\s{4}/m, ' ')
68
- @templates[filename] = ERB.new(template)
69
- @templates[filename]
64
+
65
+ @templates[filename] = ERB.new(contents)
70
66
  end
71
67
 
72
68
  def helper_methods
@@ -2,18 +2,19 @@
2
2
 
3
3
  <%= type[:description] %>
4
4
 
5
+ <% if !type[:input_fields].empty? %>
6
+
5
7
  <h2>Input fields</h2>
6
8
 
7
- <% if !type[:input_fields].empty? %>
8
- <%= include.('/fields.html', fields: type[:input_fields]) %>
9
- <% else %>
10
- <p>None</p>
9
+ <%= include.('fields.html', fields: type[:input_fields]) %>
10
+
11
11
  <% end %>
12
12
 
13
- <h2>Return fields</h2>
14
13
 
15
14
  <% if !type[:return_fields].empty? %>
16
- <%= include.('/fields.html', fields: type[:return_fields]) %>
17
- <% else %>
18
- <p>None</p>
15
+
16
+ <h2>Return fields</h2>
17
+
18
+ <%= include.('fields.html', fields: type[:return_fields]) %>
19
+
19
20
  <% end %>
@@ -14,7 +14,7 @@
14
14
  <code><a href="<%= base_url %>/<%= argument[:type][:path]%>"><%= argument[:type][:info] %></a></code>
15
15
  </td>
16
16
  <td>
17
- <p><%= markdown.(argument[:description]) %></p>
17
+ <p><%= markdownify.(argument[:description]) %></p>
18
18
  </td>
19
19
  </tr>
20
20
  <% end %>
@@ -6,11 +6,7 @@
6
6
  <div class="description-wrapper">
7
7
  <p><%= connection[:description] %></p>
8
8
 
9
- <% unless connection[:arguments].empty? %>
10
-
11
- <%= include.('arguments.html', args: connection[:arguments]) %>
12
-
13
- <% end %>
9
+ <%= include.('arguments.html', args: connection[:arguments]) %>
14
10
  </div>
15
11
  </div>
16
12
 
@@ -1,25 +1,20 @@
1
1
  <% fields.each do |field| %>
2
2
 
3
3
  <div class="field-entry <%= classes[:field_entry] %>">
4
- <% next if field[:name] == "id" || field[:name].blank? %>
5
-
6
4
  <span class="field-name"><%= field[:name] %> (<code><a href="<%= base_url %>/<%= field[:type][:path] %>"><%= field[:type][:info] %></a></code>)</span>
7
5
 
8
6
  <div class="description-wrapper">
9
7
  <% if field[:is_deprecated] %>
10
8
  <div class="deprecation-notice <%= classes[:deprecation_notice] %>">
11
9
  <span class="deprecation-title">Deprecation notice</span>
12
- <%= markdown.(field[:deprecation_reason]) %>
10
+ <%= markdownify.(field[:deprecation_reason]) %>
13
11
  </div>
14
12
  <% end %>
15
13
 
16
- <% if field[:description].present? %>
17
- <%= markdown.(field[:description].strip) %>
18
- <% end %>
14
+ <%= markdownify.(field[:description]) %>
15
+
16
+ <%= include.('arguments.html', args: field[:arguments]) %>
19
17
 
20
- <% unless field[:arguments].blank? %>
21
- <%= include.('arguments.html', args: field[:arguments]) %>
22
- <% end %>
23
18
  </div>
24
19
  </div>
25
20
 
@@ -1,18 +1,12 @@
1
1
  <% input_fields.each do |field| %>
2
2
 
3
3
  <div class="field-entry <%= classes[:field_entry] %>">
4
- <% next if field[:name] == "id" || field[:name].blank? %>
5
-
6
4
  <span class="field-name"><%= field[:name] %> (<a href="<%= base_url %>/<%= field[:type][:path] %>"><code><%= field[:type][:info] %></code></a>)</span>
7
5
 
8
6
  <div class="description-wrapper">
9
- <p><%= field[:description] %></p>
10
-
11
- <% unless field[:args].nil? %>
12
-
13
- <%= include.('arguments.html', args: field[:args]) %>
7
+ <%= field[:description] %>
14
8
 
15
- <% end %>
9
+ <%= include.('arguments.html', args: field[:args]) %>
16
10
  </div>
17
11
  </div>
18
12
 
@@ -8,7 +8,7 @@
8
8
  <% if value[:is_deprecated] %>
9
9
  <div class="deprecation-notice <%= classes[:deprecation_notice] %>">
10
10
  <span class="deprecation-title">Deprecation notice</span>
11
- <%= markdown.(value[:deprecation_reason]) %>
11
+ <%= markdownify.(value[:deprecation_reason]) %>
12
12
  </div>
13
13
  <% end %>
14
14
 
@@ -141,8 +141,8 @@ module GraphQLDocs
141
141
 
142
142
  hash[:type] = generate_type(field.type)
143
143
 
144
+ hash[:arguments] = []
144
145
  if field.respond_to?(:arguments)
145
- hash[:arguments] = []
146
146
  field.arguments.values.each do |arg|
147
147
  h = {}
148
148
  h[:name] = arg.name
@@ -6,9 +6,9 @@ module GraphQLDocs
6
6
  class Renderer
7
7
  include Helpers
8
8
 
9
- def initialize(options, parsed_schema)
10
- @options = options
9
+ def initialize(parsed_schema, options)
11
10
  @parsed_schema = parsed_schema
11
+ @options = options
12
12
 
13
13
  unless @options[:templates][:default].nil?
14
14
  @graphql_default_layout = ERB.new(File.read(@options[:templates][:default]))
@@ -34,44 +34,18 @@ module GraphQLDocs
34
34
  @pipeline = HTML::Pipeline.new(filters, @pipeline_config[:context])
35
35
  end
36
36
 
37
- def render(type, name, contents)
37
+ def render(contents, type: nil, name: nil)
38
38
  opts = { base_url: @options[:base_url] }.merge({ type: type, name: name}).merge(helper_methods)
39
39
 
40
- if has_yaml?(contents)
41
- # Split data
42
- meta, contents = split_into_metadata_and_contents(contents)
43
- opts = opts.merge(meta)
44
- end
45
-
46
- contents = @pipeline.to_html(contents)
40
+ contents = to_html(contents)
47
41
  return contents if @graphql_default_layout.nil?
48
42
  opts[:content] = contents
49
43
  @graphql_default_layout.result(OpenStruct.new(opts).instance_eval { binding })
50
44
  end
51
45
 
52
- def has_yaml?(contents)
53
- contents =~ /\A-{3,5}\s*$/
54
- end
55
-
56
- def yaml_split(contents)
57
- contents.split(/^(-{5}|-{3})[ \t]*\r?\n?/, 3)
58
- end
59
-
60
- def split_into_metadata_and_contents(contents)
61
- opts = {}
62
- pieces = yaml_split(contents)
63
- if pieces.size < 4
64
- raise RuntimeError.new(
65
- "The file '#{content_filename}' appears to start with a metadata section (three or five dashes at the top) but it does not seem to be in the correct format.",
66
- )
67
- end
68
- # Parse
69
- begin
70
- meta = YAML.load(pieces[2]) || {}
71
- rescue Exception => e # rubocop:disable Lint/RescueException
72
- raise "Could not parse YAML for #{name}: #{e.message}"
73
- end
74
- [meta, pieces[4]]
46
+ def to_html(string)
47
+ return '' if string.nil?
48
+ CommonMarker.render_html(string, :DEFAULT).strip
75
49
  end
76
50
 
77
51
  private
@@ -1,3 +1,3 @@
1
1
  module GraphQLDocs
2
- VERSION = '1.0.0.pre1'
2
+ VERSION = '1.0.0.pre2'
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.0.0.pre1
4
+ version: 1.0.0.pre2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Garen Torikian
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-09-13 00:00:00.000000000 Z
11
+ date: 2017-09-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: graphql