cloudcannon-jekyll 2.3.4 → 3.0.0
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/.gitignore +0 -1
- data/.rubocop.yml +24 -20
- data/HISTORY.md +8 -0
- data/README.md +160 -23
- data/cloudcannon-jekyll.gemspec +16 -18
- data/lib/cloudcannon-jekyll/config.rb +146 -0
- data/lib/cloudcannon-jekyll/generator.rb +20 -248
- data/lib/cloudcannon-jekyll/generators/collections.rb +267 -0
- data/lib/cloudcannon-jekyll/generators/data.rb +34 -0
- data/lib/cloudcannon-jekyll/generators/info.rb +92 -0
- data/lib/cloudcannon-jekyll/generators/paths.rb +18 -0
- data/lib/cloudcannon-jekyll/logger.rb +12 -0
- data/lib/cloudcannon-jekyll/readers/data-reader.rb +3 -3
- data/lib/cloudcannon-jekyll/readers/old-data-reader.rb +11 -8
- data/lib/cloudcannon-jekyll/{reader.rb → readers/reader.rb} +11 -11
- data/lib/cloudcannon-jekyll/{configuration.rb → setup.rb} +7 -4
- data/lib/cloudcannon-jekyll/version.rb +1 -1
- data/lib/cloudcannon-jekyll.rb +8 -13
- data/script/lint +5 -0
- data/script/test +0 -1
- data/script/{ci-smoke-test → test-all-versions} +2 -4
- metadata +12 -46
- data/.travis.yml +0 -19
- data/lib/cloudcannon-jekyll/_cloudcannon/info-2.x.json +0 -83
- data/lib/cloudcannon-jekyll/_cloudcannon/info-3.0-4.x.json +0 -83
- data/lib/cloudcannon-jekyll/_cloudcannon/info.json +0 -86
- data/lib/cloudcannon-jekyll/jsonify-filter.rb +0 -214
- data/lib/cloudcannon-jekyll/page-without-a-file.rb +0 -10
- data/script/cibuild +0 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 37060b4654f27c7236d0952625b91b56b081c6be24c1a76c034036a80ba1735d
|
4
|
+
data.tar.gz: 055c7dbc77a247c254b05bcecedf5a45a9595c0b4ceae671676ec32fa1f771c3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4b9536ca8a4097fa234c35a30226a9c17bd9a020e5d883ef82f38883a9a93d6e8f6afbfe17197b949468baec9d6a077f3467ec9b3a23fdaf19740590ce28ba1b
|
7
|
+
data.tar.gz: 89bdca52d720c403ddcaf8dc3d20debc1e1da51664874585b132332b199ef444c20c5104686b7ab576b0b5a6ccfad4cabd91157bc38e08a78ca5300e313ea211
|
data/.gitignore
CHANGED
data/.rubocop.yml
CHANGED
@@ -1,18 +1,14 @@
|
|
1
|
-
require: rubocop-jekyll
|
2
|
-
|
3
|
-
inherit_gem:
|
4
|
-
rubocop-jekyll: .rubocop.yml
|
5
|
-
|
6
1
|
AllCops:
|
2
|
+
NewCops: enable
|
7
3
|
TargetRubyVersion: 2.4
|
8
4
|
Include:
|
9
5
|
- lib/**/*.rb
|
10
|
-
|
6
|
+
- spec/*.rb
|
11
7
|
Exclude:
|
12
8
|
- .gitignore
|
9
|
+
- .reek.yml
|
13
10
|
- .rspec
|
14
11
|
- .rubocop.yml
|
15
|
-
- .travis.yml
|
16
12
|
- Gemfile.lock
|
17
13
|
- HISTORY.md
|
18
14
|
- LICENSE.txt
|
@@ -20,20 +16,28 @@ AllCops:
|
|
20
16
|
- script/**/*
|
21
17
|
- vendor/**/*
|
22
18
|
- gemfiles/**/*
|
23
|
-
|
24
|
-
Naming/MemoizedInstanceVariableName:
|
25
|
-
Exclude:
|
26
|
-
- lib/cloudcannon-jekyll/page-without-a-file.rb
|
27
|
-
|
28
19
|
Metrics/CyclomaticComplexity:
|
29
|
-
|
30
|
-
- lib/cloudcannon-jekyll/jsonify-filter.rb # TODO remove this and fix warnings
|
31
|
-
- lib/cloudcannon-jekyll/readers/old-data-reader.rb # TODO remove this and fix warnings
|
32
|
-
|
20
|
+
Enabled: false
|
33
21
|
Metrics/PerceivedComplexity:
|
34
|
-
|
35
|
-
- lib/cloudcannon-jekyll/jsonify-filter.rb # TODO remove this and fix warnings
|
36
|
-
|
22
|
+
Enabled: false
|
37
23
|
Metrics/AbcSize:
|
24
|
+
Enabled: false
|
25
|
+
Metrics/MethodLength:
|
26
|
+
Enabled: false
|
27
|
+
Metrics/ClassLength:
|
28
|
+
Enabled: false
|
29
|
+
Layout/LineLength:
|
30
|
+
Max: 100
|
31
|
+
Naming/FileName:
|
32
|
+
Enabled: false
|
33
|
+
Style/DoubleNegation:
|
34
|
+
Enabled: false
|
35
|
+
Metrics/BlockLength:
|
38
36
|
Exclude:
|
39
|
-
-
|
37
|
+
- !ruby/regexp /^spec/
|
38
|
+
Style/HashEachMethods:
|
39
|
+
Enabled: true
|
40
|
+
Style/HashTransformKeys:
|
41
|
+
Enabled: true
|
42
|
+
Style/HashTransformValues:
|
43
|
+
Enabled: true
|
data/HISTORY.md
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
# 3.0.0
|
2
|
+
|
3
|
+
* Add `collections_config_override`
|
4
|
+
* Ensure `paths.data` doesnt start with slash
|
5
|
+
* Support external configuration files
|
6
|
+
* Remove template rendering step and write output directly
|
7
|
+
* Update output to support schema version `0.0.3`
|
8
|
+
|
1
9
|
# 2.3.4
|
2
10
|
|
3
11
|
* Add `_editables`
|
data/README.md
CHANGED
@@ -1,47 +1,184 @@
|
|
1
|
-
# CloudCannon Jekyll
|
1
|
+
# CloudCannon Jekyll
|
2
2
|
|
3
|
-
A Jekyll plugin
|
3
|
+
A Jekyll plugin that creates [CloudCannon](https://cloudcannon.com/) build information.
|
4
4
|
|
5
|
-
|
5
|
+
This plugin runs during your Jekyll build, discovering your pages, collections, and data files to
|
6
|
+
create a JSON file used to automatically integrate the site with CloudCannon.
|
6
7
|
|
7
|
-
|
8
|
+
[<img src="https://img.shields.io/gem/v/cloudcannon-jekyll?logo=rubygems" alt="version badge">](https://rubygems.org/gems/cloudcannon-jekyll)
|
9
|
+
[<img src="https://img.shields.io/gem/dt/cloudcannon-jekyll" alt="downloads badge">](https://rubygems.org/gems/cloudcannon-jekyll)
|
8
10
|
|
9
|
-
|
10
|
-
|
11
|
-
|
11
|
+
***
|
12
|
+
|
13
|
+
- [Installation](#installation)
|
14
|
+
- [Configuration](#configuration)
|
15
|
+
- [Development](#plugin-options)
|
16
|
+
- [License](#license)
|
17
|
+
|
18
|
+
***
|
19
|
+
|
20
|
+
## Installation
|
21
|
+
|
22
|
+
**You don't have to install anything** when building on CloudCannon. This plugin is automatically
|
23
|
+
installed before your site is built. This gives you the latest support, new features, and fixes
|
24
|
+
as they are released.
|
25
|
+
|
26
|
+
Although **not recommended**, you can install the plugin manually.
|
27
|
+
|
28
|
+
<details>
|
29
|
+
<summary>Manual installation steps</summary>
|
30
|
+
|
31
|
+
<blockquote>
|
32
|
+
|
33
|
+
When installing manually, you'll have to upgrade when new versions are released.
|
34
|
+
You could also follow these steps to debug an integration issue locally. This assumes you are using [Bundler](https://bundler.io/) to manage dependencies.
|
35
|
+
|
36
|
+
CloudCannon won't automatically install this plugin before builds if `cloudcannon-jekyll` is already installed.
|
37
|
+
|
38
|
+
```sh
|
39
|
+
$ bundle add cloudcannon-jekyll --group jekyll_plugins
|
40
|
+
```
|
41
|
+
|
42
|
+
Add the following to your `_config.yml` if you're listing plugins here as well:
|
12
43
|
|
13
44
|
```yaml
|
14
45
|
plugins:
|
15
46
|
- cloudcannon-jekyll
|
16
47
|
```
|
17
48
|
|
18
|
-
💡
|
49
|
+
💡 For Jekyll versions less than `v3.5.0`, use `gems` instead of `plugins`.
|
50
|
+
|
51
|
+
</blockquote>
|
52
|
+
</details>
|
53
|
+
|
54
|
+
|
55
|
+
## Configuration
|
19
56
|
|
57
|
+
This plugin uses an optional configuration file as a base to generate `_cloudcannon/info.json`
|
58
|
+
(used to integrate your site with CloudCannon).
|
20
59
|
|
21
|
-
|
60
|
+
Add your global CloudCannon configuration to this file, alongside any optional configuration for
|
61
|
+
this plugin.
|
22
62
|
|
23
|
-
|
24
|
-
|
25
|
-
3. Create a release and tag in GitHub
|
26
|
-
4. Build new gem with `gem build cloudcannon-jekyll.gemspec`
|
27
|
-
5. Push new version to rubygems.org with `gem push cloudcannon-jekyll-{{ VERSION HERE }}.gem`
|
63
|
+
Configuration files should be in the same directory you run `bundle exec jekyll build`. The first
|
64
|
+
supported file found in this order is used:
|
28
65
|
|
29
|
-
|
66
|
+
- `cloudcannon.config.json`
|
67
|
+
- `cloudcannon.config.yaml`
|
68
|
+
- `cloudcannon.config.yml`
|
30
69
|
|
31
|
-
|
32
|
-
|
33
|
-
3. Run `./scripts/release`
|
34
|
-
3. Create a release in GitHub
|
70
|
+
Alternatively, use the `CLOUDCANNON_CONFIG_PATH` environment variable to use a specific config file
|
71
|
+
in a custom location:
|
35
72
|
|
73
|
+
```sh
|
74
|
+
$ CLOUDCANNON_CONFIG_PATH=src/cloudcannon.config.yml bundle exec jekyll build
|
75
|
+
```
|
36
76
|
|
37
|
-
|
77
|
+
Example content for `cloudcannon.config.yml`:
|
38
78
|
|
79
|
+
```yaml
|
80
|
+
# Global CloudCannon configuration
|
81
|
+
_inputs:
|
82
|
+
title:
|
83
|
+
type: text
|
84
|
+
comment: The title of your page.
|
85
|
+
_select_data:
|
86
|
+
colors:
|
87
|
+
- Red
|
88
|
+
- Green
|
89
|
+
- Blue
|
90
|
+
|
91
|
+
# Base path to your site source files, same as source for Jekyll
|
92
|
+
source: src
|
93
|
+
|
94
|
+
# The subpath your built output files are mounted at, same as baseurl for Jekyll
|
95
|
+
base_url: /documentation
|
96
|
+
|
97
|
+
# Populates collections for navigation and metadata in the editor
|
98
|
+
collections_config:
|
99
|
+
people:
|
100
|
+
# Base path for files in this collection, relative to source
|
101
|
+
path: content/people
|
102
|
+
|
103
|
+
# Whether this collection produces output files or not
|
104
|
+
output: true
|
105
|
+
|
106
|
+
# Collection-level configuration
|
107
|
+
name: Personnel
|
108
|
+
_enabled_editors:
|
109
|
+
- data
|
110
|
+
posts:
|
111
|
+
path: _posts
|
112
|
+
output: true
|
113
|
+
pages:
|
114
|
+
name: Main pages
|
115
|
+
|
116
|
+
# Generates the data for select and multiselect inputs matching these names
|
117
|
+
data_config:
|
118
|
+
# Populates data with authors from an data file with the matching name
|
119
|
+
authors: true
|
120
|
+
offices: true
|
121
|
+
|
122
|
+
paths:
|
123
|
+
# The default location for newly uploaded files, relative to source
|
124
|
+
uploads: assets/uploads
|
125
|
+
|
126
|
+
# The path to the root collections folder, relative to source
|
127
|
+
collections: items
|
128
|
+
|
129
|
+
# The path to site data files, relative to source
|
130
|
+
data: _data
|
131
|
+
|
132
|
+
# The path to site layout files, relative to source
|
133
|
+
layouts: _layouts
|
134
|
+
|
135
|
+
# The path to site include files, relative to source
|
136
|
+
includes: _partials
|
39
137
|
```
|
40
|
-
|
138
|
+
|
139
|
+
See the [CloudCannon documentation](https://cloudcannon.com/documentation/) for more information
|
140
|
+
on the available features you can configure.
|
141
|
+
|
142
|
+
Configuration is set in `cloudcannon.config.*`, but the plugin also automatically
|
143
|
+
reads and processes the following from Jekyll if unset:
|
144
|
+
|
145
|
+
- `collections_config` from `collections` in `_config.yml`
|
146
|
+
- `paths.collections` from `collections_dir` in `_config.yml`
|
147
|
+
- `paths.layouts` from `layouts_dir` in `_config.yml`
|
148
|
+
- `paths.data` from `data_dir` in `_config.yml`
|
149
|
+
- `paths.includes` from `includes_dir` in `_config.yml`
|
150
|
+
- `base_url` from `baseurl` in `_config.yml`
|
151
|
+
- `source` from the `--source` CLI option or `source` in `_config.yml`
|
152
|
+
|
153
|
+
## Development
|
154
|
+
|
155
|
+
### Releasing new versions
|
156
|
+
|
157
|
+
1. Increase the version in `lib/cloudcannon-jekyll/version.rb`
|
158
|
+
2. Update `HISTORY.md`
|
159
|
+
3. Run `./script/release`
|
160
|
+
3. [Create a release on GitHub](https://github.com/CloudCannon/cloudcannon-jekyll/releases/new)
|
161
|
+
|
162
|
+
### Testing
|
163
|
+
|
164
|
+
Running tests for currently installed Jekyll version:
|
165
|
+
|
166
|
+
```sh
|
167
|
+
$ ./script/test
|
41
168
|
```
|
42
169
|
|
43
|
-
|
170
|
+
Running tests for all specified Jekyll versions:
|
44
171
|
|
172
|
+
```sh
|
173
|
+
$ ./script/test-all-versions
|
45
174
|
```
|
46
|
-
|
175
|
+
|
176
|
+
Running tests for a specific Jekyll version:
|
177
|
+
|
178
|
+
```sh
|
179
|
+
$ JEKYLL_VERSION="2.4.0" bundle update && ./script/test
|
47
180
|
```
|
181
|
+
|
182
|
+
## License
|
183
|
+
|
184
|
+
MIT
|
data/cloudcannon-jekyll.gemspec
CHANGED
@@ -1,31 +1,29 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
lib = File.expand_path(
|
3
|
+
lib = File.expand_path('lib', __dir__)
|
4
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
5
|
|
6
|
-
require
|
6
|
+
require 'cloudcannon-jekyll/version'
|
7
7
|
|
8
8
|
Gem::Specification.new do |spec|
|
9
|
-
spec.name =
|
10
|
-
spec.summary =
|
11
|
-
spec.description =
|
9
|
+
spec.name = 'cloudcannon-jekyll'
|
10
|
+
spec.summary = 'CloudCannon Jekyll integration'
|
11
|
+
spec.description = 'Creates CloudCannon editor details for Jekyll'
|
12
12
|
spec.version = CloudCannonJekyll::VERSION
|
13
|
-
spec.authors = [
|
14
|
-
spec.email = [
|
15
|
-
spec.homepage =
|
16
|
-
spec.licenses = [
|
17
|
-
spec.require_paths = [
|
13
|
+
spec.authors = ['CloudCannon']
|
14
|
+
spec.email = ['support@cloudcannon.com']
|
15
|
+
spec.homepage = 'https://github.com/cloudcannon/cloudcannon-jekyll'
|
16
|
+
spec.licenses = ['MIT']
|
17
|
+
spec.require_paths = ['lib']
|
18
18
|
|
19
19
|
all_files = `git ls-files -z`.split("\x0")
|
20
|
-
spec.files = all_files.reject { |f| f.match(%r
|
20
|
+
spec.files = all_files.reject { |f| f.match(%r{^(test|spec|features)/}) }
|
21
21
|
|
22
|
-
spec.required_ruby_version =
|
22
|
+
spec.required_ruby_version = '>= 2.4.0'
|
23
23
|
|
24
|
-
spec.add_dependency
|
24
|
+
spec.add_dependency 'jekyll', '>= 2.4.0'
|
25
25
|
|
26
|
-
spec.add_development_dependency
|
27
|
-
spec.add_development_dependency
|
28
|
-
spec.add_development_dependency
|
29
|
-
spec.add_development_dependency "rubocop", "~> 0.80"
|
30
|
-
spec.add_development_dependency "rubocop-jekyll", "~> 0.11"
|
26
|
+
spec.add_development_dependency 'rake', '~> 13.0'
|
27
|
+
spec.add_development_dependency 'rspec', '~> 3.9'
|
28
|
+
spec.add_development_dependency 'rubocop', '~> 0.80'
|
31
29
|
end
|
@@ -0,0 +1,146 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'yaml'
|
4
|
+
require 'fileutils'
|
5
|
+
require_relative 'logger'
|
6
|
+
|
7
|
+
module CloudCannonJekyll
|
8
|
+
MAPPINGS = {
|
9
|
+
'_sort_key' => 'sort_key',
|
10
|
+
'_subtext_key' => 'subtext_key',
|
11
|
+
'_image_key' => 'image_key',
|
12
|
+
'_image_size' => 'image_size',
|
13
|
+
'_singular_name' => 'singular_name',
|
14
|
+
'_singular_key' => 'singular_key',
|
15
|
+
'_disable_add' => 'disable_add',
|
16
|
+
'_icon' => 'icon',
|
17
|
+
'_add_options' => 'add_options'
|
18
|
+
}.freeze
|
19
|
+
|
20
|
+
# Processes Jekyll configuration to enable the plugin and fix common issues
|
21
|
+
class Config
|
22
|
+
def self.rename_legacy_collection_config_keys(collection_config)
|
23
|
+
collection_config&.keys&.each do |k|
|
24
|
+
collection_config[MAPPINGS[k]] = collection_config.delete(k) if MAPPINGS[k]
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def initialize(site)
|
29
|
+
@site_config = site.config
|
30
|
+
end
|
31
|
+
|
32
|
+
def read
|
33
|
+
config_defaults(custom_config || config || legacy_config)
|
34
|
+
end
|
35
|
+
|
36
|
+
def custom_config
|
37
|
+
custom_path = ENV['CLOUDCANNON_CONFIG_PATH']
|
38
|
+
return unless custom_path
|
39
|
+
|
40
|
+
loaded = config_file(custom_path)
|
41
|
+
Logger.info("⚙️ No config file found at #{custom_path.bold}") unless loaded
|
42
|
+
loaded
|
43
|
+
end
|
44
|
+
|
45
|
+
def config
|
46
|
+
loaded = config_file('cloudcannon.config.json') ||
|
47
|
+
config_file('cloudcannon.config.yaml') ||
|
48
|
+
config_file('cloudcannon.config.yml')
|
49
|
+
|
50
|
+
unless loaded
|
51
|
+
Logger.info("⚙️ No config file found at #{'cloudcannon.config.(json|yaml|yml)'.bold}")
|
52
|
+
end
|
53
|
+
|
54
|
+
loaded
|
55
|
+
end
|
56
|
+
|
57
|
+
def config_file(path)
|
58
|
+
loaded = YAML.safe_load(File.read(path)) # Also works for JSON
|
59
|
+
Logger.info "⚙️ Using config file at #{path.bold}"
|
60
|
+
loaded
|
61
|
+
rescue Errno::ENOENT
|
62
|
+
nil
|
63
|
+
end
|
64
|
+
|
65
|
+
def config_defaults(config)
|
66
|
+
defaults = {
|
67
|
+
'source' => @site_config['source'].gsub(Dir.pwd, ''),
|
68
|
+
'timezone' => @site_config['timezone'],
|
69
|
+
'base_url' => @site_config['baseurl']
|
70
|
+
}
|
71
|
+
|
72
|
+
defaults.merge(config)
|
73
|
+
end
|
74
|
+
|
75
|
+
def legacy_config
|
76
|
+
Logger.info('⚙️ Falling back to site config'.yellow)
|
77
|
+
|
78
|
+
{
|
79
|
+
'data_config' => @site_config.dig('cloudcannon', 'data'),
|
80
|
+
'collections_config' => legacy_collections_config,
|
81
|
+
'collection_groups' => @site_config['_collection_groups'] || legacy_collection_groups,
|
82
|
+
'editor' => @site_config['_editor'],
|
83
|
+
'source_editor' => @site_config['_source_editor'],
|
84
|
+
'paths' => {
|
85
|
+
'uploads' => @site_config['uploads_dir']
|
86
|
+
},
|
87
|
+
'_select_data' => @site_config['_select_data'] || legacy_select_data,
|
88
|
+
'_inputs' => @site_config['_inputs'],
|
89
|
+
'_editables' => @site_config['_editables'],
|
90
|
+
'_structures' => @site_config['_structures'],
|
91
|
+
|
92
|
+
# Deprecated keys
|
93
|
+
'_array_structures' => @site_config['_array_structures'],
|
94
|
+
'_comments' => @site_config['_comments'],
|
95
|
+
'_enabled_editors' => @site_config['_enabled_editors'],
|
96
|
+
'_instance_values' => @site_config['_instance_values'],
|
97
|
+
'_options' => @site_config['_options']
|
98
|
+
}
|
99
|
+
end
|
100
|
+
|
101
|
+
def legacy_collections_config
|
102
|
+
collections_config = @site_config.dig('cloudcannon', 'collections')
|
103
|
+
|
104
|
+
return unless collections_config
|
105
|
+
|
106
|
+
collections_config.each do |_, collection_config|
|
107
|
+
Config.rename_legacy_collection_config_keys(collection_config)
|
108
|
+
end
|
109
|
+
|
110
|
+
collections_config
|
111
|
+
end
|
112
|
+
|
113
|
+
def legacy_collection_groups
|
114
|
+
@site_config.dig('_explore', 'groups')
|
115
|
+
end
|
116
|
+
|
117
|
+
def legacy_select_data
|
118
|
+
cloudcannon_keys = %w[_comments _options _editor _explore cloudcannon _collection_groups
|
119
|
+
_enabled_editors _instance_values _source_editor _array_structures
|
120
|
+
uploads_dir _editables _inputs _structures editor source_editor
|
121
|
+
collection_groups]
|
122
|
+
|
123
|
+
jekyll_keys = %w[source destination collections_dir cache_dir plugins_dir layouts_dir
|
124
|
+
data_dir includes_dir collections safe include exclude keep_files encoding
|
125
|
+
markdown_ext strict_front_matter show_drafts limit_posts future unpublished
|
126
|
+
whitelist plugins markdown highlighter lsi excerpt_separator incremental
|
127
|
+
detach port host baseurl show_dir_listing permalink paginate_path timezone
|
128
|
+
quiet verbose defaults liquid kramdown title url description maruku
|
129
|
+
redcloth rdiscount redcarpet gems plugins]
|
130
|
+
|
131
|
+
keys = cloudcannon_keys + jekyll_keys
|
132
|
+
|
133
|
+
select_data = @site_config.keys.each_with_object({}) do |key, memo|
|
134
|
+
value = @site_config[key]
|
135
|
+
|
136
|
+
next unless value.is_a?(Array) || value.is_a?(Hash)
|
137
|
+
next if key.nil? || keys.include?(key)
|
138
|
+
|
139
|
+
memo[key] = value
|
140
|
+
end
|
141
|
+
|
142
|
+
compacted = select_data.compact
|
143
|
+
compacted.empty? ? nil : compacted
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|