pubid-core 1.4.0 → 1.5.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: b1e2dbeb108d767054166d4fec9c0bb64e5c3a7ebb8811dc4f97de4c6cea4e93
4
- data.tar.gz: 0aa8be27d6b839e6e985d8ce1a376d6fbe55ef07e87a664ac902c455e937c887
3
+ metadata.gz: fe1c8b6b0226decbdfd993caaf75ad8e673ea91c86a78c4fa380d82ac8119d1c
4
+ data.tar.gz: 5d07cdca4cdaf9febed8cb1e2d1bc18ffc503d6ad09359cb2002e4aaae13a2cc
5
5
  SHA512:
6
- metadata.gz: 06b053ef1516f1fbe0524171fbc27afd6659e301cabb6692fb46be8b746807f6e21e081c48bc10f8cb1be282607154a7f084850f117c62e3748f8e2de1b25922
7
- data.tar.gz: d3f441ccc72743f752b81eb993c7c71088442c1c53376412553a809464473048a29e80503673962d6b496dd9efc1979ed191f35dea08d9f3f19032073bba3711
6
+ metadata.gz: 7c7db091d747e05faab9c3cfb4ef42f3e65064e027cd5875eb888c5397852a286f03388da9941491a5eca184c00cdcf30a74b3185254e4343aee82b597abf9c0
7
+ data.tar.gz: 3fceacbe396c2c8f627fd602f95132667162742e0d274f7fe649f323ef81c43e3684ad42fc626c8a841c41e1a81ce570b077a530685a9445a9b4eb92e21ce8e7
@@ -1,5 +1,8 @@
1
1
  module Pubid::Core
2
2
  module Errors
3
3
  class ParseError < StandardError; end
4
+ class HarmonizedStageCodeInvalidError < StandardError; end
5
+ class StageInvalidError < StandardError; end
6
+ class HarmonizedStageRenderingError < StandardError; end
4
7
  end
5
8
  end
@@ -0,0 +1,79 @@
1
+ module Pubid::Core
2
+ class HarmonizedStageCode
3
+ include Comparable
4
+ # attr_accessor :stage, :substage
5
+ attr_accessor :stages
6
+
7
+ DESCRIPTIONS = STAGES_CONFIG["codes_description"]
8
+ DRAFT_STAGES = STAGES_CONFIG["draft_codes"]
9
+ CANCELED_STAGES = STAGES_CONFIG["canceled_codes"]
10
+ PUBLISHED_STAGES = STAGES_CONFIG["published_codes"]
11
+ STAGES_NAMES = STAGES_CONFIG["stage_codes"]
12
+ SUBSTAGES_NAMES = STAGES_CONFIG["substage_codes"]
13
+
14
+ # @param stage_or_code [String,Array<String>] stage number or whole harmonized code with substage
15
+ # or list or stages for fuzzy stages eg. "10", 10, "20.20", ["10.20", "20.20"]
16
+ # or stage name eg. "proposal", "approval"
17
+ # @param substage [Integer, String] eg. "00", 0
18
+ # or substage name eg. "registration", "start_of_main_action"
19
+ def initialize(stage_or_code, substage = "00")
20
+ @stages = if stage_or_code.is_a?(Array)
21
+ stage_or_code
22
+ elsif stage_or_code.is_a?(String) && DESCRIPTIONS.key?(stage_or_code)
23
+ [stage_or_code]
24
+ # when stage is stage name
25
+ elsif STAGES_NAMES.key?(stage_or_code.to_s)
26
+ ["#{STAGES_NAMES[stage_or_code.to_s]}.#{SUBSTAGES_NAMES[substage.to_s]}"]
27
+ else
28
+ # stage is number
29
+ ["#{stage_or_code}.#{substage}"]
30
+ end
31
+ validate_stages
32
+ end
33
+
34
+ def validate_stages
35
+ @stages.each do |stage|
36
+ # raise an error when stage is wrong
37
+ raise Errors::HarmonizedStageCodeInvalidError unless DESCRIPTIONS.key?(stage)
38
+ end
39
+ end
40
+
41
+ def to_s
42
+ if fuzzy?
43
+ return "draft" if @stages.all? { |s| DRAFT_STAGES.include?(s) || CANCELED_STAGES.include?(s) }
44
+
45
+ return "published" if @stages.all? { |s| PUBLISHED_STAGES.include?(s) }
46
+
47
+ raise Errors::HarmonizedStageRenderingError, "cannot render fuzzy stages"
48
+ else
49
+ @stages.first
50
+ end
51
+ end
52
+
53
+ def ==(other)
54
+ (stages & other.stages) == other.stages
55
+ end
56
+
57
+ def fuzzy?
58
+ @stages.length > 1
59
+ end
60
+
61
+ def stage
62
+ raise Errors::HarmonizedStageRenderingError, "cannot render stage for fuzzy stages" if fuzzy?
63
+
64
+ return nil if @stages.empty?
65
+
66
+ @stages.first.split(".").first
67
+ end
68
+
69
+ def substage
70
+ raise Errors::HarmonizedStageRenderingError, "cannot render substage for fuzzy stages" if fuzzy?
71
+
72
+ @stages.first.split(".").last
73
+ end
74
+
75
+ def description
76
+ DESCRIPTIONS[to_s]
77
+ end
78
+ end
79
+ end
@@ -85,10 +85,6 @@ module Pubid::Core::Renderer
85
85
  end
86
86
  end
87
87
 
88
- def render_base(params, prefix = "")
89
- "%{publisher}#{prefix} %{number}" % params
90
- end
91
-
92
88
  def render_identifier(params)
93
89
  render_base(params)
94
90
  end
@@ -0,0 +1,98 @@
1
+ module Pubid::Core
2
+ class Stage
3
+ attr_accessor :abbr, :harmonized_code
4
+
5
+ STAGES = STAGES_CONFIG["abbreviations"]
6
+
7
+ # @param abbr [String, Symbol] abbreviation eg. :PWI, :WD
8
+ # @param harmonized_code [String, Float, HarmonizedStageCode]
9
+ def initialize(abbr: nil, harmonized_code: nil)
10
+ @abbr = abbr&.to_s
11
+
12
+ if harmonized_code
13
+ @harmonized_code = if harmonized_code.is_a?(HarmonizedStageCode)
14
+ harmonized_code
15
+ else
16
+ HarmonizedStageCode.new(harmonized_code)
17
+ end
18
+ @abbr ||= lookup_abbr(@harmonized_code.stages)
19
+ end
20
+
21
+ if abbr
22
+ raise Errors::StageInvalidError, "#{abbr} is not valid stage" unless STAGES.key?(abbr.to_s)
23
+
24
+ @harmonized_code ||= HarmonizedStageCode.new(lookup_code(abbr))
25
+ end
26
+ end
27
+
28
+ # Lookup for abbreviated code by numeric stage code
29
+ # @param lookup_code [String, Array] stage code or array of stage codes,
30
+ # e.g. "00.00", "20.20", ["00.00", "00.20"]
31
+ def lookup_abbr(lookup_code)
32
+ lookup_code = lookup_code.first if lookup_code.is_a?(Array) && lookup_code.count == 1
33
+
34
+ STAGES.each do |abbr, codes|
35
+ case codes
36
+ when Array
37
+ if lookup_code.is_a?(Array)
38
+ return abbr if codes == lookup_code
39
+ else
40
+ return abbr if codes.include?(lookup_code)
41
+ end
42
+ # codes.each do |code|
43
+ # return abbr if code == lookup_code
44
+ # end
45
+ when lookup_code
46
+ return abbr
47
+ end
48
+ end
49
+
50
+ nil
51
+ end
52
+
53
+ def lookup_code(lookup_abbr)
54
+ STAGES[lookup_abbr.to_s]
55
+ end
56
+
57
+ def self.parse(stage)
58
+ if /\A[\d.]+\z/.match?(stage)
59
+ Stage.new(harmonized_code: stage)
60
+ else
61
+ raise Errors::StageInvalidError unless stage.is_a?(Symbol) || stage.is_a?(String) || stage.is_a?(Parslet::Slice)
62
+
63
+ Stage.new(abbr: stage.to_s)
64
+ end
65
+ end
66
+
67
+ # @return [Boolean] true if stage exists
68
+ def self.has_stage?(stage)
69
+ if stage.is_a?(Stage)
70
+ STAGES.key?(stage.abbr.to_sym)
71
+ else
72
+ STAGES.key?(stage.to_s) || /\A[\d.]+\z/.match?(stage)
73
+ end
74
+ end
75
+
76
+ # Compares one stage with another
77
+ def ==(other)
78
+ other&.harmonized_code == harmonized_code
79
+ end
80
+
81
+ # Return stage name, eg. "Draft International Standard" for "DIS"
82
+ def name
83
+ STAGES_CONFIG["names"][abbr.to_s]
84
+ end
85
+
86
+ # @param with_prf [Boolean]
87
+ # @return [Boolean] false if there are output for abbreviation should be produced
88
+ def empty_abbr?(with_prf: false)
89
+ return true if abbr == "PRF" && !with_prf
90
+
91
+ abbr.nil?
92
+ end
93
+
94
+ def to_s(opts = {})
95
+ abbr unless empty_abbr?(**opts)
96
+ end
97
+ end
98
+ end
@@ -1,5 +1,5 @@
1
1
  module Pubid
2
2
  module Core
3
- VERSION = "1.4.0".freeze
3
+ VERSION = "1.5.0".freeze
4
4
  end
5
5
  end
data/lib/pubid/core.rb CHANGED
@@ -9,3 +9,5 @@ require_relative "core/transformer"
9
9
  require_relative "core/renderer/base"
10
10
  require_relative "core/renderer/urn"
11
11
  require_relative "core/identifier"
12
+ require_relative "core/harmonized_stage_code"
13
+ require_relative "core/stage"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pubid-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.0
4
+ version: 1.5.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: 2022-11-04 00:00:00.000000000 Z
11
+ date: 2023-01-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -68,10 +68,12 @@ files:
68
68
  - lib/pubid/core/amendment.rb
69
69
  - lib/pubid/core/corrigendum.rb
70
70
  - lib/pubid/core/errors.rb
71
+ - lib/pubid/core/harmonized_stage_code.rb
71
72
  - lib/pubid/core/identifier.rb
72
73
  - lib/pubid/core/parser.rb
73
74
  - lib/pubid/core/renderer/base.rb
74
75
  - lib/pubid/core/renderer/urn.rb
76
+ - lib/pubid/core/stage.rb
75
77
  - lib/pubid/core/supplement.rb
76
78
  - lib/pubid/core/transformer.rb
77
79
  - lib/pubid/core/version.rb