rich-acts_as_revisable 0.9.8 → 1.0.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/README.rdoc CHANGED
@@ -1,6 +1,6 @@
1
1
  = acts_as_revisable
2
2
 
3
- http://github.com/fatjam/acts_as_revisable/tree/master
3
+ http://github.com/rich/acts_as_revisable
4
4
 
5
5
  == DESCRIPTION:
6
6
 
@@ -11,7 +11,9 @@ This plugin wouldn't exist without Rick Olsen's acts_as_versioned. AAV has been
11
11
  == FEATURES:
12
12
 
13
13
  * Both the revisable and revision models must be explicitly defined.
14
- Yes, this is a feature. The less magic needed the better. This allows you to build up your revision models just as you would any other.
14
+ Yes, this is a feature. The less magic needed the better. This allows you to build up your revision models just as you would any other.
15
+
16
+ If you absolutely need a generated revision model, you may pass ":generate_revision_class => true" to acts_as_revisable and it will generate the class at runtime for you. Think of this like scaffolding and not to be kept around for a real application.
15
17
 
16
18
  * Numerous custom callbacks for both revisable and revision models.
17
19
  * revisable models
@@ -22,6 +24,8 @@ This plugin wouldn't exist without Rick Olsen's acts_as_versioned. AAV has been
22
24
  * before_changeset
23
25
  * after_changeset
24
26
  * after_branch_created
27
+ * before_revise_on_destroy (when :on_destroy => :revise is set)
28
+ * after_revise_on_destroy (when :on_destroy => :revise is set)
25
29
  * revision models
26
30
  * before_restore
27
31
  * after_restore
@@ -33,7 +37,6 @@ This plugin wouldn't exist without Rick Olsen's acts_as_versioned. AAV has been
33
37
  * Provides migration generators to add the revisable columns.
34
38
  * Grouping several revisable actions into a single revision (changeset).
35
39
  * Monitor all or just specified columns to trigger a revision.
36
- * Clone all or specified associations to the revision model.
37
40
  * Uses ActiveRecord's dirty attribute tracking.
38
41
  * Several ways to find revisions including:
39
42
  * revision number
@@ -72,7 +75,7 @@ Create the revision class:
72
75
 
73
76
  class Session < ActiveRecord::Base
74
77
  # we can accept the more standard hash syntax
75
- acts_as_revision :revisable_class_name => "Project", :clone_associations => :all
78
+ acts_as_revision :revisable_class_name => "Project"
76
79
  end
77
80
 
78
81
  Some example usage:
@@ -154,10 +157,6 @@ Changesets:
154
157
  # our revision number has only incremented by one
155
158
  @project.revision_number # => 3
156
159
 
157
- Associations have been cloned:
158
-
159
- @project.owner === @previous.owner # => true
160
-
161
160
  Maybe we don't want to be able to branch from revisions:
162
161
 
163
162
  class Session < ActiveRecord::Base
@@ -184,23 +183,23 @@ If the owner isn't set let's prevent reverting:
184
183
 
185
184
  == REQUIREMENTS:
186
185
 
187
- This plugin currently depends on Edge Rails, ActiveRecord and ActiveSupport specifically, which will eventually become Rails 2.1.
186
+ This plugin requires Rails 2.3. Use version 0.9.8 of this plugin for Rails 2.1 and 2.2.
188
187
 
189
188
  == INSTALL:
190
189
 
191
190
  acts_as_revisable uses Rails' new ability to use gems as plugins. Installing AAR is as simple as installing a gem:
192
191
 
193
- sudo gem install fatjam-acts_as_revisable --source=http://gems.github.com
192
+ sudo gem install rich-acts_as_revisable --source=http://gems.github.com
194
193
 
195
194
  Once the gem is installed you'll want to activate it in your Rails app by adding the following line to config/environment.rb:
196
195
 
197
- config.gem "fatjam-acts_as_revisable", :lib => "acts_as_revisable", :source => "http://gems.github.com"
196
+ config.gem "rich-acts_as_revisable", :lib => "acts_as_revisable", :source => "http://gems.github.com"
198
197
 
199
198
  == LICENSE:
200
199
 
201
200
  (The MIT License)
202
201
 
203
- Copyright (c) 2008 JamLab, LLC.
202
+ Copyright (c) 2009 Rich Cavanaugh
204
203
 
205
204
  Permission is hereby granted, free of charge, to any person obtaining
206
205
  a copy of this software and associated documentation files (the
data/Rakefile CHANGED
@@ -14,7 +14,7 @@ Rake::RDocTask.new do |rdoc|
14
14
  end
15
15
 
16
16
  spec = Gem::Specification.new do |s|
17
- FatJam::ActsAsRevisable::GemSpecOptions::HASH.each do |key, value|
17
+ WithoutScope::ActsAsRevisable::GemSpecOptions::HASH.each do |key, value|
18
18
  s.send("#{key.to_s}=",value)
19
19
  end
20
20
  end
@@ -25,7 +25,7 @@ end
25
25
 
26
26
  desc "Generate the static gemspec required for github."
27
27
  task :generate_gemspec do
28
- options = FatJam::ActsAsRevisable::GemSpecOptions::HASH.clone
28
+ options = WithoutScope::ActsAsRevisable::GemSpecOptions::HASH.clone
29
29
  options[:name] = "acts_as_revisable"
30
30
 
31
31
  spec = ["Gem::Specification.new do |s|"]
@@ -39,6 +39,6 @@ end
39
39
 
40
40
  desc "Install acts_as_revisable"
41
41
  task :install => :repackage do
42
- options = FatJam::ActsAsRevisable::GemSpecOptions::HASH.clone
42
+ options = WithoutScope::ActsAsRevisable::GemSpecOptions::HASH.clone
43
43
  sh %{sudo gem install pkg/#{options[:name]}-#{spec.version} --no-rdoc --no-ri}
44
44
  end
@@ -1,4 +1,4 @@
1
- module FatJam
1
+ module WithoutScope
2
2
  module ActsAsRevisable
3
3
  # This module is mixed into the revision and revisable classes.
4
4
  #
@@ -18,17 +18,12 @@ module FatJam
18
18
  base.class_inheritable_hash :revisable_current_states
19
19
  base.revisable_current_states = {}
20
20
 
21
- class << base
22
- alias_method_chain :instantiate, :revisable
23
- end
24
-
25
21
  base.instance_eval do
26
22
  define_callbacks :before_branch, :after_branch
27
23
  has_many :branches, (revisable_options.revision_association_options || {}).merge({:class_name => base.class_name, :foreign_key => :revisable_branched_from_id})
28
24
 
29
25
  belongs_to :branch_source, :class_name => base.class_name, :foreign_key => :revisable_branched_from_id
30
26
  after_save :execute_blocks_after_save
31
- disable_revisable_scope :branch_source, :branches
32
27
  end
33
28
  end
34
29
 
@@ -151,7 +146,11 @@ module FatJam
151
146
 
152
147
  # Accessor for revisable_number just to make external API more pleasant.
153
148
  def revision_number
154
- self[:revisable_number]
149
+ self[:revisable_number] ||= 0
150
+ end
151
+
152
+ def revision_number=(value)
153
+ self[:revisable_number] = value
155
154
  end
156
155
 
157
156
  def diffs(what)
@@ -163,32 +162,11 @@ module FatJam
163
162
  end
164
163
  end
165
164
 
166
- module ClassMethods
167
- def disable_revisable_scope(*args)
168
- args.each do |a|
169
- class_eval <<-EOT
170
- def #{a.to_s}_with_open_scope(*args, &block)
171
- assoc = self.class.reflect_on_association(#{a.inspect})
172
- models = [self.class]
173
-
174
- if [:has_many, :has_one].member? assoc.macro
175
- models << (assoc.options[:class_name] ? assoc.options[:class_name] : #{a.inspect}.to_s.singularize.camelize).constantize
176
- end
177
-
178
- begin
179
- models.each {|m| m.scoped_model_enabled = false}
180
- if associated = #{a.to_s}_without_open_scope(*args, &block)
181
- associated.reload
182
- end
183
- ensure
184
- models.each {|m| m.scoped_model_enabled = true}
185
- end
186
- end
187
- EOT
188
- alias_method_chain a, :open_scope
189
- end
190
- end
191
-
165
+ def deleted?
166
+ self.revisable_deleted_at.present?
167
+ end
168
+
169
+ module ClassMethods
192
170
  # Returns true if the revision should clone the given column.
193
171
  def revisable_should_clone_column?(col) #:nodoc:
194
172
  return false if (REVISABLE_SYSTEM_COLUMNS + REVISABLE_UNREVISABLE_COLUMNS).member? col
@@ -198,12 +176,12 @@ module FatJam
198
176
  # acts_as_revisable's override for instantiate so we can
199
177
  # return the appropriate type of model based on whether
200
178
  # or not the record is the current record.
201
- def instantiate_with_revisable(record) #:nodoc:
179
+ def instantiate(record) #:nodoc:
202
180
  is_current = columns_hash["revisable_is_current"].type_cast(
203
181
  record["revisable_is_current"])
204
182
 
205
183
  if (is_current && self == self.revisable_class) || (!is_current && self == self.revision_class)
206
- return instantiate_without_revisable(record)
184
+ return super(record)
207
185
  end
208
186
 
209
187
  object = if is_current
@@ -1,19 +1,19 @@
1
- module FatJam
1
+ module WithoutScope
2
2
  module ActsAsRevisable
3
3
  module Deletable
4
4
  def self.included(base)
5
5
  base.instance_eval do
6
- alias_method_chain :destroy, :revisable
6
+ define_callbacks :before_revise_on_destroy, :after_revise_on_destroy
7
7
  end
8
8
  end
9
9
 
10
- def destroy_with_revisable
10
+ def destroy
11
11
  now = Time.now
12
12
 
13
13
  prev = self.revisions.first
14
14
  self.revisable_deleted_at = now
15
15
  self.revisable_is_current = false
16
-
16
+
17
17
  self.revisable_current_at = if prev
18
18
  prev.update_attribute(:revisable_revised_at, now)
19
19
  prev.revisable_revised_at + 1.second
@@ -22,7 +22,11 @@ module FatJam
22
22
  end
23
23
 
24
24
  self.revisable_revised_at = self.revisable_deleted_at
25
- self.save(:without_revision => true)
25
+
26
+ return false unless run_callbacks(:before_revise_on_destroy) { |r, o| r == false}
27
+ returning(self.save(:without_revision => true)) do
28
+ run_callbacks(:after_revise_on_destroy)
29
+ end
26
30
  end
27
31
  end
28
32
  end
@@ -1,4 +1,4 @@
1
- module FatJam
1
+ module WithoutScope
2
2
  module ActsAsRevisable
3
3
 
4
4
  # This module is mixed into the revision classes.
@@ -18,8 +18,6 @@ module FatJam
18
18
  base.send(:extend, ClassMethods)
19
19
 
20
20
  class << base
21
- alias_method_chain :find, :revisable
22
- alias_method_chain :with_scope, :revisable
23
21
  attr_accessor :revisable_revision_class, :revisable_columns
24
22
  end
25
23
 
@@ -30,21 +28,24 @@ module FatJam
30
28
  attr_accessor :revisable_new_params, :revisable_revision
31
29
 
32
30
  define_callbacks :before_revise, :after_revise, :before_revert, :after_revert, :before_changeset, :after_changeset, :after_branch_created
33
-
34
- alias_method_chain :save, :revisable
35
- alias_method_chain :save!, :revisable
36
-
31
+
37
32
  before_create :before_revisable_create
38
33
  before_update :before_revisable_update
39
34
  after_update :after_revisable_update
40
35
  after_save :clear_revisable_shared_objects!, :unless => :is_reverting?
41
36
 
42
- acts_as_scoped_model :find => {:conditions => {:revisable_is_current => true}}
37
+ default_scope :conditions => {:revisable_is_current => true}
43
38
 
44
39
  [:revisions, revisions_association_name.to_sym].each do |assoc|
45
40
  has_many assoc, (revisable_options.revision_association_options || {}).merge({:class_name => revision_class_name, :foreign_key => :revisable_original_id, :order => "#{quoted_table_name}.#{connection.quote_column_name(:revisable_number)} DESC", :dependent => :destroy})
46
41
  end
47
42
  end
43
+
44
+ if !Object.const_defined?(base.revision_class_name) && base.revisable_options.generate_revision_class?
45
+ Object.const_set(base.revision_class_name, Class.new(ActiveRecord::Base)).class_eval do
46
+ acts_as_revision
47
+ end
48
+ end
48
49
  end
49
50
 
50
51
  # Finds a specific revision of self.
@@ -80,7 +81,7 @@ module FatJam
80
81
  revisions.first
81
82
  when Time
82
83
  revisions.find(:first, :conditions => ["? >= ? and ? <= ?", :revisable_revised_at, by, :revisable_current_at, by])
83
- when self[:revisable_number]
84
+ when self.revisable_number
84
85
  self
85
86
  else
86
87
  revisions.find_by_revisable_number(by)
@@ -274,23 +275,23 @@ module FatJam
274
275
  end
275
276
 
276
277
  # acts_as_revisable's override for ActiveRecord::Base's #save!
277
- def save_with_revisable!(*args) #:nodoc:
278
+ def save!(*args) #:nodoc:
278
279
  self.revisable_new_params ||= args.extract_options!
279
280
  self.no_revision! if self.revisable_new_params.delete :without_revision
280
- save_without_revisable!
281
+ super
281
282
  end
282
283
 
283
284
  # acts_as_revisable's override for ActiveRecord::Base's #save
284
- def save_with_revisable(*args) #:nodoc:
285
+ def save(*args) #:nodoc:
285
286
  self.revisable_new_params ||= args.extract_options!
286
287
  self.no_revision! if self.revisable_new_params.delete :without_revision
287
- save_without_revisable(args)
288
+ super(args)
288
289
  end
289
290
 
290
291
  # Set some defaults for a newly created +Revisable+ instance.
291
292
  def before_revisable_create #:nodoc:
292
293
  self[:revisable_is_current] = true
293
- self[:revisable_number] = 1
294
+ self.revision_number ||= 0
294
295
  end
295
296
 
296
297
  # Checks whether or not a +Revisable+ should be revised.
@@ -347,9 +348,9 @@ module FatJam
347
348
 
348
349
  rev.revisable_original_id = self.id
349
350
 
350
- new_revision_number = revisions.maximum(:revisable_number) + 1 rescue self.revisable_number
351
- rev.revisable_number = new_revision_number
352
- self.revisable_number = new_revision_number + 1
351
+ new_revision_number = revisions.maximum(:revisable_number) + 1 rescue self.revision_number
352
+ rev.revision_number = new_revision_number
353
+ self.revision_number = new_revision_number + 1
353
354
 
354
355
  self.class.column_names.each do |col|
355
356
  next unless self.class.revisable_should_clone_column? col
@@ -402,15 +403,15 @@ module FatJam
402
403
  # with_scope(:with_revisions => true) do
403
404
  # ...
404
405
  # end
405
- def with_scope_with_revisable(*args, &block) #:nodoc:
406
+ def with_scope(*args, &block) #:nodoc:
406
407
  options = (args.grep(Hash).first || {})[:find]
407
408
 
408
409
  if options && options.delete(:with_revisions)
409
- without_model_scope do
410
- with_scope_without_revisable(*args, &block)
410
+ with_exclusive_scope do
411
+ super(*args, &block)
411
412
  end
412
413
  else
413
- with_scope_without_revisable(*args, &block)
414
+ super(*args, &block)
414
415
  end
415
416
  end
416
417
 
@@ -420,26 +421,18 @@ module FatJam
420
421
  # ==== Example
421
422
  #
422
423
  # find(:all, :with_revisions => true)
423
- def find_with_revisable(*args) #:nodoc:
424
+ def find(*args) #:nodoc:
424
425
  options = args.grep(Hash).first
425
426
 
426
427
  if options && options.delete(:with_revisions)
427
- without_model_scope do
428
- find_without_revisable(*args)
428
+ with_exclusive_scope do
429
+ super(*args)
429
430
  end
430
431
  else
431
- find_without_revisable(*args)
432
+ super(*args)
432
433
  end
433
434
  end
434
-
435
- # Equivalent to:
436
- # find(..., :with_revisions => true)
437
- def find_with_revisions(*args)
438
- args << {} if args.grep(Hash).blank?
439
- args.grep(Hash).first.update({:with_revisions => true})
440
- find_with_revisable(*args)
441
- end
442
-
435
+
443
436
  # Returns the +revision_class_name+ as configured in
444
437
  # +acts_as_revisable+.
445
438
  def revision_class_name #:nodoc:
@@ -449,7 +442,7 @@ module FatJam
449
442
  # Returns the actual +Revision+ class based on the
450
443
  # #revision_class_name.
451
444
  def revision_class #:nodoc:
452
- self.revisable_revision_class ||= revision_class_name.constantize
445
+ self.revisable_revision_class ||= self.revision_class_name.constantize
453
446
  end
454
447
 
455
448
  # Returns the revisable_class which in this case is simply +self+.
@@ -460,7 +453,7 @@ module FatJam
460
453
  # Returns the name of the association acts_as_revisable
461
454
  # creates.
462
455
  def revisions_association_name #:nodoc:
463
- revision_class_name.pluralize.downcase
456
+ revision_class_name.pluralize.underscore
464
457
  end
465
458
 
466
459
  # Returns an Array of the columns that are watched for changes.
@@ -1,6 +1,4 @@
1
- require 'acts_as_revisable/clone_associations'
2
-
3
- module FatJam
1
+ module WithoutScope
4
2
  module ActsAsRevisable
5
3
  # This module is mixed into the revision classes.
6
4
  #
@@ -20,14 +18,14 @@ module FatJam
20
18
 
21
19
  base.instance_eval do
22
20
  set_table_name(revisable_class.table_name)
23
- acts_as_scoped_model :find => {:conditions => {:revisable_is_current => false}}
24
-
25
- CloneAssociations.clone_associations(revisable_class, self)
26
-
21
+ default_scope :conditions => {:revisable_is_current => false}
22
+
27
23
  define_callbacks :before_restore, :after_restore
28
24
  before_create :revision_setup
29
25
  after_create :grab_my_branches
30
26
 
27
+ named_scope :deleted, :conditions => ["? is not null", :revisable_deleted_at]
28
+
31
29
  [:current_revision, revisable_association_name.to_sym].each do |a|
32
30
  belongs_to a, :class_name => revisable_class_name, :foreign_key => :revisable_original_id
33
31
  end
@@ -111,7 +109,7 @@ module FatJam
111
109
  # Returns the actual +Revisable+ class based on the
112
110
  # #revisable_class_name.
113
111
  def revisable_class #:nodoc:
114
- self.revisable_revisable_class ||= revisable_class_name.constantize
112
+ self.revisable_revisable_class ||= self.revisable_class_name.constantize
115
113
  end
116
114
 
117
115
  # Returns the revision_class which in this case is simply +self+.
@@ -126,7 +124,7 @@ module FatJam
126
124
  # Returns the name of the association acts_as_revision
127
125
  # creates.
128
126
  def revisable_association_name #:nodoc:
129
- revisable_class_name.downcase
127
+ revisable_class_name.underscore
130
128
  end
131
129
 
132
130
  # Returns an array of the associations that should be cloned.
@@ -1,10 +1,11 @@
1
1
  require 'acts_as_revisable/options'
2
+ require 'acts_as_revisable/quoted_columns'
2
3
  require 'acts_as_revisable/acts/common'
3
4
  require 'acts_as_revisable/acts/revision'
4
5
  require 'acts_as_revisable/acts/revisable'
5
6
  require 'acts_as_revisable/acts/deletable'
6
7
 
7
- module FatJam
8
+ module WithoutScope
8
9
  # define the columns used internall by AAR
9
10
  REVISABLE_SYSTEM_COLUMNS = %w(revisable_original_id revisable_branched_from_id revisable_number revisable_name revisable_type revisable_current_at revisable_revised_at revisable_deleted_at revisable_is_current)
10
11
 
@@ -44,6 +45,7 @@ module FatJam
44
45
  self.revisable_options = Options.new(options, &block)
45
46
 
46
47
  self.send(:include, Common)
48
+ self.send(:include, WithoutScope::QuotedColumnConditions)
47
49
  end
48
50
  end
49
51
  end
@@ -1,14 +1,14 @@
1
- module FatJam #:nodoc:
1
+ module WithoutScope #:nodoc:
2
2
  module ActsAsRevisable
3
3
  class GemSpecOptions
4
4
  HASH = {
5
- :name => "fatjam-acts_as_revisable",
6
- :version => FatJam::ActsAsRevisable::VERSION::STRING,
5
+ :name => "rich-acts_as_revisable",
6
+ :version => WithoutScope::ActsAsRevisable::VERSION::STRING,
7
7
  :summary => "acts_as_revisable enables revision tracking, querying, reverting and branching of ActiveRecord models. Inspired by acts_as_versioned.",
8
- :email => "cavanaugh@fatjam.com",
9
- :homepage => "http://github.com/fatjam/acts_as_revisable/tree/master",
8
+ :email => "rich@withoutscope.com",
9
+ :homepage => "http://github.com/rich/acts_as_revisable",
10
10
  :has_rdoc => true,
11
- :authors => ["Rich Cavanaugh of JamLab, LLC.", "Stephen Caudill of JamLab, LLC."],
11
+ :authors => ["Rich Cavanaugh", "Stephen Caudill"],
12
12
  :files => %w( LICENSE README.rdoc Rakefile ) + Dir["{spec,lib,generators,rails}/**/*"],
13
13
  :rdoc_options => ["--main", "README.rdoc"],
14
14
  :extra_rdoc_files => ["README.rdoc", "LICENSE"]
@@ -1,4 +1,4 @@
1
- module FatJam
1
+ module WithoutScope
2
2
  module ActsAsRevisable
3
3
  # This class provides for a flexible method of setting
4
4
  # options and querying them. This is especially useful
@@ -10,17 +10,13 @@
10
10
  # This is consistent with Rails and Ruby where symbols are used to
11
11
  # represent methods. Only a symbol matching a column name will
12
12
  # trigger this beavior.
13
- module FatJam::QuotedColumnConditions
13
+ module WithoutScope::QuotedColumnConditions
14
14
  def self.included(base)
15
15
  base.send(:extend, ClassMethods)
16
-
17
- class << base
18
- alias_method_chain :quote_bound_value, :quoted_column
19
- end
20
16
  end
21
17
 
22
18
  module ClassMethods
23
- def quote_bound_value_with_quoted_column(value)
19
+ def quote_bound_value(value)
24
20
  if value.is_a?(Symbol) && column_names.member?(value.to_s)
25
21
  # code borrowed from sanitize_sql_hash_for_conditions
26
22
  attr = value.to_s
@@ -29,7 +25,7 @@ module FatJam::QuotedColumnConditions
29
25
  return "#{table_name}.#{connection.quote_column_name(attr)}"
30
26
  end
31
27
 
32
- quote_bound_value_without_quoted_column(value)
28
+ super(value)
33
29
  end
34
30
  end
35
31
  end
@@ -1,9 +1,9 @@
1
- module FatJam #:nodoc:
1
+ module WithoutScope #:nodoc:
2
2
  module ActsAsRevisable
3
3
  module VERSION #:nodoc:
4
- MAJOR = 0
5
- MINOR = 9
6
- TINY = 8
4
+ MAJOR = 1
5
+ MINOR = 0
6
+ TINY = 0
7
7
 
8
8
  STRING = [MAJOR, MINOR, TINY].join('.')
9
9
  end
@@ -5,10 +5,6 @@ require 'activesupport' unless defined? ActiveSupport
5
5
  require 'activerecord' unless defined? ActiveRecord
6
6
 
7
7
  require 'acts_as_revisable/version.rb'
8
- require 'acts_as_revisable/acts/scoped_model'
9
- require 'acts_as_revisable/quoted_columns'
10
8
  require 'acts_as_revisable/base'
11
9
 
12
- ActiveRecord::Base.send(:include, FatJam::ActsAsScopedModel)
13
- ActiveRecord::Base.send(:include, FatJam::QuotedColumnConditions)
14
- ActiveRecord::Base.send(:include, FatJam::ActsAsRevisable)
10
+ ActiveRecord::Base.send(:include, WithoutScope::ActsAsRevisable)
@@ -1,6 +1,6 @@
1
1
  require File.dirname(__FILE__) + '/spec_helper.rb'
2
2
 
3
- describe FatJam::ActsAsRevisable do
3
+ describe WithoutScope::ActsAsRevisable do
4
4
  after(:each) do
5
5
  cleanup_db
6
6
  end
data/spec/branch_spec.rb CHANGED
@@ -4,7 +4,7 @@ class Project
4
4
  validates_presence_of :name
5
5
  end
6
6
 
7
- describe FatJam::ActsAsRevisable, "with branching" do
7
+ describe WithoutScope::ActsAsRevisable, "with branching" do
8
8
  after(:each) do
9
9
  cleanup_db
10
10
  end
data/spec/find_spec.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  require File.dirname(__FILE__) + '/spec_helper.rb'
2
2
 
3
- describe FatJam::ActsAsRevisable do
3
+ describe WithoutScope::ActsAsRevisable do
4
4
  after(:each) do
5
5
  cleanup_db
6
6
  end
@@ -18,21 +18,13 @@ describe FatJam::ActsAsRevisable do
18
18
  it "should accept the :with_revisions options" do
19
19
  lambda { Project.find(:all, :with_revisions => true) }.should_not raise_error
20
20
  end
21
-
22
- it "should provide find_with_revisions" do
23
- lambda { Project.find_with_revisions(:all) }.should_not raise_error
24
- end
25
-
21
+
26
22
  it "should find current and revisions with the :with_revisions option" do
27
23
  Project.find(:all, :with_revisions => true).size.should == 2
28
24
  end
29
-
30
- it "should find current and revisions with the find_with_revisions method" do
31
- Project.find_with_revisions(:all).size.should == 2
32
- end
33
-
25
+
34
26
  it "should find revisions with conditions" do
35
- Project.find_with_revisions(:all, :conditions => {:name => "Rich"}).should == [@project1.find_revision(:previous)]
27
+ Project.find(:all, :conditions => {:name => "Rich"}, :with_revisions => true).should == [@project1.find_revision(:previous)]
36
28
  end
37
29
  end
38
30
  end
data/spec/general_spec.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  require File.dirname(__FILE__) + '/spec_helper.rb'
2
2
 
3
- describe FatJam::ActsAsRevisable do
3
+ describe WithoutScope::ActsAsRevisable do
4
4
  after(:each) do
5
5
  cleanup_db
6
6
  end
@@ -9,6 +9,12 @@ describe FatJam::ActsAsRevisable do
9
9
  @project = Project.create(:name => "Rich", :notes => "this plugin's author")
10
10
  end
11
11
 
12
+ describe "with auto-generated revision class" do
13
+ it "should have a revision class" do
14
+ Foo.revision_class.should == FooRevision
15
+ end
16
+ end
17
+
12
18
  describe "without revisions" do
13
19
  it "should have a revision_number of zero" do
14
20
  @project.revision_number.should be_zero
data/spec/options_spec.rb CHANGED
@@ -38,10 +38,10 @@ shared_examples_for "common Options usage" do
38
38
  end
39
39
  end
40
40
 
41
- describe FatJam::ActsAsRevisable::Options do
41
+ describe WithoutScope::ActsAsRevisable::Options do
42
42
  describe "with hash options" do
43
43
  before(:each) do
44
- @options = FatJam::ActsAsRevisable::Options.new :one => 1, :yes => true, :no => false, :arr => [1,2,3]
44
+ @options = WithoutScope::ActsAsRevisable::Options.new :one => 1, :yes => true, :no => false, :arr => [1,2,3]
45
45
  end
46
46
 
47
47
  it_should_behave_like "common Options usage"
@@ -49,7 +49,7 @@ describe FatJam::ActsAsRevisable::Options do
49
49
 
50
50
  describe "with block options" do
51
51
  before(:each) do
52
- @options = FatJam::ActsAsRevisable::Options.new do
52
+ @options = WithoutScope::ActsAsRevisable::Options.new do
53
53
  one 1
54
54
  yes true
55
55
  arr [1,2,3]
@@ -61,7 +61,7 @@ describe FatJam::ActsAsRevisable::Options do
61
61
 
62
62
  describe "with both block and hash options" do
63
63
  before(:each) do
64
- @options = FatJam::ActsAsRevisable::Options.new(:yes => true, :arr => [1,2,3]) do
64
+ @options = WithoutScope::ActsAsRevisable::Options.new(:yes => true, :arr => [1,2,3]) do
65
65
  one 1
66
66
  end
67
67
  end
@@ -70,7 +70,7 @@ describe FatJam::ActsAsRevisable::Options do
70
70
 
71
71
  describe "the block should override the hash" do
72
72
  before(:each) do
73
- @options = FatJam::ActsAsRevisable::Options.new(:yes => false, :one => 10, :arr => [1,2,3,4,5]) do
73
+ @options = WithoutScope::ActsAsRevisable::Options.new(:yes => false, :one => 10, :arr => [1,2,3,4,5]) do
74
74
  one 1
75
75
  yes true
76
76
  arr [1,2,3]
@@ -14,6 +14,6 @@ describe "the quoted_columns extension" do
14
14
  end
15
15
 
16
16
  it "should not quote strings any differently" do
17
- Project.send(:quote_bound_value, "what").should == Project.send(:quote_bound_value_with_quoted_column, "what")
17
+ Project.send(:quote_bound_value, "what").should == ActiveRecord::Base.send(:quote_bound_value, "what")
18
18
  end
19
19
  end
data/spec/revert_spec.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  require File.dirname(__FILE__) + '/spec_helper.rb'
2
2
 
3
- describe FatJam::ActsAsRevisable, "with reverting" do
3
+ describe WithoutScope::ActsAsRevisable, "with reverting" do
4
4
  after(:each) do
5
5
  cleanup_db
6
6
  end
data/spec/spec_helper.rb CHANGED
@@ -36,6 +36,15 @@ def setup_db
36
36
  t.datetime :revisable_current_at, :revisable_revised_at, :revisable_deleted_at
37
37
  t.timestamps
38
38
  end
39
+
40
+ create_table :foos do |t|
41
+ t.string :name, :revisable_name, :revisable_type
42
+ t.text :notes
43
+ t.boolean :revisable_is_current
44
+ t.integer :revisable_original_id, :revisable_branched_from_id, :revisable_number, :project_id
45
+ t.datetime :revisable_current_at, :revisable_revised_at, :revisable_deleted_at
46
+ t.timestamps
47
+ end
39
48
  end
40
49
  end
41
50
 
@@ -52,6 +61,7 @@ class Person < ActiveRecord::Base
52
61
 
53
62
  acts_as_revisable do
54
63
  revision_class_name "OldPerson"
64
+ on_delete :revise
55
65
  end
56
66
  end
57
67
 
@@ -76,4 +86,8 @@ class Session < ActiveRecord::Base
76
86
  revisable_class_name "Project"
77
87
  clone_associations :all
78
88
  end
89
+ end
90
+
91
+ class Foo < ActiveRecord::Base
92
+ acts_as_revisable :generate_revision_class => true
79
93
  end
metadata CHANGED
@@ -1,21 +1,21 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rich-acts_as_revisable
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.8
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
- - Rich Cavanaugh of JamLab, LLC.
8
- - Stephen Caudill of JamLab, LLC.
7
+ - Rich Cavanaugh
8
+ - Stephen Caudill
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2008-10-27 00:00:00 -07:00
13
+ date: 2009-04-01 00:00:00 -07:00
14
14
  default_executable:
15
15
  dependencies: []
16
16
 
17
17
  description:
18
- email: cavanaugh@fatjam.com
18
+ email: rich@withoutscope.com
19
19
  executables: []
20
20
 
21
21
  extensions: []
@@ -56,7 +56,7 @@ files:
56
56
  - generators/revisable_migration/templates/migration.rb
57
57
  - rails/init.rb
58
58
  has_rdoc: true
59
- homepage: http://github.com/fatjam/acts_as_revisable/tree/master
59
+ homepage: http://github.com/rich/acts_as_revisable/tree/master
60
60
  post_install_message:
61
61
  rdoc_options:
62
62
  - --main
@@ -1,75 +0,0 @@
1
- module FatJam
2
- module ActsAsScopedModel
3
- def self.included(base)
4
- base.send(:extend, ClassMethods)
5
- end
6
-
7
- module ClassMethods
8
- SCOPED_METHODS = %w(construct_calculation_sql construct_finder_sql update_all delete_all destroy_all).freeze
9
-
10
- def call_method_with_static_scope(meth, args)
11
- return send(meth, *args) unless self.scoped_model_enabled?
12
-
13
- with_scope(self.scoped_model_static_scope) do
14
- send(meth, *args)
15
- end
16
- end
17
-
18
- SCOPED_METHODS.each do |m|
19
- module_eval <<-EVAL
20
- def #{m}_with_static_scope(*args)
21
- call_method_with_static_scope(:#{m}_without_static_scope, args)
22
- end
23
- EVAL
24
- end
25
-
26
- def without_model_scope
27
- return unless block_given?
28
-
29
- begin
30
- self.scoped_model_enabled = false
31
- rv = yield
32
- ensure
33
- self.scoped_model_enabled = true
34
- end
35
-
36
- rv
37
- end
38
-
39
- def disable_model_scope!
40
- self.scoped_model_disable_count += 1
41
- end
42
-
43
- def enable_model_scope!
44
- self.scoped_model_disable_count -= 1
45
- end
46
-
47
- def scoped_model_enabled?
48
- self.scoped_model_disable_count == 0
49
- end
50
-
51
- def scoped_model_enabled
52
- self.scoped_model_enabled?
53
- end
54
-
55
- def scoped_model_enabled=(value)
56
- if value == false
57
- disable_model_scope!
58
- else
59
- enable_model_scope!
60
- end
61
- end
62
-
63
- def acts_as_scoped_model(*args)
64
- class << self
65
- attr_accessor :scoped_model_static_scope, :scoped_model_disable_count
66
- SCOPED_METHODS.each do |m|
67
- alias_method_chain m.to_sym, :static_scope
68
- end
69
- end
70
- self.scoped_model_disable_count = 0
71
- self.scoped_model_static_scope = args.extract_options!
72
- end
73
- end
74
- end
75
- end
@@ -1,36 +0,0 @@
1
- # This module encapsulates the methods used by ActsAsRevisable
2
- # for cloning associations from one model to another.
3
- module FatJam
4
- module ActsAsRevisable
5
- module CloneAssociations
6
- class << self
7
- def clone_associations(from, to)
8
- return unless from.descends_from_active_record? && to.descends_from_active_record?
9
-
10
- to.revision_cloned_associations.each do |key|
11
- assoc = from.reflect_on_association(key)
12
- meth = "clone_#{assoc.macro.to_s}_association"
13
- meth = "clone_association" unless respond_to? meth
14
- send(meth, assoc, to)
15
- end
16
- end
17
-
18
- def clone_association(association, to)
19
- options = association.options.clone
20
- options[:foreign_key] ||= "revisable_original_id"
21
- to.send(association.macro, association.name, options)
22
- end
23
-
24
- def clone_belongs_to_association(association, to)
25
- to.send(association.macro, association.name, association.options.clone)
26
- end
27
-
28
- def clone_has_many_association(association, to)
29
- options = association.options.clone
30
- options[:association_foreign_key] ||= "revisable_original_id"
31
- to.send(association.macro, association.name, options)
32
- end
33
- end
34
- end
35
- end
36
- end