synamoid 1.2.1 → 1.2.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a8ac7dcf3f6d93dc42cc10d5b0eecb940ac39297
4
- data.tar.gz: 89f8d6b38bd81b5dfe823f2738a62031d4352dda
3
+ metadata.gz: 1524b6ecb48d2bbea676257322ee7e5ddf8edf15
4
+ data.tar.gz: 4769c15ddf8e45b1cd1c4b733ab299ebe9a870ee
5
5
  SHA512:
6
- metadata.gz: 919a8a9b267f51c76a816a5360b2c30df74cc36d3c2a44be09ea8ce85c33c6aec80646b04ab73d32a387648319ff52aa8af9d85dcaef0fa2d78300ee9075e4df
7
- data.tar.gz: 18eba82fb6d53c96a30129ebd18760659a13f72005cf9ceb29e7ab7021f85b59252553ec9c0320e89e2535732bd0a0890a16bab86a05eb4d2b32135eb352e872
6
+ metadata.gz: a9f42341036d5329c14bbf24754b7a7c638973085f854f28a219224da0b356645e8c265aece2c55ff715c0e0b7dfdf7ca3fa9cf0745a34fb9b78e5f6420ca6f2
7
+ data.tar.gz: 64af375b597084c891418c8c34580f53dcde5ecce9c23a8758d275c1490330e8060eff3c349629f1bc64a0d9a36d531589cac4481eabe5262a4c31897dcf13f0
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
- # Dynamoid
1
+ # Synamoid
2
2
 
3
- Dynamoid is an ORM for Amazon's DynamoDB for Ruby applications. It
3
+ Synamoid is an ORM for Amazon's DynamoDB for Ruby applications. It
4
4
  provides similar functionality to ActiveRecord and improves on
5
5
  Amazon's existing
6
6
  [HashModel](http://docs.amazonwebservices.com/AWSRubySDK/latest/AWS/Record/HashModel.html)
@@ -12,14 +12,14 @@ But if you want a fast, scalable, simple, easy-to-use database (and a Gem that s
12
12
 
13
13
  ## Installation
14
14
 
15
- Installing Dynamoid is pretty simple. First include the Gem in your Gemfile:
15
+ Installing Synamoid is pretty simple. First include the Gem in your Gemfile:
16
16
 
17
17
  ```ruby
18
- gem 'dynamoid', '~> 1'
18
+ gem 'synamoid', '~> 1'
19
19
  ```
20
20
  ## Prerequisities
21
21
 
22
- Dynamoid depends on the aws-sdk, and this is tested on the current version of aws-sdk (~> 2), rails (~> 4).
22
+ Synamoid depends on the aws-sdk, and this is tested on the current version of aws-sdk (~> 2), rails (~> 4).
23
23
  Hence the configuration as needed for aws to work will be dealt with by aws setup.
24
24
 
25
25
  Here are the steps to setup aws-sdk.
@@ -30,7 +30,7 @@ gem 'aws-sdk', '~>2'
30
30
 
31
31
  (or) include the aws-sdk in your Gemfile.
32
32
 
33
- **NOTE:** Dynamoid-1.0 doesn't support aws-sdk Version 1 (Use Dynamoid Major Version 0 for aws-sdk 1)
33
+ **NOTE:** Synamoid-1.0 doesn't support aws-sdk Version 1 (Use Synamoid Major Version 0 for aws-sdk 1)
34
34
 
35
35
  Configure AWS access:
36
36
  [Reference](https://github.com/aws/aws-sdk-ruby)
@@ -51,12 +51,12 @@ Create config/initializers/aws.rb as follows:
51
51
  For a full list of the DDB regions, you can go
52
52
  [here](http://docs.aws.amazon.com/general/latest/gr/rande.html#ddb_region).
53
53
 
54
- Then you need to initialize Dynamoid config to get it going. Put code similar to this somewhere (a Rails initializer would be a great place for this if you're using Rails):
54
+ Then you need to initialize Synamoid config to get it going. Put code similar to this somewhere (a Rails initializer would be a great place for this if you're using Rails):
55
55
 
56
56
  ```ruby
57
- Dynamoid.configure do |config|
57
+ Synamoid.configure do |config|
58
58
  config.adapter = 'aws_sdk_v2' # This adapter establishes a connection to the DynamoDB servers using Amazon's own AWS gem.
59
- config.namespace = "dynamoid_app_development" # To namespace tables created by Dynamoid from other tables you might have. Set to nil to avoid namespacing.
59
+ config.namespace = "synamoid_app_development" # To namespace tables created by Synamoid from other tables you might have. Set to nil to avoid namespacing.
60
60
  config.warn_on_scan = true # Output a warning to the logger when you perform a scan rather than a query on a table.
61
61
  config.read_capacity = 5 # Read capacity for your tables
62
62
  config.write_capacity = 5 # Write capacity for your tables
@@ -69,28 +69,28 @@ Once you have the configuration set up, you need to move on to making models.
69
69
 
70
70
  ## Setup
71
71
 
72
- You *must* include ```Dynamoid::Document``` in every Dynamoid model.
72
+ You *must* include ```Synamoid::Document``` in every Synamoid model.
73
73
 
74
74
  ```ruby
75
75
  class User
76
- include Dynamoid::Document
76
+ include Synamoid::Document
77
77
 
78
78
  end
79
79
  ```
80
80
 
81
81
  ### Table
82
82
 
83
- Dynamoid has some sensible defaults for you when you create a new table, including the table name and the primary key column. But you can change those if you like on table creation.
83
+ Synamoid has some sensible defaults for you when you create a new table, including the table name and the primary key column. But you can change those if you like on table creation.
84
84
 
85
85
  ```ruby
86
86
  class User
87
- include Dynamoid::Document
87
+ include Synamoid::Document
88
88
 
89
89
  table :name => :awesome_users, :key => :user_id, :read_capacity => 5, :write_capacity => 5
90
90
  end
91
91
  ```
92
92
 
93
- These fields will not change an existing table: so specifying a new read_capacity and write_capacity here only works correctly for entirely new tables. Similarly, while Dynamoid will look for a table named `awesome_users` in your namespace, it won't change any existing tables to use that name; and if it does find a table with the correct name, it won't change its hash key, which it expects will be user_id. If this table doesn't exist yet, however, Dynamoid will create it with these options.
93
+ These fields will not change an existing table: so specifying a new read_capacity and write_capacity here only works correctly for entirely new tables. Similarly, while Synamoid will look for a table named `awesome_users` in your namespace, it won't change any existing tables to use that name; and if it does find a table with the correct name, it won't change its hash key, which it expects will be user_id. If this table doesn't exist yet, however, Synamoid will create it with these options.
94
94
 
95
95
  ### Fields
96
96
 
@@ -105,7 +105,7 @@ You get magic columns of id (string), created_at (datetime), and updated_at (dat
105
105
 
106
106
  ```ruby
107
107
  class User
108
- include Dynamoid::Document
108
+ include Synamoid::Document
109
109
 
110
110
  field :name
111
111
  field :email
@@ -130,26 +130,26 @@ To use a custom type for a field, suppose you have a `Money` type.
130
130
  class Money
131
131
  # ... your business logic ...
132
132
 
133
- def dynamoid_dump
133
+ def synamoid_dump
134
134
  "serialized representation as a string"
135
135
  end
136
136
 
137
- def self.dynamoid_load(serialized_str)
137
+ def self.synamoid_load(serialized_str)
138
138
  # parse serialized representation and return a Money instance
139
139
  Money.new(...)
140
140
  end
141
141
  end
142
142
 
143
143
  class User
144
- include Dynamoid::Document
144
+ include Synamoid::Document
145
145
 
146
146
  field :balance, Money
147
147
  end
148
148
  ```
149
149
 
150
- If you want to use a third-party class (which does not support `#dynamoid_dump` and `.dynamoid_load`)
151
- as your field type, you can use an adapter class providing `.dynamoid_dump` and `.dynamoid_load` class methods
152
- for your third-party class. (`.dynamoid_load` can remain the same from the previous example; here we just
150
+ If you want to use a third-party class (which does not support `#synamoid_dump` and `.synamoid_load`)
151
+ as your field type, you can use an adapter class providing `.synamoid_dump` and `.synamoid_load` class methods
152
+ for your third-party class. (`.synamoid_load` can remain the same from the previous example; here we just
153
153
  add a level of indirection for serializing.) Example:
154
154
 
155
155
  ```ruby
@@ -157,17 +157,17 @@ add a level of indirection for serializing.) Example:
157
157
  class Money; end
158
158
 
159
159
  class MoneyAdapter
160
- def self.dynamoid_load(money_serialized_str)
160
+ def self.synamoid_load(money_serialized_str)
161
161
  Money.new(...)
162
162
  end
163
163
 
164
- def self.dynamoid_dump(money_obj)
164
+ def self.synamoid_dump(money_obj)
165
165
  money_obj.value.to_s
166
166
  end
167
167
  end
168
168
 
169
169
  class User
170
- include Dynamoid::Document
170
+ include Synamoid::Document
171
171
 
172
172
  field :balance, MoneyAdapter
173
173
  end
@@ -176,20 +176,20 @@ add a level of indirection for serializing.) Example:
176
176
  Lastly, you can control the data type of your custom-class-backed field at the DynamoDB level.
177
177
  This is especially important if you want to use your custom field as a numeric range or for
178
178
  number-oriented queries. By default custom fields are persisted as a string attribute, but
179
- your custom class can override this with a `.dynamoid_field_type` class method, which would
179
+ your custom class can override this with a `.synamoid_field_type` class method, which would
180
180
  return either `:string` or `:number`.
181
- (DynamoDB supports some other attribute types, but Dynamoid does not yet.)
181
+ (DynamoDB supports some other attribute types, but Synamoid does not yet.)
182
182
 
183
183
 
184
184
  ### Associations
185
185
 
186
- Just like in ActiveRecord (or your other favorite ORM), Dynamoid uses associations to create links between models.
186
+ Just like in ActiveRecord (or your other favorite ORM), Synamoid uses associations to create links between models.
187
187
 
188
- The only supported associations (so far) are ```has_many```, ```has_one```, ```has_and_belongs_to_many```, and ```belongs_to```. Associations are very simple to create: just specify the type, the name, and then any options you'd like to pass to the association. If there's an inverse association either inferred or specified directly, Dynamoid will update both objects to point at each other.
188
+ The only supported associations (so far) are ```has_many```, ```has_one```, ```has_and_belongs_to_many```, and ```belongs_to```. Associations are very simple to create: just specify the type, the name, and then any options you'd like to pass to the association. If there's an inverse association either inferred or specified directly, Synamoid will update both objects to point at each other.
189
189
 
190
190
  ```ruby
191
191
  class User
192
- include Dynamoid::Document
192
+ include Synamoid::Document
193
193
 
194
194
  ...
195
195
 
@@ -203,7 +203,7 @@ class User
203
203
  end
204
204
 
205
205
  class Address
206
- include Dynamoid::Document
206
+ include Synamoid::Document
207
207
 
208
208
  ...
209
209
 
@@ -216,11 +216,11 @@ Contrary to what you'd expect, association information is always contained on th
216
216
 
217
217
  ### Validations
218
218
 
219
- Dynamoid bakes in ActiveModel validations, just like ActiveRecord does.
219
+ Synamoid bakes in ActiveModel validations, just like ActiveRecord does.
220
220
 
221
221
  ```ruby
222
222
  class User
223
- include Dynamoid::Document
223
+ include Synamoid::Document
224
224
 
225
225
  ...
226
226
 
@@ -233,11 +233,11 @@ To see more usage and examples of ActiveModel validations, check out the [Active
233
233
 
234
234
  ### Callbacks
235
235
 
236
- Dynamoid also employs ActiveModel callbacks. Right now, callbacks are defined on ```save```, ```update```, ```destroy```, which allows you to do ```before_``` or ```after_``` any of those.
236
+ Synamoid also employs ActiveModel callbacks. Right now, callbacks are defined on ```save```, ```update```, ```destroy```, which allows you to do ```before_``` or ```after_``` any of those.
237
237
 
238
238
  ```ruby
239
239
  class User
240
- include Dynamoid::Document
240
+ include Synamoid::Document
241
241
 
242
242
  ...
243
243
 
@@ -251,7 +251,7 @@ end
251
251
 
252
252
  ### Object Creation
253
253
 
254
- Dynamoid's syntax is generally very similar to ActiveRecord's. Making new objects is simple:
254
+ Synamoid's syntax is generally very similar to ActiveRecord's. Making new objects is simple:
255
255
 
256
256
  ```ruby
257
257
  u = User.new(:name => 'Josh')
@@ -289,7 +289,7 @@ And you can also query on associations:
289
289
  u.addresses.where(:city => 'Chicago').all
290
290
  ```
291
291
 
292
- But keep in mind Dynamoid -- and document-based storage systems in general -- are not drop-in replacements for existing relational databases. The above query does not efficiently perform a conditional join, but instead finds all the user's addresses and naively filters them in Ruby. For large associations this is a performance hit compared to relational database engines.
292
+ But keep in mind Synamoid -- and document-based storage systems in general -- are not drop-in replacements for existing relational databases. The above query does not efficiently perform a conditional join, but instead finds all the user's addresses and naively filters them in Ruby. For large associations this is a performance hit compared to relational database engines.
293
293
 
294
294
  You can also limit the number of evaluated records, or select a record from which to start, to support pagination:
295
295
 
@@ -297,7 +297,7 @@ You can also limit the number of evaluated records, or select a record from whic
297
297
  Address.eval_limit(5).start(address) # Only 5 addresses.
298
298
  ```
299
299
 
300
- For large queries that return many rows, Dynamoid can use AWS' support for requesting documents in batches:
300
+ For large queries that return many rows, Synamoid can use AWS' support for requesting documents in batches:
301
301
 
302
302
  ```ruby
303
303
  #Do some maintenance on the entire table without flooding DynamoDB
@@ -316,7 +316,7 @@ Address.where(:city => 'Chicago').consistent.all # Find all addresses where t
316
316
 
317
317
  ### Range Finding
318
318
 
319
- If you have a range index, Dynamoid provides a number of additional other convenience methods to make your life a little easier:
319
+ If you have a range index, Synamoid provides a number of additional other convenience methods to make your life a little easier:
320
320
 
321
321
  ```ruby
322
322
  User.where("created_at.gt" => DateTime.now - 1.day).all
@@ -327,7 +327,7 @@ It also supports .gte and .lte. Turning those into symbols and allowing a Rails
327
327
 
328
328
  ## Concurrency
329
329
 
330
- Dynamoid supports basic, ActiveRecord-like optimistic locking on save operations. Simply add a `lock_version` column to your table like so:
330
+ Synamoid supports basic, ActiveRecord-like optimistic locking on save operations. Simply add a `lock_version` column to your table like so:
331
331
 
332
332
  ```ruby
333
333
  class MyTable
@@ -339,7 +339,7 @@ class MyTable
339
339
  end
340
340
  ```
341
341
 
342
- In this example, all saves to `MyTable` will raise an `Dynamoid::Errors::StaleObjectError` if a concurrent process loaded, edited, and saved the same row. Your code should trap this exception, reload the row (so that it will pick up the newest values), and try the save again.
342
+ In this example, all saves to `MyTable` will raise an `Synamoid::Errors::StaleObjectError` if a concurrent process loaded, edited, and saved the same row. Your code should trap this exception, reload the row (so that it will pick up the newest values), and try the save again.
343
343
 
344
344
  Calls to `update` and `update!` also increment the `lock_version`, however they do not check the existing value. This guarantees that a update operation will raise an exception in a concurrent save operation, however a save operation will never cause an update to fail. Thus, `update` is useful & safe only for doing atomic operations (e.g. increment a value, add/remove from a set, etc), but should not be used in a read-modify-write pattern.
345
345
 
@@ -348,22 +348,22 @@ Calls to `update` and `update!` also increment the `lock_version`, however they
348
348
  In test environment you will most likely want to clean the database between test runs to keep tests completely isolated. This can be achieved like so
349
349
 
350
350
  ```ruby
351
- module DynamoidReset
351
+ module SynamoidReset
352
352
  def self.all
353
- Dynamoid.adapter.list_tables.each do |table|
353
+ Synamoid.adapter.list_tables.each do |table|
354
354
  # Only delete tables in our namespace
355
- if table =~ /^#{Dynamoid::Config.namespace}/
356
- Dynamoid.adapter.delete_table(table)
355
+ if table =~ /^#{Synamoid::Config.namespace}/
356
+ Synamoid.adapter.delete_table(table)
357
357
  end
358
358
  end
359
- Dynamoid.adapter.tables.clear
359
+ Synamoid.adapter.tables.clear
360
360
  # Recreate all tables to avoid unexpected errors
361
- Dynamoid.included_models.each(&:create_table)
361
+ Synamoid.included_models.each(&:create_table)
362
362
  end
363
363
  end
364
364
 
365
365
  # Reduce noise in test output
366
- Dynamoid.logger.level = Logger::FATAL
366
+ Synamoid.logger.level = Logger::FATAL
367
367
  ```
368
368
 
369
369
  If you're using RSpec you can invoke the above like so:
@@ -371,7 +371,7 @@ If you're using RSpec you can invoke the above like so:
371
371
  ```ruby
372
372
  RSpec.configure do |config|
373
373
  config.before(:each) do
374
- DynamoidReset.all
374
+ SynamoidReset.all
375
375
  end
376
376
  end
377
377
  ```
@@ -380,14 +380,14 @@ In Rails, you may also want to ensure you do not delete non-test data accidental
380
380
 
381
381
  ```ruby
382
382
  raise "Tests should be run in 'test' environment only" if Rails.env != 'test'
383
- Dynamoid.configure do |config|
383
+ Synamoid.configure do |config|
384
384
  config.namespace = "#{Rails.application.railtie_name}_#{Rails.env}"
385
385
  end
386
386
  ```
387
387
 
388
388
  ## Credits
389
389
 
390
- Dynamoid borrows code, structure, and even its name very liberally from the truly amazing [Mongoid](https://github.com/mongoid/mongoid). Without Mongoid to crib from none of this would have been possible, and I hope they don't mind me reusing their very awesome ideas to make DynamoDB just as accessible to the Ruby world as MongoDB.
390
+ Synamoid borrows code, structure, and even its name very liberally from the truly amazing [Mongoid](https://github.com/mongoid/mongoid). Without Mongoid to crib from none of this would have been possible, and I hope they don't mind me reusing their very awesome ideas to make DynamoDB just as accessible to the Ruby world as MongoDB.
391
391
 
392
392
  Also, without contributors the project wouldn't be nearly as awesome. So many thanks to:
393
393
 
@@ -429,8 +429,8 @@ Running the tests is fairly simple. You should have an instance of DynamoDB runn
429
429
  rake
430
430
  ```
431
431
 
432
- [![Build Status](https://travis-ci.org/Dynamoid/Dynamoid.svg)](https://travis-ci.org/Dynamoid/Dynamoid)
433
- [![Coverage Status](https://coveralls.io/repos/Dynamoid/Dynamoid/badge.svg?branch=master&service=github)](https://coveralls.io/github/Dynamoid/Dynamoid?branch=master)
432
+ [![Build Status](https://travis-ci.org/Synamoid/Synamoid.svg)](https://travis-ci.org/Synamoid/Synamoid)
433
+ [![Coverage Status](https://coveralls.io/repos/Synamoid/Synamoid/badge.svg?branch=master&service=github)](https://coveralls.io/github/Synamoid/Synamoid?branch=master)
434
434
 
435
435
  ## Copyright
436
436
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: synamoid
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.1
4
+ version: 1.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Josh Symonds
@@ -190,9 +190,8 @@ dependencies:
190
190
  - - ">="
191
191
  - !ruby/object:Gem::Version
192
192
  version: '0'
193
- description: Dynamoid is an ORM for Amazon's DynamoDB that supports offline development,
194
- associations, querying, and everything else you'd expect from an ActiveRecord-style
195
- replacement.
193
+ description: Synamoid is Dynamoid just change only dependency and name to push to
194
+ rubygem only nothing's mine.
196
195
  email:
197
196
  - peter.boling@gmail.com
198
197
  - brian@stellaservice.com
@@ -202,44 +201,9 @@ extra_rdoc_files:
202
201
  - LICENSE.txt
203
202
  - README.md
204
203
  files:
205
- - ".document"
206
- - ".gitignore"
207
- - ".rspec"
208
- - ".travis.yml"
209
- - CHANGELOG.md
210
- - Gemfile
211
204
  - LICENSE.txt
212
205
  - README.md
213
- - Rakefile
214
- - dynamoid.gemspec
215
- - lib/dynamoid.rb
216
- - lib/dynamoid/adapter.rb
217
- - lib/dynamoid/adapter_plugin/aws_sdk_v2.rb
218
- - lib/dynamoid/associations.rb
219
- - lib/dynamoid/associations/association.rb
220
- - lib/dynamoid/associations/belongs_to.rb
221
- - lib/dynamoid/associations/has_and_belongs_to_many.rb
222
- - lib/dynamoid/associations/has_many.rb
223
- - lib/dynamoid/associations/has_one.rb
224
- - lib/dynamoid/associations/many_association.rb
225
- - lib/dynamoid/associations/single_association.rb
226
- - lib/dynamoid/components.rb
227
- - lib/dynamoid/config.rb
228
- - lib/dynamoid/config/options.rb
229
- - lib/dynamoid/criteria.rb
230
- - lib/dynamoid/criteria/chain.rb
231
- - lib/dynamoid/dirty.rb
232
- - lib/dynamoid/document.rb
233
- - lib/dynamoid/errors.rb
234
- - lib/dynamoid/fields.rb
235
- - lib/dynamoid/finders.rb
236
- - lib/dynamoid/identity_map.rb
237
- - lib/dynamoid/indexes.rb
238
- - lib/dynamoid/middleware/identity_map.rb
239
- - lib/dynamoid/persistence.rb
240
- - lib/dynamoid/validations.rb
241
- - lib/dynamoid/version.rb
242
- homepage: http://github.com/Dynamoid/Dynamoid
206
+ homepage: http://github.com/Synamoid/Synamoid
243
207
  licenses:
244
208
  - MIT
245
209
  metadata: {}
@@ -262,5 +226,5 @@ rubyforge_project:
262
226
  rubygems_version: 2.5.1
263
227
  signing_key:
264
228
  specification_version: 4
265
- summary: Dynamoid is an ORM for Amazon's DynamoDB
229
+ summary: Synamoid is an ORM for Amazon's DynamoDB
266
230
  test_files: []
data/.document DELETED
@@ -1,5 +0,0 @@
1
- lib/**/*.rb
2
- bin/*
3
- -
4
- features/**/*.feature
5
- LICENSE.txt
data/.gitignore DELETED
@@ -1,67 +0,0 @@
1
- .project
2
-
3
- # rcov generated
4
- coverage
5
-
6
- # rdoc generated
7
- rdoc
8
-
9
- # yardoc generated
10
- .yardoc
11
- /_yardoc/
12
-
13
- # bundler
14
- /.bundle/
15
-
16
- # jeweler generated
17
- /pkg/
18
-
19
- # Have editor/IDE/OS specific files you need to ignore? Consider using a global gitignore:
20
- #
21
- # * Create a file at ~/.gitignore
22
- # * Include files you want ignored
23
- # * Run: git config --global core.excludesfile ~/.gitignore
24
- #
25
- # After doing this, these files will be ignored in all your git projects,
26
- # saving you from having to 'pollute' every project you touch with them
27
- #
28
- # Not sure what to needs to be ignored for particular editors/OSes? Here's some ideas to get you started. (Remember, remove the leading # of the line)
29
- #
30
- # For MacOS:
31
- #
32
- #.DS_Store
33
-
34
- # For TextMate
35
- #*.tmproj
36
- #tmtags
37
-
38
- # For emacs:
39
- #*~
40
- #\#*
41
- #.\#*
42
-
43
- # For vim:
44
- #*.swp
45
-
46
- # For redcar:
47
- #.redcar
48
-
49
- # For rubinius:
50
- #*.rbc
51
-
52
- # for RVM
53
- .rvmrc
54
-
55
- # For RubyMine:
56
- /.idea/
57
-
58
- # For Ctags
59
- .gemtags
60
- .tags
61
- .tags_sorted_by_file
62
-
63
- Gemfile.lock
64
- /doc/
65
- /spec/reports/
66
- /tmp/
67
- /spec/DynamoDBLocal-latest/