gs1 0.1.8 → 1.0.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
- 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