jekyll_all_collections 0.3.2 → 0.3.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2e45646b46cf5d0c78cf2fa66195a35790cbefc9cf70c3bfa9e29d28aed1f684
4
- data.tar.gz: cc7670319738667e93ef05ca78b015aa2089df8225cb03523634bfe7bdccbe20
3
+ metadata.gz: 48527cdeb305237310b14a6748a3a95aab2fea5a837a650d277a8d9c93daed97
4
+ data.tar.gz: 98b3eebd250c4d16e2141b9aaac2c211a54ff9478eafe4a5cbb68f7de905cc6a
5
5
  SHA512:
6
- metadata.gz: '06595b7270e805c029445553062919c8bebf6d493e84dfda94d95341c2368c22508d7ea3e025db87581e681732fae4dc798efab6fab5e5d50abb5d5d43dc5764'
7
- data.tar.gz: 1dc9236d70270bd7115e1536641f8c3190aaa9e2bdd11f896568e1249c11cc065f056f17eaebd5edda5501a2a4b8e35f9290920f45e8b0475981847bd9d048f6
6
+ metadata.gz: 0ebd2507129ca1d62ca6fba8bbeb3bce545c100093ed1bab1390f03c5d495b7dd51fcb0780e8438253fcbf87a74cb57f54034b526fe54d290338f3b732b325c1
7
+ data.tar.gz: 30b284bb7cb19a4ef0cb246c052e2818086343fc722e4713065c4b9f5cb9a0fd0d807d0df1d7a5e16cb0cf08993ed56ddad3bd006f93175393b27d81305740a9
data/.rubocop.yml CHANGED
@@ -7,11 +7,11 @@ require:
7
7
 
8
8
  AllCops:
9
9
  Exclude:
10
- - exe/**/*
10
+ - binstub/**/*
11
+ - demo/_site/*
11
12
  - vendor/**/*
12
13
  - Gemfile*
13
14
  NewCops: enable
14
- TargetRubyVersion: 2.6
15
15
 
16
16
  Gemspec/DeprecatedAttributeAssignment:
17
17
  Enabled: false
@@ -19,6 +19,9 @@ Gemspec/DeprecatedAttributeAssignment:
19
19
  Gemspec/RequireMFA:
20
20
  Enabled: false
21
21
 
22
+ Gemspec/RequiredRubyVersion:
23
+ Enabled: false
24
+
22
25
  Layout/HashAlignment:
23
26
  EnforcedColonStyle: table
24
27
  EnforcedHashRocketStyle: table
@@ -27,7 +30,7 @@ Layout/LineLength:
27
30
  Max: 150
28
31
 
29
32
  Metrics/AbcSize:
30
- Max: 35
33
+ Max: 45
31
34
 
32
35
  Metrics/BlockLength:
33
36
  Exclude:
@@ -47,21 +50,25 @@ Naming/FileName:
47
50
  Exclude:
48
51
  - Rakefile
49
52
 
50
- Style/Documentation:
51
- Enabled: false
52
-
53
- Style/FrozenStringLiteralComment:
54
- Enabled: false
55
-
56
- Style/TrailingCommaInHashLiteral:
57
- EnforcedStyleForMultiline: comma
53
+ RSpec/ExampleLength:
54
+ Max: 30
58
55
 
59
56
  RSpec/FilePath:
57
+ Enabled: false
60
58
  IgnoreMethods: true
61
59
  SpecSuffixOnly: true
62
60
 
63
- RSpec/ExampleLength:
64
- Max: 30
61
+ RSpec/IndexedLet:
62
+ Enabled: false
65
63
 
66
64
  RSpec/MultipleExpectations:
67
65
  Max: 15
66
+
67
+ Style/Documentation:
68
+ Enabled: false
69
+
70
+ Style/FrozenStringLiteralComment:
71
+ Enabled: false
72
+
73
+ Style/TrailingCommaInHashLiteral:
74
+ EnforcedStyleForMultiline: comma
data/CHANGELOG.md CHANGED
@@ -1,25 +1,51 @@
1
+ # Changelog
2
+
3
+ ## 0.3.4 / 2023-12-24
4
+
5
+ * Changed dependency to Jekyll >= 4.3.2
6
+
7
+
8
+ ## 0.3.3 / 2023-05-22
9
+
10
+ * Corrected key presence checks in APage.initialize
11
+ * Using `warn_short_trace` from `jekyll_plugin_support` for non-fatal errors.
12
+
13
+
1
14
  ## 0.3.2 / 2023-04-05
2
- * Modified dependency `'jekyll_plugin_support', '>= 0.5.0'`
15
+
16
+ * Modified dependency `'jekyll_plugin_support', '>= 0.5.0'`
17
+
3
18
 
4
19
  ## 0.3.1 / 2023-03-16
5
- * Reduced the verbosity of the `@logger` message
20
+
21
+ * Reduced the verbosity of the `@logger` message
6
22
 
7
23
  ## 0.3.0 / 2023-02-16
8
- * Updated dependency `'jekyll_plugin_support', '~> 0.5.0'`
24
+
25
+ * Updated dependency `'jekyll_plugin_support', '~> 0.5.0'`
9
26
 
10
27
  ## 0.2.2 / 2023-02-12
11
- * Updated dependency `'jekyll_plugin_support', '~> 0.4.0'`
28
+
29
+ * Updated dependency `'jekyll_plugin_support', '~> 0.4.0'`
30
+
12
31
 
13
32
  ## 0.2.1 / 2023-02-12
14
- * Reduced the verbosity of log output from `info` to `debug`
33
+
34
+ * Reduced the verbosity of log output from `info` to `debug`
35
+
15
36
 
16
37
  ## 0.2.0 / 2023-02-04
17
- * Returns Array[APage] instead of a collection of different types of objects.
18
- * Converted the plugin to a `:site, :post_read` hook instead of a tag,
38
+
39
+ * Returns Array[APage] instead of a collection of different types of objects.
40
+ * Converted the plugin to a `:site, :post_read` hook instead of a tag,
19
41
  so explicit initialization is no longer required.
20
42
 
43
+
21
44
  ## 0.1.1 / 2022-04-27
22
- * Changed invocation from a `:site` hook to an idempotent method invocation.
45
+
46
+ * Changed invocation from a `:site` hook to an idempotent method invocation.
47
+
23
48
 
24
49
  ## 0.1.0 / 2022-04-26
25
- * Initial version published
50
+
51
+ * Initial version published
data/README.md CHANGED
@@ -1,6 +1,5 @@
1
- `jekyll_all_collections`
2
- [![Gem Version](https://badge.fury.io/rb/jekyll_all_collections.svg)](https://badge.fury.io/rb/jekyll_all_collections)
3
- ===========
1
+ # `jekyll_all_collections` [![Gem Version](https://badge.fury.io/rb/jekyll_all_collections.svg)](https://badge.fury.io/rb/jekyll_all_collections)
2
+
4
3
 
5
4
  `Jekyll_all_collections` is a Jekyll plugin that adds a new property called `all_collections` to `site`.
6
5
  It also provides a new Jekyll tag called `all_collections`,
@@ -15,39 +14,68 @@ The collection consists of an array of objects with the following properties:
15
14
  Pages that are not in any collection are not included.
16
15
 
17
16
 
17
+ ## Installation
18
+
19
+ Add this line to your application's Gemfile:
20
+
21
+ ```ruby
22
+ group :jekyll_plugins do
23
+ gem 'jekyll_all_collections'
24
+ end
25
+ ```
26
+
27
+ And then execute:
28
+
29
+ ```shell
30
+ $ bundle
31
+ ```
32
+
33
+
18
34
  ## Requirements
19
- All the pages in the Jekyll website must have an implicit date (for example, all posts are assigned this property by Jekyll),
35
+
36
+ All the pages in the Jekyll website must have an implicit date
37
+ (for example, all posts are assigned this property by Jekyll),
20
38
  or an explicit `date` set in front matter, like this:
21
- ```
22
- ---
23
- date=2022-01-01
24
- ---
25
- ```
26
- If a front matter variable called `last_modified` or `last_modified_at` exists, its value will be converted to a Ruby `Date`:
27
- ```
28
- ---
29
- last_modified=2023-01-01
30
- ---
31
- ```
32
-
33
- Or:
34
- ```
35
- ---
36
- last_modified_at=2023-01-01
37
- ---
38
- ```
39
-
40
- Otherwise, if `last_modified` or `last_modified_at` is not present in the front matter for a page, the `date` value will be used last modified date value.
39
+
40
+ ```html
41
+ ---
42
+ date: 2022-01-01
43
+ ---
44
+ ```
45
+
46
+ If a front matter variable called `last_modified` or `last_modified_at` exists,
47
+ its value will be converted to a Ruby `Date`:
48
+
49
+ ```html
50
+ ---
51
+ last_modified: 2023-01-01
52
+ ---
53
+ ```
54
+
55
+ Or:
56
+
57
+ ```html
58
+ ---
59
+ last_modified_at: 2023-01-01
60
+ ---
61
+ ```
62
+
63
+ Otherwise, if `last_modified` or `last_modified_at` is not present in the front matter for a page,
64
+ the `date` value will be used last modified date value.
65
+
41
66
 
42
67
  ## Usage
43
68
 
44
69
  ### `Site.all_collections`
70
+
45
71
  No explicit initialization or setup is required.
46
72
  Jekyll plugins can access the value of `site.all_collections`, however Liquid code in Jekyll pages and documents cannot.
47
73
 
48
74
 
49
75
  ### `All_collections` Tag
76
+
50
77
  Add the following CSS to your stylesheet:
78
+
51
79
  ```css
52
80
  .posts {
53
81
  display: flex;
@@ -68,70 +96,110 @@ Add the following CSS to your stylesheet:
68
96
  }
69
97
  ```
70
98
 
99
+
71
100
  #### Excluding Pages
72
- Adding the following entry to a page's front matter `` causes that page to be excluded from the collection created by this plugin:
73
- ```
101
+
102
+ Adding the following entry to a page’s front matter causes that page to be excluded
103
+ from the collection created by this plugin:
104
+
105
+ ```html
74
106
  ---
75
107
  exclude_from_all: true
76
108
  ---
77
109
  ```
78
110
 
111
+
79
112
  #### General Form
113
+
80
114
  The general form of the Jekyll tag is:
115
+
116
+ ```html
117
+ {% all_collections
118
+ date_column='date|last_modified'
119
+ heading='All Posts'
120
+ id='asdf'
121
+ sort_by='SORT_KEYS'
122
+ %}
81
123
  ```
82
- {% all_collections date_column='date|last_modified' id='asdf' heading='All Posts' sort_by='SORT_KEYS' %}
83
- ```
124
+
84
125
 
85
126
  #### `date_column` Attribute
127
+
86
128
  One of two date columns can be displayed in the generated HTML:
87
129
  either `date` (when the article was originally written),
88
130
  or `last_modified`.
89
131
  The default value for the `date_column` attribute is `date`.
90
132
 
91
133
 
92
- #### `id` Attribute
93
- If your Jekyll layout employs [`jekyll-toc`](https://github.com/allejo/jekyll-toc), then `id` attributes are important.
94
- The `jekyll-toc` include checks for `id` attributes in `h2` ... `h6` tags, and if found, and if the attribute value is enclosed in double quotes (`id="my_id"`, not `id='my_id'`),
95
- then the heading is included in the table of contents.
96
-
97
- To suppress an `id` from being generated,
98
- and thereby preventing the heading from appearing in the automatically generated table of contents from `jekyll-toc`,
99
- specify an empty string for the value of `id`, like this:
100
- ```
101
- {% all_collections id='' %}
102
- ```
134
+ #### `heading` Attribute
103
135
 
136
+ If no `heading` attribute is specified, a heading will automatically be generated, which contains the `sort_by` values,
137
+ for example:
104
138
 
105
- #### `heading` Attribute
106
- If no `heading` attribute is specified, a heading will automatically be generated, which contains the `sort_by` values, for example:
107
- ```
139
+ ```html
108
140
  {% all_collections id='abcdef' sort_by="last_modified" %}
109
141
  ```
142
+
110
143
  Generates a heading like:
111
- ```
112
- <h2 id="abcdef">All Posts Sorted By -last_modified</h2>
144
+
145
+ ```html
146
+ <h2 id="abcdef">All Posts Sorted By last_modified</h2>
113
147
  ```
114
148
 
115
149
  To suppress both a `h2` heading (and the enclosed `id`) from being generated,
116
150
  specify an empty string for the value of `heading`:
117
- ```
151
+
152
+ ```html
118
153
  {% all_collections heading='' %}
119
154
  ```
120
155
 
121
156
 
157
+ #### `id` Attribute
158
+
159
+ If your Jekyll layout employs [`jekyll-toc`](https://github.com/allejo/jekyll-toc), then `id` attributes are important.
160
+ The `jekyll-toc` include checks for `id` attributes in `h2` ... `h6` tags, and if found,
161
+ and if the attribute value is enclosed in double quotes (`id="my_id"`, not `id='my_id'`),
162
+ then the heading is included in the table of contents.
163
+
164
+ To suppress an `id` from being generated,
165
+ and thereby preventing the heading from appearing in the automatically generated table of contents from `jekyll-toc`,
166
+ specify an empty string for the value of `id`, like this:
167
+
168
+ ```html
169
+ {% all_collections id='' %}
170
+ ```
171
+
172
+
122
173
  #### `SORT_KEYS` Values
174
+
123
175
  `SORT_KEYS` specifies how to sort the collection.
124
176
  Values can include one or more of the following attributes:
125
- `date`, `destination`, `draft`, `label`, `last_modified`, `path`, `relative_path`, `title`, `type`, and `url`.
177
+ `date`, `destination`, `draft`, `label`, `last_modified`, `last_modified_at`, `path`, `relative_path`,
178
+ `title`, `type`, and `url`.
126
179
  Ascending sorts are the default, however a descending sort can be achieved by prepending `-` before an attribute.
127
180
 
128
- To specify more than one sort key, provide an array of values.
181
+ To specify more than one sort key, provide a comma-delimited string of values.
182
+ Included spaces are ignored.
183
+ For example, specify the primary sort key as `draft`,
184
+ the secondary sort key as `last_modified`,
185
+ and the tertiary key as `label`:
186
+
187
+ ```html
188
+ {% all_collections
189
+ date_column='last_modified'
190
+ heading='All Posts'
191
+ id='asdf'
192
+ sort_by='draft, last_modified, label'
193
+ %}
194
+ ```
129
195
 
130
196
 
131
197
  #### Usage Examples
198
+
132
199
  Here is a short Jekyll page, including front matter,
133
200
  demonstrating this plugin being invoked with all default attribute values:
134
- ```
201
+
202
+ ```html
135
203
  ---
136
204
  description: "
137
205
  Dump of all collections, sorted by date originally written, newest to oldest.
@@ -145,51 +213,62 @@ title: Testing, 1, 2, 3
145
213
 
146
214
  Explicitly express the default sort
147
215
  (sort by the date originally written, newest to oldest):
148
- ```
216
+
217
+ ```html
149
218
  {% all_collections sort_by="-date" %}
150
219
  ```
151
220
 
152
221
  Sort by date, from oldest to newest:
153
- ```
222
+
223
+ ```html
154
224
  {% all_collections sort_by="date" %}
155
225
  ```
156
226
 
157
227
  Sort by the date last modified, oldest to newest:
158
- ```
228
+
229
+ ```html
159
230
  {% all_collections sort_by="last_modified" %}
160
231
  ```
161
232
 
162
233
  Sort by the date last modified, newest to oldest:
163
- ```
234
+
235
+ ```html
164
236
  {% all_collections sort_by="-last_modified" %}
165
237
  ```
166
238
 
167
239
  Several attributes can be specified as sort criteria by passing them as a comma-delimited string.
168
240
  Included spaces are ignored:
169
- ```
241
+
242
+ ```html
170
243
  {% all_collections sort_by="-last_modified, -date" %}
171
244
  {% all_collections sort_by="-last_modified, title" %}
172
245
  {% all_collections sort_by="-last_modified, -date, title" %}
173
246
  ```
174
247
 
175
248
  The following two examples produce the same output:
176
- ```
249
+
250
+ ```html
177
251
  {% all_collections sort_by="-last_modified,-date" %}
178
252
  {% all_collections sort_by="-last_modified, -date" %}
179
253
  ```
180
254
 
181
255
 
182
256
  ## Demo
257
+
183
258
  The [`demo`](./demo) directory contains a demonstration website, which uses the plugin.
184
259
  To run, type:
260
+
185
261
  ```console
186
262
  $ demo/_bin/debug -r
187
263
  ```
264
+
188
265
  Now point your web browser to http://localhost:4444
189
266
 
190
267
 
191
268
  ## Debugging
269
+
192
270
  You can control the verbosity of log output by adding the following to `_config.yml` in your Jekyll project:
271
+
193
272
  ```yaml
194
273
  plugin_loggers:
195
274
  AllCollectionsTag::AllCollectionsTag: warn
@@ -199,7 +278,8 @@ plugin_loggers:
199
278
  1. You have two options for initiating a debug session:
200
279
 
201
280
  1. Run `demo/_bin/debug`, without the `-r` options shown above.
202
- ```
281
+
282
+ ```console
203
283
  ... lots of output as bundle update runs...
204
284
  Bundle updated!
205
285
 
@@ -216,6 +296,7 @@ plugin_loggers:
216
296
 
217
297
  2. Run `bin/attach` and pass the directory name of a Jekyll website that has a suitable script called `_bin/debug`.
218
298
  The `demo` subdirectory fits this description.
299
+
219
300
  ```console
220
301
  $ bin/attach demo
221
302
  Successfully uninstalled jekyll_all_collections-0.1.2
@@ -233,26 +314,11 @@ plugin_loggers:
233
314
 
234
315
 
235
316
  ## Additional Information
317
+
236
318
  More information is available on Mike Slinn's website about
237
319
  [Jekyll plugins](https://www.mslinn.com/blog/index.html#Jekyll).
238
320
 
239
321
 
240
- ## Installation
241
- This has already been done for the demo;
242
- these instructions are for incorporating the plugin(s) into other Jekyll websites.
243
- Add this line to your application's Gemfile:
244
-
245
- ```ruby
246
- group :jekyll_plugins do
247
- gem 'jekyll_all_collections'
248
- end
249
- ```
250
-
251
- And then execute:
252
-
253
- $ bundle install
254
-
255
-
256
322
  ## Development
257
323
 
258
324
  After checking out the repo, run `bin/setup` to install dependencies.
@@ -261,12 +327,9 @@ You can also run `bin/console` for an interactive prompt that will allow you to
261
327
 
262
328
 
263
329
  ### Build and Install Locally
330
+
264
331
  To build and install this gem onto your local machine, run:
265
- ```shell
266
- $ rake install
267
- ```
268
332
 
269
- The following also does the same thing:
270
333
  ```shell
271
334
  $ bundle exec rake install
272
335
  jekyll_all_collections 0.1.0 built to pkg/jekyll_all_collections-0.1.0.gem.
@@ -274,6 +337,7 @@ jekyll_all_collections (0.1.0) installed.
274
337
  ```
275
338
 
276
339
  Examine the newly built gem:
340
+
277
341
  ```shell
278
342
  $ gem info jekyll_all_collections
279
343
 
@@ -290,15 +354,19 @@ jekyll_all_collections (0.1.0)
290
354
 
291
355
 
292
356
  ### Build and Push to RubyGems
357
+
293
358
  To release a new version,
294
- 1. Update the version number in `version.rb`.
295
- 2. Commit all changes to git; if you don't the next step might fail with an unexplainable error message.
296
- 3. Run the following:
297
- ```shell
298
- $ bundle exec rake release
299
- ```
300
- The above creates a git tag for the version, commits the created tag,
301
- and pushes the new `.gem` file to [RubyGems.org](https://rubygems.org).
359
+
360
+ 1. Update the version number in `version.rb`.
361
+ 2. Commit all changes to git; if you don't the next step might fail with an unexplainable error message.
362
+ 3. Run the following:
363
+
364
+ ```shell
365
+ $ bundle exec rake release
366
+ ```
367
+
368
+ The above creates a git tag for the version, commits the created tag,
369
+ and pushes the new `.gem` file to [RubyGems.org](https://rubygems.org).
302
370
 
303
371
 
304
372
  ## Contributing
data/Rakefile CHANGED
@@ -1,5 +1,5 @@
1
- require "bundler/gem_tasks"
2
- require "rspec/core/rake_task"
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
3
 
4
4
  RSpec::Core::RakeTask.new(:spec)
5
5
  task default: :spec
@@ -4,17 +4,17 @@ Gem::Specification.new do |spec|
4
4
  github = 'https://github.com/mslinn/jekyll_all_collections'
5
5
 
6
6
  spec.authors = ['Mike Slinn']
7
- spec.bindir = 'bin'
7
+ spec.bindir = 'exe'
8
8
  spec.description = <<~END_OF_DESC
9
9
  Provides a collection of all collections in site.all_collections.
10
10
  END_OF_DESC
11
- spec.email = ['email@email.com']
11
+ spec.email = ['mslinn@mslinn.com']
12
12
  spec.executables = []
13
13
 
14
14
  # Specify which files should be added to the gem when it is released.
15
15
  spec.files = Dir['.rubocop.yml', 'LICENSE.*', 'Rakefile', '{lib,spec}/**/*', '*.gemspec', '*.md']
16
16
 
17
- spec.homepage = github
17
+ spec.homepage = 'https://www.mslinn.com/jekyll_plugins/jekyll_all_collections.html'
18
18
  spec.license = 'MIT'
19
19
  spec.metadata = {
20
20
  'allowed_push_host' => 'https://rubygems.org',
@@ -30,6 +30,6 @@ Gem::Specification.new do |spec|
30
30
  spec.version = JekyllAllCollectionsVersion::VERSION
31
31
 
32
32
  spec.add_dependency 'jekyll', '>= 3.5.0'
33
- spec.add_dependency 'jekyll_draft', '~> 1.1.1'
34
- spec.add_dependency 'jekyll_plugin_support', '>= 0.5.0'
33
+ spec.add_dependency 'jekyll_draft', '>= 1.1.1'
34
+ spec.add_dependency 'jekyll_plugin_support', '>= 0.7.0'
35
35
  end
@@ -73,15 +73,18 @@ module AllCollectionsHooks
73
73
  def initialize(obj) # rubocop:disable Metrics/AbcSize
74
74
  @data = obj.data if obj.respond_to? :data
75
75
 
76
- @categories = @data['categories'] if obj.respond_to? :categories
76
+ @categories = @data['categories'] if @data.key? 'categories'
77
77
  @content = obj.content if obj.respond_to? :content
78
- @date = @data['date'].to_date if obj.respond_to? :date
79
- @description = @data['description'] if obj.respond_to? :data
80
- @destination = obj.destination('') if obj.respond_to? :destination # TODO: What _config.yml setting should be passed to destination()?
78
+ @date = (@data['date'].to_date if @data&.key?('date')) || Date.today
79
+ @description = @data['description'] if @data.key? 'description'
80
+
81
+ # TODO: What _config.yml setting should be passed to destination()?
82
+ @destination = obj.destination('') if obj.respond_to? :destination
83
+
81
84
  @draft = Jekyll::Draft.draft?(obj)
82
- @excerpt = @data['excerpt'] if obj.respond_to? :excerpt
83
- @ext = @data['ext'] if obj.respond_to? :data
84
- @label = obj.collection.label if obj.respond_to? :label
85
+ @excerpt = @data['excerpt'] if @data.key? 'excerpt'
86
+ @ext = @data['ext'] if @data.key? 'ext'
87
+ @label = obj.collection.label if obj&.collection.respond_to? :label
85
88
  @last_modified = @data['last_modified'] || @data['last_modified_at'] || @date
86
89
  @last_modified_field = case @data
87
90
  when @data.key?('last_modified')
@@ -89,11 +92,11 @@ module AllCollectionsHooks
89
92
  when @data.key?('last_modified_at')
90
93
  'last_modified_at'
91
94
  end
92
- @layout = @data['layout'] if obj.respond_to? :layout
95
+ @layout = @data['layout'] if @data.key? 'layout'
93
96
  @path = obj.path if obj.respond_to? :path
94
97
  @relative_path = obj.relative_path if obj.respond_to? :relative_path
95
- @tags = @data['tags'] if obj.respond_to? :tags
96
- @title = @data['title'] if obj.respond_to? :title
98
+ @tags = @data['tags'] if @data.key? 'tags'
99
+ @title = @data['title'] if @data.key? 'title'
97
100
  @type = obj.type if obj.respond_to? :type
98
101
  @url = obj.url
99
102
  end
@@ -8,8 +8,7 @@ class NullBinding < BasicObject
8
8
  def min_binding
9
9
  ::Kernel
10
10
  .instance_method(:binding)
11
- .bind(self)
12
- .call
11
+ .bind_call(self)
13
12
  end
14
13
  end
15
14
 
@@ -18,6 +17,7 @@ end
18
17
  module AllCollectionsTag
19
18
  PLUGIN_NAME = 'all_collections'.freeze
20
19
  CRITERIA = %w[date destination draft label last_modified last_modified_at path relative_path title type url].freeze
20
+ DRAFT_HTML = '<i class="jekyll_draft">Draft</i>'.freeze
21
21
 
22
22
  class AllCollectionsTag < JekyllSupport::JekyllTag
23
23
  include JekyllAllCollectionsVersion
@@ -28,18 +28,22 @@ module AllCollectionsTag
28
28
  AllCollectionsHooks.compute(@site) unless @site.class.method_defined? :all_collections
29
29
 
30
30
  @date_column = @helper.parameter_specified?('date_column') || 'date'
31
- abort "Error: the date_column attribute must either have value 'date' or 'last_modified', but '#{@date_column}' was specified" \
32
- unless %w[date last_modified].include?(@date_column)
33
-
31
+ unless %w[date last_modified].include?(@date_column)
32
+ # TODO: should this just issue a warning and return instead of dieing?
33
+ abort "Error: the date_column attribute must either have value 'date' or 'last_modified', " \
34
+ "but '#{@date_column}' was specified"
35
+ end
34
36
  @id = @helper.parameter_specified?('id') || SecureRandom.hex(10)
35
- sort_by_param = @helper.parameter_specified?('sort_by')
36
- sort_by = (sort_by_param&.gsub(' ', '')&.split(',') if sort_by_param != false) || ['-date']
37
+ sort_by_param = @helper.parameter_specified? 'sort_by'
38
+ sort_by = (sort_by_param&.delete(' ')&.split(',') if sort_by_param != false) || ['-date']
37
39
  @heading = @helper.parameter_specified?('heading') || self.class.default_head(sort_by)
38
40
  sort_lambda_string = self.class.create_lambda_string(sort_by)
39
- @logger.debug "#{@page['path']} sort_by_param=#{sort_by_param}"
40
- @logger.debug " sort_lambda_string = #{sort_lambda_string}\n"
41
- sort_lambda = self.class.evaluate(sort_lambda_string)
42
- generate_output(sort_lambda)
41
+ @logger.debug do
42
+ "#{@page['path']} sort_by_param=#{sort_by_param} " \
43
+ "sort_lambda_string = #{sort_lambda_string}\n"
44
+ end
45
+ sort_lambda = self.class.evaluate sort_lambda_string
46
+ generate_output sort_lambda
43
47
  end
44
48
 
45
49
  def self.default_head(sort_by)
@@ -57,9 +61,9 @@ module AllCollectionsTag
57
61
  criteria_lhs_array = []
58
62
  criteria_rhs_array = []
59
63
  verify_sort_by_type(criteria).each do |c|
60
- descending_sort = c.start_with?('-')
64
+ descending_sort = c.start_with? '-'
61
65
  c.delete_prefix! '-'
62
- abort("Error: '#{c}' is not a valid sort field. Valid field names are: #{CRITERIA.join(', ')}") \
66
+ abort("Error: '#{c}' is not a valid sort field. Valid field names are: #{CRITERIA.join ', '}") \
63
67
  unless CRITERIA.include?(c)
64
68
  criteria_lhs_array << (descending_sort ? "b.#{c}" : "a.#{c}")
65
69
  criteria_rhs_array << (descending_sort ? "a.#{c}" : "b.#{c}")
@@ -92,32 +96,42 @@ module AllCollectionsTag
92
96
 
93
97
  private
94
98
 
95
- def generate_output(sort_lambda)
96
- id = @id.to_s.empty? ? '' : " id='#{@id}'"
97
- heading = @heading.to_s.empty? ? '' : "<h2#{id}>#{@heading}</h2>"
98
- @site.all_collections.each do |post|
99
- # @logger.debug do
100
- # "#{post.relative_path}: last_modified=#{post.last_modified}(#{post.last_modified.class}) date=#{post.date}(#{post.date.class})"
101
- # end
102
- @logger.debug { "Error: #{post.relative_path} has no value for last_modified" if post.last_modified.to_s.empty? }
99
+ def last_modified_value(post)
100
+ @logger.debug do
101
+ " post.last_modified='#{post.last_modified}'; " \
102
+ "post.last_modified_at='#{post.last_modified_at}'; " \
103
+ "@date_column='#{@date_column}'"
103
104
  end
105
+ last_modified = if @date_column == 'last_modified' && post.respond_to?(:last_modified)
106
+ post.last_modified
107
+ elsif post.respond_to? :last_modified_at
108
+ post.last_modified_at
109
+ else
110
+ post.date
111
+ end
112
+ last_modified ||= post.date || Date.today
113
+ last_modified
114
+ end
115
+
116
+ def generate_output(sort_lambda)
117
+ id = @id.to_s.strip.empty? ? '' : " id='#{@id}'"
118
+ heading = @heading.strip.to_s.empty? ? '' : "<h2#{id}>#{@heading}</h2>"
104
119
  collection = @site.all_collections.sort(&sort_lambda)
105
120
  <<~END_TEXT
106
121
  #{heading}
107
122
  <div class="posts">
108
- #{(collection.map do |post|
109
- @logger.debug { " post.last_modified='#{post.last_modified}' @date_column='#{@date_column}'" }
110
- date = (@date_column == 'last_modified' ? post.last_modified : post.date).strftime('%Y-%m-%d')
111
- draft = post.draft ? "<i class='jekyll_draft'>Draft</i>" : ''
112
- href = "<a href='#{post.url}'>#{post.title}</a>"
113
- @logger.debug { " date='#{date}' #{post.title}\n" }
114
- " <span>#{date}</span><span>#{href}#{draft}</span>"
115
- end).join("\n")}
123
+ #{(collection.map do |post|
124
+ last_modified = last_modified_value post
125
+ date = last_modified.strftime '%Y-%m-%d'
126
+ draft = post.draft ? DRAFT_HTML : ''
127
+ href = "<a href='#{post.url}'>#{post.title}</a>"
128
+ @logger.debug { " date='#{date}' #{post.title}\n" }
129
+ " <span>#{date}</span><span>#{href}#{draft}</span>"
130
+ end).join "\n"}
116
131
  </div>
117
132
  END_TEXT
118
133
  rescue ArgumentError => e
119
- @logger.warn { e.message }
120
- @logger.warn { e.backtrace.join("\n") }
134
+ warn_short_trace e
121
135
  end
122
136
 
123
137
  JekyllPluginHelper.register(self, PLUGIN_NAME)
@@ -1,3 +1,3 @@
1
1
  module JekyllAllCollectionsVersion
2
- VERSION = '0.3.2'.freeze
2
+ VERSION = '0.3.4'.freeze
3
3
  end
@@ -1,5 +1,5 @@
1
- require_relative './all_collections_hooks'
2
- require_relative './all_collections_tag'
1
+ require_relative 'all_collections_hooks'
2
+ require_relative 'all_collections_tag'
3
3
 
4
4
  module JekyllAllCollections
5
5
  include AllCollectionsHooks
@@ -20,7 +20,7 @@ def show(lambda_string, result, expected)
20
20
  end
21
21
 
22
22
  # See https://stackoverflow.com/a/75388137/553865
23
- RSpec.describe(AllCollectionsTag) do
23
+ RSpec.describe(AllCollectionsTag::AllCollectionsTag) do
24
24
  let(:o1) { APageStub.new('2020-01-01', '2020-01-01', 'a_A') }
25
25
  let(:o2) { APageStub.new('2021-01-01', '2020-01-01', 'b_A') }
26
26
  let(:o3) { APageStub.new('2021-01-01', '2023-01-01', 'b_B') }
@@ -40,12 +40,6 @@ RSpec.describe(AllCollectionsTag) do
40
40
  expect(result).to eq([o1, o2, o3, o4])
41
41
  end
42
42
 
43
- it 'defines sort_by lambda with array of last_modified' do
44
- sort_lambda = ->(a, b) { [a.last_modified] <=> [b.last_modified] }
45
- result = objs.sort(&sort_lambda)
46
- expect(result).to eq([o1, o2, o3, o4])
47
- end
48
-
49
43
  it 'makes sort_by lambdas from stringified array of last_modified' do
50
44
  sort_lambda = eval '->(a, b) { [a.last_modified] <=> [b.last_modified] }',
51
45
  NullBinding.new.min_binding, __FILE__, __LINE__ - 1
@@ -62,8 +56,8 @@ RSpec.describe(AllCollectionsTag) do
62
56
  end
63
57
 
64
58
  it 'create_lambda with 1 date key, descending' do
65
- lambda_string = AllCollectionsTag::AllCollectionsTag.create_lambda_string('-last_modified')
66
- sort_lambda = AllCollectionsTag::AllCollectionsTag.evaluate(lambda_string)
59
+ lambda_string = described_class.create_lambda_string('-last_modified')
60
+ sort_lambda = described_class.evaluate(lambda_string)
67
61
  result = objs.sort(&sort_lambda)
68
62
  expected = [o3, o4, o1, o2]
69
63
  # show(lambda_string, result, expected)
@@ -71,8 +65,8 @@ RSpec.describe(AllCollectionsTag) do
71
65
  end
72
66
 
73
67
  it 'create_lambda with 1 date key, ascending' do
74
- lambda_string = AllCollectionsTag::AllCollectionsTag.create_lambda_string('date')
75
- sort_lambda = AllCollectionsTag::AllCollectionsTag.evaluate(lambda_string)
68
+ lambda_string = described_class.create_lambda_string('date')
69
+ sort_lambda = described_class.evaluate(lambda_string)
76
70
  result = objs.sort(&sort_lambda)
77
71
  expected = [o1, o2, o3, o4]
78
72
  # show(lambda_string, result, expected)
@@ -80,8 +74,8 @@ RSpec.describe(AllCollectionsTag) do
80
74
  end
81
75
 
82
76
  it 'create_lambda with 2 date keys, both ascending' do
83
- lambda_string = AllCollectionsTag::AllCollectionsTag.create_lambda_string(%w[date last_modified])
84
- sort_lambda = AllCollectionsTag::AllCollectionsTag.evaluate(lambda_string)
77
+ lambda_string = described_class.create_lambda_string(%w[date last_modified])
78
+ sort_lambda = described_class.evaluate(lambda_string)
85
79
  result = objs.sort(&sort_lambda)
86
80
  expected = [o1, o2, o3, o4]
87
81
  # show(lambda_string, result, expected)
@@ -89,8 +83,8 @@ RSpec.describe(AllCollectionsTag) do
89
83
  end
90
84
 
91
85
  it 'create_lambda with 2 date keys, both descending' do
92
- lambda_string = AllCollectionsTag::AllCollectionsTag.create_lambda_string(['-date', '-last_modified'])
93
- sort_lambda = AllCollectionsTag::AllCollectionsTag.evaluate(lambda_string)
86
+ lambda_string = described_class.create_lambda_string(['-date', '-last_modified'])
87
+ sort_lambda = described_class.evaluate(lambda_string)
94
88
  result = objs.sort(&sort_lambda)
95
89
  expected = [o4, o3, o2, o1]
96
90
  # show(lambda_string, result, expected)
@@ -98,8 +92,8 @@ RSpec.describe(AllCollectionsTag) do
98
92
  end
99
93
 
100
94
  it 'create_lambda with 2 date keys, first descending and second ascending' do
101
- lambda_string = AllCollectionsTag::AllCollectionsTag.create_lambda_string(['-date', 'last_modified'])
102
- sort_lambda = AllCollectionsTag::AllCollectionsTag.evaluate(lambda_string)
95
+ lambda_string = described_class.create_lambda_string(['-date', 'last_modified'])
96
+ sort_lambda = described_class.evaluate(lambda_string)
103
97
  result = objs.sort(&sort_lambda)
104
98
  expected = [o4, o2, o3, o1]
105
99
  # show(lambda_string, result, expected)
@@ -107,8 +101,8 @@ RSpec.describe(AllCollectionsTag) do
107
101
  end
108
102
 
109
103
  it 'create_lambda with 2 date keys, first ascending and second descending' do
110
- lambda_string = AllCollectionsTag::AllCollectionsTag.create_lambda_string(['date', '-last_modified'])
111
- sort_lambda = AllCollectionsTag::AllCollectionsTag.evaluate(lambda_string)
104
+ lambda_string = described_class.create_lambda_string(['date', '-last_modified'])
105
+ sort_lambda = described_class.evaluate(lambda_string)
112
106
  result = objs.sort(&sort_lambda)
113
107
  expected = [o1, o3, o2, o4]
114
108
  # show(lambda_string, result, expected)
data/spec/spec_helper.rb CHANGED
@@ -6,9 +6,8 @@ require_relative '../lib/jekyll_all_collections'
6
6
  Jekyll.logger.log_level = :info
7
7
 
8
8
  RSpec.configure do |config|
9
- config.filter_run :focus
10
9
  # config.order = 'random'
11
- config.run_all_when_everything_filtered = true
10
+ config.filter_run_when_matching focus: true
12
11
 
13
12
  # See https://relishapp.com/rspec/rspec-core/docs/command-line/only-failures
14
13
  config.example_status_persistence_file_path = 'spec/status_persistence.txt'
@@ -1,20 +1,23 @@
1
- example_id | status | run_time |
2
- ------------------------------------------ | ------ | --------------- |
3
- ./spec/jekyll_all_collections_spec.rb[1:1] | passed | 0.00268 seconds |
4
- ./spec/jekyll_all_collections_spec.rb[1:2] | passed | 0.00018 seconds |
5
- ./spec/jekyll_all_collections_spec.rb[1:3] | passed | 0.00008 seconds |
6
- ./spec/jekyll_all_collections_spec.rb[1:4] | passed | 0.00007 seconds |
7
- ./spec/jekyll_all_collections_spec.rb[1:5] | passed | 0.00008 seconds |
8
- ./spec/jekyll_all_collections_spec.rb[1:6] | passed | 0.00006 seconds |
9
- ./spec/jekyll_all_collections_spec.rb[1:7] | passed | 0.00006 seconds |
10
- ./spec/jekyll_all_collections_spec.rb[1:8] | passed | 0.00008 seconds |
11
- ./spec/jekyll_all_collections_spec.rb[1:9] | passed | 0.00006 seconds |
12
- ./spec/jekyll_all_collections_spec.rb[2:1] | passed | 0.00037 seconds |
13
- ./spec/jekyll_all_collections_spec.rb[2:2] | passed | 0.00019 seconds |
14
- ./spec/jekyll_all_collections_spec.rb[2:3] | passed | 0.00028 seconds |
15
- ./spec/jekyll_all_collections_spec.rb[2:4] | failed | 0.0493 seconds |
16
- ./spec/jekyll_all_collections_spec.rb[2:5] | passed | 0.00026 seconds |
17
- ./spec/jekyll_all_collections_spec.rb[2:6] | passed | 0.00017 seconds |
18
- ./spec/jekyll_all_collections_spec.rb[2:7] | failed | 0.01092 seconds |
19
- ./spec/jekyll_all_collections_spec.rb[2:8] | failed | 0.01013 seconds |
20
- ./spec/jekyll_all_collections_spec.rb[2:9] | failed | 0.01195 seconds |
1
+ example_id | status | run_time |
2
+ -------------------------------- | ------ | --------------- |
3
+ ./spec/date_sort_spec.rb[1:1] | passed | 0.00111 seconds |
4
+ ./spec/date_sort_spec.rb[1:2] | passed | 0.00019 seconds |
5
+ ./spec/date_sort_spec.rb[1:3] | passed | 0.00014 seconds |
6
+ ./spec/date_sort_spec.rb[1:4] | passed | 0.00016 seconds |
7
+ ./spec/date_sort_spec.rb[1:5] | passed | 0.00016 seconds |
8
+ ./spec/date_sort_spec.rb[1:6] | passed | 0.00015 seconds |
9
+ ./spec/date_sort_spec.rb[1:7] | passed | 0.00014 seconds |
10
+ ./spec/date_sort_spec.rb[1:8] | passed | 0.00014 seconds |
11
+ ./spec/date_sort_spec.rb[1:9] | passed | 0.00016 seconds |
12
+ ./spec/date_sort_spec.rb[1:10] | passed | 0.00015 seconds |
13
+ ./spec/lambda_sort_spec.rb[1:1] | passed | 0.00017 seconds |
14
+ ./spec/lambda_sort_spec.rb[1:2] | passed | 0.00022 seconds |
15
+ ./spec/lambda_sort_spec.rb[1:3] | passed | 0.00029 seconds |
16
+ ./spec/lambda_sort_spec.rb[1:4] | passed | 0.0002 seconds |
17
+ ./spec/lambda_sort_spec.rb[1:5] | passed | 0.00018 seconds |
18
+ ./spec/lambda_sort_spec.rb[1:6] | passed | 0.0002 seconds |
19
+ ./spec/lambda_sort_spec.rb[1:7] | passed | 0.00019 seconds |
20
+ ./spec/lambda_sort_spec.rb[1:8] | passed | 0.00019 seconds |
21
+ ./spec/lambda_sort_spec.rb[1:9] | passed | 0.00019 seconds |
22
+ ./spec/lambda_sort_spec.rb[1:10] | passed | 0.00019 seconds |
23
+ ./spec/lambda_sort_spec.rb[1:11] | passed | 0.00036 seconds |
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jekyll_all_collections
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.2
4
+ version: 0.3.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Slinn
8
8
  autorequire:
9
- bindir: bin
9
+ bindir: exe
10
10
  cert_chain: []
11
- date: 2023-04-13 00:00:00.000000000 Z
11
+ date: 2023-12-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jekyll
@@ -28,14 +28,14 @@ dependencies:
28
28
  name: jekyll_draft
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: 1.1.1
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: 1.1.1
41
41
  - !ruby/object:Gem::Dependency
@@ -44,19 +44,19 @@ dependencies:
44
44
  requirements:
45
45
  - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: 0.5.0
47
+ version: 0.7.0
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: 0.5.0
54
+ version: 0.7.0
55
55
  description: 'Provides a collection of all collections in site.all_collections.
56
56
 
57
57
  '
58
58
  email:
59
- - email@email.com
59
+ - mslinn@mslinn.com
60
60
  executables: []
61
61
  extensions: []
62
62
  extra_rdoc_files: []
@@ -71,18 +71,18 @@ files:
71
71
  - lib/all_collections_tag.rb
72
72
  - lib/jekyll_all_collections.rb
73
73
  - lib/jekyll_all_collections/version.rb
74
- - spec/all_collections_tag_sort_spec.rb
74
+ - spec/all_collections_tag/all_collections_tag_sort_spec.rb
75
75
  - spec/date_sort_spec.rb
76
76
  - spec/spec_helper.rb
77
77
  - spec/status_persistence.txt
78
- homepage: https://github.com/mslinn/jekyll_all_collections
78
+ homepage: https://www.mslinn.com/jekyll_plugins/jekyll_all_collections.html
79
79
  licenses:
80
80
  - MIT
81
81
  metadata:
82
82
  allowed_push_host: https://rubygems.org
83
83
  bug_tracker_uri: https://github.com/mslinn/jekyll_all_collections/issues
84
84
  changelog_uri: https://github.com/mslinn/jekyll_all_collections/CHANGELOG.md
85
- homepage_uri: https://github.com/mslinn/jekyll_all_collections
85
+ homepage_uri: https://www.mslinn.com/jekyll_plugins/jekyll_all_collections.html
86
86
  source_code_uri: https://github.com/mslinn/jekyll_all_collections
87
87
  post_install_message:
88
88
  rdoc_options: []