nistbib 0.1.2 → 0.1.5

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
- SHA256:
3
- metadata.gz: 434eb7054df007c7604456b7770b728f5396b6bba71fd0f9e922147d0522962d
4
- data.tar.gz: b486651f96863f6d4b5c3b3e8e731fbe16d056188a1fe072108e9c368b057d4a
2
+ SHA1:
3
+ metadata.gz: 93e42e10363b0cf5ace10ea2540e20a7d96bacfa
4
+ data.tar.gz: 958b66ae4601efb35dbd366a80b5c09ea22a50bd
5
5
  SHA512:
6
- metadata.gz: f6b366f616b619aaa927a4312af17ca9eb9c2928ec7483acc4dcb3b6f4c5ddc858656ebbe72ea49e98cff7c42e3476aa4afcc5fb934bce5a7c21b3ca3a56ab34
7
- data.tar.gz: 040e6331167a4c779c61d348fb230947c145ddb064d2359e3ded3dafd898d46d443cbbe44fac0d3f092d2e47c0151c4a468a0558ee1706076aaaec259ece416c
6
+ metadata.gz: 4fb26a328169066da7e921df16b525a67baa6fc5b8ddebb14fbcb08af41decddd6e27b40a173aa9015972e9a22f844ceea4ee7dd711444600efac36a240a49eb
7
+ data.tar.gz: e71f295627f4f640f81432508783365ccbc868cc98f277ecb153e920a9e62339d6cf79f81f64d8ee731b09ede32414d3322a9ab162dce416b543fc040da0055b
data/.gitignore CHANGED
@@ -7,6 +7,7 @@
7
7
  /spec/reports/
8
8
  /tmp/
9
9
  .vscode/
10
+ .rubocop-https---raw-githubusercontent-com-riboseinc-oss-guides-master-ci-rubocop-yml
10
11
 
11
12
  # rspec failure tracking
12
13
  .rspec_status
data/.rubocop.yml ADDED
@@ -0,0 +1,10 @@
1
+ # This project follows the Ribose OSS style guide.
2
+ # https://github.com/riboseinc/oss-guides
3
+ # All project-specific additions and overrides should be specified in this file.
4
+
5
+ inherit_from:
6
+ - https://raw.githubusercontent.com/riboseinc/oss-guides/master/ci/rubocop.yml
7
+ AllCops:
8
+ TargetRubyVersion: 2.3
9
+ Rails:
10
+ Enabled: true
data/Gemfile.lock CHANGED
@@ -1,8 +1,8 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- nistbib (0.1.2)
5
- iso-bib-item (~> 0.4.2)
4
+ nistbib (0.1.5)
5
+ relaton-bib (~> 0.1.1)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
@@ -20,12 +20,7 @@ GEM
20
20
  docile (1.3.1)
21
21
  equivalent-xml (0.6.0)
22
22
  nokogiri (>= 1.4.3)
23
- hashdiff (0.3.8)
24
- iso-bib-item (0.4.5)
25
- isoics (~> 0.1.6)
26
- nokogiri (~> 1.8.4)
27
- ruby_deep_clone (~> 0.8.0)
28
- isoics (0.1.7)
23
+ hashdiff (0.3.9)
29
24
  json (2.2.0)
30
25
  method_source (0.9.2)
31
26
  mini_portile2 (2.3.0)
@@ -39,13 +34,16 @@ GEM
39
34
  pry (~> 0.10)
40
35
  public_suffix (3.0.3)
41
36
  rake (10.5.0)
37
+ relaton-bib (0.1.3)
38
+ addressable
39
+ nokogiri (~> 1.8.4)
42
40
  rspec (3.8.0)
43
41
  rspec-core (~> 3.8.0)
44
42
  rspec-expectations (~> 3.8.0)
45
43
  rspec-mocks (~> 3.8.0)
46
44
  rspec-core (3.8.0)
47
45
  rspec-support (~> 3.8.0)
48
- rspec-expectations (3.8.2)
46
+ rspec-expectations (3.8.3)
49
47
  diff-lcs (>= 1.2.0, < 2.0)
50
48
  rspec-support (~> 3.8.0)
51
49
  rspec-mocks (3.8.0)
@@ -54,7 +52,6 @@ GEM
54
52
  rspec-support (3.8.0)
55
53
  ruby-debug-ide (0.6.1)
56
54
  rake (>= 0.8.1)
57
- ruby_deep_clone (0.8.0)
58
55
  safe_yaml (1.0.5)
59
56
  simplecov (0.16.1)
60
57
  docile (~> 1.1)
data/README.adoc CHANGED
@@ -40,7 +40,7 @@ hit_collection = NistBib::NistBibliography.search("8200")
40
40
  <NistBib::Hit:0x007f82b9b2a1e0 @text="8200" @fetched="false" @fullIdentifier="" @title="8200">]
41
41
 
42
42
  item = hit_collection[1].fetch
43
- => #<IsoBibItem::IsoBibliographicItem:0x007f82b986e668
43
+ => #<NistBib::NistBibliographicItem:0x007f82b986e668
44
44
  ...
45
45
  ----
46
46
 
@@ -48,13 +48,13 @@ hit_collection = NistBib::NistBibliography.search("8200")
48
48
  [source,ruby]
49
49
  ----
50
50
  item.to_xml
51
- => "<bibitem type="" id="NISTIR8200(DRAFT)">
52
- <fetched>2019-02-11</fetched>
51
+ => "<nist-standard>
52
+ <fetched>2019-05-03</fetched>
53
53
  <title format="text/plain" language="en" script="Latn">
54
54
  Interagency Report on Status of International Cybersecurity Standardization for the Internet of Things (IoT)
55
55
  </title>
56
56
  ...
57
- </bibitem>"
57
+ </nist-standard>"
58
58
  ----
59
59
 
60
60
  === Get code, and year
@@ -62,7 +62,32 @@ item.to_xml
62
62
  ----
63
63
  NistBib::NistBibliography.get("8200", "2018", {})
64
64
  fetching 8200...
65
- => #<IsoBibItem::IsoBibliographicItem:0x007f82bb3370a8
65
+ => #<NistBib::NistBibliographicItem:0x007f82bb3370a8
66
+ ...
67
+ ----
68
+
69
+ === Get short citation
70
+ Short citation is a convetion about a citation's format. The format for NIST publications is:
71
+ ----
72
+ NIST {abbrev(series)} {docnumber} {(edition), optional} {(stage), optioal}
73
+ # or
74
+ {abbrev(series)} {docnumber} {(edition), optional} {(stage), optioal}
75
+ ----
76
+ - `(stage)` is empty if the state is "final" (published)
77
+ - `(edition)` is the date of publication or update
78
+ - `docnumber` is the full NIST number, including revision, e.g., 800-52
79
+
80
+ The format for FIPS publications is:
81
+ ----
82
+ FIPS {docnumber}
83
+ # or
84
+ NIST FIPS {docnumber}
85
+ ----
86
+ [source,ruby]
87
+ ----
88
+ NistBib::NistBibliography.get("8200", "2018", {})
89
+ fetching 8200...
90
+ => #<NistBib::NistBibliographicItem:0x007f82bb3370a8
66
91
  ...
67
92
  ----
68
93
 
data/lib/nistbib.rb CHANGED
@@ -1,8 +1,8 @@
1
1
  require "nistbib/version"
2
- require 'nistbib/nist_bibliography'
2
+ require "nistbib/nist_bibliography"
3
3
 
4
4
  if defined? Relaton
5
- require_relative 'relaton/processor'
5
+ require_relative "relaton/processor"
6
6
  Relaton::Registry.instance.register(Relaton::NistBib::Processor)
7
7
  end
8
8
 
@@ -0,0 +1,30 @@
1
+ module NistBib
2
+ class CommentPeriod
3
+ # @return [Date]
4
+ attr_reader :from
5
+
6
+ # @rerurn [Date, NilClass]
7
+ attr_reader :to
8
+
9
+ # @return [Date, NilClass]
10
+ attr_reader :extended
11
+
12
+ # @param from [Date]
13
+ # @param to [Date, NilClass]
14
+ # @param extended [Date, NilClass]
15
+ def initialize(from, to = nil, extended = nil)
16
+ @from = from
17
+ @to = to
18
+ @extended = extended
19
+ end
20
+
21
+ # @param [Nokogiri::XML::Builder]
22
+ def to_xml(builder)
23
+ builder.commentperiod do
24
+ builder.from from.to_s
25
+ builder.to to.to_s if to
26
+ builder.extended extended.to_s if extended
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,44 @@
1
+ module NistBib
2
+ class DocumentStatus
3
+ STAGES = %w[
4
+ draft-internal draft-wip draft-prelim draft-public final final-review
5
+ ].freeze
6
+
7
+ SUBSTAGES = %w[active retired withdrawn].freeze
8
+
9
+ # @return [String]
10
+ attr_reader :stage
11
+
12
+ # @return [String, NilClass]
13
+ attr_reader :substage
14
+
15
+ # @return [String, NilClass]
16
+ attr_reader :iteration
17
+
18
+ # @param stage [String]
19
+ # @param substage [String, NilClass]
20
+ # @param iteration [String, NilClass]
21
+ def initialize(stage:, substage: nil, iteration: nil)
22
+ unless STAGES.include? stage
23
+ raise ArgumentError, "invalid argument: stage (#{stage})"
24
+ end
25
+
26
+ if substage && !SUBSTAGES.include?(substage)
27
+ raise ArgumentError, "invalid argument: substage (#{substage})"
28
+ end
29
+
30
+ @stage = stage
31
+ @substage = substage
32
+ @iteration = iteration
33
+ end
34
+
35
+ # @param builder [Nokogiri::XML::Builder]
36
+ def to_xml(builder)
37
+ builder.status do
38
+ builder.stage stage
39
+ builder.substage substage if substage
40
+ builder.iteration iteration if iteration
41
+ end
42
+ end
43
+ end
44
+ end
data/lib/nistbib/hit.rb CHANGED
@@ -3,21 +3,21 @@
3
3
  module NistBib
4
4
  # Hit.
5
5
  class Hit
6
- # @return [Isobib::HitCollection]
6
+ # @return [NistBib::HitCollection]
7
7
  attr_reader :hit_collection
8
8
 
9
9
  # @return [Array<Hash>]
10
10
  attr_reader :hit
11
11
 
12
12
  # @param hit [Hash]
13
- # @param hit_collection [Isobib:HitCollection]
13
+ # @param hit_collection [NistBib:HitCollection]
14
14
  def initialize(hit, hit_collection = nil)
15
15
  @hit = hit
16
16
  @hit_collection = hit_collection
17
17
  end
18
18
 
19
19
  # Parse page.
20
- # @return [Isobib::IsoBibliographicItem]
20
+ # @return [NistBib::NistBliographicItem]
21
21
  def fetch
22
22
  @fetch ||= Scrapper.parse_page @hit
23
23
  end
@@ -37,15 +37,8 @@ module NistBib
37
37
  end
38
38
 
39
39
  # @return [String]
40
- def to_xml(opts = {})
41
- #if builder
42
- #fetch.to_xml builder, opts
43
- #else
44
- builder = Nokogiri::XML::Builder.new(encoding: 'UTF-8') do |xml|
45
- fetch.to_xml xml, opts
46
- end
47
- builder.doc.root.to_xml
48
- #end
40
+ def to_xml
41
+ fetch.to_xml
49
42
  end
50
43
  end
51
44
  end
@@ -22,23 +22,35 @@ module NistBib
22
22
 
23
23
  # @param ref_nbr [String]
24
24
  # @param year [String]
25
- def initialize(ref_nbr, year = nil) #(text, hit_pages = nil)
25
+ # @param opts [Hash]
26
+ def initialize(ref_nbr, year = nil, opts)
26
27
  @text = ref_nbr
27
28
  @year = year
28
29
  from, to = nil
29
30
  if year
30
- d = Date.strptime year, '%Y'
31
- from = d.strftime '%m/%d/%Y'
32
- to = d.next_year.prev_day.strftime '%m/%d/%Y'
31
+ d = Date.strptime year, "%Y"
32
+ from = d.strftime "%m/%d/%Y"
33
+ to = d.next_year.prev_day.strftime "%m/%d/%Y"
33
34
  end
34
- url = "#{DOMAIN}/publications/search?keywords-lg=#{ref_nbr}&dateFrom-lg=#{from}&dateTo-lg=#{to}"
35
+ url = "#{DOMAIN}/publications/search?keywords-lg=#{ref_nbr}"
36
+ url += "&dateFrom-lg=#{from}" if from
37
+ url += "&dateTo-lg=#{to}" if to
38
+ url += "&status-lg=Draft" if /PD/ =~ opts[:stage]
35
39
  doc = Nokogiri::HTML OpenURI.open_uri(::Addressable::URI.parse(url).normalize)
36
- hits = doc.css('table.publications-table > tbody > tr').map do |h|
37
- link = h.at('td/div/strong/a')
38
- code = h.at('td[2]').text.strip
40
+ hits = doc.css("table.publications-table > tbody > tr").map do |h|
41
+ link = h.at("td/div/strong/a")
42
+ serie = h.at("td[1]").text.strip
43
+ code = h.at("td[2]").text.strip
39
44
  title = link.text
40
45
  url = DOMAIN + link[:href]
41
- Hit.new({ code: code, title: title, url: url }, self)
46
+ status = h.at("td[4]").text.strip.downcase
47
+ release_date = Date.strptime h.at("td[5]").text.strip, "%m/%d/%Y"
48
+ Hit.new(
49
+ {
50
+ code: code, serie: serie, title: title, url: url, status: status,
51
+ release_date: release_date
52
+ }, self
53
+ )
42
54
  end
43
55
  concat hits
44
56
  # concat(hits.map { |h| Hit.new(h, self) })
@@ -0,0 +1,16 @@
1
+ module NistBib
2
+ class Keyword
3
+ # @return [Nokogiri::XML::DocumentFragment]
4
+ attr_reader :element
5
+
6
+ # @param element [String]
7
+ def initialize(element)
8
+ @element = Nokogiri::XML.fragment element
9
+ end
10
+
11
+ # @param builder [Nokogiri::XML::Builder]
12
+ def to_xml(builder)
13
+ builder.keyword element.to_xml
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,75 @@
1
+ module NistBib
2
+ class NistBibliographicItem < RelatonBib::BibliographicItem
3
+ # @return [NistBib::NistSeries, NilClass]
4
+ attr_reader :nistseries
5
+
6
+ # @return [Array<NistBib::Keyword>]
7
+ attr_reader :keyword
8
+
9
+ # @return [NistBib::CommentPeriod]
10
+ attr_reader :commentperiod
11
+
12
+ # @param id [String, NilClass]
13
+ # @param title [Array<RelatonBib::TypedTitleString>]
14
+ # @param formattedref [RelatonBib::FormattedRef, NilClass]
15
+ # @param type [String, NilClass]
16
+ # @param docid [Array<RelatonBib::DocumentIdentifier>]
17
+ # @param docnumber [String, NilClass]
18
+ # @param language [Arra<String>]
19
+ # @param script [Array<String>]
20
+ # @param docstatus [NistBib::DocumentStatus, NilClass]
21
+ # @param edition [String, NilClass]
22
+ # @param version [RelatonBib::BibliographicItem::Version, NilClass]
23
+ # @param biblionote [Array<RelatonBib::FormattedStrong>]
24
+ # @param series [Array<RelatonBib::Series>]
25
+ # @param medium [RelatonBib::Medium, NilClas]
26
+ # @param place [Array<String>]
27
+ # @param extent [Array<Relaton::BibItemLocality>]
28
+ # @param accesslocation [Array<String>]
29
+ # @param classification [RelatonBib::Classification, NilClass]
30
+ # @param validity [RelatonBib:Validity, NilClass]
31
+ # @param fetched [Date, NilClass] default nil
32
+ # @param keyword [Array<NistBib::Keyword>]
33
+ # @param commentperiod [NistBib::CommentPeriod]
34
+ #
35
+ # @param dates [Array<Hash>]
36
+ # @option dates [String] :type
37
+ # @option dates [String] :from
38
+ # @option dates [String] :to
39
+ #
40
+ # @param contributors [Array<Hash>]
41
+ # @option contributors [String] :type
42
+ # @option contributors [String] :from
43
+ # @option contributirs [String] :to
44
+ # @option contributors [String] :abbreviation
45
+ # @option contributors [Array<String>] :roles
46
+ #
47
+ # @param abstract [Array<Hash>]
48
+ # @option abstract [String] :content
49
+ # @option abstract [String] :language
50
+ # @option abstract [String] :script
51
+ # @option abstract [String] :type
52
+ #
53
+ # @param relations [Array<Hash>]
54
+ # @option relations [String] :type
55
+ # @option relations [RelatonBib::BibliographicItem] :bibitem
56
+ # @option relations [Array<RelatonBib::BibItemLocality>] :bib_locality
57
+ #
58
+ # @param nistseries [Nist::NistSeries, NilClass]
59
+ def initialize(**args)
60
+ @nistseries = args.delete :nistseries
61
+ @keyword = args.delete(:keyword) || []
62
+ @commentperiod = args.delete :commentperiod
63
+ super
64
+ end
65
+
66
+ # @param builder [Nokogiri::XML::Builder]
67
+ def to_xml(builder = nil)
68
+ super builder, root: :bibitem, date_format: :short do |b|
69
+ nistseries&.to_xml b
70
+ keyword.each { |kw| kw.to_xml b }
71
+ commentperiod&.to_xml b
72
+ end
73
+ end
74
+ end
75
+ end
@@ -1,16 +1,23 @@
1
- require 'nistbib/scrapper'
2
- require 'nistbib/hit_collection'
1
+ require "relaton_bib"
2
+ require "nistbib/nist_bibliographic_item"
3
+ require "nistbib/scrapper"
4
+ require "nistbib/hit_collection"
5
+ require "nistbib/nist_series"
6
+ require "nistbib/xml_parser"
7
+ require "nistbib/keyword"
8
+ require "nistbib/comment_period"
9
+ require "nistbib/document_status"
3
10
 
4
11
  module NistBib
5
12
  class NistBibliography
6
13
  class << self
7
14
  # @param text [String]
8
15
  # @return [NistBib::HitCollection]
9
- def search(text, year = nil)
10
- HitCollection.new text, year
16
+ def search(text, year = nil, opts = {})
17
+ HitCollection.new text, year, opts
11
18
  rescue
12
19
  warn "Could not access https://www.nist.gov"
13
- []
20
+ []
14
21
  end
15
22
 
16
23
  # @param code [String] the NIST standard Code to look up (e..g "8200")
@@ -18,6 +25,19 @@ module NistBib
18
25
  # @param opts [Hash] options; restricted to :all_parts if all-parts reference is required
19
26
  # @return [String] Relaton XML serialisation of reference
20
27
  def get(code, year = nil, opts = {})
28
+ /^(?<code2>[^\(]+)\((?<date2>\w+\s(\d{2},\s)?\d{4})\)(\s\()?(?<stage>[^\)]+)?/ =~ code
29
+ if code2
30
+ code = code2.strip
31
+ if date2
32
+ if /\w+\s\d{4}/ =~ date2
33
+ opts[:issued_date] = Time.strptime date2, "%B %Y"
34
+ elsif /\w+\s\d{2},\s\d{4}/ =~ date2
35
+ opts[:updated_date] = Time.strptime date2, "%B %d, %Y"
36
+ end
37
+ end
38
+ opts[:stage] = stage if stage
39
+ end
40
+
21
41
  if year.nil?
22
42
  /^(?<code1>[^:]+):(?<year1>[^:]+)$/ =~ code
23
43
  unless code1.nil?
@@ -26,36 +46,48 @@ module NistBib
26
46
  end
27
47
  end
28
48
 
29
- code += '-1' if opts[:all_parts]
49
+ code += "-1" if opts[:all_parts]
30
50
  ret = nistbib_get1(code, year, opts)
31
- return nil if ret.nil?
32
- ret.to_most_recent_reference unless year || opts[:keep_year]
33
- ret.to_all_parts if opts[:all_parts]
51
+ # return nil if ret.nil?
52
+ # ret.to_most_recent_reference unless year || opts[:keep_year]
53
+ # ret.to_all_parts if opts[:all_parts]
34
54
  ret
35
55
  end
36
56
 
37
57
  private
38
58
 
39
59
  def nistbib_get1(code, year, opts)
40
- result = nistbib_search_filter(code, year) or return nil
41
- ret = nistbib_results_filter(result, year)
60
+ result = nistbib_search_filter(code, year, opts) or return nil
61
+ ret = nistbib_results_filter(result, year, opts)
42
62
  return ret[:ret] if ret[:ret]
63
+
43
64
  fetch_ref_err(code, year, ret[:years])
44
65
  end
45
66
 
46
- # Sort through the results from Isobib, fetching them three at a time,
67
+ # Sort through the results from NistBib, fetching them three at a time,
47
68
  # and return the first result that matches the code,
48
69
  # matches the year (if provided), and which # has a title (amendments do not).
49
70
  # Only expects the first page of results to be populated.
50
71
  # Does not match corrigenda etc (e.g. ISO 3166-1:2006/Cor 1:2007)
51
72
  # If no match, returns any years which caused mismatch, for error reporting
52
- def nistbib_results_filter(result, year)
73
+ def nistbib_results_filter(result, year, opts)
53
74
  missed_years = []
54
75
  result.each_slice(3) do |s| # ISO website only allows 3 connections
55
- fetch_pages(s, 3).each_with_index do |r, i|
76
+ fetch_pages(s, 3).each_with_index do |r, _i|
77
+ if opts[:issued_date]
78
+ r.dates.select { |d| d.type == "issued" }.each do |d|
79
+ return { ret: r } if opts[:issued_date] == d.on
80
+ end
81
+ elsif opts[:updated_date]
82
+ r.dates.select { |d| d.type == "published" }.each do |d|
83
+ return { ret: r } if opts[:updated_date] == d.on
84
+ end
85
+ end
56
86
  return { ret: r } if !year
87
+
57
88
  r.dates.select { |d| d.type == "published" }.each do |d|
58
89
  return { ret: r } if year.to_i == d.on.year
90
+
59
91
  missed_years << d.on.year
60
92
  end
61
93
  end
@@ -71,16 +103,13 @@ module NistBib
71
103
  workers.result.sort { |x, y| x[:i] <=> y[:i] }.map { |x| x[:hit] }
72
104
  end
73
105
 
74
- def nistbib_search_filter(code, year)
75
- # docidrx = %r{^(ISO|IEC)[^0-9]*\s[0-9-]+}
76
- # corrigrx = %r{^(ISO|IEC)[^0-9]*\s[0-9-]+:[0-9]+/}
106
+ def nistbib_search_filter(code, year, opts)
107
+ docid = code.match(%r{[0-9-]{3,}}).to_s
108
+ serie = code.match(%r{(FISP|SP|NISTIR)(?=\s)})
77
109
  warn "fetching #{code}..."
78
- result = search(code, year)
110
+ result = search(code, year, opts)
79
111
  result.select do |i|
80
- !i.hit[:code].empty?
81
- # i.hit[:code] &&
82
- # i.hit[:code].match(docidrx).to_s == code &&
83
- # corrigrx !~ i.hit[:code]
112
+ i.hit[:code]&.include?(docid) && (!serie || i.hit[:serie] == serie.to_s)
84
113
  end
85
114
  end
86
115
 
@@ -0,0 +1,35 @@
1
+ module NistBib
2
+ class NistSeries
3
+ ABBREVIATIONS = {
4
+ "NISTIR" => "NIST Interagency/Internal Report",
5
+ "NIST SP" => "NIST Special Publication",
6
+ "NIST FIPS" => "NIST Federal Information Processing Standards",
7
+ }.freeze
8
+
9
+ # @return [String]
10
+ attr_reader :type
11
+
12
+ # @return [String]
13
+ attr_reader :title
14
+
15
+ # @return [RalatonBib::LocalizedString, NilClass]
16
+ attr_reader :abbreviation
17
+
18
+ # @param abbreviation [RelatonBib::LocalizedString, NilClass]
19
+ def initialize(abbreviation)
20
+ @type = "main"
21
+ @abbreviation = RelatonBib::LocalizedString.new(
22
+ abbreviation.downcase.gsub(" ", "-"), "en", "Latn"
23
+ )
24
+ @title = ABBREVIATIONS[abbreviation]
25
+ end
26
+
27
+ # @param builder [Nokogiri::XML::Builder]
28
+ def to_xml(builder)
29
+ builder.series type: type do
30
+ builder.title title
31
+ builder.abbreviation { abbreviation.to_xml builder } if abbreviation
32
+ end
33
+ end
34
+ end
35
+ end
@@ -1,9 +1,9 @@
1
- require 'iso_bib_item'
1
+ require "relaton_bib"
2
2
 
3
3
  module NistBib
4
- module Scrapper
4
+ class Scrapper
5
5
  class << self
6
- DOMAIN = 'https://csrc.nist.gov'
6
+ DOMAIN = "https://csrc.nist.gov".freeze
7
7
 
8
8
  # Parse page.
9
9
  # @param hit_data [Hash]
@@ -12,22 +12,25 @@ module NistBib
12
12
  def parse_page(hit_data)
13
13
  doc = get_page hit_data[:url]
14
14
 
15
- IsoBibItem::IsoBibliographicItem.new(
16
- docid: fetch_docid(doc),
17
- edition: nil,
18
- language: ['en'],
19
- script: ['Latn'],
20
- titles: fetch_titles(hit_data),
21
- type: nil,
22
- docstatus: fetch_status(doc),
23
- ics: [],
24
- dates: fetch_dates(doc),
25
- contributors: fetch_contributors,
26
- workgroup: nil,
27
- abstract: fetch_abstract(doc),
28
- copyright: fetch_copyright(doc),
29
- link: fetch_link(doc, hit_data[:url]),
30
- relations: fetch_relations(doc)
15
+ NistBibliographicItem.new(
16
+ fetched: Date.today.to_s,
17
+ type: "standard",
18
+ id: fetch_id(doc),
19
+ titles: fetch_titles(hit_data),
20
+ link: fetch_link(doc),
21
+ docid: fetch_docid(doc),
22
+ dates: fetch_dates(doc, hit_data[:release_date]),
23
+ contributors: fetch_contributors(doc),
24
+ edition: nil,
25
+ language: ["en"],
26
+ script: ["Latn"],
27
+ abstract: fetch_abstract(doc),
28
+ docstatus: fetch_status(doc, hit_data[:status]),
29
+ copyright: fetch_copyright(doc),
30
+ relations: fetch_relations(doc),
31
+ nistseries: fetch_nistseries(doc),
32
+ keyword: fetch_keywords(doc),
33
+ commentperiod: fetch_commentperiod(doc),
31
34
  )
32
35
  end
33
36
 
@@ -38,7 +41,7 @@ module NistBib
38
41
  # @return [Array<Nokogiri::HTML::Document, String>]
39
42
  def get_page(url)
40
43
  uri = URI url
41
- resp = Net::HTTP.get_response(uri)#.encode("UTF-8")
44
+ resp = Net::HTTP.get_response(uri) # .encode("UTF-8")
42
45
  Nokogiri::HTML(resp.body)
43
46
  end
44
47
 
@@ -46,88 +49,127 @@ module NistBib
46
49
  # @param doc [Nokogiri::HTML::Document]
47
50
  # @return [Hash]
48
51
  def fetch_docid(doc)
49
- item_ref = doc.at("//div[contains(@class, 'publications-detail')]/h3").text.strip
50
- unless item_ref
51
- return { project_number: '?', part_number: '', prefix: nil, type: 'NIST', id: '?' }
52
- end
53
- m = item_ref.match(/(?<=\s)(?<project>[\d-]+)(?<vol>\sVol\.\s)?(?<part>(?(<vol>)\d+|))/)
54
- {
55
- project_number: m[:project],
56
- part_number: m[:part],
57
- subpart_number: nil,
58
- prefix: nil,
59
- type: 'NIST',
60
- id: item_ref
61
- }
52
+ item_ref = doc.at("//div[contains(@class, 'publications-detail')]/h3").
53
+ text.strip
54
+ return [RelatonBib::DocumentIdentifier.new(type: "nist", id: "?")] unless item_ref
55
+
56
+ [RelatonBib::DocumentIdentifier.new(id: item_ref, type: "nist")]
57
+ end
58
+
59
+ # Fetch id.
60
+ # @param doc [Nokogiri::HTML::Document]
61
+ # @return [String]
62
+ def fetch_id(doc)
63
+ doc.at("//div[contains(@class, 'publications-detail')]/h3").text.
64
+ strip.gsub(/\s/, "")
62
65
  end
63
66
 
64
67
  # Fetch status.
65
68
  # @param doc [Nokogiri::HTML::Document]
66
69
  # @param status [String]
67
70
  # @return [Hash]
68
- def fetch_status(doc)
69
- withdrawn = doc.at "//p/strong[text()='Withdrawn:']"
70
- return { status: 'withdrawn', stage: '95', substage: '99' } if withdrawn
71
-
72
- item_ref = doc.at("//div[contains(@class, 'publications-detail')]/h3").text.strip
73
- wip = item_ref.match(/(?<=\()\w+/).to_s
74
- case wip
75
- when 'DRAFT'
76
- { status: 'working-draft', stage: '20', substage: '20' }
77
- # when 'RETIRED DRAFT'
78
- # { status: 'committee-draft', stage: '30', substage: '00' }
71
+ def fetch_status(doc, status)
72
+ case status
73
+ when "draft (withdrawn)"
74
+ stage = "draft-public"
75
+ substage = "withdrawn"
76
+ when "retired draft"
77
+ stage = "draft-public"
78
+ substage = "retired"
79
+ when "withdrawn"
80
+ stage = "final"
81
+ substage = "withdrawn"
82
+ when "draft"
83
+ stage = "draft-public"
84
+ substage = "active"
79
85
  else
80
- { status: 'published', stage: '60', substage: '60' }
86
+ stage = status
87
+ substage = "active"
81
88
  end
89
+
90
+ # if doc.at "//p/strong[text()='Withdrawn:']"
91
+ # substage = "withdrawn"
92
+ # else
93
+ # substage = "active"
94
+ # item_ref = doc.at(
95
+ # "//div[contains(@class, 'publications-detail')]/h3",
96
+ # ).text.strip
97
+ # wip = item_ref.match(/(?<=\()\w+/).to_s
98
+ # stage = "draft-public" if wip == "DRAFT"
99
+ # end
100
+ NistBib::DocumentStatus.new(stage: stage, substage: substage)
82
101
  end
83
102
 
84
103
  # Fetch titles.
85
104
  # @param hit_data [Hash]
86
105
  # @return [Array<Hash>]
87
106
  def fetch_titles(hit_data)
88
- titles = hit_data[:title].split ' - '
89
- # case titles.size
90
- # when 0
91
- # intro, main, part = nil, "", nil
92
- # when 1
93
- intro, main, part = nil, titles[0], nil
94
- # when 2
95
- # if /^(Part|Partie) \d+:/ =~ titles[1]
96
- # intro, main, part = nil, titles[0], titles[1]
97
- # else
98
- # intro, main, part = titles[0], titles[1], nil
99
- # end
100
- # when 3
101
- # intro, main, part = titles[0], titles[1], titles[2]
102
- # else
103
- # intro, main, part = titles[0], titles[1], titles[2..-1]&.join(" -- ")
104
- # end
105
- [{
106
- title_intro: intro,
107
- title_main: main,
108
- title_part: part,
109
- language: 'en',
110
- script: 'Latn'
111
- }]
107
+ [{ content: hit_data[:title], language: "en", script: "Latn", format: "text/plain" }]
112
108
  end
113
109
 
114
110
  # Fetch dates
115
111
  # @param doc [Nokogiri::HTML::Document]
116
112
  # @return [Array<Hash>]
117
- def fetch_dates(doc)
118
- dates = []
119
- d = doc.at("//strong[text()='Date Published:']/../text()[2]").text.strip
120
- publish_date = Date.strptime(d, '%B %Y').to_s
121
- unless publish_date.empty?
122
- dates << { type: 'published', on: publish_date }
123
- end
113
+ def fetch_dates(doc, release_date)
114
+ dates = [{ type: "published", on: release_date.to_s }]
115
+
116
+ d = doc.at("//span[@id='pub-release-date']").text.strip
117
+ date = if /(?<date>\w+\s\d{4})/ =~ d
118
+ Date.strptime(date, "%B %Y")
119
+ elsif /(?<date>\w+\s\d{2},\s\d{4})/ =~ d
120
+ Date.strptime(date, "%B %d, %Y")
121
+ end
122
+ dates << { type: "issued", on: date.to_s }
123
+
124
124
  dates
125
125
  end
126
126
 
127
- def fetch_contributors
128
- name = 'National Institute of Standards and Technology'
129
- url = 'www.nist.gov'
130
- [{ entity: { name: name, url: url, abbreviation: 'NIST' }, roles: ['publisher'] }]
127
+ def fetch_contributors(doc)
128
+ name = "National Institute of Standards and Technology"
129
+ org = RelatonBib::Organization.new(
130
+ name: name, url: "www.nist.gov", abbreviation: "NIST",
131
+ )
132
+ contribs = [
133
+ RelatonBib::ContributionInfo.new(entity: org, role: ["publisher"]),
134
+ ]
135
+
136
+ authors = doc.at('//h4[.="Author(s)"]/following-sibling::p')
137
+ contribs += contributors(authors, "author")
138
+
139
+ editors = doc.at('//h4[.="Editor(s)"]/following-sibling::p')
140
+ contribs + contributors(editors, "editor")
141
+ end
142
+
143
+ def contributors(doc, role)
144
+ return [] if doc.nil?
145
+
146
+ doc.text.split(", ").map do |contr|
147
+ /(?<an>.+?)(\s+\((?<abbrev>.+?)\))?$/ =~ contr
148
+ if abbrev && an.downcase !~ /(task|force|group)/ && an.split.size.between?(2, 3)
149
+ fullname = RelatonBib::FullName.new(
150
+ completename: RelatonBib::LocalizedString.new(an, "en", "Latn"),
151
+ )
152
+ case abbrev
153
+ when "NIST"
154
+ org_name = "National Institute of Standards and Technology"
155
+ url = "www.nist.gov"
156
+ when "MITRE"
157
+ org_name = abbrev
158
+ url = "www.mitre.org"
159
+ else
160
+ org_name = abbrev
161
+ url = nil
162
+ end
163
+ org = RelatonBib::Organization.new name: org_name, url: url, abbreviation: abbrev
164
+ affiliation = RelatonBib::Affilation.new org
165
+ entity = RelatonBib::Person.new(
166
+ name: fullname, affiliation: [affiliation], contacts: [],
167
+ )
168
+ else
169
+ entity = RelatonBib::Organization.new name: an, abbreviation: abbrev
170
+ end
171
+ RelatonBib::ContributionInfo.new entity: entity, role: [role]
172
+ end
131
173
  end
132
174
 
133
175
  # Fetch abstracts.
@@ -136,9 +178,10 @@ module NistBib
136
178
  def fetch_abstract(doc)
137
179
  abstract_content = doc.xpath('//div[contains(@class, "pub-abstract-callout")]/div[1]/p').text
138
180
  [{
139
- content: abstract_content,
140
- language: 'en',
141
- script: 'Latn'
181
+ content: abstract_content,
182
+ language: "en",
183
+ script: "Latn",
184
+ format: "text/plain",
142
185
  }]
143
186
  end
144
187
 
@@ -146,39 +189,83 @@ module NistBib
146
189
  # @param title [String]
147
190
  # @return [Hash]
148
191
  def fetch_copyright(doc)
149
- name = 'National Institute of Standards and Technology'
150
- url = 'www.nist.gov'
151
- d = doc.at("//strong[text()='Date Published:']/../text()[2]").text.strip
152
- from = d.match(/\d{4}$/).to_s
153
- { owner: { name: name, abbreviation: 'NIST', url: url }, from: from }
192
+ name = "National Institute of Standards and Technology"
193
+ url = "www.nist.gov"
194
+ d = doc.at("//span[@id='pub-release-date']").text.strip
195
+ from = d.match(/\d{4}/).to_s
196
+ { owner: { name: name, abbreviation: "NIST", url: url }, from: from }
154
197
  end
155
198
 
156
199
  # Fetch links.
157
200
  # @param doc [Nokogiri::HTML::Document]
158
- # @param url [String]
159
201
  # @return [Array<Hash>]
160
- def fetch_link(doc, url)
161
- links = [{ type: 'src', content: url }]
162
- obp_elms = doc.at_css('a[data-identity="first-link-display"]')
163
- links << { type: 'obp', content: obp_elms[:href] } if obp_elms
202
+ def fetch_link(doc)
203
+ pub = doc.at "//p/strong[.='Publication:']"
204
+ links = []
205
+ pdf = pub.at "./following-sibling::a[.=' Local Download']"
206
+ links << { type: "pdf", content: pdf[:href] } if pdf
207
+ doi = pub.at("./following-sibling::a[contains(.,'(DOI)')]")
208
+ links << { type: "doi", content: doi[:href] } if doi
164
209
  links
165
210
  end
166
211
 
167
212
  # Fetch relations.
168
213
  # @param doc [Nokogiri::HTML::Document]
169
214
  # @return [Array<Hash>]
170
- # rubocop:disable Metrics/MethodLength
171
215
  def fetch_relations(doc)
172
- relations = doc.xpath('//strong[text()="Other Parts of this Publication:"]/following-sibling::a').map do |r|
173
- { type: 'partOf', identifier: r.text, url: DOMAIN + r[:href] }
216
+ relations = doc.xpath('//span[@id="pub-supersedes-container"]/a').map do |r|
217
+ doc_relation "supersedes", r
174
218
  end
175
219
 
176
- doc.xpath('//strong[text()="Related NIST Publications:"]/following-sibling::a').map do |r|
177
- relations << { type: 'updates', identifier: r.text, url: DOMAIN + r[:href] }
220
+ relations += doc.xpath('//span[@id="pub-part-container"]/a').map do |r|
221
+ doc_relation "partOf", r
222
+ end
223
+
224
+ relations + doc.xpath('//span[@id="pub-related-container"]/a').map do |r|
225
+ doc_relation "updates", r
226
+ end
227
+ end
228
+
229
+ def doc_relation(type, ref)
230
+ RelatonBib::DocumentRelation.new(
231
+ type: type,
232
+ bibitem: RelatonBib::BibliographicItem.new(
233
+ formattedref: RelatonBib::FormattedRef.new(
234
+ content: ref.text, language: "en", script: "Latn", format: "text/plain",
235
+ ),
236
+ link: [RelatonBib::TypedUri.new(type: "src", content: DOMAIN + ref[:href])],
237
+ ),
238
+ )
239
+ end
240
+
241
+ def fetch_nistseries(doc)
242
+ doc.xpath("//p/strong[.='Document History:']/following-sibling::*[not(self::br)]").each do |s|
243
+ NistSeries::ABBREVIATIONS.each do |k, _v|
244
+ return NistSeries.new k if s.text.include? k
245
+ end
178
246
  end
247
+ nil
248
+ end
249
+
250
+ def fetch_keywords(doc)
251
+ kws = doc.xpath "//span[@id='pub-keywords-container']/span"
252
+ kws.map { |kw| Keyword.new kw.text }
253
+ end
254
+
255
+ def fetch_commentperiod(doc)
256
+ cp = doc.at "//span[@id='pub-comments-due']"
257
+ return unless cp
258
+
259
+ to = Date.strptime cp.text.strip, "%B %d, %Y"
260
+
261
+ d = doc.at("//span[@id='pub-release-date']").text.strip
262
+ from = Date.strptime(d, "%B %Y").to_s
179
263
 
180
- relations
264
+ ex = doc.at "//strong[contains(.,'The comment closing date has been extended to')]"
265
+ ext = ex&.text&.match(/\w+\s\d{2},\s\d{4}/).to_s
266
+ extended = ext.empty? ? nil : Date.strptime(ext, "%B %d, %Y")
267
+ CommentPeriod.new from, to, extended
181
268
  end
182
269
  end
183
270
  end
184
- end
271
+ end
@@ -1,3 +1,3 @@
1
1
  module NistBib
2
- VERSION = "0.1.2"
2
+ VERSION = "0.1.5".freeze
3
3
  end
@@ -0,0 +1,53 @@
1
+ module NistBib
2
+ class XMLParser < RelatonBib::XMLParser
3
+ class << self
4
+ def from_xml(xml)
5
+ doc = Nokogiri::XML xml
6
+ nistitem = doc.at("/bibitem") || doc.at("/bibdata")
7
+ NistBibliographicItem.new(item_data(nistitem))
8
+ end
9
+
10
+ private
11
+
12
+ def item_data(nistitem)
13
+ data = super
14
+ data.delete :series
15
+ data[:nistseries] = fetch_nistseries(nistitem)
16
+ data[:keyword] = fetch_keyword(nistitem)
17
+ data[:commentperiod] = fetch_commentperiod(nistitem)
18
+ data
19
+ end
20
+
21
+ def fetch_status(item)
22
+ status = item.at "./status"
23
+ return unless status
24
+
25
+ DocumentStatus.new(
26
+ stage: status.at("stage")&.text,
27
+ substage: status.at("substage")&.text,
28
+ iteration: status.at("iteraton")&.text,
29
+ )
30
+ end
31
+
32
+ def fetch_commentperiod(item)
33
+ cp = item.at "./commentperiod"
34
+ return unless cp
35
+
36
+ CommentPeriod.new cp.at("from").text, cp.at("to")&.text, cp.at("extended")&.text
37
+ end
38
+
39
+ def fetch_keyword(item)
40
+ item.xpath("./keyword").map do |kw|
41
+ Keyword.new kw.children.first.to_xml
42
+ end
43
+ end
44
+
45
+ def fetch_nistseries(item)
46
+ series = item.at "./series"
47
+ return unless series
48
+
49
+ NistSeries.new series.at("./abbreviation").text.upcase.gsub("-", " ")
50
+ end
51
+ end
52
+ end
53
+ end
@@ -16,7 +16,7 @@ module Relaton
16
16
  end
17
17
 
18
18
  def from_xml(xml)
19
- IsoBibItem::XMLParser.from_xml xml
19
+ ::NistBib::XMLParser.from_xml xml
20
20
  end
21
21
  end
22
22
  end
data/nistbib.gemspec CHANGED
@@ -1,4 +1,3 @@
1
-
2
1
  lib = File.expand_path("../lib", __FILE__)
3
2
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
3
  require "nistbib/version"
@@ -9,14 +8,14 @@ Gem::Specification.new do |spec|
9
8
  spec.authors = ["Ribose Inc."]
10
9
  spec.email = ["open.source@ribose.com"]
11
10
 
12
- spec.summary = %q{NistBib: retrive NIST standards.}
13
- spec.description = %q{NistBib: retrive NIST standards.}
11
+ spec.summary = "NistBib: retrive NIST standards."
12
+ spec.description = "NistBib: retrive NIST standards."
14
13
  spec.homepage = "https://github.com/metanorma/nistbib"
15
14
  spec.license = "MIT"
16
15
 
17
16
  # Specify which files should be added to the gem when it is released.
18
17
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
19
- spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
18
+ spec.files = Dir.chdir(File.expand_path( __dir__)) do
20
19
  `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
21
20
  end
22
21
  spec.bindir = "exe"
@@ -24,16 +23,16 @@ Gem::Specification.new do |spec|
24
23
  spec.require_paths = ["lib"]
25
24
 
26
25
  spec.add_development_dependency "bundler", "~> 2.0"
27
- spec.add_development_dependency 'equivalent-xml', '~> 0.6'
28
- spec.add_development_dependency "pry-byebug"
29
26
  spec.add_development_dependency "byebug"
27
+ spec.add_development_dependency "debase"
28
+ spec.add_development_dependency "equivalent-xml", "~> 0.6"
29
+ spec.add_development_dependency "pry-byebug"
30
30
  spec.add_development_dependency "rake", "~> 10.0"
31
31
  spec.add_development_dependency "rspec", "~> 3.0"
32
- spec.add_development_dependency 'simplecov'
33
- spec.add_development_dependency 'vcr'
34
- spec.add_development_dependency 'webmock'
35
- spec.add_development_dependency 'ruby-debug-ide'
36
- spec.add_development_dependency 'debase'
32
+ spec.add_development_dependency "ruby-debug-ide"
33
+ spec.add_development_dependency "simplecov"
34
+ spec.add_development_dependency "vcr"
35
+ spec.add_development_dependency "webmock"
37
36
 
38
- spec.add_dependency 'iso-bib-item', '~> 0.4.2'
37
+ spec.add_dependency "relaton-bib", "~> 0.1.1"
39
38
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nistbib
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-04-17 00:00:00.000000000 Z
11
+ date: 2019-05-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -25,21 +25,21 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: '2.0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: equivalent-xml
28
+ name: byebug
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '0.6'
33
+ version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: '0.6'
40
+ version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: pry-byebug
42
+ name: debase
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - ">="
@@ -53,7 +53,21 @@ dependencies:
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: byebug
56
+ name: equivalent-xml
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.6'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0.6'
69
+ - !ruby/object:Gem::Dependency
70
+ name: pry-byebug
57
71
  requirement: !ruby/object:Gem::Requirement
58
72
  requirements:
59
73
  - - ">="
@@ -95,21 +109,7 @@ dependencies:
95
109
  - !ruby/object:Gem::Version
96
110
  version: '3.0'
97
111
  - !ruby/object:Gem::Dependency
98
- name: simplecov
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - ">="
102
- - !ruby/object:Gem::Version
103
- version: '0'
104
- type: :development
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - ">="
109
- - !ruby/object:Gem::Version
110
- version: '0'
111
- - !ruby/object:Gem::Dependency
112
- name: vcr
112
+ name: ruby-debug-ide
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
115
  - - ">="
@@ -123,7 +123,7 @@ dependencies:
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0'
125
125
  - !ruby/object:Gem::Dependency
126
- name: webmock
126
+ name: simplecov
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
129
  - - ">="
@@ -137,7 +137,7 @@ dependencies:
137
137
  - !ruby/object:Gem::Version
138
138
  version: '0'
139
139
  - !ruby/object:Gem::Dependency
140
- name: ruby-debug-ide
140
+ name: vcr
141
141
  requirement: !ruby/object:Gem::Requirement
142
142
  requirements:
143
143
  - - ">="
@@ -151,7 +151,7 @@ dependencies:
151
151
  - !ruby/object:Gem::Version
152
152
  version: '0'
153
153
  - !ruby/object:Gem::Dependency
154
- name: debase
154
+ name: webmock
155
155
  requirement: !ruby/object:Gem::Requirement
156
156
  requirements:
157
157
  - - ">="
@@ -165,19 +165,19 @@ dependencies:
165
165
  - !ruby/object:Gem::Version
166
166
  version: '0'
167
167
  - !ruby/object:Gem::Dependency
168
- name: iso-bib-item
168
+ name: relaton-bib
169
169
  requirement: !ruby/object:Gem::Requirement
170
170
  requirements:
171
171
  - - "~>"
172
172
  - !ruby/object:Gem::Version
173
- version: 0.4.2
173
+ version: 0.1.1
174
174
  type: :runtime
175
175
  prerelease: false
176
176
  version_requirements: !ruby/object:Gem::Requirement
177
177
  requirements:
178
178
  - - "~>"
179
179
  - !ruby/object:Gem::Version
180
- version: 0.4.2
180
+ version: 0.1.1
181
181
  description: 'NistBib: retrive NIST standards.'
182
182
  email:
183
183
  - open.source@ribose.com
@@ -187,6 +187,7 @@ extra_rdoc_files: []
187
187
  files:
188
188
  - ".gitignore"
189
189
  - ".rspec"
190
+ - ".rubocop.yml"
190
191
  - ".travis.yml"
191
192
  - Gemfile
192
193
  - Gemfile.lock
@@ -197,12 +198,18 @@ files:
197
198
  - bin/console
198
199
  - bin/setup
199
200
  - lib/nistbib.rb
201
+ - lib/nistbib/comment_period.rb
202
+ - lib/nistbib/document_status.rb
200
203
  - lib/nistbib/hit.rb
201
204
  - lib/nistbib/hit_collection.rb
205
+ - lib/nistbib/keyword.rb
206
+ - lib/nistbib/nist_bibliographic_item.rb
202
207
  - lib/nistbib/nist_bibliography.rb
208
+ - lib/nistbib/nist_series.rb
203
209
  - lib/nistbib/scrapper.rb
204
210
  - lib/nistbib/version.rb
205
211
  - lib/nistbib/workers_pool.rb
212
+ - lib/nistbib/xml_parser.rb
206
213
  - lib/relaton/processor.rb
207
214
  - nistbib.gemspec
208
215
  homepage: https://github.com/metanorma/nistbib
@@ -225,7 +232,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
225
232
  version: '0'
226
233
  requirements: []
227
234
  rubyforge_project:
228
- rubygems_version: 2.7.6
235
+ rubygems_version: 2.6.12
229
236
  signing_key:
230
237
  specification_version: 4
231
238
  summary: 'NistBib: retrive NIST standards.'