acts_as_versionable 0.0.2 → 0.3.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.
- data/lib/acts_as_versionable.rb +102 -51
- data/lib/acts_as_versionable/version.rb +1 -1
- data/lib/generators/{versionize/templates/migration.rb → versionable/templates/migration.rb.erb} +3 -6
- data/lib/generators/versionable/versionable_generator.rb +37 -0
- data/test/acts_as_versionable_test.rb +2 -1
- metadata +3 -3
- data/lib/generators/versionize/versionize_generator.rb +0 -28
data/lib/acts_as_versionable.rb
CHANGED
@@ -3,79 +3,130 @@ require 'acts_as_versionable/version'
|
|
3
3
|
# ActsAsVersionable
|
4
4
|
module ActsAsVersionable
|
5
5
|
|
6
|
-
class NoSuchVersionError < Exception
|
7
|
-
|
8
|
-
def self.included(base)
|
9
|
-
base.extend ClassMethods
|
6
|
+
class NoSuchVersionError < Exception
|
10
7
|
end
|
11
|
-
|
12
|
-
module ClassMethods
|
13
8
|
|
14
|
-
|
15
|
-
|
16
|
-
|
9
|
+
extend ActiveSupport::Concern
|
10
|
+
|
11
|
+
included do
|
12
|
+
end
|
13
|
+
|
14
|
+
module ClassMethods
|
15
|
+
|
16
|
+
def create_class(name, superclass, &block)
|
17
|
+
klass = Class.new superclass, &block
|
18
|
+
Object.const_set name, klass
|
19
|
+
end
|
20
|
+
|
21
|
+
def acts_as_versionable options={}
|
22
|
+
options.symbolize_keys!
|
23
|
+
|
24
|
+
has_many :versions, :class_name => "#{self.name.pluralize}Versions", :dependent => :destroy
|
25
|
+
after_save :apply_versioning
|
26
|
+
after_save :clear_old_versions
|
27
|
+
|
28
|
+
attr_accessor :local_changes
|
29
|
+
cattr_accessor :max_versions
|
30
|
+
|
31
|
+
self.max_versions = options[:limit].to_i
|
32
|
+
|
33
|
+
class << create_class("#{self.name.pluralize}Versions", ActiveRecord::Base)
|
34
|
+
def actual_columns
|
35
|
+
content_columns.reject { |c| c.type == :datetime || c.name == 'versioned_as' }
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
include InstanceMethods
|
40
|
+
end
|
41
|
+
|
17
42
|
end
|
43
|
+
|
44
|
+
module InstanceMethods
|
45
|
+
|
46
|
+
def version
|
47
|
+
current_version || 0
|
48
|
+
end
|
18
49
|
|
19
|
-
|
20
|
-
|
21
|
-
after_save :apply_versioning
|
50
|
+
def revert_to(version)
|
51
|
+
revision = versions.find_by_versioned_as(version)
|
22
52
|
|
23
|
-
|
53
|
+
raise NoSuchVersionError, "Couldn't find #{version} version" if revision.blank?
|
24
54
|
|
25
|
-
|
26
|
-
|
27
|
-
content_columns.reject { |c| c.type == :datetime || c.name == 'versioned_as' }
|
55
|
+
versions.actual_columns.each do |column|
|
56
|
+
self[column.name] = revision[column.name]
|
28
57
|
end
|
58
|
+
|
59
|
+
self.current_version = version
|
60
|
+
self.local_changes = true
|
61
|
+
self.save
|
29
62
|
end
|
30
63
|
|
31
|
-
|
32
|
-
end
|
64
|
+
private
|
33
65
|
|
34
|
-
|
66
|
+
def apply_versioning
|
67
|
+
unless self.local_changes
|
68
|
+
version_content = {}
|
69
|
+
last_version = version + 1
|
35
70
|
|
36
|
-
|
71
|
+
versions.actual_columns.each do |column|
|
72
|
+
version_content[column.name] = self[column.name]
|
73
|
+
end
|
37
74
|
|
38
|
-
|
39
|
-
current_version || 0
|
40
|
-
end
|
75
|
+
version_content.merge!(:versioned_as => last_version)
|
41
76
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
77
|
+
if versions.create(version_content)
|
78
|
+
self.local_changes = true
|
79
|
+
self.update_attribute(:current_version, last_version)
|
80
|
+
end
|
81
|
+
end
|
46
82
|
|
47
|
-
|
48
|
-
self[column.name] = revision[column.name]
|
83
|
+
self.local_changes = false
|
49
84
|
end
|
50
85
|
|
51
|
-
|
52
|
-
|
53
|
-
|
86
|
+
def clear_old_versions
|
87
|
+
return if self.max_versions == 0
|
88
|
+
excess_baggage = self.current_version - self.max_versions
|
89
|
+
if excess_baggage > 0
|
90
|
+
versions.where("versioned_as <= ?",excess_baggage).destroy_all
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
54
94
|
end
|
95
|
+
end
|
55
96
|
|
56
|
-
|
57
|
-
|
58
|
-
def apply_versioning
|
59
|
-
unless self.local_changes
|
60
|
-
version_content = {}
|
61
|
-
last_version = version + 1
|
97
|
+
ActiveRecord::Base.class_eval { include ActsAsVersionable }
|
62
98
|
|
63
|
-
|
64
|
-
|
65
|
-
|
99
|
+
#def self.included(base)
|
100
|
+
# base.extend ClassMethods
|
101
|
+
#end
|
66
102
|
|
67
|
-
|
103
|
+
#module ClassMethods
|
104
|
+
|
105
|
+
# def create_class(name, superclass, &block)
|
106
|
+
# klass = Class.new superclass, &block
|
107
|
+
# Object.const_set name, klass
|
108
|
+
# end
|
68
109
|
|
69
|
-
|
70
|
-
self.local_changes = true
|
71
|
-
self.update_attribute(:current_version, last_version)
|
72
|
-
end
|
73
|
-
end
|
110
|
+
# def acts_as_versionable(opts = {})
|
74
111
|
|
75
|
-
|
76
|
-
|
112
|
+
# has_many :versions, :class_name => "#{self}Version", :dependent => :destroy
|
113
|
+
# after_save :apply_versioning
|
114
|
+
# after_save :clear_old_versions
|
77
115
|
|
78
|
-
|
116
|
+
# attr_accessor :local_changes
|
79
117
|
|
80
|
-
|
118
|
+
# class << create_class("#{self}Version", ActiveRecord::Base)
|
119
|
+
# def actual_columns
|
120
|
+
# content_columns.reject { |c| c.type == :datetime || c.name == 'versioned_as' }
|
121
|
+
# end
|
122
|
+
# end
|
123
|
+
|
124
|
+
#include InstanceMethods
|
125
|
+
# end
|
126
|
+
|
127
|
+
#end
|
128
|
+
|
129
|
+
|
130
|
+
|
131
|
+
#end
|
81
132
|
|
data/lib/generators/{versionize/templates/migration.rb → versionable/templates/migration.rb.erb}
RENAMED
@@ -1,16 +1,13 @@
|
|
1
1
|
<%
|
2
|
-
|
3
|
-
|
4
|
-
versions_table = model_name + '_versions'
|
5
|
-
columns = model.content_columns.reject { |c| c.type == :datetime }
|
2
|
+
versions_table = "#{@model_name.pluralize}_versions".downcase
|
3
|
+
columns = @model.classify.constantize.content_columns.reject { |c| c.type == :datetime }
|
6
4
|
%>
|
7
5
|
class <%= migration_name %> < ActiveRecord::Migration
|
8
6
|
def self.up
|
9
7
|
create_table :<%= versions_table %> do |t|
|
10
8
|
<% columns.each do |column| %>
|
11
|
-
|
9
|
+
t.column :<%= column.name %>, :<%= column.type %>
|
12
10
|
<% end %>
|
13
|
-
|
14
11
|
t.integer :<%= model_name + '_id' %>
|
15
12
|
t.integer :versioned_as
|
16
13
|
t.timestamps
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'rails/generators'
|
2
|
+
require 'rails/generators/migration'
|
3
|
+
|
4
|
+
class VersionableGenerator < Rails::Generators::NamedBase
|
5
|
+
include Rails::Generators::Migration
|
6
|
+
source_root File.expand_path('../templates', __FILE__)
|
7
|
+
argument :klass, :type => :string, :description => "Model to versionate"
|
8
|
+
|
9
|
+
attr_accessor :migration_name, :model_name, :model
|
10
|
+
|
11
|
+
def self.next_migration_number(path)
|
12
|
+
Time.now.utc.strftime("%Y%m%d%H%M%S")
|
13
|
+
end
|
14
|
+
|
15
|
+
def create_model_file
|
16
|
+
@model_name = klass.downcase
|
17
|
+
@model = klass
|
18
|
+
puts @model
|
19
|
+
@migration_name = "create_#{@model_name}_versions".camelize
|
20
|
+
puts @migration_name
|
21
|
+
migration_template "migration.rb.erb", "db/migrate/create_#{@model_name}_versions.rb"
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
#def manifest
|
26
|
+
#
|
27
|
+
# record do |m|
|
28
|
+
# m.migration_template('migration.rb', 'db/migrate',
|
29
|
+
# :assigns => {
|
30
|
+
# :model_name => @model_name,
|
31
|
+
# :migration_name => "CreateVersionsFor#{@model_name.pluralize}"
|
32
|
+
# },
|
33
|
+
# :migration_file_name => "create_versions_for_#{model_name_for_migration}")
|
34
|
+
# end
|
35
|
+
#end
|
36
|
+
|
37
|
+
end
|
@@ -2,7 +2,8 @@ require 'rubygems'
|
|
2
2
|
gem 'activerecord'
|
3
3
|
require 'active_record'
|
4
4
|
require 'test/unit'
|
5
|
-
require "#{File.dirname(__FILE__)}/../init"
|
5
|
+
#require "#{File.dirname(__FILE__)}/../init"
|
6
|
+
require File.join(File.dirname(__FILE__), '../lib', 'acts_as_versionable')
|
6
7
|
|
7
8
|
ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:")
|
8
9
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: acts_as_versionable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.3.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -25,8 +25,8 @@ files:
|
|
25
25
|
- init.rb
|
26
26
|
- lib/acts_as_versionable.rb
|
27
27
|
- lib/acts_as_versionable/version.rb
|
28
|
-
- lib/generators/
|
29
|
-
- lib/generators/
|
28
|
+
- lib/generators/versionable/templates/migration.rb.erb
|
29
|
+
- lib/generators/versionable/versionable_generator.rb
|
30
30
|
- test/acts_as_versionable_test.rb
|
31
31
|
homepage: ''
|
32
32
|
licenses: []
|
@@ -1,28 +0,0 @@
|
|
1
|
-
class VersionableGenerator < Rails::Generators::Base
|
2
|
-
attr_accessor :model_name
|
3
|
-
|
4
|
-
def initialize(args, opts = {})
|
5
|
-
super
|
6
|
-
@model_name = args.first
|
7
|
-
end
|
8
|
-
|
9
|
-
def manifest
|
10
|
-
model_name_for_migration = @model_name.downcase.pluralize
|
11
|
-
|
12
|
-
record do |m|
|
13
|
-
m.migration_template('migration.rb', 'db/migrate',
|
14
|
-
:assigns => {
|
15
|
-
:model_name => @model_name,
|
16
|
-
:migration_name => "CreateVersionsFor#{@model_name.pluralize}"
|
17
|
-
},
|
18
|
-
:migration_file_name => "create_versions_for_#{model_name_for_migration}")
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
protected
|
23
|
-
|
24
|
-
def banner
|
25
|
-
"Usage: #{$0} versionize ModelName"
|
26
|
-
end
|
27
|
-
|
28
|
-
end
|