mongoid-archivable 1.5.2 → 1.6.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 +4 -4
- data/README.md +44 -0
- data/lib/mongoid-archivable.rb +1 -0
- data/lib/mongoid/archivable.rb +16 -30
- data/lib/mongoid/archivable/config.rb +16 -0
- data/lib/mongoid/archivable/depot.rb +40 -0
- data/lib/mongoid/archivable/gluten.rb +19 -0
- data/lib/mongoid/archivable/restoration.rb +38 -0
- data/lib/mongoid/archivable/version.rb +1 -1
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 39ea08e10786da69fd02888d73ff5311550115d4
|
4
|
+
data.tar.gz: 763442ac4b4451e46119ff3574a6c64d52cf96bd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e42df539cbf0d48e580c7e4fd10226cdb66f14bb6e799118e00581c2f06699c83bc254a17c23987b970a188b970243f9aaed169fc3189859a6e0703b208fe8a9
|
7
|
+
data.tar.gz: 531755776b89e8dbbbd7363d11bfc9304fc23d66ef9f473523c807f683e0c7ae465af0140131c6dbe670234ae5a56781c1cf0913ffcfad3ac18adab7baa45c15
|
data/README.md
CHANGED
@@ -48,6 +48,50 @@ User.count # => 1
|
|
48
48
|
User::Archive.count # => 1
|
49
49
|
```
|
50
50
|
|
51
|
+
## Standalone Storage
|
52
|
+
|
53
|
+
By default, the archived documents will be stored in primary client and database. If you want to use different database or client for all archived documents, you can create the following middleware:
|
54
|
+
|
55
|
+
```ruby
|
56
|
+
# Rails : config/initializers/mongoid_archivable.rb
|
57
|
+
# Ruby : config/mongoid_archivable.rb
|
58
|
+
|
59
|
+
Mongoid::Archivable.configure do |config|
|
60
|
+
config.database = "archives"
|
61
|
+
config.client = "secondary"
|
62
|
+
end
|
63
|
+
```
|
64
|
+
|
65
|
+
But if you only want to use different database or client in spesific Mongoid document, you can use this approach:
|
66
|
+
|
67
|
+
```ruby
|
68
|
+
class User
|
69
|
+
include Mongoid::Document
|
70
|
+
include Mongoid::Archive
|
71
|
+
archive_in database: 'achives', client: 'secondary'
|
72
|
+
end
|
73
|
+
```
|
74
|
+
|
75
|
+
In your mongoid.yml will show like this:
|
76
|
+
|
77
|
+
```yaml
|
78
|
+
development:
|
79
|
+
clients:
|
80
|
+
default:
|
81
|
+
database: project_development
|
82
|
+
hosts:
|
83
|
+
- localhost:27017
|
84
|
+
options:
|
85
|
+
<<: *client_options
|
86
|
+
secondary:
|
87
|
+
database: archives
|
88
|
+
hosts:
|
89
|
+
- localhost:27018
|
90
|
+
options:
|
91
|
+
<<: *client_options
|
92
|
+
```
|
93
|
+
|
94
|
+
|
51
95
|
## Development
|
52
96
|
|
53
97
|
Please report any issues to the [GitHub issue tracker](https://github.com/Sign2Pay/mongoid-archivable/issues).
|
data/lib/mongoid-archivable.rb
CHANGED
data/lib/mongoid/archivable.rb
CHANGED
@@ -1,55 +1,41 @@
|
|
1
1
|
require 'active_support/concern'
|
2
2
|
require 'mongoid/archivable/process_localized_fields'
|
3
|
+
require 'mongoid/archivable/restoration'
|
4
|
+
require 'mongoid/archivable/config'
|
5
|
+
require 'mongoid/archivable/gluten'
|
6
|
+
require 'mongoid/archivable/depot'
|
3
7
|
|
4
8
|
module Mongoid
|
5
9
|
module Archivable
|
6
10
|
extend ActiveSupport::Concern
|
7
11
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
original_document
|
12
|
+
class << self
|
13
|
+
def config
|
14
|
+
@config ||= Config.new
|
15
|
+
@config
|
13
16
|
end
|
14
17
|
|
15
|
-
def
|
16
|
-
|
17
|
-
excluded_attributes = %w(_id original_id original_type archived_at)
|
18
|
-
attrs = attributes.except(*excluded_attributes)
|
19
|
-
attrs = Mongoid::Archivable::ProcessLocalizedFields.call(original_class, attrs)
|
20
|
-
|
21
|
-
original_class.new(attrs) do |doc|
|
22
|
-
doc.id = original_id
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
# first, try to retrieve the original_class from the stored :original_type
|
28
|
-
# since previous versions of this gem did not use this field, fall back
|
29
|
-
# to previous method -- removing the '::Archive' from archive class name
|
30
|
-
def original_class_name
|
31
|
-
if respond_to?(:original_type) && original_type.present? # gem version >= 1.3.0, stored as a field.
|
32
|
-
original_type
|
33
|
-
else
|
34
|
-
self.class.to_s.gsub(/::Archive\z/, '') # gem version < 1.3.0, turns "User::Archive" into "User".
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
def original_class
|
39
|
-
original_class_name.constantize
|
18
|
+
def configure(&proc)
|
19
|
+
yield config
|
40
20
|
end
|
41
21
|
end
|
42
22
|
|
43
23
|
included do
|
24
|
+
mattr_accessor :archive_storage
|
25
|
+
include Mongoid::Archivable::Gluten
|
26
|
+
|
44
27
|
const_set('Archive', Class.new)
|
45
28
|
const_get('Archive').class_eval do
|
46
29
|
include Mongoid::Document
|
47
30
|
include Mongoid::Attributes::Dynamic
|
48
31
|
include Mongoid::Archivable::Restoration
|
32
|
+
include Mongoid::Archivable::Depot
|
33
|
+
store_in database: ->{ archive_database_name }, client: ->{ archive_client_name }
|
49
34
|
|
50
35
|
field :archived_at, type: Time
|
51
36
|
field :original_id, type: String
|
52
37
|
field :original_type, type: String
|
38
|
+
|
53
39
|
end
|
54
40
|
|
55
41
|
before_destroy :archive
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Mongoid
|
2
|
+
module Archivable
|
3
|
+
class Config
|
4
|
+
attr_accessor :database
|
5
|
+
attr_accessor :client
|
6
|
+
|
7
|
+
def get_database
|
8
|
+
database || Mongoid::Config.clients[get_client][:database]
|
9
|
+
end
|
10
|
+
|
11
|
+
def get_client
|
12
|
+
client || :default
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module Mongoid
|
2
|
+
module Archivable
|
3
|
+
module Depot
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
included do
|
6
|
+
include ClassMethods
|
7
|
+
end
|
8
|
+
|
9
|
+
module ClassMethods
|
10
|
+
def has_archive_storage?
|
11
|
+
!parent.archive_storage.nil?
|
12
|
+
end
|
13
|
+
|
14
|
+
def has_archive_client?
|
15
|
+
has_archive_storage? && !parent.archive_storage[:client].nil?
|
16
|
+
end
|
17
|
+
|
18
|
+
def has_archive_database?
|
19
|
+
has_archive_storage? && !parent.archive_storage[:client].nil?
|
20
|
+
end
|
21
|
+
|
22
|
+
def archive_database_name
|
23
|
+
if has_archive_database?
|
24
|
+
parent.archive_storage[:database]
|
25
|
+
else
|
26
|
+
Mongoid::Archivable.config.get_database
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def archive_client_name
|
31
|
+
if has_archive_client?
|
32
|
+
parent.archive_storage[:client]
|
33
|
+
else
|
34
|
+
Mongoid::Archivable.config.get_client
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Mongoid
|
2
|
+
module Archivable
|
3
|
+
module Gluten
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
included do
|
6
|
+
include ClassMethods
|
7
|
+
end
|
8
|
+
module ClassMethods
|
9
|
+
def archive_in args
|
10
|
+
@@archive_storage = args
|
11
|
+
end
|
12
|
+
|
13
|
+
def archive_storage
|
14
|
+
@@archive_storage
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module Mongoid
|
2
|
+
module Archivable
|
3
|
+
module Restoration
|
4
|
+
# Restores the archived document to its former glory.
|
5
|
+
def restore
|
6
|
+
original_document.save
|
7
|
+
original_document
|
8
|
+
end
|
9
|
+
|
10
|
+
def original_document
|
11
|
+
@original_document ||= begin
|
12
|
+
excluded_attributes = %w(_id original_id original_type archived_at)
|
13
|
+
attrs = attributes.except(*excluded_attributes)
|
14
|
+
attrs = Mongoid::Archivable::ProcessLocalizedFields.call(original_class, attrs)
|
15
|
+
|
16
|
+
original_class.new(attrs) do |doc|
|
17
|
+
doc.id = original_id
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
# first, try to retrieve the original_class from the stored :original_type
|
23
|
+
# since previous versions of this gem did not use this field, fall back
|
24
|
+
# to previous method -- removing the '::Archive' from archive class name
|
25
|
+
def original_class_name
|
26
|
+
if respond_to?(:original_type) && original_type.present? # gem version >= 1.3.0, stored as a field.
|
27
|
+
original_type
|
28
|
+
else
|
29
|
+
self.class.to_s.gsub(/::Archive\z/, '') # gem version < 1.3.0, turns "User::Archive" into "User".
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def original_class
|
34
|
+
original_class_name.constantize
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mongoid-archivable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joost Baaij
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-03-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: mongoid
|
@@ -101,7 +101,11 @@ files:
|
|
101
101
|
- bin/setup
|
102
102
|
- lib/mongoid-archivable.rb
|
103
103
|
- lib/mongoid/archivable.rb
|
104
|
+
- lib/mongoid/archivable/config.rb
|
105
|
+
- lib/mongoid/archivable/depot.rb
|
106
|
+
- lib/mongoid/archivable/gluten.rb
|
104
107
|
- lib/mongoid/archivable/process_localized_fields.rb
|
108
|
+
- lib/mongoid/archivable/restoration.rb
|
105
109
|
- lib/mongoid/archivable/version.rb
|
106
110
|
- mongoid-archivable.gemspec
|
107
111
|
homepage: https://github.com/Sign2Pay/mongoid-archivable
|