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.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/sequel/plugins/revisions.rb +94 -0
  3. 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: []