afterlife 1.0.0 → 1.2.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: c8dfb530dade840c8e03042de3ba5508eec1002830c0b978ab42aa1f88b83fab
4
- data.tar.gz: 39452459ace3d25eb5270e0e83295e0919f97b11813128b98a6deb39b407431b
3
+ metadata.gz: ed6b64b46c70114724bb7961af7c384c079bc7917a69e83a3c4f5dce62152ecc
4
+ data.tar.gz: 8da0219c81a43ac90190721388bc5cc4afc685ec377caebe8a8ab04331fe3df0
5
5
  SHA512:
6
- metadata.gz: 30fb609ce63cd5038050a2afae03741fd9d8739d4d014cfbd85ca09a0c1f44a9eb3521b85866b64763bfeea287891ea6d00c84491bf39f4bbf6cea152b8ef8d5
7
- data.tar.gz: e94831df012dfe22f833e277b0fbc5b6c11ae5c9c85d9897068d14b05171c4ab7fd542b2f578d0c95fd17feef9419e0c7abb8aeb50421b29e9e93322bd17fa47
6
+ metadata.gz: 2fbb65c54f1e464917dab23183f6e376cd594de9de50aa9462225f06285234759cc6ec6092f164a2dc674426ad674938d2d03d958195bc2286de6dad470833d8
7
+ data.tar.gz: c57a701252b3b7c919a45c4164c26d5ce10086f55f222d66bf0afe8592dacb28875ffadf69d04a10d021b5530c36daf36d5c18a5f309e50e3e24001a8da50cb7
data/.rubocop.yml CHANGED
@@ -4,7 +4,7 @@ require:
4
4
 
5
5
  AllCops:
6
6
  NewCops: enable
7
- TargetRubyVersion: 2.7
7
+ TargetRubyVersion: 2.6
8
8
 
9
9
  Lint/ConstantDefinitionInBlock:
10
10
  Enabled: false
data/afterlife.gemspec CHANGED
@@ -8,7 +8,7 @@ Gem::Specification.new do |spec|
8
8
  spec.authors = ['Genaro Madrid']
9
9
  spec.email = ['genmadrid@gmail.com']
10
10
 
11
- spec.summary = 'Devops tools for Mifiel'
11
+ spec.summary = 'Devops utils'
12
12
  spec.description = 'Afterlife helps you setup your development environment and deploy code easily'
13
13
  spec.required_ruby_version = '>= 2.6'
14
14
 
@@ -19,7 +19,9 @@ Gem::Specification.new do |spec|
19
19
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
20
20
  spec.files = Dir.chdir(__dir__) do
21
21
  `git ls-files -z`.split("\x0").reject do |f|
22
- (f == __FILE__) || f.match(%r{\A(?:(?:bin|test|spec|features)/|\.(?:git|travis|circleci)|appveyor)})
22
+ (f == __FILE__) ||
23
+ f.match(%r{\A(?:(?:bin|test|spec|features)/|\.(?:git|travis|circleci)|appveyor)}) ||
24
+ f.match(/Rakefile/)
23
25
  end
24
26
  end
25
27
  spec.bindir = 'exe'
data/lib/afterlife/cli.rb CHANGED
@@ -22,45 +22,21 @@ module Afterlife
22
22
  log_success 'afterlife is ready!'
23
23
  end
24
24
 
25
- desc 'config <path>', 'get config options'
26
- def config(path) # rubocop:disable Metrics/MethodLength
27
- path = path.split('.').map(&:to_sym)
28
- result = repo.conf.dig(*path)
29
- case result
30
- when Hash
31
- say JSON.generate(result)
32
- when Array
33
- result.each do |item|
34
- say item
35
- end
36
- else
37
- say result
38
- end
39
- end
25
+ desc 'config', 'Repo configuration options'
26
+ subcommand 'config', Config::Cli
40
27
 
41
28
  desc 'cdn', 'CDN stuff'
42
29
  subcommand 'cdn', Cdn::Cli
43
30
 
44
- desc 'deploy <stage>', 'Deploy current directory'
31
+ desc 'deploy <stage>', 'Deploy current repo'
45
32
  option 'no-build', type: :boolean
46
33
  option 'no-install', type: :boolean
47
34
  option 'dry-run', type: :boolean
48
35
  option 'skip-after-hooks', type: :boolean
49
36
  option :yes, type: :boolean
50
- # this only has logic for CDN deployments
51
- # TODO: Add logic for different deployment types
52
- def deploy(stage) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
53
- Afterlife.cli = self
54
- Afterlife.current_stage = Afterlife.config.stages[stage.to_sym]
55
- fill_env
56
- ask_confirmation(repo.confirmation_message) unless options['yes']
57
- install_dependencies unless options['no-install']
58
- build unless options['no-build']
59
-
60
- say_status 'Deploying', repo.dist_path
61
- output = Deploy.call
62
- say_status 'Deployed', output
63
- rescue Deploy::Error => e
37
+ def deploy(stage)
38
+ invoke Deploy::Cli, :call, [stage], options
39
+ rescue Deploy::Error
64
40
  fatal!(e.message)
65
41
  rescue Interrupt
66
42
  log_interrupted
@@ -77,39 +53,6 @@ module Afterlife
77
53
 
78
54
  private
79
55
 
80
- def fill_env
81
- repo.env.merge!(
82
- 'DIST_PATH' => repo.dist_path.to_s,
83
- 'CURRENT_BRANCH' => repo.current_branch,
84
- 'AFTERLIFE_STAGE' => Afterlife.current_stage.name,
85
- )
86
- end
87
-
88
- def install_dependencies
89
- return unless repo.install_dependencies_command
90
-
91
- say_status 'Installing', '*' * 20
92
- Exec.run(repo.install_dependencies_command)
93
- end
94
-
95
- def build
96
- return unless repo.build_command
97
-
98
- say_status 'Building', '*' * 20
99
- Exec.run(repo.build_command)
100
- end
101
-
102
- def ask_confirmation(message)
103
- if message
104
- say message
105
- else
106
- say set_color("You're about to deploy the contents of '#{repo.dist_path}' to")
107
- say set_color(Cdn.url(repo), :bold)
108
- say set_color("\nWARNING: Please be aware that this may be a destructive operation", :yellow)
109
- end
110
- exit 1 unless yes?('Are you sure? [y/n]')
111
- end
112
-
113
56
  def repo
114
57
  Afterlife.current_repo
115
58
  end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Afterlife
4
+ module Config
5
+ class Cli < Thor
6
+ include BaseCli
7
+ def self.exit_on_failure?
8
+ true
9
+ end
10
+
11
+ desc 'get <path>', 'get config path'
12
+ def get(path)
13
+ Repo::Config.read(path) do |value|
14
+ say value
15
+ end
16
+ rescue Repo::Config::Error => e
17
+ fatal!(e.message)
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Afterlife
4
+ module Config
5
+ class Provider
6
+ def self.file
7
+ Afterlife.local_path.join('config.yml')
8
+ end
9
+
10
+ def respond_to_missing?(sym, include_all)
11
+ config.key?(sym) || super
12
+ end
13
+
14
+ def method_missing(sym, *args, &block)
15
+ config.key?(sym) ? config[sym] : super
16
+ end
17
+
18
+ def stages
19
+ @stages ||= config.delete(:stages)&.to_h do |name, val|
20
+ [name, Stage.new(val.merge(name: name.to_s))]
21
+ end
22
+ end
23
+
24
+ private
25
+
26
+ def config
27
+ @config ||= YAML.load_file(Provider.file).deep_symbolize_keys
28
+ end
29
+ end
30
+ end
31
+ end
@@ -1,29 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Afterlife
4
- class Config
5
- def self.file
6
- Afterlife.local_path.join('config.yml')
7
- end
8
-
9
- def respond_to_missing?(sym, include_all)
10
- config.key?(sym) || super
11
- end
12
-
13
- def method_missing(sym, *args, &block)
14
- config.key?(sym) ? config[sym] : super
15
- end
16
-
17
- def stages
18
- @stages ||= config.delete(:stages)&.to_h do |name, val|
19
- [name, Stage.new(val.merge(name: name.to_s))]
20
- end
21
- end
22
-
23
- private
24
-
25
- def config
26
- @config ||= YAML.load_file(Config.file).deep_symbolize_keys
27
- end
4
+ module Config
28
5
  end
29
6
  end
@@ -1,10 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Afterlife
4
- class Deploy
4
+ module Deploy
5
5
  class CdnDeployment < Deployment
6
6
  def run
7
7
  Exec.run(commands)
8
+ end
9
+
10
+ def output
8
11
  Cdn.url(repo)
9
12
  end
10
13
 
@@ -17,6 +20,15 @@ module Afterlife
17
20
  )
18
21
  end
19
22
 
23
+ def initial_message
24
+ repo.dist_path
25
+ end
26
+
27
+ def confirmation_message
28
+ repo.confirmation_message ||
29
+ "You are about to deploy the contents of '#{repo.dist_path}' to"
30
+ end
31
+
20
32
  private
21
33
 
22
34
  def commands
@@ -35,18 +47,24 @@ module Afterlife
35
47
  %<S3_FULL_PATH>s
36
48
  --exclude '*.ts'
37
49
  --exclude '*.tsx'
38
- --cache-control 'no-cache'
50
+ --size-only
51
+ --cache-control 'public, max-age=31540000'
39
52
  BASH
40
53
  end
41
54
 
42
55
  def revision
43
56
  <<-BASH
44
- echo "#{repo.current_revision}" | aws s3 cp --content-type text/plain - %<S3_FULL_PATH>s/revision
57
+ echo "#{repo.current_revision}" |
58
+ aws s3 cp --content-type text/plain --cache-control 'no-cache' - #{s3_revision_path}
45
59
  BASH
46
60
  end
47
61
 
62
+ def s3_revision_path
63
+ "s3://#{Afterlife.current_stage.bucket}/#{repo.full_name}/revision"
64
+ end
65
+
48
66
  def s3_full_path
49
- "s3://#{Afterlife.current_stage.bucket}/#{repo.full_name}"
67
+ "s3://#{Afterlife.current_stage.bucket}/#{repo.full_name}/#{repo.current_revision}"
50
68
  end
51
69
  end
52
70
  end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Afterlife
4
+ module Deploy
5
+ class CdnStenciljsDeployment < CdnDeployment
6
+ private
7
+
8
+ def commands
9
+ [
10
+ add_revision_command,
11
+ repo_command || javascripts,
12
+ revision,
13
+ ]
14
+ end
15
+
16
+ def add_revision_command
17
+ Dir["#{repo.dist_path}/*.esm.js"].map do |file|
18
+ next if file.include?(repo.current_revision)
19
+
20
+ new_name = file.gsub('.esm.js', "-#{repo.current_revision}.esm.js")
21
+ "mv #{file} #{new_name}"
22
+ end
23
+ end
24
+
25
+ def s3_full_path
26
+ "s3://#{Afterlife.current_stage.bucket}/#{repo.full_name}"
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Afterlife
4
+ module Deploy
5
+ class Cli < Thor
6
+ include BaseCli
7
+ def self.exit_on_failure?
8
+ true
9
+ end
10
+
11
+ desc 'deploy <stage>', 'Deploy current repo'
12
+ def call(stage)
13
+ Afterlife.cli = self
14
+ Deploy.call(stage) do |deployment|
15
+ setup_deploy(deployment)
16
+ say_status 'Deploying', deployment.initial_message
17
+ deployment.run
18
+ say_status 'Deployed', deployment.output
19
+ run_after_hooks
20
+ end
21
+ rescue Deploy::Error => e
22
+ fatal!(e.message)
23
+ end
24
+
25
+ private
26
+
27
+ def run_after_hooks
28
+ return if options['skip-after-hooks']
29
+
30
+ commands = repo.conf.dig(:deploy, :after)
31
+ return unless commands
32
+
33
+ say_status 'After hooks', ''
34
+ Exec.run(commands)
35
+ end
36
+
37
+ def setup_deploy(deployment)
38
+ ask_confirmation(deployment) unless options['yes']
39
+ install_dependencies unless options['no-install']
40
+ build unless options['no-build']
41
+ end
42
+
43
+ def ask_confirmation(deployment)
44
+ say set_color(deployment.confirmation_message)
45
+ say set_color(deployment.output, :bold) if deployment.output
46
+ say set_color("\nWARNING: Please be aware that this may be a destructive operation", :yellow)
47
+ exit 1 unless yes?('Are you sure? [y/n]')
48
+ end
49
+
50
+ def install_dependencies
51
+ return unless repo.install_dependencies_command
52
+
53
+ say_status 'Installing', '*' * 20
54
+ Exec.run(repo.install_dependencies_command)
55
+ end
56
+
57
+ def build
58
+ return unless repo.build_command
59
+
60
+ say_status 'Building', '*' * 20
61
+ Exec.run(repo.build_command)
62
+ end
63
+
64
+ def repo
65
+ Afterlife.current_repo
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Afterlife
4
+ module Deploy
5
+ class CustomDeployment < Deployment
6
+ def run
7
+ Exec.run(commands)
8
+ end
9
+
10
+ def confirmation_message
11
+ 'You are about to deploy the current directory'
12
+ end
13
+
14
+ private
15
+
16
+ def commands
17
+ [
18
+ repo_command,
19
+ ].flatten
20
+ end
21
+ end
22
+ end
23
+ end
@@ -1,22 +1,20 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Afterlife
4
- class Deploy
4
+ module Deploy
5
5
  class Deployment
6
- def self.run
7
- deployment = new.tap(&:setup)
8
- deployment.run
9
- end
10
-
11
6
  def run
12
7
  fail NotImplementedError
13
8
  end
14
9
 
15
10
  def repo_command
16
- Array(repo.conf.dig(:deploy, :command))
11
+ Array(repo.conf.dig(:deploy, :command)).presence
17
12
  end
18
13
 
19
14
  def setup; end
15
+ def output; end
16
+ def initial_message; end
17
+ def confirmation_message; end
20
18
 
21
19
  protected
22
20
 
@@ -1,44 +1,47 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Afterlife
4
- class Deploy
5
- Error = Class.new StandardError
4
+ module Deploy
5
+ module_function
6
6
 
7
- def self.call
8
- new.deploy
9
- end
7
+ Error = Class.new StandardError
10
8
 
11
- def deploy
12
- deployment_output.tap do
13
- Exec.run(after_deploy_command) if after_deploy_command
14
- end
15
- rescue Exec::Error => e
16
- raise Error, e
9
+ def call(stage)
10
+ deployment = klass.new
11
+ setup_stage(stage)
12
+ fill_env
13
+ deployment.setup
14
+ yield deployment
15
+ deployment
17
16
  end
18
17
 
19
- private
18
+ def klass
19
+ klass = "#{current_type.gsub('-', '_')}_deployment".classify
20
+ fail Error, "deployment type '#{current_type}' is invalid" unless const_defined?(klass)
20
21
 
21
- def deployment_output
22
- case deployment_type
23
- when 'cdn'
24
- CdnDeployment.run
25
- end
22
+ const_get(klass)
26
23
  end
27
24
 
28
- def deployment_type
29
- repo.conf.dig(:deploy, :type).tap do |result|
25
+ def current_type
26
+ Afterlife.current_repo.conf.dig(:deploy, :type).tap do |result|
30
27
  fail Error, 'deploy.type must be defined if you want to deploy with Afterlife' unless result
31
28
  end
32
29
  end
33
30
 
34
- def after_deploy_command
35
- return if Afterlife.cli.options['skip-after-hooks']
31
+ def setup_stage(stage)
32
+ unless Afterlife.config.stages.key?(stage.to_sym)
33
+ fail Error, "invalid stage '#{stage}'. Possible values: #{Afterlife.config.stages.keys.map(&:to_s)}"
34
+ end
36
35
 
37
- repo.conf.dig(:deploy, :after)
36
+ Afterlife.current_stage = Afterlife.config.stages[stage.to_sym]
38
37
  end
39
38
 
40
- def repo
41
- Afterlife.current_repo
39
+ def fill_env
40
+ Afterlife.current_repo.env.merge!(
41
+ 'DIST_PATH' => Afterlife.current_repo.dist_path.to_s,
42
+ 'CURRENT_BRANCH' => Afterlife.current_repo.current_branch,
43
+ 'AFTERLIFE_STAGE' => Afterlife.current_stage.name,
44
+ )
42
45
  end
43
46
  end
44
47
  end
@@ -12,7 +12,7 @@ module Afterlife
12
12
  end
13
13
 
14
14
  def self.parse(arg, env)
15
- Array(arg).map do |command|
15
+ Array(arg.flatten.compact).flatten.map do |command|
16
16
  format(command, env.symbolize_keys)
17
17
  end
18
18
  end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Afterlife
4
+ class Repo
5
+ class Config
6
+ Error = Class.new StandardError
7
+
8
+ attr_reader :path
9
+
10
+ def self.read(path, &block)
11
+ new(path).read(&block)
12
+ end
13
+
14
+ def initialize(path)
15
+ @path = path.split('.').map(&:to_sym)
16
+ end
17
+
18
+ def read(&block) # rubocop:disable Metrics/MethodLength
19
+ case from_yml
20
+ when Hash
21
+ yield(JSON.generate(from_yml))
22
+ when Array
23
+ from_yml.each(&block)
24
+ when String, Symbol
25
+ yield(from_yml)
26
+ else
27
+ fail Error, "No config with path '#{path.join('.')}'" unless repo_method?
28
+
29
+ yield(repo.public_send(repo_method))
30
+ end
31
+ end
32
+
33
+ private
34
+
35
+ def repo_method?
36
+ path.count == 1 && repo.public_methods(false).include?(repo_method)
37
+ end
38
+
39
+ def repo_method
40
+ @repo_method ||= path.first.to_s.gsub('-', '_').to_sym
41
+ end
42
+
43
+ def repo
44
+ Afterlife.current_repo
45
+ end
46
+
47
+ def from_yml
48
+ return @from_yml if defined?(@from_yml)
49
+
50
+ @from_yml ||= repo.conf.dig(*path)
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Afterlife
4
+ class Repo
5
+ class Provider
6
+ CONFIG_NAME = '.afterlife.yml'
7
+
8
+ attr_reader :full_path
9
+
10
+ def initialize(full_path)
11
+ @full_path = full_path
12
+ end
13
+
14
+ def config
15
+ return @config if defined?(@config)
16
+
17
+ if config_file.exist?
18
+ @config = base_config
19
+ @config = parent.deep_merge(base_config) if parent
20
+ end
21
+
22
+ @config ||= {}
23
+ end
24
+
25
+ private
26
+
27
+ def parent
28
+ return @parent if defined?(@parent)
29
+
30
+ inherit_from = base_config.delete(:inherit_from)
31
+ return @parent = nil unless inherit_from
32
+
33
+ @parent = Provider.new(full_path.join(inherit_from)).config
34
+ @parent[:cdn]&.delete(:packages)
35
+ @parent
36
+ end
37
+
38
+ def base_config
39
+ @base_config ||= YAML.load_file(config_file).deep_symbolize_keys
40
+ end
41
+
42
+ def config_file
43
+ @config_file ||= full_path.join(CONFIG_NAME)
44
+ end
45
+ end
46
+ end
47
+ end
@@ -74,6 +74,10 @@ module Afterlife
74
74
  @current_revision ||= `git rev-parse HEAD`.chomp
75
75
  end
76
76
 
77
+ def current_revision_short
78
+ @current_revision_short ||= `git rev-parse --short HEAD`.chomp
79
+ end
80
+
77
81
  def name
78
82
  full_name.split('/').last.gsub('-', '_')
79
83
  end
@@ -110,49 +114,7 @@ module Afterlife
110
114
  end
111
115
 
112
116
  def conf
113
- @conf ||= Config.new(full_path).config
114
- end
115
-
116
- class Config
117
- CONFIG_NAME = '.afterlife.yml'
118
-
119
- attr_reader :full_path
120
-
121
- def initialize(full_path)
122
- @full_path = full_path
123
- end
124
-
125
- def config
126
- return @config if defined?(@config)
127
-
128
- if config_file.exist?
129
- @config = base_config
130
- @config = parent.deep_merge(base_config) if parent
131
- end
132
-
133
- @config ||= {}
134
- end
135
-
136
- private
137
-
138
- def parent
139
- return @parent if defined?(@parent)
140
-
141
- inherit_from = base_config.delete(:inherit_from)
142
- return @parent = nil unless inherit_from
143
-
144
- @parent = Config.new(full_path.join(inherit_from)).config
145
- @parent[:cdn]&.delete(:packages)
146
- @parent
147
- end
148
-
149
- def base_config
150
- @base_config ||= YAML.load_file(config_file).deep_symbolize_keys
151
- end
152
-
153
- def config_file
154
- @config_file ||= full_path.join(CONFIG_NAME)
155
- end
117
+ @conf ||= Provider.new(full_path).config
156
118
  end
157
119
  end
158
120
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Afterlife
4
- VERSION = '1.0.0'
4
+ VERSION = '1.2.0'
5
5
  end
data/lib/afterlife.rb CHANGED
@@ -26,7 +26,7 @@ module Afterlife
26
26
  end
27
27
 
28
28
  def self.config
29
- @config ||= Config.new
29
+ @config ||= Config::Provider.new
30
30
  end
31
31
 
32
32
  def self.current_repo
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: afterlife
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Genaro Madrid
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-11-08 00:00:00.000000000 Z
11
+ date: 2023-11-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -110,7 +110,6 @@ files:
110
110
  - CHANGELOG.md
111
111
  - Gemfile
112
112
  - README.md
113
- - Rakefile
114
113
  - afterlife.gemspec
115
114
  - config.ru
116
115
  - exe/afterlife
@@ -123,8 +122,13 @@ files:
123
122
  - lib/afterlife/cdn/server.rb
124
123
  - lib/afterlife/cli.rb
125
124
  - lib/afterlife/config.rb
125
+ - lib/afterlife/config/cli.rb
126
+ - lib/afterlife/config/provider.rb
126
127
  - lib/afterlife/deploy.rb
127
128
  - lib/afterlife/deploy/cdn_deployment.rb
129
+ - lib/afterlife/deploy/cdn_stenciljs_deployment.rb
130
+ - lib/afterlife/deploy/cli.rb
131
+ - lib/afterlife/deploy/custom_deployment.rb
128
132
  - lib/afterlife/deploy/deployment.rb
129
133
  - lib/afterlife/environment.rb
130
134
  - lib/afterlife/exec.rb
@@ -135,10 +139,11 @@ files:
135
139
  - lib/afterlife/release/helper.rb
136
140
  - lib/afterlife/release/pre_helper.rb
137
141
  - lib/afterlife/repo.rb
142
+ - lib/afterlife/repo/config.rb
143
+ - lib/afterlife/repo/provider.rb
138
144
  - lib/afterlife/stage.rb
139
145
  - lib/afterlife/version.rb
140
146
  - logs/.keep
141
- - yarn.lock
142
147
  homepage:
143
148
  licenses: []
144
149
  metadata:
@@ -163,5 +168,5 @@ requirements: []
163
168
  rubygems_version: 3.2.33
164
169
  signing_key:
165
170
  specification_version: 4
166
- summary: Devops tools for Mifiel
171
+ summary: Devops utils
167
172
  test_files: []
data/Rakefile DELETED
@@ -1,17 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'bundler/gem_tasks'
4
- require 'rspec/core/rake_task'
5
-
6
- RSpec::Core::RakeTask.new(:spec)
7
-
8
- require 'rubocop/rake_task'
9
-
10
- RuboCop::RakeTask.new
11
-
12
- desc 'start a console'
13
- task :console do
14
- exec 'pry -r afterlife -I ./lib'
15
- end
16
-
17
- task default: %i[spec rubocop]
data/yarn.lock DELETED
@@ -1,260 +0,0 @@
1
- # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
2
- # yarn lockfile v1
3
-
4
-
5
- ansi-styles@^4.1.0:
6
- version "4.3.0"
7
- resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
8
- integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
9
- dependencies:
10
- color-convert "^2.0.1"
11
-
12
- async@^2.6.4:
13
- version "2.6.4"
14
- resolved "https://registry.npmjs.org/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221"
15
- integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==
16
- dependencies:
17
- lodash "^4.17.14"
18
-
19
- basic-auth@^2.0.1:
20
- version "2.0.1"
21
- resolved "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a"
22
- integrity sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==
23
- dependencies:
24
- safe-buffer "5.1.2"
25
-
26
- call-bind@^1.0.0:
27
- version "1.0.2"
28
- resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c"
29
- integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==
30
- dependencies:
31
- function-bind "^1.1.1"
32
- get-intrinsic "^1.0.2"
33
-
34
- chalk@^4.1.2:
35
- version "4.1.2"
36
- resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
37
- integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
38
- dependencies:
39
- ansi-styles "^4.1.0"
40
- supports-color "^7.1.0"
41
-
42
- color-convert@^2.0.1:
43
- version "2.0.1"
44
- resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
45
- integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
46
- dependencies:
47
- color-name "~1.1.4"
48
-
49
- color-name@~1.1.4:
50
- version "1.1.4"
51
- resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
52
- integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
53
-
54
- corser@^2.0.1:
55
- version "2.0.1"
56
- resolved "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz#8eda252ecaab5840dcd975ceb90d9370c819ff87"
57
- integrity sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==
58
-
59
- debug@^3.2.7:
60
- version "3.2.7"
61
- resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a"
62
- integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==
63
- dependencies:
64
- ms "^2.1.1"
65
-
66
- eventemitter3@^4.0.0:
67
- version "4.0.7"
68
- resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f"
69
- integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==
70
-
71
- follow-redirects@^1.0.0:
72
- version "1.15.2"
73
- resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13"
74
- integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==
75
-
76
- function-bind@^1.1.1:
77
- version "1.1.1"
78
- resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
79
- integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
80
-
81
- get-intrinsic@^1.0.2:
82
- version "1.1.3"
83
- resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385"
84
- integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==
85
- dependencies:
86
- function-bind "^1.1.1"
87
- has "^1.0.3"
88
- has-symbols "^1.0.3"
89
-
90
- has-flag@^4.0.0:
91
- version "4.0.0"
92
- resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
93
- integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
94
-
95
- has-symbols@^1.0.3:
96
- version "1.0.3"
97
- resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8"
98
- integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==
99
-
100
- has@^1.0.3:
101
- version "1.0.3"
102
- resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
103
- integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
104
- dependencies:
105
- function-bind "^1.1.1"
106
-
107
- he@^1.2.0:
108
- version "1.2.0"
109
- resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
110
- integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
111
-
112
- html-encoding-sniffer@^3.0.0:
113
- version "3.0.0"
114
- resolved "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz#2cb1a8cf0db52414776e5b2a7a04d5dd98158de9"
115
- integrity sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==
116
- dependencies:
117
- whatwg-encoding "^2.0.0"
118
-
119
- http-proxy@^1.18.1:
120
- version "1.18.1"
121
- resolved "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549"
122
- integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==
123
- dependencies:
124
- eventemitter3 "^4.0.0"
125
- follow-redirects "^1.0.0"
126
- requires-port "^1.0.0"
127
-
128
- http-server@^14.1.1:
129
- version "14.1.1"
130
- resolved "https://registry.npmjs.org/http-server/-/http-server-14.1.1.tgz#d60fbb37d7c2fdff0f0fbff0d0ee6670bd285e2e"
131
- integrity sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==
132
- dependencies:
133
- basic-auth "^2.0.1"
134
- chalk "^4.1.2"
135
- corser "^2.0.1"
136
- he "^1.2.0"
137
- html-encoding-sniffer "^3.0.0"
138
- http-proxy "^1.18.1"
139
- mime "^1.6.0"
140
- minimist "^1.2.6"
141
- opener "^1.5.1"
142
- portfinder "^1.0.28"
143
- secure-compare "3.0.1"
144
- union "~0.5.0"
145
- url-join "^4.0.1"
146
-
147
- iconv-lite@0.6.3:
148
- version "0.6.3"
149
- resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501"
150
- integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==
151
- dependencies:
152
- safer-buffer ">= 2.1.2 < 3.0.0"
153
-
154
- lodash@^4.17.14:
155
- version "4.17.21"
156
- resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
157
- integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
158
-
159
- mime@^1.6.0:
160
- version "1.6.0"
161
- resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
162
- integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
163
-
164
- minimist@^1.2.6:
165
- version "1.2.7"
166
- resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18"
167
- integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==
168
-
169
- mkdirp@^0.5.6:
170
- version "0.5.6"
171
- resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6"
172
- integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==
173
- dependencies:
174
- minimist "^1.2.6"
175
-
176
- ms@^2.1.1:
177
- version "2.1.3"
178
- resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
179
- integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
180
-
181
- object-inspect@^1.9.0:
182
- version "1.12.2"
183
- resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea"
184
- integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==
185
-
186
- opener@^1.5.1:
187
- version "1.5.2"
188
- resolved "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598"
189
- integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==
190
-
191
- portfinder@^1.0.28:
192
- version "1.0.32"
193
- resolved "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz#2fe1b9e58389712429dc2bea5beb2146146c7f81"
194
- integrity sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==
195
- dependencies:
196
- async "^2.6.4"
197
- debug "^3.2.7"
198
- mkdirp "^0.5.6"
199
-
200
- qs@^6.4.0:
201
- version "6.11.0"
202
- resolved "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a"
203
- integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==
204
- dependencies:
205
- side-channel "^1.0.4"
206
-
207
- requires-port@^1.0.0:
208
- version "1.0.0"
209
- resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
210
- integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==
211
-
212
- safe-buffer@5.1.2:
213
- version "5.1.2"
214
- resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
215
- integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
216
-
217
- "safer-buffer@>= 2.1.2 < 3.0.0":
218
- version "2.1.2"
219
- resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
220
- integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
221
-
222
- secure-compare@3.0.1:
223
- version "3.0.1"
224
- resolved "https://registry.npmjs.org/secure-compare/-/secure-compare-3.0.1.tgz#f1a0329b308b221fae37b9974f3d578d0ca999e3"
225
- integrity sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==
226
-
227
- side-channel@^1.0.4:
228
- version "1.0.4"
229
- resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf"
230
- integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==
231
- dependencies:
232
- call-bind "^1.0.0"
233
- get-intrinsic "^1.0.2"
234
- object-inspect "^1.9.0"
235
-
236
- supports-color@^7.1.0:
237
- version "7.2.0"
238
- resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
239
- integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
240
- dependencies:
241
- has-flag "^4.0.0"
242
-
243
- union@~0.5.0:
244
- version "0.5.0"
245
- resolved "https://registry.npmjs.org/union/-/union-0.5.0.tgz#b2c11be84f60538537b846edb9ba266ba0090075"
246
- integrity sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==
247
- dependencies:
248
- qs "^6.4.0"
249
-
250
- url-join@^4.0.1:
251
- version "4.0.1"
252
- resolved "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz#b642e21a2646808ffa178c4c5fda39844e12cde7"
253
- integrity sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==
254
-
255
- whatwg-encoding@^2.0.0:
256
- version "2.0.0"
257
- resolved "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz#e7635f597fd87020858626805a2729fa7698ac53"
258
- integrity sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==
259
- dependencies:
260
- iconv-lite "0.6.3"