pubid-nist 0.1.8 → 0.2.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: 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