publishing_platform_schemas 0.1.1 → 0.2.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/lib/publishing_platform_schemas/example.rb +38 -0
- data/lib/publishing_platform_schemas/rspec_matchers.rb +16 -0
- data/lib/publishing_platform_schemas/validator.rb +53 -0
- data/lib/publishing_platform_schemas/version.rb +1 -1
- data/lib/publishing_platform_schemas.rb +1 -0
- metadata +6 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 755a92ec42192fb7a5b02beea49d15893f45fa79c1cb64a30da56eb8e635fa7e
|
4
|
+
data.tar.gz: 778ba197d377bd32b434821a0283cbef9245803e3ad964650a51eb487c848d94
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1e76d0bf70f0711d91cc7b1313157567dd8f6b0f4118cd453f56f0f488c8013335c64cd737648276d3ab9ec3a89afe8d140a7c7ebbf9a9efa1b317b79077e671
|
7
|
+
data.tar.gz: b5baf59cbb570a6d6276193aafb71534aa6265787691b83f890aeb5bab2b1dc6672142a7aec26402c4e74c76be17d3b5b7a7db186fb1c4bc2c4e05137a4b287b
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module PublishingPlatformSchemas
|
2
|
+
class Example
|
3
|
+
# Find all examples for a schema
|
4
|
+
#
|
5
|
+
# @param schema_name [String] like "detailed_guide", "policy" or "publication"
|
6
|
+
# @return [Array] array of example content items
|
7
|
+
def self.find_all(schema_name)
|
8
|
+
Dir.glob("#{examples_path(schema_name)}/*.json").map do |filename|
|
9
|
+
json = File.read(filename)
|
10
|
+
JSON.parse(json)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
# Find an example by name
|
15
|
+
#
|
16
|
+
# @param schema_name [String] like "detailed_guide", "policy" or "publication"
|
17
|
+
# @param example_name [String] the name of the example JSON file
|
18
|
+
# @return [Hash] the example content item
|
19
|
+
def self.find(schema_name, example_name:)
|
20
|
+
json = File.read("#{examples_path(schema_name)}/#{example_name}.json")
|
21
|
+
JSON.parse(json)
|
22
|
+
end
|
23
|
+
|
24
|
+
# Examples are changing location in schemas, this allows this utility
|
25
|
+
# to work with both locations
|
26
|
+
#
|
27
|
+
# @param schema_name [String] like "detailed_guide", "policy" or "publication"
|
28
|
+
# @return [String] the path to use for examples
|
29
|
+
def self.examples_path(schema_name)
|
30
|
+
examples_dir = "#{PublishingPlatformSchemas.content_schema_dir}/examples"
|
31
|
+
if Dir.exist?(examples_dir)
|
32
|
+
"#{examples_dir}/#{schema_name}/frontend"
|
33
|
+
else
|
34
|
+
"#{PublishingPlatformSchemas.content_schema_dir}/formats/#{schema_name}/frontend/examples"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require "publishing_platform_schemas/validator"
|
2
|
+
|
3
|
+
module PublishingPlatformSchemas
|
4
|
+
module RSpecMatchers
|
5
|
+
%w[links frontend publisher notification].each do |schema_type|
|
6
|
+
RSpec::Matchers.define "be_valid_against_#{schema_type}_schema".to_sym do |schema_name|
|
7
|
+
match do |item|
|
8
|
+
@validator = PublishingPlatformSchemas::Validator.new(schema_name, schema_type, item)
|
9
|
+
@validator.valid?
|
10
|
+
end
|
11
|
+
|
12
|
+
failure_message { @validator.error_message }
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require "json-schema"
|
2
|
+
|
3
|
+
module PublishingPlatformSchemas
|
4
|
+
class Validator
|
5
|
+
attr_reader :schema_name, :type
|
6
|
+
attr_accessor :payload
|
7
|
+
|
8
|
+
def initialize(schema_name, type, payload)
|
9
|
+
@schema_name = schema_name
|
10
|
+
@type = type
|
11
|
+
@payload = ensure_json(payload)
|
12
|
+
end
|
13
|
+
|
14
|
+
def valid?
|
15
|
+
errors.empty?
|
16
|
+
end
|
17
|
+
|
18
|
+
def error_message
|
19
|
+
<<~DOC
|
20
|
+
expected the payload to be valid against the '#{schema_name}' schema:
|
21
|
+
|
22
|
+
#{formatted_payload}
|
23
|
+
|
24
|
+
Validation errors:
|
25
|
+
#{errors}
|
26
|
+
DOC
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def errors
|
32
|
+
schema = Schema.find("#{type}_schema": schema_name)
|
33
|
+
validator = JSON::Validator.fully_validate(schema, payload)
|
34
|
+
validator.map { |message| "- #{humanized_error(message)}" }.join("\n")
|
35
|
+
end
|
36
|
+
|
37
|
+
def formatted_payload
|
38
|
+
JSON.pretty_generate(JSON.parse(payload))
|
39
|
+
end
|
40
|
+
|
41
|
+
def humanized_error(message)
|
42
|
+
message.gsub("The property '#/'", "The item")
|
43
|
+
.gsub(/in schema [0-9a-f-]+/, "")
|
44
|
+
.strip
|
45
|
+
end
|
46
|
+
|
47
|
+
def ensure_json(payload)
|
48
|
+
return payload if payload.is_a?(String)
|
49
|
+
|
50
|
+
payload.to_json
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: publishing_platform_schemas
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Publishing Platform
|
8
|
-
autorequire:
|
9
8
|
bindir: exe
|
10
9
|
cert_chain: []
|
11
|
-
date:
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
12
11
|
dependencies:
|
13
12
|
- !ruby/object:Gem::Dependency
|
14
13
|
name: json-schema
|
@@ -73,7 +72,6 @@ dependencies:
|
|
73
72
|
- !ruby/object:Gem::Version
|
74
73
|
version: '0'
|
75
74
|
description: Gem to work with the Publishing Platform content schemas
|
76
|
-
email:
|
77
75
|
executables: []
|
78
76
|
extensions: []
|
79
77
|
extra_rdoc_files: []
|
@@ -91,14 +89,15 @@ files:
|
|
91
89
|
- bin/console
|
92
90
|
- bin/setup
|
93
91
|
- lib/publishing_platform_schemas.rb
|
92
|
+
- lib/publishing_platform_schemas/example.rb
|
93
|
+
- lib/publishing_platform_schemas/rspec_matchers.rb
|
94
94
|
- lib/publishing_platform_schemas/schema.rb
|
95
|
+
- lib/publishing_platform_schemas/validator.rb
|
95
96
|
- lib/publishing_platform_schemas/version.rb
|
96
97
|
- publishing_platform_schemas.gemspec
|
97
|
-
homepage:
|
98
98
|
licenses:
|
99
99
|
- MIT
|
100
100
|
metadata: {}
|
101
|
-
post_install_message:
|
102
101
|
rdoc_options: []
|
103
102
|
require_paths:
|
104
103
|
- lib
|
@@ -113,8 +112,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
113
112
|
- !ruby/object:Gem::Version
|
114
113
|
version: '0'
|
115
114
|
requirements: []
|
116
|
-
rubygems_version: 3.
|
117
|
-
signing_key:
|
115
|
+
rubygems_version: 3.6.8
|
118
116
|
specification_version: 4
|
119
117
|
summary: Gem to work with the Publishing Platform content schemas
|
120
118
|
test_files: []
|