tiny_dyno 0.1.0
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 +7 -0
- data/.gitignore +10 -0
- data/.rspec +3 -0
- data/.ruby-version +1 -0
- data/.simplecov +2 -0
- data/.travis.yml +4 -0
- data/Gemfile +4 -0
- data/Guardfile +70 -0
- data/LICENSE +41 -0
- data/README.md +121 -0
- data/Rakefile +6 -0
- data/bin/console +8 -0
- data/bin/fastcheck +25 -0
- data/bin/setup +7 -0
- data/bin/tracer +19 -0
- data/ci/tests.sh +52 -0
- data/lib/config/locales/en.yml +168 -0
- data/lib/tiny_dyno.rb +44 -0
- data/lib/tiny_dyno/adapter.rb +48 -0
- data/lib/tiny_dyno/adapter/items.rb +27 -0
- data/lib/tiny_dyno/adapter/tables.rb +103 -0
- data/lib/tiny_dyno/attributes.rb +157 -0
- data/lib/tiny_dyno/attributes/readonly.rb +56 -0
- data/lib/tiny_dyno/changeable.rb +68 -0
- data/lib/tiny_dyno/document.rb +100 -0
- data/lib/tiny_dyno/document_composition.rb +49 -0
- data/lib/tiny_dyno/errors.rb +4 -0
- data/lib/tiny_dyno/errors/attribute_errors.rb +25 -0
- data/lib/tiny_dyno/errors/hash_key_errors.rb +78 -0
- data/lib/tiny_dyno/errors/tiny_dyno_error.rb +85 -0
- data/lib/tiny_dyno/extensions.rb +1 -0
- data/lib/tiny_dyno/extensions/module.rb +28 -0
- data/lib/tiny_dyno/fields.rb +299 -0
- data/lib/tiny_dyno/fields/standard.rb +64 -0
- data/lib/tiny_dyno/hash_keys.rb +134 -0
- data/lib/tiny_dyno/loggable.rb +69 -0
- data/lib/tiny_dyno/persistable.rb +88 -0
- data/lib/tiny_dyno/range_attributes.rb +15 -0
- data/lib/tiny_dyno/stateful.rb +95 -0
- data/lib/tiny_dyno/tables.rb +98 -0
- data/lib/tiny_dyno/version.rb +3 -0
- data/tiny_dyno.gemspec +41 -0
- metadata +226 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: e189c01a3f68cd0b380b35eaea4a0edbfa52578c
|
4
|
+
data.tar.gz: 5be36bd2c1f97a3a7a7edf4be34581b3b3de09cd
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 25161a1faf09b898f40894dce7234accc7aa1d35b2d072fa17b0e5d09fbc8c41e15629d454ea6743fb079b08b5925f902acc4b90de8ccf1b440ac42a7dda5bd7
|
7
|
+
data.tar.gz: bc56b228fc8ed10ea00eecef27d6536e77dbe323d994bb3387a99ef80f0c2450a015ff1a9bda363d5bc97adbdcba3220c166ff4f63bc07b0d0f0658a749c8d02
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.2.2
|
data/.simplecov
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/Guardfile
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
# A sample Guardfile
|
2
|
+
# More info at https://github.com/guard/guard#readme
|
3
|
+
|
4
|
+
## Uncomment and set this to only include directories you want to watch
|
5
|
+
directories %w(lib spec) \
|
6
|
+
# .select{|d| Dir.exists?(d) ? d : UI.warning("Directory #{d} does not exist")}
|
7
|
+
|
8
|
+
## Note: if you are using the `directories` clause above and you are not
|
9
|
+
## watching the project directory ('.'), then you will want to move
|
10
|
+
## the Guardfile to a watched dir and symlink it back, e.g.
|
11
|
+
#
|
12
|
+
# $ mkdir config
|
13
|
+
# $ mv Guardfile config/
|
14
|
+
# $ ln -s config/Guardfile .
|
15
|
+
#
|
16
|
+
# and, you'll have to watch "config/Guardfile" instead of "Guardfile"
|
17
|
+
|
18
|
+
# Note: The cmd option is now required due to the increasing number of ways
|
19
|
+
# rspec may be run, below are examples of the most common uses.
|
20
|
+
# * bundler: 'bundle exec rspec'
|
21
|
+
# * bundler binstubs: 'bin/rspec'
|
22
|
+
# * spring: 'bin/rspec' (This will use spring if running and you have
|
23
|
+
# installed the spring binstubs per the docs)
|
24
|
+
# * zeus: 'zeus rspec' (requires the server to be started separately)
|
25
|
+
# * 'just' rspec: 'rspec'
|
26
|
+
|
27
|
+
guard :rspec, cmd: "bundle exec rspec spec" do
|
28
|
+
require "guard/rspec/dsl"
|
29
|
+
dsl = Guard::RSpec::Dsl.new(self)
|
30
|
+
|
31
|
+
# Feel free to open issues for suggestions and improvements
|
32
|
+
|
33
|
+
# RSpec files
|
34
|
+
rspec = dsl.rspec
|
35
|
+
watch(rspec.spec_helper) { rspec.spec_dir }
|
36
|
+
watch(rspec.spec_support) { rspec.spec_dir }
|
37
|
+
watch(rspec.spec_files)
|
38
|
+
|
39
|
+
# Ruby files
|
40
|
+
ruby = dsl.ruby
|
41
|
+
dsl.watch_spec_files_for(ruby.lib_files)
|
42
|
+
|
43
|
+
# Rails files
|
44
|
+
rails = dsl.rails(view_extensions: %w(erb haml slim))
|
45
|
+
dsl.watch_spec_files_for(rails.app_files)
|
46
|
+
dsl.watch_spec_files_for(rails.views)
|
47
|
+
|
48
|
+
watch(rails.controllers) do |m|
|
49
|
+
[
|
50
|
+
rspec.spec.("routing/#{m[1]}_routing"),
|
51
|
+
rspec.spec.("controllers/#{m[1]}_controller"),
|
52
|
+
rspec.spec.("acceptance/#{m[1]}")
|
53
|
+
]
|
54
|
+
end
|
55
|
+
|
56
|
+
# Rails config changes
|
57
|
+
watch(rails.spec_helper) { rspec.spec_dir }
|
58
|
+
watch(rails.routes) { "#{rspec.spec_dir}/routing" }
|
59
|
+
watch(rails.app_controller) { "#{rspec.spec_dir}/controllers" }
|
60
|
+
|
61
|
+
# Capybara features specs
|
62
|
+
watch(rails.view_dirs) { |m| rspec.spec.("features/#{m[1]}") }
|
63
|
+
watch(rails.layouts) { |m| rspec.spec.("features/#{m[1]}") }
|
64
|
+
|
65
|
+
# Turnip features and steps
|
66
|
+
watch(%r{^spec/acceptance/(.+)\.feature$})
|
67
|
+
watch(%r{^spec/acceptance/steps/(.+)_steps\.rb$}) do |m|
|
68
|
+
Dir[File.join("**/#{m[1]}.feature")][0] || "spec/acceptance"
|
69
|
+
end
|
70
|
+
end
|
data/LICENSE
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
Copyright (c) 2015 Tobias Gerschner, RataWorks
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
21
|
+
|
22
|
+
Copyright (c) 2009-2013 Durran Jordan
|
23
|
+
|
24
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
25
|
+
a copy of this software and associated documentation files (the
|
26
|
+
"Software"), to deal in the Software without restriction, including
|
27
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
28
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
29
|
+
permit persons to whom the Software is furnished to do so, subject to
|
30
|
+
the following conditions:
|
31
|
+
|
32
|
+
The above copyright notice and this permission notice shall be
|
33
|
+
included in all copies or substantial portions of the Software.
|
34
|
+
|
35
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
36
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
37
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
38
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
39
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
40
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
41
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,121 @@
|
|
1
|
+
Minimalist ODM for commonly used operations with dynamodb.
|
2
|
+
==========================================================
|
3
|
+
|
4
|
+
This is not a complete ODM for DynamoDB!
|
5
|
+
Check https://gitter.im/aws/aws-sdk-ruby or http://ruby.awsblog.com/ for that instead, rumour has it one might be appearing soon.
|
6
|
+
|
7
|
+
This work is heavily influenced in layout by the awesome mongoid gem, which I have used for years. Since I shouldn't be writing a full ODM I have borrowed as much as needed, especially to implement ActiveSupport::Concern way of module dependency resolution.
|
8
|
+
I also shied away from reinventing perfectly valid methods if they were in Mongoid. So, if code looks familiar to you, it probably is.
|
9
|
+
|
10
|
+
So, thanks goes to Durran Jordan @ mongoid/mongoid.
|
11
|
+
|
12
|
+
Beyond that, TinyDyno is a <working>, no frills abstraction to work with DynamoDB on EC2 within ruby apps.
|
13
|
+
|
14
|
+
If you're new to DynamoDB, it is highly recommended to read the following:
|
15
|
+
|
16
|
+
[GettingStartedDynamoDB](http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GettingStartedDynamoDB.html)
|
17
|
+
|
18
|
+
[GuidelinesForTables](http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GuidelinesForTables.html)
|
19
|
+
|
20
|
+
Supported Operations
|
21
|
+
--------------------
|
22
|
+
|
23
|
+
create_table
|
24
|
+
------------
|
25
|
+
|
26
|
+
Indexes in dynamo are created at table creation time.
|
27
|
+
|
28
|
+
either Model.create_table
|
29
|
+
|
30
|
+
rake tiny_dyno:create_tables
|
31
|
+
|
32
|
+
delete_table
|
33
|
+
------------
|
34
|
+
|
35
|
+
Model.delete_table
|
36
|
+
|
37
|
+
put_item
|
38
|
+
--------
|
39
|
+
|
40
|
+
http://docs.aws.amazon.com/sdkforruby/api/Aws/DynamoDB/Client.html#put_item-instance_method
|
41
|
+
Invoked upon create/create!
|
42
|
+
|
43
|
+
supported keys;
|
44
|
+
|
45
|
+
* table_name
|
46
|
+
* item
|
47
|
+
|
48
|
+
update_item
|
49
|
+
-----------
|
50
|
+
|
51
|
+
http://docs.aws.amazon.com/sdkforruby/api/Aws/DynamoDB/Client.html#update_item-instance_method
|
52
|
+
Invoked upon save on existing objects.
|
53
|
+
|
54
|
+
supported_keys;
|
55
|
+
|
56
|
+
* table_name
|
57
|
+
* key
|
58
|
+
* attribute_updates
|
59
|
+
|
60
|
+
delete_item
|
61
|
+
------------
|
62
|
+
|
63
|
+
* hash_key
|
64
|
+
|
65
|
+
Installation
|
66
|
+
============
|
67
|
+
|
68
|
+
Add this line to your application's Gemfile:
|
69
|
+
|
70
|
+
```ruby
|
71
|
+
gem 'tiny_dyno'
|
72
|
+
```
|
73
|
+
|
74
|
+
And then execute:
|
75
|
+
|
76
|
+
$ bundle
|
77
|
+
|
78
|
+
Or install it yourself as:
|
79
|
+
|
80
|
+
$ gem install tiny_dyno
|
81
|
+
|
82
|
+
## Usage
|
83
|
+
|
84
|
+
```
|
85
|
+
|
86
|
+
require 'tiny_dyno'
|
87
|
+
class Person
|
88
|
+
include TinyDyno::Document
|
89
|
+
|
90
|
+
hash_key :id, type: Integer
|
91
|
+
|
92
|
+
field :first_name, type: String
|
93
|
+
field :last_name, type: String
|
94
|
+
field :age, type: Integer
|
95
|
+
|
96
|
+
end
|
97
|
+
|
98
|
+
require 'fabrication'
|
99
|
+
|
100
|
+
Fabricator(:person) do
|
101
|
+
id { Faker::Number.number(10) }
|
102
|
+
first_name { Faker::Name.first_name }
|
103
|
+
last_name { Faker::Name.last_name }
|
104
|
+
age { Faker::Number.number(2) }
|
105
|
+
end
|
106
|
+
|
107
|
+
person = Fabricate(:person)
|
108
|
+
|
109
|
+
```
|
110
|
+
|
111
|
+
## Development
|
112
|
+
|
113
|
+
|
114
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then, run `bundle exec rspec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
115
|
+
|
116
|
+
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
117
|
+
|
118
|
+
## Contributing
|
119
|
+
|
120
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/RataWorks/tiny_dyno.
|
121
|
+
|
data/Rakefile
ADDED
data/bin/console
ADDED
data/bin/fastcheck
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'bundler/setup'
|
4
|
+
require 'tiny_dyno'
|
5
|
+
require 'faker'
|
6
|
+
require 'fabrication'
|
7
|
+
|
8
|
+
|
9
|
+
Dir.glob(File.join(ENV['PWD'], 'spec/models/*.rb')).each do |f|
|
10
|
+
p "loading #{ f }"
|
11
|
+
require f
|
12
|
+
end
|
13
|
+
|
14
|
+
Fabrication.configure do |config|
|
15
|
+
config.fabricator_path = 'spec/fabricators'
|
16
|
+
config.sequence_start = 10000
|
17
|
+
end
|
18
|
+
|
19
|
+
Fabrication.manager.load_definitions
|
20
|
+
|
21
|
+
require 'pry'
|
22
|
+
|
23
|
+
Aws.config[:endpoint] = 'http://172.17.42.1:8000'
|
24
|
+
|
25
|
+
Pry.start
|
data/bin/setup
ADDED
data/bin/tracer
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "tiny_dyno"
|
5
|
+
|
6
|
+
class SmallPerson
|
7
|
+
include TinyDyno::Document
|
8
|
+
|
9
|
+
hash_key :some_random, type: String
|
10
|
+
|
11
|
+
field :first_name, type: String
|
12
|
+
field :age, type: Integer
|
13
|
+
|
14
|
+
end
|
15
|
+
|
16
|
+
require 'tracer'
|
17
|
+
Tracer.on
|
18
|
+
sm = SmallPerson.new(first_name: 'peter_parker')
|
19
|
+
|
data/ci/tests.sh
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
|
3
|
+
set -x
|
4
|
+
|
5
|
+
setup_dynamodb_local() {
|
6
|
+
|
7
|
+
dynamodb_tar_file="dynamodb_local_2015-04-27_1.0.tar.gz"
|
8
|
+
dynamodb_dir=$HOME/dynamodb_local
|
9
|
+
|
10
|
+
if ! test -f "$HOME/$dynamodb_tar_file"
|
11
|
+
then
|
12
|
+
wget --continue --directory-prefix=$HOME -- "http://dynamodb-local.s3-website-us-west-2.amazonaws.com/${dynamodb_tar_file}"
|
13
|
+
fi
|
14
|
+
mkdir -p "$dynamodb_dir"
|
15
|
+
tar -xf $HOME/$dynamodb_tar_file -C ${dynamodb_dir}
|
16
|
+
|
17
|
+
}
|
18
|
+
|
19
|
+
test "$SNAP_CI" == "true" && setup_dynamodb_local
|
20
|
+
|
21
|
+
export AWS_ACCESS_KEY_ID='foo'
|
22
|
+
export AWS_SECRET_ACCESS_KEY='bar'
|
23
|
+
export AWS_REGION="us-west-2"
|
24
|
+
|
25
|
+
export BUNDLE_PATH="${SNAP_CACHE_DIR}/bundle-cache/tiny_ddb"
|
26
|
+
|
27
|
+
export JRUBY_OPTS=" -Xcli.debug=true --debug "
|
28
|
+
|
29
|
+
bundle install --clean
|
30
|
+
|
31
|
+
#bundle exec rspec spec/dynamodb_unavailable/ ; unavail_exit_status=$?
|
32
|
+
#test "$unavail_exit_status" -eq 0 || exit $unavail_exit_status
|
33
|
+
|
34
|
+
pushd $dynamodb_dir
|
35
|
+
java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar -sharedDb -inMemory & dynamodb_pid=$!
|
36
|
+
popd
|
37
|
+
|
38
|
+
sleep 10
|
39
|
+
curl -s http://127.0.0.1:8000 ; dynamodb_local=$?
|
40
|
+
|
41
|
+
if test "$dynamodb_local" -eq 0
|
42
|
+
then
|
43
|
+
echo "DynamoDB_Local is up, all tests should pass"
|
44
|
+
else
|
45
|
+
echo "DynamoDB_Local setup failed, persistence tests will fail" 1>&2
|
46
|
+
fi
|
47
|
+
|
48
|
+
bundle exec rspec spec/tiny_dyno ; avail_exit_status=$?
|
49
|
+
|
50
|
+
test "$SNAP_CI" == "true" && test -n "$dynamodb_pid" && kill -15 $dynamodb_pid
|
51
|
+
|
52
|
+
exit $avail_exit_status
|
@@ -0,0 +1,168 @@
|
|
1
|
+
en:
|
2
|
+
tiny_dyno:
|
3
|
+
errors:
|
4
|
+
messages:
|
5
|
+
blank_in_locale:
|
6
|
+
"can't be blank in %{location}"
|
7
|
+
callbacks:
|
8
|
+
message: "Calling %{method} on %{klass} resulted in a false return
|
9
|
+
from a callback."
|
10
|
+
summary: "If a before callback returns false when using Document.create!,
|
11
|
+
Document#save!, or Document#update_attributes! this error will get raised
|
12
|
+
since the document did not actually get saved."
|
13
|
+
resolution: "Double check all before callbacks to make sure they are
|
14
|
+
not unintentionally returning false."
|
15
|
+
document_not_destroyed:
|
16
|
+
message: "%{klass} with id %{id} was not destroyed."
|
17
|
+
summary: "When calling %{klass}#destroy! and a callback halts the destroy
|
18
|
+
callback chain by returning a false value, the deletion will not
|
19
|
+
actually occur."
|
20
|
+
resolution: "Check the before/after destroy callbacks to ensure that the
|
21
|
+
return values are truthy for the chain to continue."
|
22
|
+
document_not_found:
|
23
|
+
message: "Document(s) not found for class %{klass} with id(s) %{missing}."
|
24
|
+
summary: "When calling %{klass}.find with an id or array of ids, each
|
25
|
+
parameter must match a document in the database or this error will be
|
26
|
+
raised. The search was for the id(s): %{searched} (%{total} total)
|
27
|
+
and the following ids were not found: %{missing}."
|
28
|
+
resolution: "Search for an id that is in the database or set
|
29
|
+
the Mongoid.raise_not_found_error configuration option to false,
|
30
|
+
which will cause a nil to be returned instead of raising this error when
|
31
|
+
searching for a single id, or only the matched documents when searching
|
32
|
+
for multiples."
|
33
|
+
invalid_field:
|
34
|
+
message: "Defining a field named '%{name}' is not allowed."
|
35
|
+
summary: "Defining this field would override the method '%{name}',
|
36
|
+
which would cause issues with expectations around the original
|
37
|
+
method and cause extremely hard to debug issues. The original
|
38
|
+
method was defined in:\n
|
39
|
+
\_\_Object: %{origin}\n
|
40
|
+
\_\_File: %{file}\n
|
41
|
+
\_\_Line: %{line}"
|
42
|
+
resolution: "Use Mongoid.destructive_fields to see what names are not
|
43
|
+
allowed, and don't use these names. These include names that also
|
44
|
+
conflict with core Ruby methods on Object, Module, Enumerable, or
|
45
|
+
included gems that inject methods into these or Mongoid internals."
|
46
|
+
hash_keys_only:
|
47
|
+
message: "You can only search by defined hash_keys"
|
48
|
+
summary: 'Only searches which use a hash key are permitted.
|
49
|
+
Queries that do not use a hash key are highly inefficient and not
|
50
|
+
advisable in production use.'
|
51
|
+
resolution: 'Document and analyse your access patterns and amend your document
|
52
|
+
model accordingly.'
|
53
|
+
invalid_field_option:
|
54
|
+
message: "Invalid option :%{option} provided for field :%{name}."
|
55
|
+
summary: "Mongoid requires that you only provide valid options on each
|
56
|
+
field definition in order to prevent unexpected behaviour later on."
|
57
|
+
resolution: "When defining the field :%{name} on '%{klass}', please provide
|
58
|
+
valid options for the field. These are currently: %{valid}. If you
|
59
|
+
meant to define a custom field option, please do so first like so:\n\n
|
60
|
+
\_\_Mongoid::Fields.option :%{option} do |model, field, value|\n
|
61
|
+
\_\_\_\_# Your logic here...\n
|
62
|
+
\_\_end\n
|
63
|
+
\_\_class %{klass}\n
|
64
|
+
\_\_\_\_include Mongoid::Document\n
|
65
|
+
\_\_\_\_field :%{name}, %{option}: true\n
|
66
|
+
\_\_end\n\n"
|
67
|
+
invalid_index:
|
68
|
+
message: "Invalid index specification on %{klass}: %{spec}, %{options}"
|
69
|
+
summary: "Indexes in Mongoid are defined as a hash of field name and
|
70
|
+
direction/2d pairs, with a hash for any additional options."
|
71
|
+
resolution: "Ensure that the index conforms to the correct syntax and
|
72
|
+
has the correct options.\n\n
|
73
|
+
Valid options are:\n
|
74
|
+
\_\_background: true|false\n
|
75
|
+
\_\_database: 'database_name'\n
|
76
|
+
\_\_drop_dups: true|false\n
|
77
|
+
\_\_name: 'index_name'\n
|
78
|
+
\_\_sparse: true|false\n
|
79
|
+
\_\_unique: true|false\n
|
80
|
+
\_\_min: 1\n
|
81
|
+
\_\_max: 1\n
|
82
|
+
\_\_bits: 26\n
|
83
|
+
\_\_bucket_size : 1\n
|
84
|
+
\_\_weights: { content: 1, title: 2 }\n
|
85
|
+
\_\_expire_after_seconds: number_of_seconds\n
|
86
|
+
Valid types are: 1, -1, '2d', '2dsphere', 'geoHaystack', 'text', 'hashed'\n\n
|
87
|
+
Example:\n
|
88
|
+
\_\_class Band\n
|
89
|
+
\_\_\_\_include Mongoid::Document\n
|
90
|
+
\_\_\_\_index({ name: 1, label: -1 }, { sparse: true })\n
|
91
|
+
\_\_\_\_index({ location: '2d' }, { background: true })\n
|
92
|
+
\_\_end\n\n"
|
93
|
+
invalid_options:
|
94
|
+
message: "Invalid option :%{invalid} provided to relation :%{name}."
|
95
|
+
summary: "Mongoid checks the options that are passed to the relation
|
96
|
+
macros to ensure that no ill side effects occur by letting something
|
97
|
+
slip by."
|
98
|
+
resolution: "Valid options are: %{valid}, make sure these are the ones
|
99
|
+
you are using."
|
100
|
+
invalid_time:
|
101
|
+
message: "'%{value}' is not a valid Time."
|
102
|
+
summary: "Mongoid tries to serialize the values for Date, DateTime, and
|
103
|
+
Time into proper UTC times to store in the database. The provided
|
104
|
+
value could not be parsed."
|
105
|
+
resolution: "Make sure to pass parsable values to the field setter
|
106
|
+
for Date, DateTime, and Time objects. When this is a String it needs
|
107
|
+
to be valid for Time.parse. Other objects must be valid to pass to
|
108
|
+
Time.local."
|
109
|
+
invalid_value:
|
110
|
+
message: "Value of type %{value_class} cannot be written to a field of type %{field_class}"
|
111
|
+
summary: "Tried to set a value of type %{value_class} to a field of type %{field_class}"
|
112
|
+
resolution: "Verify if the value to be set correspond to field definition"
|
113
|
+
no_environment:
|
114
|
+
message: "Could not load the configuration since no environment
|
115
|
+
was defined."
|
116
|
+
summary: "Mongoid attempted to find the appropriate environment
|
117
|
+
but no Rails.env, Sinatra::Base.environment, RACK_ENV, or
|
118
|
+
MONGOID_ENV could be found."
|
119
|
+
resolution: "Make sure some environment is set from the mentioned
|
120
|
+
options. Mongoid cannot load configuration from the yaml without
|
121
|
+
knowing which environment it is in, and we have considered
|
122
|
+
defaulting to development an undesireable side effect of this not
|
123
|
+
being defined."
|
124
|
+
readonly_attribute:
|
125
|
+
message: "Attempted to set the readonly attribute '%{name}' with
|
126
|
+
the value: %{value}."
|
127
|
+
summary: "Attributes flagged as readonly via Model.attr_readonly
|
128
|
+
can only have values set when the document is a new record."
|
129
|
+
resolution: "Don't define '%{name}' as readonly, or do not attempt
|
130
|
+
to update its value after the document is persisted."
|
131
|
+
readonly_document:
|
132
|
+
message: "Attempted to persist the readonly document '%{klass}'."
|
133
|
+
summary: "Documents loaded from the database using #only
|
134
|
+
cannot be persisted."
|
135
|
+
resolution: "Don't attempt to persist documents that are flagged as
|
136
|
+
readonly."
|
137
|
+
taken:
|
138
|
+
"is already taken"
|
139
|
+
unknown_attribute:
|
140
|
+
message: "Attempted to set a value for '%{name}' which you did not
|
141
|
+
define on the model %{klass}."
|
142
|
+
summary: "Setting Attributes without first specifying is not permitted.
|
143
|
+
This is also triggered by passing the attribute to any method that
|
144
|
+
accepts an attributes hash, and is raised instead of getting a NoMethodError."
|
145
|
+
resolution: "Review your access pattern and your document structure,
|
146
|
+
and either add a field, store the attribute in a nested structure or
|
147
|
+
add a range key, if you need to use this attribute to retrieve this
|
148
|
+
type of document."
|
149
|
+
unsaved_document:
|
150
|
+
message: "Attempted to save %{document} before the parent %{base}."
|
151
|
+
summary: "You cannot call create or create! through the
|
152
|
+
relation (%{document}) who's parent (%{base}) is
|
153
|
+
not already saved. This would case the database to be out of sync
|
154
|
+
since the child could potentially reference a nonexistant parent."
|
155
|
+
resolution: "Make sure to only use create or create! when the parent
|
156
|
+
document %{base} is persisted."
|
157
|
+
validations:
|
158
|
+
message: "Validation of %{document} failed."
|
159
|
+
summary: "The following errors were found: %{errors}"
|
160
|
+
resolution: "Try persisting the document with valid data or remove
|
161
|
+
the validations."
|
162
|
+
delete_restriction:
|
163
|
+
message: "Cannot delete %{document} because of dependent '%{relation}'."
|
164
|
+
summary: "When defining '%{relation}' with a :dependent => :restrict,
|
165
|
+
Mongoid will raise an error when attempting to delete the
|
166
|
+
%{document} when the child '%{relation}' still has documents in it."
|
167
|
+
resolution: "Don't attempt to delete the parent %{document} when
|
168
|
+
it has children, or change the dependent option on the relation."
|