activeshepherd 0.8.3 → 0.8.4
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/activeshepherd.gemspec +2 -4
- data/lib/active_shepherd/aggregate.rb +21 -2
- data/lib/active_shepherd/version.rb +1 -1
- data/test/integration/project_todo_scenario_test.rb +4 -4
- data/test/setup_test_models.rb +4 -0
- data/test/test_helper.rb +0 -5
- data/test/unit/aggregate_test.rb +26 -2
- data/test/unit/apply_changes_test.rb +1 -1
- data/test/unit/changes_validator_test.rb +1 -1
- data/test/unit/class_validator_test.rb +1 -1
- data/test/unit/traversal_test.rb +4 -0
- metadata +9 -35
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 99198041d4010d96c14b417691a345b9488e4cef
|
4
|
+
data.tar.gz: 71e6095aff2faa19f06750e4cd8cdc1eb37d2880
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ac3736238e51bfd0868b2afda8495ea524b691230a00f10209cdc86eb8fafd491c375231615d9f273014b87050726e466b4ac38f62c0e0dd6155f99c12e159c8
|
7
|
+
data.tar.gz: fff6353d44206d5fc680e94ea7ccfde186e78b396a5eb1a22b68b19e763ef342b1fd90353c67dc71d2721a193c08289bbf842612eee3fd60739e6a010463282f
|
data/activeshepherd.gemspec
CHANGED
@@ -21,11 +21,9 @@ Gem::Specification.new do |gem|
|
|
21
21
|
gem.add_dependency "activerecord", ">= 2.3.17"
|
22
22
|
gem.add_dependency "activesupport", ">= 2.3.17"
|
23
23
|
|
24
|
-
gem.add_development_dependency "activerecord", "4.0.
|
25
|
-
gem.add_development_dependency "guard"
|
26
|
-
gem.add_development_dependency "guard-minitest"
|
24
|
+
gem.add_development_dependency "activerecord", "~> 4.0.2"
|
27
25
|
gem.add_development_dependency "hashie"
|
28
|
-
gem.add_development_dependency "minitest
|
26
|
+
gem.add_development_dependency "minitest"
|
29
27
|
gem.add_development_dependency "pry"
|
30
28
|
gem.add_development_dependency "pry-debugger"
|
31
29
|
gem.add_development_dependency "rake"
|
@@ -50,9 +50,9 @@ private
|
|
50
50
|
|
51
51
|
def associations
|
52
52
|
@associations ||= begin
|
53
|
-
all_associations = model.class.reflect_on_all_associations
|
54
53
|
ostruct = OpenStruct.new untraversable: {}, traversable: {}
|
55
|
-
|
54
|
+
associations_by_table.each_with_object(ostruct) do |(table, associations), ostruct|
|
55
|
+
association_reflection = preferred_association_from_set associations
|
56
56
|
if traverse_association?(association_reflection)
|
57
57
|
key = :traversable
|
58
58
|
else
|
@@ -63,6 +63,24 @@ private
|
|
63
63
|
end
|
64
64
|
end
|
65
65
|
|
66
|
+
def associations_by_table
|
67
|
+
@associations_by_table ||=
|
68
|
+
begin
|
69
|
+
by_table = Hash.new { |h,k| h[k] = Array.new }
|
70
|
+
model.class.reflect_on_all_associations.each do |association_reflection, hash|
|
71
|
+
next unless association_reflection.active_record == model.class
|
72
|
+
if traverse_association? association_reflection
|
73
|
+
by_table[association_reflection.table_name] << association_reflection
|
74
|
+
end
|
75
|
+
end
|
76
|
+
by_table
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def preferred_association_from_set(associations)
|
81
|
+
associations.detect { |a| a.macro == :has_many } || associations.first
|
82
|
+
end
|
83
|
+
|
66
84
|
def run_through_serializer(attribute_name, value, method)
|
67
85
|
serializer = model.class.serialized_attributes[attribute_name.to_s]
|
68
86
|
if serializer
|
@@ -76,6 +94,7 @@ private
|
|
76
94
|
return false if association.options[:readonly]
|
77
95
|
return false if association.macro == :belongs_to
|
78
96
|
return false unless in_namespace?(association.klass.to_s)
|
97
|
+
return false if association.is_a?(ActiveRecord::Reflection::ThroughReflection)
|
79
98
|
|
80
99
|
true
|
81
100
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
|
-
class IntegrationTest <
|
3
|
+
class IntegrationTest < Minitest::Test
|
4
4
|
def setup
|
5
5
|
Project.destroy_all
|
6
6
|
|
@@ -118,9 +118,9 @@ class IntegrationTest < MiniTest::Unit::TestCase
|
|
118
118
|
end
|
119
119
|
|
120
120
|
def test_does_not_walk_associations_to_other_entities
|
121
|
-
|
122
|
-
|
123
|
-
|
121
|
+
assert_raises ActiveShepherd::AggregateMismatchError do
|
122
|
+
@project.aggregate_state = { owner: { name: "Joe Schmoe" } }
|
123
|
+
end
|
124
124
|
end
|
125
125
|
|
126
126
|
=begin
|
data/test/setup_test_models.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
ActiveRecord::Migration.create_table :users, force: true do |t|
|
2
2
|
t.string :name
|
3
|
+
t.belongs_to :favorite_project
|
3
4
|
end
|
4
5
|
|
5
6
|
ActiveRecord::Migration.create_table :comments, force: true do |t|
|
@@ -44,6 +45,7 @@ class User < ActiveRecord::Base
|
|
44
45
|
|
45
46
|
has_many :projects, inverse_of: :owner, dependent: :destroy, autosave: true,
|
46
47
|
validate: true, foreign_key: :owner_id
|
48
|
+
belongs_to :favorite_project, class_name: "Project"
|
47
49
|
end
|
48
50
|
|
49
51
|
class Comment < ActiveRecord::Base
|
@@ -55,6 +57,8 @@ class Project < ActiveRecord::Base
|
|
55
57
|
act_as_aggregate_root!
|
56
58
|
|
57
59
|
belongs_to :owner, class_name: "User", inverse_of: :projects, touch: true
|
60
|
+
has_many :watchers, inverse_of: :favorite_project, class_name: "User",
|
61
|
+
foreign_key: :favorite_project_id
|
58
62
|
|
59
63
|
has_one :detail, inverse_of: :project, dependent: :destroy, autosave: true
|
60
64
|
|
data/test/test_helper.rb
CHANGED
@@ -7,13 +7,8 @@ require 'pry'
|
|
7
7
|
$LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
|
8
8
|
require 'active_shepherd'
|
9
9
|
|
10
|
-
require 'minitest/mock'
|
11
|
-
require 'minitest/reporters'
|
12
|
-
|
13
10
|
require 'minitest/autorun'
|
14
11
|
|
15
|
-
MiniTest::Reporters.use! MiniTest::Reporters::DefaultReporter.new
|
16
|
-
|
17
12
|
ActiveRecord::Base.establish_connection adapter: "sqlite3", database: ":memory:"
|
18
13
|
|
19
14
|
ActiveShepherd.enable!(ActiveRecord::Base)
|
data/test/unit/aggregate_test.rb
CHANGED
@@ -4,12 +4,14 @@ class MyKlass
|
|
4
4
|
SubKlass = Class.new
|
5
5
|
end
|
6
6
|
|
7
|
-
class AggregateTest <
|
7
|
+
class AggregateTest < Minitest::Test
|
8
8
|
def setup
|
9
|
-
@aggregate = ActiveShepherd::Aggregate.new
|
9
|
+
@aggregate = ActiveShepherd::Aggregate.new Project.new
|
10
10
|
end
|
11
11
|
|
12
12
|
def test_in_namespace_returns_true_only_if_associated_klass_in_namespace
|
13
|
+
@aggregate = ActiveShepherd::Aggregate.new MyKlass.new
|
14
|
+
|
13
15
|
refute @aggregate.in_namespace?('MyKlass')
|
14
16
|
assert @aggregate.in_namespace?('MyKlass::SubKlass')
|
15
17
|
refute @aggregate.in_namespace?('MyKlass::SubKlass::SubSubKlass')
|
@@ -24,4 +26,26 @@ class AggregateTest < MiniTest::Unit::TestCase
|
|
24
26
|
assert @aggregate.in_namespace?('MyKlass::SubSubKlass')
|
25
27
|
refute @aggregate.in_namespace?('Foo')
|
26
28
|
end
|
29
|
+
|
30
|
+
def test_traversable_associations_excludes_classes_outside_namespace
|
31
|
+
refute_includes @aggregate.traversable_associations.keys, :watchers
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_traversable_associations_ignores_redundant_associations
|
35
|
+
refute_includes @aggregate.traversable_associations.keys, :recent_todo_list
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_traversable_associations_returns_traversable_associations
|
39
|
+
assert_includes @aggregate.traversable_associations.keys, :detail
|
40
|
+
assert_includes @aggregate.traversable_associations.keys, :todo_lists
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_traversable_associations_ignores_base_class
|
44
|
+
@aggregate = ActiveShepherd::Aggregate.new Project::Comment.new
|
45
|
+
refute_includes @aggregate.traversable_associations.keys, :commentable
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_traversable_associations_ignores_has_many_through
|
49
|
+
refute_includes @aggregate.traversable_associations.keys, :todos
|
50
|
+
end
|
27
51
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activeshepherd
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.8.
|
4
|
+
version: 0.8.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- ntl
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-12-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -42,44 +42,16 @@ dependencies:
|
|
42
42
|
name: activerecord
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ~>
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: 4.0.
|
47
|
+
version: 4.0.2
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ~>
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: 4.0.
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: guard
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - '>='
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '0'
|
62
|
-
type: :development
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - '>='
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '0'
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: guard-minitest
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - '>='
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: '0'
|
76
|
-
type: :development
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - '>='
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: '0'
|
54
|
+
version: 4.0.2
|
83
55
|
- !ruby/object:Gem::Dependency
|
84
56
|
name: hashie
|
85
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -95,7 +67,7 @@ dependencies:
|
|
95
67
|
- !ruby/object:Gem::Version
|
96
68
|
version: '0'
|
97
69
|
- !ruby/object:Gem::Dependency
|
98
|
-
name: minitest
|
70
|
+
name: minitest
|
99
71
|
requirement: !ruby/object:Gem::Requirement
|
100
72
|
requirements:
|
101
73
|
- - '>='
|
@@ -220,6 +192,7 @@ files:
|
|
220
192
|
- test/unit/apply_changes_test.rb
|
221
193
|
- test/unit/changes_validator_test.rb
|
222
194
|
- test/unit/class_validator_test.rb
|
195
|
+
- test/unit/traversal_test.rb
|
223
196
|
homepage: http://github.com/ntl/activeshepherd
|
224
197
|
licenses:
|
225
198
|
- MIT
|
@@ -254,4 +227,5 @@ test_files:
|
|
254
227
|
- test/unit/apply_changes_test.rb
|
255
228
|
- test/unit/changes_validator_test.rb
|
256
229
|
- test/unit/class_validator_test.rb
|
230
|
+
- test/unit/traversal_test.rb
|
257
231
|
has_rdoc:
|