eitil 1.1.37 → 1.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (33) hide show
  1. checksums.yaml +4 -4
  2. data/eitil_core/lib/eitil_core/argument_helpers/args_to_h.rb +1 -1
  3. data/eitil_core/lib/eitil_core/argument_helpers/args_to_h_bang.rb +1 -1
  4. data/eitil_support/lib/eitil_support/stacktrace/audit.rb +4 -1
  5. data/eitil_wrapper/lib/eitil_wrapper/callbacks/helper_methods.rb +2 -0
  6. data/eitil_wrapper/lib/eitil_wrapper/scopes/default_scopes.rb +2 -0
  7. data/lib/eitil/railtie.rb +47 -8
  8. data/lib/eitil/version.rb +1 -1
  9. data/spec/eitil_core/argument_helpers/all_args_to_ivars_bang_spec.rb +19 -0
  10. data/spec/eitil_core/argument_helpers/all_args_to_ivars_spec.rb +19 -0
  11. data/spec/eitil_core/argument_helpers/all_kwargs_to_ivars_bang_spec.rb +34 -0
  12. data/spec/eitil_core/argument_helpers/all_kwargs_to_ivars_spec.rb +34 -0
  13. data/spec/eitil_core/argument_helpers/args_to_h_bang_spec.rb +16 -0
  14. data/spec/eitil_core/argument_helpers/args_to_h_spec.rb +16 -0
  15. data/spec/eitil_core/argument_helpers/args_to_ivars_bang_spec.rb +49 -0
  16. data/spec/eitil_core/argument_helpers/args_to_ivars_spec.rb +49 -0
  17. data/spec/eitil_core/array/map_strings_spec.rb +24 -0
  18. data/spec/eitil_core/array/slice_hashes_spec.rb +13 -0
  19. data/spec/eitil_core/datetime/prettify_spec.rb +11 -0
  20. data/spec/eitil_core/errors/raise_error_spec.rb +33 -0
  21. data/spec/eitil_core/float/safe_to_i_spec.rb +24 -0
  22. data/spec/eitil_core/formatters/duck_set_spec.rb +139 -0
  23. data/spec/eitil_core/formatters/sql_spec.rb +90 -0
  24. data/spec/eitil_core/hash/auto_dig_spec.rb +17 -0
  25. data/spec/eitil_core/hash/transform_string_values_spec.rb +25 -0
  26. data/spec/eitil_core/safe_executions/safe_call.rb +23 -0
  27. data/spec/eitil_core/safe_executions/safe_send.rb +25 -0
  28. data/spec/eitil_core/setters/set_ivars_spec.rb +28 -0
  29. data/spec/eitil_core/string/strip_base64_header_spec.rb +22 -0
  30. data/spec/eitil_core/string/to_filename_spec.rb +34 -0
  31. data/spec/eitil_core/type_checkers/is_num_or_nan_spec.rb +146 -0
  32. data/spec/spec_helper.rb +55 -0
  33. metadata +68 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b1ab2c62c13503c0afc55aea6663a381a4d7ad81a363e9131a2d185ead576997
4
- data.tar.gz: 44faf8bb9335b81c978ba1a8c6a6cd105d4980a2c982874ce69fa203acce4ac5
3
+ metadata.gz: 591930a48096cb26f7ccc1b0cac2ef947fbb98c9598e87a0e81d4dd8fdc90dda
4
+ data.tar.gz: 7b96c9a9eee4295e46e46c28e1a41a51e90908506eca9153a8f6d88c3812cd9b
5
5
  SHA512:
6
- metadata.gz: fc48bffc1b39584a556e0a742095b56fbd29e22559280c873b7654572ae48c59eb5382bb3d2eddcee184b5f65c9033271c98383cfe04625a633550e8db964a27
7
- data.tar.gz: a2f8cd2ca05de73290728093d068e91dda6113e77de2f358e916b1c3425fdf2d1184ccccf55ab2aa6737f8c2751fb644cf850b8919c57d7ce3c07fde35940e87
6
+ metadata.gz: 218952e25bec69b4677ff12cff4b597266cd1538a4c01a806f6dafcbc6e6ca0e18a474db2a07f33d13bc82539ff282a92ff4ae3f13f13184c64f7d25d58d1483
7
+ data.tar.gz: '010814956180e66acc2fc5669d666201e617563fde6fdb04d2ba83b801c7a04d7d3ada715f7965dfbf2bb7df04736ccd770a1c0c401a1f3b70cf3630762d46bc'
@@ -6,7 +6,7 @@ Kernel.module_eval do
6
6
  def args_to_h(local_binding, *local_vars)
7
7
 
8
8
  local_vars.reject { |lvar| lvar == local_binding }
9
- .reject { |lvar| lvar.to_s.starts_with?('_') }
9
+ .reject { |lvar| lvar.to_s.start_with?('_') }
10
10
  .map { |lvar| { "#{lvar}": local_binding.local_variable_get(lvar) } }
11
11
  .inject &:merge
12
12
 
@@ -8,7 +8,7 @@ Kernel.module_eval do
8
8
 
9
9
  def args_to_h!(*local_vars)
10
10
 
11
- local_vars.reject { |lvar| lvar.to_s.starts_with?('_') }
11
+ local_vars.reject { |lvar| lvar.to_s.start_with?('_') }
12
12
  .map { |lvar| { "#{lvar}": binding.of_caller(2).local_variable_get(lvar) } }
13
13
  .inject &:merge
14
14
 
@@ -10,7 +10,10 @@ module EitilSupport::Stack::Audit
10
10
  # .report_app_calls filters the stack on calls whose path include "/app/", since
11
11
  # audits otherwise tend to grow very big, which might endanger the database.
12
12
  stacktrace = EitilSupport::Stack.new.report_app_calls
13
- self.audits.last.update(stacktrace: stacktrace)
13
+
14
+ # Safe operator in order to avoid raising a NoMetodError when the record
15
+ # has no audits yet.
16
+ self.audits.last&.update(stacktrace: stacktrace)
14
17
  end
15
18
 
16
19
  end
@@ -14,6 +14,8 @@ module EitilWrapper
14
14
 
15
15
  def inherited(subclass)
16
16
  super
17
+
18
+ return if Eitil.skip_callback_helper_methods_for_models.include?(subclass.to_s.to_sym)
17
19
  subclass.use_eitil_callback_helper_methods
18
20
 
19
21
  rescue => e
@@ -36,6 +36,8 @@ module EitilWrapper
36
36
 
37
37
  def inherited(subclass)
38
38
  super
39
+
40
+ return if Eitil.skip_default_scopes_for_models.include?(subclass.to_s.to_sym)
39
41
  subclass.use_eitil_scopes
40
42
 
41
43
  rescue => e
data/lib/eitil/railtie.rb CHANGED
@@ -1,4 +1,6 @@
1
1
 
2
+
3
+
2
4
  # Constants
3
5
 
4
6
  module Eitil
@@ -9,8 +11,53 @@ module Eitil
9
11
 
10
12
  end
11
13
 
14
+
15
+
12
16
  # Configuration
13
17
 
18
+ module Eitil
19
+ class Railtie < ::Rails::Railtie
20
+
21
+ # The following configuration has its own special place in the boot sequence:
22
+ # on the one hand, it should run before the initialization of Eitil (gem), but
23
+ # read config assigned by the main app – which is only loaded AFTER all gems have
24
+ # been initialized.
25
+
26
+ # Therefore, we only require the specified file from the main app, after defining
27
+ # the possible configurations for the Eitil railtie. This way we escape the boot
28
+ # sequence's dedault order.
29
+
30
+ config.before_initialize do |eitil|
31
+
32
+ Eitil.mattr_accessor :controller_ivars,
33
+ :skip_default_scopes_for_models,
34
+ :skip_callback_helper_methods_for_models
35
+
36
+ Eitil.controller_ivars ||= []
37
+ Eitil.skip_default_scopes_for_models ||= []
38
+ Eitil.skip_callback_helper_methods_for_models ||= []
39
+
40
+ def Eitil.set_config(&block)
41
+ yield Eitil
42
+ end
43
+
44
+ config_path = Rails.root + 'config/initializers/eitil.rb'
45
+
46
+ if File.exists? config_path
47
+ puts "Loading Eitil config from #{config_path}..."
48
+ load config_path
49
+ else
50
+ puts "Eitil config not found at #{config_path}, resorting to defaults..."
51
+ end
52
+
53
+ end
54
+ end
55
+ end
56
+
57
+
58
+
59
+ # Loading
60
+
14
61
  module Eitil
15
62
 
16
63
  class Railtie < ::Rails::Railtie
@@ -27,12 +74,4 @@ module Eitil
27
74
 
28
75
  end
29
76
 
30
- mattr_accessor :controller_ivars
31
-
32
- self.controller_ivars ||= []
33
-
34
- def self.set_config(&block)
35
- yield self
36
- end
37
-
38
77
  end
data/lib/eitil/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module Eitil
2
2
 
3
- VERSION = '1.1.37'
3
+ VERSION = '1.2.1'
4
4
 
5
5
  end
@@ -0,0 +1,19 @@
1
+
2
+ RSpec.describe "Kernel#all_args_to_ivars!" do
3
+
4
+ it "should set all positional arguments as instance variables" do
5
+
6
+ def test_method(a, b, c)
7
+ all_args_to_ivars!
8
+ end
9
+
10
+ test_method(1, "two", :three)
11
+
12
+ expect(@a).to eq 1
13
+ expect(@b).to eq "two"
14
+ expect(@c).to eq :three
15
+ expect(@d).to be_nil
16
+
17
+ end
18
+
19
+ end
@@ -0,0 +1,19 @@
1
+
2
+ RSpec.describe "Kernel#all_args_to_ivars" do
3
+
4
+ it "should set all positional arguments as instance variables" do
5
+
6
+ def test_method(a, b, c)
7
+ all_args_to_ivars binding
8
+ end
9
+
10
+ test_method(1, "two", :three)
11
+
12
+ expect(@a).to eq 1
13
+ expect(@b).to eq "two"
14
+ expect(@c).to eq :three
15
+ expect(@d).to be_nil
16
+
17
+ end
18
+
19
+ end
@@ -0,0 +1,34 @@
1
+
2
+ RSpec.describe "Kernel#all_kwargs_to_ivars!" do
3
+
4
+ it "should set all hash keys, nested within a positional hash, to instance variables" do
5
+
6
+ def test_method(a, b, c, kwargs)
7
+ all_kwargs_to_ivars! :kwargs
8
+ end
9
+
10
+ test_method(1, "two", :three, {a: 0, b: "not_two", c: :not_three})
11
+
12
+ expect(@a).to eq 0
13
+ expect(@b).to eq "not_two"
14
+ expect(@c).to eq :not_three
15
+ expect(@d).to be_nil
16
+
17
+ end
18
+
19
+ it "should set all hash keys, nested within a keyword hash, to instance variables" do
20
+
21
+ def test_method(a, b, c, kwargs:)
22
+ all_kwargs_to_ivars! :kwargs
23
+ end
24
+
25
+ test_method(1, "two", :three, kwargs: {a: 0, b: "not_two", c: :not_three})
26
+
27
+ expect(@a).to eq 0
28
+ expect(@b).to eq "not_two"
29
+ expect(@c).to eq :not_three
30
+ expect(@d).to be_nil
31
+
32
+ end
33
+
34
+ end
@@ -0,0 +1,34 @@
1
+
2
+ RSpec.describe "Kernel#all_kwargs_to_ivars" do
3
+
4
+ it "should set all hash keys, nested within a positional hash, to instance variables" do
5
+
6
+ def test_method(a, b, c, kwargs)
7
+ all_kwargs_to_ivars binding, :kwargs
8
+ end
9
+
10
+ test_method(1, "two", :three, {a: 0, b: "not_two", c: :not_three})
11
+
12
+ expect(@a).to eq 0
13
+ expect(@b).to eq "not_two"
14
+ expect(@c).to eq :not_three
15
+ expect(@d).to be_nil
16
+
17
+ end
18
+
19
+ it "should set all hash keys, nested within a keyword hash, to instance variables" do
20
+
21
+ def test_method(a, b, c, kwargs:)
22
+ all_kwargs_to_ivars binding, :kwargs
23
+ end
24
+
25
+ test_method(1, "two", :three, kwargs: {a: 0, b: "not_two", c: :not_three})
26
+
27
+ expect(@a).to eq 0
28
+ expect(@b).to eq "not_two"
29
+ expect(@c).to eq :not_three
30
+ expect(@d).to be_nil
31
+
32
+ end
33
+
34
+ end
@@ -0,0 +1,16 @@
1
+
2
+ RSpec.describe "Kernel#args_to_h!" do
3
+
4
+ it "should create an hash, with the local variables as key / value pairs" do
5
+
6
+ a = 1
7
+ b = "two"
8
+ c = :three
9
+
10
+ created_hash = args_to_h! :a, :c
11
+ expected_hash = {a: 1, c: :three}
12
+
13
+ expect(created_hash).to eq expected_hash
14
+
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+
2
+ RSpec.describe "Kernel#args_to_h" do
3
+
4
+ it "should create an hash, with the local variables as key / value pairs" do
5
+
6
+ a = 1
7
+ b = "two"
8
+ c = :three
9
+
10
+ created_hash = args_to_h(binding, :a, :c)
11
+ expected_hash = {a: 1, c: :three}
12
+
13
+ expect(created_hash).to eq expected_hash
14
+
15
+ end
16
+ end
@@ -0,0 +1,49 @@
1
+
2
+ RSpec.describe "Kernel#args_to_ivars!" do
3
+
4
+ it "should set the given positional arguments to instance variables" do
5
+
6
+ def test_method(a, b, c)
7
+ args_to_ivars! :a, :c
8
+ end
9
+
10
+ test_method(1, "two", :three)
11
+
12
+ expect(@a).to eq 1
13
+ expect(@b).to be_nil
14
+ expect(@c).to eq :three
15
+ expect(@d).to be_nil
16
+
17
+ end
18
+
19
+ it "should set the given keyword arguments to instance variables" do
20
+
21
+ def test_method(a:, b:, c:)
22
+ args_to_ivars! :a, :c
23
+ end
24
+
25
+ test_method(a: 1, b: "two", c: :three)
26
+
27
+ expect(@a).to eq 1
28
+ expect(@b).to be_nil
29
+ expect(@c).to eq :three
30
+ expect(@d).to be_nil
31
+
32
+ end
33
+
34
+ it "should set the given local variables to instance variables" do
35
+
36
+ a = 1
37
+ b = "two"
38
+ c = :three
39
+
40
+ args_to_ivars! :a, :c
41
+
42
+ expect(@a).to eq 1
43
+ expect(@b).to be_nil
44
+ expect(@c).to eq :three
45
+ expect(@d).to be_nil
46
+
47
+ end
48
+
49
+ end
@@ -0,0 +1,49 @@
1
+
2
+ RSpec.describe "Kernel#args_to_ivars" do
3
+
4
+ it "should set the given positional arguments to instance variables" do
5
+
6
+ def test_method(a, b, c)
7
+ args_to_ivars binding, :a, :c
8
+ end
9
+
10
+ test_method(1, "two", :three)
11
+
12
+ expect(@a).to eq 1
13
+ expect(@b).to be_nil
14
+ expect(@c).to eq :three
15
+ expect(@d).to be_nil
16
+
17
+ end
18
+
19
+ it "should set the given keyword arguments to instance variables" do
20
+
21
+ def test_method(a:, b:, c:)
22
+ args_to_ivars binding, :a, :c
23
+ end
24
+
25
+ test_method(a: 1, b: "two", c: :three)
26
+
27
+ expect(@a).to eq 1
28
+ expect(@b).to be_nil
29
+ expect(@c).to eq :three
30
+ expect(@d).to be_nil
31
+
32
+ end
33
+
34
+ it "should set the given local variables to instance variables" do
35
+
36
+ a = 1
37
+ b = "two"
38
+ c = :three
39
+
40
+ args_to_ivars binding, :a, :c
41
+
42
+ expect(@a).to eq 1
43
+ expect(@b).to be_nil
44
+ expect(@c).to eq :three
45
+ expect(@d).to be_nil
46
+
47
+ end
48
+
49
+ end
@@ -0,0 +1,24 @@
1
+
2
+ RSpec.describe "Array#map_strings" do
3
+
4
+ it "should transforms all strings in infinite recursion" do
5
+
6
+ array = ["hey", ["hi", {a: "ho", b: {d: "he"}}]]
7
+ result = array.map_strings { |str| str.upcase }
8
+
9
+ expect(result).to eq ["HEY", ["HI", {a: "HO", b: {d: "HE"}}]]
10
+
11
+ end
12
+ end
13
+
14
+ RSpec.describe "Array#map_strings!" do
15
+
16
+ it "should transforms all strings in infinite recursion" do
17
+
18
+ array = ["hey", ["hi", {a: "ho", b: {d: "he"}}]]
19
+ array.map_strings! { |str| str.upcase }
20
+
21
+ expect(array).to eq ["HEY", ["HI", {a: "HO", b: {d: "HE"}}]]
22
+
23
+ end
24
+ end
@@ -0,0 +1,13 @@
1
+
2
+ RSpec.describe "Array#slice_hashes" do
3
+
4
+ it "should slice each hash in an array of hashes with the given keys" do
5
+
6
+ array = [{"a"=>1, "b"=>2, "c"=>3}, {"a"=>1, "b"=>2, "c"=>3}]
7
+ result = array.slice_hashes("a", "b")
8
+ expected = [{"a"=>1, "b"=>2}, {"a"=>1, "b"=>2}]
9
+
10
+ expect(result).to eq expected
11
+
12
+ end
13
+ end
@@ -0,0 +1,11 @@
1
+
2
+ RSpec.describe "DateTime#prettify" do
3
+
4
+ it "should represent a DateTime instance in the '%Y-%m-%d.%H:%M:%S' format" do
5
+
6
+ datetime = DateTime.parse("01-01-2020, 10:00:00, +0200")
7
+
8
+ expect(datetime.prettify).to eq "2020-01-01.10:00:00"
9
+
10
+ end
11
+ end
@@ -0,0 +1,33 @@
1
+
2
+ RSpec.describe "Kernel#raise_error" do
3
+
4
+ # Call specs directly on Kernel, which you would usually do implicit
5
+ # instead of explicit, in order to escape the RSpec namespace, which has
6
+ # it's own effects for raised errors
7
+
8
+ it "should define a new constant, if the error class does not yet exist" do
9
+
10
+ begin
11
+ Kernel.raise_error "ThisErrorWillProbablyNotExistError"
12
+ rescue
13
+ end
14
+
15
+ expect(Kernel.const_defined?('ThisErrorWillProbablyNotExistError')).to eq true
16
+
17
+ end
18
+
19
+ it "should call an existing constant, if the error class already exists" do
20
+
21
+ expect(Kernel.const_defined?('StandardError'))
22
+ initial_const_count = Module.constants.count
23
+
24
+ begin
25
+ Kernel.raise_error "StandardError"
26
+ rescue
27
+ end
28
+
29
+ expect(Module.constants.count).to eq initial_const_count
30
+
31
+ end
32
+
33
+ end
@@ -0,0 +1,24 @@
1
+
2
+ RSpec.describe "Float#safe_to_i" do
3
+
4
+ it "should convert a float to an integer, if the float is rounded (e.g. 7.0)" do
5
+
6
+ float = 7.0
7
+ result = float.safe_to_i
8
+
9
+ expect(result).to eq 7
10
+ expect(result).to be_a Integer
11
+
12
+ end
13
+
14
+ it "should not convert a float to an integer, if the float is not rounded (e.g. 7.1)" do
15
+
16
+ float = 7.1
17
+ result = float.safe_to_i
18
+
19
+ expect(result).to eq 7.1
20
+ expect(result).to be_a Float
21
+
22
+ end
23
+
24
+ end
@@ -0,0 +1,139 @@
1
+
2
+ RSpec.describe "Date.duck_set(object)" do
3
+
4
+ let(:date) { Date.duck_set(@object) }
5
+
6
+ it "should return the object, if the object is a Date instance" do
7
+ @object = Date.today
8
+ expect(date).to eq @object
9
+ expect(date).to be_a Date
10
+ end
11
+
12
+ it "should return a Date instance, if the object is a String instance" do
13
+ @object = "2020-01-01"
14
+ expect(@object).to be_a String
15
+ expect(date).to be_a Date
16
+ end
17
+
18
+
19
+ it "should return a Date instance, if the object is a DateTime instance" do
20
+ @object = DateTime.now
21
+ expect(@object).to be_a DateTime
22
+ expect(date).to be_a Date
23
+ end
24
+
25
+
26
+ it "should return a Date instance, if the object is a Time instance" do
27
+ @object = Time.now
28
+ expect(@object).to be_a Time
29
+ expect(date).to be_a Date
30
+ end
31
+
32
+
33
+ it "should raise an error, if the object's class is not one of: String, Date, DateTime, Time" do
34
+ @object = 2020
35
+ expect(@object).to be_a Integer
36
+ begin
37
+ error_raised = false
38
+ date
39
+ rescue
40
+ error_raised = true
41
+ end
42
+ expect(error_raised).to eq true
43
+ end
44
+
45
+ end
46
+
47
+
48
+ RSpec.describe "DateTime.duck_set(object)" do
49
+
50
+ let(:datetime) { DateTime.duck_set(@object) }
51
+
52
+ it "should return the object, if the object is a DateTime instance" do
53
+ @object = DateTime.now
54
+ expect(datetime).to eq @object
55
+ expect(datetime).to be_a DateTime
56
+ end
57
+
58
+ it "should return a DateTime instance, if the object is a String instance" do
59
+ @object = "2020-01-01"
60
+ expect(@object).to be_a String
61
+ expect(datetime).to be_a DateTime
62
+ end
63
+
64
+
65
+ it "should return a DateTime instance, if the object is a Date instance" do
66
+ @object = Date.today
67
+ expect(@object).to be_a Date
68
+ expect(datetime).to be_a DateTime
69
+ end
70
+
71
+
72
+ it "should return a DateTime instance, if the object is a Time instance" do
73
+ @object = Time.now
74
+ expect(@object).to be_a Time
75
+ expect(datetime).to be_a DateTime
76
+ end
77
+
78
+
79
+ it "should raise an error, if the object's class is not one of: String, DateTime, Date, Time" do
80
+ @object = 2020
81
+ expect(@object).to be_a Integer
82
+ begin
83
+ error_raised = false
84
+ datetime
85
+ rescue
86
+ error_raised = true
87
+ end
88
+ expect(error_raised).to eq true
89
+ end
90
+
91
+ end
92
+
93
+
94
+
95
+ RSpec.describe "Time.duck_set(object)" do
96
+
97
+ let(:time) { Time.duck_set(@object) }
98
+
99
+ it "should return the object, if the object is a Time instance" do
100
+ @object = Time.now
101
+ expect(time).to eq @object
102
+ expect(time).to be_a Time
103
+ end
104
+
105
+ it "should return a Time instance, if the object is a String instance" do
106
+ @object = "20:00"
107
+ expect(@object).to be_a String
108
+ expect(time).to be_a Time
109
+ end
110
+
111
+
112
+ it "should return a Time instance, if the object is a Date instance" do
113
+ @object = Date.today
114
+ expect(@object).to be_a Date
115
+ expect(time).to be_a Time
116
+ end
117
+
118
+
119
+ it "should return a Time instance, if the object is a DateTime instance" do
120
+ @object = DateTime.now
121
+ expect(@object).to be_a DateTime
122
+ expect(time).to be_a Time
123
+ end
124
+
125
+
126
+ it "should raise an error, if the object's class is not one of: String, DateTime, Date, Time" do
127
+ @object = 2020
128
+ expect(@object).to be_a Integer
129
+ begin
130
+ error_raised = false
131
+ time
132
+ rescue
133
+ error_raised = true
134
+ end
135
+ expect(error_raised).to eq true
136
+ end
137
+
138
+ end
139
+
@@ -0,0 +1,90 @@
1
+
2
+ RSpec.describe "Date#strfsql(type)" do
3
+
4
+ let(:date) { Date.parse('01-01-2020').strfsql(@type) }
5
+
6
+ it "should by default format a Date instance to '%Y-%m-%d'" do
7
+ date = Date.parse('01-01-2020').strfsql
8
+ expect(date).to eq '2020-01-01'
9
+ end
10
+
11
+ it "should format a Date instance to '%Y-%m-%d', if :date is given as type" do
12
+ @type = :date
13
+ expect(date).to eq '2020-01-01'
14
+ end
15
+
16
+ it "should simply return nil if an invalid type is given" do
17
+ @type = 666
18
+ expect(date).to be_nil
19
+ end
20
+
21
+ end
22
+
23
+
24
+ RSpec.describe "DateTime#strfsql(type)" do
25
+
26
+ let(:datetime) { DateTime.parse('01-01-2020').strfsql(@type) }
27
+
28
+ it "should by default format a DateTime instance to '%Y-%m-%d %H:%M:%S.%6N'" do
29
+ datetime = DateTime.parse('01-01-2020').strfsql
30
+ expect(datetime).to eq "2020-01-01 00:00:00.000000"
31
+ end
32
+
33
+ it "should format a DateTime instance to '%Y-%m-%d %H:%M:%S.%6N', if :datetime is given as type" do
34
+ @type = :datetime
35
+ expect(datetime).to eq "2020-01-01 00:00:00.000000"
36
+ end
37
+
38
+
39
+ it "should format a DateTime instance to '%Y-%m-%d', if :date is given as type" do
40
+ @type = :date
41
+ expect(datetime).to eq "2020-01-01"
42
+ end
43
+
44
+
45
+ it "should format a DateTime instance to '%H:%M:%S', if :time is given as type" do
46
+ @type = :time
47
+ expect(datetime).to eq "00:00:00"
48
+ end
49
+
50
+ it "should simply return nil if an invalid type is given" do
51
+ @type = 666
52
+ expect(datetime).to be_nil
53
+ end
54
+
55
+ end
56
+
57
+
58
+
59
+ RSpec.describe "Time#strfsql(type)" do
60
+
61
+ let(:time) { Time.parse('01-01-2020 20:00:00 +0200').strfsql(@type) }
62
+
63
+ it "should by default format a Time instance to '%Y-%m-%d %H:%M:%S.%6N'" do
64
+ time = Time.parse('01-01-2020 20:00:00 +0200').strfsql
65
+ expect(time).to eq "20:00:00"
66
+ end
67
+
68
+ it "should format a Time instance to '%Y-%m-%d %H:%M:%S.%6N', if :datetime is given as type" do
69
+ @type = :datetime
70
+ expect(time).to eq "2020-01-01 20:00:00.000000"
71
+ end
72
+
73
+
74
+ it "should format a Time instance to '%Y-%m-%d', if :date is given as type" do
75
+ @type = :date
76
+ expect(time).to eq "2020-01-01"
77
+ end
78
+
79
+
80
+ it "should format a Time instance to '%H:%M:%S', if :time is given as type" do
81
+ @type = :time
82
+ expect(time).to eq "20:00:00"
83
+ end
84
+
85
+ it "should simply return nil if an invalid type is given" do
86
+ @type = 666
87
+ expect(time).to be_nil
88
+ end
89
+
90
+ end
@@ -0,0 +1,17 @@
1
+
2
+ RSpec.describe "Hash#auto_dig" do
3
+
4
+ it "should recursively find the value for the given hash key" do
5
+ hash = {a: 1, b: {c: 2, d: {e: 3}}}
6
+ result = hash.auto_dig :e
7
+ expect(result).to eq 3
8
+ end
9
+
10
+
11
+ it "should return nil if the given hash key is not present" do
12
+ hash = {a: 1, b: {c: 2, d: {e: 3}}}
13
+ result = hash.auto_dig :f
14
+ expect(result).to be_nil
15
+ end
16
+
17
+ end
@@ -0,0 +1,25 @@
1
+
2
+ RSpec.describe "Hash#transform_string_values" do
3
+
4
+ it "should transforms all strings in infinite recursion" do
5
+ hash = {a: "hey", b: {c: "hi", d: ["ho"]}}
6
+ expected = {a: "HEY", b: {c: "HI", d: ["HO"]}}
7
+ result = hash.transform_string_values { |str| str.upcase }
8
+
9
+ expect(result).to eq expected
10
+ end
11
+
12
+ end
13
+
14
+
15
+ RSpec.describe "Hash#transform_string_values!" do
16
+
17
+ it "should transforms all strings in infinite recursion" do
18
+ hash = {a: "hey", b: {c: "hi", d: ["ho"]}}
19
+ expected = {a: "HEY", b: {c: "HI", d: ["HO"]}}
20
+
21
+ hash.transform_string_values! { |str| str.upcase }
22
+ expect(hash).to eq expected
23
+ end
24
+
25
+ end
@@ -0,0 +1,23 @@
1
+
2
+ # For some reason, the Kernel patches – which ruby mixes into Object – are not
3
+ # available to the tests, therefore load the file manually.
4
+ load (Eitil::Root + "/eitil_core/lib/eitil_core/safe_executions/safe_call.rb")
5
+
6
+ RSpec.describe "Object#safe_call" do
7
+
8
+ it "should return the block's yield value, if no error is raised" do
9
+ result = Object.new.safe_call { 1 + 1 }
10
+ expect(result).to eq 2
11
+ end
12
+
13
+ it "should by default return nil, if an error is raised" do
14
+ result = Object.new.safe_call { raise(StandardError) }
15
+ expect(result).to be_nil
16
+ end
17
+
18
+ it "should return the specified :return_value, if an error is raised" do
19
+ result = Object.new.safe_call(return_value: :something_else) { raise(StandardError) }
20
+ expect(result).to eq :something_else
21
+ end
22
+
23
+ end
@@ -0,0 +1,25 @@
1
+
2
+ # For some reason, the Kernel patches – which ruby mixes into string – are not
3
+ # available to the tests, therefore load the file manually.
4
+ load (Eitil::Root + "/eitil_core/lib/eitil_core/safe_executions/safe_send.rb")
5
+
6
+ RSpec.describe "Object#safe_send" do
7
+
8
+ let(:string) { "Hiya, Cowboy!" }
9
+
10
+ it "should return the method's return value, if no error is raised" do
11
+ result = string.safe_send(:upcase)
12
+ expect(result).to eq "HIYA, COWBOY!"
13
+ end
14
+
15
+ it "should by default return nil, if an error is raised" do
16
+ result = string.safe_send(:this_method_does_probably_not_exist)
17
+ expect(result).to be_nil
18
+ end
19
+
20
+ it "should return the specified :return_value, if an error is raised" do
21
+ result = string.safe_send(:this_method_does_probably_not_exist, return_value: :something_else)
22
+ expect(result).to eq :something_else
23
+ end
24
+
25
+ end
@@ -0,0 +1,28 @@
1
+
2
+ RSpec.describe "Object#set_ivars" do
3
+
4
+ def set_ivar_one
5
+ :one
6
+ end
7
+
8
+ def set_ivar_two
9
+ 2
10
+ end
11
+
12
+ it 'should call a method .set_#{ivar_name}, for every :ivar_name passed' do
13
+ set_ivars :ivar_one, :ivar_two
14
+ expect(@ivar_one).to eq :one
15
+ expect(@ivar_two).to eq 2
16
+ end
17
+
18
+ it "should return an array of symbols, which the names of all ivars being set" do
19
+ return_value = set_ivars :ivar_one, :ivar_two
20
+ expect(return_value).to eq [:ivar_one, :ivar_two]
21
+ end
22
+
23
+ it "should return an empty array, if no arguments are passed" do
24
+ expect(set_ivars).to eq []
25
+ end
26
+
27
+
28
+ end
@@ -0,0 +1,22 @@
1
+
2
+ RSpec.describe "String#strip_base64_header" do
3
+
4
+ let(:regex) { EitilStore::Regex::LeadingBase64Data }
5
+ let(:b64_string) { "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAfQAAADICAYAAAAeGRPoAAAgAElEQVR4Xu2dC8w0VXnH/8dLrfWKFbxHUYIGNICKVRuDWmxtWgumQoqXAKmIoSoUi6JNhS8mVnvhUm8VtYKp1UJbQIz3RDCNxIgCVrxQyk1Co2gBxVYRPc3/vGeGmX333Z3dnZmd3f2d5M33vbsz5/I7833/ec55zvMEzV3ie7ZuDcfNXQU3QgACEIAABCDQCoEwXy3xlZLen+89RgofmK8e7oIABCAAAQhAoA0C8wr6gyXdmjuwmxRua6Mz1AEBCEAAAhCAwHwE5hT0+RrjLghAAAIQgAAEuiGAoHfDlVohMCcBfFPmBMdtENh4Agj6xj8CABgOAXxThjMX9AQCq0cAQV+9OaPHa0sg4puytnPLwCDQPQEEvXvGtAABCEAAAhDonACC3jliGoAABCAAAQh0TwBB754xLUAAAhCAAAQ6J4Cgd46YBiAAAQhAAALdE0DQu2dMCxCAAAQgAIHOCSDonSOmAQhAAAIQgED3BBD07hnTAgQgAAEIQKBzAgh654hpAAIQgAAEINA9AQS9e8a0AAEIQAACEOicAILeOWIagAAEIAABCHRPAEHvnjEtQAACEIAABDongKB3jpgGlkcgHinpYincsLw+0DIEIACBfggg6P1wppVeCaQkJ1dL2l3StVJ4Qq/N0xgEIACBJRBA0JcAnSa7JhCvk/S43Mp3pPCkrlukfghAAALLJoCgL3sGaL9lAvFcSYflSn8m6UlSuL7lRqgOAhCAwOAIIOiDmxI6ND+B+HZJb8z33yXpt6Xwhfnr404IQAACq0MAQV+duaKnEwnEkyT9VeWSF0vhAqBBAAIQ2BQCCPqmzPRajzM+R9IXK0PcJYVT13rIDA4CEIDACAEEnUdixQnEp0r6kqT75IH8kxRetuKDovsQgAAEZiaAoM+MjBuGRSD+SNIDcp8uk8KBw+ofvYEABCDQDwEEvR/OtNI6gXTW/PLK8bQfSuGhrTdDhRCAAARWhACCviITRTdHCcTPS/qt/Okdkp7C8TSeEghAYJMJIOibPPsrO/Zoh7dTKt0/QApXrOxw6DgEIACBFggg6C1ApIo+CcS/lHRypcUjpPCxPntAWxCAAASGSABBH+Ks0KcdCMTnSqoGinmHFKriDjkIQAACG0sAQd/YqV+1gUfHZr9U0sNzz6+Uwv6rNgr6CwEIQKArAgh6V2Spt0UCyaP9K5L2ypVeL4U9W2yAqiAAAQisPAEEfeWncBMGEL3M7uV2lzu3rPRw6yaMnDFCAAIQaEoAQW9KiuuWRCCeLumESuN/IoX3LKkzNAsBCEBgsAQQ9MFODR2T4lGSPlQhcYUUDoAMBCAAAQhsJ4Cg81QMlEA8VNL5lc7dJskZ1C4eaIfpFgQgAIGlEkDQl4qfxscTSB7t3jf3n0V5sxR8Bp0CAQhAAAJjCCDoPBYDI5A82i3m1SNpF0l6HaFdBzZVdAcCEBgUAQR9UNNBZ6SaR3sBxEvtF0AHAhCAAAR2JoCg83QMiEDNo/0Xku4p6RIpFEfWBtRXugIBCEBgWAQQ9GHNxwb3pubR/lNJv5phHC2FszcYDEOHAAQg0IgAgt4IExd1SyB6v9y5zUcL4V27BU/tEIDAGhFA0NdoMldzKMmj3WJuZziX70l6WP778zimtpqzSq8hAIH+CSDo/TOnxZJA8mi3mBfH0xyv/cD8NXvnPCkQgAAEZiCAoM8Ai0vbJhAdOMYBZFyulrR3pYUDpHBF2y1SHwQgAIF1JYCgr+vMDn5c8VRJp+Ru3iDpx5KenH8/RwoO+0qBAAQgAIGGBBD0hqC4rE0C28K6vk/SsbmF27eW4INDvVIgAAEIQKAhAQS9ISgua4tA8mh3JLjCCe5ESadVaueYWluoqQcCENgoAgj6Rk33sge7zaN9V85zflDuGcfUlj1FtA8BCKwsAQR9ZaduFTse7dFexGg/R5IDxthaLwrH1FZxWukzBCAwCAII+iCmYRM6UYvRfqEkO705Fep+efQcU9uEx4AxQgACnRFA0DtDS8V3E4gnSDo9/26PdsdmL86gY53zqEAAAhBogQCC3gJEqphEoBaj3R7s+2+lQY1ebj8S65ynBwIQgEA7BBD0djhSy1gC0Za4g8cUHu2VYDHRx9IelG/Ds50nCAIQgMCCBBD0BQFy+04Ekke7Hd6KsK6VnOZJ6KvOcLtx7pwnCQIQgMBiBBD0xfhx93jL3Ba5BbvwaP9TKZxx96XRfz8+/36hFIrwr/CEAAQgAIE5CSDoc4LjtkkEah7tZ0rBTnGVEh2jvfBuZ7mdhwkCEIBACwQQ9BYgUkVNrKdY3ynD2q2VO/bccpKjQAACEIDAIgQQ9EXoce8IgdrxtB2ivtXiuN8ghWKPHZoQgAAEILAAAQR9AXjcWrPMvQ9uj3aXK7fOmo9LsBL/QdLR+boxy/FQhQAEIACBeQgg6PNQ455Ry7yacCUHjtlpGT3eKOkxuYKTpPA34IQABCAAgcUJIOiLM9zwGlL2NFvmXjp34Bhb5nZ626HEWPmici59wzEyfAhAAAILEkDQFwS42bcnBzcnXCnE/FApOD77TmI+cv489Pz8xQsk3SGFl2/2vDF6CEBgHQn0/B/qOiLc1DElMbdlbpF2aZApreY013MylvglSc/KfX2LFN66qTPHuCEAgfUkgKCv57z2MKpoMS8CwjQ8S76MgDIpYt0HJT2/AoWjcj08ITQBAQj0SwBB75f3mrQWT5V0Sh5MQzH31dHL8Qfl+3ZJwfV0XOInJf1upZHTpXBix41SPQQgAIHeCSDovSNf9QZr2dNmFOXoADKPzQRGwsF2wSW+T9KrKjX7heL5Uqg65nXR8EidcXdJ+0i6Kn+xh6TdpXBJD43TBAQgsCEEEPQNmeh2hlkT8znOkNcyrDXYc1+k1/Htkt5YqeFmSb/ZfVS6lHjGy/xODVv4F/xc0r13GM3FUnjeIiPlXghAAAImgKDzHDQkUMuQdo4Ujmp4Y+Wy2pG1DgU9vkLSh0f691IpfHT2Pje9I3oLwglndmt6R+W6GbYt5qidWyAAgY0ggKBvxDQvOsjaWfMFsqP1IejJk/5vJd2jMupjpXDWohTG3x/fIekNC9TtvPA+j088+wUgcisEIICFzjMwlUDyErdHuwPILCDmbqhLQY8PkORVg78bGdLrpPDOqcOc6YL4EEkvkfQXkh494da7JN0rf/8DSd/Ify/2zi+SwldnapqLIQABCOxAAAudR2MKgejAMVnMLZjj4rM3hVjbQ5/RoW5SG2kF4c2SDhu56l1SeG3T3jW7Lj5D0gckPWXK9c4Hf5mk/5X0Hil8v1n9XAUBCEBgPgII+nzcNuSuMq/5hGQrs6CoHVubw6luXFvxhZLemx3RqhecLOksKVRTtc7S2cq16YXhkPzCsO+YSn4myQL+HUkXTI6WN2cXuA0CEIDAFAIIOo/IDgRKMW8xxWktsMz1UthzfvzRUd+8xF49llZUd7ikT0vhx/PVnwTc5+Xtpe4fR8UbVy6UdOrk2PXz9YC7IAABCMxKAEGfldhGXB8/lMWyJcu8gFbLhe4PZ4zYlvbzLbD2JrfojpY7Jf3O7BZyEvD98piLo2aTZvo8KfilgQIBCEBgMAQQ9MFMxVA6ko5fOYKbxdzJVlr0vk7x36tL4FP20ePTJL1I0n0l/Z+k47YCsuxYGh6FSy8GtsAt5LbyRy1wj91BaB4m6Y8qrd0k6XApXDqU2aIfEIAABAoCCDrPQoVAtOV7RjdiXlrpznjm/WiXMcvu6YXC+9QHTznTbQ9yO+w56pqjz004G18uoVvAi8Av1Zn30rlTvlrEr9hy/It2sDu3cpGjvDl/+6d4ZCAAAQgMkQCCPsRZWUqfyuVwW6f2Zp+Q03yRDm5bdndEtaslvWYrkluKsjapfE3SP0v6SHZSOz3nYX9c3QM/teMXh1EBv+Fu4U7iPSbday2IjvuyS9I/SuGaRUbOvRCAAAS6JICgd0l3ZeouBcxi52X2jsS8tNJ/KMlnuaeVOyTdX9InJN0o6bOSPiOFn0pp+f66vFye48KnoDKFiBd1+8y3Rds/XhGYsoWQXgReWjkC9xHyp0+bJr6HAASGQABBH8IsLLUPScwdOOb2LWt2muC10dnybPu4ymx9W7g/J4Xv7txamfHtW1siL4u5S2GB+/iYl/dnLNEvD793902BfyMzEuRyCEBgOQT4z2o53AfSahnS1c9BD5a5hx2rWceqHBya9f1ScDCWKSU+R9IX80U/keT9dO/9O9HJmCX0afUV39fSwv63pGdIwY5wFAhAAAKDJ4CgD36KuupgGdLVz0CHe+aj/Y9/L+nYyqfONPZ1KfzP5JGWwV28JF4cWfvPrTjq81ji2/o1mmp1t8Wi4nU1b9QLAQhAYDwBBH0jn4ylifnosTXTnyCcqZ/eE/dyuu/1jx3o9s7TNuM59p0mOzo8bDUGfMPjbxv58DBoCEBgoAQQ9IFOTHfdSs5kDlPas2XuEW3zcPeHL65b2Kl/FnFb4v5x8b6498P9Uzi+tRkLPlZ4k8q0u4ePmiEAgQ4JIOgdwh1m1SmeukWzx2X2gsRYQc/WcHLO8xE2i3gR6MVC7iA3dnDz2XBf45cRO/CNHFObl3b0WfMiqYtjv1e3A+atlPsgAAEI9E4AQe8d+TIbjLZwf03S2xZzHpt3DGMF/V2Sfr9y/txi7X46RnrliFm5suD985as6LiXJO/D54JH+7wzy30QgMDyCSDoy5+DnnqQxDyHOl3EE3yR7qZz4g4EM66MWOOjl0SHaHWM+Uuk0CTeeoOORu+bF+lVW1zCb9A0l0AAAhBomQCC3jLQYVZXivkJ7XiEzzPKZGF/VJLTnVaLz5CfPD2YTZlLvS1HOMeEL3KUOyubl/CneNrPM27ugQAEINAPAQS9H85LbCWencOfes98gTPa8w4heao7Rvy4JCiutIFHeRqD99dbyqHuZqMTvbw7j+rfpeCz7RQIQAACK0sAQV/ZqWvS8egIcAdkB7iexbx0crOQF8UhX399pOdTBD2dPy8c4fZv72x4me/d3WnJ6m8yJ1wDAQhAoBsCCHo3XAdQa2mZ97zMnoTc++TVfOWOp25vdS+7+yWjWqYJepGdbeR426KIoyPSOT2ry6OkcPOiNXI/BCAAgWUSQNCXSb+ztpOY+/iXl9nniGc+T8eS05qX1gshH+Otvi2LmRuaIOilV/yFUijOpM/TuZF7otOzfiN/eIsUnIKVAgEIQGClCSDoKz194zrft5hHW+PV/XELueOqn7F9eXwWQS+zqfkZ9VL7lCxps0xkrR+O/+7wsxQIQAACK00AQV/p6RvtfLSQ2pL1GW5b6R2VJLa2xr2MXpR87GxSu+m+W0c6tYOFXjrC5dSobQ4lOeo59arLRVL4gzZrpy4IQAACyyCAoC+DeidtlpnCWgq6Mq6TybItYqsXF+T98aYe9LEaZtV1jBH00oJu8cx5dTw1Qb9JCo/pZEqoFAIQgECPBBD0HmF311R0wBUve3cg5mWCFNdfdXQ7Jy+rXzHbuKKv369yzwHbz6CX13TkfV5L4cqS+2wTyNUQgMBACSDoA52Y5t1Ke9iOwNaimI9NkOIuXbu1RJ2W9G9r3seadezjcwfd/clouNUymlyHkdvixyW9KPcBQZ9vIrkLAhAYGAEEfWATMlt34il5H7ulfebkVV4kSBntyi5JZy/unFbujef6q4KeXiQu38oEF7zP3VGJdrB7bK78CCl8rKOGqBYCEIBAbwQQ9N5Qt91QaZkvKOZJxIt0pUWWs2pnz1zMIh8dd7nX7y+ulEJlGb+0zls+c76tD7bOXyHpw1L4RNszQ30QgAAElkEAQV8G9YXbXNQyT9HX7KVeTVVa7dWEo2eLdr5MsuKKzpFCjiRXWuc3tJd8ZdG+cj8EIACB1SGAoK/OXOWelhbuHJZ5ElMvqe+UrWxKxrM2YNUEvbJP3pd13sYYqAMCEIDA8Agg6MObkwk9KsV8RoexJJa2yHfal/bRM++Pd3h2vRhWfL2kv8m/vUUKb936e/Js9/Z51ZN+pWaHzkIAAhBYJgEEfZn0Z2p7nmX2tD9uL/idhNxHz+yx3mIUtmmDqkVpe7oUviqVn3W8dz6tb3wPAQhAYHUJIOgrMXelA1xDyzydHbeQj4t/PibGep8Q4sGSPpdb3EMKt0gxZ4ILO20F9NlB2oIABCCwkgQQ9MFP26zL7GmP2mLeg8f6PPBqecidJGVvSadJersUzpqnRu6BAAQgAIF03pcyXAKzWObJKnfEuHFWrvfInXmtx6X1najWjq05KYrjwXvfvOUELMOdVXoGAQhAoAsCCHoXVFupc5Zz5mkP2mI+ulfeIGFKK52doZL4hcpLx545SUrL6VFn6A6XQgACEFgTAgj6ICdylmX2+CpJ7xszjAuzVT5niNauwJRx578n6ds5DOyEnOhd9YN6IQABCKwXAQR9UPOZgqsU+cUbnDNPSUYuk3TfyjAGaJVXIUfvkx8j6WZJj9weLW5QE0JnIAABCKwMAQR9UFM1yzK7O14eZStG4b3yE7ZnLxvSIKPzkHtrwN72D5LU4MVlSP2nLxCAAASGSQBBH8y8lEvRMwhcGV3No/DRL5/jHtgS+yjgbfnQO0qROpiJpSMQgAAEeiGAoPeCeVoj8fx8ZnzGFKjxBZI+m2u/WgpPnNbS8r+vCfolxG1f/ozQAwhAYD0IIOhLnce0Z27vdAeAmcEyLzodHyHJ2dAOy58cLoXzljqkiY3Xgsr4SiLDDXey6BkEILBiBBD0pU5YaZkvIGzRYn5uHsZ5Ujh8qUOaLOjVFYXbpTAu+M1wu0/PIAABCAyYAIK+lMmpWeYzLrOP63B0UhVnUXN5pxRet5RhTW00fkrSC/Nl75DCyVNv4QIIQAACEGhEAEFvhKnti+LlOTraApZ5tU/xUZJuyp84a5mX73N89Lb7vkh98ceS7p9rwBluEZTcCwEIQGCEAILe6yORLHNHSnOENIdivaC95uNfS/qzXN9JUihSlLbXxEI1pcxvdv5zuVEKj12oOm6GAAQgAIEaAQS9tweiFmu9o8hopQe5Y7a/ZCs16VBKvEbSE3Jv3iqFtwylZ/QDAhCAwDoQQNB7mcUk5rZObZk/t7vAL7Vc4/Z2P1YKt/YyxImN1KxzX7nb8M/LL58aPYAABCAwCwEEfRZac10bnUnMYm7Wh3Yn5kXnal7vZ0vh6Lm63epNKd/5QbnKW6XwkFarpzIIQAACECB9arfPQLLMvWe+W7eW+egoopO1OGmLy5K9ybdZ5x+Vwku75U7tEIAABDaPABZ6Z3Nes8y9zN5zLvJa3vHTpPD6zoY6seKade4rWzimt5yR0CoEIACBIRNA0DuZnSTmtsyd+czL7D2LeTGoMj68P2jpiNwswGp7+sWNHFebBSHXQgACEGhIAEFvCKr5ZaWIWcyXYJlXe5pCwzov+oH5046863eiE30s75DKt0SHa/4gcSUEIACBmQgg6DPhmnZxuV9sEfU58wFkPktBZz4jaV9Jt0hhj2mjaOf7dOZ+1MP+Qin4PDoFAhCAAARaJoCgtwY0HpUTrQxIzGvW+jeyqF8lhSe3NuwdK6rt4RdXzZGApvue0gIEIACBdSCAoLcyi/F4SWdIGng60HidJHveO5nLq7s9ox7tNzAaDe6A7o/ttTKhVAIBCEBg5Qgg6AtPWTxF0qlbe9WrsJwcr5K0j6RLJb1JCpcsjGBbBduOqvkK9s/bB02NEIAABEoCCPpCD0M8XdIJknZJwaK+AiUFnvFLiPfUL5XCs9vvdC37212S7iXpHCl4W4ICAQhAAAIdEEDQ54JaS3+6gvvCyRP/bZKeJcnZ2V7ZXtz3sc5wpsz587meNW6CAAQg0IwAgt6MU+Wqmpgv4Wz3zB2ecEPtnPozpfDlxWsvnQNHq+L8+eJwqQECEIDAjgQQ9JkejjL9qQPH9Hyme6aOznBxPG3LetbPJR0jBXvpL1BqZ8/vyPnPb5CCnfEoEIAABCDQEQEEvTHYWi7zDjOmNe5QixcmS/0ISffZ8gkIZ85X+Y7L7WdKwb4GFAhAAAIQ6IgAgt4IbF/pTxt1pqOLogXXTn4uc2Zp23G5neNqHc0a1UIAAhAoCCDoU5+FMmOaWS05lOvUzi54QU2QnfLUPgIzRLurLbf/QNJDOa624JRwOwQgAIGGBBD0iaDKJCu3r7+YFyBqZ8gdHMaibk/4KWXbcrvDvjptLMfVpqHjewhAAAItEEDQd4RYJllx4BVnTJvBUm1hZpZaRRL1syU9SJLH7SNnTrQyoYwNJuPrV/wkwFIngsYhAAEINCaAoI9FNcQkK43ntKUL0wuNRb0I33qqFHbtXHktmExhnRMdrqXZoBoIQAAC0wgg6NsIlfvILBUr+Q94L70QdVvpttbHrFZEf2aL3uVaSY9nuX3aPz++hwAEINAeAQS9xrKMy46Yl1ySqNtSPyh/5H11n8H3n7mU2xOjTybR4dr7t0pNEIAABCYSQNDvFqUiycoKxWXv6+lODm/OJndkbnFkX72WKvUnku6Xr9tts3wP+poP2oEABCCwnQCCnpiUgoQD18R/JdtynGcLPNoLfr9865X57yuSfY7/FiAAAQisBwEEXfH8rSVkHTXdk3s9Jn2xUWwLHvMvkl5SqfM7kp4oaQWT1ixGhrshAAEILJPABgt6WkZ2ZLQXI+azPoLbPODHVUAyllmxcj0EIACBBQhssqB/QdIBOWBMg8ApC1Bey1vTC5G93gtnOY/yJkmPlkQylrWccwYFAQgMmcAGCnoSIi+z77k50d+6fASjz5ybqYsztt1bEo6FXSKnbghAAAJjCGyYoKcjWM4sZjHfHw/sNv5NRK90OAhNtbxLCq9to3bqgAAEIACBZgQ2SNDL9KdFkpUNCuXa7GGY/apt589/KekeuZ6PSzq+fl599ha4AwIQgAAEmhHYEEEvM6Z5b3fUmmxGiqvGEIj7SLoqf+Fz6kdL8jP1wPyZg8/Y231KHHjgQgACEIDAogQ2QNBLMff5aB9NwzJf9Kkp748HS/pc/vWcHHjGou7kLodUmpkzv3prHaUiCEAAAmtPYM0FPaU/tQPclVKwyFBaJRAPk3RurvLTkl64dXLA6VZrudF9iU8SOBANJwpanQMqgwAEILBFYI0FvbTMHbHsBCa8CwK1IDPXSbpVCk+7u6VtkeX81ZSsbV30kzohAAEIrD+BNRX00lnrTMS8y4c4Hifp3bmF2yUdI4Xz6i2mufAeepGJzV87g5v31rHWu5we6oYABDaKwBoKehIQL7NbzE/dqNnsfbDbvNx3yK6Wtj4s6kUaVvd0JMFL752nQQhAAAJrRWDNBD16n9znzG39OeUnpVMC2wTdaVVtfY8pYyPL+TqW4DudIyqHAAQ2hcAaCXoSc1vmJAXp9emNsdLcBEEvrhq7r27r3dY9JxB6nTsagwAE1onAmgh6EnOfgz6BM899P57RznCOwOeyrxS+Ob0HO+6rW9R9dp0CAQhAAAIzElgDQU9i7uV10p/OOPntXB4dEe5Fua4GFnppqfslwJZ5kUfdX1jMXQei3s7kUAsEILBBBFZc0Ms93BmEZINmt5eh1pbQj5DCx5o3O3Zf/buSTpSC86xTIAABCECgIYEVFvRkmft8uZfZOf7UcMLbvyy+WtJ7c71z+C8kUfdphOMrfbtT0sslfV4KzuZGgQAEIACBKQRWVNBTQBP/2EN6B69q5r4fAvEheancSVmeLoVvz9du9MvZ6SP3Hr79XPt8tXMXBCAAgXUnsIKCnpbZ7QDnPXMs87V6QuOfS3qTpPtVhuUXNgesuWathspgIAABCLRMYMUEPR4paddW/m0cp1p+FgZSXXphcyyBwnPe/XL0uTcw5wOZIroBAQgMksAKCXr6j95L7KQ/HeSj1GanaklfiopPl8KJbbZCXRCAAATWicCKCHraM/ce66FYaev0+E0ay7YodM4ltCLP66bMEeOEAASGRGAF/oNMzlJefj0DMR/So9NHX+JpW5H/ynKsFM7qo2XagAAEILBqBAYu6MkyL5baCTayak9XK/2NX5f0lFzVj6RQzdrWSgtUAgEIQGAdCAxY0JOY2zI/G8t8HR61eccQHU3ukMrde0nhv+atjfsgAAEIrCuBgQo6Yr6uD9zs44pPk3RZ5b49ecGbnSJ3QAAC609ggIKenKEcBc4e7WTfWv9ncMoIo1dpnACmKAj6xj8TAIAABMYRGJigp3CuxZ45Ys4zK6kWK/5rkp4thZ+BBgIQgAAE6gQGJOiFZR7s1U6BgMX8BZI+Imn3jGOXFBz3nQIBCEAAAiMEBiLoiDlP5jgC8YuSnpO/+bIUngknCEAAAhAYT2AAgp7E3KFcsbx4SisEosO/+qRDUV4uBVvrFAhAAAIQGENgyYKexHx/KTjZCgUCXmb/DUkflLRvBccfSuHfwAMBCEAAAjsTWKKgJzF/nBTOZoIgIKXjac6t/soRGuyb83hAAAIQaEBgSYKezpk7Njdi3mCS1v+S+AFJfzwyzqskvYZ89+s/+4wQAhBoh8ASBL0Qc13AOfN2JnF1a0mrNBdKemBlDDdtLbnjU7G680rPIQCBZRDoWdCTmPt8+cWrI+YpsMmTJD1c0q/kSTpY0i8l/TD/fkv+8yIpfFVKQuXi+PN3SfqJpP3GW5uuf9NyuyemJ0k6rvLQ+7l4I8lXlvHfAG1CAALrQKBHQU9iboG7YjhiHh+c48U74cf+korfLTj+uz/7gaSHLjjZt0rarSL+xblq83BbRfGLQfGdl5y/kr/3dRa8arAd//2KfGNYjaXp9KJz0FYUwLLcLOlfJb1JCn7xoUAAAhCAwBwEehL0FO3L4rMEyzyJtoX5sVkcC+Eu/hyH7YaKhf0tSd/LLyMWXwuQk4UcKOlGSXbmGlKpin+Roc5/xjwHT81jKfrsMfn74uWiGKO/v5ekPSQ9XtLlkvzi8y6Tr+0AAALTSURBVP38mV84ipUJ33uHFPzy46aKFYp9JD1K0s8lnTIG0nk5xO83hwSQvkAAAhBYRQI9CHoh5sFZszousRDufByutLpH2729ImJ+0Sis3dukUFi9DfsaHy1prxyy1vf4xaF6frphPdsu+4Wke85788DvszPkJ6VgQadAAAIQgEALBDoW9OgwrtdLbYt5srr9Y0vZIu6fYpm8wFKItgU6L/Wnvswo2PNSTlaq2312tlB9rtrLzYUlfEm29t3AI7dWL0rr1ycA/Lut3eq4inH7i+rnxbJ9dfl+tOO20P9D0mslXSvpHvmCcRZ6Ydl7Cdz99u/XSLLvgLcPzHZSW9W2bcXbmnfxmL1Kk8c2L1vugwAEIACBUQIdCnqyzG3xthA0JlneFhALohO43Clp78pgrszLyRXx3jRHs74f7vhESY8YeSkoltr9sUXbL1DFy0HfHaQ9CEAAAhtFoCNBjxZx/2e+gJiXDlQ5NGyaF1uGFm0fdXJKTb8wYO1t1CPLYCEAAQhAYByBDgQ9WeY+ijXjPnJaRi8s8OLeQsC9/+4fCzhpVXmWIQABCEAAAiMEWhb0lM/cVrnjszcU3nSP98L9p0Xd5cy8ZLsEr3ieEQhAAAIQgMDqEWhR0JOF7WXwo6c7waXldIu4LXHfZ0s8W+FtO9Ct3qTQYwhAAAIQgMCsBNoUdFvY528FUBm1zmvL6VVL/Jws5Fjis84c10MAAhCAAAQqBNoUdHuiO/jIHZIuqxzPKgK7uFlb4nZiK6zxhsvyzBkEIAABCEAAApMItCjobia+TNJh+Vx40a6PLVnE/TOgsK88GBCAAAQgAIH1IdCyoK8PGEYCAQhAAAIQWCUCCPoqzRZ9hQAEIAABCOxAAEHn0YAABCAAAQisAQEEfQ0mkSFAAAIQgAAEEHSeAQhAAAIQgMAaEEDQ12ASGQIEIAABCEAAQecZgAAEIAABCKwBgf8HUo6dI5/5V1kAAAAASUVORK5CYII=" }
6
+ let(:normal_string) { "IAmJustANormalStringDoingNormalThings" }
7
+
8
+ it "should retrieve the Regexp LeadingBase64Data" do
9
+ expect(regex).to be_a Regexp
10
+ end
11
+
12
+ it "should detect a base_64 string" do
13
+ result = b64_string =~ regex
14
+ expect(result).to be_a Integer
15
+ end
16
+
17
+ it "should leave a normal string untouched" do
18
+ result = normal_string =~ regex
19
+ expect(result).to be_nil
20
+ end
21
+
22
+ end
@@ -0,0 +1,34 @@
1
+
2
+ RSpec.describe "String#to_filename(substitute='_')" do
3
+
4
+ it "should substitute all spaces with, by default, lowdashes" do
5
+ string = "this is a filename"
6
+ expect(string.to_filename).to eq "this_is_a_filename"
7
+ end
8
+
9
+ it "should substitute all spaces with, if given, the substitute argument" do
10
+ string = "this is a filename"
11
+ expect(string.to_filename('-')).to eq "this-is-a-filename"
12
+ end
13
+
14
+ it "should substitute all slashes with, by default, lowdashes" do
15
+ string = "this/is/a/filename"
16
+ expect(string.to_filename).to eq "this_is_a_filename"
17
+ end
18
+
19
+ it "should substitute all slashes with, if given, the substitute argument" do
20
+ string = "this/is/a/filename"
21
+ expect(string.to_filename('-')).to eq "this-is-a-filename"
22
+ end
23
+
24
+ it "should substitute all backslashes with, by default, lowdashes" do
25
+ string = 'this\is\a\filename'
26
+ expect(string.to_filename).to eq "this_is_a_filename"
27
+ end
28
+
29
+ it "should substitute all backslashes with, if given, the substitute argument" do
30
+ string = 'this\is\a\filename'
31
+ expect(string.to_filename('-')).to eq "this-is-a-filename"
32
+ end
33
+
34
+ end
@@ -0,0 +1,146 @@
1
+
2
+ RSpec.describe "#is_num? and #is_nan?" do
3
+
4
+ context "for String" do
5
+
6
+ it "#is_num? should return true for '5' (integers)" do
7
+ expect('5'.is_num?).to be_truthy
8
+ end
9
+
10
+ it "#is_num? should return true for '5.0' (floats) " do
11
+ expect('5.0'.is_num?).to be_truthy
12
+ end
13
+
14
+ it "#is_num? should return true for '5,0' (floats, separated by comma) " do
15
+ expect('5,0'.is_num?).to be_truthy
16
+ end
17
+
18
+ it "#is_num? should return false for valid values, '5a' (concatenated with additional letters)" do
19
+ expect('5a'.is_num?).to be_falsy
20
+ expect('5.0a'.is_num?).to be_falsy
21
+ expect('5,0a'.is_num?).to be_falsy
22
+ end
23
+
24
+ it "#is_nan? should return the opposite" do
25
+ expect('5'.is_nan?).to be_falsy
26
+ expect('5.0'.is_nan?).to be_falsy
27
+ expect('5,0'.is_nan?).to be_falsy
28
+ expect('5a'.is_nan?).to be_truthy
29
+ expect('5.0a'.is_nan?).to be_truthy
30
+ expect('5,0a'.is_nan?).to be_truthy
31
+ end
32
+
33
+ end
34
+
35
+ context "for Numeric" do
36
+
37
+ it "#is_num? should always return true" do
38
+ expect(1.is_num?).to be_truthy
39
+ expect(1.0.is_num?).to be_truthy
40
+ end
41
+
42
+ it "#is_nan? should always return false" do
43
+ expect(1.is_nan?).to be_falsy
44
+ expect(1.0.is_nan?).to be_falsy
45
+ end
46
+
47
+ end
48
+
49
+ context "for NilClass" do
50
+
51
+ it "#is_num? should always return false" do
52
+ expect(nil.is_num?).to be_falsy
53
+ end
54
+
55
+ it "#is_nan? should always return true" do
56
+ expect(nil.is_nan?).to be_truthy
57
+ end
58
+
59
+ end
60
+
61
+ context "for TrueClass" do
62
+
63
+ it "#is_num? should always return false" do
64
+ expect(true.is_num?).to be_falsy
65
+ end
66
+
67
+ it "#is_nan? should always return true" do
68
+ expect(true.is_nan?).to be_truthy
69
+ end
70
+
71
+ end
72
+
73
+ context "for FalseClass" do
74
+
75
+ it "#is_num? should always return false" do
76
+ expect(false.is_num?).to be_falsy
77
+ end
78
+
79
+ it "#is_nan? should always return true" do
80
+ expect(false.is_nan?).to be_truthy
81
+ end
82
+
83
+ end
84
+
85
+ context "for Hash" do
86
+
87
+ it "#is_num? should always return false" do
88
+ expect({}.is_num?).to be_falsy
89
+ end
90
+
91
+ it "#is_nan? should always return true" do
92
+ expect({}.is_nan?).to be_truthy
93
+ end
94
+
95
+ end
96
+
97
+ context "for Array" do
98
+
99
+ it "#is_num? should always return false" do
100
+ expect([].is_num?).to be_falsy
101
+ end
102
+
103
+ it "#is_nan? should always return true" do
104
+ expect([].is_nan?).to be_truthy
105
+ end
106
+
107
+ end
108
+
109
+ context "for Date" do
110
+
111
+ it "#is_num? should always return false" do
112
+ expect(Date.today.is_num?).to be_falsy
113
+ end
114
+
115
+ it "#is_nan? should always return true" do
116
+ expect(Date.today.is_nan?).to be_truthy
117
+ end
118
+
119
+ end
120
+
121
+ context "for Time" do
122
+
123
+ it "#is_num? should always return false" do
124
+ expect(Time.now.is_num?).to be_falsy
125
+ end
126
+
127
+ it "#is_nan? should always return true" do
128
+ expect(Time.now.is_nan?).to be_truthy
129
+ end
130
+
131
+ end
132
+
133
+ context "for DateTime" do
134
+
135
+ it "#is_num? should always return false" do
136
+ expect(DateTime.now.is_num?).to be_falsy
137
+ end
138
+
139
+ it "#is_nan? should always return true" do
140
+ expect(DateTime.now.is_nan?).to be_truthy
141
+ end
142
+
143
+ end
144
+
145
+ end
146
+
@@ -0,0 +1,55 @@
1
+
2
+ require 'pry'
3
+ require 'rails'
4
+
5
+ require 'eitil'
6
+
7
+ # Implement specs for other railties later on, start with eitil_core.
8
+
9
+ require "eitil_core/railtie"
10
+ # require "eitil_store/railtie"
11
+ # require "eitil_integrate/railtie"
12
+ # require "eitil_support/railtie"
13
+ # require "eitil_wrapper/railtie"
14
+
15
+ require "eitil_core"
16
+ # require "eitil_store"
17
+ # require "eitil_integrate"
18
+ # require "eitil_support"
19
+ # require "eitil_wrapper"
20
+
21
+ RSpec.configure do |config|
22
+
23
+ config.expect_with :rspec do |expectations|
24
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
25
+ end
26
+
27
+ config.mock_with :rspec do |mocks|
28
+ mocks.verify_partial_doubles = true
29
+ end
30
+
31
+ end
32
+
33
+ # This block is added by us: the new methods .pry_describe and .pry_it
34
+ # automatically start a pry session after running the spec, allowing
35
+ # you to inspect the application's post spec state.
36
+ RSpec.configure do |config|
37
+
38
+ config.alias_example_group_to :pry_describe, pry: true
39
+ config.alias_example_group_to :pry_context, pry: true
40
+ config.alias_example_to :pry_it, pry: true
41
+ config.alias_example_to :pry_example, pry: true
42
+ config.alias_example_to :pry_specify, pry: true
43
+
44
+ config.after(:example, pry: true) do |example|
45
+ require 'pry'
46
+ binding.pry
47
+ end
48
+
49
+ end
50
+
51
+ # This is added by us, in order to set the :documentation formatter,
52
+ # which gives quite a lot of information about the tests, as default
53
+ RSpec.configure do |config|
54
+ config.formatter = :documentation
55
+ 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.37
4
+ version: 1.2.1
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-09-03 00:00:00.000000000 Z
11
+ date: 2021-09-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -66,6 +66,48 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec-rails
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '='
74
+ - !ruby/object:Gem::Version
75
+ version: 5.0.2
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '='
81
+ - !ruby/object:Gem::Version
82
+ version: 5.0.2
83
+ - !ruby/object:Gem::Dependency
84
+ name: pry
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: pry-rails
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
69
111
  description: "Eitil (eitje utility) never stops increasing your life's efficacy and
70
112
  productivity, yay!\n Our gem currently exists of five seperate
71
113
  layers (Railties), which can be integrated as standalone gems. \n This
@@ -205,6 +247,30 @@ files:
205
247
  - lib/eitil/all.rb
206
248
  - lib/eitil/railtie.rb
207
249
  - lib/eitil/version.rb
250
+ - spec/eitil_core/argument_helpers/all_args_to_ivars_bang_spec.rb
251
+ - spec/eitil_core/argument_helpers/all_args_to_ivars_spec.rb
252
+ - spec/eitil_core/argument_helpers/all_kwargs_to_ivars_bang_spec.rb
253
+ - spec/eitil_core/argument_helpers/all_kwargs_to_ivars_spec.rb
254
+ - spec/eitil_core/argument_helpers/args_to_h_bang_spec.rb
255
+ - spec/eitil_core/argument_helpers/args_to_h_spec.rb
256
+ - spec/eitil_core/argument_helpers/args_to_ivars_bang_spec.rb
257
+ - spec/eitil_core/argument_helpers/args_to_ivars_spec.rb
258
+ - spec/eitil_core/array/map_strings_spec.rb
259
+ - spec/eitil_core/array/slice_hashes_spec.rb
260
+ - spec/eitil_core/datetime/prettify_spec.rb
261
+ - spec/eitil_core/errors/raise_error_spec.rb
262
+ - spec/eitil_core/float/safe_to_i_spec.rb
263
+ - spec/eitil_core/formatters/duck_set_spec.rb
264
+ - spec/eitil_core/formatters/sql_spec.rb
265
+ - spec/eitil_core/hash/auto_dig_spec.rb
266
+ - spec/eitil_core/hash/transform_string_values_spec.rb
267
+ - spec/eitil_core/safe_executions/safe_call.rb
268
+ - spec/eitil_core/safe_executions/safe_send.rb
269
+ - spec/eitil_core/setters/set_ivars_spec.rb
270
+ - spec/eitil_core/string/strip_base64_header_spec.rb
271
+ - spec/eitil_core/string/to_filename_spec.rb
272
+ - spec/eitil_core/type_checkers/is_num_or_nan_spec.rb
273
+ - spec/spec_helper.rb
208
274
  homepage: https://github.com/eitje-app/eitil_engine
209
275
  licenses:
210
276
  - MIT