relaton-ccsds 1.16.1 → 1.16.2

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: 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
- }