tc211-termbase 0.2.1 → 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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2a232b33a8293be27f9fac20557b959345339a8835faa56cf31cbf75df849ac3
4
- data.tar.gz: b8baf017786cd822b711816e2e015c7b5b5e4e63bd01b6b34d81eb4806974932
3
+ metadata.gz: 423950f471ef5d9c689a3542150d988fc997489a12b4ffe3668520d84bf6561f
4
+ data.tar.gz: f32b9f74dd1bb3310338785e58eb3488ba88656fa859fc3816e4615d9bad65a1
5
5
  SHA512:
6
- metadata.gz: 432adaba8dea3489f330e15d1e58a28c1843b936a944d6d86d5602401ccaf82f840f9646e64e6eecd88eb8ab289f23b30df68b244406da5227eff7aaa9fa1afe
7
- data.tar.gz: 7579e6eecf194ec07063a6e6e13b79edec56a9baaba0c066d1e3aa84abb58126560cc48a861401acb4ae8f518bf442f60bfe484c00e6fc4fbbc5fa8931a82a1a
6
+ metadata.gz: d4bb9c3b774042e3fe3674d30f1eb8211be2e0ac26f4834ee53646056d0b2fae276f9011776df5e7c36eae2bc450dda178ec32d03d0db9336eff50a55d16dd02
7
+ data.tar.gz: 2dd00314060b0984f353112988ecf931310ab41f8b9a2737a5e9e55fcc8756f321a24085a7823fb3dd3a6e00c1c7357b84b4abe26bcc2741b2f38f78bb22d063
@@ -0,0 +1,13 @@
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: geolexica/ci/.github/workflows/rake.yml@main
@@ -0,0 +1,23 @@
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
+ required: true
12
+ default: 'skip'
13
+ repository_dispatch:
14
+ types: [ do-release ]
15
+
16
+
17
+ jobs:
18
+ release:
19
+ uses: geolexica/ci/.github/workflows/release.yml@main
20
+ with:
21
+ next_version: ${{ github.event.inputs.next_version }}
22
+ secrets:
23
+ rubygems-api-key: ${{ secrets.GEOLEXICA_RUBYGEMS_API_KEY }}
data/.gitignore CHANGED
@@ -12,4 +12,6 @@
12
12
  .rspec_status
13
13
  .vscode/
14
14
  concepts/
15
- termbase.yaml
15
+ /termbase.yaml
16
+ /termbase.meta.yaml
17
+ /Gemfile.lock
@@ -63,15 +63,12 @@ end
63
63
 
64
64
  # collection[1206].inspect
65
65
 
66
- collection.to_file(File.join(output_dir, Pathname.new(filepath).basename.sub_ext(".yaml")))
67
-
68
66
  collection_output_dir = File.join(output_dir, "concepts")
69
67
 
70
68
  FileUtils.mkdir_p(collection_output_dir)
71
69
 
72
- collection.keys.each do |id|
73
- collection[id].to_file(File.join(collection_output_dir, "concept-#{id}.yaml"))
74
- end
70
+ concept_collection = collection.to_concept_collection
71
+ concept_collection.save_to_files(collection_output_dir)
75
72
 
76
73
  # french = workbook.language_sheet("French")
77
74
  # french.sections[3].structure
@@ -1,56 +1,105 @@
1
1
  module Tc211::Termbase
2
+ class Concept < Hash
3
+ attr_reader :id
2
4
 
3
- class Concept < Hash
4
- attr_accessor :id
5
- attr_accessor :terms
6
- DEFAULT_LANGUAGE = "eng"
5
+ DEFAULT_LANGUAGE = "eng".freeze
7
6
 
8
- def initialize(options={})
9
- terms = options.delete(:terms) || []
10
- terms.each do |term|
11
- add_term(term)
7
+ def initialize(options = {})
8
+ super
9
+
10
+ terms = options.delete(:terms) || []
11
+ terms.each do |term|
12
+ add_term(term)
13
+ end
14
+
15
+ options.each_pair do |k, v|
16
+ send("#{k}=", v)
17
+ end
12
18
  end
13
19
 
14
- options.each_pair do |k,v|
15
- self.send("#{k}=", v)
20
+ # The concept id should ALWAYS be an integer.
21
+ # https://github.com/riboseinc/tc211-termbase/issues/1
22
+ def id=(newid)
23
+ @id = Integer(newid)
16
24
  end
17
- end
18
25
 
19
- # The concept id should ALWAYS be an integer.
20
- # https://github.com/riboseinc/tc211-termbase/issues/1
21
- def id=(newid)
22
- @id = Integer(newid)
23
- end
26
+ def add_term(term)
27
+ self[term.language_code] = term
28
+ end
24
29
 
25
- def add_term(term)
26
- self[term.language_code] = term
27
- end
30
+ def terms
31
+ values
32
+ end
28
33
 
29
- def default_term
30
- if self[DEFAULT_LANGUAGE]
31
- self[DEFAULT_LANGUAGE]
32
- else
33
- puts "[tc211-termbase] term (lang: #{keys.first}, ID: #{id}) is missing a corresponding English term, probably needs updating."
34
- self[keys.first]
34
+ def default_term
35
+ if self[DEFAULT_LANGUAGE]
36
+ self[DEFAULT_LANGUAGE]
37
+ else
38
+ puts "[tc211-termbase] term (lang: #{keys.first}, ID: #{id}) is \
39
+ missing a corresponding English term, probably needs updating."
40
+ self[keys.first]
41
+ end
35
42
  end
36
- end
37
43
 
38
- def to_hash
39
- default_hash = {
40
- "term" => default_term.term,
41
- "termid" => id
42
- }
44
+ def to_hash
45
+ default_hash = {
46
+ "term" => default_term.term,
47
+ "termid" => id,
48
+ }
43
49
 
44
- self.inject(default_hash) do |acc, (lang, term)|
45
- acc.merge!(lang => term.to_hash)
50
+ inject(default_hash) do |acc, (lang, term)|
51
+ acc.merge!(lang => term.to_hash)
52
+ end
46
53
  end
47
- end
48
54
 
49
- def to_file(filename)
50
- File.open(filename,"w") do |file|
51
- file.write(to_hash.to_yaml)
55
+ def to_file(filename)
56
+ File.open(filename, "w") do |file|
57
+ file.write(to_hash.to_yaml)
58
+ end
52
59
  end
53
- end
54
60
 
61
+ def to_glossarist_concept
62
+ concept = Glossarist::ManagedConcept.new(data: { id: id.to_s })
63
+
64
+ localized_concepts = []
65
+
66
+ terms.map do |term|
67
+ next if term.nil?
68
+
69
+ localized_concepts << term.to_localized_concept_hash
70
+ end
71
+
72
+ concept.localized_concepts = localized_concepts
73
+
74
+ concept
75
+ end
76
+ end
55
77
  end
56
- end
78
+
79
+ # term: abbreviation
80
+ # termid: 2
81
+ # eng:
82
+ # id: 2
83
+ # term: abbreviation
84
+ # definition: designation formed by omitting words or letters from a longer
85
+ # form and designating the same concept
86
+ # language_code: eng
87
+ # notes: []
88
+ # examples: []
89
+ # entry_status: valid
90
+ # classification: preferred
91
+ # authoritative_source:
92
+ # ref: ISO 1087-1:2000
93
+ # clause: 3.4.9
94
+ # link: https://www.iso.org/standard/20057.html
95
+ # lineage_source: ISO/TS 19104:2008
96
+ # lineage_source_similarity: 1
97
+ # date_accepted: 2008-11-15 00:00:00.000000000 +08:00
98
+ # review_date: 2013-01-29 00:00:00.000000000 +08:00
99
+ # review_status: final
100
+ # review_decision: accepted
101
+ # review_decision_date: 2016-10-01 00:00:00.000000000 +08:00
102
+ # review_decision_event: Publication of ISO 19104:2016
103
+ # review_decision_notes: Authoritative reference changed from ISO 1087-1:2000
104
+ # to ISO 1087-1:2000, 3.4.9. Lineage source added as ISO/TS 19104:2008
105
+ # release: '2'
@@ -1,32 +1,40 @@
1
1
  require_relative "concept"
2
2
 
3
3
  module Tc211::Termbase
4
+ class ConceptCollection < Hash
5
+ def add_term(term)
6
+ if self[term.id]
7
+ self[term.id].add_term(term)
8
+ else
9
+ self[term.id] = Concept.new(
10
+ id: term.id,
11
+ terms: [term],
12
+ )
13
+ end
14
+ end
4
15
 
5
- class ConceptCollection < Hash
6
-
7
- def add_term(term)
8
- if self[term.id]
9
- self[term.id].add_term(term)
10
- else
11
- self[term.id] = Concept.new(
12
- id: term.id,
13
- terms: [term]
14
- )
16
+ def to_hash
17
+ inject({}) do |acc, (id, concept)|
18
+ acc.merge!(id => concept.to_hash)
19
+ end
15
20
  end
16
- end
17
21
 
18
- def to_hash
19
- self.inject({}) do |acc, (id, concept)|
20
- acc.merge!(id => concept.to_hash)
22
+ def to_file(filename)
23
+ File.open(filename, "w") do |file|
24
+ file.write(to_hash.to_yaml)
25
+ end
21
26
  end
22
- end
23
27
 
24
- def to_file(filename)
25
- File.open(filename,"w") do |file|
26
- file.write(to_hash.to_yaml)
28
+ def to_concept_collection
29
+ collection = Glossarist::ManagedConceptCollection.new
30
+
31
+ values.each do |term_concept|
32
+ next if term_concept.nil?
33
+
34
+ collection.store(term_concept.to_glossarist_concept)
35
+ end
36
+
37
+ collection
27
38
  end
28
39
  end
29
-
30
40
  end
31
-
32
- end
@@ -1,22 +1,18 @@
1
1
  require_relative "terminology_sheet"
2
2
 
3
3
  module Tc211::Termbase
4
+ class InformationSheet < TerminologySheet
5
+ def metadata_section
6
+ sheet_array = @sheet.simple_rows.to_a
7
+ MetadataSection.new(sheet_array)
8
+ end
4
9
 
5
- class InformationSheet < TerminologySheet
10
+ def to_hash
11
+ { "glossary" => metadata_section.to_hash }
12
+ end
6
13
 
7
- def metadata_section
8
- sheet_array = @sheet.simple_rows.to_a
9
- section = MetadataSection.new(sheet_array)
14
+ def to_yaml
15
+ to_hash.to_yaml
16
+ end
10
17
  end
11
-
12
- def to_hash
13
- { "glossary" => metadata_section.to_hash }
14
- end
15
-
16
- def to_yaml
17
- to_hash.to_yaml
18
- end
19
-
20
18
  end
21
-
22
- end
@@ -1,136 +1,132 @@
1
1
  require_relative "sheet_section"
2
2
 
3
3
  module Tc211::Termbase
4
+ class MetadataSection < SheetSection
5
+ attr_accessor :header_row
6
+ attr_writer :attributes
7
+
8
+ GLOSSARY_HEADER_ROW_MATCH = {
9
+ # "English" uses "".
10
+ # "Arabic" uses "A".
11
+ # This is fixed in the MLGT as of 2018 Aug 6.
12
+ "A" => [nil, "Item", "A"],
13
+
14
+ "C" => ["Data Type"],
15
+ "D" => ["Special Instruction"],
16
+
17
+ # "Malay" has it empty ("")
18
+ # This is fixed in the MLGT as of 2018 Aug 6.
19
+ "E" => ["ISO 19135 Class.attribute", nil],
20
+
21
+ "F" => ["Domain"],
22
+ }.freeze
23
+
24
+ GLOSSARY_ROW_KEY_MAP = {
25
+ "A" => "name",
26
+ "B" => "value",
27
+ "C" => "datatype",
28
+ "D" => "special-instruction",
29
+ "E" => "19135-class-attribute",
30
+ "F" => "value-domain",
31
+ }.freeze
32
+
33
+ def initialize(rows, options = {})
34
+ super
35
+
36
+ self.class.match_header(@rows[0])
37
+ @header_row = @rows[0]
38
+ @body_rows = @rows[1..-1]
39
+ attributes
40
+ self
41
+ end
4
42
 
5
- class MetadataSection < SheetSection
6
- attr_accessor :header_row
7
- attr_accessor :attributes
8
-
9
- GLOSSARY_HEADER_ROW_MATCH = {
10
- # "English" uses "".
11
- # "Arabic" uses "A".
12
- # This is fixed in the MLGT as of 2018 Aug 6.
13
- "A" => [nil, "Item", "A"],
14
-
15
- "C" => ["Data Type"],
16
- "D" => ["Special Instruction"],
17
-
18
- # "Malay" has it empty ("")
19
- # This is fixed in the MLGT as of 2018 Aug 6.
20
- "E" => ["ISO 19135 Class.attribute", nil],
21
-
22
- "F" => ["Domain"]
23
- }
24
-
25
- GLOSSARY_ROW_KEY_MAP = {
26
- "A" => "name",
27
- "B" => "value",
28
- "C" => "datatype",
29
- "D" => "special-instruction",
30
- "E" => "19135-class-attribute",
31
- "F" => "value-domain"
32
- }
33
-
34
- def initialize(rows, options={})
35
- super
36
-
37
- self.class.match_header(@rows[0])
38
- @header_row = @rows[0]
39
- @body_rows = @rows[1..-1]
40
- attributes
41
- self
42
- end
43
-
44
- def self.match_header(columns)
45
- # puts "row #{row}"
46
- columns.each do |key, value|
47
- # puts "#{key}, #{value}"
48
- if GLOSSARY_HEADER_ROW_MATCH[key]
49
- unless GLOSSARY_HEADER_ROW_MATCH[key].include?(value)
50
- raise RowHeaderMatchError.new("Metadata section header for column `#{key}` does not match expected value `#{value}`")
43
+ def self.match_header(columns)
44
+ # puts "row #{row}"
45
+ columns.each do |key, value|
46
+ # puts "#{key}, #{value}"
47
+ header_row_match = GLOSSARY_HEADER_ROW_MATCH[key]
48
+ if header_row_match && !header_row_match.include?(value)
49
+ raise RowHeaderMatchError.new(
50
+ "Metadata section header for column `#{key}` does not match \
51
+ expected value `#{value}`",
52
+ )
51
53
  end
52
54
  end
53
55
  end
54
- end
55
-
56
56
 
57
- def structure
58
- GLOSSARY_ROW_KEY_MAP
59
- end
57
+ def structure
58
+ GLOSSARY_ROW_KEY_MAP
59
+ end
60
60
 
61
- def clean_key(k)
62
- k.strip.
63
- downcase.
64
- gsub(/[()]/,"").
65
- gsub(' ', '-')
66
- end
61
+ def clean_key(key)
62
+ key.strip
63
+ .downcase
64
+ .gsub(/[()]/, "")
65
+ .gsub(" ", "-")
66
+ end
67
67
 
68
- def clean_value(v)
69
- return nil if v.nil?
68
+ def clean_value(value)
69
+ return nil if value.nil?
70
70
 
71
- case v
72
- when String
73
- v.strip
74
- else
75
- v
71
+ case value
72
+ when String
73
+ value.strip
74
+ else
75
+ value
76
+ end
76
77
  end
77
- end
78
78
 
79
- def parse_row(row)
80
- return nil if row.empty?
81
- attribute = {}
79
+ def parse_row(row)
80
+ return nil if row.empty?
82
81
 
83
- structure.each_pair do |key, value|
84
- # puts"#{key}, #{value}, #{row[key]}"
85
- attribute_key = clean_key(value)
86
- attribute_value = clean_value(row[key])
87
- next if attribute_value.nil?
88
- attribute[attribute_key] = attribute_value
89
- end
82
+ attribute = {}
90
83
 
91
- # TODO: "Chinese" name is empty!
92
- key = clean_key(attribute["name"] || "(empty)")
84
+ structure.each_pair do |key, value|
85
+ attribute_value = clean_value(row[key])
86
+ next if attribute_value.nil?
93
87
 
94
- { key => attribute }
95
- end
88
+ attribute[clean_key(value)] = attribute_value
89
+ end
96
90
 
97
- def attributes
98
- return @attributes if @attributes
91
+ # TODO: "Chinese" name is empty!
92
+ key = clean_key(attribute["name"] || "(empty)")
99
93
 
100
- @attributes = {}
101
- @body_rows.each do |row|
102
- result = parse_row(row)
103
- @attributes.merge!(result) if result
94
+ { key => attribute }
104
95
  end
105
- @attributes
106
- end
107
96
 
108
- def fields
109
-
110
- # "operating-language-country"=>
111
- # {"name"=>"Operating Language Country",
112
- # "value"=>"410",
113
- # "datatype"=>"Country Code",
114
- # "special-instruction"=>
115
- # "ftp.ics.uci.edu/pub/ietf/http/related/iso3166.txt",
116
- # "19135-class-attribute"=>"RE_Register.operatingLanguage",
117
- # "value-domain"=>
118
- # "<<Data Type>>RE_Locale.country \n" +
119
- # "[ISO 3166-1 3-character numeric country code]"},
120
- #
121
-
122
- attributes.inject({}) do |acc, (k, v)|
123
- acc.merge({
124
- k => v["value"]
125
- })
97
+ def attributes
98
+ return @attributes if @attributes
99
+
100
+ @attributes = {}
101
+ @body_rows.each do |row|
102
+ result = parse_row(row)
103
+ @attributes.merge!(result) if result
104
+ end
105
+ @attributes
126
106
  end
127
- end
128
107
 
129
- def to_hash
130
- {
131
- "metadata" => fields
132
- }
133
- end
108
+ def fields
109
+ # "operating-language-country"=>
110
+ # {"name"=>"Operating Language Country",
111
+ # "value"=>"410",
112
+ # "datatype"=>"Country Code",
113
+ # "special-instruction"=>
114
+ # "ftp.ics.uci.edu/pub/ietf/http/related/iso3166.txt",
115
+ # "19135-class-attribute"=>"RE_Register.operatingLanguage",
116
+ # "value-domain"=>
117
+ # "<<Data Type>>RE_Locale.country \n" +
118
+ # "[ISO 3166-1 3-character numeric country code]"},
119
+ #
120
+
121
+ attributes.inject({}) do |acc, (k, v)|
122
+ acc.merge({ k => v["value"] })
123
+ end
124
+ end
134
125
 
135
- end
126
+ def to_hash
127
+ {
128
+ "metadata" => fields,
129
+ }
130
+ end
131
+ end
136
132
  end
@@ -1,30 +1,29 @@
1
1
 
2
2
  module Tc211::Termbase
3
+ class SheetSection
3
4
 
4
- class SheetSection
5
+ class RowHeaderMatchError < StandardError; end
5
6
 
6
- class RowHeaderMatchError < StandardError; end
7
- class UnknownHeaderError < StandardError; end
7
+ class UnknownHeaderError < StandardError; end
8
8
 
9
- attr_accessor :sheet_content
9
+ attr_accessor :sheet_content
10
10
 
11
- def initialize(rows, options={})
12
- # rows is an array of rows!
13
- raise unless rows.is_a?(Array)
14
- @rows = rows
15
- # @has_header = options[:has_header].nil? ? true : options[:has_header]
16
- self
17
- end
11
+ def initialize(rows, _options = {})
12
+ # rows is an array of rows!
13
+ raise unless rows.is_a?(Array)
18
14
 
19
- # Abstract method
20
- def self.match_header(row)
21
- false
22
- end
15
+ @rows = rows
16
+ # @has_header = options[:has_header].nil? ? true : options[:has_header]
17
+ self
18
+ end
23
19
 
24
- def self.identify_type(row)
20
+ # Abstract method
21
+ def self.match_header(_row)
22
+ false
23
+ end
25
24
 
26
- end
25
+ def self.identify_type(_row); end
27
26
 
28
- # TODO
27
+ # TODO
28
+ end
29
29
  end
30
- end