snapshot_archive 0.7.0 → 0.9.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
  SHA256:
3
- metadata.gz: 23bf48f76c366c97e8af2b6a56bdece2729eadd670f02363afd16ead08647053
4
- data.tar.gz: a091e5e222475f510b419c2ed78f13f074a2f3196f722a6a394e7afa9d71ff71
3
+ metadata.gz: 5e7e55a13d956b69746a56a472a0bb5bf0fca87c8455622ba0486d081b84981a
4
+ data.tar.gz: 0cb06eb238ad6d518515847751f7c1dfdb98d0f234c47ab10c798ff7c828a5de
5
5
  SHA512:
6
- metadata.gz: 27db023b81db187306af4b09c6dc381a4a6d219f20a4b05e95ebf12ba2099872d977d03d0f9de6cc40827498cf755b5c77d222954246abaf53f0e3800d3bd324
7
- data.tar.gz: 21ae0dae28c890d1d9d12b33ddceff78ba5f7d79139f95652b025f6c1df21a495c0c992b68a4b1f340099a893d3a0359603d624f01167372fe5e53d9e92a4f77
6
+ metadata.gz: 13abb74a373a7d31f81704872a7e6d5ab312de98dff229333fbd2ccebb220c5c56a46ec5bbfe0a0035ee496ea75a2d34942f357a5dd5469f8b4cd6c8cc5415cf
7
+ data.tar.gz: fae50ea54d90d52261a5959cf964b4e1849d0564401c06fff92075288b8cb02a53668179afc9689e70cf8aa9cedde1c1f244f119aa4ded59241d07ab398dee34
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- snapshot_archive (0.5.0)
4
+ snapshot_archive (0.7.0)
5
5
  commander (~> 4.5)
6
6
 
7
7
  GEM
@@ -33,6 +33,7 @@ GEM
33
33
  unicode-display_width (2.1.0)
34
34
 
35
35
  PLATFORMS
36
+ aarch64-linux
36
37
  x86_64-darwin-19
37
38
  x86_64-darwin-20
38
39
 
data/README.md CHANGED
@@ -6,7 +6,7 @@ snapshot and restore it later! Build your own snapshotting behavior in a
6
6
  configuration file so that you can snapshot any stateful service you use during
7
7
  development.
8
8
 
9
- By default will make mysql backups for any development databases for the rails
9
+ By default will make mysql backups for any development databases for the rails
10
10
  app in your CWD.
11
11
 
12
12
  ## Installation
@@ -113,6 +113,17 @@ SnapshotArchive.configure do |config|
113
113
  # restore: accepts the metadata JSON data created when making the backup. No
114
114
  # return value.
115
115
  #
116
+ # Stores can optionally define:
117
+ #
118
+ # delete: accepts the metadata JSON data created when making the backup. No
119
+ # return value. Invoked when the snapshot is deleted. If your backup method
120
+ # stores all of its data inside the snapshot directory, then no delete
121
+ # method is needed because the snapshot directory will be deleted. However,
122
+ # if your backup stores data in a different directory, then this hook can
123
+ # be used to cleanup that data. Eg, your method might write some data to
124
+ # an external or synced directory. In that case, you probably want to save
125
+ # the path to the file in the metadata, and try to delete it in this hook.
126
+ #
116
127
  # Stores can either be defined as objects/classes/modules or a builtin store
117
128
  # builder can be used.
118
129
 
@@ -155,5 +166,8 @@ SnapshotArchive.configure do |config|
155
166
  # snap backup mysql:db_1,db_2
156
167
 
157
168
  config.register_store("my_backup", "mysql:db_1,db_2")
169
+
170
+ # You can also alias an array of stores:
171
+ config.register_store("my_backup_2", ["mysql:db_1,db_2", "other_stuff"])
158
172
  end
159
173
  ```
data/exe/snap CHANGED
@@ -64,7 +64,11 @@ module SnapshotArchive
64
64
 
65
65
  stores = (
66
66
  if args.count > 0
67
- args.map { |arg| SnapshotArchive::Cfg.parse_store(arg) }.to_h
67
+ args
68
+ .map { |arg| SnapshotArchive::Cfg.resolve_alias(arg) }
69
+ .flatten
70
+ .map { |arg| SnapshotArchive::Cfg.parse_store(arg) }
71
+ .to_h
68
72
  else
69
73
  SnapshotArchive::Cfg.stores
70
74
  end
@@ -42,6 +42,27 @@ module SnapshotArchive
42
42
  end
43
43
  end
44
44
 
45
+ class Delete
46
+ def self.call(metadata)
47
+ new(metadata).call
48
+ end
49
+
50
+ attr_reader :metadata
51
+ def initialize(metadata)
52
+ @metadata = metadata
53
+ end
54
+
55
+ def call
56
+ metadata.fetch("stores").each do |store_metadata|
57
+ store = Cfg.instance.store(store_metadata.fetch("type"))
58
+ if store.respond_to?(:delete)
59
+ store.delete(store_metadata)
60
+ end
61
+ end
62
+ end
63
+ end
64
+
65
+
45
66
  class Presenter
46
67
  def self.call(metadata)
47
68
  new(metadata).call
@@ -4,17 +4,22 @@ require "snapshot_archive/repositories"
4
4
  module SnapshotArchive
5
5
  class StoreBuilder
6
6
  class CustomStore
7
- def initialize(backup:, restore:)
7
+ def initialize(backup:, restore:, delete:)
8
8
  @backup = backup
9
9
  @restore = restore
10
+ @delete = delete
10
11
  end
11
12
 
12
13
  def backup(dir)
13
- @backup.call(dir)
14
+ @backup&.call(dir)
14
15
  end
15
16
 
16
17
  def restore(metadata)
17
- @restore.call(metadata)
18
+ @restore&.call(metadata)
19
+ end
20
+
21
+ def delete(metadata)
22
+ @delete&.call(metadata)
18
23
  end
19
24
  end
20
25
 
@@ -26,8 +31,12 @@ module SnapshotArchive
26
31
  @restore = block
27
32
  end
28
33
 
34
+ def delete(&block)
35
+ @delete = block
36
+ end
37
+
29
38
  def to_store
30
- CustomStore.new(backup: @backup, restore: @restore)
39
+ CustomStore.new(backup: @backup, restore: @restore, delete: @delete)
31
40
  end
32
41
  end
33
42
 
@@ -40,6 +49,7 @@ module SnapshotArchive
40
49
  [
41
50
  :bind_backup,
42
51
  :load,
52
+ :resolve_alias,
43
53
  :parse_store,
44
54
  :pwd,
45
55
  :repository,
@@ -65,6 +75,14 @@ module SnapshotArchive
65
75
  Kernel.load(config_path) if File.exist?(config_path)
66
76
  end
67
77
 
78
+ def resolve_alias(name)
79
+ if store_registry[name].is_a?(Array)
80
+ store_registry[name]
81
+ else
82
+ name
83
+ end
84
+ end
85
+
68
86
  def register_store(name, klass_or_alias=nil, active_by_default: true, &block)
69
87
  store = (
70
88
  if klass_or_alias.is_a?(String)
@@ -66,10 +66,13 @@ module SnapshotArchive
66
66
  end
67
67
 
68
68
  def delete(id)
69
- dir = File.join(path, id)
69
+ metadata = JSON.parse(File.read(File.join(path, id, "metadata.json")))
70
+ raise ArgumentError.new("unknown snapshot: #{id}") unless File.exist?(metadata)
70
71
 
71
- raise ArgumentError.new("unknown snapshot: #{id}") unless File.exist?(dir)
72
+ Cfg.shell.info("Running delete hooks: #{id}")
73
+ Archives::Delete.call(metadata.dig("archive"))
72
74
 
75
+ Cfg.shell.info("Removing snapshot: #{id}")
73
76
  FileUtils.rm_rf(dir)
74
77
  Cfg.shell.info("Removed snapshot: #{id}")
75
78
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SnapshotArchive
4
- VERSION = "0.7.0"
4
+ VERSION = "0.9.0"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: snapshot_archive
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pete Kinnecom