jan 0.1.0 → 0.2.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 +5 -5
- data/.travis.yml +2 -3
- data/README.md +25 -39
- data/jan.gemspec +11 -14
- data/lib/jan.rb +5 -35
- data/lib/jan/check_digit.rb +14 -0
- data/lib/jan/code.rb +25 -0
- data/lib/jan/code_body.rb +30 -0
- data/lib/jan/random.rb +13 -16
- data/lib/jan/version.rb +2 -2
- data/spec/jan/code_body_spec.rb +20 -0
- data/spec/jan/code_spec.rb +48 -0
- data/spec/jan/random_spec.rb +13 -32
- data/spec/spec_helper.rb +1 -4
- metadata +22 -60
- data/Guardfile +0 -6
- data/lib/jan/check_digit_calculator.rb +0 -13
- data/lib/jan/parser.rb +0 -25
- data/lib/jan/validator.rb +0 -20
- data/spec/jan/check_digit_calculator_spec.rb +0 -15
- data/spec/jan/parser_spec.rb +0 -49
- data/spec/jan/validator_spec.rb +0 -76
- data/spec/jan_spec.rb +0 -63
- data/spec/support/invalid_codes.rb +0 -8
- data/spec/support/valid_codes.rb +0 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: b55db866341d1d1e57aea0a7de67a02f276be1390d825a5807038031a2c306e3
|
4
|
+
data.tar.gz: 545ee260f625ceda5ba1f9cb2c143affaab7ea7c87b81f7da040920085b41b8a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: af8c1e536e522fa7b59d01c5177dd80b725f4e12dd4a9aa033a794d8d65cdc19c6e1a96a4e1d6d2d1cc0c653a7597189e947e1f3554ceb273bed7b028bfac967
|
7
|
+
data.tar.gz: 3decd703b98afe0855a13e5911484ba5ddb2e8b28c3be13b2993236bf2a248d83bd82a734c133d3c4e6e0bea14ba57969e0f22c48ebf8df4b971cbef8a34c518
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -3,8 +3,13 @@
|
|
3
3
|
[](http://badge.fury.io/rb/jan)
|
4
4
|
[](https://travis-ci.org/s-osa/jan)
|
5
5
|
|
6
|
-
|
6
|
+
[jan](https://rubygems.org/gems/jan) is a small utility gem for JAN code.
|
7
7
|
|
8
|
+
## Supported versions
|
9
|
+
|
10
|
+
- Ruby
|
11
|
+
- 2.6.x
|
12
|
+
- 2.5.x
|
8
13
|
|
9
14
|
## Installation
|
10
15
|
|
@@ -26,63 +31,44 @@ Or install it yourself as:
|
|
26
31
|
$ gem install jan
|
27
32
|
```
|
28
33
|
|
29
|
-
|
30
34
|
## Usage
|
31
35
|
|
32
|
-
### Basic
|
33
|
-
|
34
|
-
```ruby
|
35
|
-
jan = Jan.new("4901277241126")
|
36
|
-
jan.valid? # => true
|
37
|
-
|
38
|
-
Jan::Validator.validate("4901277241126") # => true
|
39
|
-
```
|
40
|
-
|
41
|
-
### Calculate check digit
|
36
|
+
### Basic
|
42
37
|
|
43
38
|
```ruby
|
44
|
-
|
45
|
-
|
46
|
-
Jan::CheckDigitCalculator.calculate("490127724112") # => 6
|
47
|
-
```
|
39
|
+
code = Jan::Code.new('4901277241126')
|
48
40
|
|
41
|
+
code.valid? # => true
|
49
42
|
|
50
|
-
|
51
|
-
|
52
|
-
```ruby
|
53
|
-
jan = Jan.new("4901277241126")
|
54
|
-
jan.check_digit # => 6
|
55
|
-
jan.body # => "490127724112"
|
43
|
+
code.body # => '490127724112'
|
44
|
+
code.check_digit # => '6'
|
56
45
|
|
57
|
-
|
58
|
-
Jan::Parser.body("4901277241126") # => "490127724112"
|
46
|
+
code.instore_code? # => false
|
59
47
|
```
|
60
48
|
|
61
|
-
###
|
49
|
+
### Calculate check digit
|
62
50
|
|
63
51
|
```ruby
|
64
|
-
|
65
|
-
jan.instore_code? # => false
|
52
|
+
body = Jan::CodeBody.new('490127724112')
|
66
53
|
|
67
|
-
|
54
|
+
body.calculate_check_digit # => '6'
|
55
|
+
body.generage_code # => '4901277241126'
|
68
56
|
```
|
69
57
|
|
70
58
|
### Generate random code
|
71
59
|
|
72
60
|
```ruby
|
73
|
-
Jan::Random.
|
74
|
-
Jan::Random.code(8) # => "11774853"
|
75
|
-
|
76
|
-
Jan::Random.instore_code # => "2799375754394"
|
77
|
-
Jan::Random.instore_code(8) # => "27393086"
|
61
|
+
random = Jan::Random.new
|
78
62
|
|
63
|
+
random.code # => '5689450935688'
|
64
|
+
random.instore_code # => '2799375754394'
|
79
65
|
```
|
80
66
|
|
81
|
-
|
82
67
|
## Contributing
|
83
68
|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
69
|
+
Bug reports and pull requests are welcome.
|
70
|
+
|
71
|
+
- Install dependencies
|
72
|
+
- `bundle install`
|
73
|
+
- Run tests
|
74
|
+
- `rake spec`
|
data/jan.gemspec
CHANGED
@@ -1,26 +1,23 @@
|
|
1
|
-
# coding: utf-8
|
2
1
|
lib = File.expand_path('../lib', __FILE__)
|
3
2
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
3
|
require 'jan/version'
|
5
4
|
|
6
5
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name =
|
6
|
+
spec.name = 'jan'
|
8
7
|
spec.version = Jan::VERSION
|
9
|
-
spec.authors = [
|
10
|
-
spec.email = [
|
11
|
-
spec.summary = %q{JAN
|
12
|
-
spec.description = %q{JAN
|
13
|
-
spec.homepage =
|
14
|
-
spec.license =
|
8
|
+
spec.authors = ['OSA Shunsuke']
|
9
|
+
spec.email = ['hhelibebcnofnenamg@gmail.com']
|
10
|
+
spec.summary = %q{Simple gem for JAN code}
|
11
|
+
spec.description = %q{Validate and generate JAN code}
|
12
|
+
spec.homepage = 'https://github.com/s-osa/jan'
|
13
|
+
spec.license = 'MIT'
|
15
14
|
|
16
15
|
spec.files = `git ls-files -z`.split("\x0")
|
17
16
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
17
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
-
spec.require_paths = [
|
18
|
+
spec.require_paths = ['lib']
|
20
19
|
|
21
|
-
spec.add_development_dependency
|
22
|
-
spec.add_development_dependency
|
23
|
-
spec.add_development_dependency
|
24
|
-
spec.add_development_dependency "guard"
|
25
|
-
spec.add_development_dependency "guard-rspec"
|
20
|
+
spec.add_development_dependency 'bundler', '~> 2.0'
|
21
|
+
spec.add_development_dependency 'rake', '~> 12.3'
|
22
|
+
spec.add_development_dependency 'rspec', '~> 3.8'
|
26
23
|
end
|
data/lib/jan.rb
CHANGED
@@ -1,37 +1,7 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require "jan/validator"
|
5
|
-
require "jan/version"
|
1
|
+
require 'jan/code'
|
2
|
+
require 'jan/random'
|
3
|
+
require 'jan/version'
|
6
4
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
def initialize(code)
|
11
|
-
super(code.to_s)
|
12
|
-
end
|
13
|
-
|
14
|
-
def valid?
|
15
|
-
Validator.validate(self)
|
16
|
-
end
|
17
|
-
|
18
|
-
def check_digit
|
19
|
-
Parser.check_digit(self)
|
20
|
-
end
|
21
|
-
|
22
|
-
def body
|
23
|
-
Parser.body(self)
|
24
|
-
end
|
25
|
-
|
26
|
-
def even_digits
|
27
|
-
Parser.even_digits(self)
|
28
|
-
end
|
29
|
-
|
30
|
-
def odd_digits
|
31
|
-
Parser.odd_digits(self)
|
32
|
-
end
|
33
|
-
|
34
|
-
def instore_code?
|
35
|
-
Parser.instore_code?(self)
|
36
|
-
end
|
5
|
+
module Jan
|
6
|
+
class FormatError < StandardError ; end
|
37
7
|
end
|
data/lib/jan/code.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'jan/code_body'
|
2
|
+
require 'jan/check_digit'
|
3
|
+
|
4
|
+
module Jan
|
5
|
+
class Code < String
|
6
|
+
# @param code [String]
|
7
|
+
def initialize(code)
|
8
|
+
@body = Jan::CodeBody.new(code[0..-2])
|
9
|
+
@check_digit = Jan::CheckDigit.new(code[-1])
|
10
|
+
super(code)
|
11
|
+
end
|
12
|
+
|
13
|
+
attr_reader :body, :check_digit
|
14
|
+
|
15
|
+
# @return [boolean]
|
16
|
+
def valid?
|
17
|
+
@body.valid? && @check_digit.valid? && @body.calculate_check_digit == @check_digit
|
18
|
+
end
|
19
|
+
|
20
|
+
# @return [boolean]
|
21
|
+
def instore_code?
|
22
|
+
@body.start_with?('2')
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'jan/code'
|
2
|
+
|
3
|
+
module Jan
|
4
|
+
class CodeBody < String
|
5
|
+
# @param code_body [String]
|
6
|
+
def initialize(code_body)
|
7
|
+
@code_body = code_body
|
8
|
+
super(code_body)
|
9
|
+
end
|
10
|
+
|
11
|
+
# @return [boolean]
|
12
|
+
def valid?
|
13
|
+
@code_body.match?(/\A\d{12}\z/)
|
14
|
+
end
|
15
|
+
|
16
|
+
# @return [Jan::CheckDigit]
|
17
|
+
def calculate_check_digit
|
18
|
+
# http://www.dsri.jp/jan/check_digit.html
|
19
|
+
even_position_digits, odd_position_digits = @code_body.reverse.each_char.partition.with_index(2) {|_chr, idx| idx.even? }
|
20
|
+
sum = even_position_digits.map{|d| Integer(d) }.sum * 3 + odd_position_digits.map{|d| Integer(d) }.sum
|
21
|
+
digit = (10 - sum % 10).to_s[-1]
|
22
|
+
Jan::CheckDigit.new(digit)
|
23
|
+
end
|
24
|
+
|
25
|
+
# @return [Jan::Code]
|
26
|
+
def generate_code
|
27
|
+
Jan::Code.new(@code_body + calculate_check_digit)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
data/lib/jan/random.rb
CHANGED
@@ -1,23 +1,20 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
module_function
|
7
|
-
|
8
|
-
Digits = %w(1 2 3 4 5 6 7 8 9 0)
|
9
|
-
|
10
|
-
def code(size=13)
|
11
|
-
build(size)
|
1
|
+
module Jan
|
2
|
+
class Random
|
3
|
+
# @param generator [Random] Random-like object which respond to #rand(max)
|
4
|
+
def initialize(generator: ::Random.new)
|
5
|
+
@generator = generator
|
12
6
|
end
|
13
7
|
|
14
|
-
|
15
|
-
|
8
|
+
# @return [Jan::Code]
|
9
|
+
def code
|
10
|
+
twelve_digits_str = sprintf('%012d', @generator.rand(1_000_000_000_000))
|
11
|
+
Jan::CodeBody.new(twelve_digits_str).generate_code
|
16
12
|
end
|
17
13
|
|
18
|
-
|
19
|
-
|
20
|
-
|
14
|
+
# @return [Jan::Code]
|
15
|
+
def instore_code
|
16
|
+
twelve_digits_str = '2' + sprintf('%011d', @generator.rand(100_000_000_000))
|
17
|
+
Jan::CodeBody.new(twelve_digits_str).generate_code
|
21
18
|
end
|
22
19
|
end
|
23
20
|
end
|
data/lib/jan/version.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
|
-
|
2
|
-
VERSION =
|
1
|
+
module Jan
|
2
|
+
VERSION = '0.2.0'
|
3
3
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Jan::CodeBody do
|
4
|
+
describe '#calculate_check_digit' do
|
5
|
+
it('generates and returns check digit') do
|
6
|
+
res = described_class.new('490127724112').calculate_check_digit
|
7
|
+
expect(res.class).to eq(Jan::CheckDigit)
|
8
|
+
expect(res).to eq('6')
|
9
|
+
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe '#generate_code' do
|
14
|
+
it('generates and returns check digit') do
|
15
|
+
res = described_class.new('490127724112').generate_code
|
16
|
+
expect(res.class).to eq(Jan::Code)
|
17
|
+
expect(res).to eq('4901277241126')
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Jan::Code do
|
4
|
+
describe '#valid?' do
|
5
|
+
context 'valid codes' do
|
6
|
+
valid_codes = %w[
|
7
|
+
0000000000000
|
8
|
+
4901277241126
|
9
|
+
2000000000015
|
10
|
+
]
|
11
|
+
|
12
|
+
valid_codes.each do |valid_code|
|
13
|
+
it("#{valid_code} is valid"){ expect(described_class.new(valid_code)).to be_valid }
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
context 'invalid codes' do
|
18
|
+
invalid_codes = [
|
19
|
+
'11',
|
20
|
+
'123abc',
|
21
|
+
'4901277 241126',
|
22
|
+
'4901277 24112',
|
23
|
+
]
|
24
|
+
|
25
|
+
invalid_codes.each do |invalid_code|
|
26
|
+
it("#{invalid_code} is invalid"){ expect(described_class.new(invalid_code)).not_to be_valid }
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe '#body' do
|
32
|
+
it('returns body digits'){ expect(described_class.new('4901277241126').body).to eq('490127724112') }
|
33
|
+
end
|
34
|
+
|
35
|
+
describe '#check_digit' do
|
36
|
+
it('returns check digit'){ expect(described_class.new('4901277241126').check_digit).to eq('6') }
|
37
|
+
end
|
38
|
+
|
39
|
+
describe '#instore_code?' do
|
40
|
+
context 'instore code' do
|
41
|
+
it('is true'){ expect(described_class.new('2101085089347')).to be_instore_code }
|
42
|
+
end
|
43
|
+
|
44
|
+
context 'global code' do
|
45
|
+
it('is false'){ expect(described_class.new('4901277241126')).not_to be_instore_code }
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
data/spec/jan/random_spec.rb
CHANGED
@@ -1,41 +1,22 @@
|
|
1
|
-
require
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Jan::Random do
|
4
|
-
|
5
|
-
(6..20).each do |size|
|
6
|
-
it "should return code with valid check digit" do
|
7
|
-
code = Jan::Random.code(size)
|
8
|
-
check_digit = Jan::Parser.check_digit(code)
|
9
|
-
actual = Jan::CheckDigitCalculator.calculate(Jan::Parser.body(code))
|
10
|
-
expect(actual).to eq(check_digit)
|
11
|
-
end
|
4
|
+
let(:random) { described_class.new }
|
12
5
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
6
|
+
describe '#code' do
|
7
|
+
it 'returns code' do
|
8
|
+
code = random.code
|
9
|
+
expect(code).to be_an_instance_of(Jan::Code)
|
10
|
+
expect(code).to be_valid
|
17
11
|
end
|
18
12
|
end
|
19
13
|
|
20
|
-
describe
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
expect(actual).to eq(check_digit)
|
27
|
-
end
|
28
|
-
|
29
|
-
it "should return instore code" do
|
30
|
-
code = Jan::Random.instore_code(size)
|
31
|
-
actual = Jan::Parser.instore_code?(code)
|
32
|
-
expect(actual).to be true
|
33
|
-
end
|
34
|
-
|
35
|
-
it "should return given length valid code" do
|
36
|
-
code = Jan::Random.instore_code(size)
|
37
|
-
expect(code.size).to eq(size)
|
38
|
-
end
|
14
|
+
describe '#instore_code' do
|
15
|
+
it 'returns in-store code' do
|
16
|
+
code = random.instore_code
|
17
|
+
expect(code).to be_an_instance_of(Jan::Code)
|
18
|
+
expect(code).to be_valid
|
19
|
+
expect(code).to be_instore_code
|
39
20
|
end
|
40
21
|
end
|
41
22
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jan
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- OSA Shunsuke
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-03-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -16,71 +16,43 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '2.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: '
|
26
|
+
version: '2.0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '12.3'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '12.3'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rspec
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - "
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '0'
|
48
|
-
type: :development
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - ">="
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '0'
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: guard
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - ">="
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '0'
|
62
|
-
type: :development
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - ">="
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '0'
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: guard-rspec
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - ">="
|
45
|
+
- - "~>"
|
74
46
|
- !ruby/object:Gem::Version
|
75
|
-
version: '
|
47
|
+
version: '3.8'
|
76
48
|
type: :development
|
77
49
|
prerelease: false
|
78
50
|
version_requirements: !ruby/object:Gem::Requirement
|
79
51
|
requirements:
|
80
|
-
- - "
|
52
|
+
- - "~>"
|
81
53
|
- !ruby/object:Gem::Version
|
82
|
-
version: '
|
83
|
-
description: JAN
|
54
|
+
version: '3.8'
|
55
|
+
description: Validate and generate JAN code
|
84
56
|
email:
|
85
57
|
- hhelibebcnofnenamg@gmail.com
|
86
58
|
executables: []
|
@@ -90,25 +62,20 @@ files:
|
|
90
62
|
- ".gitignore"
|
91
63
|
- ".travis.yml"
|
92
64
|
- Gemfile
|
93
|
-
- Guardfile
|
94
65
|
- LICENSE
|
95
66
|
- README.md
|
96
67
|
- Rakefile
|
97
68
|
- jan.gemspec
|
98
69
|
- lib/jan.rb
|
99
|
-
- lib/jan/
|
100
|
-
- lib/jan/
|
70
|
+
- lib/jan/check_digit.rb
|
71
|
+
- lib/jan/code.rb
|
72
|
+
- lib/jan/code_body.rb
|
101
73
|
- lib/jan/random.rb
|
102
|
-
- lib/jan/validator.rb
|
103
74
|
- lib/jan/version.rb
|
104
|
-
- spec/jan/
|
105
|
-
- spec/jan/
|
75
|
+
- spec/jan/code_body_spec.rb
|
76
|
+
- spec/jan/code_spec.rb
|
106
77
|
- spec/jan/random_spec.rb
|
107
|
-
- spec/jan/validator_spec.rb
|
108
|
-
- spec/jan_spec.rb
|
109
78
|
- spec/spec_helper.rb
|
110
|
-
- spec/support/invalid_codes.rb
|
111
|
-
- spec/support/valid_codes.rb
|
112
79
|
homepage: https://github.com/s-osa/jan
|
113
80
|
licenses:
|
114
81
|
- MIT
|
@@ -128,17 +95,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
128
95
|
- !ruby/object:Gem::Version
|
129
96
|
version: '0'
|
130
97
|
requirements: []
|
131
|
-
|
132
|
-
rubygems_version: 2.2.2
|
98
|
+
rubygems_version: 3.0.1
|
133
99
|
signing_key:
|
134
100
|
specification_version: 4
|
135
|
-
summary: JAN
|
101
|
+
summary: Simple gem for JAN code
|
136
102
|
test_files:
|
137
|
-
- spec/jan/
|
138
|
-
- spec/jan/
|
103
|
+
- spec/jan/code_body_spec.rb
|
104
|
+
- spec/jan/code_spec.rb
|
139
105
|
- spec/jan/random_spec.rb
|
140
|
-
- spec/jan/validator_spec.rb
|
141
|
-
- spec/jan_spec.rb
|
142
106
|
- spec/spec_helper.rb
|
143
|
-
- spec/support/invalid_codes.rb
|
144
|
-
- spec/support/valid_codes.rb
|
data/Guardfile
DELETED
@@ -1,13 +0,0 @@
|
|
1
|
-
require "jan/parser"
|
2
|
-
|
3
|
-
class Jan < ::String
|
4
|
-
module CheckDigitCalculator
|
5
|
-
module_function
|
6
|
-
|
7
|
-
def calculate(body)
|
8
|
-
code = body.to_s + "x"
|
9
|
-
digit = 10 - (Parser.even_digits(code).reduce(&:+) * 3 + Parser.odd_digits(code).reduce(&:+)) % 10
|
10
|
-
digit % 10
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
data/lib/jan/parser.rb
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
class Jan < ::String
|
2
|
-
module Parser
|
3
|
-
module_function
|
4
|
-
|
5
|
-
def check_digit(code)
|
6
|
-
code[-1].to_i
|
7
|
-
end
|
8
|
-
|
9
|
-
def body(code)
|
10
|
-
code[0..-2]
|
11
|
-
end
|
12
|
-
|
13
|
-
def even_digits(code)
|
14
|
-
code.split('').reverse.map(&:to_i).select.with_index(1){|_d, index| index.even? }.reverse
|
15
|
-
end
|
16
|
-
|
17
|
-
def odd_digits(code)
|
18
|
-
code.split('').reverse.map(&:to_i).select.with_index(1){|_d, index| index.odd? }.reverse[0..-2]
|
19
|
-
end
|
20
|
-
|
21
|
-
def instore_code?(code)
|
22
|
-
InstoreCodePrefixes.include?(code[0..1])
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
data/lib/jan/validator.rb
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
require "jan/parser"
|
2
|
-
require "jan/check_digit_calculator"
|
3
|
-
|
4
|
-
class Jan < ::String
|
5
|
-
module Validator
|
6
|
-
module_function
|
7
|
-
|
8
|
-
def validate(code)
|
9
|
-
validate_size(code.to_s) && validate_check_digit(code.to_s)
|
10
|
-
end
|
11
|
-
|
12
|
-
def validate_size(code)
|
13
|
-
[8,13].include?(code.to_s.size)
|
14
|
-
end
|
15
|
-
|
16
|
-
def validate_check_digit(code)
|
17
|
-
Parser.check_digit(code.to_s) == CheckDigitCalculator.calculate(Parser.body(code.to_s))
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
describe Jan::CheckDigitCalculator do
|
4
|
-
describe ".calculate" do
|
5
|
-
it "should return check digit" do
|
6
|
-
actual = Jan::CheckDigitCalculator.calculate("490127724112")
|
7
|
-
expect(actual).to eq(6)
|
8
|
-
end
|
9
|
-
|
10
|
-
it "should return 0 as check digit" do
|
11
|
-
actual = Jan::CheckDigitCalculator.calculate("490330111020")
|
12
|
-
expect(actual).to eq(0)
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
data/spec/jan/parser_spec.rb
DELETED
@@ -1,49 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
describe Jan::Parser do
|
4
|
-
let(:code){ "1234567890123" }
|
5
|
-
|
6
|
-
describe ".check_digit(code)" do
|
7
|
-
it "should return last digit" do
|
8
|
-
actual = Jan::Parser.check_digit(code)
|
9
|
-
expect(actual).to eq(3)
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
describe ".body(code)" do
|
14
|
-
it "should return string except last digit" do
|
15
|
-
actual = Jan::Parser.body(code)
|
16
|
-
expect(actual).to eq("123456789012")
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
describe ".even_digits(code)" do
|
21
|
-
it "should return digits in even number-th position" do
|
22
|
-
actual = Jan::Parser.even_digits(code)
|
23
|
-
expect(actual).to eq([2,4,6,8,0,2])
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
describe ".odd_digits(code)" do
|
28
|
-
it "should return digits in odd number-th position except check_digit" do
|
29
|
-
actual = Jan::Parser.odd_digits(code)
|
30
|
-
expect(actual).to eq([1,3,5,7,9,1])
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
describe ".instore_code?(code)" do
|
35
|
-
context "instore code" do
|
36
|
-
it "should be true" do
|
37
|
-
actual = Jan::Parser.instore_code?("2101085089347")
|
38
|
-
expect(actual).to be true
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
context "global code" do
|
43
|
-
it "should be false" do
|
44
|
-
actual = Jan::Parser.instore_code?("4901085089347")
|
45
|
-
expect(actual).to be false
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
data/spec/jan/validator_spec.rb
DELETED
@@ -1,76 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
describe Jan::Validator do
|
4
|
-
describe ".validate" do
|
5
|
-
context "valid codes" do
|
6
|
-
valid_codes.each do |code|
|
7
|
-
it "#{code} should be valid" do
|
8
|
-
actual = Jan::Validator.validate(code)
|
9
|
-
expect(actual).to be true
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
context "invalid codes" do
|
15
|
-
invalid_codes.each do |code|
|
16
|
-
it "#{code} should be invalid" do
|
17
|
-
actual = Jan::Validator.validate(code)
|
18
|
-
expect(actual).to be false
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
describe ".validate_size" do
|
25
|
-
context "valid codes" do
|
26
|
-
valid_size_codes = [8, 13].map{|n| "x" * n }
|
27
|
-
|
28
|
-
valid_size_codes.each do |code|
|
29
|
-
it "#{code} should be valid" do
|
30
|
-
actual = Jan::Validator.validate_size(code)
|
31
|
-
expect(actual).to be true
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
context "invalid codes" do
|
37
|
-
invalid_size_codes = [1,2,3,4,5,6,7,9,10,11,12,14,15].map{|n| "x" * n }
|
38
|
-
|
39
|
-
invalid_size_codes.each do |code|
|
40
|
-
it "#{code} should be invalid" do
|
41
|
-
actual = Jan::Validator.validate_size(code)
|
42
|
-
expect(actual).to be false
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
describe ".validate_check_digit" do
|
49
|
-
context "valid codes" do
|
50
|
-
valid_check_digit_codes = (3..15).to_a.map{|n| Jan::Random.code(n) }
|
51
|
-
|
52
|
-
valid_check_digit_codes.each do |code|
|
53
|
-
it "#{code} should be valid" do
|
54
|
-
actual = Jan::Validator.validate_check_digit(code)
|
55
|
-
expect(actual).to be true
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
context "invalid codes" do
|
61
|
-
invalid_check_digit_codes = []
|
62
|
-
(3..15).each do |n|
|
63
|
-
code = Jan::Random.code(n)
|
64
|
-
code[-1] = ((Jan::Parser.check_digit(code) + 1 ) % 10).to_s
|
65
|
-
invalid_check_digit_codes << code
|
66
|
-
end
|
67
|
-
|
68
|
-
invalid_check_digit_codes.each do |code|
|
69
|
-
it "#{code} should be invalid" do
|
70
|
-
actual = Jan::Validator.validate_check_digit(code)
|
71
|
-
expect(actual).to be false
|
72
|
-
end
|
73
|
-
end
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|
data/spec/jan_spec.rb
DELETED
@@ -1,63 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
describe Jan do
|
4
|
-
describe "#initialize" do
|
5
|
-
let(:jan_code){ "4901085089347" }
|
6
|
-
subject{ described_class.new(jan_code) }
|
7
|
-
it{ is_expected.to be_an_instance_of(described_class) }
|
8
|
-
it{ is_expected.to be_a(String) }
|
9
|
-
it("should equals to given string"){ is_expected.to eq(jan_code) }
|
10
|
-
end
|
11
|
-
|
12
|
-
describe "#valid?" do
|
13
|
-
context "valid codes" do
|
14
|
-
valid_codes.each do |valid_code|
|
15
|
-
subject{ described_class.new(valid_code) }
|
16
|
-
it("#{valid_code} should be valid"){ is_expected.to be_valid }
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
context "invalid codes" do
|
21
|
-
invalid_codes.each do |invalid_code|
|
22
|
-
subject{ described_class.new(invalid_code) }
|
23
|
-
it("#{invalid_code} should be invalid"){ is_expected.not_to be_valid }
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
describe "#check_digit" do
|
29
|
-
let(:jan){ described_class.new("4901277241126") }
|
30
|
-
subject{ jan.check_digit }
|
31
|
-
it("should return last digit"){ is_expected.to eq(6) }
|
32
|
-
end
|
33
|
-
|
34
|
-
describe "#body" do
|
35
|
-
let(:jan){ described_class.new("4901277241126") }
|
36
|
-
subject{ jan.body }
|
37
|
-
it("should return digits without check digit"){ is_expected.to eq("490127724112") }
|
38
|
-
end
|
39
|
-
|
40
|
-
describe "#even_digits" do
|
41
|
-
let(:jan){ described_class.new("4901277241126") }
|
42
|
-
subject{ jan.even_digits }
|
43
|
-
it("should return digits in even number-th position"){ is_expected.to eq([9,1,7,2,1,2]) }
|
44
|
-
end
|
45
|
-
|
46
|
-
describe "#odd_digits" do
|
47
|
-
let(:jan){ described_class.new("4901277241126") }
|
48
|
-
subject{ jan.odd_digits }
|
49
|
-
it("should return digits in odd number-th position except check digit"){ is_expected.to eq([4,0,2,7,4,1]) }
|
50
|
-
end
|
51
|
-
|
52
|
-
describe "#instore_code?" do
|
53
|
-
context "instore code" do
|
54
|
-
subject{ described_class.new("2101085089347") }
|
55
|
-
it("should be true"){ is_expected.to be_instore_code }
|
56
|
-
end
|
57
|
-
|
58
|
-
context "global code" do
|
59
|
-
subject{ described_class.new("4901085089347") }
|
60
|
-
it("should be false"){ is_expected.not_to be_instore_code }
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|