revo-version_fu 1.0.0

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 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,109 @@
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
+
6
+ == Installation
7
+
8
+ ./script/plugin install git://github.com/jmckible/version_fu.git
9
+
10
+
11
+ == Usage
12
+
13
+ Let's say I have a pages table:
14
+
15
+ class Page < ActiveRecord::Base
16
+ # attributes: id, type, title, body, created_at, updated_at, creator_id, author_id
17
+ end
18
+
19
+ I want to track any changes made. First step will be to make a new page_versions table:
20
+
21
+ class CreatePageVersions < ActiveRecord::Migration
22
+ def self.up
23
+ create_table :page_versions do |t|
24
+ t.integer :page_id, :version, :author_id
25
+ t.string :title
26
+ t.text :body
27
+ t.timestamps
28
+ end
29
+ end
30
+
31
+ def self.down
32
+ drop_table :page_versions
33
+ end
34
+ end
35
+
36
+ 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.
37
+
38
+ 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):
39
+
40
+ class AddVersionToPages < ActiveRecord::Migration
41
+ def self.up
42
+ add_column :pages, :version, :integer, :default=>1
43
+ end
44
+ def self.down
45
+ remove_column :pages, :version
46
+ end
47
+ end
48
+
49
+ 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.
50
+
51
+ Alright, so now that the database tables are in place, we can fire up version_fu. It's quite simple:
52
+
53
+ class Page < ActiveRecord::Base
54
+ version_fu
55
+ end
56
+
57
+ Thats it.
58
+
59
+
60
+ == Configuration
61
+
62
+ You can pass a few configuration options if need be. If you stick with the defaults above, you can skip all this.
63
+
64
+ class Page < ActiveRecord::Base
65
+ version_fu :class_name=>'Version', :foreign_key=>'page_id', :table_name=>'page_versions', :version_column=>'version'
66
+ end
67
+
68
+ * :class_name - The name of the versioned class. It will be a submodule of the versioning class - e.g. Page::Version
69
+
70
+ * :foreign_key - The column in the versioned table associated with the versioning class
71
+
72
+ * :table_name - The name of the versioned table
73
+
74
+ * :version_column - The name of the version column
75
+
76
+
77
+ == Extensions
78
+
79
+ 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:
80
+
81
+ class Page < ActiveRecord::Base
82
+ version_fu do
83
+ belongs_to :author, :class_name=>'::Author'
84
+ end
85
+ end
86
+
87
+ Don't forget the class name, or you'll get a warning
88
+
89
+ == When to Version
90
+
91
+ 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:
92
+
93
+ class Page < ActiveRecord::Base
94
+ version_fu do
95
+ belongs_to :author, :class_name=>'::Author'
96
+ end
97
+ def create_new_version?
98
+ title_changed? && body_changed?
99
+ end
100
+ end
101
+
102
+
103
+ == Author
104
+
105
+ * version_fu was created by Jordan McKible http://jordan.mckible.com
106
+
107
+ * Available on GitHub at http://github.com/jmckible/version_fu/tree/master
108
+
109
+ * acts_as_versioned by Rick Olson http://github.com/technoweenie/acts_as_versioned/tree/master
@@ -0,0 +1,8 @@
1
+ This plugin should be inside a Rails project in the vendor/plugins/version_fu folder.
2
+
3
+ The project should also have Rails froze in vendor/rails
4
+
5
+ You'll probably want to test with sqlite3, so make sure you have the sqlite3-ruby gem installed
6
+
7
+ Inside the vendor/plugins/version_fu directory, run the test suite with:
8
+ $ ruby test/version_fu_test.rb
data/Rakefile ADDED
@@ -0,0 +1,15 @@
1
+ require 'rubygems'
2
+ begin
3
+ require 'jeweler'
4
+ Jeweler::Tasks.new do |gemspec|
5
+ gemspec.name = "version_fu"
6
+ gemspec.summary = "Gemified version of the version_fu plugin."
7
+ 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."
8
+ gemspec.email = ""
9
+ gemspec.homepage = ""
10
+ gemspec.description = "TODO"
11
+ gemspec.authors = ["Jordan McKible"]
12
+ end
13
+ rescue LoadError
14
+ puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
15
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 1.0.0
@@ -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 }
data/test/database.yml ADDED
@@ -0,0 +1,18 @@
1
+ sqlite:
2
+ :adapter: sqlite
3
+ :dbfile: version_fu_plugin.sqlite.db
4
+ sqlite3:
5
+ :adapter: sqlite3
6
+ :dbfile: 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
@@ -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,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,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,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
data/test/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,19 @@
1
+ require 'test/unit'
2
+ require File.expand_path(File.join(File.dirname(__FILE__), '../../../../config/environment.rb'))
3
+ require 'rubygems'
4
+ require 'active_record/fixtures'
5
+
6
+ config = YAML::load(IO.read(File.dirname(__FILE__) + '/database.yml'))
7
+ ActiveRecord::Base.logger = Logger.new(File.dirname(__FILE__) + "/debug.log")
8
+ ActiveRecord::Base.configurations = {'test' => config[ENV['DB'] || 'sqlite3']}
9
+ ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations['test'])
10
+
11
+ load(File.dirname(__FILE__) + "/schema.rb")
12
+
13
+ Test::Unit::TestCase.fixture_path = File.dirname(__FILE__) + "/fixtures/"
14
+ $:.unshift(Test::Unit::TestCase.fixture_path)
15
+
16
+ class Test::Unit::TestCase
17
+ self.use_transactional_fixtures = true
18
+ self.use_instantiated_fixtures = false
19
+ end
@@ -0,0 +1,140 @@
1
+ require File.join(File.dirname(__FILE__), 'test_helper')
2
+ require File.join(File.dirname(__FILE__), 'fixtures/author')
3
+ require File.join(File.dirname(__FILE__), 'fixtures/page')
4
+
5
+ class VersionFuTest < Test::Unit::TestCase
6
+ fixtures :pages, :page_versions, :authors, :author_versions
7
+ set_fixture_class :page_versions => Page::Version
8
+ set_fixture_class :author_versions => Author::Version
9
+
10
+ #############################################################################
11
+ # A S S O C I A T I O N S #
12
+ #############################################################################
13
+ def test_parent_has_many_version
14
+ assert_equal page_versions(:welcome_1, :welcome_2), pages(:welcome).versions
15
+ end
16
+
17
+ def test_version_belongs_to_parent
18
+ assert_equal pages(:welcome), page_versions(:welcome_1).page
19
+ end
20
+
21
+ #############################################################################
22
+ # A T T R I B U T E S #
23
+ #############################################################################
24
+ def test_should_version_proper_attributes
25
+ assert_equal ['title', 'body', 'author_id'], Page.new.versioned_columns
26
+ end
27
+
28
+ def test_should_not_version_non_existing_column
29
+ assert !Page.new.versioned_columns.include?(:creator_id)
30
+ end
31
+
32
+ #############################################################################
33
+ # C R E A T E #
34
+ #############################################################################
35
+ def test_should_save_version_on_create
36
+ old_count = Page.count
37
+ old_version_count = Page::Version.count
38
+ page = Page.create :title=>'New', :body=>'body', :creator=>authors(:larry), :author=>authors(:larry)
39
+ assert_equal old_count + 1, Page.count
40
+ assert_equal old_version_count + 1, Page::Version.count
41
+ end
42
+
43
+ def test_wire_up_association_on_create
44
+ page = Page.create :title=>'New', :body=>'body', :creator=>authors(:larry), :author=>authors(:larry)
45
+ assert_equal Page::Version.find(:first, :order=>'id desc'), page.versions.first
46
+ end
47
+
48
+ def test_begin_version_numbering_at_one
49
+ page = Page.create :title=>'New', :body=>'body', :creator=>authors(:larry), :author=>authors(:larry)
50
+ assert_equal 1, page.version
51
+ assert_equal 1, page.versions.first.version
52
+ end
53
+
54
+ def test_assigns_attributes_on_create
55
+ page = Page.create :title=>'New', :body=>'body', :creator=>authors(:larry), :author=>authors(:larry)
56
+ version = page.versions.first
57
+ assert_equal 'New', version.title
58
+ assert_equal 'body', version.body
59
+ assert_equal authors(:larry).id, version.author_id
60
+ end
61
+
62
+ #############################################################################
63
+ # U P D A T E #
64
+ #############################################################################
65
+ def test_should_save_version_on_update
66
+ old_count = Page::Version.count
67
+ page = pages(:welcome)
68
+ page.update_attributes :title=>'New title', :body=>'new body', :author=>authors(:sara)
69
+ assert_equal old_count + 1, Page::Version.count
70
+ end
71
+
72
+ def test_should_increment_version_number
73
+ page = pages(:welcome)
74
+ old_count = page.version
75
+ page.update_attributes :title=>'New title', :body=>'new body', :author=>authors(:sara)
76
+ assert_equal old_count + 1, page.reload.version
77
+ end
78
+
79
+ def test_update_version_attributes
80
+ page = pages(:welcome)
81
+ page.update_attributes :title=>'Latest', :body=>'newest', :author=>authors(:peter)
82
+ version = page.reload.versions.latest
83
+ assert_equal 'Latest', version.title
84
+ assert_equal 'newest', version.body
85
+ assert_equal authors(:peter).id, version.author_id
86
+ end
87
+
88
+ #############################################################################
89
+ # S K I P V E R S I O N I N G #
90
+ #############################################################################
91
+ def test_do_not_create_version_if_nothing_changed
92
+ old_count = Page::Version.count
93
+ pages(:welcome).save
94
+ assert_equal old_count, Page::Version.count
95
+ end
96
+
97
+ def test_do_not_create_version_if_untracked_attribute_changed
98
+ old_count = Page::Version.count
99
+ pages(:welcome).update_attributes :author=>authors(:sara)
100
+ assert_equal old_count, Page::Version.count
101
+ end
102
+
103
+ def test_do_not_create_version_if_custom_version_check
104
+ old_count = Author::Version.count
105
+ authors(:larry).update_attributes :last_name=>'Lessig'
106
+ assert_equal old_count, Author::Version.count
107
+ end
108
+
109
+ def test_still_save_if_no_new_version_with_custom_version_check
110
+ authors(:larry).update_attributes :last_name=>'Lessig'
111
+ assert_equal 'Lessig', authors(:larry).reload.last_name
112
+ end
113
+
114
+ #############################################################################
115
+ # F I N D #
116
+ #############################################################################
117
+ def test_find_version_given_number
118
+ assert_equal page_versions(:welcome_1), pages(:welcome).find_version(1)
119
+ assert_equal page_versions(:welcome_2), pages(:welcome).find_version(2)
120
+ end
121
+
122
+ def test_find_latest_version
123
+ assert_equal page_versions(:welcome_2), pages(:welcome).versions.latest
124
+ end
125
+
126
+ def test_find_previous_version
127
+ assert_equal page_versions(:welcome_1), page_versions(:welcome_2).previous
128
+ end
129
+
130
+ def test_find_next_version
131
+ assert_equal page_versions(:welcome_2), page_versions(:welcome_1).next
132
+ end
133
+
134
+ #############################################################################
135
+ # B L O C K E X T E N S I O N #
136
+ #############################################################################
137
+ def test_should_take_a_block_containing_ar_extention
138
+ assert_equal authors(:larry), page_versions(:welcome_1).author
139
+ end
140
+ end
metadata ADDED
@@ -0,0 +1,74 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: revo-version_fu
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Jordan McKible
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-08-13 00:00:00 -07:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ 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.
17
+ email: ""
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files:
23
+ - README.rdoc
24
+ files:
25
+ - MIT-LICENSE
26
+ - README.rdoc
27
+ - RUNNING_UNIT_TESTS
28
+ - Rakefile
29
+ - VERSION
30
+ - lib/version_fu.rb
31
+ - lib/version_fu/version_fu.rb
32
+ - test/database.yml
33
+ - test/fixtures/author.rb
34
+ - test/fixtures/author_versions.yml
35
+ - test/fixtures/authors.yml
36
+ - test/fixtures/page.rb
37
+ - test/fixtures/page_versions.yml
38
+ - test/fixtures/pages.yml
39
+ - test/schema.rb
40
+ - test/test_helper.rb
41
+ - test/version_fu_test.rb
42
+ has_rdoc: false
43
+ homepage: ""
44
+ licenses:
45
+ post_install_message:
46
+ rdoc_options:
47
+ - --charset=UTF-8
48
+ require_paths:
49
+ - lib
50
+ required_ruby_version: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: "0"
55
+ version:
56
+ required_rubygems_version: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: "0"
61
+ version:
62
+ requirements: []
63
+
64
+ rubyforge_project:
65
+ rubygems_version: 1.3.5
66
+ signing_key:
67
+ specification_version: 3
68
+ summary: Gemified version of the version_fu plugin.
69
+ test_files:
70
+ - test/test_helper.rb
71
+ - test/version_fu_test.rb
72
+ - test/schema.rb
73
+ - test/fixtures/author.rb
74
+ - test/fixtures/page.rb