docs.rb 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. require 'bundler/setup'
  2. Bundler.require :docs
  3. require 'active_support'
  4. require 'active_support/core_ext'
  5. I18n.enforce_available_locales = true
  6. module Docs
  7. require 'docs/core/autoload_helper'
  8. extend AutoloadHelper
  9. mattr_reader :root_path
  10. @@root_path = File.expand_path '..', __FILE__
  11. autoload :URL, 'docs/core/url'
  12. autoload_all 'docs/core'
  13. autoload_all 'docs/filters/core', 'filter'
  14. autoload_all 'docs/scrapers'
  15. autoload_all 'docs/storage'
  16. autoload_all 'docs/subscribers'
  17. mattr_accessor :store_class
  18. self.store_class = FileStore
  19. mattr_accessor :store_path
  20. self.store_path = File.expand_path '../public/docs', @@root_path
  21. mattr_accessor :rescue_errors
  22. self.rescue_errors = false
  23. class DocNotFound < NameError; end
  24. def self.all
  25. Dir["#{root_path}/docs/scrapers/**/*.rb"].
  26. map { |file| File.basename(file, '.rb') }.
  27. sort!.
  28. map { |name| const_get(name.camelize) }.
  29. reject(&:abstract)
  30. end
  31. def self.all_versions
  32. all.flat_map(&:versions)
  33. end
  34. def self.defaults
  35. %w(css dom dom_events html http javascript).map(&method(:find))
  36. end
  37. def self.installed
  38. Dir["#{store_path}/**/index.json"].
  39. map { |file| file[%r{/([^/]*)/index\.json\z}, 1] }.
  40. sort!.
  41. map { |path| all_versions.find { |doc| doc.path == path } }.
  42. compact
  43. end
  44. def self.find(name, version = nil)
  45. const = name.camelize
  46. doc = const_get(const)
  47. if version.present?
  48. doc = doc.versions.find { |klass| klass.version == version || klass.version_slug == version }
  49. raise DocNotFound.new(%(could not find version "#{version}" for doc "#{name}"), name) unless doc
  50. elsif version != false
  51. doc = doc.versions.first
  52. end
  53. doc
  54. rescue NameError => error
  55. if error.name.to_s == const
  56. raise DocNotFound.new(%(could not find doc "#{name}"), name)
  57. else
  58. raise error
  59. end
  60. end
  61. def self.generate_page(name, version, page_id)
  62. find(name, version).store_page(store, page_id)
  63. end
  64. def self.generate(doc, version = nil)
  65. doc = find(doc, version) unless doc.respond_to?(:store_pages)
  66. doc.store_pages(store)
  67. end
  68. def self.generate_manifest
  69. Manifest.new(store, all_versions).store
  70. end
  71. def self.store
  72. store_class.new(store_path)
  73. end
  74. extend Instrumentable
  75. def self.install_report(*names)
  76. names.each do |name|
  77. const_get("#{name}_subscriber".camelize).subscribe_to(self)
  78. end
  79. end
  80. end