r2-oas 0.1.0 → 0.3.1

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 +58 -1
  8. data/GEMSPEC.md +20 -0
  9. data/README.ja.md +65 -396
  10. data/README.md +62 -392
  11. data/devscript/all_support_ruby.sh +43 -0
  12. data/devscript/bundle_for_all_support_ruby.sh +31 -0
  13. data/devscript/rspec_for_all_support_ruby.sh +27 -0
  14. data/docs/.nojekyll +0 -0
  15. data/docs/README.md +173 -0
  16. data/docs/_sidebar.md +25 -0
  17. data/docs/attention/if_clash.md +17 -0
  18. data/docs/index.html +29 -0
  19. data/docs/{versions/v3.md → schema/3.0.0.md} +1 -1
  20. data/docs/setting/COC.md +14 -0
  21. data/docs/setting/CORS.md +22 -0
  22. data/docs/setting/configure.md +176 -0
  23. data/docs/trableshouting/runtime_error.md +44 -0
  24. data/docs/{HOW_TO_ANALYZE_DOCS.md → usage/analyze_docs.md} +52 -52
  25. data/docs/usage/clean_docs.md +19 -0
  26. data/docs/{HOW_TO_DEPLOY_SWAGGER_DOC.md → usage/deploy_docs.md} +29 -29
  27. data/docs/usage/display_paths_list.md +35 -0
  28. data/docs/{HOW_TO_DISPLAY_PATHS_STATS.md → usage/display_paths_stats.md} +15 -14
  29. data/docs/{HOW_TO_START_SWAGGER_EDITOR.md → usage/edit_docs.md} +88 -88
  30. data/docs/usage/generate_docs.md +412 -0
  31. data/docs/{HOW_TO_MONITOR_SWAGGER_DOC.md → usage/monitor_docs.md} +71 -71
  32. data/docs/usage/use_hook_methods.md +236 -0
  33. data/docs/{HOW_TO_USE_HOOK_WHEN_GENERATE_DOC.md → usage/use_hook_to_generate_docs.md} +48 -57
  34. data/docs/{HOW_TO_USE_SCHEMA_NAMESPACE.md → usage/use_schema_namespace.md} +46 -41
  35. data/docs/{HOW_TO_USE_TAG_NAMESPACE.md → usage/use_tag_namespace.md} +46 -42
  36. data/docs/{HOW_TO_START_SWAGGER_UI.md → usage/view_docs.md} +132 -132
  37. data/gemfiles/ruby_2.3.3.gemfile +11 -0
  38. data/gemfiles/ruby_2.4.2.gemfile +11 -0
  39. data/gemfiles/ruby_2.5.8.gemfile +11 -0
  40. data/gemfiles/ruby_2.6.6.gemfile +11 -0
  41. data/gemfiles/ruby_2.7.1.gemfile +11 -0
  42. data/lib/r2-oas.rb +3 -4
  43. data/lib/r2-oas/app_configuration.rb +19 -16
  44. data/lib/r2-oas/deploy/client.rb +14 -2
  45. data/lib/r2-oas/errors.rb +1 -0
  46. data/lib/r2-oas/lib/core_ext/hash/deep_merge.rb +44 -0
  47. data/lib/r2-oas/lib/core_ext/object/blank.rb +135 -0
  48. data/lib/r2-oas/lib/three-way-merge/twm.rb +83 -0
  49. data/lib/r2-oas/schema/builder.rb +23 -0
  50. data/lib/r2-oas/schema/editor.rb +26 -7
  51. data/lib/r2-oas/schema/generator.rb +1 -1
  52. data/lib/r2-oas/schema/manager/file_manager.rb +26 -0
  53. data/lib/r2-oas/schema/ui.rb +0 -1
  54. data/lib/r2-oas/schema/v3/analyzer/base_analyzer.rb +1 -6
  55. data/lib/r2-oas/schema/v3/analyzer/components/object_analyzer.rb +1 -1
  56. data/lib/r2-oas/schema/v3/analyzer/path_analyzer.rb +1 -1
  57. data/lib/r2-oas/schema/v3/analyzer/tag_analyzer.rb +1 -1
  58. data/lib/r2-oas/schema/v3/builder.rb +28 -0
  59. data/lib/r2-oas/schema/v3/builder/base_builder.rb +60 -0
  60. data/lib/r2-oas/schema/v3/builder/doc_builder.rb +43 -0
  61. data/lib/r2-oas/schema/v3/cleaner/base_cleaner.rb +1 -1
  62. data/lib/r2-oas/schema/v3/generator.rb +1 -5
  63. data/lib/r2-oas/schema/v3/generator/base_generator.rb +30 -1
  64. data/lib/r2-oas/schema/v3/generator/components/object_generator.rb +6 -25
  65. data/lib/r2-oas/schema/v3/generator/components/request_body_generator.rb +6 -6
  66. data/lib/r2-oas/schema/v3/generator/doc_generator.rb +84 -18
  67. data/lib/r2-oas/schema/v3/generator/path_generator.rb +7 -19
  68. data/lib/r2-oas/schema/v3/generator/schema_generator.rb +6 -26
  69. data/lib/r2-oas/schema/v3/manager/file/base_file_manager.rb +10 -4
  70. data/lib/r2-oas/schema/v3/manager/pathname_manager.rb +6 -1
  71. data/lib/r2-oas/schema/v3/object/path_item_object.rb +17 -9
  72. data/lib/r2-oas/store.rb +118 -0
  73. data/lib/r2-oas/task_logging.rb +6 -0
  74. data/lib/r2-oas/tasks/main.rake +66 -73
  75. data/lib/r2-oas/tasks/tool.rake +25 -28
  76. data/lib/r2-oas/tool/paths/ls.rb +1 -1
  77. data/lib/r2-oas/version.rb +1 -1
  78. data/r2-oas.gemspec +20 -25
  79. metadata +122 -52
  80. data/Gemfile.lock +0 -207
  81. data/docs/HOW_TO_CLEAN_DOCS.md +0 -19
  82. data/docs/HOW_TO_DISPLAY_PATHS_LIST.md +0 -28
  83. data/docs/HOW_TO_GENERATE_DOCS.md +0 -256
@@ -5,7 +5,6 @@ require 'eventmachine'
5
5
  require 'watir'
6
6
  require 'tempfile'
7
7
  require 'fileutils'
8
- require 'shell'
9
8
  require 'forwardable'
10
9
 
11
10
  # Can't use ActiveSupport::Autroload
@@ -20,6 +19,7 @@ module R2OAS
20
19
  extend Forwardable
21
20
 
22
21
  TMP_FILE_NAME = 'edited_schema'
22
+ ALERT_TEXT = 'Would you like to convert your JSON into YAML?'
23
23
 
24
24
  attr_accessor :edited_schema
25
25
 
@@ -27,6 +27,7 @@ module R2OAS
27
27
  super(options)
28
28
  @editor = swagger.editor
29
29
  @before_schema_data = before_schema_data
30
+ @schema_doc_from_local = YAML.load_file(doc_save_file_path).to_yaml
30
31
  end
31
32
 
32
33
  def start
@@ -71,15 +72,34 @@ module R2OAS
71
72
  analyzer.analyze_docs
72
73
  end
73
74
 
75
+ # MEMO
76
+ # TargetRubyVersion is 2.7 and there is a warning
77
+ # Because it is necessary to support from ruby2.3 series where begin cannot be omitted
78
+ # rubocop:disable Style/RedundantBegin
74
79
  def ensure_save_tmp_schema_file
75
80
  EM.add_periodic_timer(interval_to_save_edited_tmp_schema) do
76
- if @browser.exists?
77
- @after_schema_data = @browser.driver.local_storage[storage_key] || @after_schema_data
78
- save_edited_schema
79
- puts "\nwait for signal trap ..."
81
+ m = Mutex.new
82
+ return nil unless @browser.exists?
83
+
84
+ m.synchronize do
85
+ begin
86
+ save_after_fetch_local_strage
87
+ rescue Selenium::WebDriver::Error::UnexpectedAlertOpenError
88
+ alert = @browser.driver.switch_to.alert
89
+ if alert.text.eql?(ALERT_TEXT)
90
+ alert.accept && save_after_fetch_local_strage
91
+ end
92
+ end
80
93
  end
81
94
  end
82
95
  end
96
+ # rubocop:enable Style/RedundantBegin
97
+
98
+ def save_after_fetch_local_strage
99
+ @after_schema_data = @browser.driver.local_storage[storage_key] || @after_schema_data
100
+ save_edited_schema
101
+ puts "\nwait for signal trap ..."
102
+ end
83
103
 
84
104
  def fetch_edited_schema_from_browser
85
105
  @after_schema_data = @browser.driver.local_storage[storage_key] if @browser.exists?
@@ -94,8 +114,7 @@ module R2OAS
94
114
  @browser ||= Watir::Browser.new(:chrome, capabilities)
95
115
  @browser.goto(url)
96
116
  if wait_for_loaded
97
- schema_doc_from_local = YAML.load_file(doc_save_file_path)
98
- @browser.driver.local_storage[storage_key] = schema_doc_from_local.to_yaml
117
+ @browser.driver.local_storage[storage_key] = @schema_doc_from_local
99
118
  @browser.refresh
100
119
  end
101
120
  end
@@ -8,7 +8,7 @@ module R2OAS
8
8
  class Generator
9
9
  extend Forwardable
10
10
 
11
- def_delegators :@generator, :generate_docs, :oas_doc
11
+ def_delegators :@generator, :generate_docs
12
12
 
13
13
  def initialize(options = {})
14
14
  case ::R2OAS.version
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'r2-oas/schema/v3/manager/file_manager'
4
+
5
+ module R2OAS
6
+ module Schema
7
+ class FileManager
8
+ extend Forwardable
9
+
10
+ def_delegators :@manager, :save, :delete
11
+
12
+ def initialize(path, path_type = :ref)
13
+ case ::R2OAS.version
14
+ when :v3
15
+ @manager = V3::FileManager.new(path, path_type)
16
+ else
17
+ raise "Do not support version: #{::R2OAS.version}"
18
+ end
19
+ end
20
+
21
+ class << self
22
+ alias build new
23
+ end
24
+ end
25
+ end
26
+ end
@@ -3,7 +3,6 @@
3
3
  require 'docker'
4
4
  require 'eventmachine'
5
5
  require 'watir'
6
- require 'shell'
7
6
  require 'forwardable'
8
7
 
9
8
  # Scope Rails
@@ -26,14 +26,13 @@ module R2OAS
26
26
 
27
27
  private
28
28
 
29
- attr_accessor :edited_schema_file_path
30
29
  attr_accessor :existing_schema_file_path
31
30
  attr_accessor :type
32
31
 
33
32
  def create_after_schema_data
34
33
  case @type
35
34
  when :edited
36
- create_after_schema_data_when_edited
35
+ {}
37
36
  when :existing
38
37
  if existing_schema_file_path.present?
39
38
  create_after_schema_data_when_specify_path
@@ -43,10 +42,6 @@ module R2OAS
43
42
  end
44
43
  end
45
44
 
46
- def create_after_schema_data_when_edited
47
- YAML.load_file(edited_schema_file_path)
48
- end
49
-
50
45
  def create_after_schema_data_when_not_specify_path
51
46
  if FileTest.exists?(doc_save_file_path)
52
47
  YAML.load_file(doc_save_file_path)
@@ -20,7 +20,7 @@ module R2OAS
20
20
  diff_manager = ComponentsDiffManager.new(@before_schema_data, @after_schema_data, middle_category: @middle_category)
21
21
  diff_manager.process_by_using_diff_data do |schema_name, is_removed, is_added, is_leftovers, after_edited_data|
22
22
  file_manager = ComponentsFileManager.build("#/#{@major_category}/#{@middle_category}/#{schema_name}", :ref)
23
- save_file_path = file_manager.save_file_path
23
+ save_file_path = file_manager.save_file_path(type: :relative)
24
24
 
25
25
  if is_removed && !is_added && !is_leftovers
26
26
  file_manager.delete
@@ -25,7 +25,7 @@ module R2OAS
25
25
  save_each_tags(edited_paths_schema) do |tag_name, result|
26
26
  file_manager = PathItemFileManager.new("paths/#{tag_name}", :relative)
27
27
  file_manager.save(result.to_yaml)
28
- logger.info " Write schema file: \t#{file_manager.save_file_path}"
28
+ logger.info " Write schema file: \t#{file_manager.save_file_path(type: :relative)}"
29
29
  end
30
30
 
31
31
  # Automatically generated when there is no tag object in the read schema file
@@ -17,7 +17,7 @@ module R2OAS
17
17
  end
18
18
 
19
19
  def analyze_docs
20
- save_file_path = @file_manager.save_file_path
20
+ save_file_path = @file_manager.save_file_path(type: :relative)
21
21
  case @type
22
22
  when :edited
23
23
  @diff_manager.process_by_using_diff_data do |after_edited_data|
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'fileutils'
4
+ require 'forwardable'
5
+ require 'r2-oas/routing/parser'
6
+ require_relative 'builder/doc_builder'
7
+ require_relative 'builder/base_builder'
8
+
9
+ module R2OAS
10
+ module Schema
11
+ module V3
12
+ class Builder < BaseBuilder
13
+ extend Forwardable
14
+
15
+ def_delegators :@doc_builder, :oas_doc
16
+
17
+ def initialize(options = {})
18
+ super
19
+ @doc_builder = DocBuilder.new(options)
20
+ end
21
+
22
+ def build_docs
23
+ @doc_builder.build_docs
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'r2-oas/schema/v3/base'
4
+ require 'r2-oas/routing/parser'
5
+ require 'r2-oas/schema/v3/object/openapi_object'
6
+ require 'r2-oas/schema/v3/manager/file/path_item_file_manager'
7
+
8
+ module R2OAS
9
+ module Schema
10
+ module V3
11
+ class BaseBuilder < Base
12
+ include Sortable
13
+
14
+ def initialize(options = {})
15
+ super
16
+ @glob_schema_paths = create_glob_schema_paths
17
+ end
18
+
19
+ private
20
+
21
+ attr_accessor :unit_paths_file_path
22
+ attr_accessor :skip_load_dot_paths
23
+
24
+ def schema_file_do_not_exists?
25
+ schema_files_paths.count == 0
26
+ end
27
+
28
+ def create_glob_schema_paths
29
+ exclude_paths_regexp_paths = ["#{schema_save_dir_path}/**.yml"]
30
+ components_security_schemes_regexp_paths = ["#{schema_save_dir_path}/components/securitySchemes/**/**.yml"]
31
+
32
+ # components/securitySchemes is not referenced in $ ref.
33
+ exclude_paths_regexp_paths + many_paths_file_paths + many_components_file_paths + components_security_schemes_regexp_paths
34
+ end
35
+
36
+ def schema_files_paths
37
+ Dir.glob(@glob_schema_paths)
38
+ end
39
+
40
+ def many_paths_file_paths
41
+ if unit_paths_file_path.present? && !skip_load_dot_paths
42
+ [unit_paths_file_path]
43
+ elsif !unit_paths_file_path.present? && !skip_load_dot_paths && paths_config.all_load_paths?
44
+ paths_config.many_paths_file_paths
45
+ else
46
+ Dir.glob("#{schema_save_dir_path}/paths/**/**.yml")
47
+ end
48
+ end
49
+
50
+ def many_components_file_paths
51
+ @many_components_file_paths ||= many_paths_file_paths.each_with_object([]) do |unit_paths_path, result|
52
+ file_manager = PathItemFileManager.new(unit_paths_path, :full)
53
+ components_file_paths_at_path = file_manager.descendants_ref_paths
54
+ result.push(*components_file_paths_at_path)
55
+ end.uniq
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'yaml'
4
+ require 'fileutils'
5
+ require_relative 'base_builder'
6
+
7
+ module R2OAS
8
+ module Schema
9
+ module V3
10
+ class DocBuilder < BaseBuilder
11
+ attr_accessor :oas_doc
12
+
13
+ def build_docs
14
+ logger.info '[Build OAS schema files] start'
15
+ logger.info '[Build OAS docs from schema files] start'
16
+ build_docs_from_schema_files
17
+ logger.info '[Build OAS docs from schema files] end'
18
+ logger.info '[Build OAS schema files] end'
19
+ end
20
+
21
+ private
22
+
23
+ def build_docs_from_schema_files
24
+ result_before_squeeze = schema_files_paths.each_with_object({}) do |path, data|
25
+ file_manager = FileManager.new(path)
26
+ yaml = YAML.load_file(path)
27
+ data.deep_merge!(yaml)
28
+ logger.info " Use schema file: \t#{file_manager.save_file_path(type: :relative)}"
29
+ end
30
+
31
+ result = if many_paths_file_paths.present?
32
+ Squeezer.new(result_before_squeeze, many_paths_file_paths: many_paths_file_paths).squeeze_docs
33
+ else
34
+ result_before_squeeze
35
+ end
36
+
37
+ @oas_doc = result
38
+ File.write(doc_save_file_path, result.to_yaml)
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -11,7 +11,7 @@ module R2OAS
11
11
  clean_target_files.each do |file_path|
12
12
  file_manager = FileManager.new(file_path, :full)
13
13
  file_manager.delete
14
- yield file_manager.save_file_path if block_given?
14
+ yield file_manager.save_file_path(type: :relative) if block_given?
15
15
  end
16
16
  end
17
17
 
@@ -12,16 +12,12 @@ module R2OAS
12
12
  class Generator < BaseGenerator
13
13
  extend Forwardable
14
14
 
15
- def_delegators :@doc_generator, :oas_doc
15
+ def_delegators :@doc_generator, :generate_docs
16
16
 
17
17
  def initialize(options = {})
18
18
  super
19
19
  @doc_generator = DocGenerator.new(options)
20
20
  end
21
-
22
- def generate_docs
23
- @doc_generator.generate_docs
24
- end
25
21
  end
26
22
  end
27
23
  end
@@ -4,6 +4,7 @@ require 'r2-oas/schema/v3/base'
4
4
  require 'r2-oas/routing/parser'
5
5
  require 'r2-oas/schema/v3/object/openapi_object'
6
6
  require 'r2-oas/schema/v3/manager/file/path_item_file_manager'
7
+ require 'r2-oas/store'
7
8
 
8
9
  module R2OAS
9
10
  module Schema
@@ -13,14 +14,16 @@ module R2OAS
13
14
 
14
15
  def initialize(options = {})
15
16
  super
17
+ @store = Store.create
16
18
  @glob_schema_paths = create_glob_schema_paths
17
19
  end
18
20
 
19
21
  private
20
22
 
21
23
  attr_accessor :unit_paths_file_path
22
- attr_accessor :skip_generate_docs
23
24
  attr_accessor :skip_load_dot_paths
25
+ attr_accessor :is_create_cache
26
+ attr_accessor :store
24
27
 
25
28
  # Scope Rails
26
29
  def create_docs
@@ -82,6 +85,32 @@ module R2OAS
82
85
  def exists_paths_files?
83
86
  Dir.glob("#{schema_save_dir_path}/paths/**/**.yml").present?
84
87
  end
88
+
89
+ def cache_docs
90
+ if exists_cache?
91
+ result = IO.binread(abs_cache_docs_path)
92
+ inflate = Zlib::Inflate.inflate(result)
93
+ @cache_docs ||= Marshal.load(inflate)
94
+ else
95
+ @cache_docs ||= {}
96
+ end
97
+ end
98
+
99
+ def exists_cache?
100
+ FileTest.exists?(abs_cache_docs_path)
101
+ end
102
+
103
+ def abs_cache_docs_path
104
+ File.expand_path(relative_cahe_docs_path)
105
+ end
106
+
107
+ def relative_cahe_docs_path
108
+ "#{@root_dir_path}/.docs"
109
+ end
110
+
111
+ def unknown_paths_path
112
+ "#{@root_dir_path}/src/paths/unknown.yml"
113
+ end
85
114
  end
86
115
  end
87
116
  end
@@ -20,37 +20,17 @@ module R2OAS
20
20
  end
21
21
 
22
22
  def generate_docs
23
- if components_objects_file_do_not_exists?
24
- logger.info ' <From routes data>'
25
- generate_docs_from_routes_data
26
- else
27
- logger.info ' <From schema files>'
28
- generate_docs_from_schema_fiels
29
- end
23
+ logger.info ' <From routes data>'
24
+ generate_docs_from_routes_data
30
25
  end
31
26
 
32
27
  private
33
28
 
34
29
  alias components_objects_files_paths schema_files_paths
35
- alias components_objects_file_do_not_exists? schema_file_do_not_exists?
36
-
37
- def generate_docs_from_schema_fiels
38
- components_schemas_from_schema_files = components_objects_files_paths.each_with_object({}) do |path, data|
39
- yaml = YAML.load_file(path)
40
- data.deep_merge!(yaml)
41
- full_path = File.expand_path(path, './')
42
- logger.info " Fetch Components schema file: \t#{full_path}"
43
- end
44
- @components_objects.deep_merge!(components_schemas_from_schema_files[@major_category][@middle_category])
45
-
46
- process_when_generate_docs do |save_file_path|
47
- logger.info " Merge schema file: \t#{save_file_path}"
48
- end
49
- end
50
30
 
51
31
  def generate_docs_from_routes_data
52
32
  process_when_generate_docs do |save_file_path|
53
- logger.info " Write schema file: \t#{save_file_path}"
33
+ logger.info " Add schema file into store: \t#{save_file_path}"
54
34
  end
55
35
  end
56
36
 
@@ -65,9 +45,10 @@ module R2OAS
65
45
 
66
46
  relative_path = "#{@major_category}/#{@middle_category}/#{schema_name}"
67
47
  file_manager = ComponentsFileManager.build(relative_path, :relative)
68
- file_manager.save(result.to_yaml) unless file_manager.skip_save?
48
+ save_file_path = file_manager.save_file_path(type: :relative)
49
+ store.add(save_file_path, result.to_yaml)
69
50
 
70
- yield file_manager.save_file_path if block_given?
51
+ yield save_file_path if block_given?
71
52
  end
72
53
  end
73
54