avm 0.2.0 → 0.3.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.
Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. data/lib/avm/executables.rb +24 -0
  3. data/lib/avm/files.rb +9 -0
  4. data/lib/avm/files/appendable.rb +55 -0
  5. data/lib/avm/files/appendable/file_content.rb +24 -0
  6. data/lib/avm/files/appendable/plain_directory.rb +25 -0
  7. data/lib/avm/files/appendable/resource_base.rb +13 -0
  8. data/lib/avm/files/appendable/tar_output_command.rb +26 -0
  9. data/lib/avm/files/appendable/templatized_directory.rb +29 -0
  10. data/lib/avm/files/appender.rb +11 -0
  11. data/lib/avm/files/deploy.rb +71 -0
  12. data/lib/avm/files/formatter.rb +90 -0
  13. data/lib/avm/files/formatter/formats.rb +13 -0
  14. data/lib/avm/files/formatter/formats/base.rb +62 -0
  15. data/lib/avm/files/formatter/formats/generic_plain.rb +34 -0
  16. data/lib/avm/files/formatter/formats/html.rb +45 -0
  17. data/lib/avm/files/formatter/formats/javascript.rb +23 -0
  18. data/lib/avm/files/formatter/formats/json.rb +27 -0
  19. data/lib/avm/files/formatter/formats/php.rb +21 -0
  20. data/lib/avm/files/formatter/formats/python.rb +21 -0
  21. data/lib/avm/files/formatter/formats/ruby.rb +22 -0
  22. data/lib/avm/files/formatter/formats/xml.rb +27 -0
  23. data/lib/avm/files/formatter/utf8_assert.rb +72 -0
  24. data/lib/avm/files/info.rb +24 -0
  25. data/lib/avm/files/rotate.rb +107 -0
  26. data/lib/avm/git.rb +10 -0
  27. data/lib/avm/git/auto_commit/commit_info.rb +23 -0
  28. data/lib/avm/git/auto_commit/rules.rb +31 -0
  29. data/lib/avm/git/auto_commit/rules/base.rb +39 -0
  30. data/lib/avm/git/auto_commit/rules/last.rb +19 -0
  31. data/lib/avm/git/auto_commit/rules/manual.rb +45 -0
  32. data/lib/avm/git/auto_commit/rules/new.rb +24 -0
  33. data/lib/avm/git/auto_commit/rules/nth.rb +31 -0
  34. data/lib/avm/git/auto_commit/rules/unique.rb +21 -0
  35. data/lib/avm/git/auto_commit_path.rb +28 -0
  36. data/lib/avm/git/auto_commit_path/ruby.rb +20 -0
  37. data/lib/avm/git/commit.rb +59 -0
  38. data/lib/avm/git/commit/class_methods.rb +31 -0
  39. data/lib/avm/git/commit/deploy.rb +38 -0
  40. data/lib/avm/git/commit/deploy_methods.rb +19 -0
  41. data/lib/avm/git/commit/diff_tree_line.rb +32 -0
  42. data/lib/avm/git/commit/file.rb +46 -0
  43. data/lib/avm/git/file_auto_fixup.rb +83 -0
  44. data/lib/avm/git/issue.rb +11 -0
  45. data/lib/avm/git/issue/complete.rb +51 -0
  46. data/lib/avm/git/issue/complete/commits.rb +42 -0
  47. data/lib/avm/git/issue/complete/git_subrepos.rb +23 -0
  48. data/lib/avm/git/issue/complete/local_branch.rb +54 -0
  49. data/lib/avm/git/issue/complete/local_tag.rb +39 -0
  50. data/lib/avm/git/issue/complete/push.rb +54 -0
  51. data/lib/avm/git/issue/complete/remote.rb +33 -0
  52. data/lib/avm/git/issue/complete/test.rb +45 -0
  53. data/lib/avm/git/issue/complete/tracker.rb +28 -0
  54. data/lib/avm/git/issue/complete/validation.rb +31 -0
  55. data/lib/avm/git/issue/complete/validations.rb +53 -0
  56. data/lib/avm/git/issue/complete/working_tree.rb +19 -0
  57. data/lib/avm/git/issue/deliver.rb +56 -0
  58. data/lib/avm/git/organize.rb +11 -0
  59. data/lib/avm/git/organize/reference_update.rb +34 -0
  60. data/lib/avm/git/organize/repository.rb +76 -0
  61. data/lib/avm/git/revision_test.rb +106 -0
  62. data/lib/avm/git/subrepo_check.rb +38 -0
  63. data/lib/avm/git/subrepo_check/parent.rb +51 -0
  64. data/lib/avm/git/subrepo_check/remote.rb +89 -0
  65. data/lib/avm/git/subrepo_check/show_result.rb +32 -0
  66. data/lib/avm/git/subrepo_checks.rb +59 -0
  67. data/lib/avm/result.rb +86 -0
  68. data/lib/avm/version.rb +1 -1
  69. metadata +123 -3
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+
5
+ module Avm
6
+ module Git
7
+ class SubrepoCheck
8
+ require_sub __FILE__, include_modules: true
9
+ enable_speaker
10
+ enable_simple_cache
11
+
12
+ BLANK_TEXT = 'BLANK'
13
+
14
+ common_constructor :subrepo, :options
15
+
16
+ def blank_text
17
+ BLANK_TEXT
18
+ end
19
+
20
+ def check_remote?
21
+ options.fetch(:check_remote) ? true : false
22
+ end
23
+
24
+ def fix_parent?
25
+ options.fetch(:fix_parent) ? true : false
26
+ end
27
+
28
+ private
29
+
30
+ def result_uncached
31
+ return ::Avm::Result.error('Parent failed') if parent_result.error?
32
+ return ::Avm::Result.error('Remote failed') if remote_result.error?
33
+
34
+ ::Avm::Result.success('Parent and remote ok')
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'avm/result'
4
+ require 'eac_ruby_utils/core_ext'
5
+
6
+ module Avm
7
+ module Git
8
+ class SubrepoCheck
9
+ module Parent
10
+ def fix_parent
11
+ return if parent_result.success?
12
+
13
+ info(' Fixing...')
14
+ self.parent_hash = expected_parent_hash
15
+ info_banner
16
+ end
17
+
18
+ private
19
+
20
+ def expected_parent_hash_uncached
21
+ subrepo.local.rev_parse("#{last_file_change_rev}^")
22
+ end
23
+
24
+ def last_file_change_rev
25
+ subrepo.local.command('log', '-n', '1', '--pretty=format:%H', '--',
26
+ subrepo.config_relative_path.to_path).execute!.strip
27
+ end
28
+
29
+ def parent_hash
30
+ subrepo.parent_commit_id
31
+ end
32
+
33
+ def parent_hash=(new_hash)
34
+ subrepo.config.parent_commit_id = new_hash
35
+ subrepo.write_config
36
+ end
37
+
38
+ def parent_hash_ok?
39
+ return false if expected_parent_hash.blank? || parent_hash.blank?
40
+
41
+ expected_parent_hash == parent_hash
42
+ end
43
+
44
+ def parent_result_uncached
45
+ ::Avm::Result.success_or_error(parent_hash_ok?,
46
+ parent_hash.presence || blank_text)
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,89 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'avm/result'
4
+ require 'eac_ruby_utils/core_ext'
5
+
6
+ module Avm
7
+ module Git
8
+ class SubrepoCheck
9
+ module Remote
10
+ private
11
+
12
+ def fetch_uncached
13
+ subrepo.command('clean').execute!
14
+ subrepo.command('fetch').execute!
15
+ end
16
+
17
+ def check_remote_disabled?
18
+ !check_remote?
19
+ end
20
+
21
+ def check_remote_disabled_result
22
+ ::Avm::Result.neutral('Check remote disabled')
23
+ end
24
+
25
+ def local_descend_remote?
26
+ local_id.present? && remote_id.present? && subrepo.local.descendant?(local_id, remote_id)
27
+ end
28
+
29
+ def local_descend_remote_result
30
+ ::Avm::Result.pending(remote_result_value)
31
+ end
32
+
33
+ def local_id_uncached
34
+ fetch
35
+ subrepo.command('branch', '--force').execute!
36
+ subrepo.local.rev_parse("subrepo/#{subrepo.subpath}")
37
+ end
38
+
39
+ def remote_descend_local?
40
+ local_id.present? && remote_id.present? && subrepo.local.descendant?(remote_id, local_id)
41
+ end
42
+
43
+ def remote_descend_local_result
44
+ ::Avm::Result.outdated(remote_result_value)
45
+ end
46
+
47
+ def remote_branches
48
+ ['', 'refs/heads/', 'refs/tags/'].map { |prefix| "#{prefix}#{subrepo.remote_branch}" }
49
+ end
50
+
51
+ def remote_id_uncached
52
+ ls_result = subrepo.remote.ls
53
+ remote_branches.each do |b|
54
+ return ls_result[b] if ls_result[b].present?
55
+ end
56
+ nil
57
+ end
58
+
59
+ def remote_result_uncached
60
+ %w[check_remote_disabled same_ids local_descend_remote remote_descend_local]
61
+ .each do |condition|
62
+ return send("#{condition}_result") if send("#{condition}?")
63
+ end
64
+
65
+ ::Avm::Result.error(remote_result_value)
66
+ end
67
+
68
+ def remote_result_value
69
+ local_s = local_id.presence || blank_text
70
+ remote_s = remote_id.presence || blank_text
71
+
72
+ if local_s == remote_s
73
+ "[L/R=#{local_s}]"
74
+ else
75
+ "[L=#{local_s}, R=#{remote_s}]"
76
+ end
77
+ end
78
+
79
+ def same_ids?
80
+ local_id.present? && remote_id.present? && local_id == remote_id
81
+ end
82
+
83
+ def same_ids_result
84
+ ::Avm::Result.success(remote_result_value)
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+
5
+ module Avm
6
+ module Git
7
+ class SubrepoCheck
8
+ module ShowResult
9
+ def show_result
10
+ out(subrepo.subpath.to_path.cyan)
11
+ out_attr('parent', parent_result.label)
12
+ run_fix_parent
13
+ out_attr('remote', remote_result.label)
14
+ out("\n")
15
+ end
16
+
17
+ def run_fix_parent
18
+ return unless fix_parent?
19
+ return unless parent_result.error?
20
+
21
+ out('|Fixing...'.white)
22
+ self.parent_hash = expected_parent_hash
23
+ out_attr('new parent', parent_result.label)
24
+ end
25
+
26
+ def out_attr(key, value)
27
+ out('|' + "#{key}=".white + value)
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'avm/git/subrepo_check'
4
+ require 'eac_ruby_utils/core_ext'
5
+
6
+ module Avm
7
+ module Git
8
+ class SubrepoChecks
9
+ enable_speaker
10
+ enable_simple_cache
11
+ attr_accessor :check_remote, :fix_parent
12
+ common_constructor :repository
13
+
14
+ def add_all_subrepos
15
+ add_subrepos(
16
+ *repository.command('subrepo', '-q', 'status').execute!.split("\n").map(&:strip)
17
+ .select(&:present?)
18
+ )
19
+ end
20
+
21
+ def add_subrepos(*subpath_list)
22
+ subpath_list.each do |subpath|
23
+ subpaths.add(subpath)
24
+ end
25
+ reset_cache
26
+ self
27
+ end
28
+
29
+ def check_options
30
+ { fix_parent: fix_parent, check_remote: check_remote }
31
+ end
32
+
33
+ def show_result
34
+ checks.each(&:show_result)
35
+ infov 'Result', result.label
36
+ end
37
+
38
+ private
39
+
40
+ def checks_uncached
41
+ subpaths.map do |subpath|
42
+ ::Avm::Git::SubrepoCheck.new(repository.subrepo(subpath), check_options)
43
+ end
44
+ end
45
+
46
+ def result_uncached
47
+ error_count = checks.count { |check| check.result.error? }
48
+ ::Avm::Result.success_or_error(
49
+ error_count.zero?,
50
+ "#{error_count} of #{checks.count} subrepos failed"
51
+ )
52
+ end
53
+
54
+ def subpaths
55
+ @subpaths ||= ::Set.new
56
+ end
57
+ end
58
+ end
59
+ end
data/lib/avm/result.rb ADDED
@@ -0,0 +1,86 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'colorized_string'
4
+ require 'eac_ruby_utils/listable'
5
+ require 'eac_ruby_utils/core_ext'
6
+
7
+ module Avm
8
+ class Result < ::SimpleDelegator
9
+ include ::EacRubyUtils::Listable
10
+
11
+ lists.add_string :type, :success, :error, :neutral, :pending, :outdated
12
+
13
+ lists.type.values.each do |type| # rubocop:disable Style/HashEachMethods
14
+ class_eval <<-RUBY_EVAL, __FILE__, __LINE__ + 1
15
+ def self.#{type}(value)
16
+ new(value, TYPE_#{type.upcase})
17
+ end
18
+ RUBY_EVAL
19
+ end
20
+
21
+ TYPE_SUCCESS_COLOR = 'green'
22
+ TYPE_ERROR_COLOR = 'red'
23
+ TYPE_NEUTRAL_COLOR = 'light_black'
24
+ TYPE_PENDING_COLOR = 'yellow'
25
+ TYPE_OUTDATED_COLOR = 'blue'
26
+
27
+ class << self
28
+ # Return Avm::Result.success(success_value) if +success+ is truthy.
29
+ # Return Avm::Result.error(error_value || success_value) if +success+ is falsely.
30
+ # @return [Avm::Result]
31
+ def success_or_error(success, success_value, error_value = nil)
32
+ if success
33
+ self.success(success_value)
34
+ else
35
+ error(error_value.presence || success_value)
36
+ end
37
+ end
38
+ end
39
+
40
+ attr_reader :type
41
+
42
+ def initialize(value, type)
43
+ super(value)
44
+ validate_type(type)
45
+ @type = type
46
+ end
47
+
48
+ def label
49
+ label_fg
50
+ end
51
+
52
+ def label_fg
53
+ ColorizedString.new(to_s).send(type_color)
54
+ end
55
+
56
+ def label_bg
57
+ ColorizedString.new(to_s).light_white.send("on_#{type_color}")
58
+ end
59
+
60
+ def type_color
61
+ self.class.const_get("type_#{type}_color".upcase)
62
+ end
63
+
64
+ lists.type.values.each do |type| # rubocop:disable Style/HashEachMethods
65
+ class_eval <<-RUBY_EVAL, __FILE__, __LINE__ + 1
66
+ def #{type}?
67
+ @type == '#{type}'
68
+ end
69
+ RUBY_EVAL
70
+ end
71
+
72
+ private
73
+
74
+ def validate_type(type)
75
+ return if self.class.lists.type.values.include?(type)
76
+
77
+ raise "Tipo desconhecido: \"#{type}\" (Válido: #{self.class.lists.type.values.join(', ')})"
78
+ end
79
+
80
+ class Error < StandardError
81
+ def to_result
82
+ ::Avm::Result.error(message)
83
+ end
84
+ end
85
+ end
86
+ 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.2.0'
4
+ VERSION = '0.3.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.2.0
4
+ version: 0.3.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: 2021-07-07 00:00:00.000000000 Z
11
+ date: 2021-07-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: eac_docker
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: eac_git
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.6'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.6'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: eac_ruby_utils
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -38,6 +52,46 @@ dependencies:
38
52
  - - "~>"
39
53
  - !ruby/object:Gem::Version
40
54
  version: '0.68'
55
+ - !ruby/object:Gem::Dependency
56
+ name: eac_templates
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.1'
62
+ - - ">="
63
+ - !ruby/object:Gem::Version
64
+ version: 0.1.1
65
+ type: :runtime
66
+ prerelease: false
67
+ version_requirements: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - "~>"
70
+ - !ruby/object:Gem::Version
71
+ version: '0.1'
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: 0.1.1
75
+ - !ruby/object:Gem::Dependency
76
+ name: aranha-parsers
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '0.7'
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ version: 0.7.2
85
+ type: :development
86
+ prerelease: false
87
+ version_requirements: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - "~>"
90
+ - !ruby/object:Gem::Version
91
+ version: '0.7'
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ version: 0.7.2
41
95
  - !ruby/object:Gem::Dependency
42
96
  name: eac_ruby_gem_support
43
97
  requirement: !ruby/object:Gem::Requirement
@@ -63,7 +117,73 @@ files:
63
117
  - lib/avm/docker/container.rb
64
118
  - lib/avm/docker/image.rb
65
119
  - lib/avm/docker/runner.rb
120
+ - lib/avm/executables.rb
121
+ - lib/avm/files.rb
122
+ - lib/avm/files/appendable.rb
123
+ - lib/avm/files/appendable/file_content.rb
124
+ - lib/avm/files/appendable/plain_directory.rb
125
+ - lib/avm/files/appendable/resource_base.rb
126
+ - lib/avm/files/appendable/tar_output_command.rb
127
+ - lib/avm/files/appendable/templatized_directory.rb
128
+ - lib/avm/files/appender.rb
129
+ - lib/avm/files/deploy.rb
130
+ - lib/avm/files/formatter.rb
131
+ - lib/avm/files/formatter/formats.rb
132
+ - lib/avm/files/formatter/formats/base.rb
133
+ - lib/avm/files/formatter/formats/generic_plain.rb
134
+ - lib/avm/files/formatter/formats/html.rb
135
+ - lib/avm/files/formatter/formats/javascript.rb
136
+ - lib/avm/files/formatter/formats/json.rb
137
+ - lib/avm/files/formatter/formats/php.rb
138
+ - lib/avm/files/formatter/formats/python.rb
139
+ - lib/avm/files/formatter/formats/ruby.rb
140
+ - lib/avm/files/formatter/formats/xml.rb
141
+ - lib/avm/files/formatter/utf8_assert.rb
142
+ - lib/avm/files/info.rb
143
+ - lib/avm/files/rotate.rb
144
+ - lib/avm/git.rb
145
+ - lib/avm/git/auto_commit/commit_info.rb
146
+ - lib/avm/git/auto_commit/rules.rb
147
+ - lib/avm/git/auto_commit/rules/base.rb
148
+ - lib/avm/git/auto_commit/rules/last.rb
149
+ - lib/avm/git/auto_commit/rules/manual.rb
150
+ - lib/avm/git/auto_commit/rules/new.rb
151
+ - lib/avm/git/auto_commit/rules/nth.rb
152
+ - lib/avm/git/auto_commit/rules/unique.rb
153
+ - lib/avm/git/auto_commit_path.rb
154
+ - lib/avm/git/auto_commit_path/ruby.rb
155
+ - lib/avm/git/commit.rb
156
+ - lib/avm/git/commit/class_methods.rb
157
+ - lib/avm/git/commit/deploy.rb
158
+ - lib/avm/git/commit/deploy_methods.rb
159
+ - lib/avm/git/commit/diff_tree_line.rb
160
+ - lib/avm/git/commit/file.rb
161
+ - lib/avm/git/file_auto_fixup.rb
162
+ - lib/avm/git/issue.rb
163
+ - lib/avm/git/issue/complete.rb
164
+ - lib/avm/git/issue/complete/commits.rb
165
+ - lib/avm/git/issue/complete/git_subrepos.rb
166
+ - lib/avm/git/issue/complete/local_branch.rb
167
+ - lib/avm/git/issue/complete/local_tag.rb
168
+ - lib/avm/git/issue/complete/push.rb
169
+ - lib/avm/git/issue/complete/remote.rb
170
+ - lib/avm/git/issue/complete/test.rb
171
+ - lib/avm/git/issue/complete/tracker.rb
172
+ - lib/avm/git/issue/complete/validation.rb
173
+ - lib/avm/git/issue/complete/validations.rb
174
+ - lib/avm/git/issue/complete/working_tree.rb
175
+ - lib/avm/git/issue/deliver.rb
176
+ - lib/avm/git/organize.rb
177
+ - lib/avm/git/organize/reference_update.rb
178
+ - lib/avm/git/organize/repository.rb
179
+ - lib/avm/git/revision_test.rb
180
+ - lib/avm/git/subrepo_check.rb
181
+ - lib/avm/git/subrepo_check/parent.rb
182
+ - lib/avm/git/subrepo_check/remote.rb
183
+ - lib/avm/git/subrepo_check/show_result.rb
184
+ - lib/avm/git/subrepo_checks.rb
66
185
  - lib/avm/instances/docker_image.rb
186
+ - lib/avm/result.rb
67
187
  - lib/avm/version.rb
68
188
  - lib/avm/version_number.rb
69
189
  homepage:
@@ -84,7 +204,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
84
204
  - !ruby/object:Gem::Version
85
205
  version: '0'
86
206
  requirements: []
87
- rubygems_version: 3.0.9
207
+ rubygems_version: 3.1.6
88
208
  signing_key:
89
209
  specification_version: 4
90
210
  summary: Ruby base library for Agora Vai! Methodology (https://avm.esquiloazul.tech).