Ascii85 0.9.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: dcb6cc7ca3f3ca02c235e5a0d5b908396524e265c9adaaf56c50bc62117c5ee7
4
+ data.tar.gz: c005e9a67ecc1def46d040f06e91cb7984d0cfd43d9729638d60b2fe19d2ab8c
5
+ SHA512:
6
+ metadata.gz: c6fef31cebe36d41eee64ff857e87007b176b262fc4c667666f6360714b9d15274afb192572cf5bba31953f13ecde7c1b1ea60697ebf83a43dc80b35f64d94dd
7
+ data.tar.gz: 2bd0e1367f729cb42d2163e5eeeba540e243138a23cfeb6bf9e2d93d49c80dc12227d65b60bd1db2f6272ab8c9bac19d0aaac37a5e9d48e14dd50d45abb8a749
@@ -0,0 +1,30 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9
4
+ - 2.0
5
+ - 2.1
6
+ - 2.2
7
+ - 2.3
8
+ - 2.4
9
+ - 2.5
10
+ - 2.6
11
+ - 2.7
12
+ - ruby-head
13
+ - jruby
14
+ - truffleruby
15
+ env:
16
+ - RUBYOPT="--enable-frozen-string-literal"
17
+ - RUBYOPT=""
18
+ matrix:
19
+ exclude:
20
+ - rvm: 1.9
21
+ env: RUBYOPT="--enable-frozen-string-literal"
22
+ - rvm: 2.0
23
+ env: RUBYOPT="--enable-frozen-string-literal"
24
+ - rvm: 2.1
25
+ env: RUBYOPT="--enable-frozen-string-literal"
26
+ - rvm: 2.2
27
+ env: RUBYOPT="--enable-frozen-string-literal"
28
+ # bundler did not support this back then
29
+ - rvm: 2.3
30
+ env: RUBYOPT="--enable-frozen-string-literal"
@@ -0,0 +1,25 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "Ascii85/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "Ascii85"
7
+ s.version = Ascii85::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.author = "Johannes Holzfuß"
10
+ s.email = "johannes@holzfuss.name"
11
+ s.license = 'MIT'
12
+ s.homepage = "https://github.com/DataWraith/ascii85gem/"
13
+ s.summary = %q{Ascii85 encoder/decoder}
14
+ s.description = %q{Ascii85 provides methods to encode/decode Adobe's binary-to-text encoding of the same name.}
15
+
16
+ s.add_development_dependency "bundler", ">= 1.0.0"
17
+ s.add_development_dependency "minitest",">= 2.6.0"
18
+ s.add_development_dependency "rake", ">= 0.9.2"
19
+
20
+ s.files = `git ls-files`.split("\n") - ['.gitignore']
21
+ s.test_files = `git ls-files -- spec/*`.split("\n")
22
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
23
+ s.require_paths = ["lib"]
24
+ s.extra_rdoc_files = ['README.md', 'LICENSE']
25
+ end
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in Ascii85.gemspec
4
+ gemspec
@@ -1,3 +1,30 @@
1
+ === 1.1.0 / 2020-11-11
2
+
3
+ * Make use of frozen_string_literal
4
+ * Update tests to use newer minitest syntax
5
+
6
+ === 1.0.3 / 2018-01-25
7
+
8
+ * Updated the gem's metadata
9
+
10
+ === 1.0.2 / 2012-09-16
11
+
12
+ * Changed test runner from RSpec to MiniSpec
13
+ * Support for rubygems-test
14
+ * Minor changes to make packaging easier
15
+
16
+ === 1.0.1 / 2011-05-05
17
+
18
+ * Removed hoe dependency in favor of bundler
19
+ * Minor corrections in the documentation
20
+
21
+ === 1.0.0 / 2009-12-25
22
+
23
+ * 2 major enhancements
24
+
25
+ * Ruby 1.9 compatibility
26
+ * Added command-line en- and decoder
27
+
1
28
  === 0.9.0 / 2009-02-17
2
29
 
3
30
  * 1 major enhancement
data/LICENSE ADDED
@@ -0,0 +1,19 @@
1
+ Copyright (c) 2009 Johannes Holzfuß
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
4
+ this software and associated documentation files (the "Software"), to deal in
5
+ the Software without restriction, including without limitation the rights to
6
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
7
+ of the Software, and to permit persons to whom the Software is furnished to do
8
+ so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in all
11
+ copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
16
+ THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
+ SOFTWARE.
@@ -0,0 +1,69 @@
1
+ **Status**: This project is in maintenance mode. I will not develop new features, but I will address Issues and Pull Requests.
2
+
3
+ # Ascii85
4
+
5
+ [![Build Status](https://travis-ci.org/DataWraith/ascii85gem.svg?branch=master)](https://travis-ci.org/DataWraith/ascii85gem)
6
+
7
+ ## Description
8
+
9
+ Ascii85 is a simple gem that provides methods for encoding/decoding Adobe's
10
+ binary-to-text encoding of the same name.
11
+
12
+ See http://www.adobe.com/products/postscript/pdfs/PLRM.pdf page 131 and
13
+ http://en.wikipedia.org/wiki/Ascii85 for more information about the format.
14
+
15
+
16
+ ## Installation
17
+
18
+ `sudo gem install Ascii85`
19
+
20
+
21
+ ## Usage
22
+
23
+ ```
24
+ require 'rubygems'
25
+ require 'ascii85'
26
+
27
+ Ascii85.encode("Ruby")
28
+ => "<~;KZGo~>"
29
+
30
+ Ascii85.decode("<~;KZGo~>")
31
+ => "Ruby"
32
+ ```
33
+
34
+ In addition, Ascii85.encode can take a second parameter that specifies the
35
+ length of the returned lines. The default is 80; use `false` for unlimited.
36
+
37
+ Ascii85.decode expects the input to be enclosed in <~ and ~> — it
38
+ ignores everything outside of these. The output of Ascii85.decode
39
+ will have the ASCII-8BIT encoding, so in Ruby 1.9 you may have to use
40
+ <tt>String#force_encoding</tt> to correct the encoding.
41
+
42
+
43
+ ## Command-line utility
44
+
45
+ This gem includes `ascii85`, a command-line utility modeled after `base64` from
46
+ the GNU coreutils. It can be used to encode/decode Ascii85 directly from the
47
+ command-line:
48
+
49
+ ```
50
+ Usage: ascii85 [OPTIONS] [FILE]
51
+ Encodes or decodes FILE or STDIN using Ascii85 and writes to STDOUT.
52
+ -w, --wrap COLUMN Wrap lines at COLUMN. Default is 80, use 0 for no wrapping
53
+ -d, --decode Decode the input
54
+ -h, --help Display this help and exit
55
+ --version Output version information
56
+ ```
57
+
58
+
59
+ ## Contributors
60
+
61
+ Thank you for your contribution!
62
+
63
+ * [@aliismayilov](https://github.com/aliismayilov) contributed frozen String handling
64
+
65
+
66
+ ## License
67
+
68
+ Ascii85 is distributed under the MIT License. See the accompanying LICENSE file
69
+ for details.
data/Rakefile CHANGED
@@ -1,43 +1,12 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
1
3
 
2
- require 'rubygems'
4
+ require 'rake/testtask'
3
5
 
4
- require 'hoe'
5
- require 'rake'
6
- require 'rake/clean'
7
- require 'rake/rdoctask'
8
- require 'spec/rake/spectask'
9
-
10
- require 'lib/ascii85.rb'
11
-
12
-
13
- # rspec
14
-
15
- desc "Run specs"
16
- Spec::Rake::SpecTask.new do |t|
17
- t.spec_opts = ["--color"]
18
- end
19
-
20
- desc "Show specdoc"
21
- Spec::Rake::SpecTask.new('specdoc') do |t|
22
- t.spec_opts = ["--color", "--format=specdoc"]
23
- end
24
-
25
-
26
- # Hoe
27
-
28
- Hoe.new('Ascii85', Ascii85::VERSION) do |p|
29
- p.author = "Johannes Holzfuß"
30
- p.email = "Drangon@gmx.de"
31
- p.summary = "Ascii85 encoder/decoder"
32
-
33
- p.description = "Ascii85 provides methods to encode/decode Adobe's binary-to-text encoding of the same name."
34
-
35
- p.remote_rdoc_dir = ''
36
-
37
- p.testlib = "spec"
38
- p.test_globs = "spec/ascii85_spec.rb"
6
+ Rake::TestTask.new do |t|
7
+ t.test_files = FileList['spec/**/*_spec.rb']
39
8
  end
40
9
 
41
-
42
- # default task is spec
43
- task :default => :spec
10
+ task :specs => :test
11
+ task :tests => :test
12
+ task :default => :test
@@ -0,0 +1,80 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: utf-8
3
+
4
+ #
5
+ # A simple command-line tool to de- and encode Ascii85, modeled after `base64`
6
+ # from the GNU Coreutils.
7
+ #
8
+
9
+
10
+ require "optparse"
11
+ require File.join(File.dirname(__FILE__), '..', 'lib', 'ascii85')
12
+
13
+ @options = {
14
+ :wrap => 80,
15
+ :decode => false
16
+ }
17
+
18
+ ARGV.options do |opts|
19
+ opts.banner = "Usage: #{File.basename($PROGRAM_NAME)} [OPTIONS] [FILE]\n" +
20
+ "Encodes or decodes FILE or STDIN using Ascii85 and writes to STDOUT."
21
+
22
+
23
+ opts.on( "-w", "--wrap COLUMN", Integer,
24
+ "Wrap lines at COLUMN. Default is 80, use 0 for no wrapping") do |opt|
25
+
26
+ @options[:wrap] = opt.abs
27
+ @options[:wrap] = false if opt.zero?
28
+ end
29
+
30
+ opts.on( "-d", "--decode", "Decode the input") do
31
+ @options[:decode] = true
32
+ end
33
+
34
+ opts.on( "-h", "--help", "Display this help and exit") do
35
+ puts opts
36
+ exit
37
+ end
38
+
39
+ opts.on( "--version", "Output version information") do |opt|
40
+ puts "Ascii85 v#{Ascii85::VERSION},\nwritten by Johannes Holzfuß"
41
+ exit
42
+ end
43
+
44
+ remaining_args = opts.parse!
45
+
46
+ case remaining_args.size
47
+ when 0
48
+ @options[:file] = '-'
49
+ when 1
50
+ @options[:file] = remaining_args.first
51
+ else
52
+ abort "Superfluous operand(s): \"#{remaining_args.join('", "')}\""
53
+ end
54
+ end
55
+
56
+ if @options[:file] == '-'
57
+ @input = $stdin.binmode.read
58
+ else
59
+ unless File.exists?(@options[:file])
60
+ abort "File not found: \"#{@options[:file]}\""
61
+ end
62
+
63
+ unless File.readable_real?(@options[:file])
64
+ abort "File is not readable: \"#{@options[:file]}\""
65
+ end
66
+
67
+ File.open(@options[:file], 'rb') do |f|
68
+ @input = f.read
69
+ end
70
+ end
71
+
72
+ if @options[:decode]
73
+ begin
74
+ print Ascii85.decode(@input)
75
+ rescue Ascii85::DecodingError => error
76
+ abort "Decoding Error: #{error.message.to_s}"
77
+ end
78
+ else
79
+ print Ascii85.encode(@input, @options[:wrap])
80
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ascii85
4
+ VERSION = "1.1.0"
5
+ end
@@ -1,57 +1,66 @@
1
+ # encoding: utf-8
2
+ # frozen_string_literal: true
3
+
4
+
1
5
  #
2
- # Ascii85 is an implementation of Adobe's binary-to-text encoding of the same
3
- # name in pure Ruby.
6
+ # Ascii85 is an implementation of Adobe's binary-to-text encoding of the
7
+ # same name in pure Ruby.
4
8
  #
5
- # See http://www.adobe.com/products/postscript/pdfs/PLRM.pdf page 131 and
6
- # http://en.wikipedia.org/wiki/Ascii85 for more information about the format.
9
+ # See http://www.adobe.com/products/postscript/pdfs/PLRM.pdf page 131
10
+ # and http://en.wikipedia.org/wiki/Ascii85 for more information about
11
+ # the format.
7
12
  #
8
- # Author:: Johannes Holzfuß (Drangon@gmx.de)
9
- # License:: Distributed under the MIT License (see README.txt)
13
+ # Author:: Johannes Holzfuß (johannes@holzfuss.name)
14
+ # License:: Distributed under the MIT License (see LICENSE file)
10
15
  #
11
16
 
12
17
 
13
18
  module Ascii85
14
- # The gem version number
15
- VERSION = '0.9.0' # :nodoc:
16
-
17
19
  #
18
- # Encodes the given String as Ascii85.
20
+ # Encodes the bytes of the given String as Ascii85.
19
21
  #
20
- # If +wrap_lines+ evaluates to +false+, the output will be returned as a
21
- # single long line. Otherwise #encode formats the output into lines of
22
- # length +wrap_lines+ (minimum is 2).
22
+ # If +wrap_lines+ evaluates to +false+, the output will be returned as
23
+ # a single long line. Otherwise #encode formats the output into lines
24
+ # of length +wrap_lines+ (minimum is 2).
23
25
  #
24
- # Ascii85::encode("Ruby")
26
+ # Ascii85.encode("Ruby")
25
27
  # => <~;KZGo~>
26
28
  #
27
- # Ascii85::encode("Supercalifragilisticexpialidocious", 15)
29
+ # Ascii85.encode("Supercalifragilisticexpialidocious", 15)
28
30
  # => <~;g!%jEarNoBkD
29
31
  # BoB5)0rF*),+AU&
30
32
  # 0.@;KXgDe!L"F`R
31
33
  # ~>
32
34
  #
33
- # Ascii85::encode("Supercalifragilisticexpialidocious", false)
35
+ # Ascii85.encode("Supercalifragilisticexpialidocious", false)
34
36
  # => <~;g!%jEarNoBkDBoB5)0rF*),+AU&0.@;KXgDe!L"F`R~>
35
37
  #
36
38
  #
37
39
  def self.encode(str, wrap_lines = 80)
40
+ to_encode = str.to_s
41
+ return '' if to_encode.empty?
38
42
 
39
- return '' if str.to_s.empty?
43
+ # Deal with multi-byte encodings
44
+ if to_encode.respond_to?(:bytesize)
45
+ input_size = to_encode.bytesize
46
+ else
47
+ input_size = to_encode.size
48
+ end
40
49
 
41
50
  # Compute number of \0s to pad the message with (0..3)
42
- padding_length = (-str.to_s.length) % 4
51
+ padding_length = (-input_size) % 4
43
52
 
44
53
  # Extract big-endian integers
45
- tuples = (str.to_s + ("\0" * padding_length)).unpack('N*')
54
+ tuples = (to_encode + ("\0" * padding_length)).unpack('N*')
46
55
 
47
56
  # Encode
48
57
  tuples.map! do |tuple|
49
58
  if tuple == 0
50
59
  'z'
51
60
  else
52
- tmp = ""
61
+ tmp = String.new
53
62
  5.times do
54
- tmp += ((tuple % 85) + 33).chr
63
+ tmp << ((tuple % 85) + 33).chr
55
64
  tuple /= 85
56
65
  end
57
66
  tmp.reverse
@@ -66,28 +75,26 @@ module Ascii85
66
75
  # Cut off the padding
67
76
  tuples[-1] = tuples[-1][0..(4 - padding_length)]
68
77
 
69
- # Add start-marker and join into a String
70
- result = '<~' + tuples.join
71
-
72
- # If we don't need to wrap the lines to a certain length, add ~> and return
78
+ # If we don't need to wrap the lines, add delimiters and return
73
79
  if (!wrap_lines)
74
- return result + '~>'
80
+ return '<~' + tuples.join + '~>'
75
81
  end
76
82
 
77
83
  # Otherwise we wrap the lines
78
-
79
84
  line_length = [2, wrap_lines.to_i].max
80
85
 
81
86
  wrapped = []
82
- 0.step(result.length, line_length) do |index|
83
- wrapped << result.slice(index, line_length)
87
+ to_wrap = '<~' + tuples.join
88
+
89
+ 0.step(to_wrap.length, line_length) do |index|
90
+ wrapped << to_wrap.slice(index, line_length)
84
91
  end
85
92
 
86
- # Add end-marker -- on a new line if necessary
93
+ # Add end-marker on a new line if necessary
87
94
  if (wrapped.last.length + 2) > line_length
88
95
  wrapped << '~>'
89
96
  else
90
- wrapped[-1] += '~>'
97
+ wrapped[-1] << '~>'
91
98
  end
92
99
 
93
100
  return wrapped.join("\n")
@@ -96,43 +103,55 @@ module Ascii85
96
103
  #
97
104
  # Searches through +str+ and decodes the _first_ Ascii85-String found.
98
105
  #
99
- # #decode expects an Ascii85-encoded String enclosed in <~ and ~>. It will
100
- # ignore all characters outside these markers.
106
+ # #decode expects an Ascii85-encoded String enclosed in <~ and ~> it will
107
+ # ignore all characters outside these markers. The returned strings are always
108
+ # encoded as ASCII-8BIT.
101
109
  #
102
- # Ascii85::decode("<~;KZGo~>")
110
+ # Ascii85.decode("<~;KZGo~>")
103
111
  # => "Ruby"
104
112
  #
105
- # Ascii85::decode("Foo<~;KZGo~>Bar<~;KZGo~>Baz")
113
+ # Ascii85.decode("Foo<~;KZGo~>Bar<~;KZGo~>Baz")
106
114
  # => "Ruby"
107
115
  #
108
- # Ascii85::decode("No markers")
116
+ # Ascii85.decode("No markers")
109
117
  # => ""
110
118
  #
111
119
  # #decode will raise Ascii85::DecodingError when malformed input is
112
120
  # encountered.
113
121
  #
114
122
  def self.decode(str)
123
+ input = str.to_s
124
+
125
+ opening_delim = '<~'
126
+ closing_delim = '~>'
127
+
128
+ # Make sure the delimiter strings have the correct encoding.
129
+ #
130
+ # Although I don't think it likely, this may raise encoding
131
+ # errors if an especially exotic input encoding is introduced.
132
+ # As of Ruby 1.9.2 all non-dummy encodings work fine though.
133
+ #
134
+ if opening_delim.respond_to?(:encode)
135
+ opening_delim = opening_delim.encode(input.encoding)
136
+ closing_delim = closing_delim.encode(input.encoding)
137
+ end
115
138
 
116
- # Find the Ascii85 encoded data between <~ and ~>
117
- input = str.to_s.match(/<~.*?~>/mn)
118
-
119
- return '' if input.nil?
120
-
121
- # Remove the delimiters
122
- input = input.to_s[2..-3]
139
+ # Get the positions of the opening/closing delimiters. If there is
140
+ # no pair of opening/closing delimiters, return the empty string.
141
+ (start_pos = input.index(opening_delim)) or return ''
142
+ (end_pos = input.index(closing_delim, start_pos + 2)) or return ''
123
143
 
124
- return '' if input.empty?
144
+ # Get the string inside the delimiter-pair
145
+ input = input[(start_pos + 2)...end_pos]
125
146
 
126
147
  # Decode
148
+ word = 0
149
+ count = 0
127
150
  result = []
128
151
 
129
- count = 0
130
- word = 0
131
-
132
152
  input.each_byte do |c|
133
-
134
153
  case c.chr
135
- when /[ \t\r\n\f\0]/
154
+ when " ", "\t", "\r", "\n", "\f", "\0"
136
155
  # Ignore whitespace
137
156
  next
138
157
 
@@ -146,18 +165,19 @@ module Ascii85
146
165
 
147
166
  when '!'..'u'
148
167
  # Decode 5 characters into a 4-byte word
149
- word += (c - 33) * 85**(4 - count)
168
+ word += (c - 33) * 85**(4 - count)
150
169
  count += 1
151
170
 
152
171
  if count == 5
153
172
 
154
- if word >= 2**32
173
+ if word > 0xffffffff
155
174
  raise(Ascii85::DecodingError,
156
175
  "Invalid Ascii85 5-tuple (#{word} >= 2**32)")
157
176
  end
158
177
 
159
178
  result << word
160
- word = 0
179
+
180
+ word = 0
161
181
  count = 0
162
182
  end
163
183
 
@@ -165,7 +185,6 @@ module Ascii85
165
185
  raise(Ascii85::DecodingError,
166
186
  "Illegal character inside Ascii85: #{c.chr.dump}")
167
187
  end
168
-
169
188
  end
170
189
 
171
190
  # Convert result into a String
@@ -180,18 +199,18 @@ module Ascii85
180
199
  end
181
200
 
182
201
  count -= 1
183
- word += 85**(4 - count)
202
+ word += 85**(4 - count)
184
203
 
185
- result += ((word >> 24) & 255).chr if count >= 1
186
- result += ((word >> 16) & 255).chr if count >= 2
187
- result += ((word >> 8) & 255).chr if count == 3
204
+ result << ((word >> 24) & 255).chr if count >= 1
205
+ result << ((word >> 16) & 255).chr if count >= 2
206
+ result << ((word >> 8) & 255).chr if count == 3
188
207
  end
189
208
 
190
209
  return result
191
210
  end
192
211
 
193
212
  #
194
- # This error is raised when Ascii85::decode encounters one of the following
213
+ # This error is raised when Ascii85.decode encounters one of the following
195
214
  # problems in the input:
196
215
  #
197
216
  # * An invalid character. Valid characters are '!'..'u' and 'z'.
@@ -201,5 +220,4 @@ module Ascii85
201
220
  # at least two characters.
202
221
  #
203
222
  class DecodingError < StandardError; end
204
-
205
223
  end
@@ -0,0 +1,195 @@
1
+ # encoding: utf-8
2
+
3
+ require 'rubygems'
4
+ require 'minitest/autorun'
5
+
6
+ # Require implementation
7
+ require File.expand_path('../../../lib/ascii85', __FILE__)
8
+
9
+ describe Ascii85 do
10
+ UNSUPPORTED_MSG = "This version of Ruby does not support encodings"
11
+
12
+ TEST_CASES = {
13
+ "" => "",
14
+ " " => "<~+9~>",
15
+
16
+ "\0" * 1 => "<~!!~>",
17
+ "\0" * 2 => "<~!!!~>",
18
+ "\0" * 3 => "<~!!!!~>",
19
+ "\0" * 4 => "<~z~>",
20
+ "\0" * 5 => "<~z!!~>",
21
+ "A\0\0\0\0" => "<~5l^lb!!~>", # No z-abbreviation!
22
+
23
+ "A" => "<~5l~>",
24
+ "AB" => "<~5sb~>",
25
+ "ABC" => "<~5sdp~>",
26
+ "ABCD" => "<~5sdq,~>",
27
+ "ABCDE" => "<~5sdq,70~>",
28
+ "ABCDEF" => "<~5sdq,77I~>",
29
+ "ABCDEFG" => "<~5sdq,77Kc~>",
30
+ "ABCDEFGH" => "<~5sdq,77Kd<~>",
31
+ "ABCDEFGHI" => "<~5sdq,77Kd<8H~>",
32
+ "Ascii85" => "<~6$$OMBfIs~>",
33
+
34
+ 'Antidisestablishmentarianism' => '<~6#LdYA8-*rF*(i"Ch[s(D.RU,@<-\'jDJ=0/~>',
35
+
36
+ # Dōmo arigatō, Mr. Roboto (according to Wikipedia)
37
+ 'どうもありがとうミスターロボット' =>
38
+ "<~j+42iJVN3:K&_E6j+<0KJW/W?W8iG`j+EuaK\"9on^Z0sZj+FJoK:LtSKB%T?~>",
39
+
40
+ [Math::PI].pack('G') => "<~5RAV2<(&;T~>",
41
+ [Math::E].pack('G') => "<~5R\"n0M\\K6,~>"
42
+ }
43
+
44
+ it "#decode should be the inverse of #encode" do
45
+ # Generate a random string
46
+ test_str = String.new
47
+ (1 + rand(255)).times do
48
+ test_str << rand(256).chr
49
+ end
50
+
51
+ encoded = Ascii85.encode(test_str)
52
+ decoded = Ascii85.decode(encoded)
53
+
54
+ assert_equal decoded, test_str
55
+ end
56
+
57
+ describe "#encode" do
58
+ it "should encode all specified test-cases correctly" do
59
+ TEST_CASES.each_pair do |input, encoded|
60
+ assert_equal Ascii85.encode(input), encoded
61
+ end
62
+ end
63
+
64
+ it "should encode Strings in different encodings correctly" do
65
+ unless String.new.respond_to?(:encoding)
66
+ skip(UNSUPPORTED_MSG)
67
+ end
68
+
69
+ input_EUC_JP = 'どうもありがとうミスターロボット'.encode('EUC-JP')
70
+ input_binary = input_EUC_JP.force_encoding('ASCII-8BIT')
71
+
72
+ assert_equal Ascii85.encode(input_EUC_JP), Ascii85.encode(input_binary)
73
+ end
74
+
75
+ it "should produce output lines no longer than specified" do
76
+ test_str = '0123456789' * 30
77
+
78
+ #
79
+ # No wrap
80
+ #
81
+ assert_equal Ascii85.encode(test_str, false).count("\n"), 0
82
+
83
+ #
84
+ # x characters per line, except for the last one
85
+ #
86
+ x = 2 + rand(255) # < test_str.length
87
+ encoded = Ascii85.encode(test_str, x)
88
+
89
+ # Determine the length of all lines
90
+ count_arr = []
91
+ encoded.each_line do |line|
92
+ count_arr << line.chomp.length
93
+ end
94
+
95
+ # The last line is allowed to be shorter than x, so remove it
96
+ count_arr.pop if count_arr.last <= x
97
+
98
+ # If the end-marker is on a line of its own, the next-to-last line is
99
+ # allowed to be shorter than specified by exactly one character
100
+ count_arr.pop if (encoded[-3].chr =~ /[\r\n]/) and (count_arr.last == x-1)
101
+
102
+ # Remove all line-lengths that are of length x from count_arr
103
+ count_arr.delete_if { |len| len == x }
104
+
105
+ # Now count_arr should be empty
106
+ assert_empty count_arr
107
+ end
108
+
109
+ it "should not split the end-marker to achieve correct line length" do
110
+ assert_equal Ascii85.encode("\0" * 4, 4), "<~z\n~>"
111
+ end
112
+ end
113
+
114
+ describe "#decode" do
115
+ it "should decode all specified test-cases correctly" do
116
+ TEST_CASES.each_pair do |decoded, input|
117
+ if String.new.respond_to?(:encoding)
118
+ assert_equal Ascii85.decode(input), decoded.dup.force_encoding('ASCII-8BIT')
119
+ else
120
+ assert_equal Ascii85.decode(input), decoded
121
+ end
122
+ end
123
+ end
124
+
125
+ it "should accept valid input in encodings other than the default" do
126
+ unless String.new.respond_to?(:encoding)
127
+ skip(UNSUPPORTED_MSG)
128
+ end
129
+
130
+ input = "Ragnarök τέχνη русский язык I ♥ Ruby"
131
+ input_ascii85 = Ascii85.encode(input)
132
+
133
+ # Try to encode input_ascii85 in all possible encodings and see if we
134
+ # do the right thing in #decode.
135
+ Encoding.list.each do |encoding|
136
+ next if encoding.dummy?
137
+ next unless encoding.ascii_compatible?
138
+
139
+ # CP949 is a Microsoft Codepage for Korean, which apparently does not
140
+ # include a backslash, even though #ascii_compatible? returns true. This
141
+ # leads to an Ascii85::DecodingError, so we simply skip the encoding.
142
+ next if encoding.name == "CP949"
143
+
144
+ begin
145
+ to_test = input_ascii85.encode(encoding)
146
+ assert_equal Ascii85.decode(to_test).force_encoding('UTF-8'), input
147
+ rescue Encoding::ConverterNotFoundError
148
+ # Ignore this encoding
149
+ end
150
+ end
151
+ end
152
+
153
+ it "should only process data within delimiters" do
154
+ assert_empty Ascii85.decode("<~~>")
155
+ assert_empty Ascii85.decode("Doesn't contain delimiters")
156
+ assert_empty Ascii85.decode("Mismatched ~> delimiters 1")
157
+ assert_empty Ascii85.decode("Mismatched <~ delimiters 2")
158
+ assert_empty Ascii85.decode("Mismatched ~><~ delimiters 3")
159
+
160
+ assert_equal Ascii85.decode("<~;KZGo~><~z~>"), "Ruby"
161
+ assert_equal Ascii85.decode("FooBar<~z~>BazQux"), "\0\0\0\0"
162
+ end
163
+
164
+ it "should ignore whitespace" do
165
+ decoded = Ascii85.decode("<~6 #LdYA\r\08\n \n\n- *rF*(i\"Ch[s \t(D.RU,@ <-\'jDJ=0\f/~>")
166
+ assert_equal decoded, 'Antidisestablishmentarianism'
167
+ end
168
+
169
+ it "should return ASCII-8BIT encoded strings" do
170
+ unless String.new.respond_to?(:encoding)
171
+ skip(UNSUPPORTED_MSG)
172
+ end
173
+
174
+ assert_equal Ascii85.decode("<~;KZGo~>").encoding.name, "ASCII-8BIT"
175
+ end
176
+
177
+ describe "Error conditions" do
178
+ it "should raise DecodingError if it encounters a word >= 2**32" do
179
+ assert_raises(Ascii85::DecodingError) { Ascii85.decode('<~s8W-#~>') }
180
+ end
181
+
182
+ it "should raise DecodingError if it encounters an invalid character" do
183
+ assert_raises(Ascii85::DecodingError) { Ascii85.decode('<~!!y!!~>') }
184
+ end
185
+
186
+ it "should raise DecodingError if the last tuple consists of a single character" do
187
+ assert_raises(Ascii85::DecodingError) { Ascii85.decode('<~!~>') }
188
+ end
189
+
190
+ it "should raise DecodingError if a z is found inside a 5-tuple" do
191
+ assert_raises(Ascii85::DecodingError) { Ascii85.decode('<~!!z!!~>') }
192
+ end
193
+ end
194
+ end
195
+ end
metadata CHANGED
@@ -1,90 +1,100 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: Ascii85
3
- version: !ruby/object:Gem::Version
4
- version: 0.9.0
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.1.0
5
5
  platform: ruby
6
- authors:
7
- - "Johannes Holzfu\xC3\x9F"
6
+ authors:
7
+ - Johannes Holzfuß
8
8
  autorequire:
9
9
  bindir: bin
10
- cert_chain:
11
- - |
12
- -----BEGIN CERTIFICATE-----
13
- MIIDKjCCAhKgAwIBAgIBADANBgkqhkiG9w0BAQUFADA7MRAwDgYDVQQDDAdfcmFu
14
- Z29uMRMwEQYKCZImiZPyLGQBGRYDZ214MRIwEAYKCZImiZPyLGQBGRYCZGUwHhcN
15
- MDkwMjE0MTgxNDM5WhcNMTAwMjE0MTgxNDM5WjA7MRAwDgYDVQQDDAdfcmFuZ29u
16
- MRMwEQYKCZImiZPyLGQBGRYDZ214MRIwEAYKCZImiZPyLGQBGRYCZGUwggEiMA0G
17
- CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa7HRW1pPBbx8k9GLOzYBwHNLAOvHc
18
- kWfq5E99plLhxKobF7xSValm2csTPQqF8549JJUADGrmeSyFx4z241JtDATjFdYI
19
- 5LaBXqvxR/c6BfPqPOIuZqc6o1VEpMEVsgKqcL0wjmOaNXMDL7vWj2+LyizWqMXJ
20
- Y2Hj6GlR6kYzoUyOoAPO+FG363YT++tFvOaOmba314dL40r/Spc730gr1utS8pHA
21
- t8Gl+Z0EC5gmcUvfDT2sVAF8k9qQhGGqOuOM2HDP+ZrJ368UJznVBxp9YhUveGc2
22
- MPXvntkrN2XLfGjV2Tr418v7OBP+0IgnZVBM8O7q+iMJmuv/yt2M53H/AgMBAAGj
23
- OTA3MAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQWBBT83GfQpOoJZm8B
24
- gY6lweCTOsu0QTANBgkqhkiG9w0BAQUFAAOCAQEAAT33NPbPZVy3tgPsl1TicU9q
25
- eBen2WkXfrCO8jP1ivuFQqMHl5b+MpG2LIwEB45QLLnoXmcW+C4ihGdkYG078uor
26
- ZskHRETlHJ791l6PyGw5j1oFSwbeYwYIFBWcRrq0KdcZO4CZb7rln2S06ZJWQIMg
27
- 930O6/WuJyRQLr1PaTJcUGoHUC9cd4CE7ARuck3V38vNR4azjAznCa01mgSkp9UQ
28
- xPVAMuP9qOp6+OFiuL7DDCHgGI52vDFlUSU+hMcsSSDbYSFcilSPlZ3WLTlOhM4d
29
- 5FGhYN16QZS8VKLApBtxxP9XmwFASMyJLNizTN2q6hCCy/MjoTzHWzodPaWm0Q==
30
- -----END CERTIFICATE-----
31
-
32
- date: 2009-02-17 00:00:00 +01:00
33
- default_executable:
34
- dependencies:
35
- - !ruby/object:Gem::Dependency
36
- name: hoe
10
+ cert_chain: []
11
+ date: 2020-11-12 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 1.0.0
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 1.0.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: minitest
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 2.6.0
37
34
  type: :development
38
- version_requirement:
39
- version_requirements: !ruby/object:Gem::Requirement
40
- requirements:
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
41
38
  - - ">="
42
- - !ruby/object:Gem::Version
43
- version: 1.8.3
44
- version:
45
- description: Ascii85 provides methods to encode/decode Adobe's binary-to-text encoding of the same name.
46
- email: Drangon@gmx.de
47
- executables: []
48
-
39
+ - !ruby/object:Gem::Version
40
+ version: 2.6.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: 0.9.2
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: 0.9.2
55
+ description: Ascii85 provides methods to encode/decode Adobe's binary-to-text encoding
56
+ of the same name.
57
+ email: johannes@holzfuss.name
58
+ executables:
59
+ - ascii85
49
60
  extensions: []
50
-
51
- extra_rdoc_files:
52
- - History.txt
53
- - Manifest.txt
54
- - README.txt
55
- files:
61
+ extra_rdoc_files:
62
+ - README.md
63
+ - LICENSE
64
+ files:
65
+ - ".travis.yml"
66
+ - Ascii85.gemspec
67
+ - Gemfile
56
68
  - History.txt
57
- - Manifest.txt
58
- - README.txt
69
+ - LICENSE
70
+ - README.md
59
71
  - Rakefile
72
+ - bin/ascii85
73
+ - lib/Ascii85/version.rb
60
74
  - lib/ascii85.rb
61
- - spec/ascii85_spec.rb
62
- has_rdoc: true
63
- homepage: http://ascii85.rubyforge.org
75
+ - spec/lib/ascii85_spec.rb
76
+ homepage: https://github.com/DataWraith/ascii85gem/
77
+ licenses:
78
+ - MIT
79
+ metadata: {}
64
80
  post_install_message:
65
- rdoc_options:
66
- - --main
67
- - README.txt
68
- require_paths:
81
+ rdoc_options: []
82
+ require_paths:
69
83
  - lib
70
- required_ruby_version: !ruby/object:Gem::Requirement
71
- requirements:
84
+ required_ruby_version: !ruby/object:Gem::Requirement
85
+ requirements:
72
86
  - - ">="
73
- - !ruby/object:Gem::Version
74
- version: "0"
75
- version:
76
- required_rubygems_version: !ruby/object:Gem::Requirement
77
- requirements:
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ required_rubygems_version: !ruby/object:Gem::Requirement
90
+ requirements:
78
91
  - - ">="
79
- - !ruby/object:Gem::Version
80
- version: "0"
81
- version:
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
82
94
  requirements: []
83
-
84
- rubyforge_project: ascii85
85
- rubygems_version: 1.3.1
95
+ rubygems_version: 3.1.4
86
96
  signing_key:
87
- specification_version: 2
97
+ specification_version: 4
88
98
  summary: Ascii85 encoder/decoder
89
- test_files:
90
- - spec/ascii85_spec.rb
99
+ test_files:
100
+ - spec/lib/ascii85_spec.rb
data.tar.gz.sig DELETED
Binary file
@@ -1,6 +0,0 @@
1
- History.txt
2
- Manifest.txt
3
- README.txt
4
- Rakefile
5
- lib/ascii85.rb
6
- spec/ascii85_spec.rb
data/README.txt DELETED
@@ -1,59 +0,0 @@
1
- = Ascii85
2
-
3
- * http://ascii85.rubyforge.org
4
-
5
- == DESCRIPTION:
6
-
7
- Ascii85 is a simple gem that provides methods for encoding/decoding Adobe's
8
- binary-to-text encoding of the same name.
9
-
10
- See http://www.adobe.com/products/postscript/pdfs/PLRM.pdf page 131 and
11
- http://en.wikipedia.org/wiki/Ascii85 for more information about the format.
12
-
13
-
14
- == SYNOPSIS:
15
-
16
- require 'rubygems'
17
- require 'ascii85'
18
-
19
- Ascii85::encode("Ruby")
20
- => "<~;KZGo~>"
21
-
22
- Ascii85::decode("<~;KZGo~>")
23
- => "Ruby"
24
-
25
- In addition, Ascii85::encode can take a second parameter that specifies the
26
- length of the returned lines. The default is 80; use +false+ for unlimited.
27
-
28
- Ascii85::decode expects the input to be enclosed in <~ and ~>. It ignores
29
- everything outside of these.
30
-
31
-
32
- == INSTALL:
33
-
34
- * sudo gem install ascii85
35
-
36
-
37
- == LICENSE:
38
-
39
- (The MIT License)
40
-
41
- Copyright (c) 2009 Johannes Holzfuß
42
-
43
- Permission is hereby granted, free of charge, to any person obtaining a
44
- copy of this software and associated documentation files (the "Software"),
45
- to deal in the Software without restriction, including without limitation the
46
- rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
47
- sell copies of the Software, and to permit persons to whom the Software is
48
- furnished to do so, subject to the following conditions:
49
-
50
- The above copyright notice and this permission notice shall be included in
51
- all copies or substantial portions of the Software.
52
-
53
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
54
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
55
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
56
- THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
57
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
58
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
59
- THE SOFTWARE.
@@ -1,152 +0,0 @@
1
- # encoding: utf-8
2
-
3
- $:.unshift File.join(File.dirname(__FILE__), '..', 'lib')
4
-
5
- require 'ascii85'
6
-
7
- describe Ascii85 do
8
-
9
- TEST_CASES = {
10
-
11
- "" => "",
12
- " " => "<~+9~>",
13
-
14
- "\0" * 1 => "<~!!~>",
15
- "\0" * 2 => "<~!!!~>",
16
- "\0" * 3 => "<~!!!!~>",
17
- "\0" * 4 => "<~z~>",
18
- "\0" * 5 => "<~z!!~>",
19
- "A\0\0\0\0" => "<~5l^lb!!~>", # No z-abbreviation!
20
-
21
- "A" => "<~5l~>",
22
- "AB" => "<~5sb~>",
23
- "ABC" => "<~5sdp~>",
24
- "ABCD" => "<~5sdq,~>",
25
- "ABCDE" => "<~5sdq,70~>",
26
- "ABCDEF" => "<~5sdq,77I~>",
27
- "ABCDEFG" => "<~5sdq,77Kc~>",
28
- "ABCDEFGH" => "<~5sdq,77Kd<~>",
29
- "ABCDEFGHI" => "<~5sdq,77Kd<8H~>",
30
- "Ascii85" => "<~6$$OMBfIs~>",
31
-
32
- 'Antidisestablishmentarianism' => '<~6#LdYA8-*rF*(i"Ch[s(D.RU,@<-\'jDJ=0/~>',
33
-
34
- # Dōmo arigatō, Mr. Roboto (according to Wikipedia)
35
- 'どうもありがとうミスターロボット' =>
36
- "<~j+42iJVN3:K&_E6j+<0KJW/W?W8iG`j+EuaK\"9on^Z0sZj+FJoK:LtSKB%T?~>",
37
-
38
- [Math::PI].pack('G') => "<~5RAV2<(&;T~>",
39
- [Math::E].pack('G') => "<~5R\"n0M\\K6,~>"
40
- }
41
-
42
- it "#decode should be the inverse of #encode" do
43
-
44
- # Generate a random string
45
- test_str = ""
46
- (1 + rand(255)).times do
47
- test_str += rand(256).chr
48
- end
49
-
50
- encoded = Ascii85::encode(test_str)
51
- decoded = Ascii85::decode(encoded)
52
-
53
- decoded.should == test_str
54
- end
55
-
56
- describe "#encode" do
57
-
58
- it "should encode all specified test-cases correctly" do
59
- TEST_CASES.each_pair do |input, encoded|
60
- Ascii85::encode(input).should == encoded
61
- end
62
- end
63
-
64
- it "should produce output lines no longer than specified" do
65
- test_str = '0123456789' * 30
66
-
67
- #
68
- # No wrap
69
- #
70
- Ascii85::encode(test_str, false).count("\n").should == 0
71
-
72
- #
73
- # x characters per line, except for the last one
74
- #
75
- x = 2 + rand(255) # < test_str.length
76
- encoded = Ascii85::encode(test_str, x)
77
-
78
- # Determine the length of all lines
79
- count_arr = []
80
- encoded.each_line do |line|
81
- count_arr << line.chomp.length
82
- end
83
-
84
- # The last line is allowed to be shorter than x, so remove it
85
- count_arr.pop if count_arr.last <= x
86
-
87
- # If the end-marker is on a line of its own, the next-to-last line is
88
- # allowed to be shorter than specified by exactly one character
89
- count_arr.pop if (encoded[-3].chr =~ /[\r\n]/) and (count_arr.last == x-1)
90
-
91
- # Remove all line-lengths that are of length x from count_arr
92
- count_arr.delete_if { |len| len == x }
93
-
94
- # Now count_arr should be empty
95
- count_arr.should be_empty
96
- end
97
-
98
- it "should not split the end-marker to achieve correct line length" do
99
- Ascii85::encode("\0" * 4, 4).should == "<~z\n~>"
100
- end
101
-
102
- end
103
-
104
- describe "#decode" do
105
-
106
- it "should decode all specified test-cases correctly" do
107
- TEST_CASES.each_pair do |decoded, input|
108
- Ascii85::decode(input).should == decoded
109
- end
110
- end
111
-
112
- it "should ignore everything before/after the delimiter-pairs" do
113
- Ascii85::decode("Doesn't contain delimiters").should == ''
114
- Ascii85::decode("FooBar<~z~>BazQux").should == ("\0" * 4)
115
- end
116
-
117
- it "should ignore whitespace" do
118
- decoded = Ascii85::decode("<~6 #LdYA\r\08\n \n\n- *rF*(i\"Ch[s \t(D.RU,@ <-\'jDJ=0\f/~>")
119
- decoded.should == 'Antidisestablishmentarianism'
120
- end
121
-
122
- describe "Error conditions" do
123
-
124
- it "should raise DecodingError if it encounters a word >= 2**32" do
125
- lambda {
126
- Ascii85::decode('<~s8W-#~>')
127
- }.should raise_error Ascii85::DecodingError
128
- end
129
-
130
- it "should raise DecodingError if it encounters an invalid character" do
131
- lambda {
132
- Ascii85::decode('<~!!y!!~>')
133
- }.should raise_error Ascii85::DecodingError
134
- end
135
-
136
- it "should raise DecodingError if the last tuple consists of a single character" do
137
- lambda {
138
- Ascii85::decode('<~!~>')
139
- }.should raise_error Ascii85::DecodingError
140
- end
141
-
142
- it "should raise DecodingError if a z is found inside a 5-tuple" do
143
- lambda {
144
- Ascii85::decode('<~!!z!!~>')
145
- }.should raise_error Ascii85::DecodingError
146
- end
147
-
148
- end
149
-
150
- end
151
-
152
- end
metadata.gz.sig DELETED
Binary file