eac_tools 0.86.0 → 0.86.1

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.
Files changed (245) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +23 -19
  3. data/lib/eac_tools/version.rb +1 -1
  4. data/sub/avm/Gemfile +8 -0
  5. data/sub/avm/avm.gemspec +30 -0
  6. data/sub/avm/lib/avm/application_scms/base.rb +39 -0
  7. data/sub/avm/lib/avm/application_scms.rb +9 -0
  8. data/sub/avm/lib/avm/application_stereotypes/base.rb +31 -0
  9. data/sub/avm/lib/avm/application_stereotypes.rb +9 -0
  10. data/sub/avm/lib/avm/applications/base/auto_local_source_path.rb +24 -0
  11. data/sub/avm/lib/avm/applications/base/local_instance.rb +31 -0
  12. data/sub/avm/lib/avm/applications/base/local_source.rb +30 -0
  13. data/sub/avm/lib/avm/applications/base/naming.rb +28 -0
  14. data/sub/avm/lib/avm/applications/base/organization.rb +29 -0
  15. data/sub/avm/lib/avm/applications/base/publishing.rb +43 -0
  16. data/sub/avm/lib/avm/applications/base/scm.rb +27 -0
  17. data/sub/avm/lib/avm/applications/base/stereotype.rb +31 -0
  18. data/sub/avm/lib/avm/applications/base.rb +37 -0
  19. data/sub/avm/lib/avm/applications.rb +9 -0
  20. data/sub/avm/lib/avm/data/callbacks.rb +37 -0
  21. data/sub/avm/lib/avm/data/clearer.rb +20 -0
  22. data/sub/avm/lib/avm/data/dumper.rb +142 -0
  23. data/sub/avm/lib/avm/data/loader.rb +28 -0
  24. data/sub/avm/lib/avm/data/package/base_performer.rb +38 -0
  25. data/sub/avm/lib/avm/data/package/build_directory.rb +28 -0
  26. data/sub/avm/lib/avm/data/package/clear.rb +22 -0
  27. data/sub/avm/lib/avm/data/package/dump.rb +45 -0
  28. data/sub/avm/lib/avm/data/package/load.rb +36 -0
  29. data/sub/avm/lib/avm/data/package.rb +67 -0
  30. data/sub/avm/lib/avm/data/performer.rb +49 -0
  31. data/sub/avm/lib/avm/data/rotate.rb +107 -0
  32. data/sub/avm/lib/avm/data/unit.rb +49 -0
  33. data/sub/avm/lib/avm/data/unit_with_commands.rb +52 -0
  34. data/sub/avm/lib/avm/docker/container.rb +50 -0
  35. data/sub/avm/lib/avm/docker/image.rb +76 -0
  36. data/sub/avm/lib/avm/docker/runner.rb +121 -0
  37. data/sub/avm/lib/avm/docker.rb +9 -0
  38. data/sub/avm/lib/avm/entries/auto_values/entry.rb +39 -0
  39. data/sub/avm/lib/avm/entries/auto_values/uri_entry.rb +24 -0
  40. data/sub/avm/lib/avm/entries/auto_values.rb +11 -0
  41. data/sub/avm/lib/avm/entries/base/inherited_entry_value.rb +46 -0
  42. data/sub/avm/lib/avm/entries/base/uri_component_entry_value/default_value.rb +28 -0
  43. data/sub/avm/lib/avm/entries/base/uri_component_entry_value/inherited_value.rb +39 -0
  44. data/sub/avm/lib/avm/entries/base/uri_component_entry_value/url_entry_value.rb +31 -0
  45. data/sub/avm/lib/avm/entries/base/uri_component_entry_value.rb +44 -0
  46. data/sub/avm/lib/avm/entries/base/uri_components_entries_values/component_factory.rb +42 -0
  47. data/sub/avm/lib/avm/entries/base/uri_components_entries_values/generic_component.rb +63 -0
  48. data/sub/avm/lib/avm/entries/base/uri_components_entries_values/path_component.rb +19 -0
  49. data/sub/avm/lib/avm/entries/base/uri_components_entries_values/url_component.rb +28 -0
  50. data/sub/avm/lib/avm/entries/base/uri_components_entries_values.rb +25 -0
  51. data/sub/avm/lib/avm/entries/base.rb +46 -0
  52. data/sub/avm/lib/avm/entries/entry.rb +65 -0
  53. data/sub/avm/lib/avm/entries/jobs/base.rb +62 -0
  54. data/sub/avm/lib/avm/entries/jobs/variables_source/read_entry.rb +50 -0
  55. data/sub/avm/lib/avm/entries/jobs/variables_source.rb +15 -0
  56. data/sub/avm/lib/avm/entries/jobs/with_variables_source.rb +15 -0
  57. data/sub/avm/lib/avm/entries/jobs.rb +11 -0
  58. data/sub/avm/lib/avm/entries/keys_constants_set.rb +43 -0
  59. data/sub/avm/lib/avm/entries/uri_builder.rb +91 -0
  60. data/sub/avm/lib/avm/entries.rb +9 -0
  61. data/sub/avm/lib/avm/executables.rb +24 -0
  62. data/sub/avm/lib/avm/file_formats/base.rb +35 -0
  63. data/sub/avm/lib/avm/file_formats/file_result.rb +13 -0
  64. data/sub/avm/lib/avm/file_formats/search_formatter.rb +87 -0
  65. data/sub/avm/lib/avm/file_formats/unknown.rb +18 -0
  66. data/sub/avm/lib/avm/file_formats/utf8_assert.rb +72 -0
  67. data/sub/avm/lib/avm/file_formats.rb +9 -0
  68. data/sub/avm/lib/avm/instances/base/auto_values/data.rb +25 -0
  69. data/sub/avm/lib/avm/instances/base/auto_values/database.rb +62 -0
  70. data/sub/avm/lib/avm/instances/base/auto_values/mailer.rb +35 -0
  71. data/sub/avm/lib/avm/instances/base/auto_values/source.rb +15 -0
  72. data/sub/avm/lib/avm/instances/base/auto_values.rb +14 -0
  73. data/sub/avm/lib/avm/instances/base/dockerizable.rb +45 -0
  74. data/sub/avm/lib/avm/instances/base/entry_keys.rb +27 -0
  75. data/sub/avm/lib/avm/instances/base/install.rb +24 -0
  76. data/sub/avm/lib/avm/instances/base/processes.rb +27 -0
  77. data/sub/avm/lib/avm/instances/base/subcommand_parent.rb +25 -0
  78. data/sub/avm/lib/avm/instances/base/web.rb +16 -0
  79. data/sub/avm/lib/avm/instances/base.rb +71 -0
  80. data/sub/avm/lib/avm/instances/data/files_unit.rb +59 -0
  81. data/sub/avm/lib/avm/instances/data/package.rb +27 -0
  82. data/sub/avm/lib/avm/instances/data/unit.rb +30 -0
  83. data/sub/avm/lib/avm/instances/data.rb +11 -0
  84. data/sub/avm/lib/avm/instances/docker_image.rb +15 -0
  85. data/sub/avm/lib/avm/instances/entry_keys.rb +43 -0
  86. data/sub/avm/lib/avm/instances/ids.rb +30 -0
  87. data/sub/avm/lib/avm/instances/process.rb +31 -0
  88. data/sub/avm/lib/avm/instances/runner.rb +37 -0
  89. data/sub/avm/lib/avm/instances.rb +9 -0
  90. data/sub/avm/lib/avm/launcher/context/instance_collector.rb +46 -0
  91. data/sub/avm/lib/avm/launcher/context/instance_discovery.rb +56 -0
  92. data/sub/avm/lib/avm/launcher/context/instance_manager/cached_instance.rb +37 -0
  93. data/sub/avm/lib/avm/launcher/context/instance_manager/cached_instances.rb +35 -0
  94. data/sub/avm/lib/avm/launcher/context/instance_manager.rb +77 -0
  95. data/sub/avm/lib/avm/launcher/context/settings.rb +53 -0
  96. data/sub/avm/lib/avm/launcher/context.rb +100 -0
  97. data/sub/avm/lib/avm/launcher/errors/base.rb +10 -0
  98. data/sub/avm/lib/avm/launcher/errors/non_project.rb +15 -0
  99. data/sub/avm/lib/avm/launcher/errors.rb +11 -0
  100. data/sub/avm/lib/avm/launcher/instances/base/cache.rb +43 -0
  101. data/sub/avm/lib/avm/launcher/instances/base/publishing.rb +53 -0
  102. data/sub/avm/lib/avm/launcher/instances/base.rb +78 -0
  103. data/sub/avm/lib/avm/launcher/instances/error.rb +10 -0
  104. data/sub/avm/lib/avm/launcher/instances/runner_helper.rb +47 -0
  105. data/sub/avm/lib/avm/launcher/instances/settings.rb +26 -0
  106. data/sub/avm/lib/avm/launcher/instances.rb +11 -0
  107. data/sub/avm/lib/avm/launcher/paths/logical.rb +80 -0
  108. data/sub/avm/lib/avm/launcher/paths/real.rb +44 -0
  109. data/sub/avm/lib/avm/launcher/paths.rb +11 -0
  110. data/sub/avm/lib/avm/launcher/project.rb +17 -0
  111. data/sub/avm/lib/avm/launcher/publish/base.rb +47 -0
  112. data/sub/avm/lib/avm/launcher/publish/check_result.rb +65 -0
  113. data/sub/avm/lib/avm/launcher/publish.rb +11 -0
  114. data/sub/avm/lib/avm/launcher/stereotype.rb +63 -0
  115. data/sub/avm/lib/avm/launcher.rb +9 -0
  116. data/sub/avm/lib/avm/launcher_stereotypes.rb +9 -0
  117. data/sub/avm/lib/avm/patches/eac_config/entry_path.rb +46 -0
  118. data/sub/avm/lib/avm/path_string.rb +27 -0
  119. data/sub/avm/lib/avm/registry/application_scms.rb +15 -0
  120. data/sub/avm/lib/avm/registry/application_stereotypes/build_available.rb +49 -0
  121. data/sub/avm/lib/avm/registry/application_stereotypes/stereotype_builder.rb +33 -0
  122. data/sub/avm/lib/avm/registry/application_stereotypes.rb +52 -0
  123. data/sub/avm/lib/avm/registry/applications.rb +38 -0
  124. data/sub/avm/lib/avm/registry/config_objects.rb +18 -0
  125. data/sub/avm/lib/avm/registry/file_formats.rb +20 -0
  126. data/sub/avm/lib/avm/registry/from_gems.rb +80 -0
  127. data/sub/avm/lib/avm/registry/instances.rb +16 -0
  128. data/sub/avm/lib/avm/registry/launcher_stereotypes.rb +11 -0
  129. data/sub/avm/lib/avm/registry/runners.rb +10 -0
  130. data/sub/avm/lib/avm/registry/scms.rb +10 -0
  131. data/sub/avm/lib/avm/registry/source_generators.rb +17 -0
  132. data/sub/avm/lib/avm/registry/sources.rb +31 -0
  133. data/sub/avm/lib/avm/registry/with_path/cache.rb +31 -0
  134. data/sub/avm/lib/avm/registry/with_path.rb +49 -0
  135. data/sub/avm/lib/avm/registry.rb +35 -0
  136. data/sub/avm/lib/avm/result.rb +82 -0
  137. data/sub/avm/lib/avm/rspec/setup/launcher.rb +19 -0
  138. data/sub/avm/lib/avm/rspec/setup/source_generator.rb +22 -0
  139. data/sub/avm/lib/avm/rspec/setup.rb +35 -0
  140. data/sub/avm/lib/avm/rspec/shared_examples/avm_file_format_file_resource_name.rb +15 -0
  141. data/sub/avm/lib/avm/rspec/shared_examples/avm_file_formats_with_fixtures.rb +31 -0
  142. data/sub/avm/lib/avm/rspec/shared_examples/avm_source_generated.rb +23 -0
  143. data/sub/avm/lib/avm/rspec/shared_examples/entries_values.rb +23 -0
  144. data/sub/avm/lib/avm/rspec/shared_examples/in_avm_registry.rb +11 -0
  145. data/sub/avm/lib/avm/rspec/shared_examples/not_in_avm_registry.rb +14 -0
  146. data/sub/avm/lib/avm/rspec.rb +9 -0
  147. data/sub/avm/lib/avm/runners/base.rb +27 -0
  148. data/sub/avm/lib/avm/scms/auto_commit/file_resource_name.rb +39 -0
  149. data/sub/avm/lib/avm/scms/auto_commit/for_file.rb +82 -0
  150. data/sub/avm/lib/avm/scms/auto_commit/rules/base.rb +40 -0
  151. data/sub/avm/lib/avm/scms/auto_commit/rules/last.rb +19 -0
  152. data/sub/avm/lib/avm/scms/auto_commit/rules/manual.rb +40 -0
  153. data/sub/avm/lib/avm/scms/auto_commit/rules/new.rb +24 -0
  154. data/sub/avm/lib/avm/scms/auto_commit/rules/nth.rb +31 -0
  155. data/sub/avm/lib/avm/scms/auto_commit/rules/unique.rb +21 -0
  156. data/sub/avm/lib/avm/scms/auto_commit/rules.rb +36 -0
  157. data/sub/avm/lib/avm/scms/auto_commit.rb +11 -0
  158. data/sub/avm/lib/avm/scms/base/commits.rb +34 -0
  159. data/sub/avm/lib/avm/scms/base/milestones.rb +21 -0
  160. data/sub/avm/lib/avm/scms/base.rb +56 -0
  161. data/sub/avm/lib/avm/scms/changed_file.rb +26 -0
  162. data/sub/avm/lib/avm/scms/commit.rb +66 -0
  163. data/sub/avm/lib/avm/scms/commit_info.rb +39 -0
  164. data/sub/avm/lib/avm/scms/inflector.rb +22 -0
  165. data/sub/avm/lib/avm/scms/interval.rb +18 -0
  166. data/sub/avm/lib/avm/scms/null/commit.rb +15 -0
  167. data/sub/avm/lib/avm/scms/null.rb +21 -0
  168. data/sub/avm/lib/avm/scms.rb +9 -0
  169. data/sub/avm/lib/avm/self/docker_image.rb +14 -0
  170. data/sub/avm/lib/avm/self/instance/entry_keys.rb +12 -0
  171. data/sub/avm/lib/avm/self/instance.rb +31 -0
  172. data/sub/avm/lib/avm/source_generators/base.rb +45 -0
  173. data/sub/avm/lib/avm/source_generators/option.rb +11 -0
  174. data/sub/avm/lib/avm/source_generators/option_list.rb +32 -0
  175. data/sub/avm/lib/avm/source_generators/runner.rb +58 -0
  176. data/sub/avm/lib/avm/source_generators.rb +9 -0
  177. data/sub/avm/lib/avm/sources/auto_commit/for_file.rb +31 -0
  178. data/sub/avm/lib/avm/sources/auto_commit.rb +11 -0
  179. data/sub/avm/lib/avm/sources/base/application.rb +34 -0
  180. data/sub/avm/lib/avm/sources/base/configuration.rb +92 -0
  181. data/sub/avm/lib/avm/sources/base/instance.rb +16 -0
  182. data/sub/avm/lib/avm/sources/base/locale.rb +33 -0
  183. data/sub/avm/lib/avm/sources/base/organizational.rb +32 -0
  184. data/sub/avm/lib/avm/sources/base/parent.rb +28 -0
  185. data/sub/avm/lib/avm/sources/base/stereotype.rb +18 -0
  186. data/sub/avm/lib/avm/sources/base/sub/remove.rb +38 -0
  187. data/sub/avm/lib/avm/sources/base/sub.rb +26 -0
  188. data/sub/avm/lib/avm/sources/base/subs.rb +67 -0
  189. data/sub/avm/lib/avm/sources/base/subs_paths.rb +32 -0
  190. data/sub/avm/lib/avm/sources/base/testing.rb +70 -0
  191. data/sub/avm/lib/avm/sources/base/update.rb +39 -0
  192. data/sub/avm/lib/avm/sources/base/update_sub.rb +57 -0
  193. data/sub/avm/lib/avm/sources/base/update_subs.rb +19 -0
  194. data/sub/avm/lib/avm/sources/base/version_bump.rb +29 -0
  195. data/sub/avm/lib/avm/sources/base.rb +51 -0
  196. data/sub/avm/lib/avm/sources/configuration/rubocop.rb +26 -0
  197. data/sub/avm/lib/avm/sources/configuration.rb +59 -0
  198. data/sub/avm/lib/avm/sources/runner.rb +40 -0
  199. data/sub/avm/lib/avm/sources/tests/builder.rb +96 -0
  200. data/sub/avm/lib/avm/sources/tests/performer.rb +35 -0
  201. data/sub/avm/lib/avm/sources/tests/result.rb +15 -0
  202. data/sub/avm/lib/avm/sources/tests/single.rb +75 -0
  203. data/sub/avm/lib/avm/sources/tests.rb +11 -0
  204. data/sub/avm/lib/avm/sources/update_error.rb +8 -0
  205. data/sub/avm/lib/avm/sources.rb +9 -0
  206. data/sub/avm/lib/avm/sync.rb +94 -0
  207. data/sub/avm/lib/avm/version.rb +5 -0
  208. data/sub/avm/lib/avm/version_number.rb +45 -0
  209. data/sub/avm/lib/avm/with/application_stereotype.rb +33 -0
  210. data/sub/avm/lib/avm/with/extra_subcommands.rb +44 -0
  211. data/sub/avm/lib/avm.rb +7 -0
  212. data/sub/avm/locale/en.yml +6 -0
  213. data/sub/avm/locale/pt-BR.yml +6 -0
  214. data/sub/avm/spec/lib/avm/applications/base/entries_spec.rb +31 -0
  215. data/sub/avm/spec/lib/avm/applications/base/entries_spec_files/config.yml +12 -0
  216. data/sub/avm/spec/lib/avm/applications/base_spec.rb +23 -0
  217. data/sub/avm/spec/lib/avm/applications/base_spec_fixture.yml +3 -0
  218. data/sub/avm/spec/lib/avm/file_formats/base_spec.rb +11 -0
  219. data/sub/avm/spec/lib/avm/instances/base_spec.rb +107 -0
  220. data/sub/avm/spec/lib/avm/instances/base_spec_files/config.yml +50 -0
  221. data/sub/avm/spec/lib/avm/launcher/instances/base_spec.rb +43 -0
  222. data/sub/avm/spec/lib/avm/launcher/instances/base_spec_files/projects/avm-tools_stub/avm-tools.gemspec +29 -0
  223. data/sub/avm/spec/lib/avm/launcher/instances/base_spec_files/projects/avm-tools_stub/lib/avm/tools/version.rb +7 -0
  224. data/sub/avm/spec/lib/avm/launcher/instances/base_spec_files/projects/avm-tools_stub/lib/avm/tools.rb +6 -0
  225. data/sub/avm/spec/lib/avm/launcher/instances/base_spec_files/projects/ruby_gem_stub/lib/ruby_gem_stub/version.rb +5 -0
  226. data/sub/avm/spec/lib/avm/launcher/instances/base_spec_files/projects/ruby_gem_stub/lib/ruby_gem_stub.rb +3 -0
  227. data/sub/avm/spec/lib/avm/launcher/instances/base_spec_files/projects/ruby_gem_stub/ruby_gem_stub.gemspec +16 -0
  228. data/sub/avm/spec/lib/avm/launcher/instances/base_spec_files/settings.yaml +5 -0
  229. data/sub/avm/spec/lib/avm/patches/eac_config/entry_path_spec.rb +28 -0
  230. data/sub/avm/spec/lib/avm/scms/auto_commit/file_resource_name_spec.rb +21 -0
  231. data/sub/avm/spec/lib/avm/scms/base_spec.rb +7 -0
  232. data/sub/avm/spec/lib/avm/sources/base_spec.rb +7 -0
  233. data/sub/avm/spec/lib/avm/sources/runner_spec.rb +9 -0
  234. data/sub/avm/spec/rubocop_spec.rb +3 -0
  235. data/sub/avm/spec/spec_helper.rb +4 -0
  236. data/sub/avm-eac_php_base0/Gemfile +2 -2
  237. data/sub/avm-eac_php_base0/avm-eac_php_base0.gemspec +5 -4
  238. data/sub/avm-eac_php_base0/lib/avm/eac_php_base0/executables.rb +1 -1
  239. data/sub/avm-eac_php_base0/lib/avm/eac_php_base0/version.rb +1 -1
  240. data/sub/avm-eac_php_base0/spec/lib/avm/eac_php_base0/file_formats/base_spec.rb +1 -1
  241. data/sub/avm-eac_php_base0/spec/lib/avm/eac_php_base0/source_generators/base_spec.rb +1 -1
  242. data/sub/avm-eac_php_base0/spec/lib/avm/eac_php_base0/sources/base_spec.rb +1 -1
  243. data/sub/avm-eac_php_base0/spec/rubocop_spec.rb +1 -1
  244. data/sub/avm-eac_php_base0/spec/spec_helper.rb +1 -1
  245. metadata +237 -5
@@ -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
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+
5
+ module Avm
6
+ module Data
7
+ class Package
8
+ class BasePerformer
9
+ acts_as_abstract :result
10
+ enable_speaker
11
+ enable_listable
12
+ lists.add_symbol :option, :excludes, :includes
13
+ common_constructor :package, :options, default: [{}] do
14
+ self.options = ::Avm::Data::Package::BasePerformer.lists.option
15
+ .hash_keys_validate!(options)
16
+ end
17
+
18
+ # @return [Set<Symbol>]
19
+ def excludes
20
+ ::Set.new((options[OPTION_EXCLUDES] || []).map(&:to_sym))
21
+ end
22
+
23
+ # @return [Set<Symbol>]
24
+ def includes
25
+ ::Set.new((options[OPTION_INCLUDES] || []).map(&:to_sym))
26
+ end
27
+
28
+ # @return [Hash<Symbol, Avm::Data::Unit]
29
+ def selected_units
30
+ r = package.units
31
+ r = r.slice(*includes.to_a) if includes.any?
32
+ r = r.except(*excludes.to_a) if excludes.any?
33
+ r
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/fs/temp'
4
+ require 'eac_ruby_utils/core_ext'
5
+
6
+ module Avm
7
+ module Data
8
+ class Package
9
+ module BuildDirectory
10
+ private
11
+
12
+ attr_writer :build_directory
13
+
14
+ # @return [EacRubyUtils::Fs::Temp::Directory]
15
+ def build_directory
16
+ @build_directory || raise('@build_directory is blank')
17
+ end
18
+
19
+ def on_build_directory
20
+ ::EacRubyUtils::Fs::Temp.on_directory do |directory|
21
+ self.build_directory = directory
22
+ yield
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'avm/data/package/base_performer'
4
+ require 'eac_ruby_utils/core_ext'
5
+
6
+ module Avm
7
+ module Data
8
+ class Package
9
+ class Clear < ::Avm::Data::Package::BasePerformer
10
+ enable_method_class
11
+
12
+ # @return [void]
13
+ def result
14
+ selected_units.each do |identifier, unit|
15
+ infov 'Clearing unit', identifier
16
+ unit.clear
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'avm/data/package/base_performer'
4
+ require 'avm/data/package/build_directory'
5
+ require 'eac_ruby_utils/core_ext'
6
+ require 'minitar'
7
+
8
+ module Avm
9
+ module Data
10
+ class Package
11
+ class Dump < ::Avm::Data::Package::BasePerformer
12
+ enable_method_class
13
+ include ::Avm::Data::Package::BuildDirectory
14
+
15
+ attr_reader :target_path
16
+
17
+ def initialize(package, target_path, options = {})
18
+ super(package, options)
19
+ @target_path = target_path.to_pathname
20
+ end
21
+
22
+ # @return [void]
23
+ def result
24
+ on_build_directory do
25
+ dump_units_to_build_directory
26
+ create_package_file
27
+ end
28
+ end
29
+
30
+ protected
31
+
32
+ def dump_units_to_build_directory
33
+ package.dump_units_to_directory(build_directory, selected_units)
34
+ end
35
+
36
+ def create_package_file
37
+ infom "Creating package \"#{target_path}\" from \"#{build_directory}\"..."
38
+ ::Dir.chdir(build_directory.to_path) do
39
+ ::Minitar.pack('.', ::File.open(target_path, 'wb'))
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'avm/data/package/base_performer'
4
+ require 'avm/data/package/build_directory'
5
+ require 'eac_ruby_utils/core_ext'
6
+ require 'minitar'
7
+
8
+ module Avm
9
+ module Data
10
+ class Package
11
+ class Load < ::Avm::Data::Package::BasePerformer
12
+ enable_method_class
13
+ enable_speaker
14
+ include ::Avm::Data::Package::BuildDirectory
15
+
16
+ attr_reader :source_path
17
+
18
+ def initialize(package, source_path, options = {})
19
+ super(package, options)
20
+ @source_path = source_path.to_pathname
21
+ end
22
+
23
+ def result
24
+ on_build_directory do
25
+ extract_packages_to_build_directory
26
+ package.load_units_from_directory(build_directory, selected_units)
27
+ end
28
+ end
29
+
30
+ def extract_packages_to_build_directory
31
+ ::Minitar.unpack(source_path.to_path, build_directory.to_path)
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'avm/data/callbacks'
4
+ require 'eac_ruby_utils/core_ext'
5
+
6
+ module Avm
7
+ module Data
8
+ class Package
9
+ require_sub __FILE__, require_mode: :kernel
10
+ include ::Avm::Data::Callbacks
11
+
12
+ DATA_FILE_EXTENSION = '.tar'
13
+
14
+ def initialize(options)
15
+ options = options.to_options_consumer
16
+ units = options.consume(:units)
17
+ options.validate
18
+ units.if_present do |v|
19
+ v.each { |identifier, unit| add_unit(identifier, unit) }
20
+ end
21
+ end
22
+
23
+ # @return [Avm::Data::Package] Return +self+.
24
+ def add_unit(identifier, unit)
25
+ units[identifier.to_sym] = unit
26
+
27
+ self
28
+ end
29
+
30
+ # @return [String]
31
+ def data_file_extension
32
+ DATA_FILE_EXTENSION
33
+ end
34
+
35
+ def dump_units_to_directory(directory, selected_units = nil)
36
+ run_callbacks :dump do
37
+ (selected_units || units).each do |identifier, unit|
38
+ unit.dump_to_directory(directory, identifier)
39
+ end
40
+ end
41
+ end
42
+
43
+ def load_units_from_directory(directory, selected_units = nil)
44
+ run_callbacks :load do
45
+ (selected_units || units).each do |identifier, unit|
46
+ unit.load_from_directory(directory, identifier)
47
+ end
48
+ end
49
+ end
50
+
51
+ # @param id [Symbol]
52
+ # @return [Avm::Data::UnitWithCommands]
53
+ def unit(identifier)
54
+ units[identifier.to_sym] || raise("No unit found with identifier \"#{identifier}\"")
55
+ end
56
+
57
+ def units
58
+ @units ||= {}
59
+ end
60
+
61
+ # @return [Enumerable<String>]
62
+ def units_ids
63
+ units.keys
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'avm/data/rotate'
4
+ require 'eac_ruby_utils/core_ext'
5
+ require 'eac_ruby_utils/fs/temp'
6
+
7
+ module Avm
8
+ module Data
9
+ class Performer
10
+ acts_as_abstract(:cannot_perform_reason, :internal_perform)
11
+ acts_as_immutable
12
+ common_constructor :data_owner
13
+ immutable_accessor :exclude, :include, type: :set
14
+
15
+ # @return [Enumerable]
16
+ def immutable_constructor_args
17
+ [data_owner]
18
+ end
19
+
20
+ # @return [self]
21
+ def perform
22
+ raise "Cannot run: #{cannot_perform_reason}" unless performable?
23
+
24
+ internal_perform
25
+
26
+ self
27
+ end
28
+
29
+ # @return [Boolean]
30
+ def performable?
31
+ cannot_perform_reason.blank?
32
+ end
33
+
34
+ protected
35
+
36
+ def include_excludes_arguments
37
+ options = include_excludes_options
38
+ options.any? ? [options] : []
39
+ end
40
+
41
+ def include_excludes_options
42
+ r = {}
43
+ r[:includes] = includes if includes.any?
44
+ r[:excludes] = excludes if excludes.any?
45
+ r
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,107 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'active_support/core_ext/object/blank'
4
+ require 'eac_ruby_utils/simple_cache'
5
+
6
+ module Avm
7
+ module Data
8
+ class Rotate
9
+ include ::EacRubyUtils::SimpleCache
10
+
11
+ attr_reader :options, :source_path
12
+
13
+ def initialize(source_path, options = {})
14
+ @source_path = source_path
15
+ @options = options
16
+ end
17
+
18
+ def run
19
+ validate_msg = validate
20
+ return validate_msg if validate_msg.present?
21
+
22
+ ::FileUtils.mv(source_path, target_path)
23
+ check_space_limit
24
+ nil
25
+ end
26
+
27
+ def space_limit
28
+ r = options[:space_limit].try(:to_i)
29
+ return r if r.present? && r.positive?
30
+
31
+ r
32
+ end
33
+
34
+ def space_used
35
+ rotated_files.inject(0) { |a, e| a + ::File.size(e) }
36
+ end
37
+
38
+ def rotated_files
39
+ ::Dir["#{dirname}/#{source_basename_without_extension}*#{source_extension}"]
40
+ end
41
+
42
+ def oldest_rotated_file
43
+ rotated_files.min_by { |file| [::File.mtime(file)] }
44
+ end
45
+
46
+ private
47
+
48
+ def check_space_limit
49
+ return unless space_limit
50
+
51
+ while space_used > space_limit
52
+ file = oldest_rotated_file
53
+ unless file
54
+ raise 'oldest_rotated_file returned nil ' \
55
+ "(Limit: #{space_limit}, used: #{space_used})"
56
+ end
57
+ ::File.delete(file)
58
+ end
59
+ end
60
+
61
+ def validate
62
+ return "Source file \"#{source_path}\" does not exist" unless ::File.exist?(source_path)
63
+ return "File \"#{source_path}\" is already rotated" if source_rotated?
64
+
65
+ nil
66
+ end
67
+
68
+ def source_rotated?
69
+ source_basename_without_extension.match(/[PN]\d{4}\z/)
70
+ end
71
+
72
+ def source_extension_uncached
73
+ file_extension(::File.basename(source_path))
74
+ end
75
+
76
+ def source_basename_without_extension
77
+ ::File.basename(source_path, source_extension)
78
+ end
79
+
80
+ def target_path_uncached
81
+ ::File.join(dirname, target_basename)
82
+ end
83
+
84
+ def dirname
85
+ ::File.dirname(source_path)
86
+ end
87
+
88
+ def target_basename
89
+ source_basename_without_extension + target_suffix + source_extension
90
+ end
91
+
92
+ def target_suffix
93
+ return '_UNKNOWN_MTIME' unless ::File.exist?(source_path)
94
+
95
+ t = ::File.mtime(source_path)
96
+ t.strftime('_%Y-%m-%d_%H-%M-%S_') + t.strftime('%z').gsub(/\A\+/, 'P').gsub(/\A-/, 'N')
97
+ end
98
+
99
+ def file_extension(basename)
100
+ extension = ::File.extname(basename)
101
+ return '' if extension.blank?
102
+
103
+ file_extension(::File.basename(basename, extension)) + extension
104
+ end
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'avm/data/callbacks'
4
+ require 'eac_ruby_utils/core_ext'
5
+
6
+ module Avm
7
+ module Data
8
+ class Unit
9
+ acts_as_abstract(
10
+ do_clear: [],
11
+ do_dump: [:dump_path],
12
+ do_load: [:dump_path],
13
+ dump_path_extension: []
14
+ )
15
+ enable_speaker
16
+ include ::Avm::Data::Callbacks
17
+
18
+ # @param dump_path [Pathname]
19
+ # @return [void]
20
+ def clear
21
+ run_callbacks(:dump) { do_clear }
22
+ end
23
+
24
+ # @param dump_path [Pathname]
25
+ # @return [void]
26
+ def dump(dump_path)
27
+ run_callbacks :dump do
28
+ infom "Dumping unit \"#{name}\" to \"#{dump_path}\"..."
29
+ do_dump(dump_path)
30
+ end
31
+ end
32
+
33
+ # @param dump_path [Pathname]
34
+ # @return [void]
35
+ def load(dump_path)
36
+ run_callbacks :load do
37
+ clear
38
+ infom "Loading unit \"#{name}\" from \"#{dump_path}\"..."
39
+ do_load(dump_path)
40
+ end
41
+ end
42
+
43
+ # @return [String]
44
+ def name
45
+ self.class.name
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'avm/data/callbacks'
4
+ require 'avm/data/unit'
5
+ require 'eac_ruby_utils/core_ext'
6
+
7
+ module Avm
8
+ module Data
9
+ class UnitWithCommands < ::Avm::Data::Unit
10
+ acts_as_abstract
11
+
12
+ abstract_method :dump_command
13
+ abstract_method :load_command
14
+
15
+ # @return [String]
16
+ def dump_path_extension
17
+ singleton_class.const_get('EXTENSION')
18
+ rescue NameError
19
+ ''
20
+ end
21
+
22
+ def load_from_directory(directory, identifier)
23
+ load(unit_on_directory_path(directory, identifier))
24
+ end
25
+
26
+ def dump_to_directory(directory, identifier)
27
+ dump(unit_on_directory_path(directory, identifier))
28
+ end
29
+
30
+ # @return [Struct(:key, :subpath), nil]
31
+ def installation_files_data
32
+ nil
33
+ end
34
+
35
+ protected
36
+
37
+ def do_dump(data_path)
38
+ dump_command.execute!(output_file: data_path)
39
+ end
40
+
41
+ def do_load(data_path)
42
+ load_command.execute!(input_file: data_path)
43
+ end
44
+
45
+ private
46
+
47
+ def unit_on_directory_path(directory, identifier)
48
+ ::File.join(directory, "#{identifier}#{dump_path_extension}")
49
+ end
50
+ end
51
+ end
52
+ end