pg_shrink 0.0.7 → 0.1.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: 117e596cf13247f02367b4a68c567e992af5be2a
4
- data.tar.gz: 923fdb14ee56b247545369797a6bdca7408d8953
3
+ metadata.gz: 79d28599347bf3d3b21a5ff1066eb005d93de451
4
+ data.tar.gz: 52afef4d72dfe607d9a6b9fea197789492a27153
5
5
  SHA512:
6
- metadata.gz: 8e4d119d4f47a29027e52b7311b04e2232b87510245ef09f727dbfc9d9b32472f6f07bb6dd2fd4287994147078a61b9ca3e06389a8d0fb084965ff642618a05c
7
- data.tar.gz: 279662e61bb4fdfef90de4ed31f01ea2cad82f5c52460f27fff5223028ad979a309cb843863f042beaf9e9c825b3f6003c3bdc50ba0a94bfeab5c08d0b3c2913
6
+ metadata.gz: b34ea492d943779dafde384932065fdaae0d5244ff09b115c5436a319c27bdccae5ac01c02dcfda578a54a3383b725f561c5333fc199efd8e91dae81ad542303
7
+ data.tar.gz: b3c7736462f971e4eba50960a48dea9260c891d1b0152c7fe675669213ac241e459a9dce38f6a32cdfb8e5765d17a898e78ed756aa95abe4476cb233f8aad103
data/README.md CHANGED
@@ -1,5 +1,4 @@
1
- [![Build Status](https://travis-ci.org/apartmentlist/pg-shrink.svg?branch=master)](https://travis-ci.org/apartmentlist/pg-shrink)
2
-
1
+ [![Build Status](https://travis-ci.org/apartmentlist/pg_shrink.svg?branch=master)](https://travis-ci.org/apartmentlist/pg_shrink)
3
2
  # PgShrink
4
3
 
5
4
  The pg_shrink tool makes it easy to shrink and sanitize a postgres database,
data/Shrinkfile.example CHANGED
@@ -23,11 +23,16 @@ filter_table :users do |f|
23
23
  f.filter_subtable(:email_preferences, :foreign_key => :user_email,
24
24
  :primary_key => :email)
25
25
 
26
- # You can also filter by a polymorphic reference by specifying the
27
- # type_key and type.
28
- f.filter_subtable(:polymorphic_referneces, :foreign_key => :context_id,
29
- :type_key => :context_type,
30
- :type => 'User')
26
+ # You can also pass an additional where clause expression that restricts
27
+ # filtering propagation to certain subset of rows. This allows to support
28
+ # polymorphic relationships, or STI.
29
+ f.filter_subtable(:email_preferences, foreign_key: user_id,
30
+ where: "type = 'User::Registered'")
31
+
32
+ # 'where' clause can be anything that sequel supports
33
+ f.filter_subtable(:email_preferences, foreign_key: user_id,
34
+ where: { type: 'User::Registered',
35
+ color: 'Red'})
31
36
 
32
37
  # If it feels more natural, you can define additional filters
33
38
  # within a filter_subtable definitition
@@ -113,31 +113,33 @@ module PgShrink
113
113
  end
114
114
 
115
115
  def propagate_delete(opts)
116
+
117
+ child_table = opts[:child_table]
118
+ parent_table = opts[:parent_table]
119
+ child_key = opts[:child_key]
120
+ parent_key = opts[:parent_key]
121
+ where_clause = opts[:where]
122
+
116
123
  # what we conceptually want to do is delete the left outer join where id is null.
117
124
  # That's not working in postgres, so we instead use where not exists. Docs
118
125
  # indicate using where not exists and select 1 in this case.
119
126
  # See:
120
127
  # http://www.postgresql.org/docs/current/interactive/functions-subquery.html#FUNCTIONS-SUBQUERY-EXISTS
121
- query = "DELETE FROM #{opts[:child_table]} WHERE NOT EXISTS (" +
122
- "SELECT 1 from #{opts[:parent_table]} where " +
123
- "#{opts[:child_table]}.#{opts[:child_key]} = " +
124
- "#{opts[:parent_table]}.#{opts[:parent_key]}" +
128
+ query = "DELETE FROM #{child_table} WHERE NOT EXISTS (" +
129
+ "SELECT 1 from #{parent_table} where " +
130
+ "#{child_table}.#{child_key} = " +
131
+ "#{parent_table}.#{parent_key}" +
125
132
  ")"
126
133
 
134
+ query_builder = connection.from(child_table)
135
+ query_builder = query_builder.where(where_clause) if where_clause
127
136
 
128
137
  # Outside of the join statements, we want to maintain the ease of hash-based
129
138
  # conditions. Do this by using a query builder but then swapping in delete SQL
130
139
  # in the end.
131
- query_builder = connection.from(opts[:child_table])
132
- Array.wrap(opts[:conditions]).compact.each do |cond|
133
- query_builder = query_builder.where(cond)
134
- end
135
- Array.wrap(opts[:exclude]).compact.each do |exclude_cond|
136
- query_builder = query_builder.exclude(exclude_cond)
137
- end
140
+
138
141
  sql = query_builder.sql.gsub("WHERE", "AND").
139
- gsub("SELECT * FROM \"#{opts[:child_table]}\"",
140
- query)
142
+ gsub("SELECT * FROM \"#{child_table}\"", query)
141
143
 
142
144
  connection[sql].delete
143
145
  end
@@ -4,42 +4,25 @@ module PgShrink
4
4
  def propagate_table!
5
5
  primary_key = @opts[:primary_key]
6
6
  foreign_key = @opts[:foreign_key]
7
- additional_conditions = {}
8
- if @opts[:type_key] && @opts[:type]
9
- additional_conditions[@opts[:type_key]] = @opts[:type]
10
- end
11
- self.database.log("Beginning subtable propagation from " +
7
+ where_clause = @opts[:where]
8
+
9
+ self.database.log('Beginning subtable propagation from ' +
12
10
  "#{self.parent.table_name} to #{self.table.table_name}")
13
- self.database.propagate_delete(:parent_table => self.parent.table_name,
14
- :child_table => self.table.table_name,
15
- :parent_key => primary_key,
16
- :child_key => foreign_key,
17
- :conditions => additional_conditions)
18
11
 
19
- self.database.log("Done with subtable propagation from " +
12
+ self.database.propagate_delete(parent_table: self.parent.table_name,
13
+ child_table: self.table.table_name,
14
+ parent_key: primary_key,
15
+ child_key: foreign_key,
16
+ where: where_clause)
17
+
18
+ self.database.log('Done with subtable propagation from ' +
20
19
  "#{self.parent.table_name} to #{self.table.table_name}")
20
+
21
21
  if self.table.subtable_filters.any?
22
22
  self.database.vacuum_and_reindex!(self.table.table_name)
23
23
  self.table.subtable_filters.each(&:propagate_table!)
24
24
  end
25
25
  end
26
26
 
27
- def propagate!(old_parent_data, new_parent_data)
28
- return if (old_parent_data.empty? && new_parent_data.empty?)
29
- old_batch_keys = old_parent_data.map {|record| record[@opts[:primary_key]]}
30
- new_batch_keys = new_parent_data.map {|record| record[@opts[:primary_key]]}
31
-
32
- foreign_key = @opts[:foreign_key]
33
- finder_options = {foreign_key => old_batch_keys}
34
- if @opts[:type_key] && @opts[:type]
35
- finder_options[@opts[:type_key]] = @opts[:type]
36
- end
37
-
38
- old_records = table.get_records(finder_options)
39
- table.filter_batch(old_records) do |record|
40
- new_batch_keys.include?(record[foreign_key])
41
- end
42
- end
43
-
44
27
  end
45
28
  end
@@ -2,9 +2,10 @@ module PgShrink
2
2
  class SubTableOperator
3
3
  attr_accessor :parent, :table_name, :database
4
4
  def default_opts
5
- {:foreign_key =>
5
+ {
6
+ :foreign_key =>
6
7
  "#{ActiveSupport::Inflector.singularize(parent.table_name.to_s)}_id",
7
- :primary_key => :id
8
+ :primary_key => :id
8
9
  }
9
10
  end
10
11
 
@@ -16,15 +17,6 @@ module PgShrink
16
17
  database.table(table_name)
17
18
  end
18
19
 
19
- def validate_opts!(opts)
20
- if opts[:type_key] && !opts[:type]
21
- raise "Error: #{name} has type_key set but no type"
22
- end
23
- if opts[:type] && !opts[:type_key]
24
- raise "Error: #{name} has type set but no type_key"
25
- end
26
- end
27
-
28
20
  def initialize(parent, table_name, opts = {})
29
21
  self.parent = parent
30
22
  self.table_name = table_name
@@ -34,6 +26,8 @@ module PgShrink
34
26
  validate_opts!(@opts)
35
27
  end
36
28
 
29
+ def validate_opts!(opts); end
30
+
37
31
  def propagate!(old_parent_data, new_parent_data)
38
32
  raise "Implement in subclass"
39
33
  end
@@ -15,9 +15,10 @@ module PgShrink
15
15
 
16
16
  foreign_key = @opts[:foreign_key]
17
17
  finder_options = {foreign_key => old_batch.keys}
18
- if @opts[:type_key] && @opts[:type]
19
- finder_options[@opts[:type_key]] = @opts[:type]
20
- end
18
+
19
+ # adding additional filters from where clause.
20
+ # TODO: support where clauses using non hash syntax (string, symbol)
21
+ finder_options.merge!(@opts[:where])
21
22
 
22
23
  parent_field = @opts[:local_field].to_sym
23
24
  child_field = @opts[:foreign_field].to_sym
@@ -1,3 +1,3 @@
1
1
  module PgShrink
2
- VERSION = "0.0.7"
2
+ VERSION = "0.1.0"
3
3
  end
data/pg_shrink.gemspec CHANGED
@@ -6,11 +6,11 @@ require 'pg_shrink/version'
6
6
  Gem::Specification.new do |spec|
7
7
  spec.name = 'pg_shrink'
8
8
  spec.version = PgShrink::VERSION
9
- spec.authors = ['Kevin Ball']
10
- spec.email = ['kmball11@gmail.com']
9
+ spec.authors = ['Kevin Ball', 'Matt Nemenman']
10
+ spec.email = ['kmball11@gmail.com', 'matt@apartmentlist.com']
11
11
  spec.description = 'pg_shrink makes it simple to shrink and sanitize a PosrgreSQL database'
12
12
  spec.summary = 'pg_shrink'
13
- spec.homepage = 'https://github.com/apartmentlist/pg-shrink'
13
+ spec.homepage = 'https://github.com/apartmentlist/pg_shrink'
14
14
  spec.license = 'MIT'
15
15
 
16
16
  spec.files = `git ls-files`.split($/)
@@ -8,29 +8,36 @@ describe PgShrink::Database::Postgres do
8
8
 
9
9
  before(:all) do
10
10
  PgSpecHelper.reset_database
11
+
12
+ # id column created implicitly
11
13
  PgSpecHelper.create_table(db.connection, :test_table,
12
- {'name' => 'character(128)', 'test' => 'integer'})
14
+ {'name' => 'character(128)', 'value' => 'integer'})
15
+
16
+ # id column created implicitly
17
+ PgSpecHelper.create_table(db.connection, :test_sub_table,
18
+ {'test_table_id' => 'integer', 'value' => 'character(128)', })
13
19
  end
14
20
 
15
21
  before(:each) do
16
22
  PgSpecHelper.clear_table(db.connection, :test_table)
23
+ PgSpecHelper.clear_table(db.connection, :test_sub_table)
17
24
  end
18
25
 
19
- context "A simple postgres database" do
20
- it "sets up a Sequel connection" do
26
+ context 'A simple postgres database' do
27
+ it 'sets up a Sequel connection' do
21
28
  expect(db.connection.class).to eq(Sequel::Postgres::Database)
22
29
  end
23
30
 
24
- context "with 20 simple records" do
31
+ context 'with 20 simple records' do
25
32
  before(:each) do
26
33
  (1..20).each do |i|
27
34
  db.connection.run(
28
- "insert into test_table (name, test) values ('test', #{i})"
35
+ "insert into test_table (name, value) values ('test', #{i})"
29
36
  )
30
37
  end
31
38
  end
32
39
 
33
- it "can fetch records in batches" do
40
+ it 'can fetch records in batches' do
34
41
  batch_sizes = []
35
42
  db.records_in_batches(:test_table) do |batch|
36
43
  batch_sizes << batch.size
@@ -38,29 +45,29 @@ describe PgShrink::Database::Postgres do
38
45
  expect(batch_sizes).to eq([5, 5, 5, 5])
39
46
  end
40
47
 
41
- it "throws an error if records change their primary keys during update" do
42
- old_records = db.connection["select * from test_table where test <= 5"].
48
+ it 'throws an error if records change their primary keys during update' do
49
+ old_records = db.connection['select * from test_table where value <= 5'].
43
50
  all
44
51
  new_records = old_records.map {|r| r.merge(:id => r[:id] * 10)}
45
52
  expect {db.update_records(:test_table, old_records, new_records)}.
46
53
  to raise_error
47
54
  end
48
55
 
49
- it "can delete records based on a condition" do
50
- db.delete_records(:test_table, {:test => 1..5})
56
+ it 'can delete records based on a condition' do
57
+ db.delete_records(:test_table, {:value => 1..5})
51
58
 
52
- results = db.connection["select * from test_table"].all
59
+ results = db.connection['select * from test_table'].all
53
60
  expect(results.size).to eq(15)
54
- expect(results.map {|r| r[:test]}).to match_array((6..20).to_a)
61
+ expect(results.map {|r| r[:value]}).to match_array((6..20).to_a)
55
62
  end
56
63
 
57
- it "can update records" do
58
- old_records = db.connection["select * from test_table where test <= 5"].
64
+ it 'can update records' do
65
+ old_records = db.connection['select * from test_table where value <= 5'].
59
66
  all
60
- new_records = old_records.map {|r| r.merge(:test => r[:test] * 10)}
67
+ new_records = old_records.map {|r| r.merge(:value => r[:value] * 10)}
61
68
  db.update_records(:test_table, old_records, new_records)
62
69
  expect(
63
- db.connection["select * from test_table where test <= 5"].all.size
70
+ db.connection['select * from test_table where value <= 5'].all.size
64
71
  ).to eq(0)
65
72
  updated_records = db.connection[:test_table].
66
73
  where(:id => old_records.map {|r| r[:id]}).all
@@ -68,41 +75,121 @@ describe PgShrink::Database::Postgres do
68
75
  expect(updated_records).to eq(new_records)
69
76
  end
70
77
 
71
- it "throws an error if you try to delete records in update" do
72
- old_records = db.connection["select * from test_table where test <= 5"].
78
+ it 'throws an error if you try to delete records in update' do
79
+ old_records = db.connection['select * from test_table where value <= 5'].
73
80
  all
74
81
  new_records = old_records.first(2)
75
82
  expect {db.update_records(:test_table, old_records, new_records)}.
76
83
  to raise_error
77
84
  end
78
85
 
79
- it "deletes the whole table" do
86
+ it 'deletes the whole table' do
80
87
  db.remove_table(:test_table)
81
88
  db.filter!
82
- expect(db.connection["select * from test_table"].all.size).to eq(0)
89
+ expect(db.connection['select * from test_table'].all.size).to eq(0)
83
90
  end
84
- describe "on a table with no primary key" do
91
+
92
+
93
+ describe 'on a table with no primary key' do
94
+
85
95
  before(:all) do
86
96
  PgSpecHelper.create_table(db.connection, :no_primary_key,
87
97
  {'name' => 'character(128)',
88
98
  'test' => 'integer'}, nil)
89
99
  end
100
+
90
101
  before(:each) do
102
+ PgSpecHelper.clear_table(db.connection, :no_primary_key)
91
103
  (1..20).each do |i|
92
104
  db.connection.run(
93
- "insert into no_primary_key (name, test) values ('test', #{i})"
94
- )
95
- end
96
-
105
+ "insert into no_primary_key (name, test) values ('test', #{i})")
106
+ end
97
107
  end
98
108
 
99
- it "can still remove the whole table" do
109
+ it 'can still remove the whole table' do
100
110
  db.remove_table(:no_primary_key, :primary_key => false)
101
111
  db.filter!
102
- expect(db.connection["select * from no_primary_key"].all.size).to eq(0)
112
+ expect(db.connection['select * from no_primary_key'].all.size).to eq(0)
103
113
 
104
- end
114
+ end
115
+
116
+ end
117
+
118
+ end
119
+ end
120
+
121
+ context 'A table and subtable' do
122
+
123
+ before(:each) do
124
+ table_values = [
125
+ [1, 'john'],
126
+ [2, 'chris'],
127
+ [3, 'matt'],
128
+ ]
129
+
130
+ sub_table_values = [
131
+ [1, 'john_value_1'],
132
+ [1, 'john_value_2'],
133
+
134
+ [2, 'chris_value_1'],
135
+
136
+ [3, 'matt_value_1'],
137
+ [3, 'matt_value_2'],
138
+ [3, 'matt_value_3'],
139
+ ]
140
+
141
+ table_values.each do |row|
142
+ db.connection.run(
143
+ "insert into test_table (id, name, value) values (#{row[0]}, '#{row[1]}', #{row[0]})")
144
+ end
145
+
146
+ sub_table_values.each do |row|
147
+ db.connection.run(
148
+ "insert into test_sub_table (test_table_id, value) values (#{row[0]}, '#{row[1]}')")
149
+ end
150
+ end
151
+
152
+ context 'delete' do
153
+
154
+ before(:each) do
155
+ db.connection.run(
156
+ "delete from test_table where name = 'matt'"
157
+ )
158
+ end
159
+
160
+ it 'propagates to subtable' do
161
+
162
+ db.propagate_delete(
163
+ parent_table: 'test_table',
164
+ child_table: 'test_sub_table',
165
+ parent_key: 'id',
166
+ child_key: 'test_table_id')
167
+
168
+ expect(db.connection['select * from test_sub_table where test_table_id = 3'].all.size).to eq(0)
169
+ end
170
+
171
+ it 'propagates to subtable honoring where restriction' do
172
+ db.propagate_delete(
173
+ parent_table: 'test_table',
174
+ child_table: 'test_sub_table',
175
+ parent_key: 'id',
176
+ child_key: 'test_table_id',
177
+ where: "value = 'matt_value_2'")
178
+
179
+ expect(db.connection['select * from test_sub_table where test_table_id = 3'].all.size).to eq(2)
105
180
  end
181
+
182
+ it 'propagates to subtable (nil where ignored)' do
183
+ db.propagate_delete(
184
+ parent_table: 'test_table',
185
+ child_table: 'test_sub_table',
186
+ parent_key: 'id',
187
+ child_key: 'test_table_id',
188
+ where: nil)
189
+
190
+ expect(db.connection['select * from test_sub_table where test_table_id = 3'].all.size).to eq(0)
191
+ end
192
+
106
193
  end
107
194
  end
108
195
  end
@@ -45,14 +45,10 @@ describe PgShrink::Table do
45
45
  end
46
46
  end
47
47
 
48
- context "when a subtable filter is specified" do
48
+ context "when any subtable filter is specified" do
49
49
  let(:database) {PgShrink::Database.new}
50
50
  let(:table) { PgShrink::Table.new(database, :test_table, :primary_key => false) }
51
51
 
52
- before(:each) do
53
- table.filter_subtable(:subtable)
54
- end
55
-
56
52
  it "yields back a table so additional manipulations can be made" do
57
53
  table.filter_subtable(:subtable) do |f|
58
54
  expect(f.class).to eq(PgShrink::Table)
@@ -61,10 +57,12 @@ describe PgShrink::Table do
61
57
  end
62
58
 
63
59
  it "adds subtable_filter to subtable_filters array" do
60
+ table.filter_subtable(:subtable)
64
61
  expect(table.subtable_filters.size).to eq(1)
65
62
  end
66
63
  end
67
64
 
65
+
68
66
  context "when a remove is specified" do
69
67
  let(:database) {PgShrink::Database.new}
70
68
  let(:table) { PgShrink::Table.new(database, :test_table) }
@@ -14,13 +14,13 @@ describe PgShrink do
14
14
  end
15
15
 
16
16
 
17
- it "should let you specify a different batch size" do
17
+ it 'should let you specify a different batch size' do
18
18
  opts = PgSpecHelper.pg_config.merge(:batch_size => 20000)
19
19
  db = PgShrink::Database::Postgres.new(opts)
20
20
  expect(db.batch_size).to eq(20000)
21
21
  end
22
22
 
23
- describe "simple foreign_key setup" do
23
+ describe 'simple foreign_key setup' do
24
24
  before(:all) do
25
25
  # Rspec doesn't want you using 'let' defined things in before(:all)
26
26
  connection = PgShrink::Database::Postgres.new(PgSpecHelper.pg_config).
@@ -35,9 +35,9 @@ describe PgShrink do
35
35
  end
36
36
 
37
37
 
38
- describe "simple two table filtering" do
38
+ describe 'simple two table filtering' do
39
39
 
40
- describe "with 20 users and associated preferences" do
40
+ describe 'with 20 users and associated preferences' do
41
41
  before(:each) do
42
42
  PgSpecHelper.clear_table(database.connection, :users)
43
43
  PgSpecHelper.clear_table(database.connection, :user_preferences)
@@ -53,24 +53,24 @@ describe PgShrink do
53
53
  end
54
54
  end
55
55
  end
56
- describe "with a conditions string" do
56
+ describe 'with a conditions string' do
57
57
  before(:each) do
58
58
  database.filter_table(:users) do |f|
59
59
  f.filter_by("name like '%test 1%'")
60
60
  end
61
61
  end
62
62
 
63
- it "Should not call records in batches" do
63
+ it 'Should not call records in batches' do
64
64
  expect(database).not_to receive(:records_in_batches)
65
65
  database.shrink!
66
66
  end
67
67
 
68
- it "Should call delete_records once" do
68
+ it 'Should call delete_records once' do
69
69
  expect(database).to receive(:delete_records).once
70
70
  database.shrink!
71
71
  end
72
72
 
73
- it "Should result in the appropriate records being deleted" do
73
+ it 'Should result in the appropriate records being deleted' do
74
74
  database.shrink!
75
75
  remaining_users = database.connection.from(:users).all
76
76
  # 1 and 10-19
@@ -78,7 +78,7 @@ describe PgShrink do
78
78
  end
79
79
  end
80
80
 
81
- describe "when filtering just with a conditions hash" do
81
+ describe 'when filtering just with a conditions hash' do
82
82
  before(:each) do
83
83
  database.filter_table(:users) do |f|
84
84
  f.filter_by({
@@ -88,30 +88,30 @@ describe PgShrink do
88
88
  end
89
89
  end
90
90
 
91
- it "Should not call records in batches" do
91
+ it 'Should not call records in batches' do
92
92
  expect(database).not_to receive(:records_in_batches)
93
93
  database.shrink!
94
94
  end
95
95
 
96
- it "Should call delete_records once" do
96
+ it 'Should call delete_records once' do
97
97
  expect(database).to receive(:delete_records).once
98
98
  database.shrink!
99
99
  end
100
100
 
101
- it "Should result in the appropriate records being deleted" do
101
+ it 'Should result in the appropriate records being deleted' do
102
102
  database.shrink!
103
103
  remaining_users = database.connection.from(:users).all
104
104
  expect(remaining_users.size).to eq(10)
105
105
  end
106
106
 
107
- describe "with a subtable_filter" do
107
+ describe 'with a subtable_filter' do
108
108
  before(:each) do
109
109
  database.filter_table(:users) do |f|
110
110
  f.filter_subtable(:user_preferences, :foreign_key => :user_id)
111
111
  end
112
112
  end
113
113
 
114
- it "should remove the appropriate subtable records" do
114
+ it 'should remove the appropriate subtable records' do
115
115
  database.shrink!
116
116
  remaining_prefs = database.connection.from(:user_preferences).all
117
117
  expect(remaining_prefs.size).to eq(30)
@@ -119,11 +119,11 @@ describe PgShrink do
119
119
  end
120
120
  end
121
121
 
122
- describe "with a test shrinkfile" do
122
+ describe 'with a test shrinkfile' do
123
123
  let(:shrinkfile) {"spec/Shrinkfile.basic"}
124
124
  let(:url) {database.connection_string}
125
125
 
126
- it "should set up a postgres database" do
126
+ it 'should set up a postgres database' do
127
127
  expect(PgShrink::Database::Postgres).to receive(:new) do |opts|
128
128
  expect(opts[:postgres_url]).to eq(database.connection_string)
129
129
  end.and_return(database)
@@ -132,7 +132,7 @@ describe PgShrink do
132
132
  end
133
133
 
134
134
 
135
- describe "a simple filter and subtable" do
135
+ describe 'a simple filter and subtable' do
136
136
  before(:each) do
137
137
  database.filter_table(:users) do |f|
138
138
  f.filter_by "name = 'test 1'"
@@ -141,12 +141,12 @@ describe PgShrink do
141
141
  database.filter!
142
142
  end
143
143
 
144
- it "will filter users down to the one matching" do
144
+ it 'will filter users down to the one matching' do
145
145
  remaining_users = database.connection.from(:users).all
146
146
  expect(remaining_users.size).to eq(1)
147
147
  end
148
148
 
149
- it "will filter preferences to only those associated with the user" do
149
+ it 'will filter preferences to only those associated with the user' do
150
150
  remaining_user = database.connection.from(:users).first
151
151
  remaining_preferences = database.connection.
152
152
  from(:user_preferences).all
@@ -156,7 +156,7 @@ describe PgShrink do
156
156
  end
157
157
  end
158
158
 
159
- describe "a simple filter and subtable with sanitization on each" do
159
+ describe 'a simple filter and subtable with sanitization on each' do
160
160
 
161
161
  before(:each) do
162
162
  database.filter_table(:users) do |f|
@@ -179,14 +179,14 @@ describe PgShrink do
179
179
  database.shrink!
180
180
  end
181
181
 
182
- it "should result in 1 sanitized users" do
182
+ it 'should result in 1 sanitized users' do
183
183
  remaining_users = database.connection.from(:users).all
184
184
  expect(remaining_users.size).to eq(1)
185
185
  expect(remaining_users.first[:name]).to match(/sanitized/)
186
186
  expect(remaining_users.first[:email]).to match(/blank_email/)
187
187
  end
188
188
 
189
- it "should result in 3 sanitized preferences" do
189
+ it 'should result in 3 sanitized preferences' do
190
190
  remaining_user = database.connection.from(:users).first
191
191
  remaining_preferences = database.connection.
192
192
  from(:user_preferences).all
@@ -197,7 +197,7 @@ describe PgShrink do
197
197
  end
198
198
  end
199
199
  end
200
- describe "with users and preferences including email as value" do
200
+ describe 'with users and preferences including email as value' do
201
201
  before(:each) do
202
202
  PgSpecHelper.clear_table(database.connection, :users)
203
203
  PgSpecHelper.clear_table(database.connection, :user_preferences)
@@ -216,7 +216,7 @@ describe PgShrink do
216
216
  end
217
217
  end
218
218
 
219
- describe "sanitizing subtable" do
219
+ describe 'sanitizing subtable' do
220
220
  before(:each) do
221
221
  database.filter_table(:users) do |f|
222
222
  f.sanitize do |u|
@@ -227,19 +227,18 @@ describe PgShrink do
227
227
  :foreign_key => :user_id,
228
228
  :local_field => :email,
229
229
  :foreign_field => :value,
230
- :type_key => :name,
231
- :type => 'email')
230
+ :where => { :name => 'email' })
232
231
  end
233
232
  database.shrink!
234
233
  end
235
234
 
236
- it "should sanitize user preference emails" do
235
+ it 'should sanitize user preference emails' do
237
236
  remaining_preferences = database.connection.
238
237
  from(:user_preferences).where(:name => 'email').all
239
238
  remaining_values = remaining_preferences.map {|p| p[:value]}
240
239
  expect(remaining_values.grep(/blank_email/).size).to eq(20)
241
240
  end
242
- it "should not sanitize preferences with a different type" do
241
+ it 'should not sanitize preferences with a different type' do
243
242
  remaining_preferences = database.connection.
244
243
  from(:user_preferences).where(:name => 'name').all
245
244
  remaining_values = remaining_preferences.map {|p| p[:value]}
@@ -250,7 +249,7 @@ describe PgShrink do
250
249
  end
251
250
 
252
251
 
253
- describe "three table filter chain" do
252
+ describe 'three table filter chain' do
254
253
  before(:all) do
255
254
  # Rspec doesn't want you using 'let' defined things in before(:all)
256
255
  connection = PgShrink::Database::Postgres.new(PgSpecHelper.pg_config).
@@ -260,7 +259,7 @@ describe PgShrink do
260
259
  'character varying(256)'})
261
260
  end
262
261
 
263
- describe "with 20 users and associated preferences" do
262
+ describe 'with 20 users and associated preferences' do
264
263
  before(:each) do
265
264
  PgSpecHelper.clear_table(database.connection, :users)
266
265
  PgSpecHelper.clear_table(database.connection, :user_preferences)
@@ -288,7 +287,7 @@ describe PgShrink do
288
287
  end
289
288
  end
290
289
 
291
- describe "a simple filter and chained subtables" do
290
+ describe 'a simple filter and chained subtables' do
292
291
  before(:each) do
293
292
  database.filter_table(:users) do |f|
294
293
  f.filter_by "name = 'test 1'"
@@ -301,11 +300,11 @@ describe PgShrink do
301
300
 
302
301
  database.filter!
303
302
  end
304
- it "filters users down to the one matching" do
303
+ it 'filters users down to the one matching' do
305
304
  remaining_users = database.connection.from(:users).all
306
305
  expect(remaining_users.size).to eq(1)
307
306
  end
308
- it "filters preferences to only those associated with the user" do
307
+ it 'filters preferences to only those associated with the user' do
309
308
  remaining_user = database.connection.from(:users).first
310
309
  remaining_preferences = database.connection.
311
310
  from(:user_preferences).all
@@ -313,8 +312,8 @@ describe PgShrink do
313
312
  expect(remaining_preferences.map {|u| u[:user_id]}.uniq).
314
313
  to eq([remaining_user[:id]])
315
314
  end
316
- it "filters preference values to those associated with the " +
317
- "preferences remaining" do
315
+ it 'filters preference values to those associated with the ' +
316
+ 'preferences remaining' do
318
317
  remaining_user = database.connection.from(:users).first
319
318
  remaining_preferences = database.connection.
320
319
  from(:user_preferences).all
@@ -329,7 +328,7 @@ describe PgShrink do
329
328
  end
330
329
  end
331
330
  end
332
- describe "polymorphic foreign key subtables" do
331
+ describe 'polymorphic foreign key subtables' do
333
332
  before(:all) do
334
333
  # Rspec doesn't want you using 'let' defined things in before(:all)
335
334
  connection = PgShrink::Database::Postgres.new(PgSpecHelper.pg_config).
@@ -343,7 +342,7 @@ describe PgShrink do
343
342
  'name' => 'character varying(256)',
344
343
  'value' => 'character varying(256)'})
345
344
  end
346
- describe "with 20 users, associated prefs, and prefs for different type" do
345
+ describe 'with 20 users, associated prefs, and prefs for different type' do
347
346
  before(:each) do
348
347
  PgSpecHelper.clear_table(database.connection, :users)
349
348
  PgSpecHelper.clear_table(database.connection, :preferences)
@@ -363,17 +362,17 @@ describe PgShrink do
363
362
  end
364
363
  end
365
364
 
366
- describe "with condition filters" do
367
- describe "simple cascade" do
365
+ describe 'with condition filters' do
366
+ describe 'simple cascade' do
368
367
  before(:each) do
369
368
  database.filter_table(:users) do |f|
370
- f.filter_by(:name => "test 1")
371
- f.filter_subtable(:preferences, :foreign_key => :context_id,
372
- :type_key => :context_type, :type => 'User')
369
+ f.filter_by(name: 'test 1')
370
+ f.filter_subtable(:preferences, foreign_key: :context_id,
371
+ where: { context_type: 'User' } )
373
372
  end
374
373
  database.filter!
375
374
  end
376
- it "will filter prefs with context_type 'User'" do
375
+ it 'will filter prefs with context_type User' do
377
376
  #
378
377
  remaining_user = database.connection.from(:users).first
379
378
  remaining_preferences = database.connection.from(:preferences).
@@ -383,13 +382,13 @@ describe PgShrink do
383
382
  to eq([remaining_user[:id]])
384
383
  end
385
384
 
386
- it "will not filter preferences without context_type user" do
385
+ it 'will not filter preferences without context_type user' do
387
386
  remaining_preferences = database.connection.from(:preferences).
388
387
  where(:context_type => 'OtherClass').all
389
388
  expect(remaining_preferences.size).to eq(20)
390
389
  end
391
390
  end
392
- describe "an extra layer of polymorphic subtables" do
391
+ describe 'an extra layer of polymorphic subtables' do
393
392
  before(:all) do
394
393
  connection = PgShrink::Database::Postgres.new(PgSpecHelper.pg_config).
395
394
  connection
@@ -416,20 +415,19 @@ describe PgShrink do
416
415
  end
417
416
 
418
417
  database.filter_table(:users) do |f|
419
- f.filter_by(:name => "test 1")
420
- f.filter_subtable(:preferences, :foreign_key => :context_id,
421
- :type_key => :context_type, :type => 'User')
418
+ f.filter_by(name: 'test 1')
419
+ f.filter_subtable(:preferences, foreign_key: :context_id,
420
+ where: { context_type: 'User' } )
422
421
  end
423
422
 
424
423
  database.filter_table(:preferences) do |f|
425
424
  f.filter_subtable(:preference_dependents,
426
- :foreign_key => :context_id,
427
- :type_key => :context_type,
428
- :type => 'Preference')
425
+ foreign_key: :context_id,
426
+ where: { context_type: 'Preference' })
429
427
  end
430
428
  database.filter!
431
429
  end
432
- it "will filter preference dependents associated with preferences" do
430
+ it 'will filter preference dependents associated with preferences' do
433
431
  remaining_preferences = database.connection.from(:preferences).all
434
432
  remaining_dependents = database.connection.
435
433
  from(:preference_dependents).
@@ -438,7 +436,7 @@ describe PgShrink do
438
436
  expect(remaining_dependents.size).to eq(remaining_preferences.size)
439
437
  end
440
438
 
441
- it "will not filter preference dependents with different type" do
439
+ it 'will not filter preference dependents with different type' do
442
440
  other_dependents = database.connection.
443
441
  from(:preference_dependents).
444
442
  where(:context_type => 'SomeOtherClass').all
@@ -447,17 +445,17 @@ describe PgShrink do
447
445
  end
448
446
  end
449
447
 
450
- describe "simple two table filtering" do
448
+ describe 'simple two table filtering' do
451
449
  before(:each) do
452
450
  database.filter_table(:users) do |f|
453
451
  f.filter_by "name = 'test 1'"
454
- f.filter_subtable(:preferences, :foreign_key => :context_id,
455
- :type_key => :context_type, :type => 'User')
452
+ f.filter_subtable(:preferences, foreign_key: :context_id,
453
+ where: {context_type: 'User'})
456
454
  end
457
455
  database.filter!
458
456
  end
459
457
 
460
- it "will filter prefs with context_type 'User'" do
458
+ it 'will filter prefs with context_type User' do
461
459
  remaining_user = database.connection.from(:users).first
462
460
  remaining_preferences = database.connection.from(:preferences).
463
461
  where(:context_type => 'User').all
@@ -466,14 +464,14 @@ describe PgShrink do
466
464
  to eq([remaining_user[:id]])
467
465
  end
468
466
 
469
- it "will not filter preferences without context_type user" do
467
+ it 'will not filter preferences without context_type user' do
470
468
  remaining_preferences = database.connection.from(:preferences).
471
469
  where(:context_type => 'OtherClass').all
472
470
  expect(remaining_preferences.size).to eq(20)
473
471
  end
474
472
  end
475
473
 
476
- describe "an extra layer of polymorphic subtables" do
474
+ describe 'an extra layer of polymorphic subtables' do
477
475
  before(:all) do
478
476
  connection = PgShrink::Database::Postgres.new(PgSpecHelper.pg_config).
479
477
  connection
@@ -501,20 +499,19 @@ describe PgShrink do
501
499
 
502
500
  database.filter_table(:users) do |f|
503
501
  f.filter_by "name = 'test 1'"
504
- f.filter_subtable(:preferences, :foreign_key => :context_id,
505
- :type_key => :context_type, :type => 'User')
502
+ f.filter_subtable(:preferences, foreign_key: :context_id,
503
+ where: {context_type: 'User'} )
506
504
  end
507
505
 
508
506
  database.filter_table(:preferences) do |f|
509
507
  f.filter_subtable(:preference_dependents,
510
- :foreign_key => :context_id,
511
- :type_key => :context_type,
512
- :type => 'Preference')
508
+ foreign_key: :context_id,
509
+ where: {context_type: 'Preference'} )
513
510
  end
514
511
  database.filter!
515
512
  end
516
513
 
517
- it "will filter preference dependents associated with preferences" do
514
+ it 'will filter preference dependents associated with preferences' do
518
515
  remaining_preferences = database.connection.from(:preferences).all
519
516
  remaining_dependents = database.connection.
520
517
  from(:preference_dependents).
@@ -523,7 +520,7 @@ describe PgShrink do
523
520
  expect(remaining_dependents.size).to eq(remaining_preferences.size)
524
521
  end
525
522
 
526
- it "will not filter preference dependents with different type" do
523
+ it 'will not filter preference dependents with different type' do
527
524
  other_dependents = database.connection.
528
525
  from(:preference_dependents).
529
526
  where(:context_type => 'SomeOtherClass').all
@@ -532,7 +529,7 @@ describe PgShrink do
532
529
  end
533
530
  end
534
531
  end
535
- describe "has_and_belongs_to_many join tables" do
532
+ describe 'has_and_belongs_to_many join tables' do
536
533
  before(:all) do
537
534
  # Rspec doesn't want you using 'let' defined things in before(;all)
538
535
  connection = PgShrink::Database::Postgres.new(PgSpecHelper.pg_config).
@@ -547,7 +544,7 @@ describe PgShrink do
547
544
  {'name' => 'character varying(256)'})
548
545
  end
549
546
 
550
- describe "with 5 users, each with 2 apartments, and 1 apartment shared by all 5" do
547
+ describe 'with 5 users, each with 2 apartments, and 1 apartment shared by all 5' do
551
548
  before(:each) do
552
549
  PgSpecHelper.clear_table(database.connection, :users)
553
550
  PgSpecHelper.clear_table(database.connection, :apartments_users)
@@ -572,7 +569,7 @@ describe PgShrink do
572
569
  end
573
570
  end
574
571
  end
575
- describe "With a simple cascading filter" do
572
+ describe 'With a simple cascading filter' do
576
573
  before(:each) do
577
574
  database.filter_table(:users) do |f|
578
575
  f.filter_by "name = 'test 1'"
@@ -586,13 +583,13 @@ describe PgShrink do
586
583
  database.shrink!
587
584
  end
588
585
 
589
- it "Should filter down apartments_users" do
586
+ it 'Should filter down apartments_users' do
590
587
  u = database.connection.from(:users).where(:name => "test 1").first
591
588
  remaining_join_table = database.connection.from(:apartments_users).all
592
589
  expect(remaining_join_table.size).to eq(3)
593
590
  end
594
591
 
595
- it "Should filter apartments as well" do
592
+ it 'Should filter apartments as well' do
596
593
  remaining_join_table = database.connection.from(:apartments_users).all
597
594
  remaining_apartments = database.connection.from(:apartments).all
598
595
  expect(remaining_apartments.size).to eq(3)
metadata CHANGED
@@ -1,14 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pg_shrink
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kevin Ball
8
+ - Matt Nemenman
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2014-06-27 00:00:00.000000000 Z
12
+ date: 2014-07-10 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: pg
@@ -195,6 +196,7 @@ dependencies:
195
196
  description: pg_shrink makes it simple to shrink and sanitize a PosrgreSQL database
196
197
  email:
197
198
  - kmball11@gmail.com
199
+ - matt@apartmentlist.com
198
200
  executables:
199
201
  - pg_shrink
200
202
  extensions: []
@@ -229,7 +231,7 @@ files:
229
231
  - spec/pg_shrink_spec.rb
230
232
  - spec/pg_spec_helper.rb
231
233
  - spec/spec_helper.rb
232
- homepage: https://github.com/apartmentlist/pg-shrink
234
+ homepage: https://github.com/apartmentlist/pg_shrink
233
235
  licenses:
234
236
  - MIT
235
237
  metadata: {}