doc.rb 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. module Docs
  2. class Doc
  3. INDEX_FILENAME = 'index.json'
  4. DB_FILENAME = 'db.json'
  5. class << self
  6. include Instrumentable
  7. attr_accessor :name, :slug, :type, :release, :abstract, :links
  8. def inherited(subclass)
  9. subclass.type = type
  10. end
  11. def name
  12. @name || super.try(:demodulize)
  13. end
  14. def slug
  15. @slug || name.try(:downcase)
  16. end
  17. def path
  18. slug
  19. end
  20. def index_path
  21. File.join path, INDEX_FILENAME
  22. end
  23. def db_path
  24. File.join path, DB_FILENAME
  25. end
  26. def as_json
  27. { name: name,
  28. slug: slug,
  29. type: type,
  30. release: release,
  31. index_path: index_path,
  32. db_path: db_path,
  33. links: links }
  34. end
  35. def store_page(store, id)
  36. store.open(path) do
  37. if page = new.build_page(id) and store_page?(page)
  38. store.write page[:store_path], page[:output]
  39. true
  40. else
  41. false
  42. end
  43. end
  44. end
  45. def store_pages(store)
  46. index = EntryIndex.new
  47. pages = PageDb.new
  48. store.replace(path) do
  49. new.build_pages do |page|
  50. next unless store_page?(page)
  51. store.write page[:store_path], page[:output]
  52. index.add page[:entries]
  53. pages.add page[:path], page[:output]
  54. end
  55. if index.present?
  56. store_index(store, INDEX_FILENAME, index)
  57. store_index(store, DB_FILENAME, pages)
  58. true
  59. else
  60. false
  61. end
  62. end
  63. end
  64. private
  65. def store_page?(page)
  66. page[:entries].present?
  67. end
  68. def store_index(store, filename, index)
  69. old_json = store.read(filename) || '{}'
  70. new_json = index.to_json
  71. instrument "#{filename.remove('.json')}.doc", before: old_json, after: new_json
  72. store.write(filename, new_json)
  73. end
  74. end
  75. def initialize
  76. raise NotImplementedError, "#{self.class} is an abstract class and cannot be instantiated." if self.class.abstract
  77. end
  78. def build_page(id, &block)
  79. raise NotImplementedError
  80. end
  81. def build_pages(&block)
  82. raise NotImplementedError
  83. end
  84. end
  85. end