yarrow 0.7.1 → 0.7.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: 95557525739422605b678c010cad87b67b3e01e1382a9a7b65b032cd7ccfdceb
4
- data.tar.gz: 90bd1dfc26fc41c8aee75586f760b05d0b122fe1868cb061b29a7344a0627165
3
+ metadata.gz: 395db81bd349ed8e1a6b5cdc67d0fd191f6ede369bd358483611e0b79fb27cec
4
+ data.tar.gz: '028961b86756cfc6bc1453c6d3ad7789149e8921066fb5429358e1b3b08393eb'
5
5
  SHA512:
6
- metadata.gz: cb128a24a28ad30bef33b1db635e952a3c4930d75094ce5434fe3cbeb890644fb1704a4d619144a915b0e71cc41c333d8ce3186fb2b8d5e3eee334bb68aa8b9d
7
- data.tar.gz: ee6767873b4afa6270b7a8e21dc096eac492624d47063e7d742d81cdc3e5b2608595f8ce945f299e036cb19245b980df56322a768d225731f16275088bd54dd3
6
+ metadata.gz: f531ff89949b7d1b80e215529f2c6c29d812f958e9af4491d58b7a0f10f9419a9ee26385ac58891cc435053fff31123d2dcfed0e02c8dcd48927d0b47c312f9f
7
+ data.tar.gz: 8a5bb918411a04ac7d5e8b3c649501346e94d3cc76c17097ec9eed436685b163a04294b40491b38f0ea8539a28722bc8e77043bdab81aec493e04d5ccc0b6e0e
@@ -10,7 +10,7 @@ jobs:
10
10
  fail-fast: false
11
11
  matrix:
12
12
  os: [ubuntu-latest, macos-latest]
13
- ruby: [2.7, '3.0', jruby-head]
13
+ ruby: [2.7, '3.0', 3.1, head]
14
14
  runs-on: ${{ matrix.os }}
15
15
  steps:
16
16
  - uses: actions/checkout@v2
data/lib/yarrow/config.rb CHANGED
@@ -42,16 +42,18 @@ module Yarrow
42
42
  :root_dir
43
43
  )
44
44
 
45
- # Top level root config namespace. Source, content and output are directory
46
- # paths and should be the only required defaults for a complete batch run.
45
+ # Top level root config namespace.
46
+ #
47
+ # `content_dir` and `output_dir` are placeholders and should be overriden
48
+ # with more fine-grained config for web and book outputs in future.
47
49
  #
48
50
  # Additional server config is optional and only needed if running the dev
49
51
  # server locally.
50
52
  #
51
53
  # TODO: meta should be union of Type::Optional and Config::Meta
52
54
  Instance = Yarrow::Schema::Value.new(
53
- source: Pathname,
54
- content: Pathname,
55
+ project_dir: Pathname,
56
+ content_dir: Pathname,
55
57
  output_dir: Pathname,
56
58
  meta: Yarrow::Schema::Type::Any,
57
59
  server: Yarrow::Schema::Type::Any
@@ -52,13 +52,13 @@ module Yarrow
52
52
  # automated as part of the schema types or a default value should be
53
53
  # generated here (eg: `"#{Dir.pwd}/docs"`)
54
54
  out_dir_or_string = config[:output_dir] || ""
55
- source_dir_or_string = config[:source] || ""
56
- content_dir_or_string = config[:content] || ""
55
+ source_dir_or_string = config[:project_dir] || ""
56
+ content_dir_or_string = config[:content_dir] || ""
57
57
 
58
58
  Yarrow::Config::Instance.new(
59
59
  output_dir: Pathname.new(File.expand_path(out_dir_or_string)),
60
- source: Pathname.new(File.expand_path(source_dir_or_string)),
61
- content: Pathname.new(File.expand_path(content_dir_or_string)),
60
+ project_dir: Pathname.new(File.expand_path(source_dir_or_string)),
61
+ content_dir: Pathname.new(File.expand_path(content_dir_or_string)),
62
62
  meta: meta_obj,
63
63
  server: server_obj
64
64
  )
@@ -1,5 +1,4 @@
1
1
  module Yarrow
2
-
3
2
  class ConsoleRunner
4
3
 
5
4
  SUCCESS = 0
@@ -100,7 +99,6 @@ module Yarrow
100
99
  end
101
100
 
102
101
  def normalize_theme_path
103
-
104
102
  # noop
105
103
  end
106
104
 
@@ -139,12 +137,11 @@ module Yarrow
139
137
  @options.has_key? option
140
138
  end
141
139
 
142
- def run_input_process
143
- # noop
144
- end
145
-
146
- def run_output_process
147
- # noop
140
+ def run_generation_process
141
+ generator = Generator.new(@config)
142
+ generator.process do |manifest|
143
+ p manifest
144
+ end
148
145
  end
149
146
 
150
147
  def print_header
@@ -3,19 +3,26 @@ module Yarrow
3
3
  class CollectionExpander
4
4
  include Yarrow::Tools::FrontMatter
5
5
 
6
- def initialize(content_types=nil)
7
- @content_types = content_types || [
8
- Yarrow::Content::ContentType.from_name(:pages)
6
+ # If a list of object types is not provided, a default `pages` type is
7
+ # created.
8
+ def initialize(object_types=nil)
9
+ @object_types = object_types || [
10
+ Yarrow::Content::ObjectType.from_name(:pages)
9
11
  ]
10
12
  end
11
13
 
12
14
  def expand(graph)
13
- @content_types.each do |content_type|
14
- expand_nested(graph, content_type)
15
+ @object_types.each do |object_type|
16
+ expand_nested(graph, object_type)
15
17
  end
16
18
  end
17
19
 
18
20
  def expand_nested(graph, content_type)
21
+ strategy = TreeExpansion.new(graph)
22
+ strategy.expand(content_type)
23
+ end
24
+
25
+ def expand_nested_legacy(graph, content_type)
19
26
  type = content_type.collection
20
27
  exts = content_type.extensions
21
28
 
@@ -87,40 +94,70 @@ module Yarrow
87
94
  end
88
95
  end
89
96
 
90
- subcollections.each do |path, index|
91
- # Group files matching the same slug under a common key
92
- objects = graph.n(path: path).out(:file).all.select do |file|
97
+ # If there are no subcollections then we need to look at the start node
98
+ # TODO: test to verify if this could be used in all cases, not just
99
+ # the situation where there are subfolders to be mapped.
100
+ if subcollections.empty?
101
+ # Collect files that match the content type extension and group them
102
+ # under a common key for each slug (this is so we can merge multiple
103
+ # files with the same name together into a single content type, a
104
+ # specific pattern found in some legacy content folders).
105
+ #
106
+ # Ideally, this code should be deleted once we have a clean workflow
107
+ # and can experiment with decoupling different strategies for
108
+ # expansion/enrichment of content objects.
109
+ objects = start_node.out(:file).all.select do |file|
93
110
  file.props[:name].end_with?(*exts)
94
111
  end.group_by do |file|
95
112
  file.props[:slug]
96
113
  end
97
114
 
115
+ # This is a massive hack to deal with situations where we don’t
116
+ # recurse down the list of directories. The best way to clean it up
117
+ # will be to document the different supported mapping formats and
118
+ # URL generation strategies and break these up into separate
119
+ # traversal objects for each particular style of content organisation.
120
+ if index.nil?
121
+ index = graph.create_node do |collection_node|
122
+ collection_node.label = :collection
123
+ collection_node.props[:type] = type
124
+ collection_node.props[:name] = type
125
+ collection_node.props[:slug] = type.to_s
126
+ collection_node.props[:title] = metadata[:title]
127
+
128
+ # Override default status so that mapped index collections always show
129
+ # up in the resulting document manifest, when they don’t have
130
+ # associated metadata. This is the opposite of how individual pieces
131
+ # of content behave (default to draft status if one isn’t supplied).
132
+ collection_node.props[:status] = if data[:status]
133
+ data[:status]
134
+ else
135
+ "published"
136
+ end
137
+
138
+ # TODO: URL generation might need to happen elsewhere
139
+ collection_node.props[:url] = if data[:url]
140
+ data[:url]
141
+ else
142
+ "/#{type}/"
143
+ end
144
+ end
145
+ end
146
+
98
147
  build_content_nodes(graph, objects, type, index)
99
148
  end
100
- end
101
149
 
102
- # Extract collection level configuration/metadata from the root node for
103
- # this content type.
104
- def extract_metadata(node, type)
105
- # TODO: support _index or _slug convention as well
106
- meta_file = node.out(slug: type.to_s).first
107
-
108
- if meta_file
109
- # Process metadata and add it to the collection node
110
- # TODO: pass in content converter object
111
- # TODO: index/body content by default if extracted from frontmatter
112
- body, data = process_content(meta_file.props[:entry])
113
- else
114
- # Otherwise, assume default collection behaviour
115
- data = {}
116
- end
150
+ # Go through each subcollection and expand content nodes step by step.
151
+ subcollections.each do |path, index|
152
+ # Group files matching the same slug under a common key
153
+ objects = graph.n(path: path).out(:file).all.select do |file|
154
+ file.props[:name].end_with?(*exts)
155
+ end.group_by do |file|
156
+ file.props[:slug]
157
+ end
117
158
 
118
- # Generate a default title if not provided in metadata
119
- unless data.key?(:title)
120
- data[:title] = type.to_s.capitalize
159
+ build_content_nodes(graph, objects, type, index)
121
160
  end
122
-
123
- data
124
161
  end
125
162
 
126
163
  def build_content_nodes(graph, objects, type, parent_index)
@@ -199,20 +236,6 @@ module Yarrow
199
236
  end
200
237
  end
201
238
  end
202
-
203
- # Workaround for handling meta and content source in multiple files or a single
204
- # file with front matter.
205
- def process_content(path)
206
- case path.extname
207
- when '.htm', '.md'
208
- read_split_content(path.to_s, symbolize_keys: true)
209
- # when '.md'
210
- # body, data = read_split_content(path.to_s, symbolize_keys: true)
211
- # [Kramdown::Document.new(body).to_html, data]
212
- when '.yml'
213
- [nil, YAML.load(File.read(path.to_s), symbolize_names: true)]
214
- end
215
- end
216
239
  end
217
240
  end
218
241
  end
@@ -0,0 +1,51 @@
1
+ module Yarrow
2
+ module Content
3
+ class Expansion
4
+ include Yarrow::Tools::FrontMatter
5
+
6
+ attr_reader :graph
7
+
8
+ def initialize(graph)
9
+ @graph = graph
10
+ end
11
+
12
+ # Extract collection level configuration/metadata from the root node for
13
+ # this content type.
14
+ def extract_metadata(node, type)
15
+ # TODO: support _index or _slug convention as well
16
+ meta_file = node.out(slug: type.to_s).first
17
+
18
+ if meta_file
19
+ # Process metadata and add it to the collection node
20
+ # TODO: pass in content converter object
21
+ # TODO: index/body content by default if extracted from frontmatter
22
+ body, data = process_content(meta_file.props[:entry])
23
+ else
24
+ # Otherwise, assume default collection behaviour
25
+ data = {}
26
+ end
27
+
28
+ # Generate a default title if not provided in metadata
29
+ unless data.key?(:title)
30
+ data[:title] = type.to_s.capitalize
31
+ end
32
+
33
+ data
34
+ end
35
+
36
+ # Workaround for handling meta and content source in multiple files or a single
37
+ # file with front matter.
38
+ def process_content(path)
39
+ case path.extname
40
+ when '.htm', '.md'
41
+ read_split_content(path.to_s, symbolize_keys: true)
42
+ # when '.md'
43
+ # body, data = read_split_content(path.to_s, symbolize_keys: true)
44
+ # [Kramdown::Document.new(body).to_html, data]
45
+ when '.yml'
46
+ [nil, YAML.load(File.read(path.to_s), symbolize_names: true)]
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -2,9 +2,12 @@ module Yarrow
2
2
  module Content
3
3
  # A directed graph of every element of content in the project.
4
4
  class Graph
5
- # Construct a graph collected from source content files.
5
+ # Construct a graph collected from files and directories in the configured
6
+ # content directory.
7
+ #
8
+ # @return [Yarrow::Content::Graph]
6
9
  def self.from_source(config)
7
- new(SourceCollector.collect(config.source), config)
10
+ new(SourceCollector.collect(config.content_dir), config)
8
11
  end
9
12
 
10
13
  attr_reader :graph, :config
@@ -28,6 +31,16 @@ module Yarrow
28
31
  def directories
29
32
  graph.nodes(:directory)
30
33
  end
34
+
35
+ # List of mapped content object collections
36
+ def collections
37
+ graph.nodes(:collection)
38
+ end
39
+
40
+ # List of mapped content object items
41
+ def items
42
+ graph.nodes(:item)
43
+ end
31
44
  end
32
45
  end
33
46
  end
@@ -0,0 +1,61 @@
1
+ module Yarrow
2
+ module Content
3
+ class Manifest
4
+ def self.build(graph)
5
+ manifest = new
6
+
7
+ graph.n(:collection).each do |collection|
8
+
9
+ unless collection.props[:content_only]
10
+ manifest.add_document(collection_context(collection))
11
+ end
12
+
13
+ unless collection.props[:index_only]
14
+ collection.out(:item).each do |item|
15
+ #if item[:entity].status.to_sym == :published
16
+ manifest.add_document(item_context(item))
17
+ #end
18
+ end
19
+ end
20
+ end
21
+
22
+ manifest
23
+ end
24
+
25
+ attr_reader :documents, :resources
26
+
27
+ def initialize
28
+ @documents = []
29
+ @resources = []
30
+ end
31
+
32
+ def self.collection_context(collection)
33
+ Yarrow::Output::Context.new(
34
+ parent: collection.in(:collection).first,
35
+ name: collection.props[:name],
36
+ #url: collection.props[:url],
37
+ title: collection.props[:title],
38
+ type: collection.props[:type]
39
+ )
40
+ end
41
+
42
+ def self.item_context(item)
43
+ Yarrow::Output::Context.new(
44
+ parent: item.in(:collection).first,
45
+ name: item.props[:name],
46
+ #url: item.props[:url],
47
+ title: item.props[:title],
48
+ type: item.props[:type]
49
+ )
50
+ end
51
+
52
+ def add_document(document)
53
+ @documents << document
54
+ end
55
+
56
+ def add_resource(resource)
57
+ @resources << resource
58
+ end
59
+ end
60
+ end
61
+ end
@@ -2,7 +2,7 @@ gem "strings-inflection"
2
2
 
3
3
  module Yarrow
4
4
  module Content
5
- class ContentType
5
+ class ObjectType
6
6
  Value = Yarrow::Schema::Value.new(:collection, :entity, :extensions)
7
7
 
8
8
  DEFAULT_EXTENSIONS = [".md", ".yml", ".htm"]
@@ -9,38 +9,61 @@ module Yarrow
9
9
  root.label = :root
10
10
  end
11
11
 
12
+ root_dir_entry = Pathname.new(input_dir)
13
+
14
+ root_dir = create_node do |dir|
15
+ dir.label = :directory
16
+ dir.props = {
17
+ name: root_dir_entry.basename.to_s,
18
+ path: root_dir_entry.to_s,
19
+ entry: root_dir_entry
20
+ }
21
+ end
22
+
23
+ create_edge do |child|
24
+ child.label = :child
25
+ child.from = root.id
26
+ child.to = root_dir.id
27
+ end
28
+
12
29
  directories = {
13
- Pathname.new(input_dir).to_s => root.id
30
+ root_dir_entry.to_s => root_dir.id
14
31
  }
15
32
 
16
33
  Pathname.glob("#{input_dir}/**/**").each do |entry|
17
34
  if entry.directory?
18
- #puts "Reading directory: #{entry}"
19
-
20
35
  content_node = create_node do |dir|
21
36
  dir.label = :directory
22
- dir.props[:name] = entry.basename.to_s
23
- dir.props[:slug] = entry.basename.to_s
24
- dir.props[:path] = entry.to_s
25
- dir.props[:entry] = entry
37
+ # dir.props[:name] = entry.basename.to_s
38
+ # dir.props[:slug] = entry.basename.to_s
39
+ # dir.props[:path] = entry.to_s
40
+ # dir.props[:entry] = entry
41
+ dir.props = {
42
+ name: entry.basename.to_s,
43
+ path: entry.to_s,
44
+ entry: entry
45
+ }
26
46
  end
27
47
 
28
48
  directories[entry.to_s] = content_node.id
29
49
  else
30
- #puts "Reading file: #{entry} (#{entry.basename.sub_ext('')})"
31
-
32
50
  content_node = create_node do |file|
33
51
  file.label = :file
34
- file.props[:name] = entry.basename.to_s
35
- file.props[:slug] = entry.basename.sub_ext('').to_s
36
- file.props[:path] = entry.to_s
37
- file.props[:entry] = entry
52
+ # file.props[:name] = entry.basename.to_s
53
+ # file.props[:slug] = entry.basename.sub_ext('').to_s
54
+ # file.props[:path] = entry.to_s
55
+ # file.props[:entry] = entry
56
+
57
+ file.props = {
58
+ name: entry.basename.to_s,
59
+ ext: entry.extname.to_s,
60
+ path: entry.to_s,
61
+ entry: entry
62
+ }
38
63
  end
39
64
  end
40
65
 
41
66
  if directories.key?(entry.dirname.to_s)
42
- #puts "Create parent edge: #{directories[entry.dirname.to_s]}"
43
-
44
67
  create_edge do |edge|
45
68
  edge.label = :child
46
69
  edge.from = directories[entry.dirname.to_s]
@@ -0,0 +1,83 @@
1
+ module Yarrow
2
+ module Content
3
+ class TreeExpansion < Expansion
4
+ def expand(content_type)
5
+ type = content_type.collection
6
+ exts = content_type.extensions
7
+
8
+ # If match path represents entire content dir, then include the entire
9
+ # content dir instead of scanning from a subfolder matching the name of
10
+ # the collection.
11
+ start_node = if content_type.match_path == "."
12
+ graph.n(:root)
13
+ else
14
+ graph.n(:root).out(name: type.to_s)
15
+ end
16
+
17
+ # Extract metadata from given start node
18
+ collection_metadata = extract_metadata(start_node, type)
19
+
20
+ # Collect all nested collections in the subgraph for this content type
21
+ subcollections = {}
22
+ item_links = []
23
+ index = nil
24
+
25
+ # Scan and collect all nested files from the root
26
+ start_node.depth_first.each do |node|
27
+ if node.label == :directory
28
+ # Create a collection node representing a collection of documents
29
+ index = graph.create_node do |collection_node|
30
+ collection_node.label = :collection
31
+ collection_node.props[:type] = type
32
+ collection_node.props[:name] = node.props[:name]
33
+
34
+ # TODO: title needs to be defined from metadata
35
+ collection_node.props[:title] = node.props[:name].capitalize
36
+ end
37
+
38
+ # Add this collection id to the lookup table for edge construction
39
+ subcollections[node.props[:path]] = index
40
+
41
+ # Join the collection to its parent
42
+ unless node.props[:slug] == type.to_s || !subcollections.key?(node.props[:entry].parent.to_s)
43
+ graph.create_edge do |edge|
44
+ edge.label = :child
45
+ edge.from = subcollections[node.props[:entry].parent.to_s].id
46
+ edge.to = index.id
47
+ end
48
+ end
49
+ elsif node.label == :file
50
+ body, meta = process_content(node.props[:entry])
51
+
52
+ # Create an item node representing a file mapped to a unique content object
53
+ item = graph.create_node do |item_node|
54
+ item_node.label = :item
55
+ item_node.props[:type] = content_type.entity
56
+ item_node.props[:name] = node.props[:entry].basename(node.props[:entry].extname).to_s
57
+ item_node.props[:body] = body if body
58
+ item_node.props[:title] = meta[:title] if meta
59
+ # TODO: better handling of metadata on node props
60
+ end
61
+
62
+ # We may not have an expanded node for the parent collection if this is a
63
+ # preorder traversal so save it for later
64
+ item_links << {
65
+ parent_path: node.props[:entry].parent.to_s,
66
+ item_id: item.id
67
+ }
68
+ end
69
+ end
70
+
71
+ # Once all files and directories have been expanded, connect all the child
72
+ # edges between collections and items
73
+ item_links.each do |item_link|
74
+ graph.create_edge do |edge|
75
+ edge.label = :child
76
+ edge.from = subcollections[item_link[:parent_path]].id
77
+ edge.to = item_link[:item_id]
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end
@@ -1,27 +1,57 @@
1
1
  module Yarrow
2
+ class ScanSource < Process::StepProcessor
3
+ accepts Config::Instance
4
+ provides Content::Graph
5
+
6
+ def step(config)
7
+ Yarrow::Content::Graph.from_source(config)
8
+ end
9
+ end
10
+
11
+ class ExpandCollections < Process::StepProcessor
12
+ accepts Content::Graph
13
+ provides Content::Graph
14
+
15
+ def step(content)
16
+ expander = Content::CollectionExpander.new
17
+ expander.expand(content.graph)
18
+ content
19
+ end
20
+ end
21
+
22
+ class FlattenManifest < Process::StepProcessor
23
+ accepts Content::Graph
24
+ provides Content::Manifest
25
+
26
+ def step(content)
27
+ Content::Manifest.build(content.graph)
28
+ end
29
+ end
30
+
31
+ class BuildOutput < Process::StepProcessor
32
+ accepts Content::Manifest
33
+ provides Output::Result
34
+ end
2
35
 
3
36
  # Generates documentation from a model.
4
- #
5
- # Subclasses of Generator need to override the template methods,
6
- # to specify a particular file structure to output.
7
37
  class Generator
8
-
9
- def initialize(target, site_tree)
10
- ensure_dir_exists! target
11
- @target = target
12
- @site_tree = site_tree
38
+ def initialize(config)
39
+ @config = config
40
+ @workflow = Process::Workflow.new(config)
13
41
  end
14
-
15
- def ensure_dir_exists!(target)
16
- unless File.directory? target
17
- Dir.mkdir target
42
+
43
+ def process(&block)
44
+ workflow.connect(ScanSource.new)
45
+ workflow.connect(ExpandCollections.new)
46
+ workflow.connect(FlattenManifest.new)
47
+
48
+ workflow.process do |result|
49
+ block.call(result)
18
50
  end
19
51
  end
20
-
21
- def build_docs
22
-
23
- end
24
-
25
- end
26
52
 
27
- end
53
+ private
54
+
55
+ attr_reader :config, :workflow
56
+ end
57
+ end
@@ -0,0 +1,13 @@
1
+ module Yarrow
2
+ module Output
3
+ class Log
4
+
5
+ end
6
+
7
+ class Result
8
+ def initialize
9
+
10
+ end
11
+ end
12
+ end
13
+ end
@@ -27,12 +27,18 @@ module Yarrow
27
27
 
28
28
  target_path = Pathname.new("#{docroot}#{path}")
29
29
 
30
- FileUtils.mkdir_p(target_path.dirname)
30
+ ensure_dir_exists!(target_path.dirname)
31
31
 
32
32
  File.open(target_path.to_s, WRITE_MODE) do |file|
33
33
  file.puts(content)
34
34
  end
35
35
  end
36
+
37
+ def ensure_dir_exists!(target)
38
+ unless File.directory?(target)
39
+ FileUtils.mkdir_p(target)
40
+ end
41
+ end
36
42
  end
37
43
  end
38
44
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
  module Yarrow
3
3
  APP_NAME = 'Yarrow'
4
- VERSION = '0.7.1'
4
+ VERSION = '0.7.2'
5
5
  end
data/lib/yarrow.rb CHANGED
@@ -9,17 +9,19 @@ require 'yarrow/schema'
9
9
  require 'yarrow/config'
10
10
  require 'yarrow/configuration'
11
11
  require 'yarrow/console_runner'
12
- require 'yarrow/generator'
13
12
  require 'yarrow/tools/front_matter'
14
13
  require 'yarrow/tools/content_utils'
15
14
  require 'yarrow/content/graph'
16
- require 'yarrow/content/content_type'
17
- require 'yarrow/content/source'
15
+ require 'yarrow/content/object_type'
18
16
  require 'yarrow/content/source_collector'
19
17
  require 'yarrow/content/collection_expander'
18
+ require 'yarrow/content/expansion'
19
+ require 'yarrow/content/tree_expansion'
20
+ require 'yarrow/content/manifest'
20
21
  require 'yarrow/output/mapper'
21
22
  require 'yarrow/output/generator'
22
23
  require 'yarrow/output/context'
24
+ require 'yarrow/output/result'
23
25
  require 'yarrow/output/web/indexed_file'
24
26
  require 'yarrow/content_map'
25
27
  require 'yarrow/server'
@@ -31,6 +33,8 @@ require 'yarrow/process/expand_content'
31
33
  require 'yarrow/process/extract_source'
32
34
  require 'yarrow/process/project_manifest'
33
35
 
36
+ require 'yarrow/generator'
37
+
34
38
  # Dir[File.dirname(__FILE__) + '/yarrow/generators/*.rb'].each do |generator|
35
39
  # require generator
36
40
  # end
data/yarrow.gemspec CHANGED
@@ -20,9 +20,9 @@ Gem::Specification.new do |spec|
20
20
  spec.add_runtime_dependency 'em-websocket', '~> 0.5.1'
21
21
  spec.add_runtime_dependency 'strings-inflection', '~> 0.1'
22
22
  spec.add_runtime_dependency 'strings-case', '~> 0.3'
23
- spec.add_development_dependency 'bundler', '~> 2.2.9'
23
+ spec.add_development_dependency 'bundler'
24
24
  spec.add_development_dependency 'rake', '~> 13.0'
25
- spec.add_development_dependency 'rspec', '~> 3.10'
25
+ spec.add_development_dependency 'rspec', '~> 3.11'
26
26
  spec.add_development_dependency 'coveralls', '~> 0.8.23'
27
27
  spec.add_development_dependency 'rack-test', '~> 0.8'
28
28
  spec.homepage = 'http://rubygemspec.org/gems/yarrow'
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.7.1
4
+ version: 0.7.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mark Rickerby
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-05-31 00:00:00.000000000 Z
11
+ date: 2022-08-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mementus
@@ -112,16 +112,16 @@ dependencies:
112
112
  name: bundler
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
- - - "~>"
115
+ - - ">="
116
116
  - !ruby/object:Gem::Version
117
- version: 2.2.9
117
+ version: '0'
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
- - - "~>"
122
+ - - ">="
123
123
  - !ruby/object:Gem::Version
124
- version: 2.2.9
124
+ version: '0'
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: rake
127
127
  requirement: !ruby/object:Gem::Requirement
@@ -142,14 +142,14 @@ dependencies:
142
142
  requirements:
143
143
  - - "~>"
144
144
  - !ruby/object:Gem::Version
145
- version: '3.10'
145
+ version: '3.11'
146
146
  type: :development
147
147
  prerelease: false
148
148
  version_requirements: !ruby/object:Gem::Requirement
149
149
  requirements:
150
150
  - - "~>"
151
151
  - !ruby/object:Gem::Version
152
- version: '3.10'
152
+ version: '3.11'
153
153
  - !ruby/object:Gem::Dependency
154
154
  name: coveralls
155
155
  requirement: !ruby/object:Gem::Requirement
@@ -204,10 +204,13 @@ files:
204
204
  - lib/yarrow/configuration.rb
205
205
  - lib/yarrow/console_runner.rb
206
206
  - lib/yarrow/content/collection_expander.rb
207
- - lib/yarrow/content/content_type.rb
207
+ - lib/yarrow/content/expansion.rb
208
208
  - lib/yarrow/content/graph.rb
209
+ - lib/yarrow/content/manifest.rb
210
+ - lib/yarrow/content/object_type.rb
209
211
  - lib/yarrow/content/source.rb
210
212
  - lib/yarrow/content/source_collector.rb
213
+ - lib/yarrow/content/tree_expansion.rb
211
214
  - lib/yarrow/content_map.rb
212
215
  - lib/yarrow/defaults.yml
213
216
  - lib/yarrow/extensions.rb
@@ -217,6 +220,7 @@ files:
217
220
  - lib/yarrow/output/context.rb
218
221
  - lib/yarrow/output/generator.rb
219
222
  - lib/yarrow/output/mapper.rb
223
+ - lib/yarrow/output/result.rb
220
224
  - lib/yarrow/output/web/indexed_file.rb
221
225
  - lib/yarrow/process/expand_content.rb
222
226
  - lib/yarrow/process/extract_source.rb