abbey 0.1.1 → 0.1.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/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: