jekyll_frontmatter_tests 0.0.13 → 0.1.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/jekyll-frontmatter-tests.gemspec +5 -1
- data/lib/jekyll_frontmatter_tests.rb +1 -0
- data/lib/jekyll_frontmatter_tests/jekyll_frontmatter_tests_helper.rb +20 -3
- data/lib/jekyll_frontmatter_tests/jekyll_frontmatter_tests_rules.rb +52 -0
- data/lib/jekyll_frontmatter_tests/jekyll_frontmatter_tests_validator.rb +30 -13
- data/lib/jekyll_frontmatter_tests/version.rb +3 -0
- data/lib/rules.yml +4 -0
- metadata +4 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 00fc0de9a96a87565919528bf16f8cecad3c3df6
|
|
4
|
+
data.tar.gz: aa548a8fc5dee79b5b7ff7907987a15a4024dfe6
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 48ebfb873111a3966f5bf0e074d64f1a487f60a4ad9b25c1485ef93229db913920eba78dd1eabf9c740109fb93fb021b4559700f47b8426568af47a1517e5b33
|
|
7
|
+
data.tar.gz: b9ca0920616cc2e705313ef047827cb965925dae96fa0dbd75883b515c9afcfd56ec0bf9b83a27e19c134708837936afe9c2a53f069a5d1989e1fe37e3e3678d
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
lib = File.expand_path('../lib', __FILE__)
|
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
3
|
+
require 'jekyll_frontmatter_tests/version'
|
|
4
|
+
|
|
1
5
|
Gem::Specification.new do |s|
|
|
2
6
|
s.description = 'Tests the frontmatter of posts and other collection documents against a schema'
|
|
3
7
|
s.summary = 'Tests jekyll documents for proper frontmatter'
|
|
@@ -6,7 +10,7 @@ Gem::Specification.new do |s|
|
|
|
6
10
|
s.license = 'CC0'
|
|
7
11
|
s.authors = ['Greg Boone']
|
|
8
12
|
s.email = ['gregory.boone@gsa.gov']
|
|
9
|
-
s.version =
|
|
13
|
+
s.version = JekyllFrontmatterTests::VERSION
|
|
10
14
|
s.files = %w{
|
|
11
15
|
jekyll-frontmatter-tests.gemspec
|
|
12
16
|
Gemfile
|
|
@@ -6,6 +6,7 @@ require_relative 'jekyll_frontmatter_tests/jekyll_frontmatter_tests_initializer'
|
|
|
6
6
|
require_relative 'jekyll_frontmatter_tests/jekyll_frontmatter_tests_tester'
|
|
7
7
|
require_relative 'jekyll_frontmatter_tests/jekyll_frontmatter_tests_loader'
|
|
8
8
|
require_relative 'jekyll_frontmatter_tests/jekyll_frontmatter_tests_processor'
|
|
9
|
+
require_relative 'jekyll_frontmatter_tests/jekyll_frontmatter_tests_rules'
|
|
9
10
|
require_relative 'jekyll_frontmatter_tests/jekyll_frontmatter_tests_validator'
|
|
10
11
|
require_relative 'jekyll_frontmatter_tests/jekyll_frontmatter_tests_helper'
|
|
11
12
|
|
|
@@ -16,11 +16,28 @@ class FrontmatterTests < Jekyll::Command
|
|
|
16
16
|
end
|
|
17
17
|
end
|
|
18
18
|
|
|
19
|
+
def follows_rules?(value, rules)
|
|
20
|
+
if rules.include?('no-dash') && rules.include?('lowercase')
|
|
21
|
+
FrontmatterRules.dashless?(value) && FrontmatterRules.lowercase?(value)
|
|
22
|
+
elsif rules.include?('no-dash') && !rules.include?('lowercase')
|
|
23
|
+
FrontmatterRules.dashless?(value)
|
|
24
|
+
elsif !rules.include?('no-dash') && rules.include?('lowercase')
|
|
25
|
+
FrontmatterRules.lowercase?(value)
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
19
29
|
def required?(key, schema)
|
|
20
|
-
|
|
21
|
-
|
|
30
|
+
is_required = true
|
|
31
|
+
is_primary = schema[key]
|
|
32
|
+
schema['config'] = schema['config'] || { 'optional': [] }
|
|
33
|
+
is_optional = schema['config']['optional'].include?(key)
|
|
34
|
+
|
|
35
|
+
if is_primary && !is_optional
|
|
36
|
+
is_required
|
|
37
|
+
elsif (is_primary && is_optional) || (!is_primary && is_optional)
|
|
38
|
+
!is_required
|
|
22
39
|
else
|
|
23
|
-
|
|
40
|
+
raise 'The key provided is not in the schema.'
|
|
24
41
|
end
|
|
25
42
|
end
|
|
26
43
|
end
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
require 'pry'
|
|
2
|
+
require 'yaml'
|
|
3
|
+
|
|
4
|
+
class FrontmatterRules
|
|
5
|
+
class << self
|
|
6
|
+
# Returns true if there are no dashes in any of the values
|
|
7
|
+
def dashless?(values)
|
|
8
|
+
rules_config = RulesConfig.new
|
|
9
|
+
rules = rules_config.rules['no-dash'] || rules_config.empty_rule
|
|
10
|
+
exceptions = rules['exceptions'].compact
|
|
11
|
+
if values.instance_of?(Array)
|
|
12
|
+
no_dashes = values.map do |value|
|
|
13
|
+
(!value.include?('-') && !value.include?('–')) || exceptions.include?(value)
|
|
14
|
+
end
|
|
15
|
+
# no_dashes will only have false values if there are dashes present
|
|
16
|
+
!no_dashes.include? false
|
|
17
|
+
elsif values.instance_of?(String)
|
|
18
|
+
(!values.include?('-') && !values.include?('–')) || exceptions.include?(values)
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Returns true if there are no uppercase characters in any of the values
|
|
23
|
+
def lowercase?(values)
|
|
24
|
+
rules_config = RulesConfig.new
|
|
25
|
+
rules = rules_config.rules['lowercase'] || rules_config.empty_rule
|
|
26
|
+
exceptions = rules['exceptions'].compact
|
|
27
|
+
if values.instance_of?(Array)
|
|
28
|
+
all_lowercase = values.map do |value|
|
|
29
|
+
(value.downcase == value) || exceptions.include?(value)
|
|
30
|
+
end
|
|
31
|
+
# all_lowercase will only have false values if there are are uppercase
|
|
32
|
+
# characters present
|
|
33
|
+
!all_lowercase.include? false
|
|
34
|
+
elsif values.instance_of?(String)
|
|
35
|
+
(values.downcase === values) || exceptions.include?(values)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
class RulesConfig
|
|
42
|
+
def initialize
|
|
43
|
+
rules_yml = File.join(Dir.pwd, 'tests', 'schema', 'rules.yml')
|
|
44
|
+
gem_path = $LOAD_PATH.select { |p| p.include? 'jekyll_frontmatter_tests' }
|
|
45
|
+
default_rules_yml = File.join(gem_path, 'rules.yml')
|
|
46
|
+
rules_config = File.exists?(rules_yml) ? rules_yml : default_rules_yml
|
|
47
|
+
@rules = YAML.load_file(rules_config)
|
|
48
|
+
@empty_rule = { "exceptions"=>[] }
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
attr_reader :rules, :empty_rule
|
|
52
|
+
end
|
|
@@ -27,6 +27,10 @@ class FrontmatterTests < Jekyll::Command
|
|
|
27
27
|
end
|
|
28
28
|
end
|
|
29
29
|
|
|
30
|
+
def basepath
|
|
31
|
+
File.join(Dir.pwd, 'tests', 'schema')
|
|
32
|
+
end
|
|
33
|
+
|
|
30
34
|
# Internal: eventually, validate that the *values* match expected types
|
|
31
35
|
#
|
|
32
36
|
# For example, if we expect the `date` key to be in yyyy-mm-dd format, validate
|
|
@@ -42,22 +46,16 @@ class FrontmatterTests < Jekyll::Command
|
|
|
42
46
|
else
|
|
43
47
|
value
|
|
44
48
|
end
|
|
49
|
+
|
|
45
50
|
next unless required?(key, schema)
|
|
46
51
|
if key == 'config'
|
|
47
52
|
next
|
|
48
53
|
elsif value.class == Hash
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
return false
|
|
55
|
-
else
|
|
56
|
-
next
|
|
57
|
-
end
|
|
58
|
-
else
|
|
59
|
-
next
|
|
60
|
-
end
|
|
54
|
+
next unless value.keys.include?('one_of') || value.keys.include?('rules')
|
|
55
|
+
violate_one_of = check_one_of(data, key, value) == false
|
|
56
|
+
violate_rules = check_rules(data, key, value) == false
|
|
57
|
+
return false if violate_one_of || violate_rules
|
|
58
|
+
|
|
61
59
|
elsif type == 'Array' && data[key].class == Array
|
|
62
60
|
next
|
|
63
61
|
elsif type == 'Boolean' && data[key].is_a?(Boolean)
|
|
@@ -67,11 +65,30 @@ class FrontmatterTests < Jekyll::Command
|
|
|
67
65
|
elsif type == 'Date'
|
|
68
66
|
next
|
|
69
67
|
else
|
|
70
|
-
puts " * '#{key}'
|
|
68
|
+
puts " * invalid value for '#{key}' in #{file}. " \
|
|
71
69
|
"Expected #{type} but was #{data[key].class}\n\n"
|
|
72
70
|
return false
|
|
73
71
|
end
|
|
74
72
|
end
|
|
75
73
|
end
|
|
74
|
+
|
|
75
|
+
def check_one_of(data, key, value)
|
|
76
|
+
if value.keys.include?('one_of') && !one_of?(data[key], value['one_of'])
|
|
77
|
+
puts " * One of error: One of '#{data[key]}' was not".red
|
|
78
|
+
puts " in the list of expected values in".red
|
|
79
|
+
puts " #{File.join(basepath, value['one_of'])}\n".yellow
|
|
80
|
+
|
|
81
|
+
false
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def check_rules(data, key, value)
|
|
86
|
+
if value.keys.include?('rules') && !follows_rules?(data[key], value['rules'])
|
|
87
|
+
puts " * Rules error: One of '#{data[key]}'".red
|
|
88
|
+
puts " doesn't follow the rules defined in".red
|
|
89
|
+
puts " #{basepath}/rules.yml\n".yellow
|
|
90
|
+
false
|
|
91
|
+
end
|
|
92
|
+
end
|
|
76
93
|
end
|
|
77
94
|
end
|
data/lib/rules.yml
ADDED
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: jekyll_frontmatter_tests
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0
|
|
4
|
+
version: 0.1.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Greg Boone
|
|
@@ -172,8 +172,11 @@ files:
|
|
|
172
172
|
- lib/jekyll_frontmatter_tests/jekyll_frontmatter_tests_initializer.rb
|
|
173
173
|
- lib/jekyll_frontmatter_tests/jekyll_frontmatter_tests_loader.rb
|
|
174
174
|
- lib/jekyll_frontmatter_tests/jekyll_frontmatter_tests_processor.rb
|
|
175
|
+
- lib/jekyll_frontmatter_tests/jekyll_frontmatter_tests_rules.rb
|
|
175
176
|
- lib/jekyll_frontmatter_tests/jekyll_frontmatter_tests_tester.rb
|
|
176
177
|
- lib/jekyll_frontmatter_tests/jekyll_frontmatter_tests_validator.rb
|
|
178
|
+
- lib/jekyll_frontmatter_tests/version.rb
|
|
179
|
+
- lib/rules.yml
|
|
177
180
|
homepage: https://rubygems.org/gems/jekyll_frontmatter_tests
|
|
178
181
|
licenses:
|
|
179
182
|
- CC0
|