polymorphic_identity 0.0.5 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,29 +1,29 @@
1
- *SVN*
1
+ == master
2
2
 
3
- *0.0.5* (June 22nd, 2008)
3
+ == 0.1.0 / 2008-12-14
4
+
5
+ * Remove the PluginAWeek namespace
6
+
7
+ == 0.0.5 / 2008-06-22
4
8
 
5
9
  * Remove log files from gems
6
10
 
7
- *0.0.4* (May 5th, 2008)
11
+ == 0.0.4 / 2008-05-05
8
12
 
9
13
  * Updated documentation
10
14
 
11
- *0.0.3* (September 26th, 2007)
15
+ == 0.0.3 / 2007-09-26
12
16
 
13
17
  * Move test fixtures out of the test application root directory
14
-
15
18
  * Remove gem dependency on activerecord
16
19
 
17
- *0.0.2* (August 5th, 2007)
20
+ == 0.0.2 / 2007-08-05
18
21
 
19
22
  * Add api documentation
20
-
21
23
  * Fix Rakefile syntax errors
22
-
23
24
  * Refactor tests
24
-
25
25
  * Use the plugin_test_helper plugin for helping create a Rails environment
26
26
 
27
- *0.0.1* (February 12th, 2007)
27
+ == 0.0.1 / 2007-02-12
28
28
 
29
29
  * Initial release
File without changes
@@ -5,21 +5,21 @@ based on the class names of those associations.
5
5
 
6
6
  == Resources
7
7
 
8
- Wiki
9
-
10
- * http://wiki.pluginaweek.org/Polymorphic_Identity
11
-
12
8
  API
13
9
 
14
10
  * http://api.pluginaweek.org/polymorphic_identity
15
11
 
12
+ Bugs
13
+
14
+ * http://pluginaweek.lighthouseapp.com/projects/13285-polymorphic_identity
15
+
16
16
  Development
17
17
 
18
- * http://dev.pluginaweek.org/browser/trunk/polymorphic_identity
18
+ * http://github.com/pluginaweek/polymorphic_identity
19
19
 
20
20
  Source
21
21
 
22
- * http://svn.pluginaweek.org/trunk/polymorphic_identity
22
+ * git://github.com/pluginaweek/polymorphic_identity.git
23
23
 
24
24
  == Description
25
25
 
@@ -32,10 +32,10 @@ polymorphic assocation looks like the following:
32
32
  :polymorphic => true
33
33
  end
34
34
 
35
- When getting the taggable record, you would normally have to called
36
- +tag.taggable+. However, if you know that the taggable record is just an
35
+ When getting the taggable record, you would normally have to call
36
+ <tt>tag.taggable</tt>. However, if you know that the taggable record is just an
37
37
  instance of the Article model, then it would feel more comfortable if you could
38
- just called +tag.article+. polymoprhic_identity makes this possible by
38
+ just call <tt>tag.article</tt>. polymoprhic_identity makes this possible by
39
39
  dynamically checking the name of the polymorphic record's class and creating
40
40
  methods that allow you to access the polymorphic association based on that
41
41
  class name.
@@ -60,21 +60,16 @@ class name.
60
60
  :as => :commenter
61
61
  end
62
62
 
63
- >> c = Comment.find(1)
64
- => #<Tag:0xb784d32c @attributes={"id"=>"1", "commentable_type"=>"Article", "commentable_id"=>"1", "commenter_type"=>"User", "commenter_id"=>"1"}>
65
- >> c.commentable
66
- => #<Article:0xb779d5a8 @attributes={"id"=>"1"}>
67
- >> c.article
68
- => #<Article:0xb779d5a8 @attributes={"id"=>"1"}>
69
- >> c.commenter
70
- => #<User:0xb775d764 @attributes={"id"=>"1"}>
71
- >> c.user
72
- => #<User:0xb775d764 @attributes={"id"=>"1"}>
63
+ c = Comment.find(1) # => #<Tag id: 1, commentable_id: 1, commentable_type: "Article", commenter_id: 1, commenter_type: "User"}>
64
+ c.commentable # => #<Article id: 1>
65
+ c.article # => #<Article id: 1>
66
+ c.commenter # => #<User id: 1>
67
+ c.user # => #<User id: 1>
73
68
 
74
69
  == Testing
75
70
 
76
71
  Before you can run any tests, the following gem must be installed:
77
- * plugin_test_helper[http://wiki.pluginaweek.org/Plugin_test_helper]
72
+ * plugin_test_helper[http://github.com/pluginaweek/plugin_test_helper]
78
73
 
79
74
  To run against a specific version of Rails:
80
75
 
data/Rakefile CHANGED
@@ -3,46 +3,54 @@ require 'rake/rdoctask'
3
3
  require 'rake/gempackagetask'
4
4
  require 'rake/contrib/sshpublisher'
5
5
 
6
- PKG_NAME = 'polymorphic_identity'
7
- PKG_VERSION = '0.0.5'
8
- PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}"
9
- RUBY_FORGE_PROJECT = 'pluginaweek'
10
-
11
- desc 'Default: run unit tests.'
6
+ spec = Gem::Specification.new do |s|
7
+ s.name = 'polymorphic_identity'
8
+ s.version = '0.1.0'
9
+ s.platform = Gem::Platform::RUBY
10
+ s.summary = 'Dynamically generates aliases for polymorphic associations based on their class names'
11
+
12
+ s.files = FileList['{lib,test}/**/*'] + %w(CHANGELOG.rdoc init.rb LICENSE Rakefile README.rdoc) - FileList['test/app_root/{log,log/*,script,script/*}']
13
+ s.require_path = 'lib'
14
+ s.has_rdoc = true
15
+ s.test_files = Dir['test/**/*_test.rb']
16
+
17
+ s.author = 'Aaron Pfeifer'
18
+ s.email = 'aaron@pluginaweek.org'
19
+ s.homepage = 'http://www.pluginaweek.org'
20
+ s.rubyforge_project = 'pluginaweek'
21
+ end
22
+
23
+ desc 'Default: run all tests.'
12
24
  task :default => :test
13
25
 
14
- desc 'Test the polymorphic_identity plugin.'
26
+ desc "Test the #{spec.name} plugin."
15
27
  Rake::TestTask.new(:test) do |t|
16
28
  t.libs << 'lib'
17
- t.pattern = 'test/**/*_test.rb'
29
+ t.test_files = spec.test_files
18
30
  t.verbose = true
19
31
  end
20
32
 
21
- desc 'Generate documentation for the polymorphic_identity plugin.'
33
+ begin
34
+ require 'rcov/rcovtask'
35
+ namespace :test do
36
+ desc "Test the #{spec.name} plugin with Rcov."
37
+ Rcov::RcovTask.new(:rcov) do |t|
38
+ t.libs << 'lib'
39
+ t.test_files = spec.test_files
40
+ t.rcov_opts << '--exclude="^(?!lib/)"'
41
+ t.verbose = true
42
+ end
43
+ end
44
+ rescue LoadError
45
+ end
46
+
47
+ desc "Generate documentation for the #{spec.name} plugin."
22
48
  Rake::RDocTask.new(:rdoc) do |rdoc|
23
49
  rdoc.rdoc_dir = 'rdoc'
24
- rdoc.title = 'PolymorphicIdentity'
50
+ rdoc.title = spec.name
25
51
  rdoc.template = '../rdoc_template.rb'
26
52
  rdoc.options << '--line-numbers' << '--inline-source'
27
- rdoc.rdoc_files.include('README')
28
- rdoc.rdoc_files.include('lib/**/*.rb')
29
- end
30
-
31
- spec = Gem::Specification.new do |s|
32
- s.name = PKG_NAME
33
- s.version = PKG_VERSION
34
- s.platform = Gem::Platform::RUBY
35
- s.summary = 'Dynamically generates aliases for polymorphic associations based on their class names'
36
-
37
- s.files = FileList['{lib,test}/**/*'].to_a - FileList['test/app_root/log/*'].to_a + %w(CHANGELOG init.rb MIT-LICENSE Rakefile README)
38
- s.require_path = 'lib'
39
- s.autorequire = 'polymorphic_identity'
40
- s.has_rdoc = true
41
- s.test_files = Dir['test/**/*_test.rb']
42
-
43
- s.author = 'Aaron Pfeifer'
44
- s.email = 'aaron@pluginaweek.org'
45
- s.homepage = 'http://www.pluginaweek.org'
53
+ rdoc.rdoc_files.include('README.rdoc', 'CHANGELOG.rdoc', 'LICENSE', 'lib/**/*.rb')
46
54
  end
47
55
 
48
56
  Rake::GemPackageTask.new(spec) do |p|
@@ -51,14 +59,14 @@ Rake::GemPackageTask.new(spec) do |p|
51
59
  p.need_zip = true
52
60
  end
53
61
 
54
- desc 'Publish the beta gem'
62
+ desc 'Publish the beta gem.'
55
63
  task :pgem => [:package] do
56
- Rake::SshFilePublisher.new('aaron@pluginaweek.org', '/home/aaron/gems.pluginaweek.org/public/gems', 'pkg', "#{PKG_FILE_NAME}.gem").upload
64
+ Rake::SshFilePublisher.new('aaron@pluginaweek.org', '/home/aaron/gems.pluginaweek.org/public/gems', 'pkg', "#{spec.name}-#{spec.version}.gem").upload
57
65
  end
58
66
 
59
- desc 'Publish the API documentation'
67
+ desc 'Publish the API documentation.'
60
68
  task :pdoc => [:rdoc] do
61
- Rake::SshDirPublisher.new('aaron@pluginaweek.org', "/home/aaron/api.pluginaweek.org/public/#{PKG_NAME}", 'rdoc').upload
69
+ Rake::SshDirPublisher.new('aaron@pluginaweek.org', "/home/aaron/api.pluginaweek.org/public/#{spec.name}", 'rdoc').upload
62
70
  end
63
71
 
64
72
  desc 'Publish the API docs and gem'
@@ -71,10 +79,10 @@ task :release => [:gem, :package] do
71
79
  ruby_forge = RubyForge.new.configure
72
80
  ruby_forge.login
73
81
 
74
- %w( gem tgz zip ).each do |ext|
75
- file = "pkg/#{PKG_FILE_NAME}.#{ext}"
82
+ %w(gem tgz zip).each do |ext|
83
+ file = "pkg/#{spec.name}-#{spec.version}.#{ext}"
76
84
  puts "Releasing #{File.basename(file)}..."
77
85
 
78
- ruby_forge.add_release(RUBY_FORGE_PROJECT, PKG_NAME, PKG_VERSION, file)
86
+ ruby_forge.add_release(spec.rubyforge_project, spec.name, spec.version, file)
79
87
  end
80
88
  end
@@ -1,57 +1,52 @@
1
- module PluginAWeek
2
- # Adds dynamic attributes for polymorphic associations based on the name of
3
- # the class for the polymorphic record. For example,
4
- #
5
- # class Tag < ActiveRecord::Base
6
- # belongs_to :taggable, :polymorphic => true
7
- # end
8
- #
9
- # class Article < ActiveRecord::Base
10
- # has_many :tags, :as => :taggable
11
- # end
12
- #
13
- # >> t = Tag.find(1)
14
- # => #<Tag:0xb784d32c @attributes={"id"=>"1", "taggable_type"=>"Article", "taggable_id"=>"1"}>
15
- # >> t.taggable
16
- # => #<Article:0xb779d5a8 @attributes={"id"=>"1"}>
17
- # >> t.article
18
- # => #<Article:0xb779d5a8 @attributes={"id"=>"1"}>
19
- module PolymorphicIdentity
20
- def self.included(base) #:nodoc:
21
- base.class_eval do
22
- alias_method_chain :method_missing, :polymorphic_identity
23
- alias_method_chain :respond_to?, :polymorphic_identity
24
- end
25
- end
26
-
27
- def method_missing_with_polymorphic_identity(method_id, *args, &block) #:nodoc:
28
- if association_name = find_polymorphic_association_name(method_id)
29
- send(association_name, *args, &block)
30
- else
31
- method_missing_without_polymorphic_identity(method_id, *args, &block)
32
- end
1
+ # Adds dynamic attributes for polymorphic associations based on the name of
2
+ # the class for the polymorphic record. For example,
3
+ #
4
+ # class Tag < ActiveRecord::Base
5
+ # belongs_to :taggable, :polymorphic => true
6
+ # end
7
+ #
8
+ # class Article < ActiveRecord::Base
9
+ # has_many :tags, :as => :taggable
10
+ # end
11
+ #
12
+ # t = Tag.find(1) # => #<Tag id: 1, taggable_id: 1, taggable_type: "Article">
13
+ # t.taggable # => #<Article id: 1>
14
+ # t.article # => #<Article id: 1>
15
+ module PolymorphicIdentity
16
+ def self.included(base) #:nodoc:
17
+ base.class_eval do
18
+ alias_method_chain :method_missing, :polymorphic_identity
19
+ alias_method_chain :respond_to?, :polymorphic_identity
33
20
  end
34
-
35
- # True if a polymorphic association can be found whose foreign type is set
36
- # to the name of the method
37
- def respond_to_with_polymorphic_identity?(method, include_priv = false) #:nodoc:
38
- respond_to_without_polymorphic_identity?(method, include_priv) || !find_polymorphic_association_name(method).nil?
21
+ end
22
+
23
+ def method_missing_with_polymorphic_identity(method_id, *args, &block) #:nodoc:
24
+ if association_name = find_polymorphic_association_name(method_id)
25
+ send(association_name, *args, &block)
26
+ else
27
+ method_missing_without_polymorphic_identity(method_id, *args, &block)
39
28
  end
40
-
41
- private
42
- # Finds the name of the polymorphic association whose foreign type is set to
43
- # the value specified.
44
- def find_polymorphic_association_name(foreign_type_value)
45
- foreign_type_value = foreign_type_value.to_s.camelize
46
- reflection = self.class.reflections.values.find do |reflection|
47
- reflection.options[:polymorphic] && self[reflection.options[:foreign_type]] == foreign_type_value
48
- end
49
-
50
- reflection ? reflection.name : nil
51
- end
52
29
  end
30
+
31
+ # True if a polymorphic association can be found whose foreign type is set
32
+ # to the name of the method
33
+ def respond_to_with_polymorphic_identity?(method, include_priv = false) #:nodoc:
34
+ respond_to_without_polymorphic_identity?(method, include_priv) || !find_polymorphic_association_name(method).nil?
35
+ end
36
+
37
+ private
38
+ # Finds the name of the polymorphic association whose foreign type is set to
39
+ # the value specified.
40
+ def find_polymorphic_association_name(foreign_type_value)
41
+ foreign_type_value = foreign_type_value.to_s.camelize
42
+ reflection = self.class.reflections.values.find do |reflection|
43
+ reflection.options[:polymorphic] && self[reflection.options[:foreign_type]] == foreign_type_value
44
+ end
45
+
46
+ reflection ? reflection.name : nil
47
+ end
53
48
  end
54
49
 
55
50
  ActiveRecord::Base.class_eval do
56
- include PluginAWeek::PolymorphicIdentity
51
+ include PolymorphicIdentity
57
52
  end
data/test/factory.rb CHANGED
@@ -1,26 +1,36 @@
1
1
  module Factory
2
- # Build actions for the class
3
- def self.build(klass, &block)
4
- name = klass.to_s.underscore
5
- define_method("#{name}_attributes", block)
2
+ # Build actions for the model
3
+ def self.build(model, &block)
4
+ name = model.to_s.underscore
6
5
 
7
- module_eval <<-end_eval
8
- def valid_#{name}_attributes(attributes = {})
9
- #{name}_attributes(attributes)
10
- attributes
11
- end
12
-
13
- def new_#{name}(attributes = {})
14
- #{klass}.new(valid_#{name}_attributes(attributes))
15
- end
16
-
17
- def create_#{name}(*args)
18
- record = new_#{name}(*args)
19
- record.save!
20
- record.reload
21
- record
22
- end
23
- end_eval
6
+ define_method("#{name}_attributes", block)
7
+ define_method("valid_#{name}_attributes") {|*args| valid_attributes_for(model, *args)}
8
+ define_method("new_#{name}") {|*args| new_record(model, *args)}
9
+ define_method("create_#{name}") {|*args| create_record(model, *args)}
10
+ end
11
+
12
+ # Get valid attributes for the model
13
+ def valid_attributes_for(model, attributes = {})
14
+ name = model.to_s.underscore
15
+ send("#{name}_attributes", attributes)
16
+ attributes.stringify_keys!
17
+ attributes
18
+ end
19
+
20
+ # Build an unsaved record
21
+ def new_record(model, *args)
22
+ attributes = valid_attributes_for(model, *args)
23
+ record = model.new(attributes)
24
+ attributes.each {|attr, value| record.send("#{attr}=", value) if model.accessible_attributes && !model.accessible_attributes.include?(attr) || model.protected_attributes && model.protected_attributes.include?(attr)}
25
+ record
26
+ end
27
+
28
+ # Build and save/reload a record
29
+ def create_record(model, *args)
30
+ record = new_record(model, *args)
31
+ record.save!
32
+ record.reload
33
+ record
24
34
  end
25
35
 
26
36
  build Article do |attributes|
data/test/test_helper.rb CHANGED
@@ -8,6 +8,6 @@ ActiveRecord::Migrator.migrate("#{Rails.root}/db/migrate")
8
8
 
9
9
  # Mixin the factory helper
10
10
  require File.expand_path("#{File.dirname(__FILE__)}/factory")
11
- class Test::Unit::TestCase #:nodoc:
11
+ Test::Unit::TestCase.class_eval do
12
12
  include Factory
13
13
  end
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: polymorphic_identity
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Aaron Pfeifer
8
- autorequire: polymorphic_identity
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-06-22 00:00:00 -04:00
12
+ date: 2008-12-14 00:00:00 -05:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -23,31 +23,30 @@ extra_rdoc_files: []
23
23
 
24
24
  files:
25
25
  - lib/polymorphic_identity.rb
26
+ - test/factory.rb
27
+ - test/test_helper.rb
28
+ - test/unit
29
+ - test/unit/polymorphic_identity_test.rb
26
30
  - test/app_root
27
- - test/app_root/app
28
- - test/app_root/app/models
29
- - test/app_root/app/models/page.rb
30
- - test/app_root/app/models/author.rb
31
- - test/app_root/app/models/article.rb
32
- - test/app_root/app/models/comment.rb
33
- - test/app_root/app/models/user.rb
34
31
  - test/app_root/db
35
32
  - test/app_root/db/migrate
36
- - test/app_root/db/migrate/005_create_comments.rb
37
- - test/app_root/db/migrate/002_create_articles.rb
38
- - test/app_root/db/migrate/003_create_pages.rb
39
33
  - test/app_root/db/migrate/004_create_users.rb
34
+ - test/app_root/db/migrate/005_create_comments.rb
40
35
  - test/app_root/db/migrate/001_create_authors.rb
41
- - test/app_root/log
42
- - test/test_helper.rb
43
- - test/factory.rb
44
- - test/unit
45
- - test/unit/polymorphic_identity_test.rb
46
- - CHANGELOG
36
+ - test/app_root/db/migrate/003_create_pages.rb
37
+ - test/app_root/db/migrate/002_create_articles.rb
38
+ - test/app_root/app
39
+ - test/app_root/app/models
40
+ - test/app_root/app/models/article.rb
41
+ - test/app_root/app/models/author.rb
42
+ - test/app_root/app/models/user.rb
43
+ - test/app_root/app/models/comment.rb
44
+ - test/app_root/app/models/page.rb
45
+ - CHANGELOG.rdoc
47
46
  - init.rb
48
- - MIT-LICENSE
47
+ - LICENSE
49
48
  - Rakefile
50
- - README
49
+ - README.rdoc
51
50
  has_rdoc: true
52
51
  homepage: http://www.pluginaweek.org
53
52
  post_install_message:
@@ -69,8 +68,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
69
68
  version:
70
69
  requirements: []
71
70
 
72
- rubyforge_project:
73
- rubygems_version: 1.1.1
71
+ rubyforge_project: pluginaweek
72
+ rubygems_version: 1.2.0
74
73
  signing_key:
75
74
  specification_version: 2
76
75
  summary: Dynamically generates aliases for polymorphic associations based on their class names