active_record-acts_as 1.0.8 → 2.0.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b9ec0528a63347a0575f88a79865139353ed16b2
4
- data.tar.gz: 03ff53a5a895ef19f2d740e85327f93afa76dafc
3
+ metadata.gz: e23d681d9272dad587e888164a0a1699cac86717
4
+ data.tar.gz: e2fca48672513bae073e702cfdd5631241f1b6d1
5
5
  SHA512:
6
- metadata.gz: d4a00877c147b27f50ecc2abaf15abe4578e2ee5cdf45b2c6c3b9acbae4e2bc3f78700bbb0da94e07ed36d685a707bd71033759e88a07b5added7b22c89d01bb
7
- data.tar.gz: cfd9cd5ba545e01f676f418c09b5cb161d83428c44869e8dd95f28f014c71474a93a469004dffb987c9460093603ff2a2673e90df9604aaaa61c6541c83b14a7
6
+ metadata.gz: 54e3c3e84139c8ac514e13366cb02d3411a1cd9becbe4bbed6b6aa9b3045151a03f8dde9a7c29d287d82972f6c52e4fe8ff7860c6d94cef21d4f09d8e15af295
7
+ data.tar.gz: 323da76a14e32627d7b52395a3244c87e813fa6df650df302983e0ca51ed815c81129cdf2e57ba5a47f3f7b09cd45bfce37c196c29dd0ba91f784b5762b93201
data/.gitignore CHANGED
@@ -21,4 +21,5 @@ tmp
21
21
  *.a
22
22
  mkmf.log
23
23
  .ruby-gemset
24
- .ruby-version
24
+ .ruby-version
25
+ gemfiles/*.gemfile.lock
data/.travis.yml CHANGED
@@ -1,8 +1,8 @@
1
1
  language: ruby
2
2
  sudo: false
3
3
  rvm:
4
- - 2.3.0
5
- - 2.2.3
6
- - 2.1.7
7
- - 2.0.0
8
- - 1.9.3
4
+ - 2.2.5
5
+ - 2.3.1
6
+ gemfile:
7
+ - gemfiles/rails_4.2.gemfile
8
+ - gemfiles/rails_5.0.gemfile
data/Appraisals ADDED
@@ -0,0 +1,7 @@
1
+ appraise 'rails-4.2' do
2
+ gem 'rails', '~> 4.2.0'
3
+ end
4
+
5
+ appraise 'rails-5.0' do
6
+ gem 'rails', '~> 5.0.0'
7
+ end
data/README.md CHANGED
@@ -21,7 +21,9 @@ a separate table for each product type, i.e. a `pens` table with `color` column.
21
21
 
22
22
  ## Requirements
23
23
 
24
- `AciveRecord ~> 4.1.2` or newest
24
+ * Ruby >= 2.2
25
+ * ActiveSupport >= 4.2
26
+ * ActiveRecord >= 4.2
25
27
 
26
28
  ## Installation
27
29
 
@@ -1,6 +1,6 @@
1
- # coding: utf-8
2
1
  lib = File.expand_path('../lib', __FILE__)
3
2
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+
4
4
  require 'active_record/acts_as/version'
5
5
 
6
6
  Gem::Specification.new do |spec|
@@ -18,13 +18,14 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ["lib"]
20
20
 
21
- spec.required_ruby_version = ">= 1.9"
21
+ spec.required_ruby_version = ">= 2.2"
22
22
 
23
23
  spec.add_development_dependency "sqlite3", "~> 1.3"
24
24
  spec.add_development_dependency "bundler", "~> 1.6"
25
25
  spec.add_development_dependency "rspec", "~> 3"
26
26
  spec.add_development_dependency "rake", "~> 10"
27
+ spec.add_development_dependency "appraisal", "~> 2.1"
27
28
 
28
- spec.add_dependency "activesupport", "~> 4"
29
- spec.add_dependency "activerecord", "~> 4", ">= 4.1.2"
29
+ spec.add_dependency "activesupport", ">= 4.2"
30
+ spec.add_dependency "activerecord", ">= 4.2"
30
31
  end
@@ -0,0 +1,8 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "coveralls", :require => false
6
+ gem "rails", "~> 4.2.0"
7
+
8
+ gemspec :path => "../"
@@ -0,0 +1,8 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "coveralls", :require => false
6
+ gem "rails", "~> 5.0.0"
7
+
8
+ gemspec :path => "../"
@@ -1,13 +1,15 @@
1
1
  module ActiveRecord
2
2
  module ActsAs
3
- module ClassMethods
4
- def self.included(module_)
5
- module_.alias_method_chain :_reflections, :acts_as
3
+ module ReflectionsWithActsAs
4
+ def _reflections
5
+ @_reflections_acts_as_cache ||=
6
+ super.reverse_merge(acting_as_model._reflections)
6
7
  end
8
+ end
7
9
 
8
- def _reflections_with_acts_as
9
- @_reflections_acts_as_cache ||=
10
- _reflections_without_acts_as.reverse_merge(acting_as_model._reflections)
10
+ module ClassMethods
11
+ def self.included(module_)
12
+ module_.prepend ReflectionsWithActsAs
11
13
  end
12
14
 
13
15
  def validators_on(*args)
@@ -16,7 +16,7 @@ module ActiveRecord
16
16
  def remove_actable(options = {})
17
17
  name = options.delete(:as) || :actable
18
18
  options[:polymorphic] = true
19
- @base.remove_reference(@table_name, name, options)
19
+ @base.remove_reference(@name, name, options)
20
20
  end
21
21
  end
22
22
  end
@@ -1,25 +1,30 @@
1
-
2
1
  module ActiveRecord
3
- module QueryMethods
4
- def where_with_acts_as(opts = :chain, *rest)
5
- if acting_as? && opts.is_a?(Hash)
6
- opts, acts_as_opts = opts.stringify_keys.partition { |k,v| attribute_method?(k) }
7
- opts, acts_as_opts = Hash[opts], Hash[acts_as_opts]
8
- opts[acting_as_model.table_name] = acts_as_opts unless acts_as_opts.empty?
2
+ module ActsAs
3
+ module QueryMethods
4
+ def where(opts = :chain, *rest)
5
+ if acting_as? && opts.is_a?(Hash)
6
+ opts = opts.merge(opts.delete(klass.table_name) || {})
7
+
8
+ opts, acts_as_opts = opts.stringify_keys.partition { |k,v| attribute_method?(k) }
9
+ opts, acts_as_opts = Hash[opts], Hash[acts_as_opts]
10
+ opts[acting_as_model.table_name] = acts_as_opts unless acts_as_opts.empty?
11
+ end
12
+
13
+ super
9
14
  end
10
- where_without_acts_as(opts, *rest)
11
15
  end
12
- alias_method_chain :where, :acts_as
13
- end
14
16
 
15
- class Relation
16
- def scope_for_create_with_acts_as
17
- @scope_for_create ||= if acting_as?
18
- where_values_hash.merge(where_values_hash(acting_as_model.table_name)).merge(create_with_value)
19
- else
20
- where_values_hash.merge(create_with_value)
17
+ module ScopeForCreate
18
+ def scope_for_create
19
+ @scope_for_create ||= if acting_as?
20
+ where_values_hash.merge(where_values_hash(acting_as_model.table_name)).merge(create_with_value)
21
+ else
22
+ where_values_hash.merge(create_with_value)
23
+ end
21
24
  end
22
25
  end
23
- alias_method_chain :scope_for_create, :acts_as
24
26
  end
27
+
28
+ Relation.send(:prepend, ActsAs::QueryMethods)
29
+ Relation.send(:prepend, ActsAs::ScopeForCreate)
25
30
  end
@@ -7,12 +7,22 @@ module ActiveRecord
7
7
  module ClassMethods
8
8
  def acts_as(name, scope = nil, options = {})
9
9
  options, scope = scope, nil if Hash === scope
10
+ association_method = options.delete(:association_method)
10
11
  options = {as: :actable, dependent: :destroy, validate: false, autosave: true}.merge options
11
12
 
12
13
  cattr_reader(:validates_actable) { options.delete(:validates_actable) == false ? false : true }
13
14
 
14
15
  reflections = has_one name, scope, options
15
- default_scope -> { includes(name) }
16
+ default_scope -> {
17
+ case association_method
18
+ when :eager_load
19
+ eager_load(name)
20
+ when :joins
21
+ joins(name)
22
+ else
23
+ includes(name)
24
+ end
25
+ }
16
26
  validate :actable_must_be_valid
17
27
  after_update :touch_actable
18
28
 
@@ -1,6 +1,6 @@
1
1
  module ActiveRecord
2
2
  module ActsAs
3
- VERSION = "1.0.8"
3
+ VERSION = "2.0.0"
4
4
  end
5
5
  end
6
6
 
data/spec/acts_as_spec.rb CHANGED
@@ -349,4 +349,54 @@ RSpec.describe "ActiveRecord::Base model with #acts_as called" do
349
349
  expect(subject.acting_as_model).to eq Inventory::ProductFeature
350
350
  end
351
351
  end
352
+
353
+ context 'different association_methods' do
354
+ before(:each) do
355
+ Object.send(:remove_const, :Pen)
356
+ end
357
+
358
+ it "should not include the selected attribute when associating using 'eager_load'" do
359
+ class Pen < ActiveRecord::Base
360
+ acts_as :product , {association_method: :eager_load}
361
+ store_accessor :settings, :option1
362
+ validates_presence_of :color
363
+ end
364
+ Pen.create pen_attributes
365
+
366
+ expect(Pen.select("'something' as thing").first['thing']).to be_nil
367
+ end
368
+
369
+ it "should include the selected attribute in the model when associating using 'includes'" do
370
+ class Pen < ActiveRecord::Base
371
+ acts_as :product , {association_method: :includes}
372
+ store_accessor :settings, :option1
373
+ validates_presence_of :color
374
+ end
375
+ Pen.create pen_attributes
376
+
377
+ expect(Pen.select("'something' as thing").first['thing']).to eq 'something'
378
+ end
379
+
380
+ it "should include the selected attribute in the model not specifying an association_method" do
381
+ class Pen < ActiveRecord::Base
382
+ acts_as :product
383
+ store_accessor :settings, :option1
384
+ validates_presence_of :color
385
+ end
386
+ Pen.create pen_attributes
387
+
388
+ expect(Pen.select("'something' as thing").first['thing']).to eq 'something'
389
+ end
390
+
391
+ it "should include a selected attribute from the parent when associating using 'joins'" do
392
+ class Pen < ActiveRecord::Base
393
+ acts_as :product, {association_method: :joins}
394
+ store_accessor :settings, :option1
395
+ validates_presence_of :color
396
+ end
397
+ Pen.create pen_attributes
398
+
399
+ expect(Pen.select("price as thing").first['thing']).to eq 0.8
400
+ end
401
+ end
352
402
  end
@@ -5,22 +5,77 @@ require 'active_record/acts_as'
5
5
  class Product < ActiveRecord::Base
6
6
  end
7
7
 
8
+ class RemoveActableFromProducts < ActiveRecord::Migration
9
+ def change
10
+ change_table(:products) do |t|
11
+ t.remove_actable
12
+ end
13
+ end
14
+ end
15
+
16
+ class RemoveProduceableFromProducts < ActiveRecord::Migration
17
+ def change
18
+ change_table(:products) do |t|
19
+ t.remove_actable(as: :produceable)
20
+ end
21
+ end
22
+ end
8
23
 
9
24
  RSpec.describe ".actable" do
10
25
  context "in .create_table block" do
11
26
  after { initialize_schema }
12
27
  context "with :as options" do
13
- it "creates plymorphic reference columns with given name" do
28
+ it "creates polymorphic reference columns with given name" do
14
29
  initialize_database { create_table(:products) { |t| t.actable(as: :produceable) } }
15
30
  expect(Product.column_names).to include('produceable_id', 'produceable_type')
16
31
  end
17
32
  end
18
33
 
19
34
  context "with no args" do
20
- it "creates plymorphic reference columns" do
35
+ it "creates polymorphic reference columns" do
21
36
  initialize_database { create_table(:products) { |t| t.actable } }
22
37
  expect(Product.column_names).to include('actable_id', 'actable_type')
23
38
  end
24
39
  end
25
40
  end
26
41
  end
42
+
43
+ RSpec.describe ".remove_actable" do
44
+ context "in .modify_table block" do
45
+ after { initialize_schema }
46
+
47
+ context "with :as options" do
48
+ before do
49
+ initialize_database do
50
+ create_table(:products) do |t|
51
+ t.string :name
52
+ t.actable(as: :produceable)
53
+ end
54
+ end
55
+ end
56
+ it "removes polymorphic reference columns with given name" do
57
+ mig = RemoveProduceableFromProducts.new
58
+ mig.exec_migration(ActiveRecord::Base.connection, :up)
59
+ Product.reset_column_information
60
+ expect(Product.column_names).not_to include('produceable_id', 'produceable_type')
61
+ end
62
+ end
63
+
64
+ context "with no args" do
65
+ before do
66
+ initialize_database do
67
+ create_table(:products) do |t|
68
+ t.string :name
69
+ t.actable
70
+ end
71
+ end
72
+ end
73
+ it "creates polymorphic reference columns" do
74
+ mig = RemoveActableFromProducts.new
75
+ mig.exec_migration(ActiveRecord::Base.connection, :up)
76
+ Product.reset_column_information
77
+ expect(Product.column_names).not_to include('actable_id', 'actable_type')
78
+ end
79
+ end
80
+ end
81
+ end
data/spec/models.rb CHANGED
@@ -80,7 +80,7 @@ def initialize_schema
80
80
  create_table :inventory_product_features do |t|
81
81
  t.string :name
82
82
  t.float :price
83
- t.actable
83
+ t.actable index: { name: 'index_inventory_product_features_on_actable' }
84
84
  end
85
85
  end
86
86
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_record-acts_as
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.8
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hassan Zamani
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-01-27 00:00:00.000000000 Z
11
+ date: 2016-09-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sqlite3
@@ -67,39 +67,47 @@ dependencies:
67
67
  - !ruby/object:Gem::Version
68
68
  version: '10'
69
69
  - !ruby/object:Gem::Dependency
70
- name: activesupport
70
+ name: appraisal
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '4'
76
- type: :runtime
75
+ version: '2.1'
76
+ type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '4'
82
+ version: '2.1'
83
83
  - !ruby/object:Gem::Dependency
84
- name: activerecord
84
+ name: activesupport
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - "~>"
88
- - !ruby/object:Gem::Version
89
- version: '4'
90
87
  - - ">="
91
88
  - !ruby/object:Gem::Version
92
- version: 4.1.2
89
+ version: '4.2'
93
90
  type: :runtime
94
91
  prerelease: false
95
92
  version_requirements: !ruby/object:Gem::Requirement
96
93
  requirements:
97
- - - "~>"
94
+ - - ">="
98
95
  - !ruby/object:Gem::Version
99
- version: '4'
96
+ version: '4.2'
97
+ - !ruby/object:Gem::Dependency
98
+ name: activerecord
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '4.2'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
100
108
  - - ">="
101
109
  - !ruby/object:Gem::Version
102
- version: 4.1.2
110
+ version: '4.2'
103
111
  description: Simulate multi-table inheritance for activerecord models using a plymorphic
104
112
  association
105
113
  email:
@@ -111,11 +119,14 @@ files:
111
119
  - ".gitignore"
112
120
  - ".rspec"
113
121
  - ".travis.yml"
122
+ - Appraisals
114
123
  - Gemfile
115
124
  - LICENSE.txt
116
125
  - README.md
117
126
  - Rakefile
118
127
  - active_record-acts_as.gemspec
128
+ - gemfiles/rails_4.2.gemfile
129
+ - gemfiles/rails_5.0.gemfile
119
130
  - lib/active_record/acts_as.rb
120
131
  - lib/active_record/acts_as/class_methods.rb
121
132
  - lib/active_record/acts_as/instance_methods.rb
@@ -144,7 +155,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
144
155
  requirements:
145
156
  - - ">="
146
157
  - !ruby/object:Gem::Version
147
- version: '1.9'
158
+ version: '2.2'
148
159
  required_rubygems_version: !ruby/object:Gem::Requirement
149
160
  requirements:
150
161
  - - ">="
@@ -152,7 +163,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
152
163
  version: '0'
153
164
  requirements: []
154
165
  rubyforge_project:
155
- rubygems_version: 2.5.1
166
+ rubygems_version: 2.6.6
156
167
  signing_key:
157
168
  specification_version: 4
158
169
  summary: Simulate multi-table inheritance for activerecord models
@@ -165,3 +176,4 @@ test_files:
165
176
  - spec/models.rb
166
177
  - spec/rspec_matchers_spec.rb
167
178
  - spec/spec_helper.rb
179
+ has_rdoc: