pubid-core 1.4.0 → 1.5.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: 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