polyamorous 0.5.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.
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/Gemfile ADDED
@@ -0,0 +1,31 @@
1
+ source "http://rubygems.org"
2
+ gemspec
3
+
4
+ gem 'rake'
5
+
6
+ rails = ENV['RAILS'] || 'master'
7
+ arel = ENV['AREL'] || 'master'
8
+
9
+ arel_opts = case arel
10
+ when /\// # A path
11
+ {:path => arel}
12
+ when /^v/ # A tagged version
13
+ {:git => 'git://github.com/rails/arel.git', :tag => arel}
14
+ else
15
+ {:git => 'git://github.com/rails/arel.git', :branch => arel}
16
+ end
17
+
18
+ gem 'arel', arel_opts
19
+
20
+ case rails
21
+ when /\// # A path
22
+ gem 'activerecord', :path => "#{rails}/activerecord"
23
+ when /^v/ # A tagged version
24
+ git 'git://github.com/rails/rails.git', :tag => rails do
25
+ gem 'activerecord'
26
+ end
27
+ else
28
+ git 'git://github.com/rails/rails.git', :branch => rails do
29
+ gem 'activerecord'
30
+ end
31
+ end
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2011 Ernie Miller
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,5 @@
1
+ # Polyamorous
2
+
3
+ This is just a long-overdue extraction from MetaSearch 1.1.x, Ransack, and Squeel.
4
+
5
+ Move along. Nothing to see here.
@@ -0,0 +1,17 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new(:spec) do |rspec|
5
+ rspec.rspec_opts = ['--backtrace']
6
+ end
7
+
8
+ task :default => :spec
9
+
10
+ desc "Open an irb session with Ransack and the sample data used in specs"
11
+ task :console do
12
+ require 'irb'
13
+ require 'irb/completion'
14
+ require 'console'
15
+ ARGV.clear
16
+ IRB.start
17
+ end
@@ -0,0 +1,19 @@
1
+ require "polyamorous/version"
2
+
3
+ module Polyamorous
4
+ if defined?(::ActiveRecord::Associations::JoinDependency)
5
+ JoinDependency = ::ActiveRecord::Associations::JoinDependency
6
+ JoinAssociation = ::ActiveRecord::Associations::JoinDependency::JoinAssociation
7
+ else
8
+ JoinDependency = ::ActiveRecord::Associations::ClassMethods::JoinDependency
9
+ JoinAssociation = ::ActiveRecord::Associations::ClassMethods::JoinDependency::JoinAssociation
10
+ end
11
+ end
12
+
13
+ require 'active_record'
14
+ require 'polyamorous/join'
15
+ require 'polyamorous/join_association'
16
+ require 'polyamorous/join_dependency'
17
+
18
+ Polyamorous::JoinDependency.send(:include, Polyamorous::JoinDependencyExtensions)
19
+ Polyamorous::JoinAssociation.send(:include, Polyamorous::JoinAssociationExtensions)
@@ -0,0 +1,64 @@
1
+ module Polyamorous
2
+ class Join
3
+ attr_accessor :name
4
+ attr_reader :type, :klass
5
+
6
+ def initialize(name, type = Arel::InnerJoin, klass = nil)
7
+ @name = name
8
+ @type = convert_to_arel_join_type(type)
9
+ @klass = convert_to_class(klass) if klass
10
+ end
11
+
12
+ def klass=(klass)
13
+ @klass = convert_to_class(klass) if klass
14
+ end
15
+
16
+ def type=(type)
17
+ @type = convert_to_arel_join_type(type) if type
18
+ end
19
+
20
+ def hash
21
+ [@name, @type, @klass].hash
22
+ end
23
+
24
+ def eql?(other)
25
+ self.class == other.class &&
26
+ self.name == other.name &&
27
+ self.type == other.type &&
28
+ self.klass == other.klass
29
+ end
30
+
31
+ alias :== :eql?
32
+
33
+ private
34
+
35
+ def convert_to_arel_join_type(type)
36
+ case type
37
+ when 'inner', :inner
38
+ Arel::InnerJoin
39
+ when 'outer', :outer
40
+ Arel::OuterJoin
41
+ when Class
42
+ if [Arel::InnerJoin, Arel::OuterJoin].include? type
43
+ type
44
+ else
45
+ raise ArgumentError, "#{type} cannot be converted to an ARel join type"
46
+ end
47
+ else
48
+ raise ArgumentError, "#{type} cannot be converted to an ARel join type"
49
+ end
50
+ end
51
+
52
+ def convert_to_class(value)
53
+ case value
54
+ when String, Symbol
55
+ Kernel.const_get(value)
56
+ when Class
57
+ value
58
+ else
59
+ raise ArgumentError, "#{value} cannot be converted to a Class"
60
+ end
61
+ end
62
+
63
+ end
64
+ end
@@ -0,0 +1,72 @@
1
+ module Polyamorous
2
+ module JoinAssociationExtensions
3
+
4
+ def self.included(base)
5
+ base.class_eval do
6
+ alias_method_chain :initialize, :polymorphism
7
+ alias_method :equality_without_polymorphism, :==
8
+ alias_method :==, :equality_with_polymorphism
9
+
10
+ if ActiveRecord::VERSION::STRING =~ /^3\.0\./
11
+ alias_method_chain :association_join, :polymorphism
12
+ else
13
+ alias_method_chain :build_constraint, :polymorphism
14
+ end
15
+ end
16
+ end
17
+
18
+ def initialize_with_polymorphism(reflection, join_dependency, parent = nil, polymorphic_class = nil)
19
+ if polymorphic_class && ::ActiveRecord::Base > polymorphic_class
20
+ swapping_reflection_klass(reflection, polymorphic_class) do |reflection|
21
+ initialize_without_polymorphism(reflection, join_dependency, parent)
22
+ end
23
+ else
24
+ initialize_without_polymorphism(reflection, join_dependency, parent)
25
+ end
26
+ end
27
+
28
+ def swapping_reflection_klass(reflection, klass)
29
+ reflection = reflection.clone
30
+ original_polymorphic = reflection.options.delete(:polymorphic)
31
+ reflection.instance_variable_set(:@klass, klass)
32
+ yield reflection
33
+ ensure
34
+ reflection.options[:polymorphic] = original_polymorphic
35
+ end
36
+
37
+ def equality_with_polymorphism(other)
38
+ equality_without_polymorphism(other) && active_record == other.active_record
39
+ end
40
+
41
+ def build_constraint_with_polymorphism(reflection, table, key, foreign_table, foreign_key)
42
+ if reflection.options[:polymorphic]
43
+ build_constraint_without_polymorphism(reflection, table, key, foreign_table, foreign_key).and(
44
+ foreign_table[reflection.foreign_type].eq(reflection.klass.name)
45
+ )
46
+ else
47
+ build_constraint_without_polymorphism(reflection, table, key, foreign_table, foreign_key)
48
+ end
49
+ end
50
+
51
+ def association_join_with_polymorphism
52
+ return @join if @Join
53
+
54
+ @join = association_join_without_polymorphism
55
+
56
+ if reflection.macro == :belongs_to && reflection.options[:polymorphic]
57
+ aliased_table = Arel::Table.new(table_name, :as => @aliased_table_name,
58
+ :engine => arel_engine,
59
+ :columns => klass.columns)
60
+
61
+ parent_table = Arel::Table.new(parent.table_name, :as => parent.aliased_table_name,
62
+ :engine => arel_engine,
63
+ :columns => parent.active_record.columns)
64
+
65
+ @join << parent_table[reflection.options[:foreign_type]].eq(reflection.klass.name)
66
+ end
67
+
68
+ @join
69
+ end
70
+
71
+ end
72
+ end
@@ -0,0 +1,75 @@
1
+ module Polyamorous
2
+ module JoinDependencyExtensions
3
+
4
+ def self.included(base)
5
+ base.class_eval do
6
+ alias_method_chain :build, :polymorphism
7
+ alias_method_chain :graft, :polymorphism
8
+ end
9
+ end
10
+
11
+ def graft_with_polymorphism(*associations)
12
+ associations.each do |association|
13
+ unless join_associations.detect {|a| association == a}
14
+ if association.reflection.options[:polymorphic]
15
+ build(Join.new(association.reflection.name, association.join_type, association.reflection.klass),
16
+ association.find_parent_in(self) || join_base, association.join_type)
17
+ else
18
+ build(association.reflection.name, association.find_parent_in(self) || join_base, association.join_type)
19
+ end
20
+ end
21
+ end
22
+ self
23
+ end
24
+
25
+ if ActiveRecord::VERSION::STRING =~ /^3\.0\./
26
+ def _join_parts
27
+ @joins
28
+ end
29
+ else
30
+ def _join_parts
31
+ @join_parts
32
+ end
33
+ end
34
+
35
+ def build_with_polymorphism(associations, parent = nil, join_type = Arel::InnerJoin)
36
+ case associations
37
+ when Join
38
+ parent ||= _join_parts.last
39
+ reflection = parent.reflections[associations.name] or
40
+ raise ::ActiveRecord::ConfigurationError, "Association named '#{ associations.name }' was not found; perhaps you misspelled it?"
41
+
42
+ unless join_association = find_join_association_respecting_polymorphism(reflection, parent, associations.klass)
43
+ @reflections << reflection
44
+ join_association = build_join_association_respecting_polymorphism(reflection, parent, associations.klass)
45
+ join_association.join_type = associations.type
46
+ _join_parts << join_association
47
+ cache_joined_association(join_association)
48
+ end
49
+
50
+ join_association
51
+ else
52
+ build_without_polymorphism(associations, parent, join_type)
53
+ end
54
+ end
55
+
56
+ def find_join_association_respecting_polymorphism(reflection, parent, klass)
57
+ if association = find_join_association(reflection, parent)
58
+ unless reflection.options[:polymorphic]
59
+ association
60
+ else
61
+ association if association.active_record == klass
62
+ end
63
+ end
64
+ end
65
+
66
+ def build_join_association_respecting_polymorphism(reflection, parent, klass)
67
+ if reflection.options[:polymorphic] && klass
68
+ JoinAssociation.new(reflection, self, parent, klass)
69
+ else
70
+ JoinAssociation.new(reflection, self, parent)
71
+ end
72
+ end
73
+
74
+ end
75
+ end
@@ -0,0 +1,3 @@
1
+ module Polyamorous
2
+ VERSION = "0.5.0"
3
+ end
@@ -0,0 +1,36 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "polyamorous/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "polyamorous"
7
+ s.version = Polyamorous::VERSION
8
+ s.authors = ["Ernie Miller"]
9
+ s.email = ["ernie@metautonomo.us"]
10
+ s.homepage = "http://github.com/ernie/polyamorous"
11
+ s.summary = %q{
12
+ Loves/is loved by polymorphic belongs_to associations, Ransack, Squeel, MetaSearch...
13
+ }
14
+ s.description = %q{
15
+ This is just an extraction from Ransack/Squeel. You probably don't want to use this
16
+ directly. It extends ActiveRecord's associations to support polymorphic belongs_to
17
+ associations.
18
+ }
19
+
20
+ s.rubyforge_project = "polyamorous"
21
+
22
+ s.add_dependency 'activerecord', '~> 3.0'
23
+ s.add_development_dependency 'rspec', '~> 2.6.0'
24
+ s.add_development_dependency 'machinist', '~> 1.0.6'
25
+ s.add_development_dependency 'faker', '~> 0.9.5'
26
+ s.add_development_dependency 'sqlite3', '~> 1.3.3'
27
+
28
+ s.files = `git ls-files`.split("\n")
29
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
30
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
31
+ s.require_paths = ["lib"]
32
+
33
+ # specify any dependencies here; for example:
34
+ # s.add_development_dependency "rspec"
35
+ # s.add_runtime_dependency "rest-client"
36
+ end
@@ -0,0 +1,5 @@
1
+ Article.blueprint do
2
+ person
3
+ title
4
+ body
5
+ end
@@ -0,0 +1,5 @@
1
+ Comment.blueprint do
2
+ article
3
+ person
4
+ body
5
+ end
@@ -0,0 +1,3 @@
1
+ Note.blueprint do
2
+ note
3
+ end
@@ -0,0 +1,4 @@
1
+ Person.blueprint do
2
+ name
3
+ salary
4
+ end
@@ -0,0 +1,3 @@
1
+ Tag.blueprint do
2
+ name { Sham.tag_name }
3
+ end
@@ -0,0 +1,11 @@
1
+ module PolyamorousHelper
2
+
3
+ def new_join_dependency(klass, associations = {})
4
+ Polyamorous::JoinDependency.new klass, associations, []
5
+ end
6
+
7
+ def new_join(name, type = Arel::InnerJoin, klass = nil)
8
+ Polyamorous::Join.new name, type, klass
9
+ end
10
+
11
+ end
@@ -0,0 +1,6 @@
1
+ require 'spec_helper'
2
+
3
+ module Polyamorous
4
+ describe JoinAssociation do
5
+ end
6
+ end
@@ -0,0 +1,52 @@
1
+ require 'spec_helper'
2
+
3
+ module Polyamorous
4
+ describe JoinDependency do
5
+
6
+ context 'with symbol joins' do
7
+ subject { new_join_dependency Person, :articles => :comments }
8
+
9
+ specify { subject.join_associations.should have(2).associations }
10
+ specify { subject.join_associations.should be_all { |a| a.join_type == Arel::InnerJoin } }
11
+ end
12
+
13
+ context 'with has_many :through association' do
14
+ subject { new_join_dependency Person, :authored_article_comments }
15
+
16
+ specify { subject.join_associations.should have(1).association }
17
+ specify { subject.join_associations.first.table_name.should eq 'comments' }
18
+ end
19
+
20
+ context 'with outer join' do
21
+ subject { new_join_dependency Person, new_join(:articles, :outer) }
22
+
23
+ specify { subject.join_associations.should have(1).association }
24
+ specify { subject.join_associations.should be_all { |a| a.join_type == Arel::OuterJoin } }
25
+ end
26
+
27
+ context 'with nested outer joins' do
28
+ subject { new_join_dependency Person, new_join(:articles, :outer) => new_join(:comments, :outer) }
29
+
30
+ specify { subject.join_associations.should have(2).associations }
31
+ specify { subject.join_associations.should be_all { |a| a.join_type == Arel::OuterJoin } }
32
+ end
33
+
34
+ context 'with polymorphic belongs_to join' do
35
+ subject { new_join_dependency Note, new_join(:notable, :inner, Person) }
36
+
37
+ specify { subject.join_associations.should have(1).association }
38
+ specify { subject.join_associations.should be_all { |a| a.join_type == Arel::InnerJoin } }
39
+ specify { subject.join_associations.first.table_name.should eq 'people' }
40
+ end
41
+
42
+ context 'with polymorphic belongs_to join and nested symbol join' do
43
+ subject { new_join_dependency Note, new_join(:notable, :inner, Person) => :comments }
44
+
45
+ specify { subject.join_associations.should have(2).association }
46
+ specify { subject.join_associations.should be_all { |a| a.join_type == Arel::InnerJoin } }
47
+ specify { subject.join_associations.first.table_name.should eq 'people' }
48
+ specify { subject.join_associations[1].table_name.should eq 'comments' }
49
+ end
50
+
51
+ end
52
+ end
@@ -0,0 +1,6 @@
1
+ require 'spec_helper'
2
+
3
+ module Polyamorous
4
+ describe Join do
5
+ end
6
+ end
@@ -0,0 +1,34 @@
1
+ require 'machinist/active_record'
2
+ require 'sham'
3
+ require 'faker'
4
+ require 'polyamorous'
5
+
6
+ Time.zone = 'Eastern Time (US & Canada)'
7
+
8
+ Dir[File.expand_path('../{helpers,support,blueprints}/*.rb', __FILE__)].each do |f|
9
+ require f
10
+ end
11
+
12
+ Sham.define do
13
+ name { Faker::Name.name }
14
+ title { Faker::Lorem.sentence }
15
+ body { Faker::Lorem.paragraph }
16
+ salary {|index| 30000 + (index * 1000)}
17
+ tag_name { Faker::Lorem.words(3).join(' ') }
18
+ note { Faker::Lorem.words(7).join(' ') }
19
+ end
20
+
21
+ RSpec.configure do |config|
22
+ config.before(:suite) { Schema.create }
23
+ config.before(:all) { Sham.reset(:before_all) }
24
+ config.before(:each) { Sham.reset(:before_each) }
25
+
26
+ config.include PolyamorousHelper
27
+ end
28
+
29
+ RSpec::Matchers.define :be_like do |expected|
30
+ match do |actual|
31
+ actual.gsub(/^\s+|\s+$/, '').gsub(/\s+/, ' ').strip ==
32
+ expected.gsub(/^\s+|\s+$/, '').gsub(/\s+/, ' ').strip
33
+ end
34
+ end
@@ -0,0 +1,103 @@
1
+ require 'active_record'
2
+
3
+ ActiveRecord::Base.establish_connection(
4
+ :adapter => 'sqlite3',
5
+ :database => ':memory:'
6
+ )
7
+
8
+ class Person < ActiveRecord::Base
9
+ belongs_to :parent, :class_name => 'Person', :foreign_key => :parent_id
10
+ has_many :children, :class_name => 'Person', :foreign_key => :parent_id
11
+ has_many :articles
12
+ has_many :comments
13
+ has_many :authored_article_comments, :through => :articles,
14
+ :foreign_key => :person_id, :source => :comments
15
+ has_many :notes, :as => :notable
16
+ end
17
+
18
+ class Article < ActiveRecord::Base
19
+ belongs_to :person
20
+ has_many :comments
21
+ has_and_belongs_to_many :tags
22
+ has_many :notes, :as => :notable
23
+ end
24
+
25
+ class Comment < ActiveRecord::Base
26
+ belongs_to :article
27
+ belongs_to :person
28
+ end
29
+
30
+ class Tag < ActiveRecord::Base
31
+ has_and_belongs_to_many :articles
32
+ end
33
+
34
+ class Note < ActiveRecord::Base
35
+ belongs_to :notable, :polymorphic => true
36
+ end
37
+
38
+ module Schema
39
+ def self.create
40
+ ActiveRecord::Base.silence do
41
+ ActiveRecord::Migration.verbose = false
42
+
43
+ ActiveRecord::Schema.define do
44
+ create_table :people, :force => true do |t|
45
+ t.integer :parent_id
46
+ t.string :name
47
+ t.integer :salary
48
+ t.boolean :awesome, :default => false
49
+ t.timestamps
50
+ end
51
+
52
+ create_table :articles, :force => true do |t|
53
+ t.integer :person_id
54
+ t.string :title
55
+ t.text :body
56
+ end
57
+
58
+ create_table :comments, :force => true do |t|
59
+ t.integer :article_id
60
+ t.integer :person_id
61
+ t.text :body
62
+ end
63
+
64
+ create_table :tags, :force => true do |t|
65
+ t.string :name
66
+ end
67
+
68
+ create_table :articles_tags, :force => true, :id => false do |t|
69
+ t.integer :article_id
70
+ t.integer :tag_id
71
+ end
72
+
73
+ create_table :notes, :force => true do |t|
74
+ t.integer :notable_id
75
+ t.string :notable_type
76
+ t.string :note
77
+ end
78
+
79
+ end
80
+ end
81
+
82
+ 10.times do
83
+ person = Person.make
84
+ Note.make(:notable => person)
85
+ 3.times do
86
+ article = Article.make(:person => person)
87
+ 3.times do
88
+ article.tags = [Tag.make, Tag.make, Tag.make]
89
+ end
90
+ Note.make(:notable => article)
91
+ 10.times do
92
+ Comment.make(:article => article)
93
+ end
94
+ end
95
+ 2.times do
96
+ Comment.make(:person => person)
97
+ end
98
+ end
99
+
100
+ Comment.make(:body => 'First post!', :article => Article.make(:title => 'Hello, world!'))
101
+
102
+ end
103
+ end
metadata ADDED
@@ -0,0 +1,135 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: polyamorous
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.5.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Ernie Miller
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-09-03 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: activerecord
16
+ requirement: &70198431647040 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '3.0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *70198431647040
25
+ - !ruby/object:Gem::Dependency
26
+ name: rspec
27
+ requirement: &70198431646120 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ~>
31
+ - !ruby/object:Gem::Version
32
+ version: 2.6.0
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: *70198431646120
36
+ - !ruby/object:Gem::Dependency
37
+ name: machinist
38
+ requirement: &70198431645200 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ~>
42
+ - !ruby/object:Gem::Version
43
+ version: 1.0.6
44
+ type: :development
45
+ prerelease: false
46
+ version_requirements: *70198431645200
47
+ - !ruby/object:Gem::Dependency
48
+ name: faker
49
+ requirement: &70198431644480 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: 0.9.5
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: *70198431644480
58
+ - !ruby/object:Gem::Dependency
59
+ name: sqlite3
60
+ requirement: &70198431643680 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ~>
64
+ - !ruby/object:Gem::Version
65
+ version: 1.3.3
66
+ type: :development
67
+ prerelease: false
68
+ version_requirements: *70198431643680
69
+ description: ! "\n This is just an extraction from Ransack/Squeel. You probably
70
+ don't want to use this\n directly. It extends ActiveRecord's associations to
71
+ support polymorphic belongs_to\n associations.\n "
72
+ email:
73
+ - ernie@metautonomo.us
74
+ executables: []
75
+ extensions: []
76
+ extra_rdoc_files: []
77
+ files:
78
+ - .gitignore
79
+ - Gemfile
80
+ - LICENSE
81
+ - README.md
82
+ - Rakefile
83
+ - lib/polyamorous.rb
84
+ - lib/polyamorous/join.rb
85
+ - lib/polyamorous/join_association.rb
86
+ - lib/polyamorous/join_dependency.rb
87
+ - lib/polyamorous/version.rb
88
+ - polyamorous.gemspec
89
+ - spec/blueprints/articles.rb
90
+ - spec/blueprints/comments.rb
91
+ - spec/blueprints/notes.rb
92
+ - spec/blueprints/people.rb
93
+ - spec/blueprints/tags.rb
94
+ - spec/helpers/polyamorous_helper.rb
95
+ - spec/polyamorous/join_association_spec.rb
96
+ - spec/polyamorous/join_dependency_spec.rb
97
+ - spec/polyamorous/join_spec.rb
98
+ - spec/spec_helper.rb
99
+ - spec/support/schema.rb
100
+ homepage: http://github.com/ernie/polyamorous
101
+ licenses: []
102
+ post_install_message:
103
+ rdoc_options: []
104
+ require_paths:
105
+ - lib
106
+ required_ruby_version: !ruby/object:Gem::Requirement
107
+ none: false
108
+ requirements:
109
+ - - ! '>='
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
112
+ required_rubygems_version: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ! '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ requirements: []
119
+ rubyforge_project: polyamorous
120
+ rubygems_version: 1.8.10
121
+ signing_key:
122
+ specification_version: 3
123
+ summary: Loves/is loved by polymorphic belongs_to associations, Ransack, Squeel, MetaSearch...
124
+ test_files:
125
+ - spec/blueprints/articles.rb
126
+ - spec/blueprints/comments.rb
127
+ - spec/blueprints/notes.rb
128
+ - spec/blueprints/people.rb
129
+ - spec/blueprints/tags.rb
130
+ - spec/helpers/polyamorous_helper.rb
131
+ - spec/polyamorous/join_association_spec.rb
132
+ - spec/polyamorous/join_dependency_spec.rb
133
+ - spec/polyamorous/join_spec.rb
134
+ - spec/spec_helper.rb
135
+ - spec/support/schema.rb