version_fu 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/MIT-LICENSE ADDED
@@ -0,0 +1,24 @@
1
+ == version_fu
2
+ Copyright (c) 2008-9 Jordan McKible
3
+
4
+ == acts_as_versioned
5
+ Copyright (c) 2005 Rick Olson
6
+ ====================================================================
7
+
8
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
9
+ this software and associated documentation files (the "Software"), to deal in
10
+ the Software without restriction, including without limitation the rights to
11
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
12
+ of the Software, and to permit persons to whom the Software is furnished to do
13
+ so, subject to the following conditions:
14
+
15
+ The above copyright notice and this permission notice shall be included in all
16
+ copies or substantial portions of the Software.
17
+
18
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24
+ SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,121 @@
1
+ = version_fu
2
+
3
+ version_fu is a ActveRecord versioning plugin that takes advantage of the new dirty attribute checking available in Rails 2.1. Previous solutions like Rick Olson's acts_as_versioned are no long compatible with Rails.
4
+
5
+ nbudin-version_fu is Nat Budin's attempt to merge revo's Gemified version with jmckible's latest additions and fixes. Nat hopes to have these changes merged into mainline version_fu eventually so that it can be released as a gem.
6
+
7
+ == Installation
8
+
9
+ gem install nbudin-version_fu
10
+
11
+ === Installation in a Rails application
12
+
13
+ In your config/environment.rb, or in an initializer, add the line:
14
+
15
+ config.gem "nbudin-version_fu", :lib => "version_fu", :source => "http://gemcutter.org"
16
+
17
+ Then run:
18
+
19
+ sudo rake gems:install
20
+
21
+ == Usage
22
+
23
+ Let's say I have a pages table:
24
+
25
+ class Page < ActiveRecord::Base
26
+ # attributes: id, type, title, body, created_at, updated_at, creator_id, author_id
27
+ end
28
+
29
+ I want to track any changes made. First step will be to make a new page_versions table:
30
+
31
+ class CreatePageVersions < ActiveRecord::Migration
32
+ def self.up
33
+ create_table :page_versions do |t|
34
+ t.integer :page_id, :version, :author_id
35
+ t.string :title
36
+ t.text :body
37
+ t.timestamps
38
+ end
39
+ end
40
+
41
+ def self.down
42
+ drop_table :page_versions
43
+ end
44
+ end
45
+
46
+ In this case, the author_id column represents the last person to edit the page. We want to track this attribute with every version. However, the creator_id is the person who created the page. The will never change, so it's not part of the versioned table.
47
+
48
+ Don't forget to add a version column to your pages table. Have it default to 1 just to be safe (although the plugin should account for this):
49
+
50
+ class AddVersionToPages < ActiveRecord::Migration
51
+ def self.up
52
+ add_column :pages, :version, :integer, :default=>1
53
+ end
54
+ def self.down
55
+ remove_column :pages, :version
56
+ end
57
+ end
58
+
59
+ Of course if you're adding this plugin to a table with existing data, you'll probably want to instantiate some initial versions to start with.
60
+
61
+ Alright, so now that the database tables are in place, we can fire up version_fu. It's quite simple:
62
+
63
+ class Page < ActiveRecord::Base
64
+ version_fu
65
+ end
66
+
67
+ Thats it.
68
+
69
+
70
+ == Configuration
71
+
72
+ You can pass a few configuration options if need be. If you stick with the defaults above, you can skip all this.
73
+
74
+ class Page < ActiveRecord::Base
75
+ version_fu :class_name=>'Version', :foreign_key=>'page_id', :table_name=>'page_versions', :version_column=>'version'
76
+ end
77
+
78
+ * :class_name - The name of the versioned class. It will be a submodule of the versioning class - e.g. Page::Version
79
+
80
+ * :foreign_key - The column in the versioned table associated with the versioning class
81
+
82
+ * :table_name - The name of the versioned table
83
+
84
+ * :version_column - The name of the version column
85
+
86
+
87
+ == Extensions
88
+
89
+ Now that you've got some versions, it would be nice to use ActiveRecord associations on it. For example, Page.first.versions.latest.author wouldn't currently work because the Page::Version class doesn't know about the author method. The version_fu call does all you to pass a block which is executed by the versioned class. There is just one gotcha for associations:
90
+
91
+ class Page < ActiveRecord::Base
92
+ version_fu do
93
+ belongs_to :author, :class_name=>'::Author'
94
+ end
95
+ end
96
+
97
+ Don't forget the class name, or you'll get a warning
98
+
99
+ == When to Version
100
+
101
+ By default a new version will be saved whenever a versioned column is changed. However, you can control this at a more fine grained level. Just override the create_new_version? method. For example, let's say you only want to save a new version if both the page title and body changed. Taking advantage of the dirty attribute methods, you could do something like this:
102
+
103
+ class Page < ActiveRecord::Base
104
+ version_fu do
105
+ belongs_to :author, :class_name=>'::Author'
106
+ end
107
+ def create_new_version?
108
+ title_changed? && body_changed?
109
+ end
110
+ end
111
+
112
+
113
+ == Author
114
+
115
+ * version_fu was created by Jordan McKible http://jordan.mckible.com
116
+
117
+ * Available on GitHub at http://github.com/jmckible/version_fu/tree/master
118
+
119
+ * Hosted on Gemcutter, at least for now, at http://gemcutter.org/gems/nbudin-version_fu
120
+
121
+ * acts_as_versioned by Rick Olson http://github.com/technoweenie/acts_as_versioned/tree/master
data/Rakefile ADDED
@@ -0,0 +1,30 @@
1
+ require 'rake'
2
+ require 'rake/testtask'
3
+ require 'rake/rdoctask'
4
+ require 'rubygems'
5
+
6
+ desc 'Default: run unit tests.'
7
+ task :default=>:test
8
+
9
+ desc 'Test the version_fu plugin.'
10
+ Rake::TestTask.new(:test) do |t|
11
+ t.libs << 'lib'
12
+ t.libs << 'test'
13
+ t.libs << 'test/models'
14
+ t.pattern = 'test/**/*_test.rb'
15
+ t.verbose = true
16
+ end
17
+
18
+ begin
19
+ require 'jeweler'
20
+ Jeweler::Tasks.new do |gemspec|
21
+ gemspec.name = "nbudin-version_fu"
22
+ gemspec.summary = "Gemified version of the version_fu plugin, tracking changes from revo and jmckible."
23
+ gemspec.description = "version_fu is a ActveRecord versioning gem that takes advantage of the new dirty attribute checking available in Rails 2.1. Previous solutions like Rick Olson's acts_as_versioned are no long compatible with Rails."
24
+ gemspec.email = ""
25
+ gemspec.homepage = "http://github.com/nbudin/version_fu"
26
+ gemspec.authors = ["Jordan McKible"]
27
+ end
28
+ rescue LoadError
29
+ puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
30
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 1.0.1
data/init.rb ADDED
@@ -0,0 +1,2 @@
1
+ require 'version_fu'
2
+ ActiveRecord::Base.class_eval { include VersionFu }
@@ -0,0 +1,109 @@
1
+ module VersionFu
2
+ def self.included(base)
3
+ base.extend ClassMethods
4
+ end
5
+
6
+ module ClassMethods
7
+ def version_fu(options={}, &block)
8
+ return if self.included_modules.include? VersionFu::InstanceMethods
9
+ __send__ :include, VersionFu::InstanceMethods
10
+
11
+ cattr_accessor :versioned_class_name, :versioned_foreign_key, :versioned_table_name,
12
+ :version_column, :versioned_columns
13
+
14
+ self.versioned_class_name = options[:class_name] || 'Version'
15
+ self.versioned_foreign_key = options[:foreign_key] || self.to_s.foreign_key
16
+ self.versioned_table_name = options[:table_name] || "#{table_name_prefix}#{base_class.name.demodulize.underscore}_versions#{table_name_suffix}"
17
+ self.version_column = options[:version_column] || 'version'
18
+
19
+ # Setup versions association
20
+ class_eval do
21
+ has_many :versions, :class_name => "#{self.to_s}::#{versioned_class_name}",
22
+ :foreign_key => versioned_foreign_key,
23
+ :dependent => :destroy do
24
+ def latest
25
+ find :first, :order=>'version desc'
26
+ end
27
+ end
28
+
29
+ before_save :check_for_new_version
30
+ end
31
+
32
+ # Versioned Model
33
+ const_set(versioned_class_name, Class.new(ActiveRecord::Base)).class_eval do
34
+ # find first version before the given version
35
+ def self.before(version)
36
+ find :first, :order => 'version desc',
37
+ :conditions => ["#{original_class.versioned_foreign_key} = ? and version < ?", version.send(original_class.versioned_foreign_key), version.version]
38
+ end
39
+
40
+ # find first version after the given version.
41
+ def self.after(version)
42
+ find :first, :order => 'version',
43
+ :conditions => ["#{original_class.versioned_foreign_key} = ? and version > ?", version.send(original_class.versioned_foreign_key), version.version]
44
+ end
45
+
46
+ def previous
47
+ self.class.before(self)
48
+ end
49
+
50
+ def next
51
+ self.class.after(self)
52
+ end
53
+ end
54
+
55
+ # Housekeeping on versioned class
56
+ versioned_class.cattr_accessor :original_class
57
+ versioned_class.original_class = self
58
+ versioned_class.set_table_name versioned_table_name
59
+
60
+ # Version parent association
61
+ versioned_class.belongs_to self.to_s.demodulize.underscore.to_sym,
62
+ :class_name => "::#{self.to_s}",
63
+ :foreign_key => versioned_foreign_key
64
+
65
+ # Block extension
66
+ versioned_class.class_eval &block if block_given?
67
+
68
+ if self.versioned_class.table_exists?
69
+ # Finally setup which columns to version
70
+ self.versioned_columns = versioned_class.new.attributes.keys -
71
+ [versioned_class.primary_key, versioned_foreign_key, version_column, 'created_at', 'updated_at']
72
+ else
73
+ ActiveRecord::Base.logger.warn "Version Table not found"
74
+ end
75
+ end
76
+
77
+ def versioned_class
78
+ const_get versioned_class_name
79
+ end
80
+ end
81
+
82
+
83
+ module InstanceMethods
84
+ def find_version(number)
85
+ versions.find :first, :conditions=>{:version=>number}
86
+ end
87
+
88
+ def check_for_new_version
89
+ instatiate_revision if create_new_version?
90
+ true # Never halt save
91
+ end
92
+
93
+ # This the method to override if you want to have more control over when to version
94
+ def create_new_version?
95
+ # Any versioned column changed?
96
+ self.class.versioned_columns.detect {|a| __send__ "#{a}_changed?"}
97
+ end
98
+
99
+ def instatiate_revision
100
+ new_version = versions.build
101
+ versioned_columns.each do |attribute|
102
+ new_version.__send__ "#{attribute}=", __send__(attribute)
103
+ end
104
+ version_number = new_record? ? 1 : version + 1
105
+ new_version.version = version_number
106
+ self.version = version_number
107
+ end
108
+ end
109
+ end
data/lib/version_fu.rb ADDED
@@ -0,0 +1,2 @@
1
+ require 'version_fu/version_fu'
2
+ ActiveRecord::Base.class_eval { include VersionFu }
@@ -0,0 +1,18 @@
1
+ sqlite:
2
+ :adapter: sqlite
3
+ :database: version_fu_plugin.sqlite.db
4
+ sqlite3:
5
+ :adapter: sqlite3
6
+ :database: db/version_fu_plugin.sqlite3.db
7
+ postgresql:
8
+ :adapter: postgresql
9
+ :username: postgres
10
+ :password: postgres
11
+ :database: version_fu_plugin_test
12
+ :min_messages: ERROR
13
+ mysql:
14
+ :adapter: mysql
15
+ :host: localhost
16
+ :username: root
17
+ :password:
18
+ :database: version_fu_plugin_test
data/test/db/schema.rb ADDED
@@ -0,0 +1,37 @@
1
+ ActiveRecord::Schema.define(:version=>0) do
2
+
3
+ create_table :authors, :force=>true do |t|
4
+ t.column :version, :integer
5
+ t.column :first_name, :string, :limit=>255
6
+ t.column :last_name, :string, :limit=>255
7
+ end
8
+
9
+ create_table :author_versions, :force=>true do |t|
10
+ t.column :author_id, :integer
11
+ t.column :version, :integer
12
+ t.column :first_name, :string, :limit=>255
13
+ t.column :last_name, :string, :limit=>255
14
+ end
15
+
16
+ create_table :pages, :force=>true do |t|
17
+ t.column :type, :string
18
+ t.column :version, :integer
19
+ t.column :title, :string, :limit=>255
20
+ t.column :body, :text
21
+ t.column :created_at, :datetime
22
+ t.column :updated_at, :datetime
23
+ t.column :creator_id, :integer
24
+ t.column :author_id, :integer
25
+ end
26
+
27
+ create_table :page_versions, :force=>true do |t|
28
+ t.column :page_id, :integer
29
+ t.column :version, :integer
30
+ t.column :title, :string, :limit=>255
31
+ t.column :body, :text
32
+ t.column :created_at, :datetime
33
+ t.column :updated_at, :datetime
34
+ t.column :author_id, :integer
35
+ end
36
+
37
+ end
@@ -0,0 +1,27 @@
1
+ larry_1:
2
+ id: 1
3
+ version: 1
4
+ author_id: 1
5
+ first_name: Larry
6
+ last_name: Appleton
7
+
8
+ sara_1:
9
+ id: 2
10
+ version: 1
11
+ author_id: 2
12
+ first_name: Sara
13
+ last_name: Maiden
14
+
15
+ sara_2:
16
+ id: 4
17
+ version: 2
18
+ author_id: 2
19
+ first_name: Sara
20
+ last_name: Smiles
21
+
22
+ peter_1:
23
+ id: 3
24
+ version: 1
25
+ author_id: 3
26
+ first_name: Peter
27
+ last_name: Parker
@@ -0,0 +1,17 @@
1
+ larry:
2
+ id: 1
3
+ version: 1
4
+ first_name: Larry
5
+ last_name: Appleton
6
+
7
+ sara:
8
+ id: 2
9
+ version: 2
10
+ first_name: Sara
11
+ last_name: Smiles
12
+
13
+ peter:
14
+ id: 3
15
+ version: 1
16
+ first_name: Peter
17
+ last_name: Parker
@@ -0,0 +1,19 @@
1
+ welcome_1:
2
+ id: 1
3
+ page_id: 1
4
+ version: 1
5
+ title: Welcome
6
+ body: Initial body
7
+ created_at: <%= 1.hour.ago.to_s :db %>
8
+ updated_at: <%= 1.hour.ago.to_s :db %>
9
+ author_id: 1
10
+
11
+ welcome_2:
12
+ id: 2
13
+ page_id: 1
14
+ version: 2
15
+ title: Version 2
16
+ body: two
17
+ created_at: <%= 30.minutes.ago.to_s :db %>
18
+ updated_at: <%= 30.minutes.ago.to_s :db %>
19
+ author_id: 2
@@ -0,0 +1,10 @@
1
+ welcome:
2
+ id: 1
3
+ type: Page
4
+ version: 2
5
+ title: Version 2
6
+ body: two
7
+ created_at: <%= 1.hour.ago.to_s :db %>
8
+ updated_at: <%= 1.hour.ago.to_s :db %>
9
+ creator_id: 1
10
+ author_id: 2
@@ -0,0 +1,16 @@
1
+ class Author < ActiveRecord::Base
2
+
3
+ version_fu
4
+ def create_new_version?
5
+ first_name_change && last_name_changed?
6
+ end
7
+
8
+ def name
9
+ "#{first_name} #{last_name}"
10
+ end
11
+
12
+ def hello_world(n=1)
13
+ "Hello World #{n}"
14
+ end
15
+
16
+ end
@@ -0,0 +1,8 @@
1
+ class Page < ActiveRecord::Base
2
+ version_fu do
3
+ belongs_to :author, :class_name=>'::Author'
4
+ end
5
+
6
+ belongs_to :author
7
+ belongs_to :creator, :class_name=>'Author'
8
+ end
@@ -0,0 +1,26 @@
1
+ require 'test/unit'
2
+ require 'rubygems'
3
+ require File.expand_path(File.join(File.dirname(__FILE__), '../../../../config/environment.rb'))
4
+
5
+ require 'active_record'
6
+ require 'active_record/fixtures'
7
+
8
+ config = YAML::load(IO.read(File.dirname(__FILE__) + '/db/database.yml'))
9
+ ActiveRecord::Base.logger = Logger.new(File.dirname(__FILE__) + "/debug.log")
10
+ ActiveRecord::Base.configurations = {'test' => config[ENV['DB'] || 'sqlite3']}
11
+ ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations['test'])
12
+
13
+ load(File.dirname(__FILE__) + '/db/schema.rb')
14
+
15
+ class ActiveSupport::TestCase
16
+ include ActiveRecord::TestFixtures
17
+
18
+ self.fixture_path = File.dirname(__FILE__) + '/fixtures/'
19
+
20
+ self.use_transactional_fixtures = true
21
+ self.use_instantiated_fixtures = false
22
+
23
+ fixtures :all
24
+ set_fixture_class :page_versions => Page::Version
25
+ set_fixture_class :author_versions => Author::Version
26
+ end
@@ -0,0 +1,134 @@
1
+ require 'test_helper'
2
+
3
+ class VersionFuTest < ActiveSupport::TestCase
4
+ #############################################################################
5
+ # A S S O C I A T I O N S #
6
+ #############################################################################
7
+ test 'parent has many versions' do
8
+ assert_equal page_versions(:welcome_1, :welcome_2), pages(:welcome).versions
9
+ end
10
+
11
+ test 'version belongs to parent' do
12
+ assert_equal pages(:welcome), page_versions(:welcome_1).page
13
+ end
14
+
15
+ #############################################################################
16
+ # A T T R I B U T E S #
17
+ #############################################################################
18
+ test 'version proper columns' do
19
+ assert_equal ['title', 'body', 'author_id'], Page.new.versioned_columns
20
+ end
21
+
22
+ test 'do not version non-existing columns' do
23
+ assert !Page.new.versioned_columns.include?(:creator_id)
24
+ end
25
+
26
+ #############################################################################
27
+ # C R E A T E #
28
+ #############################################################################
29
+ test 'save version on create' do
30
+ old_count = Page.count
31
+ old_version_count = Page::Version.count
32
+ page = Page.create :title=>'New', :body=>'body', :creator=>authors(:larry), :author=>authors(:larry)
33
+ assert_equal old_count + 1, Page.count
34
+ assert_equal old_version_count + 1, Page::Version.count
35
+ end
36
+
37
+ test 'wire up associations on create' do
38
+ page = Page.create :title=>'New', :body=>'body', :creator=>authors(:larry), :author=>authors(:larry)
39
+ assert_equal Page::Version.find(:first, :order=>'id desc'), page.versions.first
40
+ end
41
+
42
+ test 'begin version numbering at 1' do
43
+ page = Page.create :title=>'New', :body=>'body', :creator=>authors(:larry), :author=>authors(:larry)
44
+ assert_equal 1, page.version
45
+ assert_equal 1, page.versions.first.version
46
+ end
47
+
48
+ test 'assign attributes on create' do
49
+ page = Page.create :title=>'New', :body=>'body', :creator=>authors(:larry), :author=>authors(:larry)
50
+ version = page.versions.first
51
+ assert_equal 'New', version.title
52
+ assert_equal 'body', version.body
53
+ assert_equal authors(:larry).id, version.author_id
54
+ end
55
+
56
+ #############################################################################
57
+ # U P D A T E #
58
+ #############################################################################
59
+ test 'save version on update' do
60
+ old_count = Page::Version.count
61
+ page = pages(:welcome)
62
+ page.update_attributes :title=>'New title', :body=>'new body', :author=>authors(:sara)
63
+ assert_equal old_count + 1, Page::Version.count
64
+ end
65
+
66
+ test 'increment verson number' do
67
+ page = pages(:welcome)
68
+ old_count = page.version
69
+ page.update_attributes :title=>'New title', :body=>'new body', :author=>authors(:sara)
70
+ assert_equal old_count + 1, page.reload.version
71
+ end
72
+
73
+ test 'update version attributes' do
74
+ page = pages(:welcome)
75
+ page.update_attributes :title=>'Latest', :body=>'newest', :author=>authors(:peter)
76
+ version = page.reload.versions.latest
77
+ assert_equal 'Latest', version.title
78
+ assert_equal 'newest', version.body
79
+ assert_equal authors(:peter).id, version.author_id
80
+ end
81
+
82
+ #############################################################################
83
+ # S K I P V E R S I O N I N G #
84
+ #############################################################################
85
+ test 'do not create version if nothing changed' do
86
+ old_count = Page::Version.count
87
+ pages(:welcome).save
88
+ assert_equal old_count, Page::Version.count
89
+ end
90
+
91
+ test 'do not create version if untracked attribute changed' do
92
+ old_count = Page::Version.count
93
+ pages(:welcome).update_attributes :author=>authors(:sara)
94
+ assert_equal old_count, Page::Version.count
95
+ end
96
+
97
+ test 'do not create version if custom version check' do
98
+ old_count = Author::Version.count
99
+ authors(:larry).update_attributes :last_name=>'Lessig'
100
+ assert_equal old_count, Author::Version.count
101
+ end
102
+
103
+ test 'still save if no new version with custom version check' do
104
+ authors(:larry).update_attributes :last_name=>'Lessig'
105
+ assert_equal 'Lessig', authors(:larry).reload.last_name
106
+ end
107
+
108
+ #############################################################################
109
+ # F I N D #
110
+ #############################################################################
111
+ test 'find version given number' do
112
+ assert_equal page_versions(:welcome_1), pages(:welcome).find_version(1)
113
+ assert_equal page_versions(:welcome_2), pages(:welcome).find_version(2)
114
+ end
115
+
116
+ test 'find latest version' do
117
+ assert_equal page_versions(:welcome_2), pages(:welcome).versions.latest
118
+ end
119
+
120
+ test 'find previous version' do
121
+ assert_equal page_versions(:welcome_1), page_versions(:welcome_2).previous
122
+ end
123
+
124
+ test 'find next version' do
125
+ assert_equal page_versions(:welcome_2), page_versions(:welcome_1).next
126
+ end
127
+
128
+ #############################################################################
129
+ # B L O C K E X T E N S I O N #
130
+ #############################################################################
131
+ test 'take a block containing ActiveRecord extension' do
132
+ assert_equal authors(:larry), page_versions(:welcome_1).author
133
+ end
134
+ end
metadata ADDED
@@ -0,0 +1,92 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: version_fu
3
+ version: !ruby/object:Gem::Version
4
+ hash: 21
5
+ prerelease: false
6
+ segments:
7
+ - 1
8
+ - 0
9
+ - 1
10
+ version: 1.0.1
11
+ platform: ruby
12
+ authors:
13
+ - Jordan McKible
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2010-09-01 00:00:00 -07:00
19
+ default_executable:
20
+ dependencies: []
21
+
22
+ description: version_fu helps version your ActiveRecord models. It is based on Rick Olson's acts_as_versioned and is compatible with Rails 3.
23
+ email: ""
24
+ executables: []
25
+
26
+ extensions: []
27
+
28
+ extra_rdoc_files:
29
+ - README.rdoc
30
+ files:
31
+ - init.rb
32
+ - MIT-LICENSE
33
+ - Rakefile
34
+ - README.rdoc
35
+ - VERSION
36
+ - lib/version_fu.rb
37
+ - lib/version_fu/version_fu.rb
38
+ - test/db/database.yml
39
+ - test/db/schema.rb
40
+ - test/fixtures/author_versions.yml
41
+ - test/fixtures/authors.yml
42
+ - test/fixtures/page_versions.yml
43
+ - test/fixtures/pages.yml
44
+ - test/models/author.rb
45
+ - test/models/page.rb
46
+ - test/test_helper.rb
47
+ - test/version_fu_test.rb
48
+ has_rdoc: true
49
+ homepage: ""
50
+ licenses: []
51
+
52
+ post_install_message:
53
+ rdoc_options:
54
+ - --charset=UTF-8
55
+ require_paths:
56
+ - lib
57
+ required_ruby_version: !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ hash: 3
63
+ segments:
64
+ - 0
65
+ version: "0"
66
+ required_rubygems_version: !ruby/object:Gem::Requirement
67
+ none: false
68
+ requirements:
69
+ - - ">="
70
+ - !ruby/object:Gem::Version
71
+ hash: 3
72
+ segments:
73
+ - 0
74
+ version: "0"
75
+ requirements: []
76
+
77
+ rubyforge_project:
78
+ rubygems_version: 1.3.7
79
+ signing_key:
80
+ specification_version: 3
81
+ summary: Gemified version of the version_fu plugin.
82
+ test_files:
83
+ - test/db/database.yml
84
+ - test/db/schema.rb
85
+ - test/fixtures/author_versions.yml
86
+ - test/fixtures/authors.yml
87
+ - test/fixtures/page_versions.yml
88
+ - test/fixtures/pages.yml
89
+ - test/models/author.rb
90
+ - test/models/page.rb
91
+ - test/test_helper.rb
92
+ - test/version_fu_test.rb