avm 0.73.1 → 0.75.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 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