pubid-nist 0.2.4 → 0.3.0

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.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/lib/pubid/nist/addendum.rb +21 -0
  3. data/lib/pubid/nist/edition.rb +26 -14
  4. data/lib/pubid/nist/identifier.rb +21 -18
  5. data/lib/pubid/nist/nist_tech_pubs.rb +7 -1
  6. data/lib/pubid/nist/parser.rb +21 -15
  7. data/lib/pubid/nist/parsers/{nbs_circ.rb → circ.rb} +2 -2
  8. data/lib/pubid/nist/parsers/{nbs_crpl.rb → crpl.rb} +3 -3
  9. data/lib/pubid/nist/parsers/{nbs_csm.rb → csm.rb} +2 -2
  10. data/lib/pubid/nist/parsers/default.rb +6 -5
  11. data/lib/pubid/nist/parsers/fips.rb +10 -3
  12. data/lib/pubid/nist/parsers/{nist_gcr.rb → gcr.rb} +1 -1
  13. data/lib/pubid/nist/parsers/{nbs_hb.rb → hb.rb} +2 -10
  14. data/lib/pubid/nist/parsers/{nbs_mp.rb → mp.rb} +1 -1
  15. data/lib/pubid/nist/parsers/{nist_ncstar.rb → ncstar.rb} +1 -1
  16. data/lib/pubid/nist/parsers/{nist_owmwp.rb → owmwp.rb} +1 -1
  17. data/lib/pubid/nist/parsers/{nbs_rpt.rb → rpt.rb} +1 -1
  18. data/lib/pubid/nist/parsers/{nist_sp.rb → sp.rb} +5 -3
  19. data/lib/pubid/nist/parsers/tn.rb +17 -0
  20. data/lib/pubid/nist/publisher.rb +1 -5
  21. data/lib/pubid/nist/renderer/addendum.rb +20 -0
  22. data/lib/pubid/nist/renderer/base.rb +202 -0
  23. data/lib/pubid/nist/series.rb +30 -0
  24. data/lib/pubid/nist/stage.rb +2 -2
  25. data/lib/pubid/nist/transformer.rb +10 -2
  26. data/lib/pubid/nist/update.rb +1 -1
  27. data/lib/pubid/nist/version.rb +1 -1
  28. data/lib/pubid/nist.rb +4 -2
  29. data/series.yaml +60 -82
  30. data/update_codes.yaml +4 -4
  31. metadata +19 -23
  32. data/lib/pubid/nist/parsers/nbs_bh.rb +0 -6
  33. data/lib/pubid/nist/parsers/nbs_fips.rb +0 -14
  34. data/lib/pubid/nist/parsers/nbs_mn.rb +0 -6
  35. data/lib/pubid/nist/parsers/nbs_sp.rb +0 -13
  36. data/lib/pubid/nist/parsers/nbs_tn.rb +0 -9
  37. data/lib/pubid/nist/parsers/nist_hb.rb +0 -9
  38. data/lib/pubid/nist/parsers/nist_tn.rb +0 -13
  39. data/lib/pubid/nist/renderer.rb +0 -213
  40. data/lib/pubid/nist/serie.rb +0 -29
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7e7f47e08604ec704f0cf6468e57bf119027caf37ccba4043269374d2e9381a3
4
- data.tar.gz: ec580488f65954d7fcbbfff5dd17e0cdc2dc88f7d07cb81d0bada5812beae2fe
3
+ metadata.gz: 9ac016ca575f6b9815da56cb9424c1ba9bce844f494822e8bf407d9bb51de4cd
4
+ data.tar.gz: 5fe93360f4980550e766cffc5b7c0ad6ae00124fa818cfd6ac4ba6b6eb2bf445
5
5
  SHA512:
6
- metadata.gz: d3c2ec778fb99af9427532d92404c60fef8a4e1f65342ab61b0925ade00849c9e151604e2bc2b3cf2d71877dbad840c017c581036e0dc22b1a307bafd06ae2f4
7
- data.tar.gz: 787c614f6716d8cc8044821c1ff90ae1afebbe2731673adef5aef5150fa77a5e8d32d633f7367d2929620578d84ed6b6bb81e39367e422f017704d2b34cc65e0
6
+ metadata.gz: afdb479f21109aaf05b75d9ae2d0d783b347fe2cea4734e18ec01cabfe3129bba69cb36e444f9005d12bb153516097642147a3a464ee576f1b9866ce03030eaf
7
+ data.tar.gz: 9a41dd6a27fda08447e56b1c128971fec36057739fd48a802ac503af1078247addf9329fe4a9d9b2a839d3e827b39be60108f536f39633eb798152ef431cff8c
@@ -0,0 +1,21 @@
1
+
2
+ module Pubid::Nist
3
+ class Addendum < Identifier
4
+ def_delegators 'Pubid::Nist::Addendum', :type
5
+
6
+ attr_accessor :base
7
+
8
+ def initialize(base:, number: nil)
9
+ @number = number
10
+ @base = base
11
+ end
12
+
13
+ def self.type
14
+ { key: :add, title: "Addendum" }
15
+ end
16
+
17
+ def self.get_renderer_class
18
+ Renderer::Addendum
19
+ end
20
+ end
21
+ end
@@ -1,26 +1,38 @@
1
1
  module Pubid::Nist
2
- class Edition
3
- attr_accessor :year, :month, :day, :parsed, :sequence
2
+ class Edition < Pubid::Core::Entity
3
+ attr_accessor :year, :month, :day, :parsed, :number
4
4
 
5
- def initialize(parsed: nil, year: nil, month: nil, day: nil, sequence: nil)
5
+ def initialize(parsed: nil, year: nil, month: nil, day: nil, number: nil)
6
6
  @parsed = parsed
7
7
  @year = year
8
8
  @month = month
9
9
  @day = day
10
- @sequence = sequence
10
+ @number = number
11
11
  end
12
12
 
13
- def to_s
14
- result = (@sequence && [@sequence]) || []
15
- if @day
16
- result << Date.new(@year, @month, @day).strftime("%Y%m%d")
17
- elsif @month
18
- result << Date.new(@year, @month).strftime("%Y%m")
19
- elsif @year
20
- result << Date.new(@year).strftime("%Y")
21
- end
13
+ def to_s(format: :short)
22
14
 
23
- result.join("-")
15
+ if format == :long
16
+ result = (@number && ["Edition #{@number}"]) || []
17
+ if @day
18
+ result << Date.new(@year, @month, @day).strftime("(%B %d, %Y)")
19
+ elsif @month
20
+ result << Date.new(@year, @month).strftime("(%B %Y)")
21
+ elsif @year
22
+ result << Date.new(@year).strftime("(%Y)")
23
+ end
24
+ result.join(" ")
25
+ else
26
+ result = (@number && [@number]) || []
27
+ if @day
28
+ result << Date.new(@year, @month, @day).strftime("%Y%m%d")
29
+ elsif @month
30
+ result << Date.new(@year, @month).strftime("%Y%m")
31
+ elsif @year
32
+ result << Date.new(@year).strftime("%Y")
33
+ end
34
+ result.join("-")
35
+ end
24
36
  end
25
37
  end
26
38
  end
@@ -1,24 +1,31 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "json"
4
+ require "forwardable"
4
5
 
5
6
  UPDATE_CODES = YAML.load_file(File.join(File.dirname(__FILE__), "../../../update_codes.yaml"))
6
7
 
7
8
  module Pubid::Nist
8
9
  class Identifier < Pubid::Core::Identifier::Base
9
- attr_accessor :serie, :code, :revision, :publisher, :version, :volume,
10
+ extend Forwardable
11
+ attr_accessor :series, :code, :revision, :publisher, :version, :volume,
10
12
  :part, :addendum, :stage, :translation,
11
13
  :edition, :supplement, :update,
12
14
  :section, :appendix, :errata, :index, :insert
13
15
 
14
- def initialize(publisher: "NIST", serie:, number: nil, stage: nil, supplement: nil,
15
- edition_month: nil, edition_year: nil, edition_day: nil, update: nil, **opts)
16
- @publisher = publisher.is_a?(Publisher) ? publisher : Publisher.new(publisher: publisher)
17
- @serie = serie.is_a?(Serie) ? serie : Serie.new(serie: serie)
16
+ def initialize(publisher: "NIST", series:, number: nil, stage: nil, supplement: nil,
17
+ edition_month: nil, edition_year: nil, edition_day: nil, update: nil,
18
+ edition: nil, **opts)
19
+ @publisher = publisher.is_a?(Publisher) ? publisher : Publisher.new(publisher: publisher.to_s)
20
+ @series = series.is_a?(Series) ? series : Series.new(series: series)
18
21
  @code = number
19
22
  @stage = Stage.new(**stage) if stage
20
23
  @supplement = (supplement.is_a?(Array) && "") || supplement
21
- @edition = parse_edition(edition_month, edition_year, edition_day) if edition_month || edition_year
24
+ if edition_month || edition_year
25
+ @edition = parse_edition(edition_month, edition_year, edition_day)
26
+ elsif edition
27
+ @edition = Edition.new(number: edition)
28
+ end
22
29
  @update = update
23
30
  opts.each { |key, value| send("#{key}=", value.to_s) }
24
31
  end
@@ -54,7 +61,7 @@ module Pubid::Nist
54
61
  document.instance_variables.each do |var|
55
62
  val = document.instance_variable_get(var)
56
63
  current_val = instance_variable_get(var)
57
- if [:@serie, :@publisher].include?(var) ||
64
+ if [:@series, :@publisher].include?(var) ||
58
65
  (val && current_val.nil?) ||
59
66
  (val && current_val.to_s.length < val.to_s.length)
60
67
  instance_variable_set(var, val)
@@ -73,7 +80,7 @@ module Pubid::Nist
73
80
 
74
81
  # @param without_edition [Boolean] render pubid without rendering edition
75
82
  def to_s(format = :short, without_edition: false)
76
- self.class.get_renderer_class.new(to_h).render(format: format, without_edition: without_edition)
83
+ self.class.get_renderer_class.new(to_h(deep: false)).render(format: format, without_edition: without_edition)
77
84
  end
78
85
 
79
86
  def to_json(*args)
@@ -98,11 +105,6 @@ module Pubid::Nist
98
105
  new(**opts)
99
106
  end
100
107
 
101
- # def transform(params)
102
- # identifier_params = get_transformer_class.new.apply(params)
103
- #
104
- # Identifier.create(**identifier_params)
105
- # end
106
108
  def transform(params)
107
109
  # run transform through each element,
108
110
  # like running transformer.apply(number: 1) and transformer.apply(year: 1999)
@@ -114,11 +116,12 @@ module Pubid::Nist
114
116
  get_transformer_class.new.apply({ k => v }, params)
115
117
  end.inject({}, :merge)
116
118
 
119
+ if identifier_params[:addendum]
120
+ return Addendum.new(base: new(
121
+ **identifier_params.dup.tap { |h| h.delete(:addendum) }
122
+ ), **identifier_params[:addendum])
123
+ end
117
124
 
118
- # identifier_params = params.map do |k, v|
119
- # get_transformer_class.new.apply({k => v}, params).to_a.first
120
- # end.compact.to_h
121
- #
122
125
  new(**identifier_params)
123
126
  end
124
127
 
@@ -131,7 +134,7 @@ module Pubid::Nist
131
134
  end
132
135
 
133
136
  def get_renderer_class
134
- Renderer
137
+ Renderer::Base
135
138
  end
136
139
  end
137
140
  end
@@ -45,7 +45,13 @@ module Pubid::Nist
45
45
  def parse_docid(doc)
46
46
  id = doc.at("publisher_item/item_number", "publisher_item/identifier")
47
47
  &.text&.sub(%r{^/}, "")
48
- doi = doc.at("doi_data/doi").text.gsub("10.6028/", "")
48
+ if id == "NBS BH 10"
49
+ # XXX: "doi" attribute is missing for doi_data
50
+ doi = "NBS.BH.10"
51
+ else
52
+ doi = doc.at("doi_data/doi").text.gsub("10.6028/", "")
53
+ end
54
+
49
55
  title = doc.at("titles/title").text
50
56
  title += " #{doc.at('titles/subtitle').text}" if doc.at("titles/subtitle")
51
57
  case doi
@@ -1,17 +1,12 @@
1
1
  module Pubid::Nist
2
- class Parser < Parslet::Parser
2
+ class Parser < Pubid::Core::Parser
3
3
  attr_accessor :parsed
4
4
 
5
5
  rule(:series) do
6
- ((SERIES["long"].keys
7
- .sort_by(&:length).reverse
8
- .flatten
9
- .reduce do |acc, s|
10
- (acc.is_a?(String) ? str(acc) : acc) | str(s)
11
- end).as(:series) |
12
- (SERIES["mr"].values.reduce do |acc, s|
13
- (acc.is_a?(String) ? str(acc) : acc) | str(s)
14
- end).as(:series_mr)) >> any.repeat.as(:remaining)
6
+ (array_to_str(SERIES["long"].keys.sort_by(&:length).reverse.flatten).as(:series) |
7
+ array_to_str(SERIES["mr"].values).as(:series_mr) |
8
+ ((str("NBS") | str("NIST")).as(:publisher) >> (space | dot) >> array_to_str(SERIES["long"].keys.sort_by(&:length).reverse.flatten).as(:series))) >>
9
+ any.repeat.as(:remaining)
15
10
  end
16
11
 
17
12
  root(:series)
@@ -23,13 +18,24 @@ module Pubid::Nist
23
18
  else
24
19
  SERIES["mr"].key(parsed[:series_mr].to_s)
25
20
  end
26
- parser = find_parser(series)
27
- parsed = parser.new.parse(parsed[:remaining].to_s)
28
- parsed.is_a?(Array) ? parsed << { series: series } : parsed.merge({ series: series })
21
+ publisher = parsed[:publisher]
22
+ parser = find_parser(publisher, series)
23
+ begin
24
+ parsed = parser.new.parse(parsed[:remaining].to_s)
25
+ rescue Parslet::ParseFailed
26
+ # for PubID 1.0 identifier series specific parser might fail,
27
+ # so parse using Default parser which is comply with PubID 1.0
28
+ parsed = Parsers::Default.new.parse(parsed[:remaining].to_s)
29
+ end
30
+ if publisher
31
+ parsed.is_a?(Array) ? parsed << { series: series, publisher: publisher } : parsed.merge({ series: series, publisher: publisher })
32
+ else
33
+ parsed.is_a?(Array) ? parsed << { series: series } : parsed.merge({ series: series })
34
+ end
29
35
  end
30
36
 
31
- def find_parser(series)
32
- PARSERS_CLASSES[series] || Pubid::Nist::Parsers::Default
37
+ def find_parser(publisher, series)
38
+ PARSERS_CLASSES[series] || PARSERS_CLASSES["#{publisher} #{series}"] || Pubid::Nist::Parsers::Default
33
39
  end
34
40
  end
35
41
  end
@@ -1,9 +1,9 @@
1
1
  module Pubid::Nist
2
2
  module Parsers
3
- class NbsCirc < Default
3
+ class Circ < Default
4
4
  rule(:revision) do
5
5
  ((str("rev") >> (words >> year_digits).as(:revision)) |
6
- (str("r") >> digits.as(:revision))
6
+ (str("r") >> (digits | (words >> year_digits)).as(:revision))
7
7
  )
8
8
  end
9
9
 
@@ -1,12 +1,12 @@
1
1
  module Pubid::Nist
2
2
  module Parsers
3
- class NbsCrpl < Default
3
+ class Crpl < Default
4
4
  rule(:first_report_number) do
5
- (digits >> str("-m").maybe).as(:first_report_number)
5
+ (digits >> (str("-m") | str("-M")).maybe).as(:first_report_number)
6
6
  end
7
7
 
8
8
  rule(:part) do
9
- str("_") >> (digits >> str("-") >> digits).as(:part)
9
+ (str("_") | str("pt")) >> (digits >> str("-") >> digits).as(:part)
10
10
  end
11
11
 
12
12
  rule(:supplement) do
@@ -1,11 +1,11 @@
1
1
  module Pubid::Nist
2
2
  module Parsers
3
- class NbsCsm < Default
3
+ class Csm < Default
4
4
  rule(:identifier) do
5
5
  (str(" ") | str(".")) >> report_number.maybe >> parts.repeat.as(:parts)
6
6
  end
7
7
 
8
- rule(:part_prefixes) { str("n") }
8
+ rule(:part_prefixes) { str("n") | str("pt") }
9
9
  end
10
10
  end
11
11
  end
@@ -19,11 +19,11 @@ module Pubid::Nist
19
19
  end
20
20
 
21
21
  rule(:supplement) do
22
- (str("supp") | str("sup")) >> match('\d').repeat.as(:supplement)
22
+ (str("supp") | str("sup")) >> match('[A-Z\d]').repeat.as(:supplement)
23
23
  end
24
24
 
25
25
  rule(:errata) do
26
- str("-").maybe >> str("errata").as(:errata)
26
+ str("-").maybe >> (str("errata") | str("err")).as(:errata)
27
27
  end
28
28
 
29
29
  rule(:index) do
@@ -40,7 +40,7 @@ module Pubid::Nist
40
40
  end
41
41
 
42
42
  rule(:stage) do
43
- (space >> (array_to_str(STAGES["id"].keys + STAGES["id"].keys.map(&:upcase)).as(:id) >>
43
+ ((space | dot) >> (array_to_str(STAGES["id"].keys + STAGES["id"].keys.map(&:upcase)).as(:id) >>
44
44
  array_to_str(STAGES["type"].keys + STAGES["type"].keys.map(&:upcase)).as(:type)).as(:stage))
45
45
  end
46
46
 
@@ -68,7 +68,7 @@ module Pubid::Nist
68
68
  rule(:part_prefixes) { str("pt") | str("p") }
69
69
 
70
70
  rule(:part) do
71
- part_prefixes >> digits.as(:part)
71
+ part_prefixes >> (digits >> (str("-") >> digits).maybe).as(:part)
72
72
  end
73
73
 
74
74
  rule(:revision) do
@@ -99,7 +99,8 @@ module Pubid::Nist
99
99
  end
100
100
 
101
101
  rule(:addendum) do
102
- (str("-add") | str(".add-1")).as(:addendum)
102
+ (str("-add") | str(".add") | str(" Add.")) >>
103
+ (str(" ") | str("-")).maybe >> (digits | str("")).as(:number).as(:addendum)
103
104
  end
104
105
 
105
106
  rule(:section) do
@@ -1,8 +1,15 @@
1
- require_relative "nbs_fips"
2
-
3
1
  module Pubid::Nist
4
2
  module Parsers
5
- class Fips < NbsFips
3
+ class Fips < Default
4
+ rule(:edition) do
5
+ str("-") >> (
6
+ (month_letters.as(:edition_month) >> year_digits.as(:edition_year)) |
7
+ year_digits.as(:edition_year) |
8
+ (month_letters.as(:edition_month) >> match('\d').repeat(2, 2).as(:edition_day) >>
9
+ str("/") >> year_digits.as(:edition_year))
10
+ ) |
11
+ (str("e") >> year_digits.as(:edition_year) >> month_digits.as(:edition_month).maybe)
12
+ end
6
13
  end
7
14
  end
8
15
  end
@@ -1,6 +1,6 @@
1
1
  module Pubid::Nist
2
2
  module Parsers
3
- class NistGcr < Default
3
+ class Gcr < Default
4
4
  rule(:report_number) do
5
5
  (digits >>
6
6
  str("-") >> digits >> (str("-") >> digits).maybe).as(:report_number)
@@ -1,15 +1,7 @@
1
1
  module Pubid::Nist
2
2
  module Parsers
3
- class NbsHb < Default
4
- # found patterns:
5
- # 44e2-1955 -> 44e2
6
- # 146v1-1991
7
- # 105-1-1990 -> 105-1e1990
8
- # 111r1977 / 146v1
9
- # 130-1979 -> 130e1979
10
- # 105-8 -> 105-8
11
- # 28supp1957pt1
12
- # 67suppFeb1965
3
+ class Hb < Default
4
+ rule(:number_suffix) { match("[a-zA-Z]") }
13
5
 
14
6
  rule(:edition) do
15
7
  (str("supp") >> str("").as(:supplement) >>
@@ -1,6 +1,6 @@
1
1
  module Pubid::Nist
2
2
  module Parsers
3
- class NbsMp < Default
3
+ class Mp < Default
4
4
  rule(:edition) do
5
5
  (str("e") >> digits.as(:edition)) | (str("(") >> digits.as(:edition) >> str(")"))
6
6
  end
@@ -1,6 +1,6 @@
1
1
  module Pubid::Nist
2
2
  module Parsers
3
- class NistNcstar < Default
3
+ class Ncstar < Default
4
4
  rule(:number_suffix) { match("[abcdefghijA-Z]") }
5
5
  end
6
6
  end
@@ -1,6 +1,6 @@
1
1
  module Pubid::Nist
2
2
  module Parsers
3
- class NistOwmwp < Default
3
+ class Owmwp < Default
4
4
  rule(:report_number) do
5
5
  digits_with_suffix.as(:first_report_number) >>
6
6
  (str("-") >> (digits_with_suffix >> (str("-") >> digits_with_suffix).maybe)
@@ -1,6 +1,6 @@
1
1
  module Pubid::Nist
2
2
  module Parsers
3
- class NbsRpt < Default
3
+ class Rpt < Default
4
4
  rule(:report_number) do
5
5
  (month_letters >>
6
6
  str("-") >> (month_letters >> year_digits)).as(:report_number) |
@@ -1,6 +1,6 @@
1
1
  module Pubid::Nist
2
2
  module Parsers
3
- class NistSp < Default
3
+ class Sp < Default
4
4
  rule(:version) do
5
5
  (((str("ver") | str(" Ver. ") | str(" Version ")) >> (digits >> (str(".") >> digits).repeat).as(:version)) |
6
6
  (str("v") >>
@@ -50,10 +50,12 @@ module Pubid::Nist
50
50
  end
51
51
 
52
52
  rule(:volume) do
53
- (str("v") | str(" Vol. ")) >> digits.as(:volume)
53
+ # hack for NBS SP 535v2a-l vs NBS SP 535v2m-z
54
+ # https://github.com/metanorma/pubid-nist/issues/98
55
+ (str("v") | str(" Vol. ")) >> (digits >> (str("a-l") | str("m-z")).maybe >> match("[A-Z]").repeat).as(:volume)
54
56
  end
55
57
 
56
- rule(:part_prefixes) { str("pt") | str("p") | str(" Part ") }
58
+ rule(:part_prefixes) { str("pt") | str("p") | str("P") | str(" Part ") }
57
59
  end
58
60
  end
59
61
  end
@@ -0,0 +1,17 @@
1
+ module Pubid::Nist
2
+ module Parsers
3
+ class Tn < Default
4
+ # rule(:report_number) do
5
+ # first_report_number
6
+ # end
7
+
8
+ rule(:edition_prefixes) do
9
+ str("-") | str("e")
10
+ end
11
+
12
+ rule(:second_report_number) do
13
+ year_digits.absent? >> (digits_with_suffix | str("A")).as(:second_report_number)
14
+ end
15
+ end
16
+ end
17
+ end
@@ -2,7 +2,7 @@ PUBLISHERS = YAML.load_file(File.join(File.dirname(__FILE__),
2
2
  "../../../publishers.yaml"))
3
3
 
4
4
  module Pubid::Nist
5
- class Publisher
5
+ class Publisher < Pubid::Core::Entity
6
6
  attr_accessor :publisher
7
7
 
8
8
  def initialize(publisher:)
@@ -17,10 +17,6 @@ module Pubid::Nist
17
17
  PUBLISHERS[format.to_s][@publisher]
18
18
  end
19
19
 
20
- def ==(other)
21
- other.publisher == @publisher
22
- end
23
-
24
20
  def self.publishers_keys
25
21
  PUBLISHERS["long"].keys
26
22
  end
@@ -0,0 +1,20 @@
1
+ require_relative "base"
2
+
3
+ module Pubid::Nist::Renderer
4
+ class Addendum < Base
5
+ def render_identifier(params, opts)
6
+ # = "%{base}" % params
7
+ result = params[:base].to_s(opts[:format])
8
+ case opts[:format]
9
+ when :long
10
+ "Addendum to #{result}"
11
+ when :abbrev
12
+ "Add. to #{result}"
13
+ when :short
14
+ "#{result} Add."
15
+ when :mr
16
+ "#{result}.add-1"
17
+ end
18
+ end
19
+ end
20
+ end