eitil 1.1.1 → 1.1.6

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2b08b15e6b8d62cb06ba02b964c2996d06a2ab6a0384a3a6767d11aab994284b
4
- data.tar.gz: e8bc13ea50e38201fae4272419b04f82c79ad6f2a4e7179055cc88bfcdff006a
3
+ metadata.gz: 56c74ebd746f3df95bb5db69eea9c32c894c3a360c4f3da75d2fd5e776834800
4
+ data.tar.gz: a61655e6fab7305708443fe00918513cf42ebd04bddf9f5114b7f346edc8a347
5
5
  SHA512:
6
- metadata.gz: ff6a6f68bb479e8aa3c0e3ef71aedb34261da883913ca822d199527a605bd5bf0b94d62dff061ac5cfeea62e8e7f5cb9f39244813cdc9ba4af0bdf7b804ee1b4
7
- data.tar.gz: 11763dbe1d14866880c06827601a0f4bf0c7bcc7fa460e0d76a7ee40b9819ad04afe7bf0a7c0cce1cbd7fc90a638ec3b4c1d46e301c8a75eb847b0e5157beddb
6
+ metadata.gz: 247df55a479fa73e45cba14dc6dd902b8e334d7ec4f9faa4a67142015489498abbd1a17b3f08053326837e47677e1886a5e2663e3d496ae0e98ba5a20feffefc
7
+ data.tar.gz: 5844f97ccf79c3ccb7e4c9f7724fc2b9ff005e51e703477d4734b692b7180e4257fb81744a7a12ed4b292ab793fecb89f6d5f95d4f4866ddca6524ba4c57aeba
data/eitil_core/README.md CHANGED
@@ -10,10 +10,26 @@ EitilCore extends the core classes of Ruby and Rails.
10
10
 
11
11
  ```ruby
12
12
 
13
- require "eitil_core/application_controller"
13
+ require "eitil_core/active_record"
14
14
 
15
15
  ```
16
16
 
17
+ ```ruby
18
+ # require "eitil_core/active_record/hash_to_relation"
19
+
20
+ [].to_relation
21
+ # converts an array of ActiveRecord instances to an ActiveRecord_Relation instance
22
+ # call as: [#<instance1>,<instance2>].to_relation
23
+ ```
24
+
25
+ ## ApplicationController
26
+
27
+ ```ruby
28
+
29
+ require "eitil_core/application_controller"
30
+ require "eitil_core/application_controller/permit_model_atts"
31
+ ```
32
+
17
33
  ```ruby
18
34
  # require "eitil_core/application_controller/slice_params"
19
35
 
@@ -21,6 +37,11 @@ slice_params(*args)
21
37
  # slices request params, converts them to JSON and symbolizes the keys
22
38
  # call as: slice_params :id, :user
23
39
  # => { id: 1, user: 69 }
40
+
41
+ permit_model_atts(*models, include: nil, except: nil)
42
+ # calls params.permit and automatically permits the columns of all given models (one or more)
43
+ # also accepts additional permits (include: nil) or allows you to reject column values (except: nil)
44
+ # call as: params.permit_model_atts(BillingInfo, BillingIntegration, except: :credit_card)
24
45
  ```
25
46
 
26
47
 
@@ -214,6 +235,49 @@ safe_to_i
214
235
  ```
215
236
 
216
237
 
238
+ ## Formatters
239
+
240
+ ```ruby
241
+
242
+ require "eitil_core/formatters"
243
+
244
+ ```
245
+
246
+ ```ruby
247
+ # require "eitil_core/formatters/sql"
248
+
249
+ Date.today.strfsql
250
+ # => "2021-06-23"
251
+
252
+ Date.today.strfsql(:date)
253
+ # => "2021-06-23"
254
+
255
+ DateTime.now.strfsql
256
+ # => "2021-06-23 13:15:37.945083"
257
+
258
+ DateTime.now.strfsql(:datetime)
259
+ # => "2021-06-23 13:15:37.945083"
260
+
261
+ DateTime.now.strfsql(:date)
262
+ # => "2021-06-23"
263
+
264
+ DateTime.now.strfsql(:time)
265
+ # => "13:16:23"
266
+
267
+ Time.now.strfsql
268
+ # => "13:16:23"
269
+
270
+ Time.now.strfsql(:datetime)
271
+ # => "2021-06-23 13:15:37.945083"
272
+
273
+ Time.now.strfsql(:date)
274
+ # => "2021-06-23"
275
+
276
+ Time.now.strfsql(:time)
277
+ # => "13:16:23"
278
+ ```
279
+
280
+
217
281
  ## Hash
218
282
 
219
283
  ```ruby
@@ -8,9 +8,11 @@ require "eitil_core/datetime"
8
8
 
9
9
  # multi class patches
10
10
  require "eitil_core/type_checkers"
11
+ require "eitil_core/formatters"
11
12
  require "eitil_core/mocks"
12
13
 
13
14
  # rails class patches
15
+ require "eitil_core/active_record"
14
16
  require "eitil_core/application_record"
15
17
  require "eitil_core/application_controller"
16
18
 
@@ -0,0 +1,2 @@
1
+
2
+ require "eitil_core/active_record/hash_to_relation"
@@ -0,0 +1,27 @@
1
+
2
+ # require "eitil_core/active_record/hash_to_relation"
3
+
4
+ require "eitil_core/errors/raise_error"
5
+
6
+ class Array
7
+
8
+ def to_relation
9
+
10
+ return self unless self.present?
11
+
12
+ unless self.all? { |item| item.class.ancestors.include? ApplicationRecord }
13
+ raise_error "InvalidArrayError", ".to_relation requires that all array items are model instances"
14
+ end
15
+
16
+ unless self.each_cons(2).all? { |el1, el2| el1.class == el2.class }
17
+ raise_error "InvalidArrayError", ".to_relation requires that all array items are instances of the same model"
18
+ end
19
+
20
+ _class = self.first.class
21
+ ids = self.map(&:id)
22
+
23
+ return _class.where(id: ids)
24
+
25
+ end
26
+
27
+ end
@@ -1,2 +1,3 @@
1
1
 
2
2
  require "eitil_core/application_controller/slice_params"
3
+ require "eitil_core/application_controller/permit_model_atts"
@@ -0,0 +1,27 @@
1
+
2
+ # require "eitil_core/application_controller/permit_model_atts"
3
+
4
+ module ActionController
5
+ class Parameters
6
+
7
+ def permit_model_atts(*models, include: nil, except: nil)
8
+
9
+ models = models.is_a?(Array) ? models : [models]
10
+ except = except.is_a?(Array) ? except : [except]
11
+ include = include.is_a?(Array) ? include : [include]
12
+
13
+ columns = models.map do |model|
14
+ model.columns_hash.keys.map &:to_sym
15
+ end.flatten.uniq
16
+
17
+ default_reject = %i( id updated_at created_at )
18
+ given_reject = except.map { |key| key&.to_sym }
19
+ accepted_values = columns + include - default_reject - given_reject
20
+
21
+ return self.permit(*accepted_values)
22
+ end
23
+
24
+ end
25
+ end
26
+
27
+
@@ -2,3 +2,4 @@
2
2
  require "eitil_core/application_record/where_like"
3
3
  require "eitil_core/application_record/find_by_like"
4
4
  require "eitil_core/application_record/all_associations"
5
+ require "eitil_core/application_record/model_atts"
@@ -0,0 +1,19 @@
1
+
2
+ # require "eitil_core/application_record/model_atts"
3
+
4
+ # require "eitil_core/railtie" to run the dynamic dispatch as an init hook during boot
5
+ require "eitil_core/railtie"
6
+
7
+ module EitilCore
8
+ module ApplicationRecord
9
+ module ModelAtts
10
+
11
+ def model_atts
12
+ columns = self.columns_hash.keys.map(&:to_sym)
13
+ reject = %i( id updated_at created_at )
14
+ columns - reject
15
+ end
16
+
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,4 @@
1
+
2
+ # require "eitil_core/formatters"
3
+
4
+ require "eitil_core/formatters/sql"
@@ -0,0 +1,72 @@
1
+
2
+ # require "eitil_core/formatters/sql"
3
+
4
+
5
+ class Date
6
+
7
+ def strfsql(type = :date)
8
+
9
+ type = type.kind_of?(String) ? type.to_sym : type
10
+
11
+ case type
12
+
13
+ when :date
14
+ return self.strftime "%Y-%m-%d"
15
+
16
+ end
17
+ return
18
+
19
+ end
20
+
21
+ end
22
+
23
+
24
+ class DateTime
25
+
26
+ def strfsql(type = :datetime)
27
+
28
+ type = type.kind_of?(String) ? type.to_sym : type
29
+
30
+ case type
31
+
32
+ when :datetime
33
+ return self.strftime "%Y-%m-%d %H:%M:%S.%6N"
34
+
35
+ when :date
36
+ return self.strftime "%Y-%m-%d"
37
+
38
+ when :time
39
+ return self.strftime "%H:%M:%S"
40
+
41
+ end
42
+ return
43
+
44
+ end
45
+
46
+ end
47
+
48
+
49
+ class Time
50
+
51
+ def strfsql(type = :time)
52
+
53
+ type = type.kind_of?(String) ? type.to_sym : type
54
+
55
+ case type
56
+
57
+ when :datetime
58
+ return self.strftime "%Y-%m-%d %H:%M:%S.%6N"
59
+
60
+ when :date
61
+ return self.strftime "%Y-%m-%d"
62
+
63
+ when :time
64
+ return self.strftime "%H:%M:%S"
65
+
66
+ end
67
+ return
68
+
69
+ end
70
+
71
+ end
72
+
@@ -21,6 +21,10 @@ module EitilCore
21
21
  ::ApplicationRecord.send(:extend, EitilCore::ApplicationRecord::AllAssociations)
22
22
  end
23
23
 
24
+ if Object.const_defined?('EitilCore::ApplicationRecord::ModelAtts')
25
+ ::ApplicationRecord.send(:extend, EitilCore::ApplicationRecord::ModelAtts)
26
+ end
27
+
24
28
  # ApplicationController
25
29
 
26
30
  if Object.const_defined?('EitilCore::ApplicationController::SliceParams')
@@ -17,6 +17,7 @@ require_relative "application_exporter/setters"
17
17
  require_relative "application_exporter/selectors"
18
18
  require_relative "application_exporter/lookups"
19
19
  require_relative "application_exporter/infos"
20
+ require_relative "application_exporter/log_state"
20
21
 
21
22
  # the AutoSum module, which is a seperately functioning module (service)
22
23
  require_relative "application_exporter/auto_sum"
@@ -6,13 +6,16 @@ module EitilIntegrate::RubyXL
6
6
  class << self
7
7
 
8
8
  def format_data
9
- format_time_strings
9
+ # format_time_strings
10
10
  format_ints_to_floats
11
11
  end
12
12
 
13
- def format_time_strings
14
- @hash.transform_values! { |array| array.map { |item| incomplete_time_string?(item) ? "#{item}:00" : item } }
15
- end
13
+ # outcommented method in favour of AutoSum#chronic_sum_array: no longer accept days, since the method excepts
14
+ # either hh:mm or hh:mm:ss
15
+
16
+ # def format_time_strings
17
+ # @hash.transform_values! { |array| array.map { |item| incomplete_time_string?(item) ? "#{item}:00" : item } }
18
+ # end
16
19
 
17
20
  def incomplete_time_string?(string)
18
21
  string.is_a?(String) && string.length == 5 && string.scan(/\d{2}:\d{2}/)
@@ -22,15 +22,30 @@ module EitilIntegrate::RubyXL
22
22
  end
23
23
 
24
24
  def chronic_sum_array(array)
25
- sum = array.map { |item| ChronicDuration.parse(item) }.compact.sum
26
- hours = format_time(sum / (60 * 60))
27
- sum = sum % (60 * 60)
28
- minutes = format_time(sum / 60)
29
- seconds = format_time(sum % 60)
30
-
31
- # currently doesn't return seconds, since those will never
32
- # be set (?) and screw the consistency of data formatting
33
- ["#{hours}:#{minutes}"]
25
+
26
+ #total minutes, hours and days
27
+ tm, th, td = [0]*3
28
+
29
+ array.each do |time_string|
30
+
31
+ # add empty 0's, to avoid defining nil values when time values are absent
32
+ h, m, s = *time_string.split(':').map(&:to_i), *[0]*3
33
+ tm += m; th += h
34
+
35
+ end
36
+
37
+ # parsing times into maxes (60 m, 24 h, ∞ days)
38
+ th += tm / 60
39
+ tm = tm % 60
40
+ td += th / 24
41
+ th = th % 24
42
+
43
+ # formatting strings
44
+ sd = td.to_s
45
+ sh = th.to_s.rjust(2,'0')
46
+ sm = tm.to_s.rjust(2,'0')
47
+
48
+ [[sd, sh, sm].join(':')]
34
49
  end
35
50
 
36
51
  def format_time(time)
@@ -34,6 +34,7 @@ module EitilIntegrate::RubyXL
34
34
 
35
35
  def process_export
36
36
  style_file
37
+ log_state
37
38
  save_file
38
39
  end
39
40
 
@@ -4,15 +4,13 @@
4
4
  require "eitil_core/setters/set_ivars"
5
5
  require "eitil_core/argument_helpers/all_kwargs_to_ivars"
6
6
 
7
- # EitilIntegrate::RubyXL::ApplicationExporter
8
-
9
7
  module EitilIntegrate
10
8
  module RubyXL
11
9
  class ApplicationExporter
12
10
 
13
11
  include ActionView::Helpers::NumberHelper
14
12
 
15
- attr_accessor :book, :sheet, :x, :y, :start_date, :end_date, :date_range
13
+ attr_accessor :book, :sheet, :x, :y, :start_date, :end_date, :date_range, :write_log
16
14
 
17
15
  def initialize(attributes={})
18
16
  all_kwargs_to_ivars binding, :attributes
@@ -0,0 +1,81 @@
1
+
2
+ # require "eitil_integrate/application_exporter/log_state"
3
+
4
+ module EitilIntegrate::RubyXL
5
+ class ApplicationExporter
6
+
7
+ private
8
+
9
+ def log_state
10
+
11
+ return unless write_log == true
12
+
13
+ # create_log_sheet
14
+ book.add_worksheet('log')
15
+
16
+ # manage sheets
17
+ previous_sheet = @sheet.sheet_name
18
+ @sheet = @book["log"]
19
+
20
+ # manage coordinates
21
+ previous_x = @x
22
+ @x = 0
23
+
24
+ # log everything we want to log
25
+ report_state
26
+
27
+ # style logs
28
+ style_first_x_columns_width(1, 40)
29
+ style_first_column_bold
30
+
31
+ # restore what was previously active
32
+ @sheet = @book[previous_sheet]
33
+ @x = previous_x
34
+
35
+ end
36
+
37
+ def report_state
38
+ instance_variables.each do |ivar|
39
+
40
+ variable_name = ivar.to_s
41
+ variable_value = format_value(instance_variable_get(ivar))
42
+
43
+ array_to_row [variable_name, variable_value]
44
+
45
+ end
46
+ end
47
+
48
+ # formatting the values to a human readably format is important, because otherwise Excel warns
49
+ # users on safety when opening the file.
50
+ def format_value(value)
51
+ value_class = value.class
52
+
53
+ if value_class == Hash
54
+ value.map {|k,v| "#{k.to_s.split('_').map(&:capitalize).join(' ')}: #{v}"}.join(' // ')
55
+
56
+ elsif value_class == Array && value.all? { |item| item.class.superclass == ApplicationRecord }
57
+ "#{value.class} #{value.map(&:id).join(', ')}"
58
+
59
+ elsif value_class.superclass == ApplicationRecord
60
+ "#{value.class} ##{value.id}"
61
+
62
+ elsif value_class.superclass == ActiveRecord::Relation
63
+ "#{value.class.to_s.split('::').first} #{value.ids.to_s.delete('[]')}"
64
+
65
+ elsif value_class.superclass == ActiveRecord::Associations::CollectionProxy
66
+ "#{value.class.to_s.split('::').first} #{value.ids.to_s.delete('[]')}"
67
+
68
+ elsif value_class == RubyXL::Workbook
69
+ value_class.name
70
+
71
+ elsif value_class == RubyXL::Worksheet
72
+ value_class.name
73
+
74
+ else
75
+ value.to_s
76
+
77
+ end
78
+ end
79
+
80
+ end
81
+ end
data/lib/eitil/all.rb CHANGED
@@ -7,7 +7,7 @@ Eitil::Layers.each do |layer|
7
7
  begin
8
8
  require "#{layer}/railtie"
9
9
  require "#{layer}"
10
- puts "succesfully required #{layer} and #{layer}/railtie"
10
+ puts "succesfully required #{layer} and #{layer}/railtie" if Rails.env.development?
11
11
 
12
12
  rescue LoadError => e
13
13
  puts "failed to require #{layer} and #{layer}/railtie"
data/lib/eitil/railtie.rb CHANGED
@@ -1,6 +1,4 @@
1
1
 
2
- require 'eitil/railtie'
3
-
4
2
  # Constants
5
3
 
6
4
  module Eitil
@@ -10,16 +8,20 @@ module Eitil
10
8
 
11
9
  end
12
10
 
13
-
14
11
  # Configuration
15
12
 
16
13
  module Eitil
17
14
 
18
15
  class Railtie < ::Rails::Railtie
19
16
 
20
- # Add lib dirs to $LOAD_PATH, making them available in your main app.
21
17
  Eitil::Layers.each do |layer|
18
+
19
+ # Add lib dirs to $LOAD_PATH, making them available in your main app.
22
20
  $LOAD_PATH << "#{Eitil::Root}/#{layer}/lib"
21
+
22
+ # Load railtie into main app, enabling on the fly inclusion of dispatches.
23
+ require "#{layer}/railtie"
24
+
23
25
  end
24
26
 
25
27
  end
data/lib/eitil/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module Eitil
2
2
 
3
- VERSION = '1.1.1'
3
+ VERSION = '1.1.6'
4
4
 
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: eitil
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.1
4
+ version: 1.1.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jurriaan Schrofer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-06-22 00:00:00.000000000 Z
11
+ date: 2021-06-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -82,11 +82,15 @@ files:
82
82
  - Rakefile
83
83
  - eitil_core/README.md
84
84
  - eitil_core/lib/eitil_core.rb
85
+ - eitil_core/lib/eitil_core/active_record.rb
86
+ - eitil_core/lib/eitil_core/active_record/hash_to_relation.rb
85
87
  - eitil_core/lib/eitil_core/application_controller.rb
88
+ - eitil_core/lib/eitil_core/application_controller/permit_model_atts.rb
86
89
  - eitil_core/lib/eitil_core/application_controller/slice_params.rb
87
90
  - eitil_core/lib/eitil_core/application_record.rb
88
91
  - eitil_core/lib/eitil_core/application_record/all_associations.rb
89
92
  - eitil_core/lib/eitil_core/application_record/find_by_like.rb
93
+ - eitil_core/lib/eitil_core/application_record/model_atts.rb
90
94
  - eitil_core/lib/eitil_core/application_record/where_like.rb
91
95
  - eitil_core/lib/eitil_core/argument_helpers.rb
92
96
  - eitil_core/lib/eitil_core/argument_helpers/all_args_to_ivars.rb
@@ -105,6 +109,8 @@ files:
105
109
  - eitil_core/lib/eitil_core/errors/raise_error.rb
106
110
  - eitil_core/lib/eitil_core/float.rb
107
111
  - eitil_core/lib/eitil_core/float/safe_to_i.rb
112
+ - eitil_core/lib/eitil_core/formatters.rb
113
+ - eitil_core/lib/eitil_core/formatters/sql.rb
108
114
  - eitil_core/lib/eitil_core/hash.rb
109
115
  - eitil_core/lib/eitil_core/hash/auto_dig.rb
110
116
  - eitil_core/lib/eitil_core/lookups.rb
@@ -138,6 +144,7 @@ files:
138
144
  - eitil_integrate/lib/eitil_integrate/application_exporter/helpers.rb
139
145
  - eitil_integrate/lib/eitil_integrate/application_exporter/infos.rb
140
146
  - eitil_integrate/lib/eitil_integrate/application_exporter/initialize.rb
147
+ - eitil_integrate/lib/eitil_integrate/application_exporter/log_state.rb
141
148
  - eitil_integrate/lib/eitil_integrate/application_exporter/lookups.rb
142
149
  - eitil_integrate/lib/eitil_integrate/application_exporter/selectors.rb
143
150
  - eitil_integrate/lib/eitil_integrate/application_exporter/setters.rb