tracking_number 0.3.0 → 0.3.1
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.
- data/VERSION +1 -1
 - data/lib/base.rb +15 -3
 - data/lib/usps.rb +29 -7
 - data/test/test_usps_tracking_number.rb +1 -3
 - data/tracking_number.gemspec +2 -2
 - metadata +4 -4
 
    
        data/VERSION
    CHANGED
    
    | 
         @@ -1 +1 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            0.3. 
     | 
| 
      
 1 
     | 
    
         
            +
            0.3.1
         
     | 
    
        data/lib/base.rb
    CHANGED
    
    | 
         @@ -6,12 +6,24 @@ class TrackingNumber 
     | 
|
| 
       6 
6 
     | 
    
         
             
                  @tracking_number = tracking_number.gsub(" ", "").upcase
         
     | 
| 
       7 
7 
     | 
    
         
             
                end
         
     | 
| 
       8 
8 
     | 
    
         | 
| 
       9 
     | 
    
         
            -
                def self.search(body)
         
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
      
 9 
     | 
    
         
            +
                def self.search(body)      
         
     | 
| 
      
 10 
     | 
    
         
            +
                  valids = self.scan(body).uniq.collect { |possible| new(possible) }.select { |t| t.valid? }
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
                  uniques = {}
         
     | 
| 
      
 13 
     | 
    
         
            +
                  valids.each do |t|
         
     | 
| 
      
 14 
     | 
    
         
            +
                    uniques[t.tracking_number] = t unless uniques.has_key?(t.tracking_number)
         
     | 
| 
      
 15 
     | 
    
         
            +
                  end
         
     | 
| 
      
 16 
     | 
    
         
            +
                  
         
     | 
| 
      
 17 
     | 
    
         
            +
                  uniques.values
         
     | 
| 
       11 
18 
     | 
    
         
             
                end
         
     | 
| 
       12 
19 
     | 
    
         | 
| 
       13 
20 
     | 
    
         
             
                def self.scan(body)
         
     | 
| 
       14 
     | 
    
         
            -
                   
     | 
| 
      
 21 
     | 
    
         
            +
                  patterns = [self.const_get("SEARCH_PATTERN")].flatten
         
     | 
| 
      
 22 
     | 
    
         
            +
                  possibles = patterns.collect do |pattern|
         
     | 
| 
      
 23 
     | 
    
         
            +
                    body.scan(pattern).uniq.flatten
         
     | 
| 
      
 24 
     | 
    
         
            +
                  end
         
     | 
| 
      
 25 
     | 
    
         
            +
                  
         
     | 
| 
      
 26 
     | 
    
         
            +
                  possibles.flatten.compact.uniq
         
     | 
| 
       15 
27 
     | 
    
         
             
                end
         
     | 
| 
       16 
28 
     | 
    
         | 
| 
       17 
29 
     | 
    
         
             
                def valid?
         
     | 
    
        data/lib/usps.rb
    CHANGED
    
    | 
         @@ -6,12 +6,10 @@ class TrackingNumber 
     | 
|
| 
       6 
6 
     | 
    
         
             
              end
         
     | 
| 
       7 
7 
     | 
    
         | 
| 
       8 
8 
     | 
    
         
             
              class USPS91 < USPS
         
     | 
| 
       9 
     | 
    
         
            -
                SEARCH_PATTERN = /(\b9\s*1\s*(([0-9]\s*){20,20}\b))/
         
     | 
| 
      
 9 
     | 
    
         
            +
                SEARCH_PATTERN = [/(\b9\s*1\s*(([0-9]\s*){20,20}\b))/, /(\b([0-9]\s*){20,20}\b)/]
         
     | 
| 
       10 
10 
     | 
    
         
             
                VERIFY_PATTERN = /^(91[0-9]{19,19})([0-9])$/
         
     | 
| 
       11 
     | 
    
         
            -
             
     | 
| 
       12 
     | 
    
         
            -
                 
     | 
| 
       13 
     | 
    
         
            -
                  self.tracking_number.scan(VERIFY_PATTERN).flatten
         
     | 
| 
       14 
     | 
    
         
            -
                end
         
     | 
| 
      
 11 
     | 
    
         
            +
              
         
     | 
| 
      
 12 
     | 
    
         
            +
                # Sometimes these numbers will appear without the leading 91, though, so we need to account for that case
         
     | 
| 
       15 
13 
     | 
    
         | 
| 
       16 
14 
     | 
    
         
             
                def decode 
         
     | 
| 
       17 
15 
     | 
    
         
             
                  # Application ID: 91
         
     | 
| 
         @@ -28,8 +26,30 @@ class TrackingNumber 
     | 
|
| 
       28 
26 
     | 
    
         
             
                  }
         
     | 
| 
       29 
27 
     | 
    
         
             
                end
         
     | 
| 
       30 
28 
     | 
    
         | 
| 
      
 29 
     | 
    
         
            +
                def matches
         
     | 
| 
      
 30 
     | 
    
         
            +
                  if self.tracking_number =~ /^91/
         
     | 
| 
      
 31 
     | 
    
         
            +
                    self.tracking_number.scan(VERIFY_PATTERN).flatten
         
     | 
| 
      
 32 
     | 
    
         
            +
                  else
         
     | 
| 
      
 33 
     | 
    
         
            +
                    "91#{self.tracking_number}".scan(VERIFY_PATTERN).flatten
         
     | 
| 
      
 34 
     | 
    
         
            +
                  end
         
     | 
| 
      
 35 
     | 
    
         
            +
                end
         
     | 
| 
      
 36 
     | 
    
         
            +
                
         
     | 
| 
       31 
37 
     | 
    
         
             
                def valid_checksum?
         
     | 
| 
       32 
     | 
    
         
            -
                   
     | 
| 
      
 38 
     | 
    
         
            +
                  if self.tracking_number =~ /^91/ 
         
     | 
| 
      
 39 
     | 
    
         
            +
                    return true if weighted_usps_checksum_valid?(tracking_number) 
         
     | 
| 
      
 40 
     | 
    
         
            +
                  else
         
     | 
| 
      
 41 
     | 
    
         
            +
                    if weighted_usps_checksum_valid?("91#{self.tracking_number}")
         
     | 
| 
      
 42 
     | 
    
         
            +
                      # set the tracking number to the 91 format if it passes this test
         
     | 
| 
      
 43 
     | 
    
         
            +
                      self.tracking_number = "91#{self.tracking_number}"
         
     | 
| 
      
 44 
     | 
    
         
            +
                      return true
         
     | 
| 
      
 45 
     | 
    
         
            +
                    end
         
     | 
| 
      
 46 
     | 
    
         
            +
                  end
         
     | 
| 
      
 47 
     | 
    
         
            +
                end
         
     | 
| 
      
 48 
     | 
    
         
            +
                
         
     | 
| 
      
 49 
     | 
    
         
            +
                private
         
     | 
| 
      
 50 
     | 
    
         
            +
                
         
     | 
| 
      
 51 
     | 
    
         
            +
                def weighted_usps_checksum_valid?(sequence)
         
     | 
| 
      
 52 
     | 
    
         
            +
                  chars = sequence.chars.to_a
         
     | 
| 
       33 
53 
     | 
    
         
             
                  check_digit = chars.pop
         
     | 
| 
       34 
54 
     | 
    
         | 
| 
       35 
55 
     | 
    
         
             
                  total = 0
         
     | 
| 
         @@ -47,6 +67,9 @@ class TrackingNumber 
     | 
|
| 
       47 
67 
     | 
    
         
             
              end
         
     | 
| 
       48 
68 
     | 
    
         | 
| 
       49 
69 
     | 
    
         
             
              class USPS20 < USPS
         
     | 
| 
      
 70 
     | 
    
         
            +
                # http://www.usps.com/cpim/ftp/pubs/pub109.pdf (Publication 109. Extra Services Technical Guide, pg. 19)
         
     | 
| 
      
 71 
     | 
    
         
            +
                # http://www.usps.com/cpim/ftp/pubs/pub91.pdf (Publication 91. Confirmation Services Technical Guide pg. 38)
         
     | 
| 
      
 72 
     | 
    
         
            +
                
         
     | 
| 
       50 
73 
     | 
    
         
             
                SEARCH_PATTERN = /(\b([0-9]\s*){20,20}\b)/
         
     | 
| 
       51 
74 
     | 
    
         
             
                VERIFY_PATTERN = /^([0-9]{2,2})([0-9]{9,9})([0-9]{8,8})([0-9])$/
         
     | 
| 
       52 
75 
     | 
    
         | 
| 
         @@ -83,7 +106,6 @@ class TrackingNumber 
     | 
|
| 
       83 
106 
     | 
    
         
             
                  chars.reverse.each_with_index do |c, i|
         
     | 
| 
       84 
107 
     | 
    
         
             
                    x = c.to_i
         
     | 
| 
       85 
108 
     | 
    
         
             
                    x *= 3 if i.even?
         
     | 
| 
       86 
     | 
    
         
            -
             
     | 
| 
       87 
109 
     | 
    
         
             
                    total += x
         
     | 
| 
       88 
110 
     | 
    
         
             
                  end
         
     | 
| 
       89 
111 
     | 
    
         | 
| 
         @@ -2,7 +2,7 @@ require 'test_helper' 
     | 
|
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            class USPSTrackingNumberTest < Test::Unit::TestCase
         
     | 
| 
       4 
4 
     | 
    
         
             
              context "a USPS tracking number" do
         
     | 
| 
       5 
     | 
    
         
            -
                ["9101 1234 5678 9000 0000 13"].each do |valid_number|
         
     | 
| 
      
 5 
     | 
    
         
            +
                ["9101 1234 5678 9000 0000 13", "7196 9010 7560 0307 7385"].each do |valid_number|
         
     | 
| 
       6 
6 
     | 
    
         
             
                  should "return usps with valid 22 digit number: #{valid_number}" do
         
     | 
| 
       7 
7 
     | 
    
         
             
                    t = TrackingNumber.new("9101 1234 5678 9000 0000 13")
         
     | 
| 
       8 
8 
     | 
    
         
             
                    assert_equal TrackingNumber::USPS91, t.class
         
     | 
| 
         @@ -15,8 +15,6 @@ class USPSTrackingNumberTest < Test::Unit::TestCase 
     | 
|
| 
       15 
15 
     | 
    
         
             
                  end
         
     | 
| 
       16 
16 
     | 
    
         
             
                end
         
     | 
| 
       17 
17 
     | 
    
         | 
| 
       18 
     | 
    
         
            -
                # Actual tracking number I got from the USPS that doesn't validate.  UGghhh
         
     | 
| 
       19 
     | 
    
         
            -
                #"7196 9010 7560 0307 7385",
         
     | 
| 
       20 
18 
     | 
    
         
             
                ["0307 1790 0005 2348 3741"].each do |valid_number|
         
     | 
| 
       21 
19 
     | 
    
         
             
                  should "detect #{valid_number} regardless of spacing" do
         
     | 
| 
       22 
20 
     | 
    
         
             
                    should_detect_number_variants(valid_number, TrackingNumber::USPS20)
         
     | 
    
        data/tracking_number.gemspec
    CHANGED
    
    | 
         @@ -5,11 +5,11 @@ 
     | 
|
| 
       5 
5 
     | 
    
         | 
| 
       6 
6 
     | 
    
         
             
            Gem::Specification.new do |s|
         
     | 
| 
       7 
7 
     | 
    
         
             
              s.name = %q{tracking_number}
         
     | 
| 
       8 
     | 
    
         
            -
              s.version = "0.3. 
     | 
| 
      
 8 
     | 
    
         
            +
              s.version = "0.3.1"
         
     | 
| 
       9 
9 
     | 
    
         | 
| 
       10 
10 
     | 
    
         
             
              s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
         
     | 
| 
       11 
11 
     | 
    
         
             
              s.authors = ["Jeff Keen"]
         
     | 
| 
       12 
     | 
    
         
            -
              s.date = %q{2011-02- 
     | 
| 
      
 12 
     | 
    
         
            +
              s.date = %q{2011-02-22}
         
     | 
| 
       13 
13 
     | 
    
         
             
              s.description = %q{Match tracking numbers to a service, and search blocks of text and pull out valid tracking numbers.}
         
     | 
| 
       14 
14 
     | 
    
         
             
              s.email = %q{jeff@keen.me}
         
     | 
| 
       15 
15 
     | 
    
         
             
              s.extra_rdoc_files = [
         
     | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,13 +1,13 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification 
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: tracking_number
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version 
         
     | 
| 
       4 
     | 
    
         
            -
              hash:  
     | 
| 
      
 4 
     | 
    
         
            +
              hash: 17
         
     | 
| 
       5 
5 
     | 
    
         
             
              prerelease: 
         
     | 
| 
       6 
6 
     | 
    
         
             
              segments: 
         
     | 
| 
       7 
7 
     | 
    
         
             
              - 0
         
     | 
| 
       8 
8 
     | 
    
         
             
              - 3
         
     | 
| 
       9 
     | 
    
         
            -
              -  
     | 
| 
       10 
     | 
    
         
            -
              version: 0.3. 
     | 
| 
      
 9 
     | 
    
         
            +
              - 1
         
     | 
| 
      
 10 
     | 
    
         
            +
              version: 0.3.1
         
     | 
| 
       11 
11 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       12 
12 
     | 
    
         
             
            authors: 
         
     | 
| 
       13 
13 
     | 
    
         
             
            - Jeff Keen
         
     | 
| 
         @@ -15,7 +15,7 @@ autorequire: 
     | 
|
| 
       15 
15 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       16 
16 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       17 
17 
     | 
    
         | 
| 
       18 
     | 
    
         
            -
            date: 2011-02- 
     | 
| 
      
 18 
     | 
    
         
            +
            date: 2011-02-22 00:00:00 -06:00
         
     | 
| 
       19 
19 
     | 
    
         
             
            default_executable: 
         
     | 
| 
       20 
20 
     | 
    
         
             
            dependencies: 
         
     | 
| 
       21 
21 
     | 
    
         
             
            - !ruby/object:Gem::Dependency 
         
     |