USPS-intelligent-barcode 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. data/Gemfile +9 -0
  2. data/Gemfile.lock +33 -0
  3. data/LICENSE.md +11 -0
  4. data/README.md +56 -0
  5. data/Rakefile +46 -0
  6. data/VERSION +1 -0
  7. data/examples/example.rb +17 -0
  8. data/lib/USPS-intelligent-barcode.rb +5 -0
  9. data/lib/USPS-intelligent-barcode/BarMap.rb +40 -0
  10. data/lib/USPS-intelligent-barcode/BarPosition.rb +26 -0
  11. data/lib/USPS-intelligent-barcode/Barcode.rb +110 -0
  12. data/lib/USPS-intelligent-barcode/BarcodeId.rb +66 -0
  13. data/lib/USPS-intelligent-barcode/CharacterPosition.rb +16 -0
  14. data/lib/USPS-intelligent-barcode/CodewordMap.rb +28 -0
  15. data/lib/USPS-intelligent-barcode/Crc.rb +42 -0
  16. data/lib/USPS-intelligent-barcode/MailerId.rb +70 -0
  17. data/lib/USPS-intelligent-barcode/NumericConversions.rb +13 -0
  18. data/lib/USPS-intelligent-barcode/RoutingCode.rb +77 -0
  19. data/lib/USPS-intelligent-barcode/SerialNumber.rb +61 -0
  20. data/lib/USPS-intelligent-barcode/ServiceType.rb +51 -0
  21. data/lib/USPS-intelligent-barcode/autoload.rb +61 -0
  22. data/lib/USPS-intelligent-barcode/bar_to_character_mapping.yml +66 -0
  23. data/lib/USPS-intelligent-barcode/codeword_to_character_mapping.yml +1366 -0
  24. data/spec/BarMap_spec.rb +30 -0
  25. data/spec/BarPosition_spec.rb +52 -0
  26. data/spec/BarcodeId_spec.rb +118 -0
  27. data/spec/Barcode_spec.rb +213 -0
  28. data/spec/CharacterPosition_spec.rb +25 -0
  29. data/spec/CodewordMap_spec.rb +22 -0
  30. data/spec/Crc_spec.rb +21 -0
  31. data/spec/MailerId_spec.rb +114 -0
  32. data/spec/NumericConversions_spec.rb +23 -0
  33. data/spec/RoutingCode_spec.rb +180 -0
  34. data/spec/SerialNumber_spec.rb +117 -0
  35. data/spec/ServiceType_spec.rb +93 -0
  36. data/spec/spec_helper.rb +1 -0
  37. metadata +160 -0
data/spec/Crc_spec.rb ADDED
@@ -0,0 +1,21 @@
1
+ require File.expand_path('spec_helper', File.dirname(__FILE__))
2
+
3
+ module Imb
4
+
5
+ describe Crc do
6
+
7
+ describe '#crc' do
8
+
9
+ specify do
10
+ Crc.crc(0x016907B2A24ABC16A2E5C004B1).should == 0x751
11
+ end
12
+
13
+ specify do
14
+ Crc.crc(0).should == 0x6e0
15
+ end
16
+
17
+ end
18
+
19
+ end
20
+
21
+ end
@@ -0,0 +1,114 @@
1
+ require File.expand_path('spec_helper', File.dirname(__FILE__))
2
+
3
+ module Imb
4
+
5
+ describe MailerId do
6
+
7
+ describe '::coerce' do
8
+
9
+ subject {MailerId.coerce(o)}
10
+
11
+ context 'MailerId' do
12
+ let(:o) {MailerId.new(12)}
13
+ its(:to_i) {should == 12}
14
+ end
15
+
16
+ context 'String' do
17
+ let(:o) {'12'}
18
+ its(:to_i) {should == 12}
19
+ end
20
+
21
+ context 'Integer' do
22
+ let(:o) {12}
23
+ its(:to_i) {should == 12}
24
+ end
25
+
26
+ context 'unknown' do
27
+ let(:o) {Object.new}
28
+ specify do
29
+ expect {
30
+ MailerId.coerce(o)
31
+ }.to raise_error ArgumentError, 'Cannot coerce to MailerId'
32
+ end
33
+ end
34
+
35
+ end
36
+
37
+ describe '#to_i' do
38
+ let(:value) {23}
39
+ subject {MailerId.new(value)}
40
+ its(:to_i) {should == value}
41
+ end
42
+
43
+ describe '#=' do
44
+ def o1 ; MailerId.new(1) ; end
45
+ def o2 ; 1 ; end
46
+ def o3 ; MailerId.new(2) ; end
47
+ def o4 ; Object.new ; end
48
+ specify {o1.should == o1}
49
+ specify {o1.should == o2}
50
+ specify {o1.should_not == o3}
51
+ specify {o1.should_not == o4}
52
+ end
53
+
54
+ describe '#validate' do
55
+
56
+ let(:long_mailer_id?) {mock 'long_mailer_id?'}
57
+
58
+ def validate(value)
59
+ MailerId.new(value).validate(long_mailer_id?)
60
+ end
61
+
62
+ def self.is_valid(value)
63
+ context "#{value}" do
64
+ specify {validate(value)}
65
+ end
66
+ end
67
+
68
+ def self.is_out_of_range(value)
69
+ context "#{value}" do
70
+ specify do
71
+ expect {
72
+ validate(value)
73
+ }.to raise_error(ArgumentError,
74
+ 'Must be 0..899999 or 900000000..999999999')
75
+ end
76
+ end
77
+ end
78
+
79
+ is_out_of_range -1
80
+ is_valid 0
81
+ is_valid 899_999
82
+ is_out_of_range 1_000_000
83
+ is_out_of_range 899_999_999
84
+ is_valid 900_000_000
85
+ is_valid 999_999_999
86
+ is_out_of_range 1_000_000_000
87
+
88
+ end
89
+
90
+ describe '#long?' do
91
+
92
+ subject {MailerId.new(value)}
93
+
94
+ context 'short' do
95
+ let(:value) {0}
96
+ its(:long?) {should be_false}
97
+ end
98
+
99
+ context 'long' do
100
+ let(:value) {900_000_000}
101
+ its(:long?) {should be_true}
102
+ end
103
+
104
+ end
105
+
106
+ describe '#shift_and_add_to' do
107
+ let(:mailer_id) {MailerId.new(999999)}
108
+ let(:long_mailer_id?) {mock 'long mailer id'}
109
+ specify {mailer_id.shift_and_add_to(1, long_mailer_id?).should == 1999999}
110
+ end
111
+
112
+ end
113
+
114
+ end
@@ -0,0 +1,23 @@
1
+ require File.expand_path('spec_helper', File.dirname(__FILE__))
2
+
3
+ module Imb
4
+
5
+ describe NumericConversions do
6
+
7
+ include NumericConversions
8
+
9
+ describe '#numeric_to_bytes' do
10
+
11
+ specify do
12
+ numeric_to_bytes(0x1234).should == [0x12, 0x34]
13
+ end
14
+
15
+ specify do
16
+ numeric_to_bytes(0x1234, 3).should == [0, 0x12, 0x34]
17
+ end
18
+
19
+ end
20
+
21
+ end
22
+
23
+ end
@@ -0,0 +1,180 @@
1
+ require File.expand_path('spec_helper', File.dirname(__FILE__))
2
+
3
+ module Imb
4
+
5
+ describe RoutingCode do
6
+
7
+ describe '::coerce' do
8
+
9
+ let(:zip) {85308}
10
+ let(:plus4) {1465}
11
+ let(:delivery_point) {12}
12
+
13
+ subject {RoutingCode.coerce(o)}
14
+
15
+ shared_examples 'coerces' do
16
+ its(:zip) {should == zip}
17
+ its(:plus4) {should == plus4}
18
+ its(:delivery_point) {should == delivery_point}
19
+ end
20
+
21
+ context 'RoutingCode' do
22
+ let(:o) {RoutingCode.new(zip, plus4, delivery_point)}
23
+ it_behaves_like 'coerces'
24
+ end
25
+
26
+ context 'nil' do
27
+ let(:o) {nil}
28
+ let(:zip) {nil}
29
+ let(:plus4) {nil}
30
+ let(:delivery_point) {nil}
31
+ it_behaves_like 'coerces'
32
+ end
33
+
34
+ context 'string' do
35
+
36
+ let(:o) {"#{zip}#{plus4}#{delivery_point}"}
37
+
38
+ context 'empty' do
39
+ let(:zip) {nil}
40
+ let(:plus4) {nil}
41
+ let(:delivery_point) {nil}
42
+ it_behaves_like 'coerces'
43
+ end
44
+
45
+ context "zip, plu4, delivery_point" do
46
+ it_behaves_like 'coerces'
47
+ end
48
+
49
+ end
50
+
51
+ context 'array' do
52
+ let(:o) {[zip, plus4, delivery_point]}
53
+ it_behaves_like 'coerces'
54
+ end
55
+
56
+ context 'unrecognized' do
57
+ let(:o) {Object.new}
58
+ specify do
59
+ expect {
60
+ RoutingCode.coerce(o)
61
+ }.to raise_error ArgumentError, 'Cannot coerce to RoutingCode'
62
+ end
63
+ end
64
+
65
+ end
66
+
67
+ describe '#string_to_array' do
68
+
69
+ subject(:array) {RoutingCode.string_to_array(s)}
70
+
71
+ context 'empty' do
72
+ let(:s) {''}
73
+ it {should == [nil, nil, nil]}
74
+ end
75
+
76
+ context 'zip' do
77
+ let(:s) {'85308'}
78
+ it {should == ['85308', nil, nil]}
79
+ end
80
+
81
+ context 'zip, plus4' do
82
+ let(:s) {'853081465'}
83
+ it {should == ['85308', '1465', nil]}
84
+ end
85
+
86
+ context 'zip, plu4, delivery_point' do
87
+ let(:s) {'85308146502'}
88
+ it {should == ['85308', '1465', '02']}
89
+ end
90
+
91
+ context 'non-digits' do
92
+ let(:s) {'(85308 1465 02)'}
93
+ it {should == ['85308', '1465', '02']}
94
+ end
95
+
96
+ context 'incorrect length' do
97
+ let(:s) {'1'}
98
+ specify do
99
+ expect {
100
+ array
101
+ }.to raise_error ArgumentError, 'Bad routing code: "1"'
102
+ end
103
+ end
104
+
105
+ end
106
+
107
+ describe '#convert' do
108
+
109
+ subject do
110
+ RoutingCode.new(zip, plus4, delivery_point)
111
+ end
112
+
113
+ context 'empty' do
114
+ let(:zip) {nil}
115
+ let(:plus4) {nil}
116
+ let(:delivery_point) {nil}
117
+ its(:convert) {should == 0}
118
+ end
119
+
120
+ context 'zip' do
121
+ let(:zip) {85308}
122
+ let(:plus4) {nil}
123
+ let(:delivery_point) {nil}
124
+ its(:convert) {should == 85309}
125
+ end
126
+
127
+ context 'zip, plus4' do
128
+ let(:zip) {85308}
129
+ let(:plus4) {1465}
130
+ let(:delivery_point) {nil}
131
+ its(:convert) {should == 853181466}
132
+ end
133
+
134
+ context 'zip, plus4, delivery_point' do
135
+ let(:zip) {85308}
136
+ let(:plus4) {1465}
137
+ let(:delivery_point) {2}
138
+ its(:convert) {should == 86308246503}
139
+ end
140
+
141
+ end
142
+
143
+ describe '#to_a' do
144
+ let(:zip) {85308}
145
+ let(:plus4) {1465}
146
+ let(:delivery_point) {2}
147
+ subject {RoutingCode.new(zip, plus4, delivery_point)}
148
+ its(:to_a) {should == [zip, plus4, delivery_point]}
149
+ end
150
+
151
+ describe '#==' do
152
+ def o1 ; RoutingCode.new(85308, 1465, 1) ; end
153
+ def o2 ; [85308, 1465, 1] ; end
154
+ def o3 ; RoutingCode.new(85308, 1465, 2) ; end
155
+ def o4 ; RoutingCode.new(85308, 1466, 1) ; end
156
+ def o5 ; RoutingCode.new(85309, 1465, 1) ; end
157
+ def o6 ; Object.new ; end
158
+ specify {o1.should == o1}
159
+ specify {o1.should == o2}
160
+ specify {o1.should_not == o3}
161
+ specify {o1.should_not == o4}
162
+ specify {o1.should_not == o5}
163
+ specify {o1.should_not == o6}
164
+ end
165
+
166
+ describe '#validate' do
167
+ let(:routing_code) {RoutingCode.new(nil, nil, nil)}
168
+ let(:long_mailer_id?) {mock 'long_mailer_id?'}
169
+ specify {routing_code.validate(long_mailer_id?)}
170
+ end
171
+
172
+ describe '#shift_and_add_to' do
173
+ let(:routing_code) {RoutingCode.new(85308, 1465, 2)}
174
+ let(:long_mailer_id?) {mock 'long mailer id'}
175
+ specify {routing_code.shift_and_add_to(1, long_mailer_id?).should == 186308246503}
176
+ end
177
+
178
+ end
179
+
180
+ end
@@ -0,0 +1,117 @@
1
+ require File.expand_path('spec_helper', File.dirname(__FILE__))
2
+
3
+ module Imb
4
+
5
+ describe SerialNumber do
6
+
7
+ describe '::coerce' do
8
+
9
+ subject {SerialNumber.coerce(o)}
10
+
11
+ context 'SerialNumber' do
12
+ let(:o) {SerialNumber.new(12)}
13
+ its(:to_i) {should == 12}
14
+ end
15
+
16
+ context 'String' do
17
+ let(:o) {'12'}
18
+ its(:to_i) {should == 12}
19
+ end
20
+
21
+ context 'Integer' do
22
+ let(:o) {12}
23
+ its(:to_i) {should == 12}
24
+ end
25
+
26
+ context 'unknown' do
27
+ let(:o) {Object.new}
28
+ specify do
29
+ expect {
30
+ SerialNumber.coerce(o)
31
+ }.to raise_error ArgumentError, 'Cannot coerce to SerialNumber'
32
+ end
33
+ end
34
+
35
+ end
36
+
37
+ describe '#to_i' do
38
+ let(:value) {23}
39
+ subject {SerialNumber.new(value)}
40
+ its(:to_i) {should == value}
41
+ end
42
+
43
+ describe '#=' do
44
+ def o1 ; SerialNumber.new(1) ; end
45
+ def o2 ; 1 ; end
46
+ def o3 ; SerialNumber.new(2) ; end
47
+ def o4 ; Object.new ; end
48
+ specify {o1.should == o1}
49
+ specify {o1.should == o2}
50
+ specify {o1.should_not == o3}
51
+ specify {o1.should_not == o4}
52
+ end
53
+
54
+ describe '#validate' do
55
+
56
+ def self.is_valid(value)
57
+ context "#{value}" do
58
+ let(:serial_number) {SerialNumber.new(value)}
59
+ specify {serial_number.validate(long_mailer_id?)}
60
+ end
61
+ end
62
+
63
+ def self.is_out_of_range(value)
64
+ context "#{value}" do
65
+ let(:serial_number) {SerialNumber.new(value)}
66
+ specify do
67
+ expect {
68
+ serial_number.validate(long_mailer_id?)
69
+ }.to raise_error ArgumentError, message
70
+ end
71
+ end
72
+ end
73
+
74
+ context 'when long mailer id' do
75
+ let(:long_mailer_id?) {true}
76
+ let(:message) {'Must be 0..999999'}
77
+ is_out_of_range -1
78
+ is_valid 0
79
+ is_valid 999_999
80
+ is_out_of_range 1_000_000
81
+ end
82
+
83
+ context 'when short mailer id' do
84
+ let(:long_mailer_id?) {false}
85
+ let(:message) {'Must be 0..999999999'}
86
+ is_out_of_range -1
87
+ is_valid 0
88
+ is_valid 999_999_999
89
+ is_out_of_range 1_000_000_000
90
+ end
91
+
92
+ end
93
+
94
+ describe '#shift_and_add_to' do
95
+
96
+ let(:serial_number) {SerialNumber.new(value)}
97
+
98
+ def shift_and_add_to
99
+ serial_number.shift_and_add_to(1, long_mailer_id?)
100
+ end
101
+
102
+ context 'long mailer id' do
103
+ let(:value) {999_999}
104
+ let(:long_mailer_id?) {true}
105
+ specify {shift_and_add_to.should == 1_999_999}
106
+ end
107
+
108
+ context 'short mailer id' do
109
+ let(:value) {999_999_999}
110
+ let(:long_mailer_id?) {false}
111
+ specify {shift_and_add_to.should == 1_999_999_999}
112
+ end
113
+ end
114
+
115
+ end
116
+
117
+ end