usps_intelligent_barcode 0.3.1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,7 @@
1
1
  ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- M2FiMDFlNjUzNWIyNGQxODM4MzI2MjlmNzZkMGVlN2YzNTcyZmUxZQ==
5
- data.tar.gz: !binary |-
6
- YTUzZDMyYWQ4NjQ3ZGZlMzEyNDVlZmEzNzdkN2Q2ZDcwNmE0YTk2OA==
2
+ SHA1:
3
+ metadata.gz: cdeac04e1071c96dc596d2bec3e84ece73cf2291
4
+ data.tar.gz: 451155bce2c3da38ce4477268f27edcf74c252d8
7
5
  SHA512:
8
- metadata.gz: !binary |-
9
- MDIxZTQyM2ZiMTVjZjgwOTA3MTU4MmExMDk4ZDI5ODcwNzU5NTFhMDMyZjdi
10
- NzA5NDJhYWY1YWZlNWEyM2Y1OTUyZDA2NWYwYTQ3MDE4NGQ5ZTYyYTYwMTE5
11
- MDZjNDkzNjkyNjVjM2ViMGYzZjVlZTNlZWI1NDVjZTI3NDJmNDU=
12
- data.tar.gz: !binary |-
13
- Zjk3Mzk1OWFiODczMWI1MDE0Njg0N2Q1MjY3YWI5NjJhNDU2NzBhNTQxNWE1
14
- ZDAyMmY0YTM1ZDU2NmE0MGE1NzUzZDZkYzYzODhhNDUzMGU1Yjk3Y2IyMjA0
15
- OTI3MmVmYTM1YTA1ZDQ3ZjUwMzJmZGFlNzZlZTlmZDUyOThjNjg=
6
+ metadata.gz: 330b9a3c194405b63ac36a84cfadff64a3656fe769d0cda0f5edfeaa0478d72611812baae70b1f0e10404f9f421520f0c09f14ae41f0ce172cf1f1e10d538d8d
7
+ data.tar.gz: 7d067d53ea00a44f1334f1791c877b4a57f0e36282419b74addb8499c9d77f7548698a3fab0c4d83782decf0a068995de31775f6fdd6532db75251e82ec8433c
@@ -1,8 +1,9 @@
1
1
  language: ruby
2
2
  rvm:
3
- - rbx-2.5
4
3
  - jruby-1.7
5
4
  - ruby-1.9.3
6
5
  - ruby-2.0
7
6
  - ruby-2.1
8
7
  - ruby-2.2
8
+ - ruby-2.3
9
+ bundler_args: --without development
data/Gemfile CHANGED
@@ -3,11 +3,15 @@ source 'http://rubygems.org'
3
3
  gem 'andand', '~> 1.3'
4
4
  gem 'memoizer', '~> 1.0'
5
5
 
6
- group :development do
7
- gem 'jeweler', '~> 2.0'
6
+ group :test do
7
+ gem 'rake', '~> 11.2'
8
8
  gem 'rspec', '~> 3.3'
9
9
  gem 'rspec-its', '~> 1.0'
10
- gem 'simplecov', '~> 0.10.0'
10
+ end
11
+
12
+ group :development do
13
+ gem 'jeweler', '~> 2.0'
14
+ gem 'rake', '~> 11.2'
15
+ gem 'simplecov'
11
16
  gem 'yard', '~> 0.8.5'
12
- gem 'rake', '~> 10.0'
13
17
  end
@@ -1,74 +1,78 @@
1
1
  GEM
2
2
  remote: http://rubygems.org/
3
3
  specs:
4
- addressable (2.3.8)
4
+ addressable (2.5.0)
5
+ public_suffix (~> 2.0, >= 2.0.2)
5
6
  andand (1.3.3)
6
7
  builder (3.2.2)
7
8
  descendants_tracker (0.0.4)
8
9
  thread_safe (~> 0.3, >= 0.3.1)
9
10
  diff-lcs (1.2.5)
10
11
  docile (1.1.5)
11
- faraday (0.9.1)
12
+ faraday (0.9.2)
12
13
  multipart-post (>= 1.2, < 3)
13
- git (1.2.9.1)
14
- github_api (0.12.3)
14
+ git (1.3.0)
15
+ github_api (0.11.3)
15
16
  addressable (~> 2.3)
16
- descendants_tracker (~> 0.0.4)
17
+ descendants_tracker (~> 0.0.1)
17
18
  faraday (~> 0.8, < 0.10)
18
- hashie (>= 3.3)
19
+ hashie (>= 1.2)
19
20
  multi_json (>= 1.7.5, < 2.0)
20
- nokogiri (~> 1.6.3)
21
+ nokogiri (~> 1.6.0)
21
22
  oauth2
22
- hashie (3.4.2)
23
- highline (1.7.2)
24
- jeweler (2.0.1)
23
+ hashie (3.4.6)
24
+ highline (1.7.8)
25
+ jeweler (2.1.2)
25
26
  builder
26
27
  bundler (>= 1.0)
27
28
  git (>= 1.2.5)
28
- github_api
29
+ github_api (~> 0.11.0)
29
30
  highline (>= 1.6.15)
30
31
  nokogiri (>= 1.5.10)
31
32
  rake
32
33
  rdoc
33
- json (1.8.3)
34
- jwt (1.5.0)
34
+ semver
35
+ json (2.0.2)
36
+ json (2.0.2-java)
37
+ jwt (1.5.6)
35
38
  memoizer (1.0.1)
36
- mini_portile (0.6.2)
37
- multi_json (1.11.1)
39
+ mini_portile2 (2.1.0)
40
+ multi_json (1.12.1)
38
41
  multi_xml (0.5.5)
39
42
  multipart-post (2.0.0)
40
- nokogiri (1.6.6.2)
41
- mini_portile (~> 0.6.0)
42
- nokogiri (1.6.6.2-java)
43
- oauth2 (1.0.0)
43
+ nokogiri (1.6.8.1)
44
+ mini_portile2 (~> 2.1.0)
45
+ nokogiri (1.6.8.1-java)
46
+ oauth2 (1.2.0)
44
47
  faraday (>= 0.8, < 0.10)
45
48
  jwt (~> 1.0)
46
49
  multi_json (~> 1.3)
47
50
  multi_xml (~> 0.5)
48
- rack (~> 1.2)
49
- rack (1.6.1)
50
- rake (10.4.2)
51
- rdoc (4.2.0)
52
- json (~> 1.4)
53
- rspec (3.3.0)
54
- rspec-core (~> 3.3.0)
55
- rspec-expectations (~> 3.3.0)
56
- rspec-mocks (~> 3.3.0)
57
- rspec-core (3.3.0)
58
- rspec-support (~> 3.3.0)
59
- rspec-expectations (3.3.0)
51
+ rack (>= 1.2, < 3)
52
+ public_suffix (2.0.4)
53
+ rack (2.0.1)
54
+ rake (11.3.0)
55
+ rdoc (5.0.0)
56
+ rspec (3.5.0)
57
+ rspec-core (~> 3.5.0)
58
+ rspec-expectations (~> 3.5.0)
59
+ rspec-mocks (~> 3.5.0)
60
+ rspec-core (3.5.4)
61
+ rspec-support (~> 3.5.0)
62
+ rspec-expectations (3.5.0)
60
63
  diff-lcs (>= 1.2.0, < 2.0)
61
- rspec-support (~> 3.3.0)
64
+ rspec-support (~> 3.5.0)
62
65
  rspec-its (1.2.0)
63
66
  rspec-core (>= 3.0.0)
64
67
  rspec-expectations (>= 3.0.0)
65
- rspec-mocks (3.3.0)
68
+ rspec-mocks (3.5.0)
66
69
  diff-lcs (>= 1.2.0, < 2.0)
67
- rspec-support (~> 3.3.0)
68
- rspec-support (3.3.0)
69
- simplecov (0.10.0)
70
+ rspec-support (~> 3.5.0)
71
+ rspec-support (3.5.0)
72
+ semver (1.0.1)
73
+ simplecov (0.12.0)
70
74
  docile (~> 1.1.0)
71
- json (~> 1.8)
75
+ json (>= 1.8, < 3)
72
76
  simplecov-html (~> 0.10.0)
73
77
  simplecov-html (0.10.0)
74
78
  thread_safe (0.3.5)
@@ -83,11 +87,11 @@ DEPENDENCIES
83
87
  andand (~> 1.3)
84
88
  jeweler (~> 2.0)
85
89
  memoizer (~> 1.0)
86
- rake (~> 10.0)
90
+ rake (~> 11.2)
87
91
  rspec (~> 3.3)
88
92
  rspec-its (~> 1.0)
89
- simplecov (~> 0.10.0)
93
+ simplecov
90
94
  yard (~> 0.8.5)
91
95
 
92
96
  BUNDLED WITH
93
- 1.10.3
97
+ 1.13.6
@@ -3,7 +3,7 @@
3
3
  [![Build Status](https://travis-ci.org/wconrad/usps_intelligent_barcode.png)](https://travis-ci.org/wconrad/usps_intelligent_barcode)
4
4
  [![Code Climate](https://codeclimate.com/github/wconrad/usps_intelligent_barcode.png)](https://codeclimate.com/github/wconrad/usps_intelligent_barcode)
5
5
 
6
- USPS-intelligent-barcode is a pure ruby gem to generate a USPS IMB
6
+ usps_intelligent_barcode is a pure ruby gem to generate a USPS IMB
7
7
  (Intelligent Mail Barcode). More specifically, it generates the
8
8
  string of characters you should print using one of the [USPS
9
9
  Intelligent Barcode
@@ -25,7 +25,7 @@ most methods and classes, and eliminated the #draw method.
25
25
  #!/usr/bin/env ruby
26
26
 
27
27
  require 'rubygems'
28
- require 'USPS-intelligent-barcode'
28
+ require 'usps_intelligent_barcode'
29
29
 
30
30
  barcode_id = '01'
31
31
  service_type = '234'
@@ -43,7 +43,9 @@ most methods and classes, and eliminated the #draw method.
43
43
  # STANDARD
44
44
 
45
45
  This gem is based upon standard
46
- [USPS-B-3200G](https://ribbs.usps.gov/intelligentmail_mailpieces/documents/tech_guides/SPUSPSG.pdf)
46
+ [USPS-B-3200H](https://ribbs.usps.gov/intelligentmail_mailpieces/documents/tech_guides/USPSB3200IntelligentMailBarcode4State.pdf),
47
+ which is linked to from [Intelligent Mail Barcode for
48
+ Mailpieces](https://ribbs.usps.gov/index.cfm?page=intellmailmailpieces)
47
49
 
48
50
  # RUBY VERSIONS
49
51
 
@@ -54,6 +56,7 @@ These Ruby versions are supported (these are the rvm platform names):
54
56
  * ruby-2.0
55
57
  * ruby-2.1
56
58
  * ruby-2.2
59
+ * ruby-2.3
57
60
 
58
61
  For ruby-1.8.7 please see the deprecated
59
62
  [USPS-intelligent-barcode](https://rubygems.org/gems/USPS-intelligent-barcode)
data/Rakefile CHANGED
@@ -1,40 +1,16 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  require 'rubygems'
4
-
5
4
  require 'bundler'
6
5
  begin
7
- Bundler.setup(:default, :development)
6
+ Bundler.setup
8
7
  rescue Bundler::BundlerError => e
9
8
  $stderr.puts e.message
10
9
  $stderr.puts "Run `bundle install` to install missing gems"
11
10
  exit e.status_code
12
11
  end
13
- require 'rake'
14
-
15
- require 'jeweler'
16
- Jeweler::Tasks.new do |gem|
17
- # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
18
- gem.name = "usps_intelligent_barcode"
19
- gem.homepage = "http://github.com/wconrad/usps_intelligent_barcode"
20
- gem.license = "MIT"
21
- gem.summary = %Q{Generates a USPS Intelligent Mail Barcode.}
22
- gem.description =
23
- ("A pure Ruby library to generate a USPS Intelligent "\
24
- "Mail barcode. It generates the string of characters "\
25
- "to print with one of the USPS Intelligent Mail barcode "\
26
- "fonts.")
27
- gem.email = "wconrad@yagni.com"
28
- gem.authors = ["Wayne Conrad"]
29
- # dependencies defined in Gemfile
30
- end
31
- Jeweler::RubygemsDotOrgTasks.new
32
-
33
- require 'rspec/core/rake_task'
34
- RSpec::Core::RakeTask.new(:spec)
35
-
36
- task :default => :spec
37
12
 
38
- require 'yard'
39
- YARD::Rake::YardocTask.new do |t|
13
+ glob = File.join(File.dirname(__FILE__), "rake/*.rb")
14
+ Dir[glob].sort.each do |path|
15
+ require path
40
16
  end
@@ -4,9 +4,7 @@ require 'usps_intelligent_barcode/character_position'
4
4
 
5
5
  module Imb
6
6
 
7
- # Maps intelligent barcode "characters" to codes that indicate what
8
- # type of bar to print at each given position.
9
-
7
+ # Maps intelligent barcode "characters" to the actual barcode.
10
8
  class BarMap
11
9
 
12
10
  def initialize
@@ -15,9 +13,11 @@ module Imb
15
13
 
16
14
  # Given an array of intelligent barcode "characters", return an
17
15
  # the symbols for each position.
18
- # @param [[Integer]] characters array of characters
19
- # @return [[BarSymbol]] array of symbols
20
-
16
+ #
17
+ # @param characters [Array<Integer>] array of 13-bit "characters"
18
+ # between 0 and 1364
19
+ # @return [Array<BarSymbol>] array of symbols,
20
+ # e.g. [BarSymbol::TRACKER, BarSymbol::ASCENDER, ...]
21
21
  def symbols(characters)
22
22
  @mapping.map do |bar_position|
23
23
  bar_position.map(characters)
@@ -34,8 +34,10 @@ module Imb
34
34
  mapping_data.map do |descender, ascender|
35
35
  descender_character_position = CharacterPosition.new(*descender)
36
36
  ascender_character_position = CharacterPosition.new(*ascender)
37
- BarPosition.new(descender_character_position,
38
- ascender_character_position)
37
+ BarPosition.new(
38
+ descender_character_position,
39
+ ascender_character_position,
40
+ )
39
41
  end
40
42
  end
41
43
 
@@ -2,14 +2,17 @@ module Imb
2
2
 
3
3
  # @!group Internal
4
4
 
5
- # Represents a position (one line) in the barcode. This class is
6
- # internal and may change.
7
-
5
+ # Represents a position (a vertical bar) in the barcode. This class
6
+ # is internal and may change.
7
+ #
8
+ # Each bar represents two bits, but which two bits it represents is
9
+ # determined by the "Bar to Character Mapping" table in the
10
+ # specification (see Table 22, "Bar to Character Mapping", appendix
11
+ # E) in the specification linked to in the README.
8
12
  class BarPosition
9
13
 
10
- # @param [CharacterPosition] descender_character_position
11
- # @param [CharacterPosition] ascender_character_position
12
-
14
+ # @param descender_character_position [CharacterPosition]
15
+ # @param ascender_character_position [CharacterPosition]
13
16
  def initialize(descender_character_position, ascender_character_position)
14
17
  @descender_character_position = descender_character_position
15
18
  @ascender_character_position = ascender_character_position
@@ -17,12 +20,13 @@ module Imb
17
20
 
18
21
  # Given an array of characters, return a symbol for this
19
22
  # barcode position.
20
- # @param [[Integer]] characters character codes
23
+ # @param characters [Array<Integer>] character codes
21
24
  # @return [BarSymbol] symbol code
22
-
23
25
  def map(characters)
24
- BarSymbol.make(ascender_bit(characters),
25
- descender_bit(characters))
26
+ BarSymbol.make(
27
+ ascender_bit(characters),
28
+ descender_bit(characters),
29
+ )
26
30
  end
27
31
 
28
32
  private
@@ -2,14 +2,34 @@ module Imb
2
2
 
3
3
  # @!group Internal
4
4
 
5
- # Represents a symbol in the barcode.
6
-
5
+ # Represents a symbol in the barcode. A symbol encodes two bits,
6
+ # and is represented as one of four characters to be printed using
7
+ # one of the USPS Intelligent Barcode fonts. Each character, when
8
+ # printed using that font, results in a vertical bar having three
9
+ # part: An ascender, which may be present or missing; a descender,
10
+ # which may be present or missing; and between the ascender and the
11
+ # descender, a tracker which is always present.
12
+ #
13
+ # This chart shows the bits being encoded (ascender bit, then
14
+ # descender bit), the code (ASCII character) used for the barcode
15
+ # font, and an ASCII art repsentation of the bar that is printed by
16
+ # that code:
17
+ #
18
+ # bits: 00 01 10 11
19
+ #
20
+ # ascender: | |
21
+ # tracker: | | | |
22
+ # descender: | |
23
+ #
24
+ # code: T D A F
25
+ # mnemonic: tracker descender ascender full
7
26
  class BarSymbol
8
27
 
9
- # @param [Integer] ascender_bit (0..1)
10
- # @param [Integer] descender_bit (0..1)
28
+ # Return the symbol for a given ascender bit and descender bit.
29
+ #
30
+ # @param ascender_bit [Integer] 0 or 1
31
+ # @param descender_bit [Integer] 0 or 1
11
32
  # @return [BarSymbol]
12
-
13
33
  def self.make(ascender_bit, descender_bit)
14
34
  case [ascender_bit, descender_bit]
15
35
  when [0, 0]
@@ -29,9 +49,12 @@ module Imb
29
49
  # @return [String] the letter for this symbol
30
50
  attr_reader :letter
31
51
 
32
- # @param [Integer] code (0..3)
33
- # @param [String] letter
34
-
52
+ # Make an instance.
53
+ #
54
+ # @param code [Integer] Binary number from 0b00 to 0b11. Bit 1
55
+ # controls the ascender; bit 0 controls the descender.
56
+ # @param letter [String] The character to print in the barcode
57
+ # font.
35
58
  def initialize(code, letter)
36
59
  @code = code
37
60
  @letter = letter
@@ -39,10 +62,17 @@ module Imb
39
62
 
40
63
  private
41
64
 
42
- TRACKER = BarSymbol.new(0, 'T')
43
- DESCENDER = BarSymbol.new(1, 'D')
44
- ASCENDER = BarSymbol.new(2, 'A')
45
- FULL = BarSymbol.new(3, 'F')
65
+ TRACKER = BarSymbol.new(0b00, 'T')
66
+ private_constant :TRACKER
67
+
68
+ DESCENDER = BarSymbol.new(0b01, 'D')
69
+ private_constant :DESCENDER
70
+
71
+ ASCENDER = BarSymbol.new(0b10, 'A')
72
+ private_constant :ASCENDER
73
+
74
+ FULL = BarSymbol.new(0b11, 'F')
75
+ private_constant :FULL
46
76
 
47
77
  end
48
78
 
@@ -1,3 +1,27 @@
1
+ # Represents the table from the spec. that controls how the bits of
2
+ # the "characters" are mapped to barcode positions. Each line of this
3
+ # file represents a single barcode position (or vertical line), with
4
+ # the leftmost position first.
5
+ #
6
+ # Let's decode the first line:
7
+ #
8
+ # [
9
+ # [
10
+ # 7, # descender character index (0..)
11
+ # 2, # descender bit number (0..)
12
+ # ],
13
+ # [
14
+ # 4, # ascender character index (0..)
15
+ # 3, #ascender bit number (0..)
16
+ # ]
17
+ # ]
18
+ #
19
+ # This means that the first barcode position's ascender is controlled
20
+ # by bit 2 of character 7; the descender is controlled by bit 3 of
21
+ # character 4.
22
+ #
23
+ # See spec. section 10.0 ("Appendix E -- Tables for Converting
24
+ # Characters"), Table 22 ("Bar to Character Mapping")
1
25
  ---
2
26
  - [[7, 2], [4, 3]]
3
27
  - [[1, 10], [0, 0]]