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.
Files changed (66) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +19 -1
  3. data/.rubocop_todo.yml +250 -319
  4. data/README.adoc +120 -233
  5. data/Rakefile +2 -2
  6. data/exe/metanorma-release +2 -2
  7. data/lib/metanorma/release/aggregation_pipeline.rb +59 -45
  8. data/lib/metanorma/release/asset_processor.rb +10 -8
  9. data/lib/metanorma/release/cache_store.rb +6 -6
  10. data/lib/metanorma/release/change_detector.rb +7 -3
  11. data/lib/metanorma/release/channel.rb +13 -39
  12. data/lib/metanorma/release/channel_filter.rb +26 -10
  13. data/lib/metanorma/release/cli.rb +129 -100
  14. data/lib/metanorma/release/commands/aggregate.rb +39 -54
  15. data/lib/metanorma/release/commands/package.rb +20 -12
  16. data/lib/metanorma/release/commands/{publish.rb → release_command.rb} +20 -12
  17. data/lib/metanorma/release/config.rb +104 -0
  18. data/lib/metanorma/release/content_hash.rb +11 -3
  19. data/lib/metanorma/release/delta_state.rb +55 -18
  20. data/lib/metanorma/release/file_routing.rb +8 -5
  21. data/lib/metanorma/release/index.rb +132 -0
  22. data/lib/metanorma/release/interfaces.rb +15 -15
  23. data/lib/metanorma/release/platform/github/manifest_reader.rb +4 -4
  24. data/lib/metanorma/release/platform/github/publisher.rb +23 -11
  25. data/lib/metanorma/release/platform/github/release_fetcher.rb +12 -3
  26. data/lib/metanorma/release/platform/github.rb +10 -7
  27. data/lib/metanorma/release/platform/local/directory_discoverer.rb +1 -1
  28. data/lib/metanorma/release/platform/local/fetcher.rb +17 -12
  29. data/lib/metanorma/release/platform/local/publisher.rb +9 -7
  30. data/lib/metanorma/release/platform/local.rb +4 -4
  31. data/lib/metanorma/release/platform/null/publisher.rb +3 -2
  32. data/lib/metanorma/release/platform/null.rb +1 -1
  33. data/lib/metanorma/release/platform.rb +3 -3
  34. data/lib/metanorma/release/platform_factory.rb +48 -29
  35. data/lib/metanorma/release/publication.rb +335 -0
  36. data/lib/metanorma/release/release_pipeline.rb +85 -52
  37. data/lib/metanorma/release/repo_ref.rb +5 -2
  38. data/lib/metanorma/release/site.rb +66 -0
  39. data/lib/metanorma/release/slug_strategy.rb +163 -0
  40. data/lib/metanorma/release/version.rb +1 -1
  41. data/lib/metanorma/release/zip_packager.rb +31 -8
  42. data/lib/metanorma/release.rb +68 -94
  43. metadata +22 -26
  44. data/lib/metanorma/release/aggregation_interfaces.rb +0 -27
  45. data/lib/metanorma/release/channel_audience.rb +0 -24
  46. data/lib/metanorma/release/channel_config.rb +0 -55
  47. data/lib/metanorma/release/channel_manifest.rb +0 -192
  48. data/lib/metanorma/release/channel_registry.rb +0 -60
  49. data/lib/metanorma/release/config_fetcher.rb +0 -11
  50. data/lib/metanorma/release/config_locator.rb +0 -37
  51. data/lib/metanorma/release/config_resolver.rb +0 -37
  52. data/lib/metanorma/release/document_id.rb +0 -45
  53. data/lib/metanorma/release/document_index.rb +0 -183
  54. data/lib/metanorma/release/document_metadata.rb +0 -39
  55. data/lib/metanorma/release/document_stage.rb +0 -86
  56. data/lib/metanorma/release/document_type.rb +0 -55
  57. data/lib/metanorma/release/document_version.rb +0 -50
  58. data/lib/metanorma/release/naming_strategy.rb +0 -158
  59. data/lib/metanorma/release/platform/github/config_fetcher.rb +0 -40
  60. data/lib/metanorma/release/platform/local/config_fetcher.rb +0 -20
  61. data/lib/metanorma/release/rake_tasks.rb +0 -71
  62. data/lib/metanorma/release/relaton_enricher.rb +0 -138
  63. data/lib/metanorma/release/release_metadata.rb +0 -79
  64. data/lib/metanorma/release/release_tag.rb +0 -49
  65. data/lib/metanorma/release/rxl_extractor.rb +0 -115
  66. 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