file_transactions 0.1.1 → 0.1.2
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 +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/lib/file_transactions.rb +31 -0
- data/lib/file_transactions/change_file_command.rb +26 -0
- data/lib/file_transactions/create_directory_command.rb +14 -15
- data/lib/file_transactions/create_file_command.rb +26 -0
- data/lib/file_transactions/delete_file_command.rb +10 -0
- data/lib/file_transactions/move_file_command.rb +12 -0
- data/lib/file_transactions/transaction.rb +3 -0
- data/lib/file_transactions/version.rb +1 -1
- metadata +9 -5
- metadata.gz.sig +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 877914f1551238a6f03b03e24f4670b247a3df7339303d2b174db0ba2a60b2ff
|
4
|
+
data.tar.gz: 06b545de3377911e4502f35788fe10e2034daf51a319c9d80830aa11c28588d7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 96b18e2d349cbcde39e6c2b870d88a156ff7de0a9a0f7dc458418ef68a0610487090a8611d9068ef2e85abfc89a5f3dd1de2fd3311ccf2eba461a593b41f54f1
|
7
|
+
data.tar.gz: 41ab3cf26cfbc1f908ed1064f3503fd9e6a0d83b87b76d9a6a26c475d8a3991529c0297fe1940f4972b19e0057af2bf8f14bb30af8f1e5e6a1a86f59c2eeba69
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/lib/file_transactions.rb
CHANGED
@@ -11,6 +11,37 @@ require 'file_transactions/move_file_command'
|
|
11
11
|
require 'file_transactions/transaction'
|
12
12
|
|
13
13
|
module FileTransactions
|
14
|
+
# This method runs the block inside a transaction
|
15
|
+
#
|
16
|
+
# ==== Examples
|
17
|
+
#
|
18
|
+
# FileTransactions.transaction do
|
19
|
+
# CreateFileCommand.execute('new_file') { 'hello' }
|
20
|
+
# ChangeFileCommand.execute('new_file') { 'world' }
|
21
|
+
# end
|
22
|
+
#
|
23
|
+
# FileTransactions.transaction do
|
24
|
+
# CreateFileCommand.execute('new_file') { 'hello' }
|
25
|
+
# DeleteFileCommand.execute('some_file')
|
26
|
+
#
|
27
|
+
# # An exception will make the transaction be rolled back. E.g
|
28
|
+
# # 'new_file' will be removed again and 'some_file' will be restored
|
29
|
+
# raise "foobar"
|
30
|
+
# end
|
31
|
+
#
|
32
|
+
# # Create an alias for FileTransactions
|
33
|
+
# FT = FileTransactions
|
34
|
+
#
|
35
|
+
# FT.transaction do
|
36
|
+
# CreateFileCommand.execute('new_file') { 'hello' }
|
37
|
+
#
|
38
|
+
# FT.transaction do
|
39
|
+
# ChangeFileCommand.execute('new_file') { 'world' }
|
40
|
+
#
|
41
|
+
# # This rolls back the current transaction but not the outer transaction
|
42
|
+
# raise FT::Rollback
|
43
|
+
# end
|
44
|
+
# end
|
14
45
|
def self.transaction(&block)
|
15
46
|
Transaction.run(&block)
|
16
47
|
end
|
@@ -4,9 +4,35 @@ require 'fileutils'
|
|
4
4
|
require 'tmpdir'
|
5
5
|
|
6
6
|
module FileTransactions
|
7
|
+
# This command supports making changes to files.
|
8
|
+
# The block passed to +::new+ must either return a +String+, in which case
|
9
|
+
# the file content will be replace with that string.
|
10
|
+
# Or the block must itself modify the file with desired changes (and return anything but a String).
|
11
|
+
#
|
12
|
+
# When this command has been executed, the file can be restored to the
|
13
|
+
# previous state again by calling #undo.
|
14
|
+
#
|
15
|
+
# ==== Examples
|
16
|
+
#
|
17
|
+
# # Pass in the filename name to ::new
|
18
|
+
# cmd1 = ChangeFileCommand.new('some_existing_file') do
|
19
|
+
# <<~EOF
|
20
|
+
# Some content to that should
|
21
|
+
# replace the current file content.
|
22
|
+
# EOF
|
23
|
+
# end
|
24
|
+
#
|
25
|
+
# # Files can also be modified manually.
|
26
|
+
# # Note: the block gets name as argument.
|
27
|
+
# cmd2 = ChangeFileCommand.new('another_existing_file') do |name|
|
28
|
+
# File.open(name, 'a') do |f|
|
29
|
+
# f.write("Add some more stuff at the end\n")
|
30
|
+
# end
|
31
|
+
# end
|
7
32
|
class ChangeFileCommand < BaseCommand
|
8
33
|
attr_reader :name, :block
|
9
34
|
|
35
|
+
# @param name [String] The name of the file to be changed. May be just a name or an absolut or relative path
|
10
36
|
def initialize(name, &block)
|
11
37
|
@name = name
|
12
38
|
@block = block
|
@@ -3,24 +3,23 @@
|
|
3
3
|
require 'fileutils'
|
4
4
|
|
5
5
|
module FileTransactions
|
6
|
+
# This command creates a new directory. It will also create parent
|
7
|
+
# directories if the given path contains directories that doesn't exist.
|
8
|
+
#
|
9
|
+
# When this command has been executed, the created directories can be removed
|
10
|
+
# again by calling #undo.
|
11
|
+
#
|
12
|
+
# ==== Examples
|
13
|
+
#
|
14
|
+
# # Pass in the new directory name to ::new
|
15
|
+
# cmd1 = CreateDirectoryCommand.new('directory_name')
|
16
|
+
#
|
17
|
+
# # The new directory name may be a path of multiple non exsting directories (like `mkdir -p`)
|
18
|
+
# cmd2 = CreateDirectoryCommand.new('non_existing_dir1/non_existing_dir2/new_dir')
|
6
19
|
class CreateDirectoryCommand < BaseCommand
|
7
20
|
attr_reader :name
|
8
21
|
|
9
|
-
#
|
10
|
-
#
|
11
|
-
# @param name [String]
|
12
|
-
#
|
13
|
-
# ==== Attributes
|
14
|
-
#
|
15
|
-
# * +name+ - The name of the directory to be created
|
16
|
-
#
|
17
|
-
# ==== Examples
|
18
|
-
#
|
19
|
-
# # Pass in the new directory name to ::new
|
20
|
-
# cmd1 = CreateDirectoryCommand.new('directory_name')
|
21
|
-
#
|
22
|
-
# # The new directory may be a path of multiple non exsting directories (like `mkdir -p`)
|
23
|
-
# cmd2 = CreateDirectoryCommand.new('non_existing_dir1/non_existing_dir2/new_dir')
|
22
|
+
# @param name [String] The name of the new directory. May be just a name or an absolut or relative path
|
24
23
|
def initialize(name)
|
25
24
|
@name = name
|
26
25
|
end
|
@@ -1,9 +1,35 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module FileTransactions
|
4
|
+
# This command creates a new file. It will also create parent
|
5
|
+
# directories if the given path contains directories that doesn't exist.
|
6
|
+
# The block passed to +::new+ must either return a +String+ with the content
|
7
|
+
# that will be written to the new file. Or the block must itself create the file
|
8
|
+
# with the filname +name+ (and return anything but a String).
|
9
|
+
#
|
10
|
+
# When this command has been executed, the created file (and any directories)
|
11
|
+
# can be removed again by calling #undo.
|
12
|
+
#
|
13
|
+
# ==== Examples
|
14
|
+
#
|
15
|
+
# # Pass in the new directory name to ::new
|
16
|
+
# cmd1 = CreateFileCommand.new('new_name') do
|
17
|
+
# <<~EOF
|
18
|
+
# Some content to be
|
19
|
+
# written to the file.
|
20
|
+
# EOF
|
21
|
+
# end
|
22
|
+
#
|
23
|
+
# # Files can also be created manually.
|
24
|
+
# # Note: the block gets name as argument.
|
25
|
+
# cmd2 = CreateFileCommand.new('another_file') do |name|
|
26
|
+
# GenerateAwesomeReport.call(filename: name)
|
27
|
+
# true
|
28
|
+
# end
|
4
29
|
class CreateFileCommand < BaseCommand
|
5
30
|
attr_reader :name, :block
|
6
31
|
|
32
|
+
# @param name [String] The name of the new directory. May be just a name or an absolut or relative path
|
7
33
|
def initialize(name, &block)
|
8
34
|
@name = name
|
9
35
|
@block = block
|
@@ -4,9 +4,19 @@ require 'fileutils'
|
|
4
4
|
require 'tmpdir'
|
5
5
|
|
6
6
|
module FileTransactions
|
7
|
+
# This command supports deleting a file.
|
8
|
+
#
|
9
|
+
# When this command has been executed, the file can be restored by calling
|
10
|
+
# #undo
|
11
|
+
#
|
12
|
+
# ==== Examples
|
13
|
+
#
|
14
|
+
# # Pass in the filename name to ::new
|
15
|
+
# cmd1 = DeleteFileCommand.new('some_existing_file')
|
7
16
|
class DeleteFileCommand < BaseCommand
|
8
17
|
attr_reader :name, :block
|
9
18
|
|
19
|
+
# @param name [String] The name of the file to be deleted. May be just a name or an absolut or relative path
|
10
20
|
def initialize(name)
|
11
21
|
@name = name
|
12
22
|
end
|
@@ -1,9 +1,21 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module FileTransactions
|
4
|
+
# This command supports moveing (renaming) a file. It will also create parent
|
5
|
+
# directories if the given path contains directories that doesn't exist.
|
6
|
+
#
|
7
|
+
# When this command has been executed, the file can be moved back to the
|
8
|
+
# original location again by calling #undo. Any directories created during
|
9
|
+
# #execute will be deleted.
|
10
|
+
#
|
11
|
+
# ==== Examples
|
12
|
+
#
|
13
|
+
# cmd1 = MoveFileCommand.new('some_existing_file', 'some_new_dir/a_new_name')
|
4
14
|
class MoveFileCommand < BaseCommand
|
5
15
|
attr_reader :from, :to
|
6
16
|
|
17
|
+
# @param from [String] The name of the source file to be renamed. May be just a name or an absolut or relative path
|
18
|
+
# @param to [String] The target name of the file. May be just a name or an absolut or relative path
|
7
19
|
def initialize(from:, to:)
|
8
20
|
@from = from
|
9
21
|
@to = to
|
@@ -1,6 +1,9 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module FileTransactions
|
4
|
+
# A class that keeps track of commands and nested transactions. If an
|
5
|
+
# exception is raised inside the transaction, then all commands and nested
|
6
|
+
# transactions get undone.
|
4
7
|
class Transaction
|
5
8
|
class << self
|
6
9
|
def run(&block)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: file_transactions
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sammy Henningsson
|
@@ -30,12 +30,16 @@ cert_chain:
|
|
30
30
|
ZMhjYR7sRczGJx+GxGU2EaR0bjRsPVlC4ywtFxoOfRG3WaJcpWGEoAoMJX6Z0bRv
|
31
31
|
M40=
|
32
32
|
-----END CERTIFICATE-----
|
33
|
-
date: 2020-06-
|
33
|
+
date: 2020-06-20 00:00:00.000000000 Z
|
34
34
|
dependencies: []
|
35
35
|
description: |
|
36
|
-
A
|
37
|
-
|
38
|
-
|
36
|
+
A library for creating commands can be done and
|
37
|
+
undone. Multiple commands can be grouped together
|
38
|
+
in a transaction making sure all commands succeed
|
39
|
+
or gets rolled back. This gem includes a few
|
40
|
+
commands for file operations but it makes it easy
|
41
|
+
to create custom commands and use them for more
|
42
|
+
than just file operations.
|
39
43
|
email:
|
40
44
|
- sammy.henningsson@gmail.com
|
41
45
|
executables: []
|
metadata.gz.sig
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
5���0���t�.a1R5!� y�4���ǧ�J ��u���ҷ��y31�#��Pݒ��T���A��ŮsjO�\-�T���1��C�9��C���w�$�Yu��������WɁb'A�b�Y�n�$Q���ƈc%��ӶE�SH*6q�}�]���~gR�����{Z ���O����pWS]�~�CL��5�kS��O�~W�K{��jJ&h#����+�����?Y����SX�4I�8:
|