capistrano-ops 0.2.12 → 0.2.14

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: 8c6192691d485f5348cadfb470f7c06c7e86e4aca51daedcb1ffe33be9923a2d
4
- data.tar.gz: 469cba09f0f444133aa54451d8e7f06fac4430d3ab9cc67bc52714f76402949f
3
+ metadata.gz: 72b073b9c2ecb5026ab9f56c3953f9bd664e5537087a07c7a22cd390a69fe7da
4
+ data.tar.gz: 60e5b8b52641c59bd1c6c3ec1b99aef79e90269a2ca11deb23b39283348b00e1
5
5
  SHA512:
6
- metadata.gz: 0bca2a6b0dd5e2b7dd724c623ea1f9f22bb6c05ca16ee654f805253fac5dedbf955c1c729dac8aa3c4d66822eead8b38cb7a62645dca5d7b11fe034cf860b3ca
7
- data.tar.gz: 74c95eea7b0f4bc7b95b24010f7a651a987a06234f455c63e68d9e8cac3961930a2fe0cc9dee105be44401b40aef01a40ba274734cd1bf9cc3255884dfe6766c
6
+ metadata.gz: 6bff0e67cad4a819dd93400b7de6b8acbec6642df2bc15e569cfd3a3a2ae6ec38a70f38eb09483f90b335cc423da5ef3ef9e2a912b036fe576911b35f26f1bfa
7
+ data.tar.gz: eb67fd7c492534f4e4086327631ea52c391802f76f3ac17b17525313483eff0ec8e54441a08f045a78d75714ab4fc9691a71de47706ffa7a03ce56786b85900d
data/.rubocop.yml CHANGED
@@ -1,3 +1,6 @@
1
+ require:
2
+ - rubocop-performance
3
+ - rubocop-rails
1
4
  AllCops:
2
5
  NewCops: disable
3
6
  TargetRubyVersion: 2.7
@@ -19,3 +22,7 @@ Metrics/PerceivedComplexity:
19
22
  Max: 25
20
23
  Style/Documentation:
21
24
  Enabled: false
25
+ Rails/RakeEnvironment:
26
+ Enabled: false
27
+ Rails/Output:
28
+ Enabled: false
data/README.md CHANGED
@@ -264,6 +264,34 @@ sudo apt-get install logrotate
264
264
 
265
265
  Once logrotate is installed, you can use the capistrano-ops tasks to manage it.
266
266
 
267
+ ## Wkhtmltopdf Setup
268
+
269
+ This script is used to setup `wkhtmltopdf-binary` in your deployment environment. It is designed to work with Capistrano.
270
+
271
+ The main task `setup` is hooked to run after the `deploy:symlink:release` task.
272
+ It performs the following operations:
273
+
274
+ - unzip the necessary binary file
275
+
276
+ - set the binary file permissions
277
+
278
+ The script assumes, that you have a intializer file for `wicked_pdf` gem, which sets the path to the binary file.
279
+ for example:
280
+
281
+ ```ruby
282
+ # config/initializers/wicked_pdf.rb
283
+ WickedPdf.config = {
284
+ exe_path: "#{Bundler.bundle_path}/gems/wkhtmltopdf-binary-0.12.6.6/bin/wkhtmltopdf_ubuntu_18.04_amd64",
285
+ }
286
+ ```
287
+
288
+ To use this script, include it in your Capistrano tasks and it will automatically run during deployment.
289
+
290
+ ```ruby
291
+ # Capfile
292
+ require 'capistrano/ops/wkhtmltopdf'
293
+ ```
294
+
267
295
  ## Contributing
268
296
 
269
297
  1. Fork it ( https://github.com/zauberware/capistrano-ops/fork )
@@ -26,4 +26,6 @@ Gem::Specification.new do |s|
26
26
  s.add_dependency 'rails'
27
27
  s.add_development_dependency 'bundler', '~> 2.4.12'
28
28
  s.add_development_dependency 'rake', '~> 10.0'
29
+ s.add_development_dependency 'rubocop', '~> 1.56.2' # rubocop ruby
30
+ s.add_development_dependency 'rubocop-performance', '~> 1.19.0' # speed up rubocop
29
31
  end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ namespace :wkhtmltopdf do
4
+ after 'deploy:symlink:release', 'wkhtmltopdf:setup'
5
+
6
+ desc 'unzip wkhtmltopdf if necessary'
7
+ task :setup do
8
+ on roles(:app) do
9
+ within release_path do
10
+ binary_path, version = binary_path_and_version
11
+ info("setup wkhtmltopdf version #{version}")
12
+ check_file_and_permissions(binary_path, version)
13
+ end
14
+ end
15
+ end
16
+ end
17
+ def binary_path_and_version
18
+ # get the binary path of wkhtmltopdf-binary
19
+ gem_path = capture(:bundle, 'show', 'wkhtmltopdf-binary').strip
20
+ binary_path = "#{gem_path}/bin"
21
+
22
+ # get the use wkhtmltopdf_ubuntu version from the wicked_pdf initializer
23
+ version = capture(:cat, 'config/initializers/wicked_pdf.rb').scan(/wkhtmltopdf_ubuntu_(\d+\.\d+)_amd64/).flatten.first
24
+
25
+ [binary_path, version]
26
+ end
27
+
28
+ def check_file_and_permissions(binary_path, version)
29
+ binary_file = "#{binary_path}/wkhtmltopdf_ubuntu_#{version}_amd64"
30
+
31
+ if test("[ -f #{binary_file} ]")
32
+ info('wkhtmltopdf binary already extracted')
33
+
34
+ if test("[ $(stat -c '%a' #{binary_file}) = '777' ]")
35
+ info('wkhtmltopdf binary has already the right permissions')
36
+ else
37
+ info('adding right permissions to wkhtmltopdf binary')
38
+ execute("chmod 777 #{binary_file}")
39
+ end
40
+ else
41
+ info('extracting wkhtmltopdf binary')
42
+ # extract the binary but keep the gzip file
43
+ execute("cd #{binary_path} && gzip -dk wkhtmltopdf_ubuntu_#{version}_amd64.gz")
44
+ # add execute permission to the binary
45
+ execute("chmod 777 #{binary_file}")
46
+ end
47
+ info('wkhtmltopdf setup finished')
48
+ end
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'figaro_yaml_helper'
4
+
5
+ namespace :figaro_yml do
6
+ include FigaroYmlHelper
7
+ rake_roles = fetch(:rake_roles, :app)
8
+
9
+ desc 'compare and set the figaro_yml file on the server'
10
+ task :compare do
11
+ env = fetch(:stage).to_s
12
+ # Read and parse local application.yml
13
+ local = local_yaml
14
+
15
+ # Split into stage-specific and global configurations
16
+ local_global_env, local_stage_env = configs(local, env)
17
+
18
+ # puts local_global_env.to_yaml
19
+ # puts "\n\n\n"
20
+ # puts({ env => local_stage_env }.to_yaml)
21
+ on roles(rake_roles) do
22
+ # Read and parse remote application.yml
23
+ remote = YAML.safe_load(capture("cat #{shared_path}/config/application.yml"))
24
+ remote_global_env, remote_stage_env = configs(remote, env)
25
+
26
+ # puts remote_global_env.to_yaml
27
+ # puts "\n\n\n"
28
+ # puts({ env => remote_stage_env }.to_yaml)
29
+ # puts "Comparing local and remote application.yml for '#{env}' environment..."
30
+
31
+ # Compare hashes and handle nil results with empty hashes
32
+ differences_global = compare_hashes(local_global_env, remote_global_env)
33
+ differences_stage = compare_hashes(local_stage_env, remote_stage_env)
34
+
35
+ print_changes(differences_global, 'Local application.yml has extra/different global entries compared to remote.')
36
+ print_changes(differences_stage, "Local application.yml has extra/different entries in #{env} section compared to remote.") if differences_stage
37
+
38
+ puts 'No Differences found between remote and local application.yml' unless differences_global || differences_stage
39
+
40
+ # ask to overwrite remote yml if differences found
41
+ overwrite_remote = ask_to_overwrite('Overwrite remote application.yml') if differences_global || differences_stage
42
+ puts 'Nothing written to remote application.yml' unless overwrite_remote
43
+
44
+ exit unless overwrite_remote
45
+ # sort local yml before updating remote
46
+ puts 'Preparing local application.yml before updating remote...'
47
+ invoke 'figaro_yml:sort_local'
48
+ puts 'Local application.yml is ready to be updated.'
49
+
50
+ # update remote yml
51
+ invoke 'figaro_yml:setup'
52
+ ##
53
+ # TODO: restart server after updating remote yml
54
+ # let user choose to restart server after updating remote yml
55
+ # let user choose to restart server now or later if they choose to restart now
56
+ # ask for time to restart server if he chooses to restart later
57
+ # restart server after the time given
58
+ ##
59
+ puts 'Remote application.yml has been updated.'
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,74 @@
1
+ # frozen_string_literal: true
2
+
3
+ module FigaroYmlHelper
4
+ def environments
5
+ Dir.glob('config/deploy/*.rb')
6
+ end
7
+
8
+ def local_yaml
9
+ YAML.safe_load(File.read('config/application.yml')) || {}
10
+ end
11
+
12
+ def write_to_file(file, content)
13
+ File.open(file, 'w') do |f|
14
+ f.write(content)
15
+ end
16
+ end
17
+
18
+ def write_combined_yaml(yamls_combined)
19
+ if yamls_combined.empty?
20
+ info 'No data to write.'
21
+ else
22
+ # write to new file
23
+ info 'writing to config/application.yml'
24
+ write_to_file('config/application.yml', yamls_combined.to_yaml)
25
+ end
26
+ end
27
+
28
+ def compare_hashes(hash1, hash2)
29
+ all_keys = hash1.keys | hash2.keys # Union of all keys from both hashes
30
+ all_keys.each_with_object({}) do |key, changes_hash|
31
+ old_value = hash2[key].nil? ? 'nil' : hash2[key].to_s
32
+ new_value = hash1[key].nil? ? 'nil' : hash1[key].to_s
33
+
34
+ changes_hash[key] = { old: old_value, new: new_value } if old_value != new_value
35
+ end.tap { |changes| return changes.empty? ? nil : changes }
36
+ end
37
+
38
+ def print_changes(changes, message)
39
+ return unless changes
40
+
41
+ puts "#{message}:\n\n"
42
+ changes.each do |key, diff|
43
+ puts "#{key}: #{diff[:old]} => #{diff[:new]}"
44
+ end
45
+ puts "\n"
46
+ end
47
+
48
+ def ask_to_overwrite(question)
49
+ answer = ''
50
+ until %w[y n].include?(answer)
51
+ print "#{question}? (y/N): "
52
+ answer = $stdin.gets.strip.downcase
53
+ end
54
+ answer == 'y'
55
+ end
56
+
57
+ def configs(yaml, env)
58
+ stage_yml = yaml[env.to_s]&.sort.to_h
59
+ global_yml = remove_nested(yaml)&.sort.to_h
60
+ [global_yml, stage_yml]
61
+ end
62
+
63
+ def remove_nested(hash)
64
+ hash.each_with_object({}) do |(key, value), new_hash|
65
+ new_hash[key] = value unless value.is_a?(Hash)
66
+ end
67
+ end
68
+
69
+ def sort_with_nested(hash)
70
+ hash.each_with_object({}) do |(key, value), new_hash|
71
+ new_hash[key] = value.is_a?(Hash) ? sort_with_nested(value) : value
72
+ end.sort.to_h
73
+ end
74
+ end
@@ -0,0 +1,68 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'figaro_yaml_helper'
4
+
5
+ namespace :figaro_yml do
6
+ include FigaroYmlHelper
7
+
8
+ rake_roles = fetch(:rake_roles, :app)
9
+ desc 'get the `application.yml` file from server and create local if it does not exist'
10
+ task :get do
11
+ env = fetch(:stage)
12
+ if !File.exist?('config/application.yml')
13
+ run_locally do
14
+ puts "found #{environments.count} stages"
15
+ yamls_combined = {}
16
+
17
+ stages.each do |f|
18
+ stage = File.basename(f, '.rb')
19
+ puts "download #{stage} application.yml"
20
+ begin
21
+ res = capture "cap #{stage} figaro_yml:get_stage"
22
+ stage_yaml = YAML.safe_load(res)
23
+ stage_yaml[stage.to_s] = stage_yaml[stage.to_s].sort.to_h
24
+ yamls_combined.merge!(stage_yaml) if stage_yaml
25
+ rescue StandardError
26
+ puts "could not get #{stage} application.yml"
27
+ end
28
+ end
29
+
30
+ write_combined_yaml(yamls_combined.sort.to_h)
31
+ end
32
+ else
33
+ on roles(rake_roles) do
34
+ local_yml = local_yaml.sort.to_h
35
+ local_global, local_stage = configs(local_yml, env)
36
+
37
+ remote = capture("cat #{shared_path}/config/application.yml")
38
+ remote_yml = YAML.safe_load(remote).sort.to_h
39
+ remote_global, remote_stage = configs(remote_yml, env)
40
+
41
+ differences_global = compare_hashes(remote_global, local_global || {})
42
+ differences_stage = compare_hashes(remote_stage, local_stage || {})
43
+
44
+ print_changes(differences_global,
45
+ 'Remote application.yml has extra/different global entries compared to local.')
46
+ print_changes(differences_stage, "Remote application.yml has extra/different entries in #{env} section compared to local.") if differences_stage
47
+
48
+ puts 'No Differences found between remote and local application.yml' unless differences_global || differences_stage
49
+
50
+ # ask to overwrite local yml if differences found
51
+ stage_overwrite = ask_to_overwrite("Overwrite local application.yml #{env} section") if differences_stage
52
+ global_overwrite = ask_to_overwrite('Overwrite local application.yml globals') if differences_global
53
+ puts 'Nothing written to local application.yml' unless stage_overwrite || global_overwrite
54
+ exit unless stage_overwrite || global_overwrite
55
+
56
+ # compose new yml
57
+ composed_yml = {}
58
+ composed_yml.merge!(local_yml) # local yml is always included to avoid losing any data
59
+ composed_yml.merge!(local_global) unless global_overwrite
60
+ composed_yml.merge!(remote_global) if global_overwrite
61
+ composed_yml[env.to_s] = stage_overwrite ? remote_stage : local_stage
62
+
63
+ # write to new file
64
+ write_combined_yaml(composed_yml.sort.to_h)
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'figaro_yaml_helper'
4
+
5
+ namespace :figaro_yml do
6
+ rake_roles = fetch(:rake_roles, :app)
7
+
8
+ task :get_stage do
9
+ on roles(rake_roles) do
10
+ puts capture "cat #{shared_path}/config/application.yml"
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'figaro_yaml_helper'
4
+
5
+ namespace :figaro_yml do
6
+ include FigaroYmlHelper
7
+
8
+ task :sort_local do
9
+ run_locally do
10
+ info 'Sorting local application.yml...'
11
+ local = local_yaml
12
+ sorted_local = sort_with_nested(local)
13
+ write_combined_yaml(sorted_local)
14
+ end
15
+ end
16
+
17
+ task :sort do
18
+ invoke 'figaro_yml:sort_local'
19
+ end
20
+ end
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ Dir.glob("#{File.expand_path(__dir__)}/figaro_yml/**/*.rake").each { |f| load f }
@@ -5,12 +5,14 @@ require 'capistrano/version'
5
5
  if defined?(Capistrano::VERSION) && Gem::Version.new(Capistrano::VERSION).release >= Gem::Version.new('3.0.0')
6
6
  load File.expand_path('capistrano/v3/tasks/whenever.rake', __dir__)
7
7
  load File.expand_path('capistrano/v3/tasks/backup.rake', __dir__)
8
- load File.expand_path('capistrano/v3/tasks/figaro_yml.rake', __dir__)
8
+ load File.expand_path('capistrano/v3/tasks/figaro_yml.rb', __dir__)
9
+
9
10
  load File.expand_path('capistrano/v3/tasks/invoke.rake', __dir__)
10
11
  path = File.expand_path(__dir__)
11
12
  Dir.glob("#{path}/capistrano/v3/tasks/backup/**/*.rake").each { |f| load f }
12
13
  Dir.glob("#{path}/capistrano/v3/tasks/logrotate/**/*.rake").each { |f| load f }
13
14
  Dir.glob("#{path}/capistrano/v3/tasks/logs/**/*.rake").each { |f| load f }
15
+
14
16
  else
15
17
  puts 'Capistrano 3 is required to use this gem'
16
18
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Capistrano
4
4
  module Ops
5
- VERSION = '0.2.12'
5
+ VERSION = '0.2.14'
6
6
  end
7
7
  end
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ load File.expand_path('capistrano/tasks/wkhtmltopdf.rake', __dir__)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: capistrano-ops
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.12
4
+ version: 0.2.14
5
5
  platform: ruby
6
6
  authors:
7
7
  - Florian Crusius
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-06-10 00:00:00.000000000 Z
11
+ date: 2024-06-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aws-sdk-s3
@@ -94,6 +94,34 @@ dependencies:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
96
  version: '10.0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rubocop
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: 1.56.2
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: 1.56.2
111
+ - !ruby/object:Gem::Dependency
112
+ name: rubocop-performance
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: 1.19.0
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: 1.19.0
97
125
  description: A collection of devops tasks for rails applications
98
126
  email:
99
127
  - florian@zauberware.com
@@ -120,13 +148,19 @@ files:
120
148
  - lib/capistrano/ops/backup/s3.rb
121
149
  - lib/capistrano/ops/backup/s3_helper.rb
122
150
  - lib/capistrano/ops/capistrano.rb
151
+ - lib/capistrano/ops/capistrano/tasks/wkhtmltopdf.rake
123
152
  - lib/capistrano/ops/capistrano/v3/tasks/backup.rake
124
153
  - lib/capistrano/ops/capistrano/v3/tasks/backup/backup_helper.rb
125
154
  - lib/capistrano/ops/capistrano/v3/tasks/backup/database/create.rake
126
155
  - lib/capistrano/ops/capistrano/v3/tasks/backup/database/pull.rake
127
156
  - lib/capistrano/ops/capistrano/v3/tasks/backup/storage/create.rake
128
157
  - lib/capistrano/ops/capistrano/v3/tasks/backup/storage/pull.rake
129
- - lib/capistrano/ops/capistrano/v3/tasks/figaro_yml.rake
158
+ - lib/capistrano/ops/capistrano/v3/tasks/figaro_yml.rb
159
+ - lib/capistrano/ops/capistrano/v3/tasks/figaro_yml/compare.rake
160
+ - lib/capistrano/ops/capistrano/v3/tasks/figaro_yml/figaro_yaml_helper.rb
161
+ - lib/capistrano/ops/capistrano/v3/tasks/figaro_yml/get.rake
162
+ - lib/capistrano/ops/capistrano/v3/tasks/figaro_yml/get_stage.rake
163
+ - lib/capistrano/ops/capistrano/v3/tasks/figaro_yml/sort_local.rake
130
164
  - lib/capistrano/ops/capistrano/v3/tasks/invoke.rake
131
165
  - lib/capistrano/ops/capistrano/v3/tasks/logrotate/check.rake
132
166
  - lib/capistrano/ops/capistrano/v3/tasks/logrotate/disable.rake
@@ -147,6 +181,7 @@ files:
147
181
  - lib/capistrano/ops/tasks/storage/backup.rake
148
182
  - lib/capistrano/ops/tasks/storage/remove_old_backups.rake
149
183
  - lib/capistrano/ops/version.rb
184
+ - lib/capistrano/ops/wkhtmltopdf.rb
150
185
  homepage: https://github.com/zauberware/capistrano-ops
151
186
  licenses:
152
187
  - MIT
@@ -1,139 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # rubocop:disable Metrics/BlockLength
4
- namespace :figaro_yml do
5
- # Defaults to :app role
6
- rake_roles = fetch(:rake_roles, :app)
7
-
8
- desc 'get the `application.yml` file from server and create local if it does not exist'
9
- task :get do
10
- env = fetch(:stage)
11
- if !File.exist?('config/application.yml')
12
- puts 'config/application.yml does not exist, creating it from all stages'
13
- run_locally do
14
- yamls = {}
15
- stages = Dir.glob('config/deploy/*.rb')
16
- puts "found #{stages.count} stages"
17
- stages.map do |f|
18
- stage = File.basename(f, '.rb')
19
- puts "download #{stage} application.yml"
20
- begin
21
- res = capture "cap #{stage} figaro_yml:get_stage"
22
- yamls = yamls.merge(YAML.safe_load(res))
23
- rescue StandardError
24
- puts "could not get #{stage} application.yml"
25
- end
26
- yamls
27
- end
28
- # write to new file
29
- puts 'writing to config/application.yml'
30
- write_to_file('config/application.yml', yamls.to_yaml)
31
- end
32
- else
33
- local_yml = YAML.safe_load(File.read('config/application.yml'))
34
- on roles(rake_roles) do
35
- remote = capture("cat #{shared_path}/config/application.yml")
36
- remote_yml = YAML.safe_load(remote)
37
- remote_stage = remote_yml[env.to_s]
38
- puts "remote application.yml stage '#{env}':\n\n"
39
- puts "#{remote}\r\n"
40
- puts "\r\n"
41
- loop do
42
- print "Overwrite local application.yml stage '#{env}'? (y/N): "
43
- input = $stdin.gets.strip.downcase
44
- answer = (input.empty? ? 'N' : input).downcase.to_s
45
-
46
- next unless %w[y n].include?(answer)
47
-
48
- if answer == 'y'
49
- puts 'Updating local application.yml'
50
- local_yml[env.to_s] = remote_stage
51
- write_to_file('config/application.yml', local_yml.to_yaml)
52
- exit
53
- end
54
- break
55
- end
56
- puts 'Nothing written to local application.yml'
57
- exit
58
- end
59
- end
60
- end
61
-
62
- task :get_stage do
63
- on roles(rake_roles) do
64
- puts capture "cat #{shared_path}/config/application.yml"
65
- end
66
- end
67
-
68
- desc 'compare and set the figaro_yml file on the server'
69
- task :compare do
70
- env = fetch(:stage)
71
- # read local application.yml
72
- local = File.read('config/application.yml')
73
-
74
- # convert to hash
75
- local_global_env = YAML.safe_load(local)
76
-
77
- # split into stage and global
78
- local_stage_env = local_global_env[env.to_s]
79
- local_global_env.delete('staging')
80
- local_global_env.delete('production')
81
-
82
- on roles(rake_roles) do
83
- # read remote application.yml
84
- remote = capture("cat #{shared_path}/config/application.yml")
85
-
86
- remote_global_env = YAML.safe_load(remote)
87
- remote_stage_env = remote_global_env[env.to_s]
88
- remote_global_env.delete(env.to_s)
89
-
90
- puts "with command 'cap #{env} figaro_yml:setup', following variables will be overwritten:"
91
- puts '--------------------------------------------------------------------------------'
92
- result1 = compare_hashes(local_global_env, remote_global_env)
93
- result2 = compare_hashes(local_stage_env, remote_stage_env)
94
- if !result1.empty? || !result2.empty?
95
- loop do
96
- print 'Update remote application.yml? (y/N): '
97
- input = $stdin.gets.strip.downcase
98
- answer = (input.empty? ? 'N' : input).downcase.to_s
99
-
100
- next unless %w[y n].include?(answer)
101
-
102
- if answer == 'y'
103
- puts 'Updating remote application.yml'
104
- invoke 'figaro_yml:setup'
105
- exit
106
- end
107
- break
108
- end
109
- puts 'remote application.yml not updated'
110
- exit
111
- end
112
- puts 'remote application.yml is up to date'
113
- end
114
- end
115
- def compare_hashes(hash1, hash2)
116
- changes = false
117
- local_server = hash1.to_a - hash2.to_a
118
- server_local = hash2.to_a - hash1.to_a
119
-
120
- [local_server + server_local].flatten(1).to_h.each_key do |k|
121
- new_value = hash1[k].to_s
122
- new_value = new_value.empty? ? 'nil' : new_value
123
- old_value = hash2[k].to_s
124
- old_value = old_value.empty? ? 'nil' : old_value
125
-
126
- if old_value != new_value
127
- puts "#{k}: #{old_value} => #{new_value} \r\n"
128
- changes = true
129
- end
130
- end
131
- end
132
-
133
- def write_to_file(file, content)
134
- File.open(file, 'w') do |f|
135
- f.write(content)
136
- end
137
- end
138
- end
139
- # rubocop:enable Metrics/BlockLength