pubid-bsi 0.1.1 → 0.2.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: 8301f114cdb297b45e6c558830ebc198b8fe688c871610f09feb18a758213521
4
+ data.tar.gz: ad2e418836fea9ee47494c75a43006cc5d32d4ed795b39f39a5ff419db9c7383
5
5
  SHA512:
6
- metadata.gz: 871a55125a1691fe020e80574de9ac45d526d736427d5b736625458b45004174f12288ef244e37ec10c06d4c4a60d59fbce4653d8f1ee83d06044850f0bad7fc
7
- data.tar.gz: eb5570d84e4cdb28c460aac841ce3e8813fda6ce13328004d30891801070ec78d5f871dc4a392156f28d68d8a6a87575453c1ada18c8aba6b0f2d6478f3ed02a
6
+ metadata.gz: 68a2ab714684c24481819a353529a69bdb1f891395a9ce61915610d14860ad0b3b552e4bdf26e3ff84dbff7a17bd951631c19e8f260c15c2883479793fda2d1f
7
+ data.tar.gz: 4d8215a02e26eee04cd7240f2351ac089ab19117a6e100725045b6b79f555369ae4b8f242e27abbb661384b08e3fa0c0a6d80cb22334ff4e995b29d3602e34b1
@@ -3,30 +3,60 @@ 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]
26
45
 
27
46
  Identifier.create(**identifier_params)
28
47
  end
29
48
 
49
+ def transform_expert_commentary(base_params)
50
+ Identifier.create(type: :ec,
51
+ base: Identifier.create(**base_params))
52
+ end
53
+
54
+ def transform_national_annex(params, base_params)
55
+ Identifier.create(type: params[:type],
56
+ supplement: params[:supplement],
57
+ base: Identifier.create(**base_params))
58
+ end
59
+
30
60
  def get_parser_class
31
61
  Parser
32
62
  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,42 @@ 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)
17
45
  end
18
46
 
19
47
  rule(:identifier) do
20
48
  str("BSI ").maybe >> type >> space >>
21
49
  (
22
50
  (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
- )
51
+ (space? >> str(":") >> year >> (dash >> month_digits.as(:month)).maybe).maybe) |
52
+ # exclude expert_commentary and translation from adopted scope
53
+ (expert_commentary.absent? >> translation.absent? >> space? >>
54
+ match("[^+ ]").repeat(1)).repeat.as(:adopted)
55
+ ) >> supplement.maybe >> expert_commentary.maybe >> tracked_changes.maybe >> translation.maybe >> pdf.maybe
27
56
  end
28
57
 
29
58
  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,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.2.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,8 @@ 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"
22
25
  require_relative "bsi/renderer/base"
23
26
  require_relative "bsi/renderer/publicly_available_specification"
24
27
  require_relative "bsi/renderer/published_document"
@@ -26,6 +29,8 @@ require_relative "bsi/renderer/draft_document"
26
29
  require_relative "bsi/renderer/flex"
27
30
  require_relative "bsi/renderer/amendment"
28
31
  require_relative "bsi/renderer/corrigendum"
32
+ require_relative "bsi/renderer/national_annex"
33
+ require_relative "bsi/renderer/expert_commentary"
29
34
  require_relative "bsi/parser"
30
35
  require_relative "bsi/identifier"
31
36
 
@@ -37,7 +42,9 @@ config.types = [Pubid::Bsi::Identifier::BritishStandard,
37
42
  Pubid::Bsi::Identifier::PublishedDocument,
38
43
  Pubid::Bsi::Identifier::DraftDocument,
39
44
  Pubid::Bsi::Identifier::Amendment,
40
- Pubid::Bsi::Identifier::Corrigendum]
45
+ Pubid::Bsi::Identifier::Corrigendum,
46
+ Pubid::Bsi::Identifier::NationalAnnex,
47
+ Pubid::Bsi::Identifier::ExpertCommentary]
41
48
  config.type_names = {
42
49
  bs: {
43
50
  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.2.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-07 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
@@ -156,7 +170,9 @@ files:
156
170
  - lib/pubid/bsi/identifier/british_standard.rb
157
171
  - lib/pubid/bsi/identifier/corrigendum.rb
158
172
  - lib/pubid/bsi/identifier/draft_document.rb
173
+ - lib/pubid/bsi/identifier/expert_commentary.rb
159
174
  - lib/pubid/bsi/identifier/flex.rb
175
+ - lib/pubid/bsi/identifier/national_annex.rb
160
176
  - lib/pubid/bsi/identifier/publicly_available_specification.rb
161
177
  - lib/pubid/bsi/identifier/published_document.rb
162
178
  - lib/pubid/bsi/parser.rb
@@ -164,7 +180,9 @@ files:
164
180
  - lib/pubid/bsi/renderer/base.rb
165
181
  - lib/pubid/bsi/renderer/corrigendum.rb
166
182
  - lib/pubid/bsi/renderer/draft_document.rb
183
+ - lib/pubid/bsi/renderer/expert_commentary.rb
167
184
  - lib/pubid/bsi/renderer/flex.rb
185
+ - lib/pubid/bsi/renderer/national_annex.rb
168
186
  - lib/pubid/bsi/renderer/publicly_available_specification.rb
169
187
  - lib/pubid/bsi/renderer/published_document.rb
170
188
  - lib/pubid/bsi/transformer.rb