daybreak 0.0.1 → 0.0.2

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/daybreak.gemspec CHANGED
@@ -12,6 +12,7 @@ Gem::Specification.new do |gem|
12
12
  gem.test_files = gem.files.grep(%r{^(test)/})
13
13
  gem.name = "daybreak"
14
14
  gem.require_paths = ["lib"]
15
+ gem.licenses = ["MIT"]
15
16
  gem.version = Daybreak::VERSION
16
17
  gem.add_development_dependency 'simplecov'
17
18
  gem.add_development_dependency 'ruby-prof'
data/lib/daybreak/db.rb CHANGED
@@ -11,7 +11,8 @@ module Daybreak
11
11
  # @param [String] file the path to the db file
12
12
  # @param default the default value to store and return when a key is
13
13
  # not yet in the database.
14
- # @yield [key] blk a block that will return the default value to store.
14
+ # @yield [key] a block that will return the default value to store.
15
+ # @yieldparam [String] key the key to be stored.
15
16
  def initialize(file, default=nil, &blk)
16
17
  @file_name = file
17
18
  reset!
@@ -60,6 +61,9 @@ module Daybreak
60
61
  alias_method :get, :"[]"
61
62
 
62
63
  # Iterate over the key, value pairs in the database.
64
+ # @yield [key, value] blk the iterator for each key value pair.
65
+ # @yieldparam [String] key the key.
66
+ # @yieldparam value the value from the database.
63
67
  def each(&blk)
64
68
  keys.each { |k| blk.call(k, get(k)) }
65
69
  end
@@ -70,6 +74,7 @@ module Daybreak
70
74
  end
71
75
 
72
76
  # Does this db have a value for this key?
77
+ # @param [key#to_s] key the key to check if the DB has a key.
73
78
  def has_key?(key)
74
79
  @table.has_key? key.to_s
75
80
  end
@@ -104,8 +109,8 @@ module Daybreak
104
109
 
105
110
  # Reset and empty the database file.
106
111
  def empty!
107
- reset!
108
112
  @writer.truncate!
113
+ reset!
109
114
  end
110
115
 
111
116
  # Force all queued commits to be written to disk.
@@ -8,11 +8,13 @@ module Daybreak
8
8
  @file_name = file
9
9
  end
10
10
 
11
- # Close's the Reader's file descriptor
11
+ # Close the Reader's file descriptor.
12
12
  def close!
13
13
  @fd.close unless @fd.nil?
14
14
  end
15
15
 
16
+ # Read all values from the aof file.
17
+ #
16
18
  # Right now this is really expensive, every call to read will
17
19
  # close and reread the whole db file, but since cross process
18
20
  # consistency is handled by the user, this should be fair warning.
@@ -16,7 +16,8 @@ module Daybreak
16
16
  @data = data
17
17
  end
18
18
 
19
- # Read a record from an open io source, check the CRC, and set @key and @data
19
+ # Read a record from an open io source, check the CRC, and set <tt>@key</tt>
20
+ # and <tt>@data</tt>.
20
21
  # @param [#read] io an IO instance to read from
21
22
  def read(io)
22
23
  lock io do
@@ -28,7 +29,7 @@ module Daybreak
28
29
  self
29
30
  end
30
31
 
31
- # The serialized representation of the key value pair plus the CRC
32
+ # The serialized representation of the key value pair plus the CRC.
32
33
  # @return [String]
33
34
  def representation
34
35
  raise UnnacceptableDataError, "key and data must be defined" if @key.nil? || @data.nil?
@@ -1,4 +1,4 @@
1
1
  module Daybreak
2
2
  # Updated using SemVer
3
- VERSION = "0.0.1"
3
+ VERSION = "0.0.2"
4
4
  end
@@ -4,11 +4,9 @@ module Daybreak
4
4
  class Writer
5
5
  # Open up the file, ready it for binary and nonblocking writing.
6
6
  def initialize(file)
7
- @fd = File.open file, 'a'
8
- @fd.binmode
7
+ @file = file
9
8
 
10
- f = @fd.fcntl(Fcntl::F_GETFL, 0)
11
- @fd.fcntl(Fcntl::F_SETFL, Fcntl::O_NONBLOCK | f)
9
+ open!
12
10
 
13
11
  @worker = Worker.new(@fd)
14
12
  end
@@ -28,7 +26,7 @@ module Daybreak
28
26
  @worker.flush!
29
27
  end
30
28
 
31
- # Finish writing and close the file descriptor
29
+ # Finish writing and close the file descriptor.
32
30
  def close!
33
31
  finish!
34
32
  @fd.close
@@ -36,11 +34,21 @@ module Daybreak
36
34
 
37
35
  # Truncate the file.
38
36
  def truncate!
37
+ flush!
39
38
  @fd.truncate(0)
39
+ open!
40
40
  end
41
41
 
42
42
  private
43
43
 
44
+ def open!
45
+ @fd = File.open @file, 'a'
46
+ @fd.binmode
47
+
48
+ f = @fd.fcntl(Fcntl::F_GETFL, 0)
49
+ @fd.fcntl(Fcntl::F_SETFL, Fcntl::O_NONBLOCK | f)
50
+ end
51
+
44
52
  # Workers handle the actual fiddly bits of asynchronous io and
45
53
  # and handle background writes.
46
54
  class Worker
data/test/prof.rb CHANGED
@@ -4,7 +4,7 @@ require 'ruby-prof'
4
4
 
5
5
  result = RubyProf.profile do
6
6
  db = Daybreak::DB.new './t.db'
7
- 1000.times {|n| db[n] = n}
7
+ 100000.times {|n| db[n] = n}
8
8
  db.flush!
9
9
  end
10
10
 
data/test/test.rb CHANGED
@@ -59,10 +59,9 @@ describe "database functions" do
59
59
  db2.set! '1', 5
60
60
  @db.read!
61
61
  assert_equal @db['1'], 5
62
- @db.close!
63
62
  end
64
63
 
65
- it " should be able to handle another process's call to compact" do
64
+ it "should be able to handle another process's call to compact" do
66
65
  20.times {|i| @db.set i, i, true }
67
66
  db2 = Daybreak::DB.new DB_PATH
68
67
  20.times {|i| @db.set i, i + 1, true }
@@ -71,6 +70,13 @@ describe "database functions" do
71
70
  assert_equal 20, db2['19']
72
71
  end
73
72
 
73
+ it "can empty the database" do
74
+ 20.times {|i| @db[i] = i }
75
+ @db.empty!
76
+ db2 = Daybreak::DB.new DB_PATH
77
+ assert_equal nil, db2['19']
78
+ end
79
+
74
80
  after do
75
81
  @db.empty!
76
82
  @db.close!
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: daybreak
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-11-19 00:00:00.000000000 Z
12
+ date: 2012-11-26 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: simplecov
@@ -71,7 +71,8 @@ files:
71
71
  - test/test.rb
72
72
  - test/test_helper.rb
73
73
  homepage: http://propublica.github.com/daybreak/
74
- licenses: []
74
+ licenses:
75
+ - MIT
75
76
  post_install_message:
76
77
  rdoc_options: []
77
78
  require_paths:
@@ -90,7 +91,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
90
91
  version: '0'
91
92
  requirements: []
92
93
  rubyforge_project:
93
- rubygems_version: 1.8.24
94
+ rubygems_version: 1.8.23
94
95
  signing_key:
95
96
  specification_version: 3
96
97
  summary: Daybreak provides an in memory key-value store that is easily enumerable