eitil 1.0.1 → 1.1.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 (63) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +0 -1
  3. data/eitil_core/README.md +93 -4
  4. data/eitil_core/lib/eitil_core.rb +1 -0
  5. data/eitil_core/lib/eitil_core/application_controller/slice_params.rb +3 -0
  6. data/eitil_core/lib/eitil_core/application_record/all_associations.rb +3 -0
  7. data/eitil_core/lib/eitil_core/application_record/find_by_like.rb +3 -0
  8. data/eitil_core/lib/eitil_core/application_record/where_like.rb +3 -0
  9. data/eitil_core/lib/eitil_core/argument_helpers.rb +8 -0
  10. data/eitil_core/lib/eitil_core/argument_helpers/all_args_to_ivars_bang.rb +15 -0
  11. data/eitil_core/lib/eitil_core/argument_helpers/all_kwargs_to_ivars_bang.rb +15 -0
  12. data/eitil_core/lib/eitil_core/argument_helpers/args_to_h.rb +15 -0
  13. data/eitil_core/lib/eitil_core/argument_helpers/args_to_h_bang.rb +17 -0
  14. data/eitil_core/lib/eitil_core/argument_helpers/args_to_ivars_bang.rb +15 -0
  15. data/eitil_core/lib/eitil_core/float/safe_to_i.rb +3 -0
  16. data/eitil_core/lib/eitil_core/lookups.rb +2 -1
  17. data/eitil_core/lib/eitil_core/lookups/gem_path.rb +10 -0
  18. data/eitil_core/lib/eitil_core/mocks.rb +6 -0
  19. data/eitil_core/lib/eitil_core/mocks/array.rb +39 -0
  20. data/eitil_core/lib/eitil_core/mocks/hash.rb +36 -0
  21. data/eitil_core/lib/eitil_core/mocks/string.rb +11 -0
  22. data/eitil_core/lib/eitil_core/railtie.rb +0 -3
  23. data/eitil_integrate/README.md +11 -0
  24. data/eitil_integrate/lib/eitil_integrate.rb +4 -0
  25. data/eitil_integrate/lib/eitil_integrate/application_exporter.rb +22 -0
  26. data/eitil_integrate/lib/eitil_integrate/application_exporter/auto_sum.rb +10 -0
  27. data/eitil_integrate/lib/eitil_integrate/application_exporter/auto_sum/drop_data.rb +54 -0
  28. data/eitil_integrate/lib/eitil_integrate/application_exporter/auto_sum/format_data.rb +27 -0
  29. data/eitil_integrate/lib/eitil_integrate/application_exporter/auto_sum/initialize.rb +22 -0
  30. data/eitil_integrate/lib/eitil_integrate/application_exporter/auto_sum/present_data.rb +31 -0
  31. data/eitil_integrate/lib/eitil_integrate/application_exporter/auto_sum/reduce_data.rb +18 -0
  32. data/eitil_integrate/lib/eitil_integrate/application_exporter/auto_sum/sum_data.rb +56 -0
  33. data/eitil_integrate/lib/eitil_integrate/application_exporter/default_export.rb +43 -0
  34. data/eitil_integrate/lib/eitil_integrate/application_exporter/helpers.rb +50 -0
  35. data/eitil_integrate/lib/eitil_integrate/application_exporter/infos.rb +20 -0
  36. data/eitil_integrate/lib/eitil_integrate/application_exporter/initialize.rb +28 -0
  37. data/eitil_integrate/lib/eitil_integrate/application_exporter/lookups.rb +40 -0
  38. data/eitil_integrate/lib/eitil_integrate/application_exporter/selectors.rb +58 -0
  39. data/eitil_integrate/lib/eitil_integrate/application_exporter/setters.rb +27 -0
  40. data/eitil_integrate/lib/eitil_integrate/application_exporter/store_file.rb +34 -0
  41. data/eitil_integrate/lib/eitil_integrate/application_exporter/style_cells.rb +97 -0
  42. data/eitil_integrate/lib/eitil_integrate/application_exporter/validations.rb +28 -0
  43. data/eitil_integrate/lib/eitil_integrate/application_exporter/write_cells.rb +78 -0
  44. data/eitil_integrate/lib/eitil_integrate/application_exporter/write_messages.rb +18 -0
  45. data/eitil_integrate/lib/eitil_integrate/railtie.rb +0 -3
  46. data/eitil_store/lib/eitil_store/railtie.rb +0 -3
  47. data/eitil_support/lib/eitil_support/directory/lookups.rb +3 -0
  48. data/eitil_support/lib/eitil_support/railtie.rb +0 -3
  49. data/eitil_wrapper/README.md +16 -0
  50. data/eitil_wrapper/lib/eitil_wrapper.rb +2 -1
  51. data/eitil_wrapper/lib/eitil_wrapper/jobs/single_method_job.rb +3 -0
  52. data/eitil_wrapper/lib/eitil_wrapper/railtie.rb +24 -7
  53. data/eitil_wrapper/lib/eitil_wrapper/request_logger.rb +5 -0
  54. data/eitil_wrapper/lib/eitil_wrapper/request_logger/controller_mixin.rb +48 -0
  55. data/eitil_wrapper/lib/eitil_wrapper/request_logger/logger_job.rb +17 -0
  56. data/eitil_wrapper/lib/eitil_wrapper/scopes/default_scopes.rb +6 -0
  57. data/lib/eitil.rb +0 -1
  58. data/lib/eitil/all.rb +5 -5
  59. data/lib/eitil/railtie.rb +28 -1
  60. data/lib/eitil/version.rb +1 -1
  61. metadata +63 -4
  62. data/lib/eitil/engine.rb +0 -38
  63. data/lib/tasks/eitil_tasks.rake +0 -4
@@ -0,0 +1,58 @@
1
+
2
+ # require "eitil_integrate/application_exporter/selectors"
3
+
4
+ require "eitil_integrate/application_exporter/initialize"
5
+
6
+ module EitilIntegrate::RubyXL
7
+ class ApplicationExporter
8
+
9
+ private
10
+
11
+ # rows
12
+
13
+ def current_row
14
+ x
15
+ end
16
+
17
+ def previous_row
18
+ x - 1
19
+ end
20
+
21
+ def next_row
22
+ x + 1
23
+ end
24
+
25
+ def first_row
26
+ 0
27
+ end
28
+
29
+ # columns
30
+
31
+ def current_column
32
+ y
33
+ end
34
+
35
+ def previous_column
36
+ y - 1
37
+ end
38
+
39
+ def next_column
40
+ y + 1
41
+ end
42
+
43
+ def first_column
44
+ 0
45
+ end
46
+
47
+ # RubyXL object selectors for rows. For columns I have not found a RubyXL object,
48
+ # or a practical way of accessing the cells of a column, yet.
49
+
50
+ def method_missing(_method, *args, &block)
51
+ m = _method.to_s
52
+ super _method unless m.include?('row') and m.ends_with?('_object')
53
+ super _method unless respond_to? m.delete_suffix!('_object'), true
54
+ sheet[send(m)]
55
+ end
56
+
57
+ end
58
+ end
@@ -0,0 +1,27 @@
1
+
2
+ # require "eitil_integrate/application_exporter/setters"
3
+
4
+ require "eitil_integrate/application_exporter/initialize"
5
+
6
+ module EitilIntegrate::RubyXL
7
+ class ApplicationExporter
8
+
9
+ # The date setter methods allow Exporters to receive dates as strings, which are
10
+ # required to prevent serialization errors in perform_later background jobs.
11
+
12
+ private
13
+
14
+ def set_start_date
15
+ @start_date.is_a?(Date) ? @start_date : Date.parse(@start_date) if @start_date
16
+ end
17
+
18
+ def set_end_date
19
+ @end_date.is_a?(Date) ? @end_date : Date.parse(@end_date) if @end_date
20
+ end
21
+
22
+ def set_date_range
23
+ @start_date..@end_date if @start_date && @end_date
24
+ end
25
+
26
+ end
27
+ end
@@ -0,0 +1,34 @@
1
+
2
+ # require "eitil_integrate/application_exporter/store_file"
3
+
4
+ require "eitil_integrate/application_exporter/initialize"
5
+ require "eitil_core/setters/set_ivars"
6
+
7
+ module EitilIntegrate::RubyXL
8
+ class ApplicationExporter
9
+
10
+ attr_accessor :storage_path
11
+
12
+ private
13
+
14
+ def save_file
15
+ set_ivars :storage_path
16
+ save_book
17
+ run_after_save_effects
18
+ @storage_path
19
+ end
20
+
21
+ def set_storage_path
22
+ "#{Rails.root}/data/#{self.class.name.snakecase}_#{DateTime.now.prettify}.xlsx"
23
+ end
24
+
25
+ def save_book
26
+ book.write @storage_path
27
+ end
28
+
29
+ def run_after_save_effects
30
+ # nil fallback for if the application class (which inherits from ApplicationExporter) has no method #run_after_save_effects
31
+ end
32
+
33
+ end
34
+ end
@@ -0,0 +1,97 @@
1
+
2
+ # require "eitil_integrate/application_exporter/style_cells"
3
+
4
+ require "eitil_integrate/application_exporter/initialize"
5
+
6
+ module EitilIntegrate::RubyXL
7
+ class ApplicationExporter
8
+
9
+ COLOURS = { white: 'ffffff', black: '000000', red: 'FF0000', blue: '0000FF', green: '00FF00', yellow: 'FFFF00',
10
+ cyan: '00FFFF', magenta: 'FF00FF', dark_grey: '464646', grey: '7E7E7E', light_grey: 'C1C1C1',
11
+ eitje_blue: '0496FF' }
12
+
13
+ private
14
+
15
+ def style_file
16
+ style_general
17
+ style_custom
18
+ end
19
+
20
+ def style_general
21
+ style_row_height
22
+ style_column_width
23
+ style_first_row_bold
24
+ style_first_column_bold
25
+ end
26
+
27
+ def style_custom
28
+ %i[
29
+ style_first_x_columns_width
30
+ style_x_columns_width
31
+ style_first_x_rows_height
32
+ style_x_rows_height
33
+ ].each { |_method| safe_send _method }
34
+ end
35
+
36
+ # multi rows
37
+
38
+ def style_row_height(height = 15)
39
+ base_style_x_rows_height row_indices, height
40
+ end
41
+
42
+ def style_first_x_rows_height(n_rows, height)
43
+ base_style_x_rows_height (0...n_rows), height
44
+ end
45
+
46
+ def style_x_rows_height(row_indices = [], height)
47
+ row_indices.each { |i| @sheet.change_row_height(i, height) }
48
+ end
49
+
50
+ alias_method :base_style_x_rows_height, :style_x_rows_height
51
+
52
+ # multi columns
53
+
54
+ def style_column_width(width = 40)
55
+ base_style_x_columns_width column_indices, width
56
+ end
57
+
58
+ def style_first_x_columns_width(n_columns, width)
59
+ base_style_x_columns_width (0...n_columns), width
60
+ end
61
+
62
+ def style_x_columns_width(column_indices = [], width)
63
+ column_indices.each { |i| @sheet.change_column_width(i, width) }
64
+ end
65
+
66
+ alias_method :base_style_x_columns_width, :style_x_columns_width
67
+
68
+ # single row
69
+
70
+ def style_first_row_bold
71
+ style_row_bold first_row
72
+ end
73
+
74
+ def style_row_bold(row)
75
+ @sheet.change_row_bold(row, true)
76
+ end
77
+
78
+ def style_row_font_colour(row, colour)
79
+ @sheet.change_row_font_color row, COLOURS[colour.to_sym]
80
+ end
81
+
82
+ def style_row_background_colour(row, colour)
83
+ sheet[row].cells.each { |cell| cell.change_fill COLOURS[colour.to_sym] }
84
+ end
85
+
86
+ # single column
87
+
88
+ def style_first_column_bold
89
+ style_column_bold first_column
90
+ end
91
+
92
+ def style_column_bold(column)
93
+ @sheet.change_column_bold(column, true)
94
+ end
95
+
96
+ end
97
+ end
@@ -0,0 +1,28 @@
1
+
2
+ # require "eitil_integrate/application_exporter/validations"
3
+
4
+ require "eitil_integrate/application_exporter/initialize"
5
+ require "eitil_core/errors/raise_error"
6
+
7
+ module EitilIntegrate::RubyXL
8
+ class ApplicationExporter
9
+
10
+ def validate_args_presence(*args)
11
+ args.each do |arg|
12
+ unless instance_variable_get "@#{arg}"
13
+ raise_error 'ExportArgumentsNotSetError', 'Set all required arguments. (Be aware that nil values will fail the test.)'
14
+ end
15
+ end
16
+ true
17
+ end
18
+
19
+ def validate_args_value
20
+ # Empty holder to prevent NoMethodError in DefaultExporter#export.
21
+ end
22
+
23
+ def validate_data
24
+ # Empty holder to prevent NoMethodError in DefaultExporter#export.
25
+ end
26
+
27
+ end
28
+ end
@@ -0,0 +1,78 @@
1
+
2
+ # require "eitil_integrate/application_exporter/write_cells"
3
+
4
+ require "eitil_integrate/application_exporter/initialize"
5
+
6
+ module EitilIntegrate::RubyXL
7
+ class ApplicationExporter
8
+
9
+ def new_row(row_hash)
10
+ row_hash.each { |x_axis, title| @sheet.add_cell(x, x_axis.to_s.to_i, title) }
11
+ @x += 1
12
+ end
13
+
14
+ def empty_row
15
+ @x += 1
16
+ end
17
+
18
+ def empty_rows(n_rows)
19
+ @x += n_rows
20
+ end
21
+
22
+ def new_column(column_hash)
23
+ column_hash.each { |y_axis, title| @sheet.add_cell(y_axis.to_s.to_i, y, title) }
24
+ @y += 1
25
+ end
26
+
27
+ def empty_column
28
+ @y += 1
29
+ end
30
+
31
+ def empty_columns(n_columns)
32
+ @y += n_columns
33
+ end
34
+
35
+ def rows
36
+ @sheet.sheet_data.rows
37
+ end
38
+
39
+ def row_indices
40
+ (0...rows.count).to_a
41
+ end
42
+
43
+ def columns
44
+ # RubyXl does not seem to be purposed around columns, but merely handle rows properly.
45
+ end
46
+
47
+ def column_indices
48
+ n_rows = rows.map { |r| r&.cells&.count }.compact.max #temporary hack
49
+ (0...n_rows).to_a
50
+ end
51
+
52
+ def array_to_row(array)
53
+ new_row array_to_indexed_hash(array)
54
+ end
55
+
56
+ def row_values(row_index)
57
+ rows.dig(row_index).cells.map &:value
58
+ end
59
+
60
+ def column_values(column_index)
61
+ rows.map { |row| row&.cells&.dig(column_index)&.value }
62
+ end
63
+
64
+ def all_column_values
65
+ column_indices.map { |i| { i => column_values(i) } }.inject &:merge
66
+ end
67
+
68
+ def all_row_values
69
+ row_indices.map { |i| { i => row_values(i) } }.inject &:merge
70
+ end
71
+
72
+ def sum_row
73
+ new_row EitilIntegrate::RubyXL::AutoSum.perform(all_column_values)
74
+ style_row_bold previous_row
75
+ end
76
+
77
+ end
78
+ end
@@ -0,0 +1,18 @@
1
+
2
+ # require "eitil_integrate/application_exporter/write_messages"
3
+
4
+ require "eitil_integrate/application_exporter/initialize"
5
+
6
+ module EitilIntegrate::RubyXL
7
+ class ApplicationExporter
8
+
9
+ def fill_messages
10
+ # nil fallback for if the exporter class has no method #fill_messages
11
+ end
12
+
13
+ def write_message(message)
14
+ new_row({ '0': message })
15
+ end
16
+
17
+ end
18
+ end
@@ -1,7 +1,4 @@
1
1
 
2
- require "rails"
3
- require "eitil_integrate"
4
-
5
2
  module EitilIntegrate
6
3
 
7
4
  class Railtie < Rails::Railtie
@@ -1,7 +1,4 @@
1
1
 
2
- require "rails"
3
- require "eitil_store"
4
-
5
2
  module EitilStore
6
3
 
7
4
  class Railtie < Rails::Railtie
@@ -1,3 +1,6 @@
1
+
2
+ # require "eitil_support/directory"
3
+
1
4
  module EitilSupport
2
5
  module Directory
3
6
  class << self
@@ -1,7 +1,4 @@
1
1
 
2
- require "rails"
3
- require "eitil_support"
4
-
5
2
  module EitilSupport
6
3
 
7
4
  class Railtie < Rails::Railtie
@@ -179,3 +179,19 @@ Scopes are generated through the columns of your model's database table. Which s
179
179
  ```
180
180
 
181
181
 
182
+
183
+
184
+
185
+ ## EitilWrapper::RequestLogger
186
+
187
+ ```ruby
188
+
189
+ require "eitil_wrapper/request_logger"
190
+
191
+ ```
192
+
193
+ The RequestLogger wrapper logs request params in /log/request_logger.log, which offers the opportunity to pry into webhooks while developing. In order to track a controller, simply include EitilWrapper::RequestLogger::ControllerMixin. This calls a background job which writes to the file.
194
+
195
+
196
+
197
+
@@ -4,4 +4,5 @@ require "eitil_wrapper"
4
4
  require "eitil_wrapper/jobs"
5
5
  require "eitil_wrapper/scopes"
6
6
  require "eitil_wrapper/routes"
7
- require "eitil_wrapper/decorators"
7
+ require "eitil_wrapper/decorators"
8
+ require "eitil_wrapper/request_logger"
@@ -2,6 +2,9 @@
2
2
  # somehow leads to errors in the initialization process. Ideally, this code would be
3
3
  # defined in eitil_wrapper/jobs/single_method_job.rb and dispatched in eitil_wrapper/railtie.rb
4
4
 
5
+ # require "eitil_wrapper/railtie" to run the dynamic dispatch as an init hook during boot
6
+ require "eitil_wrapper/railtie"
7
+
5
8
  module EitilWrapper
6
9
  module CreateSingleMethodJob
7
10
  end
@@ -1,22 +1,17 @@
1
1
 
2
- require "rails"
3
- require "eitil_wrapper"
4
-
5
2
  module EitilWrapper
6
3
 
7
4
  class Railtie < Rails::Railtie
8
5
 
6
+ # Dynamic dispatching after initialization of Rails classes.
7
+
9
8
  initializer "my_railtie.configure_rails_initialization", options: :after do |app|
10
9
 
11
- # Dynamic dispatching after initialization of Rails classes.
12
10
 
13
- # Scopes
14
-
15
11
  if Object.const_defined?('EitilWrapper::Scopes::DefaultScopes')
16
12
  ::ApplicationRecord.send(:extend, EitilWrapper::Scopes::DefaultScopes)
17
13
  end
18
14
 
19
- # Jobs
20
15
 
21
16
  if Object.const_defined?('EitilWrapper::CreateSingleMethodJob')
22
17
 
@@ -44,6 +39,28 @@ module EitilWrapper
44
39
  object.send _method, *args, **kwargs
45
40
  end; end; end; end
46
41
 
42
+
43
+ if Object.const_defined?('EitilWrapper::RequestLogger::CreateLoggerJob')
44
+
45
+ module ::EitilWrapper
46
+ module RequestLogger
47
+ class LoggerJob < ::ApplicationJob
48
+
49
+ def perform(logger_object)
50
+
51
+ # set path for logger
52
+ $request_logger_path ||= "#{Rails.root}/log/request_logger.log"
53
+
54
+ # create logger, if not present
55
+ if Dir[$request_logger_path].blank? || $request_logger.blank?
56
+ $request_logger = Logger.new($request_logger_path)
57
+ end
58
+
59
+ # add logger_object to logger
60
+ $request_logger.info(logger_object)
61
+
62
+ end; end; end; end; end
63
+
47
64
  end
48
65
  end
49
66
  end