afterlife 1.0.0 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
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"