enum_ext 0.5.3 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3be0377b4cba2aee0f9ee1fbb19e5efa6c824b0e5965eefca3ea7de7108df363
4
- data.tar.gz: c7a15c944f6598129b29f0ab61f3650a251af242111d90b056f86677fdf51780
3
+ metadata.gz: 8d99346b1ae5f9458733025608cad6e8a1ab427091ce44d10a544e880722633c
4
+ data.tar.gz: 6a1943ddedaa37022bdfe421dbc4c5d063c63149a96aaa0f05cdab35f423de6b
5
5
  SHA512:
6
- metadata.gz: d920ca2ae630226a778ba83144115f360b97c4e9e52759ecc05aae77fd095fe806912ef81c01fe6750031f700c6e2d9c9511a4c7164897ce6ac3ccf86479a365
7
- data.tar.gz: 4433d920ae0ec84e9ad33b6c728a238462f0884b7ce9c693143c06f0a41def984bc25ade651c7c4cdd1d15b32e8229b9deb6a13ba6059885dc9d5d216b591086
6
+ metadata.gz: ce540db8aca9002c6a46a5ae5eb7a45f7a296d4fd183493a8796e3b9dd007ebb04bc0793b1162b82e177de5b59ff06e8e553248a2aa4c725b17d3570d682444f
7
+ data.tar.gz: 7db85461bd47c03b3169259f699a29e7a1855fd791d53fb4fe84995b812739fe4968b8184665dfd04230b71e2d78152dc8868f78f89452f37d6b20ed00c77ecc
data/CHANGELOG.md CHANGED
@@ -1,6 +1,25 @@
1
+ # 0.8.0
2
+ * Methods annotations added:
3
+ * Full descriptions: Class.enum.describe(short=true) / Class.enum.describe_short / Class.enum.describe_long / Class.enum.describe_basic
4
+ * Per-methods: Class.enum.describe_enum_i, describe_mass_assign_enum, describe_multi_enum_scopes e.t.c.
5
+ * method Class.enum.supersets_raw added, it will return supersets decompositions to basic enum
6
+ * Class.enum.all method now returns basic enum_values + supersets_raw decomposition to basic enums ( previously was a supersets i.e. high level definition )
7
+
8
+ # 0.7.0
9
+ * rails 7 syntax support added
10
+ * massive test process refactoring docker with both rails 7 and earlier support
11
+ * simple translate_enum allowed via `ext: [:translate_enum]`
12
+
13
+ # 0.6.0 (BREAKING CHANGES)
14
+ * fixed issue with non array superset
15
+ * standard helpers are now private, you should use enum_ext / enum , ext: [] approach to the definitions
16
+ * class.superset_statuses moved to enum_obj -> class.statuses.superset_statuses
17
+ * massive ReadMe refactoring
18
+
1
19
  # 0.5.3
2
20
  * refactored tests
3
21
  * multi_enum_scopes will be chainable with empty params (i.e. will not change the scope)
22
+ * some development dependencies were added
4
23
 
5
24
  # 0.5.2
6
25
  * removed unused require from the upcoming version
data/Dockerfile ADDED
@@ -0,0 +1,22 @@
1
+ FROM ruby:3.0.3-bullseye
2
+
3
+ WORKDIR /app
4
+ #RUN apt-get update && apt-get -y install lsb-release
5
+ ##
6
+ #RUN wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - && \
7
+ # sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list' && \
8
+ # apt-get update && apt-get -y install postgresql postgresql-client-12
9
+ #
10
+ #RUN sh -c 'echo "local all all trust" > /etc/postgresql/14/main/pg_hba.conf' && \
11
+ # service postgresql start && \
12
+ # psql -U postgres -c 'CREATE DATABASE "niceql-test"'
13
+
14
+ RUN gem install bundler
15
+
16
+ COPY lib/enum_ext/version.rb /app/lib/enum_ext/version.rb
17
+ COPY enum_ext.gemspec /app/
18
+ COPY Gemfile_rails_6 /app/Gemfile
19
+ COPY Gemfile_rails_6.lock /app/Gemfile.lock
20
+ COPY Rakefile /app/
21
+ #
22
+ RUN bundle install
@@ -0,0 +1,25 @@
1
+ FROM ruby:3.0.3-bullseye
2
+
3
+ WORKDIR /app
4
+ #RUN apt-get update && apt-get -y install lsb-release
5
+ ##
6
+ #RUN wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - && \
7
+ # sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list' && \
8
+ # apt-get update && apt-get -y install postgresql postgresql-client-12
9
+ #
10
+ #RUN sh -c 'echo "local all all trust" > /etc/postgresql/14/main/pg_hba.conf' && \
11
+ # service postgresql start && \
12
+ # psql -U postgres -c 'CREATE DATABASE "niceql-test"'
13
+
14
+ RUN gem install bundler
15
+
16
+
17
+ RUN gem install bundler
18
+
19
+ COPY lib/enum_ext/version.rb /app/lib/enum_ext/version.rb
20
+ COPY enum_ext.gemspec /app/
21
+ COPY Gemfile_rails_7 /app/Gemfile
22
+ COPY Gemfile_rails_7.lock /app/Gemfile.lock
23
+ COPY Rakefile /app/
24
+
25
+ RUN bundle install
@@ -3,3 +3,4 @@ source 'https://rubygems.org'
3
3
  # Specify your gem's dependencies in enum_ext.gemspec
4
4
  gemspec
5
5
 
6
+ gem 'activerecord', "<7"
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- enum_ext (0.5.2)
4
+ enum_ext (0.8.0)
5
5
  activerecord (>= 5.2.4.3)
6
6
 
7
7
  GEM
@@ -94,4 +94,4 @@ DEPENDENCIES
94
94
  stubberry
95
95
 
96
96
  BUNDLED WITH
97
- 2.1.4
97
+ 2.4.17
data/Gemfile_rails_7 ADDED
@@ -0,0 +1,6 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in enum_ext.gemspec
4
+ gemspec
5
+
6
+ gem 'activerecord', ">=7"
@@ -0,0 +1,102 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ enum_ext (0.8.0)
5
+ activerecord (>= 5.2.4.3)
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ actionpack (7.0.6)
11
+ actionview (= 7.0.6)
12
+ activesupport (= 7.0.6)
13
+ rack (~> 2.0, >= 2.2.4)
14
+ rack-test (>= 0.6.3)
15
+ rails-dom-testing (~> 2.0)
16
+ rails-html-sanitizer (~> 1.0, >= 1.2.0)
17
+ actionview (7.0.6)
18
+ activesupport (= 7.0.6)
19
+ builder (~> 3.1)
20
+ erubi (~> 1.4)
21
+ rails-dom-testing (~> 2.0)
22
+ rails-html-sanitizer (~> 1.1, >= 1.2.0)
23
+ activemodel (7.0.6)
24
+ activesupport (= 7.0.6)
25
+ activerecord (7.0.6)
26
+ activemodel (= 7.0.6)
27
+ activesupport (= 7.0.6)
28
+ activesupport (7.0.6)
29
+ concurrent-ruby (~> 1.0, >= 1.0.2)
30
+ i18n (>= 1.6, < 2)
31
+ minitest (>= 5.1)
32
+ tzinfo (~> 2.0)
33
+ amazing_print (1.5.0)
34
+ builder (3.2.4)
35
+ byebug (11.1.3)
36
+ concurrent-ruby (1.2.2)
37
+ crass (1.0.6)
38
+ erubi (1.12.0)
39
+ i18n (1.14.1)
40
+ concurrent-ruby (~> 1.0)
41
+ loofah (2.21.3)
42
+ crass (~> 1.0.2)
43
+ nokogiri (>= 1.12.0)
44
+ method_source (1.0.0)
45
+ minitest (5.18.1)
46
+ niceql (0.6.1)
47
+ nokogiri (1.15.3-x86_64-darwin)
48
+ racc (~> 1.4)
49
+ nokogiri (1.15.3-x86_64-linux)
50
+ racc (~> 1.4)
51
+ racc (1.7.1)
52
+ rack (2.2.7)
53
+ rack-test (2.1.0)
54
+ rack (>= 1.3)
55
+ rails-dom-testing (2.1.1)
56
+ activesupport (>= 5.0.0)
57
+ minitest
58
+ nokogiri (>= 1.6)
59
+ rails-html-sanitizer (1.6.0)
60
+ loofah (~> 2.21)
61
+ nokogiri (~> 1.14)
62
+ rails-i18n (7.0.7)
63
+ i18n (>= 0.7, < 2)
64
+ railties (>= 6.0.0, < 8)
65
+ rails_sql_prettifier (7.0.4)
66
+ activerecord (>= 7)
67
+ niceql (~> 0.6)
68
+ railties (7.0.6)
69
+ actionpack (= 7.0.6)
70
+ activesupport (= 7.0.6)
71
+ method_source
72
+ rake (>= 12.2)
73
+ thor (~> 1.0)
74
+ zeitwerk (~> 2.5)
75
+ rake (13.0.6)
76
+ sqlite3 (1.6.3-x86_64-darwin)
77
+ sqlite3 (1.6.3-x86_64-linux)
78
+ stubberry (0.3.0)
79
+ thor (1.2.2)
80
+ tzinfo (2.0.6)
81
+ concurrent-ruby (~> 1.0)
82
+ zeitwerk (2.6.8)
83
+
84
+ PLATFORMS
85
+ x86_64-darwin-20
86
+ x86_64-linux
87
+
88
+ DEPENDENCIES
89
+ activerecord (>= 7)
90
+ amazing_print
91
+ bundler (>= 1.11)
92
+ byebug
93
+ enum_ext!
94
+ minitest
95
+ rails-i18n (>= 4)
96
+ rails_sql_prettifier
97
+ rake (>= 10.0)
98
+ sqlite3
99
+ stubberry
100
+
101
+ BUNDLED WITH
102
+ 2.4.17
data/README.md CHANGED
@@ -7,7 +7,7 @@ EnumExt extends rails enum with localization/translation and it's helpers, mass-
7
7
  Add this line to your application's Gemfile:
8
8
 
9
9
  ```ruby
10
- gem 'enum_ext', '~> 0.3'
10
+ gem 'enum_ext', '~> 0.7'
11
11
  ```
12
12
 
13
13
  And then execute:
@@ -49,7 +49,41 @@ Or install it yourself as:
49
49
  end
50
50
  ```
51
51
 
52
- Now let's review some examples of possible enum extensions
52
+ ## Inline definitions. Starting 0.5.0!! BREAKING CHANGES!
53
+
54
+ Starting version 0.4.6, for concise and clearer code base, you can activate most of the extensions during enum definition, using `ext: [...]` notation.
55
+ This is a preferable way now, and old helpers are private starting version 0.6!:
56
+
57
+ ```ruby
58
+ #Instead of three method calls:
59
+ enum kind: {}
60
+ enum_i :kind # will raise an private method error starting ver 0.6
61
+ enum_mass_assign :kind # will raise an private method error starting ver 0.6
62
+
63
+ #You should go with ext option instead:
64
+ enum kinds: {}, ext: [:enum_i, :enum_mass_assign]
65
+
66
+ # OR in case of standalone enum definition:
67
+ enum kinds: {} # somewhere where you can't or don't want reach
68
+ enum_ext :kinds, [:enum_i, :enum_mass_assign, enum_supersets: {} ]
69
+ ```
70
+ Rem: enum_ext could be called multiple times and merge later definitions, though I can't imagine why would you split it to multiple calls.
71
+
72
+ Rem: The only exceptions for the new syntax are full translation/humanization helpers definitions.
73
+ Those will not add any clarity to code, and should be used via standalone helpers.
74
+ But standard translate_enum without definitions still welcome:
75
+
76
+ ```ruby
77
+ # GOOD:
78
+ enum_ext :kinds, [:enum_i, :enum_mass_assign, :translate_enum, enum_supersets: {}]
79
+
80
+ # BAD (even if correctly defines internationalization):
81
+ enum_ext :kinds, [:enum_i, :enum_mass_assign, :translate_enum, enum_supersets: {}] do
82
+ I18n.t("scope.#{kind}")
83
+ end
84
+ ```
85
+
86
+ ## Humanization and localization
53
87
 
54
88
  ### Humanization (humanize_enum)
55
89
 
@@ -81,7 +115,7 @@ Or install it yourself as:
81
115
 
82
116
  ```ruby
83
117
  humanize_enum :status do
84
- I18n.t("scope.#{status}")
118
+ I18n.t("scope.#{status}")
85
119
  end
86
120
  ```
87
121
 
@@ -95,7 +129,6 @@ Or install it yourself as:
95
129
  ```ruby
96
130
  filter :status, as: :select, label: 'Status', collection: Request.t_statuses_options_i
97
131
  ```
98
-
99
132
 
100
133
  **Rem:** select options may break when using lambda() or proc with instance method, but will survive with block
101
134
 
@@ -113,6 +146,7 @@ Or install it yourself as:
113
146
  ### Translate (translate_enum)
114
147
 
115
148
  Enum is translated using scope 'active_record.attributes.class_name_underscore.enum_plural', or the given one:
149
+
116
150
  ```ruby
117
151
  translate_enum :status, 'active_record.request.enum'
118
152
  ```
@@ -124,7 +158,10 @@ Or it can be done with block either with translate or humanize:
124
158
  end
125
159
  ```
126
160
 
161
+ ## Enum extended functionality
162
+
127
163
  ### Enum to_i shortcut ( enum_i )
164
+
128
165
  Defines method enum_name_i shortcut for Model.enum_names[elem.enum_name] or enum_name_before_type_cast
129
166
 
130
167
  **Ex**
@@ -135,22 +172,30 @@ Defines method enum_name_i shortcut for Model.enum_names[elem.enum_name] or enum
135
172
  request.paid_i # 10
136
173
  ```
137
174
 
138
- ### Enum Sets (ext_enum_sets)
175
+ ### Enum SuperSets (enum_supersets)
139
176
 
140
- **Use-case** whenever you need superset of enums to behave like a enum.
177
+ **Use-case** whenever you need superset of enums to behave like a super enum.
141
178
 
142
- You can do this with method **ext_enum_sets** it creates:
179
+ You can do this with method **enum_supersets** it creates:
143
180
  - scopes for subsets,
144
181
  - instance methods with `?`
145
- - and some class methods helpers
146
182
 
147
183
  For instance:
148
184
 
149
185
  ```ruby
150
- ext_enum_sets :status, {
151
- delivery_set: [:ready_for_shipment, :on_delivery, :delivered], # for shipping department for example
152
- in_warehouse: [:ready_for_shipment]
153
- }
186
+ enum status: [:in_cart, :waiting_for_payment, :paid, :packing, :ready_for_shipment, :on_delivery, :delivered],
187
+ ext: [enum_supersets: {
188
+ delivery_set: [:ready_for_shipment, :on_delivery], # for shipping department for example
189
+ in_warehouse: [:packing, :ready_for_shipment], # this scope is just for superposition example below
190
+ sold: [:paid, :delivery_set, :in_warehouse, :delivered] # also you can define any superposition of already defined supersets or enum values
191
+ }]
192
+
193
+ # supersets will be stored inside enum wrapper object, and can be de-referenced to basic enum values
194
+ # using wrapper defined methods: "superset_enum_plural", i.e. statuses.sold_statuses -> [:paid, :packing, :ready_for_shipment, :on_delivery, :delivered]
195
+ # so new supersets could be defined using Array operations against newly defined methods
196
+ enum_ext :status, enum_supersets: {
197
+ outside_warehouse: ( statuses.delivery_set_statuses - statuses.in_warehouse_statuses ) #... any other array operations like &, + and so can be used
198
+ }
154
199
  ```
155
200
 
156
201
  it will generate:
@@ -162,13 +207,17 @@ instance:
162
207
  class:
163
208
  - named scopes: delivery_set, in_warehouse
164
209
  - parametrized scopes: with_statuses, without_statuses ( available as a standalone extension now, and will not be included by default in a versionafter 0.5.0)
165
- class helpers:
166
- - delivery_set_statuses (=[:ready_for_shipment, :on_delivery, :delivered] ), in_warehouse_statuses
167
- - delivery_set_statuses_i (= [3,4,5]), in_warehouse_statuses_i (=[3])
168
210
 
169
- class translation helpers ( started with t_... ):
170
- - t_delivery_set_statuses_options (= [['translation or humanization', :ready_for_shipment] ...] ) for select inputs purposes
171
- - t_delivery_set_statuses_options_i (= [['translation or humanization', 3] ...]) same as above but with integer as value ( for example to use in Active admin filters )
211
+ enum methods:
212
+ - Class.statuses.supersets -- will output superset definition hash
213
+ - Class.statuses.supersets_raw -- will output superset decompositions to basic enum types hash
214
+
215
+ - Class.statuses.delivery_superset (=[:ready_for_shipment, :on_delivery, :delivered] ), in_warehouse_statuses
216
+ - delivery_set_statuses_i (= [3,4,5]), in_warehouse_statuses_i (=[3])
217
+
218
+ translation helpers ( started with t_... ):
219
+ - Class.statuses.t_delivery_set_options (= [['translation or humanization', :ready_for_shipment] ...] ) for select inputs purposes
220
+ - Class.statuses.t_delivery_set_options_i (= [['translation or humanization', 3] ...]) same as above but with integer as value ( for example to use in Active admin filters )
172
221
  ```
173
222
 
174
223
  ```ruby
@@ -181,10 +230,10 @@ class:
181
230
  Request.delivery_set_statuses # >> ["ready_for_shipment", "on_delivery", "delivered"]
182
231
  ```
183
232
  Rem:
184
- ext_enum_sets can be called multiple times defining a superposition of already defined sets ( considering previous example ):
233
+ supersets creation could be called multiple times defining a superposition of already defined sets ( considering previous example ):
185
234
 
186
235
  ```ruby
187
- ext_enum_sets :status, {
236
+ enum_ext :status, enum_supersets: {
188
237
  outside_wharehouse: ( delivery_set_statuses - in_warehouse_statuses )#... any other array operations like &, + and so can be used
189
238
  }
190
239
  ```
@@ -192,7 +241,7 @@ ext_enum_sets can be called multiple times defining a superposition of already d
192
241
  Rem: you can refer previously defined set as usual kind in the same method call:
193
242
 
194
243
  ```ruby
195
- ext_enum_sets :status, {
244
+ enum_ext :status, enum_supersets: {
196
245
  delivery_set: [:ready_for_shipment, :on_delivery, :delivered],
197
246
  not_in_cart: [:paid, :delivery_set] #
198
247
  }
@@ -243,11 +292,43 @@ Rem: you can refer previously defined set as usual kind in the same method call:
243
292
  order.requests.delivered.count # >> N + M
244
293
  ```
245
294
 
295
+ ## Annotations helpers
296
+ Sometimes under irb console you need a quick tip on whats extension available on a enum, so some describe_* helpers added to enum wrapper
297
+
298
+ General description methods (describe/describe_short/describe_long)
299
+ ```
300
+ Class.enum.describe
301
+ ```
302
+ ![img.png](img.png)
303
+
304
+ ```
305
+ Class.enum.describe_short
306
+ ```
307
+ ![img_1.png](img_1.png)
308
+
309
+ ```
310
+ Class.enum.describe_long
311
+ ```
312
+ ![img_2.png](img_2.png)
313
+
314
+ And per extension methods (describe_enum_i, e.t.c)
315
+
316
+ ```ruby
317
+ EnumAnnotated.test_types.describe_mass_assign_enum
318
+ ```
319
+ ![img_3.png](img_3.png)
320
+
246
321
  ## Tests
247
- rake test
248
-
322
+ Starting version 0.6 added support for rails 7+ enum definitions, that's making testing a little bit not that easy as running `rake test`.
323
+ Now testings are done via `docker-compose up`. Look closer to Dockerfiles and `docker-compose.yml`
324
+ to get the idea how they working simultaneously without interference with each other.
325
+
326
+
249
327
  ## Development
250
328
 
329
+ ## TODO
330
+ [] better support for suffix/prefix as enum does
331
+ [] describe method to observe current extension
251
332
 
252
333
  ## Contributing
253
334
 
@@ -258,6 +339,6 @@ Bug reports and pull requests are welcome on GitHub at https://github.com/alekse
258
339
 
259
340
  The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
260
341
 
261
- ### Thanks
262
342
 
263
- Thanks for the star vzamanillo, it inspires me to do mass refactor and gracefully cover code in this gem by tests.
343
+ ### Thanks
344
+ Thanks for the first star to vzamanillo, it inspires me to do mass refactor and gracefully cover code in this gem by tests.
@@ -0,0 +1,24 @@
1
+ version: "3.7"
2
+
3
+ services:
4
+ test:
5
+ build: .
6
+ image: enum_ext
7
+ command: rake test
8
+ volumes:
9
+ - './lib:/app/lib'
10
+ - './test:/app/test'
11
+ - './Gemfile_rails_6:/app/Gemfile'
12
+ - './Gemfile_rails_6.lock:/app/Gemfile.lock'
13
+
14
+ test_7_0:
15
+ build:
16
+ context: .
17
+ dockerfile: Dockerfile_rails_7
18
+ image: enum_ext_rails_7
19
+ command: rake test
20
+ volumes:
21
+ - './lib:/app/lib'
22
+ - './test:/app/test'
23
+ - './Gemfile_rails_7:/app/Gemfile'
24
+ - './Gemfile_rails_7.lock:/app/Gemfile.lock'
data/img.png ADDED
Binary file
data/img_1.png ADDED
Binary file
data/img_2.png ADDED
Binary file
data/img_3.png ADDED
Binary file
@@ -0,0 +1,172 @@
1
+ # I wanted to add some quick live annotation to what's defined and how it could be used
2
+ # but have no idea how to do this in a super-neat way, so it a little bit chaotic and experimental
3
+ module EnumExt::Annotated
4
+
5
+ # call it to see what's your enum current opitons
6
+ def describe_basic
7
+ puts yellow( "Basic #{enum_name} definition: \n" )
8
+ print_hash(enum_values)
9
+ end
10
+
11
+ # call it to see all enum extensions defined.
12
+ def describe_long
13
+ puts yellow( "\nEnumExt extensions:" )
14
+
15
+ puts [
16
+ describe_enum_i(false),
17
+ describe_mass_assign_enum(false),
18
+ describe_multi_enum_scopes(false),
19
+ describe_supersets(false),
20
+ describe_translations(false),
21
+ describe_humanizations(false)
22
+ ].join( "\n" + "-" * 100 + "\n" )
23
+ end
24
+
25
+ def describe(short = true)
26
+ describe_basic
27
+ short ? describe_short : describe_long
28
+ end
29
+
30
+ def describe_short
31
+ enabled, disabled = enabled_features.except(:key_sample).partition{!_2.blank?}.map{ |prt| prt.map(&:shift) }
32
+ puts <<~SHORT
33
+ #{yellow("EnumExt extensions:")}
34
+ #{cyan("Enabled")}: #{enabled.join(", ")}
35
+ #{red("Disabled")}: #{disabled.join(", ")}
36
+ SHORT
37
+
38
+ print_short(:supersets)
39
+ print_short(:translations)
40
+ print_short(:humanization)
41
+ end
42
+
43
+ # --------------------------------------------------------------------
44
+ # ------------- per helpers describers -------------------------------
45
+ # --------------------------------------------------------------------
46
+ def describe_enum_i(output = true)
47
+ description = basic_helpers_usage_header(:enum_i)
48
+ description << <<~ENUM_I if enabled_features[:enum_i]
49
+ #{black("instance")}.#{cyan( enabled_features[:enum_i] )}
50
+ # output will be same as #{base_class.to_s}.#{enum_name}[:#{enabled_features[:key_sample]}]
51
+ ENUM_I
52
+
53
+ output ? puts(description) : description
54
+ end
55
+
56
+ def describe_mass_assign_enum(output = true)
57
+ description = basic_helpers_usage_header(:mass_assign_enum)
58
+ description << <<~MASS_ASSIGN if enabled_features[:mass_assign_enum]
59
+ # To assign #{enabled_features[:key_sample]} to all elements of any_scope or relation call:
60
+ #{black(base_class.to_s)}.any_scope.#{cyan( enabled_features[:mass_assign_enum] )}
61
+ MASS_ASSIGN
62
+
63
+ output ? puts(description) : description
64
+ end
65
+
66
+ def describe_multi_enum_scopes(output = true)
67
+ description = basic_helpers_usage_header(:multi_enum_scopes)
68
+ description << <<~MULTI_SCOPES if enabled_features[:multi_enum_scopes]
69
+ # Two scopes: with_#{enum_name} and without_#{enum_name} are defined
70
+ # To get elements with a given enums or supersets values call:
71
+ #{black(base_class.to_s)}.#{cyan("with_#{enum_name}")}(:#{keys.sample(2).join(", :")})
72
+ \n# To get all elements except for the ones with enums or supersets values call:
73
+ #{black(base_class.to_s)}.#{cyan("without_#{enum_name}")}(:#{keys.sample(2).join(", :")})
74
+ MULTI_SCOPES
75
+
76
+ output ? puts(description) : description
77
+ end
78
+
79
+ def describe_supersets(output = true)
80
+ description = if enabled_features[:supersets].blank?
81
+ red( "\nSupersets not used!\n" )
82
+ else
83
+ red( "\nSupersets definitions:\n" ) << inspect_hash(enabled_features[:supersets]) << <<~SUPERSETS
84
+ # Instance methods added: #{enabled_features[:supersets].keys.join("?, ")}?
85
+
86
+ # Class level methods added: #{enabled_features[:supersets].keys.join(", ")}
87
+ SUPERSETS
88
+ end
89
+
90
+ output ? puts(description) : description
91
+ end
92
+
93
+ def describe_translations(output = true)
94
+ description = if enabled_features[:translations].blank?
95
+ red( "\nTranslations not used!\n" )
96
+ else
97
+ red( "\nTranslations definitions (will skip instance dependent translation)\n" ) <<
98
+ inspect_hash(enabled_features[:translations])
99
+ end
100
+
101
+ output ? puts(description) : description
102
+ end
103
+
104
+ def describe_humanizations(output = true)
105
+ description = if enabled_features[:humanization].blank?
106
+ red( "\nHumanization not used!\n" )
107
+ else
108
+ red( "\nHumanization definitions (will skip instance dependent humanization)\n" ) <<
109
+ inspect_hash(enabled_features[:humanization])
110
+ end
111
+
112
+ output ? puts(description) : description
113
+ end
114
+
115
+ private
116
+
117
+ def enabled_features
118
+ enum_sample = keys.first
119
+ {
120
+ key_sample: enum_sample,
121
+ enum_i: base_class.instance_methods.include?("#{enum_name}_i".to_sym) && "#{enum_name}_i",
122
+ mass_assign_enum: base_class.respond_to?("#{enum_sample}!") && "#{enum_sample}!",
123
+ multi_enum_scopes: base_class.respond_to?("with_#{enum_name.to_s.pluralize}") && "with_#{enum_name.to_s.pluralize}",
124
+ supersets: supersets_raw,
125
+ translations: try(:t_options),
126
+ humanization: try(:t_options)
127
+ }
128
+ end
129
+
130
+ def basic_helpers_usage_header(helper_name)
131
+ enabled_features[helper_name] ? "\n#{red(helper_name)} helpers enabled, usage:\n"
132
+ : "\n#{helper_name} wasn't used\n"
133
+ end
134
+
135
+ def print_hash(hsh)
136
+ defined?(ai) ? ap(hsh) : pp(hsh)
137
+ end
138
+
139
+ def inspect_hash(hsh)
140
+ defined?(ai) ? hsh.ai : hsh.inspect
141
+ end
142
+
143
+ def print_short(feature)
144
+ if enabled_features[feature].present?
145
+ puts black("#{feature.to_s.humanize}:")
146
+ print_hash(enabled_features[feature])
147
+ end
148
+ end
149
+
150
+ def yellow(str)
151
+ # yellow ANSI color
152
+ "\e[0;33;49m#{str}\e[0m"
153
+ end
154
+
155
+ def cyan(str)
156
+ # cyan ANSI color
157
+ "\e[0;36;49m#{str}\e[0m"
158
+ end
159
+
160
+ def red(str)
161
+ # red ANSI color
162
+ "\e[0;31;49m#{str}\e[0m"
163
+ end
164
+
165
+ def black(comment)
166
+ # bright black bold ANSI color
167
+ "\e[0;90;1;49m#{comment}\e[0m"
168
+ end
169
+
170
+ end
171
+
172
+