druuid 1.0.1 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/druuid.rb +18 -4
  3. data/spec/druuid_spec.rb +29 -10
  4. metadata +3 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5a713dab43e5bca952c2729d2b95b5a41c0ea067
4
- data.tar.gz: a2b168e714e1ad0baca24c1d8f414a3722389ac2
3
+ metadata.gz: 6b3eb19e63eb6ef54ba0ba47e1196a6f2c15c830
4
+ data.tar.gz: 6de75af50919eac4bd7f818cd41ec37dbaa541f8
5
5
  SHA512:
6
- metadata.gz: f78b69bcb4536c01a82dd40779e63899f57acc966bed7b184b53963043b5b3549a827547c7885c0ff8d9e6af3a2dfb76ef2355ed8cc8b85d92830b1e621782dc
7
- data.tar.gz: f6dfc909421fbb45e62e07e96d5a7b2c9c213a6ed05bd4382bf6db7c5b7e2aa85d6f32376a1711d7db04bad47b214cc03c46c3a30f6227747e546a317e108c55
6
+ metadata.gz: 4000d869db3357fb2c52ed77306479db6e41ce02bc3ef0a6c68358dae4822b246517f547c7dcbc651e32292d590594a8f59937d249692cd1a80a2382cf8f1807
7
+ data.tar.gz: 00e0b4894bcd655bc74fbc497a42e98eb6424417a1b594ca605ee041dfc4935f669f2e8abda529955117f7a24bef96697be19c6489b804c218235bb9ac10abd6
data/druuid.rb CHANGED
@@ -4,6 +4,7 @@ require 'securerandom'
4
4
  #
5
5
  # Date-relative UUID generation.
6
6
  module Druuid
7
+ NUM_RANDOM_BITS = 64 - 41
7
8
 
8
9
  class << self
9
10
 
@@ -21,8 +22,8 @@ module Druuid
21
22
  def gen time = Time.now, epoch_offset = epoch
22
23
  ms = ((time.to_f - epoch_offset.to_i) * 1e3).round
23
24
  rand = (SecureRandom.random_number * 1e16).round
24
- id = ms << (64 - 41)
25
- id | rand % (2 ** (64 - 41))
25
+ id = ms << NUM_RANDOM_BITS
26
+ id | rand % (2 ** NUM_RANDOM_BITS)
26
27
  end
27
28
 
28
29
  # Determines when a given UUID was generated.
@@ -34,8 +35,21 @@ module Druuid
34
35
  # Druuid.time 11142943683383068069
35
36
  # # => 2012-02-04 00:00:00 -0800
36
37
  def time uuid, epoch_offset = epoch
37
- ms = uuid >> (64 - 41)
38
- Time.at (ms / 1e3) + epoch_offset.to_i
38
+ ms = uuid >> NUM_RANDOM_BITS
39
+ Time.at(ms / 1e3) + epoch_offset.to_i
40
+ end
41
+
42
+ # Determines the minimum UUID that could be generated for the given time.
43
+ #
44
+ # @param [Time] time of UUID
45
+ # @param [Numeric] epoch offset
46
+ # @return [Bignum] UUID
47
+ # @example
48
+ # Druuid.min_for_time
49
+ # # => 11142943683379200000
50
+ def min_for_time time = Time.now, epoch_offset = epoch
51
+ ms = ((time.to_f - epoch_offset.to_i) * 1e3).round
52
+ ms << NUM_RANDOM_BITS
39
53
  end
40
54
 
41
55
  end
@@ -1,37 +1,46 @@
1
1
  require_relative '../druuid'
2
2
 
3
3
  describe Druuid do
4
- describe '.gen' do
5
- it 'generates a UUID' do
6
- uuid = Druuid.gen
7
- uuid.should be_instance_of Bignum
8
- uuid.should_not eq Druuid.gen
9
- end
10
-
4
+ shared_examples "druuid generator" do |method|
11
5
  let(:datetime) { Time.utc 2012, 2, 4, 8 }
12
6
  let(:prefix) { '111429436833' }
7
+
8
+ it "is a Bugnum" do
9
+ Druuid.send(method).should be_instance_of Bignum
10
+ end
11
+
13
12
  context 'with a given time' do
14
13
  it 'generates the UUID against the time' do
15
- Druuid.gen(datetime).to_s[0, 12].should eq prefix
14
+ Druuid.send(method, datetime).to_s[0, 12].should eq prefix
16
15
  end
17
16
  end
18
17
 
19
18
  let(:offset) { 60 * 60 * 24 }
20
19
  context 'with a given epoch' do
21
20
  it 'generates the UUID against the offset' do
22
- Druuid.gen(datetime + offset, offset).to_s[0, 12].should eq prefix
21
+ Druuid.send(method, datetime + offset, offset).to_s[0, 12].should eq prefix
23
22
  end
24
23
  end
25
24
 
26
25
  context 'with a default epoch' do
27
26
  before { @old_epoch, Druuid.epoch = Druuid.epoch, offset }
28
27
  it 'generates the UUID against the offset' do
29
- Druuid.gen(datetime + offset).to_s[0, 12].should eq prefix
28
+ Druuid.send(method, datetime + offset).to_s[0, 12].should eq prefix
30
29
  end
31
30
  after { Druuid.epoch = @old_epoch }
32
31
  end
33
32
  end
34
33
 
34
+
35
+ describe '.gen' do
36
+ it_behaves_like 'druuid generator', :gen
37
+
38
+ it 'generates a UUID' do
39
+ uuid = Druuid.gen
40
+ uuid.should_not eq Druuid.gen
41
+ end
42
+ end
43
+
35
44
  describe '.time' do
36
45
  let(:datetime) { Time.utc 2012, 2, 4, 8 }
37
46
  let(:uuid) { 11142943683383068069 }
@@ -54,4 +63,14 @@ describe Druuid do
54
63
  after { Druuid.epoch = @old_epoch }
55
64
  end
56
65
  end
66
+
67
+ describe '.min_for_time' do
68
+ it_behaves_like 'druuid generator', :min_for_time
69
+
70
+ let(:datetime) { Time.utc 2012, 2, 4, 8 }
71
+ it 'generates druuid without random bits' do
72
+ random_bits = Druuid.min_for_time(Time.now) & Integer("0b" + ("1" * Druuid::NUM_RANDOM_BITS))
73
+ random_bits.should be_zero
74
+ end
75
+ end
57
76
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: druuid
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stephen Celis
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-04-17 00:00:00.000000000 Z
11
+ date: 2017-01-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -66,10 +66,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
66
66
  version: '0'
67
67
  requirements: []
68
68
  rubyforge_project:
69
- rubygems_version: 2.2.2
69
+ rubygems_version: 2.5.1
70
70
  signing_key:
71
71
  specification_version: 4
72
72
  summary: Date-relative UUID generation
73
73
  test_files:
74
74
  - spec/druuid_spec.rb
75
- has_rdoc: