pubid-iso 0.5.2 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6f3adc0da212bf94d36e4cf03a2c0df042faec56fd9c218d2ffad51fa63dfb0e
4
- data.tar.gz: a0daec7e03a71688ebb1959531415d4c842b75dd1e0c8ed7b48f8399148e5848
3
+ metadata.gz: 11124938cd55ceae313c720ac11b3c19c475e1398bb7e0eed93ac07ebbbe9eb4
4
+ data.tar.gz: 72de1b3ce2af85a21b888e2180410d5efbe57f6ea297ff7b412a9758e024d1e5
5
5
  SHA512:
6
- metadata.gz: 48d74a1e76b6ee3c7e064c56ce7c6623533f584e85b4c227ea9e0e68993a82c98fb2d30e4e19c5ed61670ce9160503bcfcc6142c277c66812b3cd3bffb51d0ee
7
- data.tar.gz: 0764db7a06d34fdf687f577663f3b03b1e2181a38444f03eba5f3ec8678c787ad01e83aadf27baebd9bdf3f72a1d90edaa7817683173ed271a93c7379c12e00f
6
+ metadata.gz: dd4d5c372306186736e8c44c446e445758c8b7d871d73454096c739ed1e5e7fcc7890b8ea0189c44f5418150d54f6802d325687ab77dcf71984277ec244f303a
7
+ data.tar.gz: f93770f6fb62a8401e99a59d1e47c99eb6f97c5be34385acb9f01187bb8eab504ccff0dc8ae50162037ef3f5080a0e0f2a8add11a2f789ef67cf153128c339eb
data/README.adoc CHANGED
@@ -1,5 +1,7 @@
1
1
  = ISO publication identifiers ("ISO PubID")
2
2
 
3
+ image:https://badge.fury.io/rb/pubid-iso.svg["Gem Version", link="https://badge.fury.io/rb/pubid-iso"]
4
+
3
5
  == Purpose
4
6
 
5
7
  This gem implements a mechanism to parse and utilize ISO publication
@@ -349,12 +351,19 @@ final draft International Standards (FDIS) and International Standards`",
349
351
  distinguished by a numerical suffix (.2, .3, etc.).
350
352
  ____
351
353
 
352
- The stage iteration number is assigned accordingly for all stages, which is
353
- patterned as:
354
+ [example]
355
+ ====
356
+ ISO/CD TR 10064-2.2
357
+ ISO/IEC CD 23264-2.4
358
+ ISO/DIS 80369-3.2
359
+ ====
360
+
361
+ In an ISO PubID, the stage iteration number is applied to the standard
362
+ number, patterned as:
354
363
 
355
- * `{document stage}` (no suffix if iteration is 1); or
356
- * `{document stage}.{iteration number}`
357
- (suffix including iteration number after 1).
364
+ * `{document stage} {document number}` (if iteration is 1); or
365
+ * `{document stage} {document number}.{iteration number}`
366
+ (if iteration is larger than 1).
358
367
 
359
368
  Once the document is published (stage 60 substage 60), no status abbreviation is
360
369
  given.
@@ -0,0 +1,24 @@
1
+ require_relative "../renderer/addendum"
2
+
3
+ module Pubid::Iso
4
+ module Identifier
5
+ class Addendum < Supplement
6
+ def_delegators 'Pubid::Iso::Identifier::Addendum', :type
7
+
8
+ TYPED_STAGES = {
9
+ dad: {
10
+ abbr: "DAD",
11
+ name: "Draft Addendum",
12
+ harmonized_stages: %w[],
13
+ },
14
+ }.freeze
15
+ def self.type
16
+ { key: :add, title: "Addendum" }
17
+ end
18
+
19
+ def self.get_renderer_class
20
+ Renderer::Addendum
21
+ end
22
+ end
23
+ end
24
+ end
@@ -186,6 +186,13 @@ module Pubid::Iso
186
186
  )
187
187
  end
188
188
 
189
+ if identifier_params[:extract]
190
+ base_parameters = params.reject { |k, _| k == :extract }
191
+
192
+ return Identifier.create(base: Identifier.create(**base_parameters),
193
+ type: :ext, **identifier_params[:extract])
194
+ end
195
+
189
196
  Identifier.create(**identifier_params)
190
197
  end
191
198
 
@@ -0,0 +1,19 @@
1
+ require_relative "../renderer/extract"
2
+
3
+ module Pubid::Iso
4
+ module Identifier
5
+ class Extract < Base
6
+ def_delegators 'Pubid::Iso::Identifier::Extract', :type
7
+
8
+ TYPED_STAGES = {}.freeze
9
+
10
+ def self.type
11
+ { key: :ext, title: "Extract" }
12
+ end
13
+
14
+ def self.get_renderer_class
15
+ Renderer::Extract
16
+ end
17
+ end
18
+ end
19
+ end
@@ -4,6 +4,11 @@ module Pubid::Iso
4
4
  def_delegators 'Pubid::Iso::Identifier::InternationalStandard', :type
5
5
 
6
6
  TYPED_STAGES = {
7
+ dp: {
8
+ abbr: "DP",
9
+ name: "Draft Proposal",
10
+ harmonized_stages: %w[],
11
+ },
7
12
  dis: {
8
13
  abbr: "DIS",
9
14
  name: "Draft International Standard",
@@ -3,7 +3,7 @@ require_relative "renderer/base"
3
3
 
4
4
  module Pubid::Iso
5
5
  class Parser < Pubid::Core::Parser
6
- STAGES = %w[NP NWIP WD CD PRF AWI PWI FPD].freeze
6
+ STAGES = %w[NP NWIP WD CD FCD PRF AWI PWI FPD].freeze
7
7
  TYPES = %w[DATA ISP IWA R TTA TS TR IS PAS Guide GUIDE DIR].freeze
8
8
  # TYPED_STAGES = %w[DIS FDIS DPAS FDTR FDTS DTS DTR PDTR PDTS].freeze
9
9
  SUPPLEMENTS = %w[Amd Cor AMD COR Suppl].freeze
@@ -18,13 +18,17 @@ module Pubid::Iso
18
18
  end.flatten +
19
19
  %w[pDCOR PDAM]
20
20
 
21
+ STAGED_ADDENDA = Pubid::Iso::Identifier::Addendum::TYPED_STAGES.map do |_, v|
22
+ v[:abbr]
23
+ end
24
+
21
25
  DIR_SUPPLEMENTS = %w[Supplement SUP].freeze
22
26
 
23
- TYPED_STAGES = Identifier.config.types.map do |type|
27
+ TYPED_STAGES = (Identifier.config.types.map do |type|
24
28
  type::TYPED_STAGES.map do |_, v|
25
29
  v.key?(:legacy_abbr) ? (v[:legacy_abbr] + [v[:abbr]]) : v[:abbr]
26
30
  end
27
- end.flatten - STAGED_SUPPLEMENTS + %w[PDTR PDTS]
31
+ end.flatten - STAGED_SUPPLEMENTS + %w[PDTR PDTS]).sort_by(&:length).reverse
28
32
 
29
33
  TCTYPES = ["TC", "JTC", "PC", "IT", "CAB", "CASCO", "COPOLCO",
30
34
  "COUNCIL", "CPSG", "CS", "DEVCO", "GA", "GAAB", "INFCO",
@@ -40,6 +44,10 @@ module Pubid::Iso
40
44
  "CSC/SP", "CSC/FIN", "JAG"].freeze
41
45
 
42
46
  ORGANIZATIONS = %w[IEC IEEE CIW SAE CIE ASME ASTM OECD ISO HL7 CEI].freeze
47
+ rule(:dash) do
48
+ str("-") | str("‑") | str("‐")
49
+ end
50
+
43
51
  rule(:stage) do
44
52
  array_to_str(Pubid::Iso::Renderer::Base::TRANSLATION[:russian][:stage].values) | array_to_str(STAGES)
45
53
  end
@@ -60,6 +68,10 @@ module Pubid::Iso
60
68
  (array_to_str(Pubid::Iso::Renderer::Base::TRANSLATION[:russian][:type].values) | array_to_str(TYPES)).as(:type)
61
69
  end
62
70
 
71
+ rule(:staged_addenda) do
72
+ array_to_str(STAGED_ADDENDA)
73
+ end
74
+
63
75
  rule(:tctype) do
64
76
  # tc-types
65
77
  array_to_str(TCTYPES)
@@ -79,14 +91,14 @@ module Pubid::Iso
79
91
 
80
92
  rule(:year_digits) { (str("19") | str("20")) >> match('\d').repeat(2, 2) >> digits.absent? }
81
93
 
82
-
83
94
  rule(:part_matcher) do
84
95
  year_digits.absent? >>
85
- (str("Amd") | str("Cor")).absent? >> ((roman_numerals >> digits.absent?) | match['[\dA-Z]'].repeat(1)).as(:part)
96
+ supplements.absent? >>
97
+ staged_addenda.absent? >> ((roman_numerals >> digits.absent?) | match['[\dA-Z]'].repeat(1)).as(:part)
86
98
  end
87
99
 
88
100
  rule(:part) do
89
- (str("/") | str("-")) >> space? >> part_matcher >> (str("-") >> part_matcher).repeat
101
+ (str("/") | dash) >> space? >> part_matcher >> (dash >> part_matcher).repeat
90
102
  end
91
103
 
92
104
  rule(:organization) do
@@ -109,13 +121,19 @@ module Pubid::Iso
109
121
  (space | str(".")).repeat(1).maybe >>
110
122
  digits.as(:number).maybe >>
111
123
  (str(".") >> digits.as(:iteration)).maybe >>
112
- ((str(":") | str("-")) >> digits.as(:year)).maybe).repeat(1).as(:supplements)
124
+ ((str(":") | dash) >> digits.as(:year)).maybe).repeat(1).as(:supplements)
113
125
  end
114
126
 
115
127
  rule(:addendum) do
116
128
  (
117
- ((str("/") >> (str("Add") | str("ADD"))) | (str(" — Addendum"))) >> space >> digits.as(:number) >> ((str(":")) >> digits.as(:year)).maybe
118
- ).as(:addendum)
129
+ (((str("/") >> (str("Add") | str("ADD")).as(:type)) | (str(" — ") >> str("Addendum").as(:type))) |
130
+ (str("/") >> staged_addenda.as(:typed_stage))) >>
131
+ space >> digits.as(:number) >> ((str(":")) >> digits.as(:year)).maybe
132
+ ).repeat(1).as(:supplements)
133
+ end
134
+
135
+ rule(:extract) do
136
+ str("/") >> str("Ext") >> space >> (digits.as(:number) >> str(":") >> digits.as(:year)).as(:extract)
119
137
  end
120
138
 
121
139
  rule(:language) do
@@ -157,15 +175,16 @@ module Pubid::Iso
157
175
  end
158
176
 
159
177
  rule(:std_document_body) do
160
- (type | stage.as(:stage)).maybe >>
178
+ (type | (stage.as(:stage) >> digits.as(:iteration).maybe)).maybe >>
161
179
  # for ISO/IEC WD TS 25025
162
180
  space? >> ((stage.as(:stage) | typed_stage.as(:stage) | type) >> space).maybe >>
163
181
  digits.as(:number) >>
164
182
  # for identifiers like ISO 5537/IDF 26
165
183
  (str("|") >> (str("IDF").as(:publisher) >> space >> digits.as(:number)).as(:joint_document)).maybe >>
166
184
  part.maybe >> iteration.maybe >>
167
- (space? >> (str(":") | str("-")) >> year).maybe >>
185
+ (space? >> (str(":") | dash) >> year).maybe >>
168
186
  supplement.maybe >>
187
+ extract.maybe >>
169
188
  addendum.maybe >>
170
189
  edition.maybe >>
171
190
  language.maybe
@@ -0,0 +1,7 @@
1
+ require_relative "supplement"
2
+
3
+ module Pubid::Iso::Renderer
4
+ class Addendum < Supplement
5
+ TYPE = "Add".freeze
6
+ end
7
+ end
@@ -64,7 +64,7 @@ module Pubid::Iso::Renderer
64
64
  end
65
65
  [publisher, copublishers].join("/")
66
66
  when Array
67
- ([publisher] + copublishers.map(&:to_s).sort).map do |pub|
67
+ ([publisher] + copublishers.map(&:to_s)).map do |pub|
68
68
  if opts[:language]
69
69
  (TRANSLATION[opts[:language]][:publisher][pub] || pub).gsub('-', '/')
70
70
  else
@@ -156,8 +156,6 @@ module Pubid::Iso::Renderer
156
156
  end
157
157
 
158
158
  def render_part(part, opts, _params)
159
- return "-#{part.reverse.join('-')}" if part.is_a?(Array)
160
-
161
159
  "-#{part}"
162
160
  end
163
161
 
@@ -0,0 +1,9 @@
1
+ require_relative "base"
2
+
3
+ module Pubid::Iso::Renderer
4
+ class Extract < Supplement
5
+ def render_identifier(params, opts)
6
+ "/Ext%{number}%{year}" % params
7
+ end
8
+ end
9
+ end
@@ -2,7 +2,7 @@ require_relative "identifier/base"
2
2
  require_relative "renderer/base"
3
3
 
4
4
  module Pubid::Iso
5
- class Transformer < Parslet::Transform
5
+ class Transformer < Pubid::Core::Transformer
6
6
  rule(edition: "Ed") do
7
7
  { edition: "1" }
8
8
  end
@@ -29,7 +29,12 @@ module Pubid::Iso
29
29
  end
30
30
  )
31
31
  else
32
- supplement
32
+ case supplement[:type]
33
+ when "Addendum"
34
+ supplement.merge({ type: "Add" })
35
+ else
36
+ supplement
37
+ end
33
38
  end
34
39
  end
35
40
  context
@@ -91,6 +96,10 @@ module Pubid::Iso
91
96
  { publisher: russian_publisher&.to_s || publisher }
92
97
  end
93
98
 
99
+ rule(part: sequence(:part)) do
100
+ { part: part.map(&:to_s).join("-") }
101
+ end
102
+
94
103
  rule(joint_document: subtree(:joint_document)) do |context|
95
104
  context[:joint_document] =
96
105
  Identifier.create(**context[:joint_document])
@@ -103,36 +112,6 @@ module Pubid::Iso
103
112
  context.select { |k, v| k != :dir_joint_document }
104
113
  end
105
114
 
106
-
107
- rule(roman_numerals: simple(:roman_numerals)) do |context|
108
- roman_to_int(context[:roman_numerals])
109
- # case roman_numerals
110
- # when "III"
111
- # 3
112
- # else
113
- # nil
114
- # end
115
- end
116
-
117
- ROMAN_TO_INT = {
118
- "I" => 1,
119
- "V" => 5,
120
- "X" => 10,
121
- "L" => 50,
122
- "C" => 100,
123
- "D" => 500,
124
- "M" => 1000,
125
- }
126
-
127
- def self.roman_to_int(roman)
128
- sum = ROMAN_TO_INT[roman.to_s[0]]
129
- roman.to_s.chars.each_cons(2) do |c1, c2|
130
- sum += ROMAN_TO_INT[c2]
131
- sum -= ROMAN_TO_INT[c1] * 2 if ROMAN_TO_INT[c1] < ROMAN_TO_INT[c2]
132
- end
133
- sum
134
- end
135
-
136
115
  def self.convert_stage(code)
137
116
  russian_code = Pubid::Iso::Renderer::Base::TRANSLATION[:russian][:stage].key(code.to_s)
138
117
  return { stage: russian_code } if russian_code
@@ -1,5 +1,5 @@
1
1
  module Pubid
2
2
  module Iso
3
- VERSION = "0.5.2".freeze
3
+ VERSION = "0.6.0".freeze
4
4
  end
5
5
  end
data/lib/pubid/iso.rb CHANGED
@@ -28,6 +28,8 @@ require_relative "iso/identifier/guide"
28
28
  require_relative "iso/identifier/recommendation"
29
29
  require_relative "iso/identifier/technology_trends_assessments"
30
30
  require_relative "iso/identifier/international_workshop_agreement"
31
+ require_relative "iso/identifier/extract"
32
+ require_relative "iso/identifier/addendum"
31
33
 
32
34
  config = Pubid::Core::Configuration.new
33
35
  config.stages = YAML.load_file(File.join(File.dirname(__FILE__), "../../stages.yaml"))
@@ -46,7 +48,9 @@ config.types = [Pubid::Iso::Identifier::InternationalStandard,
46
48
  Pubid::Iso::Identifier::TechnicalReport,
47
49
  Pubid::Iso::Identifier::TechnicalSpecification,
48
50
  Pubid::Iso::Identifier::TechnologyTrendsAssessments,
49
- Pubid::Iso::Identifier::Guide]
51
+ Pubid::Iso::Identifier::Guide,
52
+ Pubid::Iso::Identifier::Extract,
53
+ Pubid::Iso::Identifier::Addendum]
50
54
  config.type_names = { tr: {
51
55
  long: "Technical Report",
52
56
  short: "TR",
data/stages.yaml CHANGED
@@ -4,6 +4,7 @@ abbreviations:
4
4
  AWI: ["20.00", "10.99"]
5
5
  WD: ["20.20", "20.60", "20.98", "20.99"]
6
6
  CD: ["30.00", "30.20", "30.60", "30.92", "30.98", "30.99"]
7
+ FCD: ["40.00", "40.20", "40.60", "40.92", "40.98", "40.99"]
7
8
  PRF: ["50.00", "50.20", "50.60", "50.92", "50.98", "50.99"]
8
9
 
9
10
  names:
@@ -11,6 +12,7 @@ names:
11
12
  PWI: Preliminary Work Item
12
13
  NP: New Proposal
13
14
  CD: Committee Draft
15
+ FCD: Final Committee Draft
14
16
  PRF: Proof of a new
15
17
 
16
18
  codes_description:
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pubid-iso
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.2
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-03-31 00:00:00.000000000 Z
11
+ date: 2023-07-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -38,48 +38,6 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
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
41
  - !ruby/object:Gem::Dependency
84
42
  name: parslet
85
43
  requirement: !ruby/object:Gem::Requirement
@@ -100,14 +58,14 @@ dependencies:
100
58
  requirements:
101
59
  - - "~>"
102
60
  - !ruby/object:Gem::Version
103
- version: 1.8.0
61
+ version: 1.8.6
104
62
  type: :runtime
105
63
  prerelease: false
106
64
  version_requirements: !ruby/object:Gem::Requirement
107
65
  requirements:
108
66
  - - "~>"
109
67
  - !ruby/object:Gem::Version
110
- version: 1.8.0
68
+ version: 1.8.6
111
69
  description: Library to generate, parse and manipulate ISO PubID.
112
70
  email:
113
71
  - open.source@ribose.com
@@ -123,10 +81,12 @@ files:
123
81
  - lib/pubid/iso.rb
124
82
  - lib/pubid/iso/errors.rb
125
83
  - lib/pubid/iso/identifier.rb
84
+ - lib/pubid/iso/identifier/addendum.rb
126
85
  - lib/pubid/iso/identifier/amendment.rb
127
86
  - lib/pubid/iso/identifier/base.rb
128
87
  - lib/pubid/iso/identifier/corrigendum.rb
129
88
  - lib/pubid/iso/identifier/directives.rb
89
+ - lib/pubid/iso/identifier/extract.rb
130
90
  - lib/pubid/iso/identifier/guide.rb
131
91
  - lib/pubid/iso/identifier/international_standard.rb
132
92
  - lib/pubid/iso/identifier/international_standardized_profile.rb
@@ -139,10 +99,12 @@ files:
139
99
  - lib/pubid/iso/identifier/technical_specification.rb
140
100
  - lib/pubid/iso/identifier/technology_trends_assessments.rb
141
101
  - lib/pubid/iso/parser.rb
102
+ - lib/pubid/iso/renderer/addendum.rb
142
103
  - lib/pubid/iso/renderer/amendment.rb
143
104
  - lib/pubid/iso/renderer/base.rb
144
105
  - lib/pubid/iso/renderer/corrigendum.rb
145
106
  - lib/pubid/iso/renderer/dir.rb
107
+ - lib/pubid/iso/renderer/extract.rb
146
108
  - lib/pubid/iso/renderer/guide.rb
147
109
  - lib/pubid/iso/renderer/international_standard.rb
148
110
  - lib/pubid/iso/renderer/international_standardized_profile.rb