lotus-model 0.2.2 → 0.2.3
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 +4 -4
- data/CHANGELOG.md +7 -0
- data/LICENSE.md +1 -1
- data/README.md +3 -3
- data/lib/lotus/model/adapters/abstract.rb +18 -0
- data/lib/lotus/model/adapters/file_system_adapter.rb +6 -0
- data/lib/lotus/model/adapters/memory_adapter.rb +13 -0
- data/lib/lotus/model/adapters/sql_adapter.rb +83 -0
- data/lib/lotus/model/mapping/coercer.rb +2 -2
- data/lib/lotus/model/version.rb +1 -1
- data/lib/lotus/repository.rb +43 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 21b47eded2bba593382296d73c0727abf8ddd66e
|
4
|
+
data.tar.gz: 754980ca9235ce3e9793107df6ca404b8149b989
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 513bf99f0c78f425195c4f5267458b50b393ce39ee0de5247b1a9c8a53605b9ae2f8c4ecfbaf01539dcbea67958c1866fbe30fe010709f6996aed86b0cbed78c
|
7
|
+
data.tar.gz: 2082546bca510c65e6ca5ee453dfc9d49500589893443078282bf69eac16070973febcefb2da1313ea19c4a06297941c5c3c966776f2015e9b4f7ed220edd71b
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,13 @@
|
|
1
1
|
# Lotus::Model
|
2
2
|
A persistence layer for Lotus
|
3
3
|
|
4
|
+
## v0.2.3 - 2015-02-13
|
5
|
+
### Added
|
6
|
+
- [Alfonso Uceda Pompa] Added support for database transactions in repositories
|
7
|
+
|
8
|
+
### Fixed
|
9
|
+
- [Luca Guidi] Ensure file system adapter old data is read when a new process is started
|
10
|
+
|
4
11
|
## v0.2.2 - 2015-01-18
|
5
12
|
### Added
|
6
13
|
- [Luca Guidi] Coerce entities when persisted
|
data/LICENSE.md
CHANGED
data/README.md
CHANGED
@@ -75,7 +75,7 @@ Lotus::Model.configure do
|
|
75
75
|
mapping do
|
76
76
|
collection :users do
|
77
77
|
entity User
|
78
|
-
|
78
|
+
repository UserRepository
|
79
79
|
|
80
80
|
attribute :id, Integer
|
81
81
|
attribute :name, String
|
@@ -421,7 +421,7 @@ Think of an adapter for Redis, it will probably employ different strategies to f
|
|
421
421
|
|
422
422
|
### Configurations
|
423
423
|
|
424
|
-
* Non-standard
|
424
|
+
* Non-standard repository can be configured for an entity, by setting `repository` on the collection.
|
425
425
|
|
426
426
|
```ruby
|
427
427
|
require 'lotus/model'
|
@@ -467,4 +467,4 @@ __Lotus::Model__ uses [Semantic Versioning 2.0.0](http://semver.org)
|
|
467
467
|
|
468
468
|
## Copyright
|
469
469
|
|
470
|
-
Copyright 2014 Luca Guidi – Released under MIT License
|
470
|
+
Copyright © 2014-2015 Luca Guidi – Released under MIT License
|
@@ -162,6 +162,24 @@ module Lotus
|
|
162
162
|
def query(collection, &blk)
|
163
163
|
raise NotImplementedError
|
164
164
|
end
|
165
|
+
|
166
|
+
# Wraps the given block in a transaction.
|
167
|
+
#
|
168
|
+
# For performance reasons the block isn't in the signature of the method,
|
169
|
+
# but it's yielded at the lower level.
|
170
|
+
#
|
171
|
+
# Please note that it's only supported by some databases.
|
172
|
+
# For this reason, the options may vary from adapter to adapter.
|
173
|
+
#
|
174
|
+
# @param options [Hash] options for transaction
|
175
|
+
#
|
176
|
+
# @see Lotus::Model::Adapters::SqlAdapter#transaction
|
177
|
+
# @see Lotus::Model::Adapters::MemoryAdapter#transaction
|
178
|
+
#
|
179
|
+
# @since 0.2.3
|
180
|
+
def transaction(options = {})
|
181
|
+
raise NotImplementedError
|
182
|
+
end
|
165
183
|
end
|
166
184
|
end
|
167
185
|
end
|
@@ -231,6 +231,12 @@ module Lotus
|
|
231
231
|
def prepare(uri)
|
232
232
|
@root = Pathname.new(uri.sub(FILE_SCHEME, ''))
|
233
233
|
@root.mkpath
|
234
|
+
|
235
|
+
# Eager load previously persisted data.
|
236
|
+
@root.each_child do |collection|
|
237
|
+
collection = collection.basename.to_s.to_sym
|
238
|
+
read(collection)
|
239
|
+
end
|
234
240
|
end
|
235
241
|
|
236
242
|
# @api private
|
@@ -127,6 +127,19 @@ module Lotus
|
|
127
127
|
end
|
128
128
|
end
|
129
129
|
|
130
|
+
# WARNING: this is a no-op. For "real" transactions please use
|
131
|
+
# `SqlAdapter` or another adapter that supports them
|
132
|
+
#
|
133
|
+
# @param options [Hash] options for transaction
|
134
|
+
#
|
135
|
+
# @see Lotus::Model::Adapters::SqlAdapter#transaction
|
136
|
+
# @see Lotus::Model::Adapters::Abstract#transaction
|
137
|
+
#
|
138
|
+
# @since 0.2.3
|
139
|
+
def transaction(options = {})
|
140
|
+
yield
|
141
|
+
end
|
142
|
+
|
130
143
|
private
|
131
144
|
|
132
145
|
# Returns a collection from the given name.
|
@@ -132,6 +132,89 @@ module Lotus
|
|
132
132
|
Sql::Query.new(_collection(collection), context, &blk)
|
133
133
|
end
|
134
134
|
|
135
|
+
# Wraps the given block in a transaction.
|
136
|
+
#
|
137
|
+
# For performance reasons the block isn't in the signature of the method,
|
138
|
+
# but it's yielded at the lower level.
|
139
|
+
#
|
140
|
+
# @param options [Hash] options for transaction
|
141
|
+
# @option rollback [Symbol] the optional rollback policy: `:always` or
|
142
|
+
# `:reraise`.
|
143
|
+
#
|
144
|
+
# @see Lotus::Repository::ClassMethods#transaction
|
145
|
+
#
|
146
|
+
# @since 0.2.3
|
147
|
+
# @api private
|
148
|
+
#
|
149
|
+
# @example Basic usage
|
150
|
+
# require 'lotus/model'
|
151
|
+
#
|
152
|
+
# class Article
|
153
|
+
# include Lotus::Entity
|
154
|
+
# attributes :title, :body
|
155
|
+
# end
|
156
|
+
#
|
157
|
+
# class ArticleRepository
|
158
|
+
# include Lotus::Repository
|
159
|
+
# end
|
160
|
+
#
|
161
|
+
# article = Article.new(title: 'Introducing transactions',
|
162
|
+
# body: 'lorem ipsum')
|
163
|
+
#
|
164
|
+
# ArticleRepository.transaction do
|
165
|
+
# ArticleRepository.dangerous_operation!(article) # => RuntimeError
|
166
|
+
# # !!! ROLLBACK !!!
|
167
|
+
# end
|
168
|
+
#
|
169
|
+
# @example Policy rollback always
|
170
|
+
# require 'lotus/model'
|
171
|
+
#
|
172
|
+
# class Article
|
173
|
+
# include Lotus::Entity
|
174
|
+
# attributes :title, :body
|
175
|
+
# end
|
176
|
+
#
|
177
|
+
# class ArticleRepository
|
178
|
+
# include Lotus::Repository
|
179
|
+
# end
|
180
|
+
#
|
181
|
+
# article = Article.new(title: 'Introducing transactions',
|
182
|
+
# body: 'lorem ipsum')
|
183
|
+
#
|
184
|
+
# ArticleRepository.transaction(rollback: :always) do
|
185
|
+
# ArticleRepository.create(article)
|
186
|
+
# # !!! ROLLBACK !!!
|
187
|
+
# end
|
188
|
+
#
|
189
|
+
# # The operation is rolled back, even in no exceptions were raised.
|
190
|
+
#
|
191
|
+
# @example Policy rollback reraise
|
192
|
+
# require 'lotus/model'
|
193
|
+
#
|
194
|
+
# class Article
|
195
|
+
# include Lotus::Entity
|
196
|
+
# attributes :title, :body
|
197
|
+
# end
|
198
|
+
#
|
199
|
+
# class ArticleRepository
|
200
|
+
# include Lotus::Repository
|
201
|
+
# end
|
202
|
+
#
|
203
|
+
# article = Article.new(title: 'Introducing transactions',
|
204
|
+
# body: 'lorem ipsum')
|
205
|
+
#
|
206
|
+
# ArticleRepository.transaction(rollback: :reraise) do
|
207
|
+
# ArticleRepository.dangerous_operation!(article) # => RuntimeError
|
208
|
+
# # !!! ROLLBACK !!!
|
209
|
+
# end # => RuntimeError
|
210
|
+
#
|
211
|
+
# # The operation is rolled back, but RuntimeError is re-raised.
|
212
|
+
def transaction(options = {})
|
213
|
+
@connection.transaction(options) do
|
214
|
+
yield
|
215
|
+
end
|
216
|
+
end
|
217
|
+
|
135
218
|
private
|
136
219
|
|
137
220
|
# Returns a collection from the given name.
|
@@ -55,7 +55,7 @@ module Lotus
|
|
55
55
|
}
|
56
56
|
end.join("\n")
|
57
57
|
|
58
|
-
instance_eval
|
58
|
+
instance_eval <<-EVAL, __FILE__, __LINE__
|
59
59
|
def to_record(entity)
|
60
60
|
if entity.id
|
61
61
|
Hash[#{ @collection.attributes.map{|name,(klass,mapped)| ":#{mapped},Lotus::Model::Mapping::Coercions.#{klass}(entity.#{name})"}.join(',') }]
|
@@ -71,7 +71,7 @@ module Lotus
|
|
71
71
|
end
|
72
72
|
|
73
73
|
#{ code }
|
74
|
-
|
74
|
+
EVAL
|
75
75
|
end
|
76
76
|
end
|
77
77
|
end
|
data/lib/lotus/model/version.rb
CHANGED
data/lib/lotus/repository.rb
CHANGED
@@ -505,6 +505,49 @@ module Lotus
|
|
505
505
|
@adapter.clear(collection)
|
506
506
|
end
|
507
507
|
|
508
|
+
# Wraps the given block in a transaction.
|
509
|
+
#
|
510
|
+
# For performance reasons the block isn't in the signature of the method,
|
511
|
+
# but it's yielded at the lower level.
|
512
|
+
#
|
513
|
+
# Please note that it's only supported by some databases.
|
514
|
+
# For this reason, the accepted options may be different from adapter to
|
515
|
+
# adapter.
|
516
|
+
#
|
517
|
+
# For advanced scenarios, please check the documentation of each adapter.
|
518
|
+
#
|
519
|
+
# @param options [Hash] options for transaction
|
520
|
+
#
|
521
|
+
# @see Lotus::Model::Adapters::SqlAdapter#transaction
|
522
|
+
# @see Lotus::Model::Adapters::MemoryAdapter#transaction
|
523
|
+
#
|
524
|
+
# @since 0.2.3
|
525
|
+
#
|
526
|
+
# @example Basic usage with SQL adapter
|
527
|
+
# require 'lotus/model'
|
528
|
+
#
|
529
|
+
# class Article
|
530
|
+
# include Lotus::Entity
|
531
|
+
# attributes :title, :body
|
532
|
+
# end
|
533
|
+
#
|
534
|
+
# class ArticleRepository
|
535
|
+
# include Lotus::Repository
|
536
|
+
# end
|
537
|
+
#
|
538
|
+
# article = Article.new(title: 'Introducing transactions',
|
539
|
+
# body: 'lorem ipsum')
|
540
|
+
#
|
541
|
+
# ArticleRepository.transaction do
|
542
|
+
# ArticleRepository.dangerous_operation!(article) # => RuntimeError
|
543
|
+
# # !!! ROLLBACK !!!
|
544
|
+
# end
|
545
|
+
def transaction(options = {})
|
546
|
+
@adapter.transaction(options) do
|
547
|
+
yield
|
548
|
+
end
|
549
|
+
end
|
550
|
+
|
508
551
|
private
|
509
552
|
# Fabricates a query and yields the given block to access the low level
|
510
553
|
# APIs exposed by the query itself.
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lotus-model
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Luca Guidi
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2015-
|
12
|
+
date: 2015-02-13 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: lotus-utils
|