zermelo 1.0.0 → 1.0.1

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: a3d59a8d79a91b5703b7b9b40760f6dd25e668dd
4
- data.tar.gz: 5f92bcd3c18207b37f2220aee647aa3cc08d1d36
3
+ metadata.gz: a7492dc2e67e9921a87e1dbea33eb721464dce5f
4
+ data.tar.gz: 62906c88696b9eb2fdfb8d2a94d0244184cd33da
5
5
  SHA512:
6
- metadata.gz: dff50d1c6b883cb73f33dbeaf379d7a8cc25f87bb55eec340850b0362be0f34857d39f2bbc6584203d0bd6acdbd8d2725cd5e910a89c3fb88e4d650d755a16e4
7
- data.tar.gz: c6e64def6eaa3fe7212fd78eb5221dba0e32babc74d7a04711134e411a0f69f10598d4617383b2d6051efa7ac54cfd0cd706d43c1748a4e29c6ab0b9f4d1d88e
6
+ metadata.gz: dde70cf8e7c241eeef5de1925a67719a6c3779cc7afc784ffdca13e5925a146e8b8cb1797b4f70eb1c377a990057a1f2a008f94156201c81bcf705f999c61f27
7
+ data.tar.gz: 62fe986cbc4ab69699bfc2286ef58c17b8fa12c4e79c0c11a2d82ce805637c7f66a002a94b3e785bb4cb7d34fc1ffe74a7ce6f47c1d7ffb8ed8b82f56e34de58
data/.travis.yml CHANGED
@@ -11,7 +11,7 @@ before_install:
11
11
  - wget http://s3.amazonaws.com/influxdb/influxdb_0.8.8_amd64.deb
12
12
  - sudo dpkg -i influxdb_0.8.8_amd64.deb
13
13
  - sudo /etc/init.d/influxdb start
14
- - sleep 10
14
+ - sleep 8
15
15
  - 'curl -X POST ''http://localhost:8086/db?u=root&p=root'' -d ''{"name": "zermelo_test"}'''
16
16
  - 'curl -X POST ''http://localhost:8086/db/zermelo_test/users?u=root&p=root'' -d
17
17
  ''{"name": "zermelo", "password": "zermelo"}'''
data/CHANGELOG.md ADDED
@@ -0,0 +1,10 @@
1
+ ## Zermelo Changelog
2
+
3
+ # 1.0.1 - 2015-02-04
4
+
5
+ * bugfix has_one class locking (779907d8d)
6
+ * add save! command, raise exceptions on error (#13)
7
+
8
+ # 1.0.0 - 2015-01-28
9
+
10
+ * Initial release
data/README.md CHANGED
@@ -42,7 +42,7 @@ Include **zermelo**'s Record module in the class you want to persist data from:
42
42
 
43
43
  ```ruby
44
44
  class Post
45
- include Zermelo:Record
45
+ include Zermelo::Record
46
46
  end
47
47
  ```
48
48
 
@@ -67,7 +67,7 @@ A data record without any actual data isn't very useful, so let's add a few simp
67
67
 
68
68
  ```ruby
69
69
  class Post
70
- include Zermelo:Record
70
+ include Zermelo::Record
71
71
  define_attributes :title => :string,
72
72
  :score => :integer,
73
73
  :timestamp => :timestamp,
@@ -116,7 +116,7 @@ So if we add tags to the Post data definition:
116
116
 
117
117
  ```ruby
118
118
  class Post
119
- include Zermelo:Record
119
+ include Zermelo::Record
120
120
  define_attributes :title => :string,
121
121
  :score => :integer,
122
122
  :timestamp => :timestamp,
@@ -161,7 +161,7 @@ So an attribute which should be present:
161
161
 
162
162
  ```ruby
163
163
  class Post
164
- include Zermelo:Record
164
+ include Zermelo::Record
165
165
  define_attributes :title => :string,
166
166
  :score => :integer
167
167
  validates :title, :presence => true
@@ -202,15 +202,15 @@ Another feature added by ActiveModel is the ability to detect changed data in re
202
202
 
203
203
  ```ruby
204
204
  class Author
205
- include Zermelo:Record
205
+ include Zermelo::Record
206
206
  end
207
207
 
208
208
  class Post
209
- include Zermelo:Record
209
+ include Zermelo::Record
210
210
  end
211
211
 
212
212
  class Comment
213
- include Zermelo:Record
213
+ include Zermelo::Record
214
214
  end
215
215
 
216
216
  Author.lock(Post, Comment) do
@@ -224,7 +224,7 @@ Assuming a saved `Post` instance has been created:
224
224
 
225
225
  ```ruby
226
226
  class Post
227
- include Zermelo:Record
227
+ include Zermelo::Record
228
228
  define_attributes :title => :string,
229
229
  :score => :integer,
230
230
  :timestamp => :timestamp,
@@ -303,12 +303,12 @@ Instances also have attribute accessors and the various methods included from th
303
303
 
304
304
  ```ruby
305
305
  class Post
306
- include Zermelo:Record
306
+ include Zermelo::Record
307
307
  has_many :comments, :class_name => 'Comment', :inverse_of => :post
308
308
  end
309
309
 
310
310
  class Comment
311
- include Zermelo:Record
311
+ include Zermelo::Record
312
312
  belongs_to :post, :class_name => 'Post', :inverse_of => :comments
313
313
  end
314
314
  ```
@@ -331,12 +331,12 @@ post.comments.add(comment1, comment2, comment3)
331
331
 
332
332
  ```ruby
333
333
  class User
334
- include Zermelo:Record
334
+ include Zermelo::Record
335
335
  has_one :preferences, :class_name => 'Preferences', :inverse_of => :user
336
336
  end
337
337
 
338
338
  class Preferences
339
- include Zermelo:Record
339
+ include Zermelo::Record
340
340
  belongs_to :user, :class_name => 'User', :inverse_of => :preferences
341
341
  end
342
342
 
@@ -398,7 +398,7 @@ Using the code from the instance attributes section, and adding indexing:
398
398
 
399
399
  ```ruby
400
400
  class Post
401
- include Zermelo:Record
401
+ include Zermelo::Record
402
402
  define_attributes :title => :string,
403
403
  :score => :integer,
404
404
  :timestamp => :timestamp,
@@ -25,7 +25,7 @@ module Zermelo
25
25
  end
26
26
 
27
27
  def value
28
- @parent.class.lock(*@associated_class) do
28
+ @parent.class.lock(@associated_class) do
29
29
  if id = @backend.get(@record_id_key)
30
30
  @associated_class.send(:load, id)
31
31
  else
@@ -1,8 +1,11 @@
1
1
  module Zermelo
2
+
3
+ class ZermeloError < RuntimeError
4
+ end
5
+
2
6
  module Records
3
7
  module Errors
4
-
5
- class RecordNotFound < RuntimeError
8
+ class RecordNotFound < ::Zermelo::ZermeloError
6
9
  attr_reader :klass, :id
7
10
 
8
11
  def initialize(k, i)
@@ -11,7 +14,7 @@ module Zermelo
11
14
  end
12
15
  end
13
16
 
14
- class RecordsNotFound < RuntimeError
17
+ class RecordsNotFound < ::Zermelo::ZermeloError
15
18
  attr_reader :klass, :ids
16
19
 
17
20
  def initialize(k, i)
@@ -19,6 +22,22 @@ module Zermelo
19
22
  @ids = i
20
23
  end
21
24
  end
22
- end
23
- end
25
+
26
+ class RecordInvalid < ::Zermelo::ZermeloError
27
+ attr_reader :record
28
+
29
+ def initialize(r)
30
+ @record = r
31
+ end
32
+ end
33
+
34
+ class RecordNotSaved < ::Zermelo::ZermeloError
35
+ attr_reader :record
36
+
37
+ def initialize(r)
38
+ @record = r
39
+ end
40
+ end
41
+ end
42
+ end
24
43
  end
@@ -74,12 +74,13 @@ module Zermelo
74
74
  save
75
75
  end
76
76
 
77
- def save
77
+ def save!
78
78
  return unless @is_new || self.changed?
79
79
  self.id ||= self.class.generate_id
80
- return false unless valid?
80
+ raise Zermelo::Records::Errors::RecordInvalid.new(self) unless valid?
81
81
 
82
82
  creating = !self.persisted?
83
+ saved = false
83
84
 
84
85
  run_callbacks( (creating ? :create : :update) ) do
85
86
 
@@ -123,8 +124,11 @@ module Zermelo
123
124
  end
124
125
 
125
126
  @is_new = false
127
+ saved = true
126
128
  end
127
129
 
130
+ raise Zermelo::Records::Errors::RecordNotSaved.new(self) unless saved
131
+
128
132
  # AM::Dirty -- private method in 4.1.0+, internal state before that
129
133
  if self.respond_to?(:changes_applied, true)
130
134
  changes_applied
@@ -136,6 +140,12 @@ module Zermelo
136
140
  true
137
141
  end
138
142
 
143
+ def save
144
+ save!
145
+ rescue Zermelo::Records::Errors::RecordInvalid, Zermelo::Records::Errors::RecordNotSaved
146
+ false
147
+ end
148
+
139
149
  def destroy
140
150
  raise "Record was not persisted" if !persisted?
141
151
 
@@ -1,3 +1,3 @@
1
1
  module Zermelo
2
- VERSION = '1.0.0'
2
+ VERSION = '1.0.1'
3
3
  end
@@ -32,6 +32,18 @@ describe Zermelo::Records::RedisRecord, :redis => true do
32
32
  end
33
33
  end
34
34
 
35
+ class RedisUnsavable
36
+ include Zermelo::Records::RedisRecord
37
+
38
+ define_attributes :name => :string
39
+
40
+ before_create :block_create
41
+
42
+ def block_create
43
+ false
44
+ end
45
+ end
46
+
35
47
  class RedisExampleChild
36
48
  include Zermelo::Records::RedisRecord
37
49
 
@@ -111,6 +123,22 @@ describe Zermelo::Records::RedisRecord, :redis => true do
111
123
  )
112
124
  end
113
125
 
126
+ it 'raises an RecordInvalid exception if validation fails while saving' do
127
+ example = Zermelo::RedisExample.new(:id => '1', :email => 'jsmith@example.com')
128
+
129
+ expect {
130
+ example.save!
131
+ }.to raise_error(Zermelo::Records::Errors::RecordInvalid)
132
+ end
133
+
134
+ it 'raises a RecordNotSaved exception if a callback blocks saving' do
135
+ example = Zermelo::RedisUnsavable.new(:id => '1', :name => 'not saving')
136
+
137
+ expect {
138
+ example.save!
139
+ }.to raise_error(Zermelo::Records::Errors::RecordNotSaved)
140
+ end
141
+
114
142
  it "finds a record by id in redis" do
115
143
  create_example(:id => '8', :name => 'John Jones',
116
144
  :email => 'jjones@example.com', :active => 'true')
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zermelo
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ali Graham
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-01-27 00:00:00.000000000 Z
11
+ date: 2015-02-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel
@@ -62,6 +62,7 @@ files:
62
62
  - ".gitignore"
63
63
  - ".rspec"
64
64
  - ".travis.yml"
65
+ - CHANGELOG.md
65
66
  - Gemfile
66
67
  - LICENSE.txt
67
68
  - README.md