partial_ks 0.5.0 → 0.6.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/CHANGES.md +4 -0
- data/CONTRIBUTING.md +5 -1
- data/lib/partial_ks/all_rails_models.rb +1 -1
- data/lib/partial_ks/filtered_table.rb +9 -7
- data/lib/partial_ks/runner.rb +5 -17
- data/lib/partial_ks/version.rb +1 -1
- data/test/filtered_table_test.rb +13 -1
- data/test/runner_test.rb +0 -8
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d6f2760377220a11179eb98450908820dbfd86ca
|
4
|
+
data.tar.gz: 39e16a10891aad2aea68916f57f4e3b8392d88f2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a039c6bf09d0a69a55cb4f36676ea3e5f92365a009dd5f688d832cc2d82563bb5cfa0ef0725bc4c0e91cacb0543eaa80662e2f53d016d1706951bd72da2055c2
|
7
|
+
data.tar.gz: 0c9adb839f994ed6f3d350f526d61faa21d5c15054df366527fd29c3f617f5017a5477583b0c70927496faa457bbcb31c4ad84491cf3955fb1ce1ce2bc2cc830
|
data/CHANGES.md
CHANGED
@@ -1,5 +1,9 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
# 0.6.0
|
4
|
+
|
5
|
+
Propogate filters down the tree. If the parent downloads the whole table, do the same for the child.
|
6
|
+
|
3
7
|
# 0.5.0
|
4
8
|
|
5
9
|
* New single entry point, `PartialKs::KitchenSync`. This means that Runner and ConfigurationGenerator are now internal concerns
|
data/CONTRIBUTING.md
CHANGED
@@ -2,7 +2,7 @@ This document should tell all you need to know for contributing to this project.
|
|
2
2
|
|
3
3
|
# Testing
|
4
4
|
|
5
|
-
Tested with activerecord 4.2.
|
5
|
+
Tested with activerecord 4.2.10, 5.0.6, 5.1.4 (on Ruby 2.3.5)
|
6
6
|
|
7
7
|
|
8
8
|
To install and run tests :
|
@@ -23,3 +23,7 @@ The building of the filter is done on the target DB.
|
|
23
23
|
|
24
24
|
Filters are run on the source DB.
|
25
25
|
- Note that a SQL statement from the target DB will behave differently on the source DB.
|
26
|
+
|
27
|
+
## Dependencies
|
28
|
+
|
29
|
+
KitchenSync -> (ModelList -> Table) -> Runner -> (FilteredTable -> Table)
|
@@ -1,26 +1,28 @@
|
|
1
1
|
module PartialKs
|
2
2
|
class FilteredTable
|
3
|
-
attr_reader :table, :
|
3
|
+
attr_reader :table, :parent, :custom_filter_relation
|
4
4
|
delegate :table_name, :to => :table
|
5
5
|
|
6
|
-
def initialize(model,
|
6
|
+
def initialize(model, parent, custom_filter_relation: nil)
|
7
7
|
@table = PartialKs::Table.new(model)
|
8
|
-
@
|
8
|
+
@parent = parent
|
9
9
|
@custom_filter_relation = custom_filter_relation
|
10
10
|
end
|
11
11
|
|
12
12
|
def kitchen_sync_filter
|
13
13
|
if custom_filter_relation
|
14
14
|
{"only" => filter_based_on_custom_filter_relation}
|
15
|
-
elsif
|
16
|
-
|
15
|
+
elsif parent && parent.kitchen_sync_filter.nil?
|
16
|
+
nil
|
17
|
+
elsif parent
|
18
|
+
{"only" => filter_based_on_parent_model(parent.table.model)}
|
17
19
|
else
|
18
20
|
nil
|
19
21
|
end
|
20
22
|
end
|
21
23
|
|
22
24
|
protected
|
23
|
-
def filter_based_on_parent_model
|
25
|
+
def filter_based_on_parent_model(parent_model)
|
24
26
|
table.relation_for_associated_model(parent_model).where_sql.to_s.sub(where_regexp, "")
|
25
27
|
end
|
26
28
|
|
@@ -28,7 +30,7 @@ module PartialKs
|
|
28
30
|
relation = custom_filter_relation.respond_to?(:call) ? custom_filter_relation.call : custom_filter_relation
|
29
31
|
|
30
32
|
if relation.is_a?(ActiveRecord::Relation) || relation.respond_to?(:where_sql)
|
31
|
-
relation.
|
33
|
+
relation.to_sql.to_s.sub(where_regexp, "")
|
32
34
|
elsif relation.is_a?(String)
|
33
35
|
relation.sub(where_regexp, "")
|
34
36
|
end
|
data/lib/partial_ks/runner.rb
CHANGED
@@ -24,16 +24,6 @@ module PartialKs
|
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
27
|
-
def report
|
28
|
-
result = []
|
29
|
-
each_generation.with_index do |generation, depth|
|
30
|
-
generation.each do |table|
|
31
|
-
result << [table.table_name, table.parent_model, table.custom_filter_relation, depth]
|
32
|
-
end
|
33
|
-
end
|
34
|
-
result
|
35
|
-
end
|
36
|
-
|
37
27
|
def each_generation
|
38
28
|
return enum_for(:each_generation) unless block_given?
|
39
29
|
|
@@ -43,9 +33,6 @@ module PartialKs
|
|
43
33
|
end
|
44
34
|
|
45
35
|
protected
|
46
|
-
def filtered_tables
|
47
|
-
@filtered_tables ||= models_list.map {|model, parent, custom_filter| PartialKs::FilteredTable.new(model, parent, custom_filter_relation: custom_filter)}
|
48
|
-
end
|
49
36
|
|
50
37
|
def generations
|
51
38
|
return @generations if defined?(@generations)
|
@@ -53,8 +40,8 @@ module PartialKs
|
|
53
40
|
@generations = []
|
54
41
|
q = []
|
55
42
|
|
56
|
-
|
57
|
-
q <<
|
43
|
+
models_list.each do |model, parent, filter|
|
44
|
+
q << PartialKs::FilteredTable.new(model, nil, custom_filter_relation: filter) if parent.nil?
|
58
45
|
end
|
59
46
|
|
60
47
|
until q.empty?
|
@@ -62,8 +49,9 @@ module PartialKs
|
|
62
49
|
|
63
50
|
next_generation = []
|
64
51
|
q.each do |table|
|
65
|
-
|
66
|
-
|
52
|
+
models_list.each do |child_model, parent, filter|
|
53
|
+
# I have access to parent here - link model to child_model
|
54
|
+
next_generation << PartialKs::FilteredTable.new(child_model, table, custom_filter_relation: filter) if parent && parent.table_name == table.table_name
|
67
55
|
end
|
68
56
|
end
|
69
57
|
|
data/lib/partial_ks/version.rb
CHANGED
data/test/filtered_table_test.rb
CHANGED
@@ -2,12 +2,13 @@ require 'test_helper'
|
|
2
2
|
|
3
3
|
describe "kitchen sync filter" do
|
4
4
|
let(:model) { PostTag }
|
5
|
-
let(:
|
5
|
+
let(:parent_model) { BlogPost }
|
6
6
|
|
7
7
|
it "proxies to Table if there's parent only" do
|
8
8
|
table_parent_relation_method = :relation_for_associated_model
|
9
9
|
relation_mock = Minitest::Mock.new
|
10
10
|
relation_mock.expect :where_sql, "WHERE tag_id IN (0)"
|
11
|
+
parent = PartialKs::FilteredTable.new(parent, nil, custom_filter_relation: BlogPost.where("1=0"))
|
11
12
|
|
12
13
|
filtered_table = PartialKs::FilteredTable.new(model, parent)
|
13
14
|
filtered_table.table.stub table_parent_relation_method, relation_mock do
|
@@ -15,6 +16,12 @@ describe "kitchen sync filter" do
|
|
15
16
|
end
|
16
17
|
end
|
17
18
|
|
19
|
+
it "short-circuits evaluation if the parent has no filter" do
|
20
|
+
parent = PartialKs::FilteredTable.new(parent, nil)
|
21
|
+
filtered_table = PartialKs::FilteredTable.new(model, parent)
|
22
|
+
filtered_table.kitchen_sync_filter.must_be_nil
|
23
|
+
end
|
24
|
+
|
18
25
|
it "uses the custom filter if provided" do
|
19
26
|
filter = PostTag.where(:id => [1, 2])
|
20
27
|
filtered_table = PartialKs::FilteredTable.new(model, nil, custom_filter_relation: filter)
|
@@ -45,4 +52,9 @@ describe "kitchen sync filter" do
|
|
45
52
|
filtered_table.kitchen_sync_filter.must_be_nil
|
46
53
|
end
|
47
54
|
|
55
|
+
it "generates a complete where fragment from a custom filter" do
|
56
|
+
filter = PostTag.where(:id => 2)
|
57
|
+
filtered_table = PartialKs::FilteredTable.new(model, nil, custom_filter_relation: filter)
|
58
|
+
filtered_table.kitchen_sync_filter.must_equal({"only" => '"post_tags"."id" = 2'})
|
59
|
+
end
|
48
60
|
end
|
data/test/runner_test.rb
CHANGED
@@ -26,14 +26,6 @@ describe 'running based on output from generator' do
|
|
26
26
|
|
27
27
|
let(:runner) { PartialKs::Runner.new(generator_output) }
|
28
28
|
|
29
|
-
it "reports everything" do
|
30
|
-
runner.report.must_equal [
|
31
|
-
["users", nil, User.where(:id => [1]), 0],
|
32
|
-
["tags", nil, nil, 0],
|
33
|
-
["blog_posts", User, nil, 1],
|
34
|
-
]
|
35
|
-
end
|
36
|
-
|
37
29
|
it "yields all table names" do
|
38
30
|
expected_table_names = [User, Tag, BlogPost].map(&:table_name)
|
39
31
|
actual_table_names = []
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: partial_ks
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Thong Kuah
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-01-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -106,7 +106,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
106
106
|
version: '0'
|
107
107
|
requirements: []
|
108
108
|
rubyforge_project:
|
109
|
-
rubygems_version: 2.5.2
|
109
|
+
rubygems_version: 2.5.2.1
|
110
110
|
signing_key:
|
111
111
|
specification_version: 4
|
112
112
|
summary: Partial KS
|