File: barcode.rb

package info (click to toggle)
ruby-faker 2.21.0-1.1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 10,076 kB
  • sloc: ruby: 19,088; makefile: 6
file content (165 lines) | stat: -rw-r--r-- 4,536 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
# frozen_string_literal: true

module Faker
  class Barcode < Base
    class << self
      ##
      # Returns a EAN 8 or 13 digit format barcode number with check digit
      #  @return [String]
      #
      #  @example
      #     Faker::Barcode.ean      => "85657526"
      #     Faker::Barcode.ean(8)   => "30152700"
      #     Faker::Barcode.ean(13)  => "2115190480285"
      #
      # @faker.version 2.14.0
      def ean(length = 8)
        generate_barcode("barcode.ean_#{Integer(length)}")
      end

      ##
      # Returns a EAN 8 or 13 digit format barcode number with composite string attached with check digit
      #  @return [String]
      #
      #  @example
      #     Faker::Barcode.ean_with_composite_sumbology      => "41007624|JHOC6649"
      #     Faker::Barcode.ean_with_composite_sumbology(8)   => "38357961|XUYJ3266"
      #     Faker::Barcode.ean_with_composite_sumbology(13)  => "9530722443911|CKHWQHID"
      #
      # @faker.version 2.14.0
      def ean_with_composite_symbology(length = 8)
        "#{ean(length)}|#{bothify(parse('barcode.composite_symbol'))}"
      end

      ##
      # Returns a UPC_A format barcode number with check digit
      #  @return [String]
      #
      #  @example
      #     Faker::Barcode.upc_a      => "766807541831"
      #
      # @faker.version 2.14.0
      def upc_a
        generate_barcode('barcode.upc_a')
      end

      ##
      # Returns a UPC_E format barcode number with check digit
      #  @return [String]
      #
      #  @example
      #     Faker::Barcode.upc_e      => "03746820"
      #
      # @faker.version 2.14.0
      def upc_e
        generate_barcode('barcode.upc_e')
      end

      ##
      # Returns a UPC_A format barcode number with composite string attached with check digit
      #  @return [String]
      #
      #  @example
      #     Faker::Barcode.upc_a_with_composite_symbology      => "790670155765|JOVG6208"
      #
      # @faker.version 2.14.0
      def upc_a_with_composite_symbology
        "#{upc_a}|#{bothify(parse('barcode.composite_symbol'))}"
      end

      ##
      # Returns a UPC_E format barcode number with composite string attached with check digit
      #  @return [String]
      #
      #  @example
      #     Faker::Barcode.upc_e_with_composite_symbology      => "05149247|BKZX9722"
      #
      # @faker.version 2.14.0
      def upc_e_with_composite_symbology
        "#{upc_e}|#{bothify(parse('barcode.composite_symbol'))}"
      end

      ##
      # Returns a ISBN format barcode number with check digit
      #  @return [String]
      #
      #  @example
      #     Faker::Barcode.isbn      => "9798363807732"
      #
      # @faker.version 2.14.0
      def isbn
        generate_barcode('barcode.isbn')
      end

      ##
      # Returns a ISMN format barcode number with check digit
      #  @return [String]
      #
      #  @example
      #     Faker::Barcode.ismn      => "9790527672897"
      #
      # @faker.version 2.14.0
      def ismn
        generate_barcode('barcode.ismn')
      end

      ##
      # Returns a ISSN format barcode number with check digit
      #  @return [String]
      #
      #  @example
      #     Faker::Barcode.issn      => "9775541703338"
      #
      # @faker.version 2.14.0
      def issn
        generate_barcode('barcode.issn')
      end

      private

      def generate_barcode(key)
        barcode = parse(key)
        check_digit = generate_check_digit(*sum_even_odd(barcode))
        "#{barcode}#{check_digit}"
      end

      ##
      # Returns the sum of even and odd numbers from value passed
      #
      # @return [Array]
      #
      # @example
      #   Faker::Barcode.send(:sum_even_odd, 12345)   => [9, 5]
      #   Faker::Barcode.send(:sum_even_odd, 87465)   => [17, 13]
      #
      # @faker.version 2.14.0
      def sum_even_odd(fake_num)
        number = fake_num.to_i
        sum_even, sum_odd = 0, 0, index = 1

        while number != 0
          index.even? ? sum_even += number % 10 : sum_odd += number % 10

          number /= 10
          index += 1
        end

        [sum_odd, sum_even]
      end

      ##
      # Generates the check digits from sum passed
      #
      # @return [Integer]
      #
      # @example
      #   Faker::Barcode.send(:generate_check_digit, 12, 4)   => 0
      #   Faker::Barcode.send(:generate_check_digit, 23, 5)   => 6
      #
      # @faker.version 2.14.0
      def generate_check_digit(odd_sum, even_sum)
        (10 - (odd_sum * 3 + even_sum) % 10) % 10
      end
    end
  end
end