anybase 0.0.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/README.rdoc +19 -0
- data/Rakefile +33 -0
- data/VERSION +1 -0
- data/lib/anybase.rb +46 -0
- data/spec/from_spec.rb +13 -0
- data/spec/spec.opts +7 -0
- data/spec/spec_helper.rb +1 -0
- data/spec/to_spec.rb +8 -0
- metadata +73 -0
data/README.rdoc
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
=Anybase
|
2
|
+
|
3
|
+
==Arbitrary number bases
|
4
|
+
|
5
|
+
So often, I need to create random number bases, with random digits, to satisfy some crazy requirement.
|
6
|
+
|
7
|
+
Here is an example of how you'd do hex in Anybase.
|
8
|
+
|
9
|
+
base = Anybase.new('0123456789abcdef')
|
10
|
+
base.to_i('f0a')
|
11
|
+
=> 3850
|
12
|
+
base.to_native(123450)
|
13
|
+
=> "1e23a"
|
14
|
+
|
15
|
+
Anybase gives you a few built-in:
|
16
|
+
Anybase::Hex, Anybase::Base64, Anybase::Base64ForURL and Anybase::Base62
|
17
|
+
(should all be pretty self-explanatory)
|
18
|
+
|
19
|
+
w00t, and cheers!
|
data/Rakefile
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
begin
|
2
|
+
require 'jeweler'
|
3
|
+
Jeweler::Tasks.new do |s|
|
4
|
+
s.name = "anybase"
|
5
|
+
s.description = s.summary = "Numbers from anybase to anybase"
|
6
|
+
s.email = "joshbuddy@gmail.com"
|
7
|
+
s.homepage = "http://github.com/joshbuddy/anybase"
|
8
|
+
s.authors = ["Joshua Hull"]
|
9
|
+
s.files = FileList["[A-Z]*", "{lib,spec}/**/*"]
|
10
|
+
s.add_dependency 'fuzzyhash', '>=0.0.9'
|
11
|
+
end
|
12
|
+
Jeweler::GemcutterTasks.new
|
13
|
+
Jeweler::RubyforgeTasks.new do |rubyforge|
|
14
|
+
rubyforge.doc_task = "rdoc"
|
15
|
+
rubyforge.remote_doc_path = ''
|
16
|
+
end
|
17
|
+
rescue LoadError
|
18
|
+
puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
|
19
|
+
end
|
20
|
+
|
21
|
+
require 'spec'
|
22
|
+
require 'spec/rake/spectask'
|
23
|
+
task :spec => 'spec:all'
|
24
|
+
namespace(:spec) do
|
25
|
+
Spec::Rake::SpecTask.new(:all) do |t|
|
26
|
+
t.spec_opts ||= []
|
27
|
+
t.spec_opts << "-rubygems"
|
28
|
+
t.spec_opts << "--options" << "spec/spec.opts"
|
29
|
+
t.spec_files = FileList['spec/**/*_spec.rb']
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.0.1
|
data/lib/anybase.rb
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
class Anybase
|
2
|
+
|
3
|
+
attr_reader :chars
|
4
|
+
|
5
|
+
UnrecognizedCharacterError = Class.new(RuntimeError)
|
6
|
+
|
7
|
+
def initialize(chars, opts = nil)
|
8
|
+
@chars = chars
|
9
|
+
@ignore_case = opts && opts[:ignore_case] || false
|
10
|
+
@char_map = Hash.new{|h,k| raise UnrecognizedCharacterError.new("the character `#{k.chr}' is not included in #{@chars}")}
|
11
|
+
@num_map = {}
|
12
|
+
@chars.split('').each_with_index do |c, i|
|
13
|
+
if @ignore_case
|
14
|
+
@char_map[c[0]] = i
|
15
|
+
@char_map[c.swapcase[0]] = i
|
16
|
+
else
|
17
|
+
@char_map[c[0]] = i
|
18
|
+
end
|
19
|
+
@num_map[i] = c
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_i(val)
|
24
|
+
num = 0
|
25
|
+
(0...val.size).each{|i|
|
26
|
+
num += (chars.size ** (val.size - i - 1)) * @char_map[val[i]]
|
27
|
+
}
|
28
|
+
num
|
29
|
+
end
|
30
|
+
|
31
|
+
def to_native(val)
|
32
|
+
str = ''
|
33
|
+
until val.zero?
|
34
|
+
digit = val % chars.size
|
35
|
+
val /= chars.size
|
36
|
+
str[0, 0] = @num_map[digit]
|
37
|
+
end
|
38
|
+
str
|
39
|
+
end
|
40
|
+
|
41
|
+
Hex = Anybase.new('0123456789abcdef', :ignore_case => true)
|
42
|
+
Base64 = Anybase.new('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/')
|
43
|
+
Base64ForURL = Anybase.new('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_')
|
44
|
+
Base62 = Anybase.new('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789')
|
45
|
+
|
46
|
+
end
|
data/spec/from_spec.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'dirge'
|
2
|
+
require ~'spec_helper'
|
3
|
+
|
4
|
+
describe Anybase, "from" do
|
5
|
+
it "should translate to a number" do
|
6
|
+
Anybase.new("012345678").to_i('2350').should == 1746
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should raise an exception if any char isn't included" do
|
10
|
+
proc { Anybase.new("012345678").to_i('a2350') }.should raise_error(Anybase::UnrecognizedCharacterError)
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
data/spec/spec.opts
ADDED
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require ~'../lib/anybase'
|
data/spec/to_spec.rb
ADDED
metadata
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: anybase
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Joshua Hull
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-11-20 00:00:00 -08:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: fuzzyhash
|
17
|
+
type: :runtime
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 0.0.9
|
24
|
+
version:
|
25
|
+
description: Numbers from anybase to anybase
|
26
|
+
email: joshbuddy@gmail.com
|
27
|
+
executables: []
|
28
|
+
|
29
|
+
extensions: []
|
30
|
+
|
31
|
+
extra_rdoc_files:
|
32
|
+
- README.rdoc
|
33
|
+
files:
|
34
|
+
- README.rdoc
|
35
|
+
- Rakefile
|
36
|
+
- VERSION
|
37
|
+
- lib/anybase.rb
|
38
|
+
- spec/from_spec.rb
|
39
|
+
- spec/spec.opts
|
40
|
+
- spec/spec_helper.rb
|
41
|
+
- spec/to_spec.rb
|
42
|
+
has_rdoc: true
|
43
|
+
homepage: http://github.com/joshbuddy/anybase
|
44
|
+
licenses: []
|
45
|
+
|
46
|
+
post_install_message:
|
47
|
+
rdoc_options:
|
48
|
+
- --charset=UTF-8
|
49
|
+
require_paths:
|
50
|
+
- lib
|
51
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - ">="
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: "0"
|
56
|
+
version:
|
57
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: "0"
|
62
|
+
version:
|
63
|
+
requirements: []
|
64
|
+
|
65
|
+
rubyforge_project:
|
66
|
+
rubygems_version: 1.3.5
|
67
|
+
signing_key:
|
68
|
+
specification_version: 3
|
69
|
+
summary: Numbers from anybase to anybase
|
70
|
+
test_files:
|
71
|
+
- spec/from_spec.rb
|
72
|
+
- spec/spec_helper.rb
|
73
|
+
- spec/to_spec.rb
|