tracking_number 0.5.0 → 0.6.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 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!