sequel-revisions 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/lib/sequel/plugins/revisions.rb +94 -0
- metadata +101 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 5b0a6f07800fc047f4ff779980f87514c78cfa2a
|
4
|
+
data.tar.gz: 015a844b442bea37b7b2e2e2d0cbffa61984ac90
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: b32826cd3e16de2d1a50c62bc4238d4edc8326077c12c028a7bc4c860041c6ffbc21df2da36732da6451511384eaf03cd88621eaa64afe074909ab9d6be952a1
|
7
|
+
data.tar.gz: 251baa7b25cc0ad007c4703c361646136a902cdac1e6189e58541e51798d066af43d3c7036f05b6e8331e1b3a62fd87328e0490c1294d311bea447735adcd80e
|
@@ -0,0 +1,94 @@
|
|
1
|
+
require 'sequel'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
module Sequel::Plugins
|
5
|
+
module Revisions
|
6
|
+
def self.apply(model, options = {})
|
7
|
+
options = {
|
8
|
+
model_name: "#{model.name}Revisions",
|
9
|
+
table_name: "#{model.table_name.to_s.singularize}_revisions",
|
10
|
+
exclude: [:created_at, :updated_at],
|
11
|
+
meta: nil
|
12
|
+
}.merge(options)
|
13
|
+
|
14
|
+
base_name = options[:model_name]
|
15
|
+
|
16
|
+
mods = options[:model_name].split("::")
|
17
|
+
if mods.length > 1
|
18
|
+
mobject = Object.const_get mods[0..mods.length-2].join("::")
|
19
|
+
base_name = mods.last
|
20
|
+
else
|
21
|
+
mobject = Object
|
22
|
+
end
|
23
|
+
|
24
|
+
# Dynamically create Model class
|
25
|
+
klass = Class.new(Sequel::Model(options[:table_name].to_sym))
|
26
|
+
klass.class_eval do
|
27
|
+
@@lmeta = options[:meta]
|
28
|
+
plugin :timestamps
|
29
|
+
plugin :serialization
|
30
|
+
|
31
|
+
serialize_attributes :json, :meta
|
32
|
+
serialize_attributes :json, :changes
|
33
|
+
many_to_one model.table_name.to_sym, class: model.name
|
34
|
+
|
35
|
+
def before_create
|
36
|
+
# ToDo: This should not call to_json. Maybe a bug?
|
37
|
+
self[:meta] = @@lmeta.call(self).to_json unless @@lmeta.nil?
|
38
|
+
super
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
# Actually define the class in the module
|
43
|
+
mobject.const_set base_name, klass
|
44
|
+
|
45
|
+
model.class_eval do
|
46
|
+
plugin :dirty
|
47
|
+
one_to_many :revisions, class: options[:model_name]
|
48
|
+
|
49
|
+
def revert
|
50
|
+
return if revisions.empty?
|
51
|
+
|
52
|
+
last = revisions.last
|
53
|
+
changes = last.changes
|
54
|
+
changes.keys.each do |key|
|
55
|
+
send("#{key}=", changes[key][0])
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def revert!
|
60
|
+
revert
|
61
|
+
save
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def self.configure(model, options = {})
|
67
|
+
end
|
68
|
+
|
69
|
+
module ClassMethods
|
70
|
+
end
|
71
|
+
|
72
|
+
module InstanceMethods
|
73
|
+
|
74
|
+
def before_update
|
75
|
+
track_changes
|
76
|
+
super
|
77
|
+
end
|
78
|
+
|
79
|
+
private
|
80
|
+
|
81
|
+
def track_changes
|
82
|
+
return if changed_columns.empty?
|
83
|
+
|
84
|
+
# Map the changed fields into an object
|
85
|
+
changes = changed_columns.inject({}) do |obj, key|
|
86
|
+
obj[key] = column_change(key)
|
87
|
+
obj
|
88
|
+
end
|
89
|
+
|
90
|
+
add_revision(changes: changes)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
metadata
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: sequel-revisions
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Fabian Becker
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-01-19 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: sequel
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '4'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '4'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: sequel-json
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: sqlite3
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
description: Use this plugin to track field changes and revert your model to an older
|
70
|
+
state.
|
71
|
+
email: halfdan@xnorfz.de
|
72
|
+
executables: []
|
73
|
+
extensions: []
|
74
|
+
extra_rdoc_files: []
|
75
|
+
files:
|
76
|
+
- lib/sequel/plugins/revisions.rb
|
77
|
+
homepage: https://github.com/halfdan/sequel-revisions
|
78
|
+
licenses:
|
79
|
+
- MIT
|
80
|
+
metadata: {}
|
81
|
+
post_install_message:
|
82
|
+
rdoc_options: []
|
83
|
+
require_paths:
|
84
|
+
- lib
|
85
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
91
|
+
requirements:
|
92
|
+
- - ">="
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: '0'
|
95
|
+
requirements: []
|
96
|
+
rubyforge_project:
|
97
|
+
rubygems_version: 2.2.2
|
98
|
+
signing_key:
|
99
|
+
specification_version: 4
|
100
|
+
summary: A plugin for the Ruby ORM Sequel, that allows tracking changes on your models.
|
101
|
+
test_files: []
|