eco-rake 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +28 -0
  3. data/.gitlab-ci.yml +13 -0
  4. data/.rspec +3 -0
  5. data/.rubocop.yml +90 -0
  6. data/.yardopts +10 -0
  7. data/CHANGELOG.md +13 -0
  8. data/Gemfile +6 -0
  9. data/LICENSE +21 -0
  10. data/README.md +28 -0
  11. data/Rakefile +27 -0
  12. data/eco-rake.gemspec +34 -0
  13. data/lib/eco-rake/base/method_helpers.rb +55 -0
  14. data/lib/eco-rake/base/symbol_resolver.rb +82 -0
  15. data/lib/eco-rake/base.rb +25 -0
  16. data/lib/eco-rake/custom.rb +5 -0
  17. data/lib/eco-rake/default/const.rb +46 -0
  18. data/lib/eco-rake/default.rb +12 -0
  19. data/lib/eco-rake/lib/base_task.rb +9 -0
  20. data/lib/eco-rake/lib/concern/base.rb +21 -0
  21. data/lib/eco-rake/lib/concern/enviro.rb +23 -0
  22. data/lib/eco-rake/lib/concern/local_folder.rb +23 -0
  23. data/lib/eco-rake/lib/concern/person_schema.rb +24 -0
  24. data/lib/eco-rake/lib/concern.rb +11 -0
  25. data/lib/eco-rake/lib/export/payload.rb +78 -0
  26. data/lib/eco-rake/lib/export.rb +8 -0
  27. data/lib/eco-rake/lib/files/decrypt.rb +48 -0
  28. data/lib/eco-rake/lib/files/purge.rb +73 -0
  29. data/lib/eco-rake/lib/files/sftp.rb +49 -0
  30. data/lib/eco-rake/lib/files.rb +10 -0
  31. data/lib/eco-rake/lib/notify/mailer.rb +24 -0
  32. data/lib/eco-rake/lib/notify.rb +8 -0
  33. data/lib/eco-rake/lib/options.rb +8 -0
  34. data/lib/eco-rake/lib/people/base_task.rb +16 -0
  35. data/lib/eco-rake/lib/people/sync_launch.rb +131 -0
  36. data/lib/eco-rake/lib/people/sync_options.rb +15 -0
  37. data/lib/eco-rake/lib/people/sync_process.rb +48 -0
  38. data/lib/eco-rake/lib/people/sync_rely.rb +47 -0
  39. data/lib/eco-rake/lib/people.rb +12 -0
  40. data/lib/eco-rake/lib/task/runner_launch.rb +34 -0
  41. data/lib/eco-rake/lib/task/runner_options.rb +11 -0
  42. data/lib/eco-rake/lib/task/runner_rely.rb +40 -0
  43. data/lib/eco-rake/lib/task.rb +10 -0
  44. data/lib/eco-rake/lib.rb +15 -0
  45. data/lib/eco-rake/option/default_lookup.rb +39 -0
  46. data/lib/eco-rake/option/mirror.rb +34 -0
  47. data/lib/eco-rake/option/parented.rb +12 -0
  48. data/lib/eco-rake/option.rb +19 -0
  49. data/lib/eco-rake/options/default_lookup.rb +29 -0
  50. data/lib/eco-rake/options/forwarding/proxy.rb +125 -0
  51. data/lib/eco-rake/options/forwarding/rule.rb +82 -0
  52. data/lib/eco-rake/options/forwarding.rb +45 -0
  53. data/lib/eco-rake/options/library.rb +81 -0
  54. data/lib/eco-rake/options/parental.rb +37 -0
  55. data/lib/eco-rake/options/set.rb +21 -0
  56. data/lib/eco-rake/options.rb +25 -0
  57. data/lib/eco-rake/rake_task.rb +10 -0
  58. data/lib/eco-rake/shell/command.rb +59 -0
  59. data/lib/eco-rake/shell/eco_helpers.rb +10 -0
  60. data/lib/eco-rake/shell/files.rb +83 -0
  61. data/lib/eco-rake/shell/gpg.rb +54 -0
  62. data/lib/eco-rake/shell.rb +18 -0
  63. data/lib/eco-rake/tasks.rb +12 -0
  64. data/lib/eco-rake/utils/mailer.rb +91 -0
  65. data/lib/eco-rake/utils/mailing.rb +19 -0
  66. data/lib/eco-rake/utils/timing.rb +9 -0
  67. data/lib/eco-rake/utils.rb +19 -0
  68. data/lib/eco-rake/version.rb +5 -0
  69. data/lib/eco-rake.rb +16 -0
  70. metadata +271 -0
@@ -0,0 +1,83 @@
1
+ class EcoRake
2
+ module Shell
3
+ module Files
4
+ include Rake::DSL
5
+ DAY_SECONDS = (60 * 60 * 24)
6
+
7
+ # It creates directory `path` constructively.
8
+ # @note if any parent directory does not exist, it creates it as well.
9
+ def upsert_local_dir(path)
10
+ return if path.to_s.strip.empty?
11
+ return if File.directory?(path)
12
+ require 'fileutils'
13
+ puts "Creating directory '#{path}'"
14
+ FileUtils.mkdir_p(path)
15
+ end
16
+
17
+ # TODO: check delete status
18
+ def delete_file(*files, message: 'Deleting files:')
19
+ files = files.select {|file| File.exist?(file)}
20
+ return if files.empty?
21
+ puts message if message
22
+ files.each do |file|
23
+ File.delete(file)
24
+ puts " • #{file}" if message
25
+ end
26
+ end
27
+
28
+ def move_file(*files, folder:, message: 'Moving files:')
29
+ puts message if message
30
+ files.each do |file|
31
+ new_name = File.join(folder, File.basename(file))
32
+ File.name(file, new_name)
33
+ puts " • #{File.basename(file)}" if message
34
+ end
35
+ end
36
+
37
+ # It identifies files in a folder by using different criteria.
38
+ # @return [Array<String>] files that match the criteria **sorted** by name ascendant (i.e. abc)
39
+ def folder_files(folder = ".", pattern = "*", regexp: nil, older_than: nil)
40
+ target = File.join(File.expand_path(folder), pattern)
41
+ Dir[target].tap do |dir_files|
42
+ dir_files.select! {|f| File.file?(f)}
43
+ dir_files.select! {|f| file_older_than?(f, days: older_than)} if older_than
44
+ dir_files.select! {|f| File.basename(f).match(regexp)} if regexp.is_a?(Regexp)
45
+ end.sort
46
+ end
47
+
48
+ # @see #folder_files . Same but fixed to `*.csv` **pattern**
49
+ def csv_files(folder = ".", regexp: nil, older_than: nil)
50
+ folder_files(folder, "*.csv", regexp: regexp, older_than: older_than)
51
+ end
52
+
53
+ # @see #folder_files . Same but fixed to `*.csv.gpg` **pattern**
54
+ def gpg_files(folder = ".", regexp: nil, older_than: nil)
55
+ gpg = folder_files(folder, "*.gpg", regexp: regexp, older_than: older_than)
56
+ pgp = folder_files(folder, "*.pgp", regexp: regexp, older_than: older_than)
57
+ gpg.concat(pgp)
58
+ end
59
+
60
+ # Preserves the folder and the base name of `gpg_file` name
61
+ # and changes its extension to `csv`.
62
+ # @return [String]
63
+ def gpg_to_csv_filename(gpg_file)
64
+ return nil unless gpg_file
65
+ ext = gpg_file.split('.')[1..-1].join('.')
66
+ base = File.basename(gpg_file, ".#{ext}")
67
+ folder = File.dirname(gpg_file)
68
+ File.join(folder, "#{base}.csv")
69
+ end
70
+
71
+ private
72
+
73
+ def file_older_than?(file, days:)
74
+ File.mtime(file) < Time.now - days_to_seconds(days)
75
+ end
76
+
77
+ def days_to_seconds(days)
78
+ return nil unless days
79
+ days * DAY_SECONDS
80
+ end
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,54 @@
1
+ class EcoRake
2
+ module Shell
3
+ module Gpg
4
+ include EcoRake::Shell::Command
5
+ include EcoRake::Shell::Files
6
+
7
+ GPG_VERSION_REGEX = /^gpg.*?gnupg.*?(?<maj>\d+)\.(?<min>\d+)\./i.freeze
8
+
9
+ # @note
10
+ # 1. The ENV var `GPG_KEY` specifies the `passphrase` to be able to use the
11
+ # private gpg key (suppsedly installed in the user's local `gpg keyring`).
12
+ # 2. Depending on the `gpg` version, the option to prevent the interactive passphrase to prompt
13
+ # is different. This is the reason why we check what is the option for a `loopback`
14
+ # @param gpg_file [String] the file meant to be decrypted.
15
+ # @return [String] the command to decrypt `gpg_file`
16
+ def decrypt_command(gpg_file, gpg_key: ENV["GPG_KEY"], ignore_mdc_error: false)
17
+ csv_file = gpg_to_csv_filename(gpg_file)
18
+ no_error = ignore_mdc_error ? '--ignore-mdc-error' : nil
19
+ loopback = gpg_version_gte?(major: 2, minor: 1)? "--pinentry-mode=loopback" : "--batch --yes"
20
+ args = [
21
+ no_error, loopback,
22
+ '--passphrase', double_quote(gpg_key),
23
+ '-o', double_quote(csv_file),
24
+ '-d', double_quote(gpg_file)
25
+ ]
26
+ string_cmd('gpg', *args)
27
+ end
28
+
29
+ private
30
+
31
+ # TODO: use a common end point from `Command`
32
+ def shell_gpg_version
33
+ `gpg --version`
34
+ end
35
+
36
+ # Checks if the host `gpg` version is **greater than or equal** (`gte`) to `major` and `minor`
37
+ # @note the versioning format is `MAJOR.MINOR.PATCH`
38
+ # @example if the host has this gpg version: `gpg (GnuPG) 2.1.10`. The following is to be expected:
39
+ # 1. `gpg_version_gte?(major: 1, minor: 10)` return `true`
40
+ # 2. `gpg_version_gte?(major: 3, minor: 0)` return `false`
41
+ # 3. `gpg_version_gte?(major: 2, minor: 0)` return `true`
42
+ # 4. `gpg_version_gte?(major: 2, minor: 1)` return `true`
43
+ # 5. `gpg_version_gte?(major: 2, minor: 3)` return `false`
44
+ # @return [Boolean]
45
+ def gpg_version_gte?(major:, minor:)
46
+ result = shell_gpg_version
47
+ return false unless match = result.match(GPG_VERSION_REGEX)
48
+ maj = match[:maj].to_i
49
+ min = match[:min].to_i
50
+ (maj >= major) && (min >= minor)
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,18 @@
1
+ require_relative 'shell/command'
2
+ require_relative 'shell/files'
3
+ require_relative 'shell/gpg'
4
+ require_relative 'shell/eco_helpers'
5
+
6
+ class EcoRake
7
+ module Shell
8
+ class << self
9
+ def included(base)
10
+ super(base)
11
+ base.send :include, Command
12
+ base.send :include, Files
13
+ base.send :include, Gpg
14
+ base.send :include, EcoHelpers
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,12 @@
1
+ require_relative 'tasks/decrypt'
2
+ require_relative 'tasks/feed'
3
+ require_relative 'tasks/hris'
4
+ require_relative 'tasks/sftp'
5
+
6
+ # Offers a set of preconfigured tasks to inherit from
7
+ # @note that these samples themselves do not get autoloaded,
8
+ # although their children do.
9
+ class EcoRake
10
+ module Tasks
11
+ end
12
+ end
@@ -0,0 +1,91 @@
1
+ class EcoRake
2
+ module Utils
3
+ # Mailer helper that uses `aws-sdk-ses` **gem** (`Aws::SES::Client`)
4
+ # Several ENV vars should be configured for it to work (i.e. in the `.env` file):
5
+ # 1. `MAILER_REGION`
6
+ # 2. `MAILER_KEY_ID`
7
+ # 3. `MAILER_ACCESS_KEY`
8
+ # 4. `MAILER_FROM`
9
+ class Mailer
10
+ # Sends an email
11
+ # @param to [String] destination email address
12
+ # @param subject [String] subject of the email
13
+ # @param body [String] `html` or plain text message
14
+ # @param from [String] the email address this is send **from**
15
+ def mail(to:, subject:, body:, from: nil, cc: nil, bcc: nil)
16
+ unless configured?
17
+ puts "Mailer: You are missing configuration parameters. Review your .env file"
18
+ return false
19
+ end
20
+ ses.send_email(
21
+ destination: fetch_to(to: to, cc: cc, bcc: bcc),
22
+ source: fetch_from(from),
23
+ message: {
24
+ subject: {
25
+ charset: "UTF-8",
26
+ data: subject
27
+ },
28
+ body: {
29
+ # NOTEL: `html:` will let you send html instead
30
+ # you can use both at once if you like
31
+ text: {
32
+ charset: "UTF-8",
33
+ data: body
34
+ }
35
+ }
36
+ }
37
+ ).tap do |response|
38
+ puts "Sent email to #{to} (MessageId: #{response.message_id})"
39
+ end
40
+ end
41
+
42
+ # @return [Boolean] whether or not the mailer is configured for usage.
43
+ def configured?
44
+ fetch_access_key_id && fetch_secret_access_key && fetch_region
45
+ end
46
+
47
+ private
48
+
49
+ def ses
50
+ require 'aws-sdk-ses'
51
+ begin
52
+ @ses ||= Aws::SES::Client.new(
53
+ access_key_id: fetch_access_key_id,
54
+ secret_access_key: fetch_secret_access_key,
55
+ region: fetch_region
56
+ )
57
+ rescue StandardError => e
58
+ puts "Trying to send an email with wrong email configuration: #{e}"
59
+ end
60
+ @ses
61
+ end
62
+
63
+ def fetch_to(to: nil, cc: nil, bcc: nil)
64
+ {
65
+ to_addresses: [to].flatten.compact.uniq
66
+ }.tap do |dest|
67
+ cc = [cc].flatten.compact.uniq
68
+ bcc = [bcc].flatten.compact.uniq
69
+ dest.merge!(cc_addresses: cc) unless cc.empty?
70
+ dest.merge!(bcc_addresses: bcc) unless bcc.empty?
71
+ end
72
+ end
73
+
74
+ def fetch_from(value = nil)
75
+ value || ENV['MAILER_FROM']
76
+ end
77
+
78
+ def fetch_access_key_id
79
+ ENV['MAILER_KEY_ID']
80
+ end
81
+
82
+ def fetch_secret_access_key
83
+ ENV['MAILER_ACCESS_KEY']
84
+ end
85
+
86
+ def fetch_region
87
+ ENV['MAILER_REGION']
88
+ end
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,19 @@
1
+ class EcoRake
2
+ module Utils
3
+ module Mailing
4
+ # @return [EcoRake::Mailer]
5
+ def mailer
6
+ @mailer ||= EcoRake::Utils::Mailer.new
7
+ end
8
+
9
+ # Helper to notify that there are no files to be processed
10
+ def email_missing_files(enviro:, to:)
11
+ mailer.mail(**{
12
+ to: to,
13
+ subject: "#{enviro.upcase} (No files to be processed)",
14
+ body: 'No files found to be processed. Aborting...'
15
+ })
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,9 @@
1
+ class EcoRake
2
+ module Utils
3
+ module Timing
4
+ def today?(date)
5
+ date && date.strftime("%Y/%m/%d") == Time.now.strftime("%Y/%m/%d")
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,19 @@
1
+ require_relative 'utils/mailer'
2
+ require_relative 'utils/mailing'
3
+ require_relative 'utils/timing'
4
+
5
+ class EcoRake
6
+ module Utils
7
+ class << self
8
+ def included(base)
9
+ super(base)
10
+ base.extend ClassMethods
11
+ base.send :include, Mailing
12
+ base.send :include, Timing
13
+ end
14
+ end
15
+
16
+ module ClassMethods
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,5 @@
1
+ require 'rake-commander'
2
+
3
+ class EcoRake < RakeCommander
4
+ VERSION = '0.1.1'.freeze
5
+ end
data/lib/eco-rake.rb ADDED
@@ -0,0 +1,16 @@
1
+ require 'rake-commander'
2
+ require 'dotenv'
3
+ require 'dotenv/load'
4
+
5
+ class EcoRake < RakeCommander
6
+ autoload_namespace_ignore "EcoRake::Tasks"
7
+
8
+ require_relative 'eco-rake/version'
9
+ require_relative 'eco-rake/base'
10
+ include EcoRake::Base
11
+ end
12
+
13
+ RakeCommander::Patcher.debug = ENV['COMMANDER_DEBUG'] == "true"
14
+
15
+ require_relative 'eco-rake/lib'
16
+ require_relative 'eco-rake/custom'
metadata ADDED
@@ -0,0 +1,271 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: eco-rake
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Oscar Segura Samper
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2023-06-06 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 2.4.9
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '3'
23
+ type: :development
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: 2.4.9
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '3'
33
+ - !ruby/object:Gem::Dependency
34
+ name: rake
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: 13.0.6
40
+ - - "<"
41
+ - !ruby/object:Gem::Version
42
+ version: '14'
43
+ type: :development
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: 13.0.6
50
+ - - "<"
51
+ - !ruby/object:Gem::Version
52
+ version: '14'
53
+ - !ruby/object:Gem::Dependency
54
+ name: redcarpet
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: 3.6.0
60
+ - - "<"
61
+ - !ruby/object:Gem::Version
62
+ version: '4'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: 3.6.0
70
+ - - "<"
71
+ - !ruby/object:Gem::Version
72
+ version: '4'
73
+ - !ruby/object:Gem::Dependency
74
+ name: rspec
75
+ requirement: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: 3.10.0
80
+ - - "<"
81
+ - !ruby/object:Gem::Version
82
+ version: '4'
83
+ type: :development
84
+ prerelease: false
85
+ version_requirements: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: 3.10.0
90
+ - - "<"
91
+ - !ruby/object:Gem::Version
92
+ version: '4'
93
+ - !ruby/object:Gem::Dependency
94
+ name: yard
95
+ requirement: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ version: 0.9.34
100
+ - - "<"
101
+ - !ruby/object:Gem::Version
102
+ version: '1'
103
+ type: :development
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: 0.9.34
110
+ - - "<"
111
+ - !ruby/object:Gem::Version
112
+ version: '1'
113
+ - !ruby/object:Gem::Dependency
114
+ name: aws-sdk-ses
115
+ requirement: !ruby/object:Gem::Requirement
116
+ requirements:
117
+ - - ">="
118
+ - !ruby/object:Gem::Version
119
+ version: 1.36.0
120
+ - - "<"
121
+ - !ruby/object:Gem::Version
122
+ version: '2'
123
+ type: :runtime
124
+ prerelease: false
125
+ version_requirements: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - ">="
128
+ - !ruby/object:Gem::Version
129
+ version: 1.36.0
130
+ - - "<"
131
+ - !ruby/object:Gem::Version
132
+ version: '2'
133
+ - !ruby/object:Gem::Dependency
134
+ name: dotenv
135
+ requirement: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - ">="
138
+ - !ruby/object:Gem::Version
139
+ version: 2.7.6
140
+ - - "<"
141
+ - !ruby/object:Gem::Version
142
+ version: '3'
143
+ type: :runtime
144
+ prerelease: false
145
+ version_requirements: !ruby/object:Gem::Requirement
146
+ requirements:
147
+ - - ">="
148
+ - !ruby/object:Gem::Version
149
+ version: 2.7.6
150
+ - - "<"
151
+ - !ruby/object:Gem::Version
152
+ version: '3'
153
+ - !ruby/object:Gem::Dependency
154
+ name: rake-commander
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: 0.3.6
160
+ - - "<"
161
+ - !ruby/object:Gem::Version
162
+ version: '0.4'
163
+ type: :runtime
164
+ prerelease: false
165
+ version_requirements: !ruby/object:Gem::Requirement
166
+ requirements:
167
+ - - ">="
168
+ - !ruby/object:Gem::Version
169
+ version: 0.3.6
170
+ - - "<"
171
+ - !ruby/object:Gem::Version
172
+ version: '0.4'
173
+ description:
174
+ email:
175
+ - oscar@ecoportal.co.nz
176
+ executables: []
177
+ extensions: []
178
+ extra_rdoc_files: []
179
+ files:
180
+ - ".gitignore"
181
+ - ".gitlab-ci.yml"
182
+ - ".rspec"
183
+ - ".rubocop.yml"
184
+ - ".yardopts"
185
+ - CHANGELOG.md
186
+ - Gemfile
187
+ - LICENSE
188
+ - README.md
189
+ - Rakefile
190
+ - eco-rake.gemspec
191
+ - lib/eco-rake.rb
192
+ - lib/eco-rake/base.rb
193
+ - lib/eco-rake/base/method_helpers.rb
194
+ - lib/eco-rake/base/symbol_resolver.rb
195
+ - lib/eco-rake/custom.rb
196
+ - lib/eco-rake/default.rb
197
+ - lib/eco-rake/default/const.rb
198
+ - lib/eco-rake/lib.rb
199
+ - lib/eco-rake/lib/base_task.rb
200
+ - lib/eco-rake/lib/concern.rb
201
+ - lib/eco-rake/lib/concern/base.rb
202
+ - lib/eco-rake/lib/concern/enviro.rb
203
+ - lib/eco-rake/lib/concern/local_folder.rb
204
+ - lib/eco-rake/lib/concern/person_schema.rb
205
+ - lib/eco-rake/lib/export.rb
206
+ - lib/eco-rake/lib/export/payload.rb
207
+ - lib/eco-rake/lib/files.rb
208
+ - lib/eco-rake/lib/files/decrypt.rb
209
+ - lib/eco-rake/lib/files/purge.rb
210
+ - lib/eco-rake/lib/files/sftp.rb
211
+ - lib/eco-rake/lib/notify.rb
212
+ - lib/eco-rake/lib/notify/mailer.rb
213
+ - lib/eco-rake/lib/options.rb
214
+ - lib/eco-rake/lib/people.rb
215
+ - lib/eco-rake/lib/people/base_task.rb
216
+ - lib/eco-rake/lib/people/sync_launch.rb
217
+ - lib/eco-rake/lib/people/sync_options.rb
218
+ - lib/eco-rake/lib/people/sync_process.rb
219
+ - lib/eco-rake/lib/people/sync_rely.rb
220
+ - lib/eco-rake/lib/task.rb
221
+ - lib/eco-rake/lib/task/runner_launch.rb
222
+ - lib/eco-rake/lib/task/runner_options.rb
223
+ - lib/eco-rake/lib/task/runner_rely.rb
224
+ - lib/eco-rake/option.rb
225
+ - lib/eco-rake/option/default_lookup.rb
226
+ - lib/eco-rake/option/mirror.rb
227
+ - lib/eco-rake/option/parented.rb
228
+ - lib/eco-rake/options.rb
229
+ - lib/eco-rake/options/default_lookup.rb
230
+ - lib/eco-rake/options/forwarding.rb
231
+ - lib/eco-rake/options/forwarding/proxy.rb
232
+ - lib/eco-rake/options/forwarding/rule.rb
233
+ - lib/eco-rake/options/library.rb
234
+ - lib/eco-rake/options/parental.rb
235
+ - lib/eco-rake/options/set.rb
236
+ - lib/eco-rake/rake_task.rb
237
+ - lib/eco-rake/shell.rb
238
+ - lib/eco-rake/shell/command.rb
239
+ - lib/eco-rake/shell/eco_helpers.rb
240
+ - lib/eco-rake/shell/files.rb
241
+ - lib/eco-rake/shell/gpg.rb
242
+ - lib/eco-rake/tasks.rb
243
+ - lib/eco-rake/utils.rb
244
+ - lib/eco-rake/utils/mailer.rb
245
+ - lib/eco-rake/utils/mailing.rb
246
+ - lib/eco-rake/utils/timing.rb
247
+ - lib/eco-rake/version.rb
248
+ homepage: https://www.ecoportal.com
249
+ licenses:
250
+ - MIT
251
+ metadata: {}
252
+ post_install_message:
253
+ rdoc_options: []
254
+ require_paths:
255
+ - lib
256
+ required_ruby_version: !ruby/object:Gem::Requirement
257
+ requirements:
258
+ - - ">="
259
+ - !ruby/object:Gem::Version
260
+ version: 2.7.2
261
+ required_rubygems_version: !ruby/object:Gem::Requirement
262
+ requirements:
263
+ - - ">="
264
+ - !ruby/object:Gem::Version
265
+ version: '0'
266
+ requirements: []
267
+ rubygems_version: 3.4.12
268
+ signing_key:
269
+ specification_version: 4
270
+ summary: A set of helpers to build re-usable `rake` integration helpers.
271
+ test_files: []