ruborg 0.1.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 2e48935c72c444956ca0b7918efb14bd3d5b8a38273ec6843adec2fbb2da6968
4
+ data.tar.gz: f200cb546d62431ec1ff84544da0b96b9f84cf7877aa29627608f8c43119d2b7
5
+ SHA512:
6
+ metadata.gz: 4614d7f78363f420ae4ce80355725fb84e068bfac0d94591f1cee56a6d14c7c6664dd415405462086bdf2fa7543187702f346645655b2bb32b5ffb62fea288a9
7
+ data.tar.gz: f70898563085b03b78cf4cf140abb5efd9bd3bd6881918aa7a77c976823a15469688e3aeafd6814c4ff880b3e5c8f949264a1c03f9b1251f3467d409ebe1f302
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --require spec_helper
2
+ --color
3
+ --format documentation
data/CHANGELOG.md ADDED
@@ -0,0 +1,21 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [Unreleased]
9
+
10
+ ### Added
11
+ - Initial gem structure
12
+ - Borg repository initialization and management
13
+ - Backup creation and restoration
14
+ - YAML configuration file support
15
+ - Passbolt CLI integration for password management
16
+ - Command-line interface with Thor
17
+
18
+ ## [0.1.0] - 2025-10-04
19
+
20
+ ### Added
21
+ - Initial release
data/CLAUDE.md ADDED
@@ -0,0 +1 @@
1
+ - ruborg is a ruby gem to perform backups using borg. it reads a configuration file in yaml and instructs borg about what to do. it is a friendly fornt end of borg in ruby. it can create and access backup repositories. it can take and recall backup files or directories. it can interract with passbolt through cli to access encryption passwords.
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Michail
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,186 @@
1
+ # Ruborg
2
+
3
+ > **⚠️ WARNING: This project is under heavy development and is not yet functional. Do not use in production.**
4
+ >
5
+ > This gem is being developed with the assistance of Claude AI.
6
+
7
+ A friendly Ruby frontend for [Borg Backup](https://www.borgbackup.org/). Ruborg simplifies backup management by providing a YAML-based configuration system and seamless integration with Passbolt for encryption password management.
8
+
9
+ ## Features
10
+
11
+ - 📦 **Repository Management** - Create and manage Borg backup repositories
12
+ - 💾 **Backup & Restore** - Easy backup creation and archive restoration
13
+ - 📝 **YAML Configuration** - Simple, readable configuration files
14
+ - 🔐 **Passbolt Integration** - Secure password management via Passbolt CLI
15
+ - 🎯 **Pattern Exclusions** - Flexible file exclusion patterns
16
+ - 🗜️ **Compression Options** - Support for multiple compression algorithms
17
+
18
+ ## Prerequisites
19
+
20
+ - Ruby >= 2.7.0
21
+ - [Borg Backup](https://www.borgbackup.org/) installed and available in PATH
22
+ - [Passbolt CLI](https://github.com/passbolt/go-passbolt-cli) (optional, for password management)
23
+
24
+ ## Installation
25
+
26
+ Add this line to your application's Gemfile:
27
+
28
+ ```ruby
29
+ gem 'ruborg'
30
+ ```
31
+
32
+ And then execute:
33
+
34
+ ```bash
35
+ bundle install
36
+ ```
37
+
38
+ Or install it yourself as:
39
+
40
+ ```bash
41
+ gem install ruborg
42
+ ```
43
+
44
+ ## Configuration
45
+
46
+ Create a `ruborg.yml` configuration file:
47
+
48
+ ```yaml
49
+ # Repository path
50
+ repository: /path/to/borg/repository
51
+
52
+ # Paths to backup
53
+ backup_paths:
54
+ - /home/user/documents
55
+ - /home/user/projects
56
+ - /etc
57
+
58
+ # Exclude patterns
59
+ exclude_patterns:
60
+ - "*.tmp"
61
+ - "*.log"
62
+ - "*/.cache/*"
63
+ - "*/node_modules/*"
64
+ - "*/.git/*"
65
+
66
+ # Compression algorithm (lz4, zstd, zlib, lzma, none)
67
+ compression: lz4
68
+
69
+ # Encryption mode (repokey, keyfile, none)
70
+ encryption: repokey
71
+
72
+ # Passbolt integration (optional)
73
+ passbolt:
74
+ resource_id: "your-passbolt-resource-uuid"
75
+ ```
76
+
77
+ See `ruborg.yml.example` for a complete configuration template.
78
+
79
+ ## Usage
80
+
81
+ ### Initialize a Repository
82
+
83
+ ```bash
84
+ # With passphrase
85
+ ruborg init /path/to/repository --passphrase "your-passphrase"
86
+
87
+ # With Passbolt
88
+ ruborg init /path/to/repository --passbolt-id "resource-uuid"
89
+ ```
90
+
91
+ ### Create a Backup
92
+
93
+ ```bash
94
+ # Using default configuration (ruborg.yml)
95
+ ruborg backup
96
+
97
+ # Using custom configuration file
98
+ ruborg backup --config /path/to/config.yml
99
+
100
+ # With custom archive name
101
+ ruborg backup --name "my-backup-2025-10-04"
102
+ ```
103
+
104
+ ### List Archives
105
+
106
+ ```bash
107
+ ruborg list
108
+ ```
109
+
110
+ ### Restore from Archive
111
+
112
+ ```bash
113
+ # Restore to current directory
114
+ ruborg restore archive-name
115
+
116
+ # Restore to specific directory
117
+ ruborg restore archive-name --destination /path/to/restore
118
+ ```
119
+
120
+ ### View Repository Information
121
+
122
+ ```bash
123
+ ruborg info
124
+ ```
125
+
126
+ ## Passbolt Integration
127
+
128
+ Ruborg can retrieve encryption passphrases from Passbolt using the Passbolt CLI:
129
+
130
+ 1. Install and configure [Passbolt CLI](https://github.com/passbolt/go-passbolt-cli)
131
+ 2. Store your Borg repository passphrase in Passbolt
132
+ 3. Add the resource ID to your `ruborg.yml`:
133
+
134
+ ```yaml
135
+ passbolt:
136
+ resource_id: "your-passbolt-resource-uuid"
137
+ ```
138
+
139
+ Ruborg will automatically retrieve the passphrase when performing backup operations.
140
+
141
+ ## Command Reference
142
+
143
+ | Command | Description | Options |
144
+ |---------|-------------|---------|
145
+ | `init REPOSITORY` | Initialize a new Borg repository | `--passphrase`, `--passbolt-id` |
146
+ | `backup` | Create a backup using config file | `--config`, `--name` |
147
+ | `list` | List all archives in repository | `--config` |
148
+ | `restore ARCHIVE` | Restore files from archive | `--config`, `--destination` |
149
+ | `info` | Show repository information | `--config` |
150
+
151
+ ## Development
152
+
153
+ After checking out the repo, run `bundle install` to install dependencies. Then, run `rake spec` to run the tests.
154
+
155
+ To install this gem onto your local machine, run:
156
+
157
+ ```bash
158
+ bundle exec rake install
159
+ ```
160
+
161
+ To release a new version, update the version number in `lib/ruborg/version.rb`, and then run:
162
+
163
+ ```bash
164
+ bundle exec rake release
165
+ ```
166
+
167
+ ## Testing
168
+
169
+ Run the test suite:
170
+
171
+ ```bash
172
+ bundle exec rspec
173
+ ```
174
+
175
+ ## Contributing
176
+
177
+ Bug reports and pull requests are welcome on GitHub at https://github.com/mpantel/ruborg.
178
+
179
+ ## License
180
+
181
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
182
+
183
+ ## Acknowledgments
184
+
185
+ - [Borg Backup](https://www.borgbackup.org/) - The excellent backup tool this gem wraps
186
+ - [Passbolt](https://www.passbolt.com/) - Secure password management
data/Rakefile ADDED
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/gem_tasks"
4
+ require "rspec/core/rake_task"
5
+
6
+ RSpec::Core::RakeTask.new(:spec)
7
+
8
+ task default: :spec
data/exe/ruborg ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require_relative "../lib/ruborg"
5
+
6
+ Ruborg::CLI.start(ARGV)
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ruborg
4
+ # Backup operations using Borg
5
+ class Backup
6
+ def initialize(repository, config:)
7
+ @repository = repository
8
+ @config = config
9
+ end
10
+
11
+ def create(name: nil)
12
+ raise BorgError, "Repository does not exist" unless @repository.exists?
13
+
14
+ archive_name = name || Time.now.strftime("%Y-%m-%d_%H-%M-%S")
15
+ cmd = build_create_command(archive_name)
16
+
17
+ execute_borg_command(cmd)
18
+ end
19
+
20
+ def extract(archive_name, destination: ".")
21
+ raise BorgError, "Repository does not exist" unless @repository.exists?
22
+
23
+ cmd = ["borg", "extract", "#{@repository.path}::#{archive_name}"]
24
+ cmd += ["--destination", destination] if destination != "."
25
+
26
+ execute_borg_command(cmd)
27
+ end
28
+
29
+ def list_archives
30
+ @repository.list
31
+ end
32
+
33
+ def delete(archive_name)
34
+ cmd = ["borg", "delete", "#{@repository.path}::#{archive_name}"]
35
+ execute_borg_command(cmd)
36
+ end
37
+
38
+ private
39
+
40
+ def build_create_command(archive_name)
41
+ cmd = ["borg", "create"]
42
+ cmd += ["--compression", @config.compression]
43
+
44
+ @config.exclude_patterns.each do |pattern|
45
+ cmd += ["--exclude", pattern]
46
+ end
47
+
48
+ cmd << "#{@repository.path}::#{archive_name}"
49
+ cmd += @config.backup_paths
50
+
51
+ cmd
52
+ end
53
+
54
+ def execute_borg_command(cmd)
55
+ result = system(*cmd)
56
+ raise BorgError, "Borg command failed: #{cmd.join(' ')}" unless result
57
+
58
+ result
59
+ end
60
+ end
61
+ end
data/lib/ruborg/cli.rb ADDED
@@ -0,0 +1,95 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "thor"
4
+
5
+ module Ruborg
6
+ # Command-line interface for ruborg
7
+ class CLI < Thor
8
+ class_option :config, type: :string, default: "ruborg.yml", desc: "Path to configuration file"
9
+
10
+ desc "init REPOSITORY", "Initialize a new Borg repository"
11
+ option :passphrase, type: :string, desc: "Repository passphrase"
12
+ option :passbolt_id, type: :string, desc: "Passbolt resource ID for passphrase"
13
+ def init(repository_path)
14
+ passphrase = get_passphrase(options[:passphrase], options[:passbolt_id])
15
+ repo = Repository.new(repository_path, passphrase: passphrase)
16
+ repo.create
17
+ puts "Repository initialized at #{repository_path}"
18
+ rescue Error => e
19
+ error_exit(e)
20
+ end
21
+
22
+ desc "backup", "Create a backup using configuration file"
23
+ option :name, type: :string, desc: "Archive name"
24
+ def backup
25
+ config = Config.new(options[:config])
26
+ passphrase = fetch_passphrase_from_config(config)
27
+
28
+ repo = Repository.new(config.repository, passphrase: passphrase)
29
+ backup = Backup.new(repo, config: config)
30
+
31
+ backup.create(name: options[:name])
32
+ puts "Backup created successfully"
33
+ rescue Error => e
34
+ error_exit(e)
35
+ end
36
+
37
+ desc "list", "List all archives in the repository"
38
+ def list
39
+ config = Config.new(options[:config])
40
+ passphrase = fetch_passphrase_from_config(config)
41
+
42
+ repo = Repository.new(config.repository, passphrase: passphrase)
43
+ repo.list
44
+ rescue Error => e
45
+ error_exit(e)
46
+ end
47
+
48
+ desc "restore ARCHIVE", "Restore files from an archive"
49
+ option :destination, type: :string, default: ".", desc: "Destination directory"
50
+ def restore(archive_name)
51
+ config = Config.new(options[:config])
52
+ passphrase = fetch_passphrase_from_config(config)
53
+
54
+ repo = Repository.new(config.repository, passphrase: passphrase)
55
+ backup = Backup.new(repo, config: config)
56
+
57
+ backup.extract(archive_name, destination: options[:destination])
58
+ puts "Archive restored to #{options[:destination]}"
59
+ rescue Error => e
60
+ error_exit(e)
61
+ end
62
+
63
+ desc "info", "Show repository information"
64
+ def info
65
+ config = Config.new(options[:config])
66
+ passphrase = fetch_passphrase_from_config(config)
67
+
68
+ repo = Repository.new(config.repository, passphrase: passphrase)
69
+ repo.info
70
+ rescue Error => e
71
+ error_exit(e)
72
+ end
73
+
74
+ private
75
+
76
+ def get_passphrase(passphrase, passbolt_id)
77
+ return passphrase if passphrase
78
+ return Passbolt.new(resource_id: passbolt_id).get_password if passbolt_id
79
+
80
+ nil
81
+ end
82
+
83
+ def fetch_passphrase_from_config(config)
84
+ passbolt_config = config.passbolt_integration
85
+ return nil if passbolt_config.empty?
86
+
87
+ Passbolt.new(resource_id: passbolt_config["resource_id"]).get_password
88
+ end
89
+
90
+ def error_exit(error)
91
+ puts "Error: #{error.message}"
92
+ exit 1
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "yaml"
4
+ require "psych"
5
+
6
+ module Ruborg
7
+ # Configuration management for ruborg
8
+ class Config
9
+ attr_reader :data
10
+
11
+ def initialize(config_path)
12
+ @config_path = config_path
13
+ load_config
14
+ end
15
+
16
+ def load_config
17
+ raise ConfigError, "Configuration file not found: #{@config_path}" unless File.exist?(@config_path)
18
+
19
+ @data = YAML.load_file(@config_path)
20
+ rescue Psych::SyntaxError => e
21
+ raise ConfigError, "Invalid YAML syntax: #{e.message}"
22
+ end
23
+
24
+ def repository
25
+ @data["repository"]
26
+ end
27
+
28
+ def backup_paths
29
+ @data["backup_paths"] || []
30
+ end
31
+
32
+ def exclude_patterns
33
+ @data["exclude_patterns"] || []
34
+ end
35
+
36
+ def compression
37
+ @data["compression"] || "lz4"
38
+ end
39
+
40
+ def encryption_mode
41
+ @data["encryption"] || "repokey"
42
+ end
43
+
44
+ def passbolt_integration
45
+ @data["passbolt"] || {}
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "json"
4
+
5
+ module Ruborg
6
+ # Passbolt CLI integration for password management
7
+ class Passbolt
8
+ def initialize(resource_id: nil)
9
+ @resource_id = resource_id
10
+ check_passbolt_cli
11
+ end
12
+
13
+ def get_password
14
+ raise PassboltError, "Resource ID not configured" unless @resource_id
15
+
16
+ cmd = ["passbolt", "get", @resource_id, "--json"]
17
+ output = `#{cmd.join(' ')}`
18
+
19
+ raise PassboltError, "Failed to retrieve password from Passbolt" unless $?.success?
20
+
21
+ parse_password(output)
22
+ end
23
+
24
+ private
25
+
26
+ def check_passbolt_cli
27
+ unless system("which passbolt > /dev/null 2>&1")
28
+ raise PassboltError, "Passbolt CLI not found. Please install it first."
29
+ end
30
+ end
31
+
32
+ def parse_password(json_output)
33
+ data = JSON.parse(json_output)
34
+ data["password"] || data["secret"]
35
+ rescue JSON::ParserError => e
36
+ raise PassboltError, "Failed to parse Passbolt response: #{e.message}"
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ruborg
4
+ # Borg repository management
5
+ class Repository
6
+ attr_reader :path
7
+
8
+ def initialize(path, passphrase: nil)
9
+ @path = path
10
+ @passphrase = passphrase
11
+ end
12
+
13
+ def exists?
14
+ File.directory?(@path) && File.exist?(File.join(@path, "config"))
15
+ end
16
+
17
+ def create
18
+ raise BorgError, "Repository already exists at #{@path}" if exists?
19
+
20
+ cmd = ["borg", "init", "--encryption=repokey", @path]
21
+ execute_borg_command(cmd)
22
+ end
23
+
24
+ def info
25
+ raise BorgError, "Repository does not exist at #{@path}" unless exists?
26
+
27
+ cmd = ["borg", "info", @path]
28
+ execute_borg_command(cmd)
29
+ end
30
+
31
+ def list
32
+ raise BorgError, "Repository does not exist at #{@path}" unless exists?
33
+
34
+ cmd = ["borg", "list", @path]
35
+ execute_borg_command(cmd)
36
+ end
37
+
38
+ private
39
+
40
+ def execute_borg_command(cmd)
41
+ env = {}
42
+ env["BORG_PASSPHRASE"] = @passphrase if @passphrase
43
+
44
+ result = system(env, *cmd)
45
+ raise BorgError, "Borg command failed: #{cmd.join(' ')}" unless result
46
+
47
+ result
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ruborg
4
+ VERSION = "0.1.0"
5
+ end
data/lib/ruborg.rb ADDED
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "ruborg/version"
4
+ require_relative "ruborg/config"
5
+ require_relative "ruborg/repository"
6
+ require_relative "ruborg/backup"
7
+ require_relative "ruborg/passbolt"
8
+ require_relative "ruborg/cli"
9
+
10
+ module Ruborg
11
+ class Error < StandardError; end
12
+ class ConfigError < Error; end
13
+ class BorgError < Error; end
14
+ class PassboltError < Error; end
15
+ end
data/ruborg.gemspec ADDED
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "lib/ruborg/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "ruborg"
7
+ spec.version = Ruborg::VERSION
8
+ spec.authors = ["Michail Pantelelis"]
9
+ spec.email = ["mpantel@aegean.gr"]
10
+
11
+ spec.summary = "A friendly Ruby frontend for Borg backup"
12
+ spec.description = "Ruborg is a Ruby gem that provides a user-friendly interface to Borg backup. It reads YAML configuration files and orchestrates backup operations, supporting repository creation, backup management, and integration with Passbolt for encryption password management."
13
+ spec.homepage = "https://github.com/mpantel/ruborg"
14
+ spec.license = "MIT"
15
+ spec.required_ruby_version = ">= 3.2.0"
16
+
17
+ spec.metadata["homepage_uri"] = spec.homepage
18
+ spec.metadata["source_code_uri"] = "#{spec.homepage}.git"
19
+ spec.metadata["changelog_uri"] = "#{spec.homepage}/blob/main/CHANGELOG.md"
20
+
21
+ # Specify which files should be added to the gem when it is released.
22
+ spec.files = Dir.chdir(__dir__) do
23
+ `git ls-files -z`.split("\x0").reject do |f|
24
+ (File.expand_path(f) == __FILE__) ||
25
+ f.start_with?(*%w[bin/ test/ spec/ features/ .git .github appveyor Gemfile])
26
+ end
27
+ end
28
+ spec.bindir = "exe"
29
+ spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
30
+ spec.require_paths = ["lib"]
31
+
32
+ # Dependencies
33
+ spec.add_dependency "thor", "~> 1.3"
34
+ spec.add_dependency "psych", "~> 5.0"
35
+
36
+ # Development dependencies
37
+ spec.add_development_dependency "bundler", "~> 2.0"
38
+ spec.add_development_dependency "rake", "~> 13.0"
39
+ spec.add_development_dependency "rspec", "~> 3.0"
40
+ spec.add_development_dependency "rubocop", "~> 1.0"
41
+ end
@@ -0,0 +1,28 @@
1
+ # Ruborg configuration example
2
+
3
+ # Repository path
4
+ repository: /path/to/borg/repository
5
+
6
+ # Paths to backup
7
+ backup_paths:
8
+ - /home/user/documents
9
+ - /home/user/projects
10
+ - /etc
11
+
12
+ # Exclude patterns
13
+ exclude_patterns:
14
+ - "*.tmp"
15
+ - "*.log"
16
+ - "*/.cache/*"
17
+ - "*/node_modules/*"
18
+ - "*/.git/*"
19
+
20
+ # Compression algorithm (lz4, zstd, zlib, lzma, none)
21
+ compression: lz4
22
+
23
+ # Encryption mode (repokey, keyfile, none)
24
+ encryption: repokey
25
+
26
+ # Passbolt integration (optional)
27
+ passbolt:
28
+ resource_id: "your-passbolt-resource-uuid"
metadata ADDED
@@ -0,0 +1,147 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ruborg
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Michail Pantelelis
8
+ bindir: exe
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: thor
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: '1.3'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - "~>"
24
+ - !ruby/object:Gem::Version
25
+ version: '1.3'
26
+ - !ruby/object:Gem::Dependency
27
+ name: psych
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: '5.0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '5.0'
40
+ - !ruby/object:Gem::Dependency
41
+ name: bundler
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '2.0'
47
+ type: :development
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '2.0'
54
+ - !ruby/object:Gem::Dependency
55
+ name: rake
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '13.0'
61
+ type: :development
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '13.0'
68
+ - !ruby/object:Gem::Dependency
69
+ name: rspec
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '3.0'
75
+ type: :development
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '3.0'
82
+ - !ruby/object:Gem::Dependency
83
+ name: rubocop
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '1.0'
89
+ type: :development
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '1.0'
96
+ description: Ruborg is a Ruby gem that provides a user-friendly interface to Borg
97
+ backup. It reads YAML configuration files and orchestrates backup operations, supporting
98
+ repository creation, backup management, and integration with Passbolt for encryption
99
+ password management.
100
+ email:
101
+ - mpantel@aegean.gr
102
+ executables:
103
+ - ruborg
104
+ extensions: []
105
+ extra_rdoc_files: []
106
+ files:
107
+ - ".rspec"
108
+ - CHANGELOG.md
109
+ - CLAUDE.md
110
+ - LICENSE
111
+ - README.md
112
+ - Rakefile
113
+ - exe/ruborg
114
+ - lib/ruborg.rb
115
+ - lib/ruborg/backup.rb
116
+ - lib/ruborg/cli.rb
117
+ - lib/ruborg/config.rb
118
+ - lib/ruborg/passbolt.rb
119
+ - lib/ruborg/repository.rb
120
+ - lib/ruborg/version.rb
121
+ - ruborg.gemspec
122
+ - ruborg.yml.example
123
+ homepage: https://github.com/mpantel/ruborg
124
+ licenses:
125
+ - MIT
126
+ metadata:
127
+ homepage_uri: https://github.com/mpantel/ruborg
128
+ source_code_uri: https://github.com/mpantel/ruborg.git
129
+ changelog_uri: https://github.com/mpantel/ruborg/blob/main/CHANGELOG.md
130
+ rdoc_options: []
131
+ require_paths:
132
+ - lib
133
+ required_ruby_version: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ version: 3.2.0
138
+ required_rubygems_version: !ruby/object:Gem::Requirement
139
+ requirements:
140
+ - - ">="
141
+ - !ruby/object:Gem::Version
142
+ version: '0'
143
+ requirements: []
144
+ rubygems_version: 3.7.1
145
+ specification_version: 4
146
+ summary: A friendly Ruby frontend for Borg backup
147
+ test_files: []