pubid-bsi 0.1.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a23f485f876d0c481d572df9a92cb60e2a61e1572f93605723366d341f2d7704
4
- data.tar.gz: 10d63e91c4330d2a0f1192a46d7062b252308c4a1ec75946379d89d6e90d87a9
3
+ metadata.gz: 93e79aa30559f8e41d5b9cb74e4b3d5e808188a615d8f3311fadfdf6709d58e4
4
+ data.tar.gz: e544f503afb1e40eb7ba2cec6efa945357bac3e72234e0ffe05f5f87ce2c07ad
5
5
  SHA512:
6
- metadata.gz: 871a55125a1691fe020e80574de9ac45d526d736427d5b736625458b45004174f12288ef244e37ec10c06d4c4a60d59fbce4653d8f1ee83d06044850f0bad7fc
7
- data.tar.gz: eb5570d84e4cdb28c460aac841ce3e8813fda6ce13328004d30891801070ec78d5f871dc4a392156f28d68d8a6a87575453c1ada18c8aba6b0f2d6478f3ed02a
6
+ metadata.gz: 7cde8daf524af5296c9ed7ace2eb757b47ddeec768eee945d47a7eb3d305e12fa1495d9a88497a63ee6895bd4e12cdaa49a0d578fb44599252739d3e975a4da2
7
+ data.tar.gz: 208451435217ad215d3209799d929d14329cc7d026e4d532667732a4900b227327190ea78fdf39ed8cdf57fb3903abed97223bfbe49308630cc3fa8de44189c8
@@ -3,30 +3,72 @@ require 'forwardable'
3
3
  module Pubid::Bsi
4
4
  module Identifier
5
5
  class Base < Pubid::Core::Identifier::Base
6
- attr_accessor :month, :supplement, :adopted
6
+ attr_accessor :month, :supplement, :adopted, :tracked_changes, :translation, :pdf
7
+
7
8
  extend Forwardable
8
9
 
9
10
  # @param month [Integer] document's month
10
11
  # @param edition [String] document's edition version, e.g. "3.0", "1.0"
11
12
  def initialize(publisher: "BS", month: nil, edition: nil,
12
- supplement: nil, number: nil, adopted: nil, **opts)
13
+ supplement: nil, number: nil, adopted: nil,
14
+ expert_commentary: false, tracked_changes: false,
15
+ translation: nil, pdf: false, **opts)
16
+
13
17
  super(**opts.merge(publisher: publisher, number: number))
14
18
  @month = month if month
15
19
  @edition = edition if edition
16
20
  @supplement = supplement
17
21
  @adopted = adopted
22
+ @tracked_changes = tracked_changes
23
+ @translation = translation
24
+ @pdf = pdf
18
25
  end
19
26
 
20
27
  class << self
28
+ def transform_hash(params)
29
+ params.map do |k, v|
30
+ get_transformer_class.new.apply(k => v.is_a?(Hash) ? transform_hash(v) : v)
31
+ end.inject({}, :merge)
32
+ end
33
+
21
34
  # Use Identifier#create to resolve identifier's type class
22
35
  def transform(params)
23
- identifier_params = params.map do |k, v|
24
- get_transformer_class.new.apply(k => v)
25
- end.inject({}, :merge)
36
+ identifier_params = transform_hash(params)
37
+
38
+ if identifier_params[:national_annex]
39
+ return transform_national_annex(
40
+ identifier_params[:national_annex],
41
+ identifier_params.dup.tap { |h| h.delete(:national_annex) })
42
+ end
43
+
44
+ return transform_expert_commentary(identifier_params) if identifier_params[:expert_commentary]
45
+
46
+ return transform_collection(identifier_params) if identifier_params[:second_number]
26
47
 
27
48
  Identifier.create(**identifier_params)
28
49
  end
29
50
 
51
+ def transform_collection(params)
52
+ first_identifier_params =
53
+ params.reject { |k, _| %i[second_number year supplement].include?(k) }
54
+ second_identifier_params = first_identifier_params.dup
55
+ second_identifier_params[:number] = params[:second_number]
56
+ Collection.new(identifiers: [Identifier.create(**first_identifier_params),
57
+ Identifier.create(**second_identifier_params)],
58
+ **params.slice(:supplement, :year))
59
+ end
60
+
61
+ def transform_expert_commentary(base_params)
62
+ Identifier.create(type: :ec,
63
+ base: Identifier.create(**base_params))
64
+ end
65
+
66
+ def transform_national_annex(params, base_params)
67
+ Identifier.create(type: params[:type],
68
+ supplement: params[:supplement],
69
+ base: Identifier.create(**base_params))
70
+ end
71
+
30
72
  def get_parser_class
31
73
  Parser
32
74
  end
@@ -0,0 +1,22 @@
1
+ module Pubid::Bsi
2
+ module Identifier
3
+ class Collection < Base
4
+ def_delegators 'Pubid::Bsi::Identifier::Collection', :type
5
+
6
+ attr_accessor :identifiers
7
+
8
+ def initialize(identifiers:, **args)
9
+ @identifiers = identifiers
10
+ super(publisher: nil, number: nil, **args)
11
+ end
12
+
13
+ def self.type
14
+ { key: :collection, title: "Collection" }
15
+ end
16
+
17
+ def to_s
18
+ Renderer::Collection.new(get_params).render
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,22 @@
1
+ module Pubid::Bsi
2
+ module Identifier
3
+ class ExpertCommentary < Base
4
+ attr_accessor :base
5
+
6
+ def_delegators 'Pubid::Bsi::Identifier::ExpertCommentary', :type
7
+
8
+ def initialize(base: nil, **opts)
9
+ super(**opts)
10
+ @base = base
11
+ end
12
+
13
+ def self.type
14
+ { key: :ec, title: "Expert Commentary", short: "ExComm" }
15
+ end
16
+
17
+ def self.get_renderer_class
18
+ Renderer::ExpertCommentary
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,23 @@
1
+ module Pubid::Bsi
2
+ module Identifier
3
+ class NationalAnnex < Base
4
+ attr_accessor :base
5
+
6
+ def_delegators 'Pubid::Bsi::Identifier::NationalAnnex', :type
7
+
8
+ def initialize(base: nil, **opts)
9
+
10
+ super(**opts)
11
+ @base = base
12
+ end
13
+
14
+ def self.type
15
+ { key: :na, title: "National Annex", short: "NA" }
16
+ end
17
+
18
+ def self.get_renderer_class
19
+ Renderer::NationalAnnex
20
+ end
21
+ end
22
+ end
23
+ end
@@ -1,7 +1,11 @@
1
1
  module Pubid::Bsi
2
2
  class Parser < Pubid::Core::Parser
3
+ rule(:year) do
4
+ match('\d').repeat(2, 4).as(:year)
5
+ end
6
+
3
7
  rule(:type) do
4
- array_to_str(Identifier.config.types.map { |type| type.type[:short] }.compact).as(:type)
8
+ national_annex.maybe >> array_to_str(Identifier.config.types.map { |type| type.type[:short] }.compact).as(:type)
5
9
  end
6
10
 
7
11
  rule(:part) do
@@ -13,17 +17,46 @@ module Pubid::Bsi
13
17
  end
14
18
 
15
19
  rule(:supplement) do
16
- (str("+") >> match("[AC]").as(:type) >> digits.as(:number) >> str(":") >> year).as(:supplement)
20
+ (str("+") >> match("[AC]").as(:type) >> digits.as(:number) >> (str(":") >> year).maybe).as(:supplement)
21
+ end
22
+
23
+ rule(:expert_commentary) do
24
+ space >> str("ExComm").as(:expert_commentary)
25
+ end
26
+
27
+ rule(:tracked_changes) do
28
+ str(" - TC").as(:tracked_changes)
29
+ end
30
+
31
+ rule(:national_annex) do
32
+ (str("NA").as(:type) >> supplement.maybe >> str(" to ").ignore).as(:national_annex)
33
+ end
34
+
35
+ rule(:translation) do
36
+ # space >> (match("[A-Z]").repeat(1).as(:translation) >> str(" TRANSLATION"))
37
+ space >> ((str("(") >> match("[A-Za-z]").repeat(1).as(:translation) >>
38
+ (space >> (str("Translation") | str("version"))).maybe >> str(")")) |
39
+ (match("[A-Z]").repeat(1).as(:translation) >> str(" TRANSLATION"))
40
+ )
41
+ end
42
+
43
+ rule(:pdf) do
44
+ space >> str("PDF").as(:pdf)
45
+ end
46
+
47
+ rule(:second_number) do
48
+ str("/") >> digits.as(:second_number)
17
49
  end
18
50
 
19
51
  rule(:identifier) do
20
52
  str("BSI ").maybe >> type >> space >>
21
53
  (
22
- (digits.as(:number) >> part.maybe >> (space >> edition).maybe >>
23
- (space? >> str(":") >> year >> (dash >> month_digits.as(:month)).maybe).maybe >>
24
- supplement.maybe) |
25
- match(".").repeat(1).as(:adopted)
26
- )
54
+ (digits.as(:number) >> second_number.maybe >> part.maybe >> (space >> edition).maybe >>
55
+ (space? >> str(":") >> year >> (dash >> month_digits.as(:month)).maybe).maybe) |
56
+ # exclude expert_commentary and translation from adopted scope
57
+ (expert_commentary.absent? >> translation.absent? >> space? >>
58
+ match("[^+ ]").repeat(1)).repeat.as(:adopted)
59
+ ) >> supplement.maybe >> expert_commentary.maybe >> tracked_changes.maybe >> translation.maybe >> pdf.maybe
27
60
  end
28
61
 
29
62
  rule(:root) { identifier }
@@ -3,9 +3,10 @@ module Pubid::Bsi::Renderer
3
3
  TYPE = "".freeze
4
4
 
5
5
  def render_identifier(params)
6
- return "%{publisher} %{adopted}" % params unless params[:adopted].to_s.empty?
6
+ suffix = "%{supplement}%{tracked_changes}%{translation}%{pdf}" % params
7
+ return "%{publisher} %{adopted}#{suffix}" % params unless params[:adopted].to_s.empty?
7
8
 
8
- "%{publisher} %{number}%{part}%{edition}%{year}%{month}%{supplement}" % params
9
+ "%{publisher} %{number}%{part}%{edition}%{year}%{month}#{suffix}" % params
9
10
  end
10
11
 
11
12
  def render_month(month, _opts, _params)
@@ -19,5 +20,17 @@ module Pubid::Bsi::Renderer
19
20
  def render_supplement(supplement, _opts, _params)
20
21
  supplement.to_s
21
22
  end
23
+
24
+ def render_tracked_changes(tracked_changes, _opts, _params)
25
+ " - TC" if tracked_changes
26
+ end
27
+
28
+ def render_translation(translation, _opts, _params)
29
+ " (#{translation})"
30
+ end
31
+
32
+ def render_pdf(pdf, _opts, _params)
33
+ " PDF" if pdf
34
+ end
22
35
  end
23
36
  end
@@ -0,0 +1,15 @@
1
+ module Pubid::Bsi::Renderer
2
+ class Collection < Pubid::Core::Renderer::Base
3
+ def render_identifier(params)
4
+ "%{identifiers}%{year}%{supplement}" % params
5
+ end
6
+
7
+ def render_supplement(supplement, _opts, _params)
8
+ supplement.to_s
9
+ end
10
+
11
+ def render_identifiers(identifiers, _opts, _params)
12
+ "#{identifiers.first}/" + identifiers[1..-1].map(&:number).join("/")
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,9 @@
1
+ require_relative "base"
2
+
3
+ module Pubid::Bsi::Renderer
4
+ class ExpertCommentary < Base
5
+ def render_identifier(params)
6
+ "%{base} ExComm" % params
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,10 @@
1
+ require_relative "base"
2
+
3
+ module Pubid::Bsi::Renderer
4
+ class NationalAnnex < Base
5
+
6
+ def render_identifier(params)
7
+ "NA%{supplement} to %{base}" % params
8
+ end
9
+ end
10
+ end
@@ -4,6 +4,14 @@ require_relative "renderer/base"
4
4
  module Pubid::Bsi
5
5
  class Transformer < Parslet::Transform
6
6
  rule(supplement: subtree(:supplement)) do |context|
7
+ if context[:supplement][:year] && context[:supplement][:year].to_s.length == 2
8
+ context[:supplement][:year] = if context[:supplement][:year].to_i > 50
9
+ "19#{context[:supplement][:year]}"
10
+ else
11
+ "20#{context[:supplement][:year]}"
12
+ end
13
+ end
14
+
7
15
  { supplement:
8
16
  case context[:supplement][:type]
9
17
  when "A"
@@ -17,7 +25,15 @@ module Pubid::Bsi
17
25
  rule(adopted: subtree(:adopted)) do |context|
18
26
  { adopted: Pubid::Iec::Identifier.parse(context[:adopted].to_s) }
19
27
  rescue Pubid::Core::Errors::ParseError
28
+ begin
20
29
  { adopted: Pubid::Iso::Identifier.parse(context[:adopted].to_s) }
30
+ rescue Pubid::Core::Errors::ParseError
31
+ { adopted: Pubid::Cen::Identifier.parse(context[:adopted].to_s) }
32
+ end
33
+ end
34
+
35
+ rule(translation: simple(:translation)) do
36
+ { translation: translation.to_s.downcase.capitalize }
21
37
  end
22
38
  end
23
39
  end
@@ -1,5 +1,5 @@
1
1
  module Pubid
2
2
  module Bsi
3
- VERSION = "0.1.1".freeze
3
+ VERSION = "0.3.0".freeze
4
4
  end
5
5
  end
data/lib/pubid/bsi.rb CHANGED
@@ -8,6 +8,7 @@ end
8
8
  require "pubid-core"
9
9
  require "pubid-iso"
10
10
  require "pubid-iec"
11
+ require "pubid-cen"
11
12
 
12
13
  require_relative "bsi/errors"
13
14
  require_relative "bsi/transformer"
@@ -19,6 +20,9 @@ require_relative "bsi/identifier/draft_document"
19
20
  require_relative "bsi/identifier/flex"
20
21
  require_relative "bsi/identifier/amendment"
21
22
  require_relative "bsi/identifier/corrigendum"
23
+ require_relative "bsi/identifier/national_annex"
24
+ require_relative "bsi/identifier/expert_commentary"
25
+ require_relative "bsi/identifier/collection"
22
26
  require_relative "bsi/renderer/base"
23
27
  require_relative "bsi/renderer/publicly_available_specification"
24
28
  require_relative "bsi/renderer/published_document"
@@ -26,6 +30,9 @@ require_relative "bsi/renderer/draft_document"
26
30
  require_relative "bsi/renderer/flex"
27
31
  require_relative "bsi/renderer/amendment"
28
32
  require_relative "bsi/renderer/corrigendum"
33
+ require_relative "bsi/renderer/national_annex"
34
+ require_relative "bsi/renderer/expert_commentary"
35
+ require_relative "bsi/renderer/collection"
29
36
  require_relative "bsi/parser"
30
37
  require_relative "bsi/identifier"
31
38
 
@@ -37,7 +44,10 @@ config.types = [Pubid::Bsi::Identifier::BritishStandard,
37
44
  Pubid::Bsi::Identifier::PublishedDocument,
38
45
  Pubid::Bsi::Identifier::DraftDocument,
39
46
  Pubid::Bsi::Identifier::Amendment,
40
- Pubid::Bsi::Identifier::Corrigendum]
47
+ Pubid::Bsi::Identifier::Corrigendum,
48
+ Pubid::Bsi::Identifier::NationalAnnex,
49
+ Pubid::Bsi::Identifier::ExpertCommentary,
50
+ Pubid::Bsi::Identifier::Collection]
41
51
  config.type_names = {
42
52
  bs: {
43
53
  long: "British Standard",
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pubid-bsi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.3.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-04-01 00:00:00.000000000 Z
11
+ date: 2023-04-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -100,42 +100,56 @@ dependencies:
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: 1.7.0
103
+ version: 1.8.0
104
104
  type: :runtime
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: 1.7.0
110
+ version: 1.8.0
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: pubid-iso
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
115
  - - "~>"
116
116
  - !ruby/object:Gem::Version
117
- version: 0.5.0
117
+ version: 0.5.2
118
118
  type: :runtime
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
122
  - - "~>"
123
123
  - !ruby/object:Gem::Version
124
- version: 0.5.0
124
+ version: 0.5.2
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: pubid-iec
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
129
  - - "~>"
130
130
  - !ruby/object:Gem::Version
131
- version: 0.2.0
131
+ version: 0.2.2
132
132
  type: :runtime
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
136
  - - "~>"
137
137
  - !ruby/object:Gem::Version
138
- version: 0.2.0
138
+ version: 0.2.2
139
+ - !ruby/object:Gem::Dependency
140
+ name: pubid-cen
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: 0.2.1
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: 0.2.1
139
153
  description: Library to generate, parse and manipulate ISO PubID.
140
154
  email:
141
155
  - open.source@ribose.com
@@ -154,17 +168,23 @@ files:
154
168
  - lib/pubid/bsi/identifier/amendment.rb
155
169
  - lib/pubid/bsi/identifier/base.rb
156
170
  - lib/pubid/bsi/identifier/british_standard.rb
171
+ - lib/pubid/bsi/identifier/collection.rb
157
172
  - lib/pubid/bsi/identifier/corrigendum.rb
158
173
  - lib/pubid/bsi/identifier/draft_document.rb
174
+ - lib/pubid/bsi/identifier/expert_commentary.rb
159
175
  - lib/pubid/bsi/identifier/flex.rb
176
+ - lib/pubid/bsi/identifier/national_annex.rb
160
177
  - lib/pubid/bsi/identifier/publicly_available_specification.rb
161
178
  - lib/pubid/bsi/identifier/published_document.rb
162
179
  - lib/pubid/bsi/parser.rb
163
180
  - lib/pubid/bsi/renderer/amendment.rb
164
181
  - lib/pubid/bsi/renderer/base.rb
182
+ - lib/pubid/bsi/renderer/collection.rb
165
183
  - lib/pubid/bsi/renderer/corrigendum.rb
166
184
  - lib/pubid/bsi/renderer/draft_document.rb
185
+ - lib/pubid/bsi/renderer/expert_commentary.rb
167
186
  - lib/pubid/bsi/renderer/flex.rb
187
+ - lib/pubid/bsi/renderer/national_annex.rb
168
188
  - lib/pubid/bsi/renderer/publicly_available_specification.rb
169
189
  - lib/pubid/bsi/renderer/published_document.rb
170
190
  - lib/pubid/bsi/transformer.rb