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
         |