Class: Metanorma::Release::DocumentIndex
- Inherits:
-
Object
- Object
- Metanorma::Release::DocumentIndex
- Defined in:
- lib/metanorma/release/document_index.rb
Constant Summary collapse
- SCHEMA_VERSION =
1- SchemaError =
Class.new(StandardError)
Instance Attribute Summary collapse
-
#documents ⇒ Object
readonly
Returns the value of attribute documents.
-
#parameters ⇒ Object
readonly
Returns the value of attribute parameters.
Class Method Summary collapse
- .from_documents(documents, parameters:) ⇒ Object
- .from_json(json_string) ⇒ Object
- .validate!(data) ⇒ Object
Instance Method Summary collapse
- #channels ⇒ Object
- #document_count ⇒ Object
- #empty? ⇒ Boolean
-
#initialize(documents:, parameters:, generated_at: nil) ⇒ DocumentIndex
constructor
A new instance of DocumentIndex.
- #summary ⇒ Object
- #to_h ⇒ Object
- #to_json(*_args) ⇒ Object
- #write(path) ⇒ Object
Constructor Details
#initialize(documents:, parameters:, generated_at: nil) ⇒ DocumentIndex
Returns a new instance of DocumentIndex.
111 112 113 114 115 116 |
# File 'lib/metanorma/release/document_index.rb', line 111 def initialize(documents:, parameters:, generated_at: nil) @documents = documents.freeze @parameters = parameters @generated_at = generated_at || Time.now.utc.iso8601 freeze end |
Instance Attribute Details
#documents ⇒ Object (readonly)
Returns the value of attribute documents.
118 119 120 |
# File 'lib/metanorma/release/document_index.rb', line 118 def documents @documents end |
#parameters ⇒ Object (readonly)
Returns the value of attribute parameters.
118 119 120 |
# File 'lib/metanorma/release/document_index.rb', line 118 def parameters @parameters end |
Class Method Details
.from_documents(documents, parameters:) ⇒ Object
107 108 109 |
# File 'lib/metanorma/release/document_index.rb', line 107 def self.from_documents(documents, parameters:) new(documents: documents, parameters: parameters) end |
.from_json(json_string) ⇒ Object
92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
# File 'lib/metanorma/release/document_index.rb', line 92 def self.from_json(json_string) data = JSON.parse(json_string) validate!(data) new( documents: (data['documents'] || []).map { |d| AggregatedDocument.from_h(d) }, parameters: IndexParameters.new( organizations: data.dig('parameters', 'organizations') || [], channels: data.dig('parameters', 'channels') || [], topic: data.dig('parameters', 'topic'), repo_count: data.dig('parameters', 'repoCount') || 0 ), generated_at: data['generatedAt'] ) end |
.validate!(data) ⇒ Object
168 169 170 171 172 173 174 175 176 177 178 179 180 |
# File 'lib/metanorma/release/document_index.rb', line 168 def self.validate!(data) raise SchemaError, "Missing 'version' field" unless data.key?('version') unless data['version'] == SCHEMA_VERSION raise SchemaError, "Unsupported schema version: #{data['version']}. Expected #{SCHEMA_VERSION}" end raise SchemaError, "Missing 'documents' field" unless data.key?('documents') data['documents'].each do |doc| raise SchemaError, "Document missing required field 'id'" unless doc.key?('id') raise SchemaError, "Document missing required field 'title'" unless doc.key?('title') end end |
Instance Method Details
#channels ⇒ Object
128 129 130 |
# File 'lib/metanorma/release/document_index.rb', line 128 def channels @documents.flat_map(&:channels).uniq.sort end |
#document_count ⇒ Object
132 133 134 |
# File 'lib/metanorma/release/document_index.rb', line 132 def document_count @documents.length end |
#empty? ⇒ Boolean
136 137 138 |
# File 'lib/metanorma/release/document_index.rb', line 136 def empty? @documents.empty? end |
#summary ⇒ Object
120 121 122 123 124 125 126 |
# File 'lib/metanorma/release/document_index.rb', line 120 def summary IndexSummary.new( repo_count: @parameters.repo_count, document_count: @documents.length, channels_found: channels ) end |
#to_h ⇒ Object
140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 |
# File 'lib/metanorma/release/document_index.rb', line 140 def to_h { 'version' => SCHEMA_VERSION, 'generatedAt' => @generated_at, 'parameters' => { 'organizations' => @parameters.organizations, 'channels' => @parameters.channels, 'topic' => @parameters.topic, 'repoCount' => @parameters.repo_count }, 'summary' => { 'repoCount' => summary.repo_count, 'documentCount' => summary.document_count, 'channelsFound' => summary.channels_found }, 'documents' => @documents.map(&:to_h) } end |
#to_json(*_args) ⇒ Object
159 160 161 |
# File 'lib/metanorma/release/document_index.rb', line 159 def to_json(*_args) JSON.generate(to_h) end |
#write(path) ⇒ Object
163 164 165 166 |
# File 'lib/metanorma/release/document_index.rb', line 163 def write(path) FileUtils.mkdir_p(File.dirname(path)) File.write(path, to_json) end |