cloudcannon-jekyll 2.3.4 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|