prmd 0.7.0 → 0.7.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/README.md +21 -4
  4. data/docs/schemata.md +4 -0
  5. data/lib/prmd/core/combiner.rb +4 -34
  6. data/lib/prmd/core/reference_localizer.rb +93 -0
  7. data/lib/prmd/load_schema_file.rb +3 -14
  8. data/lib/prmd/multi_loader.rb +2 -0
  9. data/lib/prmd/multi_loader/json.rb +19 -0
  10. data/lib/prmd/multi_loader/loader.rb +128 -0
  11. data/lib/prmd/multi_loader/toml.rb +19 -0
  12. data/lib/prmd/multi_loader/yajl.rb +19 -0
  13. data/lib/prmd/multi_loader/yaml.rb +19 -0
  14. data/lib/prmd/multi_loader/yml.rb +2 -0
  15. data/lib/prmd/rake_tasks/base.rb +33 -5
  16. data/lib/prmd/rake_tasks/combine.rb +20 -4
  17. data/lib/prmd/rake_tasks/doc.rb +24 -8
  18. data/lib/prmd/rake_tasks/verify.rb +17 -5
  19. data/lib/prmd/schema.rb +5 -1
  20. data/lib/prmd/templates/combine_head.json +3 -3
  21. data/lib/prmd/templates/init_default.json +5 -3
  22. data/lib/prmd/templates/init_resource.json.erb +18 -1
  23. data/lib/prmd/templates/schemata.md.erb +3 -0
  24. data/lib/prmd/templates/schemata/helper.erb +20 -0
  25. data/lib/prmd/templates/schemata/link.md.erb +11 -1
  26. data/lib/prmd/templates/schemata/link_curl_example.md.erb +8 -5
  27. data/lib/prmd/version.rb +1 -1
  28. data/test/commands/render_test.rb +60 -0
  29. data/test/core/reference_localizer_test.rb +65 -0
  30. data/test/helpers.rb +25 -3
  31. data/test/multi_loader/common.rb +35 -0
  32. data/test/multi_loader/json_test.rb +14 -0
  33. data/test/multi_loader/toml_test.rb +18 -0
  34. data/test/multi_loader/yajl_test.rb +18 -0
  35. data/test/multi_loader/yaml_test.rb +14 -0
  36. data/test/rake_tasks/combine_test.rb +38 -0
  37. data/test/rake_tasks/doc_test.rb +31 -0
  38. data/test/rake_tasks/verify_test.rb +23 -0
  39. data/test/schemata/data/test.json +6 -0
  40. data/test/schemata/data/test.toml +4 -0
  41. data/test/schemata/data/test.yaml +3 -0
  42. data/test/schemata/input/rake-meta.json +9 -0
  43. data/test/schemata/input/rake_combine/post.json +100 -0
  44. data/test/schemata/input/rake_combine/user.json +100 -0
  45. data/test/schemata/input/rake_doc.json +223 -0
  46. data/test/schemata/input/rake_verify.json +223 -0
  47. metadata +44 -3
  48. data/Gemfile.lock +0 -23
@@ -2,7 +2,7 @@
2
2
  module Prmd
3
3
  # Well, duh, its a Version module, what did you expect?
4
4
  module Version
5
- MAJOR, MINOR, TEENY, PATCH = 0, 7, 0, nil
5
+ MAJOR, MINOR, TEENY, PATCH = 0, 7, 1, nil
6
6
  # version string
7
7
  # @return [String]
8
8
  STRING = [MAJOR, MINOR, TEENY, PATCH].compact.join('.').freeze
@@ -25,6 +25,13 @@ class InteragentRenderTest < Minitest::Test
25
25
  assert_match /version.*v10\.9\.rc1/, markdown
26
26
  end
27
27
 
28
+ def test_render_for_example_as_an_array
29
+ # matches -d '[{...}]' taking into account line breaks and spacing
30
+ expression = /-d '\[[\s\n]+\{[\n\s]+\"name\": \"EXAMPLE\",[\n\s]+\"value\": \"example\"[\s\n]+\}[\n\s]+\]/
31
+ markdown = render
32
+ assert_match expression, markdown
33
+ end
34
+
28
35
  private
29
36
 
30
37
  def data
@@ -62,6 +69,56 @@ class InteragentRenderTest < Minitest::Test
62
69
  ],
63
70
  'properties' => {
64
71
  }
72
+ },
73
+ 'config-var' => {
74
+ 'description' => 'A configuration variable for an app.',
75
+ 'title' => 'Config-var',
76
+ 'type' => 'object',
77
+ 'definitions' => {
78
+ 'name' => {
79
+ 'description' => 'The config-var\'s name.',
80
+ 'type' => 'string',
81
+ 'example' => 'EXAMPLE'
82
+ },
83
+ 'value' => {
84
+ 'description' => 'The config-var\'s value.',
85
+ 'type' => 'string',
86
+ 'example' => 'example'
87
+ },
88
+ },
89
+ 'links' => [
90
+ {
91
+ 'description' => 'Create many config-vars.',
92
+ 'href' => '/config-vars',
93
+ 'method' => 'PATCH',
94
+ 'rel' => 'instances',
95
+ 'title' => 'Create Config-var',
96
+ 'schema' => {
97
+ 'type' => [
98
+ 'array'
99
+ ],
100
+ 'items' => {
101
+ 'name' => {
102
+ '$ref' => '#/definitions/config-var/definitions/name'
103
+ },
104
+ 'value' => {
105
+ '$ref' => '#/definitions/config-var/definitions/value'
106
+ },
107
+ 'example' => [
108
+ { 'name' => 'EXAMPLE', 'value' => 'example' }
109
+ ]
110
+ }
111
+ }
112
+ }
113
+ ],
114
+ 'properties' => {
115
+ 'name' => {
116
+ '$ref' => '#/definitions/config-var/definitions/name'
117
+ },
118
+ 'value' => {
119
+ '$ref' => '#/definitions/config-var/definitions/value'
120
+ }
121
+ }
65
122
  }
66
123
  },
67
124
  'links' => [
@@ -73,6 +130,9 @@ class InteragentRenderTest < Minitest::Test
73
130
  'properties' => {
74
131
  'app' => {
75
132
  '$ref' => '#/definitions/app'
133
+ },
134
+ 'config-var' => {
135
+ '$ref' => '#/definitions/config-var'
76
136
  }
77
137
  },
78
138
  'type' => 'object'
@@ -0,0 +1,65 @@
1
+ require File.expand_path('../helpers', File.dirname(__FILE__))
2
+
3
+ module Prmd
4
+ class ReferenceLocalizerTest < Minitest::Test
5
+ def base_object
6
+ {
7
+ "type" => ["object"],
8
+ "properties" => {
9
+ "name" => {
10
+ "type" => ["nil", "string"],
11
+ "example" => "john",
12
+ },
13
+ "age" => {
14
+ "type" => ["nil", "number"],
15
+ "example" => 37,
16
+ },
17
+ },
18
+ }
19
+ end
20
+
21
+ def test_no_references
22
+ object = base_object
23
+ assert_equal object, ReferenceLocalizer.localize(object)
24
+ end
25
+
26
+ def test_simple_ref
27
+ object = base_object.merge(
28
+ "properties" => base_object["properties"].merge(
29
+ "name" => { "$ref" => "#/attributes/definitions/name" },
30
+ ),
31
+ )
32
+
33
+ new_object = ReferenceLocalizer.localize(object)
34
+ assert_equal "#/definitions/attributes/definitions/name",
35
+ new_object["properties"]["name"]["$ref"]
36
+ end
37
+
38
+ def test_simple_href
39
+ object = base_object.merge("href" => "%23%2Fschemata%2Fhello%2Fworld")
40
+ new_object = ReferenceLocalizer.localize(object)
41
+ assert_equal "%23%2Fdefinitions%2Fhello%2Fworld", new_object["href"]
42
+
43
+ object = base_object.merge("href" => "%23%2Fhello%2Fworld")
44
+ new_object = ReferenceLocalizer.localize(object)
45
+ assert_equal "%2Fhello%2Fworld", new_object["href"]
46
+ end
47
+
48
+ def test_aliases
49
+ object = base_object.merge(
50
+ "properties" => base_object["properties"].merge(
51
+ "name" => { "$ref" => "#/attributes/definitions/name" },
52
+ ),
53
+ )
54
+ object["properties"]["translated_name"] = object["properties"]["name"]
55
+
56
+ new_object = ReferenceLocalizer.localize(object)
57
+
58
+ assert_equal "#/definitions/attributes/definitions/name",
59
+ new_object["properties"]["name"]["$ref"]
60
+
61
+ assert_equal "#/definitions/attributes/definitions/name",
62
+ new_object["properties"]["translated_name"]["$ref"]
63
+ end
64
+ end
65
+ end
@@ -55,10 +55,32 @@ module CliBaseTestHelpers
55
55
  end
56
56
  end
57
57
 
58
+ module PrmdTestHelpers
59
+ module Paths
60
+ def self.schemas(*args)
61
+ File.join(File.expand_path('schemata', File.dirname(__FILE__)), *args)
62
+ end
63
+
64
+ def self.input_schemas(*args)
65
+ schemas('input', *args)
66
+ end
67
+
68
+ def self.output_schemas(*args)
69
+ schemas('output', *args)
70
+ end
71
+ end
72
+ end
73
+
74
+ def schemas_path(*args)
75
+ PrmdTestHelpers::Paths.schemas(*args)
76
+ end
77
+
58
78
  def input_schemas_path(*args)
59
- @data_path ||= File.expand_path(File.join(*args),
60
- File.join(File.dirname(__FILE__),
61
- 'schemata/input'))
79
+ PrmdTestHelpers::Paths.input_schemas(*args)
80
+ end
81
+
82
+ def output_schemas_path(*args)
83
+ PrmdTestHelpers::Paths.output_schemas(*args)
62
84
  end
63
85
 
64
86
  def user_input_schema
@@ -0,0 +1,35 @@
1
+ require File.expand_path('../helpers', File.dirname(__FILE__))
2
+
3
+ module PrmdLoaderTests
4
+ # @abstrac
5
+ def testing_filename
6
+ #
7
+ end
8
+
9
+ # @abstract
10
+ def loader_module
11
+ #
12
+ end
13
+
14
+ def assert_test_data(data)
15
+ assert_kind_of Hash, data
16
+ assert_equal 'yes', data['test']
17
+ assert_kind_of Hash, data['object']
18
+ assert_equal 'Object', data['object']['is_a']
19
+ end
20
+
21
+ def test_load_data
22
+ data = File.read(testing_filename)
23
+ assert_test_data loader_module.load_data(data)
24
+ end
25
+
26
+ def test_load_stream
27
+ File.open(testing_filename, 'r') do |f|
28
+ assert_test_data loader_module.load_stream(f)
29
+ end
30
+ end
31
+
32
+ def test_load_file
33
+ assert_test_data loader_module.load_file(testing_filename)
34
+ end
35
+ end
@@ -0,0 +1,14 @@
1
+ require File.expand_path('common', File.dirname(__FILE__))
2
+ require 'prmd/multi_loader/json'
3
+
4
+ class PrmdMultiLoaderJsonTest < Minitest::Test
5
+ include PrmdLoaderTests
6
+
7
+ def loader_module
8
+ Prmd::MultiLoader::Json
9
+ end
10
+
11
+ def testing_filename
12
+ schemas_path('data/test.json')
13
+ end
14
+ end
@@ -0,0 +1,18 @@
1
+ require File.expand_path('common', File.dirname(__FILE__))
2
+ begin
3
+ require 'prmd/multi_loader/toml'
4
+ rescue LoadError
5
+ #
6
+ end
7
+
8
+ class PrmdMultiLoaderTomlTest < Minitest::Test
9
+ include PrmdLoaderTests
10
+
11
+ def loader_module
12
+ Prmd::MultiLoader::Toml
13
+ end
14
+
15
+ def testing_filename
16
+ schemas_path('data/test.toml')
17
+ end
18
+ end if defined?(TOML)
@@ -0,0 +1,18 @@
1
+ require File.expand_path('common', File.dirname(__FILE__))
2
+ begin
3
+ require 'prmd/multi_loader/yajl'
4
+ rescue LoadError
5
+ #
6
+ end
7
+
8
+ class PrmdMultiLoaderYajlTest < Minitest::Test
9
+ include PrmdLoaderTests
10
+
11
+ def loader_module
12
+ Prmd::MultiLoader::Yajl
13
+ end
14
+
15
+ def testing_filename
16
+ schemas_path('data/test.json')
17
+ end
18
+ end if defined?(Yajl)
@@ -0,0 +1,14 @@
1
+ require File.expand_path('common', File.dirname(__FILE__))
2
+ require 'prmd/multi_loader/yaml'
3
+
4
+ class PrmdMultiLoaderYamlTest < Minitest::Test
5
+ include PrmdLoaderTests
6
+
7
+ def loader_module
8
+ Prmd::MultiLoader::Yaml
9
+ end
10
+
11
+ def testing_filename
12
+ schemas_path('data/test.yaml')
13
+ end
14
+ end
@@ -0,0 +1,38 @@
1
+ require File.expand_path('../helpers', File.dirname(__FILE__))
2
+ require 'prmd/rake_tasks/combine'
3
+ require 'rake'
4
+
5
+ # due to the nature of these Rake Tests, this should not be executed in a
6
+ # read-only filesystem or directory.
7
+ class PrmdRakeTaskCombineTest < Minitest::Test
8
+ def test_define_wo_options
9
+ paths = [input_schemas_path('rake_combine')]
10
+ #output_file = output_schemas_path('rake_combine_with_options.json')
11
+ output_file = nil
12
+ File.delete(output_file) if File.exist?(output_file) if output_file
13
+ Prmd::RakeTasks::Combine.new do |t|
14
+ t.name = :combine_wo_options
15
+ t.options[:meta] = input_schemas_path('rake-meta.json')
16
+ t.paths.concat(paths)
17
+ t.output_file = output_file
18
+ end
19
+ Rake::Task['combine_wo_options'].invoke
20
+ assert File.exist?(output_file) if output_file
21
+ end
22
+
23
+ def test_define_with_options
24
+ paths = [input_schemas_path('rake_combine')]
25
+ #output_file = output_schemas_path('rake_combine_with_options.json')
26
+ output_file = nil
27
+ options = {
28
+ meta: input_schemas_path('rake-meta.json')
29
+ }
30
+ File.delete(output_file) if File.exist?(output_file) if output_file
31
+ Prmd::RakeTasks::Combine.new(name: :combine_with_options,
32
+ paths: paths,
33
+ output_file: output_file,
34
+ options: options)
35
+ Rake::Task['combine_with_options'].invoke
36
+ assert File.exist?(output_file) if output_file
37
+ end
38
+ end
@@ -0,0 +1,31 @@
1
+ require File.expand_path('../helpers', File.dirname(__FILE__))
2
+ require 'prmd/rake_tasks/doc'
3
+ require 'rake'
4
+
5
+ # due to the nature of these Rake Tests, this should not be executed in a
6
+ # read-only filesystem or directory.
7
+ class PrmdRakeTaskDocTest < Minitest::Test
8
+ def test_define_wo_options
9
+ input_file = input_schemas_path('rake_doc.json')
10
+ #output_file = output_schemas_path('rake_doc_with_options.md')
11
+ output_file = nil
12
+ File.delete(output_file) if File.exist?(output_file) if output_file
13
+ Prmd::RakeTasks::Doc.new do |t|
14
+ t.name = :doc_wo_options
15
+ t.files = { input_file => output_file }
16
+ end
17
+ Rake::Task['doc_wo_options'].invoke
18
+ assert File.exist?(output_file) if output_file
19
+ end
20
+
21
+ def test_define_with_options
22
+ input_file = input_schemas_path('rake_doc.json')
23
+ #output_file = output_schemas_path('rake_doc_with_options.md')
24
+ output_file = nil
25
+ File.delete(output_file) if File.exist?(output_file) if output_file
26
+ Prmd::RakeTasks::Doc.new(name: :doc_with_options,
27
+ files: { input_file => output_file })
28
+ Rake::Task['doc_with_options'].invoke
29
+ assert File.exist?(output_file) if output_file
30
+ end
31
+ end
@@ -0,0 +1,23 @@
1
+ require File.expand_path('../helpers', File.dirname(__FILE__))
2
+ require 'prmd/rake_tasks/verify'
3
+ require 'rake'
4
+
5
+ # due to the nature of these Rake Tests, this should not be executed in a
6
+ # read-only filesystem or directory.
7
+ class PrmdRakeTaskVerifyTest < Minitest::Test
8
+ def test_define_wo_options
9
+ input_file = input_schemas_path('rake_verify.json')
10
+ Prmd::RakeTasks::Verify.new do |t|
11
+ t.name = :verify_wo_options
12
+ t.files = [input_file]
13
+ end
14
+ Rake::Task['verify_wo_options'].invoke
15
+ end
16
+
17
+ def test_define_with_options
18
+ input_file = input_schemas_path('rake_verify.json')
19
+ Prmd::RakeTasks::Verify.new(name: :verify_with_options,
20
+ files: [input_file])
21
+ Rake::Task['verify_with_options'].invoke
22
+ end
23
+ end
@@ -0,0 +1,6 @@
1
+ {
2
+ "test": "yes",
3
+ "object": {
4
+ "is_a": "Object"
5
+ }
6
+ }
@@ -0,0 +1,4 @@
1
+ test = "yes"
2
+
3
+ [object]
4
+ is_a = "Object"
@@ -0,0 +1,3 @@
1
+ test: "yes"
2
+ object:
3
+ is_a: "Object"
@@ -0,0 +1,9 @@
1
+ {
2
+ "id": "rake_task_meta",
3
+ "title": "Rake Task Test",
4
+ "links": [{
5
+ "href": "https://prmd.rake_task_test.io",
6
+ "rel": "self"
7
+ }],
8
+ "description": "Testing schema for Prmd RakeTasks"
9
+ }
@@ -0,0 +1,100 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-04/hyper-schema",
3
+ "title": "Post",
4
+ "definitions": {
5
+ "id": {
6
+ "description": "unique identifier of post",
7
+ "example": "01234567-89ab-cdef-0123-456789abcdef",
8
+ "format": "uuid",
9
+ "type": [
10
+ "string"
11
+ ]
12
+ },
13
+ "identity": {
14
+ "$ref": "/schemata/post#/definitions/id"
15
+ },
16
+ "created_at": {
17
+ "description": "when post was created",
18
+ "example": "2012-01-01T12:00:00Z",
19
+ "format": "date-time",
20
+ "type": [
21
+ "string"
22
+ ]
23
+ },
24
+ "updated_at": {
25
+ "description": "when post was updated",
26
+ "example": "2012-01-01T12:00:00Z",
27
+ "format": "date-time",
28
+ "type": [
29
+ "string"
30
+ ]
31
+ }
32
+ },
33
+ "description": "FIXME",
34
+ "links": [
35
+ {
36
+ "description": "Create a new post.",
37
+ "href": "/posts",
38
+ "method": "POST",
39
+ "rel": "create",
40
+ "schema": {
41
+ "properties": {
42
+ },
43
+ "type": [
44
+ "object"
45
+ ]
46
+ },
47
+ "title": "Create"
48
+ },
49
+ {
50
+ "description": "Delete an existing post.",
51
+ "href": "/posts/{(%2Fschemata%2Fpost%23%2Fdefinitions%2Fidentity)}",
52
+ "method": "DELETE",
53
+ "rel": "destroy",
54
+ "title": "Delete"
55
+ },
56
+ {
57
+ "description": "Info for existing post.",
58
+ "href": "/posts/{(%2Fschemata%2Fpost%23%2Fdefinitions%2Fidentity)}",
59
+ "method": "GET",
60
+ "rel": "self",
61
+ "title": "Info"
62
+ },
63
+ {
64
+ "description": "List existing posts.",
65
+ "href": "/posts",
66
+ "method": "GET",
67
+ "rel": "instances",
68
+ "title": "List"
69
+ },
70
+ {
71
+ "description": "Update an existing post.",
72
+ "href": "/posts/{(%2Fschemata%2Fpost%23%2Fdefinitions%2Fidentity)}",
73
+ "method": "PATCH",
74
+ "rel": "update",
75
+ "schema": {
76
+ "properties": {
77
+ },
78
+ "type": [
79
+ "object"
80
+ ]
81
+ },
82
+ "title": "Update"
83
+ }
84
+ ],
85
+ "properties": {
86
+ "created_at": {
87
+ "$ref": "/schemata/post#/definitions/created_at"
88
+ },
89
+ "id": {
90
+ "$ref": "/schemata/post#/definitions/id"
91
+ },
92
+ "updated_at": {
93
+ "$ref": "/schemata/post#/definitions/updated_at"
94
+ }
95
+ },
96
+ "type": [
97
+ "object"
98
+ ],
99
+ "id": "schemata/post"
100
+ }