darthjee-core_ext 1.7.3 → 1.7.4
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/.circleci/config.yml +19 -8
- data/.gitignore +1 -0
- data/.rubocop.yml +7 -0
- data/.rubocop_todo.yml +7 -3
- data/Dockerfile +9 -0
- data/README.md +5 -6
- data/Rakefile +2 -0
- data/config/yardstick.rb +13 -0
- data/config/yardstick.yml +35 -0
- data/core_ext.gemspec +9 -7
- data/docker-compose.yml +3 -6
- data/lib/darthjee/core_ext/array.rb +2 -2
- data/lib/darthjee/core_ext/class.rb +90 -4
- data/lib/darthjee/core_ext/enumerable.rb +5 -1
- data/lib/darthjee/core_ext/hash.rb +30 -0
- data/lib/darthjee/core_ext/hash/cameliazable.rb +91 -0
- data/lib/darthjee/core_ext/hash/chain_fetcher.rb +10 -0
- data/lib/darthjee/core_ext/hash/key_changeable.rb +85 -53
- data/lib/darthjee/core_ext/hash/key_changer.rb +41 -31
- data/lib/darthjee/core_ext/hash/value_changer.rb +128 -11
- data/lib/darthjee/core_ext/version.rb +1 -1
- data/spec/integration/yard/{array → darthjee/core_ext/array}/hash_builder_spec.rb +3 -3
- data/spec/integration/yard/{array_spec.rb → darthjee/core_ext/array_spec.rb} +0 -0
- data/spec/integration/yard/darthjee/core_ext/class/default_value_spec.rb +143 -0
- data/spec/integration/yard/{date → darthjee/core_ext/date}/days_between_spec.rb +6 -6
- data/spec/integration/yard/{enumerable_spec.rb → darthjee/core_ext/enumerable_spec.rb} +0 -0
- data/spec/integration/yard/darthjee/core_ext/hash/cameliazable_spec.rb +34 -0
- data/spec/integration/yard/darthjee/core_ext/hash/chain_fetcher_spec.rb +51 -0
- data/spec/integration/yard/darthjee/core_ext/hash/key_changeable_spec.rb +48 -0
- data/spec/integration/yard/{hash → darthjee/core_ext/hash}/transformable_spec.rb +7 -3
- data/spec/integration/yard/darthjee/core_ext/hash/value_changer_spec.rb +66 -0
- data/spec/integration/yard/darthjee/core_ext/hash_spec.rb +42 -0
- data/spec/lib/array_spec.rb +27 -17
- data/spec/lib/class_spec.rb +108 -7
- data/spec/lib/darthjee/core_ext/hash/deep_hash_constructor_spec.rb +1 -1
- data/spec/lib/darthjee/core_ext/hash/key_changer_spec.rb +8 -8
- data/spec/lib/darthjee/core_ext/hash/keys_sorter_spec.rb +1 -0
- data/spec/lib/darthjee/core_ext/hash/to_hash_mapper_spec.rb +1 -0
- data/spec/lib/darthjee/core_ext/hash/value_changer_spec.rb +246 -0
- data/spec/lib/date_spec.rb +5 -4
- data/spec/lib/hash_spec.rb +45 -32
- data/spec/lib/math_spec.rb +1 -0
- data/spec/lib/numeric_spec.rb +39 -17
- data/spec/lib/object_spec.rb +7 -7
- data/spec/lib/symbol_spec.rb +2 -2
- data/spec/lib/time_spec.rb +5 -4
- data/spec/support/models/default_reader_model.rb +8 -0
- data/spec/support/models/default_value_model.rb +2 -0
- data/spec/support/models/dummy_iterator.rb +15 -0
- data/spec/support/models/dummy_transformer.rb +15 -0
- data/spec/support/shared_examples/array/array_random.rb +2 -1
- data/spec/support/shared_examples/clean.rb +20 -20
- data/spec/support/shared_examples/date.rb +18 -13
- data/spec/support/shared_examples/hash/chain_fetch.rb +4 -3
- data/spec/support/shared_examples/hash/chain_hash_keys_changer.rb +14 -7
- data/spec/support/shared_examples/hash/hash_keys_changer.rb +10 -4
- data/spec/support/shared_examples/hash/hash_transpose.rb +1 -1
- data/spec/support/shared_examples/hash/keys_appender.rb +14 -4
- data/spec/support/shared_examples/hash/keys_camelizer.rb +7 -7
- data/spec/support/shared_examples/hash/keys_sorter.rb +3 -3
- data/spec/support/shared_examples/hash/keys_underscorer.rb +2 -2
- data/spec/support/shared_examples/hash/map_to_hash.rb +14 -12
- data/spec/support/shared_examples/hash/remap.rb +4 -4
- data/spec/support/shared_examples/hash/value_changer.rb +40 -33
- metadata +70 -20
- data/spec/integration/yard/class/default_value_spec.rb +0 -58
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 103b4b6d1acc61970210009223f1dafb42ffe566
|
4
|
+
data.tar.gz: 6887e4ef498e5e8edaa14c604ac8b79b91f9e709
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 21eed9f42d42a66a273413cdd784b32e3f1b07b9be39e6c34e8dba7162c442ad2cb4b96be93177a4d6b33e87e20365524b4e5d72bccbe27cbc22d1f0943c28db
|
7
|
+
data.tar.gz: 6de12c71400aa5f5cbd50b7614df418c50815ddf4f222cfe56b3cc852acbd2a745108e3f56394f065de4fb9c518fe02b0a77ddc02669f626b17f0c77b7b17054
|
data/.circleci/config.yml
CHANGED
@@ -2,13 +2,24 @@ version: 2
|
|
2
2
|
jobs:
|
3
3
|
build:
|
4
4
|
docker:
|
5
|
-
- image:
|
5
|
+
- image: darthjee/circleci_ruby_240:0.1.0
|
6
6
|
steps:
|
7
7
|
- checkout
|
8
|
-
- run:
|
9
|
-
|
10
|
-
|
11
|
-
- run:
|
12
|
-
|
13
|
-
|
14
|
-
- run:
|
8
|
+
- run:
|
9
|
+
name: Prepare Coverage Test Report
|
10
|
+
command: cc-test-reporter before-build
|
11
|
+
- run:
|
12
|
+
name: Bundle Install
|
13
|
+
command: bundle install
|
14
|
+
- run:
|
15
|
+
name: RSpec
|
16
|
+
command: bundle exec rspec
|
17
|
+
- run:
|
18
|
+
name: Rubocop
|
19
|
+
command: rubocop
|
20
|
+
- run:
|
21
|
+
name: Coverage Test Report
|
22
|
+
command: cc-test-reporter after-build --exit-code $?
|
23
|
+
- run:
|
24
|
+
name: Yardstick coverage check
|
25
|
+
command: bundle exec rake verify_measurements
|
data/.gitignore
CHANGED
data/.rubocop.yml
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require: rubocop-rspec
|
1
2
|
inherit_from: .rubocop_todo.yml
|
2
3
|
|
3
4
|
AllCops:
|
@@ -11,3 +12,9 @@ Metrics/BlockLength:
|
|
11
12
|
Exclude:
|
12
13
|
- 'spec/**/*_spec.rb'
|
13
14
|
- 'spec/support/shared_*/**/*.rb'
|
15
|
+
|
16
|
+
RSpec/AlignLeftLetBrace:
|
17
|
+
Enabled: true
|
18
|
+
|
19
|
+
RSpec/NestedGroups:
|
20
|
+
Max: 5
|
data/.rubocop_todo.yml
CHANGED
@@ -1,12 +1,16 @@
|
|
1
1
|
# This configuration was generated by
|
2
2
|
# `rubocop --auto-gen-config`
|
3
|
-
# on
|
3
|
+
# on 2019-02-18 18:10:37 +0000 using RuboCop version 0.58.1.
|
4
4
|
# The point is for the user to remove these configuration records
|
5
5
|
# one by one as the offenses are removed from the code base.
|
6
6
|
# Note that changes in the inspected code, or installation of new
|
7
7
|
# versions of RuboCop, may require this file to be generated again.
|
8
8
|
|
9
|
-
# Offense count:
|
9
|
+
# Offense count: 3
|
10
|
+
# Configuration parameters: AggregateFailuresByDefault.
|
11
|
+
RSpec/MultipleExpectations:
|
12
|
+
Max: 2
|
13
|
+
|
14
|
+
# Offense count: 24
|
10
15
|
Style/Documentation:
|
11
16
|
Enabled: false
|
12
|
-
|
data/Dockerfile
ADDED
data/README.md
CHANGED
@@ -3,9 +3,8 @@ Darthjee/CoreExt
|
|
3
3
|
|
4
4
|

|
5
5
|
|
6
|
-
[](https://codeclimate.com/github/darthjee/core_ext)
|
6
|
+
[](https://codeclimate.com/github/darthjee/core_ext/maintainability)
|
7
|
+
[](https://codeclimate.com/github/darthjee/core_ext/test_coverage)
|
9
8
|
|
10
9
|
Yard Documentation
|
11
10
|
-------------------
|
@@ -16,17 +15,17 @@ This project adds some new methods to the core ruby classes
|
|
16
15
|
|
17
16
|
To use core-ext either intall directly
|
18
17
|
|
19
|
-
```
|
18
|
+
```shell
|
20
19
|
gem install darthjee-core_ext
|
21
20
|
```
|
22
21
|
|
23
22
|
or add it to Gemfile
|
24
23
|
|
25
|
-
```
|
24
|
+
```shell
|
26
25
|
gem 'darthjee-core_ext'
|
27
26
|
```
|
28
27
|
|
29
|
-
```
|
28
|
+
```shell
|
30
29
|
bundle install darthjee-core_ext
|
31
30
|
```
|
32
31
|
|
data/Rakefile
CHANGED
data/config/yardstick.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'yardstick/rake/measurement'
|
4
|
+
require 'yardstick/rake/verify'
|
5
|
+
require 'yaml'
|
6
|
+
|
7
|
+
options = YAML.load_file('config/yardstick.yml')
|
8
|
+
|
9
|
+
Yardstick::Rake::Measurement.new(:yardstick_measure, options) do |measurement|
|
10
|
+
measurement.output = 'measurement/report.txt'
|
11
|
+
end
|
12
|
+
|
13
|
+
Yardstick::Rake::Verify.new(:verify_measurements, options)
|
@@ -0,0 +1,35 @@
|
|
1
|
+
threshold: 65.4
|
2
|
+
require_exact_threshold: false
|
3
|
+
rules:
|
4
|
+
ApiTag::Presence:
|
5
|
+
enabled: true
|
6
|
+
exclude: []
|
7
|
+
ApiTag::Inclusion:
|
8
|
+
enabled: true
|
9
|
+
exclude: []
|
10
|
+
ApiTag::ProtectedMethod:
|
11
|
+
enabled: true
|
12
|
+
exclude: []
|
13
|
+
ApiTag::PrivateMethod:
|
14
|
+
enabled: true
|
15
|
+
exclude: []
|
16
|
+
ExampleTag:
|
17
|
+
enabled: true
|
18
|
+
exclude: []
|
19
|
+
ReturnTag:
|
20
|
+
enabled: true
|
21
|
+
exclude:
|
22
|
+
- Darthjee::CoreExt::Hash::ChainFetcher
|
23
|
+
Summary::Presence:
|
24
|
+
enabled: true
|
25
|
+
exclude:
|
26
|
+
- Darthjee::CoreExt::Hash::ChainFetcher
|
27
|
+
Summary::Length:
|
28
|
+
enabled: true
|
29
|
+
exclude: []
|
30
|
+
Summary::Delimiter:
|
31
|
+
enabled: true
|
32
|
+
exclude: []
|
33
|
+
Summary::SingleLine:
|
34
|
+
enabled: true
|
35
|
+
exclude: []
|
data/core_ext.gemspec
CHANGED
@@ -20,11 +20,13 @@ Gem::Specification.new do |gem|
|
|
20
20
|
|
21
21
|
gem.add_runtime_dependency 'activesupport', '>= 5.2.x'
|
22
22
|
|
23
|
-
gem.add_development_dependency 'bundler'
|
24
|
-
gem.add_development_dependency 'pry-nav',
|
25
|
-
gem.add_development_dependency 'rake',
|
26
|
-
gem.add_development_dependency 'rspec',
|
27
|
-
gem.add_development_dependency 'rubocop',
|
28
|
-
gem.add_development_dependency '
|
29
|
-
gem.add_development_dependency '
|
23
|
+
gem.add_development_dependency 'bundler', '~> 1.17.x'
|
24
|
+
gem.add_development_dependency 'pry-nav', '~> 0.2.4'
|
25
|
+
gem.add_development_dependency 'rake', '>= 12.3.1'
|
26
|
+
gem.add_development_dependency 'rspec', '>= 3.8'
|
27
|
+
gem.add_development_dependency 'rubocop', '0.58.1'
|
28
|
+
gem.add_development_dependency 'rubocop-rspec', '1.30.0'
|
29
|
+
gem.add_development_dependency 'simplecov', '~> 0.16.x'
|
30
|
+
gem.add_development_dependency 'yard', '>= 0.9.18'
|
31
|
+
gem.add_development_dependency 'yardstick', '>= 0.9.9'
|
30
32
|
end
|
data/docker-compose.yml
CHANGED
@@ -1,18 +1,15 @@
|
|
1
1
|
version: '2'
|
2
2
|
services:
|
3
3
|
base: &base
|
4
|
-
|
4
|
+
build:
|
5
|
+
context: ./
|
5
6
|
working_dir: /home/app/core_ext
|
6
7
|
volumes:
|
7
8
|
- .:/home/app/core_ext
|
8
|
-
- core_ext_gems_2_4_0:/usr/local/bundle
|
9
9
|
|
10
10
|
#################### CONTAINERS ####################
|
11
11
|
|
12
12
|
core_ext:
|
13
13
|
<<: *base
|
14
14
|
container_name: core_ext
|
15
|
-
command: bash -c '
|
16
|
-
|
17
|
-
volumes:
|
18
|
-
core_ext_gems_2_4_0:
|
15
|
+
command: bash -c 'bundle exec rspec'
|
@@ -142,7 +142,7 @@ module Darthjee
|
|
142
142
|
# array.random # might return 10, 20 or 30
|
143
143
|
# array # returns unchanged [10, 20, 30]
|
144
144
|
def random
|
145
|
-
self[rand(size)]
|
145
|
+
self[Random.rand(size)]
|
146
146
|
end
|
147
147
|
|
148
148
|
# Reeturns a random element of the array removing it from the array
|
@@ -152,7 +152,7 @@ module Darthjee
|
|
152
152
|
# array.random! # might return 10, 20 or 30 ... lets say 20
|
153
153
|
# array # returns changed [20, 30]
|
154
154
|
def random!
|
155
|
-
slice!(rand(size))
|
155
|
+
slice!(Random.rand(size))
|
156
156
|
end
|
157
157
|
end
|
158
158
|
end
|
@@ -48,6 +48,8 @@ module Darthjee
|
|
48
48
|
# methods to be added
|
49
49
|
# @param [::Object] value default value
|
50
50
|
#
|
51
|
+
# @see default_value
|
52
|
+
#
|
51
53
|
# @example Defining a default values
|
52
54
|
# class MyClass
|
53
55
|
# default_values :name, :nick_name, 'John'
|
@@ -57,8 +59,6 @@ module Darthjee
|
|
57
59
|
# MyClass.new.nick_name # returns 'John'
|
58
60
|
#
|
59
61
|
# @example Comparing value across instances
|
60
|
-
# # frozen_string_literal: false
|
61
|
-
#
|
62
62
|
# class MyClass
|
63
63
|
# default_values :name, :nick_name, 'John'
|
64
64
|
# end
|
@@ -70,8 +70,6 @@ module Darthjee
|
|
70
70
|
# instance.name.equal?(other.name) # returns true
|
71
71
|
#
|
72
72
|
# @example Comparing value across methods
|
73
|
-
# # frozen_string_literal: false
|
74
|
-
#
|
75
73
|
# class MyClass
|
76
74
|
# default_values :name, :nick_name, 'John'
|
77
75
|
# end
|
@@ -85,6 +83,94 @@ module Darthjee
|
|
85
83
|
default_value(name, value)
|
86
84
|
end
|
87
85
|
end
|
86
|
+
|
87
|
+
# @!visibility public
|
88
|
+
#
|
89
|
+
# Creates a method that will act as reader, but will
|
90
|
+
# return a default value when the instance variable
|
91
|
+
# was never set
|
92
|
+
#
|
93
|
+
# @example Defining a default value
|
94
|
+
# class Person
|
95
|
+
# attr_writer :name
|
96
|
+
# default_reader :name, 'John Doe'
|
97
|
+
# end
|
98
|
+
#
|
99
|
+
# model = Person.new
|
100
|
+
#
|
101
|
+
# model.name # returns 'John Doe'
|
102
|
+
#
|
103
|
+
# @example Changing the instance value
|
104
|
+
#
|
105
|
+
# model = Person.new
|
106
|
+
# model.name # returns 'John Doe'
|
107
|
+
#
|
108
|
+
# model.name = 'Joe'
|
109
|
+
# model.name # returns 'Joe'
|
110
|
+
#
|
111
|
+
# model.name = nil
|
112
|
+
# model.name # returns nil
|
113
|
+
#
|
114
|
+
# @example Changing values accros instances
|
115
|
+
#
|
116
|
+
# model = Person.new
|
117
|
+
# model.name # returns 'John Doe'
|
118
|
+
#
|
119
|
+
# model.name = 'Bob'
|
120
|
+
# model.name # returns 'Bob'
|
121
|
+
# Person.new.name # returns 'John Doe'
|
122
|
+
def default_reader(name, value)
|
123
|
+
define_method(name) do
|
124
|
+
return value unless instance_variable_defined?("@#{name}")
|
125
|
+
instance_variable_get("@#{name}")
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
# @!visibility public
|
130
|
+
#
|
131
|
+
# Creates methods that will act as readers, but will
|
132
|
+
# return a default value when the instance variables
|
133
|
+
# ware never set
|
134
|
+
#
|
135
|
+
# @example Defining default values
|
136
|
+
# class Person
|
137
|
+
# attr_writer :cars, :houses
|
138
|
+
# default_reader :cars, :houses, 'none'
|
139
|
+
# end
|
140
|
+
#
|
141
|
+
# model = Person.new
|
142
|
+
#
|
143
|
+
# model.cars # returns 'none'
|
144
|
+
#
|
145
|
+
# @example Changing the instance value
|
146
|
+
#
|
147
|
+
# model = Person.new
|
148
|
+
# model.cars # returns 'none'
|
149
|
+
#
|
150
|
+
# model.cars = ['volvo']
|
151
|
+
# model.cars # returns ['volvo']
|
152
|
+
#
|
153
|
+
# model.cars = nil
|
154
|
+
# model.cars # returns nil
|
155
|
+
#
|
156
|
+
# @example Changing values accros instances
|
157
|
+
#
|
158
|
+
# model = Person.new
|
159
|
+
# model.cars # returns 'none'
|
160
|
+
#
|
161
|
+
# model.cars = ['volvo']
|
162
|
+
# model.cars # returns ['volvo']
|
163
|
+
# Person.new.cars # returns 'none'
|
164
|
+
#
|
165
|
+
# @example Comparing value across methods
|
166
|
+
# model.cars # returns 'none'
|
167
|
+
# model.cars.equal?('none') # returns false
|
168
|
+
# model.nick_name.equal?(model.houses) # returns true
|
169
|
+
def default_readers(*names, value)
|
170
|
+
names.each do |name|
|
171
|
+
default_reader(name, value)
|
172
|
+
end
|
173
|
+
end
|
88
174
|
end
|
89
175
|
end
|
90
176
|
end
|
@@ -1,13 +1,17 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Enumerable
|
4
|
+
# (see #clean!)
|
5
|
+
#
|
6
|
+
# This method does not change the original
|
7
|
+
# enumerable
|
4
8
|
def clean
|
5
9
|
deep_dup.clean!
|
6
10
|
end
|
7
11
|
|
8
12
|
# Removes any element that is nil or empty
|
9
13
|
#
|
10
|
-
# @
|
14
|
+
# @return [::Enumerable] the enumerable itself
|
11
15
|
#
|
12
16
|
# @example cleaning a Hash
|
13
17
|
# hash = {
|
@@ -1,5 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'darthjee/core_ext/hash/cameliazable'
|
3
4
|
require 'darthjee/core_ext/hash/key_changeable'
|
4
5
|
require 'darthjee/core_ext/hash/transposeable'
|
5
6
|
require 'darthjee/core_ext/hash/transformable'
|
@@ -15,6 +16,7 @@ module Darthjee
|
|
15
16
|
autoload :ValueChanger, "#{PATH}/hash/value_changer"
|
16
17
|
autoload :ToHashMapper, "#{PATH}/hash/to_hash_mapper"
|
17
18
|
|
19
|
+
include Hash::Cameliazable
|
18
20
|
include Hash::KeyChangeable
|
19
21
|
include Hash::Transposeable
|
20
22
|
include Hash::Transformable
|
@@ -23,6 +25,34 @@ module Darthjee
|
|
23
25
|
# Fetching methods
|
24
26
|
#########################################
|
25
27
|
|
28
|
+
# Crawls through the hash fetching a key value from inside it
|
29
|
+
#
|
30
|
+
# this is the equivalent of chaining several calls to fetch method
|
31
|
+
#
|
32
|
+
# ```
|
33
|
+
# hash.chain_fetch(:key1, :key2)
|
34
|
+
# hash.fetch(:key1).fetch(:key2)
|
35
|
+
# ```
|
36
|
+
#
|
37
|
+
# @param [::Array<::Object>] keys List of keys to be fetched
|
38
|
+
# @param [::Proc] block block to be called in case of key not found
|
39
|
+
# @yield (key_not_found, keys_missing) The result of the yield
|
40
|
+
# will be the returned value instead of raising KeyError
|
41
|
+
#
|
42
|
+
# @return Object value fetched
|
43
|
+
#
|
44
|
+
# @example
|
45
|
+
# hash = {
|
46
|
+
# a: {
|
47
|
+
# b: { c: 1, d: 2 }
|
48
|
+
# }
|
49
|
+
# }
|
50
|
+
#
|
51
|
+
# hash.chain_fetch(:a, :b, :c) # returns 1
|
52
|
+
# hash.chain_fetch(:a, :c, :d) # raises KeyError
|
53
|
+
# hash.chain_fetch(:a, :c, :d) { 10 } # returns 10
|
54
|
+
# hash.chain_fetch(:a, :c, :d) { |key, _| key } # returns :c
|
55
|
+
# hash.chain_fetch(:a, :c, :d) { |_, missing| missing } # returns [:d]
|
26
56
|
def chain_fetch(*keys, &block)
|
27
57
|
::Hash::ChainFetcher.new(self, *keys, &block).fetch
|
28
58
|
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Darthjee
|
4
|
+
module CoreExt
|
5
|
+
module Hash
|
6
|
+
# Module holding methods responsible for camelizing
|
7
|
+
# keys of a hash
|
8
|
+
#
|
9
|
+
# @api public
|
10
|
+
module Cameliazable
|
11
|
+
# Change keys to CamelCase without changing the
|
12
|
+
# original hash
|
13
|
+
#
|
14
|
+
# @return [::Hash] new hash with changed keys
|
15
|
+
# @param [::Hash] options options of camelization
|
16
|
+
# @option options [::Boolean] uppercase_first_letter: flag
|
17
|
+
# defining the type of CamelCase
|
18
|
+
#
|
19
|
+
# @see Hash::KeyChanger#camelize_keys
|
20
|
+
#
|
21
|
+
# @example
|
22
|
+
# hash = { first_key: 1, 'second_key' => 2 }
|
23
|
+
# hash.camelize_keys # returns {
|
24
|
+
# # FirstKey: 1,
|
25
|
+
# # 'SecondKey' => 2
|
26
|
+
# # }
|
27
|
+
#
|
28
|
+
# @example
|
29
|
+
# hash = { first_key: 1, 'second_key' => 2 }
|
30
|
+
# options = { uppercase_first_letter: false }
|
31
|
+
# hash.camelize_keys(options) # returns {
|
32
|
+
# # firstKey: 1,
|
33
|
+
# # 'secondKey' => 2
|
34
|
+
# # }
|
35
|
+
#
|
36
|
+
def camelize_keys(options = {})
|
37
|
+
dup.camelize_keys!(options)
|
38
|
+
end
|
39
|
+
|
40
|
+
# Change keys to CamelCase changing the
|
41
|
+
# original hash
|
42
|
+
#
|
43
|
+
# @return [::Hash] new hash with changed keys
|
44
|
+
# @param [::Hash] options options of camelization
|
45
|
+
# @option options [::Boolean] uppercase_first_letter: flag
|
46
|
+
# defining the type of CamelCase
|
47
|
+
#
|
48
|
+
# @example (see #camelize_keys)
|
49
|
+
#
|
50
|
+
# @see #camelize_keys
|
51
|
+
def camelize_keys!(options = {})
|
52
|
+
Hash::KeyChanger.new(self).camelize_keys(options)
|
53
|
+
end
|
54
|
+
|
55
|
+
# Camelize all keys in the hash as `key.camelize(:lower)
|
56
|
+
#
|
57
|
+
# @return [::Hash] the resulting hash
|
58
|
+
#
|
59
|
+
# @example
|
60
|
+
# hash = { first_key: 1, 'second_key' => 2 }
|
61
|
+
# hash.lower_camelize_keys # {
|
62
|
+
# # firstKey: 1,
|
63
|
+
# # 'secondKey' => 2
|
64
|
+
# # }
|
65
|
+
#
|
66
|
+
def lower_camelize_keys(options = {})
|
67
|
+
dup.lower_camelize_keys!(options)
|
68
|
+
end
|
69
|
+
|
70
|
+
# Camelize all keys in the hash
|
71
|
+
#
|
72
|
+
# @return [::Hash] self after changing the keys
|
73
|
+
#
|
74
|
+
# @example (see #lower_camelize_keys)
|
75
|
+
def lower_camelize_keys!(options = {})
|
76
|
+
options = options.merge(uppercase_first_letter: false)
|
77
|
+
|
78
|
+
camelize_keys!(options)
|
79
|
+
end
|
80
|
+
|
81
|
+
def underscore_keys(options = {})
|
82
|
+
dup.underscore_keys!(options)
|
83
|
+
end
|
84
|
+
|
85
|
+
def underscore_keys!(options = {})
|
86
|
+
Hash::KeyChanger.new(self).underscore_keys(options)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|