relaton-ccsds 1.14.0

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.
@@ -0,0 +1,49 @@
1
+ module RelatonCcsds
2
+ class BibliographicItem < RelatonBib::BibliographicItem
3
+ DOCTYPES = %w[standard practice report specification record].freeze
4
+
5
+ attr_reader :technology_area
6
+
7
+ # @param technology_area [String, nil]
8
+ def initialize(**args)
9
+ if args[:doctype] && !DOCTYPES.include?(args[:doctype])
10
+ Util.warn "WARNING: invalid doctype: #{args[:doctype]}"
11
+ end
12
+ @technology_area = args.delete(:technology_area)
13
+ super
14
+ end
15
+
16
+ #
17
+ # Fetch flavor schema version
18
+ #
19
+ # @return [String] schema version
20
+ #
21
+ def ext_schema
22
+ @ext_schema ||= schema_versions["relaton-model-ccsds"]
23
+ end
24
+
25
+ # @param builder [Nokogiri::XML::Builder]
26
+ def to_xml(**opts) # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
27
+ super do |builder|
28
+ if opts[:bibdata] && (doctype || editorialgroup || technology_area)
29
+ ext = builder.ext do |b|
30
+ b.doctype doctype if doctype
31
+ editorialgroup&.to_xml b
32
+ b.send(:"technology-area", technology_area) if technology_area
33
+ end
34
+ ext["schema-version"] = ext_schema if !opts[:embedded] && respond_to?(:ext_schema) && ext_schema
35
+ end
36
+ end
37
+ end
38
+
39
+ # @return [Hash]
40
+ def to_hash
41
+ hash = super
42
+ if technology_area
43
+ hash["ext"] ||= {}
44
+ hash["ext"]["technology_area"] = technology_area
45
+ end
46
+ hash
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,37 @@
1
+ module RelatonCcsds
2
+ module Bibliography
3
+ extend self
4
+
5
+ #
6
+ # Search for CCSDS standards by document reference.
7
+ #
8
+ # @param [String] ref document reference
9
+ #
10
+ # @return [RelatonCcsds::HitCollection] collection of hits
11
+ #
12
+ def search(ref)
13
+ RelatonCcsds::HitCollection.new(ref).fetch
14
+ end
15
+
16
+ #
17
+ # Get CCSDS standard by document reference.
18
+ #
19
+ # @param text [String]
20
+ # @param year [String, nil]
21
+ # @param opts [Hash]
22
+ #
23
+ # @return [RelatonCcsds::BibliographicItem]
24
+ #
25
+ def get(ref, _year = nil, _opts = {})
26
+ Util.warn "(#{ref}) fetching..."
27
+ hits = search ref
28
+ if hits.empty?
29
+ Util.warn "(#{ref}) not found."
30
+ return nil
31
+ end
32
+ doc = hits.first.doc
33
+ Util.warn "(#{ref}) found `#{hits.first.code}`."
34
+ doc
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,10 @@
1
+ module RelatonCcsds
2
+ module Config
3
+ include RelatonBib::Config
4
+ end
5
+ extend Config
6
+
7
+ class Configuration < RelatonBib::Configuration
8
+ PROGNAME = "relaton-ccsd".freeze
9
+ end
10
+ end
@@ -0,0 +1,102 @@
1
+ module RelatonCcsds
2
+ class DataFetcher
3
+ ACTIVE_PUBS_URL = <<~URL.freeze
4
+ https://public.ccsds.org/_api/web/lists/getbytitle('CCSDS%20Publications')/items?$top=1000&$select=Dcoument_x0020_Title,
5
+ Document_x0020_Number,Book_x0020_Type,Issue_x0020_Number,calPublishedMonth,calPublishedYear,Description0,Working_x0020_Group,
6
+ FileRef,ISO_x0020_Number,Patents,Extra_x0020_Link,Area,calActive,calHtmlColorCode&$filter=Book_x0020_Type%20eq%20%27Blue%20
7
+ Book%27%20or%20Book_x0020_Type%20eq%20%27Magenta%20Book%27%20or%20Book_x0020_Type%20eq%20%27Green%20Book%27%20or%20
8
+ Book_x0020_Type%20eq%20%27Orange%20Book%27%20or%20Book_x0020_Type%20eq%20%27Yellow%20Book%20-%20Reports%20and%20Records%27%20
9
+ or%20Book_x0020_Type%20eq%20%27Yellow%20Book%20-%20CCSDS%20Normative%20Procedures%27
10
+ URL
11
+
12
+ OBSOLETE_PUBS_URL = <<~URL.freeze
13
+ https://public.ccsds.org/_api/web/lists/getbytitle('CCSDS%20Publications')/items?$top=1000&$select=Dcoument_x0020_Title,
14
+ Document_x0020_Number,Book_x0020_Type,Issue_x0020_Number,calPublishedMonth,calPublishedYear,Description0,Working_x0020_Group,
15
+ FileRef,ISO_x0020_Number,Patents,Extra_x0020_Link,Area,calHtmlColorCode&$filter=Book_x0020_Type%20eq%20%27Silver%20Book%27
16
+ URL
17
+
18
+ def initialize(output, format)
19
+ @output = output
20
+ @format = format
21
+ @ext = format.sub "bibxml", "xml"
22
+ @files = []
23
+ end
24
+
25
+ def agent
26
+ return @agent if @agent
27
+
28
+ @agent = Mechanize.new
29
+ @agent.request_headers = { "Accept" => "application/json;odata=verbose" }
30
+ @agent
31
+ end
32
+
33
+ def index
34
+ @index ||= Relaton::Index.find_or_create "CCSDS", file: "index-v1.yaml"
35
+ end
36
+
37
+ def self.fetch(output: "data", format: "yaml")
38
+ t1 = Time.now
39
+ puts "Started at: #{t1}"
40
+ FileUtils.mkdir_p output
41
+ new(output, format).fetch
42
+ t2 = Time.now
43
+ puts "Stopped at: #{t2}"
44
+ puts "Done in: #{(t2 - t1).round} sec."
45
+ end
46
+
47
+ def fetch
48
+ fetch_docs ACTIVE_PUBS_URL
49
+ fetch_docs OBSOLETE_PUBS_URL, retired: true
50
+ index.save
51
+ end
52
+
53
+ def fetch_docs(url, retired: false)
54
+ resp = agent.get(url)
55
+ json = JSON.parse resp.body
56
+ @array = json["d"]["results"].map do |doc|
57
+ parse_and_save doc, json["d"]["results"], retired
58
+ end
59
+ end
60
+
61
+ def parse_and_save(doc, results, retired)
62
+ bibitem = DataParser.new(doc, results).parse
63
+ if retired
64
+ predecessor = DataParser.new(doc, results, bibitem).parse
65
+ save_bib predecessor
66
+ end
67
+ save_bib bibitem
68
+ end
69
+
70
+ def save_bib(bib)
71
+ id = bib.docidentifier.first.id
72
+ file = File.join @output, "#{id.gsub(/[.\s]+/, '-')}.#{@ext}"
73
+ if @files.include? file
74
+ puts "(#{file}) file already exists. Trying to merge links ..."
75
+ merge_links bib, file
76
+ else
77
+ @files << file
78
+ end
79
+ File.write file, content(bib), encoding: "UTF-8"
80
+ index.add_or_update id, file
81
+ end
82
+
83
+ def merge_links(bib, file) # rubocop:disable Metrics/AbcSize
84
+ hash = YAML.load_file file
85
+ bib2 = BibliographicItem.from_hash hash
86
+ if bib.link[0].type == bib2.link[0].type
87
+ warn "(#{file}) links are the same."
88
+ return
89
+ end
90
+ warn "(#{file}) links are merged."
91
+ bib.link << bib2.link[0]
92
+ end
93
+
94
+ def content(bib)
95
+ case @format
96
+ when "yaml" then bib.to_hash.to_yaml
97
+ when "xml" then bib.to_xml(bibdata: true)
98
+ else bib.send "to_#{@format}"
99
+ end
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,139 @@
1
+ module RelatonCcsds
2
+ class DataParser
3
+ DOCTYPES = { B: "standard", M: "practice", G: "report", O: "specification", Y: "record" }.freeze
4
+ DOMAIN = "https://public.ccsds.org".freeze
5
+
6
+ AREAS = {
7
+ "SEA" => "Systems Engineering Area",
8
+ "MOIMS" => "Mission Operations and Information Management Services Area",
9
+ "CSS" => "Cross Support Services Area",
10
+ "SOIS" => "Spacecraft Onboard Interface Services Area",
11
+ "SLS" => "Space Link Services Area",
12
+ "SIS" => "Space Internetworking Services Area",
13
+ }.freeze
14
+
15
+ ATTRS = %i[
16
+ title docid abstract doctype date docstatus link edition relation editorialgroup technology_area
17
+ ].freeze
18
+
19
+ ID_MAPPING = {
20
+ "CCSDS 320.0-B-1-S Corrigendum 1" => "CCSDS 320.0-B-1-S Cor. 1", # TODO relaton/relaton-data-ccsds#5
21
+ "CCSDS 701.00-R-3" => "CCSDS 701.00-R-3-S", # TODO relaton/relaton-data-ccsds#8
22
+ }.freeze
23
+
24
+ def initialize(doc, docs, successor = nil)
25
+ @doc = doc
26
+ @docs = docs
27
+ @successor = successor
28
+ end
29
+
30
+ def parse
31
+ args = ATTRS.each_with_object({}) { |a, o| o[a] = send "parse_#{a}" }
32
+ BibliographicItem.new(**args)
33
+ end
34
+
35
+ def parse_title
36
+ t = @doc["Dcoument_x0020_Title"]
37
+ [RelatonBib::TypedTitleString.new(content: t, language: "en", script: "Latn")]
38
+ end
39
+
40
+ def parse_docid
41
+ [RelatonBib::DocumentIdentifier.new(id: docidentifier, type: "CCSDS", primary: true)]
42
+ end
43
+
44
+ def docidentifier(id = nil)
45
+ id ||= @doc["Document_x0020_Number"].strip
46
+ docid = ID_MAPPING[id] || id
47
+ return docid unless @successor
48
+
49
+ docid.sub(/(-S|s)(?=\s|$)/, "")
50
+ end
51
+
52
+ def parse_abstract
53
+ a = @doc["Description0"]
54
+ [RelatonBib::FormattedString.new(content: a, language: "en", script: "Latn")]
55
+ end
56
+
57
+ def parse_doctype
58
+ /^CCSDS\s[\d.]+-(?<type>\w+)/ =~ @doc["Document_x0020_Number"]
59
+ DOCTYPES[type&.to_sym]
60
+ end
61
+
62
+ def parse_date
63
+ on = "#{@doc['calPublishedMonth']} #{@doc['calPublishedYear']}"
64
+ [RelatonBib::BibliographicDate.new(type: "published", on: on)]
65
+ end
66
+
67
+ def parse_docstatus
68
+ stage = @successor ? "withdrawn" : "published"
69
+ RelatonBib::DocumentStatus.new stage: stage
70
+ end
71
+
72
+ def parse_link
73
+ l = "#{DOMAIN}#{@doc['FileRef']}"
74
+ t = File.extname(@doc["FileRef"])&.sub(/^\./, "")
75
+ [RelatonBib::TypedUri.new(type: t, content: l)]
76
+ end
77
+
78
+ def parse_edition
79
+ @doc["Issue_x0020_Number"]
80
+ end
81
+
82
+ def parse_relation
83
+ @docs.each_with_object(successor + adopted) do |d, a|
84
+ id = docidentifier d["Document_x0020_Number"].strip
85
+ type = relaton_type id
86
+ next unless type
87
+
88
+ a << create_relation(type, id)
89
+ end
90
+ end
91
+
92
+ def adopted
93
+ return [] unless @doc["ISO_x0020_Number"]
94
+
95
+ code = @doc["ISO_x0020_Number"]["Description"].match(/(?<=\s)\d+$/)
96
+ id = "ISO #{code}"
97
+ [create_relation("adoptedAs", id)]
98
+ end
99
+
100
+ def successor
101
+ return [] unless @successor
102
+
103
+ @successor.relation << create_relation("successorOf", docidentifier)
104
+ [create_relation("hasSuccessor", @successor.docidentifier[0].id)]
105
+ end
106
+
107
+ def relaton_type(rel_id)
108
+ same = rel_id == docidentifier
109
+ if rel_id.include?(docidentifier) && !same
110
+ "hasEdition"
111
+ elsif docidentifier.include?(rel_id) && !same
112
+ "editionOf"
113
+ end
114
+ end
115
+
116
+ def create_relation(type, rel_id)
117
+ id = RelatonBib::DocumentIdentifier.new id: rel_id, type: "CCSDS", primary: true
118
+ fref = RelatonBib::FormattedRef.new content: rel_id
119
+ bibitem = RelatonBib::BibliographicItem.new docid: [id], formattedref: fref
120
+ RelatonBib::DocumentRelation.new type: type, bibitem: bibitem
121
+ end
122
+
123
+ def parse_editorialgroup
124
+ name = @doc.dig("Working_x0020_Group", "Description")
125
+ return unless name
126
+
127
+ wg = RelatonBib::WorkGroup.new name: name
128
+ tc = RelatonBib::TechnicalCommittee.new wg
129
+ RelatonBib::EditorialGroup.new([tc])
130
+ end
131
+
132
+ def parse_technology_area
133
+ desc = @doc.dig("Working_x0020_Group", "Description")
134
+ return unless desc
135
+
136
+ AREAS[desc.match(/^[A-Z]+(?=-)/)&.to_s]
137
+ end
138
+ end
139
+ end
@@ -0,0 +1,21 @@
1
+ module RelatonCcsds
2
+ class HashConverter < RelatonBib::HashConverter
3
+ class << self
4
+ # @param args [Hash]
5
+ # @return [Hash]
6
+ def hash_to_bib(args)
7
+ ret = super
8
+ return unless ret
9
+
10
+ ret[:technology_area] = ret[:ext][:technology_area] if ret[:ext]
11
+ ret
12
+ end
13
+
14
+ # @param item_hash [Hash]
15
+ # @return [RelatonCie::BibliographicItem]
16
+ def bib_item(item_hash)
17
+ BibliographicItem.new(**item_hash)
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ module RelatonCcsds
2
+ class Hit
3
+ attr_reader :code
4
+
5
+ def initialize(code:, url:)
6
+ @code = code
7
+ @url = url
8
+ end
9
+
10
+ def doc
11
+ return @doc if @doc
12
+
13
+ resp = Mechanize.new.get(@url)
14
+ hash = YAML.safe_load(resp.body)
15
+ hash["fetched"] = Date.today.to_s
16
+ @doc = BibliographicItem.from_hash(hash)
17
+ rescue Mechanize::Error => e
18
+ raise RelatonBib::RequestError, e.message
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,23 @@
1
+ module RelatonCcsds
2
+ class HitCollection < RelatonBib::HitCollection
3
+ GHURL = "https://raw.githubusercontent.com/relaton/relaton-data-ccsds/main/".freeze
4
+ INDEX_FILE = "index-v1.yaml".freeze
5
+
6
+ #
7
+ # Search his in index.
8
+ #
9
+ # @return [<Type>] <description>
10
+ #
11
+ def fetch
12
+ rows = index.search text
13
+ @array = rows.map { |row| Hit.new code: row[:id], url: "#{GHURL}#{row[:file]}" }
14
+ self
15
+ rescue SocketError, OpenURI::HTTPError, OpenSSL::SSL::SSLError, Errno::ECONNRESET => e
16
+ raise RelatonBib::RequestError, e.message
17
+ end
18
+
19
+ def index
20
+ @index ||= Relaton::Index.find_or_create :ccsds, url: "#{GHURL}index-v1.zip", file: INDEX_FILE
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,60 @@
1
+ require "relaton/processor"
2
+
3
+ module RelatonCcsds
4
+ class Processor < Relaton::Processor
5
+ attr_reader :idtype
6
+
7
+ def initialize # rubocop:disable Lint/MissingSuper
8
+ @short = :relaton_ccsds
9
+ @prefix = "CCSDS"
10
+ @defaultprefix = %r{^CCSDS(?!\w)}
11
+ @idtype = "CCSDS"
12
+ @datasets = %w[ccsds]
13
+ end
14
+
15
+ # @param code [String]
16
+ # @param date [String, NilClass] year
17
+ # @param opts [Hash]
18
+ # @return [RelatonCcsds::BibliographicItem]
19
+ def get(code, date, opts)
20
+ ::RelatonCcsds::Bibliography.get(code, date, opts)
21
+ end
22
+
23
+ #
24
+ # Fetch all the documents from a source
25
+ #
26
+ # @param [String] _source source name
27
+ # @param [Hash] opts
28
+ # @option opts [String] :output directory to output documents
29
+ # @option opts [String] :format
30
+ #
31
+ def fetch_data(_source, opts)
32
+ DataFetcher.fetch(**opts)
33
+ end
34
+
35
+ # @param xml [String]
36
+ # @return [RelatonCcsds::CcBibliographicItem]
37
+ def from_xml(xml)
38
+ ::RelatonCcsds::XMLParser.from_xml xml
39
+ end
40
+
41
+ # @param hash [Hash]
42
+ # @return [RelatonIsoBib::CcBibliographicItem]
43
+ def hash_to_bib(hash)
44
+ ::RelatonCcsds::BibliographicItem.from_hash hash
45
+ end
46
+
47
+ # Returns hash of XML grammar
48
+ # @return [String]
49
+ def grammar_hash
50
+ @grammar_hash ||= ::RelatonCcsds.grammar_hash
51
+ end
52
+
53
+ #
54
+ # Remove index file
55
+ #
56
+ def remove_index_file
57
+ Relaton::Index.find_or_create(:CC, url: true, file: HitCollection::INDEX_FILE).remove_file
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,9 @@
1
+ module RelatonCcsds
2
+ module Util
3
+ extend RelatonBib::Util
4
+
5
+ def self.logger
6
+ RelatonCcsds.configuration.logger
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RelatonCcsds
4
+ VERSION = "1.14.0"
5
+ end
@@ -0,0 +1,31 @@
1
+ module RelatonCcsds
2
+ class XMLParser < RelatonBib::XMLParser
3
+ class << self
4
+ private
5
+
6
+ #
7
+ # Parse bibitem data
8
+ #
9
+ # @param bibitem [Nokogiri::XML::Element] bibitem element
10
+ #
11
+ # @return [Hash] bibitem data
12
+ #
13
+ def item_data(doc)
14
+ resp = super
15
+ resp[:technology_area] = doc.at("./ext/technology-area")&.text
16
+ resp
17
+ end
18
+
19
+ #
20
+ # override RelatonBib::XMLParser#bib_item method
21
+ #
22
+ # @param item_hash [Hash]
23
+ #
24
+ # @return [RelatonCcsds::BibliographicItem]
25
+ #
26
+ def bib_item(item_hash)
27
+ BibliographicItem.new(**item_hash)
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "mechanize"
4
+ require "relaton_bib"
5
+ require "relaton/index"
6
+ require_relative "relaton_ccsds/version"
7
+ require_relative "relaton_ccsds/bibliographic_item"
8
+ require_relative "relaton_ccsds/config"
9
+ require_relative "relaton_ccsds/util"
10
+ require_relative "relaton_ccsds/bibliography"
11
+ require_relative "relaton_ccsds/hit"
12
+ require_relative "relaton_ccsds/hit_collection"
13
+ require_relative "relaton_ccsds/data_fetcher"
14
+ require_relative "relaton_ccsds/data_parser"
15
+ require_relative "relaton_ccsds/hash_converter"
16
+ require_relative "relaton_ccsds/xml_parser"
17
+
18
+ module RelatonCcsds
19
+ class Error < StandardError; end
20
+ # Your code goes here...
21
+
22
+ def self.grammar_hash
23
+ gem_path = File.expand_path "..", __dir__
24
+ grammars_path = File.join gem_path, "grammars", "*"
25
+ grammars = Dir[grammars_path].sort.map { |gp| File.read gp }.join
26
+ Digest::MD5.hexdigest grammars
27
+ end
28
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "lib/relaton_ccsds/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "relaton-ccsds"
7
+ spec.version = RelatonCcsds::VERSION
8
+ spec.authors = ["Ribose Inc."]
9
+ spec.email = ["open.source@ribose.com"]
10
+
11
+ spec.summary = "RelatonCcsds: retrive www.ccsds.org Standards"
12
+ spec.description = "RelatonCcsds: retrive www.ccsds.org Standards"
13
+ spec.homepage = "https://github.com/metanorma/relaton-ccsds"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
17
+ `git ls-files -z`.split("\x0").reject do |f|
18
+ f.match(%r{^(test|spec|features)/})
19
+ end
20
+ end
21
+ spec.bindir = "exe"
22
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
23
+ spec.require_paths = ["lib"]
24
+ spec.required_ruby_version = ">= 2.7.0"
25
+
26
+ # Uncomment to register a new dependency of your gem
27
+ spec.add_dependency "mechanize", "~> 2.7"
28
+ spec.add_dependency "relaton-bib", "~> 1.14.13"
29
+ spec.add_dependency "relaton-index", "~> 0.2.0"
30
+
31
+ # For more information and examples about making a new gem, check out our
32
+ # guide at: https://bundler.io/guides/creating_gem.html
33
+ end
metadata ADDED
@@ -0,0 +1,114 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: relaton-ccsds
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.14.0
5
+ platform: ruby
6
+ authors:
7
+ - Ribose Inc.
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2023-08-26 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: mechanize
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.7'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2.7'
27
+ - !ruby/object:Gem::Dependency
28
+ name: relaton-bib
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 1.14.13
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 1.14.13
41
+ - !ruby/object:Gem::Dependency
42
+ name: relaton-index
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 0.2.0
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 0.2.0
55
+ description: 'RelatonCcsds: retrive www.ccsds.org Standards'
56
+ email:
57
+ - open.source@ribose.com
58
+ executables: []
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - ".github/workflows/rake.yml"
63
+ - ".github/workflows/release.yml"
64
+ - ".gitignore"
65
+ - ".rspec"
66
+ - ".rubocop.yml"
67
+ - ".vscode/launch.json"
68
+ - Gemfile
69
+ - README.adoc
70
+ - Rakefile
71
+ - bin/console
72
+ - bin/rspec
73
+ - bin/setup
74
+ - grammars/basicdoc.rng
75
+ - grammars/biblio-standoc.rng
76
+ - grammars/biblio.rng
77
+ - lib/relaton_ccsds.rb
78
+ - lib/relaton_ccsds/bibliographic_item.rb
79
+ - lib/relaton_ccsds/bibliography.rb
80
+ - lib/relaton_ccsds/config.rb
81
+ - lib/relaton_ccsds/data_fetcher.rb
82
+ - lib/relaton_ccsds/data_parser.rb
83
+ - lib/relaton_ccsds/hash_converter.rb
84
+ - lib/relaton_ccsds/hit.rb
85
+ - lib/relaton_ccsds/hit_collection.rb
86
+ - lib/relaton_ccsds/processor.rb
87
+ - lib/relaton_ccsds/util.rb
88
+ - lib/relaton_ccsds/version.rb
89
+ - lib/relaton_ccsds/xml_parser.rb
90
+ - relaton_ccsds.gemspec
91
+ homepage: https://github.com/metanorma/relaton-ccsds
92
+ licenses:
93
+ - MIT
94
+ metadata: {}
95
+ post_install_message:
96
+ rdoc_options: []
97
+ require_paths:
98
+ - lib
99
+ required_ruby_version: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: 2.7.0
104
+ required_rubygems_version: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - ">="
107
+ - !ruby/object:Gem::Version
108
+ version: '0'
109
+ requirements: []
110
+ rubygems_version: 3.3.26
111
+ signing_key:
112
+ specification_version: 4
113
+ summary: 'RelatonCcsds: retrive www.ccsds.org Standards'
114
+ test_files: []