pubid-nist 0.1.8 → 0.2.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: 76af4a82e63775b038ebfbd73f2c43b9756f1f3da689cbe13329d05efb4a06f4
4
- data.tar.gz: 37a6787cc14b4629c04dee83e42bb054e9a150b33d0ea00bfcbdfca936de09ed
3
+ metadata.gz: ae5b75b8cb77b433b69d107ca44d6f828602da328419436c24c25968412d1719
4
+ data.tar.gz: 1377f4285c99bd9f1582f5ca1daff8ed79cf90543405bf43d4a8a9659d2ae21b
5
5
  SHA512:
6
- metadata.gz: ea789ee1abc40a9716e45388f4667c39c9da31ac244e331c1d36f401183cd087d13484d2f58f0c985fecfb2cd2b641d1aaffd90752f19c609bb548501115d693
7
- data.tar.gz: a6d32b2267aa0e853437a524ad7cfc4c8f32f741adb1e945736597453d825c74699b9d299232975ceb6c67a3a8cd1796032600a736c203cce2210696ca1954a9
6
+ metadata.gz: f0252ea5cf1e0f418d15b29a051dbaa203ff0765dcf1d45124b3fb123a5d0baaaa6aac5e2cca8de138e0fbf21f20d4b7aba0ecaf79de7fbc79164a119763d971
7
+ data.tar.gz: a8e8a4c490568753bd6233432825c7cf717dbd379c1eb56155082bdbe9ce74040365e9579f802c241ca6c98631da38ca7caa6ac6ff2687e6ada9003cc21e28de
data/exe/pubid-nist CHANGED
@@ -84,9 +84,9 @@ class Pubid::Nist::CLI < Thor
84
84
 
85
85
  unless code.empty?
86
86
  if options[:format] == "string"
87
- puts Pubid::Nist::Document.parse(code).to_s(options[:style].to_sym)
87
+ puts Pubid::Nist::Identifier.parse(code).to_s(options[:style].to_sym)
88
88
  else
89
- puts Pubid::Nist::Document.parse(code).to_json
89
+ puts Pubid::Nist::Identifier.parse(code).to_json
90
90
  end
91
91
  end
92
92
  rescue Pubid::Nist::Errors::ParseError
@@ -1,5 +1,7 @@
1
1
  module Pubid::Nist
2
2
  module Errors
3
3
  class ParseError < StandardError; end
4
+ class SerieInvalidError < StandardError; end
5
+ class PublisherInvalidError < StandardError; end
4
6
  end
5
7
  end
@@ -82,20 +82,21 @@ INSERT_DESC = {
82
82
  }.freeze
83
83
 
84
84
  module Pubid::Nist
85
- class Document
85
+ class Identifier < Pubid::Core::Identifier::Base
86
86
  attr_accessor :serie, :code, :revision, :publisher, :version, :volume,
87
- :part, :addendum, :stage, :translation, :update_number,
88
- :edition, :supplement, :update_year, :update_month,
87
+ :part, :addendum, :stage, :translation,
88
+ :edition, :supplement, :update,
89
89
  :section, :appendix, :errata, :index, :insert
90
90
 
91
- def initialize(publisher:, serie:, docnumber:, stage: nil, supplement: nil,
92
- edition_month: nil, edition_year: nil, edition_day: nil, **opts)
93
- @publisher = publisher
94
- @serie = serie
95
- @code = docnumber
96
- @stage = Stage.new(stage.to_s) if stage
91
+ def initialize(publisher: "NIST", serie:, number: nil, stage: nil, supplement: nil,
92
+ edition_month: nil, edition_year: nil, edition_day: nil, update: nil, **opts)
93
+ @publisher = publisher.is_a?(Publisher) ? publisher : Publisher.new(publisher: publisher)
94
+ @serie = serie.is_a?(Serie) ? serie : Serie.new(serie: serie)
95
+ @code = number
96
+ @stage = Stage.new(**stage) if stage
97
97
  @supplement = (supplement.is_a?(Array) && "") || supplement
98
98
  @edition = parse_edition(edition_month, edition_year, edition_day) if edition_month || edition_year
99
+ @update = update
99
100
  opts.each { |key, value| send("#{key}=", value.to_s) }
100
101
  end
101
102
 
@@ -142,32 +143,30 @@ module Pubid::Nist
142
143
 
143
144
  def self.update_old_code(code)
144
145
  UPDATE_CODES.each do |from, to|
145
- code = code.gsub(from, to)
146
+ code = code.gsub(from.match?(/^\/.*\/$/) ? Regexp.new(from[1..-2]) : from, to)
146
147
  end
147
148
  code
148
149
  end
149
150
 
150
- def self.parse(code)
151
- code = update_old_code(code)
152
- DocumentTransform.new.apply(DocumentParser.new.parse(code))
153
- rescue Parslet::ParseFailed => failure
154
- raise Pubid::Nist::Errors::ParseError, "#{failure.message}\ncause: #{failure.parse_failure_cause.ascii_tree}"
155
- end
151
+ # def to_s(format = :short)
152
+ # result = render_serie(format)
153
+ # result += " " unless format == :short || stage.nil?
154
+ # result += "#{stage&.to_s(format)}"\
155
+ # " #{code}#{render_part(format)}#{render_edition(format)}"\
156
+ # "#{render_localities(format)}"\
157
+ # "#{render_update(format)}#{render_translation(format)}"
158
+ # result = render_addendum(result, format)
159
+ #
160
+ # return result.gsub(" ", ".") if format == :mr
161
+ #
162
+ # result
163
+ # end
156
164
 
157
165
  def to_s(format = :short)
158
- result = render_serie(format)
159
- result += " " unless format == :short || stage.nil?
160
- result += "#{stage&.to_s(format)}"\
161
- " #{code}#{render_part(format)}#{render_edition(format)}"\
162
- "#{render_localities(format)}"\
163
- "#{render_update(format)}#{render_translation(format)}"
164
- result = render_addendum(result, format)
165
-
166
- return result.gsub(" ", ".") if format == :mr
167
-
168
- result
166
+ self.class.get_renderer_class.new(get_params).render(format: format)
169
167
  end
170
168
 
169
+
171
170
  def to_json(*args)
172
171
  result = {
173
172
  styles: {
@@ -282,5 +281,47 @@ module Pubid::Nist
282
281
  "#{input}.add-1"
283
282
  end
284
283
  end
284
+
285
+ class << self
286
+ def create(**opts)
287
+ new(**opts)
288
+ end
289
+
290
+ # def transform(params)
291
+ # identifier_params = get_transformer_class.new.apply(params)
292
+ #
293
+ # Identifier.create(**identifier_params)
294
+ # end
295
+ def transform(params)
296
+ # run transform through each element,
297
+ # like running transformer.apply(number: 1) and transformer.apply(year: 1999)
298
+ # instead of running transformer on whole hash, like running transformer.apply({ number: 1, year: 1999 })
299
+ # where rule for number or year only will be not applied
300
+ # transformation only applied to rules matching the whole hash
301
+
302
+ identifier_params = params.map do |k, v|
303
+ get_transformer_class.new.apply({ k => v }, params)
304
+ end.inject({}, :merge)
305
+
306
+
307
+ # identifier_params = params.map do |k, v|
308
+ # get_transformer_class.new.apply({k => v}, params).to_a.first
309
+ # end.compact.to_h
310
+ #
311
+ new(**identifier_params)
312
+ end
313
+
314
+ def get_parser_class
315
+ Parser
316
+ end
317
+
318
+ def get_transformer_class
319
+ Transformer
320
+ end
321
+
322
+ def get_renderer_class
323
+ Renderer
324
+ end
325
+ end
285
326
  end
286
327
  end
@@ -1,4 +1,3 @@
1
- require "relaton_nist/data_fetcher"
2
1
  require "nokogiri"
3
2
  require "open-uri"
4
3
  require "lightly"
@@ -28,24 +27,24 @@ module Pubid::Nist
28
27
  end
29
28
 
30
29
  def convert(doc)
31
- id = @converted_id[doc[:id]] ||= Pubid::Nist::Document.parse(doc[:id])
30
+ id = @converted_id[doc[:id]] ||= Pubid::Nist::Identifier.parse(doc[:id])
32
31
  return id unless doc.key?(:doi)
33
32
 
34
33
  begin
35
34
  doi = @converted_doi[doc[:doi]] ||=
36
- Pubid::Nist::Document.parse(doc[:doi])
37
- rescue Errors::ParseError
35
+ Pubid::Nist::Identifier.parse(doc[:doi])
36
+ rescue Pubid::Core::Errors::ParseError
38
37
  return id
39
38
  end
40
39
  # return more complete pubid
41
40
  id.merge(doi)
42
- rescue Errors::ParseError
43
- @converted_doi[doc[:doi]] ||= Pubid::Nist::Document.parse(doc[:doi])
41
+ rescue Pubid::Core::Errors::ParseError
42
+ @converted_doi[doc[:doi]] ||= Pubid::Nist::Identifier.parse(doc[:doi])
44
43
  end
45
44
 
46
45
  def parse_docid(doc)
47
46
  id = doc.at("publisher_item/item_number", "publisher_item/identifier")
48
- .text.sub(%r{^/}, "")
47
+ &.text&.sub(%r{^/}, "")
49
48
  doi = doc.at("doi_data/doi").text.gsub("10.6028/", "")
50
49
  title = doc.at("titles/title").text
51
50
  title += " #{doc.at('titles/subtitle').text}" if doc.at("titles/subtitle")
@@ -57,13 +56,13 @@ module Pubid::Nist
57
56
  when "10.6028/NIST.HB.150-10-1995" then id.sub!(/150-10$/, "150-10-1995")
58
57
  end
59
58
 
60
- { id: id, doi: doi, title: title }
59
+ { id: id || doi, doi: doi, title: title }
61
60
  end
62
61
 
63
62
  def comply_with_pubid
64
63
  fetch.select do |doc|
65
64
  convert(doc).to_s == doc[:id]
66
- rescue Errors::ParseError
65
+ rescue Pubid::Core::Errors::ParseError
67
66
  false
68
67
  end
69
68
  end
@@ -71,7 +70,7 @@ module Pubid::Nist
71
70
  def different_with_pubid
72
71
  fetch.reject do |doc|
73
72
  convert(doc).to_s == doc[:id]
74
- rescue Errors::ParseError
73
+ rescue Pubid::Core::Errors::ParseError
75
74
  true
76
75
  end
77
76
  end
@@ -79,7 +78,7 @@ module Pubid::Nist
79
78
  def parse_fail_with_pubid
80
79
  fetch.select do |doc|
81
80
  convert(doc).to_s && false
82
- rescue Errors::ParseError
81
+ rescue Pubid::Core::Errors::ParseError
83
82
  true
84
83
  end
85
84
  end
@@ -95,7 +94,7 @@ module Pubid::Nist
95
94
  finalPubId: final_doc.to_s,
96
95
  mr: final_doc.to_s(:mr),
97
96
  }
98
- rescue Errors::ParseError
97
+ rescue Pubid::Core::Errors::ParseError
99
98
  {
100
99
  id: doc[:id],
101
100
  doi: doc[:doi],
@@ -1,5 +1,5 @@
1
1
  module Pubid::Nist
2
- class DocumentParser < Parslet::Parser
2
+ class Parser < Parslet::Parser
3
3
  attr_accessor :parsed
4
4
 
5
5
  rule(:series) do
@@ -24,7 +24,8 @@ module Pubid::Nist
24
24
  SERIES["mr"].key(parsed[:series_mr].to_s)
25
25
  end
26
26
  parser = find_parser(series)
27
- parser.new.parse(parsed[:remaining].to_s).merge({ series: series })
27
+ parsed = parser.new.parse(parsed[:remaining].to_s)
28
+ parsed.is_a?(Array) ? parsed << { series: series } : parsed.merge({ series: series })
28
29
  end
29
30
 
30
31
  def find_parser(series)
@@ -1,19 +1,16 @@
1
1
  module Pubid::Nist
2
2
  module Parsers
3
- class Default < Parslet::Parser
3
+ class Default < Pubid::Core::Parser
4
4
  rule(:identifier) do
5
- stage.maybe >> (str(" ") | str(".")) >> report_number >> parts.repeat.as(:parts)
5
+ old_stage.maybe >> (str(" ") | str(".")) >> report_number >>
6
+ parts.repeat >> draft.maybe >> stage.maybe >> translation.maybe
6
7
  end
7
8
 
8
- rule(:digits) { match('\d').repeat(1) }
9
- rule(:letters) { match('[A-Za-z]').repeat(1) }
10
- rule(:year_digits) { match('\d').repeat(4, 4) }
11
9
  rule(:month_letters) { match('[A-Za-z]').repeat(3, 3) }
12
10
  rule(:number_suffix) { match("[aA-Z]") }
13
- # rule(:small)
14
11
 
15
12
  rule(:parts) do
16
- (edition | revision | version | volume | part | update | addendum | translation |
13
+ (edition | revision | version | volume | part | update | addendum |
17
14
  supplement | errata | index | insert | section | appendix)
18
15
  end
19
16
 
@@ -37,10 +34,17 @@ module Pubid::Nist
37
34
  (str("insert") | str("ins")).as(:insert)
38
35
  end
39
36
 
37
+ rule(:old_stage) do
38
+ (str("(") >> (array_to_str(STAGES["id"].keys.map(&:upcase)).as(:id) >>
39
+ array_to_str(STAGES["type"].keys.map(&:upcase)).as(:type)).as(:stage) >> str(")"))
40
+ end
41
+
40
42
  rule(:stage) do
41
- (str("(") >> (STAGES.keys.reduce do |acc, s|
42
- (acc.is_a?(String) ? str(acc) : acc) | str(s)
43
- end).as(:stage) >> str(")"))
43
+ (space >> (array_to_str(STAGES["id"].keys).as(:id) >> array_to_str(STAGES["type"].keys).as(:type)).as(:stage))
44
+ end
45
+
46
+ rule(:draft) do
47
+ space >> str("(Draft)").as(:draft)
44
48
  end
45
49
 
46
50
  rule(:digits_with_suffix) do
@@ -79,12 +83,12 @@ module Pubid::Nist
79
83
  end
80
84
 
81
85
  rule(:update) do
82
- (str("/Upd") | str("/upd")) >> digits.as(:update_number) >> str("-") >> digits.as(:update_year)
86
+ (str("/Upd") | str("/upd")) >> (digits.as(:number) >> str("-") >> digits.as(:year)).as(:update)
83
87
  end
84
88
 
85
89
  rule(:translation) do
86
90
  (str("(") >> match('\w').repeat(3, 3).as(:translation) >> str(")")) |
87
- (str(".") >> match('\w').repeat(3, 3).as(:translation))
91
+ ((str(".") | space) >> match('\w').repeat(3, 3).as(:translation))
88
92
  end
89
93
 
90
94
  rule(:edition_prefixes) { str("e") }
@@ -2,7 +2,7 @@ module Pubid::Nist
2
2
  module Parsers
3
3
  class NbsCirc < Default
4
4
  rule(:revision) do
5
- ((str("rev") >> (letters >> year_digits).as(:revision)) |
5
+ ((str("rev") >> (words >> year_digits).as(:revision)) |
6
6
  (str("r") >> digits.as(:revision))
7
7
  )
8
8
  end
@@ -13,8 +13,8 @@ module Pubid::Nist
13
13
 
14
14
  rule(:edition) do
15
15
  (str("sup") >> str("").as(:supplement) >>
16
- (letters.as(:edition_month) >> year_digits.as(:edition_year))) |
17
- ((str("e") | str("-")) >> (digits.as(:edition) | letters.as(:edition_month) >> year_digits.as(:edition_year)))
16
+ (words.as(:edition_month) >> year_digits.as(:edition_year))) |
17
+ ((str("e") | str("-")) >> (digits.as(:edition) | words.as(:edition_month) >> year_digits.as(:edition_year)))
18
18
  end
19
19
  end
20
20
  end
@@ -13,7 +13,7 @@ module Pubid::Nist
13
13
 
14
14
  rule(:edition) do
15
15
  (str("supp") >> str("").as(:supplement) >>
16
- (letters.as(:edition_month) >> year_digits.as(:edition_year)) |
16
+ (words.as(:edition_month) >> year_digits.as(:edition_year)) |
17
17
  str("e") >> year_digits.as(:edition_year)
18
18
  )
19
19
  end
@@ -3,13 +3,13 @@ module Pubid::Nist
3
3
  class NbsLc < Default
4
4
  rule(:supplement) do
5
5
  (str("supp") | str("sup")) >>
6
- ((str("").as(:supplement) >> digits.as(:update_month) >> str("/") >> digits.as(:update_year)) |
6
+ ((str("").as(:supplement) >> (digits.as(:month) >> str("/") >> digits.as(:year)).as(:update)) |
7
7
  match('\d').repeat.as(:supplement))
8
8
  end
9
9
 
10
10
  rule(:revision) do
11
11
  str("r") >>
12
- ((digits.as(:update_month) >> str("/") >> digits.as(:update_year)) |
12
+ ((digits.as(:month) >> str("/") >> digits.as(:year)).as(:update) |
13
13
  digits.as(:revision))
14
14
  end
15
15
 
@@ -3,6 +3,7 @@ require_relative "nbs_hb"
3
3
  module Pubid::Nist
4
4
  module Parsers
5
5
  class NistHb < NbsHb
6
+ rule(:number_suffix) { match("[a-zA-Z]") }
6
7
  end
7
8
  end
8
9
  end
@@ -8,7 +8,7 @@ module Pubid::Nist
8
8
  end
9
9
 
10
10
  rule(:report_number) do
11
- (year_digits.as(:first_report_number) >>
11
+ (digits.as(:first_report_number) >>
12
12
  str("-") >> year_digits.as(:edition_year)) |
13
13
  first_report_number >> (str("-") >>
14
14
  ((digits | match("[aAB]") | str("CAS") | str("FRA")) >>
@@ -18,8 +18,8 @@ module Pubid::Nist
18
18
 
19
19
  rule(:revision) do
20
20
  str("r") >>
21
- ((digits.as(:update_month) >> str("/") >> digits.as(:update_year)) |
22
- (month_letters.as(:update_month) >> year_digits.as(:update_year)) |
21
+ ((digits.as(:month) >> str("/") >> digits.as(:year)).as(:update) |
22
+ (month_letters.as(:month) >> year_digits.as(:year)).as(:update) |
23
23
  digits.as(:revision) |
24
24
  str("").as(:revision))
25
25
  end
@@ -2,7 +2,7 @@ module Pubid::Nist
2
2
  module Parsers
3
3
  class NistSp < Default
4
4
  rule(:version) do
5
- ((str("ver") >> (digits >> (str(".") >> digits).maybe).as(:version)) |
5
+ (((str("ver") | str(" Ver. ")) >> (digits >> (str(".") >> digits).repeat).as(:version)) |
6
6
  (str("v") >>
7
7
  (match('\d') >> str(".") >> match('\d') >> (str(".") >> match('\d')).maybe).as(:version)))
8
8
  end
@@ -6,6 +6,8 @@ module Pubid::Nist
6
6
  attr_accessor :publisher
7
7
 
8
8
  def initialize(publisher:)
9
+ raise Errors::PublisherInvalidError, "#{publisher} is not valid publisher" unless PUBLISHERS["long"].key?(publisher)
10
+
9
11
  @publisher = publisher
10
12
  end
11
13
 
@@ -0,0 +1,211 @@
1
+ module Pubid::Nist
2
+ class Renderer < Pubid::Core::Renderer::Base
3
+ def render_base_identifier(**opts)
4
+ prerender(**opts)
5
+
6
+ render_identifier(@prerendered_params, opts)
7
+ end
8
+
9
+ def render_identifier(params, opts)
10
+ result = case opts[:format]
11
+ when :short, :mr
12
+ "%{serie}%{code}%{volume}%{part}%{edition}%{revision}%{version}"\
13
+ "%{supplement}%{section}%{appendix}%{errata}%{index}%{insert}%{update}"\
14
+ "%{stage}%{translation}" % params
15
+ else
16
+ "%{serie}%{stage}%{code}%{volume}%{part}%{edition}%{revision}%{version}"\
17
+ "%{supplement}%{section}%{appendix}%{errata}%{index}%{insert}%{update}"\
18
+ "%{translation}" % params
19
+ end
20
+
21
+ if params[:addendum] && !params[:addendum].empty?
22
+ case opts[:format]
23
+ when :long
24
+ "Addendum to #{result}"
25
+ when :abbrev
26
+ "Add. to #{result}"
27
+ when :short
28
+ "#{result} Add."
29
+ when :mr
30
+ "#{result}.add-1"
31
+ end
32
+ else
33
+ result
34
+ end
35
+ end
36
+
37
+ def render_serie(serie, opts, params)
38
+ if serie.to_s(opts[:format]).include?(params[:publisher].to_s(opts[:format]))
39
+ return serie.to_s(opts[:format])
40
+ end
41
+
42
+ "#{params[:publisher].to_s(opts[:format])} #{serie.to_s(opts[:format])}"
43
+ end
44
+
45
+ def render_code(code, opts, _params)
46
+ (opts[:format] == :mr ? "." : " ") + code.to_s
47
+ end
48
+
49
+ def render_edition(edition, opts, _params)
50
+ case opts[:format]
51
+ when :long
52
+ " Edition "
53
+ when :abbrev
54
+ " Ed. "
55
+ when :short, :mr
56
+ "e"
57
+ end + edition.to_s
58
+ end
59
+
60
+ def render_revision(revision, opts, _params)
61
+ case opts[:format]
62
+ when :long
63
+ ", Revision "
64
+ when :abbrev
65
+ ", Rev. "
66
+ when :short, :mr
67
+ "r"
68
+ end + (revision == '' ? '1' : revision).to_s
69
+ end
70
+
71
+ def render_version(version, opts, _params)
72
+ case opts[:format]
73
+ when :long
74
+ ", Version "
75
+ when :abbrev
76
+ ", Ver. "
77
+ when :short, :mr
78
+ "ver"
79
+ end + version
80
+ end
81
+
82
+ def render_volume(volume, opts, params)
83
+ case opts[:format]
84
+ when :long
85
+ ", Volume "
86
+ when :abbrev
87
+ ", Vol. "
88
+ when :short
89
+ params[:code] ? "v" : " v"
90
+ when :mr
91
+ params[:code] ? "v" : ".v"
92
+ end + volume
93
+ end
94
+
95
+ def render_update(update, opts, _params)
96
+ update_text = update.number.to_s
97
+ update_text += "-#{update.year}" if update.year
98
+ update_text += sprintf("%02d", update.month) if update.month
99
+
100
+ case opts[:format]
101
+ when :long
102
+ " Update #{update_text}"
103
+ when :abbrev
104
+ " Upd. #{update_text}"
105
+ when :short
106
+ "/Upd#{update_text}"
107
+ when :mr
108
+ ".u#{update_text}"
109
+ end
110
+ end
111
+
112
+ def render_translation(translation, opts, _params)
113
+ case opts[:format]
114
+ when :long, :abbrev
115
+ " (#{translation.upcase})"
116
+ when :mr
117
+ ".#{translation}"
118
+ when :short
119
+ " #{translation}"
120
+ end
121
+ end
122
+
123
+ def render_part(part, opts, _params)
124
+ case opts[:format]
125
+ when :long
126
+ " Part "
127
+ when :abbrev
128
+ " Pt. "
129
+ when :short, :mr
130
+ "pt"
131
+ end + part
132
+ end
133
+
134
+ def render_supplement(supplement, opts, _params)
135
+ case opts[:format]
136
+ when :long
137
+ " Supplement "
138
+ when :abbrev
139
+ " Suppl. "
140
+ when :short, :mr
141
+ "sup"
142
+ end + supplement
143
+ end
144
+
145
+ def render_appendix(appendix, opts, _params)
146
+ case opts[:format]
147
+ when :long
148
+ " Appendix "
149
+ when :abbrev
150
+ " App. "
151
+ when :short, :mr
152
+ "app"
153
+ end
154
+ end
155
+
156
+ def render_section(section, opts, _params)
157
+ case opts[:format]
158
+ when :long
159
+ " Section "
160
+ when :abbrev
161
+ " Sec. "
162
+ when :short, :mr
163
+ "sec"
164
+ end + section
165
+ end
166
+
167
+ def render_errata(errata, opts, _params)
168
+ case opts[:format]
169
+ when :long
170
+ " Errata "
171
+ when :abbrev
172
+ " Err. "
173
+ when :short, :mr
174
+ "err"
175
+ end
176
+ end
177
+
178
+ def render_index(index, opts, _params)
179
+ case opts[:format]
180
+ when :long
181
+ " Index "
182
+ when :abbrev
183
+ " Index. "
184
+ when :short, :mr
185
+ "indx"
186
+ end
187
+ end
188
+
189
+ def render_insert(insert, opts, _params)
190
+ case opts[:format]
191
+ when :long
192
+ " Insert "
193
+ when :abbrev
194
+ " Ins. "
195
+ when :short, :mr
196
+ "ins"
197
+ end
198
+ end
199
+
200
+ def render_stage(stage, opts, _params)
201
+ case opts[:format]
202
+ when :mr
203
+ "."
204
+ when :short
205
+ ""
206
+ else
207
+ " "
208
+ end + stage.to_s(opts[:format])
209
+ end
210
+ end
211
+ end
@@ -5,6 +5,8 @@ module Pubid::Nist
5
5
  attr_accessor :serie, :parsed
6
6
 
7
7
  def initialize(serie:, parsed: nil)
8
+ raise Errors::SerieInvalidError, "#{serie} is not valid serie" unless SERIES["long"].key?(serie)
9
+
8
10
  @serie = serie
9
11
  @parsed = parsed
10
12
  end
@@ -2,10 +2,10 @@ STAGES = YAML.load_file(File.join(File.dirname(__FILE__), "../../../stages.yaml"
2
2
 
3
3
  module Pubid::Nist
4
4
  class Stage
5
- attr_accessor :stage
5
+ attr_accessor :id, :type
6
6
 
7
- def initialize(stage)
8
- @stage = stage
7
+ def initialize(id:, type:)
8
+ @id, @type = id.to_s.downcase, type.to_s.downcase
9
9
  end
10
10
 
11
11
  def to_s(format = :short)
@@ -13,16 +13,16 @@ module Pubid::Nist
13
13
 
14
14
  case format
15
15
  when :short
16
- "(#{@stage})"
16
+ " #{@id}#{@type}"
17
17
  when :mr
18
- @stage
18
+ "#{@id}#{@type}"
19
19
  else
20
- STAGES[@stage]
20
+ "#{STAGES['id'][@id]} #{STAGES['type'][@type]}"
21
21
  end
22
22
  end
23
23
 
24
24
  def nil?
25
- @stage.nil?
25
+ @id.nil? && @type.nil?
26
26
  end
27
27
  end
28
28
  end
@@ -0,0 +1,43 @@
1
+ module Pubid::Nist
2
+ class Transformer < Parslet::Transform
3
+ rule(first_report_number: subtree(:first_report_number)) do |context|
4
+ { number:
5
+ context.values_at(:first_report_number, :second_report_number).compact.join("-").upcase }
6
+ end
7
+
8
+ rule(report_number: subtree(:report_number)) do |context|
9
+ { number: context[:report_number] }
10
+ end
11
+
12
+ rule(series: subtree(:series)) do |context|
13
+ { serie: Serie.new(serie: context[:series].to_s.gsub(".", " ")),
14
+ publisher: Publisher.parse(context[:series]) }
15
+ end
16
+
17
+ # remove :second_report_number from output
18
+ rule(second_report_number: simple(:second_report_number)) do
19
+ {}
20
+ end
21
+
22
+ rule(parts: subtree(:parts)) do |context|
23
+ context[:parts].inject({}, :merge)
24
+ end
25
+
26
+ rule(update: subtree(:update)) do |context|
27
+ { update: Update.new(**context[:update]) }
28
+ end
29
+
30
+ rule(stage: subtree(:stage)) do |context|
31
+ case context[:stage][:id]
32
+ when "1"
33
+ { stage: { id: "i", type: context[:stage][:type] } }
34
+ else
35
+ { stage: context[:stage] }
36
+ end
37
+ end
38
+
39
+ rule(draft: subtree(:draft)) do |context|
40
+ { stage: { id: "i", type: "prd"} }
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,15 @@
1
+ module Pubid::Nist
2
+ class Update
3
+ attr_accessor :number, :year, :month
4
+
5
+ def initialize(number: nil, year: nil, month: nil)
6
+ @number = number || 1
7
+ @year = year&.to_s&.length == 2 ? "19#{year}" : year
8
+
9
+ if month
10
+ date = Date.parse("01/#{month}/#{@year}")
11
+ @month = date.month
12
+ end
13
+ end
14
+ end
15
+ end
@@ -1,5 +1,5 @@
1
1
  module Pubid
2
2
  module Nist
3
- VERSION = "0.1.8".freeze
3
+ VERSION = "0.2.2".freeze
4
4
  end
5
5
  end
data/lib/pubid/nist.rb CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  require "yaml"
4
4
  require "parslet"
5
+ require "pubid-core"
5
6
 
6
7
  module Pubid
7
8
  module Nist
@@ -11,8 +12,10 @@ end
11
12
 
12
13
  require_relative "nist/serie"
13
14
  require_relative "nist/parsers/default"
14
- require_relative "nist/document_transform"
15
- require_relative "nist/document_parser"
15
+ require_relative "nist/update"
16
+ require_relative "nist/transformer"
17
+ require_relative "nist/parser"
18
+ require_relative "nist/renderer"
16
19
 
17
20
  Dir[File.join(__dir__, 'nist/parsers', '*.rb')].each do |file|
18
21
  require file
@@ -25,7 +28,7 @@ end.map do |parser_class|
25
28
  [parser.name.split("::").last.gsub(/(.)([A-Z])/, '\1 \2').upcase, parser]
26
29
  end.to_h
27
30
 
28
- require_relative "nist/document"
31
+ require_relative "nist/identifier"
29
32
  require_relative "nist/publisher"
30
33
  require_relative "nist/stage"
31
34
  require_relative "nist/errors"
data/series.yaml CHANGED
@@ -90,7 +90,7 @@ mr:
90
90
  NBS BH: NBS.BH
91
91
  NBS CRPL: NBS.CRPL
92
92
  NBS CRPL-F-A: NBS.CRPL-F-A
93
- NBS CRPL-F-B: NBS CRPL-F-B
93
+ NBS CRPL-F-B: NBS.CRPL-F-B
94
94
  NBS IP: NBS.IP
95
95
  NBS CIRC: NBS.CIRC
96
96
  NBS CIS: NBS.CIS
data/stages.yaml CHANGED
@@ -1,5 +1,16 @@
1
- IPD: Initial Public Draft
2
- 2PD: Second Public Draft
3
- FPD: Final Public Draft
4
- WD: Work-in-Progress Draft
5
- PRD: Preliminary Draft
1
+ id:
2
+ i: Initial
3
+ F: Final
4
+ "1": Initial
5
+ "2": Second
6
+ "3": Third
7
+ "4": Fourth
8
+ "5": Fifth
9
+ "6": Sixth
10
+ "7": Seventh
11
+ "8": Eight
12
+ "9": Ninth
13
+ type:
14
+ pd: Public Draft
15
+ wd: Work-in-Progress Draft
16
+ prd: Preliminary Draft
data/update_codes.yaml CHANGED
@@ -13,15 +13,19 @@ NIST CSWP: CSRC White Paper
13
13
  NIST SP 800-56ar: NIST SP 800-56Ar1
14
14
  NIST.LCIRC: NIST.LC
15
15
  NBS.LCIRC: NBS.LC
16
+ NIST LCIRC: NIST LC
17
+ NBS LCIRC: NBS LC
16
18
  NIST SP 800-57Pt3r1: NIST SP 800-57pt3r1
17
19
  NISTIR: NIST IR
18
20
  NIST FIPS: FIPS PUB
19
21
  NIST.CSWP.01162020pt: NIST.CSWP.01162020(por)
20
- NBS FIPS 11-1-Sep30: NBS FIPS 11-1-Sep30/1977
21
- FIPS PUB 54-1-Jan15: FIPS PUB 54-1
22
- FIPS PUB 54-1-Jan17: FIPS PUB 54-1-Jan17/1991
22
+ /^NBS FIPS 11-1-Sep30$/: NBS FIPS 11-1-Sep30/1977
23
+ /^NBS FIPS 89-Sep1$/: NBS FIPS 89-Sep1981
24
+ /^FIPS PUB 54-1-Jan15$/: FIPS PUB 54-1
25
+ /^FIPS PUB 54-1-Jan17$/: FIPS PUB 54-1-Jan17/1991
23
26
  NBS CRPL c4-4: NBS CRPL 4-4
24
- NIST AMS 300-8r1 (February 2021 update): NIST AMS 300-8r1/Upd1-201502
27
+ NIST AMS 300-8r1 (February 2021 update): NIST AMS 300-8r1/Upd1-202102
28
+ NIST AMS 300-8r1/upd: NIST AMS 300-8r1/Upd1-202102
25
29
  NIST IR 8115r1-upd: NIST IR 8115r1/Upd1-202103
26
30
  NIST SP 500-300-upd: NIST SP 500-300/Upd1-202105
27
31
  NIST TN 2150-upd: NIST TN 2150/Upd1-202102
@@ -32,6 +36,7 @@ NBS.HB.28p11969: NBS.HB.28-1969pt1
32
36
  NIST HB 105-1-1990: NIST HB 105-1r1990
33
37
  NBS.FIPS.100-1-1991: NIST.FIPS.100-1-1991
34
38
  NBS.LC.1088sp: NBS.LC.1088.spa
39
+ NBS LC 1088sp: NBS LC 1088 spa
35
40
  #NBS.LC.145r11/1925: NBS.LC.145/Upd1-192511
36
41
  #NBS.LC.118sup12/1926: NBS.LC.118sup/Upd1-192612
37
42
  NIST SP 955 Suppl.: NIST SP 955sup
@@ -41,18 +46,47 @@ NIST FIPS 54-Jan15: NIST FIPS 54
41
46
  NBS report ;: NBS RPT
42
47
  NBS TN 467p1adde1: NBS TN 467pt1-add
43
48
  NIST SP 1011-II-1.0: NIST SP 1011v2ver1.0
49
+ NIST SP 1011-II-1 0: NIST SP 1011v2ver1.0
44
50
  NIST SP 1011-I-2.0: NIST SP 1011v1ver2.0
51
+ NIST SP 1011-I-2 0: NIST SP 1011v1ver2.0
45
52
  NIST SP 500-281-v1.0: NIST SP 500-281v1.0
46
53
  NIST IR 8259Aes: NIST IR 8259A(spa)
47
54
  NIST IR 8259Apt: NIST IR 8259A(por)
48
55
  NIST IR 8211-upd: NIST IR 8211/Upd1-2021
49
56
  NIST IR 8115r1/upd: NIST IR 8115r1/Upd1-2021
50
57
  NBS CS v: NBS CSM v
51
- !ruby/regexp /NBS CRPL-F-B(?=\d+)/: "NBS CRPL-F-B "
52
- !ruby/regexp /NBS[.\s]CS[.\s]e/: "NBS CS-E "
53
- !ruby/regexp /(?<=\d)es/: (spa)
54
- !ruby/regexp /(?<=\d)chi/: (zho)
55
- !ruby/regexp /(?<=\d)viet/: (vie)
56
- !ruby/regexp /(?<=\d)port/: (por)
57
- !ruby/regexp /(?<=\d)(pt)(?!\d)/: (por)
58
- !ruby/regexp /(?<=\d)id/: (ind)
58
+ NIST SP 800-57p1r2006: NIST SP 800-57pt1r1
59
+ NIST SP 800-57p1r2007: NIST SP 800-57pt1r2
60
+ NIST SP 500-268v1 1: NIST SP 500-268v1.1
61
+ NIST SP 500-270v1 1: NIST SP 500-270v1.1
62
+ NIST SP 500-280v2 1: NIST SP 500-280v2.1
63
+ NIST SP 500-281-v1 0: NIST SP 500-281v1.0
64
+ NIST SP 800-63v1 0 1: NIST SP 800-63v1.0.1
65
+ NIST SP 800-63v1 0 2: NIST SP 800-63v1.0.2
66
+ NIST SP 955 Suppl: NIST SP 955sup
67
+ NIST SP 984 4: NIST SP 984-4
68
+ NISTPUB 0413171251: NIST TN 1648-2009
69
+ NIST IR 8286C-draft: NIST IR 8286C (Draft)
70
+ NIST SP 800-140Cr1-draft2: NIST SP 800-140Cr1 2pd
71
+ NIST SP 800-140Dr1-draft2: NIST SP 800-140Dr1 2pd
72
+ NIST SP 800-219-draft: NIST SP 800-219 (Draft)
73
+ NIST IR 8270-draft2: NIST IR 8270 2pd
74
+ NIST HB 135e2022-upd1: NIST HB 135e2022/Upd1-202205
75
+ NIST SP 1900-206-upd1: NIST SP 1900-206/Upd1-202202
76
+ NIST TN 2207-upd1: NIST TN 2207/Upd1-202205
77
+ NIST IR 8290-upd1: NIST IR 8290/Upd1-202205
78
+ NIST IR 8413-upd1: NIST IR 8413/Upd1-202207
79
+ NIST IR 85-3273-37-upd1: NIST IR 85-3273-37/Upd1-202205
80
+ NIST IR 8352-draft: NIST IR 8352 (Draft)
81
+ NIST SP 1273-draft: NIST SP 1273 (Draft)
82
+ NIST IR 8323-draft: NIST IR 8323 (Draft)
83
+ /NBS CRPL-F-B(?=\d+)/: "NBS CRPL-F-B "
84
+ /NBS[.\s]CS[.\s]e/: "NBS CS-E "
85
+ NBS NSRDS: NSRDS-NBS
86
+ nist ir: NIST IR
87
+ /(?<=\d)es/: (spa)
88
+ /(?<=\d)chi/: (zho)
89
+ /(?<=\d)viet/: (vie)
90
+ /(?<=\d)port/: (por)
91
+ /(?<=\d)(pt)(?!\d)/: (por)
92
+ /(?<=\d)id/: (ind)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pubid-nist
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.8
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-03-06 00:00:00.000000000 Z
11
+ date: 2023-09-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -67,7 +67,7 @@ dependencies:
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
- name: relaton-nist
70
+ name: nokogiri
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - ">="
@@ -81,7 +81,7 @@ dependencies:
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
- name: nokogiri
84
+ name: thor
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - ">="
@@ -95,7 +95,7 @@ dependencies:
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
97
  - !ruby/object:Gem::Dependency
98
- name: thor
98
+ name: lightly
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - ">="
@@ -109,7 +109,7 @@ dependencies:
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0'
111
111
  - !ruby/object:Gem::Dependency
112
- name: lightly
112
+ name: parslet
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
115
  - - ">="
@@ -123,19 +123,19 @@ dependencies:
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0'
125
125
  - !ruby/object:Gem::Dependency
126
- name: parslet
126
+ name: pubid-core
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
- - - ">="
129
+ - - "~>"
130
130
  - !ruby/object:Gem::Version
131
- version: '0'
131
+ version: 1.8.0
132
132
  type: :runtime
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
- - - ">="
136
+ - - "~>"
137
137
  - !ruby/object:Gem::Version
138
- version: '0'
138
+ version: 1.8.0
139
139
  description: Library to generate, parse and manipulate NIST PubID.
140
140
  email:
141
141
  - open.source@ribose.com
@@ -151,12 +151,11 @@ files:
151
151
  - exe/pubid-nist
152
152
  - lib/pubid-nist.rb
153
153
  - lib/pubid/nist.rb
154
- - lib/pubid/nist/document.rb
155
- - lib/pubid/nist/document_parser.rb
156
- - lib/pubid/nist/document_transform.rb
157
154
  - lib/pubid/nist/edition.rb
158
155
  - lib/pubid/nist/errors.rb
156
+ - lib/pubid/nist/identifier.rb
159
157
  - lib/pubid/nist/nist_tech_pubs.rb
158
+ - lib/pubid/nist/parser.rb
160
159
  - lib/pubid/nist/parsers/default.rb
161
160
  - lib/pubid/nist/parsers/fips_pub.rb
162
161
  - lib/pubid/nist/parsers/nbs_bh.rb
@@ -180,8 +179,11 @@ files:
180
179
  - lib/pubid/nist/parsers/nist_sp.rb
181
180
  - lib/pubid/nist/parsers/nist_tn.rb
182
181
  - lib/pubid/nist/publisher.rb
182
+ - lib/pubid/nist/renderer.rb
183
183
  - lib/pubid/nist/serie.rb
184
184
  - lib/pubid/nist/stage.rb
185
+ - lib/pubid/nist/transformer.rb
186
+ - lib/pubid/nist/update.rb
185
187
  - lib/pubid/nist/version.rb
186
188
  - publishers.yaml
187
189
  - series.yaml
@@ -191,7 +193,7 @@ homepage: https://github.com/metanorma/pubid-nist
191
193
  licenses:
192
194
  - BSD-2-Clause
193
195
  metadata: {}
194
- post_install_message:
196
+ post_install_message:
195
197
  rdoc_options: []
196
198
  require_paths:
197
199
  - lib
@@ -206,8 +208,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
206
208
  - !ruby/object:Gem::Version
207
209
  version: '0'
208
210
  requirements: []
209
- rubygems_version: 3.3.3
210
- signing_key:
211
+ rubygems_version: 3.3.26
212
+ signing_key:
211
213
  specification_version: 4
212
214
  summary: Library to generate, parse and manipulate NIST PubID.
213
215
  test_files: []
@@ -1,21 +0,0 @@
1
- module Pubid::Nist
2
- class DocumentTransform
3
- def apply(tree, context = nil)
4
- series = tree[:series].to_s.gsub(".", " ")
5
- document_parameters = tree.reject do |k, _|
6
- %i[report_number first_report_number second_report_number series parts].include?(k)
7
- end
8
- tree[:parts]&.each { |part| document_parameters.merge!(part) }
9
- report_number = tree.values_at(:first_report_number,
10
- :second_report_number).compact.join("-").upcase
11
-
12
- # using :report_number when need to keep original words case
13
- report_number = tree[:report_number] if report_number.empty?
14
-
15
- Document.new(publisher: Publisher.parse(series),
16
- serie: Serie.new(serie: series),
17
- docnumber: report_number,
18
- **document_parameters)
19
- end
20
- end
21
- end