relaton-ccsds 1.16.1 → 1.16.2

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: bb70be3294be3ba408274ff671392077b6be402928798bdf42be8a445d26f281
4
- data.tar.gz: 64c27dfa9fb804c04e9a4381a68001e18d85af4e467162380ab289db234ad3ef
3
+ metadata.gz: caadca5cd377ef986fe543832065034345b663edd712f6fcee97d532c5b85203
4
+ data.tar.gz: 248abeac8b28b415dd153ea230ff22613ef29a784b0cbadd11921d76bc5901a7
5
5
  SHA512:
6
- metadata.gz: b33be383d1200e0a976a5d3c48a296cd957314baf342299e712ea7e606eb23d123e91a08dcd3a6b0c17f808ac156e8a97352413900c34281e29a784ad8768625
7
- data.tar.gz: 8fb7ee5bf02d2b3590cc2b9badb9f0e5a7de8da197d055936f8611158ca772af7d3b3c9f53f1eb6c3a0b3fac7583647875f37e77ef7b03cfdfa521f3d3be720e
6
+ metadata.gz: bbbcb5e1724786a88d157c84da7a15ee96ce2b16a9bf89cfe9087537b702b441d4c48fac49c1d7c88ab484778af8ee4c9c7d92c2ebd94eb44e15e60c9ca6826e
7
+ data.tar.gz: db36ad93abee600eaddf8701add8dc803b9ecfc480a61dc68dc2aeb275ebf605a5fe03a15e3953418a7a28412f608f4b77b450ff93569af6fbae99ee2fe7c4b0
data/.gitignore CHANGED
@@ -7,6 +7,7 @@
7
7
  /spec/reports/
8
8
  /tmp/
9
9
  /vendor/
10
+ .vscode/
10
11
 
11
12
  # rspec failure tracking
12
13
  .rspec_status
data/README.adoc CHANGED
@@ -23,17 +23,28 @@ Or install it yourself as:
23
23
 
24
24
  == Usage
25
25
 
26
- === Search for a standard using keywords
26
+ === Configuration
27
+
28
+ Configuration is optional. The available option is `logger` which is a `Logger` instance. By default, the logger is `Logger.new($stderr)` with `Logger::WARN` level. To change the logger level, use `RelatonCcsds.configure` block.
27
29
 
28
30
  [source,ruby]
29
31
  ----
30
32
  require 'relaton_ccsds'
31
33
  => true
32
34
 
35
+ RelatonCcsds.configure do |config|
36
+ config.logger.level = Logger::DEBUG
37
+ end
38
+ ----
39
+
40
+ === Search for a standard using keywords
41
+
42
+ [source,ruby]
43
+ ----
33
44
  hits = RelatonCcsds::Bibliography.search("CCSDS 230.2-G-1")
34
45
  => <RelatonCcsds::HitCollection:0x00000000001770 @ref=CCSDS 230.2-G-1 @fetched=false>
35
46
 
36
- item = hits[0].fetch
47
+ item = hits[0].doc
37
48
  => #<RelatonCcsds::BibliographicItem:0x00000001135f6540
38
49
  ...
39
50
  ----
@@ -83,7 +94,7 @@ item.link
83
94
  @script=nil,
84
95
  @type="pdf">]
85
96
 
86
- RelatonCcsds::Bibliography.get("CCSDS 720.6-Y-1").link
97
+ RelatonCcsds::Bibliography.get("CCSDS 720.6-Y-1").link
87
98
  [relaton-ccsd] (CCSDS 720.6-Y-1) fetching...
88
99
  [relaton-ccsd] (CCSDS 720.6-Y-1) found `CCSDS 720.6-Y-1`.
89
100
  => [#<RelatonBib::TypedUri:0x0000000114183bb0
@@ -108,6 +119,41 @@ RelatonCcsds::Bibliography.get("CCSDS 230.2-G-1")
108
119
  ...
109
120
  ----
110
121
 
122
+ === Get specific format
123
+
124
+ [source,ruby]
125
+ ----
126
+ item = RelatonCcsds::Bibliography.get("CCSDS 720.4-Y-1 (DOC)")
127
+ [relaton-ccsd] (CCSDS 720.4-Y-1 (DOC)) fetching...
128
+ [relaton-ccsd] (CCSDS 720.4-Y-1 (DOC)) found `CCSDS 720.4-Y-1`.
129
+ => #<RelatonCcsds::BibliographicItem:0x000000011100dfe0
130
+ ...
131
+
132
+ item.link.size
133
+ => 1
134
+
135
+ item.link[0].type
136
+ => "doc"
137
+
138
+ pry(main)> item.link[0].content.to_s
139
+ => "https://public.ccsds.org/Pubs/720x4y1.doc"
140
+
141
+ item = RelatonCcsds::Bibliography.get("CCSDS 720.4-Y-1 (PDF)")
142
+ [relaton-ccsd] (CCSDS 720.4-Y-1 (PDF)) fetching...
143
+ [relaton-ccsd] (CCSDS 720.4-Y-1 (PDF)) found `CCSDS 720.4-Y-1`.
144
+ => #<RelatonCcsds::BibliographicItem:0x0000000111004620
145
+ ...
146
+
147
+ item.link.size
148
+ => 1
149
+
150
+ item.link[0].type
151
+ => "pdf"
152
+
153
+ item.link[0].content.to_s
154
+ => "https://public.ccsds.org/Pubs/720x4y1.pdf"
155
+ ----
156
+
111
157
  === Create bibliographic item from XML
112
158
  [source,ruby]
113
159
  ----
@@ -7,7 +7,7 @@ module RelatonCcsds
7
7
  # @param technology_area [String, nil]
8
8
  def initialize(**args)
9
9
  if args[:doctype] && !DOCTYPES.include?(args[:doctype])
10
- Util.warn "WARNING: invalid doctype: #{args[:doctype]}"
10
+ Util.warn "WARNING: invalid doctype: `#{args[:doctype]}`"
11
11
  end
12
12
  @technology_area = args.delete(:technology_area)
13
13
  super
@@ -45,5 +45,13 @@ module RelatonCcsds
45
45
  end
46
46
  hash
47
47
  end
48
+
49
+ def to_format(format)
50
+ return self unless format
51
+
52
+ me = deep_clone
53
+ me.link.select! { |l| l.type.casecmp(format).zero? }
54
+ me if me.link.any?
55
+ end
48
56
  end
49
57
  end
@@ -15,22 +15,26 @@ module RelatonCcsds
15
15
 
16
16
  #
17
17
  # Get CCSDS standard by document reference.
18
+ # If format is not specified, then all format will be returned.
18
19
  #
19
- # @param text [String]
20
+ # @param reference [String]
20
21
  # @param year [String, nil]
21
22
  # @param opts [Hash]
23
+ # @option opts [String] :format format of fetched document (DOC, PDF)
22
24
  #
23
25
  # @return [RelatonCcsds::BibliographicItem]
24
26
  #
25
- def get(ref, _year = nil, _opts = {})
26
- Util.warn "(#{ref}) fetching..."
27
+ def get(reference, _year = nil, opts = {}) # rubocop:disable Metrics/MethodLength
28
+ ref = reference.sub(/\s\((DOC|PDF)\)$/, "")
29
+ opts[:format] ||= Regexp.last_match(1)
30
+ Util.warn "(#{reference}) fetching..."
27
31
  hits = search ref
28
- if hits.empty?
29
- Util.warn "(#{ref}) not found."
32
+ doc = hits.first&.doc&.to_format(opts[:format])
33
+ unless doc
34
+ Util.warn "(#{reference}) not found."
30
35
  return nil
31
36
  end
32
- doc = hits.first.doc
33
- Util.warn "(#{ref}) found `#{hits.first.code}`."
37
+ Util.warn "(#{reference}) found `#{hits.first.code}`."
34
38
  doc
35
39
  end
36
40
  end
@@ -17,6 +17,12 @@ module RelatonCcsds
17
17
 
18
18
  TRRGX = /\s-\s\w+\sTranslated$/.freeze
19
19
 
20
+ #
21
+ # Initialize fetcher
22
+ #
23
+ # @param [String] output path to output directory
24
+ # @param [String] format output format (yaml, xml, bibxml)
25
+ #
20
26
  def initialize(output, format)
21
27
  @output = output
22
28
  @format = format
@@ -36,6 +42,14 @@ module RelatonCcsds
36
42
  @index ||= Relaton::Index.find_or_create "CCSDS", file: "index-v1.yaml"
37
43
  end
38
44
 
45
+ #
46
+ # Create fetcher instance and fetch data
47
+ #
48
+ # @param [String] output path to output directory (default: "data")
49
+ # @param [String] format output format (yaml, xml, bibxml) (default: "yaml")
50
+ #
51
+ # @return [void]
52
+ #
39
53
  def self.fetch(output: "data", format: "yaml")
40
54
  t1 = Time.now
41
55
  puts "Started at: #{t1}"
@@ -52,6 +66,14 @@ module RelatonCcsds
52
66
  index.save
53
67
  end
54
68
 
69
+ #
70
+ # Fetch documents from url
71
+ #
72
+ # @param [String] url
73
+ # @param [Boolean] retired if true, then fetch retired documents
74
+ #
75
+ # @return [void]
76
+ #
55
77
  def fetch_docs(url, retired: false)
56
78
  resp = agent.get(url)
57
79
  json = JSON.parse resp.body
@@ -60,6 +82,15 @@ module RelatonCcsds
60
82
  end
61
83
  end
62
84
 
85
+ #
86
+ # Parse document and save to file
87
+ #
88
+ # @param [Hash] doc document data
89
+ # @param [Array<Hash>] results collection of documents
90
+ # @param [Boolean] retired if true then document is retired
91
+ #
92
+ # @return [void]
93
+ #
63
94
  def parse_and_save(doc, results, retired)
64
95
  bibitem = DataParser.new(doc, results).parse
65
96
  if retired
@@ -69,8 +100,15 @@ module RelatonCcsds
69
100
  save_bib bibitem
70
101
  end
71
102
 
103
+ #
104
+ # Save bibitem to file
105
+ #
106
+ # @param [RelatonCcsds::BibliographicItem] bib bibitem
107
+ #
108
+ # @return [void]
109
+ #
72
110
  def save_bib(bib)
73
- search_translation bib
111
+ search_instance_translation bib
74
112
  id = bib.docidentifier.first.id
75
113
  file = File.join @output, "#{id.gsub(/[.\s-]+/, '-')}.#{@ext}"
76
114
  if @files.include?(file)
@@ -82,52 +120,117 @@ module RelatonCcsds
82
120
  index.add_or_update id, file
83
121
  end
84
122
 
85
- def search_translation(bib) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
123
+ #
124
+ # Search translation and instance relation
125
+ #
126
+ # @param [RelatonCcsds::BibliographicItem] bib <description>
127
+ #
128
+ # @return [void]
129
+ #
130
+ def search_instance_translation(bib)
86
131
  bibid = bib.docidentifier.first.id.dup
87
132
  if bibid.sub!(TRRGX, "")
88
- index.search do |row|
89
- id = row[:id].sub(TRRGX, "")
90
- next if id != bibid || row[:id] == bib.docidentifier.first.id
91
-
92
- create_translation_relation bib, row[:file]
93
- end
133
+ search_relations bibid, bib
94
134
  else
95
- index.search do |row|
96
- next unless row[:id].match?(/^#{bibid}#{TRRGX}/)
135
+ search_translations bibid, bib
136
+ end
137
+ end
138
+
139
+ #
140
+ # Search instance or translation relation
141
+ #
142
+ # @param [String] bibid instance bibitem id
143
+ # @param [RelatonCcsds::BibliographicItem] bib instance or translation bibitem
144
+ #
145
+ # @return [void]
146
+ #
147
+ def search_relations(bibid, bib)
148
+ index.search do |row|
149
+ id = row[:id].sub(TRRGX, "")
150
+ next if id != bibid || row[:id] == bib.docidentifier.first.id
151
+
152
+ create_relations bib, row[:file]
153
+ end
154
+ end
155
+
156
+ def search_translations(bibid, bib)
157
+ index.search do |row|
158
+ next unless row[:id].match?(/^#{bibid}#{TRRGX}/)
97
159
 
98
- create_instance_relation bib, row[:file]
99
- end
160
+ create_instance_relation bib, row[:file]
100
161
  end
101
162
  end
102
163
 
103
- def create_translation_relation(bib, file) # rubocop:disable Metrics/MethodLength
164
+ #
165
+ # Create translation or instance relation and save to file
166
+ #
167
+ # @param [RelatonCcsds::BibliographicItem] bib bibliographic item
168
+ # @param [String] file translation or instance file
169
+ #
170
+ # @return [void]
171
+ #
172
+ def create_relations(bib, file)
104
173
  hash = YAML.load_file file
105
174
  inst = BibliographicItem.from_hash hash
106
- if inst.docidentifier.first.id.match?(TRRGX)
107
- type1 = type2 = "hasTranslation"
175
+ type1, type2 = translation_relation_types(inst)
176
+ bib.relation << create_relation(inst, type1)
177
+ inst.relation << create_relation(bib, type2)
178
+ File.write file, content(inst), encoding: "UTF-8"
179
+ end
180
+
181
+ #
182
+ # Translation or instance relation types
183
+ #
184
+ # @param [RelatonCcsds::BibliographicItem] bib bibliographic item
185
+ #
186
+ # @return [Array<String>] relation types
187
+ #
188
+ def translation_relation_types(bib)
189
+ if bib.docidentifier.first.id.match?(TRRGX)
190
+ ["hasTranslation"] * 2
108
191
  else
109
- type1 = "instanceOf"
110
- type2 = "hasInstance"
192
+ ["instanceOf", "hasInstance"]
111
193
  end
112
- create_relation(bib, inst, type1)
113
- create_relation(inst, bib, type2)
114
- File.write file, content(inst), encoding: "UTF-8"
115
194
  end
116
195
 
196
+ #
197
+ # Create instance relation and save to file
198
+ #
199
+ # @param [RelatonCcsds::BibliographicItem] bib bibliographic item
200
+ # @param [String] file file name
201
+ #
202
+ # @return [void]
203
+ #
117
204
  def create_instance_relation(bib, file)
118
205
  hash = YAML.load_file file
119
206
  inst = BibliographicItem.from_hash hash
120
- create_relation bib, inst, "hasInstance"
121
- create_relation inst, bib, "instanceOf"
207
+ bib.relation << create_relation(inst, "hasInstance")
208
+ inst.relation << create_relation(bib, "instanceOf")
122
209
  File.write file, content(inst), encoding: "UTF-8"
123
210
  end
124
211
 
125
- def create_relation(bib1, bib2, type)
126
- fref = RelatonBib::FormattedRef.new content: bib2.docidentifier.first.id
127
- rel = BibliographicItem.new docid: bib2.docidentifier, formattedref: fref
128
- bib1.relation << RelatonBib::DocumentRelation.new(type: type, bibitem: rel)
212
+ #
213
+ # Create relation
214
+ #
215
+ # @param [RelatonCcsds::BibliographicItem] bib the related bibliographic item
216
+ # @param [String] type type of relation
217
+ #
218
+ # @return [RelatonBib::DocumentRelation] relation
219
+ #
220
+ def create_relation(bib, type)
221
+ fref = RelatonBib::FormattedRef.new content: bib.docidentifier.first.id
222
+ rel = BibliographicItem.new docid: bib.docidentifier, formattedref: fref
223
+ RelatonBib::DocumentRelation.new(type: type, bibitem: rel)
129
224
  end
130
225
 
226
+ #
227
+ # Merge identical documents with different links (updaes given bibitem)
228
+ #
229
+ # @param [RelatonCcsds::BibliographicItem] bib bibliographic item
230
+ # @param [String] file path to existing document
231
+ #
232
+ # @return [void]
233
+ #
131
234
  def merge_links(bib, file) # rubocop:disable Metrics/AbcSize
132
235
  hash = YAML.load_file file
133
236
  bib2 = BibliographicItem.from_hash hash
@@ -139,6 +242,13 @@ module RelatonCcsds
139
242
  bib.link << bib2.link[0]
140
243
  end
141
244
 
245
+ #
246
+ # Srerialize bibliographic item
247
+ #
248
+ # @param [RelatonCcsds::BibliographicItem] bib <description>
249
+ #
250
+ # @return [String] serialized bibliographic item
251
+ #
142
252
  def content(bib)
143
253
  case @format
144
254
  when "yaml" then bib.to_hash.to_yaml
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RelatonCcsds
4
- VERSION = "1.16.1"
4
+ VERSION = "1.16.2"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: relaton-ccsds
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.16.1
4
+ version: 1.16.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-09-20 00:00:00.000000000 Z
11
+ date: 2023-09-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mechanize
@@ -64,7 +64,6 @@ files:
64
64
  - ".gitignore"
65
65
  - ".rspec"
66
66
  - ".rubocop.yml"
67
- - ".vscode/launch.json"
68
67
  - Gemfile
69
68
  - README.adoc
70
69
  - Rakefile
data/.vscode/launch.json DELETED
@@ -1,40 +0,0 @@
1
- {
2
- // Use IntelliSense to learn about possible attributes.
3
- // Hover to view descriptions of existing attributes.
4
- // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
5
- "version": "0.2.0",
6
- "configurations": [
7
- {
8
- "name": "RSpec - all",
9
- "type": "Ruby",
10
- "request": "launch",
11
- "program": "${workspaceRoot}/bin/rspec",
12
- "args": [
13
- "-I",
14
- "${workspaceRoot}"
15
- ]
16
- },
17
- {
18
- "name": "RSpec - file only",
19
- "type": "Ruby",
20
- "request": "launch",
21
- "program": "${workspaceRoot}/bin/rspec",
22
- "args": [
23
- "-I",
24
- "${workspaceRoot}",
25
- "${file}"
26
- ]
27
- },
28
- {
29
- "name": "RSpec - line only",
30
- "type": "Ruby",
31
- "request": "launch",
32
- "program": "${workspaceRoot}/bin/rspec",
33
- "args": [
34
- "-I",
35
- "${workspaceRoot}",
36
- "${file}:${lineNumber}"
37
- ]
38
- }
39
- ]
40
- }