eco-helpers 1.0.11 → 1.0.12
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/eco-helpers.gemspec +2 -0
- data/lib/eco/api/common/people/default_parsers.rb +2 -0
- data/lib/eco/api/common/people/default_parsers/csv_parser.rb +2 -1
- data/lib/eco/api/common/people/entries.rb +5 -0
- data/lib/eco/api/common/people/entry_factory.rb +4 -0
- data/lib/eco/api/common/session.rb +1 -0
- data/lib/eco/api/common/session/base_session.rb +12 -0
- data/lib/eco/api/common/session/environment.rb +5 -1
- data/lib/eco/api/common/session/sftp.rb +108 -0
- data/lib/eco/api/session.rb +1 -1
- data/lib/eco/api/session/config.rb +9 -0
- data/lib/eco/api/session/config/sftp.rb +59 -0
- data/lib/eco/api/usecases/base_case.rb +2 -1
- data/lib/eco/api/usecases/base_io.rb +2 -1
- data/lib/eco/api/usecases/use_case.rb +1 -1
- data/lib/eco/api/usecases/use_case_chain.rb +3 -2
- data/lib/eco/api/usecases/use_case_io.rb +14 -2
- data/lib/eco/cli/config/default/people.rb +2 -0
- data/lib/eco/version.rb +1 -1
- metadata +23 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b7816ce8532e8e6f2214b58e5fa94ecb65ec9bd86cc4efa0691001fec78cfb7e
|
4
|
+
data.tar.gz: '0539d3a69ced5ad94f0245e2ccc768818534344b46c6d455af358c5e84ababfd'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 965d612b80244b63cfae420eaa97a28ec2935d1299dfaec5d9220a4de732442904ea6995e0536f559ab49bb6a52af0d71fee7d1a69209c0a1d92c6317f24c811
|
7
|
+
data.tar.gz: a0ea67d65af9e01a36395da5585b1226ea4bcf70a0b71f7ab0718fd4ae9e31cb2d4cf50f95dec1c5267fd338d1816ed2985a1a1bf2f55265d69339f895531aee
|
data/eco-helpers.gemspec
CHANGED
@@ -32,6 +32,8 @@ Gem::Specification.new do |s|
|
|
32
32
|
s.add_dependency 'aws-sdk-s3', '~> 1.30', '>= 1.30.1'
|
33
33
|
s.add_dependency 'aws-sdk-ses', '~> 1.14', '>= 1.14.0'
|
34
34
|
s.add_dependency 'dotenv', '~> 2.6', '>= 2.6.0'
|
35
|
+
s.add_dependency 'net-sftp', '~> 2.1', '>= 2.1.2'
|
35
36
|
s.add_dependency 'faker', '~> 2', '>= 2.1'
|
36
37
|
s.add_dependency 'distribution', '~> 0.7', '>= 0.7.3'
|
38
|
+
|
37
39
|
end
|
@@ -11,7 +11,8 @@ module Eco
|
|
11
11
|
arr_hash = []
|
12
12
|
CSV.parse(data, headers: true).each do |row|
|
13
13
|
row_hash = row.headers.uniq.each_with_object({}) do |attr, hash|
|
14
|
-
|
14
|
+
value = row[attr]
|
15
|
+
hash[attr] = value.to_s.empty?? nil : value
|
15
16
|
end
|
16
17
|
arr_hash.push(row_hash)
|
17
18
|
end
|
@@ -27,6 +27,8 @@ module Eco
|
|
27
27
|
attr('external_id', *args).first
|
28
28
|
end
|
29
29
|
|
30
|
+
# Helper to dump the entries into a CSV
|
31
|
+
# @param filename [String] the destination file
|
30
32
|
def export(filename)
|
31
33
|
CSV.open(filename, "w") do |csv|
|
32
34
|
entry = self.first
|
@@ -38,6 +40,7 @@ module Eco
|
|
38
40
|
end
|
39
41
|
end
|
40
42
|
|
43
|
+
# Search function to find an `entry` based on one of different options
|
41
44
|
def entry(id: nil, external_id: nil, email: nil)
|
42
45
|
init_caches
|
43
46
|
pers = nil
|
@@ -48,6 +51,8 @@ module Eco
|
|
48
51
|
pers
|
49
52
|
end
|
50
53
|
|
54
|
+
# Search function to find an `entry` based on one of different options
|
55
|
+
# see Eco::API::Common::People::Entries#entry
|
51
56
|
def find(object)
|
52
57
|
id = object.respond_to?("id")? object.send("id") : nil
|
53
58
|
external_id = object.respond_to?("external_id")? object.send("external_id") : nil
|
@@ -21,13 +21,17 @@ module Eco
|
|
21
21
|
|
22
22
|
@source_person_parser = person_parser
|
23
23
|
|
24
|
+
# load default parsers
|
24
25
|
@person_parser = Eco::API::Common::People::DefaultParsers.new(schema: @schema)
|
26
|
+
# merge the custom parsers
|
25
27
|
@person_parser = @person_parser.merge(@source_person_parser)
|
26
28
|
@person_parser_patch_version = @source_person_parser.patch_version
|
27
29
|
|
28
30
|
@attr_map = attr_map
|
29
31
|
end
|
30
32
|
|
33
|
+
# provides with a Eco::API::Common::People::PersonParser object (collection of attribute parsers)
|
34
|
+
# @note if the custom person parser has changed, it updates the copy of this EntryFactory instance
|
31
35
|
def person_parser
|
32
36
|
if @person_parser_patch_version < @source_person_parser.patch_version
|
33
37
|
@person_parser.merge(@source_person_parser)
|
@@ -9,7 +9,7 @@ module Eco
|
|
9
9
|
attr_reader :config, :session
|
10
10
|
attr_reader :api #, :host, :version
|
11
11
|
attr_reader :file_manager, :logger
|
12
|
-
attr_reader :mailer, :s3uploader
|
12
|
+
attr_reader :mailer, :sftp, :s3uploader
|
13
13
|
|
14
14
|
alias_method :fm, :file_manager
|
15
15
|
|
@@ -31,6 +31,10 @@ module Eco
|
|
31
31
|
@mailer ||= Eco::API::Common::Session::Mailer.new(enviro: self)
|
32
32
|
end
|
33
33
|
|
34
|
+
def sftp
|
35
|
+
@sftp ||= Eco::API::Common::Session::SFTP.new(enviro: self)
|
36
|
+
end
|
37
|
+
|
34
38
|
def s3upoader
|
35
39
|
@s3uploader ||= Eco::API::Common::Session::S3Uploader.new(enviro: self)
|
36
40
|
end
|
@@ -0,0 +1,108 @@
|
|
1
|
+
require "net/sftp"
|
2
|
+
require 'dotenv/load'
|
3
|
+
|
4
|
+
module Eco
|
5
|
+
module API
|
6
|
+
module Common
|
7
|
+
module Session
|
8
|
+
class SFTP
|
9
|
+
|
10
|
+
def initialize (enviro:)
|
11
|
+
raise "Required Environment object (enviro:). Given: #{enviro}" if enviro && !enviro.is_a?(Eco::API::Common::Session::Environment)
|
12
|
+
@enviro = enviro
|
13
|
+
end
|
14
|
+
|
15
|
+
# @see Net::SFTP::Session
|
16
|
+
def sftp_session
|
17
|
+
begin
|
18
|
+
@sftp_session ||= Net::SFTP.start(
|
19
|
+
fetch_host,
|
20
|
+
fetch_user,
|
21
|
+
keys: fetch_key_files,
|
22
|
+
keys_only: true,
|
23
|
+
non_interactive: true
|
24
|
+
)
|
25
|
+
rescue Exception => e
|
26
|
+
logger.error("Could not open SFTP session. Possible misconfiguration: #{e}")
|
27
|
+
exit(1)
|
28
|
+
end
|
29
|
+
@sftp_session
|
30
|
+
end
|
31
|
+
|
32
|
+
# @see Net::SFTP::Operations::Dir#entries
|
33
|
+
def entries(path)
|
34
|
+
sftp_session.dir.entries(path).sort_by {|rf| rf.name}
|
35
|
+
end
|
36
|
+
|
37
|
+
# **Files** of the remote directory.
|
38
|
+
# @see Net::SFTP::Operations::Dir#entries
|
39
|
+
# @param path [String] remote directory `path`
|
40
|
+
# @param pattern [Regexp] if given, filters by using this pattern
|
41
|
+
# @return [Array<Net::SFTP::Protocol::V01::Name>]
|
42
|
+
def files(path, pattern: nil)
|
43
|
+
entries = entries(path).select {|remote_file| remote_file.file?}
|
44
|
+
return entries unless pattern
|
45
|
+
entries.select {|remote_file| remote_file.name =~ pattern}
|
46
|
+
end
|
47
|
+
|
48
|
+
# **Folders** of the remote directory.
|
49
|
+
# @see Net::SFTP::Operations::Dir#entries
|
50
|
+
# @param path [String] remote directory `path`
|
51
|
+
# @param pattern [Regexp] if given, filters by using this pattern
|
52
|
+
# @return [Array<Net::SFTP::Protocol::V01::Name>]
|
53
|
+
def folders(path, pattern: nil)
|
54
|
+
entries = entries(path).select {|remote_file| remote_file.directory?}
|
55
|
+
return entries unless pattern
|
56
|
+
entries.select {|remote_file| remote_file.name =~ pattern}
|
57
|
+
end
|
58
|
+
|
59
|
+
# @see Net::SFTP::Session#rename
|
60
|
+
def move(fullname_source, fullname_dest, flags=nil, &callback)
|
61
|
+
sftp_session.rename!(fullname_source, fullname_dest, flags, &callback)
|
62
|
+
end
|
63
|
+
|
64
|
+
# Downloads the files specified to a local folder
|
65
|
+
# @see Net::SFTP::Operations::Download
|
66
|
+
# @param files [String, Array<String>] full path to remote file(s) to be downloaded
|
67
|
+
# @param local_folder [String] local destination folder (`"."` if not specified)
|
68
|
+
def download(files, local_folder: nil)
|
69
|
+
[files].flatten.compact.map do |fullname|
|
70
|
+
dest_fullname = File.join(local_folder || ".", File.basename(fullname))
|
71
|
+
sftp_session.download(fullname, dest_fullname)
|
72
|
+
end.each do |dw|
|
73
|
+
# run SSH event loop while dw.active?
|
74
|
+
dw.wait
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
private
|
79
|
+
|
80
|
+
def logger
|
81
|
+
@enviro&.logger || ::Logger.new(IO::NULL)
|
82
|
+
end
|
83
|
+
|
84
|
+
def config
|
85
|
+
@enviro.config || {}
|
86
|
+
end
|
87
|
+
|
88
|
+
def fetch_host
|
89
|
+
config.sftp.host || ENV['SFTP_HOST']
|
90
|
+
end
|
91
|
+
|
92
|
+
def fetch_user
|
93
|
+
config.sftp.user || ENV['SFTP_USERNAME']
|
94
|
+
end
|
95
|
+
|
96
|
+
def fetch_key_files
|
97
|
+
[config.sftp.key_file || ENV['SFTP_KEY_FILE']]
|
98
|
+
end
|
99
|
+
|
100
|
+
def fetch_base_path
|
101
|
+
config.sftp.base_path || ENV['SFTP_BASE_PATH']
|
102
|
+
end
|
103
|
+
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
data/lib/eco/api/session.rb
CHANGED
@@ -28,6 +28,10 @@ module Eco
|
|
28
28
|
self["apis"] ||= Eco::API::Session::Config::Apis.new(config: self)
|
29
29
|
end
|
30
30
|
|
31
|
+
def sftp
|
32
|
+
self["sftp"] ||= Eco::API::Session::Config::SFTP.new(config: self)
|
33
|
+
end
|
34
|
+
|
31
35
|
def logger
|
32
36
|
self["logger"] ||= Eco::API::Session::Config::Logger.new(config: self)
|
33
37
|
end
|
@@ -108,6 +112,10 @@ module Eco
|
|
108
112
|
self
|
109
113
|
end
|
110
114
|
|
115
|
+
def active_enviro
|
116
|
+
apis.active_root_name
|
117
|
+
end
|
118
|
+
|
111
119
|
def api(logger = ::Logger.new(IO::NULL))
|
112
120
|
apis.api(logger)
|
113
121
|
end
|
@@ -294,6 +302,7 @@ require_relative 'config/api'
|
|
294
302
|
require_relative 'config/apis'
|
295
303
|
require_relative 'config/logger'
|
296
304
|
require_relative 'config/mailer'
|
305
|
+
require_relative 'config/sftp'
|
297
306
|
require_relative 'config/s3_storage'
|
298
307
|
require_relative 'config/files'
|
299
308
|
require_relative 'config/people'
|
@@ -0,0 +1,59 @@
|
|
1
|
+
module Eco
|
2
|
+
module API
|
3
|
+
class Session
|
4
|
+
class Config
|
5
|
+
class SFTP < BaseConfig
|
6
|
+
|
7
|
+
def host=(value)
|
8
|
+
self["host"] = value
|
9
|
+
end
|
10
|
+
|
11
|
+
def host
|
12
|
+
self["host"]
|
13
|
+
end
|
14
|
+
|
15
|
+
def user=(value)
|
16
|
+
self["user"] = value
|
17
|
+
end
|
18
|
+
|
19
|
+
def user
|
20
|
+
self["user"]
|
21
|
+
end
|
22
|
+
|
23
|
+
def key_file=(key)
|
24
|
+
self["key_file"] = key
|
25
|
+
end
|
26
|
+
|
27
|
+
def key_file
|
28
|
+
self["key_file"]
|
29
|
+
end
|
30
|
+
|
31
|
+
def base_path=(path)
|
32
|
+
self["base_path"] = path
|
33
|
+
end
|
34
|
+
|
35
|
+
def base_path
|
36
|
+
self["base_path"]
|
37
|
+
end
|
38
|
+
|
39
|
+
def enviro_subpaths=(hash)
|
40
|
+
self["enviro_subpaths"] = hash
|
41
|
+
end
|
42
|
+
|
43
|
+
def enviro_subpaths
|
44
|
+
self["enviro_subpaths"]
|
45
|
+
end
|
46
|
+
|
47
|
+
def enviro_subpath
|
48
|
+
enviro_subpaths[config.active_enviro]
|
49
|
+
end
|
50
|
+
|
51
|
+
def remote_folder
|
52
|
+
base_path + "/" + enviro_subpath
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
module Eco
|
2
2
|
module API
|
3
3
|
class UseCases
|
4
|
+
# Core class of UseCases. It basically defines and manages allowed `types`
|
4
5
|
class BaseCase
|
5
6
|
|
6
7
|
class InvalidType < Exception
|
@@ -11,7 +12,7 @@ module Eco
|
|
11
12
|
end
|
12
13
|
end
|
13
14
|
|
14
|
-
@types = [:import, :filter, :transform, :sync, :export]
|
15
|
+
@types = [:import, :filter, :transform, :sync, :export, :other]
|
15
16
|
|
16
17
|
class << self
|
17
18
|
attr_reader :types
|
@@ -1,12 +1,13 @@
|
|
1
1
|
module Eco
|
2
2
|
module API
|
3
3
|
class UseCases
|
4
|
+
# Class that enables to chain multiple UseCase
|
4
5
|
class UseCaseChain < UseCase
|
6
|
+
@types = UseCase.types
|
7
|
+
|
5
8
|
MAX_CHAINS = 70
|
6
9
|
@@num_chains = 0
|
7
10
|
|
8
|
-
@types = [:import, :filter, :transform, :sync, :export]
|
9
|
-
|
10
11
|
def initialize(name = nil, type: nil, root:, usecase: nil, &block)
|
11
12
|
if usecase
|
12
13
|
raise "Expected Eco::API::UseCases::UseCase. Given #{usecase.class}" if !usecase.is_a?(Eco::API::UseCases::UseCase)
|
@@ -1,28 +1,38 @@
|
|
1
1
|
module Eco
|
2
2
|
module API
|
3
3
|
class UseCases
|
4
|
+
|
5
|
+
# InputOutput class for usecases.
|
6
|
+
# @note Same as Eco::API::UseCases::BaseIO but:
|
7
|
+
# - includes `type` of usecase
|
8
|
+
# - provides a helper to `chain` InputOutput between usecases
|
9
|
+
# @attr_reader usecase [Eco::API::UseCases::UseCase] the usecase this InputOuput is linked to
|
4
10
|
class UseCaseIO < BaseIO
|
5
|
-
@types =
|
11
|
+
@types = BaseIO.types
|
6
12
|
|
7
13
|
attr_reader :usecase
|
8
14
|
|
15
|
+
# @see Eco::API::UseCases::BaseIO#initialize
|
9
16
|
def initialize(usecase:, **kargs)
|
10
17
|
self.usecase = usecase
|
11
18
|
super(**kargs)
|
12
19
|
end
|
13
20
|
|
14
|
-
# @see Eco::API::UseCases::BaseIO
|
21
|
+
# @see Eco::API::UseCases::BaseIO#new
|
15
22
|
# @param usecase [Eco::API::UseCases::UseCase] target usecase
|
16
23
|
# @return [Eco::API::UseCases::UseCaseIO]
|
17
24
|
def new(usecase:, **kargs)
|
18
25
|
super(**kargs.merge(usecase: usecase))
|
19
26
|
end
|
20
27
|
|
28
|
+
|
29
|
+
# @param value [Eco::API::UseCases::UseCase] the usecase this InputOuput should be linked to
|
21
30
|
def usecase=(value)
|
22
31
|
raise "It should be a Eco::API::UseCases::UseCase. Given: #{value}" if !value.is_a?(Eco::API::UseCases::UseCase)
|
23
32
|
@usecase = value
|
24
33
|
end
|
25
34
|
|
35
|
+
# @return [Symbol] the `type` of the UseCase this InputOuput is linked to
|
26
36
|
def type
|
27
37
|
@usecase.type
|
28
38
|
end
|
@@ -31,6 +41,8 @@ module Eco
|
|
31
41
|
raise "Can't modify type depends on the usecase linked to this IO object"
|
32
42
|
end
|
33
43
|
|
44
|
+
# @see Eco::API::UseCases::BaseIO#params
|
45
|
+
# Same as its superclass but adding `usecase` parameter
|
34
46
|
def params(keyed: false)
|
35
47
|
super(keyed: keyed).tap do |res|
|
36
48
|
if keyed
|
@@ -6,6 +6,8 @@ ASSETS.cli.config do |cnf|
|
|
6
6
|
get: {from: :remote, type: :full}
|
7
7
|
})
|
8
8
|
people = session.do.file_people
|
9
|
+
elsif SCR.get_arg("-no-people")
|
10
|
+
people = Eco::API::Organization::People.new([])
|
9
11
|
elsif SCR.get_arg("-people-from-backup")
|
10
12
|
file = SCR.get_arg("-people-from-backup", with_param: true)
|
11
13
|
options.deep_merge!(people: {
|
data/lib/eco/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: eco-helpers
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.12
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Oscar Segura
|
@@ -178,6 +178,26 @@ dependencies:
|
|
178
178
|
- - "~>"
|
179
179
|
- !ruby/object:Gem::Version
|
180
180
|
version: '2.6'
|
181
|
+
- !ruby/object:Gem::Dependency
|
182
|
+
name: net-sftp
|
183
|
+
requirement: !ruby/object:Gem::Requirement
|
184
|
+
requirements:
|
185
|
+
- - "~>"
|
186
|
+
- !ruby/object:Gem::Version
|
187
|
+
version: '2.1'
|
188
|
+
- - ">="
|
189
|
+
- !ruby/object:Gem::Version
|
190
|
+
version: 2.1.2
|
191
|
+
type: :runtime
|
192
|
+
prerelease: false
|
193
|
+
version_requirements: !ruby/object:Gem::Requirement
|
194
|
+
requirements:
|
195
|
+
- - "~>"
|
196
|
+
- !ruby/object:Gem::Version
|
197
|
+
version: '2.1'
|
198
|
+
- - ">="
|
199
|
+
- !ruby/object:Gem::Version
|
200
|
+
version: 2.1.2
|
181
201
|
- !ruby/object:Gem::Dependency
|
182
202
|
name: faker
|
183
203
|
requirement: !ruby/object:Gem::Requirement
|
@@ -261,6 +281,7 @@ files:
|
|
261
281
|
- lib/eco/api/common/session/logger.rb
|
262
282
|
- lib/eco/api/common/session/mailer.rb
|
263
283
|
- lib/eco/api/common/session/s3_uploader.rb
|
284
|
+
- lib/eco/api/common/session/sftp.rb
|
264
285
|
- lib/eco/api/common/version_patches.rb
|
265
286
|
- lib/eco/api/common/version_patches/ecoportal_api.rb
|
266
287
|
- lib/eco/api/common/version_patches/ecoportal_api/account_preferences.rb
|
@@ -302,6 +323,7 @@ files:
|
|
302
323
|
- lib/eco/api/session/config/people.rb
|
303
324
|
- lib/eco/api/session/config/post_launch.rb
|
304
325
|
- lib/eco/api/session/config/s3_storage.rb
|
326
|
+
- lib/eco/api/session/config/sftp.rb
|
305
327
|
- lib/eco/api/session/config/workflow.rb
|
306
328
|
- lib/eco/api/session/task.rb
|
307
329
|
- lib/eco/api/usecases.rb
|