abbey 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -8,7 +8,7 @@ A simple persistence library with human-readable representation. Uses good 'ol f
8
8
 
9
9
  ## Usage
10
10
 
11
- Warning: Abbey intentionally uses JSON, therefore it inherits its' caveats. Most notably, symbols are serialized to strings.
11
+ Warning: Abbey intentionally uses JSON, therefore it inherits it's caveats. Most notably, symbols are serialized to strings.
12
12
 
13
13
  ```ruby
14
14
  require 'abbey'
@@ -39,7 +39,7 @@ abbey.exists?(:users, :admin) # => false
39
39
 
40
40
  abbey.settings.namespaces # => [:users, :books]
41
41
 
42
- abbey.settings.logger # => #<Loger....>
42
+ abbey.settings.logger # => #<Logger....>
43
43
  ```
44
44
 
45
45
  ## License
data/abbey.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "abbey"
8
- s.version = "0.1.1"
8
+ s.version = "0.1.2"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Pavel Kalvoda"]
12
- s.date = "2011-11-17"
12
+ s.date = "2011-12-03"
13
13
  s.description = "Primitive JSON data store. Key-value structure with namespaces."
14
14
  s.email = "me@pavelkalvoda.com"
15
15
  s.extra_rdoc_files = [
@@ -1,3 +1,6 @@
1
+ require 'fileutils'
2
+ require 'tempfile'
3
+
1
4
  module Abbey
2
5
 
3
6
  # Represents the store. Manages the data for you.
@@ -41,20 +44,6 @@ module Abbey
41
44
  end
42
45
  end
43
46
 
44
- # Save an item
45
- # @param namespace [String, Fixnum, Symbol or any other object whose #to_s method returns string]
46
- # @param key [String, Fixnum, Symbol or any other object whose #to_s method returns string]
47
- # @param data [Object]
48
- # @return void
49
- def save(namespace, key, data)
50
- path = make_path(namespace, key)
51
- raise ItemAlreadyPresentError, "Item '#{make_key(namespace,key)}' already present" if File.exist?(path)
52
- f = File.new(path, File::CREAT | File::RDWR)
53
- size = f.write(MultiJson.encode(data))
54
- f.close
55
- settings.logger.info("Written #{make_key(namespace, key)} (size: #{size})")
56
- end
57
-
58
47
  # Fetch an item
59
48
  # @param namespace [String, Fixnum, Symbol or any other object whose #to_s method returns string]
60
49
  # @param key [String, Fixnum, Symbol or any other object whose #to_s method returns string]
@@ -76,14 +65,24 @@ module Abbey
76
65
  exists
77
66
  end
78
67
 
68
+ # Save an item
69
+ # @param namespace [String, Fixnum, Symbol or any other object whose #to_s method returns string]
70
+ # @param key [String, Fixnum, Symbol or any other object whose #to_s method returns string]
71
+ # @param data [Object]
72
+ # @return void
73
+ def save(namespace, key, data)
74
+ raise ItemAlreadyPresentError, "Item '#{make_key(namespace,key)}' already exists" if exists?(namespace, key)
75
+ unsafe_save(namespace, key, data)
76
+ end
77
+
79
78
  # Update an item. Shorthand for delete & save
80
79
  # @param namespace [String, Fixnum, Symbol or any other object whose #to_s method returns string]
81
80
  # @param key [String, Fixnum, Symbol or any other object whose #to_s method returns string]
82
81
  # @param data [Object]
83
82
  # @return void
84
83
  def update(namespace, key, data)
85
- delete(namespace, key)
86
- save(namespace, key, data)
84
+ raise ItemNotFoundError, "Item '#{make_key(namespace,key)}' not found" unless exists?(namespace, key)
85
+ unsafe_save(namespace, key, data)
87
86
  end
88
87
 
89
88
  # Delete an item
@@ -92,7 +91,7 @@ module Abbey
92
91
  # @return void
93
92
  def delete(namespace, key)
94
93
  path = make_path(namespace, key)
95
- raise ItemNotFoundError, "Item '#{make_key(namespace,key)}' already exists" unless exists?(namespace, key)
94
+ raise ItemNotFoundError, "Item '#{make_key(namespace,key)}' not found" unless exists?(namespace, key)
96
95
  File.delete(path)
97
96
  settings.logger.info("Deleted #{make_key(namespace,key)}")
98
97
  end
@@ -153,5 +152,20 @@ module Abbey
153
152
  def make_key(namespace, key)
154
153
  namespace.to_s + ':' + key.to_s
155
154
  end
155
+
156
+ # Save an item without any checks
157
+ # @param namespace [String, Fixnum, Symbol or any other object whose #to_s method returns string]
158
+ # @param key [String, Fixnum, Symbol or any other object whose #to_s method returns string]
159
+ # @param data [Object]
160
+ # @return void
161
+ def unsafe_save(namespace, key, data)
162
+ path = make_path(namespace, key)
163
+ tmp = Tempfile.new('abbey')
164
+ size = tmp.write(MultiJson.encode(data))
165
+ tmp.close
166
+ FileUtils.mv(tmp.path, path)
167
+ settings.logger.info("Written #{make_key(namespace, key)} (size: #{size})")
168
+ tmp.unlink
169
+ end
156
170
  end
157
171
  end
data/lib/version.rb CHANGED
@@ -2,7 +2,7 @@ module Abbey
2
2
  module Version
3
3
  MAJOR = 0
4
4
  MINOR = 1
5
- PATCH = 1
5
+ PATCH = 2
6
6
  BUILD = nil
7
7
 
8
8
  STRING = [MAJOR, MINOR, PATCH, BUILD].compact.join('.')
@@ -78,6 +78,13 @@ class AbbeyTest < Test::Unit::TestCase
78
78
  assert_equal({"a" => 2}, @abbey.get(:ns1,:key))
79
79
  end
80
80
 
81
+ def test_it_wont_update_nonexistent_item
82
+ @abbey.set_up!
83
+ assert_raise Abbey::ItemNotFoundError do
84
+ @abbey.update(:ns1, :key, {"a" => 2})
85
+ end
86
+ end
87
+
81
88
  def test_it_will_drop_items
82
89
  @abbey.set_up!
83
90
  @abbey.save(:ns1, :key, {"a" => 1})
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: abbey
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-11-17 00:00:00.000000000 Z
12
+ date: 2011-12-03 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: multi_json
16
- requirement: &6562960 !ruby/object:Gem::Requirement
16
+ requirement: &20705080 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *6562960
24
+ version_requirements: *20705080
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rake
27
- requirement: &6560780 !ruby/object:Gem::Requirement
27
+ requirement: &20704580 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *6560780
35
+ version_requirements: *20704580
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: bundler
38
- requirement: &6559960 !ruby/object:Gem::Requirement
38
+ requirement: &20704040 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *6559960
46
+ version_requirements: *20704040
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: jeweler
49
- requirement: &6610240 !ruby/object:Gem::Requirement
49
+ requirement: &20703520 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: 1.6.4
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *6610240
57
+ version_requirements: *20703520
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: rcov
60
- requirement: &6608820 !ruby/object:Gem::Requirement
60
+ requirement: &20702840 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,7 +65,7 @@ dependencies:
65
65
  version: '0'
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *6608820
68
+ version_requirements: *20702840
69
69
  description: Primitive JSON data store. Key-value structure with namespaces.
70
70
  email: me@pavelkalvoda.com
71
71
  executables: []
@@ -104,7 +104,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
104
104
  version: '0'
105
105
  segments:
106
106
  - 0
107
- hash: -1187583575974686402
107
+ hash: -3484515229656058223
108
108
  required_rubygems_version: !ruby/object:Gem::Requirement
109
109
  none: false
110
110
  requirements: