pubid-bsi 0.1.1 → 0.3.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: 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