suma 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c8560abb88a9afd280a88d4671dc2aa2e674279765c5909ddba83df1e47c695c
4
- data.tar.gz: 8aff2c39d4d9d380a5f685ac49823afd195a6862d16921301fc43a24448b820a
3
+ metadata.gz: b0cee8119660d33e2592a44875f218ff7cad624c0c5ff89430c5f97eda5f593e
4
+ data.tar.gz: 9fdc83bc1383b931d0907d9f31e4d94986a7922b55ef4f82ae437b4a52833f08
5
5
  SHA512:
6
- metadata.gz: 9e920d236b6df4c74fd6c52ae3c4d24403575d10f14b41f893560962d1531c5bb6ff6798efaa7d010c5fd346cf2e820e120eafbe8cea3d6b15a80f53d9f14030
7
- data.tar.gz: fdb19a5151df97eba81e0c23382f9c5c6f7ee082bb1d7b447a25e927626f47391c658f1afd32ac20ecc66fb5064af12f3e3f1263a65daadb59962ae8ccf7533c
6
+ metadata.gz: d2e87931a5396a1b42245c0d3156345e539b6d1f11bb82b6fcc9537603cec0f1d084e7636705d5eae87b180bc1618a77330e616b714ed1b94ae25f910a7209a6
7
+ data.tar.gz: 80eebf4ce42b572fb812a8729d6a71e9a96ed08d7d2d2c04b9b9884d721adf70075a6c2ccc6d400bdbc94573edc44f273baec9c9adcb7517134a6473cbabfdf4
@@ -0,0 +1,15 @@
1
+ # Auto-generated by Cimas: Do not edit it manually!
2
+ # See https://github.com/metanorma/cimas
3
+ name: rake
4
+
5
+ on:
6
+ push:
7
+ branches: [ master, main ]
8
+ tags: [ v* ]
9
+ pull_request:
10
+
11
+ jobs:
12
+ rake:
13
+ uses: metanorma/ci/.github/workflows/generic-rake.yml@main
14
+ secrets:
15
+ pat_token: ${{ secrets.METANORMA_CI_PAT_TOKEN }}
@@ -0,0 +1,25 @@
1
+ # Auto-generated by Cimas: Do not edit it manually!
2
+ # See https://github.com/metanorma/cimas
3
+ name: release
4
+
5
+ on:
6
+ workflow_dispatch:
7
+ inputs:
8
+ next_version:
9
+ description: |
10
+ Next release version. Possible values: x.y.z, major, minor, patch (or pre|rc|etc).
11
+ Also, you can pass 'skip' to skip 'git tag' and do 'gem push' for the current version
12
+ required: true
13
+ default: 'skip'
14
+ repository_dispatch:
15
+ types: [ do-release ]
16
+
17
+ jobs:
18
+ release:
19
+ uses: metanorma/ci/.github/workflows/rubygems-release.yml@main
20
+ with:
21
+ next_version: ${{ github.event.inputs.next_version }}
22
+ secrets:
23
+ rubygems-api-key: ${{ secrets.METANORMA_CI_RUBYGEMS_API_KEY }}
24
+ pat_token: ${{ secrets.METANORMA_CI_PAT_TOKEN }}
25
+
data/.rubocop.yml CHANGED
@@ -1,8 +1,10 @@
1
- AllCops:
2
- TargetRubyVersion: 3.0
1
+ # Auto-generated by Cimas: Do not edit it manually!
2
+ # See https://github.com/metanorma/cimas
3
+ inherit_from:
4
+ - https://raw.githubusercontent.com/riboseinc/oss-guides/master/ci/rubocop.yml
3
5
 
4
- Style/StringLiterals:
5
- EnforcedStyle: double_quotes
6
+ # local repo-specific modifications
7
+ # ...
6
8
 
7
- Style/StringLiteralsInInterpolation:
8
- EnforcedStyle: double_quotes
9
+ AllCops:
10
+ TargetRubyVersion: 3.4
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "utils"
4
+ require "shale"
5
+ require_relative "collection_manifest"
6
+ require "metanorma/cli"
7
+ require "metanorma/cli/collection"
8
+ require "metanorma/collection/collection"
9
+
10
+ module Suma
11
+ class CollectionConfig < Metanorma::Collection::Config::Config
12
+ attribute :manifest, ::Suma::CollectionManifest
13
+
14
+ def self.from_file(path)
15
+ from_yaml(File.read(path))
16
+ end
17
+
18
+ def to_file(path)
19
+ File.open(path, "w") { |f| f.write to_yaml }
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,124 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "metanorma/cli"
4
+ require "metanorma/cli/collection"
5
+ require "metanorma/collection/collection"
6
+
7
+ module Suma
8
+ class CollectionManifest < Metanorma::Collection::Config::Manifest
9
+ attribute :schemas_only, Shale::Type::Boolean
10
+ attribute :entry, CollectionManifest, collection: true
11
+ # attribute :schema_source, Shale::Type::String
12
+ attr_accessor :schema_config
13
+
14
+ yaml do
15
+ map "identifier", to: :identifier
16
+ map "type", to: :type
17
+ map "level", using: { from: :level_from_yaml, to: :nop_to_yaml }
18
+ map "title", to: :title
19
+ map "url", to: :url
20
+ map "attachment", to: :attachment
21
+ map "sectionsplit", to: :sectionsplit
22
+ map "schemas-only", to: :schemas_only
23
+ map "index", to: :index
24
+ map "file", to: :file
25
+ map "fileref", using: { from: :fileref_from_yaml, to: :nop_to_yaml }
26
+ map "entry", to: :entry
27
+ map "docref", using: { from: :docref_from_yaml, to: :nop_to_yaml }
28
+ map "manifest", using: { from: :docref_from_yaml, to: :nop_to_yaml }
29
+ map "bibdata", using: { from: :bibdata_from_yaml,
30
+ to: :bibdata_to_yaml }
31
+ end
32
+
33
+ def docref_from_yaml(model, value)
34
+ model.entry = CollectionManifest.from_yaml(value.to_yaml)
35
+ end
36
+
37
+ def export_schema_config(path)
38
+ export_config = @schema_config || Suma::SchemaConfig::Config.new
39
+ return export_config unless entry
40
+
41
+ entry.each do |x|
42
+ child_config = x.export_schema_config(path)
43
+ export_config.concat(child_config) if child_config
44
+ end
45
+
46
+ export_config
47
+ end
48
+
49
+ def lookup(attr_sym, match)
50
+ results = entry.select { |e| e.send(attr_sym) == match }
51
+ results << self if send(attr_sym) == match
52
+ results
53
+ end
54
+
55
+ def process_entry(schema_output_path)
56
+ return [self] unless entry
57
+
58
+ ret = entry.each_with_object([]) do |e, m|
59
+ add = e.expand_schemas_only(schema_output_path)
60
+ m.concat(add)
61
+ end
62
+
63
+ self.entry = ret
64
+ [self]
65
+ end
66
+
67
+ def expand_schemas_only(schema_output_path)
68
+ return process_entry(schema_output_path) unless file
69
+
70
+ # If there is collection.yml, this is a document collection, we process
71
+ # schemas.yaml.
72
+ if File.basename(file) == 'collection.yml'
73
+ schemas_yaml_path = File.join(File.dirname(file), "schemas.yaml")
74
+ if schemas_yaml_path && File.exist?(schemas_yaml_path)
75
+ @schema_config = Suma::SchemaConfig::Config.from_file(schemas_yaml_path)
76
+ end
77
+ end
78
+
79
+ return process_entry(schema_output_path) unless schemas_only
80
+
81
+ # If we are going to keep the schemas-only file and compile it, we can't
82
+ # have it showing up in output.
83
+ self.index = false
84
+
85
+ doc = CollectionConfig.from_file(file)
86
+ doc_id = doc.bibdata.id
87
+
88
+ entries = @schema_config.schemas.map do |schema|
89
+ fname = [File.basename(schema.path, ".exp"), ".xml"].join
90
+
91
+ CollectionManifest.new(
92
+ identifier: schema.id,
93
+ title: schema.id,
94
+ file: File.join(schema_output_path, schema.id, "doc_#{fname}"),
95
+ # schema_source: schema.path
96
+ )
97
+ end
98
+
99
+ # we need to separate this file from the following new entries
100
+ added = CollectionManifest.new(
101
+ title: "Collection",
102
+ type: "collection",
103
+ identifier: self.identifier + "_"
104
+ )
105
+
106
+ added.entry = [
107
+ CollectionManifest.new(
108
+ title: doc_id,
109
+ type: "document",
110
+ entry: entries,
111
+ ),
112
+ ]
113
+
114
+ [self, added]
115
+ end
116
+
117
+ def remove_schemas_only_sources
118
+ ret = entry.each_with_object([]) do |e, m|
119
+ e.schemas_only or m << e
120
+ end
121
+ self.entry = ret
122
+ end
123
+ end
124
+ end
@@ -8,12 +8,9 @@ module Suma
8
8
  class ExpressSchema
9
9
  attr_accessor :path, :id, :parsed, :output_path
10
10
 
11
- def initialize(path:, output_path:)
11
+ def initialize(id:, path:, output_path:)
12
12
  @path = Pathname.new(path).expand_path
13
- @parsed = Expressir::Express::Parser.from_file(@path.to_s)
14
- Utils.log "Loaded EXPRESS schema: #{path}"
15
-
16
- @id = @parsed.schemas.first.id
13
+ @id = id
17
14
  @output_path = output_path
18
15
  end
19
16
 
@@ -28,8 +25,17 @@ module Suma
28
25
  end
29
26
  end
30
27
 
28
+ def parsed
29
+ return @parsed if @parsed
30
+
31
+ @parsed = Expressir::Express::Parser.from_file(@path.to_s)
32
+ Utils.log "Loaded EXPRESS schema: #{path}"
33
+ @id = @parsed.schemas.first.id
34
+ @parsed
35
+ end
36
+
31
37
  def to_plain
32
- @parsed.to_s(no_remarks: true)
38
+ parsed.to_s(no_remarks: true)
33
39
  end
34
40
 
35
41
  def filename_plain
@@ -3,8 +3,8 @@
3
3
  require_relative "schema_config"
4
4
  require_relative "schema_collection"
5
5
  require_relative "utils"
6
- require_relative "to_replace/collection_config"
7
- require_relative "to_replace/site_config"
6
+ require_relative "collection_config"
7
+ require_relative "site_config"
8
8
  require "metanorma/cli"
9
9
  require "metanorma/cli/collection"
10
10
  require "metanorma/collection/collection"
@@ -12,43 +12,33 @@ require "metanorma/collection/collection"
12
12
  module Suma
13
13
  class Processor
14
14
  class << self
15
- # Can move to schema_config.rb
16
- def write_all_schemas(schemas_all_path, document_paths)
17
- all_schemas = Suma::SchemaConfig::Config.new(path: schemas_all_path)
18
-
19
- document_paths.each do |path|
20
- schemas_yaml = File.join(File.dirname(path), "schemas.yaml")
21
- next unless File.exist?(schemas_yaml)
22
-
23
- schemas_config = Suma::SchemaConfig::Config.from_file(schemas_yaml)
24
- all_schemas.concat(schemas_config)
25
- end
26
-
27
- Utils.log "Writing #{schemas_all_path}..."
28
- all_schemas.to_file
29
- Utils.log "Done."
30
- end
31
15
 
32
16
  def run(metanorma_yaml_path:, schemas_all_path:, compile:, output_directory: "_site")
33
17
  Utils.log "Current directory: #{Dir.getwd}"
34
18
 
35
19
  # This reads the metanorma.yml file
36
- site_config = Suma::ToReplace::SiteConfig::Config.from_file(metanorma_yaml_path)
20
+ site_config = Suma::SiteConfig::Config.from_file(metanorma_yaml_path)
37
21
 
38
22
  # TODO: only reading the first file, which is a collection.yml, which is a hack...
39
23
  collection_config_path = site_config.metanorma.source.files.first
40
- collection_config = Suma::ToReplace::CollectionConfig::Config.from_file(collection_config_path)
24
+ collection_config = Suma::CollectionConfig.from_file(collection_config_path)
41
25
  collection_config.path = collection_config_path
26
+ collection_config.manifest.expand_schemas_only("schema_docs")
42
27
 
43
- # Gather all the inner (per-document) collection.yml files
44
- document_paths = collection_config.manifest.docref.map(&:file)
28
+ exported_schema_config = collection_config.manifest.export_schema_config(schemas_all_path)
29
+ exported_schema_config.path = schemas_all_path
45
30
 
46
- write_all_schemas(schemas_all_path, document_paths)
31
+ Utils.log "Writing #{schemas_all_path}..."
32
+ exported_schema_config.to_file
33
+ Utils.log "Done."
34
+
35
+ # now get rid of the source documents for schema sources
47
36
 
48
37
  col = Suma::SchemaCollection.new(
49
38
  config_yaml: schemas_all_path,
39
+ manifest: collection_config.manifest,
50
40
  output_path_docs: "schema_docs",
51
- output_path_schemas: "plain_schemas"
41
+ output_path_schemas: "plain_schemas",
52
42
  )
53
43
 
54
44
  if compile
@@ -58,6 +48,10 @@ module Suma
58
48
  Utils.log "No compile option set. Skipping schema compilation."
59
49
  end
60
50
 
51
+ new_collection_config_path = "collection-output.yaml"
52
+ collection_config.manifest.remove_schemas_only_sources
53
+ collection_config.to_file(new_collection_config_path)
54
+
61
55
  # TODO: Do we still need this?
62
56
  # Define Proc to resolve fileref
63
57
  my_fileref_proc = proc do |ref_folder, fileref|
@@ -97,16 +91,17 @@ module Suma
97
91
  if compile
98
92
  Utils.log "Compiling complete collection..."
99
93
 
100
- metanorma_collection = Metanorma::Collection.parse(collection_config_path)
94
+ # TODO: Why will defining a collection immediately compile??
95
+ metanorma_collection = Metanorma::Collection.parse(new_collection_config_path)
101
96
 
102
97
  # TODO: Somehow this is no longer used
103
98
  collection_opts = {
104
99
  format: [:html],
105
100
  output_folder: output_directory,
106
101
  compile: {
107
- no_install_fonts: true
102
+ install_fonts: false,
108
103
  },
109
- coverpage: "cover.html"
104
+ coverpage: "cover.html",
110
105
  }
111
106
  metanorma_collection.render(collection_opts)
112
107
 
@@ -5,28 +5,33 @@ require "fileutils"
5
5
  require_relative "schema_config"
6
6
 
7
7
  module Suma
8
- class SchemaDoc
9
- attr_accessor :schema, :output_path, :config
8
+ class SchemaAttachment
9
+ attr_accessor :schema, :output_path, :config, :id
10
10
 
11
11
  def initialize(schema:, output_path:)
12
12
  @schema = schema
13
+ @id = schema.id
13
14
  @output_path = output_path
14
15
  end
15
16
 
17
+ def output_extensions
18
+ "xml,html"
19
+ end
20
+
16
21
  def to_adoc(path_to_schema_yaml)
17
22
  <<~HEREDOC
18
- = #{@schema.id}
23
+ = #{@id}
19
24
  :lutaml-express-index: schemas; #{path_to_schema_yaml};
20
25
  :bare: true
21
26
  :mn-document-class: iso
22
- :mn-output-extensions: xml,html
27
+ :mn-output-extensions: #{output_extensions}
23
28
 
24
29
  [lutaml,schemas,context]
25
30
  ----
26
31
  {% for schema in context.schemas %}
27
32
 
28
33
  [%unnumbered]
29
- == #{@schema.id}
34
+ == #{@id}
30
35
 
31
36
  [source%unnumbered]
32
37
  --
@@ -88,19 +93,20 @@ module Suma
88
93
 
89
94
  # Compile Metanorma adoc per EXPRESS schema
90
95
  def compile
91
- return self if File.exist?(output_xml_path)
96
+ # I am commenting out because I'm playing with the schemas-only status
97
+ # return self if File.exist?(output_xml_path)
92
98
 
93
99
  save_config
94
100
  save_adoc
95
101
 
96
102
  relative_path = Pathname.new(filename_adoc).relative_path_from(Dir.pwd)
97
- Utils.log "Compiling schema #{relative_path}..."
103
+ Utils.log "Compiling schema (id: #{id}, type: #{self.class}) => #{relative_path}"
98
104
  Metanorma::Compile.new.compile(
99
105
  filename_adoc,
100
106
  agree_to_terms: true,
101
- no_install_fonts: true
107
+ install_fonts: false
102
108
  )
103
- Utils.log "Compiling schema #{filename_adoc}...done!"
109
+ Utils.log "Compiling schema (id: #{id}, type: #{self.class}) => #{relative_path}... done!"
104
110
 
105
111
  # clean_artifacts
106
112
 
@@ -1,17 +1,19 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "express_schema"
4
- require_relative "schema_doc"
4
+ require_relative "schema_attachment"
5
+ require_relative "schema_document"
5
6
  require_relative "schema_config"
6
7
  require_relative "utils"
7
8
 
8
9
  module Suma
9
10
  class SchemaCollection
10
- attr_accessor :config, :schemas, :docs, :output_path_docs, :output_path_schemas
11
+ attr_accessor :config, :schemas, :docs, :output_path_docs, :output_path_schemas,
12
+ :manifest
11
13
 
12
- def initialize(config: nil, config_yaml: nil, output_path_docs: nil, output_path_schemas: nil)
13
- @schemas = []
14
- @docs = []
14
+ def initialize(config: nil, config_yaml: nil, output_path_docs: nil, output_path_schemas: nil, manifest: nil)
15
+ @schemas = {}
16
+ @docs = {}
15
17
  @schema_name_to_docs = {}
16
18
  @output_path_docs = if output_path_docs
17
19
  Pathname.new(output_path_docs).expand_path
@@ -30,34 +32,60 @@ module Suma
30
32
  SchemaConfig::Config.from_file(config_yaml)
31
33
  end
32
34
 
33
- return self unless @config
35
+ @manifest = manifest
36
+ end
37
+
38
+ def doc_from_schema_name(schema_name)
39
+ @schema_name_to_docs[schema_name]
40
+ end
34
41
 
35
- @config.schemas.each do |config_schema|
42
+ def process_schemas(schemas, klass)
43
+ schemas.each do |config_schema|
36
44
  s = ExpressSchema.new(
37
- path: config_schema.path,
38
- output_path: @output_path_schemas
45
+ id: config_schema.id,
46
+ path: config_schema.path.to_s,
47
+ output_path: @output_path_schemas.to_s
39
48
  )
40
- doc = SchemaDoc.new(
49
+
50
+ doc = klass.new(
41
51
  schema: s,
42
52
  output_path: @output_path_docs.join(s.id)
43
53
  )
44
- @docs << doc
45
- @schemas << s
54
+
55
+ @docs[s.id] = doc
56
+ @schemas[s.id] = s
46
57
  @schema_name_to_docs[s.id] = doc
47
58
  end
48
59
  end
49
60
 
50
- def doc_from_schema_name(schema_name)
51
- @schema_name_to_docs[schema_name]
61
+ def finalize
62
+ # Process each schema in @config.schemas
63
+ process_schemas(@config.schemas, SchemaAttachment)
64
+
65
+ manifest_entry = @manifest.lookup(:schemas_only, true)
66
+
67
+ manifest_entry.each do |entry|
68
+ next unless entry.schema_config
69
+
70
+ # Process each schema in entry.schema_config.schemas
71
+ process_schemas(entry.schema_config.schemas, SchemaDocument)
72
+ end
52
73
  end
53
74
 
54
75
  def compile
55
- schemas.map(&:save_exp)
76
+ finalize
77
+ schemas.each_pair do |schema_id, entry|
78
+ entry.save_exp
79
+ end
56
80
 
57
- docs.each(&:compile)
81
+ # DISABLING FOLLOWING CODE AS MISCONCEIVED. THE SCHEMA DOCUMENTS
82
+ # BELONG IN THE MAIN COLLECTION NOT HERE
83
+ docs.each_pair do |schema_id, entry|
84
+ entry.compile
85
+ end
58
86
 
59
87
  # TODO: make this parallel
60
- # puts "Starting Ractor processing"
88
+ # Utils.log"Starting Ractor processing"
61
89
  # pool = Ractor.new do
62
90
  # loop do
63
91
  # Ractor.yield(Ractor.receive)
@@ -67,7 +95,7 @@ module Suma
67
95
  # Ractor.new(pool, name: "r#{i}") do |p|
68
96
  # loop do
69
97
  # input = p.take
70
- # puts "compiling in ractor for #{input.filename_adoc}"
98
+ # Utils.log"compiling in ractor for #{input.filename_adoc}"
71
99
  # output_value = input.compile
72
100
  # Ractor.yield(output_value)
73
101
  # end
@@ -8,10 +8,10 @@ module Suma
8
8
  module SchemaConfig
9
9
  class Config < Shale::Mapper
10
10
  attribute :schemas, Schema, collection: true
11
- attr_accessor :base_path, :path
11
+ attribute :path, Shale::Type::String
12
12
 
13
- def initialize(path: nil, **args)
14
- @path = path
13
+ def initialize(**args)
14
+ @path = path_relative_to_absolute(path) if path
15
15
  super(**args)
16
16
  end
17
17
 
@@ -25,7 +25,7 @@ module Suma
25
25
 
26
26
  def self.from_file(path)
27
27
  from_yaml(File.read(path)).tap do |x|
28
- x.path = path
28
+ x.set_initial_path(path)
29
29
  end
30
30
  end
31
31
 
@@ -35,19 +35,61 @@ module Suma
35
35
  end
36
36
  end
37
37
 
38
+ def set_initial_path(new_path)
39
+ @path = path_relative_to_absolute(new_path)
40
+ schemas.each do |schema|
41
+ schema.path = path_relative_to_absolute(schema.path)
42
+ end
43
+ end
44
+
38
45
  def schemas_from_yaml(model, value)
39
46
  model.schemas = value.map do |k, v|
40
- Schema.new(id: k, path: v["path"])
47
+ Schema.new(id: k, path: path_relative_to_absolute(v["path"]))
41
48
  end
42
49
  end
43
50
 
51
+ # TODO: I can't get the relative path working. The schemas-*.yaml file is
52
+ # meant to contain the "path" key, which is a relative path to its
53
+ # location, then sets the base path to each schema path, which is supposed
54
+ # to be relative to "path" key. Somehow, the @path variable is always
55
+ # missing in to_yaml...
44
56
  def schemas_to_yaml(model, doc)
57
+ # puts "^"*30
58
+ # pp self
59
+ # pp @path
45
60
  doc["schemas"] = model.schemas.sort_by(&:id).to_h do |schema|
46
- [schema.id, { "path" => schema.path }]
61
+ [schema.id, { "path" => path_absolute_to_relative(schema.path) }]
47
62
  end
48
63
  end
49
64
 
65
+ def path_relative_to_absolute(relative_path)
66
+ eval_path = Pathname.new(relative_path)
67
+ return relative_path if eval_path.absolute?
68
+
69
+ # Or based on current working directory?
70
+ return relative_path unless @path
71
+
72
+ Pathname.new(File.dirname(@path)).join(eval_path).expand_path.to_s
73
+ end
74
+
75
+ def path_absolute_to_relative(absolute_path)
76
+ # puts "path_absolute_to_relative 1 #{absolute_path}"
77
+ # pp self
78
+ # pp path
79
+ # pp @hello
80
+ return absolute_path unless @path
81
+
82
+ relative_path = Pathname.new(absolute_path).relative_path_from(Pathname.new(@path).dirname).to_s
83
+ # puts "path_absolute_to_relative x #{relative_path}"
84
+ relative_path
85
+ end
86
+
50
87
  def update_path(new_path)
88
+ if @path.nil?
89
+ @path = new_path
90
+ return @path
91
+ end
92
+
51
93
  old_base_path = File.dirname(@path)
52
94
  new_base_path = File.dirname(new_path)
53
95
 
@@ -68,8 +110,8 @@ module Suma
68
110
  raise StandardError, "Can only concatenate a non SchemaConfig::Config object."
69
111
  end
70
112
 
71
- # We need to update the relative paths
72
- if path != another_config.path
113
+ # We need to update the relative paths when paths exist
114
+ if path && another_config.path && path != another_config.path
73
115
  new_config = another_config.dup
74
116
  new_config.update_path(path)
75
117
  end
@@ -7,6 +7,7 @@ module Suma
7
7
  class Schema < Shale::Mapper
8
8
  attribute :id, Shale::Type::String
9
9
  attribute :path, Shale::Type::String
10
+ # attribute :schemas_only, Shale::Type::Boolean
10
11
  end
11
12
  end
12
13
  end
@@ -0,0 +1,96 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "schema_attachment"
4
+
5
+ module Suma
6
+ class SchemaDocument < SchemaAttachment
7
+ def bookmark(anchor)
8
+ a = anchor.gsub(/\}\}/, ' | replace: "\", "-"}}')
9
+ "[[#{@id}.#{a}]]"
10
+ end
11
+
12
+ def schema_anchors
13
+ <<~HEREDOC
14
+ // _fund_cons.liquid
15
+ [[#{@id}_funds]]
16
+
17
+ // _constants.liquid
18
+ {% if schema.constants.size > 0 %}
19
+ #{bookmark("constants")}
20
+ {% for thing in schema.constants %}
21
+ #{bookmark("{{thing.id}}")}
22
+ {% endfor %}
23
+ {% endif %}
24
+
25
+ // _types.liquid
26
+ {% if schema.types.size > 0 %}
27
+ #{bookmark("types")}
28
+ // _type.liquid
29
+ {% for thing in schema.types %}
30
+ #{bookmark("{{thing.id}}")}
31
+ {% if thing.items.size > 0 %}
32
+ // _type_items.liquid
33
+ #{bookmark("{{thing.id}}.items")}
34
+ {% for item in thing.items %}
35
+ #{bookmark("{{thing.id}}.items.{{item.id}}")}
36
+ {% endfor %}
37
+ {% endif %}
38
+ {% endfor %}
39
+ {% endif %}
40
+
41
+ // _entities.liquid
42
+ {% if schema.entities.size > 0 %}
43
+ #{bookmark("entities")}
44
+ {% for thing in schema.entities %}
45
+ // _entity.liquid
46
+ #{bookmark("{{thing.id}}")}
47
+ {% endfor %}
48
+ {% endif %}
49
+ HEREDOC
50
+ end
51
+
52
+ # ////
53
+ # TODO:
54
+ # % render "templates/entities", schema: schema, schema_id: schema.id, things: schema.entities, thing_prefix: root_thing_prefix, depth: 2 %
55
+ #
56
+ # % render "templates/subtype_constraints", schema_id: schema.id, things: schema.subtype_constraints, thing_prefix: root_thing_prefix, depth: 2 %
57
+ #
58
+ # % render "templates/functions", schema_id: schema.id, things: schema.functions, thing_prefix: root_thing_prefix, depth: 2 %
59
+ #
60
+ # % render "templates/procedures", schema_id: schema.id, things: schema.procedures, thing_prefix: root_thing_prefix, depth: 2 %
61
+ #
62
+ # % render "templates/rules", schema_id: schema.id, things: schema.rules, thing_prefix: root_thing_prefix, depth: 2 %
63
+ # ////
64
+
65
+ def output_extensions
66
+ "xml"
67
+ end
68
+
69
+ # #.gsub(/[\n\r]{2,}/, '')
70
+ def to_adoc(path_to_schema_yaml)
71
+ <<~HEREDOC
72
+ = #{@schema.id}
73
+ :lutaml-express-index: schemas; #{path_to_schema_yaml};
74
+ :bare: true
75
+ :mn-document-class: iso
76
+ :mn-output-extensions: xml,html
77
+
78
+ [lutaml,schemas,context]
79
+ ----
80
+ {% for schema in context.schemas %}
81
+
82
+ [[#{@id}]]
83
+ [%unnumbered,type=express]
84
+ == #{@id} #{schema_anchors.gsub(%r{//[^\r\n]+}, "").gsub(/[\n\r]+/, "").gsub(/^[\n\r]/, "")}
85
+
86
+ [source%unnumbered]
87
+ --
88
+ {{ schema.formatted }}
89
+ --
90
+ {% endfor %}
91
+ ----
92
+
93
+ HEREDOC
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "shale"
4
+
5
+ module Suma
6
+ module SiteConfig
7
+ class SiteInfo < Shale::Mapper
8
+ attribute :organization, Shale::Type::String
9
+ attribute :name, Shale::Type::String
10
+ end
11
+
12
+ class Sources < Shale::Mapper
13
+ attribute :files, Shale::Type::String, collection: true
14
+ end
15
+
16
+ class Base < Shale::Mapper
17
+ attribute :source, Sources
18
+ attribute :collection, SiteInfo
19
+ end
20
+
21
+ class Config < Shale::Mapper
22
+ attribute :metanorma, Base
23
+
24
+ def self.from_file(path)
25
+ from_yaml(File.read(path))
26
+ end
27
+ end
28
+ end
29
+ end
data/lib/suma/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Suma
4
- VERSION = "0.1.0"
4
+ VERSION = "0.1.1"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: suma
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-06-07 00:00:00.000000000 Z
11
+ date: 2024-06-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: expressir
@@ -118,7 +118,8 @@ executables:
118
118
  extensions: []
119
119
  extra_rdoc_files: []
120
120
  files:
121
- - ".github/workflows/main.yml"
121
+ - ".github/workflows/rake.yml"
122
+ - ".github/workflows/release.yml"
122
123
  - ".gitignore"
123
124
  - ".rspec"
124
125
  - ".rubocop.yml"
@@ -131,16 +132,18 @@ files:
131
132
  - exe/suma
132
133
  - lib/suma.rb
133
134
  - lib/suma/cli.rb
135
+ - lib/suma/collection_config.rb
136
+ - lib/suma/collection_manifest.rb
134
137
  - lib/suma/express_schema.rb
135
138
  - lib/suma/processor.rb
139
+ - lib/suma/schema_attachment.rb
136
140
  - lib/suma/schema_collection.rb
137
141
  - lib/suma/schema_config.rb
138
142
  - lib/suma/schema_config/config.rb
139
143
  - lib/suma/schema_config/schema.rb
140
- - lib/suma/schema_doc.rb
144
+ - lib/suma/schema_document.rb
145
+ - lib/suma/site_config.rb
141
146
  - lib/suma/thor_ext.rb
142
- - lib/suma/to_replace/collection_config.rb
143
- - lib/suma/to_replace/site_config.rb
144
147
  - lib/suma/utils.rb
145
148
  - lib/suma/version.rb
146
149
  - sig/suma.rbs
@@ -149,7 +152,7 @@ homepage: https://github.com/metanorma/suma
149
152
  licenses:
150
153
  - BSD-2-Clause
151
154
  metadata: {}
152
- post_install_message:
155
+ post_install_message:
153
156
  rdoc_options: []
154
157
  require_paths:
155
158
  - lib
@@ -164,8 +167,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
164
167
  - !ruby/object:Gem::Version
165
168
  version: '0'
166
169
  requirements: []
167
- rubygems_version: 3.4.10
168
- signing_key:
170
+ rubygems_version: 3.3.27
171
+ signing_key:
169
172
  specification_version: 4
170
173
  summary: Utility for SUMA (STEP Unified Model-Based Standards Architecture)
171
174
  test_files: []
@@ -1,27 +0,0 @@
1
- name: Ruby
2
-
3
- on:
4
- push:
5
- branches:
6
- - main
7
-
8
- pull_request:
9
-
10
- jobs:
11
- build:
12
- runs-on: ubuntu-latest
13
- name: Ruby ${{ matrix.ruby }}
14
- strategy:
15
- matrix:
16
- ruby:
17
- - '3.2.2'
18
-
19
- steps:
20
- - uses: actions/checkout@v4
21
- - name: Set up Ruby
22
- uses: ruby/setup-ruby@v1
23
- with:
24
- ruby-version: ${{ matrix.ruby }}
25
- bundler-cache: true
26
- - name: Run the default task
27
- run: bundle exec rake
@@ -1,112 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "../utils"
4
- require "shale"
5
-
6
- module Suma
7
- module ToReplace
8
- module CollectionConfig
9
- class CompileOptions < Shale::Mapper
10
- attribute :no_install_fonts, Shale::Type::Boolean, default: -> { true }
11
- attribute :agree_to_terms, Shale::Type::Boolean, default: -> { true }
12
- end
13
-
14
- class BibdataTitle < Shale::Mapper
15
- attribute :language, Shale::Type::String
16
- attribute :content, Shale::Type::String
17
- end
18
-
19
- class BibdataDocid < Shale::Mapper
20
- attribute :type, Shale::Type::String
21
- attribute :id, Shale::Type::String
22
- end
23
-
24
- class BibdataContributor < Shale::Mapper
25
- attribute :name, Shale::Type::String
26
- attribute :abbreviation, Shale::Type::String
27
- end
28
-
29
- class BibdataCopyright < Shale::Mapper
30
- attribute :owner, BibdataContributor
31
- attribute :from, Shale::Type::String
32
- end
33
-
34
- class Bibdata < Shale::Mapper
35
- attribute :title, BibdataTitle, collection: true
36
- attribute :type, Shale::Type::String
37
- attribute :docid, BibdataDocid
38
- attribute :edition, Shale::Type::Integer
39
- attribute :copyright, BibdataCopyright
40
- end
41
-
42
- class ManifestItem < Shale::Mapper
43
- attribute :identifier, Shale::Type::String
44
- attribute :level, Shale::Type::String
45
- attribute :title, Shale::Type::String
46
- attribute :attachment, Shale::Type::Boolean
47
- attribute :sectionsplit, Shale::Type::Boolean
48
- attribute :file, Shale::Type::String
49
- attribute :docref, ManifestItem, collection: true
50
-
51
- yaml do
52
- map "identifier", to: :identifier
53
- map "level", to: :level
54
- map "title", to: :title
55
- map "attachment", to: :attachment
56
- map "sectionsplit", to: :sectionsplit
57
- map "file", to: :file
58
- map "fileref", to: :fileref
59
- map "docref", to: :docref
60
- map "fileref", using: { from: :fileref_from_yaml, to: :fileref_to_yaml }
61
- end
62
-
63
- def fileref_from_yaml(model, value)
64
- # Utils.log "model #{model}, value #{value}"
65
- # file_from_yaml(model, value)
66
- model.file ||= value
67
- end
68
-
69
- def fileref_to_yaml(_model, _doc)
70
- nil
71
- end
72
- end
73
-
74
- class Manifest < Shale::Mapper
75
- attribute :level, Shale::Type::String
76
- attribute :title, Shale::Type::String
77
- attribute :sectionsplit, Shale::Type::Boolean
78
- attribute :docref, ManifestItem, collection: true
79
-
80
- def attachments
81
- docref.detect do |ref|
82
- ref.level == "attachments"
83
- end&.docref
84
- end
85
-
86
- def documents
87
- docref.detect do |ref|
88
- ref.level == "document"
89
- end&.docref
90
- end
91
- end
92
-
93
- class Config < Shale::Mapper
94
- attr_accessor :path
95
-
96
- attribute :directives, Shale::Type::String, collection: true
97
- attribute :bibdata, Bibdata
98
- attribute :manifest, Manifest
99
- attribute :format, Shale::Type::String, collection: true, default: -> { [:html] }
100
- attribute :output_folder, Shale::Type::String
101
- attribute :coverpage, Shale::Type::String, default: -> { "cover.html" }
102
- attribute :compile, CompileOptions
103
- attribute :prefatory_content, Shale::Type::String
104
- attribute :final_content, Shale::Type::String
105
-
106
- def self.from_file(path)
107
- from_yaml(File.read(path))
108
- end
109
- end
110
- end
111
- end
112
- end
@@ -1,31 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "shale"
4
-
5
- module Suma
6
- module ToReplace
7
- module SiteConfig
8
- class SiteInfo < Shale::Mapper
9
- attribute :organization, Shale::Type::String
10
- attribute :name, Shale::Type::String
11
- end
12
-
13
- class Sources < Shale::Mapper
14
- attribute :files, Shale::Type::String, collection: true
15
- end
16
-
17
- class Base < Shale::Mapper
18
- attribute :source, Sources
19
- attribute :collection, SiteInfo
20
- end
21
-
22
- class Config < Shale::Mapper
23
- attribute :metanorma, Base
24
-
25
- def self.from_file(path)
26
- from_yaml(File.read(path))
27
- end
28
- end
29
- end
30
- end
31
- end