Class: Metanorma::Release::DocumentIndex

Inherits:
Object
  • Object
show all
Defined in:
lib/metanorma/release/document_index.rb

Constant Summary collapse

SCHEMA_VERSION =
1
SchemaError =
Class.new(StandardError)

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

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

#documentsObject (readonly)

Returns the value of attribute documents.



118
119
120
# File 'lib/metanorma/release/document_index.rb', line 118

def documents
  @documents
end

#parametersObject (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

Raises:



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

#channelsObject



128
129
130
# File 'lib/metanorma/release/document_index.rb', line 128

def channels
  @documents.flat_map(&:channels).uniq.sort
end

#document_countObject



132
133
134
# File 'lib/metanorma/release/document_index.rb', line 132

def document_count
  @documents.length
end

#empty?Boolean

Returns:

  • (Boolean)


136
137
138
# File 'lib/metanorma/release/document_index.rb', line 136

def empty?
  @documents.empty?
end

#summaryObject



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_hObject



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