nist-pubid 0.1.5 → 0.1.6

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: 818a96e99a2e198ef626234c1b175c310104708a84198439e327e7c0bccfec8e
4
- data.tar.gz: c2da763a9a97d5735b0d39641417f89f622620b10aa6f871f25acc4c8cf5850d
3
+ metadata.gz: d6cbdcaa4e1cfa7c75b6709f34cfd19670e8a3b2d3bd31473cbc5a5d439843b7
4
+ data.tar.gz: 4dcb0a4b147990872fe4f72c8eecac96ba3a865bcaa477a5158404ab04fc8e42
5
5
  SHA512:
6
- metadata.gz: df7f8caaa70c6ebf7bdd4ff2e4506cac98180fe87037a2959baae6b98b7bc394ff7906a9d37e4d4420026078b263e1a8200e02c42c02e0fc2701f0cf007c027b
7
- data.tar.gz: 7b21b01c0fbeef957e28b7a68c541c6cc7cf4e4de2eaae446493705bfa91c7a1c4bcf2ffcf0d7d0d960d0b04aa7ec5295d3f461e81dbf9b2096606d880be62d2
6
+ metadata.gz: b6331d9887c149a7dbcf49c46a0ce7c121bf973cd239e3467658065820daf8c18f752e68b977d52e08155dfa2d947d9be5fa80bb431f462453ed337e02fc1616
7
+ data.tar.gz: 35660adeef1ec90862ada64b2150162008d0b25cf01a8e9a7b15f909b6ac64265a04cc2bdf1da7ea9a7d08e99754eb8d49910de9d19119b4548b40f3870876db
data/exe/nist-pubid CHANGED
@@ -1,25 +1,54 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require 'rubygems'
4
- require 'bundler/setup'
5
- require_relative '../lib/nist_pubid'
6
- require 'optparse'
3
+ require "rubygems"
4
+ require "bundler/setup"
5
+ require_relative "../lib/nist_pubid"
6
+ require "thor"
7
+ require "csv"
7
8
 
8
- OptionParser.new do |opts|
9
- opts.banner = "Usage: nist_pubid [ -s | PubID ]"
10
- opts.on("-s", "--status", "Get a NIST Tech Pubs list with final PubID") do
11
- puts "Current document ID | DOI | Title | Final PubID"
12
- NistPubid::NistTechPubs.status.each do |row|
13
- puts row.join(" | ")
9
+ class NistPubidCLI < Thor
10
+ desc "report", "Create report for NIST Tech Pubs database (fetches from GitHub)"
11
+ option :csv, type: :boolean, desc: "Export to CSV format"
12
+ def report
13
+ if options[:csv]
14
+ NistPubid::NistTechPubs.status.each do |doc|
15
+ puts [doc[:finalPubId] == doc[:id] && doc[:mr] == doc[:doi] ? "-" : "+",
16
+ doc[:finalPubId], doc[:id], doc[:doi], doc[:mr], doc[:title]]
17
+ .to_csv
18
+ end
19
+ else
20
+ puts "Changed | New PubID | Document ID | DOI | New MR | Title + subtitle"
21
+ NistPubid::NistTechPubs.status.each do |doc|
22
+ puts "#{doc[:finalPubId] == doc[:id] && doc[:mr] == doc[:doi] ? ' -' : '✅'}"\
23
+ " | #{doc[:finalPubId]} | #{doc[:id]} | #{doc[:doi]} | #{doc[:mr]} | #{doc[:title]}"
24
+ end
14
25
  end
15
26
  end
16
27
 
17
- opts.on("-h", "--help", "Prints this help") do
18
- puts opts
19
- exit
20
- end
28
+ desc "convert", "Convert legacy NIST Tech Pubs ID to NIST PubID"
29
+ option :style, aliases: "-s", type: :string,
30
+ desc: "Convert to PubID style (short|long|mr|abbrev)",
31
+ default: "short"
32
+ option :format, aliases: "-f", type: :string,
33
+ desc: "Render in format (JSON, string)",
34
+ default: "string"
35
+ def convert(code)
36
+ unless %w[mr long short abbrev].include?(options[:style])
37
+ raise "Invalid PubID style"
38
+ end
39
+
40
+ raise "wrong conversion format" unless %w[string json].include? options[:format]
21
41
 
22
- end.parse!
42
+ unless code.empty?
43
+ if options[:format] == "string"
44
+ puts NistPubid::Document.parse(code).to_s(options[:style].to_sym)
45
+ else
46
+ puts NistPubid::Document.parse(code).to_json
47
+ end
48
+ end
49
+ rescue NistPubid::Errors::ParseError
50
+ puts "[Error] This does not seem to be a valid NIST Tech Pubs legacy identifier"
51
+ end
52
+ end
23
53
 
24
- code = ARGV.join(" ")
25
- puts NistPubid::Document.parse(code).to_s(:short) unless code.empty?
54
+ NistPubidCLI.start(ARGV)
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ require "json"
2
3
 
3
4
  REVISION_DESC = {
4
5
  long: ", Revision ",
@@ -59,8 +60,22 @@ APPENDIX_DESC = {
59
60
  ERRATA_DESC = {
60
61
  long: " Errata ",
61
62
  abbrev: " Err. ",
62
- short: "-err",
63
- mr: "-err",
63
+ short: "err",
64
+ mr: "err",
65
+ }.freeze
66
+
67
+ INDEX_DESC = {
68
+ long: " Index ",
69
+ abbrev: " Index. ",
70
+ short: "indx",
71
+ mr: "indx",
72
+ }.freeze
73
+
74
+ INSERT_DESC = {
75
+ long: " Insert ",
76
+ abbrev: " Ins. ",
77
+ short: "ins",
78
+ mr: "ins",
64
79
  }.freeze
65
80
 
66
81
  module NistPubid
@@ -68,7 +83,7 @@ module NistPubid
68
83
  attr_accessor :serie, :code, :revision, :publisher, :version, :volume,
69
84
  :part, :addendum, :stage, :translation, :update_number,
70
85
  :edition, :supplement, :update_year, :section, :appendix,
71
- :errata
86
+ :errata, :index, :insert
72
87
 
73
88
  def initialize(publisher:, serie:, docnumber:, **opts)
74
89
  @publisher = Publisher.new(publisher: publisher)
@@ -101,6 +116,8 @@ module NistPubid
101
116
  .gsub("NIST SP 260-162 2006ed.", "NIST SP 260-162e2006")
102
117
  .gsub("NBS CIRC 154suprev", "NBS CIRC 154r1sup")
103
118
  .gsub("NIST SP 260-126 rev 2013", "NIST SP 260-126r2013")
119
+ .gsub("NIST CSWP", "NIST CSRC White Paper")
120
+ .gsub("NIST.CSWP.01162020pt", "NIST.CSWP.01162020(por)")
104
121
  .gsub(/(?<=NBS MP )(\d+)\((\d+)\)/, '\1e\2')
105
122
  .gsub(/(?<=\d)es/, "(spa)")
106
123
  .gsub(/(?<=\d)chi/, "(zho)")
@@ -123,11 +140,14 @@ module NistPubid
123
140
  revision: /[\da](?:r|Rev\.\s|([0-9]+[A-Za-z]*-[0-9]+[A-Za-z]*-))([\da]+)/
124
141
  .match(code)&.[](2),
125
142
  addendum: match(/(?<=(\.))?(add(?:-\d+)?|Addendum)/, code),
126
- edition: /(?<=[^a-z])(?<=(\.))?(?:e(?(1)-)|Ed\.\s)(\d+)/
127
- .match(code)&.[](2),
143
+ edition: /(?<=[^a-z])(?<=\.)?(?:e(?(1)-)|Ed\.\s)(\d+)|
144
+ NBS\sFIPS\sPUB\s[0-9]+[A-Za-z]*-[0-9]+[A-Za-z]*-([A-Za-z\d]+)
145
+ /x.match(code)&.captures&.join,
128
146
  section: /(?<=sec)\d+/.match(code)&.to_s,
129
147
  appendix: /\d+app/.match(code)&.to_s,
130
- errata: /-errata/.match(code)&.to_s
148
+ errata: /-errata|\d+err(?:ata)?/.match(code)&.to_s,
149
+ index: /\d+index|\d+indx/.match(code)&.to_s,
150
+ insert: /\d+ins(?:ert)?/.match(code)&.to_s
131
151
  }
132
152
  supplement = /(?:(?:supp?)-?(\d*)|Supplement|Suppl.)/
133
153
  .match(code)
@@ -163,7 +183,7 @@ module NistPubid
163
183
  end
164
184
 
165
185
  def self.parse_docnumber(serie, code)
166
- localities = "[Pp]t\\d+|r(?:\\d+|[A-Za-z]?)|e\\d+|p|v|sec\\d+"
186
+ localities = "[Pp]t\\d+|r(?:\\d+|[A-Za-z]?)|e\\d+|p|v|sec\\d+|inde?x|err(?:ata)?|ins(?:ert)?"
167
187
  excluded_parts = "(?!#{localities}|supp?)"
168
188
 
169
189
  if ["NBS CSM", "NBS CS"].include?(serie)
@@ -179,7 +199,7 @@ module NistPubid
179
199
  ([0-9]+ # first part of report number
180
200
  (?:#{excluded_parts}[A-Za-z]+)? # with letter but without localities
181
201
  (?:-m)? # for NBS CRPL 4-m-5
182
- (?:-[A-Z]+)? # for NIST SP 1075-NCNR, NIST SP 1113-BFRL, etc
202
+ (?:-[A-Za]+)? # for NIST SP 1075-NCNR, NIST SP 1113-BFRL, NIST IR 6529-a
183
203
  (?:-[0-9.]+)? # second part
184
204
  (?:
185
205
  (?: # only big letter
@@ -203,7 +223,7 @@ module NistPubid
203
223
  regex.match(code)&.to_s
204
224
  end
205
225
 
206
- def to_s(format)
226
+ def to_s(format = :short)
207
227
  result = render_serie(format)
208
228
  result += " " unless format == :short || stage.nil?
209
229
  result += "#{stage&.to_s(format)}"\
@@ -217,6 +237,23 @@ module NistPubid
217
237
  result
218
238
  end
219
239
 
240
+ def to_json(*args)
241
+ result = {
242
+ styles: {
243
+ short: to_s(:short),
244
+ abbrev: to_s(:abbrev),
245
+ long: to_s(:long),
246
+ mr: to_s(:mr),
247
+ }
248
+ }
249
+
250
+ instance_variables.each do |var|
251
+ val = instance_variable_get(var)
252
+ result[var.to_s.gsub('@', '')] = val unless val.nil?
253
+ end
254
+ result.to_json(*args)
255
+ end
256
+
220
257
  def render_serie(format)
221
258
  if serie.to_s(format).include?(publisher.to_s(format))
222
259
  return serie.to_s(format)
@@ -234,27 +271,21 @@ module NistPubid
234
271
 
235
272
  def render_edition(format)
236
273
  result = ""
237
- if revision
238
- result += if %i[long abbrev].include?(format) ||
239
- [volume, part, supplement, version, edition].any?
240
- "#{REVISION_DESC[format]}#{revision}"
241
- else
242
- "-#{revision}"
243
- end
244
- end
274
+
275
+ result += "#{REVISION_DESC[format]}#{revision.to_s.upcase}" if revision
245
276
  result += "#{VERSION_DESC[format]}#{version}" unless version.nil?
246
277
  result += "#{EDITION_DESC[format]}#{edition}" unless edition.nil?
247
278
  result
248
279
  end
249
280
 
250
281
  def render_localities(format)
251
- # TODO: Index, Insert
252
-
253
282
  result = ""
254
283
  result += "#{SUPPLEMENT_DESC[format]}#{supplement}" unless supplement.nil?
255
284
  result += "#{SECTION_DESC[format]}#{section}" unless section.nil?
256
285
  result += "#{APPENDIX_DESC[format]}" unless appendix.nil?
257
286
  result += "#{ERRATA_DESC[format]}" unless errata.nil?
287
+ result += INDEX_DESC[format] unless index.nil?
288
+ result += INSERT_DESC[format] unless insert.nil?
258
289
 
259
290
  result
260
291
  end
@@ -23,19 +23,18 @@ module NistPubid
23
23
 
24
24
  def convert(doc)
25
25
  id = @converted_id[doc[:id]] ||= NistPubid::Document.parse(doc[:id])
26
- return id.to_s(:short) unless doc.key?(:doi)
26
+ return id unless doc.key?(:doi)
27
27
 
28
28
  begin
29
29
  doi = @converted_doi[doc[:doi]] ||=
30
30
  NistPubid::Document.parse(doc[:doi])
31
31
  rescue Errors::ParseError
32
- return id.to_s(:short)
32
+ return id
33
33
  end
34
34
  # return more complete pubid
35
- id.merge(doi).to_s(:short)
35
+ id.merge(doi)
36
36
  rescue Errors::ParseError
37
37
  @converted_doi[doc[:doi]] ||= NistPubid::Document.parse(doc[:doi])
38
- .to_s(:short)
39
38
  end
40
39
 
41
40
  def parse_docid(doc)
@@ -57,7 +56,7 @@ module NistPubid
57
56
 
58
57
  def comply_with_pubid
59
58
  fetch.select do |doc|
60
- convert(doc) == doc[:id]
59
+ convert(doc).to_s == doc[:id]
61
60
  rescue Errors::ParseError
62
61
  false
63
62
  end
@@ -65,7 +64,7 @@ module NistPubid
65
64
 
66
65
  def different_with_pubid
67
66
  fetch.reject do |doc|
68
- convert(doc) == doc[:id]
67
+ convert(doc).to_s == doc[:id]
69
68
  rescue Errors::ParseError
70
69
  true
71
70
  end
@@ -73,7 +72,7 @@ module NistPubid
73
72
 
74
73
  def parse_fail_with_pubid
75
74
  fetch.select do |doc|
76
- convert(doc) && false
75
+ convert(doc).to_s && false
77
76
  rescue Errors::ParseError
78
77
  true
79
78
  end
@@ -82,9 +81,22 @@ module NistPubid
82
81
  # returning current document id, doi, title and final PubID
83
82
  def status
84
83
  fetch.map do |doc|
85
- [doc[:id], doc[:doi], doc[:title], convert(doc)]
84
+ final_doc = convert(doc)
85
+ {
86
+ id: doc[:id],
87
+ doi: doc[:doi],
88
+ title: doc[:title],
89
+ finalPubId: final_doc.to_s,
90
+ mr: final_doc.to_s(:mr),
91
+ }
86
92
  rescue Errors::ParseError
87
- [doc[:id], doc[:doi], doc[:title], "parse error"]
93
+ {
94
+ id: doc[:id],
95
+ doi: doc[:doi],
96
+ title: doc[:title],
97
+ finalPubId: "parse error",
98
+ mr: "parse_error"
99
+ }
88
100
  end
89
101
  end
90
102
  end
@@ -9,7 +9,7 @@ module NistPubid
9
9
  @publisher = publisher
10
10
  end
11
11
 
12
- def to_s(format)
12
+ def to_s(format = :short)
13
13
  return @publisher if %i[short mr].include?(format)
14
14
 
15
15
  PUBLISHERS[format.to_s][@publisher]
@@ -8,7 +8,7 @@ module NistPubid
8
8
  @serie = serie == "NISTIR" ? "NIST IR" : serie
9
9
  end
10
10
 
11
- def to_s(format)
11
+ def to_s(format = :short)
12
12
  return @serie if %i[short mr].include?(format)
13
13
 
14
14
  result = SERIES[format.to_s][@serie]
@@ -1,3 +1,3 @@
1
1
  module NistPubid
2
- VERSION = "0.1.5".freeze
2
+ VERSION = "0.1.6".freeze
3
3
  end
data/nist_pubid.gemspec CHANGED
@@ -33,4 +33,5 @@ Gem::Specification.new do |spec|
33
33
 
34
34
  spec.add_dependency "relaton-nist"
35
35
  spec.add_dependency "nokogiri"
36
+ spec.add_dependency "thor"
36
37
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nist-pubid
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.1.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-01-07 00:00:00.000000000 Z
11
+ date: 2022-01-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -94,6 +94,20 @@ dependencies:
94
94
  - - ">="
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: thor
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
97
111
  description: Library to generate, parse and manipulate NIST PubID.
98
112
  email:
99
113
  - open.source@ribose.com