jekyll_plugin_support 0.5.1 → 0.5.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d0856ddeea29e8a1e24f0a4997aecb7f6b6b22eae587ca8466142686b65557b7
4
- data.tar.gz: ac8a8a047666f89b055b6ab90d6535b59e7f34441405852f5905ed6a517cbc27
3
+ metadata.gz: 75b8116adff0e7869b3d9d05def0b7cb702b67860e596e3b9901dce1f43182e7
4
+ data.tar.gz: 86da2a9936cbeffb9f381d3d2031f58acee7f79d8efd7a37b2f4864c3201b20e
5
5
  SHA512:
6
- metadata.gz: 8122412d70d1c99a6195834a51faa25f0d7beb59a23c18db0beba2883c83f5625920a63495b7ff21abf891faf97ae2ffe085c764c2be9d178bfeb37a7ae4e2f5
7
- data.tar.gz: abd34bf8420c7040e7015ce131a8ae3ea01158a552637a4e8d63c51095c138bdf87fd11bff1c3fb3f35fbd3e8b728a09934c4aefe0bbe29817703bdb032a8114
6
+ metadata.gz: f944740ed80b93a8d5fa6e0e4d3a4b0fe04761aa546d2dfea10b3929d7650daf87afdcd295b3698d80ded0f50209fe04a9c918914f216cfcabc335314da7454a
7
+ data.tar.gz: c5d1f11b7fb11900a94ba1430faca977794d84fd4073e793cc50128e922c401adaee2ea5ecdc2eef16b3ed1450e0ac98e5eeff1b8dc96fcc9fda1610b04dc2f8
data/.rubocop.yml CHANGED
@@ -1,5 +1,11 @@
1
+ require:
2
+ - rubocop-rspec
3
+ - rubocop-rake
4
+ # - rubocop-jekyll
5
+
1
6
  AllCops:
2
7
  Exclude:
8
+ - demo/_site/**/*
3
9
  - exe/**/*
4
10
  - vendor/**/*
5
11
  - Gemfile*
@@ -13,16 +19,24 @@ Gemspec/RequireMFA:
13
19
  Enabled: false
14
20
 
15
21
  Layout/HashAlignment:
16
- Enabled: false
22
+ EnforcedHashRocketStyle: table
17
23
 
18
24
  Layout/LineLength:
19
25
  Max: 150
20
26
 
27
+ Layout/CommentIndentation:
28
+ Exclude:
29
+ - spec/**/*
30
+
21
31
  Layout/MultilineMethodCallIndentation:
22
32
  Enabled: false
23
33
 
34
+ Lint/RedundantCopDisableDirective:
35
+ Exclude:
36
+ - jekyll_plugin_support.gemspec
37
+
24
38
  Metrics/AbcSize:
25
- Max: 20
39
+ Max: 30
26
40
 
27
41
  Metrics/BlockLength:
28
42
  Exclude:
@@ -31,11 +45,17 @@ Metrics/BlockLength:
31
45
  Metrics/MethodLength:
32
46
  Max: 25
33
47
 
34
- Style/FrozenStringLiteralComment:
35
- Enabled: false
48
+ RSpec/ExampleLength:
49
+ Max: 20
50
+
51
+ RSpec/MultipleExpectations:
52
+ Max: 15
36
53
 
37
54
  Style/Documentation:
38
55
  Enabled: false
39
56
 
57
+ Style/FrozenStringLiteralComment:
58
+ Enabled: false
59
+
40
60
  Style/TrailingCommaInHashLiteral:
41
61
  EnforcedStyleForMultiline: comma
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ ## 0.5.2 / 2023-03-17
2
+ * Added `@helper.remaining_markup` public method, which returns remaining markup passed to your tag, after keyword and name/value parsing is complete.
3
+ * Finally wrote proper `rspec` tests.
4
+ * Finally documented argument parsing.
5
+ * Fixed bug introduced in v0.5.1 which did not remove elements from `@params`.
6
+
1
7
  ## 0.5.1 / 2023-02-17
2
8
  * `no_arg_parsing` optimization added.
3
9
 
data/README.md CHANGED
@@ -109,6 +109,59 @@ module Jekyll
109
109
  end
110
110
  ```
111
111
 
112
+ ### Argument Parsing
113
+ Tag arguments can be obtained within `render_impl`.
114
+ Both keyword options and name/value parameters are supported.
115
+
116
+ Both `JekyllTag` and `JekyllBlock` use the standard Ruby mechanism for parsing command-line options:
117
+ [`shellwords`](https://ruby-doc.org/stdlib-2.5.1/libdoc/shellwords/rdoc/Shellwords.html) and
118
+ [`key_value_parser`](https://www.rubydoc.info/gems/key-value-parser).
119
+
120
+ All your code has to do is to specify the keywords to search for in the string passed from the HTML page that your tag is embedded in.
121
+ The included `demo` website has examples; both [`demo/_plugins/demo_tag.rb`](demo/_plugins/demo_tag.rb) and
122
+ [`demo/_plugins/demo_block.rb`](demo/_plugins/demo_block.rb) contain the following:
123
+
124
+ ```ruby
125
+ @keyword1 = @helper.parameter_specified? 'keyword1'
126
+ @keyword2 = @helper.parameter_specified? 'keyword2'
127
+ @name1 = @helper.parameter_specified? 'name1'
128
+ @name2 = @helper.parameter_specified? 'name2'
129
+ ```
130
+
131
+ In [`demo/index.html`](demo/index.html), the following invoked the tag:
132
+
133
+ ```html
134
+ {% demo_tag keyword1 name1='value1' unreferenced_key unreferenced_name="unreferenced_value" %}
135
+ ```
136
+
137
+ The `demo/_plugins/demo_tag.rb` plugin uses `@helper.parameter_specified?` provided by
138
+ `jekyll_support_plugin` to parse the string passed to the tag, which is
139
+ `keyword1 name1='value1' unreferenced_key unreferenced_name="unreferenced_value"`.
140
+
141
+ - Because `keyword1` was referenced by `@helper.parameter_specified?` above,
142
+ that keyword option is removed from the argument string.
143
+ - Because the `name1` key/value parameter was referenced by `@helper.parameter_specified?` above,
144
+ that name/value pair is removed from the argument string.
145
+ - The remainder of the argument string is now `unreferenced_key unreferenced_name="unreferenced_value"`.
146
+
147
+ Name/value parameters can be quoted; if the value consists of only one token then it does not need to be quoted.
148
+ The following name/value parameters all have the same result:
149
+
150
+ - `pay_tuesday="true"`
151
+ - `pay_tuesday='true'`
152
+ - `pay_tuesday=true`
153
+ - `pay_tuesday`
154
+
155
+ The following also have the same result, however note that because the value has more than one token, quotes must be used:
156
+
157
+ - `pay_tuesday="maybe not"`
158
+ - `pay_tuesday='maybe not'`
159
+
160
+ #### Remaining Markup
161
+ After your plugin has parsed all the keyword options and name/value parameters,
162
+ call `@helper.remaining_markup` to obtain the remaining markup that was passed to your plugin.
163
+
164
+
112
165
  ### `no_arg_parsing` Optimization
113
166
  If your tag or block plugin only needs access to the raw arguments passed from the web page,
114
167
  without tokenization, and you expect that the plugin might be invoked with large amounts of text,
@@ -147,7 +200,7 @@ jekyll_plugin_support (0.1.0)
147
200
  License: MIT
148
201
  Installed at: /home/mslinn/.gems
149
202
 
150
- Generates Jekyll logger with colored output.
203
+ Provides support for writing Jekyll plugins.
151
204
  ```
152
205
 
153
206
 
@@ -1,6 +1,6 @@
1
1
  require_relative 'lib/jekyll_plugin_support/version'
2
2
 
3
- Gem::Specification.new do |spec|
3
+ Gem::Specification.new do |spec| # rubocop:disable Metrics/BlockLength
4
4
  github = 'https://github.com/mslinn/jekyll_plugin_support'
5
5
 
6
6
  spec.bindir = 'exe'
@@ -1,3 +1,3 @@
1
1
  module JekyllPluginSupportVersion
2
- VERSION = '0.5.1'.freeze
2
+ VERSION = '0.5.2'.freeze
3
3
  end
@@ -75,9 +75,15 @@ class JekyllPluginHelper
75
75
  @keys_values = KeyValueParser \
76
76
  .new({}, { array_values: false, normalize_keys: false, separator: /=/ }) \
77
77
  .parse(@argv)
78
+ @params = @keys_values.map { |k, _v| lookup_variable(k) } unless respond_to?(:no_arg_parsing) && no_arg_parsing
78
79
  end
79
80
  end
80
81
 
82
+ # Call this method to return the remaining markup after `parameter_specified?` has been invoked.
83
+ def remaining_markup
84
+ @argv.join(' ')
85
+ end
86
+
81
87
  def delete_parameter(key)
82
88
  return if @keys_values.empty? || @params.nil?
83
89
 
@@ -123,7 +129,6 @@ class JekyllPluginHelper
123
129
  # Sets @params by replacing any Liquid variable names with their values
124
130
  def liquid_context=(context)
125
131
  @liquid_context = context
126
- @params = @keys_values.map { |k, _v| lookup_variable(k) } unless respond_to?(:no_arg_parsing) && no_arg_parsing
127
132
  end
128
133
 
129
134
  def lookup_variable(symbol)
@@ -1,41 +1,60 @@
1
1
  require 'jekyll_plugin_logger'
2
- # require 'rspec/match_ignoring_whitespace'
2
+ require 'rspec/match_ignoring_whitespace'
3
3
  require_relative '../lib/jekyll_plugin_support'
4
4
  require_relative '../lib/jekyll_plugin_support_spec_support'
5
5
 
6
- # Lets get this party started
7
6
  class MyTest
8
- RSpec.describe JekyllSupport::JekyllBlock do
9
- let(:logger) do
10
- PluginMetaLogger.instance.new_logger(self, PluginMetaLogger.instance.config)
7
+ RSpec.describe JekyllPluginHelper do
8
+ logger = PluginMetaLogger.instance.new_logger(self, PluginMetaLogger.instance.config)
9
+
10
+ it 'parses quoted string options' do
11
+ helper = described_class.new('my_tag', "colors='blue or green' blah ick", logger, false)
12
+ expect(helper.keys_values.keys).to eq(%w[colors blah ick])
13
+
14
+ colors = helper.parameter_specified? 'colors'
15
+ expect(colors).to eq('blue or green')
16
+
17
+ expect(helper.keys_values.keys).to eq(%w[blah ick])
18
+ end
19
+
20
+ it 'parses unquoted string options' do
21
+ helper = described_class.new('my_tag', 'color=blue blah ick', logger, false)
22
+ expect(helper.keys_values.keys).to eq(%w[color blah ick])
23
+
24
+ color = helper.parameter_specified? 'color'
25
+ expect(color).to eq('blue')
26
+
27
+ expect(helper.keys_values.keys).to eq(%w[blah ick])
28
+ end
29
+
30
+ it 'parses quoted booleans' do
31
+ helper = described_class.new('my_tag', "bool1='true' bool2='false' blah ick", logger, false)
32
+ expect(helper.keys_values.keys).to eq(%w[bool1 bool2 blah ick])
33
+
34
+ bool1 = helper.parameter_specified? 'bool1'
35
+ expect(bool1).to be true
36
+
37
+ bool2 = helper.parameter_specified? 'bool2'
38
+ expect(bool2).to be false
39
+
40
+ expect(helper.keys_values.keys).to eq(%w[blah ick])
41
+
42
+ expect(helper.remaining_markup).to eq('blah ick')
11
43
  end
12
44
 
13
- let(:parse_context) { TestParseContext.new }
14
-
15
- # Example for plugin authors to refer to:
16
- #
17
- # let(:helper) do
18
- # JekyllTagHelper.new(
19
- # 'quote',
20
- # "cite='This is a citation' url='https://blah.com' This is the quoted text.",
21
- # logger
22
- # )
23
- # end
24
- #
25
- # fit 'is created properly' do
26
- # command_line = "cite='This is a citation' url='https://blah.com' This is the quoted text.".dup
27
- # quote = Jekyll::Quote.send(
28
- # :new,
29
- # 'quote',
30
- # command_line,
31
- # parse_context
32
- # )
33
- # result = quote.send(:render_impl, command_line)
34
- # expect(result).to match_ignoring_whitespace <<-END_RESULT
35
- # <div class='quote'>
36
- # This is the quoted text.
37
- # </div>
38
- # END_RESULT
39
- # end
45
+ it 'parses unquoted booleans' do
46
+ helper = described_class.new('my_tag', 'bool1=true bool2=false blah ick', logger, false)
47
+ expect(helper.keys_values.keys).to eq(%w[bool1 bool2 blah ick])
48
+
49
+ bool1 = helper.parameter_specified? 'bool1'
50
+ expect(bool1).to be true
51
+
52
+ bool2 = helper.parameter_specified? 'bool2'
53
+ expect(bool2).to be false
54
+
55
+ expect(helper.keys_values.keys).to eq(%w[blah ick])
56
+
57
+ expect(helper.remaining_markup).to eq('blah ick')
58
+ end
40
59
  end
41
60
  end
data/spec/spec_helper.rb CHANGED
@@ -3,7 +3,7 @@ require_relative '../lib/jekyll_plugin_support'
3
3
 
4
4
  RSpec.configure do |config|
5
5
  config.filter_run :focus
6
- config.order = 'random'
6
+ # config.order = 'random'
7
7
  config.run_all_when_everything_filtered = true
8
8
 
9
9
  # See https://relishapp.com/rspec/rspec-core/docs/command-line/only-failures
@@ -0,0 +1,6 @@
1
+ example_id | status | run_time |
2
+ ------------------------------------------------------------------------------------------------- | ------ | --------------- |
3
+ /mnt/_/work/jekyll/my_plugins/jekyll_plugin_support/spec/jekyll_block_plugin_support_spec.rb[1:1] | passed | 0.00335 seconds |
4
+ /mnt/_/work/jekyll/my_plugins/jekyll_plugin_support/spec/jekyll_block_plugin_support_spec.rb[1:2] | passed | 0.00019 seconds |
5
+ /mnt/_/work/jekyll/my_plugins/jekyll_plugin_support/spec/jekyll_block_plugin_support_spec.rb[1:3] | passed | 0.00337 seconds |
6
+ /mnt/_/work/jekyll/my_plugins/jekyll_plugin_support/spec/jekyll_block_plugin_support_spec.rb[1:4] | passed | 0.00026 seconds |
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jekyll_plugin_support
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.1
4
+ version: 0.5.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Slinn
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-02-17 00:00:00.000000000 Z
11
+ date: 2023-03-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jekyll
@@ -70,7 +70,6 @@ files:
70
70
  - lib/jekyll_plugin_support_helper.rb
71
71
  - lib/jekyll_plugin_support_spec_support.rb
72
72
  - spec/jekyll_block_plugin_support_spec.rb
73
- - spec/jekyll_tag_plugin_support_spec.rb
74
73
  - spec/spec_helper.rb
75
74
  - spec/status_persistence.txt
76
75
  homepage: https://www.mslinn.com/blog/2020/10/03/jekyll-plugins.html#quote
@@ -106,7 +105,6 @@ specification_version: 4
106
105
  summary: Provides support for writing Jekyll plugins.
107
106
  test_files:
108
107
  - spec/jekyll_block_plugin_support_spec.rb
109
- - spec/jekyll_tag_plugin_support_spec.rb
110
108
  - spec/spec_helper.rb
111
109
  - spec/status_persistence.txt
112
110
  ...
@@ -1,41 +0,0 @@
1
- require 'jekyll_plugin_logger'
2
- # require 'rspec/match_ignoring_whitespace'
3
- require_relative '../lib/jekyll_plugin_support'
4
- require_relative '../lib/jekyll_plugin_support_spec_support'
5
-
6
- # Lets get this party started
7
- class MyTest
8
- RSpec.describe JekyllSupport::JekyllTag do
9
- let(:logger) do
10
- PluginMetaLogger.instance.new_logger(self, PluginMetaLogger.instance.config)
11
- end
12
-
13
- let(:parse_context) { TestParseContext.new }
14
-
15
- # Example for plugin authors to refer to:
16
- #
17
- # let(:helper) do
18
- # JekyllTagHelper.new(
19
- # 'quote',
20
- # "cite='This is a citation' url='https://blah.com' This is the quoted text.",
21
- # logger
22
- # )
23
- # end
24
- #
25
- # fit 'is created properly' do
26
- # command_line = "cite='This is a citation' url='https://blah.com' This is the quoted text.".dup
27
- # quote = Jekyll::Quote.send(
28
- # :new,
29
- # 'quote',
30
- # command_line,
31
- # parse_context
32
- # )
33
- # result = quote.send(:render_impl, command_line)
34
- # expect(result).to match_ignoring_whitespace <<-END_RESULT
35
- # <div class='quote'>
36
- # This is the quoted text.
37
- # </div>
38
- # END_RESULT
39
- # end
40
- end
41
- end