apipie-dsl 2.0.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 (66) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +21 -0
  3. data/README.md +485 -0
  4. data/app/controllers/apipie_dsl/apipie_dsls_controller.rb +190 -0
  5. data/app/helpers/apipie_dsl_helper.rb +110 -0
  6. data/app/public/apipie_dsl/javascripts/apipie_dsl.js +6 -0
  7. data/app/public/apipie_dsl/javascripts/bundled/bootstrap-collapse.js +138 -0
  8. data/app/public/apipie_dsl/javascripts/bundled/bootstrap.js +1726 -0
  9. data/app/public/apipie_dsl/javascripts/bundled/jquery.js +5 -0
  10. data/app/public/apipie_dsl/javascripts/bundled/prettify.js +28 -0
  11. data/app/public/apipie_dsl/stylesheets/application.css +7 -0
  12. data/app/public/apipie_dsl/stylesheets/bundled/bootstrap-responsive.min.css +12 -0
  13. data/app/public/apipie_dsl/stylesheets/bundled/bootstrap.min.css +689 -0
  14. data/app/public/apipie_dsl/stylesheets/bundled/prettify.css +30 -0
  15. data/app/views/apipie_dsl/apipie_dsls/_index_class_meth.erb +11 -0
  16. data/app/views/apipie_dsl/apipie_dsls/_index_class_prop.erb +13 -0
  17. data/app/views/apipie_dsl/apipie_dsls/_languages.erb +6 -0
  18. data/app/views/apipie_dsl/apipie_dsls/_metadata.erb +1 -0
  19. data/app/views/apipie_dsl/apipie_dsls/_method.erb +34 -0
  20. data/app/views/apipie_dsl/apipie_dsls/_method_detail.erb +58 -0
  21. data/app/views/apipie_dsl/apipie_dsls/_params.html.erb +47 -0
  22. data/app/views/apipie_dsl/apipie_dsls/_params_plain.html.erb +19 -0
  23. data/app/views/apipie_dsl/apipie_dsls/_property.erb +24 -0
  24. data/app/views/apipie_dsl/apipie_dsls/_property_detail.erb +35 -0
  25. data/app/views/apipie_dsl/apipie_dsls/_raises.html.erb +23 -0
  26. data/app/views/apipie_dsl/apipie_dsls/_returns.html.erb +53 -0
  27. data/app/views/apipie_dsl/apipie_dsls/apipie_dsl_404.html.erb +17 -0
  28. data/app/views/apipie_dsl/apipie_dsls/class.html.erb +75 -0
  29. data/app/views/apipie_dsl/apipie_dsls/custom_help.html.erb +10 -0
  30. data/app/views/apipie_dsl/apipie_dsls/getting_started.html.erb +4 -0
  31. data/app/views/apipie_dsl/apipie_dsls/index.html.erb +72 -0
  32. data/app/views/apipie_dsl/apipie_dsls/method.html.erb +52 -0
  33. data/app/views/apipie_dsl/apipie_dsls/plain.html.erb +116 -0
  34. data/app/views/apipie_dsl/apipie_dsls/static.html.erb +158 -0
  35. data/app/views/layouts/apipie_dsl/apipie_dsl.html.erb +26 -0
  36. data/lib/apipie-dsl.rb +3 -0
  37. data/lib/apipie_dsl.rb +28 -0
  38. data/lib/apipie_dsl/Rakefile +6 -0
  39. data/lib/apipie_dsl/apipie_dsl_module.rb +51 -0
  40. data/lib/apipie_dsl/application.rb +321 -0
  41. data/lib/apipie_dsl/class_description.rb +107 -0
  42. data/lib/apipie_dsl/configuration.rb +87 -0
  43. data/lib/apipie_dsl/dsl.rb +596 -0
  44. data/lib/apipie_dsl/errors.rb +68 -0
  45. data/lib/apipie_dsl/exception_description.rb +39 -0
  46. data/lib/apipie_dsl/markup.rb +41 -0
  47. data/lib/apipie_dsl/method_description.rb +112 -0
  48. data/lib/apipie_dsl/parameter_description.rb +152 -0
  49. data/lib/apipie_dsl/railtie.rb +15 -0
  50. data/lib/apipie_dsl/return_description.rb +71 -0
  51. data/lib/apipie_dsl/routing.rb +17 -0
  52. data/lib/apipie_dsl/see_description.rb +35 -0
  53. data/lib/apipie_dsl/static_dispatcher.rb +70 -0
  54. data/lib/apipie_dsl/tag_list_description.rb +11 -0
  55. data/lib/apipie_dsl/tasks/apipie_dsl/cache.rake +43 -0
  56. data/lib/apipie_dsl/tasks/apipie_dsl/static.rake +43 -0
  57. data/lib/apipie_dsl/tasks/apipie_dsl/static_json.rake +29 -0
  58. data/lib/apipie_dsl/tasks_utils.rb +137 -0
  59. data/lib/apipie_dsl/utils.rb +83 -0
  60. data/lib/apipie_dsl/validator.rb +479 -0
  61. data/lib/apipie_dsl/version.rb +5 -0
  62. data/lib/generators/apipie_dsl/install/install_generator.rb +21 -0
  63. data/lib/generators/apipie_dsl/install/templates/initializer.rb.erb +9 -0
  64. data/lib/generators/apipie_dsl/views_generator.rb +14 -0
  65. data/test/test_helper.rb +6 -0
  66. metadata +220 -0
@@ -0,0 +1,17 @@
1
+ module ApipieDSL
2
+ module Routing
3
+ module MapperExtensions
4
+ def apipie_dsl(options = {})
5
+ namespace 'apipie_dsl', path: ApipieDSL.configuration.doc_base_url do
6
+ get 'apipie_dsl_checksum', to: 'apipie_dsls#apipie_dsl_checksum', format: 'json'
7
+ constraints(version: /[^\/]+/, section: /[^\/]+/, class: /[^\/]+/,
8
+ method: /[^\/]+/) do
9
+ get(options.reverse_merge("(:version)/(:section)/(:class)/(:method)" => 'apipie_dsls#index', as: :apipie_dsl))
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
16
+
17
+ ActionDispatch::Routing::Mapper.send :include, ApipieDSL::Routing::MapperExtensions
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ApipieDSL
4
+ class SeeDescription
5
+ attr_reader :link, :description
6
+
7
+ def initialize(method, options = {})
8
+ @method = method
9
+ @link = options[:link]
10
+ @description = options[:desc] || options[:description]
11
+ @scope = options[:scope]
12
+ end
13
+
14
+ def docs
15
+ { link: link, url: see_url, description: description }
16
+ end
17
+
18
+ private
19
+
20
+ def see_url
21
+ method_description = if @scope
22
+ if @scope.is_a?(ApipieDSL::ClassDescription)
23
+ @scope.method_description(@method)
24
+ else
25
+ ApipieDSL.get_method_description(@scope.to_s, @method)
26
+ end
27
+ else
28
+ ApipieDSL.get_method_description(@method)
29
+ end
30
+ raise ArgumentError, "Method #{@method} referenced in 'see' does not exist." if method_description.nil?
31
+
32
+ method_description.doc_url(method_description.klass.sections.first)
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,70 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ApipieDSL
4
+ class FileHandler
5
+ def initialize(root)
6
+ @root = root.chomp('/')
7
+ @compiled_root = /^#{Regexp.escape(root)}/
8
+ @file_server = ::Rack::File.new(@root)
9
+ end
10
+
11
+ def match?(path)
12
+ # Replace all null bytes
13
+ path = ::Rack::Utils.unescape(path || '').gsub(/\x0/, '')
14
+
15
+ full_path = path.empty? ? @root : File.join(@root, path)
16
+ paths = "#{full_path}#{ext}"
17
+
18
+ matches = Dir[paths]
19
+ match = matches.detect { |m| File.file?(m) }
20
+ if match
21
+ match.sub!(@compiled_root, '')
22
+ match
23
+ end
24
+ end
25
+
26
+ def call(env)
27
+ @file_server.call(env)
28
+ end
29
+
30
+ def ext
31
+ @ext ||= begin
32
+ ext = cache_extension
33
+ "{,#{ext},/index#{ext}}"
34
+ end
35
+ end
36
+
37
+ def cache_extension
38
+ if ::ActionController::Base.respond_to?(:default_static_extension)
39
+ ::ActionController::Base.default_static_extension
40
+ else
41
+ ::ActionController::Base.page_cache_extension
42
+ end
43
+
44
+ end
45
+ end
46
+
47
+ class StaticDispatcher
48
+ # Dispatches the static files. Similar to ActionDispatch::Static, but
49
+ # it supports different baseurl configurations
50
+ def initialize(app, path)
51
+ @app = app
52
+ @file_handler = ApipieDSL::FileHandler.new(path)
53
+ end
54
+
55
+ def call(env)
56
+ @baseurl ||= ApipieDSL.configuration.doc_base_url
57
+ case env['REQUEST_METHOD']
58
+ when 'GET', 'HEAD'
59
+ path = env['PATH_INFO'].sub("#{@baseurl}/","/apipie_dsl/").chomp('/')
60
+
61
+ if match = @file_handler.match?(path)
62
+ env["PATH_INFO"] = match
63
+ return @file_handler.call(env)
64
+ end
65
+ end
66
+
67
+ @app.call(env)
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ApipieDSL
4
+ class TagListDescription
5
+ attr_reader :tags
6
+
7
+ def initialize(tags)
8
+ @tags = tags
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../tasks_utils'
4
+
5
+ namespace :apipie_dsl do
6
+ desc 'Generate cache to avoid production dependencies on markup languages'
7
+ task :cache, [:include_json] => :environment do |_task, args|
8
+ args.with_defaults(include_json: false)
9
+ include_json = %w[1 true].include?(args[:include_json])
10
+ time_start = Time.now
11
+ puts "#{time_start} | Started"
12
+ ApipieDSL::TasksUtils.with_loaded_documentation do
13
+ puts "#{Time.now} | Documents loaded..."
14
+ ([nil] + ApipieDSL.configuration.languages).each do |lang|
15
+ I18n.locale = lang || ApipieDSL.configuration.default_locale
16
+ puts "#{Time.now} | Processing docs for #{lang}"
17
+ cache_dir = ENV['OUT'] || ApipieDSL.configuration.cache_dir
18
+ file_base = File.join(cache_dir, ApipieDSL.configuration.doc_base_url)
19
+ subdir = File.basename(file_base)
20
+ ApipieDSL.available_versions.each do |version|
21
+ file_base_version = File.join(file_base, version)
22
+ ApipieDSL.configuration.sections.each do |section|
23
+ ApipieDSL.url_prefix = "../../#{subdir}"
24
+ doc = ApipieDSL.docs(version, nil, nil, lang, section)
25
+ doc[:docs][:link_extension] = "#{lang_ext(lang)}.html"
26
+ ApipieDSL::TasksUtils.generate_index_page(file_base_version, doc, include_json, true, lang, section)
27
+ ApipieDSL.url_prefix = "../../../#{subdir}"
28
+ section_out = "#{file_base_version}/#{section}"
29
+ ApipieDSL::TasksUtils.generate_class_pages(version, section_out, doc, include_json, lang, section)
30
+ ApipieDSL.url_prefix = "../../../../#{subdir}"
31
+ ApipieDSL::TasksUtils.generate_method_pages(version, section_out, doc, include_json, lang, section)
32
+ end
33
+ ApipieDSL.url_prefix = "../../#{subdir}"
34
+ doc = ApipieDSL.docs(version, nil, nil, lang)
35
+ doc[:docs][:link_extension] = "#{lang_ext(lang)}.html"
36
+ ApipieDSL::TasksUtils.generate_help_page(file_base_version, doc, true, lang)
37
+ end
38
+ end
39
+ end
40
+ time_end = Time.now
41
+ puts "#{time_end} | Finished in #{time_end - time_start}"
42
+ end
43
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../tasks_utils'
4
+
5
+ namespace :apipie_dsl do
6
+ desc 'Generate static documentation'
7
+ if defined?(Rails)
8
+ task :static, [:version, :include_json] => :environment do |_task, args|
9
+ ApipieDSL::TasksUtils.with_loaded_documentation do
10
+ args.with_defaults(
11
+ version: ApipieDSL.configuration.default_version,
12
+ include_json: false
13
+ )
14
+ include_json = %w[1 true].include?(args[:include_json])
15
+ out = ENV['OUT'] || File.join(::Rails.root, ApipieDSL.configuration.doc_path, 'dsldoc')
16
+ subdir = File.basename(out)
17
+ ApipieDSL::TasksUtils.copy_jscss(out)
18
+ ApipieDSL.configuration.version_in_url = false
19
+ ([nil] + ApipieDSL.configuration.languages).each do |lang|
20
+ I18n.locale = lang || ApipieDSL.configuration.default_locale
21
+ ApipieDSL.url_prefix = "../#{subdir}"
22
+ doc = ApipieDSL.docs(args[:version], nil, nil, lang)
23
+ doc[:docs][:link_extension] = "#{lang_ext(lang)}.html"
24
+ ApipieDSL::TasksUtils.generate_one_page(out, doc, lang)
25
+ ApipieDSL::TasksUtils.generate_plain_page(out, doc, lang)
26
+ ApipieDSL.configuration.sections.each do |section|
27
+ ApipieDSL.url_prefix = "../#{subdir}"
28
+ doc = ApipieDSL.docs(args[:version], nil, nil, lang, section)
29
+ doc[:docs][:link_extension] = "#{lang_ext(lang)}.html"
30
+ ApipieDSL::TasksUtils.generate_index_page(out, doc, include_json, false, lang, section)
31
+ ApipieDSL.url_prefix = "../../#{subdir}"
32
+ section_out = "#{out}/#{section}"
33
+ ApipieDSL::TasksUtils.generate_class_pages(args[:version], section_out, doc, include_json, lang, section)
34
+ ApipieDSL.url_prefix = "../../../#{subdir}"
35
+ ApipieDSL::TasksUtils.generate_method_pages(args[:version], section_out, doc, include_json, lang, section)
36
+ end
37
+ ApipieDSL.url_prefix = "../#{subdir}"
38
+ ApipieDSL::TasksUtils.generate_help_page(out, doc, false, lang)
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../tasks_utils'
4
+
5
+ namespace :apipie_dsl do
6
+ desc 'Generate static documentation json'
7
+ if defined?(Rails)
8
+ task static_json: :environment do |_task, args|
9
+ ApipieDSL::TasksUtils.with_loaded_documentation do
10
+ args.with_defaults(version: ApipieDSL.configuration.default_version)
11
+ out = ENV['OUT'] || File.join(::Rails.root, ApipieDSL.configuration.doc_path, 'dsldoc')
12
+ ([nil] + ApipieDSL.configuration.languages).each do |lang|
13
+ doc = ApipieDSL.docs(args[:version], nil, nil, lang)
14
+ ApipieDSL::TasksUtils.generate_json_page(out, doc, lang)
15
+ end
16
+ end
17
+ end
18
+ else
19
+ task :static_json do |_task, args|
20
+ ApipieDSL.reload_documentation
21
+ args.with_defaults(version: ApipieDSL.configuration.default_version)
22
+ out = ENV['OUT'] || File.join(Rake.original_dir, ApipieDSL.configuration.doc_path, 'dsldoc')
23
+ ([nil] + ApipieDSL.configuration.languages).each do |lang|
24
+ doc = ApipieDSL.docs(args[:version], nil, nil, lang)
25
+ ApipieDSL::TasksUtils.generate_json_page(out, doc, lang)
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,137 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json'
4
+ require_relative '../../app/helpers/apipie_dsl_helper'
5
+
6
+ module ApipieDSL
7
+ module TasksUtils
8
+ def self.generate_json_page(file_base, doc, lang = nil)
9
+ FileUtils.mkdir_p(file_base) unless File.exist?(file_base)
10
+
11
+ filename = "schema_apipie_dsl#{lang_ext(lang)}.json"
12
+ File.open("#{file_base}/#{filename}", 'w') { |file| file.write(JSON.pretty_generate(doc)) }
13
+ end
14
+
15
+ def self.renderer
16
+ return @renderer if @renderer
17
+
18
+ @renderer = if defined?(Rails)
19
+ rails_renderer
20
+ else
21
+ simple_renderer
22
+ end
23
+ end
24
+
25
+ def self.simple_renderer
26
+ raise NotImplementedError
27
+ end
28
+
29
+ def self.rails_renderer
30
+ base_paths = [File.expand_path('../../app/views/apipie_dsl/apipie_dsls', __dir__)]
31
+ base_paths.unshift("#{Rails.root}/app/views/apipie_dsl/apipie_dsls") if File.directory?("#{Rails.root}/app/views/apipie_dsl/apipie_dsls")
32
+
33
+ layouts_paths = [File.expand_path('../../app/views/layouts', __dir__)]
34
+ layouts_paths.unshift("#{Rails.root}/app/views/layouts") if File.directory?("#{Rails.root}/app/views/layouts/apipie_dsl")
35
+ paths = ActionView::PathSet.new(base_paths + layouts_paths)
36
+ r_renderer = ActionView::Base.new(ActionController::Base.append_view_path(paths), {})
37
+ r_renderer.singleton_class.send(:include, ::ApipieDslHelper)
38
+ r_renderer
39
+ end
40
+
41
+ def self.render_page(file_name, template, variables, layout = 'apipie_dsl')
42
+ File.open(file_name, 'w') do |f|
43
+ variables.each do |var, val|
44
+ renderer.instance_variable_set("@#{var}", val)
45
+ end
46
+ f.write(renderer.render(template: template.to_s,
47
+ layout: (layout && "apipie_dsl/#{layout}")))
48
+ end
49
+ end
50
+
51
+ def self.generate_one_page(file_base, doc, lang = nil)
52
+ FileUtils.mkdir_p(File.dirname(file_base)) unless File.exist?(File.dirname(file_base))
53
+
54
+ render_page("#{file_base}/#{File.basename(file_base)}-onepage#{lang_ext(lang)}.html", 'static',
55
+ doc: doc[:docs], language: lang,
56
+ languages: ApipieDSL.configuration.languages)
57
+ end
58
+
59
+ def self.generate_plain_page(file_base, doc, lang = nil)
60
+ FileUtils.mkdir_p(File.dirname(file_base)) unless File.exist?(File.dirname(file_base))
61
+
62
+ render_page("#{file_base}/#{File.basename(file_base)}-plain#{lang_ext(lang)}.html", 'plain',
63
+ { doc: doc[:docs], language: lang,
64
+ languages: ApipieDSL.configuration.languages }, nil)
65
+ end
66
+
67
+ def self.generate_index_page(file_base, doc, include_json = false, show_versions = false, lang = nil, section = nil)
68
+ versions = show_versions && ApipieDSL.available_versions
69
+ section_file = "#{file_base}/#{section}"
70
+ FileUtils.mkdir_p(File.dirname(section_file)) unless File.exist?(File.dirname(section_file))
71
+ render_page("#{section_file}#{lang_ext(lang)}.html",
72
+ 'index', doc: doc[:docs], versions: versions, language: lang,
73
+ languages: ApipieDSL.configuration.languages, section: section)
74
+ File.open("#{file_base}#{lang_ext(lang)}.json", 'w') { |f| f << doc.to_json } if include_json
75
+ end
76
+
77
+ def self.generate_class_pages(version, file_base, doc, include_json = false, lang = nil, section = nil)
78
+ doc[:docs][:classes].each do |class_name, class_desc|
79
+ next unless ApipieDslHelper.in_section?(section, class_name)
80
+
81
+ class_file_base = File.join(file_base, class_desc[:id])
82
+ FileUtils.mkdir_p(File.dirname(class_file_base)) unless File.exist?(File.dirname(class_file_base))
83
+
84
+ doc = ApipieDSL.docs(version, class_name, nil, lang)
85
+ doc[:docs][:link_extension] = (lang ? ".#{lang}.html" : '.html')
86
+ render_page("#{class_file_base}#{lang_ext(lang)}.html", 'class',
87
+ doc: doc[:docs], klass: doc[:docs][:classes].first,
88
+ language: lang, languages: ApipieDSL.configuration.languages)
89
+ File.open("#{class_file_base}#{lang_ext(lang)}.json", 'w') { |f| f << doc.to_json } if include_json
90
+ end
91
+ end
92
+
93
+ def self.generate_method_pages(version, file_base, doc, include_json = false, lang = nil, section = nil)
94
+ doc[:docs][:classes].each do |class_name, class_params|
95
+ next unless ApipieDslHelper.in_section?(section, class_name)
96
+
97
+ class_params[:methods].each do |method|
98
+ method_file_base = File.join(file_base, class_name.to_s, method[:name].to_s)
99
+ FileUtils.mkdir_p(File.dirname(method_file_base)) unless File.exist?(File.dirname(method_file_base))
100
+
101
+ doc = ApipieDSL.docs(version, class_name, method[:name], lang)
102
+ doc[:docs][:link_extension] = (lang ? ".#{lang}.html" : '.html')
103
+ render_page("#{method_file_base}#{lang_ext(lang)}.html", 'method',
104
+ doc: doc[:docs], klass: doc[:docs][:classes].first,
105
+ method: doc[:docs][:classes].first[:methods].first,
106
+ language: lang, languages: ApipieDSL.configuration.languages)
107
+
108
+ File.open("#{method_file_base}#{lang_ext(lang)}.json", 'w') { |f| f << doc.to_json } if include_json
109
+ end
110
+ end
111
+ end
112
+
113
+ def self.generate_help_page(file_base, doc, show_versions = false, lang = nil)
114
+ versions = show_versions && ApipieDSL.available_versions
115
+ section_file = "#{file_base}/help"
116
+ FileUtils.mkdir_p(File.dirname(section_file)) unless File.exist?(File.dirname(section_file))
117
+ render_page("#{section_file}#{lang_ext(lang)}.html", 'custom_help',
118
+ doc: doc[:docs], versions: versions, language: lang,
119
+ languages: ApipieDSL.configuration.languages, section: 'help')
120
+ end
121
+
122
+ def self.lang_ext(lang = nil)
123
+ lang ? ".#{lang}" : ''
124
+ end
125
+
126
+ def self.copy_jscss(dest)
127
+ src = File.expand_path('../../app/public/apipie_dsl', __dir__)
128
+ FileUtils.mkdir_p dest
129
+ FileUtils.cp_r "#{src}/.", dest
130
+ end
131
+
132
+ def self.with_loaded_documentation
133
+ ApipieDSL.reload_documentation
134
+ yield
135
+ end
136
+ end
137
+ end
@@ -0,0 +1,83 @@
1
+ # rubocop:disable Style/FrozenStringLiteralComment
2
+ module ApipieDSL
3
+ module Utils
4
+ attr_accessor :url_prefix
5
+
6
+ def superclass_for(klass_or_module)
7
+ return klass_or_module.superclass if klass_or_module.respond_to?(:superclass)
8
+
9
+ parent_name = to_s.split('::')[-2]
10
+ return nil if parent_name.nil?
11
+
12
+ Module.const_get(parent_name)
13
+ end
14
+
15
+ def markup_to_html(text)
16
+ return '' if text.nil?
17
+
18
+ if ApipieDSL.configuration.markup.respond_to?(:to_html)
19
+ ApipieDSL.configuration.markup.to_html(text)
20
+ else
21
+ text
22
+ end
23
+ end
24
+
25
+ def request_script_name
26
+ Thread.current[:apipie_dsl_req_script_name] || ''
27
+ end
28
+
29
+ def request_script_name=(script_name)
30
+ Thread.current[:apipie_dsl_req_script_name] = script_name
31
+ end
32
+
33
+ def full_url(path)
34
+ unless @url_prefix
35
+ @url_prefix = request_script_name.to_s
36
+ @url_prefix << ApipieDSL.configuration.doc_base_url
37
+ end
38
+ path = path.sub(%r{^/}, '')
39
+ ret = "#{@url_prefix}/#{path}"
40
+ ret.insert(0, '/') unless ret =~ %r{\A[./]}
41
+ ret.sub!(%r{/*\Z}, '')
42
+ ret
43
+ end
44
+
45
+ def include_javascripts
46
+ %w[bundled/jquery.js
47
+ bundled/bootstrap-collapse.js
48
+ bundled/prettify.js
49
+ apipie_dsl.js ].map do |file|
50
+ "<script type='text/javascript' src='#{ApipieDSL.full_url("javascripts/#{file}")}'></script>"
51
+ end.join("\n").html_safe
52
+ end
53
+
54
+ def include_stylesheets
55
+ %w[bundled/bootstrap.min.css
56
+ bundled/prettify.css
57
+ bundled/bootstrap-responsive.min.css ].map do |file|
58
+ "<link type='text/css' rel='stylesheet' href='#{ApipieDSL.full_url("stylesheets/#{file}")}'/>"
59
+ end.join("\n").html_safe
60
+ end
61
+ end
62
+ end
63
+ if RUBY_VERSION < '2.5.0'
64
+ class Hash
65
+ def transform_keys
66
+ result = {}
67
+ each do |key, value|
68
+ new_key = yield key
69
+ result[new_key] = value
70
+ end
71
+ result
72
+ end
73
+ end
74
+ end
75
+ if defined? Rails
76
+ class Module
77
+ # https://github.com/rails/rails/pull/35035
78
+ def as_json(options = nil)
79
+ name
80
+ end
81
+ end
82
+ end
83
+ # rubocop:enable Style/FrozenStringLiteralComment