jekyll-ramler 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +3 -0
- data/Gemfile +1 -0
- data/Gemfile.lock +2 -1
- data/README.md +77 -0
- data/jekyll-ramler.gemspec +1 -1
- data/lib/raml-generate.rb +31 -18
- data/lib/utils.rb +1 -1
- data/spec/config_spec.rb +145 -0
- data/spec/spec_helper.rb +1 -0
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0b51a16a272803f10915253d041eadd53213f8d4
|
4
|
+
data.tar.gz: eb6626d0d68f77c7faa78041428214d419a2e664
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d9c0d5900dc16eadbfe0119fca2a96b125835506d031fec593bcd8b1679be9b49f9f5dbd4771526d0571c7bd3a41febe782c43c04b32a5e4509cf96debd13048
|
7
|
+
data.tar.gz: b445707349317d6923584813ff834a430ea55d48c17106bc489515a9dad8063aadec4970a33eb8679299d30fa589bcd255e489d217f6023087c932a9a24660f9
|
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -17,6 +17,83 @@ Node.js script, to actually parse a RAML file. Thus, you will need to install
|
|
17
17
|
[Node.js](http://nodejs.org/), then perform `npm install raml-cop`.
|
18
18
|
|
19
19
|
|
20
|
+
## Configuration
|
21
|
+
|
22
|
+
Several options can be defined by your project's _config.yml:
|
23
|
+
|
24
|
+
- **ramler_api_paths**
|
25
|
+
|
26
|
+
A nested mapping of the files that jekyll-ramler should read while generating
|
27
|
+
content and the web folders where that content should be placed. *Keys* are
|
28
|
+
the file system paths (relative to your project's root directory) of the
|
29
|
+
files to be read. *Values* are the web paths (relative to web root) to place
|
30
|
+
all content generated based on the read file into. Keys must end with a
|
31
|
+
forward slash. If no value is provided, web root (/) is used.
|
32
|
+
|
33
|
+
Behavior is undefined for cases in which jekyll-ramler is configured to
|
34
|
+
output generated content of multiple source files to the same web path.
|
35
|
+
|
36
|
+
If *ramler_api_paths* is not defined, jekyll-ramler will default to reading
|
37
|
+
`api.json` from your project's root and placing generated files into web
|
38
|
+
root.
|
39
|
+
|
40
|
+
At this time, only JSON representations of RAML can be read.
|
41
|
+
|
42
|
+
Example:
|
43
|
+
|
44
|
+
```
|
45
|
+
ramler_api_paths:
|
46
|
+
ramls/api_v1.json: /an_api/v1/
|
47
|
+
ramls/api_v2.json: /an_api/v2/
|
48
|
+
ramls/api_v3.json: /an_api/
|
49
|
+
ramls/api_v3.json: /an_api/v3/
|
50
|
+
experimental/foo.json: /unstable/
|
51
|
+
ramls/popular.json: /
|
52
|
+
```
|
53
|
+
|
54
|
+
- **ramler_generated_sub_dirs**
|
55
|
+
|
56
|
+
A nested map defining the web sub directories that jekyll-ramler will place
|
57
|
+
generated pages into. Can have three mappings:
|
58
|
+
|
59
|
+
- *resource* - web sub directory for resource pages. Defaults to `resource`.
|
60
|
+
- *overview* - web sub directory for overview pages. Defaults to `overview`.
|
61
|
+
- *security* - web sub directory for security pages. Defaults to `security`.
|
62
|
+
|
63
|
+
Example:
|
64
|
+
|
65
|
+
```
|
66
|
+
ramler_generated_sub_dirs:
|
67
|
+
resource: resources_pages
|
68
|
+
overview: general_documentation
|
69
|
+
security: security_information
|
70
|
+
```
|
71
|
+
|
72
|
+
The same value can be used in multiple mappings. For example, all three
|
73
|
+
mappings could be set to `documentation`.
|
74
|
+
|
75
|
+
- **ramler_downloadable_descriptor_basenames**
|
76
|
+
|
77
|
+
A nested map defining the basename of the generated, downloadable descriptors
|
78
|
+
(RAML and JSON). Format is similar to `ramler_api_paths`, where the *keys*
|
79
|
+
are file system paths of files to be read, while *values* are the basenames
|
80
|
+
to use for generated descriptors. For example:
|
81
|
+
|
82
|
+
```
|
83
|
+
ramler_downloadable_descriptor_basenames:
|
84
|
+
ramls/api_v1.json: api_v1
|
85
|
+
experimental/foo.json: unstable
|
86
|
+
```
|
87
|
+
|
88
|
+
will lead to the creation of `api_v1.raml`, `api_v1.json`, `unstable.raml`,
|
89
|
+
and `unstable.json` downloadable files.
|
90
|
+
|
91
|
+
If a basename is not defined, `api` is used as a basename.
|
92
|
+
|
93
|
+
Generated descriptor files will be placed in the web folder configured for a
|
94
|
+
given source file.
|
95
|
+
|
96
|
+
|
20
97
|
## JSON Schema Support
|
21
98
|
|
22
99
|
jekyll-ramler includes a few features for JSON Schema.
|
data/jekyll-ramler.gemspec
CHANGED
data/lib/raml-generate.rb
CHANGED
@@ -17,10 +17,11 @@ module Jekyll
|
|
17
17
|
end
|
18
18
|
|
19
19
|
class GeneratedPage<Page
|
20
|
-
def initialize(site, base, dir, item, layout=nil)
|
20
|
+
def initialize(site, base, web_root, dir, item, layout=nil)
|
21
21
|
@site = site
|
22
22
|
@base = base
|
23
23
|
@dir = dir.gsub(/{(\w*)}/, '--\1--').gsub(/\s/, '_')
|
24
|
+
@dir = File.join(web_root, @dir)
|
24
25
|
@name = 'index.html'
|
25
26
|
|
26
27
|
layout = get_layout(dir) if layout.nil?
|
@@ -57,14 +58,14 @@ module Jekyll
|
|
57
58
|
end
|
58
59
|
|
59
60
|
class SecuritySchemePage<GeneratedPage
|
60
|
-
def initialize(site, base, dir, securityScheme)
|
61
|
-
super(site, base, dir, securityScheme, layout=get_layout('resource', site))
|
61
|
+
def initialize(site, base, web_root, dir, securityScheme)
|
62
|
+
super(site, base, web_root, dir, securityScheme, layout=get_layout('resource', site))
|
62
63
|
end
|
63
64
|
end
|
64
65
|
|
65
66
|
class DocumentationPage<GeneratedPage
|
66
|
-
def initialize(site, base, dir, documentation)
|
67
|
-
super(site, base, dir, documentation)
|
67
|
+
def initialize(site, base, web_root, dir, documentation)
|
68
|
+
super(site, base, web_root, dir, documentation)
|
68
69
|
|
69
70
|
output = documentation['content']
|
70
71
|
self.data['body'] = transform_md(output)
|
@@ -72,13 +73,13 @@ module Jekyll
|
|
72
73
|
end
|
73
74
|
|
74
75
|
class ResourcePage<GeneratedPage
|
75
|
-
def initialize(site, base, dir, resource, traits, securitySchemes)
|
76
|
+
def initialize(site, base, web_root, dir, resource, traits, securitySchemes)
|
76
77
|
# Sandbox our resource, and do nothing with child resources
|
77
78
|
resource = resource.dup
|
78
79
|
resource.delete('resources')
|
79
80
|
|
80
81
|
resource['title'] = dir.sub('resource', '') if not resource.include?('title')
|
81
|
-
super(site, base, dir, resource)
|
82
|
+
super(site, base, web_root, dir, resource)
|
82
83
|
|
83
84
|
# Add security data to the resource
|
84
85
|
resource.fetch('methods', []).each do |method|
|
@@ -196,8 +197,16 @@ module Jekyll
|
|
196
197
|
def generate(site)
|
197
198
|
@site = site
|
198
199
|
|
199
|
-
|
200
|
-
|
200
|
+
site.config.fetch('ramler_api_paths', {'api.json' => '/'}).each do |file_path, web_root|
|
201
|
+
web_root = '/' if web_root.nil? or web_root.empty?
|
202
|
+
raise 'raml_api_paths web paths must end with "/"' if web_root[-1] != '/'
|
203
|
+
generate_api_pages(file_path, web_root)
|
204
|
+
end
|
205
|
+
end
|
206
|
+
|
207
|
+
def generate_api_pages(raml_path, web_root)
|
208
|
+
@web_root = web_root
|
209
|
+
raml_js = File.open(raml_path).read
|
201
210
|
raml_hash = JSON.parse(raml_js)
|
202
211
|
|
203
212
|
# BETTER THE DATASTRUCTURES!
|
@@ -221,26 +230,30 @@ module Jekyll
|
|
221
230
|
generate_resource_pages(raml_hash['resources'])
|
222
231
|
end
|
223
232
|
|
224
|
-
dir = Jekyll::get_dir('
|
233
|
+
dir = Jekyll::get_dir('security', @site.config)
|
225
234
|
@securitySchemes.each do |scheme_name, scheme|
|
226
235
|
scheme_dir = File.join(dir, scheme_name)
|
227
236
|
scheme['title'] = scheme_name
|
228
|
-
@site.pages << SecuritySchemePage.new(@site, @site.source, scheme_dir, scheme)
|
237
|
+
@site.pages << SecuritySchemePage.new(@site, @site.source, @web_root, scheme_dir, scheme)
|
229
238
|
end
|
230
239
|
|
240
|
+
dir = Jekyll::get_dir('overview', @site.config)
|
231
241
|
raml_hash.fetch('documentation', []).each do |documentation|
|
232
242
|
documentation_dir = File.join(dir, documentation['title'])
|
233
|
-
@site.pages << DocumentationPage.new(@site, @site.source, documentation_dir, documentation)
|
243
|
+
@site.pages << DocumentationPage.new(@site, @site.source, @web_root, documentation_dir, documentation)
|
234
244
|
end
|
235
245
|
|
236
|
-
# Allow users to download
|
237
|
-
|
238
|
-
raml_download_filename =
|
239
|
-
|
246
|
+
# Allow users to download descriptor as RAML and JSON, which may be modified since it was read
|
247
|
+
download_basename = @site.config.fetch('ramler_downloadable_descriptor_basenames', {}).fetch(raml_path, 'api')
|
248
|
+
raml_download_filename = download_basename + '.raml'
|
249
|
+
json_download_filename = download_basename + '.json'
|
240
250
|
|
241
251
|
raml_yaml = raml_hash.to_yaml
|
242
252
|
raml_yaml.sub!('---', '#%RAML 0.8')
|
243
|
-
@site.static_files << RawFile.new(@site, @site.source,
|
253
|
+
@site.static_files << RawFile.new(@site, @site.source, @web_root, raml_download_filename, raml_yaml)
|
254
|
+
|
255
|
+
raml_json = JSON.pretty_generate(raml_hash)
|
256
|
+
@site.static_files << RawFile.new(@site, @site.source, @web_root, json_download_filename, raml_json)
|
244
257
|
end
|
245
258
|
|
246
259
|
private
|
@@ -255,7 +268,7 @@ module Jekyll
|
|
255
268
|
resources.each do |resource|
|
256
269
|
resource_name = resource["relativeUri"]
|
257
270
|
resource_dir = File.join(dir, resource_name)
|
258
|
-
@site.pages << ResourcePage.new(@site, @site.source, resource_dir, resource, @traits, @securitySchemes)
|
271
|
+
@site.pages << ResourcePage.new(@site, @site.source, @web_root, resource_dir, resource, @traits, @securitySchemes)
|
259
272
|
if resource.has_key?('resources')
|
260
273
|
generate_resource_pages(resource['resources'], resource_dir)
|
261
274
|
end
|
data/lib/utils.rb
CHANGED
data/spec/config_spec.rb
ADDED
@@ -0,0 +1,145 @@
|
|
1
|
+
require_relative './spec_helper.rb'
|
2
|
+
|
3
|
+
describe 'ReferencePageGenerator', fakefs:true do
|
4
|
+
|
5
|
+
before(:each) do
|
6
|
+
@site = Jekyll::Site.new(Jekyll.configuration({
|
7
|
+
"skip_config_files" => true,
|
8
|
+
"json_schema_schema_uri" => "http://json-schema.org/draft-04/schema#",
|
9
|
+
"ramler_api_paths" => {
|
10
|
+
'api.json' => '',
|
11
|
+
'productA/api.json' => '/productA/',
|
12
|
+
'service.json' => '/'}
|
13
|
+
}))
|
14
|
+
@rpg = Jekyll::ReferencePageGenerator.new
|
15
|
+
|
16
|
+
FakeFS.activate!
|
17
|
+
Pry.config.history.should_save = false;
|
18
|
+
Pry.config.history.should_load = false;
|
19
|
+
|
20
|
+
FileUtils.mkdir_p('_layouts')
|
21
|
+
File.open('_layouts/default.html', 'w') { |f| f << "{{ content }}" }
|
22
|
+
|
23
|
+
File.open('api.json', 'w') do |f|
|
24
|
+
f << JSON.pretty_generate(load_simple_raml)
|
25
|
+
end
|
26
|
+
|
27
|
+
FileUtils.mkdir_p('productA')
|
28
|
+
File.open('productA/api.json', 'w') do |f|
|
29
|
+
f << JSON.pretty_generate(load_simple_raml)
|
30
|
+
end
|
31
|
+
|
32
|
+
File.open('service.json', 'w') do |f|
|
33
|
+
f << JSON.pretty_generate(load_simple_raml)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
after(:each) do
|
38
|
+
FakeFS.deactivate!
|
39
|
+
end
|
40
|
+
|
41
|
+
context 'Configuration' do
|
42
|
+
|
43
|
+
it 'reads "api.json" if no ramler_api_paths is provided' do
|
44
|
+
@site.config.delete('ramler_api_paths')
|
45
|
+
expect(File).to receive(:open).with('api.json').and_return(StringIO.new(JSON.pretty_generate(load_simple_raml)))
|
46
|
+
@rpg.generate(@site)
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'reads ramls listed in the ramler_api_paths configuration mapping' do
|
50
|
+
expect(File).to receive(:open).with('api.json').and_return(StringIO.new(JSON.pretty_generate(load_simple_raml)))
|
51
|
+
expect(File).to receive(:open).with('productA/api.json').and_return(StringIO.new(JSON.pretty_generate(load_simple_raml)))
|
52
|
+
expect(File).to receive(:open).with('service.json').and_return(StringIO.new(JSON.pretty_generate(load_simple_raml)))
|
53
|
+
@rpg.generate(@site)
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'places generated content into folders based on the ramler_api_paths configuration mapping' do
|
57
|
+
# Relying on some default values in this test
|
58
|
+
|
59
|
+
@site.config['ramler_api_paths'].delete('api.json')
|
60
|
+
@rpg.generate(@site)
|
61
|
+
@site.process
|
62
|
+
|
63
|
+
# Look for files generated from service.json
|
64
|
+
expect(File.file?('_site/api.raml')).to be true
|
65
|
+
expect(File.directory?('_site/resource')).to be true
|
66
|
+
|
67
|
+
# Look for files generated from
|
68
|
+
expect(File.directory?('_site/productA')).to be true
|
69
|
+
expect(File.file?('_site/productA/api.raml')).to be true
|
70
|
+
expect(File.directory?('_site/productA/resource')).to be true
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'defaults to web root for any unconfigured ramls' do
|
74
|
+
# Only generate content for api.json, which does not define a web root
|
75
|
+
@site.config['ramler_api_paths'].delete('/productA/api.json')
|
76
|
+
@site.config['ramler_api_paths'].delete('service.json')
|
77
|
+
@rpg.generate(@site)
|
78
|
+
@site.process
|
79
|
+
|
80
|
+
expect(File.file?('_site/api.raml')).to be true
|
81
|
+
expect(File.directory?('_site/resource')).to be true
|
82
|
+
end
|
83
|
+
|
84
|
+
it 'throws an error if ramler_api_paths includes a value without a trailing slash' do
|
85
|
+
@site.config['ramler_api_paths'].delete('/productA/api.json')
|
86
|
+
@site.config['ramler_api_paths'].delete('service.json')
|
87
|
+
@site.config['ramler_api_paths']['api.json'] = 'api/v1'
|
88
|
+
expect {@rpg.generate(@site)}.to raise_error
|
89
|
+
end
|
90
|
+
|
91
|
+
it 'defaults to "resource", "overview", and "security" for generated folders' do
|
92
|
+
@site.config['ramler_api_paths'].delete('/productA/api.json')
|
93
|
+
@site.config['ramler_api_paths'].delete('service.json')
|
94
|
+
@rpg.generate(@site)
|
95
|
+
@site.process
|
96
|
+
|
97
|
+
expect(File.directory?('_site/resource')).to be true
|
98
|
+
expect(File.directory?('_site/overview')).to be true
|
99
|
+
expect(File.directory?('_site/security')).to be true
|
100
|
+
end
|
101
|
+
|
102
|
+
it 'places generated content into folders based on ramler_generated_sub_dirs configuration mapping' do
|
103
|
+
@site.config['ramler_generated_sub_dirs'] = {
|
104
|
+
'resource' => 'endpoints',
|
105
|
+
'overview' => 'info',
|
106
|
+
'security' => 'auth'
|
107
|
+
}
|
108
|
+
@rpg.generate(@site)
|
109
|
+
@site.process
|
110
|
+
|
111
|
+
expect(File.directory?('_site/endpoints')).to be true
|
112
|
+
expect(File.directory?('_site/info')).to be true
|
113
|
+
expect(File.directory?('_site/auth')).to be true
|
114
|
+
|
115
|
+
expect(File.directory?('_site/productA/endpoints')).to be true
|
116
|
+
expect(File.directory?('_site/productA/info')).to be true
|
117
|
+
expect(File.directory?('_site/productA/auth')).to be true
|
118
|
+
end
|
119
|
+
|
120
|
+
it 'names downloadable descriptors "api.raml" and "api.json" by default' do
|
121
|
+
@site.config['ramler_api_paths'].delete('service.json')
|
122
|
+
@rpg.generate(@site)
|
123
|
+
@site.process
|
124
|
+
|
125
|
+
expect(File.file?('_site/api.json')).to be true
|
126
|
+
expect(File.file?('_site/api.raml')).to be true
|
127
|
+
expect(File.file?('_site/productA/api.json')).to be true
|
128
|
+
expect(File.file?('_site/productA/api.raml')).to be true
|
129
|
+
end
|
130
|
+
|
131
|
+
it 'names downloadable descriptors based on ramler_downloadable_descriptor_basenames' do
|
132
|
+
@site.config['ramler_api_paths'].delete('service.json')
|
133
|
+
@site.config['ramler_downloadable_descriptor_basenames'] = {
|
134
|
+
'productA/api.json' => 'productA_api'
|
135
|
+
}
|
136
|
+
@rpg.generate(@site)
|
137
|
+
@site.process
|
138
|
+
|
139
|
+
expect(File.file?('_site/api.json')).to be true
|
140
|
+
expect(File.file?('_site/api.raml')).to be true
|
141
|
+
expect(File.file?('_site/productA/productA_api.json')).to be true
|
142
|
+
expect(File.file?('_site/productA/productA_api.raml')).to be true
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jekyll-ramler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- GovDelivery
|
@@ -40,6 +40,7 @@ files:
|
|
40
40
|
- lib/jekyll-ramler.rb
|
41
41
|
- lib/raml-generate.rb
|
42
42
|
- lib/utils.rb
|
43
|
+
- spec/config_spec.rb
|
43
44
|
- spec/reference_page_generator_spec.rb
|
44
45
|
- spec/spec_assets/json/schema/allOf_schema.schema.json
|
45
46
|
- spec/spec_assets/json/schema/foo.include.schema.json
|