avm-tools 0.12.0 → 0.13.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: a7f76082f43aec3689eed38273c83e24a6307cd8e9dbb582fc0eda7d82aaaefe
4
- data.tar.gz: 39a41b349999c89af1ab6b8fdfa904382366914df067e4d48ba3d47d737b07c7
3
+ metadata.gz: 0e358cd10846dd42a33702ee9bcc47ac075d2c2df7e4019aff7876055d3e98d3
4
+ data.tar.gz: 198439929cad2eeeea336efff95b90c1a19fd83d187ba49e33f7ba9d77f49b84
5
5
  SHA512:
6
- metadata.gz: c474810c867a6aab1c11ad6229e005a79253ec4e6a36f28f3b8d7a0599627fbc73c1050bf21ea0c65cf70a29fc01dbe7a52cb6c69f88acc3d4bf3edf03e8d1f5
7
- data.tar.gz: ebc3c3801f3d050f41039e71eb1358a26918ce4d3ed89c7afd92d340c9b67d783564105eec6a2657b7f218e7816270378618556eed2b4dde913ee6907b21fe30
6
+ metadata.gz: e158e9238bb5283e8797dc7be877f1c76a76c64f2cfe43ac360a28d378555abcff90ce55b07f0bb145f17e9c7af43a3456c66e12ae1a22d8c2bf6fa92ab8c01a
7
+ data.tar.gz: f86650bedb0fff3104e595dfb69ceb42bf60209a66af36e8ff96e500a7ee8720f8151071d6d6d6ff36bd4272f755a7818ad90f401288f441223907f889304311
data/lib/avm.rb CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  module Avm
4
4
  require 'avm/configs'
5
+ require 'avm/data'
5
6
  require 'avm/git'
6
7
  require 'avm/instances'
7
8
  require 'avm/patches'
data/lib/avm/data.rb ADDED
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/require_sub'
4
+ ::EacRubyUtils.require_sub(__FILE__)
5
+
6
+ module Avm
7
+ module Data
8
+ end
9
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/require_sub'
4
+ ::EacRubyUtils.require_sub(__FILE__)
5
+
6
+ module Avm
7
+ module Data
8
+ module Instance
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'avm/data/package'
4
+
5
+ module Avm
6
+ module Data
7
+ module Instance
8
+ class Package < ::Avm::Data::Package
9
+ attr_reader :instance
10
+
11
+ def initialize(instance, options = {})
12
+ @instance = instance
13
+ super options
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'avm/data/unit'
4
+
5
+ module Avm
6
+ module Data
7
+ module Instance
8
+ class Unit < ::Avm::Data::Unit
9
+ attr_reader :instance
10
+
11
+ def initialize(instance)
12
+ @instance = instance
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'avm/data/package/dump'
4
+ require 'avm/data/package/load'
5
+
6
+ module Avm
7
+ module Data
8
+ class Package
9
+ attr_reader :units
10
+
11
+ def initialize(options)
12
+ @units = {}
13
+ options = options.to_options_consumer
14
+ units = options.consume(:units)
15
+ options.validate
16
+ units.if_present do |v|
17
+ v.each { |identifier, unit| add_unit(identifier, unit) }
18
+ end
19
+ end
20
+
21
+ def add_unit(identifier, unit)
22
+ @units[identifier.to_sym] = unit
23
+ end
24
+
25
+ def dump(data_path, options = {})
26
+ ::Avm::Data::Package::Dump.new(self, data_path, options)
27
+ end
28
+
29
+ def load(data_path)
30
+ ::Avm::Data::Package::Load.new(self, data_path)
31
+ end
32
+
33
+ def dump_units_to_directory(directory)
34
+ @units.each { |identifier, unit| unit.dump_to_directory(directory, identifier) }
35
+ end
36
+
37
+ def load_units_from_directory(directory)
38
+ @units.each { |identifier, unit| unit.load_from_directory(directory, identifier) }
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,116 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+ require 'minitar'
5
+
6
+ module Avm
7
+ module Data
8
+ class Package
9
+ class Dump
10
+ enable_console_speaker
11
+ enable_listable
12
+
13
+ DEFAULT_EXPIRE_TIME = 1.days
14
+
15
+ attr_reader :package, :data_file_path, :existing
16
+
17
+ lists.add_string :existing, :denied, :overwrite, :rotate, :rotate_expired
18
+
19
+ def initialize(package, data_file_path, options = {})
20
+ @package = package
21
+ @data_file_path = data_file_path
22
+ options = options.to_options_consumer
23
+ @existing, @expire_time = options.consume(:existing, :expire_time)
24
+ options.validate
25
+ self.class.lists.existing.value_validate!(@existing)
26
+ end
27
+
28
+ def runnable?
29
+ cannot_run_reason.blank?
30
+ end
31
+
32
+ def cannot_run_reason
33
+ return nil if !data_file_exist? ||
34
+ [EXISTING_OVERWRITE, EXISTING_ROTATE].include?(existing)
35
+
36
+ if existing == EXISTING_DENIED
37
+ 'Data exist and overwriting is denied'
38
+ elsif existing == EXISTING_ROTATE_EXPIRED && !data_file_expired?
39
+ 'Data exist and yet is not expired'
40
+ end
41
+ end
42
+
43
+ def run
44
+ raise "Cannot run: #{cannot_run_reason}" unless runnable?
45
+
46
+ build_dir = dump_units_to_build_directory
47
+ package_file = create_package_file(build_dir)
48
+ rotate
49
+ move_download_to_final_dest(package_file)
50
+ end
51
+
52
+ def data_file_exist?
53
+ ::File.exist?(data_file_path)
54
+ end
55
+
56
+ def data_file_time
57
+ data_file_exist? ? ::Time.now - ::File.mtime(data_file_path) : nil
58
+ end
59
+
60
+ def data_file_expired?
61
+ data_file_time.if_present(false) { |v| v >= expire_time }
62
+ end
63
+
64
+ def expire_time
65
+ @expire_time || DEFAULT_EXPIRE_TIME
66
+ end
67
+
68
+ private
69
+
70
+ def download
71
+ infom 'Downloading dump...'
72
+ download_path = find_download_path
73
+ dump_command.system!(output_file: download_path)
74
+ fatal_error "File \"#{download_path}\" not saved" unless ::File.exist?(download_path)
75
+ fatal_error "File \"#{download_path}\" is empty" if ::File.zero?(download_path)
76
+ download_path
77
+ end
78
+
79
+ def move_download_to_final_dest(download_path)
80
+ ::FileUtils.mv(download_path, data_file_path)
81
+ end
82
+
83
+ def rotate
84
+ return unless data_file_exist?
85
+ return unless existing == EXISTING_ROTATE
86
+
87
+ infom "Rotating \"#{data_file_path}\"..."
88
+ ::Avm::Files::Rotate.new(data_file_path).run
89
+ end
90
+
91
+ def new_build_path
92
+ f = ::Tempfile.new(self.class.name.parameterize + '-download')
93
+ path = f.path
94
+ f.close
95
+ f.unlink
96
+ path
97
+ end
98
+
99
+ def dump_units_to_build_directory
100
+ dir = ::Dir.mktmpdir
101
+ package.dump_units_to_directory(dir)
102
+ dir
103
+ end
104
+
105
+ def create_package_file(build_dir)
106
+ package_path = new_build_path
107
+ infom "Creating package \"#{package_path}\" from \"#{build_dir}\"..."
108
+ Dir.chdir(build_dir) do
109
+ ::Minitar.pack('.', File.open(::File.expand_path(package_path), 'wb'))
110
+ end
111
+ package_path
112
+ end
113
+ end
114
+ end
115
+ end
116
+ end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+ require 'minitar'
5
+
6
+ module Avm
7
+ module Data
8
+ class Package
9
+ class Load
10
+ enable_console_speaker
11
+
12
+ attr_reader :package, :data_file_path
13
+
14
+ def initialize(package, data_file_path)
15
+ @package = package
16
+ @data_file_path = data_file_path
17
+ end
18
+
19
+ def runnable?
20
+ cannot_run_reason.blank?
21
+ end
22
+
23
+ def cannot_run_reason
24
+ return nil if data_file_exist?
25
+
26
+ "Data file \"#{data_file_path}\" does not exist"
27
+ end
28
+
29
+ def run
30
+ raise "Cannot run: #{cannot_run_reason}" unless runnable?
31
+
32
+ build_dir = extract_packages_to_build_directory
33
+ package.load_units_from_directory(build_dir)
34
+ end
35
+
36
+ def data_file_exist?
37
+ ::File.exist?(data_file_path)
38
+ end
39
+
40
+ def extract_packages_to_build_directory
41
+ dir = ::Dir.mktmpdir
42
+ ::Minitar.unpack(data_file_path, dir)
43
+ dir
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,83 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+ require 'active_support/callbacks'
5
+
6
+ module Avm
7
+ module Data
8
+ class Unit
9
+ include ::ActiveSupport::Callbacks
10
+
11
+ define_callbacks :dump, :load
12
+ enable_console_speaker
13
+
14
+ %w[dump load].each do |action|
15
+ class_eval <<~CODE, __FILE__, __LINE__ + 1
16
+ # Should be overrided.
17
+ # @return [EacRubyUtils::Envs::Command]
18
+ def #{action}_command
19
+ fail "Abstract method. Override in #{singleton_class}."
20
+ end
21
+ CODE
22
+
23
+ # Callbacks
24
+ %w[before after].each do |callback|
25
+ method = "#{callback}_#{action}"
26
+ class_eval <<~CODE, __FILE__, __LINE__ + 1
27
+ def self.#{method}(callback_method = nil, &block)
28
+ if callback_method
29
+ set_callback :#{action}, :#{callback}, callback_method
30
+ else
31
+ set_callback :#{action}, :#{callback}, &block
32
+ end
33
+ self
34
+ end
35
+
36
+ def #{method}(callback_method = nil, &block)
37
+ singleton_class.#{method}(callback_method, &block)
38
+ self
39
+ end
40
+ CODE
41
+ end
42
+ end
43
+
44
+ def extension
45
+ singleton_class.const_get('EXTENSION')
46
+ rescue NameError
47
+ ''
48
+ end
49
+
50
+ def name
51
+ self.class
52
+ end
53
+
54
+ def load_from_directory(directory, identifier)
55
+ load(unit_on_directory_path(directory, identifier))
56
+ end
57
+
58
+ def dump_to_directory(directory, identifier)
59
+ dump(unit_on_directory_path(directory, identifier))
60
+ end
61
+
62
+ def dump(data_path)
63
+ run_callbacks :dump do
64
+ infom "Dumping unit \"#{name}\" to \"#{data_path}\"..."
65
+ dump_command.execute!(output_file: data_path)
66
+ end
67
+ end
68
+
69
+ def load(data_path)
70
+ run_callbacks :load do
71
+ infom "Loading unit \"#{name}\" from \"#{data_path}\"..."
72
+ load_command.execute!(input_file: data_path)
73
+ end
74
+ end
75
+
76
+ private
77
+
78
+ def unit_on_directory_path(directory, identifier)
79
+ ::File.join(directory, "#{identifier}#{extension}")
80
+ end
81
+ end
82
+ end
83
+ end
@@ -2,6 +2,8 @@
2
2
 
3
3
  require 'avm/instances/base'
4
4
  require 'avm/stereotypes/postgresql/instance_with'
5
+ require 'avm/data/instance/package'
6
+ require 'avm/stereotypes/eac_wordpress_base0/uploads_data_unit'
5
7
 
6
8
  module Avm
7
9
  module Stereotypes
@@ -17,6 +19,24 @@ module Avm
17
19
  parent = ::OpenStruct.new(instance: self)
18
20
  subcommand_class.new(argv: argv, parent: parent).run
19
21
  end
22
+
23
+ def data_package
24
+ @data_package ||= ::Avm::Data::Instance::Package.new(
25
+ self, units: { database: database_unit, uploads: UploadsDataUnit.new(self) }
26
+ )
27
+ end
28
+
29
+ def database_unit
30
+ self_instance = self
31
+ pg.data_unit.after_load do
32
+ info 'Fixing web addresses...'
33
+ run_sql(<<~SQL)
34
+ update wp_options
35
+ set option_value = '#{self_instance.read_entry('url')}'
36
+ where option_name in ('siteurl', 'home')
37
+ SQL
38
+ end
39
+ end
20
40
  end
21
41
  end
22
42
  end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'minitar'
4
+ require 'zlib'
5
+ require 'avm/data/instance/unit'
6
+
7
+ module Avm
8
+ module Stereotypes
9
+ module EacWordpressBase0
10
+ class Instance < ::Avm::Instances::Base
11
+ class UploadsDataUnit < ::Avm::Data::Instance::Unit
12
+ EXTENSION = '.tar.gz'
13
+
14
+ before_load :clear_uploads
15
+
16
+ def uploads_path
17
+ ::File.join(instance.read_entry(:fs_path), 'wp-content', 'uploads')
18
+ end
19
+
20
+ def dump_command
21
+ instance.host_env.command('tar', '-czf', '-', '-C', uploads_path, '.')
22
+ end
23
+
24
+ def load_command
25
+ instance.host_env.command('tar', '-xzf', '-', '-C', uploads_path)
26
+ end
27
+
28
+ def clear_uploads
29
+ infom "Removing all files under #{uploads_path}..."
30
+ instance.host_env.command('find', uploads_path, '-mindepth', 1, '-delete').execute!
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'avm/stereotypes/postgresql/instance/data_unit'
4
+
3
5
  module Avm
4
6
  module Stereotypes
5
7
  module Postgresql
@@ -9,6 +11,10 @@ module Avm
9
11
  @connection_params = connection_params.with_indifferent_access
10
12
  end
11
13
 
14
+ def data_unit
15
+ ::Avm::Stereotypes::Postgresql::Instance::DataUnit.new(self)
16
+ end
17
+
12
18
  def dump_command
13
19
  env.command('pg_dump', '--no-privileges', '--clean', '--no-owner', *common_command_args)
14
20
  .envvar('PGPASSWORD', password)
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'avm/data/instance/unit'
4
+
5
+ module Avm
6
+ module Stereotypes
7
+ module Postgresql
8
+ class Instance
9
+ class DataUnit < ::Avm::Data::Instance::Unit
10
+ EXTENSION = '.pgdump.gz'
11
+
12
+ before_load :clear_database
13
+
14
+ def dump_command
15
+ instance.dump_gzip_command
16
+ end
17
+
18
+ def load_command
19
+ instance.psql_command.prepend(['gzip', '-d', '@ESC_|'])
20
+ end
21
+
22
+ private
23
+
24
+ def clear_database
25
+ info 'Clearing database (Dropping all tables)...'
26
+ run_sql(drop_all_tables_sql).if_present { |v| run_sql(v) }
27
+ end
28
+
29
+ def drop_all_tables_sql
30
+ "select 'drop table \"' || tablename || '\" cascade;' from pg_tables " \
31
+ "where schemaname = 'public';"
32
+ end
33
+
34
+ def run_sql(sql)
35
+ instance.psql_command_command(sql).execute!
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -3,6 +3,7 @@
3
3
  require 'active_support/core_ext/numeric/time'
4
4
  require 'eac_ruby_utils/console/speaker'
5
5
  require 'eac_ruby_utils/simple_cache'
6
+ require 'avm/data/package/dump'
6
7
 
7
8
  module Avm
8
9
  module Tools
@@ -31,10 +32,10 @@ module Avm
31
32
  DOCUMENT
32
33
 
33
34
  def run
34
- if run_dump?
35
- run_dump
35
+ if package_dump.runnable?
36
+ package_dump.run
36
37
  else
37
- warn(format(NO_DUMP_MESSAGE, dump_path))
38
+ warn(package_dump.cannot_run_reason)
38
39
  end
39
40
  success("Dump path: \"#{dump_path}\"")
40
41
  dump_path
@@ -42,6 +43,10 @@ module Avm
42
43
 
43
44
  private
44
45
 
46
+ def package_dump_uncached
47
+ context(:instance).data_package.dump(dump_path, existing: package_dump_existing)
48
+ end
49
+
45
50
  def dump_path
46
51
  options.fetch('--dump-path') || default_dump_path
47
52
  end
@@ -50,58 +55,12 @@ module Avm
50
55
  context(:instance).read_entry(DEFAULT_DUMP_PATH_ENTRY_SUFFIX)
51
56
  end
52
57
 
53
- def dump_exist?
54
- ::File.exist?(dump_path)
55
- end
56
-
57
- def dump_time_uncached
58
- dump_exist? ? ::Time.now - ::File.mtime(dump_path) : nil
59
- end
60
-
61
- def dump_expired?
62
- return false unless dump_time.present?
63
-
64
- dump_time >= DUMP_EXPIRE_TIME
65
- end
66
-
67
- def run_dump
68
- download_dump
69
- rotate_dump
70
- move_download_to_final_dest
71
- end
72
-
73
- def download_dump
74
- infom 'Downloading dump...'
75
- dump_command.system!(output_file: download_path)
76
- fatal_error "File \"#{download_path}\" not saved" unless ::File.exist?(download_path)
77
- fatal_error "File \"#{download_path}\" is empty" if ::File.zero?(download_path)
78
- end
79
-
80
- def move_download_to_final_dest
81
- ::FileUtils.mv(download_path, dump_path)
82
- end
83
-
84
- def rotate_dump
85
- return unless dump_exist?
86
-
87
- info "Rotating \"#{dump_path}\"..."
88
- ::Avm::Files::Rotate.new(dump_path).run
89
- end
90
-
91
- def download_path_uncached
92
- f = ::Tempfile.new('eac_rails_base0_data_dump')
93
- path = f.path
94
- f.close
95
- f.unlink
96
- path
97
- end
98
-
99
- def run_dump?
100
- !dump_exist? || options.fetch('--rewrite') || dump_expired?
101
- end
102
-
103
- def dump_command
104
- context(:instance).pg.dump_gzip_command
58
+ def package_dump_existing
59
+ if options.fetch('--rewrite')
60
+ ::Avm::Data::Package::Dump::EXISTING_ROTATE
61
+ else
62
+ ::Avm::Data::Package::Dump::EXISTING_ROTATE_EXPIRED
63
+ end
105
64
  end
106
65
  end
107
66
  end
@@ -29,9 +29,7 @@ module Avm
29
29
  return ::Dev::Result.error("Dump \"#{dump_path}\" does not exist") unless
30
30
  ::File.exist?(dump_path)
31
31
 
32
- before_load
33
32
  load_dump
34
- fix_web_addresses
35
33
  success("Dump loaded from \"#{dump_path}\"")
36
34
  end
37
35
 
@@ -50,39 +48,18 @@ module Avm
50
48
 
51
49
  def load_dump
52
50
  info "Loading dump \"#{dump_path}\"..."
53
- ::EacRubyUtils::Envs.local.command('cat', dump_path).pipe(load_command).execute!
51
+ package_load.run
52
+ #::EacRubyUtils::Envs.local.command('cat', dump_path).pipe(load_command).execute!
54
53
  end
55
54
 
56
55
  def dump_instance_method
57
56
  :dump_database
58
57
  end
59
58
 
60
- def before_load
61
- info 'Clearing database (Dropping all tables)...'
62
- sql = run_sql(drop_all_tables_sql)
63
- run_sql(sql) if sql.present?
64
- end
65
-
66
- def drop_all_tables_sql
67
- "select 'drop table \"' || tablename || '\" cascade;' from pg_tables " \
68
- "where schemaname = 'public';"
69
- end
70
-
71
- def run_sql(sql)
72
- context(:instance).pg.psql_command_command(sql).execute!
73
- end
74
-
75
- def load_command
76
- context(:instance).pg.psql_command.prepend(['gzip', '-d', '@ESC_|'])
77
- end
59
+ private
78
60
 
79
- def fix_web_addresses
80
- info 'Fixing web addresses...'
81
- run_sql(<<~SQL)
82
- update wp_options
83
- set option_value = '#{context(:instance).read_entry('url')}'
84
- where option_name in ('siteurl', 'home')
85
- SQL
61
+ def package_load_uncached
62
+ context(:instance).data_package.load(dump_path)
86
63
  end
87
64
  end
88
65
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Avm
4
4
  module Tools
5
- VERSION = '0.12.0'
5
+ VERSION = '0.13.0'
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: avm-tools
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.12.0
4
+ version: 0.13.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Esquilo Azul Company
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-09-26 00:00:00.000000000 Z
11
+ date: 2019-09-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aranha-parsers
@@ -76,14 +76,14 @@ dependencies:
76
76
  requirements:
77
77
  - - "~>"
78
78
  - !ruby/object:Gem::Version
79
- version: '0.11'
79
+ version: '0.12'
80
80
  type: :runtime
81
81
  prerelease: false
82
82
  version_requirements: !ruby/object:Gem::Requirement
83
83
  requirements:
84
84
  - - "~>"
85
85
  - !ruby/object:Gem::Version
86
- version: '0.11'
86
+ version: '0.12'
87
87
  - !ruby/object:Gem::Dependency
88
88
  name: filesize
89
89
  requirement: !ruby/object:Gem::Requirement
@@ -98,6 +98,20 @@ dependencies:
98
98
  - - ">="
99
99
  - !ruby/object:Gem::Version
100
100
  version: '0'
101
+ - !ruby/object:Gem::Dependency
102
+ name: minitar
103
+ requirement: !ruby/object:Gem::Requirement
104
+ requirements:
105
+ - - ">="
106
+ - !ruby/object:Gem::Version
107
+ version: '0'
108
+ type: :runtime
109
+ prerelease: false
110
+ version_requirements: !ruby/object:Gem::Requirement
111
+ requirements:
112
+ - - ">="
113
+ - !ruby/object:Gem::Version
114
+ version: '0'
101
115
  - !ruby/object:Gem::Dependency
102
116
  name: rspec
103
117
  requirement: !ruby/object:Gem::Requirement
@@ -157,6 +171,14 @@ files:
157
171
  - exe/avm
158
172
  - lib/avm.rb
159
173
  - lib/avm/configs.rb
174
+ - lib/avm/data.rb
175
+ - lib/avm/data/instance.rb
176
+ - lib/avm/data/instance/package.rb
177
+ - lib/avm/data/instance/unit.rb
178
+ - lib/avm/data/package.rb
179
+ - lib/avm/data/package/dump.rb
180
+ - lib/avm/data/package/load.rb
181
+ - lib/avm/data/unit.rb
160
182
  - lib/avm/files.rb
161
183
  - lib/avm/files/rotate.rb
162
184
  - lib/avm/git.rb
@@ -181,8 +203,10 @@ files:
181
203
  - lib/avm/result.rb
182
204
  - lib/avm/stereotypes.rb
183
205
  - lib/avm/stereotypes/eac_wordpress_base0/instance.rb
206
+ - lib/avm/stereotypes/eac_wordpress_base0/uploads_data_unit.rb
184
207
  - lib/avm/stereotypes/postgresql.rb
185
208
  - lib/avm/stereotypes/postgresql/instance.rb
209
+ - lib/avm/stereotypes/postgresql/instance/data_unit.rb
186
210
  - lib/avm/stereotypes/postgresql/instance_with.rb
187
211
  - lib/avm/tools.rb
188
212
  - lib/avm/tools/git.rb