avm 0.73.1 → 0.74.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 +4 -4
- data/lib/avm/data/dumper.rb +127 -0
- data/lib/avm/data/package/dump.rb +14 -80
- data/lib/avm/data/package.rb +4 -6
- data/lib/avm/instances/data/package.rb +5 -0
- data/lib/avm/version.rb +1 -1
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 69fd41323b3ec2e08b3339520c7ac89b6a0a1f8504f662033e68f9a5f8d43eed
|
4
|
+
data.tar.gz: 32aa288f19bcfc07f494479e1c1fe04c660d77fdc3435e63c81ff9beb1ea97b2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9fac0d42acc16cc1cf70b6c5331c20171356354400de3473aa5341d8b2c01d7b6c6ea168778359d50a867e6637678b5ad85f0f8ccc7aa5ff44f5c126728576a1
|
7
|
+
data.tar.gz: 36ae852382bacaeb8918cb351d3e9a7bff8db59476bd8ca3fa1ec88fcb20dbcad5546027b5b49a5789387017d59b1cc7b0d40fedb0c20c20f2234a0a3a28cf25
|
@@ -0,0 +1,127 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'avm/data/performer'
|
4
|
+
require 'avm/data/rotate'
|
5
|
+
require 'eac_ruby_utils/core_ext'
|
6
|
+
require 'eac_ruby_utils/fs/temp'
|
7
|
+
|
8
|
+
module Avm
|
9
|
+
module Data
|
10
|
+
class Dumper < ::Avm::Data::Performer
|
11
|
+
DEFAULT_EXPIRE_TIME = 1.day
|
12
|
+
|
13
|
+
enable_speaker
|
14
|
+
enable_listable
|
15
|
+
lists.add_symbol :existing, :denied, :overwrite, :rotate, :rotate_expired
|
16
|
+
immutable_accessor :existing, :expire_time, :target_path
|
17
|
+
|
18
|
+
# @return [String, nil]
|
19
|
+
def cannot_perform_reason
|
20
|
+
return nil if !target_path.exist? ||
|
21
|
+
[EXISTING_OVERWRITE, EXISTING_ROTATE].include?(existing)
|
22
|
+
|
23
|
+
if existing == EXISTING_DENIED
|
24
|
+
'Data exist and overwriting is denied'
|
25
|
+
elsif existing == EXISTING_ROTATE_EXPIRED && !target_path_expired?
|
26
|
+
'Data exist and yet is not expired'
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
# @return [Pathname]
|
31
|
+
def default_dump_path
|
32
|
+
r = data_owner.data_default_dump_path
|
33
|
+
include_excludes_path_suffix.if_present(r) do |v|
|
34
|
+
r.basename_sub('.*') { |b| "#{b}#{v}#{r.extname}" }
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# @return [Boolean]
|
39
|
+
def target_path_expired?
|
40
|
+
target_path_time.if_present(false) { |v| v >= expire_time }
|
41
|
+
end
|
42
|
+
|
43
|
+
# @return [ActiveSupport::Duration, nil]
|
44
|
+
def target_path_time
|
45
|
+
target_path.exist? ? ::Time.now - ::File.mtime(target_path) : nil
|
46
|
+
end
|
47
|
+
|
48
|
+
protected
|
49
|
+
|
50
|
+
attr_reader :temp_data_path
|
51
|
+
|
52
|
+
# @return [Array<Symbol>]
|
53
|
+
def all_units
|
54
|
+
data_owner.units.keys.sort
|
55
|
+
end
|
56
|
+
|
57
|
+
def build_temp_data_file
|
58
|
+
data_owner.dump(temp_data_path, *include_excludes_arguments)
|
59
|
+
raise "\"#{temp_data_path}\" do not exist" unless temp_data_path.exist?
|
60
|
+
raise "\"#{temp_data_path}\" is not a file" unless temp_data_path.file?
|
61
|
+
end
|
62
|
+
|
63
|
+
# @return [Array<Symbol>]
|
64
|
+
def excluded_units
|
65
|
+
excludes.map(&:to_sym).sort
|
66
|
+
end
|
67
|
+
|
68
|
+
# @return [Symbol, nil]
|
69
|
+
def existing_set_filter(value)
|
70
|
+
value.nil? ? nil : self.class.lists.existing.value_validate!(value)
|
71
|
+
end
|
72
|
+
|
73
|
+
# @return [ActiveSupport::Duration]
|
74
|
+
def expire_time_get_filter(value)
|
75
|
+
value || DEFAULT_EXPIRE_TIME
|
76
|
+
end
|
77
|
+
|
78
|
+
# @return [String]
|
79
|
+
def include_excludes_path_suffix
|
80
|
+
return nil unless data_owner.respond_to?(:units)
|
81
|
+
|
82
|
+
r = included_units.any? ? included_units : all_units
|
83
|
+
r -= excluded_units if excluded_units.any?
|
84
|
+
r.any? && r != all_units ? "_#{r.join('-')}" : ''
|
85
|
+
end
|
86
|
+
|
87
|
+
# @return [Array<Symbol>]
|
88
|
+
def included_units
|
89
|
+
includes.map(&:to_sym).sort
|
90
|
+
end
|
91
|
+
|
92
|
+
# @return [self]
|
93
|
+
def internal_perform
|
94
|
+
on_temp_data_file do
|
95
|
+
build_temp_data_file
|
96
|
+
rotate
|
97
|
+
move_data_to_target_path
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
def move_data_to_target_path
|
102
|
+
::FileUtils.mv(temp_data_path, target_path.assert_parent)
|
103
|
+
end
|
104
|
+
|
105
|
+
def on_temp_data_file
|
106
|
+
::EacRubyUtils::Fs::Temp.on_file do |file|
|
107
|
+
@temp_data_path = file.to_pathname
|
108
|
+
yield
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
# @return [String, nil]
|
113
|
+
def rotate
|
114
|
+
return unless target_path.exist?
|
115
|
+
return unless existing == EXISTING_ROTATE
|
116
|
+
|
117
|
+
infom "Rotating \"#{target_path}\"..."
|
118
|
+
::Avm::Data::Rotate.new(target_path).run
|
119
|
+
end
|
120
|
+
|
121
|
+
# @return [Pathname]
|
122
|
+
def target_path_get_filter(value)
|
123
|
+
(value || default_dump_path).to_pathname
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
@@ -1,109 +1,43 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'avm/data/package/base_performer'
|
3
4
|
require 'avm/data/package/build_directory'
|
4
|
-
require 'avm/data/rotate'
|
5
5
|
require 'eac_ruby_utils/core_ext'
|
6
6
|
require 'minitar'
|
7
7
|
|
8
8
|
module Avm
|
9
9
|
module Data
|
10
10
|
class Package
|
11
|
-
class Dump
|
12
|
-
|
13
|
-
enable_listable
|
11
|
+
class Dump < ::Avm::Data::Package::BasePerformer
|
12
|
+
enable_method_class
|
14
13
|
include ::Avm::Data::Package::BuildDirectory
|
15
14
|
|
16
|
-
|
15
|
+
attr_reader :target_path
|
17
16
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
def initialize(package, data_file_path, options = {})
|
23
|
-
@package = package
|
24
|
-
@data_file_path = data_file_path
|
25
|
-
options = options.to_options_consumer
|
26
|
-
@existing, @expire_time = options.consume(:existing, :expire_time)
|
27
|
-
options.validate
|
28
|
-
self.class.lists.existing.value_validate!(@existing)
|
29
|
-
end
|
30
|
-
|
31
|
-
def runnable?
|
32
|
-
cannot_run_reason.blank?
|
33
|
-
end
|
34
|
-
|
35
|
-
def cannot_run_reason
|
36
|
-
return nil if !data_file_exist? ||
|
37
|
-
[EXISTING_OVERWRITE, EXISTING_ROTATE].include?(existing)
|
38
|
-
|
39
|
-
if existing == EXISTING_DENIED
|
40
|
-
'Data exist and overwriting is denied'
|
41
|
-
elsif existing == EXISTING_ROTATE_EXPIRED && !data_file_expired?
|
42
|
-
'Data exist and yet is not expired'
|
43
|
-
end
|
17
|
+
def initialize(package, target_path, options = {})
|
18
|
+
super(package, options)
|
19
|
+
@target_path = target_path.to_pathname
|
44
20
|
end
|
45
21
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
package_file = on_build_directory do
|
22
|
+
# @return [void]
|
23
|
+
def result
|
24
|
+
on_build_directory do
|
50
25
|
dump_units_to_build_directory
|
51
26
|
create_package_file
|
52
27
|
end
|
53
|
-
rotate
|
54
|
-
move_download_to_final_dest(package_file)
|
55
|
-
end
|
56
|
-
|
57
|
-
def data_file_exist?
|
58
|
-
::File.exist?(data_file_path)
|
59
|
-
end
|
60
|
-
|
61
|
-
def data_file_time
|
62
|
-
data_file_exist? ? ::Time.now - ::File.mtime(data_file_path) : nil
|
63
|
-
end
|
64
|
-
|
65
|
-
def data_file_expired?
|
66
|
-
data_file_time.if_present(false) { |v| v >= expire_time }
|
67
|
-
end
|
68
|
-
|
69
|
-
def expire_time
|
70
|
-
@expire_time || DEFAULT_EXPIRE_TIME
|
71
|
-
end
|
72
|
-
|
73
|
-
private
|
74
|
-
|
75
|
-
def move_download_to_final_dest(download_path)
|
76
|
-
::FileUtils.mkdir_p(::File.dirname(data_file_path))
|
77
|
-
::FileUtils.mv(download_path, data_file_path)
|
78
|
-
end
|
79
|
-
|
80
|
-
def rotate
|
81
|
-
return unless data_file_exist?
|
82
|
-
return unless existing == EXISTING_ROTATE
|
83
|
-
|
84
|
-
infom "Rotating \"#{data_file_path}\"..."
|
85
|
-
::Avm::Data::Rotate.new(data_file_path).run
|
86
28
|
end
|
87
29
|
|
88
|
-
|
89
|
-
f = ::Tempfile.new(self.class.name.parameterize + '-download')
|
90
|
-
path = f.path
|
91
|
-
f.close
|
92
|
-
f.unlink
|
93
|
-
path
|
94
|
-
end
|
30
|
+
protected
|
95
31
|
|
96
32
|
def dump_units_to_build_directory
|
97
|
-
package.dump_units_to_directory(build_directory)
|
33
|
+
package.dump_units_to_directory(build_directory, selected_units)
|
98
34
|
end
|
99
35
|
|
100
36
|
def create_package_file
|
101
|
-
|
102
|
-
infom "Creating package \"#{package_path}\" from \"#{build_directory}\"..."
|
37
|
+
infom "Creating package \"#{target_path}\" from \"#{build_directory}\"..."
|
103
38
|
::Dir.chdir(build_directory.to_path) do
|
104
|
-
::Minitar.pack('.', File.open(
|
39
|
+
::Minitar.pack('.', ::File.open(target_path, 'wb'))
|
105
40
|
end
|
106
|
-
package_path
|
107
41
|
end
|
108
42
|
end
|
109
43
|
end
|
data/lib/avm/data/package.rb
CHANGED
@@ -32,17 +32,15 @@ module Avm
|
|
32
32
|
DATA_FILE_EXTENSION
|
33
33
|
end
|
34
34
|
|
35
|
-
def dump(data_path, options = {})
|
36
|
-
::Avm::Data::Package::Dump.new(self, data_path, options)
|
37
|
-
end
|
38
|
-
|
39
35
|
def load(data_path)
|
40
36
|
::Avm::Data::Package::Load.new(self, data_path)
|
41
37
|
end
|
42
38
|
|
43
|
-
def dump_units_to_directory(directory)
|
39
|
+
def dump_units_to_directory(directory, selected_units = nil)
|
44
40
|
run_callbacks :dump do
|
45
|
-
units.each
|
41
|
+
(selected_units || units).each do |identifier, unit|
|
42
|
+
unit.dump_to_directory(directory, identifier)
|
43
|
+
end
|
46
44
|
end
|
47
45
|
end
|
48
46
|
|
data/lib/avm/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: avm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.74.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eduardo H. Bogoni
|
@@ -233,6 +233,7 @@ files:
|
|
233
233
|
- lib/avm/applications/base/stereotype.rb
|
234
234
|
- lib/avm/data/callbacks.rb
|
235
235
|
- lib/avm/data/clearer.rb
|
236
|
+
- lib/avm/data/dumper.rb
|
236
237
|
- lib/avm/data/package.rb
|
237
238
|
- lib/avm/data/package/base_performer.rb
|
238
239
|
- lib/avm/data/package/build_directory.rb
|