rustic 0.1.0 → 0.3.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
  SHA256:
3
- metadata.gz: 87aaad479d9e91bcd7181431cc2f8375b4430c1031037577267fac7432fcf69a
4
- data.tar.gz: e75eb8091276f16c57be19d526d64bf546010bff1b2e96925438cf1932a18d53
3
+ metadata.gz: 3cffcd950bd1cafc45ac925deed3c4d5ffeed28feecd547f83fbe270b990d8c6
4
+ data.tar.gz: aa028fac39c981b0b4a6667dd1d84da19157ff2666a44abe06143c7b8f0473c1
5
5
  SHA512:
6
- metadata.gz: 22783cede44b8c30a8f93e1877928b225de776b36269b1bbcf35fefd21b1d3ce10f10650029a2143d06abc6175b0ec2c513965b3ea308c192dff8950bbb9a6d6
7
- data.tar.gz: 02af5b50df986baa80294f7d4efb7db2432017bcc4a511bd5cad3de143b83a58cb74290eb14f0d8b1c529ecd50d2f6e94a839910f4dde02d096203e88d9490d6
6
+ metadata.gz: 4877cbfd5481d617d15cd4a58332516e533f9af4168a9e05e1099edbf0b3572fb087bd01b985958ca77d8f96053bea3c5e660ce545af36d7a26ab2c718f03faa
7
+ data.tar.gz: ad3f12c6b8cba8de97544d91481569ccc7dd0152dcdcb53a73f27f0b2b56ffeb70cca5747fc5966d0de093ce4c05e621b95842fc3fae68e60d6a7c6c7fe2c45d
@@ -1,18 +1,63 @@
1
1
  name: Ruby
2
2
 
3
- on: [push,pull_request]
3
+ on: [push]
4
4
 
5
5
  jobs:
6
- build:
6
+ lint:
7
7
  runs-on: ubuntu-latest
8
8
  steps:
9
- - uses: actions/checkout@v2
10
- - name: Set up Ruby
11
- uses: ruby/setup-ruby@v1
12
- with:
13
- ruby-version: 3.0.1
14
- - name: Run the default task
15
- run: |
16
- gem install bundler -v 2.2.15
17
- bundle install
18
- bundle exec rake
9
+ - uses: actions/checkout@v2
10
+
11
+ - uses: ruby/setup-ruby@v1
12
+ with:
13
+ bundler-cache: true
14
+
15
+ - name: Run the default task
16
+ run: |
17
+ gem install bundler -v 2.2.27
18
+ bundle install
19
+ bundle exec rubocop
20
+ test:
21
+ runs-on: ubuntu-latest
22
+ steps:
23
+ - uses: actions/checkout@v2
24
+
25
+ - uses: ruby/setup-ruby@v1
26
+ with:
27
+ bundler-cache: true
28
+
29
+ - name: Install deps
30
+ run: |
31
+ gem install bundler -v 2.2.27
32
+ bundle install
33
+
34
+ - name: Run tests
35
+ run: bundle exec rspec
36
+ publish:
37
+ runs-on: ubuntu-latest
38
+ needs:
39
+ - lint
40
+ - test
41
+ if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v')
42
+ steps:
43
+ - uses: actions/checkout@v2
44
+
45
+ - uses: ruby/setup-ruby@v1
46
+ with:
47
+ ruby-version: 3.0
48
+ bundler-cache: true
49
+
50
+ - name: Build gem
51
+ run: gem build
52
+
53
+ - name: Create credentials
54
+ run: |
55
+ mkdir ~/.gem
56
+ cat << EOF > ~/.gem/credentials
57
+ ---
58
+ :rubygems_api_key: ${{ secrets.RUBYGEMS_TOKEN }}
59
+ EOF
60
+ chmod 0600 /home/runner/.gem/credentials
61
+
62
+ - name: Push gem
63
+ run: gem push *gem
data/.gitignore CHANGED
@@ -9,4 +9,5 @@
9
9
 
10
10
  # rspec failure tracking
11
11
  .rspec_status
12
- backup.rb
12
+ /backup.rb
13
+ *.gem
data/.rspec CHANGED
@@ -1,3 +1,3 @@
1
- --format documentation
2
1
  --color
3
2
  --require spec_helper
3
+ --order random
data/.rubocop.yml CHANGED
@@ -37,7 +37,7 @@ RSpec/NestedGroups:
37
37
  Max: 5
38
38
 
39
39
  RSpec/MultipleMemoizedHelpers:
40
- Max: 9
40
+ Max: 10
41
41
 
42
42
  RSpec/ExampleLength:
43
43
  Max: 6
data/.tool-versions ADDED
@@ -0,0 +1 @@
1
+ ruby 3.0.2
data/Gemfile.lock CHANGED
@@ -1,8 +1,9 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rustic (0.1.0)
4
+ rustic (0.3.0)
5
5
  async-process (~> 1.3)
6
+ ptools (~> 1.4)
6
7
  zeitwerk (~> 2.5)
7
8
 
8
9
  GEM
@@ -24,7 +25,7 @@ GEM
24
25
  rspec-memory (~> 1.0)
25
26
  backport (1.2.0)
26
27
  benchmark (0.2.0)
27
- console (1.13.1)
28
+ console (1.14.0)
28
29
  fiber-local
29
30
  diff-lcs (1.4.4)
30
31
  docile (1.4.0)
@@ -41,6 +42,7 @@ GEM
41
42
  parallel (1.21.0)
42
43
  parser (3.0.2.0)
43
44
  ast (~> 2.4.1)
45
+ ptools (1.4.2)
44
46
  racc (1.6.0)
45
47
  rainbow (3.0.0)
46
48
  rake (13.0.6)
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Rustic::Application
4
+ class UnknownCommandError < Rustic::Error; end
5
+
6
+ def initialize(config)
7
+ @config = config
8
+ end
9
+
10
+ def run(argv)
11
+ command = argv.first || "backup"
12
+ command, env = Rustic::CommandBuilder.new(command, @config).build
13
+ Rustic::Wrapper.new(command, env).run
14
+ end
15
+ end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class Rustic::Script::CommandBuilder
3
+ class Rustic::CommandBuilder
4
4
  class UnknownPasswordMethodError < Rustic::Error; end
5
5
  class UnknownCommandError < Rustic::Error; end
6
6
  class MissingConfigError < Rustic::Error; end
@@ -35,21 +35,9 @@ class Rustic::Script::CommandBuilder
35
35
  end
36
36
 
37
37
  def add_command!
38
- command_method = "command_#{@command}"
39
- return @args.concat(send(command_method)) if respond_to?(command_method, true)
40
-
38
+ command_class = Rustic::CommandBuilders.const_get(@command.capitalize)
39
+ @args.concat(command_class.new(@config).build)
40
+ rescue NameError
41
41
  raise UnknownCommandError, "Unknown command #{@command}"
42
42
  end
43
-
44
- def excludes = ["--exclude"].product(@config.backup_config.excluded_paths).flatten
45
-
46
- def command_snapshots = ["snapshots"]
47
-
48
- def command_backup
49
- config = @config.backup_config
50
- raise MissingConfigError, "Command `backup` misses it's configuration" if config.nil?
51
- raise MalformedConfigError, "Backup paths cannot be empty" if config.paths.empty?
52
-
53
- ["backup", config.one_fs ? "-x" : nil, *config.paths, *excludes].compact
54
- end
55
43
  end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Rustic::CommandBuilders::Backup
4
+ def initialize(config)
5
+ @config = config
6
+ end
7
+
8
+ def build
9
+ config = @config.backup_config
10
+ raise Rustic::CommandBuilder::MissingConfigError, "Command `backup` misses it's configuration" if config.nil?
11
+ raise Rustic::CommandBuilder::MalformedConfigError, "Backup paths cannot be empty" if config.paths.empty?
12
+
13
+ [
14
+ "backup",
15
+ config.one_fs ? "-x" : nil,
16
+ *config.paths,
17
+ *excludes
18
+ ].compact
19
+ end
20
+
21
+ private
22
+
23
+ def excludes = ["--exclude"].product(@config.backup_config.excluded_paths).flatten
24
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Rustic::CommandBuilders::Check
4
+ def initialize(config)
5
+ @config = config
6
+ end
7
+
8
+ def build
9
+ config = @config.check_config
10
+ [
11
+ "check",
12
+ config&.check_unused ? "--check-unused" : nil,
13
+ read_data_subset(config),
14
+ config&.with_cache ? "--with-cache" : nil
15
+ ].compact
16
+ end
17
+
18
+ def read_data_subset(config)
19
+ return nil if config.nil? || config.read_data_subset.nil?
20
+ return "--read-data" if config.read_data_subset == 100
21
+
22
+ "--read-data-subset=#{config.read_data_subset}%"
23
+ end
24
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Rustic::CommandBuilders::Forget
4
+ def initialize(config)
5
+ @config = config
6
+ end
7
+
8
+ def build
9
+ config = @config.forget_config
10
+ raise Rustic::CommandBuilder::MissingConfigError, "Command `forget` misses it's configuration" if config.nil?
11
+
12
+ [
13
+ "forget",
14
+ config.keep_last ? "--keep-last=#{config.keep_last}" : nil,
15
+ config.keep_weekly ? "--keep-weekly=#{config.keep_weekly}" : nil,
16
+ config.keep_monthly ? "--keep-monthly=#{config.keep_monthly}" : nil,
17
+ config.prune ? "--prune" : nil
18
+ ].compact
19
+ end
20
+ end
@@ -1,11 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class Rustic::Script::Validator
3
+ class Rustic::CommandBuilders::Prune
4
4
  def initialize(config)
5
5
  @config = config
6
6
  end
7
7
 
8
- def validate!
9
- # TODO: write me!
8
+ def build
9
+ ["prune"]
10
10
  end
11
11
  end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Rustic::CommandBuilders::Snapshots
4
+ def initialize(config)
5
+ @config = config
6
+ end
7
+
8
+ def build
9
+ ["snapshots"]
10
+ end
11
+ end
@@ -1,12 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class Rustic::Script::Config
4
- include Rustic::Script::HooksExt
3
+ class Rustic::Config
4
+ include Rustic::HooksExt
5
5
 
6
- attr_reader :restic_path, :backup_config
6
+ attr_reader :restic_path, :backup_config, :check_config, :forget_config, :strict_validation
7
7
 
8
8
  def initialize
9
9
  @restic_path = "restic"
10
+ @strict_validation = false
10
11
  end
11
12
 
12
13
  def restic(path)
@@ -38,7 +39,19 @@ class Rustic::Script::Config
38
39
  end
39
40
 
40
41
  def backup(&block)
41
- @backup_config ||= Rustic::Script::BackupConfig.new
42
+ @backup_config ||= Rustic::Configs::Backup.new
42
43
  @backup_config.instance_eval(&block)
43
44
  end
45
+
46
+ def check(&block)
47
+ @check_config ||= Rustic::Configs::Check.new
48
+ @check_config.instance_eval(&block) unless block.nil?
49
+ end
50
+
51
+ def forget(&block)
52
+ @forget_config ||= Rustic::Configs::Forget.new
53
+ @forget_config.instance_eval(&block)
54
+ end
55
+
56
+ def strict_validation! = @strict_validation = true
44
57
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class Rustic::Script::BackupConfig
4
- include Rustic::Script::HooksExt
3
+ class Rustic::Configs::Backup
4
+ include Rustic::HooksExt
5
5
 
6
6
  attr_reader :paths, :excluded_paths, :one_fs
7
7
 
@@ -23,7 +23,5 @@ class Rustic::Script::BackupConfig
23
23
  @excluded_paths = paths
24
24
  end
25
25
 
26
- def one_fs!
27
- @one_fs = true
28
- end
26
+ def one_fs! = @one_fs = true
29
27
  end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Rustic::Configs::Check
4
+ include Rustic::HooksExt
5
+
6
+ attr_reader :check_unused, :read_data_subset, :with_cache
7
+
8
+ def initialize
9
+ @check_unused = false
10
+ @read_data_subset = nil
11
+ @with_cache = false
12
+ end
13
+
14
+ def check_unused! = @check_unused = true
15
+ def with_cache! = @with_cache = true
16
+
17
+ def subset(percent)
18
+ raise ArgumentError, "percent must be > 0 and <= 100. Given: #{percent}" if percent <= 0 || percent > 100
19
+
20
+ @read_data_subset = percent
21
+ end
22
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Rustic::Configs::Forget
4
+ include Rustic::HooksExt
5
+
6
+ attr_reader :keep_last, :keep_weekly, :keep_monthly, :prune
7
+
8
+ def initialize
9
+ @prune = false
10
+ end
11
+
12
+ def keep(last: nil, weekly: nil, monthly: nil)
13
+ raise ArgumentError, "keep options must be provided" if [last, weekly, monthly].all?(&:nil?)
14
+
15
+ @keep_last = last
16
+ @keep_weekly = weekly
17
+ @keep_monthly = monthly
18
+ end
19
+
20
+ def prune! = @prune = true
21
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Rustic::Evaluator
4
+ include Console
5
+
6
+ def initialize(config) = @config = config
7
+
8
+ def evaluate
9
+ with_hooks(@config) do
10
+ backup! unless @config.backup_config.nil?
11
+ end
12
+ rescue StandardError => e
13
+ on_error(e)
14
+ raise
15
+ end
16
+
17
+ def on_error(error) = @config.on_error&.call(error)
18
+
19
+ def backup!
20
+ with_hooks(@config.backup_config) do
21
+ command, env = Rustic::CommandBuilder.new("backup", @config).build
22
+ Rustic::Wrapper.new(command, env).run
23
+ end
24
+ end
25
+
26
+ def with_hooks(config, args = nil, &block) = Rustic::Hooks.new(config).with_hooks(args, &block)
27
+ end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class Rustic::Script::Hooks
3
+ class Rustic::Hooks
4
4
  def initialize(config)
5
5
  @before = config.before
6
6
  @after = config.after
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module Rustic::Script::HooksExt
3
+ module Rustic::HooksExt
4
4
  include Console
5
5
 
6
6
  def before(&block)
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Rustic::Validator
4
+ def initialize(config)
5
+ @config = config
6
+ end
7
+
8
+ def validate
9
+ @errors = []
10
+ @warnings = []
11
+ validate_config!
12
+ validate_backup_config!
13
+ [@errors, @warnings]
14
+ end
15
+
16
+ private
17
+
18
+ def validate_config! # rubocop:disable Metrics/AbcSize
19
+ if @config.restic_path.nil? || File.which(@config.restic_path).nil?
20
+ error!("restic path is miconfigured: '#{@config.restic_path.inspect}'")
21
+ end
22
+ error!("repository is not configured") if @config.repository.nil?
23
+ error!("password is not configured") if @config.password.nil? && @config.password_file.nil?
24
+ warning!("backup is not configured") if @config.backup_config.nil?
25
+ end
26
+
27
+ def validate_backup_config! # rubocop:disable Metrics/AbcSize
28
+ config = @config.backup_config
29
+ return if config.nil?
30
+
31
+ return unless @config.strict_validation
32
+
33
+ error!("backup paths must be alphabetically sorted") if config.paths != config.paths.sort
34
+ error!("backup paths contain duplicates") if config.paths != config.paths.uniq
35
+ error!("excluded paths must be alphabetically sorted") if config.excluded_paths != config.excluded_paths.sort
36
+ error!("excluded paths contain duplicates") if config.excluded_paths != config.excluded_paths.uniq
37
+ end
38
+
39
+ def error!(message) = @errors << message
40
+
41
+ def warning!(message) = @warnings << message
42
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Rustic
4
- VERSION = "0.1.0"
4
+ VERSION = "0.3.0"
5
5
  end
data/lib/rustic.rb CHANGED
@@ -1,17 +1,39 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "async/process"
4
+ require "ptools" # file File.which
4
5
 
5
6
  require "zeitwerk"
6
7
 
7
8
  loader = Zeitwerk::Loader.for_gem
8
9
 
9
- loader.inflector.inflect(
10
- "cli" => "CLI"
11
- )
12
-
13
10
  loader.setup
14
11
 
15
- # Your code goes here...
16
- class Rustic::Error < StandardError
12
+ module Rustic
13
+ class Error < StandardError; end
14
+ class ValidationError < Error; end
15
+
16
+ class << self
17
+ def define(run: true, &block)
18
+ Sync do
19
+ config = Rustic::Config.new
20
+ config.instance_eval(&block)
21
+ validate!(config)
22
+ Rustic::Application.new(config).tap do |app|
23
+ app.run(ARGV) if run
24
+ end
25
+ end
26
+ end
27
+
28
+ private
29
+
30
+ def validate!(config)
31
+ errors, warnings = Rustic::Validator.new(config).validate
32
+ warnings.each do |warning|
33
+ # TODO: print warning
34
+ end
35
+
36
+ raise ValidationError, errors.join("\n") if errors.any?
37
+ end
38
+ end
17
39
  end
data/rustic.gemspec CHANGED
@@ -28,6 +28,7 @@ Gem::Specification.new do |spec|
28
28
  spec.require_paths = ["lib"]
29
29
 
30
30
  spec.add_dependency "async-process", "~> 1.3"
31
+ spec.add_dependency "ptools", "~> 1.4"
31
32
  spec.add_dependency "zeitwerk", "~> 2.5"
32
33
 
33
34
  # For more information and examples about making a new gem, checkout our
data/rustic.rb CHANGED
@@ -1,32 +1,37 @@
1
+ #!/bin/env ruby
1
2
  # frozen_string_literal: true
2
3
 
3
- repository "tmp/repository"
4
+ require "rustic"
4
5
 
5
- password "password"
6
+ Rustic.define do
7
+ repository "tmp/repository"
6
8
 
7
- before do
8
- logger.info(self, "BEFORE")
9
- end
9
+ password "password"
10
+
11
+ before do
12
+ logger.info(self, "BEFORE")
13
+ end
14
+
15
+ backup do
16
+ one_fs!
17
+
18
+ before do |exists|
19
+ logger.info(self, "BEFORE BACKUP #{exists}")
20
+ end
10
21
 
11
- backup do
12
- one_fs!
22
+ after do
23
+ logger.info(self, "AFTER BACKUP")
24
+ end
13
25
 
14
- before do |exists|
15
- logger.info(self, "BEFORE BACKUP #{exists}")
26
+ backup "lib"
27
+ exclude "lib/rustic"
16
28
  end
17
29
 
18
30
  after do
19
- logger.info(self, "AFTER BACKUP")
31
+ logger.info(self, "AFTER")
20
32
  end
21
33
 
22
- backup "lib"
23
- exclude "lib/rustic"
24
- end
25
-
26
- after do
27
- logger.info(self, "AFTER")
28
- end
29
-
30
- on_error do |error|
31
- logger.warn(self, "ERROR:", error)
34
+ on_error do |error|
35
+ logger.warn(self, "ERROR:", error)
36
+ end
32
37
  end
data/rustic_script.rb ADDED
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ repository "tmp/repository"
4
+
5
+ password "password"
6
+
7
+ before do
8
+ logger.info(self, "BEFORE")
9
+ end
10
+
11
+ backup do
12
+ one_fs!
13
+
14
+ before do |exists|
15
+ logger.info(self, "BEFORE BACKUP #{exists}")
16
+ end
17
+
18
+ after do
19
+ logger.info(self, "AFTER BACKUP")
20
+ end
21
+
22
+ backup "lib"
23
+ exclude "lib/rustic"
24
+ end
25
+
26
+ after do
27
+ logger.info(self, "AFTER")
28
+ end
29
+
30
+ on_error do |error|
31
+ logger.warn(self, "ERROR:", error)
32
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rustic
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gleb Sinyavskiy
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-11-19 00:00:00.000000000 Z
11
+ date: 2021-11-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: async-process
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: ptools
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.4'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.4'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: zeitwerk
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -41,8 +55,7 @@ dependencies:
41
55
  description: DSL for the restic backup tool.
42
56
  email:
43
57
  - zhulik.gleb@gmail.com
44
- executables:
45
- - rustic
58
+ executables: []
46
59
  extensions: []
47
60
  extra_rdoc_files: []
48
61
  files:
@@ -50,6 +63,7 @@ files:
50
63
  - ".gitignore"
51
64
  - ".rspec"
52
65
  - ".rubocop.yml"
66
+ - ".tool-versions"
53
67
  - CHANGELOG.md
54
68
  - CODE_OF_CONDUCT.md
55
69
  - Gemfile
@@ -59,27 +73,33 @@ files:
59
73
  - Rakefile
60
74
  - bin/console
61
75
  - bin/setup
62
- - exe/rustic
63
76
  - lib/rustic.rb
64
- - lib/rustic/cli.rb
65
- - lib/rustic/script/backup_config.rb
66
- - lib/rustic/script/command_builder.rb
67
- - lib/rustic/script/config.rb
68
- - lib/rustic/script/evaluator.rb
69
- - lib/rustic/script/hooks.rb
70
- - lib/rustic/script/hooks_ext.rb
71
- - lib/rustic/script/reader.rb
72
- - lib/rustic/script/validator.rb
77
+ - lib/rustic/application.rb
78
+ - lib/rustic/command_builder.rb
79
+ - lib/rustic/command_builders/backup.rb
80
+ - lib/rustic/command_builders/check.rb
81
+ - lib/rustic/command_builders/forget.rb
82
+ - lib/rustic/command_builders/prune.rb
83
+ - lib/rustic/command_builders/snapshots.rb
84
+ - lib/rustic/config.rb
85
+ - lib/rustic/configs/backup.rb
86
+ - lib/rustic/configs/check.rb
87
+ - lib/rustic/configs/forget.rb
88
+ - lib/rustic/evaluator.rb
89
+ - lib/rustic/hooks.rb
90
+ - lib/rustic/hooks_ext.rb
91
+ - lib/rustic/validator.rb
73
92
  - lib/rustic/version.rb
74
93
  - lib/rustic/wrapper.rb
75
94
  - rustic.gemspec
76
95
  - rustic.rb
96
+ - rustic_script.rb
77
97
  homepage: https://github.com/zhulik/rustic
78
98
  licenses:
79
99
  - MIT
80
100
  metadata:
81
101
  rubygems_mfa_required: 'true'
82
- post_install_message:
102
+ post_install_message:
83
103
  rdoc_options: []
84
104
  require_paths:
85
105
  - lib
@@ -95,7 +115,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
95
115
  version: '0'
96
116
  requirements: []
97
117
  rubygems_version: 3.2.22
98
- signing_key:
118
+ signing_key:
99
119
  specification_version: 4
100
120
  summary: DSL for the restic backup tool.
101
121
  test_files: []
data/exe/rustic DELETED
@@ -1,8 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # frozen_string_literal: true
3
-
4
- require "rustic"
5
-
6
- Async::Reactor.run do
7
- Rustic::CLI.new(ARGV).run
8
- end
data/lib/rustic/cli.rb DELETED
@@ -1,18 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Rustic::CLI
4
- def initialize(argv)
5
- @argv = argv
6
- end
7
-
8
- def run
9
- case @argv.first
10
- when "script"
11
- config = Rustic::Script::Reader.new(@argv[1]).read
12
- Rustic::Script::Evaluator.new(config).evaluate
13
-
14
- else
15
- Rustic::Wrapper.new(["restic", *@argv]).run
16
- end
17
- end
18
- end
@@ -1,40 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Rustic::Script::Evaluator
4
- include Console
5
-
6
- def initialize(config)
7
- @config = config
8
- end
9
-
10
- def evaluate
11
- check!
12
-
13
- with_hooks(@config) do
14
- backup! unless @config.backup_config.nil?
15
- end
16
- rescue StandardError => e
17
- on_error(e)
18
- raise
19
- end
20
-
21
- def check!
22
- command, env = Rustic::Script::CommandBuilder.new("snapshots", @config).build
23
- Rustic::Wrapper.new(command, env).run
24
- end
25
-
26
- def on_error(error)
27
- @config.on_error&.call(error)
28
- end
29
-
30
- def backup!
31
- with_hooks(@config.backup_config) do
32
- command, env = Rustic::Script::CommandBuilder.new("backup", @config).build
33
- Rustic::Wrapper.new(command, env).run
34
- end
35
- end
36
-
37
- def with_hooks(config, args = nil, &block)
38
- Rustic::Script::Hooks.new(config).with_hooks(args, &block)
39
- end
40
- end
@@ -1,27 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Rustic::Script::Reader
4
- class FileReadingError < Rustic::Error; end
5
- class EvaluationError < Rustic::Error; end
6
-
7
- def initialize(file_path)
8
- @file_path = file_path
9
- end
10
-
11
- def read
12
- Rustic::Script::Config.new.tap do |config|
13
- config.instance_eval(script)
14
- Rustic::Script::Validator.new(@config).validate!
15
- end
16
- rescue SyntaxError, NameError
17
- raise EvaluationError
18
- end
19
-
20
- private
21
-
22
- def script
23
- @script ||= File.read(@file_path)
24
- rescue StandardError
25
- raise FileReadingError
26
- end
27
- end