youyouaidi 0.0.4 → 0.1.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1713ea510982e9d0ef36b7ea4b5601342bbb7673
4
- data.tar.gz: 883a63e7466046595d329ae52bae3739b2275ad7
3
+ metadata.gz: 383f96781da456cf785f37008b07cea302bc6465
4
+ data.tar.gz: 63ad6a4540f8f1740b5e9fb0477c610203c93a32
5
5
  SHA512:
6
- metadata.gz: 957ee30738eb6f2d5d1bb7520ecb2768148bc2a4d6d90d3e725804f553034e446f34b669bfabc14e3a29e6dffc5731f86dd6e2262a2b2da6c3979b269776f484
7
- data.tar.gz: 4a9520ae3df9cfbc6aa393d02c867a95eb690cfcff6bab6a2693f7e3a0ffd3cb9d3a4d74ed79e6beb537d1fdb471769f84848c91a74706c16bb2ae7ebc512fcb
6
+ metadata.gz: 98d5f4460aade04d5bd5b3d458057de3e04321968d7a65194ff26161ca219b6e2a6b1e0b259641eb24e9c8e5a55d8080f123f6821f1449ce5751ad9266531c4f
7
+ data.tar.gz: 769b6f76f82a8add80421b20ac845487cfa07138cd1286a5e6fb62d982120da90b9f3f90e2ec4c33a19ca2db85cdc0ec9f7c4a8a008bb72b18d7387f602bcf21
data/Gemfile CHANGED
@@ -1,6 +1,7 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
3
  gem 'rspec'
4
+ gem 'coveralls', require: false
4
5
 
5
6
  group :test do
6
7
  gem 'rake', '~> 10.1'
data/README.md CHANGED
@@ -1,10 +1,13 @@
1
- # Youyouaidi
2
-
3
- [![Gem Version](https://badge.fury.io/rb/youyouaidi.svg)](https://rubygems.org/gems/youyouaidi)
1
+ # Youyouaidi
2
+ [![Gem Version](https://badge.fury.io/rb/youyouaidi.svg)](https://rubygems.org/gems/youyouaidi)
4
3
  [![Build Status](https://travis-ci.org/nicolas-fricke/youyouaidi.svg)](https://travis-ci.org/nicolas-fricke/youyouaidi)
4
+ [![Coverage Status](http://img.shields.io/coveralls/nicolas-fricke/youyouaidi.svg)](https://coveralls.io/r/nicolas-fricke/youyouaidi)
5
+ [![Code Climate](http://img.shields.io/codeclimate/github/nicolas-fricke/youyouaidi.svg)](https://codeclimate.com/github/nicolas-fricke/youyouaidi)
6
+ [![License](http://img.shields.io/badge/license-MIT-brightgreen.svg)](https://tldrlegal.com/license/mit-license)
5
7
 
6
8
 
7
- Ruby Gem `Youyouaidi` offers a UUID class for parsing, validating and converting UUIDs into / from shorter representations.
9
+ `Youyouaidi` is a Ruby Gem that offers a UUID class for parsing, validating and converting UUIDs into / from shorter representations.
10
+ While a UUID consists of 32 hexadecimal characters by dashes divided into 5 subgroups, the short representation (invoked via `#to_shrort_string`) consists of exactly 22 digit and lower- and uppercase characters.
8
11
 
9
12
  ## Installation
10
13
 
@@ -25,8 +28,8 @@ Or install it yourself as:
25
28
  ### Initializing UUIDs
26
29
 
27
30
  ```ruby
28
- uuid_string = '550e8400-e29b-41d4-a716-446655440000' # A valid UUID in string format
29
- uuid_short = '_oGOAbD9fsFFEHWSMal1v' # Same UUID in its short format
31
+ uuid_string = '550e8400-e29b-41d4-a716-446655440000' # A valid UUID in string format, has exactly 32 hexadecimal characters in 5 groups
32
+ uuid_short = '2AuYQJcZeiIeCymkJ7tzTW' # Same UUID in its short format, has exactly 22 characters of [0-9a-zA-Z]
30
33
 
31
34
  uuid = UUID uuid_string # creates new Youyouaidi::UUID object, patches Youyouaidi::UUID.parse uuid_string into kernel.
32
35
  # => #<Youyouaidi::UUID:0x0000010150bb60 @converter=Youyouaidi::Converter, @uuid="550e8400-e29b-41d4-a716-446655440000">
@@ -49,7 +52,7 @@ uuid.to_s # Returns the string representation of the UUID object
49
52
  # => '550e8400-e29b-41d4-a716-446655440000'
50
53
 
51
54
  uuid.to_short_s # Returns the short string representation of the UUID object
52
- # => '_oGOAbD9fsFFEHWSMal1v', alias for method: #to_param
55
+ # => '2AuYQJcZeiIeCymkJ7tzTW', alias for method: #to_param
53
56
  ```
54
57
 
55
58
 
@@ -7,11 +7,14 @@ class Youyouaidi::Converter
7
7
  end
8
8
 
9
9
  def decode(encoded_uuid)
10
+ encoded_uuid = encoded_uuid.to_s
11
+ raise Youyouaidi::InvalidUUIDError.new "`#{encoded_uuid}' needs to have exactly #{ENCODED_LENGTH} characters" unless encoded_uuid.length == ENCODED_LENGTH
10
12
  Youyouaidi::UUID.new convert_bignum_to_uuid_string base_decode encoded_uuid
11
13
  end
12
14
 
13
15
  private
14
- BASE = ('0'..'9').to_a + ('a'..'z').to_a + ('A'..'Z').to_a + %w(_ - +)
16
+ BASE = ('0'..'9').to_a + ('a'..'z').to_a + ('A'..'Z').to_a
17
+ ENCODED_LENGTH = 22 # Needs to be greater than `(Math.log 2**128, BASE.length).floor + 1`
15
18
 
16
19
  def base_encode(numeric)
17
20
  raise Youyouaidi::InvalidUUIDError.new "`#{numeric}' needs to be a Numeric" unless numeric.is_a? Numeric
@@ -23,6 +26,9 @@ class Youyouaidi::Converter
23
26
  s << BASE[numeric.modulo(BASE.size)]
24
27
  numeric /= BASE.size
25
28
  end
29
+ while s.length < ENCODED_LENGTH
30
+ s << BASE[0]
31
+ end
26
32
  s.reverse
27
33
  end
28
34
 
@@ -40,9 +46,11 @@ class Youyouaidi::Converter
40
46
  total
41
47
  end
42
48
 
43
- def convert_bignum_to_uuid_string(short_uuid_string)
44
- uuid = short_uuid_string.to_i.to_s(16)
45
- "#{uuid[0,8]}-#{uuid[8,4]}-#{uuid[12,4]}-#{uuid[16,4]}-#{uuid[20,12]}"
49
+ def convert_bignum_to_uuid_string(decoded_uuid_bignum)
50
+ decoded_uuid = decoded_uuid_bignum.to_i.to_s(16).rjust(32, '0')
51
+ parsed_uuid = "#{decoded_uuid[0,8]}-#{decoded_uuid[8,4]}-#{decoded_uuid[12,4]}-#{decoded_uuid[16,4]}-#{decoded_uuid[20,12]}"
52
+ raise Youyouaidi::InvalidUUIDError.new "Converted string `#{decoded_uuid}' has too many characters" if decoded_uuid.length > 32
53
+ parsed_uuid
46
54
  end
47
55
  end
48
56
  end
@@ -1,3 +1,3 @@
1
1
  module Youyouaidi
2
- VERSION = '0.0.4'
2
+ VERSION = '0.1.0'
3
3
  end
@@ -3,7 +3,7 @@ require 'spec_helper'
3
3
  describe Kernel do
4
4
  describe '.UUID' do
5
5
  let(:valid_uuid) { '550e8400-e29b-41d4-a716-446655440000' }
6
- let(:encoded_uuid) { '_oGOAbD9fsFFEHWSMal1v' }
6
+ let(:encoded_uuid) { '2AuYQJcZeiIeCymkJ7tzTW' }
7
7
  let(:action) { UUID param }
8
8
 
9
9
  subject { action }
data/spec/spec_helper.rb CHANGED
@@ -3,6 +3,10 @@ require 'rspec'
3
3
  require 'bundler'
4
4
  Bundler.require
5
5
 
6
+ # Code coverage statistics at coveralls.io: https://coveralls.io/r/nicolas-fricke/youyouaidi
7
+ require 'coveralls'
8
+ Coveralls.wear!
9
+
6
10
  require 'youyouaidi'
7
11
 
8
12
  RSpec.configure do |config|
@@ -3,7 +3,12 @@ require 'spec_helper'
3
3
  describe Youyouaidi::Converter do
4
4
  let(:uuid) { Youyouaidi::UUID.new uuid_string }
5
5
  let(:uuid_string) { '550e8400-e29b-41d4-a716-446655440000' }
6
- let(:encoded_uuid) { '_oGOAbD9fsFFEHWSMal1v' }
6
+ let(:encoded_uuid) { '2AuYQJcZeiIeCymkJ7tzTW' }
7
+
8
+ uuids_with_encoding = {
9
+ '550e8400-e29b-41d4-a716-446655440000' => '2AuYQJcZeiIeCymkJ7tzTW',
10
+ '00000000-bbbb-2222-8888-000000000000' => '000001dyObGywDRlcScExy'
11
+ }
7
12
 
8
13
  describe 'use case' do
9
14
  subject { described_class.decode described_class.encode(uuid) }
@@ -17,20 +22,40 @@ describe Youyouaidi::Converter do
17
22
  describe '.encode' do
18
23
  subject { described_class.encode uuid }
19
24
 
20
- it { should eq encoded_uuid }
25
+ uuids_with_encoding.each do |valid_uuid, encoded_uuid|
26
+ context "for uuid `#{valid_uuid}'" do
27
+ let(:uuid_string) { valid_uuid }
28
+ it { should have(22).characters }
29
+ it { should eq encoded_uuid }
30
+ end
31
+ end
21
32
  end
22
33
 
23
34
  describe '.decode' do
24
- subject { described_class.decode encoded_uuid }
35
+ let(:action) { described_class.decode encoded_param }
25
36
 
26
- it { should be_a Youyouaidi::UUID }
27
- its(:to_s) { should eq uuid_string }
37
+ context 'with valid param' do
38
+ subject { action }
28
39
 
29
- context 'with invalid characters' do
30
- let(:encoded_uuid) { ' ' }
40
+ uuids_with_encoding.each do |valid_uuid, encoded_uuid|
41
+ context "for encoded uuid `#{encoded_uuid}'" do
42
+ let(:encoded_param) { encoded_uuid }
43
+ it { should be_a Youyouaidi::UUID }
44
+ its(:to_s) { should eq valid_uuid }
45
+ end
46
+ end
47
+ end
48
+
49
+ context 'with invalid param' do
50
+ subject { -> { action } }
51
+ context 'with invalid characters' do
52
+ let(:encoded_param) { ' ' }
53
+ it { should raise_error Youyouaidi::InvalidUUIDError }
54
+ end
31
55
 
32
- it 'raises error' do
33
- expect { subject }.to raise_error Youyouaidi::InvalidUUIDError
56
+ context 'with too long encoded param' do
57
+ let(:encoded_param) { "#{encoded_uuid}abc" }
58
+ it { should raise_error Youyouaidi::InvalidUUIDError }
34
59
  end
35
60
  end
36
61
  end
@@ -7,15 +7,24 @@ describe Youyouaidi::UUID do
7
7
  subject { -> { action } }
8
8
 
9
9
  context 'with valid uuid string' do
10
- let(:param) { '550e8400-e29b-41d4-a716-446655440000' }
11
10
  subject { action }
12
11
 
13
- it { should be_a Youyouaidi::UUID }
14
- its(:to_s) { should eq param }
12
+ uuid_string = '550e8400-e29b-41d4-a716-446655440000'
13
+ encoded_uuid = '2AuYQJcZeiIeCymkJ7tzTW'
14
+ valid_uuids = ['550e8400-e29b-41d4-a716-446655440000',
15
+ '00000000-bbbb-2222-8888-000000000000']
16
+
17
+ valid_uuids.each do |valid_uuid|
18
+ context "for uuid `#{valid_uuid}'" do
19
+ let(:param) { valid_uuid }
20
+ it { should be_a Youyouaidi::UUID }
21
+ its(:to_s) { should eq param }
22
+ end
23
+ end
15
24
  end
16
25
 
17
26
  context 'with uuid in short format' do
18
- let(:param) { '_oGOAbD9fsFFEHWSMal1v' }
27
+ let(:param) { '2AuYQJcZeiIeCymkJ7tzTW' }
19
28
  it { should raise_error Youyouaidi::InvalidUUIDError }
20
29
  end
21
30
 
@@ -42,7 +51,7 @@ describe Youyouaidi::UUID do
42
51
  end
43
52
 
44
53
  context 'with uuid in short format' do
45
- let(:param) { '_oGOAbD9fsFFEHWSMal1v' }
54
+ let(:param) { '2AuYQJcZeiIeCymkJ7tzTW' }
46
55
  let(:decoded_uuid) { '550e8400-e29b-41d4-a716-446655440000' }
47
56
 
48
57
  it { should be_a Youyouaidi::UUID }
@@ -68,7 +77,7 @@ describe Youyouaidi::UUID do
68
77
 
69
78
  shared_examples_for 'equality check for two UUID objects' do
70
79
  let(:first_uuid_string) { 'aaaaaaaa-eeee-4444-aaaa-444444444444' }
71
- let(:second_uuid_string) { '00000000-bbbb-2222-6666-000000000000' }
80
+ let(:second_uuid_string) { '00000000-bbbb-2222-8888-000000000000' }
72
81
  let(:first_uuid) { Youyouaidi::UUID.new first_uuid_string }
73
82
  let(:second_uuid) { Youyouaidi::UUID.new second_uuid_string }
74
83
 
@@ -168,7 +177,7 @@ describe Youyouaidi::UUID do
168
177
 
169
178
  shared_examples_for 'method for short format' do
170
179
  let(:uuid_string) { '550e8400-e29b-41d4-a716-446655440000' }
171
- let(:encoded_uuid) { '_oGOAbD9fsFFEHWSMal1v' }
180
+ let(:encoded_uuid) { '2AuYQJcZeiIeCymkJ7tzTW' }
172
181
  let(:uuid) { Youyouaidi::UUID.new uuid_string }
173
182
 
174
183
  let(:action) { uuid.send method }
@@ -198,7 +207,7 @@ describe Youyouaidi::UUID do
198
207
 
199
208
  context 'with invalid uuid' do
200
209
  uuid_string = '550e8400-e29b-41d4-a716-446655440000'
201
- encoded_uuid = '_oGOAbD9fsFFEHWSMal1v'
210
+ encoded_uuid = '2AuYQJcZeiIeCymkJ7tzTW'
202
211
  invalid_uuids = ['Kekse', "aa#{uuid_string}", "#{uuid_string}bb",
203
212
  "#{encoded_uuid}" ]
204
213
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: youyouaidi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nicolas Fricke
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-04-07 00:00:00.000000000 Z
11
+ date: 2014-04-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler