tracking_number 0.5.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ MzY2OGRiZjAzMTU1ODQxNTg4YTA2ZjhlZGVhZDdmZGMyNDIxYTg4MQ==
5
+ data.tar.gz: !binary |-
6
+ NTdhZWI1OTRlMWIwNTM3M2UxMThjMmJmZjJkNzVmZDA0NGI3MDI0ZQ==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ YTJkYTVlMGUzYjIwZWUyNTdjYTAwZDg5YjU2YjlkMDI4NWFmN2VjM2NiMzU4
10
+ MDM1MjFiNDEyZmI3MTNhZjBiYTgwMTAxZjhiNTQ0ZGM4ZTQ1OTUxNWNiODAw
11
+ YmVjNWQwZGQwMDQ0N2YxZWM2YTUxYTRiMTk2OTU4NjBlZjZjNzM=
12
+ data.tar.gz: !binary |-
13
+ YmFiNDcxMjBjMDU5NzNhZWI0YzJmYmQ5YjIzYjkxMzJlOGQ2M2M5ZTVkYzRm
14
+ MTQzNTc2NmIxNTJiZDIzZGRmNjhkMTI0MDIzOTI5OTE1MzA2Y2FmMDEwNzZl
15
+ MjBjMDgwYjZjMWUzOTgyNThkZjc1MmI5MmQ5YjcxMzFkYzM0MDM=
data/.gitignore CHANGED
@@ -40,3 +40,4 @@ pkg
40
40
  #
41
41
  # For vim:
42
42
  #*.swp
43
+ Gemfile.lock
data/README.rdoc CHANGED
@@ -16,8 +16,22 @@ TrackingNumber.search("Lorem ipsum dolor sit amet, consectetur adipisicing elit,
16
16
 
17
17
  #=> [TrackingNumber, TrackingNumber]
18
18
 
19
+ == ActiveModel validation
20
+
21
+ For Rails 3 (or any ActiveModel client), validate your fields as a tracking number:
22
+
23
+ class Shipment < ActiveRecord::Base
24
+ validates :tracking, :tracking_number => true
25
+ end
26
+
27
+ Sometimes it's helpful to have a "magic" tracking number that isn't valid for any of the real carriers, and maybe will have other side effects (e.g., special treatment of a shipping email.)
28
+
29
+ class Shipment < ActiveRecord::Base
30
+ validates :tracking, :tracking_number => { :except => 'magic-hand-delivery' }
31
+ end
32
+
19
33
  == Contributing to tracking_number
20
-
34
+
21
35
  * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet
22
36
  * Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it
23
37
  * Fork the project
data/Rakefile CHANGED
@@ -1,20 +1,7 @@
1
1
  require 'rubygems'
2
2
  require 'bundler'
3
3
  Bundler::GemHelper.install_tasks
4
-
5
- # if not defined?(Bundler)
6
- # require 'bundler'
7
- # begin
8
- # Bundler.setup(:default, :development)
9
- # rescue Bundler::BundlerError => e
10
- # $stderr.puts e.message
11
- # $stderr.puts "Run `bundle install` to install missing gems"
12
- # exit e.status_code
13
- # end
14
- # end
15
-
16
4
  require 'rake'
17
-
18
5
  require 'rake/testtask'
19
6
  Rake::TestTask.new(:test) do |test|
20
7
  test.libs << 'lib' << 'test'
@@ -22,17 +9,10 @@ Rake::TestTask.new(:test) do |test|
22
9
  test.verbose = true
23
10
  end
24
11
 
25
- require 'rcov/rcovtask'
26
- Rcov::RcovTask.new do |test|
27
- test.libs << 'test'
28
- test.pattern = 'test/**/*_test.rb'
29
- test.verbose = true
30
- end
31
-
32
12
  task :default => :test
33
13
 
34
- require 'rake/rdoctask'
35
- Rake::RDocTask.new do |rdoc|
14
+ require 'rdoc/task'
15
+ RDoc::Task.new do |rdoc|
36
16
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
37
17
  require 'tracking_number'
38
18
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.5.0
1
+ 0.6.0
@@ -0,0 +1,12 @@
1
+ class TrackingNumberValidator < ActiveModel::EachValidator
2
+ def validate_each(record, attribute, value)
3
+ return unless value.present?
4
+ if options[:exception] == value
5
+ # magic valid value (an exception that says "not really shipped" or something)
6
+ elsif TrackingNumber.new(value).valid?
7
+ # looks good to me
8
+ else
9
+ record.errors[attribute] << options[:message] || 'is not a valid tracking number'
10
+ end
11
+ end
12
+ end
@@ -1,6 +1,8 @@
1
1
  module TrackingNumber
2
2
  class Base
3
3
  attr_accessor :tracking_number
4
+ attr_accessor :original_number
5
+
4
6
  def initialize(tracking_number)
5
7
  @original_number = tracking_number
6
8
  @tracking_number = tracking_number.strip.gsub(" ", "").upcase
@@ -13,16 +15,16 @@ module TrackingNumber
13
15
  valids.each do |t|
14
16
  uniques[t.tracking_number] = t unless uniques.has_key?(t.tracking_number)
15
17
  end
16
-
18
+
17
19
  uniques.values
18
20
  end
19
-
21
+
20
22
  def self.scan(body)
21
23
  patterns = [self.const_get("SEARCH_PATTERN")].flatten
22
24
  possibles = patterns.collect do |pattern|
23
25
  body.scan(pattern).uniq.flatten
24
26
  end
25
-
27
+
26
28
  possibles.flatten.compact.uniq
27
29
  end
28
30
 
@@ -35,7 +37,7 @@ module TrackingNumber
35
37
  def valid_format?
36
38
  !matches.nil? && !matches.empty?
37
39
  end
38
-
40
+
39
41
  def decode
40
42
  {}
41
43
  end
@@ -9,7 +9,7 @@ module TrackingNumber
9
9
  SEARCH_PATTERN = /(\b([0-9]\s*){12,12}\b)/
10
10
  VERIFY_PATTERN = /^([0-9]{11,11})([0-9])$/
11
11
  LENGTH = 12
12
-
12
+
13
13
  def matches
14
14
  self.tracking_number.scan(VERIFY_PATTERN).flatten
15
15
  end
@@ -22,21 +22,21 @@ module TrackingNumber
22
22
  return (total % 11) == check.to_i
23
23
  end
24
24
  end
25
-
25
+
26
26
  #TODO Fix these FedEx ground numberss
27
27
 
28
28
  class FedExGround96 < FedEx
29
29
  SEARCH_PATTERN = /(\b9\s*6\s*([0-9]\s*){20,20}\b)/
30
30
  VERIFY_PATTERN = /^96[0-9]{5,5}([0-9]{14,14})([0-9])$/
31
31
  LENGTH = 22
32
-
32
+
33
33
  def matches
34
34
  self.tracking_number.scan(VERIFY_PATTERN).flatten
35
35
  end
36
36
 
37
37
  def decode
38
38
  {:application_id => self.tracking_number.to_s.slice(0...2),
39
- :serial_container => self.tracking_number.to_s.slice(2...4),
39
+ :serial_container => self.tracking_number.to_s.slice(2...4),
40
40
  :service_code => self.tracking_number.to_s.slice(4...7),
41
41
  :shipper_id => self.tracking_number.to_s.slice(7...14),
42
42
  :package_identifier => self.tracking_number.to_s.slice(14...21),
@@ -48,7 +48,7 @@ module TrackingNumber
48
48
  # 22 numbers
49
49
  # http://fedex.com/us/solutions/ppe/FedEx_Ground_Label_Layout_Specification.pdf
50
50
  # 96 - UCC/EAN Application Identifier
51
-
51
+
52
52
  # [0-9]{2,2} - SCNC
53
53
  # [0-9]{3,3} - Class Of Service
54
54
  # [0-9]{7,7} - RPS Shipper ID (used in calculation)
@@ -72,7 +72,7 @@ module TrackingNumber
72
72
  SEARCH_PATTERN = /(\b([0-9]\s*){15,15}\b)/
73
73
  VERIFY_PATTERN = /^([0-9]{15,15})$/
74
74
  LENGTH = 15
75
-
75
+
76
76
  def matches
77
77
  self.tracking_number.scan(VERIFY_PATTERN).flatten
78
78
  end
@@ -95,25 +95,25 @@ module TrackingNumber
95
95
  SEARCH_PATTERN = /(\b([0-9]\s*){18,18}\b)/
96
96
  VERIFY_PATTERN = /^[0-9]{2,2}([0-9]{15,15})([0-9])$/
97
97
  LENGTH = 20
98
-
98
+
99
99
  def matches
100
100
  self.tracking_number.scan(VERIFY_PATTERN).flatten
101
101
  end
102
102
 
103
103
  def decode
104
104
  {:application_id => self.tracking_number.to_s.slice(0...2),
105
- :serial_container => self.tracking_number.to_s.slice(1...2),
105
+ :serial_container => self.tracking_number.to_s.slice(1...2),
106
106
  :service_code => self.tracking_number.to_s.slice(2...3),
107
107
  :shipper_id => self.tracking_number.to_s.slice(3...10),
108
108
  :package_identifier => self.tracking_number.to_s.slice(10...17),
109
109
  :check_digit => self.tracking_number.slice(17...18)
110
110
  }
111
111
  end
112
-
112
+
113
113
  def valid_checksum?
114
114
  # [0-9]{2,2} - Not used
115
115
  # [0-9]{15, 15} - used for calculation
116
-
116
+
117
117
  sequence = tracking_number.chars.to_a.map(&:to_i)
118
118
  check_digit = sequence.pop
119
119
  total = 0
@@ -2,7 +2,7 @@ module TrackingNumber
2
2
  class UPS < Base
3
3
  SEARCH_PATTERN = /(\b1\s*Z\s*(\w\s*){16,16}\b)/
4
4
  VERIFY_PATTERN = /^1Z(\w{15,15})(\w)$/
5
-
5
+
6
6
  def carrier
7
7
  :ups
8
8
  end
@@ -33,7 +33,7 @@ module TrackingNumber
33
33
  end
34
34
 
35
35
  def decode
36
- {:shipper_account => self.tracking_number.to_s.slice(2...8),
36
+ {:shipper_account => self.tracking_number.to_s.slice(2...8),
37
37
  :service_type => self.tracking_number.to_s.slice(8...10),
38
38
  :package_identifier => self.tracking_number.to_s.slice(10...17),
39
39
  :check_digit => self.tracking_number.to_s.slice(17, 18)
@@ -4,14 +4,14 @@ module TrackingNumber
4
4
  :usps
5
5
  end
6
6
  end
7
-
7
+
8
8
  class USPS91 < USPS
9
9
  SEARCH_PATTERN = [/(\b9\s*[14]\s*(([0-9]\s*){20,20}\b))/, /(\b([0-9]\s*){20,20}\b)/]
10
10
  VERIFY_PATTERN = /^(9[14][0-9]{19,19})([0-9])$/
11
-
11
+
12
12
  # Sometimes these numbers will appear without the leading 91 or 94, though, so we need to account for that case
13
-
14
- def decode
13
+
14
+ def decode
15
15
  # Application ID: 91 or 94
16
16
  # Service Code: 2 Digits
17
17
  # Mailer Id: 8 Digits
@@ -19,13 +19,13 @@ module TrackingNumber
19
19
  # Checksum: 1 Digit
20
20
 
21
21
  {:application_id => self.tracking_number.to_s.slice(0...2),
22
- :service_code => self.tracking_number.to_s.slice(2...4),
22
+ :service_code => self.tracking_number.to_s.slice(2...4),
23
23
  :mailer_id => self.tracking_number.to_s.slice(4...12),
24
24
  :package_identifier => self.tracking_number.to_s.slice(12...21),
25
25
  :check_digit => self.tracking_number.slice(21...22)
26
26
  }
27
27
  end
28
-
28
+
29
29
  def matches
30
30
  if self.tracking_number =~ /^9[14]/
31
31
  self.tracking_number.scan(VERIFY_PATTERN).flatten
@@ -33,10 +33,10 @@ module TrackingNumber
33
33
  "91#{self.tracking_number}".scan(VERIFY_PATTERN).flatten
34
34
  end
35
35
  end
36
-
36
+
37
37
  def valid_checksum?
38
- if self.tracking_number =~ /^9[14]/
39
- return true if weighted_usps_checksum_valid?(tracking_number)
38
+ if self.tracking_number =~ /^9[14]/
39
+ return true if weighted_usps_checksum_valid?(tracking_number)
40
40
  else
41
41
  if weighted_usps_checksum_valid?("91#{self.tracking_number}")
42
42
  # set the tracking number to the 91 format if it passes this test
@@ -45,13 +45,13 @@ module TrackingNumber
45
45
  end
46
46
  end
47
47
  end
48
-
48
+
49
49
  private
50
-
50
+
51
51
  def weighted_usps_checksum_valid?(sequence)
52
52
  chars = sequence.chars.to_a
53
53
  check_digit = chars.pop
54
-
54
+
55
55
  total = 0
56
56
  chars.reverse.each_with_index do |c, i|
57
57
  x = c.to_i
@@ -65,26 +65,26 @@ module TrackingNumber
65
65
  return true if check == check_digit.to_i
66
66
  end
67
67
  end
68
-
68
+
69
69
  class USPS20 < USPS
70
70
  # http://www.usps.com/cpim/ftp/pubs/pub109.pdf (Publication 109. Extra Services Technical Guide, pg. 19)
71
71
  # http://www.usps.com/cpim/ftp/pubs/pub91.pdf (Publication 91. Confirmation Services Technical Guide pg. 38)
72
-
72
+
73
73
  SEARCH_PATTERN = /(\b([0-9]\s*){20,20}\b)/
74
74
  VERIFY_PATTERN = /^([0-9]{2,2})([0-9]{9,9})([0-9]{8,8})([0-9])$/
75
75
 
76
76
  def matches
77
77
  self.tracking_number.scan(VERIFY_PATTERN).flatten
78
78
  end
79
-
79
+
80
80
  def decode
81
- {:service_code => self.tracking_number.to_s.slice(0...2),
81
+ {:service_code => self.tracking_number.to_s.slice(0...2),
82
82
  :mailer_id => self.tracking_number.to_s.slice(2...11),
83
83
  :package_identifier => self.tracking_number.to_s.slice(11...19),
84
84
  :check_digit => self.tracking_number.slice(19...20)
85
85
  }
86
86
  end
87
-
87
+
88
88
  def service_type
89
89
  case decode[:service_code]
90
90
  when "71"
@@ -97,11 +97,11 @@ module TrackingNumber
97
97
  "Return Receipt for Merchandise"
98
98
  end
99
99
  end
100
-
100
+
101
101
  def valid_checksum?
102
102
  chars = tracking_number.chars.to_a
103
103
  check_digit = chars.pop
104
-
104
+
105
105
  total = 0
106
106
  chars.reverse.each_with_index do |c, i|
107
107
  x = c.to_i
@@ -114,11 +114,11 @@ module TrackingNumber
114
114
  return true if check == check_digit.to_i
115
115
  end
116
116
  end
117
-
117
+
118
118
  class USPS13 < USPS
119
119
  SEARCH_PATTERN = /(\b([A-Z]\s*){2,2}([0-9]\s*){9,9}([A-Z]\s*){2,2}\b)/
120
120
  VERIFY_PATTERN = /^([A-Z]{2,2})([0-9]{9,9})([A-Z]{2,2})$/
121
-
121
+
122
122
  def matches
123
123
  self.tracking_number.scan(VERIFY_PATTERN).flatten
124
124
  end
@@ -127,12 +127,12 @@ module TrackingNumber
127
127
  sequence = tracking_number.scan(/[0-9]+/).flatten.join
128
128
  chars = sequence.chars.to_a
129
129
  check_digit = chars.pop.to_i
130
-
130
+
131
131
  sum = 0
132
132
  chars.zip([8,6,4,2,3,5,9,7]).each do |pair|
133
133
  sum += (pair[0].to_i * pair[1].to_i)
134
134
  end
135
-
135
+
136
136
  remainder = sum % 11
137
137
  check = case remainder
138
138
  when 1
@@ -142,7 +142,7 @@ module TrackingNumber
142
142
  else
143
143
  11 - remainder
144
144
  end
145
-
145
+
146
146
  return check == check_digit
147
147
  end
148
148
  end
@@ -1,3 +1,3 @@
1
1
  module TrackingNumber
2
- VERSION = "0.5.0"
2
+ VERSION = "0.6.0"
3
3
  end
@@ -10,6 +10,10 @@ require 'tracking_number/ups'
10
10
  require 'tracking_number/dhl'
11
11
  require 'tracking_number/ontrac'
12
12
 
13
+ if defined?(ActiveModel::EachValidator)
14
+ require 'tracking_number/active_model_validator'
15
+ end
16
+
13
17
  module TrackingNumber
14
18
  TYPES = [UPS, FedExExpress, FedExGround, FedExGround18, FedExGround96, USPS91, USPS20, USPS13, DHL, OnTrac]
15
19
 
@@ -0,0 +1,29 @@
1
+ require 'test_helper'
2
+
3
+ class TrackingNumberValidatorTest < Test::Unit::TestCase
4
+ class Validatable
5
+ include ActiveModel::Validations
6
+ attr_accessor :tracking_number
7
+ ERROR_MESSAGE = "must be valid, or 'magic' to prevent inclusion in confirmation email"
8
+ validates :tracking_number, :presence => true,
9
+ :tracking_number => {
10
+ :exception => 'magic',
11
+ :message => ERROR_MESSAGE
12
+ }
13
+ end
14
+ def test_valid_numbers
15
+ %w(magic 790535312317).each do |valid_tracking_number|
16
+ obj = Validatable.new
17
+ obj.tracking_number = valid_tracking_number
18
+ assert obj.valid?, "should allow tracking_number #{valid_tracking_number}"
19
+ end
20
+ end
21
+ def test_invalid_numbers
22
+ %w(wrong 1234).each do |invalid_tracking_number|
23
+ obj = Validatable.new
24
+ obj.tracking_number = invalid_tracking_number
25
+ assert !obj.valid?
26
+ assert_equal obj.errors[:tracking_number], [Validatable::ERROR_MESSAGE]
27
+ end
28
+ end
29
+ end
@@ -21,7 +21,7 @@ class FedExTrackingNumberTest < Test::Unit::TestCase
21
21
  should_detect_number_variants(valid_number, TrackingNumber::FedExGround96)
22
22
  end
23
23
  end
24
-
24
+
25
25
  ["0414 4176 0228 964", "5682 8361 0012 000", "5682 8361 0012 734"].each do |valid_number|
26
26
  should "return fedex ground for #{valid_number}" do
27
27
  should_be_valid_number(valid_number, TrackingNumber::FedExGround, :fedex)
data/test/test_helper.rb CHANGED
@@ -1,16 +1,9 @@
1
+ require 'simplecov'
2
+ SimpleCov.start
1
3
  require 'rubygems'
2
- # if not defined?(Bundler)
3
- # require 'bundler'
4
- # begin
5
- # Bundler.setup(:default, :development)
6
- # rescue Bundler::BundlerError => e
7
- # $stderr.puts e.message
8
- # $stderr.puts "Run `bundle install` to install missing gems"
9
- # exit e.status_code
10
- # end
11
- # end
12
4
  require 'test/unit'
13
5
  require 'shoulda'
6
+ require 'active_model'
14
7
 
15
8
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
16
9
  $LOAD_PATH.unshift(File.dirname(__FILE__))
@@ -38,7 +31,7 @@ class Test::Unit::TestCase
38
31
  end
39
32
 
40
33
  def should_detect_number_variants(valid_number, type)
41
- possible_strings(valid_number).each do |string|
34
+ possible_strings(valid_number).each do |string|
42
35
  results = type.search(string)
43
36
  assert_equal 1, results.size, "could not find #{type} #{valid_number} in #{string}"
44
37
  end
@@ -11,7 +11,7 @@ class USPSTrackingNumberTest < Test::Unit::TestCase
11
11
  should_detect_number_variants(valid_number, TrackingNumber::USPS91)
12
12
  end
13
13
  end
14
-
14
+
15
15
  ["0307 1790 0005 2348 3741"].each do |valid_number|
16
16
  should "return usps with valid 20 digit number: #{valid_number}" do
17
17
  should_be_valid_number(valid_number, TrackingNumber::USPS20, :usps)
@@ -29,21 +29,19 @@ Gem::Specification.new do |s|
29
29
  s.specification_version = 3
30
30
 
31
31
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
32
+ s.add_development_dependency(%q<rake>, [">= 0"])
32
33
  s.add_development_dependency(%q<shoulda>, [">= 0"])
33
- # s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
34
- # s.add_development_dependency(%q<jeweler>, ["~> 1.5.2"])
35
- s.add_development_dependency(%q<rcov>, [">= 0"])
34
+ s.add_development_dependency(%q<simplecov>, [">= 0"])
35
+ s.add_development_dependency(%q<activemodel>, [">= 3"])
36
36
  else
37
+ s.add_dependency(%q<rake>, [">= 0"])
37
38
  s.add_dependency(%q<shoulda>, [">= 0"])
38
- # s.add_dependency(%q<bundler>, ["~> 1.0.0"])
39
- # s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
40
- s.add_dependency(%q<rcov>, [">= 0"])
39
+ s.add_dependency(%q<simplecov>, [">= 0"])
41
40
  end
42
41
  else
42
+ s.add_dependency(%q<rake>, [">= 0"])
43
43
  s.add_dependency(%q<shoulda>, [">= 0"])
44
- # s.add_dependency(%q<bundler>, ["~> 1.0.0"])
45
- # s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
46
- s.add_dependency(%q<rcov>, [">= 0"])
44
+ s.add_dependency(%q<simplecov>, [">= 0"])
47
45
  end
48
46
  end
49
47
 
metadata CHANGED
@@ -1,8 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tracking_number
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
5
- prerelease:
4
+ version: 0.6.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Jeff Keen
@@ -11,28 +10,62 @@ bindir: bin
11
10
  cert_chain: []
12
11
  date: 2011-04-26 00:00:00.000000000 Z
13
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rake
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ! '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ! '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
14
27
  - !ruby/object:Gem::Dependency
15
28
  name: shoulda
16
- requirement: &70300998016440 !ruby/object:Gem::Requirement
17
- none: false
29
+ requirement: !ruby/object:Gem::Requirement
18
30
  requirements:
19
31
  - - ! '>='
20
32
  - !ruby/object:Gem::Version
21
33
  version: '0'
22
34
  type: :development
23
35
  prerelease: false
24
- version_requirements: *70300998016440
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ! '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
25
41
  - !ruby/object:Gem::Dependency
26
- name: rcov
27
- requirement: &70300998015740 !ruby/object:Gem::Requirement
28
- none: false
42
+ name: simplecov
43
+ requirement: !ruby/object:Gem::Requirement
29
44
  requirements:
30
45
  - - ! '>='
31
46
  - !ruby/object:Gem::Version
32
47
  version: '0'
33
48
  type: :development
34
49
  prerelease: false
35
- version_requirements: *70300998015740
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: activemodel
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '3'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ! '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '3'
36
69
  description: Match tracking numbers to a service, and search blocks of text and pull
37
70
  out valid tracking numbers.
38
71
  email: jeff@keen.me
@@ -45,12 +78,12 @@ files:
45
78
  - .document
46
79
  - .gitignore
47
80
  - Gemfile
48
- - Gemfile.lock
49
81
  - LICENSE.txt
50
82
  - README.rdoc
51
83
  - Rakefile
52
84
  - VERSION
53
85
  - lib/tracking_number.rb
86
+ - lib/tracking_number/active_model_validator.rb
54
87
  - lib/tracking_number/base.rb
55
88
  - lib/tracking_number/dhl.rb
56
89
  - lib/tracking_number/fedex.rb
@@ -58,6 +91,7 @@ files:
58
91
  - lib/tracking_number/ups.rb
59
92
  - lib/tracking_number/usps.rb
60
93
  - lib/tracking_number/version.rb
94
+ - test/active_model_validator_test.rb
61
95
  - test/dhl_tracking_number_test.rb
62
96
  - test/fedex_tracking_number_test.rb
63
97
  - test/ontrac_tracking_number_test.rb
@@ -69,33 +103,25 @@ files:
69
103
  homepage: http://github.com/jkeen/tracking_number
70
104
  licenses:
71
105
  - MIT
106
+ metadata: {}
72
107
  post_install_message:
73
108
  rdoc_options: []
74
109
  require_paths:
75
110
  - lib
76
111
  required_ruby_version: !ruby/object:Gem::Requirement
77
- none: false
78
112
  requirements:
79
113
  - - ! '>='
80
114
  - !ruby/object:Gem::Version
81
115
  version: '0'
82
116
  required_rubygems_version: !ruby/object:Gem::Requirement
83
- none: false
84
117
  requirements:
85
118
  - - ! '>='
86
119
  - !ruby/object:Gem::Version
87
120
  version: '0'
88
121
  requirements: []
89
122
  rubyforge_project:
90
- rubygems_version: 1.8.15
123
+ rubygems_version: 2.2.2
91
124
  signing_key:
92
125
  specification_version: 3
93
126
  summary: Identifies valid tracking numbers
94
- test_files:
95
- - test/dhl_tracking_number_test.rb
96
- - test/fedex_tracking_number_test.rb
97
- - test/ontrac_tracking_number_test.rb
98
- - test/test_helper.rb
99
- - test/tracking_number_test.rb
100
- - test/ups_tracking_number_test.rb
101
- - test/usps_tracking_number_test.rb
127
+ test_files: []
data/Gemfile.lock DELETED
@@ -1,18 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- tracking_number (0.4.0)
5
-
6
- GEM
7
- remote: http://rubygems.org/
8
- specs:
9
- rcov (0.9.9)
10
- shoulda (2.11.3)
11
-
12
- PLATFORMS
13
- ruby
14
-
15
- DEPENDENCIES
16
- rcov
17
- shoulda
18
- tracking_number!