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 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