eco-helpers 0.6.0

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 (123) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +1 -0
  3. data/.rspec +3 -0
  4. data/README.md +20 -0
  5. data/eco-helpers.gemspec +34 -0
  6. data/lib/eco-helpers.rb +15 -0
  7. data/lib/eco/api.rb +13 -0
  8. data/lib/eco/api/common.rb +10 -0
  9. data/lib/eco/api/common/people.rb +17 -0
  10. data/lib/eco/api/common/people/base_parser.rb +16 -0
  11. data/lib/eco/api/common/people/default_parsers.rb +40 -0
  12. data/lib/eco/api/common/people/default_parsers/boolean_parser.rb +28 -0
  13. data/lib/eco/api/common/people/default_parsers/date_parser.rb +33 -0
  14. data/lib/eco/api/common/people/default_parsers/multi_parser.rb +33 -0
  15. data/lib/eco/api/common/people/default_parsers/numeric_parser.rb +23 -0
  16. data/lib/eco/api/common/people/default_parsers/select_parser.rb +29 -0
  17. data/lib/eco/api/common/people/entries.rb +120 -0
  18. data/lib/eco/api/common/people/person_entry.rb +380 -0
  19. data/lib/eco/api/common/people/person_factory.rb +114 -0
  20. data/lib/eco/api/common/people/person_modifier.rb +62 -0
  21. data/lib/eco/api/common/people/person_parser.rb +140 -0
  22. data/lib/eco/api/common/people/types.rb +47 -0
  23. data/lib/eco/api/common/session.rb +15 -0
  24. data/lib/eco/api/common/session/base_session.rb +46 -0
  25. data/lib/eco/api/common/session/environment.rb +47 -0
  26. data/lib/eco/api/common/session/file_manager.rb +90 -0
  27. data/lib/eco/api/common/session/logger.rb +105 -0
  28. data/lib/eco/api/common/session/mailer.rb +92 -0
  29. data/lib/eco/api/common/session/s3_uploader.rb +110 -0
  30. data/lib/eco/api/common/version_patches.rb +11 -0
  31. data/lib/eco/api/common/version_patches/external_person.rb +11 -0
  32. data/lib/eco/api/eco_faker.rb +59 -0
  33. data/lib/eco/api/organization.rb +13 -0
  34. data/lib/eco/api/organization/account.rb +23 -0
  35. data/lib/eco/api/organization/people.rb +118 -0
  36. data/lib/eco/api/organization/policy_groups.rb +51 -0
  37. data/lib/eco/api/organization/preferences.rb +28 -0
  38. data/lib/eco/api/organization/preferences_reference.json +23 -0
  39. data/lib/eco/api/organization/presets.rb +138 -0
  40. data/lib/eco/api/organization/presets_backup.rb +220 -0
  41. data/lib/eco/api/organization/presets_values.json +10 -0
  42. data/lib/eco/api/organization/tag_tree.rb +134 -0
  43. data/lib/eco/api/organization_old.rb +73 -0
  44. data/lib/eco/api/session.rb +180 -0
  45. data/lib/eco/api/session/batch.rb +132 -0
  46. data/lib/eco/api/session/batch_job.rb +152 -0
  47. data/lib/eco/api/session/batch_jobs.rb +131 -0
  48. data/lib/eco/api/session/batch_status.rb +138 -0
  49. data/lib/eco/api/session/task.rb +92 -0
  50. data/lib/eco/api/session_config.rb +179 -0
  51. data/lib/eco/api/session_config/api.rb +47 -0
  52. data/lib/eco/api/session_config/apis.rb +78 -0
  53. data/lib/eco/api/session_config/files.rb +30 -0
  54. data/lib/eco/api/session_config/logger.rb +54 -0
  55. data/lib/eco/api/session_config/mailer.rb +65 -0
  56. data/lib/eco/api/session_config/people.rb +89 -0
  57. data/lib/eco/api/session_config/s3_bucket.rb +62 -0
  58. data/lib/eco/api/session_config/use_cases.rb +30 -0
  59. data/lib/eco/api/usecases.rb +12 -0
  60. data/lib/eco/api/usecases/base_case.rb +14 -0
  61. data/lib/eco/api/usecases/case_data.rb +13 -0
  62. data/lib/eco/api/usecases/default_cases.rb +53 -0
  63. data/lib/eco/api/usecases/default_cases/change_email_case.rb +47 -0
  64. data/lib/eco/api/usecases/default_cases/create_details_case.rb +29 -0
  65. data/lib/eco/api/usecases/default_cases/create_details_with_supervisor_case.rb +49 -0
  66. data/lib/eco/api/usecases/default_cases/delete_case.rb +20 -0
  67. data/lib/eco/api/usecases/default_cases/email_as_id_case.rb +24 -0
  68. data/lib/eco/api/usecases/default_cases/hris_case.rb +67 -0
  69. data/lib/eco/api/usecases/default_cases/new_email_case.rb +26 -0
  70. data/lib/eco/api/usecases/default_cases/new_id_case.rb +26 -0
  71. data/lib/eco/api/usecases/default_cases/refresh_presets.rb +25 -0
  72. data/lib/eco/api/usecases/default_cases/reinvite_case.rb +22 -0
  73. data/lib/eco/api/usecases/default_cases/remove_account_case.rb +36 -0
  74. data/lib/eco/api/usecases/default_cases/reset_landing_page_case.rb +24 -0
  75. data/lib/eco/api/usecases/default_cases/set_default_tag_case.rb +44 -0
  76. data/lib/eco/api/usecases/default_cases/set_supervisor_case.rb +39 -0
  77. data/lib/eco/api/usecases/default_cases/to_csv_case.rb +36 -0
  78. data/lib/eco/api/usecases/default_cases/update_details_case.rb +30 -0
  79. data/lib/eco/api/usecases/default_cases/upsert_account_case.rb +35 -0
  80. data/lib/eco/api/usecases/use_case.rb +177 -0
  81. data/lib/eco/api/usecases/use_group.rb +104 -0
  82. data/lib/eco/cli.rb +9 -0
  83. data/lib/eco/cli/input.rb +109 -0
  84. data/lib/eco/cli/input_multi.rb +137 -0
  85. data/lib/eco/cli/root.rb +8 -0
  86. data/lib/eco/cli/session.rb +9 -0
  87. data/lib/eco/cli/session/batch.rb +9 -0
  88. data/lib/eco/common.rb +7 -0
  89. data/lib/eco/common/base_cli.rb +116 -0
  90. data/lib/eco/common/language.rb +9 -0
  91. data/lib/eco/data.rb +9 -0
  92. data/lib/eco/data/crypto.rb +7 -0
  93. data/lib/eco/data/crypto/encryption.rb +318 -0
  94. data/lib/eco/data/files.rb +10 -0
  95. data/lib/eco/data/files/directory.rb +93 -0
  96. data/lib/eco/data/files/file_pattern.rb +32 -0
  97. data/lib/eco/data/files/helpers.rb +90 -0
  98. data/lib/eco/data/mapper.rb +54 -0
  99. data/lib/eco/data/random.rb +10 -0
  100. data/lib/eco/data/random/distribution.rb +133 -0
  101. data/lib/eco/data/random/fake.rb +320 -0
  102. data/lib/eco/data/random/values.rb +80 -0
  103. data/lib/eco/language.rb +12 -0
  104. data/lib/eco/language/curry.rb +28 -0
  105. data/lib/eco/language/hash_transform.rb +68 -0
  106. data/lib/eco/language/hash_transform_modifier.rb +114 -0
  107. data/lib/eco/language/match.rb +30 -0
  108. data/lib/eco/language/match_modifier.rb +190 -0
  109. data/lib/eco/language/models.rb +11 -0
  110. data/lib/eco/language/models/attribute_parser.rb +38 -0
  111. data/lib/eco/language/models/collection.rb +181 -0
  112. data/lib/eco/language/models/modifier.rb +68 -0
  113. data/lib/eco/language/models/wrap.rb +114 -0
  114. data/lib/eco/language/values_at.rb +159 -0
  115. data/lib/eco/lexic/dictionary.rb +33 -0
  116. data/lib/eco/lexic/dictionary/dictionary.txt +355484 -0
  117. data/lib/eco/lexic/dictionary/tags.json +38 -0
  118. data/lib/eco/scripting.rb +30 -0
  119. data/lib/eco/scripting/README.md +11 -0
  120. data/lib/eco/scripting/arguments.rb +40 -0
  121. data/lib/eco/tester.rb +97 -0
  122. data/lib/eco/version.rb +3 -0
  123. metadata +325 -0
@@ -0,0 +1,80 @@
1
+ require 'json'
2
+
3
+ module Eco
4
+ module Data
5
+ module Random
6
+ class Values
7
+
8
+ attr_accessor :multiple, :unique
9
+ attr_reader :options, :weights, :options_weight, :quantity
10
+ attr_reader :generator, :generator_config
11
+
12
+ def initialize(init = {})
13
+ @multiple = init.fetch('multiple', false)
14
+ @unique = init.fetch('unique', true)
15
+ self.quantity = init.fetch('quantity', nil)
16
+ @options_weight = init.fetch('options_weight', nil)
17
+ @options = init.fetch('options', @options_weight&.keys)
18
+ @weights = @options_weight&.values
19
+
20
+ @generator_config = init.fetch('generator_config', { "decimals" => 0 })
21
+ if @weights
22
+ @generator_config['weights'] = @weights unless @generator_config.key?('weights')
23
+ @generator_config['balance'] = 'forged' unless @generator_config.key?('balance')
24
+ else
25
+ case
26
+ when @options&.instance_of?(Array)
27
+ @generator_config['weights'] = @weights unless @generator_config.key?('weights')
28
+ end
29
+ end
30
+ @generator = Distribution.new(@generator_config)
31
+ @random = ::Random.new
32
+ end
33
+
34
+ def quantity=(num_or_range) # attr_writer
35
+ val = num_or_range
36
+ case
37
+ when val.is_a?(Numeric)
38
+ num = val.round
39
+ rng = (num..num)
40
+ when val.instance_of?(Range)
41
+ rng = val
42
+ else
43
+ rng = (0..1)
44
+ end
45
+ @quantity = rng
46
+ end
47
+
48
+ def generate
49
+ if @multiple
50
+ quantity = @random.rand(@quantity)
51
+ value = []
52
+ quantity.times {
53
+ val = @unique? generate_option(exclude: value): generate_option
54
+ value.push(val)
55
+ }
56
+ value = value.uniq if @unique
57
+ else
58
+ value = generate_option
59
+ end
60
+ return value
61
+ end
62
+
63
+ def generate_option(exclude: [])
64
+ case
65
+ when @options&.instance_of?(Array)
66
+ val = @options[@generator.generate]
67
+ else
68
+ puts "something bad with @options"
69
+ end
70
+ #exclude_aux = Marshal.load(Marshal::dump(exclude))
71
+ exclude_aux = JSON.parse(exclude.to_json)
72
+ exclude_aux.pop
73
+ val = generate_option(exclude: exclude_aux) if exclude.include?(val)
74
+ return val
75
+ end
76
+
77
+ end
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,12 @@
1
+ module Eco
2
+ module Language
3
+ end
4
+ end
5
+
6
+ require_relative 'language/models'
7
+ require_relative 'language/curry'
8
+ require_relative 'language/hash_transform_modifier'
9
+ require_relative 'language/hash_transform'
10
+ require_relative 'language/values_at'
11
+ require_relative 'language/match_modifier'
12
+ require_relative 'language/match'
@@ -0,0 +1,28 @@
1
+ module Eco
2
+ module Language
3
+
4
+ def required_parameters(method)
5
+ method.parameters.select { |type, _| type == :req || :keyreq}
6
+ end
7
+
8
+ def required_parameters?(method)
9
+ required_parameters(method).length > 0
10
+ end
11
+
12
+ def curry(method)
13
+ -> (*args, **kargs) {
14
+ required = method.parameters.select { |type, _| type == :req }
15
+ krequired = method.parameters.select { |type, _| type == :keyreq }
16
+ all_args = (required.length <= args.length)
17
+ all_keys = krequired.all? { |_, name| kargs.has_key?(name) }
18
+ if all_args && all_keys
19
+ final_args = (args + kargs.map {|k,v| {k => v} })
20
+ method.call(*final_args)
21
+ else
22
+ -> (*args_, **kargs_) { curry(method)[*args, *args_, **kargs, **kargs_] }
23
+ end
24
+ }
25
+ end
26
+
27
+ end
28
+ end
@@ -0,0 +1,68 @@
1
+ module Eco
2
+ module Language
3
+
4
+ def sym_str_transform(value, mode = HashTransformModifier.new)
5
+ v = value
6
+ if value && (value.is_a?(Symbol) || value.is_a?(String))
7
+ if mode.symbolize? && !value.is_a?(Symbol)
8
+ colon = mode.colon? && !value.include?(" ") && (
9
+ starts = value.start_with?(":") ||
10
+ ends = value.end_with?(":")
11
+ )
12
+ if !mode.colon? || colon
13
+ value = value.slice(1, value.length) if colon && starts
14
+ value = value.slice(0, -1) if colon && ends
15
+ v = (value.to_sym rescue value) || value
16
+ end
17
+ elsif !value.is_a?(String) # stringify
18
+ v = (value.to_s rescue value) || value
19
+ v = ":" + v if mode.colon?
20
+ end
21
+ end
22
+ v
23
+ end
24
+
25
+ def hash_transform(hash, mode = HashTransformModifier.new)
26
+ hash = (mode.clone?) ? Marshal.load(Marshal.dump(hash)) : hash
27
+ hash.keys.each do |key|
28
+ value = (mode.keys?) ? hash.delete(key) : hash[key]
29
+ value = (value.is_a?(Hash) && mode.recurse?) ? hash_transform(value, mode) : value
30
+ value = sym_str_transform(value, mode) if mode.values?
31
+ key = sym_str_transform(key, mode) if mode.keys?
32
+ hash[key] = value
33
+ end
34
+ hash
35
+ end
36
+
37
+ def symbolize_keys(hash, mode = HashTransformModifier.new)
38
+ mode = mode.new.symbolize.keys
39
+ hash_transform(hash, mode)
40
+ end
41
+
42
+ def stringify_keys(hash, mode = HashTransformModifier.new)
43
+ mode = mode.new.stringify.keys
44
+ hash_transform(hash, mode)
45
+ end
46
+
47
+ def symbolize_values(hash, mode = HashTransformModifier.new)
48
+ mode = mode.new.symbolize.values
49
+ hash_transform(hash, mode)
50
+ end
51
+
52
+ def stringify_values(hash, mode = HashTransformModifier.new)
53
+ mode = mode.new.stringify.values
54
+ hash_transform(hash, mode)
55
+ end
56
+
57
+ def symbolize_hash(hash, mode = HashTransformModifier.new)
58
+ mode = mode.new.symbolize.keys.values
59
+ hash_transform(hash, mode)
60
+ end
61
+
62
+ def stringify_hash(hash, mode = HashTransformModifier.new)
63
+ mode = mode.new.stringify.keys.values
64
+ hash_transform(hash, mode)
65
+ end
66
+
67
+ end
68
+ end
@@ -0,0 +1,114 @@
1
+ module Eco
2
+ module Language
3
+ class HashTransformModifier < Eco::Language::Models::Modifier
4
+
5
+ FLAT_MODE = [:flat, :non_recursivre]
6
+ RECURSIVE_MODE = [:recurse, :deep, :recursive, :r]
7
+
8
+ COPY_MODE = [:copy, :clone, :c]
9
+ BANG_MODE = [:!, :bang]
10
+
11
+ COLON_MODE = [:colon, :colon_to_key, :only_colon]
12
+ ALL_TO_SYM = [:all_to_sym, :all]
13
+
14
+ STRINGIFY_MODE = [:stringify, :string, :to_s]
15
+ SYMBOLIZE_MODE = [:symbolize, :sym, :to_sym]
16
+
17
+ KEYS_MODE = [:keys]
18
+ NO_KEYS_MODE = [:no_keys]
19
+
20
+ NO_VALUES_MODE = [:no_values]
21
+ VALUES_MODE = [:values]
22
+
23
+ def reset_recursive
24
+ self < self.mode - (RECURSIVE_MODE | FLAT_MODE)
25
+ end
26
+
27
+ def reset_bang
28
+ self < self.mode - (BANG_MODE | COPY_MODE)
29
+ end
30
+
31
+ def reset_colon_mode
32
+ self < self.mode - (COLON_MODE | ALL_TO_SYM)
33
+ end
34
+
35
+ def recurse
36
+ self.push(:recurse)
37
+ end
38
+
39
+ def non_recurse
40
+ self.push(:flat)
41
+ end
42
+
43
+ def copy
44
+ self.push(:copy)
45
+ end
46
+
47
+ def bang
48
+ self.push(:bang)
49
+ end
50
+
51
+ def colon
52
+ self.push(:colon)
53
+ end
54
+
55
+ def all
56
+ self.push(:all)
57
+ end
58
+
59
+ def symbolize
60
+ self.push(:symbolize)
61
+ end
62
+
63
+ def stringify
64
+ self.push(:stringify)
65
+ end
66
+
67
+ def keys
68
+ self.push(:keys)
69
+ end
70
+
71
+ def values
72
+ self.push(:values)
73
+ end
74
+
75
+ def recurse?
76
+ mode.any? { |m| RECURSIVE_MODE.include?(m) }
77
+ end
78
+
79
+ def clone?
80
+ mode.all? { |m| !BANG_MODE.include?(m) }
81
+ end
82
+
83
+ def colon?
84
+ mode.any? { |m| COLON_MODE.include?(m) }
85
+ end
86
+
87
+ def symbolize?
88
+ mode.any? { |m| SYMBOLIZE_MODE.include?(m) }
89
+ end
90
+
91
+ def keys?
92
+ mode.any? { |m| KEYS_MODE.include?(m) }
93
+ end
94
+
95
+ def values?
96
+ mode.any? { |m| VALUES_MODE.include?(m) }
97
+ end
98
+
99
+ protected
100
+
101
+ def resolve_mode
102
+ modifiers = self.to_a
103
+ modifiers = resolve(modifiers, RECURSIVE_MODE | FLAT_MODE)
104
+ modifiers = resolve(modifiers, BANG_MODE | COPY_MODE)
105
+ modifiers = resolve(modifiers, COLON_MODE | ALL_TO_SYM)
106
+ modifiers = resolve(modifiers, STRINGIFY_MODE | SYMBOLIZE_MODE)
107
+ modifiers = resolve(modifiers, KEYS_MODE | NO_KEYS_MODE)
108
+ modifiers = resolve(modifiers, VALUES_MODE | NO_VALUES_MODE)
109
+ modifiers
110
+ end
111
+
112
+ end
113
+ end
114
+ end
@@ -0,0 +1,30 @@
1
+ module Eco
2
+ module Language
3
+ def match?(value, at, mode = MatchModifier.new)
4
+ out_match = ->(v) { match?(v, at, mode) }
5
+ in_match = ->(a) { match?(value, a, mode) }
6
+
7
+ case
8
+ when mode.reverse?
9
+ return match?(at , value, mode.new.reset_reverse)
10
+ when mode.pattern?
11
+ at = mode.to_regex(at)
12
+ return match?(value, at, mode.new.reset_pattern)
13
+ when value.is_a?(Array)
14
+ return value.any?(&out_match) if mode.any?
15
+ return value.all?(&out_match) # defaults to EVERY
16
+ when at.is_a?(Array)
17
+ return at.all?(&in_match) if mode.and?
18
+ return at.any?(&in_match) # defaullts to OR
19
+ when at.is_a?(Regexp)
20
+ return at.match?(value)
21
+ when value.is_a?(Regexp)
22
+ return value.match?(at)
23
+ else # final compare
24
+ m = (value == at) ||
25
+ (mode.insensitive? && at&.downcase == value&.downcase)
26
+ (mode.not?) ? !m : m
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,190 @@
1
+ module Eco
2
+ module Language
3
+ class MatchModifier < Eco::Language::Models::Modifier
4
+
5
+ VALUE_MODE = [ :value, :is, ]
6
+ PATTERN_MODE = [ :pattern, :contains, :regexp ]
7
+
8
+ REVERSE_MODE = [ :reverse, :at_to_value, :<< ]
9
+ NON_REVERSE_MODE = [ :normal, :value_to_at, :non_reverse, :>> ]
10
+
11
+ ALL_MODE = [ :all, :every ]
12
+ ANY_MODE = [ :any, :some ]
13
+
14
+ AND_MODE = [ :AND, :and, :&, :intersection, :intersect ]
15
+ OR_MODE = [ :OR, :or, :|, :union ]
16
+
17
+ CASE_MODE = [ :c, :case_sensitive, :case, :sensitive ]
18
+ INCASE_MODE = [ :i, :case_insensitive, :insensitive ]
19
+
20
+ YES_MODE = [ :==, :YES, :yes, :true, :include, :eq ]
21
+ NOT_MODE = [ :!, :NOT, :not, :false, :exclude, :diff ]
22
+
23
+ def to_regex(value)
24
+ case
25
+ when value.is_a?(Array)
26
+ return value.map { |v| self.to_regex(v) }
27
+ when value.is_a?(Regexp)
28
+ return value
29
+ when value.is_a?(String)
30
+ esub = Regexp.escape(value)
31
+ if self.insensitive?
32
+ return /#{esub}/i
33
+ else
34
+ return /#{esub}/
35
+ end
36
+ end
37
+ end
38
+
39
+ def reset_pattern
40
+ self < self.mode - (PATTERN_MODE | VALUE_MODE)
41
+ end
42
+
43
+ def reset_reverse
44
+ self < self.mode - (REVERSE_MODE | NON_REVERSE_MODE)
45
+ end
46
+
47
+ def reset_every
48
+ self < self.mode - (ALL_MODE | ANY_MODE)
49
+ end
50
+
51
+ def reset_and
52
+ self < self.mode - (AND_MODE | OR_MODE)
53
+ end
54
+
55
+ def reset_case
56
+ self < self.mode - (INCASE_MODE | CASE_MODE)
57
+ end
58
+
59
+ def reset_not
60
+ self < self.mode - (NOT_MODE | YES_MODE)
61
+ end
62
+
63
+ def pattern
64
+ self.push(:pattern)
65
+ end
66
+
67
+ def value
68
+ self.push(:value)
69
+ end
70
+
71
+ def reverse
72
+ self.push(:reverse)
73
+ end
74
+
75
+ def normal
76
+ self.push(:normal)
77
+ end
78
+
79
+ def every
80
+ self.push(:every)
81
+ end
82
+
83
+ def all
84
+ every
85
+ end
86
+
87
+ def some
88
+ self.push(:some)
89
+ end
90
+
91
+ def any
92
+ some
93
+ end
94
+
95
+ def and
96
+ self.push(:and)
97
+ end
98
+
99
+ def or
100
+ self.push(:or)
101
+ end
102
+
103
+ def case
104
+ self.push(:sensitive)
105
+ end
106
+
107
+ def insensitive
108
+ self.push(:insensitive)
109
+ end
110
+
111
+ def eq
112
+ self.push(:eq)
113
+ end
114
+
115
+ def not
116
+ self.push(:not)
117
+ end
118
+
119
+ def pattern?
120
+ mode.any? { |m| PATTERN_MODE.include?(m) }
121
+ end
122
+
123
+ def value?
124
+ mode.any? { |m| VALUE_MODE.include?(m) }
125
+ end
126
+
127
+ def reverse?
128
+ mode.any? { |m| REVERSE_MODE.include?(m) }
129
+ end
130
+
131
+ def non_reverse?
132
+ mode.any? { |m| NON_REVERSE_MODE.include?(m) }
133
+ end
134
+
135
+ def any?
136
+ mode.any? { |m| ANY_MODE.include?(m) }
137
+ end
138
+
139
+ def some?
140
+ self.any?
141
+ end
142
+
143
+ def all?
144
+ mode.any? { |m| ALL_MODE.include?(m) }
145
+ end
146
+
147
+ def every?
148
+ self.all?
149
+ end
150
+
151
+ def and?
152
+ mode.any? { |m| AND_MODE.include?(m) }
153
+ end
154
+
155
+ def or?
156
+ mode.any? { |m| OR_MODE.include?(m) }
157
+ end
158
+
159
+ def insensitive?
160
+ mode.any? { |m| INCASE_MODE.include?(m) }
161
+ end
162
+
163
+ def case_sensitive?
164
+ mode.any? { |m| CASE_MODE.include?(m) }
165
+ end
166
+
167
+ def not?
168
+ mode.any? { |m| NOT_MODE.include?(m) }
169
+ end
170
+
171
+ def yes?
172
+ mode.any? { |m| YES_MODE.include?(m) }
173
+ end
174
+
175
+ protected
176
+
177
+ def resolve_mode
178
+ modifiers = self.to_a
179
+ modifiers = resolve(modifiers, PATTERN_MODE | VALUE_MODE)
180
+ modifiers = resolve(modifiers, REVERSE_MODE | NON_REVERSE_MODE)
181
+ modifiers = resolve(modifiers, ALL_MODE | ANY_MODE)
182
+ modifiers = resolve(modifiers, AND_MODE | OR_MODE)
183
+ modifiers = resolve(modifiers, INCASE_MODE | CASE_MODE)
184
+ modifiers = resolve(modifiers, NOT_MODE | YES_MODE)
185
+ modifiers
186
+ end
187
+
188
+ end
189
+ end
190
+ end