anybase 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -0,0 +1,7 @@
1
+ --colour
2
+ --format
3
+ specdoc
4
+ --loadby
5
+ mtime
6
+ --reverse
7
+ --backtrace
@@ -0,0 +1 @@
1
+ require ~'../lib/anybase'
data/spec/to_spec.rb ADDED
@@ -0,0 +1,8 @@
1
+ require 'dirge'
2
+ require ~'spec_helper'
3
+
4
+ describe Anybase, "to" do
5
+ it "should translate base to a number from a string " do
6
+ Anybase.new("012345678").to_native(1827).should == "2450"
7
+ end
8
+ end
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