yarrow 0.8.0 → 0.8.1
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/yarrow/config.rb +8 -3
- data/lib/yarrow/content/policy.rb +2 -0
- data/lib/yarrow/content/tree_expansion.rb +5 -9
- data/lib/yarrow/defaults.yml +1 -3
- data/lib/yarrow/schema/definitions.rb +44 -7
- data/lib/yarrow/schema/entity.rb +13 -0
- data/lib/yarrow/version.rb +1 -1
- data/lib/yarrow/web/document.rb +13 -8
- data/lib/yarrow/web/manifest.rb +27 -28
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d26941f2b464c551d825b73999b0365637b9e4feec159ee74de51a1abca3416e
|
4
|
+
data.tar.gz: 34081172c945cf83e97ab3ee03484436ba380de6c809c2dd87caaa50f1bba315
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6300e2c0f83c741862cf6c49acc42118636a3832401706057b483d942c07a947ea1124b2c10e056cc5052e25a28a59f896216d0156911026639d16e0faa5ba73
|
7
|
+
data.tar.gz: 0b897183df8712cbc08d0a479ed1e1d129a90305ad76f9bc802ea262707026ff5ffa57890d0d26d49955f55721ffd0887510671c86430e4780564266758ebaed
|
data/lib/yarrow/config.rb
CHANGED
@@ -37,17 +37,22 @@ module Yarrow
|
|
37
37
|
:port,
|
38
38
|
:host,
|
39
39
|
:handler,
|
40
|
-
|
41
|
-
:middleware,
|
42
|
-
#:root_dir
|
40
|
+
:middleware
|
43
41
|
)
|
44
42
|
|
43
|
+
class Output < Yarrow::Schema::Entity[:output]
|
44
|
+
attribute :generator, :string
|
45
|
+
attribute :template_dir, :path
|
46
|
+
#attribute :scripts, :array
|
47
|
+
end
|
48
|
+
|
45
49
|
# Top level root config namespace.
|
46
50
|
class Instance < Yarrow::Schema::Entity
|
47
51
|
attribute :source_dir, :path
|
48
52
|
attribute :output_dir, :path
|
49
53
|
attribute :meta, :any
|
50
54
|
attribute :server, :any
|
55
|
+
#attribute :output, :output
|
51
56
|
end
|
52
57
|
#
|
53
58
|
# `content_dir` and `output_dir` are placeholders and should be overriden
|
@@ -6,11 +6,6 @@ module Yarrow
|
|
6
6
|
#policy.match()
|
7
7
|
|
8
8
|
#p graph.n(:root).out(:directory).first.props[:name]
|
9
|
-
|
10
|
-
expand_impl(policy)
|
11
|
-
end
|
12
|
-
|
13
|
-
def expand_impl(policy)
|
14
9
|
type = policy.container
|
15
10
|
|
16
11
|
# If match path represents entire content dir, then include the entire
|
@@ -18,13 +13,14 @@ module Yarrow
|
|
18
13
|
# the collection.
|
19
14
|
#start_node = if policy.match_path == "."
|
20
15
|
start_node = if true
|
21
|
-
|
16
|
+
# TODO: match against source_dir
|
17
|
+
graph.n(:root).out(:directory)
|
22
18
|
else
|
23
|
-
graph.n(:root).out(name:
|
19
|
+
graph.n(:root).out(name: policy.container.to_s)
|
24
20
|
end
|
25
21
|
|
26
22
|
# Extract metadata from given start node
|
27
|
-
collection_metadata = extract_metadata(start_node,
|
23
|
+
collection_metadata = extract_metadata(start_node, policy.container)
|
28
24
|
|
29
25
|
# Collect all nested collections in the subgraph for this content type
|
30
26
|
subcollections = {}
|
@@ -37,7 +33,7 @@ module Yarrow
|
|
37
33
|
# Create a collection node representing a collection of documents
|
38
34
|
index = graph.create_node do |collection_node|
|
39
35
|
collection_node.label = :collection
|
40
|
-
collection_node.props[:type] =
|
36
|
+
collection_node.props[:type] = policy.container
|
41
37
|
collection_node.props[:name] = node.props[:name]
|
42
38
|
|
43
39
|
# TODO: title needs to be defined from metadata
|
data/lib/yarrow/defaults.yml
CHANGED
@@ -4,9 +4,16 @@ module Yarrow
|
|
4
4
|
DEFINED_TYPES = {
|
5
5
|
string: Types::Instance.of(String),
|
6
6
|
integer: Types::Instance.of(Integer),
|
7
|
-
symbol: Types::Instance.of(Symbol),
|
7
|
+
symbol: Types::Instance.of(Symbol).accept(String, :to_sym),
|
8
8
|
path: Types::Instance.of(Pathname).accept(String),
|
9
|
-
any: Types::Any.new
|
9
|
+
any: Types::Any.new,
|
10
|
+
array: Types::List.of(Types::Any),
|
11
|
+
hash: Types::Map.of(Symbol => Types::Any)
|
12
|
+
}
|
13
|
+
|
14
|
+
TEMPLATE_TYPES = {
|
15
|
+
list: Types::List,
|
16
|
+
map: Types::Map
|
10
17
|
}
|
11
18
|
|
12
19
|
def self.register(identifier, type_class)
|
@@ -18,13 +25,43 @@ module Yarrow
|
|
18
25
|
end
|
19
26
|
|
20
27
|
def resolve_type(identifier)
|
21
|
-
#
|
28
|
+
# Type is directly resolvable from the definition table
|
29
|
+
return DEFINED_TYPES[identifier] if DEFINED_TYPES.key?(identifier)
|
22
30
|
|
23
|
-
|
24
|
-
|
25
|
-
|
31
|
+
if identifier.is_a?(Hash)
|
32
|
+
# If type identifier is a compound template extract its key and value mapping
|
33
|
+
key_id = identifier.keys.first
|
34
|
+
value_id = identifier.values.first
|
26
35
|
|
27
|
-
|
36
|
+
# Check if the given key is defined as a template type
|
37
|
+
unless TEMPLATE_TYPES.key?(key_id)
|
38
|
+
raise "compound type #{key_id} is not defined"
|
39
|
+
end
|
40
|
+
|
41
|
+
# Get reference to the type class we want to resolve
|
42
|
+
template_type = TEMPLATE_TYPES[key_id]
|
43
|
+
|
44
|
+
# Resolve the type to an instance depending on structure of its template args
|
45
|
+
resolved_type = if value_id.is_a?(Hash)
|
46
|
+
# Map template with two argument constructor
|
47
|
+
template_type.new(
|
48
|
+
resolve_type(value_id.keys.first),
|
49
|
+
resolve_type(value_id.values.first)
|
50
|
+
)
|
51
|
+
else
|
52
|
+
# Use the single arg constructor with the given unit type
|
53
|
+
template_type.of(resolve_type(value_id).unit)
|
54
|
+
end
|
55
|
+
|
56
|
+
# Cache the resolved type for later reference
|
57
|
+
DEFINED_TYPES[identifier] = resolved_type
|
58
|
+
|
59
|
+
# Return the resolve type
|
60
|
+
resolved_type
|
61
|
+
else
|
62
|
+
# Not a compound template so we know it’s missing in the lookup table
|
63
|
+
raise "type #{identifier} is not defined"
|
64
|
+
end
|
28
65
|
end
|
29
66
|
end
|
30
67
|
end
|
data/lib/yarrow/schema/entity.rb
CHANGED
@@ -13,6 +13,19 @@ module Yarrow
|
|
13
13
|
def dictionary
|
14
14
|
@dictionary ||= Dictionary.new({})
|
15
15
|
end
|
16
|
+
|
17
|
+
def [](label)
|
18
|
+
@label = label
|
19
|
+
self
|
20
|
+
end
|
21
|
+
|
22
|
+
def inherited(class_name)
|
23
|
+
if @label
|
24
|
+
class_type = Yarrow::Schema::Types::Instance.of(class_name)
|
25
|
+
Yarrow::Schema::Definitions.register(@label, class_type)
|
26
|
+
@label = nil
|
27
|
+
end
|
28
|
+
end
|
16
29
|
end
|
17
30
|
|
18
31
|
def initialize(config)
|
data/lib/yarrow/version.rb
CHANGED
data/lib/yarrow/web/document.rb
CHANGED
@@ -4,10 +4,10 @@ module Yarrow
|
|
4
4
|
# This class is somewhat verbose for simplicity and long-term maintainability
|
5
5
|
# (having a clear and easy to follow construction, rather than doing anything
|
6
6
|
# too clever which has burned this lib in the past).
|
7
|
-
def initialize(item, parent,
|
7
|
+
def initialize(item, parent, is_index)
|
8
8
|
@item = item
|
9
9
|
@parent = parent
|
10
|
-
@
|
10
|
+
@is_index = is_index
|
11
11
|
end
|
12
12
|
|
13
13
|
def name
|
@@ -23,13 +23,18 @@ module Yarrow
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def url
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
26
|
+
if @parent.nil?
|
27
|
+
"/"
|
28
|
+
else
|
29
|
+
segments = [@item.props[:name]]
|
30
|
+
current = @parent
|
31
|
+
|
32
|
+
until current.in(:collection).first.nil? do
|
33
|
+
segments << current.props[:name]
|
34
|
+
current = current.in(:collection).first
|
32
35
|
end
|
36
|
+
|
37
|
+
"/" + segments.reverse.join("/")
|
33
38
|
end
|
34
39
|
end
|
35
40
|
end
|
data/lib/yarrow/web/manifest.rb
CHANGED
@@ -6,20 +6,29 @@ module Yarrow
|
|
6
6
|
|
7
7
|
graph.n(:collection).each do |collection|
|
8
8
|
# TODO: raise error if both content_only and index_only are set
|
9
|
-
|
10
|
-
# If the collection is tagged :content_only then skip top level listing/index
|
11
|
-
unless collection.props[:content_only]
|
12
|
-
manifest.add_document(collection_context(collection))
|
13
|
-
end
|
9
|
+
index = nil
|
14
10
|
|
15
11
|
# If the collection is tagged :index_only then skip adding individual documents
|
16
12
|
unless collection.props[:index_only]
|
17
13
|
collection.out(:item).each do |item|
|
18
14
|
#if item[:entity].status.to_sym == :published
|
19
|
-
|
15
|
+
if item.props[:name] == "index"
|
16
|
+
index = item
|
17
|
+
else
|
18
|
+
manifest.add_document(item_context(item))
|
19
|
+
end
|
20
20
|
#end
|
21
21
|
end
|
22
22
|
end
|
23
|
+
|
24
|
+
# If the collection is tagged :content_only then skip top level listing/index
|
25
|
+
unless collection.props[:content_only]
|
26
|
+
if index
|
27
|
+
manifest.add_document(collection_index_context(collection, index))
|
28
|
+
else
|
29
|
+
manifest.add_document(collection_context(collection))
|
30
|
+
end
|
31
|
+
end
|
23
32
|
end
|
24
33
|
|
25
34
|
manifest
|
@@ -32,28 +41,6 @@ module Yarrow
|
|
32
41
|
@assets = []
|
33
42
|
end
|
34
43
|
|
35
|
-
def self.collection_context(collection)
|
36
|
-
# Yarrow::Output::Context.new(
|
37
|
-
# parent: collection.in(:collection).first,
|
38
|
-
# name: collection.props[:name],
|
39
|
-
# #url: collection.props[:url],
|
40
|
-
# title: collection.props[:title],
|
41
|
-
# type: collection.props[:type]
|
42
|
-
# )
|
43
|
-
Document.new(collection, collection.in(:collection).first, :mirror_source)
|
44
|
-
end
|
45
|
-
|
46
|
-
def self.item_context(item)
|
47
|
-
# Yarrow::Output::Context.new(
|
48
|
-
# parent: item.in(:collection).first,
|
49
|
-
# name: item.props[:name],
|
50
|
-
# #url: item.props[:url],
|
51
|
-
# title: item.props[:title],
|
52
|
-
# type: item.props[:type]
|
53
|
-
# )
|
54
|
-
Document.new(item, item.in(:collection).first, :mirror_source)
|
55
|
-
end
|
56
|
-
|
57
44
|
def add_document(document)
|
58
45
|
@documents << document
|
59
46
|
end
|
@@ -61,6 +48,18 @@ module Yarrow
|
|
61
48
|
def add_asset(asset)
|
62
49
|
@assets << asset
|
63
50
|
end
|
51
|
+
|
52
|
+
def self.collection_context(collection)
|
53
|
+
Document.new(collection, collection.in(:collection).first, true)
|
54
|
+
end
|
55
|
+
|
56
|
+
def self.collection_index_context(collection, item)
|
57
|
+
Document.new(item, collection.in(:collection).first, false)
|
58
|
+
end
|
59
|
+
|
60
|
+
def self.item_context(item)
|
61
|
+
Document.new(item, item.in(:collection).first, false)
|
62
|
+
end
|
64
63
|
end
|
65
64
|
end
|
66
65
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: yarrow
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.8.
|
4
|
+
version: 0.8.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mark Rickerby
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-11-
|
11
|
+
date: 2022-11-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: addressable
|