prmd 0.6.2 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. checksums.yaml +5 -13
  2. data/CONTRIBUTORS.md +8 -0
  3. data/Gemfile.lock +6 -6
  4. data/README.md +57 -8
  5. data/Rakefile +4 -4
  6. data/bin/prmd +3 -117
  7. data/docs/schemata.md +11 -11
  8. data/lib/prmd.rb +7 -18
  9. data/lib/prmd/cli.rb +108 -0
  10. data/lib/prmd/cli/base.rb +151 -0
  11. data/lib/prmd/cli/combine.rb +42 -0
  12. data/lib/prmd/cli/doc.rb +69 -0
  13. data/lib/prmd/cli/generate.rb +44 -0
  14. data/lib/prmd/cli/render.rb +48 -0
  15. data/lib/prmd/cli/verify.rb +49 -0
  16. data/lib/prmd/commands.rb +4 -0
  17. data/lib/prmd/commands/combine.rb +85 -58
  18. data/lib/prmd/commands/init.rb +30 -98
  19. data/lib/prmd/commands/render.rb +30 -17
  20. data/lib/prmd/commands/verify.rb +78 -35
  21. data/lib/prmd/core/combiner.rb +91 -0
  22. data/lib/prmd/core/generator.rb +27 -0
  23. data/lib/prmd/core/renderer.rb +56 -0
  24. data/lib/prmd/core/schema_hash.rb +47 -0
  25. data/lib/prmd/core_ext/optparse.rb +6 -0
  26. data/lib/prmd/hash_helpers.rb +38 -0
  27. data/lib/prmd/load_schema_file.rb +25 -0
  28. data/lib/prmd/rake_tasks/base.rb +33 -0
  29. data/lib/prmd/rake_tasks/combine.rb +50 -0
  30. data/lib/prmd/rake_tasks/doc.rb +73 -0
  31. data/lib/prmd/rake_tasks/verify.rb +60 -0
  32. data/lib/prmd/schema.rb +86 -34
  33. data/lib/prmd/template.rb +65 -8
  34. data/lib/prmd/templates/combine_head.json +6 -0
  35. data/lib/prmd/templates/init_default.json +9 -0
  36. data/lib/prmd/templates/init_resource.json.erb +90 -0
  37. data/lib/prmd/templates/link_schema_properties.md.erb +5 -0
  38. data/lib/prmd/templates/schema.erb +2 -2
  39. data/lib/prmd/templates/schemata.md.erb +37 -0
  40. data/lib/prmd/templates/schemata/helper.erb +29 -15
  41. data/lib/prmd/templates/schemata/link.md.erb +74 -0
  42. data/lib/prmd/templates/schemata/{link_curl_example.erb → link_curl_example.md.erb} +8 -2
  43. data/lib/prmd/url_generator.rb +11 -69
  44. data/lib/prmd/url_generators/generators/default.rb +66 -0
  45. data/lib/prmd/url_generators/generators/json.rb +30 -0
  46. data/lib/prmd/version.rb +10 -1
  47. data/prmd.gemspec +15 -15
  48. data/test/cli/combine_test.rb +23 -0
  49. data/test/cli/doc_test.rb +25 -0
  50. data/test/cli/generate_test.rb +23 -0
  51. data/test/cli/render_test.rb +25 -0
  52. data/test/cli/verify_test.rb +21 -0
  53. data/test/commands/init_test.rb +7 -0
  54. data/test/commands/render_test.rb +93 -0
  55. data/test/commands/verify_test.rb +60 -60
  56. data/test/helpers.rb +61 -6
  57. data/test/schema_test.rb +17 -11
  58. data/test/schemata/input/doc-settings.json +4 -0
  59. metadata +73 -28
  60. data/lib/prmd/commands/expand.rb +0 -108
  61. data/lib/prmd/templates/link_schema_properties.erb +0 -16
  62. data/lib/prmd/templates/schemata.erb +0 -47
  63. data/lib/prmd/templates/schemata/link.erb +0 -61
@@ -0,0 +1,66 @@
1
+ require 'cgi'
2
+
3
+ # :nodoc:
4
+ module Prmd
5
+ # :nodoc:
6
+ class UrlGenerator
7
+ # :nodoc:
8
+ module Generators
9
+ # Default URL Generator
10
+ #
11
+ # @api private
12
+ class Default
13
+ # @param [Hash<Symbol, Object>] params
14
+ def self.generate(params)
15
+ data = {}
16
+ data.merge!(params[:schema].schema_example(params[:link]['schema']))
17
+ generate_params(data)
18
+ end
19
+
20
+ # @param [String] key
21
+ # @param [String] prefix
22
+ # @return [String]
23
+ def self.param_name(key, prefix, array = false)
24
+ result = if prefix
25
+ "#{prefix}[#{key}]"
26
+ else
27
+ key
28
+ end
29
+
30
+ result += '[]' if array
31
+ result
32
+ end
33
+
34
+ # @param [Hash] obj
35
+ # @param [String] prefix
36
+ # @return [String]
37
+ def self.generate_params(obj, prefix = nil)
38
+ result = []
39
+ obj.each do |key,value|
40
+ if value.is_a?(Hash)
41
+ newprefix = if prefix
42
+ "#{prefix}[#{key}]"
43
+ else
44
+ key
45
+ end
46
+ result << generate_params(value, newprefix)
47
+ elsif value.is_a?(Array)
48
+ value.each do |val|
49
+ result << [param_name(key, prefix, true), CGI.escape(val.to_s)].join('=')
50
+ end
51
+ else
52
+ next unless value # ignores parameters with empty examples
53
+ result << [param_name(key, prefix), CGI.escape(value.to_s)].join('=')
54
+ end
55
+ end
56
+ result.flatten
57
+ end
58
+
59
+ class << self
60
+ private :param_name
61
+ private :generate_params
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,30 @@
1
+ require 'cgi'
2
+
3
+ # :nodoc:
4
+ module Prmd
5
+ # :nodoc:
6
+ class UrlGenerator
7
+ # :nodoc:
8
+ module Generators
9
+ # JSON URL Generator
10
+ #
11
+ # @api private
12
+ class JSON
13
+ # @param [Hash<Symbol, Object>] params
14
+ def self.generate(params)
15
+ data = {}
16
+ data.merge!(params[:schema].schema_example(params[:link]['schema']))
17
+
18
+ result = []
19
+ data.sort_by {|k,_| k.to_s }.each do |key, values|
20
+ [values].flatten.each do |value|
21
+ result << [key.to_s, CGI.escape(value.to_s)].join('=')
22
+ end
23
+ end
24
+
25
+ result
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -1,3 +1,12 @@
1
+ # :nodoc:
1
2
  module Prmd
2
- VERSION = "0.6.2"
3
+ # Well, duh, its a Version module, what did you expect?
4
+ module Version
5
+ MAJOR, MINOR, TEENY, PATCH = 0, 7, 0, nil
6
+ # version string
7
+ # @return [String]
8
+ STRING = [MAJOR, MINOR, TEENY, PATCH].compact.join('.').freeze
9
+ end
10
+ # @return [String]
11
+ VERSION = Version::STRING
3
12
  end
@@ -4,24 +4,24 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
  require 'prmd/version'
5
5
 
6
6
  Gem::Specification.new do |spec|
7
- spec.name = "prmd"
7
+ spec.name = 'prmd'
8
8
  spec.version = Prmd::VERSION
9
- spec.authors = ["geemus"]
10
- spec.email = ["geemus@gmail.com"]
11
- spec.description = %q{scaffold, verify and generate docs from JSON Schema}
12
- spec.summary = %q{JSON Schema tooling}
13
- spec.homepage = "https://github.com/heroku/prmd"
14
- spec.license = "MIT"
9
+ spec.authors = ['geemus']
10
+ spec.email = ['geemus@gmail.com']
11
+ spec.description = 'scaffold, verify and generate docs from JSON Schema'
12
+ spec.summary = 'JSON Schema tooling'
13
+ spec.homepage = 'https://github.com/heroku/prmd'
14
+ spec.license = 'MIT'
15
15
 
16
16
  spec.files = `git ls-files`.split($/)
17
- spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
- spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
- spec.require_paths = ["lib"]
17
+ spec.executables = spec.files.grep(/^bin\//) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(/^(test|spec|features)\//)
19
+ spec.require_paths = ['lib']
20
20
 
21
- spec.add_dependency "erubis", "~> 2.7"
22
- spec.add_dependency "json_schema", "~> 0.1"
21
+ spec.add_dependency 'erubis', '~> 2.7'
22
+ spec.add_dependency 'json_schema', '~> 0.3', '>= 0.3.1'
23
23
 
24
- spec.add_development_dependency "bundler", "~> 1.3"
25
- spec.add_development_dependency "rake", "~> 10.2"
26
- spec.add_development_dependency "minitest", "~> 5.3"
24
+ spec.add_development_dependency 'bundler', '~> 1.3'
25
+ spec.add_development_dependency 'rake', '~> 10.3'
26
+ spec.add_development_dependency 'minitest', '~> 5.4'
27
27
  end
@@ -0,0 +1,23 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', 'helpers'))
2
+ require 'prmd/cli/combine'
3
+
4
+ class PrmdCliCombineTest < Minitest::Test
5
+ include CliBaseTestHelpers
6
+
7
+ def command_module
8
+ Prmd::CLI::Combine
9
+ end
10
+
11
+ def argv_for_test_run
12
+ ['-m', 'schema/meta.json',
13
+ 'schema/schemata',
14
+ '-o', 'schema/api.json']
15
+ end
16
+
17
+ def validate_parse_options(options)
18
+ assert_equal 'schema/meta.json', options[:meta]
19
+ assert_equal 'schema/api.json', options[:output_file]
20
+ assert_equal ['schema/schemata'], options[:argv]
21
+ super
22
+ end
23
+ end
@@ -0,0 +1,25 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', 'helpers'))
2
+ require 'prmd/cli/doc'
3
+
4
+ class PrmdCliDocTest < Minitest::Test
5
+ include CliBaseTestHelpers
6
+
7
+ def command_module
8
+ Prmd::CLI::Doc
9
+ end
10
+
11
+ def argv_for_test_run
12
+ ['-s', input_schemas_path('doc-settings.json'),
13
+ '-p', 'overview.txt',
14
+ 'schema/api.json',
15
+ '-o', 'schema/verified-api.json']
16
+ end
17
+
18
+ def validate_parse_options(options)
19
+ assert_equal 'application/bread', options[:content_type]
20
+ assert_equal ['overview.txt'], options[:prepend]
21
+ assert_equal 'schema/verified-api.json', options[:output_file]
22
+ assert_equal ['schema/api.json'], options[:argv]
23
+ super
24
+ end
25
+ end
@@ -0,0 +1,23 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', 'helpers'))
2
+ require 'prmd/cli/generate'
3
+
4
+ class PrmdCliGenerateTest < Minitest::Test
5
+ include CliBaseTestHelpers
6
+
7
+ def command_module
8
+ Prmd::CLI::Generate
9
+ end
10
+
11
+ def argv_for_test_run
12
+ ['-y',
13
+ 'bread',
14
+ '-o', 'schema/bread.yml']
15
+ end
16
+
17
+ def validate_parse_options(options)
18
+ assert_equal true, options[:yaml]
19
+ assert_equal ['bread'], options[:argv]
20
+ assert_equal 'schema/bread.yml', options[:output_file]
21
+ super
22
+ end
23
+ end
@@ -0,0 +1,25 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', 'helpers'))
2
+ require 'prmd/cli/render'
3
+
4
+ class PrmdCliRenderTest < Minitest::Test
5
+ include CliBaseTestHelpers
6
+
7
+ def command_module
8
+ Prmd::CLI::Render
9
+ end
10
+
11
+ def argv_for_test_run
12
+ ['-p', 'overview.txt,somethin.txt',
13
+ '-t', 'templates',
14
+ '-o', 'schema/bread.md',
15
+ 'schema/bread.json']
16
+ end
17
+
18
+ def validate_parse_options(options)
19
+ assert_equal ['overview.txt', 'somethin.txt'], options[:prepend]
20
+ assert_equal 'templates', options[:template]
21
+ assert_equal 'schema/bread.md', options[:output_file]
22
+ assert_equal ['schema/bread.json'], options[:argv]
23
+ super
24
+ end
25
+ end
@@ -0,0 +1,21 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', 'helpers'))
2
+ require 'prmd/cli/verify'
3
+
4
+ class PrmdCliVerifyTest < Minitest::Test
5
+ include CliBaseTestHelpers
6
+
7
+ def command_module
8
+ Prmd::CLI::Verify
9
+ end
10
+
11
+ def argv_for_test_run
12
+ ['-o', 'schema/buttered-bread.json',
13
+ 'schema/bread.json']
14
+ end
15
+
16
+ def validate_parse_options(options)
17
+ assert_equal 'schema/buttered-bread.json', options[:output_file]
18
+ assert_equal ['schema/bread.json'], options[:argv]
19
+ super
20
+ end
21
+ end
@@ -0,0 +1,7 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', 'helpers'))
2
+
3
+ class PrmdInitTest < Minitest::Test
4
+ def test_init
5
+ Prmd.init('Cake')
6
+ end
7
+ end
@@ -0,0 +1,93 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', 'helpers'))
2
+
3
+ require 'json_pointer'
4
+
5
+ class InteragentRenderTest < Minitest::Test
6
+ def test_render_for_valid_schema
7
+ markdown = render
8
+
9
+ assert_match /An app in our PaaS ecosystem./, markdown
10
+ end
11
+
12
+ def test_render_for_schema_with_property_defined_with_anyOf
13
+ pointer('#/definitions/app').merge!({
14
+ 'properties' => {
15
+ 'version' => {
16
+ 'anyOf' => [
17
+ { 'type' => 'string', 'example' => 'v10.9.rc1', 'minLength' => 1 },
18
+ { 'type' => 'number', 'minimum' => 0 }
19
+ ]
20
+ }
21
+ }
22
+ })
23
+
24
+ markdown = render
25
+ assert_match /version.*v10\.9\.rc1/, markdown
26
+ end
27
+
28
+ private
29
+
30
+ def data
31
+ @data ||= {
32
+ '$schema' => 'http://interagent.github.io/interagent-hyper-schema',
33
+ 'description' => 'My simple example API.',
34
+ 'id' => 'http://example.com/schema',
35
+ 'title' => 'Example API',
36
+ 'definitions' => {
37
+ 'app' => {
38
+ 'description' => 'An app in our PaaS ecosystem.',
39
+ 'title' => 'App',
40
+ 'type' => 'object',
41
+ 'definitions' => {
42
+ 'identity' => {
43
+ 'anyOf' => [
44
+ {
45
+ '$ref' => '#/definitions/app/definitions/name'
46
+ }
47
+ ]
48
+ },
49
+ 'name' => {
50
+ 'description' => 'The app\'s name.',
51
+ 'type' => 'string'
52
+ }
53
+ },
54
+ 'links' => [
55
+ {
56
+ 'description' => 'Create a new app.',
57
+ 'href' => '/apps',
58
+ 'method' => 'POST',
59
+ 'rel' => 'create',
60
+ 'title' => 'Create App'
61
+ }
62
+ ],
63
+ 'properties' => {
64
+ }
65
+ }
66
+ },
67
+ 'links' => [
68
+ {
69
+ 'href' => 'https://example.com',
70
+ 'rel' => 'self'
71
+ }
72
+ ],
73
+ 'properties' => {
74
+ 'app' => {
75
+ '$ref' => '#/definitions/app'
76
+ }
77
+ },
78
+ 'type' => 'object'
79
+ }
80
+ end
81
+
82
+ def pointer(path)
83
+ JsonPointer.evaluate(data, path)
84
+ end
85
+
86
+ def render
87
+ schema = Prmd::Schema.new(data)
88
+
89
+ template = File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'lib', 'prmd', 'templates'))
90
+
91
+ Prmd.render(schema, template: template)
92
+ end
93
+ end
@@ -1,6 +1,6 @@
1
1
  require File.expand_path(File.join(File.dirname(__FILE__), '..', 'helpers'))
2
2
 
3
- require "json_pointer"
3
+ require 'json_pointer'
4
4
 
5
5
  class InteragentHyperSchemaVerifyTest < Minitest::Test
6
6
  def test_verifies
@@ -12,20 +12,20 @@ class InteragentHyperSchemaVerifyTest < Minitest::Test
12
12
  #
13
13
 
14
14
  def test_api_required
15
- data.delete("title")
15
+ data.delete('title')
16
16
  errors = verify
17
17
  assert_equal 1, errors.count
18
- assert_match %r{^#: }, errors[0]
19
- assert_match %r{Missing required keys "title" in object}, errors[0]
18
+ assert_match /^#: /, errors[0]
19
+ assert_match /"title" wasn't supplied\./, errors[0]
20
20
  end
21
21
 
22
22
  def test_api_property_format
23
- pointer("#/properties").merge!({
24
- "app" => {}
23
+ pointer('#/properties').merge!({
24
+ 'app' => {}
25
25
  })
26
26
  errors = verify
27
27
  assert_match %r{^#/properties/app: }, errors[0]
28
- assert_match %r{Missing required keys "\$ref" in object}, errors[0]
28
+ assert_match /"\$ref" wasn't supplied\./, errors[0]
29
29
  end
30
30
 
31
31
  #
@@ -33,50 +33,50 @@ class InteragentHyperSchemaVerifyTest < Minitest::Test
33
33
  #
34
34
 
35
35
  def test_resource_required
36
- pointer("#/definitions/app").delete("title")
36
+ pointer('#/definitions/app').delete('title')
37
37
  errors = verify
38
38
  assert_equal 1, errors.count
39
39
  assert_match %r{^#/definitions/app: }, errors[0]
40
- assert_match %r{Missing required keys "title" in object}, errors[0]
40
+ assert_match /"title" wasn't supplied\./, errors[0]
41
41
  end
42
42
 
43
43
  def test_resource_identity_format
44
- pointer("#/definitions/app/definitions/identity").merge!({
45
- "type" => "string"
44
+ pointer('#/definitions/app/definitions/identity').merge!({
45
+ 'type' => 'string'
46
46
  })
47
47
  errors = verify
48
48
  assert_equal 1, errors.count
49
49
  assert_match %r{^#/definitions/app/definitions/identity: }, errors[0]
50
- assert_match %r{any subschema of "anyOf" condition.}, errors[0]
50
+ assert_match /No subschema in "anyOf" matched\./, errors[0]
51
51
  end
52
52
 
53
53
  # an empty schema can be specified to bypass the identity check
54
54
  def test_resource_identity_format_empty
55
- pointer("#/definitions/app/definitions").merge!({
56
- "identity" => {}
55
+ pointer('#/definitions/app/definitions').merge!({
56
+ 'identity' => {}
57
57
  })
58
58
  assert_equal [], verify
59
59
  end
60
60
 
61
61
  # "my-property" does match fit our regex of lowercase letters and underscores only
62
62
  def test_resource_property_format
63
- pointer("#/definitions/app/properties").merge!({
64
- "my-property" => {}
63
+ pointer('#/definitions/app/properties').merge!({
64
+ 'my-property' => {}
65
65
  })
66
66
  errors = verify
67
67
  assert_equal 1, errors.count
68
68
  assert_match %r{^#/definitions/app/properties: }, errors[0]
69
- assert_match %r{Extra keys in object: my-property}, errors[0]
69
+ assert_match /"my-property" is not a permitted key\./, errors[0]
70
70
  end
71
71
 
72
72
  def test_resource_strict_properties
73
- pointer("#/definitions/app").merge!({
74
- "strictProperties" => false
73
+ pointer('#/definitions/app').merge!({
74
+ 'strictProperties' => false
75
75
  })
76
76
  errors = verify
77
77
  assert_equal 1, errors.count
78
78
  assert_match %r{^#/definitions/app/strictProperties: }, errors[0]
79
- assert_match %r{to be a member of enum \[true\], value was: false}, errors[0]
79
+ assert_match /false is not a member of \[true\]/, errors[0]
80
80
  end
81
81
 
82
82
  #
@@ -84,21 +84,21 @@ class InteragentHyperSchemaVerifyTest < Minitest::Test
84
84
  #
85
85
 
86
86
  def test_resource_definition_no_links
87
- pointer("#/definitions/app/definitions/name").merge!({
88
- "links" => []
87
+ pointer('#/definitions/app/definitions/name').merge!({
88
+ 'links' => []
89
89
  })
90
90
  errors = verify
91
91
  assert_equal 1, errors.count
92
92
  assert_match %r{^#/definitions/app/definitions/name: }, errors[0]
93
- assert_match %r{Data matched subschema of "not" condition}, errors[0]
93
+ assert_match /Matched "not" subschema/, errors[0]
94
94
  end
95
95
 
96
96
  def test_resource_definition_required
97
- pointer("#/definitions/app/definitions/name").delete("description")
97
+ pointer('#/definitions/app/definitions/name').delete('description')
98
98
  errors = verify
99
99
  assert_equal 1, errors.count
100
100
  assert_match %r{^#/definitions/app/definitions/name: }, errors[0]
101
- assert_match %r{Missing required keys "description" in object}, errors[0]
101
+ assert_match /"description" wasn't supplied\./, errors[0]
102
102
  end
103
103
 
104
104
  #
@@ -106,74 +106,74 @@ class InteragentHyperSchemaVerifyTest < Minitest::Test
106
106
  #
107
107
 
108
108
  def test_resource_link_href_format
109
- pointer("#/definitions/app/links/0").merge!({
110
- "href" => "/my_apps"
109
+ pointer('#/definitions/app/links/0').merge!({
110
+ 'href' => '/my_apps'
111
111
  })
112
112
  errors = verify
113
113
  assert_equal 1, errors.count
114
114
  assert_match %r{^#/definitions/app/links/0/href: }, errors[0]
115
- assert_match %r{Expected string to match pattern}, errors[0]
115
+ assert_match /\/my_apps does not match /, errors[0]
116
116
  end
117
117
 
118
118
  def test_resource_link_required
119
- pointer("#/definitions/app/links/0").delete("method")
119
+ pointer('#/definitions/app/links/0').delete('method')
120
120
  errors = verify
121
121
  assert_equal 1, errors.count
122
122
  assert_match %r{^#/definitions/app/links/0: }, errors[0]
123
- assert_match %r{Missing required keys "method" in object}, errors[0]
123
+ assert_match /"method" wasn't supplied\./, errors[0]
124
124
  end
125
125
 
126
126
  private
127
127
 
128
128
  def data
129
129
  @data ||= {
130
- "$schema" => "http://interagent.github.io/interagent-hyper-schema",
131
- "description" => "My simple example API.",
132
- "id" => "http://example.com/schema",
133
- "title" => "Example API",
134
- "definitions" => {
135
- "app" => {
136
- "description" => "An app in our PaaS ecosystem.",
137
- "title" => "App",
138
- "type" => "object",
139
- "definitions" => {
140
- "identity" => {
141
- "anyOf" => [
130
+ '$schema' => 'http://interagent.github.io/interagent-hyper-schema',
131
+ 'description' => 'My simple example API.',
132
+ 'id' => 'http://example.com/schema',
133
+ 'title' => 'Example API',
134
+ 'definitions' => {
135
+ 'app' => {
136
+ 'description' => 'An app in our PaaS ecosystem.',
137
+ 'title' => 'App',
138
+ 'type' => 'object',
139
+ 'definitions' => {
140
+ 'identity' => {
141
+ 'anyOf' => [
142
142
  {
143
- "$ref" => "#/definitions/app/definitions/name"
143
+ '$ref' => '#/definitions/app/definitions/name'
144
144
  }
145
145
  ]
146
146
  },
147
- "name" => {
148
- "description" => "The app's name.",
149
- "type" => "string"
147
+ 'name' => {
148
+ 'description' => 'The app\'s name.',
149
+ 'type' => 'string'
150
150
  }
151
151
  },
152
- "links" => [
152
+ 'links' => [
153
153
  {
154
- "description" => "Create a new app.",
155
- "href" => "/apps",
156
- "method" => "POST",
157
- "rel" => "create",
158
- "title" => "Create App"
154
+ 'description' => 'Create a new app.',
155
+ 'href' => '/apps',
156
+ 'method' => 'POST',
157
+ 'rel' => 'create',
158
+ 'title' => 'Create App'
159
159
  }
160
160
  ],
161
- "properties" => {
161
+ 'properties' => {
162
162
  }
163
163
  }
164
164
  },
165
- "links" => [
165
+ 'links' => [
166
166
  {
167
- "href" => "https://example.com",
168
- "rel" => "self"
167
+ 'href' => 'https://example.com',
168
+ 'rel' => 'self'
169
169
  }
170
170
  ],
171
- "properties" => {
172
- "app" => {
173
- "$ref" => "#/definitions/app"
171
+ 'properties' => {
172
+ 'app' => {
173
+ '$ref' => '#/definitions/app'
174
174
  }
175
175
  },
176
- "type" => "object"
176
+ 'type' => 'object'
177
177
  }
178
178
  end
179
179