postshift 0.1.2 → 0.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7af1b26becc44790eac020ebecc177aab32d7898
4
- data.tar.gz: 7a2c30a03280b549744a963839a1f9faf0f0ca0b
3
+ metadata.gz: e91aea35f8015bd2dd96fdc881a749296153c051
4
+ data.tar.gz: 035a9e661aea4d78da25d6cc93febc05278fd766
5
5
  SHA512:
6
- metadata.gz: 3dff95ff03d7f68c7c32255a671d7dbc96da14f39692b19c504acdbe049121586b24e7906c37a34510df549905a7894115a568e059b5d1f5fdec8c5ef07a3f7c
7
- data.tar.gz: a7d61ba62cbe47d2486bb946a6621729e06f8b0ca0722652fee4882b13ee651a83fc16f62106575829e318ea046d275400d406cdfb6f9c0fb6e6639bdd06d20b
6
+ metadata.gz: 1f7b617a18904e274f57cbb73a75d2da9ccf48a225dd242729b8ce44caf278fd46aaf076864a139c4f14817f071c36c9b5faa73309541c9a299e026ff51ba996
7
+ data.tar.gz: 293edceeacae0d92e9b6e9d26b41807ffcb750cc48f78b18909dca5aa971895d37defc4a6843f0f525ad17c1029736f1b715f80e0c2ae9da91d8f44f8e082484
data/README.md CHANGED
@@ -67,6 +67,25 @@ end
67
67
  For more information on compression types:
68
68
  <http://docs.aws.amazon.com/redshift/latest/dg/c_Compression_encodings.html>
69
69
 
70
+ ## Schema Dump
71
+
72
+ Several Rake tasks exist to help with performing a schema dump of an existing Redshift database. These utilize the [admin scripts provided by Amazon](https://github.com/awslabs/amazon-redshift-utils/tree/master/src/AdminViews). All actions are performed using `ActiveRecord::Base.connection` by default.
73
+
74
+ These views **must** exist within the Redshift database under the **admin** schema prior to any _dump_ or _restore_ actions. To generate, simple run:
75
+
76
+ ```
77
+ rake postshift:schema:prepare
78
+ ```
79
+
80
+ Once these views are in place, the _dump_ and _restore_ will be available and functional.
81
+
82
+
83
+ ```
84
+ rake postshift:schema:dump
85
+ rake postshift:schema:restore
86
+ ```
87
+
88
+
70
89
  ## Development
71
90
 
72
91
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
@@ -1,5 +1,18 @@
1
1
  require 'postshift/version'
2
+ require 'postshift/railtie' if defined?(Rails)
3
+ require 'postshift/schema'
4
+ require 'active_support'
5
+ require 'active_support/core_ext/module/attribute_accessors_per_thread'
2
6
  require 'active_record/connection_adapters/redshift_adapter'
3
7
 
4
8
  module Postshift
9
+ thread_mattr_accessor :adapter
10
+
11
+ def self.root
12
+ File.dirname __dir__
13
+ end
14
+
15
+ def self.connection
16
+ adapter.respond_to?(:raw_connection) ? adapter.raw_connection : nil
17
+ end
5
18
  end
@@ -0,0 +1,5 @@
1
+ class Postshift::Railtie < Rails::Railtie
2
+ rake_tasks do
3
+ load 'tasks/schema.rake'
4
+ end
5
+ end
@@ -0,0 +1,100 @@
1
+ module Postshift
2
+ module Schema
3
+ FILENAME = 'postshift_schema.sql'.freeze
4
+ ADMIN_UTILITIES = %w(v_generate_tbl_ddl v_generate_view_ddl).freeze
5
+
6
+ def self.ensure_admin_schema
7
+ Postshift.connection.exec('CREATE SCHEMA IF NOT EXISTS admin')
8
+ end
9
+
10
+ def self.create_admin_utilities!
11
+ ensure_admin_schema
12
+ ADMIN_UTILITIES.each do |table_name|
13
+ Postshift.connection.exec(generate_ddl_sql(table_name))
14
+ end
15
+ end
16
+
17
+ def self.remove_admin_utilities!
18
+ ensure_admin_schema
19
+ ADMIN_UTILITIES.each do |table_name|
20
+ Postshift.connection.exec("DROP VIEW IF EXISTS admin.#{table_name}")
21
+ end
22
+ end
23
+
24
+ def self.admin_uilities_exists?
25
+ ensure_admin_schema
26
+ ADMIN_UTILITIES.each do |table_name|
27
+ Postshift.connection.exec("SELECT 'admin.#{table_name}'::regclass;")
28
+ end
29
+ true
30
+ rescue PG::UndefinedTable
31
+ false
32
+ end
33
+
34
+ def self.generate_ddl_sql(table_name)
35
+ path = File.join(Postshift.root, 'lib', 'tasks', "#{table_name}.sql")
36
+ File.open(path).read
37
+ end
38
+
39
+ def self.dump
40
+ File.open(output_location, 'w+') do |file|
41
+ ddl_results(tbl_ddl_sql).each_row do |row|
42
+ file.puts(row)
43
+ end
44
+ ddl_results(view_ddl_sql).each_row do |row|
45
+ file.puts(row)
46
+ end
47
+ end
48
+ end
49
+
50
+ def self.dump_sql
51
+ if File.exist?(output_location)
52
+ File.read(output_location)
53
+ else
54
+ puts 'Postshift Schema Dump file does not exist. Run task postshift:schema:dump'
55
+ false
56
+ end
57
+ end
58
+
59
+ def self.restore
60
+ sql = dump_sql
61
+ Postshift.connection.exec(sql) if sql.present?
62
+ end
63
+
64
+ def self.ddl_results(ddl_sql)
65
+ Postshift.connection.exec(ddl_sql, schemas)
66
+ end
67
+
68
+ def self.output_location
69
+ if defined?(Rails)
70
+ File.join(Rails.root, 'db', FILENAME)
71
+ else
72
+ base_path = File.join(Postshift.root, 'tmp')
73
+ Dir.mkdir(base_path) unless Dir.exist?(base_path)
74
+ File.join(base_path, FILENAME)
75
+ end
76
+ end
77
+
78
+ def self.schemas
79
+ %w(public)
80
+ end
81
+
82
+ def self.tbl_ddl_sql
83
+ <<-SQL
84
+ SELECT ddl
85
+ FROM admin.v_generate_tbl_ddl
86
+ WHERE schemaname IN ($1)
87
+ ORDER BY tablename ASC, seq ASC
88
+ SQL
89
+ end
90
+
91
+ def self.view_ddl_sql
92
+ <<-SQL
93
+ SELECT ddl
94
+ FROM admin.v_generate_view_ddl
95
+ WHERE schemaname IN ($1)
96
+ ORDER BY viewname ASC
97
+ SQL
98
+ end
99
+ end
100
+ end
@@ -1,3 +1,3 @@
1
1
  module Postshift
2
- VERSION = '0.1.2'
2
+ VERSION = '0.2.0'
3
3
  end
@@ -0,0 +1,28 @@
1
+ namespace :postshift do
2
+ namespace :schema do
3
+ task connect: :environment do
4
+ Postshift.adapter = ActiveRecord::Base.connection
5
+ end
6
+
7
+ desc 'Prepare Redshift instance for Schema Exports'
8
+ task prepare: :connect do
9
+ puts '*** Creating Admin Utilities ***'
10
+ Postshift::Schema.create_admin_utilities!
11
+ puts '*** Finished Creating Admin Utilities ***'
12
+ end
13
+
14
+ desc 'Creates a db/postshift_schema.sql file for Redshift databases'
15
+ task dump: :connect do
16
+ puts '*** Starting Postshift Schema Dump ***'
17
+ Postshift::Schema.dump
18
+ puts '*** Completed Postshift Schema Dump ***'
19
+ end
20
+
21
+ desc 'Restores db/postshift_schema.sql file to Redshift database'
22
+ task restore: :connect do
23
+ puts '*** Starting Postshift Schema Restore ***'
24
+ Postshift::Schema.restore
25
+ puts '*** Completed Postshift Schema Restore ***'
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,254 @@
1
+ --DROP VIEW admin.v_generate_tbl_ddl;
2
+ /**********************************************************************************************
3
+ Purpose: View to get the DDL for a table. This will contain the distkey, sortkey, constraints,
4
+ not null, defaults, etc.
5
+
6
+ Notes: Default view ordering causes foreign keys to be created at the end.
7
+ This is needed due to dependencies of the foreign key constraint and the tables it
8
+ links. Due to this one should not manually order the output if you are expecting to
9
+ be able to replay the SQL directly from the VIEW query result. It is still possible to
10
+ order if you filter out the FOREIGN KEYS and then apply them later.
11
+
12
+ The following filters are useful:
13
+ where ddl not like 'ALTER TABLE %' -- do not return FOREIGN KEY CONSTRAINTS
14
+ where ddl like 'ALTER TABLE %' -- only get FOREIGN KEY CONSTRAINTS
15
+ where tablename in ('t1', 't2') -- only get DDL for specific tables
16
+ where schemaname in ('s1', 's2') -- only get DDL for specific schemas
17
+
18
+ So for example if you want to order DDL on tablename and only want the tables 't1', 't2'
19
+ and 't4' you can do so by using a query like:
20
+ select ddl from (
21
+ (
22
+ select
23
+ *
24
+ from admin.v_generate_tbl_ddl
25
+ where ddl not like 'ALTER TABLE %'
26
+ order by tablename
27
+ )
28
+ UNION ALL
29
+ (
30
+ select
31
+ *
32
+ from admin.v_generate_tbl_ddl
33
+ where ddl like 'ALTER TABLE %'
34
+ order by tablename
35
+ )
36
+ ) where tablename in ('t1', 't2', 't4');
37
+
38
+ History:
39
+ 2014-02-10 jjschmit Created
40
+ 2015-05-18 ericfe Added support for Interleaved sortkey
41
+ 2015-10-31 ericfe Added cast tp increase size of returning constraint name
42
+ 2016-05-24 chriz-bigdata Added support for BACKUP NO tables
43
+ 2017-05-03 pvbouwel Change table & schemaname of Foreign key constraints to allow for filters
44
+ **********************************************************************************************/
45
+ CREATE OR REPLACE VIEW admin.v_generate_tbl_ddl
46
+ AS
47
+ SELECT
48
+ REGEXP_REPLACE (schemaname, '^zzzzzzzz', '') AS schemaname
49
+ ,REGEXP_REPLACE (tablename, '^zzzzzzzz', '') AS tablename
50
+ ,seq
51
+ ,ddl
52
+ FROM
53
+ (
54
+ SELECT
55
+ schemaname
56
+ ,tablename
57
+ ,seq
58
+ ,ddl
59
+ FROM
60
+ (
61
+ --DROP TABLE
62
+ SELECT
63
+ n.nspname AS schemaname
64
+ ,c.relname AS tablename
65
+ ,0 AS seq
66
+ ,'--DROP TABLE "' + n.nspname + '"."' + c.relname + '";' AS ddl
67
+ FROM pg_namespace AS n
68
+ INNER JOIN pg_class AS c ON n.oid = c.relnamespace
69
+ WHERE c.relkind = 'r'
70
+ --CREATE TABLE
71
+ UNION SELECT
72
+ n.nspname AS schemaname
73
+ ,c.relname AS tablename
74
+ ,2 AS seq
75
+ ,'CREATE TABLE IF NOT EXISTS "' + n.nspname + '"."' + c.relname + '"' AS ddl
76
+ FROM pg_namespace AS n
77
+ INNER JOIN pg_class AS c ON n.oid = c.relnamespace
78
+ WHERE c.relkind = 'r'
79
+ --OPEN PAREN COLUMN LIST
80
+ UNION SELECT n.nspname AS schemaname, c.relname AS tablename, 5 AS seq, '(' AS ddl
81
+ FROM pg_namespace AS n
82
+ INNER JOIN pg_class AS c ON n.oid = c.relnamespace
83
+ WHERE c.relkind = 'r'
84
+ --COLUMN LIST
85
+ UNION SELECT
86
+ schemaname
87
+ ,tablename
88
+ ,seq
89
+ ,'\t' + col_delim + col_name + ' ' + col_datatype + ' ' + col_nullable + ' ' + col_default + ' ' + col_encoding AS ddl
90
+ FROM
91
+ (
92
+ SELECT
93
+ n.nspname AS schemaname
94
+ ,c.relname AS tablename
95
+ ,100000000 + a.attnum AS seq
96
+ ,CASE WHEN a.attnum > 1 THEN ',' ELSE '' END AS col_delim
97
+ ,'"' + a.attname + '"' AS col_name
98
+ ,CASE WHEN STRPOS(UPPER(format_type(a.atttypid, a.atttypmod)), 'CHARACTER VARYING') > 0
99
+ THEN REPLACE(UPPER(format_type(a.atttypid, a.atttypmod)), 'CHARACTER VARYING', 'VARCHAR')
100
+ WHEN STRPOS(UPPER(format_type(a.atttypid, a.atttypmod)), 'CHARACTER') > 0
101
+ THEN REPLACE(UPPER(format_type(a.atttypid, a.atttypmod)), 'CHARACTER', 'CHAR')
102
+ ELSE UPPER(format_type(a.atttypid, a.atttypmod))
103
+ END AS col_datatype
104
+ ,CASE WHEN format_encoding((a.attencodingtype)::integer) = 'none'
105
+ THEN ''
106
+ ELSE 'ENCODE ' + format_encoding((a.attencodingtype)::integer)
107
+ END AS col_encoding
108
+ ,CASE WHEN a.atthasdef IS TRUE THEN 'DEFAULT ' + adef.adsrc ELSE '' END AS col_default
109
+ ,CASE WHEN a.attnotnull IS TRUE THEN 'NOT NULL' ELSE '' END AS col_nullable
110
+ FROM pg_namespace AS n
111
+ INNER JOIN pg_class AS c ON n.oid = c.relnamespace
112
+ INNER JOIN pg_attribute AS a ON c.oid = a.attrelid
113
+ LEFT OUTER JOIN pg_attrdef AS adef ON a.attrelid = adef.adrelid AND a.attnum = adef.adnum
114
+ WHERE c.relkind = 'r'
115
+ AND a.attnum > 0
116
+ ORDER BY a.attnum
117
+ )
118
+ --CONSTRAINT LIST
119
+ UNION (SELECT
120
+ n.nspname AS schemaname
121
+ ,c.relname AS tablename
122
+ ,200000000 + CAST(con.oid AS INT) AS seq
123
+ ,'\t,' + pg_get_constraintdef(con.oid) AS ddl
124
+ FROM pg_constraint AS con
125
+ INNER JOIN pg_class AS c ON c.relnamespace = con.connamespace AND c.oid = con.conrelid
126
+ INNER JOIN pg_namespace AS n ON n.oid = c.relnamespace
127
+ WHERE c.relkind = 'r' AND pg_get_constraintdef(con.oid) NOT LIKE 'FOREIGN KEY%'
128
+ ORDER BY seq)
129
+ --CLOSE PAREN COLUMN LIST
130
+ UNION SELECT n.nspname AS schemaname, c.relname AS tablename, 299999999 AS seq, ')' AS ddl
131
+ FROM pg_namespace AS n
132
+ INNER JOIN pg_class AS c ON n.oid = c.relnamespace
133
+ WHERE c.relkind = 'r'
134
+ --BACKUP
135
+ UNION SELECT
136
+ n.nspname AS schemaname
137
+ ,c.relname AS tablename
138
+ ,300000000 AS seq
139
+ ,'BACKUP NO' as ddl
140
+ FROM pg_namespace AS n
141
+ INNER JOIN pg_class AS c ON n.oid = c.relnamespace
142
+ INNER JOIN (SELECT
143
+ SPLIT_PART(key,'_',5) id
144
+ FROM pg_conf
145
+ WHERE key LIKE 'pg_class_backup_%'
146
+ AND SPLIT_PART(key,'_',4) = (SELECT
147
+ oid
148
+ FROM pg_database
149
+ WHERE datname = current_database())) t ON t.id=c.oid
150
+ WHERE c.relkind = 'r'
151
+ --BACKUP WARNING
152
+ UNION SELECT
153
+ n.nspname AS schemaname
154
+ ,c.relname AS tablename
155
+ ,1 AS seq
156
+ ,'--WARNING: This DDL inherited the BACKUP NO property from the source table' as ddl
157
+ FROM pg_namespace AS n
158
+ INNER JOIN pg_class AS c ON n.oid = c.relnamespace
159
+ INNER JOIN (SELECT
160
+ SPLIT_PART(key,'_',5) id
161
+ FROM pg_conf
162
+ WHERE key LIKE 'pg_class_backup_%'
163
+ AND SPLIT_PART(key,'_',4) = (SELECT
164
+ oid
165
+ FROM pg_database
166
+ WHERE datname = current_database())) t ON t.id=c.oid
167
+ WHERE c.relkind = 'r'
168
+ --DISTSTYLE
169
+ UNION SELECT
170
+ n.nspname AS schemaname
171
+ ,c.relname AS tablename
172
+ ,300000001 AS seq
173
+ ,CASE WHEN c.reldiststyle = 0 THEN 'DISTSTYLE EVEN'
174
+ WHEN c.reldiststyle = 1 THEN 'DISTSTYLE KEY'
175
+ WHEN c.reldiststyle = 8 THEN 'DISTSTYLE ALL'
176
+ ELSE '<<Error - UNKNOWN DISTSTYLE>>'
177
+ END AS ddl
178
+ FROM pg_namespace AS n
179
+ INNER JOIN pg_class AS c ON n.oid = c.relnamespace
180
+ WHERE c.relkind = 'r'
181
+ --DISTKEY COLUMNS
182
+ UNION SELECT
183
+ n.nspname AS schemaname
184
+ ,c.relname AS tablename
185
+ ,400000000 + a.attnum AS seq
186
+ ,'DISTKEY ("' + a.attname + '")' AS ddl
187
+ FROM pg_namespace AS n
188
+ INNER JOIN pg_class AS c ON n.oid = c.relnamespace
189
+ INNER JOIN pg_attribute AS a ON c.oid = a.attrelid
190
+ WHERE c.relkind = 'r'
191
+ AND a.attisdistkey IS TRUE
192
+ AND a.attnum > 0
193
+ --SORTKEY COLUMNS
194
+ UNION select schemaname, tablename, seq,
195
+ case when min_sort <0 then 'INTERLEAVED SORTKEY (' else 'SORTKEY (' end as ddl
196
+ from (SELECT
197
+ n.nspname AS schemaname
198
+ ,c.relname AS tablename
199
+ ,499999999 AS seq
200
+ ,min(attsortkeyord) min_sort FROM pg_namespace AS n
201
+ INNER JOIN pg_class AS c ON n.oid = c.relnamespace
202
+ INNER JOIN pg_attribute AS a ON c.oid = a.attrelid
203
+ WHERE c.relkind = 'r'
204
+ AND abs(a.attsortkeyord) > 0
205
+ AND a.attnum > 0
206
+ group by 1,2,3 )
207
+ UNION (SELECT
208
+ n.nspname AS schemaname
209
+ ,c.relname AS tablename
210
+ ,500000000 + abs(a.attsortkeyord) AS seq
211
+ ,CASE WHEN abs(a.attsortkeyord) = 1
212
+ THEN '\t"' + a.attname + '"'
213
+ ELSE '\t, "' + a.attname + '"'
214
+ END AS ddl
215
+ FROM pg_namespace AS n
216
+ INNER JOIN pg_class AS c ON n.oid = c.relnamespace
217
+ INNER JOIN pg_attribute AS a ON c.oid = a.attrelid
218
+ WHERE c.relkind = 'r'
219
+ AND abs(a.attsortkeyord) > 0
220
+ AND a.attnum > 0
221
+ ORDER BY abs(a.attsortkeyord))
222
+ UNION SELECT
223
+ n.nspname AS schemaname
224
+ ,c.relname AS tablename
225
+ ,599999999 AS seq
226
+ ,'\t)' AS ddl
227
+ FROM pg_namespace AS n
228
+ INNER JOIN pg_class AS c ON n.oid = c.relnamespace
229
+ INNER JOIN pg_attribute AS a ON c.oid = a.attrelid
230
+ WHERE c.relkind = 'r'
231
+ AND abs(a.attsortkeyord) > 0
232
+ AND a.attnum > 0
233
+ --END SEMICOLON
234
+ UNION SELECT n.nspname AS schemaname, c.relname AS tablename, 600000000 AS seq, ';' AS ddl
235
+ FROM pg_namespace AS n
236
+ INNER JOIN pg_class AS c ON n.oid = c.relnamespace
237
+ WHERE c.relkind = 'r' )
238
+ UNION (
239
+ SELECT 'zzzzzzzz' || n.nspname AS schemaname,
240
+ 'zzzzzzzz' || c.relname AS tablename,
241
+ 700000000 + CAST(con.oid AS INT) AS seq,
242
+ 'ALTER TABLE ' + n.nspname + '.' + c.relname + ' ADD ' + pg_get_constraintdef(con.oid)::VARCHAR(1024) + ';' AS ddl
243
+ FROM pg_constraint AS con
244
+ INNER JOIN pg_class AS c
245
+ ON c.relnamespace = con.connamespace
246
+ AND c.oid = con.conrelid
247
+ INNER JOIN pg_namespace AS n ON n.oid = c.relnamespace
248
+ WHERE c.relkind = 'r'
249
+ AND con.contype = 'f'
250
+ ORDER BY seq
251
+ )
252
+ ORDER BY schemaname, tablename, seq
253
+ )
254
+ ;
@@ -0,0 +1,19 @@
1
+ --DROP VIEW admin.v_generate_view_ddl;
2
+ /**********************************************************************************************
3
+ Purpose: View to get the DDL for a view.
4
+ History:
5
+ 2014-02-10 jjschmit Created
6
+ **********************************************************************************************/
7
+ CREATE OR REPLACE VIEW admin.v_generate_view_ddl
8
+ AS
9
+ SELECT
10
+ n.nspname AS schemaname
11
+ ,c.relname AS viewname
12
+ ,'--DROP VIEW ' + n.nspname + '.' + c.relname + ';\nCREATE OR REPLACE VIEW ' + n.nspname + '.' + c.relname + ' AS\n' + COALESCE(pg_get_viewdef(c.oid, TRUE), '') AS ddl
13
+ FROM
14
+ pg_catalog.pg_class AS c
15
+ INNER JOIN
16
+ pg_catalog.pg_namespace AS n
17
+ ON c.relnamespace = n.oid
18
+ WHERE relkind = 'v'
19
+ ;
@@ -31,7 +31,7 @@ Gem::Specification.new do |spec|
31
31
  spec.add_development_dependency 'bundler', '~> 1.14'
32
32
  spec.add_development_dependency 'rake', '~> 10.0'
33
33
  spec.add_development_dependency 'rspec', '~> 3.0'
34
- spec.add_development_dependency 'factory_girl', '~> 4.8.0'
35
- spec.add_development_dependency 'database_cleaner', '~> 1.6.0'
36
- spec.add_development_dependency 'appraisal', '~> 2.2.0'
34
+ spec.add_development_dependency 'factory_girl', '~> 4.8'
35
+ spec.add_development_dependency 'database_cleaner', '~> 1.6'
36
+ spec.add_development_dependency 'appraisal', '~> 2.2'
37
37
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: postshift
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dave Krupinski
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-08-29 00:00:00.000000000 Z
11
+ date: 2017-09-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pg
@@ -106,42 +106,42 @@ dependencies:
106
106
  requirements:
107
107
  - - "~>"
108
108
  - !ruby/object:Gem::Version
109
- version: 4.8.0
109
+ version: '4.8'
110
110
  type: :development
111
111
  prerelease: false
112
112
  version_requirements: !ruby/object:Gem::Requirement
113
113
  requirements:
114
114
  - - "~>"
115
115
  - !ruby/object:Gem::Version
116
- version: 4.8.0
116
+ version: '4.8'
117
117
  - !ruby/object:Gem::Dependency
118
118
  name: database_cleaner
119
119
  requirement: !ruby/object:Gem::Requirement
120
120
  requirements:
121
121
  - - "~>"
122
122
  - !ruby/object:Gem::Version
123
- version: 1.6.0
123
+ version: '1.6'
124
124
  type: :development
125
125
  prerelease: false
126
126
  version_requirements: !ruby/object:Gem::Requirement
127
127
  requirements:
128
128
  - - "~>"
129
129
  - !ruby/object:Gem::Version
130
- version: 1.6.0
130
+ version: '1.6'
131
131
  - !ruby/object:Gem::Dependency
132
132
  name: appraisal
133
133
  requirement: !ruby/object:Gem::Requirement
134
134
  requirements:
135
135
  - - "~>"
136
136
  - !ruby/object:Gem::Version
137
- version: 2.2.0
137
+ version: '2.2'
138
138
  type: :development
139
139
  prerelease: false
140
140
  version_requirements: !ruby/object:Gem::Requirement
141
141
  requirements:
142
142
  - - "~>"
143
143
  - !ruby/object:Gem::Version
144
- version: 2.2.0
144
+ version: '2.2'
145
145
  description: Thin ActiveRecord Redshift Adapter extension for existing PostgreSQL
146
146
  adapter.
147
147
  email:
@@ -176,7 +176,12 @@ files:
176
176
  - lib/active_record/connection_adapters/redshift/type_metadata.rb
177
177
  - lib/active_record/connection_adapters/redshift_adapter.rb
178
178
  - lib/postshift.rb
179
+ - lib/postshift/railtie.rb
180
+ - lib/postshift/schema.rb
179
181
  - lib/postshift/version.rb
182
+ - lib/tasks/schema.rake
183
+ - lib/tasks/v_generate_tbl_ddl.sql
184
+ - lib/tasks/v_generate_view_ddl.sql
180
185
  - postshift.gemspec
181
186
  homepage: https://github.com/ValiMail/postshift
182
187
  licenses: