superstore 2.0.1 → 2.1.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 +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
|