eco-rake 0.1.1

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