eitil 1.1.1 → 1.1.6

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: 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