metanorma-release 0.2.2 → 0.2.3
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.
- checksums.yaml +4 -4
- data/.rubocop.yml +19 -1
- data/.rubocop_todo.yml +250 -319
- data/README.adoc +120 -233
- data/Rakefile +2 -2
- data/exe/metanorma-release +2 -2
- data/lib/metanorma/release/aggregation_pipeline.rb +59 -45
- data/lib/metanorma/release/asset_processor.rb +10 -8
- data/lib/metanorma/release/cache_store.rb +6 -6
- data/lib/metanorma/release/change_detector.rb +7 -3
- data/lib/metanorma/release/channel.rb +13 -39
- data/lib/metanorma/release/channel_filter.rb +26 -10
- data/lib/metanorma/release/cli.rb +129 -100
- data/lib/metanorma/release/commands/aggregate.rb +39 -54
- data/lib/metanorma/release/commands/package.rb +20 -12
- data/lib/metanorma/release/commands/{publish.rb → release_command.rb} +20 -12
- data/lib/metanorma/release/config.rb +104 -0
- data/lib/metanorma/release/content_hash.rb +11 -3
- data/lib/metanorma/release/delta_state.rb +55 -18
- data/lib/metanorma/release/file_routing.rb +8 -5
- data/lib/metanorma/release/index.rb +132 -0
- data/lib/metanorma/release/interfaces.rb +15 -15
- data/lib/metanorma/release/platform/github/manifest_reader.rb +4 -4
- data/lib/metanorma/release/platform/github/publisher.rb +23 -11
- data/lib/metanorma/release/platform/github/release_fetcher.rb +12 -3
- data/lib/metanorma/release/platform/github.rb +10 -7
- data/lib/metanorma/release/platform/local/directory_discoverer.rb +1 -1
- data/lib/metanorma/release/platform/local/fetcher.rb +17 -12
- data/lib/metanorma/release/platform/local/publisher.rb +9 -7
- data/lib/metanorma/release/platform/local.rb +4 -4
- data/lib/metanorma/release/platform/null/publisher.rb +3 -2
- data/lib/metanorma/release/platform/null.rb +1 -1
- data/lib/metanorma/release/platform.rb +3 -3
- data/lib/metanorma/release/platform_factory.rb +48 -29
- data/lib/metanorma/release/publication.rb +335 -0
- data/lib/metanorma/release/release_pipeline.rb +85 -52
- data/lib/metanorma/release/repo_ref.rb +5 -2
- data/lib/metanorma/release/site.rb +66 -0
- data/lib/metanorma/release/slug_strategy.rb +163 -0
- data/lib/metanorma/release/version.rb +1 -1
- data/lib/metanorma/release/zip_packager.rb +31 -8
- data/lib/metanorma/release.rb +68 -94
- metadata +22 -26
- data/lib/metanorma/release/aggregation_interfaces.rb +0 -27
- data/lib/metanorma/release/channel_audience.rb +0 -24
- data/lib/metanorma/release/channel_config.rb +0 -55
- data/lib/metanorma/release/channel_manifest.rb +0 -192
- data/lib/metanorma/release/channel_registry.rb +0 -60
- data/lib/metanorma/release/config_fetcher.rb +0 -11
- data/lib/metanorma/release/config_locator.rb +0 -37
- data/lib/metanorma/release/config_resolver.rb +0 -37
- data/lib/metanorma/release/document_id.rb +0 -45
- data/lib/metanorma/release/document_index.rb +0 -183
- data/lib/metanorma/release/document_metadata.rb +0 -39
- data/lib/metanorma/release/document_stage.rb +0 -86
- data/lib/metanorma/release/document_type.rb +0 -55
- data/lib/metanorma/release/document_version.rb +0 -50
- data/lib/metanorma/release/naming_strategy.rb +0 -158
- data/lib/metanorma/release/platform/github/config_fetcher.rb +0 -40
- data/lib/metanorma/release/platform/local/config_fetcher.rb +0 -20
- data/lib/metanorma/release/rake_tasks.rb +0 -71
- data/lib/metanorma/release/relaton_enricher.rb +0 -138
- data/lib/metanorma/release/release_metadata.rb +0 -79
- data/lib/metanorma/release/release_tag.rb +0 -49
- data/lib/metanorma/release/rxl_extractor.rb +0 -115
- data/lib/metanorma/release/stage_filter.rb +0 -18
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Metanorma
|
|
4
|
-
module Release
|
|
5
|
-
class ReleaseTag
|
|
6
|
-
PRE_RELEASE_SUFFIXES = %w[-wd -cd -ds -fd -proposal].freeze
|
|
7
|
-
|
|
8
|
-
def self.from(doc_id, version)
|
|
9
|
-
tag = "#{doc_id}/#{version.tag_component}"
|
|
10
|
-
new(tag: tag, pre_release: version.pre_release?)
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
def self.create(tag, pre_release:)
|
|
14
|
-
raise ArgumentError, 'Tag must contain a slash separator' unless tag.include?('/')
|
|
15
|
-
|
|
16
|
-
new(tag: tag, pre_release: pre_release)
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
def self.parse(tag)
|
|
20
|
-
raise ArgumentError, 'Tag must contain a slash separator' unless tag.include?('/')
|
|
21
|
-
|
|
22
|
-
pre = PRE_RELEASE_SUFFIXES.any? { |s| tag.include?(s) }
|
|
23
|
-
new(tag: tag, pre_release: pre)
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
def initialize(tag:, pre_release:)
|
|
27
|
-
@tag = tag
|
|
28
|
-
@pre_release = pre_release
|
|
29
|
-
freeze
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
def to_s
|
|
33
|
-
@tag
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
def pre_release?
|
|
37
|
-
@pre_release
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
def eql?(other)
|
|
41
|
-
other.is_a?(self.class) && @tag == other.to_s
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
def hash
|
|
45
|
-
@tag.hash
|
|
46
|
-
end
|
|
47
|
-
end
|
|
48
|
-
end
|
|
49
|
-
end
|
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
begin
|
|
4
|
-
require 'nokogiri'
|
|
5
|
-
rescue LoadError
|
|
6
|
-
raise LoadError, "The nokogiri gem is required for RxlExtractor. Add `gem 'nokogiri'` to your Gemfile."
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
module Metanorma
|
|
10
|
-
module Release
|
|
11
|
-
class RxlExtractor
|
|
12
|
-
def initialize(fallback_flavor: nil)
|
|
13
|
-
@fallback_flavor = fallback_flavor
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
def discover(output_dir)
|
|
17
|
-
rxl_files = Dir.glob(File.join(output_dir, '**', '*.rxl'))
|
|
18
|
-
rxl_files.filter_map do |path|
|
|
19
|
-
extract(path)
|
|
20
|
-
rescue StandardError => e
|
|
21
|
-
warn "Warning: Skipping #{path}: #{e.message}"
|
|
22
|
-
nil
|
|
23
|
-
end
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
def extract(rxl_path)
|
|
27
|
-
raise ArgumentError, "RXL file not found: #{rxl_path}" unless File.exist?(rxl_path)
|
|
28
|
-
|
|
29
|
-
content = File.read(rxl_path)
|
|
30
|
-
doc = Nokogiri::XML(content, nil, 'UTF-8', Nokogiri::XML::ParseOptions::STRICT)
|
|
31
|
-
extract_from_xml(doc, rxl_path)
|
|
32
|
-
rescue Nokogiri::XML::SyntaxError => e
|
|
33
|
-
warn "Warning: Failed to parse RXL #{rxl_path}: #{e.message}"
|
|
34
|
-
fallback_metadata(rxl_path)
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
private
|
|
38
|
-
|
|
39
|
-
def extract_from_xml(xml, rxl_path)
|
|
40
|
-
bibdata = xml.at_xpath('/bibdata') || xml.root
|
|
41
|
-
raw_id = text_of(bibdata, 'docidentifier') || derive_id_from_path(rxl_path)
|
|
42
|
-
id = DocumentId.from_raw(raw_id)
|
|
43
|
-
title = text_of(bibdata, 'title') || ''
|
|
44
|
-
edition = text_of(bibdata, 'edition') || '1'
|
|
45
|
-
stage_node = bibdata.at_xpath('status/stage')
|
|
46
|
-
stage = if stage_node
|
|
47
|
-
DocumentStage.from_iso_stage(stage_node.text.to_i)
|
|
48
|
-
else
|
|
49
|
-
DocumentStage.published
|
|
50
|
-
end
|
|
51
|
-
version = DocumentVersion.from(edition, stage)
|
|
52
|
-
doctype = text_of(bibdata, 'ext/doctype') || ''
|
|
53
|
-
revdate = extract_revdate(bibdata)
|
|
54
|
-
flavor = @fallback_flavor || detect_flavor(raw_id)
|
|
55
|
-
output_dir = File.dirname(rxl_path)
|
|
56
|
-
file_base_name = File.basename(rxl_path, '.rxl')
|
|
57
|
-
formats = detect_formats(output_dir, file_base_name)
|
|
58
|
-
document_type = DocumentType.from_identifier(raw_id)
|
|
59
|
-
|
|
60
|
-
DocumentMetadata.new(
|
|
61
|
-
id: id, title: title, version: version, doctype: doctype,
|
|
62
|
-
document_type: document_type, flavor: flavor, revdate: revdate,
|
|
63
|
-
source_path: derive_source_path(rxl_path), output_dir: output_dir,
|
|
64
|
-
formats: formats, file_base_name: file_base_name
|
|
65
|
-
)
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
def fallback_metadata(rxl_path)
|
|
69
|
-
file_base_name = File.basename(rxl_path, '.rxl')
|
|
70
|
-
id = DocumentId.from_raw(file_base_name)
|
|
71
|
-
DocumentMetadata.new(
|
|
72
|
-
id: id, title: '', version: DocumentVersion.published(edition: '0'),
|
|
73
|
-
doctype: '', document_type: 'standard', flavor: nil, revdate: nil,
|
|
74
|
-
source_path: rxl_path, output_dir: File.dirname(rxl_path),
|
|
75
|
-
formats: [], file_base_name: file_base_name
|
|
76
|
-
)
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
def text_of(node, xpath)
|
|
80
|
-
n = node.at_xpath(xpath)
|
|
81
|
-
n&.text&.strip
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
def extract_revdate(bibdata)
|
|
85
|
-
date_node = bibdata.at_xpath("date[@type='published']/on") ||
|
|
86
|
-
bibdata.at_xpath('date/on')
|
|
87
|
-
date_node&.text&.strip
|
|
88
|
-
end
|
|
89
|
-
|
|
90
|
-
def detect_formats(output_dir, base_name)
|
|
91
|
-
extensions = []
|
|
92
|
-
%w[html pdf xml rxl doc].each do |ext|
|
|
93
|
-
path = File.join(output_dir, "#{base_name}.#{ext}")
|
|
94
|
-
extensions << ext if File.exist?(path)
|
|
95
|
-
end
|
|
96
|
-
extensions
|
|
97
|
-
end
|
|
98
|
-
|
|
99
|
-
def detect_flavor(raw_id)
|
|
100
|
-
return nil if raw_id.nil?
|
|
101
|
-
|
|
102
|
-
parts = raw_id.split(/\s|-/)
|
|
103
|
-
parts.first&.downcase
|
|
104
|
-
end
|
|
105
|
-
|
|
106
|
-
def derive_id_from_path(rxl_path)
|
|
107
|
-
File.basename(rxl_path, '.rxl')
|
|
108
|
-
end
|
|
109
|
-
|
|
110
|
-
def derive_source_path(rxl_path)
|
|
111
|
-
rxl_path.sub(/\.rxl$/, '.adoc')
|
|
112
|
-
end
|
|
113
|
-
end
|
|
114
|
-
end
|
|
115
|
-
end
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Metanorma
|
|
4
|
-
module Release
|
|
5
|
-
class StageFilter
|
|
6
|
-
def initialize(stages)
|
|
7
|
-
@stages = Set.new(stages.map(&:downcase))
|
|
8
|
-
@all = @stages.empty?
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
def matches?(release_metadata)
|
|
12
|
-
return true if @all
|
|
13
|
-
|
|
14
|
-
@stages.include?(release_metadata['stage'].to_s.downcase)
|
|
15
|
-
end
|
|
16
|
-
end
|
|
17
|
-
end
|
|
18
|
-
end
|