container_number_validator 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 09d51e852c15fc8b6107f0c5f39bff77f983777f
4
+ data.tar.gz: 4c910afd9c3e6b1c712fab7cb94bce20c0b0ca94
5
+ SHA512:
6
+ metadata.gz: 4f7dbd3f2dda073ef24b6f63691d9ec37fbfacb324b94212ad20d8d5e27555e09ca39b333355bc36190826634e25b0b8379e37df1cad6762189a48994045604f
7
+ data.tar.gz: 3ad5790ac27db6afc84bff75c66bf68c7c6c951ce089f4b09c93e6003436e3f2ec0689e551365b4d32dba164676c6c08a3c8af31f2b083165894af0049778401
data/.gitignore ADDED
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ .idea
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format progress
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ ruby-2.0.0-p247
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in container_number_validator.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Niels Stevens
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,70 @@
1
+ # Container Number Validator
2
+
3
+ This gem allows you to easily validate container number fields to be valid
4
+ container numbers.
5
+
6
+ It validates Container Number according to [ISO_6346](http://en.wikipedia.org/wiki/ISO_6346)
7
+
8
+ NYKU5824120
9
+
10
+ Also supports format where checkdigit is seperated with a dash like this
11
+
12
+ NYKU582412-0
13
+
14
+ ## Installation
15
+
16
+ Add this line to your application's Gemfile:
17
+
18
+ gem 'container_number_validator'
19
+
20
+ And then execute:
21
+
22
+ $ bundle
23
+
24
+ Or install it yourself as:
25
+
26
+ $ gem install container_number_validator
27
+
28
+ ## Usage
29
+
30
+ ContainerNumberValidator.validate('NYKU582412-0')
31
+ #=> true
32
+
33
+ ContainerNumberValidator.validate('NYKU582412-3')
34
+ #=> false
35
+
36
+ ### Rails 3.x / 4.x
37
+
38
+ You can use ContainerNumberValidator with any ActiveModel class, including
39
+ ActiveRecord models:
40
+
41
+ class Container < ActiveRecord::Base
42
+ validates :container_no, container_number: true
43
+ end
44
+
45
+ ### Edge cases
46
+
47
+ * When no container number is present (or set to `nil`), all container numbers are considered **INVALID**.
48
+
49
+ ## Contributing
50
+
51
+ ### Wishlist
52
+
53
+ Nothing specific in mind yet ;-)
54
+
55
+ If you're unsure what to contribute, contact me. :-)
56
+
57
+ ### How to contribute
58
+
59
+ I prefer a pull request with added, but failing, specs to code without
60
+ specs.
61
+
62
+ 1. Fork it
63
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
64
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
65
+ 4. Push to the branch (`git push origin my-new-feature`)
66
+ 5. Create new Pull Request
67
+
68
+ ## License
69
+
70
+ See [LICENSE.txt](https://github.com/kabisaict/container_number_validator/blob/master/LICENSE.txt)
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,25 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'container_number_validator/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'container_number_validator'
8
+ spec.version = ContainerNumberValidator::VERSION
9
+ spec.authors = ['Niels Stevens', 'Michel De Graaf']
10
+ spec.email = ['niels@kabisa.nl', 'michel@kabisa.nl']
11
+ spec.description = %q{This gems validates Sea Container Numbers. It adds a Rails validator for this to your project.}
12
+ spec.summary = %q{Validate Sea Container numbers}
13
+ spec.homepage = 'https://github.com/kabisaict/container_number_validator'
14
+ spec.license = 'MIT'
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ['lib']
20
+
21
+ spec.add_development_dependency 'bundler', '~> 1.3'
22
+ spec.add_development_dependency 'rspec', '~> 2.14.0'
23
+ spec.add_development_dependency 'rake'
24
+ spec.add_development_dependency 'activemodel', '~> 4.0.0'
25
+ end
@@ -0,0 +1,14 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <module type="RUBY_MODULE" version="4">
3
+ <component name="NewModuleRootManager" inherit-compiler-output="true">
4
+ <exclude-output />
5
+ <content url="file://$MODULE_DIR$">
6
+ <sourceFolder url="file://$MODULE_DIR$" isTestSource="false" />
7
+ </content>
8
+ <orderEntry type="inheritedJdk" />
9
+ <orderEntry type="sourceFolder" forTests="false" />
10
+ <orderEntry type="library" scope="PROVIDED" name="bundler (v1.3.5, RVM: ruby-2.0.0-p247 [global]) [gem]" level="application" />
11
+ <orderEntry type="library" scope="PROVIDED" name="rake (v10.1.0, RVM: ruby-2.0.0-p247 [global]) [gem]" level="application" />
12
+ </component>
13
+ </module>
14
+
@@ -0,0 +1,11 @@
1
+ require 'active_model'
2
+
3
+ module ActiveModel
4
+ module Validations
5
+ class ContainerNumberValidator < ::ActiveModel::EachValidator
6
+ def validate_each(record, attribute, value)
7
+ record.errors.add(attribute, :invalid_container_number, message: 'is invalid') unless ::ContainerNumberValidator.validate(value)
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,3 @@
1
+ module ContainerNumberValidator
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,64 @@
1
+ module ContainerNumberValidator
2
+
3
+ LETTERS = {
4
+ 'A' => 10,
5
+ 'B' => 12,
6
+ 'C' => 13,
7
+ 'D' => 14,
8
+ 'E' => 15,
9
+ 'F' => 16,
10
+ 'G' => 17,
11
+ 'H' => 18,
12
+ 'I' => 19,
13
+ 'J' => 20,
14
+ 'K' => 21,
15
+ 'L' => 23,
16
+ 'M' => 24,
17
+ 'N' => 25,
18
+ 'O' => 26,
19
+ 'P' => 27,
20
+ 'Q' => 28,
21
+ 'R' => 29,
22
+ 'S' => 30,
23
+ 'T' => 31,
24
+ 'U' => 32,
25
+ 'V' => 34,
26
+ 'W' => 35,
27
+ 'X' => 36,
28
+ 'Y' => 37,
29
+ 'Z' => 38
30
+ }.freeze
31
+
32
+ WEIGHTS = %w{1 2 4 8 16 32 64 128 256 512}.freeze
33
+
34
+ def validate(container_no)
35
+ return false unless container_no.to_s =~ /^[a-zA-Z]{4}\d{6}\-?\d$/
36
+
37
+ checksum = container_no[-1, 1].to_i
38
+ number = container_no[0..-1]
39
+
40
+ calculate_checksum(number) == checksum
41
+ end
42
+ module_function :validate
43
+
44
+ private
45
+
46
+ def calculate_checksum(container_no)
47
+ chars = container_no.chars
48
+ digits, weights = [], []
49
+
50
+ chars[0..3].each { |char| digits << LETTERS[char.upcase] }
51
+ chars[4..10].each { |char| digits << char }
52
+
53
+ digits.each_with_index do |digit, i|
54
+ weights[i] = digit.to_i * WEIGHTS[i].to_i
55
+ end
56
+
57
+ weights.reduce(:+) % 11
58
+ end
59
+ module_function :calculate_checksum
60
+
61
+ end
62
+
63
+ require 'container_number_validator/version'
64
+ require 'container_number_validator/adapters/active_model' if defined?(ActiveModel)
@@ -0,0 +1,18 @@
1
+ require 'spec_helper'
2
+
3
+ if defined?(ActiveModel)
4
+
5
+ class Container < ModelBase
6
+ validates :container_no, container_number: true
7
+ end
8
+
9
+ describe Container do
10
+ it 'accepts only valid container numbers' do
11
+ obj = Container.new(container_no: 'TCLU812975-4')
12
+ expect(obj).to be_valid
13
+
14
+ obj = Container.new(container_no: 'TCLU812975-7')
15
+ expect(obj).not_to be_valid
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,46 @@
1
+ require 'spec_helper'
2
+
3
+ describe ContainerNumberValidator do
4
+
5
+ context 'fails on nil and empty values' do
6
+ it 'with nil' do
7
+ expect(subject.validate(nil)).to be_false
8
+ end
9
+
10
+ it 'with empty string' do
11
+ expect(subject.validate('')).to be_false
12
+ end
13
+ end
14
+
15
+ context 'fails on invalid owner code and category indentifier' do
16
+ %w{1CLU812975-4 TCLU81A975-4 TCLU81-975-4 T3LU812975-4}.each do |value|
17
+ it "with #{value}" do
18
+ expect(subject.validate(value)).to be_false
19
+ end
20
+ end
21
+ end
22
+
23
+ context 'fails on invalid checksum' do
24
+ %w{TCLU812975-1 MOFU587008-2 DRYU413526-6 NYKU561651-8}.each do |value|
25
+ it "with #{value}" do
26
+ expect(subject.validate(value)).to be_false
27
+ end
28
+ end
29
+ end
30
+
31
+ context 'passes on valid owner code and category identifier' do
32
+ %w{MOFU587008-7 DRYU413526-5 NYKU644101-8 KKFU137865-2 NYKU561651-2 KKFU760143-9 TCLU250850-8}.each do |value|
33
+ it "with #{value}" do
34
+ expect(subject.validate(value)).to be_true
35
+ end
36
+ end
37
+ end
38
+
39
+ context 'passes on mixed case valid owner code and category identifier' do
40
+ %w{TCLU812975-4 TCLU8129754 tclu8129754 tclu812975-4}.each do |value|
41
+ it "with #{value}" do
42
+ expect(subject.validate(value)).to be_true
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,39 @@
1
+ require 'rspec'
2
+
3
+ begin
4
+ require 'active_model'
5
+ rescue LoadError => err
6
+ puts 'Running specs without active_model extension'
7
+ end
8
+
9
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
10
+ require 'container_number_validator'
11
+
12
+ RSpec.configure do |config|
13
+ config.treat_symbols_as_metadata_keys_with_true_values = true
14
+ config.run_all_when_everything_filtered = true
15
+ config.filter_run :focus
16
+ config.order = 'random'
17
+ end
18
+
19
+ if defined?(ActiveModel)
20
+ class ModelBase
21
+ include ActiveModel::Serialization
22
+ include ActiveModel::Validations
23
+
24
+ attr_accessor :attributes
25
+
26
+ def initialize(attributes = {})
27
+ @attributes = attributes
28
+ end
29
+
30
+ def read_attribute_for_validation(key)
31
+ @attributes[key.to_sym]
32
+ end
33
+
34
+ def method_missing(method_name, *args, &block)
35
+ return super unless @attributes.keys.any? { |k| k == method_name }
36
+ @attributes[method_name.to_sym]
37
+ end
38
+ end
39
+ end
metadata ADDED
@@ -0,0 +1,121 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: container_number_validator
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Niels Stevens
8
+ - Michel De Graaf
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-10-28 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: bundler
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ~>
19
+ - !ruby/object:Gem::Version
20
+ version: '1.3'
21
+ type: :development
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ~>
26
+ - !ruby/object:Gem::Version
27
+ version: '1.3'
28
+ - !ruby/object:Gem::Dependency
29
+ name: rspec
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ~>
33
+ - !ruby/object:Gem::Version
34
+ version: 2.14.0
35
+ type: :development
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ~>
40
+ - !ruby/object:Gem::Version
41
+ version: 2.14.0
42
+ - !ruby/object:Gem::Dependency
43
+ name: rake
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - '>='
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - '>='
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ - !ruby/object:Gem::Dependency
57
+ name: activemodel
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ~>
61
+ - !ruby/object:Gem::Version
62
+ version: 4.0.0
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: 4.0.0
70
+ description: This gems validates Sea Container Numbers. It adds a Rails validator
71
+ for this to your project.
72
+ email:
73
+ - niels@kabisa.nl
74
+ - michel@kabisa.nl
75
+ executables: []
76
+ extensions: []
77
+ extra_rdoc_files: []
78
+ files:
79
+ - .gitignore
80
+ - .rspec
81
+ - .ruby-version
82
+ - Gemfile
83
+ - LICENSE.txt
84
+ - README.md
85
+ - Rakefile
86
+ - container_number_validator.gemspec
87
+ - container_number_validator.iml
88
+ - lib/container_number_validator.rb
89
+ - lib/container_number_validator/adapters/active_model.rb
90
+ - lib/container_number_validator/version.rb
91
+ - spec/container_number_validator/adapters/active_model_spec.rb
92
+ - spec/container_number_validator/container_number_validator_spec.rb
93
+ - spec/spec_helper.rb
94
+ homepage: https://github.com/kabisaict/container_number_validator
95
+ licenses:
96
+ - MIT
97
+ metadata: {}
98
+ post_install_message:
99
+ rdoc_options: []
100
+ require_paths:
101
+ - lib
102
+ required_ruby_version: !ruby/object:Gem::Requirement
103
+ requirements:
104
+ - - '>='
105
+ - !ruby/object:Gem::Version
106
+ version: '0'
107
+ required_rubygems_version: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - '>='
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
112
+ requirements: []
113
+ rubyforge_project:
114
+ rubygems_version: 2.0.6
115
+ signing_key:
116
+ specification_version: 4
117
+ summary: Validate Sea Container numbers
118
+ test_files:
119
+ - spec/container_number_validator/adapters/active_model_spec.rb
120
+ - spec/container_number_validator/container_number_validator_spec.rb
121
+ - spec/spec_helper.rb