metanorma-cli 1.16.10 → 1.18.0.pre.alpha.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 826947482a6b6504d9e8b6f0270fbf9c21c7ea4aaf28987fae188a75d9785130
4
- data.tar.gz: 70cdc4d3ae532c8119586898cc9b2fe2de7ebe47544131ba72b46be26c9efe67
3
+ metadata.gz: 94c9a92bb16abb8d00e65ec4145f8a2ab759514e6105c4aa17a298f52e359c75
4
+ data.tar.gz: 6b313e7db3f21f40d95da8583d59fdb4b4bf142de95eab5544e57bb0700dc957
5
5
  SHA512:
6
- metadata.gz: 3566044e7574ecba68e89cde656d0fa1931b970a1898d1d9fe90ce9cf9fbafc1a5d0456f75bafb18392a399ef3c157d599d89f53e4a414c23ec882c3582ea2a3
7
- data.tar.gz: 8535140d5d93309cf295523b85fe368ad81e8c967ee65d65194232a78f7593748e1018b2b6de4dd5d429238c77ac6b7ba0cdc85b7cc71eb980ffcb6387f98929
6
+ metadata.gz: 25d1deaa50eeb65a021062a2e05639a784467d452e76f5bfc5c1f5b97698121f4dab68377ff66091126a6efab2894cd4f3ca46a85864a6f55121ac5dd50fbd90
7
+ data.tar.gz: f926bad3a7fe1ab65abaab0fd4560d1bd2dbe9d8f3cdfc76afc4105ebe16e232aca080079e28e1eab3a2ab5200147f0b1d1742fe66d75cd52bf77803c49e6cba
data/Gemfile CHANGED
@@ -4,13 +4,47 @@ Encoding.default_internal = Encoding::UTF_8
4
4
  source "https://rubygems.org"
5
5
  git_source(:github) { |repo| "https://github.com/#{repo}" }
6
6
 
7
- source "https://rubygems.pkg.github.com/metanorma" do
8
- gem "metanorma-nist"
9
- gem "metanorma-bsi"
10
- end
11
7
 
12
8
  gemspec
13
9
 
10
+ # Remaining cross-PR pins for the flavor-table restructure wave.
11
+ # document#45 metanorma#591 iso#1618 standoc#1232 itu/iec/ogc migration
12
+ # PRs and isodoc#825 all merged: those pins below are carried by the
13
+ # canonical zoo at the foot of this file.
14
+ gem "metanorma-core",
15
+ github: "metanorma/metanorma-core",
16
+ branch: "main"
17
+ gem "metanorma-taste",
18
+ github: "metanorma/metanorma-taste",
19
+ branch: "main"
20
+
21
+ # Private flavors (nist, bsi) are intentionally absent: their sources are
22
+ # not readable without credentials, so any unauthenticated fresh resolve
23
+ # fails. The flavor loader is still tested against them via stubbed
24
+ # specs, and the grammar census installs them with GitHub Packages auth.
25
+
26
+ gem "relaton-cli", ">= 2.2.0.pre.alpha.1"
27
+ gem "relaton-bib", "~> 2.2.0.pre.alpha.1"
28
+ gem "pubid",
29
+ github: "pubid/pubid",
30
+ branch: "main"
31
+
32
+ # Cap lutaml-model < 0.8.20: 0.8.20 relocates the XML adapter directory
33
+ # (xmi and other transitive gems still require the old path). The wave's
34
+ # other gems (document/iso) also pin ~> 0.8.0; this avoids the imminent
35
+ # 0.8.20 yank.
36
+ # Force newer xmi (lutaml 0.9.43 pins xmi ~> 0.3.20; xmi 0.7+ moved
37
+ # the XML adapter to a path compatible with lutaml-model 0.8.x).
38
+ # Conflict with lutaml's pin is resolved by also pinning lutaml to a
39
+ # version that no longer enforces it.
40
+ gem "xmi", "~> 0.7"
41
+ gem "lutaml", ">= 0.11.2"
42
+ gem "ogc-gml", "1.1.0"
43
+ gem "lutaml-model", "0.8.114" # relaton a.15 declares singular_tolerance (needs 0.8.113+); glossarist 0.5 needs >= 0.8.22
44
+ # Pin glossarist plugin: 0.3.10 freezes its preprocessor after
45
+ # initialization, breaking Asciidoctor compile in the cli suite.
46
+ gem "metanorma-plugin-glossarist", "~> 0.5" # standoc main needs the 0.5 preprocessor
47
+
14
48
  group :development do
15
49
  gem "debug"
16
50
  gem "pry"
@@ -35,3 +69,24 @@ begin
35
69
  rescue StandardError
36
70
  nil
37
71
  end
72
+ gem "metanorma-standoc", github: "metanorma/metanorma-standoc", branch: "main"
73
+ gem "metanorma-iso", github: "metanorma/metanorma-iso", branch: "main" # released 3.5.0 conflicts with metanorma-document main # released 3.4.2 still caps relaton-cli ~> 2.1
74
+ gem "metanorma-document", github: "metanorma/metanorma-document", branch: "main" # standoc main references Document::Components constants
75
+ gem "metanorma-utils", github: "metanorma/metanorma-utils", branch: "main" # released utils lacks GcBudget/deep_symbolize (main-only)
76
+ gem "isodoc", github: "metanorma/isodoc", branch: "main" # released isodoc caps relaton-render ~> 1.3
77
+
78
+ # the metagem's flavor zoo on mains: released flavors reference the retired 1.x render API
79
+ gem "metanorma", github: "metanorma/metanorma", branch: "main"
80
+ gem "metanorma-bipm", github: "metanorma/metanorma-bipm", branch: "main"
81
+ gem "metanorma-cc", github: "metanorma/metanorma-cc", branch: "main"
82
+ gem "metanorma-iec", github: "metanorma/metanorma-iec", branch: "main"
83
+ gem "metanorma-ieee", github: "metanorma/metanorma-ieee", branch: "main"
84
+ gem "metanorma-ietf", github: "metanorma/metanorma-ietf", branch: "main"
85
+ gem "metanorma-gb", github: "metanorma/metanorma-gb", branch: "main"
86
+ gem "metanorma-generic", github: "metanorma/metanorma-generic", branch: "main"
87
+ gem "metanorma-iho", github: "metanorma/metanorma-iho", branch: "main"
88
+ gem "metanorma-itu", github: "metanorma/metanorma-itu", branch: "main"
89
+ gem "metanorma-jis", github: "metanorma/metanorma-jis", branch: "main"
90
+ gem "metanorma-ogc", github: "metanorma/metanorma-ogc", branch: "main"
91
+ gem "metanorma-plateau", github: "metanorma/metanorma-plateau", branch: "main"
92
+ gem "metanorma-ribose", github: "metanorma/metanorma-ribose", branch: "main"
data/bin/font-test CHANGED
@@ -13,10 +13,33 @@ end
13
13
 
14
14
  Fontist::Formula.update_formulas_repo
15
15
 
16
+ def taste_fonts(flavor)
17
+ require "metanorma-taste"
18
+ config = Metanorma::TasteRegister.get_config(flavor.to_sym)
19
+ fonts = config&.base_override&.value_attributes&.fonts
20
+ fonts&.split(";")&.map(&:strip)&.reject(&:empty?)
21
+ rescue Metanorma::TasteRegister::UnknownTasteError, LoadError
22
+ nil
23
+ end
24
+
16
25
  flavors.each do |flavor|
17
26
  flavor_name = (flavor == "jcgm") ? "bipm" : flavor
18
27
  gem_name = "metanorma-#{flavor_name}"
19
- require gem_name
28
+ begin
29
+ require gem_name
30
+ rescue LoadError
31
+ # A taste has no gem of its own: install the fonts its config declares
32
+ if (fonts = taste_fonts(flavor_name))
33
+ puts "Processing fonts for taste '#{flavor_name}' (metanorma-taste)..."
34
+ fonts.each do |font|
35
+ Fontist::Font.install(font, confirmation: "yes")
36
+ puts "- #{font}"
37
+ end
38
+ puts "Done."
39
+ next
40
+ end
41
+ raise
42
+ end
20
43
 
21
44
  # Determine the processor class based on the flavor
22
45
  processor_class = "Metanorma::#{flavor_name.capitalize}::Processor"
@@ -8,6 +8,8 @@ require "metanorma/cli/thor_with_config"
8
8
  require "metanorma/cli/commands/config"
9
9
  require "metanorma/cli/commands/template_repo"
10
10
  require "metanorma/cli/commands/site"
11
+ require "metanorma/cli/commands/diff"
12
+ require "metanorma/release/cli"
11
13
  require "mnconvert"
12
14
  require_relative "flavor"
13
15
 
@@ -15,8 +17,8 @@ module Metanorma
15
17
  module Cli
16
18
  class Command < ThorWithConfig
17
19
  class_option :progress, aliases: "-s", type: :boolean, default: false,
18
- desc: "Show progress for long running tasks" \
19
- " (like download)"
20
+ desc: "Show progress for long running tasks " \
21
+ "(like download)"
20
22
 
21
23
  desc "new NAME", "Create new Metanorma document"
22
24
  option :type, aliases: "-t", required: true, desc: "Document type"
@@ -40,28 +42,28 @@ module Metanorma
40
42
  option :wrapper, aliases: "-w", type: :boolean,
41
43
  desc: "Create wrapper folder for HTML output"
42
44
  option :asciimath, aliases: "-a", type: :boolean,
43
- desc: "Keep Asciimath in XML output instead of" \
44
- " converting it to MathM"
45
+ desc: "Keep Asciimath in XML output instead of " \
46
+ "converting it to MathM"
45
47
  option :datauriimage, aliases: "-d", type: :boolean,
46
48
  desc: "Encode HTML output images as data URIs"
47
49
  option :relaton, aliases: "-R",
48
- desc: "Export Relaton XML for document to nominated" \
49
- " filename"
50
+ desc: "Export Relaton XML for document to nominated " \
51
+ "filename"
50
52
  option :extract, aliases: "-e",
51
- desc: "Export sourcecode fragments from this document" \
52
- " to nominated directory"
53
+ desc: "Export sourcecode fragments from this document " \
54
+ "to nominated directory"
53
55
  option :version, aliases: "-v",
54
56
  desc: "Print version of code (accompanied with -t)"
55
57
  option :log_messages, aliases: "-L",
56
58
  desc: "Display available log messages " \
57
- "(accompanied with -t)"
59
+ "(accompanied with -t)"
58
60
  option :output_dir, aliases: "-o",
59
61
  desc: "Directory to save compiled files"
60
62
  option :strict, aliases: "-S", type: :boolean,
61
63
  desc: "Strict compilation: abort if there are any errors"
62
64
  option :agree_to_terms,
63
65
  type: :boolean,
64
- desc: "Agree / Disagree with all third-party licensing terms "\
66
+ desc: "Agree / Disagree with all third-party licensing terms " \
65
67
  "presented (WARNING: do know what you are agreeing with!)"
66
68
  option :install_fonts, type: :boolean, default: true,
67
69
  desc: "Install required fonts"
@@ -99,14 +101,14 @@ module Metanorma
99
101
  option :coverpage, aliases: "-c", desc: "Liquid template"
100
102
  option :agree_to_terms,
101
103
  type: :boolean,
102
- desc: "Agree / Disagree with all third-party licensing terms "\
104
+ desc: "Agree / Disagree with all third-party licensing terms " \
103
105
  "presented (WARNING: do know what you are agreeing with!)"
104
106
  option :install_fonts, type: :boolean, default: true,
105
107
  desc: "Install required fonts"
106
108
  option :continue_without_fonts,
107
109
  type: :boolean,
108
110
  desc: "Continue processing even when fonts are missing"
109
- option :strict, aliases: "-S", type: :boolean, \
111
+ option :strict, aliases: "-S", type: :boolean,
110
112
  desc: "Strict compilation: abort if there are any errors"
111
113
 
112
114
  def collection(filename = nil)
@@ -151,6 +153,31 @@ module Metanorma
151
153
  UI.say e.message
152
154
  end
153
155
 
156
+ desc "diff FILE1 FILE2", "Semantic diff of two Metanorma XML documents"
157
+ option :format, type: :string, default: "text",
158
+ desc: "Output format: text or json"
159
+ option :profile, type: :string,
160
+ desc: "canon configuration profile (built-in name " \
161
+ "or YAML path; default: metanorma)"
162
+ option :match_profile, type: :string,
163
+ desc: "canon match profile override, e.g. " \
164
+ "strict or spec_friendly"
165
+ option :show_diffs, type: :string,
166
+ desc: "Which differences to show: " \
167
+ "all|normative|informative"
168
+ option :context_lines, type: :numeric,
169
+ desc: "Context lines around each difference"
170
+ option :color, type: :boolean, default: true,
171
+ desc: "Colorise the text report"
172
+ option :input_format, type: :string,
173
+ desc: "Input format override: xml|html|json|yaml " \
174
+ "(default: by file extension)"
175
+
176
+ def diff(file1, file2)
177
+ status = Commands::Diff.new(file1, file2, options).run
178
+ exit(status) unless status.zero?
179
+ end
180
+
154
181
  desc "version", "Version of the code"
155
182
  option :type, aliases: "-t", required: false,
156
183
  desc: "Type of standard to generate"
@@ -202,6 +229,9 @@ module Metanorma
202
229
  desc "site", "Manage site for metanorma collections"
203
230
  subcommand :site, Metanorma::Cli::Commands::Site
204
231
 
232
+ desc "release SUBCOMMAND ...", "Document registry commands (metanorma-release)"
233
+ subcommand :release, Metanorma::Release::CLI
234
+
205
235
  desc "config", "Manage configuration file"
206
236
  subcommand :config, Metanorma::Cli::Commands::Config
207
237
 
@@ -0,0 +1,159 @@
1
+ require "json"
2
+
3
+ module Metanorma
4
+ module Cli
5
+ module Commands
6
+ # Semantic diff of two Metanorma XML documents, with lutaml/canon
7
+ # as the diff engine (metanorma-cli#442, iso-10303
8
+ # drift-tracking). Returns an exit status instead of exiting, so
9
+ # in-process callers (and specs) stay alive; the Thor command
10
+ # decides the process exit.
11
+ class Diff
12
+ EXIT_EQUIVALENT = 0
13
+ EXIT_DIFFERENT = 1
14
+ EXIT_ERROR = 2
15
+
16
+ # the canon LIBRARY does not auto-detect input format (its CLI
17
+ # does, from extensions) — detect here, overridable via
18
+ # --input-format
19
+ FORMAT_BY_EXT = {
20
+ ".xml" => :xml, ".html" => :html, ".htm" => :html,
21
+ ".json" => :json, ".yaml" => :yaml, ".yml" => :yaml
22
+ }.freeze
23
+
24
+ def initialize(file1, file2, options = {})
25
+ @file1 = file1
26
+ @file2 = file2
27
+ @options = options
28
+ end
29
+
30
+ # @return [Integer] exit status (0 equivalent / 1 different /
31
+ # 2 error); output goes to the given IO (default $stdout)
32
+ def run(out = $stdout)
33
+ return EXIT_ERROR unless files_exist?
34
+
35
+ require "canon"
36
+ format = input_format
37
+ return reject_format unless format
38
+
39
+ configure_canon
40
+ report(compare_documents(format), out)
41
+ rescue StandardError => e
42
+ warn "metanorma diff: #{e.class}: #{e.message}"
43
+ EXIT_ERROR
44
+ end
45
+
46
+ private
47
+
48
+ def files_exist?
49
+ [@file1, @file2].all? do |f|
50
+ File.file?(f) ||
51
+ (warn("metanorma diff: no such file: #{f}") && false)
52
+ end
53
+ end
54
+
55
+ # The canon "metanorma" configuration profile is the default:
56
+ # spec-friendly matching, metanorma whitespace element lists,
57
+ # normative-only display. --profile selects another canon
58
+ # profile (built-in name or a YAML path).
59
+ def configure_canon
60
+ Canon::Config.reset!
61
+ Canon::Config.instance.profile = @options[:profile] || :metanorma
62
+ end
63
+
64
+ # rubocop:disable Naming/PredicateMethod -- verbose: true makes
65
+ # equivalent? return a full ComparisonResult, not a boolean
66
+ def report(result, out)
67
+ out.puts render(result)
68
+ result.equivalent? ? EXIT_EQUIVALENT : EXIT_DIFFERENT
69
+ end
70
+
71
+ def reject_format
72
+ warn "metanorma diff: unsupported input format for " \
73
+ "#{File.extname(@file1)} — semantic diff handles " \
74
+ "#{FORMAT_BY_EXT.keys.join(', ')} (or pass --input-format)"
75
+ EXIT_ERROR
76
+ end
77
+
78
+ def input_format
79
+ if (f = @options[:input_format])
80
+ return f.to_sym
81
+ end
82
+
83
+ FORMAT_BY_EXT[File.extname(@file1).downcase]
84
+ end
85
+
86
+ def compare_documents(format)
87
+ opts = { verbose: true, format: format }
88
+ if (mp = @options[:match_profile])
89
+ opts[:match_profile] = mp.to_sym
90
+ end
91
+ Canon::Comparison.equivalent?(
92
+ File.read(@file1, encoding: "UTF-8"),
93
+ File.read(@file2, encoding: "UTF-8"),
94
+ opts,
95
+ )
96
+ end
97
+ # rubocop:enable Naming/PredicateMethod
98
+
99
+ def render(result)
100
+ case @options[:format]&.downcase
101
+ when "json" then render_json(result)
102
+ else render_text(result)
103
+ end
104
+ end
105
+
106
+ def render_text(result)
107
+ return result.diff(**text_diff_opts) unless result.equivalent?
108
+
109
+ info = result.informative_differences.size
110
+ return "Equivalent" if info.zero?
111
+
112
+ msg = "Equivalent (#{info} informative difference(s) — " \
113
+ "rerun with --show-diffs informative to view)"
114
+ if @options[:show_diffs].to_s == "informative"
115
+ "#{msg}\n#{result.diff(**text_diff_opts)}"
116
+ else
117
+ msg
118
+ end
119
+ end
120
+
121
+ def text_diff_opts
122
+ diff_opts = { use_color: color? }
123
+ if (cl = @options[:context_lines])
124
+ diff_opts[:context_lines] = cl.to_i
125
+ end
126
+ if (sd = @options[:show_diffs])
127
+ diff_opts[:show_diffs] = sd.to_sym
128
+ end
129
+ diff_opts
130
+ end
131
+
132
+ def color?
133
+ return false if @options[:color] == false
134
+
135
+ $stdout.tty?
136
+ end
137
+
138
+ # canon has no machine-readable report; serialise its DiffNode
139
+ # list ourselves — the shape iso-10303 CI can consume
140
+ def diff_to_h(diff)
141
+ { dimension: diff.dimension, reason: diff.reason,
142
+ path: diff.path, normative: diff.normative?,
143
+ before: diff.serialized_before, after: diff.serialized_after }
144
+ end
145
+
146
+ def render_json(result)
147
+ diffs = result.differences.map { |d| diff_to_h(d) }
148
+ JSON.pretty_generate(
149
+ files: { a: @file1, b: @file2 },
150
+ equivalent: result.equivalent?,
151
+ normative_count: diffs.count { |d| d[:normative] },
152
+ informative_count: diffs.count { |d| !d[:normative] },
153
+ differences: diffs,
154
+ )
155
+ end
156
+ end
157
+ end
158
+ end
159
+ end
@@ -6,7 +6,7 @@ module Metanorma
6
6
  metanorma-core metanorma-plugin-glossarist metanorma-plugin-lutaml
7
7
  metanorma-taste relaton-cli pubid glossarist fontist
8
8
  plurimath expressir xmi lutaml-model emf2svg unitsml
9
- vectory ogc-gml oscal suma).freeze
9
+ vectory ogc-gml oscal suma canon).freeze
10
10
 
11
11
  EXPORT_CONFIG_FLAVOR_FILES = [
12
12
  "metanorma/*/*.adoc",
@@ -16,6 +16,8 @@ module Metanorma
16
16
  "isodoc/*/*.yaml",
17
17
  "relaton/render/*.yml",
18
18
  "relaton/render/*.yaml",
19
+ "relaton/render-isodoc/**/*.yml",
20
+ "metanorma/*/*-style.yml",
19
21
  ].freeze
20
22
 
21
23
  private
@@ -45,8 +47,22 @@ module Metanorma
45
47
  end
46
48
 
47
49
  def flavor_dictionary_taste(ret)
48
- Metanorma::TasteRegister.instance.available_tastes.each do |taste|
50
+ # Tastes come from the core flavor table (metanorma-core#18)
51
+ # when available; fall back to TasteRegister for contexts where
52
+ # the table has no taste entries registered yet (load-order or
53
+ # version-skew). Same output shape either way — the specs are
54
+ # the contract.
55
+ tastes = if defined?(Metanorma::Core::Flavors) &&
56
+ Metanorma::Core::Flavors.available_tastes.any?
57
+ Metanorma::Core::Flavors.available_tastes
58
+ else
59
+ Metanorma::TasteRegister.instance.available_tastes
60
+ end
61
+
62
+ tastes.each do |taste|
49
63
  format_keys, base_flavor = taste_format_keys(taste)
64
+ next unless ret[base_flavor]
65
+
50
66
  ret[taste] = { format_keys: format_keys, base_flavor: base_flavor,
51
67
  native_keys: ret[base_flavor][:format_keys],
52
68
  input: ret[base_flavor][:input] }
@@ -92,7 +92,6 @@ module Metanorma
92
92
  iho: "https://github.com/metanorma/mn-templates-iho",
93
93
  cc: "https://github.com/metanorma/mn-templates-cc",
94
94
  un: "https://github.com/metanorma/mn-templates-un",
95
- nist: "https://github.com/metanorma/mn-templates-nist",
96
95
  m3aawg: "https://github.com/metanorma/mn-templates-m3aawg",
97
96
  }
98
97
  end
@@ -1,5 +1,5 @@
1
1
  module Metanorma
2
2
  module Cli
3
- VERSION = "1.16.10".freeze
3
+ VERSION = "1.18.0.pre.alpha.1".freeze
4
4
  end
5
5
  end
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "bundler"
3
4
  require "metanorma/cli/ui"
4
5
 
5
6
  module Metanorma
@@ -26,9 +27,26 @@ module Metanorma
26
27
  PRIVATE_SUPPORTED_GEMS = [
27
28
  "metanorma-ribose",
28
29
  # "metanorma-mpfa",
29
- "metanorma-nist",
30
30
  ].freeze
31
31
 
32
+ # Bundled metanorma-* gems that are not flavors; they are never
33
+ # require'd by the loader. Everything bundled outside this list and
34
+ # the flavor lists above loads generically, so fully private flavor
35
+ # gems (nist, bsi, ...) work by mere presence in the consumer's
36
+ # bundle — open CLI code never names them.
37
+ NON_FLAVOR_GEMS = %w(
38
+ metanorma
39
+ metanorma-cli
40
+ metanorma-core
41
+ metanorma-standoc
42
+ metanorma-document
43
+ metanorma-utils
44
+ metanorma-mirror
45
+ metanorma-taste
46
+ metanorma-release
47
+ metanorma-acme
48
+ ).freeze
49
+
32
50
  def self.activate
33
51
  new.activate
34
52
  end
@@ -46,10 +64,54 @@ module Metanorma
46
64
  end
47
65
 
48
66
  def load_flavors
49
- flavors.each do |flavor_name|
67
+ require_tastes
68
+ (flavors + bundled_private_flavor_gems).each do |flavor_name|
50
69
  require(flavor_name)
51
- rescue LoadError => _e
52
- gem_loading_error(flavor_name)
70
+ rescue LoadError, NameError => _e
71
+ # NameError: released flavor gems predating the relaton-render 3
72
+ # line raise at require time (e.g. metanorma-ogc 2.x subclassing
73
+ # Relaton::Render::Parse); degrade them like absent flavors
74
+ # instead of crashing every corpus run that bundles them.
75
+ if SUPPORTED_GEMS.include?(flavor_name)
76
+ gem_loading_error(flavor_name)
77
+ else
78
+ # Bundled-but-not-supported metanorma-* gems load best-effort:
79
+ # the bundle pulls in data gems with no top-level entry file
80
+ # (metanorma-ietf-data) and stale releases awaiting their
81
+ # entry-file fix (metanorma-mko 1.1.1 predates the mko entry).
82
+ # Their absence is not the user's error, so stay quiet.
83
+ Metanorma::Cli::UI.debug("#{flavor_name} is not present!")
84
+ end
85
+ end
86
+ end
87
+
88
+ private
89
+
90
+ # Tastes register into Metanorma::Core::Flavors at require time; the
91
+ # registry is the single extension point behind the CLI's taste
92
+ # lookups (flavor dictionary, export-config, compile). Absence of the
93
+ # gem degrades silently, like an absent flavor.
94
+ def require_tastes
95
+ require "metanorma-taste"
96
+ rescue LoadError, NameError
97
+ Metanorma::Cli::UI.debug("metanorma-taste is not present!")
98
+ end
99
+
100
+ # Bundled metanorma-* gems outside the public flavor lists and the
101
+ # non-flavor helpers: fully private flavors. Names are discovered
102
+ # from the bundle, never listed here.
103
+ def bundled_private_flavor_gems
104
+ named = flavors + NON_FLAVOR_GEMS
105
+ specs = begin
106
+ Bundler.load.specs
107
+ rescue StandardError
108
+ Gem::Specification.find_all do |spec|
109
+ spec.name.start_with?("metanorma-")
110
+ end
111
+ end
112
+ specs.map(&:name).uniq.select do |name|
113
+ name.start_with?("metanorma-") && !name.start_with?("metanorma-plugin-") &&
114
+ !named.include?(name)
53
115
  end
54
116
  end
55
117
 
@@ -25,32 +25,34 @@ Gem::Specification.new do |spec|
25
25
  spec.require_paths = ["lib"]
26
26
  spec.required_ruby_version = Gem::Requirement.new(">= 3.3.0")
27
27
 
28
- spec.add_dependency "metanorma-ietf", "~> 3.7.0"
29
- spec.add_dependency "metanorma-iso", "~> 3.4.2"
30
- spec.add_dependency "mnconvert"
28
+ spec.add_dependency "metanorma-ietf", ">= 3.7.0"
29
+ spec.add_dependency "metanorma-iso", ">= 3.5.0"
30
+ spec.add_dependency "mnconvert", "~> 1.89"
31
+ spec.add_dependency "metanorma-release", "~> 0.2"
31
32
  # spec.add_dependency "thor", "~> 1.0" # inherited from vectory
32
33
  # spec.add_dependency "metanorma-gb", "~> 1.5.0"
33
- spec.add_dependency "metanorma-bipm", "~> 2.8.0"
34
- spec.add_dependency "metanorma-cc", "~> 2.8.0"
35
- spec.add_dependency "metanorma-generic", "~> 3.4.0"
36
- spec.add_dependency "metanorma-iec", "~> 2.8.0"
37
- spec.add_dependency "metanorma-ribose", "~> 2.8.0"
38
- spec.add_dependency "metanorma-standoc", "~> 3.4.3"
34
+ spec.add_dependency "metanorma-bipm", ">= 2.9.0"
35
+ spec.add_dependency "metanorma-cc", ">= 2.9.0"
36
+ spec.add_dependency "metanorma-generic", ">= 3.5.0"
37
+ spec.add_dependency "metanorma-iec", ">= 2.9.0"
38
+ spec.add_dependency "metanorma-ribose", ">= 2.9.0"
39
+ spec.add_dependency "metanorma-standoc", ">= 3.5.0"
40
+ spec.add_dependency "metanorma-taste", "~> 1.1"
39
41
  # spec.add_dependency 'metanorma-mpfa', "~> 0.9.0"
40
42
  spec.add_dependency "git", ">= 3.0"
41
- spec.add_dependency "lutaml-model"
42
- spec.add_dependency "metanorma", "~> 2.5.1"
43
- spec.add_dependency "metanorma-iho", "~> 1.3.0"
44
- spec.add_dependency "metanorma-itu", "~> 2.8.0"
45
- # spec.add_dependency "metanorma-nist", "~> 2.7.0"
43
+ spec.add_dependency "lutaml-model", "~> 0.8"
44
+ spec.add_dependency "metanorma", ">= 2.5.1"
45
+ spec.add_dependency "metanorma-iho", ">= 1.4.0"
46
+ spec.add_dependency "metanorma-itu", ">= 2.9.0"
46
47
  spec.add_dependency "liquid", "~> 5"
47
- spec.add_dependency "metanorma-ieee", "~> 1.6.0"
48
- spec.add_dependency "metanorma-jis", "~> 1.1.0"
49
- spec.add_dependency "metanorma-ogc", "~> 2.9.0"
50
- spec.add_dependency "metanorma-plateau", "~> 1.2.0"
51
- spec.add_dependency "relaton-cli", ">= 0.8.2"
48
+ spec.add_dependency "metanorma-ieee", ">= 1.7.0"
49
+ spec.add_dependency "metanorma-jis", ">= 1.2.0"
50
+ spec.add_dependency "metanorma-ogc", ">= 2.10.0"
51
+ spec.add_dependency "metanorma-plateau", ">= 1.3.0"
52
+ spec.add_dependency "canon", ">= 0.2.12"
53
+ spec.add_dependency "relaton-cli", ">= 3.0.0.pre.alpha"
52
54
  spec.add_dependency "socksify"
53
- spec.add_dependency "suma", "~> 0.5.0"
55
+ spec.add_dependency "suma", "~> 0.5"
54
56
  # spec.metadata["rubygems_mfa_required"] = "true"
55
57
  # NOBODY UNCOMMENTS THIS WITHOUT EXPLAINING TO ME HOW TO USE MFA
56
58
  end
metadata CHANGED
@@ -1,140 +1,169 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: metanorma-cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.16.10
4
+ version: 1.18.0.pre.alpha.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
+ autorequire:
8
9
  bindir: exe
9
10
  cert_chain: []
10
- date: 1980-01-02 00:00:00.000000000 Z
11
+ date: 2026-10-22 00:00:00.000000000 Z
11
12
  dependencies:
12
13
  - !ruby/object:Gem::Dependency
13
14
  name: metanorma-ietf
14
15
  requirement: !ruby/object:Gem::Requirement
15
16
  requirements:
16
- - - "~>"
17
+ - - ">="
17
18
  - !ruby/object:Gem::Version
18
19
  version: 3.7.0
19
20
  type: :runtime
20
21
  prerelease: false
21
22
  version_requirements: !ruby/object:Gem::Requirement
22
23
  requirements:
23
- - - "~>"
24
+ - - ">="
24
25
  - !ruby/object:Gem::Version
25
26
  version: 3.7.0
26
27
  - !ruby/object:Gem::Dependency
27
28
  name: metanorma-iso
28
29
  requirement: !ruby/object:Gem::Requirement
29
30
  requirements:
30
- - - "~>"
31
+ - - ">="
31
32
  - !ruby/object:Gem::Version
32
- version: 3.4.2
33
+ version: 3.5.0
33
34
  type: :runtime
34
35
  prerelease: false
35
36
  version_requirements: !ruby/object:Gem::Requirement
36
37
  requirements:
37
- - - "~>"
38
+ - - ">="
38
39
  - !ruby/object:Gem::Version
39
- version: 3.4.2
40
+ version: 3.5.0
40
41
  - !ruby/object:Gem::Dependency
41
42
  name: mnconvert
42
43
  requirement: !ruby/object:Gem::Requirement
43
44
  requirements:
44
- - - ">="
45
+ - - "~>"
45
46
  - !ruby/object:Gem::Version
46
- version: '0'
47
+ version: '1.89'
47
48
  type: :runtime
48
49
  prerelease: false
49
50
  version_requirements: !ruby/object:Gem::Requirement
50
51
  requirements:
51
- - - ">="
52
+ - - "~>"
52
53
  - !ruby/object:Gem::Version
53
- version: '0'
54
+ version: '1.89'
54
55
  - !ruby/object:Gem::Dependency
55
- name: metanorma-bipm
56
+ name: metanorma-release
56
57
  requirement: !ruby/object:Gem::Requirement
57
58
  requirements:
58
59
  - - "~>"
59
60
  - !ruby/object:Gem::Version
60
- version: 2.8.0
61
+ version: '0.2'
61
62
  type: :runtime
62
63
  prerelease: false
63
64
  version_requirements: !ruby/object:Gem::Requirement
64
65
  requirements:
65
66
  - - "~>"
66
67
  - !ruby/object:Gem::Version
67
- version: 2.8.0
68
+ version: '0.2'
69
+ - !ruby/object:Gem::Dependency
70
+ name: metanorma-bipm
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: 2.9.0
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: 2.9.0
68
83
  - !ruby/object:Gem::Dependency
69
84
  name: metanorma-cc
70
85
  requirement: !ruby/object:Gem::Requirement
71
86
  requirements:
72
- - - "~>"
87
+ - - ">="
73
88
  - !ruby/object:Gem::Version
74
- version: 2.8.0
89
+ version: 2.9.0
75
90
  type: :runtime
76
91
  prerelease: false
77
92
  version_requirements: !ruby/object:Gem::Requirement
78
93
  requirements:
79
- - - "~>"
94
+ - - ">="
80
95
  - !ruby/object:Gem::Version
81
- version: 2.8.0
96
+ version: 2.9.0
82
97
  - !ruby/object:Gem::Dependency
83
98
  name: metanorma-generic
84
99
  requirement: !ruby/object:Gem::Requirement
85
100
  requirements:
86
- - - "~>"
101
+ - - ">="
87
102
  - !ruby/object:Gem::Version
88
- version: 3.4.0
103
+ version: 3.5.0
89
104
  type: :runtime
90
105
  prerelease: false
91
106
  version_requirements: !ruby/object:Gem::Requirement
92
107
  requirements:
93
- - - "~>"
108
+ - - ">="
94
109
  - !ruby/object:Gem::Version
95
- version: 3.4.0
110
+ version: 3.5.0
96
111
  - !ruby/object:Gem::Dependency
97
112
  name: metanorma-iec
98
113
  requirement: !ruby/object:Gem::Requirement
99
114
  requirements:
100
- - - "~>"
115
+ - - ">="
101
116
  - !ruby/object:Gem::Version
102
- version: 2.8.0
117
+ version: 2.9.0
103
118
  type: :runtime
104
119
  prerelease: false
105
120
  version_requirements: !ruby/object:Gem::Requirement
106
121
  requirements:
107
- - - "~>"
122
+ - - ">="
108
123
  - !ruby/object:Gem::Version
109
- version: 2.8.0
124
+ version: 2.9.0
110
125
  - !ruby/object:Gem::Dependency
111
126
  name: metanorma-ribose
112
127
  requirement: !ruby/object:Gem::Requirement
113
128
  requirements:
114
- - - "~>"
129
+ - - ">="
115
130
  - !ruby/object:Gem::Version
116
- version: 2.8.0
131
+ version: 2.9.0
117
132
  type: :runtime
118
133
  prerelease: false
119
134
  version_requirements: !ruby/object:Gem::Requirement
120
135
  requirements:
121
- - - "~>"
136
+ - - ">="
122
137
  - !ruby/object:Gem::Version
123
- version: 2.8.0
138
+ version: 2.9.0
124
139
  - !ruby/object:Gem::Dependency
125
140
  name: metanorma-standoc
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: 3.5.0
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: 3.5.0
153
+ - !ruby/object:Gem::Dependency
154
+ name: metanorma-taste
126
155
  requirement: !ruby/object:Gem::Requirement
127
156
  requirements:
128
157
  - - "~>"
129
158
  - !ruby/object:Gem::Version
130
- version: 3.4.3
159
+ version: '1.1'
131
160
  type: :runtime
132
161
  prerelease: false
133
162
  version_requirements: !ruby/object:Gem::Requirement
134
163
  requirements:
135
164
  - - "~>"
136
165
  - !ruby/object:Gem::Version
137
- version: 3.4.3
166
+ version: '1.1'
138
167
  - !ruby/object:Gem::Dependency
139
168
  name: git
140
169
  requirement: !ruby/object:Gem::Requirement
@@ -153,58 +182,58 @@ dependencies:
153
182
  name: lutaml-model
154
183
  requirement: !ruby/object:Gem::Requirement
155
184
  requirements:
156
- - - ">="
185
+ - - "~>"
157
186
  - !ruby/object:Gem::Version
158
- version: '0'
187
+ version: '0.8'
159
188
  type: :runtime
160
189
  prerelease: false
161
190
  version_requirements: !ruby/object:Gem::Requirement
162
191
  requirements:
163
- - - ">="
192
+ - - "~>"
164
193
  - !ruby/object:Gem::Version
165
- version: '0'
194
+ version: '0.8'
166
195
  - !ruby/object:Gem::Dependency
167
196
  name: metanorma
168
197
  requirement: !ruby/object:Gem::Requirement
169
198
  requirements:
170
- - - "~>"
199
+ - - ">="
171
200
  - !ruby/object:Gem::Version
172
201
  version: 2.5.1
173
202
  type: :runtime
174
203
  prerelease: false
175
204
  version_requirements: !ruby/object:Gem::Requirement
176
205
  requirements:
177
- - - "~>"
206
+ - - ">="
178
207
  - !ruby/object:Gem::Version
179
208
  version: 2.5.1
180
209
  - !ruby/object:Gem::Dependency
181
210
  name: metanorma-iho
182
211
  requirement: !ruby/object:Gem::Requirement
183
212
  requirements:
184
- - - "~>"
213
+ - - ">="
185
214
  - !ruby/object:Gem::Version
186
- version: 1.3.0
215
+ version: 1.4.0
187
216
  type: :runtime
188
217
  prerelease: false
189
218
  version_requirements: !ruby/object:Gem::Requirement
190
219
  requirements:
191
- - - "~>"
220
+ - - ">="
192
221
  - !ruby/object:Gem::Version
193
- version: 1.3.0
222
+ version: 1.4.0
194
223
  - !ruby/object:Gem::Dependency
195
224
  name: metanorma-itu
196
225
  requirement: !ruby/object:Gem::Requirement
197
226
  requirements:
198
- - - "~>"
227
+ - - ">="
199
228
  - !ruby/object:Gem::Version
200
- version: 2.8.0
229
+ version: 2.9.0
201
230
  type: :runtime
202
231
  prerelease: false
203
232
  version_requirements: !ruby/object:Gem::Requirement
204
233
  requirements:
205
- - - "~>"
234
+ - - ">="
206
235
  - !ruby/object:Gem::Version
207
- version: 2.8.0
236
+ version: 2.9.0
208
237
  - !ruby/object:Gem::Dependency
209
238
  name: liquid
210
239
  requirement: !ruby/object:Gem::Requirement
@@ -223,72 +252,86 @@ dependencies:
223
252
  name: metanorma-ieee
224
253
  requirement: !ruby/object:Gem::Requirement
225
254
  requirements:
226
- - - "~>"
255
+ - - ">="
227
256
  - !ruby/object:Gem::Version
228
- version: 1.6.0
257
+ version: 1.7.0
229
258
  type: :runtime
230
259
  prerelease: false
231
260
  version_requirements: !ruby/object:Gem::Requirement
232
261
  requirements:
233
- - - "~>"
262
+ - - ">="
234
263
  - !ruby/object:Gem::Version
235
- version: 1.6.0
264
+ version: 1.7.0
236
265
  - !ruby/object:Gem::Dependency
237
266
  name: metanorma-jis
238
267
  requirement: !ruby/object:Gem::Requirement
239
268
  requirements:
240
- - - "~>"
269
+ - - ">="
241
270
  - !ruby/object:Gem::Version
242
- version: 1.1.0
271
+ version: 1.2.0
243
272
  type: :runtime
244
273
  prerelease: false
245
274
  version_requirements: !ruby/object:Gem::Requirement
246
275
  requirements:
247
- - - "~>"
276
+ - - ">="
248
277
  - !ruby/object:Gem::Version
249
- version: 1.1.0
278
+ version: 1.2.0
250
279
  - !ruby/object:Gem::Dependency
251
280
  name: metanorma-ogc
252
281
  requirement: !ruby/object:Gem::Requirement
253
282
  requirements:
254
- - - "~>"
283
+ - - ">="
255
284
  - !ruby/object:Gem::Version
256
- version: 2.9.0
285
+ version: 2.10.0
257
286
  type: :runtime
258
287
  prerelease: false
259
288
  version_requirements: !ruby/object:Gem::Requirement
260
289
  requirements:
261
- - - "~>"
290
+ - - ">="
262
291
  - !ruby/object:Gem::Version
263
- version: 2.9.0
292
+ version: 2.10.0
264
293
  - !ruby/object:Gem::Dependency
265
294
  name: metanorma-plateau
266
295
  requirement: !ruby/object:Gem::Requirement
267
296
  requirements:
268
- - - "~>"
297
+ - - ">="
269
298
  - !ruby/object:Gem::Version
270
- version: 1.2.0
299
+ version: 1.3.0
271
300
  type: :runtime
272
301
  prerelease: false
273
302
  version_requirements: !ruby/object:Gem::Requirement
274
303
  requirements:
275
- - - "~>"
304
+ - - ">="
276
305
  - !ruby/object:Gem::Version
277
- version: 1.2.0
306
+ version: 1.3.0
307
+ - !ruby/object:Gem::Dependency
308
+ name: canon
309
+ requirement: !ruby/object:Gem::Requirement
310
+ requirements:
311
+ - - ">="
312
+ - !ruby/object:Gem::Version
313
+ version: 0.2.12
314
+ type: :runtime
315
+ prerelease: false
316
+ version_requirements: !ruby/object:Gem::Requirement
317
+ requirements:
318
+ - - ">="
319
+ - !ruby/object:Gem::Version
320
+ version: 0.2.12
278
321
  - !ruby/object:Gem::Dependency
279
322
  name: relaton-cli
280
323
  requirement: !ruby/object:Gem::Requirement
281
324
  requirements:
282
325
  - - ">="
283
326
  - !ruby/object:Gem::Version
284
- version: 0.8.2
327
+ version: 3.0.0.pre.alpha
285
328
  type: :runtime
286
329
  prerelease: false
287
330
  version_requirements: !ruby/object:Gem::Requirement
288
331
  requirements:
289
332
  - - ">="
290
333
  - !ruby/object:Gem::Version
291
- version: 0.8.2
334
+ version: 3.0.0.pre.alpha
292
335
  - !ruby/object:Gem::Dependency
293
336
  name: socksify
294
337
  requirement: !ruby/object:Gem::Requirement
@@ -309,14 +352,14 @@ dependencies:
309
352
  requirements:
310
353
  - - "~>"
311
354
  - !ruby/object:Gem::Version
312
- version: 0.5.0
355
+ version: '0.5'
313
356
  type: :runtime
314
357
  prerelease: false
315
358
  version_requirements: !ruby/object:Gem::Requirement
316
359
  requirements:
317
360
  - - "~>"
318
361
  - !ruby/object:Gem::Version
319
- version: 0.5.0
362
+ version: '0.5'
320
363
  description: Executable to process any Metanorma standard.
321
364
  email:
322
365
  - open.source@ribose.com
@@ -325,9 +368,9 @@ executables:
325
368
  - metanorma-manifest
326
369
  extensions: []
327
370
  extra_rdoc_files:
328
- - CODE_OF_CONDUCT.md
329
- - LICENSE
330
371
  - README.adoc
372
+ - LICENSE
373
+ - CODE_OF_CONDUCT.md
331
374
  files:
332
375
  - CODE_OF_CONDUCT.md
333
376
  - Gemfile
@@ -349,6 +392,7 @@ files:
349
392
  - lib/metanorma/cli/collection.rb
350
393
  - lib/metanorma/cli/command.rb
351
394
  - lib/metanorma/cli/commands/config.rb
395
+ - lib/metanorma/cli/commands/diff.rb
352
396
  - lib/metanorma/cli/commands/site.rb
353
397
  - lib/metanorma/cli/commands/template_repo.rb
354
398
  - lib/metanorma/cli/compiler.rb
@@ -371,6 +415,7 @@ homepage: https://www.metanorma.com
371
415
  licenses:
372
416
  - BSD-2-Clause
373
417
  metadata: {}
418
+ post_install_message:
374
419
  rdoc_options: []
375
420
  require_paths:
376
421
  - lib
@@ -385,7 +430,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
385
430
  - !ruby/object:Gem::Version
386
431
  version: '0'
387
432
  requirements: []
388
- rubygems_version: 4.0.10
433
+ rubygems_version: 3.5.22
434
+ signing_key:
389
435
  specification_version: 4
390
436
  summary: Metanorma is the standard of standards; the metanorma gem allows you to create
391
437
  any standard document type supported by Metanorma.