eco-helpers 2.0.15 → 2.0.21

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 (97) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +109 -3
  3. data/eco-helpers.gemspec +11 -5
  4. data/lib/eco-helpers.rb +2 -0
  5. data/lib/eco/api/common/base_loader.rb +14 -0
  6. data/lib/eco/api/common/loaders/parser.rb +1 -0
  7. data/lib/eco/api/common/people/default_parsers/date_parser.rb +11 -1
  8. data/lib/eco/api/common/people/default_parsers/login_providers_parser.rb +1 -1
  9. data/lib/eco/api/common/people/default_parsers/policy_groups_parser.rb +11 -11
  10. data/lib/eco/api/common/people/entries.rb +1 -0
  11. data/lib/eco/api/common/people/entry_factory.rb +74 -23
  12. data/lib/eco/api/common/people/person_entry.rb +5 -2
  13. data/lib/eco/api/common/people/supervisor_helpers.rb +27 -0
  14. data/lib/eco/api/common/session.rb +1 -0
  15. data/lib/eco/api/common/session/base_session.rb +2 -0
  16. data/lib/eco/api/common/session/file_manager.rb +2 -2
  17. data/lib/eco/api/common/session/helpers.rb +30 -0
  18. data/lib/eco/api/common/session/helpers/prompt_user.rb +34 -0
  19. data/lib/eco/api/common/session/mailer.rb +0 -1
  20. data/lib/eco/api/common/session/s3_uploader.rb +0 -1
  21. data/lib/eco/api/common/session/sftp.rb +0 -1
  22. data/lib/eco/api/common/version_patches/ecoportal_api/external_person.rb +1 -1
  23. data/lib/eco/api/common/version_patches/ecoportal_api/internal_person.rb +7 -4
  24. data/lib/eco/api/common/version_patches/exception.rb +11 -4
  25. data/lib/eco/api/microcases.rb +3 -1
  26. data/lib/eco/api/microcases/append_usergroups.rb +0 -1
  27. data/lib/eco/api/microcases/people_cache.rb +2 -2
  28. data/lib/eco/api/microcases/people_load.rb +2 -2
  29. data/lib/eco/api/microcases/people_refresh.rb +2 -2
  30. data/lib/eco/api/microcases/people_search.rb +6 -6
  31. data/lib/eco/api/microcases/preserve_default_tag.rb +23 -0
  32. data/lib/eco/api/microcases/preserve_filter_tags.rb +28 -0
  33. data/lib/eco/api/microcases/preserve_policy_groups.rb +30 -0
  34. data/lib/eco/api/microcases/set_account.rb +0 -1
  35. data/lib/eco/api/microcases/with_each.rb +67 -6
  36. data/lib/eco/api/microcases/with_each_present.rb +4 -2
  37. data/lib/eco/api/microcases/with_each_starter.rb +4 -2
  38. data/lib/eco/api/organization.rb +1 -0
  39. data/lib/eco/api/organization/people.rb +98 -22
  40. data/lib/eco/api/organization/people_similarity.rb +272 -0
  41. data/lib/eco/api/organization/person_schemas.rb +5 -1
  42. data/lib/eco/api/organization/policy_groups.rb +5 -1
  43. data/lib/eco/api/organization/presets_factory.rb +40 -80
  44. data/lib/eco/api/organization/presets_integrity.json +6 -0
  45. data/lib/eco/api/organization/presets_values.json +5 -4
  46. data/lib/eco/api/organization/tag_tree.rb +33 -0
  47. data/lib/eco/api/policies/default_policies/99_user_access_policy.rb +0 -30
  48. data/lib/eco/api/session.rb +10 -24
  49. data/lib/eco/api/session/batch.rb +25 -7
  50. data/lib/eco/api/session/config.rb +16 -15
  51. data/lib/eco/api/session/config/api.rb +4 -0
  52. data/lib/eco/api/session/config/apis.rb +80 -0
  53. data/lib/eco/api/session/config/files.rb +7 -0
  54. data/lib/eco/api/session/config/people.rb +3 -19
  55. data/lib/eco/api/usecases/default_cases.rb +4 -1
  56. data/lib/eco/api/usecases/default_cases/abstract_policygroup_abilities_case.rb +161 -0
  57. data/lib/eco/api/usecases/default_cases/analyse_people_case.rb +223 -0
  58. data/lib/eco/api/usecases/default_cases/clean_unknown_tags_case.rb +37 -0
  59. data/lib/eco/api/usecases/default_cases/codes_to_tags_case.rb +2 -3
  60. data/lib/eco/api/usecases/default_cases/reset_landing_page_case.rb +11 -1
  61. data/lib/eco/api/usecases/default_cases/restore_db_case.rb +1 -2
  62. data/lib/eco/api/usecases/default_cases/supers_cyclic_identify_case.rb +72 -0
  63. data/lib/eco/api/usecases/default_cases/supers_hierarchy_case.rb +1 -1
  64. data/lib/eco/api/usecases/default_cases/to_csv_case.rb +132 -29
  65. data/lib/eco/api/usecases/default_cases/to_csv_detailed_case.rb +61 -36
  66. data/lib/eco/api/usecases/ooze_samples/ooze_update_case.rb +3 -2
  67. data/lib/eco/cli.rb +0 -10
  68. data/lib/eco/cli/config/default/options.rb +48 -17
  69. data/lib/eco/cli/config/default/people.rb +18 -24
  70. data/lib/eco/cli/config/default/people_filters.rb +3 -3
  71. data/lib/eco/cli/config/default/usecases.rb +105 -28
  72. data/lib/eco/cli/config/default/workflow.rb +21 -12
  73. data/lib/eco/cli/config/help.rb +1 -0
  74. data/lib/eco/cli/config/options_set.rb +106 -13
  75. data/lib/eco/cli/config/use_cases.rb +33 -33
  76. data/lib/eco/cli/scripting/args_helpers.rb +30 -3
  77. data/lib/eco/csv.rb +4 -2
  78. data/lib/eco/csv/table.rb +121 -21
  79. data/lib/eco/data.rb +1 -0
  80. data/lib/eco/data/crypto/encryption.rb +3 -3
  81. data/lib/eco/data/files/directory.rb +28 -20
  82. data/lib/eco/data/files/helpers.rb +6 -4
  83. data/lib/eco/data/fuzzy_match.rb +201 -0
  84. data/lib/eco/data/fuzzy_match/array_helpers.rb +75 -0
  85. data/lib/eco/data/fuzzy_match/chars_position_score.rb +38 -0
  86. data/lib/eco/data/fuzzy_match/ngrams_score.rb +82 -0
  87. data/lib/eco/data/fuzzy_match/pairing.rb +95 -0
  88. data/lib/eco/data/fuzzy_match/result.rb +87 -0
  89. data/lib/eco/data/fuzzy_match/results.rb +77 -0
  90. data/lib/eco/data/fuzzy_match/score.rb +49 -0
  91. data/lib/eco/data/fuzzy_match/stop_words.rb +35 -0
  92. data/lib/eco/data/fuzzy_match/string_helpers.rb +82 -0
  93. data/lib/eco/version.rb +1 -1
  94. metadata +168 -11
  95. data/lib/eco/api/microcases/refresh_abilities.rb +0 -19
  96. data/lib/eco/api/organization/presets_reference.json +0 -59
  97. data/lib/eco/api/usecases/default_cases/refresh_abilities_case.rb +0 -30
@@ -0,0 +1,95 @@
1
+ module Eco
2
+ module Data
3
+ module FuzzyMatch
4
+ module Pairing
5
+
6
+ # Pair words using some algorithm.
7
+ # It does the following:
8
+ # 1. It splits both strings into words.
9
+ # 2. Pairs all words by using `block` to score the best match.
10
+ # 3. Gives `0` score to those words of `str2` that lost their pair (a word of `str1` cannot be paired twice).
11
+ # 4. Merges the `Score` of all the paired words of `str2` against their `str1` word pair.
12
+ # @yield [needle, item] offers a comparison algorithm between two strings.
13
+ # @yieldparam needle [String] the string of reference.
14
+ # @yieldparam item [String] one of the haystack items.
15
+ # @yieldreturn [Eco::Data::FuzzyMatch::Score] the `Score` object with the results of comparing `str1` and `str2`
16
+ # @param str1 [String] the string of reference.
17
+ # @param str2 [String] one of the haystack items.
18
+ # @normalized [Boolean] to avoid double ups in normalizing.
19
+ # @return [Hash] where `keys` are the **words** of `str1` and their `values` a pair array of `pair` and `Score`
20
+ def paired_words(str1, str2, normalized: false)
21
+ str1, str2 = normalize_string([str1, str2]) unless normalized
22
+ return {nil => [nil, Score.new(0, 0)]} if !str2 || !str1
23
+ return {str1 => [nil, Score.new(0, 0)]} if str1.length < 2 || str1.length < 2
24
+
25
+ needles = get_words(str1, normalized: true)
26
+ haystack = get_words(str2, normalized: true)
27
+
28
+ ranking = {}
29
+ faceted = needles.each_with_object({}) do |needle, faceted|
30
+ faceted[needle] = haystack.map do |item|
31
+ {
32
+ pair: item,
33
+ score: yield(needle, item)
34
+ }.tap do |result|
35
+ ranking[item] ||= []
36
+ if result[:score].ratio > 0.05
37
+ ranking[item] << ({needle: needle, score: result[:score]})
38
+ end
39
+ end
40
+ end.sort_by do |result|
41
+ result[:score].ratio
42
+ end.reverse
43
+ end
44
+
45
+ paired = {}
46
+ #scores = {}
47
+ ranking.each do |item, results|
48
+ sorted = results.reject do |result|
49
+ paired.key?(result[:needle])
50
+ end.sort_by do |result|
51
+ result[:score].ratio
52
+ end.reverse
53
+ if result = sorted.shift
54
+ unless result[:score].is_a?(Eco::Data::FuzzyMatch::Score)
55
+ raise "Parining ('#{str1}' vs '#{str2}') -> Something got sour with needle '#{result[:needle]}' and item #{item}"
56
+ end
57
+ paired[result[:needle]] = {
58
+ pair: item,
59
+ score: result[:score]
60
+ }
61
+ end
62
+ end
63
+
64
+ pending_items = haystack - paired.values
65
+ faceted.reject do |needle, results|
66
+ paired.key?(needle)
67
+ end.each do |needle, results|
68
+ results.select! do |result|
69
+ pending_items.include?(result[:pair]) && result[:score].ratio > 0.05
70
+ end
71
+ if result = results.shift
72
+ unless result[:score].is_a?(Eco::Data::FuzzyMatch::Score)
73
+ raise "Parining ('#{str1}' vs '#{str2}') -> Something got sour with needle '#{needle}' and item #{result[:pair]}"
74
+ end
75
+ paired[needle] = result
76
+ pending_items.delete(result[:pair])
77
+ end
78
+ end
79
+
80
+ pending_needles = needles - paired.keys
81
+ pending_needles.each do |needle|
82
+ paired[needle] = {
83
+ pair: nil,
84
+ score: Score.new(0, needle.length)
85
+ }
86
+ end
87
+ paired.each_with_object({}) do |(needle, data), out|
88
+ out[needle] = data.values_at(:pair, :score)
89
+ end
90
+ end
91
+
92
+ end
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,87 @@
1
+ module Eco
2
+ module Data
3
+ module FuzzyMatch
4
+ class Result < Struct.new(:match, :value, :needle_value, :dice, :levenshtein, :jaro_winkler, :ngrams, :words_ngrams, :chars_position)
5
+ ALL_METHODS = [:dice, :levenshtein, :jaro_winkler, :ngrams, :words_ngrams, :chars_position]
6
+
7
+ attr_accessor :pivot
8
+
9
+ def dice; super&.round(3); end
10
+ def levenshtein; super&.round(3); end
11
+ def jaro_winkler; super&.round(3); end
12
+ def ngrams; super&.round(3); end
13
+ def words_ngrams; super&.round(3); end
14
+ def chars_position; super&.round(3); end
15
+
16
+ #Shortcuts
17
+ def lev; levenshtein; end
18
+ def jaro; jaro_winkler; end
19
+ def wngrams; words_ngrams; end
20
+ def pos; chars_position; end
21
+
22
+ def average
23
+ values = [dice, levenshtein, jaro_winkler, ngrams, words_ngrams, chars_position]
24
+ (values.inject(0.0, :+) / values.length).round(3)
25
+ end
26
+
27
+ # TODO: print in the order of `order`
28
+ def print
29
+ msg = "(Dice: #{dice}) (Lev Dst: #{levenshtein}) "
30
+ msg << "(Jaro: #{jaro_winkler}) "
31
+ msg << "(Ngram: #{ngrams}) (WNgrams: #{words_ngrams}) "
32
+ msg << "(C Pos: #{chars_position}) "
33
+ msg << "(Avg: #{average}) "
34
+ msg << "'#{value}'"
35
+ end
36
+
37
+ def all_threshold?(methods = order, threshold = 0.15)
38
+ return true unless threshold
39
+ [methods].flatten.compact.all? {|method| threshold?(method, threshold)}
40
+ end
41
+
42
+ def any_threshold?(methods = order, threshold = 0.15)
43
+ return true unless threshold
44
+ [methods].flatten.compact.any? {|method| threshold?(method, threshold)}
45
+ end
46
+
47
+ def threshold?(method = :dice, threshold = 0.15)
48
+ raise "Uknown method '#{method}'" unless self.respond_to?(method)
49
+ self.send(method) >= threshold
50
+ end
51
+
52
+ def order=(values)
53
+ @order = [values].flatten.compact.tap do |o|
54
+ o << [:words_ngrams, :dice] if o.empty?
55
+ end
56
+ end
57
+
58
+ def order
59
+ @order ||= [:words_ngrams, :dice]
60
+ end
61
+
62
+ def <=>(result)
63
+ compare(result)
64
+ end
65
+
66
+ def values_at(*keys)
67
+ keys.map do |key|
68
+ self.send(key) if self.respond_to?(key)
69
+ end
70
+ end
71
+
72
+ private
73
+
74
+ def compare(other, order: self.order)
75
+ return 0 unless method = order.first
76
+ raise "Uknown method '#{method}'" unless self.respond_to?(method) && other.respond_to?(method)
77
+ return -1 if self.send(method) > other.send(method)
78
+ return 1 if self.send(method) < other.send(method)
79
+ compare(other, order: order[1..-1])
80
+ end
81
+
82
+
83
+ end
84
+
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,77 @@
1
+ module Eco
2
+ module Data
3
+ module FuzzyMatch
4
+ class Results < Struct.new(:needle, :value, :raw_results)
5
+ include Enumerable
6
+
7
+ attr_accessor :threshold
8
+
9
+ def empty?
10
+ count < 1
11
+ end
12
+
13
+ def each(&block)
14
+ return to_enum(:each) unless block
15
+ raw_results.each(&block)
16
+ end
17
+
18
+ # Merges the results of both Results object
19
+ def merge(res)
20
+ unless self.needle == res.needle
21
+ raise "To merge 2 Results, needle should be the same ('#{value}'). Given '#{res.value}'"
22
+ end
23
+ self.class.new(needle, value, raw_results.concat(res.raw_results))
24
+ end
25
+
26
+ def results_with_false_positives
27
+ relevant_results(order: :jaro_winkler, threshold: 0.5)
28
+ end
29
+
30
+ def relevant_results(**options)
31
+ options = {order: order, threshold: threshold || 0.5}.merge(options)
32
+ raw_results.select do |result|
33
+ result.all_threshold?(options[:order], options[:threshold])
34
+ end.yield_self do |filtered|
35
+ self.class.new(needle, value, filtered).tap do |results|
36
+ results.order = options[:order]
37
+ end
38
+ end
39
+ end
40
+
41
+ # @param values[Array<Symbol>] the algorithms' results it should be ordered by
42
+ # * Possible values: `:dice`, `:levenshtein`, `:jaro_winkler`, `:ngrams`, `:words_ngrams`, `:chars_position`, `:average`
43
+ def order=(values)
44
+ @order = [values].flatten.compact.tap do |o|
45
+ raw_results.each {|r| r.order = o}
46
+ end
47
+ end
48
+
49
+ def order
50
+ @order ||= [:words_ngrams, :dice]
51
+ end
52
+
53
+ def results
54
+ raw_results.sort
55
+ end
56
+
57
+ def print
58
+ msg = results.map do |result|
59
+ result.print
60
+ end.join("\n ")
61
+
62
+ puts "'#{value}':\n " + msg
63
+ end
64
+
65
+ private
66
+
67
+ def item_string(item, attr = self.method)
68
+ return item if !item || item.is_a?(String) || !attr
69
+ attr = attr.to_sym
70
+ return item.send(attr) if item.respond_to?(attr)
71
+ end
72
+
73
+ end
74
+
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,49 @@
1
+ module Eco
2
+ module Data
3
+ module FuzzyMatch
4
+ class Score < Struct.new(:score, :total)
5
+
6
+ def ratio(decimals = 6)
7
+ tot = self.total; sc = self.score
8
+ tot = tot && tot > 0 ? tot : 1
9
+ sc = sc && sc > 0 ? sc : 0
10
+ (sc.to_f / tot).round(decimals)
11
+ end
12
+
13
+ def percent(decimals = 3)
14
+ (100 * ratio).round(decimals)
15
+ end
16
+
17
+ def increase(value = 1)
18
+ self.score += value
19
+ raise "Score #{self.score} (increase: #{value}) can't be greater than total #{self.total}" if self.score > self.total
20
+ self.score
21
+ end
22
+
23
+ def increase_total(value)
24
+ self.total += value
25
+ end
26
+
27
+ def values_at(*keys)
28
+ keys.map do |key|
29
+ self.send(key) if self.respond_to?(key)
30
+ end
31
+ end
32
+
33
+ # Merges 2 Score instance objects
34
+ def merge(scr)
35
+ Score.new(*values_at(:score, :total)).merge!(scr)
36
+ end
37
+
38
+ def merge!(scr)
39
+ raise "Expecting Score object. Given: #{scr.class}" unless scr.is_a?(Score)
40
+ increase_total(scr.total)
41
+ increase(scr.score)
42
+ self
43
+ end
44
+
45
+ end
46
+
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,35 @@
1
+ module Eco
2
+ module Data
3
+ module FuzzyMatch
4
+ module StopWords
5
+ PREPOSITIONS = [
6
+ "aboard", "about", "above", "across", "after", "against", "along", "amid", "among", "around", "as", "at",
7
+ "before", "behind", "below", "beneath", "beside", "between", "beyond", "but", "by",
8
+ "concerning", "considering", "despite", "down", "during", "except", "following", "for", "from",
9
+ "in", "inside", "into", "like", "minus", "near", "next",
10
+ "of", "off", "on", "onto", "opposite", "out", "outside", "over", "past", "per", "plus",
11
+ "regarding", "round", "save", "since", "than", "through", "till", "to", "toward",
12
+ "under", "underneath", "unlike", "until", "up", "upon", "versus", "via",
13
+ "with", "within", "without"
14
+ ]
15
+ PRONOUNS = [
16
+ "all", "another", "any", "anybody", "anyone", "anything", "as", "aught",
17
+ "both", "each", "each other", "either", "enough", "everybody", "everyone", "everything",
18
+ "few", "he", "her", "hers", "herself", "him", "himself", "his", "I", "idem", "it", "its", "itself",
19
+ "many", "me", "mine", "most", "my", "myself", "naught", "neither", "no one", "nobody", "none", "nothing", "nought",
20
+ "one", "one another", "other", "others", "ought", "our", "ours", "ourself", "ourselves",
21
+ "several", "she", "some", "somebody", "someone", "something", "somewhat", "such", "suchlike",
22
+ "that", "thee", "their", "theirs", "theirself", "theirselves", "them", "themself", "themselves", "there",
23
+ "these", "they", "thine", "this", "those", "thou", "thy", "thyself", "us",
24
+ "we", "what", "whatever", "whatnot", "whatsoever", "whence", "where", "whereby", "wherefrom",
25
+ "wherein", "whereinto", "whereof", "whereon", "wherever", "wheresoever", "whereto", "whereunto",
26
+ "wherewith", "wherewithal", "whether", "which", "whichever", "whichsoever", "who", "whoever", "whom",
27
+ "whomever", "whomso", "whomsoever", "whose", "whosever", "whosesoever", "whoso", "whosoever",
28
+ "ye", "yon", "yonder", "you", "your", "yours", "yourself", "yourselves"
29
+ ]
30
+ ARTICLES = ["a", "an", "the"]
31
+
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,82 @@
1
+ module Eco
2
+ module Data
3
+ module FuzzyMatch
4
+ module StringHelpers
5
+ # Downcases and trims
6
+ def normalize_string(value)
7
+ case value
8
+ when Array
9
+ value.map {|val| normalize_string(val)}
10
+ when Symbol
11
+ normalize_string(value.to_sym)
12
+ when String
13
+ value.downcase.strip
14
+ end
15
+ end
16
+
17
+ def get_words(str, normalized: false)
18
+ return [] unless str
19
+ str = normalize_string(str) unless normalized
20
+ str.scan(/[a-zA-Z'-]+/).compact
21
+ end
22
+
23
+ # Keeps the start order of the `words` and consecutive `words` together/consecutive.
24
+ # @param str [String] the input string with the words.
25
+ # @param range [Integer, Range] determine the lenght of the generated values.
26
+ # @return [Array<String>] combinations of `range` length of `words`.
27
+ def string_ngrams(str, range=2..3, normalized: false)
28
+ ngrams(get_words(str, normalized: normalized), range)
29
+ end
30
+
31
+ # Keeps the start order of the `words` of the input `Array` `words`.
32
+ # It does **not** keep consecutive `words` together (it can jump/skip items).
33
+ # @param str [String] the input string with the words.
34
+ # @param range [Integer, Range] determine the lenght of the generated values.
35
+ # @return [Array<String>] combinations of `range` length of `words`
36
+ def string_combinations(str, range=2..3, normalized: false)
37
+ combinations(get_words(str, normalized: normalized), range)
38
+ .map {|comb| comb.join(' ')}
39
+ end
40
+
41
+ # It includes `combinations` that break the initial order of the `Array`.
42
+ # It does **not** keep consecutive `words` together (it can jump/skip items).
43
+ # @param str [String] the input string with the words.
44
+ # @param range [Integer, Range] determine the lenght of the generated values.
45
+ # @return [Array<String>] permutations of `range` length of `words`
46
+ def string_permutations(str, range=2..3, normalized: false)
47
+ permutations(get_words(str, normalized: normalized), range)
48
+ .map {|comb| comb.join(' ')}
49
+ end
50
+
51
+ # Keeps the start order of the `charts` and consecutive `charts` together/consecutive.
52
+ # @param str [String] the input `word` string.
53
+ # @param range [Integer, Range] determine the lenght of the generated values.
54
+ # @return [Array<String>] combinations of `range` length of `words`.
55
+ def word_ngrams(str, range=2..3, normalized: false)
56
+ str = normalize_string(str) unless normalized
57
+ ngrams(str.to_s.chars, range)
58
+ .map {|comb| no_blanks(comb)}
59
+ end
60
+
61
+ def no_blanks(str)
62
+ return nil unless str && str.is_a?(String)
63
+ str.tr(' ', '')
64
+ end
65
+
66
+ # Deletes the words of `str1` and `str2` that match
67
+ # @return [Array<String>] pair of words.
68
+ def remove_matching_words(str1, str2, normalized: false)
69
+ unless normalized
70
+ str1 = normalize_string(str1)
71
+ str2 = normalize_string(str2)
72
+ end
73
+ return [str1, str2] if !str1 || !str2 || str1.empty? || str2.empty?
74
+ ws1 = get_words(str1)
75
+ ws2 = get_words(str2)
76
+ [(ws1 - ws2).join(" "), (ws2 - ws1).join(" ")]
77
+ end
78
+
79
+ end
80
+ end
81
+ end
82
+ end
data/lib/eco/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Eco
2
- VERSION = "2.0.15"
2
+ VERSION = "2.0.21"
3
3
  end
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: 2.0.15
4
+ version: 2.0.21
5
5
  platform: ruby
6
6
  authors:
7
7
  - Oscar Segura
@@ -16,7 +16,7 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 2.2.11
19
+ version: 2.2.17
20
20
  - - "<"
21
21
  - !ruby/object:Gem::Version
22
22
  version: '2.3'
@@ -26,7 +26,7 @@ dependencies:
26
26
  requirements:
27
27
  - - ">="
28
28
  - !ruby/object:Gem::Version
29
- version: 2.2.11
29
+ version: 2.2.17
30
30
  - - "<"
31
31
  - !ruby/object:Gem::Version
32
32
  version: '2.3'
@@ -116,7 +116,7 @@ dependencies:
116
116
  requirements:
117
117
  - - ">="
118
118
  - !ruby/object:Gem::Version
119
- version: 0.8.2
119
+ version: 0.8.3
120
120
  - - "<"
121
121
  - !ruby/object:Gem::Version
122
122
  version: '0.9'
@@ -126,7 +126,7 @@ dependencies:
126
126
  requirements:
127
127
  - - ">="
128
128
  - !ruby/object:Gem::Version
129
- version: 0.8.2
129
+ version: 0.8.3
130
130
  - - "<"
131
131
  - !ruby/object:Gem::Version
132
132
  version: '0.9'
@@ -136,7 +136,7 @@ dependencies:
136
136
  requirements:
137
137
  - - ">="
138
138
  - !ruby/object:Gem::Version
139
- version: 0.8.6
139
+ version: 0.8.7
140
140
  - - "<"
141
141
  - !ruby/object:Gem::Version
142
142
  version: '0.9'
@@ -146,7 +146,7 @@ dependencies:
146
146
  requirements:
147
147
  - - ">="
148
148
  - !ruby/object:Gem::Version
149
- version: 0.8.6
149
+ version: 0.8.7
150
150
  - - "<"
151
151
  - !ruby/object:Gem::Version
152
152
  version: '0.9'
@@ -230,6 +230,146 @@ dependencies:
230
230
  - - "<"
231
231
  - !ruby/object:Gem::Version
232
232
  version: '3.1'
233
+ - !ruby/object:Gem::Dependency
234
+ name: hashdiff
235
+ requirement: !ruby/object:Gem::Requirement
236
+ requirements:
237
+ - - ">="
238
+ - !ruby/object:Gem::Version
239
+ version: 1.0.1
240
+ - - "<"
241
+ - !ruby/object:Gem::Version
242
+ version: '1.1'
243
+ type: :runtime
244
+ prerelease: false
245
+ version_requirements: !ruby/object:Gem::Requirement
246
+ requirements:
247
+ - - ">="
248
+ - !ruby/object:Gem::Version
249
+ version: 1.0.1
250
+ - - "<"
251
+ - !ruby/object:Gem::Version
252
+ version: '1.1'
253
+ - !ruby/object:Gem::Dependency
254
+ name: fuzzy_match
255
+ requirement: !ruby/object:Gem::Requirement
256
+ requirements:
257
+ - - ">="
258
+ - !ruby/object:Gem::Version
259
+ version: 2.1.0
260
+ - - "<"
261
+ - !ruby/object:Gem::Version
262
+ version: '2.2'
263
+ type: :runtime
264
+ prerelease: false
265
+ version_requirements: !ruby/object:Gem::Requirement
266
+ requirements:
267
+ - - ">="
268
+ - !ruby/object:Gem::Version
269
+ version: 2.1.0
270
+ - - "<"
271
+ - !ruby/object:Gem::Version
272
+ version: '2.2'
273
+ - !ruby/object:Gem::Dependency
274
+ name: amatch
275
+ requirement: !ruby/object:Gem::Requirement
276
+ requirements:
277
+ - - ">="
278
+ - !ruby/object:Gem::Version
279
+ version: 0.4.0
280
+ - - "<"
281
+ - !ruby/object:Gem::Version
282
+ version: '0.5'
283
+ type: :runtime
284
+ prerelease: false
285
+ version_requirements: !ruby/object:Gem::Requirement
286
+ requirements:
287
+ - - ">="
288
+ - !ruby/object:Gem::Version
289
+ version: 0.4.0
290
+ - - "<"
291
+ - !ruby/object:Gem::Version
292
+ version: '0.5'
293
+ - !ruby/object:Gem::Dependency
294
+ name: jaro_winkler
295
+ requirement: !ruby/object:Gem::Requirement
296
+ requirements:
297
+ - - ">="
298
+ - !ruby/object:Gem::Version
299
+ version: 1.5.4
300
+ - - "<"
301
+ - !ruby/object:Gem::Version
302
+ version: '1.6'
303
+ type: :runtime
304
+ prerelease: false
305
+ version_requirements: !ruby/object:Gem::Requirement
306
+ requirements:
307
+ - - ">="
308
+ - !ruby/object:Gem::Version
309
+ version: 1.5.4
310
+ - - "<"
311
+ - !ruby/object:Gem::Version
312
+ version: '1.6'
313
+ - !ruby/object:Gem::Dependency
314
+ name: roo
315
+ requirement: !ruby/object:Gem::Requirement
316
+ requirements:
317
+ - - ">="
318
+ - !ruby/object:Gem::Version
319
+ version: 2.8.3
320
+ - - "<"
321
+ - !ruby/object:Gem::Version
322
+ version: '2.9'
323
+ type: :runtime
324
+ prerelease: false
325
+ version_requirements: !ruby/object:Gem::Requirement
326
+ requirements:
327
+ - - ">="
328
+ - !ruby/object:Gem::Version
329
+ version: 2.8.3
330
+ - - "<"
331
+ - !ruby/object:Gem::Version
332
+ version: '2.9'
333
+ - !ruby/object:Gem::Dependency
334
+ name: roo-xls
335
+ requirement: !ruby/object:Gem::Requirement
336
+ requirements:
337
+ - - ">="
338
+ - !ruby/object:Gem::Version
339
+ version: 1.2.0
340
+ - - "<"
341
+ - !ruby/object:Gem::Version
342
+ version: '1.3'
343
+ type: :runtime
344
+ prerelease: false
345
+ version_requirements: !ruby/object:Gem::Requirement
346
+ requirements:
347
+ - - ">="
348
+ - !ruby/object:Gem::Version
349
+ version: 1.2.0
350
+ - - "<"
351
+ - !ruby/object:Gem::Version
352
+ version: '1.3'
353
+ - !ruby/object:Gem::Dependency
354
+ name: creek
355
+ requirement: !ruby/object:Gem::Requirement
356
+ requirements:
357
+ - - ">="
358
+ - !ruby/object:Gem::Version
359
+ version: 2.5.2
360
+ - - "<"
361
+ - !ruby/object:Gem::Version
362
+ version: '2.6'
363
+ type: :runtime
364
+ prerelease: false
365
+ version_requirements: !ruby/object:Gem::Requirement
366
+ requirements:
367
+ - - ">="
368
+ - !ruby/object:Gem::Version
369
+ version: 2.5.2
370
+ - - "<"
371
+ - !ruby/object:Gem::Version
372
+ version: '2.6'
233
373
  description:
234
374
  email:
235
375
  - oscar@ecoportal.co.nz
@@ -285,6 +425,8 @@ files:
285
425
  - lib/eco/api/common/session/base_session.rb
286
426
  - lib/eco/api/common/session/environment.rb
287
427
  - lib/eco/api/common/session/file_manager.rb
428
+ - lib/eco/api/common/session/helpers.rb
429
+ - lib/eco/api/common/session/helpers/prompt_user.rb
288
430
  - lib/eco/api/common/session/logger.rb
289
431
  - lib/eco/api/common/session/logger/cache.rb
290
432
  - lib/eco/api/common/session/logger/log.rb
@@ -318,7 +460,9 @@ files:
318
460
  - lib/eco/api/microcases/people_load.rb
319
461
  - lib/eco/api/microcases/people_refresh.rb
320
462
  - lib/eco/api/microcases/people_search.rb
321
- - lib/eco/api/microcases/refresh_abilities.rb
463
+ - lib/eco/api/microcases/preserve_default_tag.rb
464
+ - lib/eco/api/microcases/preserve_filter_tags.rb
465
+ - lib/eco/api/microcases/preserve_policy_groups.rb
322
466
  - lib/eco/api/microcases/refresh_default_tag.rb
323
467
  - lib/eco/api/microcases/s3upload_targets.rb
324
468
  - lib/eco/api/microcases/set_account.rb
@@ -335,13 +479,13 @@ files:
335
479
  - lib/eco/api/organization.rb
336
480
  - lib/eco/api/organization/login_providers.rb
337
481
  - lib/eco/api/organization/people.rb
482
+ - lib/eco/api/organization/people_similarity.rb
338
483
  - lib/eco/api/organization/person_schemas.rb
339
484
  - lib/eco/api/organization/policy_groups.rb
340
485
  - lib/eco/api/organization/preferences.rb
341
486
  - lib/eco/api/organization/preferences_reference.json
342
487
  - lib/eco/api/organization/presets_factory.rb
343
488
  - lib/eco/api/organization/presets_integrity.json
344
- - lib/eco/api/organization/presets_reference.json
345
489
  - lib/eco/api/organization/presets_values.json
346
490
  - lib/eco/api/organization/tag_tree.rb
347
491
  - lib/eco/api/policies.rb
@@ -375,8 +519,11 @@ files:
375
519
  - lib/eco/api/usecases/base_case.rb
376
520
  - lib/eco/api/usecases/base_io.rb
377
521
  - lib/eco/api/usecases/default_cases.rb
522
+ - lib/eco/api/usecases/default_cases/abstract_policygroup_abilities_case.rb
523
+ - lib/eco/api/usecases/default_cases/analyse_people_case.rb
378
524
  - lib/eco/api/usecases/default_cases/append_usergroups_case.rb
379
525
  - lib/eco/api/usecases/default_cases/change_email_case.rb
526
+ - lib/eco/api/usecases/default_cases/clean_unknown_tags_case.rb
380
527
  - lib/eco/api/usecases/default_cases/codes_to_tags_case.rb
381
528
  - lib/eco/api/usecases/default_cases/create_case.rb
382
529
  - lib/eco/api/usecases/default_cases/create_details_case.rb
@@ -389,7 +536,6 @@ files:
389
536
  - lib/eco/api/usecases/default_cases/new_id_case.rb
390
537
  - lib/eco/api/usecases/default_cases/new_id_case0.rb
391
538
  - lib/eco/api/usecases/default_cases/org_data_convert_case.rb
392
- - lib/eco/api/usecases/default_cases/refresh_abilities_case.rb
393
539
  - lib/eco/api/usecases/default_cases/refresh_case.rb
394
540
  - lib/eco/api/usecases/default_cases/reinvite_sync_case.rb
395
541
  - lib/eco/api/usecases/default_cases/reinvite_trans_case.rb
@@ -399,6 +545,7 @@ files:
399
545
  - lib/eco/api/usecases/default_cases/restore_db_case.rb
400
546
  - lib/eco/api/usecases/default_cases/set_default_tag_case.rb
401
547
  - lib/eco/api/usecases/default_cases/set_supervisor_case.rb
548
+ - lib/eco/api/usecases/default_cases/supers_cyclic_identify_case.rb
402
549
  - lib/eco/api/usecases/default_cases/supers_hierarchy_case.rb
403
550
  - lib/eco/api/usecases/default_cases/switch_supervisor_case.rb
404
551
  - lib/eco/api/usecases/default_cases/to_csv_case.rb
@@ -445,6 +592,16 @@ files:
445
592
  - lib/eco/data/files/directory.rb
446
593
  - lib/eco/data/files/file_pattern.rb
447
594
  - lib/eco/data/files/helpers.rb
595
+ - lib/eco/data/fuzzy_match.rb
596
+ - lib/eco/data/fuzzy_match/array_helpers.rb
597
+ - lib/eco/data/fuzzy_match/chars_position_score.rb
598
+ - lib/eco/data/fuzzy_match/ngrams_score.rb
599
+ - lib/eco/data/fuzzy_match/pairing.rb
600
+ - lib/eco/data/fuzzy_match/result.rb
601
+ - lib/eco/data/fuzzy_match/results.rb
602
+ - lib/eco/data/fuzzy_match/score.rb
603
+ - lib/eco/data/fuzzy_match/stop_words.rb
604
+ - lib/eco/data/fuzzy_match/string_helpers.rb
448
605
  - lib/eco/data/mapper.rb
449
606
  - lib/eco/language.rb
450
607
  - lib/eco/language/curry.rb
@@ -471,7 +628,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
471
628
  requirements:
472
629
  - - ">="
473
630
  - !ruby/object:Gem::Version
474
- version: 2.4.4
631
+ version: 2.5.0
475
632
  required_rubygems_version: !ruby/object:Gem::Requirement
476
633
  requirements:
477
634
  - - ">="