active_record-acts_as 1.0.8 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
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: