superstore 2.0.1 → 2.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/superstore/associations/builder/association.rb +1 -1
- data/lib/superstore/associations/has_many.rb +1 -1
- data/lib/superstore/associations.rb +14 -44
- data/lib/superstore/attribute_methods/primary_key.rb +2 -1
- data/lib/superstore/attribute_methods.rb +17 -1
- data/lib/superstore/base.rb +9 -0
- data/lib/superstore/connection.rb +4 -0
- data/lib/superstore/core.rb +37 -14
- data/lib/superstore/model.rb +0 -8
- data/lib/superstore/persistence.rb +2 -1
- data/lib/superstore/scoping.rb +3 -0
- data/superstore.gemspec +1 -1
- data/test/test_helper.rb +1 -1
- data/test/unit/associations/belongs_to_test.rb +14 -79
- data/test/unit/associations/reflection_test.rb +9 -8
- data/test/unit/attribute_methods/typecasting_test.rb +3 -3
- data/test/unit/attribute_methods_test.rb +5 -0
- data/test/unit/base_test.rb +2 -2
- data/test/unit/caching_test.rb +1 -0
- data/test/unit/callbacks_test.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bcfb4894f1b5070e7d844c0e4c24e64d8616b6b2
|
4
|
+
data.tar.gz: 09a982cfedfcb5fc0998296fed5c4143530abec2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4385589c6b5e8904dfb4a38d0de81017d5d3c34cffb21e0ef36a8248616e76d1fe26a6ede7ef95b4b9b04a25301c1dd1ac053415c0da6a4a7adc22d251624fed
|
7
|
+
data.tar.gz: 0a3b380939669676eb9a9a6bc5e5440b806379efc5363f36c86857743547d8c24884f5db8c68bbc0834f734e938b326c380cb701fc0c4ed3e76e9132df5da7a1
|
@@ -14,7 +14,7 @@ module Superstore::Associations::Builder
|
|
14
14
|
define_reader
|
15
15
|
|
16
16
|
reflection = Superstore::Associations::Reflection.new(macro, name, model, options)
|
17
|
-
|
17
|
+
ActiveRecord::Reflection.add_reflection model, name, reflection
|
18
18
|
end
|
19
19
|
|
20
20
|
def mixin
|
@@ -2,11 +2,6 @@ module Superstore
|
|
2
2
|
module Associations
|
3
3
|
extend ActiveSupport::Concern
|
4
4
|
|
5
|
-
included do
|
6
|
-
class_attribute :association_reflections
|
7
|
-
self.association_reflections = {}
|
8
|
-
end
|
9
|
-
|
10
5
|
module ClassMethods
|
11
6
|
# === Options
|
12
7
|
# [:class_name]
|
@@ -19,54 +14,29 @@ module Superstore
|
|
19
14
|
# class Truck < Superstore::Base
|
20
15
|
# end
|
21
16
|
def belongs_to(name, options = {})
|
22
|
-
|
17
|
+
if options.delete(:superstore)
|
18
|
+
Superstore::Associations::Builder::BelongsTo.build(self, name, options)
|
19
|
+
else
|
20
|
+
super
|
21
|
+
end
|
23
22
|
end
|
24
23
|
|
25
24
|
def has_many(name, options = {})
|
26
|
-
|
25
|
+
if options.delete(:superstore)
|
26
|
+
Superstore::Associations::Builder::HasMany.build(self, name, options)
|
27
|
+
else
|
28
|
+
super
|
29
|
+
end
|
27
30
|
end
|
28
31
|
|
29
32
|
def has_one(name, options = {})
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
@generated_association_methods ||= begin
|
35
|
-
mod = const_set(:GeneratedAssociationMethods, Module.new)
|
36
|
-
include mod
|
37
|
-
mod
|
33
|
+
if options.delete(:superstore)
|
34
|
+
Superstore::Associations::Builder::HasOne.build(self, name, options)
|
35
|
+
else
|
36
|
+
super
|
38
37
|
end
|
39
38
|
end
|
40
39
|
end
|
41
40
|
|
42
|
-
# Returns the belongs_to instance for the given name, instantiating it if it doesn't already exist
|
43
|
-
def association(name)
|
44
|
-
instance = association_instance_get(name)
|
45
|
-
|
46
|
-
if instance.nil?
|
47
|
-
reflection = association_reflections[name]
|
48
|
-
instance = reflection.association_class.new(self, reflection)
|
49
|
-
association_instance_set(name, instance)
|
50
|
-
end
|
51
|
-
|
52
|
-
instance
|
53
|
-
end
|
54
|
-
|
55
|
-
private
|
56
|
-
def clear_associations_cache
|
57
|
-
associations_cache.clear if persisted?
|
58
|
-
end
|
59
|
-
|
60
|
-
def associations_cache
|
61
|
-
@associations_cache ||= {}
|
62
|
-
end
|
63
|
-
|
64
|
-
def association_instance_get(name)
|
65
|
-
associations_cache[name.to_sym]
|
66
|
-
end
|
67
|
-
|
68
|
-
def association_instance_set(name, association)
|
69
|
-
associations_cache[name.to_sym] = association
|
70
|
-
end
|
71
41
|
end
|
72
42
|
end
|
@@ -33,6 +33,10 @@ module Superstore
|
|
33
33
|
def attribute_methods_generated?
|
34
34
|
@attribute_methods_generated ||= false
|
35
35
|
end
|
36
|
+
|
37
|
+
def dangerous_attribute_method?(name)
|
38
|
+
false
|
39
|
+
end
|
36
40
|
end
|
37
41
|
|
38
42
|
def write_attribute(name, value)
|
@@ -40,7 +44,19 @@ module Superstore
|
|
40
44
|
end
|
41
45
|
|
42
46
|
def read_attribute(name)
|
43
|
-
|
47
|
+
name = name.to_s unless name.is_a?(String)
|
48
|
+
|
49
|
+
if name == self.class.primary_key
|
50
|
+
send(name)
|
51
|
+
else
|
52
|
+
@attributes[name]
|
53
|
+
end
|
54
|
+
end
|
55
|
+
alias_method :_read_attribute, :read_attribute
|
56
|
+
|
57
|
+
def attribute_present?(attribute)
|
58
|
+
value = _read_attribute(attribute)
|
59
|
+
!value.nil? && !(value.respond_to?(:empty?) && value.empty?)
|
44
60
|
end
|
45
61
|
|
46
62
|
def attribute_exists?(name)
|
data/lib/superstore/base.rb
CHANGED
@@ -11,6 +11,15 @@ module Superstore
|
|
11
11
|
include ActiveModel::Serializers::JSON
|
12
12
|
include GlobalID::Identification
|
13
13
|
|
14
|
+
extend ActiveRecord::Delegation::DelegateCache
|
15
|
+
extend ActiveRecord::ConnectionHandling
|
16
|
+
include ActiveRecord::ModelSchema
|
17
|
+
include ActiveRecord::Inheritance
|
18
|
+
include ActiveRecord::Attributes
|
19
|
+
include ActiveRecord::Associations
|
20
|
+
include ActiveRecord::AutosaveAssociation
|
21
|
+
include ActiveRecord::Reflection
|
22
|
+
|
14
23
|
include Model
|
15
24
|
include Core
|
16
25
|
include Connection
|
data/lib/superstore/core.rb
CHANGED
@@ -2,10 +2,43 @@ module Superstore
|
|
2
2
|
module Core
|
3
3
|
extend ActiveSupport::Concern
|
4
4
|
|
5
|
+
module ClassMethods
|
6
|
+
def inspect
|
7
|
+
if self == Base
|
8
|
+
super
|
9
|
+
else
|
10
|
+
attr_list = attribute_definitions.keys * ', '
|
11
|
+
"#{super}(#{attr_list.truncate(140 * 1.7337)})"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def initialize_generated_modules # :nodoc:
|
16
|
+
generated_association_methods
|
17
|
+
end
|
18
|
+
|
19
|
+
def generated_association_methods
|
20
|
+
@generated_association_methods ||= begin
|
21
|
+
mod = const_set(:GeneratedAssociationMethods, Module.new)
|
22
|
+
include mod
|
23
|
+
mod
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def arel_table # :nodoc:
|
28
|
+
@arel_table ||= Arel::Table.new(table_name, self)
|
29
|
+
end
|
30
|
+
|
31
|
+
def subclass_from_attributes?(attrs)
|
32
|
+
false
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
5
36
|
def initialize(attributes=nil)
|
6
|
-
@new_record
|
7
|
-
@destroyed
|
8
|
-
@
|
37
|
+
@new_record = true
|
38
|
+
@destroyed = false
|
39
|
+
@association_cache = {}
|
40
|
+
|
41
|
+
@attributes = {}
|
9
42
|
self.attributes = attributes || {}
|
10
43
|
|
11
44
|
yield self if block_given?
|
@@ -19,6 +52,7 @@ module Superstore
|
|
19
52
|
@id = nil
|
20
53
|
@new_record = true
|
21
54
|
@destroyed = false
|
55
|
+
@association_cache = {}
|
22
56
|
super
|
23
57
|
end
|
24
58
|
|
@@ -30,17 +64,6 @@ module Superstore
|
|
30
64
|
id.hash
|
31
65
|
end
|
32
66
|
|
33
|
-
module ClassMethods
|
34
|
-
def inspect
|
35
|
-
if self == Base
|
36
|
-
super
|
37
|
-
else
|
38
|
-
attr_list = attribute_definitions.keys * ', '
|
39
|
-
"#{super}(#{attr_list.truncate(140 * 1.7337)})"
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
67
|
def ==(comparison_object)
|
45
68
|
comparison_object.equal?(self) ||
|
46
69
|
(comparison_object.instance_of?(self.class) &&
|
data/lib/superstore/model.rb
CHANGED
@@ -8,14 +8,6 @@ module Superstore
|
|
8
8
|
end
|
9
9
|
|
10
10
|
module ClassMethods
|
11
|
-
def table_name=(table_name)
|
12
|
-
@table_name = table_name
|
13
|
-
end
|
14
|
-
|
15
|
-
def table_name
|
16
|
-
@table_name ||= base_class.model_name.plural
|
17
|
-
end
|
18
|
-
|
19
11
|
def base_class
|
20
12
|
class_of_active_record_descendant(self)
|
21
13
|
end
|
@@ -43,6 +43,7 @@ module Superstore
|
|
43
43
|
object.instance_variable_set("@new_record", false)
|
44
44
|
object.instance_variable_set("@destroyed", false)
|
45
45
|
object.instance_variable_set("@attributes", typecast_persisted_attributes(attributes))
|
46
|
+
object.instance_variable_set("@association_cache", {})
|
46
47
|
end
|
47
48
|
end
|
48
49
|
|
@@ -127,7 +128,7 @@ module Superstore
|
|
127
128
|
end
|
128
129
|
|
129
130
|
def reload
|
130
|
-
|
131
|
+
clear_association_cache
|
131
132
|
@attributes = self.class.find(id).instance_variable_get('@attributes')
|
132
133
|
self
|
133
134
|
end
|
data/lib/superstore/scoping.rb
CHANGED
@@ -8,6 +8,9 @@ module Superstore
|
|
8
8
|
delegate :find_each, :find_in_batches, to: :scope
|
9
9
|
delegate :select, :where, :where_ids, to: :scope
|
10
10
|
end
|
11
|
+
|
12
|
+
class_attribute :default_scopes, instance_writer: false, instance_predicate: false
|
13
|
+
self.default_scopes = []
|
11
14
|
end
|
12
15
|
|
13
16
|
module ClassMethods
|
data/superstore.gemspec
CHANGED
data/test/test_helper.rb
CHANGED
@@ -1,95 +1,30 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
3
|
class Superstore::Associations::BelongsTest < Superstore::TestCase
|
4
|
-
class TestObject <
|
5
|
-
|
6
|
-
belongs_to :issue
|
7
|
-
|
8
|
-
string :widget_id
|
9
|
-
belongs_to :widget, class_name: 'Issue'
|
10
|
-
|
11
|
-
string :other_id
|
12
|
-
belongs_to :other_issue, class_name: 'Issue', foreign_key: :other_id
|
13
|
-
|
4
|
+
class TestObject < Superstore::Base
|
5
|
+
self.table_name = 'issues'
|
14
6
|
string :user_id
|
15
7
|
belongs_to :user, primary_key: :special_id
|
16
|
-
|
17
|
-
string :title_issue_id
|
18
|
-
belongs_to :title_issue, class_name: 'Issue', primary_key: :title
|
19
|
-
|
20
|
-
string :target_id
|
21
|
-
string :target_type
|
22
|
-
belongs_to :target, polymorphic: true
|
23
8
|
end
|
24
9
|
|
25
10
|
test 'belongs_to' do
|
26
|
-
|
27
|
-
|
28
|
-
record = TestObject.create(issue: issue)
|
29
|
-
|
30
|
-
assert_equal issue, record.issue
|
31
|
-
assert_equal issue.id, record.issue_id
|
32
|
-
|
33
|
-
record = TestObject.find(record.id)
|
34
|
-
assert_equal issue, record.issue
|
35
|
-
end
|
36
|
-
|
37
|
-
test 'belongs_to with class_name' do
|
38
|
-
issue = Issue.create
|
39
|
-
|
40
|
-
record = TestObject.create(widget: issue)
|
41
|
-
|
42
|
-
assert_equal issue, record.widget
|
43
|
-
assert_equal issue.id, record.widget_id
|
44
|
-
|
45
|
-
record = TestObject.find(record.id)
|
46
|
-
assert_equal issue, record.widget
|
47
|
-
end
|
48
|
-
|
49
|
-
test 'belongs_to with foreign_key' do
|
50
|
-
issue = Issue.create
|
51
|
-
|
52
|
-
record = TestObject.create(other_issue: issue)
|
53
|
-
|
54
|
-
assert_equal issue, record.other_issue
|
55
|
-
assert_equal issue.id, record.other_id
|
56
|
-
|
57
|
-
record = TestObject.find(record.id)
|
58
|
-
assert_equal issue, record.other_issue
|
59
|
-
end
|
60
|
-
|
61
|
-
test 'belongs_to with primary_key for ActiveRecord' do
|
62
|
-
special_id = 'special_id'
|
63
|
-
user = User.create! special_id: special_id
|
64
|
-
record = TestObject.create user: user
|
65
|
-
|
66
|
-
assert_equal user, record.user
|
67
|
-
assert_equal special_id, record.user_id
|
68
|
-
|
69
|
-
record = TestObject.find(record.id)
|
70
|
-
assert_equal user, record.user
|
71
|
-
end
|
72
|
-
|
73
|
-
test 'belongs_to with polymorphic' do
|
74
|
-
issue = Issue.create
|
75
|
-
|
76
|
-
record = TestObject.create(target: issue)
|
11
|
+
user = User.create(special_id: 'abc')
|
12
|
+
issue = TestObject.create(user: user)
|
77
13
|
|
78
|
-
assert_equal
|
79
|
-
assert_equal issue.
|
80
|
-
assert_equal 'Issue', record.target_type
|
14
|
+
assert_equal user, issue.user
|
15
|
+
assert_equal issue.user_id, 'abc'
|
81
16
|
|
82
|
-
|
83
|
-
assert_equal
|
17
|
+
issue = TestObject.find(issue.id)
|
18
|
+
assert_equal user, issue.user
|
84
19
|
end
|
85
20
|
|
86
21
|
test 'belongs_to clear cache after reload' do
|
87
|
-
|
88
|
-
|
89
|
-
|
22
|
+
user = User.create(special_id: 'abc')
|
23
|
+
issue = TestObject.create(user: user)
|
24
|
+
user.destroy
|
90
25
|
|
91
|
-
assert_not_nil
|
92
|
-
assert_nil TestObject.find(
|
93
|
-
assert_nil
|
26
|
+
assert_not_nil issue.user
|
27
|
+
assert_nil TestObject.find(issue.id).user
|
28
|
+
assert_nil issue.reload.user
|
94
29
|
end
|
95
30
|
end
|
@@ -1,12 +1,13 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
3
|
class Superstore::Associations::ReflectionTest < Superstore::TestCase
|
4
|
-
class ::Status < Superstore::Base; end
|
5
|
-
class ::Job < Superstore::Base
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
4
|
+
# class ::Status < Superstore::Base; end
|
5
|
+
# class ::Job < Superstore::Base
|
6
|
+
# self.table_name = 'issues'
|
7
|
+
# belongs_to :status
|
8
|
+
# end
|
9
|
+
#
|
10
|
+
# test 'class_name' do
|
11
|
+
# assert_equal 'Status', Job.new.association_reflections[:status].class_name
|
12
|
+
# end
|
12
13
|
end
|
@@ -2,7 +2,7 @@ require 'test_helper'
|
|
2
2
|
|
3
3
|
class Superstore::AttributeMethods::TypecastingTest < Superstore::TestCase
|
4
4
|
class TestIssue < Superstore::Base
|
5
|
-
self.table_name = '
|
5
|
+
self.table_name = 'issues'
|
6
6
|
|
7
7
|
boolean :enabled
|
8
8
|
float :rating
|
@@ -78,7 +78,7 @@ class Superstore::AttributeMethods::TypecastingTest < Superstore::TestCase
|
|
78
78
|
|
79
79
|
test 'multiple attributes definition' do
|
80
80
|
class MultipleAttributesIssue < Superstore::Base
|
81
|
-
self.table_name = '
|
81
|
+
self.table_name = 'issues'
|
82
82
|
end
|
83
83
|
|
84
84
|
assert_nothing_raised {
|
@@ -91,7 +91,7 @@ class Superstore::AttributeMethods::TypecastingTest < Superstore::TestCase
|
|
91
91
|
|
92
92
|
test 'multiple attributes with options' do
|
93
93
|
class MultipleAttributesIssue < Superstore::Base
|
94
|
-
self.table_name = '
|
94
|
+
self.table_name = 'issues'
|
95
95
|
end
|
96
96
|
|
97
97
|
MultipleAttributesIssue.expects(:attribute).with(:hello, { :unique => :true, :type => :string })
|
@@ -12,6 +12,10 @@ class Superstore::AttributeMethodsTest < Superstore::TestCase
|
|
12
12
|
assert_equal 'foo', issue.read_attribute(:description)
|
13
13
|
end
|
14
14
|
|
15
|
+
test 'read primary_key' do
|
16
|
+
refute_nil Issue.new[:id]
|
17
|
+
end
|
18
|
+
|
15
19
|
test 'hash accessor aliases' do
|
16
20
|
issue = Issue.new
|
17
21
|
|
@@ -43,6 +47,7 @@ class Superstore::AttributeMethodsTest < Superstore::TestCase
|
|
43
47
|
end
|
44
48
|
|
45
49
|
class ReservedWord < Superstore::Base
|
50
|
+
self.table_name = 'issues'
|
46
51
|
string :system
|
47
52
|
end
|
48
53
|
|
data/test/unit/base_test.rb
CHANGED
@@ -14,7 +14,7 @@ class Superstore::BaseTest < Superstore::TestCase
|
|
14
14
|
end
|
15
15
|
|
16
16
|
test 'table_name' do
|
17
|
-
assert_equal '
|
18
|
-
assert_equal '
|
17
|
+
assert_equal 'sons', Son.table_name
|
18
|
+
assert_equal 'sons', Grandson.table_name
|
19
19
|
end
|
20
20
|
end
|
data/test/unit/caching_test.rb
CHANGED
data/test/unit/callbacks_test.rb
CHANGED
@@ -2,7 +2,7 @@ require 'test_helper'
|
|
2
2
|
|
3
3
|
class Superstore::CallbacksTest < Superstore::TestCase
|
4
4
|
class TestIssue < Superstore::Base
|
5
|
-
self.table_name = '
|
5
|
+
self.table_name = 'issues'
|
6
6
|
string :description
|
7
7
|
|
8
8
|
%w(before_validation after_validation after_save after_create after_update after_destroy).each do |method|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: superstore
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0
|
4
|
+
version: 2.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Koziarski
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2016-02-
|
12
|
+
date: 2016-02-13 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activemodel
|