Browse files

trunkify; merge polymorphs

  • Loading branch information...
0 parents commit c8ebd13e20bd342e7e64acc91db45024779ffaf1 @evan committed Aug 3, 2007
Showing with 2,625 additions and 0 deletions.
  1. +184 −0 LICENSE
  2. +43 −0 Manifest
  3. +50 −0 README
  4. +59 −0 Rakefile
  6. +84 −0 generators/tagging/tagging_generator.rb
  7. 0 generators/tagging/templates/index.rhtml
  8. +23 −0 generators/tagging/templates/migration.rb
  9. +35 −0 generators/tagging/templates/tag.rb
  10. +10 −0 generators/tagging/templates/tag_test.rb
  11. +15 −0 generators/tagging/templates/tagging.rb
  12. +88 −0 generators/tagging/templates/tagging_extensions.rb
  13. +58 −0 generators/tagging/templates/tagging_test.rb
  14. +21 −0 generators/tagging/templates/taggings.yml
  15. +7 −0 generators/tagging/templates/tags.yml
  16. 0 generators/tagging/templates/tags_controller.rb
  17. +2 −0 init.rb
  18. +1 −0 install.rb
  19. +31 −0 lib/has_many_polymorphs.rb
  20. +152 −0 lib/has_many_polymorphs/association.rb
  21. +26 −0 lib/has_many_polymorphs/autoload.rb
  22. +47 −0 lib/has_many_polymorphs/base.rb
  23. +453 −0 lib/has_many_polymorphs/class_methods.rb
  24. +18 −0 lib/has_many_polymorphs/configuration.rb
  25. +72 −0 lib/has_many_polymorphs/debugging_tools.rb
  26. +30 −0 lib/has_many_polymorphs/dependencies.rb
  27. +25 −0 lib/has_many_polymorphs/rake_task_redefine_task.rb
  28. +41 −0 lib/has_many_polymorphs/reflection.rb
  29. +63 −0 lib/has_many_polymorphs/support_methods.rb
  30. +12 −0 test/fixtures/aquatic/fish.yml
  31. 0 test/fixtures/aquatic/little_whale_pupils.yml
  32. +5 −0 test/fixtures/aquatic/whales.yml
  33. +10 −0 test/fixtures/bow_wows.yml
  34. +18 −0 test/fixtures/cats.yml
  35. 0 test/fixtures/eaters_foodstuffs.yml
  36. +5 −0 test/fixtures/frogs.yml
  37. 0 test/fixtures/keep_your_enemies_close.yml
  38. +11 −0 test/fixtures/petfoods.yml
  39. +10 −0 test/fixtures/wild_boars.yml
  40. +4 −0 test/models/aquatic/fish.rb
  41. +7 −0 test/models/aquatic/pupils_whale.rb
  42. +13 −0 test/models/aquatic/whale.rb
  43. +26 −0 test/models/beautiful_fight_relationship.rb
  44. +9 −0 test/models/canine.rb
  45. +5 −0 test/models/cat.rb
  46. +18 −0 test/models/dog.rb
  47. +10 −0 test/models/eaters_foodstuff.rb
  48. +4 −0 test/models/frog.rb
  49. +3 −0 test/models/kitten.rb
  50. +38 −0 test/models/petfood.rb
  51. +2 −0 test/models/tabby.rb
  52. +3 −0 test/models/wild_boar.rb
  53. +9 −0 test/modules/extension_module.rb
  54. +9 −0 test/modules/other_extension_module.rb
  55. +72 −0 test/schema.rb
  56. +31 −0 test/test_helper.rb
  57. +641 −0 test/unit/polymorph_test.rb
@@ -0,0 +1,184 @@
+Academic Free License (AFL) v. 3.0
+This Academic Free License (the "License") applies to any original work
+of authorship (the "Original Work") whose owner (the "Licensor") has
+placed the following licensing notice adjacent to the copyright notice
+for the Original Work:
+Licensed under the Academic Free License version 3.0
+1) Grant of Copyright License. Licensor grants You a worldwide,
+royalty-free, non-exclusive, sublicensable license, for the duration of
+the copyright, to do the following:
+a) to reproduce the Original Work in copies, either alone or as part of
+a collective work;
+b) to translate, adapt, alter, transform, modify, or arrange the
+Original Work, thereby creating derivative works ("Derivative Works")
+based upon the Original Work;
+c) to distribute or communicate copies of the Original Work and
+Derivative Works to the public, under any license of your choice that
+does not contradict the terms and conditions, including Licensor's
+reserved rights and remedies, in this Academic Free License;
+d) to perform the Original Work publicly; and
+e) to display the Original Work publicly.
+2) Grant of Patent License. Licensor grants You a worldwide,
+royalty-free, non-exclusive, sublicensable license, under patent claims
+owned or controlled by the Licensor that are embodied in the Original
+Work as furnished by the Licensor, for the duration of the patents, to
+make, use, sell, offer for sale, have made, and import the Original Work
+and Derivative Works.
+3) Grant of Source Code License. The term "Source Code" means the
+preferred form of the Original Work for making modifications to it and
+all available documentation describing how to modify the Original Work.
+Licensor agrees to provide a machine-readable copy of the Source Code of
+the Original Work along with each copy of the Original Work that
+Licensor distributes. Licensor reserves the right to satisfy this
+obligation by placing a machine-readable copy of the Source Code in an
+information repository reasonably calculated to permit inexpensive and
+convenient access by You for as long as Licensor continues to distribute
+the Original Work.
+4) Exclusions From License Grant. Neither the names of Licensor, nor the
+names of any contributors to the Original Work, nor any of their
+trademarks or service marks, may be used to endorse or promote products
+derived from this Original Work without express prior permission of the
+Licensor. Except as expressly stated herein, nothing in this License
+grants any license to Licensor's trademarks, copyrights, patents, trade
+secrets or any other intellectual property. No patent license is granted
+to make, use, sell, offer for sale, have made, or import embodiments of
+any patent claims other than the licensed claims defined in Section 2.
+No license is granted to the trademarks of Licensor even if such marks
+are included in the Original Work. Nothing in this License shall be
+interpreted to prohibit Licensor from licensing under terms different
+from this License any Original Work that Licensor otherwise would have a
+right to license.
+5) External Deployment. The term "External Deployment" means the use,
+distribution, or communication of the Original Work or Derivative Works
+in any way such that the Original Work or Derivative Works may be used
+by anyone other than You, whether those works are distributed or
+communicated to those persons or made available as an application
+intended for use over a network. As an express condition for the grants
+of license hereunder, You must treat any External Deployment by You of
+the Original Work or a Derivative Work as a distribution under section
+6) Attribution Rights. You must retain, in the Source Code of any
+Derivative Works that You create, all copyright, patent, or trademark
+notices from the Source Code of the Original Work, as well as any
+notices of licensing and any descriptive text identified therein as an
+"Attribution Notice." You must cause the Source Code for any Derivative
+Works that You create to carry a prominent Attribution Notice reasonably
+calculated to inform recipients that You have modified the Original
+7) Warranty of Provenance and Disclaimer of Warranty. Licensor warrants
+that the copyright in and to the Original Work and the patent rights
+granted herein by Licensor are owned by the Licensor or are sublicensed
+to You under the terms of this License with the permission of the
+contributor(s) of those copyrights and patent rights. Except as
+expressly stated in the immediately preceding sentence, the Original
+Work is provided under this License on an "AS IS" BASIS and WITHOUT
+WARRANTY, either express or implied, including, without limitation, the
+warranties of non-infringement, merchantability or fitness for a
+WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential
+part of this License. No license to the Original Work is granted by this
+License except under this disclaimer.
+8) Limitation of Liability. Under no circumstances and under no legal
+theory, whether in tort (including negligence), contract, or otherwise,
+shall the Licensor be liable to anyone for any indirect, special,
+incidental, or consequential damages of any character arising as a
+result of this License or the use of the Original Work including,
+without limitation, damages for loss of goodwill, work stoppage,
+computer failure or malfunction, or any and all other commercial damages
+or losses. This limitation of liability shall not apply to the extent
+applicable law prohibits such limitation.
+9) Acceptance and Termination. If, at any time, You expressly assented
+to this License, that assent indicates your clear and irrevocable
+acceptance of this License and all of its terms and conditions. If You
+distribute or communicate copies of the Original Work or a Derivative
+Work, You must make a reasonable effort under the circumstances to
+obtain the express assent of recipients to the terms of this License.
+This License conditions your rights to undertake the activities listed
+in Section 1, including your right to create Derivative Works based upon
+the Original Work, and doing so without honoring these terms and
+conditions is prohibited by copyright law and international treaty.
+Nothing in this License is intended to affect copyright exceptions and
+limitations (including "fair use" or "fair dealing"). This License shall
+terminate immediately and You may no longer exercise any of the rights
+granted to You by this License upon your failure to honor the conditions
+in Section 1(c).
+10) Termination for Patent Action. This License shall terminate
+automatically and You may no longer exercise any of the rights granted
+to You by this License as of the date You commence an action, including
+a cross-claim or counterclaim, against Licensor or any licensee alleging
+that the Original Work infringes a patent. This termination provision
+shall not apply for an action alleging patent infringement by
+combinations of the Original Work with other software or hardware.
+11) Jurisdiction, Venue and Governing Law. Any action or suit relating
+to this License may be brought only in the courts of a jurisdiction
+wherein the Licensor resides or in which Licensor conducts its primary
+business, and under the laws of that jurisdiction excluding its
+conflict-of-law provisions. The application of the United Nations
+Convention on Contracts for the International Sale of Goods is expressly
+excluded. Any use of the Original Work outside the scope of this License
+or after its termination shall be subject to the requirements and
+penalties of copyright or patent law in the appropriate jurisdiction.
+This section shall survive the termination of this License.
+12) Attorneys' Fees. In any action to enforce the terms of this License
+or seeking damages relating thereto, the prevailing party shall be
+entitled to recover its costs and expenses, including, without
+limitation, reasonable attorneys' fees and costs incurred in connection
+with such action, including any appeal of such action. This section
+shall survive the termination of this License.
+13) Miscellaneous. If any provision of this License is held to be
+unenforceable, such provision shall be reformed only to the extent
+necessary to make it enforceable.
+14) Definition of "You" in This License. "You" throughout this License,
+whether in upper or lower case, means an individual or a legal entity
+exercising rights under, and complying with all of the terms of, this
+License. For legal entities, "You" includes any entity that controls, is
+controlled by, or is under common control with you. For purposes of this
+definition, "control" means (i) the power, direct or indirect, to cause
+the direction or management of such entity, whether by contract or
+otherwise, or (ii) ownership of fifty percent (50%) or more of the
+outstanding shares, or (iii) beneficial ownership of such entity.
+15) Right to Use. You may use the Original Work in all ways not
+otherwise restricted or conditioned by this License or by law, and
+Licensor promises not to interfere with or be responsible for such uses
+by You.
+16) Modification of This License. This License is Copyright (c) 2005
+Lawrence Rosen. Permission is granted to copy, distribute, or
+communicate this License without modification. Nothing in this License
+permits You to modify this License as applied to the Original Work or to
+Derivative Works. However, You may modify the text of this License and
+copy, distribute or communicate your modified version (the "Modified
+License") and apply it to other original works of authorship subject to
+the following conditions: (i) You may not indicate in any way that your
+Modified License is the "Academic Free License" or "AFL" and you may not
+use those names in the name of your Modified License; (ii) You must
+replace the notice specified in the first paragraph above with the
+notice "Licensed under <insert your license name here>" or with a notice
+of your own that is not confusingly similar to the notice in this
+License; and (iii) You may not claim that your original works are open
+source software unless your Modified License has been approved by Open
+Source Initiative (OSI) and You comply with its license review and
+certification process.
@@ -0,0 +1,43 @@
@@ -0,0 +1,50 @@
+Self-referential, polymorphic has_many :through helper for ActiveRecord.
+Copyright 2007 Cloudburst, LLC (see the LICENSE file)
+27.5. various bugfixes; postgresql problems remain on edge
+27.3. use new :source and :source_type options in 1.2.3 (David Lemstra); fix pluralization bug; add some tests; experimental tagging generator
+27.2. deprecate has_many_polymorphs_cache_classes= option, because it doesn't really work. use config.cache_classes= instead to cache all reloadable items
+27.1. dispatcher.to_prepare didn't fire in the console; now using a config.after_initialize wrapper instead
+27. dependency injection framework elimates having to care about load order
+26. make the logger act sane for the gem version
+25.2. allow :skip_duplicates on double relationships
+25.1. renamed :ignore_duplicates to :skip_duplicates to better express its non-passive behavior, made sure not to load target set on push unless necessary
+25. activerecord compatibility branch becomes trunk. extra options now supported for double polymorphism; conditions nulled-out and propogated to child relationships; more tests; new :ignore_duplicates option on macro can be set to false if you want << to try to push duplicate associations
+24.1. code split into multiple files. tests added for pluralization check. rails 1.1.6 no longer officially supported.
+24. unlimited mixed class association extensions for both single and double targets and joins
+23. gem version
+22. api change; prefix on methods is now singular when using :rename_individual_collections
+21. add configuration option to cache polymorphic classes in development mode
+20. collection methods (push, delete, clear) now on individual collections
+19.2. disjoint collection sides bugfix, don't raise on new records
+19.1. double classify bugfix
+19. large changes to properly support double polymorphism
+18.2. bugfix to make sure the type gets checked on doubly polymorphic parents
+18.1. bugfix for sqlite3 child attribute retrieval
+18. bugfix for instantiating attributes of namespaced models
+17.1. bugfix for double polymorphic relationships
+17. double polymorphic relationships (includes new API method)
+16. namespaced model support
+15. bugfix for postgres and mysql under 1.1.6; refactored tests (thanks hildofur); properly handles legacy table names set with set_table_name()
+14. sti support added (use the child class names, not the base class)
+13. bug regarding table names with underscores in SQL query fixed
+12.1. license change
+12. file_column bug fixed
+11. tests written; after_find and after_initialize now correctly called
+10. bugfix
+9. rollback
+8. SQL performance enhancements added
+7. rewrote singletons as full-fledged proxy class so that marshalling works (e.g. in the session)
+6. caching added
+5. fixed dependency reloading problem in development mode
+4. license change
+3. added :dependent support on the join table
+1-2. no changelog
@@ -0,0 +1,59 @@
+require 'rubygems'
+require 'rake'
+require 'lib/has_many_polymorphs/rake_task_redefine_task'
+NAME = "has_many_polymorphs"
+ require 'rake/clean'
+ gem 'echoe', '>= 1.1'
+ require 'echoe'
+ require 'fileutils'
+ AUTHOR = "Evan Weaver"
+ EMAIL = "evan at cloudbur dot st"
+ DESCRIPTION = "Self-referential, polymorphic has_many :through helper for ActiveRecord."
+ CHANGES = `cat README`[/^([\d\.]+\. .*)/, 1]
+ RUBYFORGE_NAME = "polymorphs"
+ GEM_NAME = "has_many_polymorphs"
+ RELEASE_TYPES = ["gem"]
+ REV = nil
+ VERS = `cat README`[/^([\d\.]+)\. /, 1]
+ CLEAN.include ['**/.*.sw?', '*.gem', '.config']
+ RDOC_OPTS = ['--quiet', '--title', "has_many_polymorphs documentation",
+ "--opname", "index.html",
+ "--line-numbers",
+ "--main", "README",
+ "--inline-source"]
+ include FileUtils
+ echoe =, VERS) do |p|
+ p.rubyforge_name = RUBYFORGE_NAME
+ = NAME
+ p.description = DESCRIPTION
+ p.changes = CHANGES
+ p.summary = DESCRIPTION
+ p.url = HOMEPATH
+ p.need_tar = false
+ p.need_tar_gz = true
+ p.test_globs = ["*_test.rb"]
+ p.clean_globs = CLEAN
+ end
+rescue LoadError => boom
+ puts "You are missing a dependency required for meta-operations on this gem."
+ puts "#{boom.to_s.capitalize}."
+ desc 'Run the default tasks'
+ task :default => :test
+desc 'Run the test suite.'
+Rake::Task.redefine_task("test") do
+ puts "Notice; tests must be run from within a functioning Rails environment."
+ system "ruby -Ibin:lib:test test/unit/polymorph_test.rb #{ENV['METHOD'] ? "--name=#{ENV['METHOD']}" : ""}"
@@ -0,0 +1,12 @@
+Thank you for installing has_many_polymorphs!
+There is an experimental tagging system generator in place.
+ ./script/generate tagging TaggableModel1 TaggableModel2 [..]
+You can use the flags --skip-migration and/or --self-referential.
+Tests will be generated, but will not work unless you have at
+least 2 fixture entries for each taggable model. Their ids must
+be 1 and 2.
Oops, something went wrong.

0 comments on commit c8ebd13

Please sign in to comment.