avm 0.73.1 → 0.75.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: 7982b293a654555c267bc2f3b8856a40e4e60a5ee2a9bcc08796d4814a811c15
4
- data.tar.gz: 6a8ade3bc981708360d1cecdb7e9ee1461d0fad4ff3daa0ae7de1f6636e99e9d
3
+ metadata.gz: 283b2992d153ecb696d270dca06440c1211ad0986d2bcccbba13d59880ec8241
4
+ data.tar.gz: df2da2e866a10834d9b2d7c07e921f332de3b64937592bad04eb0c334cd1b3a6
5
5
  SHA512:
6
- metadata.gz: 32e5a58c320316929d9d954b98a284f40e4231af15b848513cdfcfc91364ad20362b95c05af1fe6c3f4822fc786a981129c8d3878d55104189f2d7af91c442f9
7
- data.tar.gz: de0f2e9f63d6bd9e3aac64f36ef505f028494462e6e734b42efc1c88be62bb77041e3c2a8ff31a92293884e4d3e73872a9c95e219fc7e3909d6308de124563cc
6
+ metadata.gz: 57b1246b460a76df268e0b1021e27e7a38ba6056225b5c363fa8ad53b52d5ec09d092518709060cab4fc8b472cce619d8a8b84ed9ff398e502ee5b827613d40b
7
+ data.tar.gz: 4552cfce3a392507c560938a8ae956278fe03b335d50c5213e4aecfde007b5beaa66012fc0c32a24ab0736f2dae4b5b85e0b3310c7c803a96c6d74e240fae775
@@ -0,0 +1,142 @@
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
+ DEFAULT_OVERWRITE = false
13
+ DEFAULT_ROTATE = true
14
+
15
+ enable_speaker
16
+ enable_listable
17
+ immutable_accessor :expire_time, :target_path
18
+ immutable_accessor :overwrite, :rotate, type: :boolean
19
+
20
+ # @return [nil]
21
+ def cannot_perform_reason
22
+ nil
23
+ end
24
+
25
+ # @return [Pathname]
26
+ def default_dump_path
27
+ r = data_owner.data_default_dump_path
28
+ include_excludes_path_suffix.if_present(r) do |v|
29
+ r.basename_sub('.*') { |b| "#{b}#{v}#{r.extname}" }
30
+ end
31
+ end
32
+
33
+ # @return [Boolean]
34
+ def target_path_expired?
35
+ target_path_time.if_present(true) { |v| v >= expire_time }
36
+ end
37
+
38
+ # @return [ActiveSupport::Duration, nil]
39
+ def target_path_time
40
+ target_path.exist? ? ::Time.now - ::File.mtime(target_path) : nil
41
+ end
42
+
43
+ protected
44
+
45
+ attr_reader :temp_data_path
46
+
47
+ # @return [Array<Symbol>]
48
+ def all_units
49
+ data_owner.units.keys.sort
50
+ end
51
+
52
+ def build_temp_data_file
53
+ data_owner.dump(temp_data_path, *include_excludes_arguments)
54
+ raise "\"#{temp_data_path}\" do not exist" unless temp_data_path.exist?
55
+ raise "\"#{temp_data_path}\" is not a file" unless temp_data_path.file?
56
+ end
57
+
58
+ # @return [String, nil]
59
+ def do_rotate
60
+ return unless target_path.exist?
61
+ return unless rotate?
62
+
63
+ infom "Rotating \"#{target_path}\"..."
64
+ ::Avm::Data::Rotate.new(target_path).run
65
+ end
66
+
67
+ # @return [Array<Symbol>]
68
+ def excluded_units
69
+ excludes.map(&:to_sym).sort
70
+ end
71
+
72
+ # @return [ActiveSupport::Duration]
73
+ def expire_time_get_filter(value)
74
+ value || DEFAULT_EXPIRE_TIME
75
+ end
76
+
77
+ # @return [String]
78
+ def include_excludes_path_suffix
79
+ return nil unless data_owner.respond_to?(:units)
80
+
81
+ r = included_units.any? ? included_units : all_units
82
+ r -= excluded_units if excluded_units.any?
83
+ r.any? && r != all_units ? "_#{r.join('-')}" : ''
84
+ end
85
+
86
+ # @return [Array<Symbol>]
87
+ def included_units
88
+ includes.map(&:to_sym).sort
89
+ end
90
+
91
+ # @return [self]
92
+ def internal_perform
93
+ use_current? ? internal_perform_use_current : internal_perform_new
94
+ end
95
+
96
+ def internal_perform_new
97
+ on_temp_data_file do
98
+ build_temp_data_file
99
+ do_rotate
100
+ move_data_to_target_path
101
+ end
102
+ end
103
+
104
+ def internal_perform_use_current
105
+ infom "Dump \"#{target_path}\" exists and is unexpired"
106
+ end
107
+
108
+ def move_data_to_target_path
109
+ ::FileUtils.mv(temp_data_path, target_path.assert_parent)
110
+ end
111
+
112
+ def on_temp_data_file
113
+ ::EacRubyUtils::Fs::Temp.on_file do |file|
114
+ @temp_data_path = file.to_pathname
115
+ yield
116
+ end
117
+ end
118
+
119
+ # @return [Boolean]
120
+ def overwrite_get_filter(value)
121
+ value.nil? ? DEFAULT_OVERWRITE : value
122
+ end
123
+
124
+ def rotate_get_filter(value)
125
+ value.nil? ? DEFAULT_ROTATE : value
126
+ end
127
+
128
+ # @return [Pathname]
129
+ def target_path_get_filter(value)
130
+ (value || default_dump_path).to_pathname
131
+ end
132
+
133
+ # @return [Boolean]
134
+ def use_current?
135
+ return false unless target_path.exist?
136
+ return false if overwrite?
137
+
138
+ !target_path_expired?
139
+ end
140
+ end
141
+ end
142
+ end
@@ -0,0 +1,28 @@
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 Loader < ::Avm::Data::Performer
11
+ immutable_accessor :source_path
12
+
13
+ # @return [String, nil]
14
+ def cannot_perform_reason
15
+ return 'Source path not set' if source_path.blank?
16
+ return "\"#{source_path}\" is not a file" unless source_path.file?
17
+
18
+ nil
19
+ end
20
+
21
+ protected
22
+
23
+ def internal_perform
24
+ data_owner.load(source_path, *include_excludes_arguments)
25
+ end
26
+ end
27
+ end
28
+ 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
- enable_speaker
13
- enable_listable
11
+ class Dump < ::Avm::Data::Package::BasePerformer
12
+ enable_method_class
14
13
  include ::Avm::Data::Package::BuildDirectory
15
14
 
16
- DEFAULT_EXPIRE_TIME = 1.day
15
+ attr_reader :target_path
17
16
 
18
- attr_reader :package, :data_file_path, :existing
19
-
20
- lists.add_string :existing, :denied, :overwrite, :rotate, :rotate_expired
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
- def run
47
- raise "Cannot run: #{cannot_run_reason}" unless runnable?
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
- def new_build_path
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
- package_path = new_build_path
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(::File.expand_path(package_path), 'wb'))
39
+ ::Minitar.pack('.', ::File.open(target_path, 'wb'))
105
40
  end
106
- package_path
107
41
  end
108
42
  end
109
43
  end
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'avm/data/package/base_performer'
3
4
  require 'avm/data/package/build_directory'
4
5
  require 'eac_ruby_utils/core_ext'
5
6
  require 'minitar'
@@ -7,37 +8,27 @@ require 'minitar'
7
8
  module Avm
8
9
  module Data
9
10
  class Package
10
- class Load
11
+ class Load < ::Avm::Data::Package::BasePerformer
12
+ enable_method_class
11
13
  enable_speaker
12
14
  include ::Avm::Data::Package::BuildDirectory
13
15
 
14
- common_constructor :package, :data_file_path
16
+ attr_reader :source_path
15
17
 
16
- def runnable?
17
- cannot_run_reason.blank?
18
+ def initialize(package, source_path, options = {})
19
+ super(package, options)
20
+ @source_path = source_path.to_pathname
18
21
  end
19
22
 
20
- def cannot_run_reason
21
- return nil if data_file_exist?
22
-
23
- "Data file \"#{data_file_path}\" does not exist"
24
- end
25
-
26
- def run
27
- raise "Cannot run: #{cannot_run_reason}" unless runnable?
28
-
23
+ def result
29
24
  on_build_directory do
30
25
  extract_packages_to_build_directory
31
- package.load_units_from_directory(build_directory)
26
+ package.load_units_from_directory(build_directory, selected_units)
32
27
  end
33
28
  end
34
29
 
35
- def data_file_exist?
36
- ::File.exist?(data_file_path)
37
- end
38
-
39
30
  def extract_packages_to_build_directory
40
- ::Minitar.unpack(data_file_path, build_directory.to_path)
31
+ ::Minitar.unpack(source_path.to_path, build_directory.to_path)
41
32
  end
42
33
  end
43
34
  end
@@ -32,23 +32,19 @@ 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
- def load(data_path)
40
- ::Avm::Data::Package::Load.new(self, data_path)
41
- end
42
-
43
- def dump_units_to_directory(directory)
35
+ def dump_units_to_directory(directory, selected_units = nil)
44
36
  run_callbacks :dump do
45
- units.each { |identifier, unit| unit.dump_to_directory(directory, identifier) }
37
+ (selected_units || units).each do |identifier, unit|
38
+ unit.dump_to_directory(directory, identifier)
39
+ end
46
40
  end
47
41
  end
48
42
 
49
- def load_units_from_directory(directory)
43
+ def load_units_from_directory(directory, selected_units = nil)
50
44
  run_callbacks :load do
51
- units.each { |identifier, unit| unit.load_from_directory(directory, identifier) }
45
+ (selected_units || units).each do |identifier, unit|
46
+ unit.load_from_directory(directory, identifier)
47
+ end
52
48
  end
53
49
  end
54
50
 
@@ -19,7 +19,7 @@ module Avm
19
19
 
20
20
  # @return [self]
21
21
  def perform
22
- raise "Cannot run: #{cannot_run_reason}" unless performable?
22
+ raise "Cannot run: #{cannot_perform_reason}" unless performable?
23
23
 
24
24
  internal_perform
25
25
 
@@ -12,6 +12,11 @@ module Avm
12
12
  @instance = instance
13
13
  super options
14
14
  end
15
+
16
+ # @return [Pathname]
17
+ def data_default_dump_path
18
+ instance.data_default_dump_path.to_pathname
19
+ end
15
20
  end
16
21
  end
17
22
  end
data/lib/avm/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Avm
4
- VERSION = '0.73.1'
4
+ VERSION = '0.75.0'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: avm
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.73.1
4
+ version: 0.75.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eduardo H. Bogoni
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-05-21 00:00:00.000000000 Z
11
+ date: 2023-05-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aranha-parsers
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0.18'
19
+ version: '0.19'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '0.18'
26
+ version: '0.19'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: eac_cli
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -233,6 +233,8 @@ 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
237
+ - lib/avm/data/loader.rb
236
238
  - lib/avm/data/package.rb
237
239
  - lib/avm/data/package/base_performer.rb
238
240
  - lib/avm/data/package/build_directory.rb