gs1 0.1.8 → 1.0.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
- SHA1:
3
- metadata.gz: 8b0dc64a41c3fe49a82a223e72874ad311984b2d
4
- data.tar.gz: 5cb771c68a729928379a46af24a3afaa97d25f23
2
+ SHA256:
3
+ metadata.gz: 14ba1001a69817100cb96969f21f6471e96cce9167fb89d9eeb71592686195ea
4
+ data.tar.gz: d264ed32f56e3425db1e3d5063e30fc62128005a3aa1836383d2b5d2cd82699d
5
5
  SHA512:
6
- metadata.gz: 957d8f5c2f904905ae3377c2899eaeba0a9a320a3d780b2fbd63a38c54b554086b9148f08eee1991b9d3250635a6c448638fbbce9ebf2758e6aee150d895e91a
7
- data.tar.gz: 192af55f2f121b00bb50c6e01dbeed50aaacca4c511635f048cecd5c96ab48943f3a1013934bd077b0314c75c56f30f7165137896ea4ea137a9d7c0d5d4b16ce
6
+ metadata.gz: 4bdae90c963c4b50bda44b6acc4b4b4e087c9d460840d6be9f153a0235abf0b6e52b045916acba833b7183b0dc306afe34f89be54e5f3f397640367d77cc5f85
7
+ data.tar.gz: 9018273502be8aa631a7112aea4e48d1ae1367bcf1a0aa40aeea9cb2e7421f9973f88ad2ef630519a1e90a65de455627f89bc8e318f83637245858bfc28f6e6d
@@ -1 +1 @@
1
- ruby-2.3.0
1
+ ruby-2.6.1
@@ -0,0 +1,10 @@
1
+ ### 1.0.0 - 2019-08-30
2
+
3
+ * breaking
4
+ * Returns `nil` unless no attribute for barcode segment
5
+
6
+ * enhancements
7
+ * Add errors to a barcode
8
+
9
+ * bug fixes
10
+ * Fix `nil` argument for barcode
@@ -32,7 +32,7 @@ Gem::Specification.new do |spec|
32
32
  spec.require_paths = ['lib']
33
33
  spec.required_ruby_version = '>= 2.3.0'
34
34
 
35
- spec.add_development_dependency 'bundler', '~> 1.17'
35
+ spec.add_development_dependency 'bundler'
36
36
  spec.add_development_dependency 'byebug', '~> 10.0'
37
37
  spec.add_development_dependency 'rake', '~> 10.0'
38
38
  spec.add_development_dependency 'rb-readline', '~> 0.1'
@@ -1,4 +1,6 @@
1
1
  require 'gs1/barcode/definitions'
2
+ require 'gs1/barcode/error'
3
+ require 'gs1/barcode/errors'
2
4
 
3
5
  require 'gs1/barcode/base'
4
6
  require 'gs1/barcode/healthcare'
@@ -6,17 +6,18 @@ module GS1
6
6
  include Definitions
7
7
 
8
8
  def initialize(options = {})
9
- @params_order = options.keys
10
-
11
- self.class.records.each do |record|
12
- data = options.fetch(record.underscore_name, nil)
13
-
14
- instance_variable_set("@#{record.underscore_name}", record.new(data))
9
+ options.each do |(attribute_name, data)|
10
+ validate_attribute_data(attribute_name)
11
+ validate_attribute_record(attribute_name) do |record|
12
+ instance_variable_set("@#{attribute_name}", record.new(data))
13
+ end
15
14
  end
15
+
16
+ @params_order = options.to_h.keys
16
17
  end
17
18
 
18
19
  def errors
19
- @errors ||= []
20
+ @errors ||= Errors.new
20
21
  end
21
22
 
22
23
  class << self
@@ -5,6 +5,7 @@ module GS1
5
5
  module Definitions
6
6
  def self.included(base)
7
7
  base.extend ClassMethods
8
+ base.send :include, InstanceMethods
8
9
  end
9
10
 
10
11
  # Adding defintion class methods.
@@ -21,6 +22,27 @@ module GS1
21
22
  end
22
23
  end
23
24
  end
25
+
26
+ # Adding defintion instance methods.
27
+ #
28
+ module InstanceMethods
29
+ def validate_attribute_data(attribute_name)
30
+ return unless instance_variable_get("@#{attribute_name}")
31
+
32
+ errors[attribute_name] << Error.new(:already_defined, persistent: true)
33
+ end
34
+
35
+ def validate_attribute_record(attribute_name)
36
+ self.class.records.find { |r| r.underscore_name == attribute_name }.tap do |record|
37
+ if record
38
+ yield record
39
+ next
40
+ end
41
+
42
+ errors[attribute_name] << Error.new(:unknown_attribute, persistent: true)
43
+ end
44
+ end
45
+ end
24
46
  end
25
47
  end
26
48
  end
@@ -0,0 +1,30 @@
1
+ module GS1
2
+ module Barcode
3
+ # Error wrapper class for a barcode.
4
+ #
5
+ class Error
6
+ attr_reader :message
7
+
8
+ def initialize(message, persistent: false)
9
+ @message = message
10
+ @persistent = persistent
11
+ end
12
+
13
+ def persistent?
14
+ @persistent
15
+ end
16
+
17
+ def human_message
18
+ message.to_s.tr('_', ' ').capitalize
19
+ end
20
+
21
+ def hash
22
+ message.hash
23
+ end
24
+
25
+ def eql?(other)
26
+ @message == other.message
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,41 @@
1
+ module GS1
2
+ module Barcode
3
+ # Error collection handler wrapper class for a barcode.
4
+ #
5
+ class Errors
6
+ attr_reader :errors
7
+
8
+ def initialize
9
+ @errors = {}
10
+ end
11
+
12
+ def [](attribute_name)
13
+ errors[attribute_name] ||= []
14
+ end
15
+
16
+ def clear
17
+ errors.each_value do |errs|
18
+ errs.select!(&:persistent?)
19
+ end
20
+ end
21
+
22
+ def empty?
23
+ errors.values.flatten.empty?
24
+ end
25
+
26
+ def messages
27
+ errors.each_with_object({}) do |(attribute_name, errors), hash|
28
+ hash[attribute_name] = errors.uniq.map(&:human_message)
29
+ end
30
+ end
31
+
32
+ def full_messages
33
+ errors.flat_map do |(attribute_name, errors)|
34
+ errors.uniq.map do |error|
35
+ "#{error.human_message} #{attribute_name.to_s.tr('_', ' ')}"
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -41,16 +41,26 @@ module GS1
41
41
  end
42
42
 
43
43
  def validate_minimum
44
- errors << 'Invalid gtin' unless gtin.valid?
44
+ validate_attribute(:gtin)
45
45
  end
46
46
 
47
47
  def validate_enhanced
48
- errors << 'Invalid batch' unless batch&.valid?
49
- errors << 'Invalid expiration date' unless expiration_date&.valid?
48
+ validate_attribute(:batch)
49
+ validate_attribute(:expiration_date)
50
50
  end
51
51
 
52
52
  def validate_highest
53
- errors << 'Invalid serial number' unless serial_number&.valid?
53
+ validate_attribute(:serial_number)
54
+ end
55
+
56
+ def validate_attribute(attribute_name)
57
+ attribute = public_send(attribute_name)
58
+
59
+ if attribute.nil?
60
+ errors[attribute_name] << Error.new(:missing)
61
+ elsif !attribute.valid?
62
+ errors[attribute_name] << Error.new(:invalid)
63
+ end
54
64
  end
55
65
  end
56
66
  end
@@ -6,14 +6,14 @@ module GS1
6
6
  attr_reader :data, :separator
7
7
 
8
8
  def initialize(data, separator: GS1.configuration.barcode_separator)
9
- @data = data.chars
9
+ @data = data.to_s.chars
10
10
  @separator = separator
11
11
  end
12
12
 
13
13
  def to_params
14
- return {} unless record
14
+ return [] unless record
15
15
 
16
- { record.underscore_name => record_data }
16
+ [record.underscore_name, record_data]
17
17
  end
18
18
 
19
19
  # Fetch the two first characters (interpreted as AI) from the remaining
@@ -9,7 +9,7 @@ module GS1
9
9
  def initialize(data, separator: GS1.configuration.barcode_separator)
10
10
  @data = data
11
11
  @separator = separator
12
- @params = {}
12
+ @params = []
13
13
  end
14
14
 
15
15
  def to_params
@@ -26,7 +26,8 @@ module GS1
26
26
  segment_from_input(input, bang) do |segment|
27
27
  next if segment.to_params.empty?
28
28
 
29
- params.merge!(segment.to_params)
29
+ params << segment.to_params
30
+
30
31
  next if segment.rest.empty?
31
32
 
32
33
  segment_to_params(segment.rest, bang)
@@ -1,3 +1,3 @@
1
1
  module GS1
2
- VERSION = '0.1.8'.freeze
2
+ VERSION = '1.0.0'.freeze
3
3
  end
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gs1
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.8
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stefan Åhman
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-02-20 00:00:00.000000000 Z
11
+ date: 2019-08-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '1.17'
19
+ version: '0'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '1.17'
26
+ version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: byebug
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -120,6 +120,7 @@ files:
120
120
  - ".rubocop.yml"
121
121
  - ".ruby-version"
122
122
  - ".travis.yml"
123
+ - CHANGELOG.md
123
124
  - CODE_OF_CONDUCT.md
124
125
  - Gemfile
125
126
  - LICENSE.txt
@@ -133,6 +134,8 @@ files:
133
134
  - lib/gs1/barcode.rb
134
135
  - lib/gs1/barcode/base.rb
135
136
  - lib/gs1/barcode/definitions.rb
137
+ - lib/gs1/barcode/error.rb
138
+ - lib/gs1/barcode/errors.rb
136
139
  - lib/gs1/barcode/healthcare.rb
137
140
  - lib/gs1/barcode/segment.rb
138
141
  - lib/gs1/barcode/tokenizer.rb
@@ -174,8 +177,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
174
177
  - !ruby/object:Gem::Version
175
178
  version: '0'
176
179
  requirements: []
177
- rubyforge_project:
178
- rubygems_version: 2.6.13
180
+ rubygems_version: 3.0.4
179
181
  signing_key:
180
182
  specification_version: 4
181
183
  summary: A ruby gem for implementing GS1 standards