pubid-ieee 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 9302100f8fc58e3b1c356d866a982f830a8c3331257ee7069e9c1160d347abe7
4
+ data.tar.gz: bd327f07a78a631284ea36d0962ff6ecbbe3dbb917e25152643b43e6882202a3
5
+ SHA512:
6
+ metadata.gz: 24de2e26b1e31b1547f0f557cbc3ddc0414a7a5dc37bc0c8ca31e697cfb11a214372e9923c23e26f2221822752a0556be5183e097ee79ba3ce6b2d614cd55c5b
7
+ data.tar.gz: 828523c08cd2bcca2229e00120f2c309cae15281f9984123574b0e8eb575c988bc0dfc2d91711a33c8e6234023f3313e2c2b5ce21ced35d9c8b810052c5e4f7f
data/LICENSE.txt ADDED
@@ -0,0 +1,25 @@
1
+ BSD 2-Clause License
2
+
3
+ Copyright (c) 2018, Ribose
4
+ All rights reserved.
5
+
6
+ Redistribution and use in source and binary forms, with or without
7
+ modification, are permitted provided that the following conditions are met:
8
+
9
+ * Redistributions of source code must retain the above copyright notice, this
10
+ list of conditions and the following disclaimer.
11
+
12
+ * Redistributions in binary form must reproduce the above copyright notice,
13
+ this list of conditions and the following disclaimer in the documentation
14
+ and/or other materials provided with the distribution.
15
+
16
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
20
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
23
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
data/README.adoc ADDED
@@ -0,0 +1,127 @@
1
+ = IEEE publication identifiers ("IEEE PubID")
2
+
3
+ == Purpose
4
+
5
+ Implements a mechanism to parse and utilize IEEE publication identifers.
6
+
7
+ == Historic identifier patterns
8
+
9
+ There are at least two major "pattern series" of identifiers due to historical reasons: old (type I) and new (type II).
10
+ This implementation attempts to support both types of publication identifier patterns.
11
+
12
+ == Use cases to support
13
+
14
+ * analyze a pattern of type I idetifier
15
+ * parse type II idetifier into components
16
+ * generate a filename from the components similar to type I pattern
17
+
18
+ == Elements of the PubID
19
+
20
+ === Publisher
21
+
22
+ |===
23
+ | Name | Abbrev
24
+
25
+ | Institute of Electrical and Electronics Engineers
26
+ | IEEE
27
+
28
+ |===
29
+
30
+ === Report number
31
+
32
+ `{number}` - is a set of one or more digits and optional letters
33
+
34
+ === Part
35
+
36
+ `{part}` - is a set of digits and optional letters; starts with a digit; if a letter or letters are present then they are in the end; optional
37
+
38
+ === Subpart
39
+
40
+ `{subpart}` - is a set of digits and optional letters; optional, many subparts are possible
41
+
42
+ === Year
43
+
44
+ `{year}` - is a set of 4 digits; optional
45
+
46
+ === Corrigendum & Amendment
47
+
48
+ `{cor}` - is a corrigendum or an amendments with the pattern `Cor {cornum}-{year}` or `Amd {cornum}:{year}` where {cornum} is a set of digits; optional
49
+
50
+ == Type I pattern
51
+
52
+ [source]
53
+ ----
54
+ {publisher} {type} {series} {number}{part}.{subpart}{year} {edition}/{conform}/{correction}
55
+ ----
56
+
57
+ * `{publisher}` IEEE
58
+ * `{type}` one of the values: `Standard`, `Std`, `Draft`, `Draft Standard`, `Draft Supplement` ^*^
59
+ * `{series}` one of the values: `ISO/IEC`, `ISO/IEC/IEEE` ^*^
60
+ * `{number}` set of digits optionally prefixed with uppercase letter and optionally suffixed with letter
61
+ * `{part}` from 1 to 2 digits prefixed with `.` or `-` and optionally suffixed with up to 4 letters ^*^
62
+ * `{subpart}` 1 digit optionally suffixed with a letter ^*^
63
+ * `{year}` 4 digits prefixed with `-`, `:`, ` - `, or breakspace ^*^
64
+ * `{edition}` prefix `Edition` followed by a reference in brackets or prefix `First edition` followed by date in format `YYYY-MM-DD` ^*^
65
+ * `{conform}` prefix `Conformance` followed by 2 digits, dash, and 4 digits year ^*^
66
+ * `{correction}` prefix `Cor` optionally followed by breakspace, or prefix `Amd` followed by `.`, followed by from 1 to 2 digits, dash and 4 digits year ^*^
67
+
68
+ (*) - optional
69
+
70
+ An identifier can be composed of 2 other identifiers with breakspace delimiter. Only the first identifier needs to cnatain puplisher, for the secont it's optional
71
+
72
+ Following RegEx expression parses 100% of identifiers from the type I https://xml2rfc.tools.ietf.org/public/rfc/bibxml-ieee/[dataset]:
73
+ [source,regex]
74
+
75
+ ----
76
+ {
77
+ ^IEEE\s
78
+ ((?<type1>Standard|Std|Draft(\sStandard|\sSupplement)?)\s)?
79
+ ((?<series>ISO\/IEC(\/IEEE)?)\s)?
80
+ (?<number1>[A-Z]?\d+[[:alpha:]]?)
81
+ ([.-](?<part1>\d{1,2}(?!\d)[[:alpha:]]{0,4}))?
82
+ (\.(?<subpart1>\d[[:alpha:]]?))?
83
+ (?<year1>([-:]|\s-\s|,\s)\d{4})?
84
+ (\s(IEEE\s(?<type2>Std)\s)?(?<number2>[A-Z]?\d+[[:alpha:]]?)
85
+ ([.-](?<part2>\d{1,2}(?!\d)[[:alpha:]]{0,4}))?
86
+ ([.](?<subpart2>\d[[:alpha:]]?))?
87
+ (?<year2>([-:.]|_-|\s-\s|,\s)\d{4})?)?
88
+ (\s(?<edition>Edition(\s\([^)]+\))?|First\sedition\s[\d-]+))?
89
+ (\/(?<conform>Conformance\d{2})-(?<confyear>\d{4}))?
90
+ (\/(?<correction>(Cor\s?|(Amd\.)\d{1,2})
91
+ (?<coryear>(:|-|:-)\d{4}))?$
92
+ }x
93
+ ----
94
+
95
+ == Pasing PubID elements from type II identifiers
96
+
97
+ To parse PubID elements from the type II pattern identifiers we can use a RegEx expression:
98
+
99
+ [source,regex]
100
+ ----
101
+ {
102
+ ^IEEE\s(?<number1>\w+(\.[A-Z]\d|\sHBK)?)
103
+ (?<part1>(\.|\s)\d{1,4}[[:alpha:],]{0,7}|-\d?[A-Z]+|-\d(?=[-.]))?
104
+ (?<subpart11>\.\d{1,3}[a-z]?|-\d{5}[a-z]?|-\d+(?=[-:_]))?
105
+ (?<subpart12>\.\d|-\d+(?=-))?
106
+ (?<year1>([-:.]|_-|\s-)\d{4})?
107
+ (\/(?<number2>([A-Z]?\d+[a-z]?|Conformance\d+))
108
+ ((\.|-)(?<part2>\d{1,3}[a-z]?)(?!\d))?
109
+ (\.(?<subpart21>\d{1,2}))?)?
110
+ (\/(?<number3>\d+)(\.(?<part3>\d))?)?
111
+ (?<year2>([-:.]|_-|\s-)\d{4})?
112
+ ((\/|_|-|\s\/)(?<correction>(Cor|(?i)Amd(?-i))(\s|\.|\.\s)?\d{1,2})
113
+ (?<coryear>(:|-|:-|_[A-Z][a-z]{2}_)\d{4}(-\d{4})?)?)?$
114
+ }x
115
+ ----
116
+
117
+ This RegEx expession covers 99% of the identifiers from the type II bibxml-ieee https://xml2rfc.tools.ietf.org/public/rfc/bibxml-ieee-new/[dataset].
118
+
119
+ == File name generator
120
+
121
+ For type I identifiers file names are generated by replacing symbols `/`, `\`, `,`, `'`, `"`, `(`, `)`, and breakspace with symbol `_`. Sequences of multiple sybols `_` should be squized to one symbol.
122
+
123
+ For type II identifiers it needs to parse PubID elements than join the elements in order:
124
+
125
+ ----
126
+ IEEE.{number1}_{part1}.{subpart11}.{subpart12}-{year1}_{number2}_{part2}.{subpart21}_{number3}_{part3}-{year2}_{correction}-{coryear}
127
+ ----
@@ -0,0 +1,6 @@
1
+ module Pubid::Ieee
2
+ module Errors
3
+ class ParseError < StandardError; end
4
+ class ParseTypeError < StandardError; end
5
+ end
6
+ end
@@ -0,0 +1,311 @@
1
+ require 'date'
2
+ require "yaml"
3
+
4
+ UPDATE_CODES = YAML.load_file(File.join(File.dirname(__FILE__), "../../../../update_codes.yaml"))
5
+
6
+ module Pubid::Ieee
7
+ module Identifier
8
+ class Base < Pubid::Core::Identifier::Base
9
+ attr_accessor :number, :publisher, :copublisher, :stage, :part, :subpart,
10
+ :edition, :draft, :redline, :year, :month, :type, :alternative,
11
+ :draft_status, :revision, :adoption_year, :amendment, :supersedes,
12
+ :corrigendum, :corrigendum_comment, :reaffirmed, :incorporates,
13
+ :supplement, :proposal, :iso_identifier, :iso_amendment
14
+
15
+ def initialize(publisher: "IEEE", number: nil, stage: nil, subpart: nil, edition: nil,
16
+ draft: nil, redline: nil, month: nil, revision: nil,
17
+ iso_identifier: nil, type: :std, alternative: nil, draft_status: nil, adoption_year: nil,
18
+ amendment: nil, supersedes: nil, corrigendum: nil, corrigendum_comment: nil, reaffirmed: nil,
19
+ incorporates: nil, supplement: nil, proposal: nil, iso_amendment: nil, **opts)
20
+
21
+ super(**opts.merge(number: number, publisher: publisher))#.merge(amendments: amendments, corrigendums: corrigendums))
22
+
23
+ @edition = edition if edition
24
+
25
+ @proposal = @number.to_s[0] == "P"
26
+ @revision = revision
27
+ if iso_identifier
28
+ @iso_identifier = Pubid::Iso::Identifier.parse(iso_identifier)
29
+ elsif draft# && type != :p
30
+ @type = Type.new(:draft)
31
+ elsif type
32
+ if type.is_a?(Symbol)
33
+ @type = Type.new(type)
34
+ else
35
+ @type = Type.parse(type)
36
+ end
37
+ else
38
+ @type = Type.new
39
+ end
40
+
41
+ @stage = stage
42
+ @subpart = subpart
43
+ @draft = draft
44
+ @redline = redline
45
+ @month = month
46
+ @revision = revision
47
+ @amendment = amendment
48
+ @corrigendum = corrigendum
49
+ @corrigendum_comment = corrigendum_comment
50
+ @alternative = alternative
51
+ @draft_status = draft_status
52
+ @adoption_year = adoption_year
53
+ @supersedes = supersedes
54
+ @reaffirmed = reaffirmed
55
+ @incorporates = incorporates
56
+ @supplement = supplement
57
+ @proposal = proposal
58
+ @iso_amendment = iso_amendment
59
+ end
60
+
61
+ def self.type
62
+ { key: :std, title: "Standard" }
63
+ end
64
+
65
+ # convert parameters comes from parser to
66
+ def set_values(hash)
67
+ hash.each { |key, value| send("#{key}=", value.is_a?(Parslet::Slice) && value.to_s || value) }
68
+ end
69
+
70
+ def self.add_missing_bracket(code)
71
+ code.count("(") > code.count(")") ? "#{code})" : code
72
+ end
73
+
74
+ def self.update_old_code(code)
75
+ UPDATE_CODES.each do |from, to|
76
+ code = code.gsub(from.match?(/^\/.*\/$/) ? Regexp.new(from[1..-2]) : /^#{Regexp.escape(from)}$/, to)
77
+ end
78
+ code
79
+ end
80
+
81
+
82
+ def self.parse(code)
83
+ parsed = Parser.new.parse(update_old_code(code))
84
+ transform(parsed)
85
+
86
+ rescue Parslet::ParseFailed => failure
87
+ raise Pubid::Ieee::Errors::ParseError, "#{failure.message}\ncause: #{failure.parse_failure_cause.ascii_tree}"
88
+ end
89
+
90
+ def self.transform(params)
91
+ identifier_params = params.map do |k, v|
92
+ get_transformer_class.new.apply(k => v)
93
+ end.inject({}, :merge)
94
+
95
+ Identifier.create(**Identifier.convert_parser_parameters(**identifier_params))
96
+ end
97
+
98
+ def self.get_transformer_class
99
+ Transformer
100
+ end
101
+
102
+ # @param [:short, :full] format
103
+ def to_s(format = :short, with_trademark: false)
104
+ if @iso_identifier
105
+ "#{@iso_identifier.to_s(format: :ref_num_short)}#{iso_amendment}#{dual_identifier}"
106
+ else
107
+ "#{identifier(format)}#{with_trademark ? trademark(@number) : ''}#{parameters}#{adoption}"
108
+ end
109
+ end
110
+
111
+ def trademark(number)
112
+ %w(802 2030).include?(number.to_s) ? "\u00AE" : "\u2122"
113
+ end
114
+
115
+ def iso_amendment
116
+
117
+ end
118
+
119
+ def dual_identifier
120
+ @number ? " (#{identifier})#{parameters}" : "#{identifier}#{parameters}"
121
+ end
122
+
123
+ def publisher
124
+ "#{@publisher}#{copublisher} " if @publisher && @number
125
+ end
126
+
127
+ def identifier(format = :short)
128
+ "#{publisher}#{draft_status(format)}#{type(format)}#{number}#{part}"\
129
+ "#{subpart}#{year}#{revision_date}"
130
+ end
131
+
132
+ def parameters
133
+ "#{corrigendum}#{draft}#{edition}#{alternative}#{supersedes}"\
134
+ "#{reaffirmed}#{incorporates}#{supplement}#{revision}#{amendment}#{redline}"
135
+ end
136
+
137
+ def copublisher
138
+ return "" unless @copublisher
139
+
140
+ if @copublisher.is_a?(Array)
141
+ @copublisher&.map { |c| "/#{c}" }&.join
142
+ else
143
+ "/#{@copublisher}"
144
+ end
145
+ end
146
+
147
+ def part
148
+ "#{@part}" if @part
149
+ end
150
+
151
+ def subpart
152
+ @subpart if @subpart && !@subpart.to_s.empty?
153
+ end
154
+
155
+ def type(format)
156
+ return unless @type
157
+
158
+ @type.to_s(@publisher != "IEEE" ? :alternative : format)
159
+ end
160
+
161
+ def year
162
+ return "" if @month
163
+ return "" unless @year
164
+
165
+ if @corrigendum_comment
166
+ @corrigendum_comment.year
167
+ elsif @reaffirmed && @reaffirmed.key?(:reaffirmation_of)
168
+ @reaffirmed[:reaffirmation_of].year
169
+ else
170
+ "-#{@year}"
171
+ end
172
+ end
173
+
174
+ def alternative
175
+ if @alternative
176
+ if @alternative.is_a?(Array)
177
+ " (#{@alternative.map { |a| self.class.new(**Identifier.convert_parser_parameters(**a)) }.join(', ')})"
178
+ else
179
+ " (#{self.class.new(**Identifier.convert_parser_parameters(**@alternative))})"
180
+ end
181
+ end
182
+ end
183
+
184
+ def edition
185
+ return "" unless @edition
186
+
187
+ result = ""
188
+ if @edition[:version]
189
+ result += @edition[:version] == "First" ? " Edition 1.0 " : " Edition #{@edition[:version]} "
190
+ end
191
+
192
+ if @edition[:year]
193
+ result += if @edition[:version]
194
+ "#{@edition[:year]}"
195
+ else
196
+ " #{@edition[:year]} Edition"
197
+ end
198
+ end
199
+
200
+ if @edition[:month]
201
+ month = @edition[:month]
202
+ month = Date.parse(@edition[:month]).month if month.to_i.zero?
203
+ result += "-#{sprintf('%02d', month)}"
204
+ end
205
+ result += "-#{@edition[:day]}" if @edition[:day]
206
+ result
207
+ end
208
+
209
+ def draft
210
+ return "" unless @draft
211
+
212
+ @draft = Identifier.merge_parameters(@draft) if @draft.is_a?(Array)
213
+
214
+ result = "/D#{@draft[:version].is_a?(Array) ? @draft[:version].join('D') : @draft[:version]}"
215
+ result += ".#{@draft[:revision]}" if @draft[:revision]
216
+ result += ", #{@draft[:month]}" if @draft[:month]
217
+ result += " #{@draft[:day]}," if @draft[:day]
218
+ result += " #{@draft[:year]}" if @draft[:year]
219
+ result
220
+ end
221
+
222
+ def draft_status(format)
223
+ "#{@draft_status} " if @draft_status && format == :full
224
+ end
225
+
226
+ def revision
227
+ " (Revision of #{@revision.join(' and ')})" if @revision
228
+ end
229
+
230
+ def revision_date
231
+ return nil unless @month
232
+ ", #{@month} #{@year}"
233
+ end
234
+
235
+ def amendment
236
+ return unless @amendment || @iso_amendment
237
+
238
+ if @iso_amendment
239
+ if @iso_amendment[:year]
240
+ return "/Amd#{@iso_amendment[:version]}-#{@iso_amendment[:year]}"
241
+ else
242
+ return "/Amd#{@iso_amendment[:version]}"
243
+ end
244
+ end
245
+
246
+ return " (Amendment to #{@amendment})" unless @amendment.is_a?(Array)
247
+
248
+ result = " (Amendment to #{@amendment.first} as amended by "
249
+ result += if @amendment.length > 2
250
+ "#{@amendment[1..-2].map(&:to_s).join(', ')}, and #{@amendment[-1]}"
251
+ else
252
+ @amendment.last.to_s
253
+ end
254
+
255
+ "#{result})"
256
+ end
257
+
258
+ def redline
259
+ " - Redline" if @redline
260
+ end
261
+
262
+ def adoption
263
+ if @adoption_year
264
+ adoption_id = dup
265
+ adoption_id.year = @adoption_year
266
+ " (Adoption of #{adoption_id.identifier})"
267
+ end
268
+ end
269
+
270
+ def supersedes
271
+ return unless @supersedes
272
+
273
+ if @supersedes.length > 2
274
+ " (Supersedes #{@supersedes.join(', ')})"
275
+ else
276
+ " (Supersedes #{@supersedes.join(' and ')})"
277
+ end
278
+ end
279
+
280
+ def corrigendum
281
+ if @corrigendum.nil?
282
+ (@year && @corrigendum_comment && "/Cor 1-#{@year}") || ""
283
+ else
284
+ if @corrigendum[:year]
285
+ "/Cor #{@corrigendum[:version]}-#{@corrigendum[:year]}"
286
+ else
287
+ "/Cor #{@corrigendum[:version]}"
288
+ end
289
+ end
290
+ end
291
+
292
+ def reaffirmed
293
+ return unless @reaffirmed
294
+
295
+ return " (Reaffirmed #{@year})" if @reaffirmed.key?(:reaffirmation_of)
296
+
297
+ " (Reaffirmed #{@reaffirmed[:year]})" if @reaffirmed[:year]
298
+ end
299
+
300
+ def incorporates
301
+ # " (Supersedes #{@supersedes.join(', ')})"
302
+
303
+ " (Incorporates #{@incorporates.join(', and ')})" if @incorporates
304
+ end
305
+
306
+ def supplement
307
+ " (Supplement to #{@supplement})" if @supplement
308
+ end
309
+ end
310
+ end
311
+ end
@@ -0,0 +1,46 @@
1
+ module Pubid::Ieee
2
+ module Identifier
3
+ class << self
4
+ include Pubid::Core::Identifier
5
+
6
+ def parse(*args)
7
+ Base.parse(*args)
8
+ end
9
+
10
+ def convert_parser_parameters(type_status: nil, parameters: nil,
11
+ organizations: { publisher: "IEEE" }, **args)
12
+ res = [organizations, type_status, parameters].inject({}) do |result, data|
13
+ result.merge(
14
+ case data
15
+ when Hash
16
+ data.transform_values do |v|
17
+ (v.is_a?(Array) && v.first.is_a?(Hash) && merge_parameters(v)) || v
18
+ end
19
+ when Array
20
+ merge_parameters(data)
21
+ else
22
+ {}
23
+ end
24
+ )
25
+ end
26
+ res.merge(args)
27
+ end
28
+
29
+ def merge_parameters(params)
30
+ return params unless params.is_a?(Array)
31
+
32
+ result = {}
33
+ params.each do |item|
34
+ item.each do |key, value|
35
+ if result.key?(key)
36
+ result[key] = result[key].is_a?(Array) ? result[key] << value : [result[key], value]
37
+ else
38
+ result[key] = value
39
+ end
40
+ end
41
+ end
42
+ result
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,399 @@
1
+ require "pubid-iso"
2
+
3
+ module Pubid::Ieee
4
+ class Parser < Parslet::Parser
5
+ rule(:digits) do
6
+ match('\d').repeat(1)
7
+ end
8
+
9
+ rule(:space) { str(" ") }
10
+ rule(:space?) { space.maybe }
11
+ rule(:comma) { str(", ") }
12
+ rule(:comma?) { comma.maybe }
13
+ rule(:comma_space) { comma | space }
14
+ rule(:dash) { str("-") }
15
+ rule(:dot) { str(".") }
16
+ rule(:words_digits) { match('[\dA-Za-z]').repeat(1) }
17
+ rule(:words) { match("[A-Za-z]").repeat(1) }
18
+ rule(:words?) { words.maybe }
19
+ rule(:year_digits) { (str("19") | str("20")) >> match('\d').repeat(2, 2) }
20
+
21
+ rule(:month_digits) do
22
+ match('\d').repeat(2, 2)
23
+ end
24
+
25
+ rule(:day_digits) do
26
+ match('\d').repeat(2, 2)
27
+ end
28
+
29
+ rule(:year) do
30
+ # -2014, April 2015
31
+ dash >> year_digits.as(:adoption_year) >> publication_date |
32
+ (dot | dash) >> year_digits.as(:year) >> str("(E)").maybe
33
+ end
34
+
35
+ rule(:organization) do
36
+ str("IEEE") | str("AIEE") | str("ANSI") | str("ASA") | str("NCTA") |
37
+ str("IEC") | str("ISO") | str("ASTM") | str("NACE") | str("NSF")
38
+ end
39
+
40
+ rule(:number) do
41
+ str("D").absent? >> ((digits | match("[A-Z]")).repeat(1) >> match("[a-z]").maybe).as(:number)
42
+ end
43
+
44
+ rule(:type) do
45
+ str("Std") | str("STD") | str("Standard")
46
+ end
47
+
48
+ rule(:comma_month_year) do
49
+ comma >> words.as(:month) >> space >> year_digits.as(:year)
50
+ end
51
+
52
+ rule(:edition) do
53
+ (comma >> year_digits.as(:year) >> str(" Edition")) |
54
+ ((space | dash) >> str("Edition ") >> (digits >> dot >> digits).as(:version) >> (str(" - ") | space) >>
55
+ year_digits.as(:year) >> (dash >>
56
+ month_digits.as(:month)).maybe) |
57
+ #, February 2018 (E)
58
+ (comma_month_year >> str("(E)")) |
59
+ # (comma_month_year >> space? >> str("(E)")) |
60
+ # comma_month_year |
61
+ # First edition 2002-11-01
62
+ space >> str("First").as(:version) >>
63
+ str(" edition ") >>
64
+ year_digits.as(:year) >> dash >>
65
+ month_digits.as(:month) >> (dash >>
66
+ day_digits.as(:day)).maybe
67
+
68
+ end
69
+
70
+ rule(:draft_status) do
71
+ (str("Active Unapproved") | str("Unapproved") | str("Approved")).as(:draft_status)
72
+ end
73
+
74
+ rule(:draft_prefix) do
75
+ space? >> str("/") | str("_") | dash | space
76
+ end
77
+
78
+ rule(:draft_date) do
79
+ ((space? >> comma | space) >> words.as(:month)).maybe >>
80
+ (
81
+ ((space >> digits.as(:day)).maybe >> comma >> year_digits.as(:year)) |
82
+ (comma_space >> match('\d').repeat(2, 4).as(:year))
83
+ )
84
+ end
85
+
86
+ rule(:draft_version) do
87
+ # for D1D2
88
+ (str("D") >> digits.as(:version)).repeat(2) |
89
+ # for DD3, D3Q
90
+ (str("D") >> words_digits.as(:version)).repeat(1, 1)
91
+ end
92
+
93
+ rule(:draft) do
94
+ # /D14, April 2020
95
+ # /D7 November, 2019
96
+ (draft_prefix >> draft_version >>
97
+ ((dot | str("r")) >> (digits >> words?).as(:revision)).maybe >>
98
+ draft_date.maybe).as(:draft)
99
+ end
100
+
101
+ rule(:part) do
102
+ ((dot | dash) >> words_digits).as(:part)
103
+ end
104
+
105
+ rule(:subpart) do
106
+ (dot | dash) >> match('[\da-z]').repeat(1)
107
+ end
108
+
109
+ rule(:part_subpart_year) do
110
+ # 802.15.22.3-2020
111
+ # 1073.1.1.1-2004
112
+ (part >> subpart.repeat(2, 2).as(:subpart) >> year) |
113
+ # C57.12.00-1993
114
+ (part >> subpart.as(:subpart) >> year) |
115
+ # N42.44-2008
116
+ # 1244-5.2000
117
+ # 11073-40102-2020
118
+ # C37.0781-1972
119
+ (part >> year) |
120
+ # C57.19.101
121
+ (part >> subpart.as(:subpart)) |
122
+ # IEC 62525-Edition 1.0 - 2007
123
+ edition.as(:edition) |
124
+ # IEEE P11073-10101
125
+ # IEEE P11073-10420/D4D5
126
+ # IEEE Unapproved Draft Std P11073-20601a/D13, Jan 2010
127
+ # XXX: hack to avoid being partially parsed by year
128
+ (dash >> match('[\dA-Za-z]').repeat(5, 6)).as(:part) |
129
+ # 581.1978
130
+ year |
131
+ # 61691-6
132
+ part
133
+ end
134
+
135
+ rule(:dual_pubids) do
136
+ space? >>
137
+ (
138
+ (str("(") >> (iso_identifier >> iso_parameters).as(:alternative) >> str(")") |
139
+ str("(") >> (parameters(organizations >> space?).as(:alternative) >> str(", ").maybe).repeat(1) >> str(")")) |
140
+ ((str("and ") | str("/ ") | space) >> identifier_no_params.as(:alternative)) |
141
+ (str("/") >> identifier_with_organization.as(:alternative)) |
142
+ # should have an organization when no brackets
143
+ identifier_with_organization.as(:alternative)
144
+ )
145
+ end
146
+
147
+ rule(:dual_pubid_without_parameters) do
148
+ space? >>
149
+ (
150
+ (str("(") >> (iso_identifier >> iso_parameters).as(:alternative) >> str(")") |
151
+ str("(") >> (identifier_no_params.as(:alternative) >> str(", ").maybe).repeat(1) >> str(")"))# |
152
+ #identifier_no_params.as(:alternative)
153
+ )
154
+ end
155
+
156
+ rule(:revision) do
157
+ (str("Revision ") >> (str("of") | str("to")) >> space >>
158
+ (identifier_without_dual_pubids.as(:identifier) >> str(" and ").maybe).repeat(1)
159
+ ).as(:revision)
160
+ end
161
+
162
+ rule(:previous_amendments) do
163
+ # IEEE P802.3bp/D3.4, April 2016 (Amendment of IEEE Std 802.3-2015 as amended by IEEE Std 802.3bw-2015,
164
+ # IEEE Std 802.3by-201X, and IEEE Std 802.3bq-201X)
165
+ str(",").maybe >> str(" as amended by ") >>
166
+ (identifier_inside_brackets.as(:identifier) >> (str(", ") >> str("and ").maybe).maybe).repeat(1)
167
+ end
168
+
169
+ # match everything before "," or ")" or " as"
170
+ rule(:identifier_inside_brackets) do
171
+ ((str(" as") | str(")") | str(",")).absent? >> any).repeat(1) >>
172
+ (str(", ") >> year_digits >> str(" Edition")).maybe
173
+ end
174
+
175
+ rule(:amendment) do
176
+ (str("Amendment ") >> (str("of") | str("to")) >> space >>
177
+ identifier_inside_brackets.as(:identifier) >> previous_amendments.maybe).as(:amendment)
178
+ end
179
+
180
+ rule(:number_prefix) do
181
+ ((str("No") | str("no")) >> (str(". ") | dot | space)).maybe
182
+ end
183
+
184
+ rule(:redline) do
185
+ str(" - ") >> str("Redline").as(:redline)
186
+ end
187
+
188
+ rule(:publication_date) do
189
+ comma_month_year
190
+ end
191
+
192
+ rule(:supersedes) do
193
+ (str("Supersedes ") >> (identifier_without_dual_pubids.as(:identifier) >>
194
+ (str(" and ") | str(" ")).maybe).repeat(1)).as(:supersedes)
195
+ end
196
+
197
+ rule(:incorporates) do
198
+ (
199
+ match("[Ii]") >> (str("ncorporates ") | str("ncorporating ")) >>
200
+ (identifier_without_dual_pubids.as(:identifier) >> str(", and ").maybe).repeat(1)
201
+ ).as(:incorporates)
202
+ end
203
+
204
+ rule(:supplement) do
205
+ (str("Supplement") >> str("s").maybe >> str(" to ") >> identifier_without_dual_pubids.as(:identifier)).as(:supplement)
206
+ end
207
+
208
+ rule(:additional_parameters) do
209
+ (space? >> str("(") >> (
210
+ (reaffirmed | revision | amendment | supersedes | corrigendum_comment| incorporates | supplement) >>
211
+ ((str("/") | str(",")) >> space?).maybe).repeat >> str(")").maybe
212
+ ).repeat >> redline.maybe
213
+ end
214
+
215
+ # Hack to exclude dual_pubids parsing for revisions and supersedes
216
+ # otherwise extra identifiers parsed as dual PubIDs to the main identifier
217
+ def parameters(atom, without_dual_pubids: false, skip_parameters: false)
218
+ atom >>
219
+ ((draft_status >> space).maybe >> (str("Draft ").maybe >>
220
+ type.as(:type) >> space.maybe).maybe).as(:type_status) >>
221
+ number_prefix >> number >>
222
+ (
223
+ # IEEE P2410-D4, July 2019
224
+ (draft |
225
+ part_subpart_year.maybe >> corrigendum.maybe >> draft.maybe >> iso_amendment.maybe
226
+ ) >>
227
+ if skip_parameters
228
+ str("")
229
+ else
230
+ publication_date.maybe
231
+ end >>
232
+ if skip_parameters
233
+ str("")
234
+ else
235
+ edition.as(:edition).maybe
236
+ end >>
237
+ # dual-PubIDs
238
+ ((without_dual_pubids && str("")) || dual_pubids.maybe) >>
239
+ if skip_parameters
240
+ str("")
241
+ else
242
+ additional_parameters.maybe
243
+ end
244
+ ).as(:parameters)
245
+ end
246
+
247
+ rule(:reaffirmed) do
248
+ (
249
+ (str("Reaffirmed ") >> year_digits.as(:year) |
250
+ str("Reaffirmation of ") >> identifier.as(:identifier).as(:reaffirmation_of))
251
+ ).as(:reaffirmed)
252
+ end
253
+
254
+ rule(:corrigendum_prefix) do
255
+ (str("_") | str("/") | str("-")) >> str("Cor") >> (str("-") | dot.maybe >> space?)
256
+ end
257
+
258
+ rule(:corrigendum) do
259
+ # IEEE 1672-2006/Cor 1-2008
260
+ (
261
+ corrigendum_prefix >> digits.as(:version) >> ((dash | str(":")) >> year_digits.as(:year)).maybe
262
+ ).as(:corrigendum)
263
+ end
264
+
265
+ rule(:corrigendum_comment) do
266
+ ((str("Corrigendum to ") | str("Corrigenda ") >> (str("to ") | str("of "))) >>
267
+ identifier.as(:identifier)).as(:corrigendum_comment)
268
+ end
269
+
270
+ rule(:iso_amendment_prefix) do
271
+ str("/") >> str("Amd")
272
+ end
273
+
274
+ rule(:iso_amendment) do
275
+ # IEEE 1672-2006/Cor 1-2008
276
+ (iso_amendment_prefix >> digits.as(:version) >> (dash >> year_digits.as(:year)).maybe).as(:iso_amendment)
277
+ end
278
+
279
+ rule(:organizations) do
280
+ (organization.as(:publisher) >> (str("/") >> space? >> organization.as(:copublisher)).repeat)
281
+ .as(:organizations)
282
+ end
283
+
284
+ rule(:identifier_with_organization) do
285
+ parameters(organizations >> space?)
286
+ end
287
+
288
+ rule(:identifier_with_org_no_params) do
289
+ iso_identifier | parameters(organizations >> space?, skip_parameters: true)
290
+ end
291
+
292
+ rule(:identifier_no_params) do
293
+ parameters((organizations >> space).maybe, skip_parameters: true, without_dual_pubids: true)
294
+ end
295
+
296
+ rule(:iso_part) do
297
+ (str("-") | str("/")) >> str(" ").maybe >>
298
+ # (str("-") >> iso_parser.stage).absent? >>
299
+ ((match('\d') | str("A")) >>
300
+ ((str("-") >> iso_parser.typed_stage).absent? >>
301
+ (match['\d[A-Z]'] | str("-"))).repeat).as(:part)
302
+ end
303
+
304
+ rule(:iso_part_stage_iteration) do
305
+ iso_part >>
306
+ (str("-") >> iso_parser.typed_stage.as(:stage)) >> iso_parser.iteration.maybe
307
+ end
308
+
309
+ rule(:iso_stage_part_iteration) do
310
+ # don't consume draft from IEEE format
311
+ ((str("-") | str("/")) >> (str("D") >> digits).absent? >> (iso_parser.typed_stage.as(:stage) | iso_parser.stage.as(:stage))) >>
312
+ iso_part.maybe >> iso_parser.iteration.maybe
313
+ end
314
+
315
+ # add rule when don't have stage
316
+ #
317
+ rule(:iso_part_iteration) do
318
+ iso_part >> iso_parser.iteration.maybe
319
+ end
320
+
321
+ rule(:iso_part_stage_iteration_matcher) do
322
+ # consumes "/"
323
+ iso_stage_part_iteration |
324
+ iso_part_stage_iteration |
325
+ iso_part_iteration
326
+
327
+ end
328
+
329
+ rule(:iso_identifier) do
330
+ # Pubid::Iso::Parser.new.identifier.as(:iso_identifier)
331
+ # Withdrawn e.g: WD/ISO 10360-5:2000
332
+ # for French and Russian PubIDs starting with Guide type
333
+ ((iso_parser.guide_prefix.as(:type) >> str(" ")).maybe >>
334
+ (iso_parser.typed_stage.as(:stage) >> str(" ")).maybe >>
335
+ iso_parser.originator >> ((str(" ") | str("/")) >>
336
+ # for ISO/FDIS
337
+ (iso_parser.type | iso_parser.typed_stage.as(:stage))).maybe >>
338
+ # for ISO/IEC WD TS 25025
339
+ str(" ").maybe >> ((iso_parser.typed_stage.as(:stage) | iso_parser.stage.as(:stage) | iso_parser.type) >> str(" ")).maybe >>
340
+ (str("P").maybe >> iso_parser.digits).as(:number) >>
341
+ # for identifiers like ISO 5537/IDF 26
342
+ (str("|") >> (str("IDF") >> str(" ") >> digits).as(:joint_document)).maybe >>
343
+ iso_part_stage_iteration_matcher.maybe >>
344
+ (str(" ").maybe >> str(":") >> iso_parser.year).maybe >>
345
+ # stage before amendment
346
+ (
347
+ # stage before corrigendum
348
+ iso_parser.supplement.maybe) >>
349
+ iso_parser.language.maybe).as(:iso_identifier)
350
+ end
351
+
352
+ rule(:iso_parameters) do
353
+ iso_amendment.maybe >> (dual_pubid_without_parameters.maybe >>
354
+ (publication_date >> space? >> str("(E)").maybe).maybe >>
355
+ edition.as(:edition).maybe >> draft.maybe >> additional_parameters).as(:parameters)
356
+ end
357
+
358
+ rule(:identifier_before_edition) do
359
+ ((str(" Edition")).absent? >> any).repeat(1)
360
+ end
361
+
362
+ rule(:identifier) do
363
+ iso_or_ieee_identifier
364
+ # (identifier_before_edition.as(:iso_identifier).as(:iso_identifier) >> iso_parameters) |
365
+ end
366
+
367
+ rule(:ieee_without_prefix) do
368
+ (str("IEEE").as(:publisher).as(:organizations) >> space) >>
369
+ digits.as(:number) >> str(".").absent? >> year.as(:parameters)
370
+ end
371
+
372
+ rule(:iso_or_ieee_identifier) do
373
+ ieee_without_prefix |
374
+ (iso_identifier >> iso_parameters) |
375
+ # (iso identifier) >> space >> (ieee identifier) ?
376
+ iso_identifier >> space >> parameters((organizations >> space).maybe) | iso_identifier |
377
+ parameters((organizations >> space).maybe)
378
+ end
379
+
380
+ rule(:parameters_with_optional_organizations) do
381
+ parameters((organizations >> space).maybe)
382
+ end
383
+
384
+ rule(:identifier_without_dual_pubids) do
385
+ iso_identifier >> iso_parameters |
386
+ parameters((organizations >> space).maybe, without_dual_pubids: true)
387
+ end
388
+
389
+ rule(:identifier_without_parameters) do
390
+ parameters((organizations >> space).maybe, skip_parameters: true)
391
+ end
392
+
393
+ rule(:root) { identifier }
394
+
395
+ def iso_parser
396
+ Pubid::Iso::Parser.new
397
+ end
398
+ end
399
+ end
@@ -0,0 +1,40 @@
1
+ module Pubid::Ieee
2
+ class Transformer < Parslet::Transform
3
+ rule(month: simple(:month), year: simple(:year)) do |date|
4
+ update_month_year(date[:month], date[:year])
5
+ end
6
+
7
+ rule(month: simple(:month), year: simple(:year), day: simple(:day)) do |date|
8
+ update_month_year(date[:month], date[:year]).merge({ day: date[:day] })
9
+ end
10
+
11
+ rule(identifier: subtree(:identifier)) do |data|
12
+ if data[:identifier].is_a?(Parslet::Slice)
13
+ Identifier::Base.transform(Identifier.convert_parser_parameters(**Parser.new.iso_or_ieee_identifier.parse(data[:identifier].to_s)))
14
+ else
15
+ Identifier::Base.transform(Identifier.convert_parser_parameters(**data[:identifier]))
16
+ end
17
+ end
18
+
19
+ def self.update_month_year(month, year)
20
+ { year: if year.length == 2
21
+ case year.to_i
22
+ when 0..25 then "20#{year}"
23
+ when 26..99 then "19#{year}"
24
+ end
25
+ else
26
+ year
27
+ end,
28
+ month: Date.parse(month).strftime("%B") }
29
+ end
30
+
31
+ rule(type: simple(:type)) do
32
+ { type: case type
33
+ when "Standard"
34
+ :std
35
+ else
36
+ type
37
+ end }
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,42 @@
1
+ module Pubid::Ieee
2
+ class Type
3
+ attr_accessor :type
4
+
5
+ TYPE_NAMES = {
6
+ std: {
7
+ long: "Standard",
8
+ full: "Std ",
9
+ short: "Std ",
10
+ match: %w[STD Std Standard],
11
+ alternative: "",
12
+ },
13
+ draft: {
14
+ full: "Draft Std ",
15
+ short: "Draft Std ",
16
+ match: %w[Draft],
17
+ alternative: "Draft ",
18
+ },
19
+ }.freeze
20
+
21
+ # Create new type
22
+ # @param type [Symbol]
23
+ def initialize(type = :std)
24
+ type = type.to_s.downcase.to_sym unless type.is_a?(Symbol)
25
+
26
+ raise Errors::WrongTypeError, "#{type} type is not available" unless TYPE_NAMES.key?(type)
27
+
28
+ @type = type
29
+ end
30
+
31
+ def self.parse(type_string)
32
+ TYPE_NAMES.each do |type, values|
33
+ return new(type) if values[:match].include?(type_string)
34
+ end
35
+ raise Errors::ParseTypeError, "Cannot parse '#{type_string}' type"
36
+ end
37
+
38
+ def to_s(format = :short)
39
+ TYPE_NAMES[type][format]
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,5 @@
1
+ module Pubid
2
+ module Ieee
3
+ VERSION = "0.1.1".freeze
4
+ end
5
+ end
data/lib/pubid/ieee.rb ADDED
@@ -0,0 +1,19 @@
1
+ require "parslet"
2
+
3
+ module Pubid
4
+ module Ieee
5
+
6
+ end
7
+ end
8
+
9
+ require_relative "ieee/errors"
10
+ require_relative "ieee/parser"
11
+ require_relative "ieee/transformer"
12
+ require_relative "ieee/type"
13
+ require_relative "ieee/identifier"
14
+ require_relative "ieee/identifier/base"
15
+
16
+ config = Pubid::Core::Configuration.new
17
+ config.default_type = Pubid::Ieee::Identifier::Base
18
+ config.types = [Pubid::Ieee::Identifier::Base]
19
+ Pubid::Ieee::Identifier.set_config(config)
data/lib/pubid-ieee.rb ADDED
@@ -0,0 +1 @@
1
+ require_relative "pubid/ieee"
data/update_codes.yaml ADDED
@@ -0,0 +1,53 @@
1
+ IEEE Unapproved Draft Std PC37.110/D911Oct 07: IEEE Unapproved Draft Std PC37.110/D711, Oct 07
2
+ IEEE C57.139/D14June 2010: IEEE C57.139/D14, June 2010
3
+ IEEE P1653.5/D7d1 November, 2019: IEEE P1653.5/D7.1 November, 2019
4
+ IEEE P1017/D062012: P1017/D062012, Jun 2012
5
+ IEEP62.42.1/D3, October 2014: IEEE P62.42.1/D3, October 2014
6
+ IEEE P802.11ajD8.0, August 2017: IEEE P802.11aj/D8.0, August 2017
7
+ IEEE P802.11ajD9.0, November 2017: IEEE P802.11aj/D9.0, November 2017
8
+ "IEC 62529:2012(E) (IEEE Std 1641-2010": IEC 62529:2012(E) (IEEE Std 1641-2010)
9
+ "IEC 62529:2012(E) (IEEE Std 1641-2010 - Redline": IEC 62529:2012(E) (IEEE Std 1641-2010) - Redline
10
+ IEEE IEEE P1453/D3, June 2011: IEEE P1453/D3, June 2011
11
+ AIEE No 1E -1957: AIEE No 1E-1957
12
+ A.I.E.E. No. 15 May-1928: AIEE No 15-192805
13
+ AIEE No 45 -1951: AIEE No 45-1951
14
+ AIEE No. 2-June 1929: AIEE No 2-192906
15
+ AIEE No. 25-1952 (Supercedes AIEE No. 25-1945): AIEE No 25-1952 (Supercedes AIEE No. 25-1945)
16
+ AIEE No.1-1962 (Supersedes June 1957 issue): AIEE No 1-1962 (Supersedes AIEE No 1-195706)
17
+ AIEE Nos 72 and 73 - 1932: AIEE No 72-1932 and AIEE No 73-1932
18
+ EEE Std 1671.1-2017 (Revision of IEEE Std 1671.1&amp;#8208;2009): IEEE Std 1671.1-2017 (Revision of IEEE Std 1671.1-2009)
19
+ EEE Std 1671.1-2017 (Revision of IEEE Std 1671.1-2009): IEEE Std 1671.1-2017 (Revision of IEEE Std 1671.1-2009)
20
+ EEE Std 488.2-1992: IEEE Std 488.2-1992
21
+ EEE Std 802.3br-2016 (Amendment to IEEE Std 802.3-2015 as amended by IEEE St802.3bw-2015, IEEE Std 802.3by-2016, IEEE Std 802.3bq-2016, and IEEE Std 802.3bp-2016): IEEE Std 802.3br-2016 (Amendment to IEEE Std 802.3-2015 as amended by IEEE Std 802.3bw-2015, IEEE Std 802.3by-2016, IEEE Std 802.3bq-2016, and IEEE Std 802.3bp-2016)
22
+ IEEE Std 336-2010 (Revision of EEE Std 336-2005): IEEE Std 336-2010 (Revision of IEEE Std 336-2005)
23
+ IEEE Std 356-2020 (Revision of IEEE Std 356?2010): IEEE Std 356-2020 (Revision of IEEE Std 356-2010)
24
+ IEEE Std 356-2020 (Revision of IEEE Std 356?2010) - Redline: IEEE Std 356-2020 (Revision of IEEE Std 356-2010) - Redline
25
+ IEEE Std Std 1139-2008: IEEE Std 1139-2008
26
+ IEEE/ ASTM SI 10-2010 (Revision of IEEE/ASTM SI 10-2002): IEEE/ASTM SI 10-2010 (Revision of IEEE/ASTM SI 10-2002)
27
+ "IEEE Std 24748-3:2012": IEEE 24748-3:2012
28
+ "ISO/IEC/IEEE P24765/D3:2017": ISO/IEC/IEEE P24765:2017/D3
29
+ ISO/IEC/IEEE FDIS P24765 FDIS, October 2016: ISO/IEC/IEEE FDIS P24765, October 2016
30
+ ISO/IEC/IEEE P15289 FDIS, February 2019: ISO/IEC/IEEE FDIS P15289, February 2019
31
+ ISO/IEC/IEEE P26515 FDIS, May 2018: ISO/IEC/IEEE FDIS P26515, May 2018
32
+ IEEE Std Std 1139-2008: IEEE Std 1139-2008
33
+ IEC/IEEE P60214-2, FDIS 2018: IEC/IEEE FDIS P60214-2-2018(E)
34
+ IEC/IEEE P62582-6, FDIS 2018: IEC/IEEE FDIS P62582-6-2018(E)
35
+ ISO/IEC DIS P26511.2, May 2017: ISO/IEC DIS P26511-2, May 2017
36
+ ISO/IEC/IEEE P90003_FDIS, August 2018: ISO/IEC/IEEE FDIS P90003, August 2018
37
+ ISO/IEC/IEEE&#xA0;P29119-1/FDIS, September 2021: ISO/IEC/IEEE FDIS P29119-1, September 2021
38
+ ISO/IEC/IEEE/ P12207-2/D3_FDIS, July 2020: ISO/IEC/IEEE FDIS P12207-2/D3, July 2020
39
+ ISO/IEC/IEEE/ P21841/FDIS, April 2019: ISO/IEC/IEEE FDIS P21841, April 2019
40
+ ISO/IEC/IEEE/ P24748-3/DIS, August 2019: ISO/IEC/IEEE DIS P24748-3, August 2019
41
+ IEEE Std 1018-2013 (Revison of IEEE Std 1018-2004): IEEE Std 1018-2013 (Revision of IEEE Std 1018-2004)
42
+ IEEE Std 1018-2013 (Revison of IEEE Std 1018-2004) - Redline: IEEE Std 1018-2013 (Revision of IEEE Std 1018-2004) - Redline
43
+ IEEE SId 342-1973 (ANSI C37.0731-1973): IEEE Std 342-1973 (ANSI C37.0731-1973)
44
+ P1484.12.3/D1, September2019: IEEE P1484.12.3/D1, September 2019
45
+ P1073.1.3.4/D3.0: IEEE P1073.1.3.4/D3.0
46
+ P1936.1, 2020: IEEE P1936.1, January 2020
47
+ P20000-2, D1 December 2012: IEEE P20000-2/D1, December 2012
48
+ ISO/IEC/IEEE 8802-22.2:2015/Amd.2:2017(E): ISO/IEC/IEEE 8802-22:2015/Amd.2:2017(E)
49
+ IEEE 1070-1995: IEEE No 1070-1995
50
+ IEEE 278-1967: IEEE No 278-1967
51
+ IEEE 730-1989: IEEE No 730-1989
52
+ IEEE 751-1991: IEEE No 751-1991
53
+ IEEE 1023-2020 (Revision of IEEE Std 1023-2004): IEEE No 1023-2020 (Revision of IEEE Std 1023-2004)
metadata ADDED
@@ -0,0 +1,155 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: pubid-ieee
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Ribose Inc.
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2023-05-19 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rake
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '13.0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '13.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rspec
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '3.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '3.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: nokogiri
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: thor
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: lightly
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: parslet
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: pubid-iso
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: 0.5.2
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: 0.5.2
111
+ description: Library to generate, parse and manipulate IEEE PubID.
112
+ email:
113
+ - open.source@ribose.com
114
+ executables: []
115
+ extensions: []
116
+ extra_rdoc_files:
117
+ - README.adoc
118
+ - LICENSE.txt
119
+ files:
120
+ - LICENSE.txt
121
+ - README.adoc
122
+ - lib/pubid-ieee.rb
123
+ - lib/pubid/ieee.rb
124
+ - lib/pubid/ieee/errors.rb
125
+ - lib/pubid/ieee/identifier.rb
126
+ - lib/pubid/ieee/identifier/base.rb
127
+ - lib/pubid/ieee/parser.rb
128
+ - lib/pubid/ieee/transformer.rb
129
+ - lib/pubid/ieee/type.rb
130
+ - lib/pubid/ieee/version.rb
131
+ - update_codes.yaml
132
+ homepage: https://github.com/metanorma/pubid-ieee
133
+ licenses:
134
+ - BSD-2-Clause
135
+ metadata: {}
136
+ post_install_message:
137
+ rdoc_options: []
138
+ require_paths:
139
+ - lib
140
+ required_ruby_version: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - ">="
143
+ - !ruby/object:Gem::Version
144
+ version: 2.5.0
145
+ required_rubygems_version: !ruby/object:Gem::Requirement
146
+ requirements:
147
+ - - ">="
148
+ - !ruby/object:Gem::Version
149
+ version: '0'
150
+ requirements: []
151
+ rubygems_version: 3.0.3.1
152
+ signing_key:
153
+ specification_version: 4
154
+ summary: Library to generate, parse and manipulate IEEE PubID.
155
+ test_files: []