r2-oas 0.1.2 → 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (83) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +4 -0
  3. data/.rubocop.yml +6 -3
  4. data/.rubocop_todo.yml +68 -1
  5. data/.travis.yml +6 -2
  6. data/Appraisals +13 -0
  7. data/CHANGELOG.md +51 -0
  8. data/GEMSPEC.md +20 -0
  9. data/README.ja.md +71 -0
  10. data/README.md +70 -0
  11. data/lib/r2-oas.rb +3 -4
  12. data/lib/r2-oas/deploy/client.rb +33 -6
  13. data/lib/r2-oas/errors.rb +1 -0
  14. data/lib/r2-oas/lib/core_ext/hash/deep_merge.rb +44 -0
  15. data/lib/r2-oas/lib/core_ext/object/blank.rb +135 -0
  16. data/lib/r2-oas/lib/three-way-merge/twm.rb +83 -0
  17. data/lib/r2-oas/schema/builder.rb +23 -0
  18. data/lib/r2-oas/schema/editor.rb +26 -7
  19. data/lib/r2-oas/schema/generator.rb +1 -1
  20. data/lib/r2-oas/schema/manager/file_manager.rb +26 -0
  21. data/lib/r2-oas/schema/ui.rb +0 -1
  22. data/lib/r2-oas/schema/v3/analyzer/base_analyzer.rb +1 -6
  23. data/lib/r2-oas/schema/v3/analyzer/components/object_analyzer.rb +1 -1
  24. data/lib/r2-oas/schema/v3/analyzer/path_analyzer.rb +1 -1
  25. data/lib/r2-oas/schema/v3/analyzer/tag_analyzer.rb +1 -1
  26. data/lib/r2-oas/schema/v3/builder.rb +28 -0
  27. data/lib/r2-oas/schema/v3/builder/base_builder.rb +60 -0
  28. data/lib/r2-oas/schema/v3/builder/doc_builder.rb +43 -0
  29. data/lib/r2-oas/schema/v3/cleaner/base_cleaner.rb +1 -1
  30. data/lib/r2-oas/schema/v3/generator.rb +1 -5
  31. data/lib/r2-oas/schema/v3/generator/base_generator.rb +30 -1
  32. data/lib/r2-oas/schema/v3/generator/components/object_generator.rb +6 -25
  33. data/lib/r2-oas/schema/v3/generator/components/request_body_generator.rb +6 -6
  34. data/lib/r2-oas/schema/v3/generator/doc_generator.rb +84 -18
  35. data/lib/r2-oas/schema/v3/generator/path_generator.rb +7 -19
  36. data/lib/r2-oas/schema/v3/generator/schema_generator.rb +6 -26
  37. data/lib/r2-oas/schema/v3/manager/file/base_file_manager.rb +10 -4
  38. data/lib/r2-oas/schema/v3/manager/pathname_manager.rb +6 -1
  39. data/lib/r2-oas/store.rb +118 -0
  40. data/lib/r2-oas/task_logging.rb +6 -0
  41. data/lib/r2-oas/tasks/main.rake +66 -73
  42. data/lib/r2-oas/tasks/tool.rake +32 -28
  43. data/lib/r2-oas/tool/paths/ls.rb +1 -1
  44. data/lib/r2-oas/version.rb +1 -1
  45. data/r2-oas.gemspec +19 -10
  46. metadata +88 -60
  47. data/.github/ISSUE_TEMPLATE.md +0 -12
  48. data/.github/PULL_REQUEST_TEMPLATE.md +0 -12
  49. data/Gemfile.lock +0 -222
  50. data/bin/console +0 -12
  51. data/bin/setup +0 -8
  52. data/docs/.nojekyll +0 -0
  53. data/docs/README.md +0 -326
  54. data/docs/_sidebar.md +0 -22
  55. data/docs/index.html +0 -28
  56. data/docs/schema/3.0.0.md +0 -155
  57. data/docs/setting/COC.md +0 -14
  58. data/docs/setting/CORS.md +0 -22
  59. data/docs/setting/configure.md +0 -163
  60. data/docs/usage/analyze_docs.md +0 -875
  61. data/docs/usage/clean_docs.md +0 -19
  62. data/docs/usage/deploy_docs.md +0 -839
  63. data/docs/usage/display_paths_list.md +0 -35
  64. data/docs/usage/display_paths_stats.md +0 -54
  65. data/docs/usage/edit_docs.md +0 -218
  66. data/docs/usage/generate_docs.md +0 -256
  67. data/docs/usage/monitor_docs.md +0 -219
  68. data/docs/usage/use_hook_methods.md +0 -236
  69. data/docs/usage/use_hook_to_generate_docs.md +0 -235
  70. data/docs/usage/use_schema_namespace.md +0 -183
  71. data/docs/usage/use_tag_namespace.md +0 -182
  72. data/docs/usage/view_docs.md +0 -262
  73. data/lib/r2-oas/deploy/swagger-ui/dist/favicon-16x16.png +0 -0
  74. data/lib/r2-oas/deploy/swagger-ui/dist/favicon-32x32.png +0 -0
  75. data/lib/r2-oas/deploy/swagger-ui/dist/oauth2-redirect.html +0 -68
  76. data/lib/r2-oas/deploy/swagger-ui/dist/swagger-ui-bundle.js +0 -134
  77. data/lib/r2-oas/deploy/swagger-ui/dist/swagger-ui-bundle.js.map +0 -1
  78. data/lib/r2-oas/deploy/swagger-ui/dist/swagger-ui-standalone-preset.js +0 -22
  79. data/lib/r2-oas/deploy/swagger-ui/dist/swagger-ui-standalone-preset.js.map +0 -1
  80. data/lib/r2-oas/deploy/swagger-ui/dist/swagger-ui.css +0 -4
  81. data/lib/r2-oas/deploy/swagger-ui/dist/swagger-ui.css.map +0 -1
  82. data/lib/r2-oas/deploy/swagger-ui/dist/swagger-ui.js +0 -9
  83. data/lib/r2-oas/deploy/swagger-ui/dist/swagger-ui.js.map +0 -1
@@ -17,29 +17,17 @@ module R2OAS
17
17
  end
18
18
 
19
19
  def generate_docs
20
- if paths_file_do_not_exists?
21
- logger.info ' <From routes data>'
22
- generate_docs_from_routes_data
23
- else
24
- logger.info ' <From schema files>'
25
- generate_docs_from_schema_fiels
26
- end
20
+ logger.info ' <From routes data>'
21
+ generate_docs_from_routes_data
27
22
  end
28
23
 
29
24
  private
30
25
 
31
26
  alias paths_files_paths schema_files_paths
32
- alias paths_file_do_not_exists? schema_file_do_not_exists?
33
-
34
- def generate_docs_from_schema_fiels
35
- process_when_generate_docs do |save_file_path|
36
- logger.info " Merge schema file: \t#{save_file_path}"
37
- end
38
- end
39
27
 
40
28
  def generate_docs_from_routes_data
41
29
  process_when_generate_docs do |save_file_path|
42
- logger.info " Write schema file: \t#{save_file_path}"
30
+ logger.info " Add schema file into store: \t#{save_file_path}"
43
31
  end
44
32
  end
45
33
 
@@ -47,11 +35,11 @@ module R2OAS
47
35
  logger.info ' <Update schema files (paths)>'
48
36
  save_each_tags(@paths) do |tag_name, result|
49
37
  relative_path = "paths/#{tag_name}"
50
- path_item_file_manager = PathItemFileManager.new(relative_path, :relative)
51
-
52
- path_item_file_manager.save(result.to_yaml) unless path_item_file_manager.skip_save?
38
+ file_manager = PathItemFileManager.new(relative_path, :relative)
39
+ save_file_path = file_manager.save_file_path(type: :relative)
40
+ store.add(save_file_path, result.to_yaml)
53
41
 
54
- yield path_item_file_manager.save_file_path if block_given?
42
+ yield save_file_path if block_given?
55
43
  end
56
44
  end
57
45
 
@@ -17,36 +17,15 @@ module R2OAS
17
17
  end
18
18
 
19
19
  def generate_docs
20
- if force_update_schema || schema_file_do_not_exists?
21
- logger.info '<From routes data>'
22
- generate_docs_from_routes_data
23
- else
24
- logger.info '<From schema files>'
25
- generate_docs_from_schema_fiels
26
- end
27
- end
28
-
29
- def create_docs
30
- if !skip_generate_docs
31
- super
32
- elsif skip_generate_docs && FileTest.exists?(doc_save_file_path)
33
- YAML.load_file(doc_save_file_path)
34
- else
35
- {}
36
- end
20
+ logger.info '<From routes data>'
21
+ generate_docs_from_routes_data
37
22
  end
38
23
 
39
24
  private
40
25
 
41
- def generate_docs_from_schema_fiels
42
- process_when_generate_docs do |save_file_path|
43
- logger.info " Merge schema file: \t#{save_file_path}"
44
- end
45
- end
46
-
47
26
  def generate_docs_from_routes_data
48
27
  process_when_generate_docs do |save_file_path|
49
- logger.info " Write schema file: \t#{save_file_path}"
28
+ logger.info " Add schema file into store: \t#{save_file_path}"
50
29
  end
51
30
  end
52
31
 
@@ -66,9 +45,10 @@ module R2OAS
66
45
  logger.info ' [Generate OAS schema files (components)] end'
67
46
  else
68
47
  file_manager = FileManager.new(field_name, :relative)
69
- file_manager.save(result.to_yaml)
48
+ save_file_path = file_manager.save_file_path(type: :relative)
49
+ store.add(save_file_path, result.to_yaml)
70
50
 
71
- yield file_manager.save_file_path if block_given?
51
+ yield file_manager.save_file_path(type: :relative) if block_given?
72
52
  end
73
53
  end
74
54
  end
@@ -23,6 +23,8 @@ module R2OAS
23
23
  end
24
24
 
25
25
  def save(data)
26
+ abs_dir = File.dirname(save_file_path)
27
+ FileUtils.mkdir_p(abs_dir) unless FileTest.exists?(abs_dir)
26
28
  File.write(save_file_path, data)
27
29
  end
28
30
 
@@ -31,10 +33,14 @@ module R2OAS
31
33
  save(result.to_yaml)
32
34
  end
33
35
 
34
- def save_file_path
35
- File.expand_path(@relative_save_file_path).tap do |abs_path|
36
- abs_dir = File.dirname(abs_path)
37
- FileUtils.mkdir_p(abs_dir) unless FileTest.exists?(abs_dir)
36
+ def save_file_path(type: :full)
37
+ file_path = File.expand_path(@relative_save_file_path)
38
+
39
+ case type
40
+ when :relative
41
+ file_path.sub(%r{^#{Dir.getwd}/?}, '')
42
+ else
43
+ file_path
38
44
  end
39
45
  end
40
46
 
@@ -60,7 +60,12 @@ module R2OAS
60
60
  when :ref
61
61
  "#{@path.gsub('#/', '')}.#{@ext_name}"
62
62
  when :relative
63
- "#{@path}.#{@ext_name}"
63
+ ext_name = File.extname(@path)
64
+ if ext_name.empty?
65
+ "#{@path}.#{@ext_name}"
66
+ else
67
+ @path
68
+ end
64
69
  when :full
65
70
  @path
66
71
  else
@@ -0,0 +1,118 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'digest/sha1'
4
+ require 'zlib'
5
+
6
+ require 'r2-oas/schema/manager/file_manager'
7
+
8
+ module R2OAS
9
+ class Store
10
+ attr_accessor :data
11
+
12
+ def initialize(data = {})
13
+ if data.empty?
14
+ @data = {}
15
+ @data['type'] = :schema
16
+ @data['data'] = {}
17
+ else
18
+ @data = data
19
+ end
20
+ end
21
+
22
+ def add(key, value, type = :schema)
23
+ sha1 = calc_sha1(key, value)
24
+
25
+ @data['data'][sha1] ||= {}
26
+ @data['type'] = type
27
+ @data['data'][sha1]['key'] = key
28
+ @data['data'][sha1]['value'] = Zlib::Deflate.deflate(value)
29
+ end
30
+
31
+ def save
32
+ type = @data['type']
33
+ @data['data'].values.each do |value|
34
+ case type
35
+ when :schema
36
+ save_path = value['key']
37
+ save_data = Zlib::Inflate.inflate(value['value'])
38
+ manager = Schema::FileManager.new(save_path, :full)
39
+ manager.save(save_data)
40
+ yield save_path
41
+ end
42
+ end
43
+ end
44
+
45
+ def dup_slice(*sha1s)
46
+ dup_store = Store.new(@data.dup)
47
+ dup_data = dup_store.data['data']
48
+ dup_store.data['data'] = sha1s.each_with_object({}) { |sha1, data| data[sha1] = dup_data[sha1] if dup_store.key?(sha1) }
49
+ dup_store
50
+ end
51
+
52
+ def checksum?
53
+ @data['data'].each_with_object([]) do |(sha1, value), arr|
54
+ child_key = value['key']
55
+ child_value = Zlib::Inflate.inflate(value['value'])
56
+ arr.push(sha1.eql? calc_sha1(child_key, child_value))
57
+ end.all?
58
+ end
59
+
60
+ def key?(key)
61
+ @data['data']&.key?(key)
62
+ end
63
+
64
+ def exists?
65
+ !@data['data']&.empty?
66
+ end
67
+
68
+ def diff_from(local_store)
69
+ to_hash = adjust(values.to_h, 'after')
70
+ from_hash = adjust(local_store.send(:values).to_h, 'before')
71
+ analyze_data = to_hash.deep_merge(from_hash)
72
+ if block_given?
73
+ yield analyze_data
74
+ else
75
+ analyze_data
76
+ end
77
+ end
78
+
79
+ private
80
+
81
+ def calc_sha1(key, value)
82
+ Digest::SHA1.hexdigest("#{key}\0#{value}")
83
+ end
84
+
85
+ def values
86
+ arr = @data['data'].values
87
+ arr.each_with_object([]) do |el, result|
88
+ key = el['key']
89
+ value = el['value']
90
+ result.push([key, value])
91
+ end
92
+ end
93
+
94
+ def adjust(hash, direct)
95
+ hash.each_with_object({}) do |(key, value), result|
96
+ result[key] = { direct => {} }
97
+ result[key][direct] = YAML.safe_load(Zlib::Inflate.inflate(value))
98
+ result
99
+ end
100
+ end
101
+
102
+ class << self
103
+ extend Forwardable
104
+
105
+ def_delegators :instance, :add
106
+
107
+ def create
108
+ instance
109
+ end
110
+
111
+ private
112
+
113
+ def instance
114
+ @instance ||= new
115
+ end
116
+ end
117
+ end
118
+ end
@@ -20,6 +20,12 @@ module R2OAS
20
20
 
21
21
  private
22
22
 
23
+ def start
24
+ logger.info '[R2-OAS] start'
25
+ yield
26
+ logger.info '[R2-OAS] end'
27
+ end
28
+
23
29
  def logger
24
30
  R2OAS.logger
25
31
  end
@@ -8,100 +8,89 @@ load File.expand_path('common.rake', __dir__)
8
8
 
9
9
  namespace :routes do
10
10
  namespace :oas do
11
- desc 'Generate Swagger documentation files'
11
+ desc 'Generate OAS documentation files'
12
12
  task docs: [:common] do
13
- logger.info '[R2-OAS] start'
14
- options = { unit_paths_file_path: unit_paths_file_path, skip_load_dot_paths: true }
15
- generator = R2OAS::Schema::Generator.new(options)
16
- generator.generate_docs
17
- logger.info '[R2-OAS] end'
13
+ start do
14
+ is_create_cache = cache_docs.eql? 'true'
15
+ options = { unit_paths_file_path: unit_paths_file_path, skip_load_dot_paths: true, is_create_cache: is_create_cache }
16
+ generator = R2OAS::Schema::Generator.new(options)
17
+ generator.generate_docs
18
+ end
18
19
  end
19
20
 
20
- desc 'Analyze Swagger documentation'
21
+ desc 'Analyze OAS documentation'
21
22
  task analyze: [:common] do
22
- logger.info '[R2-OAS] start'
23
-
24
- analyzer_options = { type: :existing, existing_schema_file_path: existing_schema_file_path }
25
- analyzer = R2OAS::Schema::Analyzer.new({}, {}, analyzer_options)
26
- analyzer.analyze_docs
27
-
28
- generator_options = { skip_generate_docs: true }
29
- generator = R2OAS::Schema::Generator.new(generator_options)
30
- generator.generate_docs
31
-
32
- logger.info '[R2-OAS] end'
23
+ start do
24
+ analyzer_options = { type: :existing, existing_schema_file_path: existing_schema_file_path }
25
+ analyzer = R2OAS::Schema::Analyzer.new({}, {}, analyzer_options)
26
+ analyzer.analyze_docs
27
+
28
+ builder_options = {}
29
+ builder = R2OAS::Schema::Builder.new(builder_options)
30
+ builder.build_docs
31
+ end
33
32
  end
34
33
 
35
- desc 'Distribute Swagger documentation'
34
+ desc 'Distribute OAS documentation'
36
35
  task dist: [:common] do
37
- logger.info '[R2-OAS] start'
38
-
39
- generator_options = { unit_paths_file_path: unit_paths_file_path, skip_generate_docs: true }
40
- generator = R2OAS::Schema::Generator.new(generator_options)
41
- generator.generate_docs
42
-
43
- logger.info '[R2-OAS] end'
36
+ start do
37
+ builder_options = { unit_paths_file_path: unit_paths_file_path }
38
+ builder = R2OAS::Schema::Builder.new(builder_options)
39
+ builder.build_docs
40
+ end
44
41
  end
45
42
 
46
43
  desc 'Open Swagger Editor'
47
44
  task editor: [:common] do
48
- logger.info '[R2-OAS] start'
49
-
50
- generator_options = { unit_paths_file_path: unit_paths_file_path, skip_generate_docs: true }
51
- generator = R2OAS::Schema::Generator.new(generator_options)
52
- generator.generate_docs
53
-
54
- before_schema_data = generator.oas_doc
55
- editor_options = { unit_paths_file_path: unit_paths_file_path }
56
- editor = R2OAS::Schema::Editor.new(before_schema_data, editor_options)
57
- editor.start
58
-
59
- logger.info '[R2-OAS] end'
45
+ start do
46
+ builder_options = { unit_paths_file_path: unit_paths_file_path }
47
+ builder = R2OAS::Schema::Builder.new(builder_options)
48
+ builder.build_docs
49
+
50
+ before_schema_data = builder.oas_doc
51
+ editor_options = { unit_paths_file_path: unit_paths_file_path }
52
+ editor = R2OAS::Schema::Editor.new(before_schema_data, editor_options)
53
+ editor.start
54
+ end
60
55
  end
61
56
 
62
57
  desc 'Open Swagger UI'
63
58
  task ui: [:common] do
64
- logger.info '[R2-OAS] start'
65
-
66
- generator_options = { unit_paths_file_path: unit_paths_file_path, skip_generate_docs: true }
67
- generator = R2OAS::Schema::Generator.new(generator_options)
68
- generator.generate_docs
69
-
70
- ui_options = { unit_paths_file_path: unit_paths_file_path }
71
- ui = R2OAS::Schema::UI.new(ui_options)
72
- ui.start
73
-
74
- logger.info '[R2-OAS] end'
59
+ start do
60
+ builder_options = { unit_paths_file_path: unit_paths_file_path }
61
+ builder = R2OAS::Schema::Builder.new(builder_options)
62
+ builder.build_docs
63
+
64
+ ui_options = { unit_paths_file_path: unit_paths_file_path }
65
+ ui = R2OAS::Schema::UI.new(ui_options)
66
+ ui.start
67
+ end
75
68
  end
76
69
 
77
- desc 'Monitor Swagger Document'
70
+ desc 'Monitor OAS Document'
78
71
  task monitor: [:common] do
79
- logger.info '[R2-OAS] start'
80
-
81
- generator_options = { unit_paths_file_path: unit_paths_file_path, skip_generate_docs: true }
82
- generator = R2OAS::Schema::Generator.new(generator_options)
83
- generator.generate_docs
84
-
85
- before_schema_data = generator.oas_doc
86
- monitor_options = { unit_paths_file_path: unit_paths_file_path }
87
- monitor = R2OAS::Schema::Monitor.new(before_schema_data, monitor_options)
88
- monitor.start
89
-
90
- logger.info '[R2-OAS] end'
72
+ start do
73
+ builder_options = { unit_paths_file_path: unit_paths_file_path }
74
+ builder = R2OAS::Schema::Builder.new(builder_options)
75
+ builder.build_docs
76
+
77
+ before_schema_data = builder.oas_doc
78
+ monitor_options = { unit_paths_file_path: unit_paths_file_path }
79
+ monitor = R2OAS::Schema::Monitor.new(before_schema_data, monitor_options)
80
+ monitor.start
81
+ end
91
82
  end
92
83
 
93
- desc 'Clean Swagger Document'
84
+ desc 'Clean OAS Document'
94
85
  task clean: [:common] do
95
- logger.info '[R2-OAS] start'
96
-
97
- generator_options = { skip_generate_docs: true, skip_load_dot_paths: true }
98
- generator = R2OAS::Schema::Generator.new(generator_options)
99
- generator.generate_docs
100
-
101
- cleaner = R2OAS::Schema::Cleaner.new
102
- cleaner.clean_docs
103
-
104
- logger.info '[R2-OAS] end'
86
+ start do
87
+ builder_options = { skip_load_dot_paths: true }
88
+ builder = R2OAS::Schema::Builder.new(builder_options)
89
+ builder.build_docs
90
+
91
+ cleaner = R2OAS::Schema::Cleaner.new
92
+ cleaner.clean_docs
93
+ end
105
94
  end
106
95
 
107
96
  private
@@ -113,5 +102,9 @@ namespace :routes do
113
102
  def existing_schema_file_path
114
103
  ENV.fetch('OAS_FILE', '')
115
104
  end
105
+
106
+ def cache_docs
107
+ ENV.fetch('CACHE_DOCS', 'false')
108
+ end
116
109
  end
117
110
  end