pgsync 0.6.7 → 0.7.1

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
  SHA256:
3
- metadata.gz: 4af2ef537f2130fb3b60ce705c17dc0ea2292a6d12f074ac14dafdc18e5419e8
4
- data.tar.gz: 441442b39578dd09b4cbe22a9514f3eda59b7876a8d0c1541eda39631ac9a757
3
+ metadata.gz: 042c6ef2c6e17c85523588c23fb7d92dc23c625eeffd9f2988e56e346b6a46ec
4
+ data.tar.gz: 567458066a079635a0a887941d0c8da492acacae24f79f44d48195425a397d32
5
5
  SHA512:
6
- metadata.gz: '0357909b28157593f8fcc21678efa53c767454c41a2f858b577da9e802aa29d49ffd3f8f835554098d670d82b018e27d7299a091e41022fd1b98a7eb1529232a'
7
- data.tar.gz: acb5faf68e112427b406b03285d1bf2aa1c42034a186c8a37b617670037f06156e8e8f5dbb222b5fac3ce97e2b6a9d69014be9ca9c9395230c0139028c91e194
6
+ metadata.gz: c065a560b972175c371552ca69e7824d81d4bd1ebe72ed045ef5a5a59bcc28b738993019ca58231792f711a1f1acae4b42cb7ef68b73de83505c007a015e833d
7
+ data.tar.gz: c38db8ae37eca93353a5f354035fcb604e3e423b4b3fd58719b95c955fad7970990549109454f49392133860903d34d6ac0ca477f82ea1824b23435a9ae6db7e
data/CHANGELOG.md CHANGED
@@ -1,3 +1,18 @@
1
+ ## 0.7.1 (2022-07-06)
2
+
3
+ - Fixed random letter data rule generating non-letter
4
+
5
+ ## 0.7.0 (2022-03-10)
6
+
7
+ - Changed `--defer-constraints` to `--defer-constraints-v1`
8
+ - Changed `--defer-constraints-v2` to `--defer-constraints`
9
+ - Fixed unknown alias error with Ruby 3.1
10
+ - Dropped support for Ruby < 2.5
11
+
12
+ ## 0.6.8 (2021-09-21)
13
+
14
+ - Fixed error when schema missing in destination with `--schema-first` and `--schema-only`
15
+
1
16
  ## 0.6.7 (2021-04-26)
2
17
 
3
18
  - Fixed connection security for `--schema-first` and `--schema-only` - [more info](https://github.com/ankane/pgsync/issues/121)
data/LICENSE.txt CHANGED
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) 2015-2020 Andrew Kane
3
+ Copyright (c) 2015-2022 Andrew Kane
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -19,7 +19,7 @@ pgsync is a command line tool. To install, run:
19
19
  gem install pgsync
20
20
  ```
21
21
 
22
- This will give you the `pgsync` command. If installation fails, you may need to install [dependencies](#dependencies).
22
+ This will give you the `pgsync` command. You can also install it with [Homebrew](#homebrew). If installation fails, you may need to install [dependencies](#dependencies).
23
23
 
24
24
  ## Setup
25
25
 
@@ -205,7 +205,7 @@ Foreign keys can make it difficult to sync data. Three options are:
205
205
  To defer constraints, use:
206
206
 
207
207
  ```sh
208
- pgsync --defer-constraints-v2
208
+ pgsync --defer-constraints
209
209
  ```
210
210
 
211
211
  To manually specify the order of tables, use `--jobs 1` so tables are synced one-at-a-time.
@@ -347,6 +347,14 @@ Bundler.with_unbundled_env do
347
347
  end
348
348
  ```
349
349
 
350
+ ## Homebrew
351
+
352
+ On Mac, you can use:
353
+
354
+ ```sh
355
+ brew install ankane/brew/pgsync
356
+ ```
357
+
350
358
  ## Dependencies
351
359
 
352
360
  If installation fails, your system may be missing Ruby or libpq.
data/lib/pgsync/client.rb CHANGED
@@ -11,6 +11,7 @@ module PgSync
11
11
  result = Slop::Parser.new(slop_options).parse(@args)
12
12
  arguments = result.arguments
13
13
  options = result.to_h
14
+ options[:defer_constraints_v2] ||= options[:defer_constraints]
14
15
 
15
16
  raise Error, "Specify either --db or --config, not both" if options[:db] && options[:config]
16
17
  raise Error, "Cannot use --overwrite with --in-batches" if options[:overwrite] && options[:in_batches]
@@ -59,12 +60,13 @@ module PgSync
59
60
 
60
61
  o.separator ""
61
62
  o.separator "Foreign key options:"
62
- o.boolean "--defer-constraints-v2", "defer constraints", default: false
63
+ o.boolean "--defer-constraints", "defer constraints", default: false
63
64
  o.boolean "--disable-integrity", "disable foreign key triggers", default: false
64
65
  o.integer "-j", "--jobs", "number of tables to sync at a time"
65
66
 
66
- # replaced by v2
67
- o.boolean "--defer-constraints", "defer constraints", default: false, help: false
67
+ # legacy
68
+ o.boolean "--defer-constraints-v1", "defer constraints", default: false, help: false
69
+ o.boolean "--defer-constraints-v2", "defer constraints", default: false, help: false
68
70
  # private, for testing
69
71
  o.boolean "--disable-integrity-v2", "disable foreign key triggers", default: false, help: false
70
72
 
@@ -68,6 +68,23 @@ module PgSync
68
68
  execute("TRUNCATE #{quote_ident_full(table)} CASCADE")
69
69
  end
70
70
 
71
+ def schemas
72
+ @schemas ||= begin
73
+ query = <<~SQL
74
+ SELECT
75
+ schema_name
76
+ FROM
77
+ information_schema.schemata
78
+ ORDER BY 1
79
+ SQL
80
+ execute(query).map { |row| row["schema_name"] }
81
+ end
82
+ end
83
+
84
+ def create_schema(schema)
85
+ execute("CREATE SCHEMA #{quote_ident(schema)}")
86
+ end
87
+
71
88
  def triggers(table)
72
89
  query = <<~SQL
73
90
  SELECT
@@ -24,6 +24,8 @@ module PgSync
24
24
  spinner.auto_spin
25
25
  end
26
26
 
27
+ create_schemas if specify_tables?
28
+
27
29
  # if spinner, capture lines to show on error
28
30
  lines = []
29
31
  success =
@@ -68,7 +70,7 @@ module PgSync
68
70
 
69
71
  def dump_command
70
72
  cmd = ["pg_dump", "-Fc", "--verbose", "--schema-only", "--no-owner", "--no-acl"]
71
- if !opts[:all_schemas] || opts[:tables] || opts[:groups] || args[0] || opts[:exclude] || opts[:schemas]
73
+ if specify_tables?
72
74
  @tasks.each do |task|
73
75
  cmd.concat(["-t", task.quoted_table])
74
76
  end
@@ -81,5 +83,18 @@ module PgSync
81
83
  cmd << "--if-exists" if Gem::Version.new(pg_restore_version) >= Gem::Version.new("9.4.0")
82
84
  cmd.concat(["-d", @destination.url])
83
85
  end
86
+
87
+ # pg_dump -t won't create schemas (even with -n)
88
+ # not ideal that this happens outside restore transaction
89
+ def create_schemas
90
+ schemas = @tasks.map { |t| t.table.schema }.uniq - @destination.schemas
91
+ schemas.sort.each do |schema|
92
+ @destination.create_schema(schema)
93
+ end
94
+ end
95
+
96
+ def specify_tables?
97
+ !opts[:all_schemas] || opts[:tables] || opts[:groups] || args[0] || opts[:exclude] || opts[:schemas]
98
+ end
84
99
  end
85
100
  end
data/lib/pgsync/sync.rb CHANGED
@@ -78,7 +78,16 @@ module PgSync
78
78
  file = config_file
79
79
  if file
80
80
  begin
81
- YAML.load_file(file) || {}
81
+ # same options as YAML.load_file
82
+ File.open(file, "r:bom|utf-8") do |f|
83
+ # changed to keyword arguments in 3.1.0.pre1
84
+ # https://github.com/ruby/psych/commit/c79ed445b4b3f8c9adf3da13bca3c976ddfae258
85
+ if Psych::VERSION.to_f >= 3.1
86
+ YAML.safe_load(f, aliases: true, filename: file) || {}
87
+ else
88
+ YAML.safe_load(f, [], [], true, file) || {}
89
+ end
90
+ end
82
91
  rescue Psych::SyntaxError => e
83
92
  raise Error, e.message
84
93
  rescue Errno::ENOENT
@@ -125,7 +125,7 @@ module PgSync
125
125
  end
126
126
 
127
127
  # for non-deferrable constraints
128
- if opts[:defer_constraints]
128
+ if opts[:defer_constraints_v1]
129
129
  constraints = non_deferrable_constraints(destination)
130
130
  constraints = tasks.flat_map { |t| constraints[t.table] || [] }
131
131
  warning "Non-deferrable constraints: #{constraints.join(", ")}" if constraints.any?
@@ -230,7 +230,7 @@ module PgSync
230
230
 
231
231
  # disable multiple jobs for defer constraints and disable integrity
232
232
  # so we can use a transaction to ensure a consistent snapshot
233
- if opts[:debug] || opts[:in_batches] || opts[:defer_constraints] || opts[:defer_constraints_v2] || opts[:disable_integrity] || opts[:disable_integrity_v2]
233
+ if opts[:debug] || opts[:in_batches] || opts[:defer_constraints_v1] || opts[:defer_constraints_v2] || opts[:disable_integrity] || opts[:disable_integrity_v2]
234
234
  warning "--jobs ignored" if jobs
235
235
  jobs = 0
236
236
  end
@@ -268,7 +268,7 @@ module PgSync
268
268
  source.transaction do
269
269
  yield
270
270
  end
271
- elsif opts[:defer_constraints] || opts[:defer_constraints_v2]
271
+ elsif opts[:defer_constraints_v1] || opts[:defer_constraints_v2]
272
272
  destination.transaction do
273
273
  if opts[:defer_constraints_v2]
274
274
  table_constraints = non_deferrable_constraints(destination)
data/lib/pgsync/task.rb CHANGED
@@ -149,7 +149,7 @@ module PgSync
149
149
  destination.execute("INSERT INTO #{quoted_table} (#{fields}) (SELECT #{fields} FROM #{quote_ident_full(temp_table)}) ON CONFLICT (#{on_conflict}) DO #{action}")
150
150
  else
151
151
  # use delete instead of truncate for foreign keys
152
- if opts[:defer_constraints] || opts[:defer_constraints_v2]
152
+ if opts[:defer_constraints_v1] || opts[:defer_constraints_v2]
153
153
  destination.execute("DELETE FROM #{quoted_table}")
154
154
  else
155
155
  destination.truncate(table)
@@ -256,9 +256,11 @@ module PgSync
256
256
  when "random_time"
257
257
  "NOW() - (RANDOM() * 100000000)::int * INTERVAL '1 second'"
258
258
  when "random_ip"
259
+ # casting double to int rounds
259
260
  "(1 + RANDOM() * 254)::int::text || '.0.0.1'"
260
261
  when "random_letter"
261
- "chr(65 + (RANDOM() * 26)::int)"
262
+ # casting double to int rounds
263
+ "chr(65 + (RANDOM() * 25)::int)"
262
264
  when "random_string"
263
265
  "RIGHT(MD5(RANDOM()::text), 10)"
264
266
  when "null", nil
@@ -1,3 +1,3 @@
1
1
  module PgSync
2
- VERSION = "0.6.7"
2
+ VERSION = "0.7.1"
3
3
  end
data/lib/pgsync.rb CHANGED
@@ -5,12 +5,12 @@ require "slop"
5
5
  require "tty-spinner"
6
6
 
7
7
  # stdlib
8
+ require "open3"
8
9
  require "set"
9
10
  require "shellwords"
10
11
  require "tempfile"
11
12
  require "uri"
12
13
  require "yaml"
13
- require "open3"
14
14
 
15
15
  # modules
16
16
  require "pgsync/utils"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pgsync
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.7
4
+ version: 0.7.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Kane
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-04-26 00:00:00.000000000 Z
11
+ date: 2022-07-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: parallel
@@ -67,7 +67,7 @@ dependencies:
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  description:
70
- email: andrew@chartkick.com
70
+ email: andrew@ankane.org
71
71
  executables:
72
72
  - pgsync
73
73
  extensions: []
@@ -103,14 +103,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
103
103
  requirements:
104
104
  - - ">="
105
105
  - !ruby/object:Gem::Version
106
- version: '2.2'
106
+ version: '2.5'
107
107
  required_rubygems_version: !ruby/object:Gem::Requirement
108
108
  requirements:
109
109
  - - ">="
110
110
  - !ruby/object:Gem::Version
111
111
  version: '0'
112
112
  requirements: []
113
- rubygems_version: 3.2.3
113
+ rubygems_version: 3.3.7
114
114
  signing_key:
115
115
  specification_version: 4
116
116
  summary: Sync Postgres data between databases