radix 2.1.1 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/.index CHANGED
@@ -11,11 +11,15 @@ requirements:
11
11
  - groups:
12
12
  - build
13
13
  development: true
14
- name: detroit
14
+ name: ergo
15
15
  - groups:
16
16
  - test
17
17
  development: true
18
18
  name: qed
19
+ - groups:
20
+ - test
21
+ development: true
22
+ name: ae
19
23
  conflicts: []
20
24
  alternatives: []
21
25
  resources:
@@ -47,9 +51,9 @@ paths:
47
51
  created: '2009-07-01'
48
52
  summary: Convert to and from any base.
49
53
  title: Radix
50
- version: 2.1.1
54
+ version: 2.2.0
51
55
  name: radix
52
56
  description: ! "Radix is a very easy to use Ruby library for converting numbers to
53
57
  and from\nany base. It supports both Integer, Float and Rational numbers, as well
54
58
  as \nrepresentational string-notations that need not be in ASCII order."
55
- date: '2013-02-06'
59
+ date: '2013-03-20'
data/.yardopts CHANGED
@@ -1,5 +1,8 @@
1
- --title Erbside
2
- --readme README.rdoc
1
+ --title Radix
2
+ --readme README.md
3
+ --protected
4
+ --private
3
5
  lib
4
6
  -
5
- [A-Z]*.*
7
+ *.md
8
+ *.txt
data/HISTORY.md CHANGED
@@ -1,12 +1,28 @@
1
1
  # RELEASE HISTORY
2
2
 
3
+ ## 2.2.0 / 2013-03-20
4
+
5
+ Good documentation is so under-addressed by most developers that we really
6
+ have to roll out the bright lights when someone comes along and takes
7
+ up the time consuming mantle of documenting an API in complete detail.
8
+ This is exactly what happened with Radix this last month. A coder going
9
+ by the unassuming handle, **douglascodes**, announced his desire to
10
+ document Radix and proceeded to do so until YARD pronounced 100%
11
+ completeness. Hey, we think that is worth of a whole version bump and
12
+ a big shout-out for Douglas!
13
+
14
+ Changes:
15
+
16
+ * 100% API documentation coverage. (douglascodes)
17
+
18
+
3
19
  ## 2.1.1 / 2013-02-06
4
20
 
5
- Minor release to fix gemspec. Which, alas, Bunder cannot do without.
21
+ Minor release to fix gemspec. Which, alas, Bundler cannot do without.
6
22
 
7
23
  Changes:
8
24
 
9
- * Update .gemspec file for lastest indexer.
25
+ * Update .gemspec file for latest indexer.
10
26
 
11
27
 
12
28
  ## 2.1.0 / 2013-01-31
@@ -28,7 +44,7 @@ Changes:
28
44
 
29
45
  ## 2.0.1 / 2011-10-23
30
46
 
31
- This release is simply an adminstrative release to update the project
47
+ This release is simply an administrative release to update the project
32
48
  build configuration. The functionality of the library itself has not
33
49
  changed. This release also transitions the project to the BSD-2-Clause
34
50
  license.
@@ -59,8 +75,8 @@ Radix now provides an actual Numeric subclass, Radix::Number, that stores
59
75
  the base and can be used like any other Numeric object. This makes it very
60
76
  easy to convert and manipulate numbers in any base. The implementation is still
61
77
  a bit nascent. For the moment, it only supports the most basic math operators
62
- and only handles integer values, but furture releases will continue to expand
63
- on it's capabilites.
78
+ and only handles integer values, but future releases will continue to expand
79
+ on it's capabilities.
64
80
 
65
81
  Changes:
66
82
 
data/README.md CHANGED
@@ -1,10 +1,12 @@
1
1
  # Radix
2
2
 
3
- [Website](http://rubyworks.github.com/radix) /
4
- [Report Issue](http://github.com/rubyworks/radix/issues) /
5
- [Source Code](http://github.com/rubyworks/radix) /
6
- [![Build Status](https://secure.travis-ci.org/rubyworks/radix.png)](http://travis-ci.org/rubyworks/radix) /
7
- [![Gem Version](https://badge.fury.io/rb/radix.png)](http://badge.fury.io/rb/radix)
3
+ [Website](http://rubyworks.github.com/radix) ·
4
+ [Report Issue](http://github.com/rubyworks/radix/issues) ·
5
+ [Source Code](http://github.com/rubyworks/radix)    
6
+ [![Build Status](https://secure.travis-ci.org/rubyworks/radix.png)](http://travis-ci.org/rubyworks/radix)
7
+ [![Gem Version](https://badge.fury.io/rb/radix.png)](http://badge.fury.io/rb/radix)    
8
+ [![Flattr Me](http://api.flattr.com/button/flattr-badge-large.png)](http://flattr.com/thing/324911/Rubyworks-Ruby-Development-Fund)
9
+
8
10
 
9
11
  Radix is a very easy to use Ruby library for converting numbers to and from
10
12
  any base. It supports both Integer, Float and Rational numbers, as well as
@@ -34,8 +36,8 @@ But Ruby reaches it's limit at base 36.
34
36
 
35
37
  Radix provides the means of converting to and from any base.
36
38
 
37
- For example, a number in base 256 can be represented by the array [100, 10]
38
- (ie. 100**256 + 10**1) and can be convert to base 10.
39
+ For example, a number in base 256 can be represented by the array `[100, 10]`
40
+ (`100**256 + 10**1`) and can be convert to base 10.
39
41
 
40
42
  [100,10].b(256).to_a(10) #=> [2,5,6,1,0]
41
43
 
@@ -69,6 +71,13 @@ Radix follows [Ruby Setup](http://rubyworks.github.com/setup) package standard
69
71
  so it can also be installed in an FHS compliant manner using setup.rb.
70
72
 
71
73
 
74
+ ## Special Thanks
75
+
76
+ Special thanks to **douglascodes** for taking the time to fully document
77
+ Radix's API. Documentation is an under-addressed and time-consuming affair,
78
+ so your contribution is greatly appreciated. Thank you, Douglas!
79
+
80
+
72
81
  ## Copyrights
73
82
 
74
83
  Copyright (c) 2009 Rubyworks
@@ -0,0 +1,18 @@
1
+ # Zero becomes empty string (#4)
2
+
3
+ Example of the issue:
4
+
5
+ 0.b(10).to_s #=> ""
6
+
7
+ I would expect "0" as a result.
8
+
9
+ 0.b(10).to_s #=> "0"
10
+
11
+ Okay, lets make sure this works for Floats.
12
+
13
+ 0.0.b(10).to_s #=> "0.0"
14
+
15
+ And Rationals too.
16
+
17
+ [0,1].br(10).to_s #=> "0/1"
18
+
@@ -1,59 +1,32 @@
1
1
  require 'radix/base'
2
2
  require 'radix/integer'
3
3
  require 'radix/float'
4
- require 'radix/rational' # load ?
4
+ require 'radix/rational'
5
+ require 'radix/operator'
5
6
 
6
7
  module Radix
8
+
9
+ ##
10
+ # Returns the metadata contained in Radix.yml
7
11
  #
12
+ # @return [Hash{String=>String}]
8
13
  def self.metadata
9
14
  @metadata ||= (
10
15
  require 'yaml'
11
16
  YAML.load(File.new(File.dirname(__FILE__) + '/radix.yml'))
12
17
  )
13
18
  end
14
- #
15
- def self.const_missing(name)
16
- key = name.to_s.downcase
17
- metadata[key] || super(name)
18
- end
19
19
 
20
- # TODO: Here only for buggy RUby 1.8.x.
21
- VERSION = metadata['version']
22
- end
23
-
24
- class ::Float
20
+ ##
21
+ # Gets value of name in metadata or goes up ancestry.
25
22
  #
26
- def b(base)
27
- Radix::Float.new(self, base)
28
- end
29
- end
30
-
31
- class ::Integer
23
+ # @param [Symbol] name
32
24
  #
33
- def b(base)
34
- Radix::Integer.new(self, base)
35
- end
36
- end
37
-
38
- class ::String
39
- #
40
- def b(base)
41
- if index('.')
42
- Radix::Float.new(self, base)
43
- else
44
- Radix::Integer.new(self, base)
45
- end
25
+ # @return [String]
26
+ def self.const_missing(name)
27
+ key = name.to_s.downcase
28
+ metadata.key?(key) ? metadata[key] : super(name)
46
29
  end
47
- end
48
30
 
49
- class ::Array
50
- #
51
- def b(base)
52
- if index('.')
53
- Radix::Float.new(self, base)
54
- else
55
- Radix::Integer.new(self, base)
56
- end
57
- end
58
31
  end
59
32
 
@@ -11,11 +11,15 @@ requirements:
11
11
  - groups:
12
12
  - build
13
13
  development: true
14
- name: detroit
14
+ name: ergo
15
15
  - groups:
16
16
  - test
17
17
  development: true
18
18
  name: qed
19
+ - groups:
20
+ - test
21
+ development: true
22
+ name: ae
19
23
  conflicts: []
20
24
  alternatives: []
21
25
  resources:
@@ -47,9 +51,9 @@ paths:
47
51
  created: '2009-07-01'
48
52
  summary: Convert to and from any base.
49
53
  title: Radix
50
- version: 2.1.1
54
+ version: 2.2.0
51
55
  name: radix
52
56
  description: ! "Radix is a very easy to use Ruby library for converting numbers to
53
57
  and from\nany base. It supports both Integer, Float and Rational numbers, as well
54
58
  as \nrepresentational string-notations that need not be in ASCII order."
55
- date: '2013-02-06'
59
+ date: '2013-03-20'
@@ -1,48 +1,90 @@
1
1
  module Radix
2
2
 
3
- # Collection of base encodings.
3
+ ##
4
+ # Namespace for common bases defined as reusable constants.
5
+ #
4
6
  module BASE
7
+ # Array of chars 0 - 9
5
8
  B10 = ('0'..'9').to_a
9
+ # Array of chars 0 - 9 + X + E
6
10
  B12 = B10 + ['X', 'E']
11
+ # Array of chars 0 - 9 + A - F
7
12
  B16 = B10 + ('A'..'F').to_a
13
+ # Array of chars 0 - 9 + A - Z
8
14
  B36 = B10 + ('A'..'Z').to_a
15
+ # Array of chars 0 - 9 + A - Z + a - x
9
16
  B60 = B36 + ('a'..'x').to_a
17
+ # Array of chars 0 - 9 + A - Z + a - z
10
18
  B62 = B36 + ('a'..'z').to_a
11
-
12
- # Like BASE16 but encodes with lowercase letters.
19
+ # Array of chars 0 - 9 + a - f
13
20
  HEX = B10 + ('a'..'f').to_a
14
21
  end
15
22
 
16
- # Radix::Base provides the means of converting to and from any base.
23
+ ##
24
+ # Radix::Base is a functional model of a base system that can be used for
25
+ # number conversions.
17
26
  #
27
+ # Radix::Base is the original Radix API. But with the advent of v2.0
28
+ # and the new Integer and Float classes, it is essentially deprecated.
29
+ #
30
+ # @example Convert any base
18
31
  # b10 = Radix::Base.new(10)
19
32
  # b10.convert_base([100, 10], 256)
20
33
  # #=> [2,5,6,1,0]
21
34
  #
22
- # And it can handle any notation upto base 62.
23
- #
35
+ # @example Convert to string notation upto base 62
24
36
  # b10.convert("10", 62) #=> "62"
25
37
  #
26
- # And the notations need not be in ASCII order --odd notations
27
- # can be used.
28
- #
38
+ # @example Odd notations
29
39
  # b10 = Radix::Base.new(%w{Q W E R T Y U I O U})
30
40
  # b10.convert("FF", 16) #=> "EYY"
31
41
  #
32
- # NOTE: Radix::Base is the original Radix API. But with the advent of v2.0
33
- # and the new Integer and Float classes, it is outmoded. For now it is here
34
- # for backward compatibility. In a future version it may be deprecated, or
35
- # reworked to serve as the backbone of the other classes.
36
- #
42
+ # @!attribute [r] chars
43
+ # @return [Array<String>] The ASCII character set in use.
44
+ # @!attribute [r] base
45
+ # @return [Fixnum] The base level in use.
46
+ # @!attribute [r] values
47
+ # @example Testing base hash default values.
48
+ # > test = Radix::Base.new(36)
49
+ # > test.values["F"]
50
+ # 15
51
+ # > test.values["5"]
52
+ # 5
53
+ # > test.values["Y"]
54
+ # 34
55
+ # > test.values["YY"]
56
+ # nil # Fails because "YY" is not a key in the +values+ hash.
57
+ # @return [Hash{String=>Fixnum}]
58
+ # A hash of characters and their respective value.
37
59
  class Base
38
60
 
61
+ ##
62
+ # The characters for this base level.
63
+ #
64
+ # @return [Array<String>] The ASCII character set in use.
39
65
  attr :chars
40
66
 
67
+ ##
68
+ # The base of this instance.
69
+ #
70
+ # @return [Fixnum] The base level in use.
41
71
  attr :base
42
72
 
73
+ ##
74
+ # Hash of characters and values.
75
+ #
76
+ # @return [Hash{String=>Fixnum}]
77
+ # A hash of characters and their respective value.
43
78
  attr :values
44
79
 
80
+ ##
45
81
  # New Radix using +chars+ representation.
82
+ #
83
+ # @param [Array<String>, Numeric] chars
84
+ # Array of string representation of number values of the base
85
+ # or a Numeric of the Base level.
86
+ #
87
+ # @return [void]
46
88
  def initialize(chars=BASE::B62)
47
89
  if ::Numeric === chars
48
90
  chars = BASE::B62[0...chars]
@@ -52,10 +94,35 @@ module Radix
52
94
  @values = Hash[*(0...@base).map { |i| [ @chars[i], i ] }.flatten]
53
95
  end
54
96
 
55
- # Convert an *encoded* +number+ of given +base+ to the Base's radix.
97
+ ##
98
+ # Convert a value of given radix_base to that of the base instance.
99
+ #
100
+ # @param [String, Numeric, Array<String>] number
101
+ # The value in "radix_base" context.
102
+ #
103
+ # @param [Radix::Base, Numeric] radix_base
104
+ # Numeric for the radix or instance of Radix::Base.
105
+ #
106
+ # @example Convert Testing (Binary, Decimal, Hex)
107
+ # > b = Radix::Base.new(2)
108
+ # > d = Radix::Base.new(10)
109
+ # > h = Radix::Base.new(16)
110
+ # > d.convert("A", h)
111
+ # "10"
112
+ # > h.convert("A", d)
113
+ # TypeError
114
+ # > h.convert(10, d)
115
+ # "A"
116
+ # > h.convert(10, 10)
117
+ # "A"
118
+ # > b.convert(10, d)
119
+ # "1010"
120
+ # > b.convert(10, h)
121
+ # "10000"
122
+ #
123
+ # @return [String] representation of "number" in self.base level.
56
124
  def convert(number, radix_base)
57
125
  radix_base = Radix::Base.new(radix_base) unless Radix::Base === radix_base
58
-
59
126
  case number
60
127
  when ::String, ::Numeric
61
128
  digits = number.to_s.split(//)
@@ -74,7 +141,20 @@ module Radix
74
141
  digits.join
75
142
  end
76
143
 
77
- # Convert any base to any other base, using array of +digits+.
144
+ ##
145
+ # Convert any base to any other base, using array of Fixnum's. Indexes of
146
+ # the array correspond to values for each column of the number in from_base
147
+ #
148
+ # @param [Array<Fixnum>] digits
149
+ # Array of values for each digit of source base.
150
+ #
151
+ # @param [Fixnum] from_base
152
+ # Source Base
153
+ #
154
+ # @param [Fixnum] to_base
155
+ # Destination Base
156
+ #
157
+ # @return [String] The value of digits in from_base converted as to_base.
78
158
  def convert_base(digits, from_base, to_base)
79
159
  bignum = 0
80
160
  digits.each { |digit| bignum = bignum * from_base + digit }
@@ -87,14 +167,26 @@ module Radix
87
167
  converted.reverse
88
168
  end
89
169
 
170
+ ##
90
171
  # Encode a string in the radix.
172
+ #
173
+ # @param [String] byte_string
174
+ # String value in this base.
175
+ #
176
+ # @return [String] Encoded string from this Base.
91
177
  def encode(byte_string)
92
178
  digits = byte_string.unpack("C*")
93
179
  digits = Radix.convert_base(digits, 256, base)
94
180
  digits.map{ |d| @chars[d] }.join
95
181
  end
96
182
 
183
+ ##
97
184
  # Decode a string that was previously encoded in the radix.
185
+ #
186
+ # @param [String] encoded
187
+ # Encoded string from this Base.
188
+ #
189
+ # @return [String] Decoded string of value from this base.
98
190
  def decode(encoded)
99
191
  digits = encoded.split(//).map{ |c| @values[c] }
100
192
  Radix.convert_base(digits, base, 256).pack("C*")
@@ -102,15 +194,40 @@ module Radix
102
194
 
103
195
  end
104
196
 
105
- # Convert number from it's given base to antoher base.
106
- # Do a standard conversion upto base 62.
197
+ ##
198
+ # Convert a number of from_base as to_base.
199
+ #
200
+ # @param [String, Numeric, Array<String>] number
201
+ # The value in context of "radix_base".
202
+ #
203
+ # @param [Fixnum, Radix::Base] from_base
204
+ # Source Base
205
+ #
206
+ # @param [Fixnum, Radix::Base] to_base
207
+ # Destination Base
208
+ #
209
+ # @return [String]
210
+ # The value of `digits` in `from_base` converted into `to_base`.
107
211
  def self.convert(number, from_base, to_base)
108
212
  from_base = Radix::Base.new(from_base) unless Radix::Base === from_base
109
213
  to_base = Radix::Base.new(to_base) unless Radix::Base === to_base
110
214
  to_base.convert(number, from_base)
111
215
  end
112
216
 
113
- # Convert any base to any other base, using array of +digits+.
217
+ ##
218
+ # Convert any base to any other base, using array of Fixnum's. Indexes of
219
+ # the array correspond to values for each column of the number in from_base
220
+ #
221
+ # @param [Array<Fixnum>] digits
222
+ # Array of values for each digit of source base.
223
+ #
224
+ # @param [Fixnum] from_base
225
+ # Source Base
226
+ #
227
+ # @param [Fixnum] to_base
228
+ # Destination Base
229
+ #
230
+ # @return [String] The value of digits in from_base converted as to_base.
114
231
  def self.convert_base(digits, from_base, to_base)
115
232
  bignum = 0
116
233
  digits.each { |digit| bignum = bignum * from_base + digit }