ruby-rails-extensions 0.2.0 → 1.0.0.pre.rc.1
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 +4 -4
- data/CHANGELOG.md +1 -35
- data/lib/ruby-rails-extensions/extensions/find_bang.rb +6 -1
- data/lib/ruby-rails-extensions/extensions/presence_bang.rb +6 -1
- data/lib/ruby-rails-extensions/version.rb +1 -1
- data/lib/ruby-rails-extensions.rb +47 -85
- metadata +16 -52
- data/lib/ruby-rails-extensions/errors.rb +0 -17
- data/lib/ruby-rails-extensions/extensions/all_keys.rb +0 -10
- data/lib/ruby-rails-extensions/extensions/all_values.rb +0 -10
- data/lib/ruby-rails-extensions/extensions/any_key.rb +0 -10
- data/lib/ruby-rails-extensions/extensions/any_value.rb +0 -10
- data/lib/ruby-rails-extensions/extensions/assign_nil.rb +0 -67
- data/lib/ruby-rails-extensions/extensions/boolean_scope.rb +0 -49
- data/lib/ruby-rails-extensions/extensions/clean_string.rb +0 -41
- data/lib/ruby-rails-extensions/extensions/compact_blank_join.rb +0 -13
- data/lib/ruby-rails-extensions/extensions/humanize_symbol.rb +0 -11
- data/lib/ruby-rails-extensions/extensions/no_keys.rb +0 -10
- data/lib/ruby-rails-extensions/extensions/no_values.rb +0 -10
- data/lib/ruby-rails-extensions/extensions/only_some.rb +0 -28
- data/lib/ruby-rails-extensions/extensions/quarter_dates.rb +0 -47
- data/lib/ruby-rails-extensions/extensions/range_add.rb +0 -47
- data/lib/ruby-rails-extensions/extensions/range_multiply.rb +0 -47
- data/lib/ruby-rails-extensions/extensions/safe_parse.rb +0 -42
- data/lib/ruby-rails-extensions/extensions/select_present.rb +0 -11
- data/lib/ruby-rails-extensions/extensions/select_present_join.rb +0 -7
- data/lib/ruby-rails-extensions/extensions/set_to_sentence.rb +0 -11
- data/lib/ruby-rails-extensions/extensions/to_local.rb +0 -26
- data/lib/ruby-rails-extensions/extensions/to_negative_i.rb +0 -45
- data/lib/ruby-rails-extensions/extensions/to_nonzero_i.rb +0 -45
- data/lib/ruby-rails-extensions/extensions/to_positive_i.rb +0 -45
- data/lib/ruby-rails-extensions/extensions/todays_date.rb +0 -17
- data/lib/ruby-rails-extensions/extensions/uniq_map.rb +0 -25
- data/lib/ruby-rails-extensions/extensions/weighted_sum.rb +0 -25
- data/lib/ruby-rails-extensions/extensions/zero_range.rb +0 -22
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 63384b5d08dc21bee31ea0efa671be2f67158db5170ae6befc67e807bb327165
|
4
|
+
data.tar.gz: 59aae08f32d2792062dd41fcc92fbe625f48084453e12e5b890af6797ce09129
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 34f78b9aeb8c96af2d67801c1ab7e1b833993703f6f90293558df03dc646e129f8eb7b4b9937116f77dbcda3e154fc1c513bf2ea42350053674fa89e271bcc0d
|
7
|
+
data.tar.gz: c19b9648f700e4b5b380c970d018a389cdd74f2de5c84f0eb94da8677048e8214f028763f9ce88672700a52b9c7ed63738925089c0f06c0cf1cac02d64b8bf7c
|
data/CHANGELOG.md
CHANGED
@@ -1,41 +1,7 @@
|
|
1
1
|
Unreleased Changes
|
2
2
|
------------------
|
3
3
|
|
4
|
-
0.
|
5
|
-
------------------
|
6
|
-
|
7
|
-
* Modules added:
|
8
|
-
* `safe_parse`
|
9
|
-
* `to_local`
|
10
|
-
* `assign_nil`
|
11
|
-
* `todays_date`
|
12
|
-
* `humanize_symbol`
|
13
|
-
* `weighted_sum`
|
14
|
-
* `any_value`
|
15
|
-
* `all_values`
|
16
|
-
* `no_values`
|
17
|
-
* `any_key`
|
18
|
-
* `all_keys`
|
19
|
-
* `no_keys`
|
20
|
-
* `set_to_sentence`
|
21
|
-
* `uniq_map`
|
22
|
-
* `only_some`
|
23
|
-
* `clean_string`
|
24
|
-
* `select_present`
|
25
|
-
* `quarter_dates`
|
26
|
-
* `compact_blank_join`
|
27
|
-
* `select_present_join`
|
28
|
-
* `range_add`
|
29
|
-
* `range_multiply`
|
30
|
-
* `zero_range`
|
31
|
-
* `boolean_scope`
|
32
|
-
* `to_positive_i`
|
33
|
-
* `to_negative_i`
|
34
|
-
* `to_nonzero_i`
|
35
|
-
* Other changes:
|
36
|
-
* Restructured errors' namespace
|
37
|
-
|
38
|
-
0.1.0 (2023-09-25)
|
4
|
+
1.0.0 (2023-09-25)
|
39
5
|
------------------
|
40
6
|
|
41
7
|
* Initial release
|
@@ -3,12 +3,17 @@
|
|
3
3
|
require 'forwardable'
|
4
4
|
require 'set'
|
5
5
|
|
6
|
+
module FindBangExtension
|
7
|
+
class NotFoundError < StandardError
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
6
11
|
Array.class_eval do
|
7
12
|
unless method_defined?(:find!)
|
8
13
|
# :nodoc:
|
9
14
|
def find!(&block)
|
10
15
|
x = find(&block)
|
11
|
-
raise(
|
16
|
+
raise(FindBangExtension::NotFoundError, 'Not found') if x.nil?
|
12
17
|
|
13
18
|
x
|
14
19
|
end
|
@@ -1,5 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
module PresenceBangExtension
|
4
|
+
class BlankObjectError < StandardError
|
5
|
+
end
|
6
|
+
end
|
7
|
+
|
3
8
|
Object.class_eval do
|
4
9
|
unless method_defined?(:presence!)
|
5
10
|
# Returns self if `present?`
|
@@ -9,7 +14,7 @@ Object.class_eval do
|
|
9
14
|
# @return [*]
|
10
15
|
#
|
11
16
|
def presence!
|
12
|
-
raise(
|
17
|
+
raise(PresenceBangExtension::BlankObjectError, 'Blank object') if blank?
|
13
18
|
|
14
19
|
self
|
15
20
|
end
|
@@ -1,19 +1,40 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative 'ruby-rails-extensions/errors'
|
4
|
-
|
5
3
|
module RubyRailsExtensions
|
6
|
-
|
4
|
+
# @return [CONFIGURATION]
|
5
|
+
def self.configuration
|
6
|
+
@configuration ||= CONFIGURATION.new
|
7
|
+
end
|
8
|
+
|
9
|
+
# @yield [Configuration]
|
10
|
+
def self.configure
|
11
|
+
yield(configuration)
|
12
|
+
|
13
|
+
gem_list.each do |gem_base|
|
14
|
+
if configuration.public_send("#{flag_name(gem_base)}?")
|
15
|
+
require_relative("ruby-rails-extensions/extensions/#{gem_base}")
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
# @return [Array<Symbol>]
|
21
|
+
def configuration_flags
|
22
|
+
CONFIGURATION.members
|
23
|
+
end
|
24
|
+
|
25
|
+
module_function :configuration_flags
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
# @return [Symbol] the flag name
|
30
|
+
def flag_name(gem_base)
|
31
|
+
:"include_#{gem_base}"
|
32
|
+
end
|
33
|
+
|
34
|
+
module_function :flag_name
|
35
|
+
|
7
36
|
BOOLEAN_GEMS = %i[
|
8
|
-
all_keys
|
9
|
-
all_values
|
10
|
-
any_key
|
11
|
-
any_value
|
12
|
-
assign_nil
|
13
|
-
boolean_scope
|
14
|
-
clean_string
|
15
37
|
compact_map
|
16
|
-
compact_blank_join
|
17
38
|
current_day
|
18
39
|
current_month
|
19
40
|
current_week
|
@@ -25,105 +46,46 @@ module RubyRailsExtensions
|
|
25
46
|
first_dupe
|
26
47
|
google_format
|
27
48
|
hash_only
|
28
|
-
humanize_symbol
|
29
49
|
in_utc
|
30
50
|
input
|
31
51
|
month_and_year
|
32
52
|
month_year
|
33
|
-
no_keys
|
34
|
-
no_values
|
35
|
-
only_some
|
36
53
|
overlaps
|
37
54
|
pipe
|
38
55
|
presence_bang
|
39
|
-
quarter_dates
|
40
|
-
range_add
|
41
|
-
range_multiply
|
42
56
|
remove_reserved_keywords
|
43
|
-
safe_parse
|
44
|
-
select_present
|
45
|
-
select_present_join
|
46
|
-
set_to_sentence
|
47
57
|
to_bool
|
48
58
|
to_dec
|
49
59
|
to_i
|
50
|
-
to_local
|
51
|
-
to_negative_i
|
52
|
-
to_nonzero_i
|
53
60
|
to_or_sentence
|
54
|
-
to_positive_i
|
55
61
|
to_sort_i
|
56
62
|
to_x
|
57
|
-
todays_date
|
58
|
-
uniq_map
|
59
63
|
usd_to_f
|
60
64
|
usd_to_i
|
61
|
-
weighted_sum
|
62
65
|
yesno
|
63
|
-
zero_range
|
64
66
|
].freeze
|
65
67
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
def self.flag_name(gem_base)
|
70
|
-
:"include_#{gem_base}"
|
68
|
+
# @return [Array<Symbol>] the list of gems
|
69
|
+
def gem_list
|
70
|
+
BOOLEAN_GEMS
|
71
71
|
end
|
72
72
|
|
73
|
-
|
74
|
-
include_extension = flag_name(extension_name)
|
73
|
+
module_function :gem_list
|
75
74
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
75
|
+
CONFIGURATION = Struct.new(*gem_list.map { |gem| flag_name(gem) }) do
|
76
|
+
members.each do |gem_member|
|
77
|
+
define_method(:"#{gem_member}?") do
|
78
|
+
public_send(gem_member) != false
|
79
|
+
end
|
80
80
|
end
|
81
|
-
end
|
82
81
|
|
83
|
-
|
84
|
-
|
85
|
-
|
82
|
+
# Sets all flags to true by default
|
83
|
+
def initialize
|
84
|
+
super
|
86
85
|
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
public_send("#{include_extension}=", true)
|
86
|
+
members.each do |gem_member|
|
87
|
+
public_send("#{gem_member}=", true)
|
88
|
+
end
|
91
89
|
end
|
92
90
|
end
|
93
|
-
|
94
|
-
# @return [Array<Symbol>]
|
95
|
-
def flags
|
96
|
-
BOOLEAN_GEMS.map { |f| flag_name(f) }
|
97
|
-
end
|
98
|
-
|
99
|
-
private
|
100
|
-
|
101
|
-
# @return [Symbol] the flag name
|
102
|
-
def flag_name(gem_base)
|
103
|
-
self.class.flag_name(gem_base)
|
104
|
-
end
|
105
|
-
end
|
106
|
-
|
107
|
-
# @return [Configuration]
|
108
|
-
def self.configuration
|
109
|
-
@configuration ||= Configuration.new
|
110
|
-
end
|
111
|
-
|
112
|
-
# @yield [Configuration]
|
113
|
-
def self.configure
|
114
|
-
yield(configuration)
|
115
|
-
|
116
|
-
Configuration::BOOLEAN_GEMS.each do |extension|
|
117
|
-
next unless configuration.public_send("#{extension}?")
|
118
|
-
|
119
|
-
require_relative("ruby-rails-extensions/extensions/#{extension}")
|
120
|
-
end
|
121
|
-
end
|
122
|
-
|
123
|
-
# @return [Array<Symbol>]
|
124
|
-
def configuration_flags
|
125
|
-
configuration.flags
|
126
|
-
end
|
127
|
-
|
128
|
-
module_function :configuration_flags
|
129
91
|
end
|
metadata
CHANGED
@@ -1,43 +1,35 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-rails-extensions
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0.pre.rc.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brands Insurance
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-09-
|
11
|
+
date: 2023-09-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name: rubocop
|
14
|
+
name: rubocop-rubomatic-rails
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 1.
|
20
|
-
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - '='
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: 1.28.2
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: rubocop-performance
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - '='
|
19
|
+
version: 1.3.0
|
20
|
+
- - "<"
|
32
21
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
22
|
+
version: '2.0'
|
34
23
|
type: :development
|
35
24
|
prerelease: false
|
36
25
|
version_requirements: !ruby/object:Gem::Requirement
|
37
26
|
requirements:
|
38
|
-
- -
|
27
|
+
- - ">="
|
39
28
|
- !ruby/object:Gem::Version
|
40
|
-
version: 1.
|
29
|
+
version: 1.3.0
|
30
|
+
- - "<"
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '2.0'
|
41
33
|
description:
|
42
34
|
email:
|
43
35
|
- documents@brandsinsurance.com
|
@@ -48,15 +40,6 @@ files:
|
|
48
40
|
- CHANGELOG.md
|
49
41
|
- LICENSE.txt
|
50
42
|
- lib/ruby-rails-extensions.rb
|
51
|
-
- lib/ruby-rails-extensions/errors.rb
|
52
|
-
- lib/ruby-rails-extensions/extensions/all_keys.rb
|
53
|
-
- lib/ruby-rails-extensions/extensions/all_values.rb
|
54
|
-
- lib/ruby-rails-extensions/extensions/any_key.rb
|
55
|
-
- lib/ruby-rails-extensions/extensions/any_value.rb
|
56
|
-
- lib/ruby-rails-extensions/extensions/assign_nil.rb
|
57
|
-
- lib/ruby-rails-extensions/extensions/boolean_scope.rb
|
58
|
-
- lib/ruby-rails-extensions/extensions/clean_string.rb
|
59
|
-
- lib/ruby-rails-extensions/extensions/compact_blank_join.rb
|
60
43
|
- lib/ruby-rails-extensions/extensions/compact_map.rb
|
61
44
|
- lib/ruby-rails-extensions/extensions/current_day.rb
|
62
45
|
- lib/ruby-rails-extensions/extensions/current_month.rb
|
@@ -69,42 +52,23 @@ files:
|
|
69
52
|
- lib/ruby-rails-extensions/extensions/first_dupe.rb
|
70
53
|
- lib/ruby-rails-extensions/extensions/google_format.rb
|
71
54
|
- lib/ruby-rails-extensions/extensions/hash_only.rb
|
72
|
-
- lib/ruby-rails-extensions/extensions/humanize_symbol.rb
|
73
55
|
- lib/ruby-rails-extensions/extensions/in_utc.rb
|
74
56
|
- lib/ruby-rails-extensions/extensions/input.rb
|
75
57
|
- lib/ruby-rails-extensions/extensions/month_and_year.rb
|
76
58
|
- lib/ruby-rails-extensions/extensions/month_year.rb
|
77
|
-
- lib/ruby-rails-extensions/extensions/no_keys.rb
|
78
|
-
- lib/ruby-rails-extensions/extensions/no_values.rb
|
79
|
-
- lib/ruby-rails-extensions/extensions/only_some.rb
|
80
59
|
- lib/ruby-rails-extensions/extensions/overlaps.rb
|
81
60
|
- lib/ruby-rails-extensions/extensions/pipe.rb
|
82
61
|
- lib/ruby-rails-extensions/extensions/presence_bang.rb
|
83
|
-
- lib/ruby-rails-extensions/extensions/quarter_dates.rb
|
84
|
-
- lib/ruby-rails-extensions/extensions/range_add.rb
|
85
|
-
- lib/ruby-rails-extensions/extensions/range_multiply.rb
|
86
62
|
- lib/ruby-rails-extensions/extensions/remove_reserved_keywords.rb
|
87
|
-
- lib/ruby-rails-extensions/extensions/safe_parse.rb
|
88
|
-
- lib/ruby-rails-extensions/extensions/select_present.rb
|
89
|
-
- lib/ruby-rails-extensions/extensions/select_present_join.rb
|
90
|
-
- lib/ruby-rails-extensions/extensions/set_to_sentence.rb
|
91
63
|
- lib/ruby-rails-extensions/extensions/to_bool.rb
|
92
64
|
- lib/ruby-rails-extensions/extensions/to_dec.rb
|
93
65
|
- lib/ruby-rails-extensions/extensions/to_i.rb
|
94
|
-
- lib/ruby-rails-extensions/extensions/to_local.rb
|
95
|
-
- lib/ruby-rails-extensions/extensions/to_negative_i.rb
|
96
|
-
- lib/ruby-rails-extensions/extensions/to_nonzero_i.rb
|
97
66
|
- lib/ruby-rails-extensions/extensions/to_or_sentence.rb
|
98
|
-
- lib/ruby-rails-extensions/extensions/to_positive_i.rb
|
99
67
|
- lib/ruby-rails-extensions/extensions/to_sort_i.rb
|
100
68
|
- lib/ruby-rails-extensions/extensions/to_x.rb
|
101
|
-
- lib/ruby-rails-extensions/extensions/todays_date.rb
|
102
|
-
- lib/ruby-rails-extensions/extensions/uniq_map.rb
|
103
69
|
- lib/ruby-rails-extensions/extensions/usd_to_f.rb
|
104
70
|
- lib/ruby-rails-extensions/extensions/usd_to_i.rb
|
105
|
-
- lib/ruby-rails-extensions/extensions/weighted_sum.rb
|
106
71
|
- lib/ruby-rails-extensions/extensions/yesno.rb
|
107
|
-
- lib/ruby-rails-extensions/extensions/zero_range.rb
|
108
72
|
- lib/ruby-rails-extensions/version.rb
|
109
73
|
homepage: https://github.com/BrandsInsurance/rails-extensions
|
110
74
|
licenses:
|
@@ -120,14 +84,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
120
84
|
requirements:
|
121
85
|
- - ">="
|
122
86
|
- !ruby/object:Gem::Version
|
123
|
-
version:
|
87
|
+
version: 3.0.1
|
124
88
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
125
89
|
requirements:
|
126
|
-
- - "
|
90
|
+
- - ">"
|
127
91
|
- !ruby/object:Gem::Version
|
128
|
-
version:
|
92
|
+
version: 1.3.1
|
129
93
|
requirements: []
|
130
|
-
rubygems_version: 3.
|
94
|
+
rubygems_version: 3.2.15
|
131
95
|
signing_key:
|
132
96
|
specification_version: 4
|
133
97
|
summary: Loads custom methods on various ruby classes
|
@@ -1,17 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module RubyRailsExtensions
|
4
|
-
module Errors
|
5
|
-
class NonNumericError < StandardError
|
6
|
-
end
|
7
|
-
|
8
|
-
class NotFoundError < StandardError
|
9
|
-
end
|
10
|
-
|
11
|
-
class BlankObjectError < StandardError
|
12
|
-
end
|
13
|
-
|
14
|
-
class InvalidFormatError < StandardError
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
@@ -1,67 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
if defined?(ActiveModel::AttributeAssignment) && Hash.method_defined?(:stringify_keys)
|
4
|
-
module ActiveModel
|
5
|
-
module AttributeAssignment
|
6
|
-
unless method_defined?(:assign_nil_attributes)
|
7
|
-
# Allows you to set nil attributes by passing in a hash of attributes with
|
8
|
-
# keys matching the attribute names.
|
9
|
-
#
|
10
|
-
# @raise [ActiveModel::ForbiddenAttributesError] If the passed hash responds to `permitted?` method
|
11
|
-
# and the return value of this method is +false+.
|
12
|
-
#
|
13
|
-
# @example
|
14
|
-
#
|
15
|
-
# class Cat
|
16
|
-
# include ActiveModel::AttributeAssignment
|
17
|
-
# attr_accessor :name, :status
|
18
|
-
# end
|
19
|
-
#
|
20
|
-
# cat = Cat.new
|
21
|
-
# cat.assign_nil_attributes(name: "Gorby")
|
22
|
-
# cat.name # => 'Gorby'
|
23
|
-
# cat.status # => nil
|
24
|
-
# cat.assign_nil_attributes(status: "yawning")
|
25
|
-
# cat.name # => 'Gorby'
|
26
|
-
# cat.status # => 'yawning'
|
27
|
-
# cat.assign_nil_attributes(status: "sleeping")
|
28
|
-
# cat.name # => 'Gorby'
|
29
|
-
# cat.status # => 'yawning'
|
30
|
-
#
|
31
|
-
# @param new_attributes
|
32
|
-
#
|
33
|
-
# @return [void]
|
34
|
-
#
|
35
|
-
def assign_nil_attributes(new_attributes)
|
36
|
-
unless new_attributes.respond_to?(:stringify_keys)
|
37
|
-
raise(ArgumentError, 'When assigning attributes, you must pass a hash as an argument.')
|
38
|
-
end
|
39
|
-
|
40
|
-
return if new_attributes.empty?
|
41
|
-
|
42
|
-
attributes = new_attributes.stringify_keys
|
43
|
-
|
44
|
-
_assign_nil_attributes(sanitize_for_mass_assignment(attributes))
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
private
|
49
|
-
|
50
|
-
unless private_method_defined?(:_assign_nil_attributes)
|
51
|
-
# Assign any `nil` attribute
|
52
|
-
#
|
53
|
-
# @param attributes [Hash]
|
54
|
-
#
|
55
|
-
# @return [void]
|
56
|
-
#
|
57
|
-
def _assign_nil_attributes(attributes)
|
58
|
-
attributes.each do |k, v|
|
59
|
-
next unless v.nil?
|
60
|
-
|
61
|
-
_assign_attribute(k, v)
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
@@ -1,49 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module RubyRailsExtensions
|
4
|
-
module Extensions
|
5
|
-
module BooleanScope
|
6
|
-
if defined?(ActiveSupport::Concern)
|
7
|
-
extend ActiveSupport::Concern
|
8
|
-
|
9
|
-
class_methods do
|
10
|
-
# Calls `boolean_scope` for each boolean column
|
11
|
-
def add_boolean_scopes
|
12
|
-
return unless table_exists?
|
13
|
-
|
14
|
-
columns.each do |column|
|
15
|
-
next unless column.type == :boolean
|
16
|
-
|
17
|
-
# @!method not_#{column.name}?
|
18
|
-
# @return [Boolean]
|
19
|
-
# @!method column.name
|
20
|
-
# @!scope class
|
21
|
-
# @return [ActiveRecord::Relation<>]
|
22
|
-
# @!method not_#{column.name}
|
23
|
-
# @!scope class
|
24
|
-
# @return [ActiveRecord::Relation<>]
|
25
|
-
boolean_scope(column.name)
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
# Defines 2 scopes and 1 ? method
|
30
|
-
#
|
31
|
-
# @param column_name [Symbol, String] The boolean column name
|
32
|
-
# @param negative [Symbol, String] opposite of the column name
|
33
|
-
# defaults to the column name with "not_" as a prefix
|
34
|
-
#
|
35
|
-
# @return [void]
|
36
|
-
#
|
37
|
-
def boolean_scope(column_name, negative = "not_#{column_name}")
|
38
|
-
scope(:"#{column_name}", -> { where(column_name => true) })
|
39
|
-
scope(:"#{negative}", -> { where(column_name => false) })
|
40
|
-
|
41
|
-
define_method("#{negative}?") do
|
42
|
-
!__send__("#{column_name}?")
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
@@ -1,41 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
String.class_eval do
|
4
|
-
unless method_defined?(:clean!)
|
5
|
-
# Remove all non-UTF-8 chars from a string.
|
6
|
-
#
|
7
|
-
# @param replace_with [String, nil] What to replace invalid chars with.
|
8
|
-
#
|
9
|
-
# @return [String]
|
10
|
-
#
|
11
|
-
def clean!(replace_with = '')
|
12
|
-
replace(encode('UTF-8', invalid: :replace, undef: :replace, replace: replace_with))
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
unless method_defined?(:clean)
|
17
|
-
# @see {#clean!}
|
18
|
-
def clean(replace_with = '')
|
19
|
-
dup.clean!(replace_with)
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
unless method_defined?(:clean_binary!)
|
24
|
-
# Remove all non-UTF-8 chars from a string and convert to binary.
|
25
|
-
#
|
26
|
-
# @param replace_with [String, nil] What to replace invalid chars with.
|
27
|
-
#
|
28
|
-
# @return [String]
|
29
|
-
#
|
30
|
-
def clean_binary!(replace_with = '')
|
31
|
-
replace(encode('UTF-8', 'binary', invalid: :replace, undef: :replace, replace: replace_with))
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
unless method_defined?(:clean_binary)
|
36
|
-
# @see {#clean_binary!}
|
37
|
-
def clean_binary(replace_with = '')
|
38
|
-
dup.clean_binary!(replace_with)
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
@@ -1,13 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
Enumerable.class_eval do
|
4
|
-
if method_defined?(:compact_blank) && !method_defined?(:compact_blank_join)
|
5
|
-
# Joins the elements together after calling `compact_blank`
|
6
|
-
#
|
7
|
-
# @return [String]
|
8
|
-
#
|
9
|
-
def compact_blank_join(using = '')
|
10
|
-
compact_blank.join(using)
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
@@ -1,28 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
Array.class_eval do
|
4
|
-
unless method_defined?(:only_some?)
|
5
|
-
# Same as `my_array.any?(&block) && !my_array.all?(&block)`
|
6
|
-
#
|
7
|
-
# @return [Boolean]
|
8
|
-
#
|
9
|
-
def only_some?(*meth_args)
|
10
|
-
# Check arg size since `any?` arg take presence over block
|
11
|
-
return any?(*meth_args) && !all?(*meth_args) if meth_args.size.positive?
|
12
|
-
|
13
|
-
any = false
|
14
|
-
all = true
|
15
|
-
|
16
|
-
each do |*args|
|
17
|
-
result = yield(*args)
|
18
|
-
|
19
|
-
any ||= result
|
20
|
-
all &&= result
|
21
|
-
|
22
|
-
break if any && !all
|
23
|
-
end
|
24
|
-
|
25
|
-
return any && !all
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
@@ -1,47 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
String.class_eval do
|
4
|
-
if !method_defined?(:quarter_start) && Date.instance_methods.include?(:beginning_of_quarter)
|
5
|
-
# Return the quarter start date.
|
6
|
-
#
|
7
|
-
# @return [Date]
|
8
|
-
#
|
9
|
-
def quarter_start
|
10
|
-
quarter_date.beginning_of_quarter
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
if !method_defined?(:quarter_end) && Date.instance_methods.include?(:end_of_quarter)
|
15
|
-
# Return the quarter end date.
|
16
|
-
#
|
17
|
-
# @return [Date]
|
18
|
-
#
|
19
|
-
def quarter_end
|
20
|
-
quarter_date.end_of_quarter
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
private
|
25
|
-
|
26
|
-
unless private_method_defined?(:quarter_date)
|
27
|
-
# Parses a string for a quarter date. Expects the string to follow: 'qQyy' where
|
28
|
-
# q = 1/2/3/4 and yy to be the last two digits of the year.
|
29
|
-
#
|
30
|
-
# @raise [RubyRailsExtensions::Errors::InvalidFormatError] if `self` is not qQyy
|
31
|
-
#
|
32
|
-
# @return [Date]
|
33
|
-
#
|
34
|
-
def quarter_date
|
35
|
-
unless match?(/\A[1-4]q\d\d\z/i)
|
36
|
-
raise(RubyRailsExtensions::Errors::InvalidFormatError, "Unexpected format (given #{self}, expected qQyy)")
|
37
|
-
end
|
38
|
-
|
39
|
-
values = scan(/\d/)
|
40
|
-
quarter = values.shift.to_i
|
41
|
-
year = "20#{values.join('')}".to_i
|
42
|
-
month = quarter * 3
|
43
|
-
|
44
|
-
Date.new(year, month, 1)
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
@@ -1,47 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
Range.class_eval do
|
4
|
-
unless method_defined?(:+)
|
5
|
-
# Allows adding a to a range. This will create a new range since ranges are immutable.
|
6
|
-
#
|
7
|
-
# @note Make sure to assign this to a new var or inline replacement `+=`.
|
8
|
-
#
|
9
|
-
# @raise [RubyRailsExtensions::Errors::NonNumericError]
|
10
|
-
#
|
11
|
-
# @param other [Numeric, Range<Numeric>]
|
12
|
-
#
|
13
|
-
# @return [Range]
|
14
|
-
#
|
15
|
-
def +(other)
|
16
|
-
unless self.begin.is_a?(Numeric)
|
17
|
-
raise(
|
18
|
-
RubyRailsExtensions::Errors::NonNumericError,
|
19
|
-
"Wrong range type (given #{self.begin.class}, expected Numeric)"
|
20
|
-
)
|
21
|
-
end
|
22
|
-
|
23
|
-
new_begin, new_end =
|
24
|
-
if other.is_a?(Range)
|
25
|
-
unless other.begin.is_a?(Numeric)
|
26
|
-
raise(
|
27
|
-
RubyRailsExtensions::Errors::NonNumericError,
|
28
|
-
"Wrong range type (given #{other.begin.class}, expected Numeric)"
|
29
|
-
)
|
30
|
-
end
|
31
|
-
|
32
|
-
[self.begin + other.begin, self.end + other.end]
|
33
|
-
else
|
34
|
-
unless other.is_a?(Numeric)
|
35
|
-
raise(
|
36
|
-
RubyRailsExtensions::Errors::NonNumericError,
|
37
|
-
"Wrong type (given #{other.class}, expected Numeric)"
|
38
|
-
)
|
39
|
-
end
|
40
|
-
|
41
|
-
[self.begin + other, self.end + other]
|
42
|
-
end
|
43
|
-
|
44
|
-
Range.new(new_begin, new_end, exclude_end?)
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
@@ -1,47 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
Range.class_eval do
|
4
|
-
unless method_defined?(:*)
|
5
|
-
# Allows multiplying a range. This will create a new range due to range objects being immutable.
|
6
|
-
#
|
7
|
-
# @note Make sure to assign this to a new var or do inline replacement `*=`.
|
8
|
-
#
|
9
|
-
# @raise [RubyRailsExtensions::Errors::NonNumericError]
|
10
|
-
#
|
11
|
-
# @param other [Numeric, Range<Numeric>]
|
12
|
-
#
|
13
|
-
# @return [Range]
|
14
|
-
#
|
15
|
-
def *(other)
|
16
|
-
unless self.begin.is_a?(Numeric)
|
17
|
-
raise(
|
18
|
-
RubyRailsExtensions::Errors::NonNumericError,
|
19
|
-
"Wrong range type (given #{self.begin.class}, expected Numeric)"
|
20
|
-
)
|
21
|
-
end
|
22
|
-
|
23
|
-
new_begin, new_end =
|
24
|
-
if other.is_a?(Range)
|
25
|
-
unless other.begin.is_a?(Numeric)
|
26
|
-
raise(
|
27
|
-
RubyRailsExtensions::Errors::NonNumericError,
|
28
|
-
"Wrong range type (given #{other.begin.class}, expected Numeric)"
|
29
|
-
)
|
30
|
-
end
|
31
|
-
|
32
|
-
[self.begin * other.begin, self.end * other.end]
|
33
|
-
else
|
34
|
-
unless other.is_a?(Numeric)
|
35
|
-
raise(
|
36
|
-
RubyRailsExtensions::Errors::NonNumericError,
|
37
|
-
"Wrong type (given #{other.class}, expected Numeric)"
|
38
|
-
)
|
39
|
-
end
|
40
|
-
|
41
|
-
[self.begin * other, self.end * other]
|
42
|
-
end
|
43
|
-
|
44
|
-
Range.new(new_begin, new_end, exclude_end?)
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
@@ -1,42 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
Date.class_eval do
|
4
|
-
class << self
|
5
|
-
unless method_defined?(:safe_parse)
|
6
|
-
# Parses the `str` and returns `nil` if invalid
|
7
|
-
def safe_parse(str)
|
8
|
-
parse(str)
|
9
|
-
rescue
|
10
|
-
nil
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
Time.class_eval do
|
17
|
-
class << self
|
18
|
-
unless method_defined?(:safe_parse)
|
19
|
-
# Parses the `str` and returns `nil` if invalid
|
20
|
-
def safe_parse(str)
|
21
|
-
parse(str)
|
22
|
-
rescue
|
23
|
-
nil
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
if defined?(ActiveSupport::TimeZone)
|
30
|
-
ActiveSupport::TimeZone.class_eval do
|
31
|
-
class << self
|
32
|
-
unless method_defined?(:safe_parse)
|
33
|
-
# Parses the `str` and returns `nil` if invalid
|
34
|
-
def safe_parse(str)
|
35
|
-
parse(str)
|
36
|
-
rescue
|
37
|
-
nil
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
@@ -1,11 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
Enumerable.class_eval do
|
4
|
-
if method_defined?(:compact_blank) && !method_defined?(:select_present)
|
5
|
-
alias_method :select_present, :compact_blank
|
6
|
-
end
|
7
|
-
|
8
|
-
if method_defined?(:compact_blank!) && !method_defined?(:select_present!)
|
9
|
-
alias_method :select_present!, :compact_blank!
|
10
|
-
end
|
11
|
-
end
|
@@ -1,26 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# TimeWithZone defines `in_time_zone`
|
4
|
-
if defined?(ActiveSupport::TimeWithZone)
|
5
|
-
require 'forwardable'
|
6
|
-
|
7
|
-
Time.class_eval do
|
8
|
-
unless method_defined?(:to_local)
|
9
|
-
extend Forwardable
|
10
|
-
|
11
|
-
def_delegators :to_datetime, :to_local
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
DateTime.class_eval do
|
16
|
-
unless method_defined?(:to_local)
|
17
|
-
# Converts to an Eastern time zone
|
18
|
-
#
|
19
|
-
# @return [DateTime]
|
20
|
-
#
|
21
|
-
def to_local
|
22
|
-
in_time_zone(RubyRailsExtensions.configuration.default_time_zone || 'Eastern Time (US & Canada)').to_datetime
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
@@ -1,45 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
String.class_eval do
|
4
|
-
unless method_defined?(:to_negative_i)
|
5
|
-
# Calls `to_i` and returns the value if it is negative
|
6
|
-
#
|
7
|
-
# @return [Integer, Nil]
|
8
|
-
#
|
9
|
-
def to_negative_i
|
10
|
-
val = to_i
|
11
|
-
|
12
|
-
return unless val.negative?
|
13
|
-
|
14
|
-
val
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
Numeric.class_eval do
|
20
|
-
unless method_defined?(:to_negative_i)
|
21
|
-
# Calls `to_i` and returns the value if it is negative
|
22
|
-
#
|
23
|
-
# @return [Integer, Nil]
|
24
|
-
#
|
25
|
-
def to_negative_i
|
26
|
-
val = to_i
|
27
|
-
|
28
|
-
return unless val.negative?
|
29
|
-
|
30
|
-
val
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
NilClass.class_eval do
|
36
|
-
unless method_defined?(:to_negative_i)
|
37
|
-
# Calls `to_i` and returns the value if it is negative
|
38
|
-
#
|
39
|
-
# @return [Nil]
|
40
|
-
#
|
41
|
-
def to_negative_i
|
42
|
-
nil
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
@@ -1,45 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
String.class_eval do
|
4
|
-
unless method_defined?(:to_nonzero_i)
|
5
|
-
# Calls `to_i` and returns the value if it is nonzero
|
6
|
-
#
|
7
|
-
# @return [Integer, Nil]
|
8
|
-
#
|
9
|
-
def to_nonzero_i
|
10
|
-
val = to_i
|
11
|
-
|
12
|
-
return if val.zero?
|
13
|
-
|
14
|
-
val
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
Numeric.class_eval do
|
20
|
-
unless method_defined?(:to_nonzero_i)
|
21
|
-
# Calls `to_i` and returns the value if it is nonzero
|
22
|
-
#
|
23
|
-
# @return [Integer, Nil]
|
24
|
-
#
|
25
|
-
def to_nonzero_i
|
26
|
-
val = to_i
|
27
|
-
|
28
|
-
return if val.zero?
|
29
|
-
|
30
|
-
val
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
NilClass.class_eval do
|
36
|
-
unless method_defined?(:to_nonzero_i)
|
37
|
-
# Calls `to_i` and returns the value if it is nonzero
|
38
|
-
#
|
39
|
-
# @return [Integer, Nil]
|
40
|
-
#
|
41
|
-
def to_nonzero_i
|
42
|
-
nil
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
@@ -1,45 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
String.class_eval do
|
4
|
-
unless method_defined?(:to_positive_i)
|
5
|
-
# Calls `to_i` and returns the value if it is positive
|
6
|
-
#
|
7
|
-
# @return [Integer, Nil]
|
8
|
-
#
|
9
|
-
def to_positive_i
|
10
|
-
val = to_i
|
11
|
-
|
12
|
-
return unless val.positive?
|
13
|
-
|
14
|
-
val
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
Numeric.class_eval do
|
20
|
-
unless method_defined?(:to_positive_i)
|
21
|
-
# Calls `to_i` and returns the value if it is positive
|
22
|
-
#
|
23
|
-
# @return [Integer, Nil]
|
24
|
-
#
|
25
|
-
def to_positive_i
|
26
|
-
val = to_i
|
27
|
-
|
28
|
-
return unless val.positive?
|
29
|
-
|
30
|
-
val
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
NilClass.class_eval do
|
36
|
-
unless method_defined?(:to_positive_i)
|
37
|
-
# Calls `to_i` and returns the value if it is positive
|
38
|
-
#
|
39
|
-
# @return [Integer, Nil]
|
40
|
-
#
|
41
|
-
def to_positive_i
|
42
|
-
nil
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
if defined?(ActiveSupport::TimeWithZone) && Time.method_defined?(:to_local)
|
4
|
-
Date.class_eval do
|
5
|
-
class << self
|
6
|
-
unless method_defined?(:todays_date)
|
7
|
-
# Returns today according to Eastern time
|
8
|
-
#
|
9
|
-
# @return [Date]
|
10
|
-
#
|
11
|
-
def todays_date
|
12
|
-
Time.zone.now.to_local.to_date
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
@@ -1,25 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
Array.class_eval do
|
4
|
-
unless method_defined?(:uniq_map)
|
5
|
-
# Same as `my_array.map(&block).uniq`
|
6
|
-
#
|
7
|
-
# @return [Array, Enumerable]
|
8
|
-
#
|
9
|
-
def uniq_map
|
10
|
-
return to_enum(:uniq_map) unless block_given?
|
11
|
-
|
12
|
-
results = []
|
13
|
-
|
14
|
-
each do |*args|
|
15
|
-
result = yield(*args)
|
16
|
-
|
17
|
-
next if results.include?(result)
|
18
|
-
|
19
|
-
results.push(result)
|
20
|
-
end
|
21
|
-
|
22
|
-
return results
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
@@ -1,25 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
Array.class_eval do
|
4
|
-
unless method_defined?(:weighted_sum)
|
5
|
-
# Sums the array with each element weighing 10 times as the next.
|
6
|
-
# Expects `self` to be [Array<Numeric>]
|
7
|
-
#
|
8
|
-
# @raise [RubyRailsExtensions::Errors::NonNumericError] if any element is not Numeric
|
9
|
-
#
|
10
|
-
# @return [Integer]
|
11
|
-
#
|
12
|
-
def weighted_sum
|
13
|
-
each_with_index.sum do |val, index|
|
14
|
-
unless Numeric === val
|
15
|
-
raise(
|
16
|
-
RubyRailsExtensions::Errors::NonNumericError,
|
17
|
-
"Wrong element type (given #{val.class}, expected Numeric)"
|
18
|
-
)
|
19
|
-
end
|
20
|
-
|
21
|
-
val * (10**(size - index))
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
@@ -1,22 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
Range.class_eval do
|
4
|
-
unless method_defined?(:zero?)
|
5
|
-
# Checks if the whole range is zero.
|
6
|
-
#
|
7
|
-
# @raise [RubyRailsExtensions::Errors::NonNumericError]
|
8
|
-
#
|
9
|
-
# @return [Boolean]
|
10
|
-
#
|
11
|
-
def zero?
|
12
|
-
unless self.begin.is_a?(Numeric)
|
13
|
-
raise(
|
14
|
-
RubyRailsExtensions::Errors::NonNumericError,
|
15
|
-
"Wrong range type (given #{self.begin.class}, expected Numeric)"
|
16
|
-
)
|
17
|
-
end
|
18
|
-
|
19
|
-
self.begin.zero? && self.end.zero?
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|