yarrow 0.7.6 → 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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0dba4f651517ceb22a806d2ac97637327983742ce4d6837ec0cc85cb4b9864c3
4
- data.tar.gz: d7b2db29b33539da364b386023a662db2e4f5bcc009869444de005ae74f919fb
3
+ metadata.gz: d26941f2b464c551d825b73999b0365637b9e4feec159ee74de51a1abca3416e
4
+ data.tar.gz: 34081172c945cf83e97ab3ee03484436ba380de6c809c2dd87caaa50f1bba315
5
5
  SHA512:
6
- metadata.gz: 0b6b0550245ef7ac0f752c602bcc1a191a8260cf8e4a3553b77f1a600d82ebf773e97adcaffa2bc1ed1d913af9a32d5d183472fdabcabd9ba3e61a52cc9155eb
7
- data.tar.gz: '099eeb8f8f90867144ad3ca2586d353b1b69e38af9534923c0856410b944592e48847b49650d0526af724f74851ad8f93205fc2032b864eb1a854c0d3f59475a'
6
+ metadata.gz: 6300e2c0f83c741862cf6c49acc42118636a3832401706057b483d942c07a947ea1124b2c10e056cc5052e25a28a59f896216d0156911026639d16e0faa5ba73
7
+ data.tar.gz: 0b897183df8712cbc08d0a479ed1e1d129a90305ad76f9bc802ea262707026ff5ffa57890d0d26d49955f55721ffd0887510671c86430e4780564266758ebaed
data/.gitignore CHANGED
@@ -7,3 +7,6 @@ yarrow-*.gem
7
7
  coverage
8
8
  bin/scripts
9
9
  .DS_Store
10
+ /www
11
+ /web
12
+ /docs
File without changes
data/lib/yarrow/config.rb CHANGED
@@ -37,17 +37,23 @@ module Yarrow
37
37
  :port,
38
38
  :host,
39
39
  :handler,
40
- #:docroot,
41
- :middleware,
42
- #:root_dir
40
+ :middleware
43
41
  )
44
42
 
45
- # Content policy
46
- # Model = Yarrow::Schema::Value.new(
47
-
48
- # )
43
+ class Output < Yarrow::Schema::Entity[:output]
44
+ attribute :generator, :string
45
+ attribute :template_dir, :path
46
+ #attribute :scripts, :array
47
+ end
49
48
 
50
49
  # Top level root config namespace.
50
+ class Instance < Yarrow::Schema::Entity
51
+ attribute :source_dir, :path
52
+ attribute :output_dir, :path
53
+ attribute :meta, :any
54
+ attribute :server, :any
55
+ #attribute :output, :output
56
+ end
51
57
  #
52
58
  # `content_dir` and `output_dir` are placeholders and should be overriden
53
59
  # with more fine-grained config for web and book outputs in future.
@@ -56,12 +62,12 @@ module Yarrow
56
62
  # server locally.
57
63
  #
58
64
  # TODO: meta should be union of Type::Optional and Config::Meta
59
- Instance = Yarrow::Schema::Value.new(
60
- project_dir: :path,
61
- content_dir: :path,
62
- output_dir: :path,
63
- meta: :any,
64
- server: :any
65
- )
65
+ # Instance = Yarrow::Schema::Value.new(
66
+ # project_dir: :path,
67
+ # content_dir: :path,
68
+ # output_dir: :path,
69
+ # meta: :any,
70
+ # server: :any
71
+ # )
66
72
  end
67
73
  end
@@ -52,13 +52,11 @@ 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[:project_dir] || ""
56
- content_dir_or_string = config[:content_dir] || ""
55
+ source_dir_or_string = config[:source_dir] || ""
57
56
 
58
57
  Yarrow::Config::Instance.new(
59
58
  output_dir: Pathname.new(File.expand_path(out_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)),
59
+ source_dir: Pathname.new(File.expand_path(source_dir_or_string)),
62
60
  meta: meta_obj,
63
61
  server: server_obj
64
62
  )
@@ -1,6 +1,5 @@
1
1
  module Yarrow
2
2
  class ConsoleRunner
3
-
4
3
  SUCCESS = 0
5
4
  FAILURE = 1
6
5
 
@@ -12,20 +11,20 @@ module Yarrow
12
11
  }
13
12
 
14
13
  ALLOWED_CONFIG_FILES = [
15
- '.yarrowdoc',
16
- 'Yarrowdoc'
14
+ ".yarrowdoc",
15
+ "Yarrowdoc",
16
+ "yarrow.yml"
17
17
  ]
18
18
 
19
- def initialize(arguments, io=STDOUT)
19
+ def initialize(args, io=STDOUT)
20
+ @arguments = args
20
21
  @out = io
21
- @arguments = arguments
22
22
  @options = {}
23
23
  @targets = []
24
- @config = Configuration.load_defaults
25
24
  end
26
25
 
27
26
  def config
28
- @config
27
+ @config ||= Configuration.load_defaults
29
28
  end
30
29
 
31
30
  def run_application
@@ -45,9 +44,7 @@ module Yarrow
45
44
 
46
45
  process_configuration
47
46
 
48
- run_input_process
49
-
50
- run_output_process
47
+ run_generation_process
51
48
 
52
49
  print_footer
53
50
 
@@ -80,17 +77,29 @@ module Yarrow
80
77
 
81
78
  def process_configuration
82
79
  # load_configuration(Dir.pwd)
80
+ default_config = Yarrow::Configuration.load_defaults
81
+
82
+ if @targets.empty?
83
+ @config = default_config
84
+ else
85
+ @config = Yarrow::Config::Instance.new(
86
+ output_dir: default_config.output_dir,
87
+ source_dir: @targets.first,
88
+ meta: default_config.meta,
89
+ server: default_config.meta
90
+ )
91
+ end
83
92
 
84
93
  # @targets.each do |input_path|
85
94
  # @config.deep_merge! load_configuration(input_path)
86
95
  # end
87
96
 
88
- if has_option?(:config)
89
- path = @options[:config]
90
- @config.deep_merge! Configuration.load(path)
91
- end
97
+ # if has_option?(:config)
98
+ # path = @options[:config]
99
+ # @config.deep_merge! Configuration.load(path)
100
+ # end
92
101
 
93
- @config.options = @options.to_hash
102
+ #@config.options = @options.to_hash
94
103
 
95
104
  # normalize_theme_path
96
105
 
@@ -139,9 +148,7 @@ module Yarrow
139
148
 
140
149
  def run_generation_process
141
150
  generator = Generator.new(@config)
142
- generator.process do |manifest|
143
- p manifest
144
- end
151
+ generator.generate
145
152
  end
146
153
 
147
154
  def print_header
@@ -149,7 +156,7 @@ module Yarrow
149
156
  end
150
157
 
151
158
  def print_footer
152
- @out.puts "Content generated at {path}!"
159
+ @out.puts "Content generated at #{@config.output_dir}"
153
160
  end
154
161
 
155
162
  def print_error(e)
@@ -157,42 +164,8 @@ module Yarrow
157
164
  end
158
165
 
159
166
  def print_help
160
- help = <<HELP
161
- See http://yarrow.maetl.net for more information.
162
-
163
- Usage:
164
-
165
- $ yarrow [options]
166
- $ yarrow [options] <input>
167
- $ yarrow [options] <input input> <output>
168
-
169
- Arguments
170
-
171
- <input> - Path to source directory or an individual source file. If not supplied
172
- defaults to the current working directory. Multiple directories
173
- can be specified by repeating arguments, separated by whitespace.
174
-
175
- <output> - Path to the generated documentation. If not supplied, defaults to
176
- ./docs in the current working directory. If it does not exist, it
177
- is created. If it does exist it remains in place, but existing
178
- files are overwritten by new files with the same name.
179
-
180
- Options
181
-
182
- Use -o or --option for boolean switches and --option=value or --option:value
183
- for options that require an explicit value to be set.
184
-
185
- -h --help [switch] Display this help message and exit
186
- -v --version [switch] Display version header and exit
187
- -c --config [string] Path to a config properties file
188
- -p --packages [string] Defines package convention for the model
189
- -t --theme [string] Template theme for generated docs
190
-
191
-
192
- HELP
193
- @out.puts help
167
+ help_path = Pathname.new(__dir__) + "help.txt"
168
+ @out.puts(help_path.read)
194
169
  end
195
-
196
170
  end
197
-
198
171
  end
@@ -7,7 +7,7 @@ module Yarrow
7
7
  #
8
8
  # @return [Yarrow::Content::Graph]
9
9
  def self.from_source(config)
10
- new(Source.collect(config.content_dir), config)
10
+ new(Source.collect(config.source_dir), config)
11
11
  end
12
12
 
13
13
  attr_reader :graph, :config
@@ -8,6 +8,8 @@ module Yarrow
8
8
  :match_path
9
9
  )
10
10
 
11
+ DEFAULT_HOME_NESTING = false
12
+
11
13
  DEFAULT_EXTENSIONS = [".md", ".yml", ".htm"]
12
14
 
13
15
  DEFAULT_MATCH_PATH = "."
@@ -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
- graph.n(:root)
16
+ # TODO: match against source_dir
17
+ graph.n(:root).out(:directory)
22
18
  else
23
- graph.n(:root).out(name: type.to_s)
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, type)
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] = 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
@@ -1,15 +1,13 @@
1
1
  # Default configuration settings for Yarrow.
2
2
  # This is loaded when the configuration is initialized.
3
- input_dir: content
4
- output_dir: .
3
+ source_dir: content
4
+ output_dir: docs
5
5
  meta:
6
6
  title: Default Project
7
7
  author: Default Name
8
8
  output:
9
- target_dir: public
9
+ generator: web
10
10
  template_dir: templates
11
- object_map:
12
- page: Yarrow::Model::Site.pages
13
11
  assets:
14
12
  input_dir: assets
15
13
  output_dir: public/assets
@@ -21,17 +21,17 @@ module Yarrow
21
21
 
22
22
  class FlattenManifest < Process::StepProcessor
23
23
  accepts Content::Graph
24
- provides Content::Manifest
24
+ provides Web::Manifest
25
25
 
26
26
  def step(content)
27
- Content::Manifest.build(content.graph)
27
+ Web::Manifest.build(content.graph)
28
28
  end
29
29
  end
30
30
 
31
- class BuildOutput < Process::StepProcessor
32
- accepts Content::Manifest
33
- provides Output::Result
34
- end
31
+ # class BuildOutput < Process::StepProcessor
32
+ # accepts Output::Manifest
33
+ # provides Output::Result
34
+ # end
35
35
 
36
36
  # Generates documentation from a model.
37
37
  class Generator
@@ -50,8 +50,20 @@ module Yarrow
50
50
  end
51
51
  end
52
52
 
53
+ def generate
54
+ process do |manifest|
55
+ generators.each do |generator|
56
+ generator.generate(manifest)
57
+ end
58
+ end
59
+ end
60
+
53
61
  private
54
62
 
55
63
  attr_reader :config, :workflow
64
+
65
+ def generators
66
+ [Web::Generator.new(config)]
67
+ end
56
68
  end
57
69
  end
@@ -0,0 +1,35 @@
1
+ See https://github.com/maetl/yarrow for more information.
2
+
3
+ Usage: yarrow [options] <source_dir...> <output_dir>
4
+
5
+ yarrow [options]
6
+ yarrow [options] <source_dir>
7
+ yarrow [options] <source_dir> <output_dir>
8
+ yarrow [options] <source_dir source_dir> <output_dir>
9
+
10
+ Arguments
11
+
12
+ <source_dir> - Path to source directory or an individual source file. If not
13
+ supplied defaults to the current working directory. Multiple
14
+ directories can be specified by repeating arguments, separated
15
+ by whitespace.
16
+
17
+ <output_dir> - Path to the generated documentation. If not supplied, defaults
18
+ to `./docs` in the current working directory. If it does not
19
+ exist, it is created. If it does exist it remains in place, but
20
+ existing files are overwritten by new files with the same name.
21
+
22
+ Options
23
+
24
+ Use -o or --option for boolean switches and --option=value or --option:value
25
+ for options that require an explicit value to be set.
26
+
27
+ -h --help [switch] Display this help message and exit
28
+ -v --version [switch] Display version header and exit
29
+ -c --config [string] Path to a config properties file
30
+ -p --packages [string] Defines package convention for the model
31
+ -t --theme [string] Template theme for generated docs
32
+
33
+ Not all these options currently work as they date back to when this library
34
+ was used for generating documentation for PHP codebases, before it was
35
+ generalised into a static site generator.
@@ -2,12 +2,18 @@ module Yarrow
2
2
  module Schema
3
3
  module Definitions
4
4
  DEFINED_TYPES = {
5
- #string: Types::String,
6
5
  string: Types::Instance.of(String),
7
- #integer: Types::Integer,
8
6
  integer: Types::Instance.of(Integer),
9
- path: Types::Instance.of(Pathname),
10
- any: Types::Any.new
7
+ symbol: Types::Instance.of(Symbol).accept(String, :to_sym),
8
+ path: Types::Instance.of(Pathname).accept(String),
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
11
17
  }
12
18
 
13
19
  def self.register(identifier, type_class)
@@ -19,13 +25,43 @@ module Yarrow
19
25
  end
20
26
 
21
27
  def resolve_type(identifier)
22
- #return identifier unless identifier.is_a?(Symbol)
28
+ # Type is directly resolvable from the definition table
29
+ return DEFINED_TYPES[identifier] if DEFINED_TYPES.key?(identifier)
23
30
 
24
- unless DEFINED_TYPES.key?(identifier)
25
- raise "#{identifier} is not defined"
26
- end
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
27
35
 
28
- return DEFINED_TYPES[identifier]
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
29
65
  end
30
66
  end
31
67
  end
@@ -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)
@@ -33,11 +46,26 @@ module Yarrow
33
46
 
34
47
  def to_h
35
48
  dictionary.attr_names.reduce({}) do |attr_dict, name|
36
- attr_dict[name] = instance_variable_get("@#{name}")
49
+ value = instance_variable_get("@#{name}")
50
+
51
+ attr_dict[name] = if value.respond_to?(:to_h)
52
+ value.to_h
53
+ else
54
+ value
55
+ end
56
+
37
57
  attr_dict
38
58
  end
39
59
  end
40
60
 
61
+ def merge(other)
62
+ unless other.is_a?(self.class)
63
+ raise ArgumentError.new("cannot merge entities that are not the same type")
64
+ end
65
+
66
+ self.class.new(to_h.merge(other.to_h))
67
+ end
68
+
41
69
  private
42
70
 
43
71
  def dictionary
@@ -0,0 +1,14 @@
1
+ module Yarrow
2
+ module Schema
3
+ class Registry
4
+ def type(identifier, type_class)
5
+ Definitions.register(identifier, type_class)
6
+ end
7
+ end
8
+
9
+ def self.define(&block)
10
+ instance = Registry.new
11
+ instance.instance_eval(&block)
12
+ end
13
+ end
14
+ end
@@ -18,20 +18,20 @@ module Yarrow
18
18
  new("#{t} does not implement #{m}")
19
19
  end
20
20
  end
21
-
21
+
22
22
  class TypeClass
23
23
  def self.of(unit_type)
24
24
  new(unit_type)
25
25
  end
26
26
 
27
27
  attr_reader :unit, :accepts
28
-
28
+
29
29
  def initialize(unit_type=nil)
30
30
  @unit = unit_type
31
31
  @accepts = {}
32
32
  end
33
33
 
34
- def accept(type, constructor)
34
+ def accept(type, constructor=:new)
35
35
  accepts[type] = constructor
36
36
  self
37
37
  end
@@ -44,7 +44,7 @@ module Yarrow
44
44
  constructor = accepts[input.class]
45
45
  unit.send(constructor, input)
46
46
  end
47
-
47
+
48
48
  def check_instance_of!(input)
49
49
  unless input.instance_of?(unit)
50
50
  raise CastError.instance_of(input.class, unit)
@@ -74,27 +74,27 @@ module Yarrow
74
74
  check(input)
75
75
  end
76
76
  end
77
-
77
+
78
78
  class Any < TypeClass
79
79
  def cast(input)
80
80
  input
81
81
  end
82
82
  end
83
-
83
+
84
84
  class Instance < TypeClass
85
85
  def check(input)
86
86
  check_instance_of!(input)
87
87
  input
88
88
  end
89
89
  end
90
-
90
+
91
91
  class Kind < TypeClass
92
92
  def check(input)
93
93
  check_kind_of!(input)
94
94
  input
95
95
  end
96
96
  end
97
-
97
+
98
98
  class Interface < TypeClass
99
99
  def self.any(*args)
100
100
  interface_type = new(args)
@@ -117,7 +117,7 @@ module Yarrow
117
117
  when :any then check_respond_to_any!(input, members)
118
118
  when :all then check_respond_to_all!(input, members)
119
119
  end
120
-
120
+
121
121
  input
122
122
  end
123
123
  end
@@ -192,4 +192,4 @@ module Yarrow
192
192
  end
193
193
  end
194
194
  end
195
- end
195
+ end
@@ -50,6 +50,32 @@ module Yarrow
50
50
  freeze
51
51
  end
52
52
 
53
+ struct.define_method(:merge) do |other|
54
+ unless other.is_a?(self.class)
55
+ raise ArgumentError.new("cannot merge incompatible values")
56
+ end
57
+
58
+ kwargs = validator.attr_names.reduce({}) do |data, attr_name|
59
+ current_val = self.send(attr_name)
60
+ other_val = other.send(attr_name)
61
+
62
+ # TODO: handle optional types better
63
+ # call out to dictionary?
64
+ # validator.merge(attr_name, current_val, other_val)
65
+ data[attr_name] = if current_val.nil?
66
+ other_val
67
+ elsif other_val.nil?
68
+ current_val
69
+ else
70
+ other_val
71
+ end
72
+
73
+ data
74
+ end
75
+
76
+ struct.new(**kwargs)
77
+ end
78
+
53
79
  struct
54
80
  end
55
81
  end
data/lib/yarrow/server.rb CHANGED
@@ -96,7 +96,7 @@ module Yarrow
96
96
 
97
97
  app_args = [docroot, {}].tap { |args| args.push(default_type) if default_type }
98
98
 
99
- static_app = Rack::File.new(*app_args)
99
+ static_app = Rack::Files.new(*app_args)
100
100
 
101
101
  if live_reload?
102
102
  require 'rack-livereload'
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
  module Yarrow
3
- APP_NAME = 'Yarrow'
4
- VERSION = '0.7.6'
3
+ APP_NAME = "Yarrow"
4
+ VERSION = "0.8.1"
5
5
  end
@@ -0,0 +1,42 @@
1
+ module Yarrow
2
+ module Web
3
+ class Document
4
+ # This class is somewhat verbose for simplicity and long-term maintainability
5
+ # (having a clear and easy to follow construction, rather than doing anything
6
+ # too clever which has burned this lib in the past).
7
+ def initialize(item, parent, is_index)
8
+ @item = item
9
+ @parent = parent
10
+ @is_index = is_index
11
+ end
12
+
13
+ def name
14
+ @item.props[:name]
15
+ end
16
+
17
+ def title
18
+ @item.props[:title]
19
+ end
20
+
21
+ def type
22
+ @item.props[:type]
23
+ end
24
+
25
+ def url
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
35
+ end
36
+
37
+ "/" + segments.reverse.join("/")
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,57 @@
1
+ module Yarrow
2
+ module Web
3
+ class Generator
4
+ attr_reader :config
5
+
6
+ def initialize(config)
7
+ @config = config
8
+ # Config is here but we haven’t decided on schema for web publishing fields
9
+ # so hard-code the needed values as part of this prototype
10
+ @default_host = "http://example.com"
11
+ end
12
+
13
+ def generate(manifest)
14
+ Parallel.each(manifest.documents) do |document|
15
+ write_document(document)
16
+ end
17
+ #generate_sitemap(manifest)
18
+ end
19
+
20
+ def write_document(document)
21
+ template = Template.for_document(document)
22
+ write_output_file(document.url, template.render(document))
23
+ end
24
+
25
+ def write_output_file(url, content)
26
+ # If the target path is a directory,
27
+ # generate a default index filename.
28
+ if url[url.length-1] == '/'
29
+ url = "#{url}index"
30
+ end
31
+
32
+ # Construct full path to file in output dir
33
+ path = @config.output_dir.join(url.delete_prefix("/")).sub_ext('.html')
34
+
35
+ # Create directory path if it doesn’t exist
36
+ FileUtils.mkdir_p(path.dirname)
37
+
38
+ # Write out the file
39
+ File.open(path.to_s, 'w+:UTF-8') do |file|
40
+ file.puts(content)
41
+ end
42
+ end
43
+
44
+ def generate_sitemap(manifest)
45
+ # SitemapGenerator::Sitemap.default_host = @default_host
46
+ # SitemapGenerator::Sitemap.public_path = @public_dir
47
+ # SitemapGenerator::Sitemap.create do
48
+ # manifest.documents.each do |document|
49
+ # # Options: :changefreq, :lastmod, :priority, :expires
50
+ # #add(document.url, lastmod: document.published_at)
51
+ # add(document.url)
52
+ # end
53
+ # end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -1,8 +1,64 @@
1
1
  module Yarrow
2
2
  module Web
3
3
  class Manifest
4
+ def self.build(graph)
5
+ manifest = new
6
+
7
+ graph.n(:collection).each do |collection|
8
+ # TODO: raise error if both content_only and index_only are set
9
+ index = nil
10
+
11
+ # If the collection is tagged :index_only then skip adding individual documents
12
+ unless collection.props[:index_only]
13
+ collection.out(:item).each do |item|
14
+ #if item[:entity].status.to_sym == :published
15
+ if item.props[:name] == "index"
16
+ index = item
17
+ else
18
+ manifest.add_document(item_context(item))
19
+ end
20
+ #end
21
+ end
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
32
+ end
33
+
34
+ manifest
35
+ end
36
+
37
+ attr_reader :documents, :assets
38
+
4
39
  def initialize
40
+ @documents = []
41
+ @assets = []
42
+ end
43
+
44
+ def add_document(document)
45
+ @documents << document
46
+ end
47
+
48
+ def add_asset(asset)
49
+ @assets << asset
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
5
59
 
60
+ def self.item_context(item)
61
+ Document.new(item, item.in(:collection).first, false)
6
62
  end
7
63
  end
8
64
  end
@@ -1,8 +1,28 @@
1
1
  module Yarrow
2
2
  module Web
3
3
  class Template
4
- def initialize
4
+ def self.for_document(document)
5
+ layout_name = if document.respond_to?(:layout)
6
+ document.layout || document.type
7
+ else
8
+ document.type
9
+ end
5
10
 
11
+ @template_dir = "./spec/fixtures/templates/doctest"
12
+ @template_ext = ".html"
13
+
14
+ template_file = "#{layout_name}#{@template_ext}"
15
+ template_path = Pathname.new(@template_dir) + template_file
16
+
17
+ new(template_path.read)
18
+ end
19
+
20
+ def initialize(source)
21
+ @source = source
22
+ end
23
+
24
+ def render(document)
25
+ Mustache.render(@source, document)
6
26
  end
7
27
  end
8
28
  end
data/lib/yarrow.rb CHANGED
@@ -1,46 +1,50 @@
1
- require 'pathname'
2
- require 'yaml'
1
+ require "pathname"
2
+ require "yaml"
3
+ require "mustache"
4
+ require "parallel"
3
5
 
4
- require 'yarrow/version'
5
- require 'yarrow/extensions'
6
- require 'yarrow/symbols'
7
- require 'yarrow/logging'
8
- require 'yarrow/schema/types'
9
- require 'yarrow/schema/definitions'
10
- require 'yarrow/schema/dictionary'
11
- require 'yarrow/schema/entity'
12
- require 'yarrow/schema/value'
13
- require 'yarrow/config'
14
- require 'yarrow/configuration'
15
- require 'yarrow/console_runner'
16
- require 'yarrow/tools/front_matter'
17
- require 'yarrow/tools/content_utils'
18
- require 'yarrow/content/graph'
19
- require 'yarrow/content/source'
20
- require 'yarrow/content/expansion'
21
- require 'yarrow/content/expansion_strategy'
22
- require 'yarrow/content/tree_expansion'
23
- require 'yarrow/content/manifest'
24
- require 'yarrow/content/resource'
25
- require 'yarrow/content/model'
26
- require 'yarrow/content/policy'
27
- require 'yarrow/output/mapper'
28
- require 'yarrow/output/generator'
29
- require 'yarrow/output/context'
30
- require 'yarrow/output/result'
31
- require 'yarrow/output/web/indexed_file'
32
- require 'yarrow/content_map'
33
- require 'yarrow/server'
34
- require 'yarrow/server/livereload'
6
+ require "extensions/mementus"
35
7
 
36
- require 'yarrow/process/workflow'
37
- require 'yarrow/process/step_processor'
38
- require 'yarrow/process/expand_content'
39
- require 'yarrow/process/extract_source'
40
- require 'yarrow/process/project_manifest'
8
+ require "yarrow/version"
9
+ require "yarrow/symbols"
10
+ require "yarrow/logging"
11
+ require "yarrow/schema/types"
12
+ require "yarrow/schema/definitions"
13
+ require "yarrow/schema/dictionary"
14
+ require "yarrow/schema/entity"
15
+ require "yarrow/schema/value"
16
+ require "yarrow/schema/registry"
17
+ require "yarrow/config"
18
+ require "yarrow/configuration"
19
+ require "yarrow/console_runner"
20
+ require "yarrow/tools/front_matter"
21
+ require "yarrow/tools/content_utils"
22
+ require "yarrow/content/graph"
23
+ require "yarrow/content/source"
24
+ require "yarrow/content/expansion"
25
+ require "yarrow/content/expansion_strategy"
26
+ require "yarrow/content/tree_expansion"
27
+ require "yarrow/content/resource"
28
+ require "yarrow/content/model"
29
+ require "yarrow/content/policy"
30
+ require "yarrow/web/manifest"
31
+ require "yarrow/web/document"
32
+ require "yarrow/web/generator"
33
+ require "yarrow/web/template"
34
+ require "yarrow/output/context"
35
+ require "yarrow/output/web/indexed_file"
36
+ require "yarrow/content_map"
37
+ require "yarrow/server"
38
+ require "yarrow/server/livereload"
41
39
 
42
- require 'yarrow/generator'
40
+ require "yarrow/process/workflow"
41
+ require "yarrow/process/step_processor"
42
+ require "yarrow/process/expand_content"
43
+ require "yarrow/process/extract_source"
44
+ require "yarrow/process/project_manifest"
43
45
 
44
- # Dir[File.dirname(__FILE__) + '/yarrow/generators/*.rb'].each do |generator|
46
+ require "yarrow/generator"
47
+
48
+ # Dir[File.dirname(__FILE__) + "/yarrow/generators/*.rb"].each do |generator|
45
49
  # require generator
46
50
  # end
data/yarrow.gemspec CHANGED
@@ -13,12 +13,15 @@ Gem::Specification.new do |spec|
13
13
  spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
14
14
  spec.executables << 'yarrow'
15
15
  spec.executables << 'yarrow-server'
16
+ spec.add_runtime_dependency 'addressable', '~> 2.8'
16
17
  spec.add_runtime_dependency 'mementus', '~> 0.8'
17
18
  spec.add_runtime_dependency 'rack', '~> 3.0'
18
19
  spec.add_runtime_dependency 'rackup', '~> 0.2'
19
20
  spec.add_runtime_dependency 'rack-livereload', '~> 0.3'
20
21
  spec.add_runtime_dependency 'eventmachine', '~> 1.2'
21
22
  spec.add_runtime_dependency 'em-websocket', '~> 0.5.1'
23
+ spec.add_runtime_dependency 'mustache', '~> 1.1.1'
24
+ spec.add_runtime_dependency 'parallel', '~> 1.22.1'
22
25
  spec.add_runtime_dependency 'strings-inflection', '~> 0.1'
23
26
  spec.add_runtime_dependency 'strings-case', '~> 0.3'
24
27
  spec.add_runtime_dependency 'kramdown', '~> 2.4.0'
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yarrow
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.6
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-10-10 00:00:00.000000000 Z
11
+ date: 2022-11-04 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: addressable
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.8'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2.8'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: mementus
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -94,6 +108,34 @@ dependencies:
94
108
  - - "~>"
95
109
  - !ruby/object:Gem::Version
96
110
  version: 0.5.1
111
+ - !ruby/object:Gem::Dependency
112
+ name: mustache
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: 1.1.1
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: 1.1.1
125
+ - !ruby/object:Gem::Dependency
126
+ name: parallel
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: 1.22.1
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: 1.22.1
97
139
  - !ruby/object:Gem::Dependency
98
140
  name: strings-inflection
99
141
  requirement: !ruby/object:Gem::Requirement
@@ -210,6 +252,7 @@ files:
210
252
  - SERVER.md
211
253
  - bin/yarrow
212
254
  - bin/yarrow-server
255
+ - lib/extensions/mementus.rb
213
256
  - lib/yarrow.rb
214
257
  - lib/yarrow/assets.rb
215
258
  - lib/yarrow/assets/manifest.rb
@@ -220,7 +263,6 @@ files:
220
263
  - lib/yarrow/content/expansion.rb
221
264
  - lib/yarrow/content/expansion_strategy.rb
222
265
  - lib/yarrow/content/graph.rb
223
- - lib/yarrow/content/manifest.rb
224
266
  - lib/yarrow/content/model.rb
225
267
  - lib/yarrow/content/policy.rb
226
268
  - lib/yarrow/content/resource.rb
@@ -228,14 +270,10 @@ files:
228
270
  - lib/yarrow/content/tree_expansion.rb
229
271
  - lib/yarrow/content_map.rb
230
272
  - lib/yarrow/defaults.yml
231
- - lib/yarrow/extensions.rb
232
- - lib/yarrow/extensions/mementus.rb
233
273
  - lib/yarrow/generator.rb
274
+ - lib/yarrow/help.txt
234
275
  - lib/yarrow/logging.rb
235
276
  - lib/yarrow/output/context.rb
236
- - lib/yarrow/output/generator.rb
237
- - lib/yarrow/output/mapper.rb
238
- - lib/yarrow/output/result.rb
239
277
  - lib/yarrow/output/web/indexed_file.rb
240
278
  - lib/yarrow/process/expand_content.rb
241
279
  - lib/yarrow/process/extract_source.rb
@@ -245,6 +283,7 @@ files:
245
283
  - lib/yarrow/schema/definitions.rb
246
284
  - lib/yarrow/schema/dictionary.rb
247
285
  - lib/yarrow/schema/entity.rb
286
+ - lib/yarrow/schema/registry.rb
248
287
  - lib/yarrow/schema/types.rb
249
288
  - lib/yarrow/schema/validations/array.rb
250
289
  - lib/yarrow/schema/validations/object.rb
@@ -257,7 +296,8 @@ files:
257
296
  - lib/yarrow/tools/content_utils.rb
258
297
  - lib/yarrow/tools/front_matter.rb
259
298
  - lib/yarrow/version.rb
260
- - lib/yarrow/web/html_document.rb
299
+ - lib/yarrow/web/document.rb
300
+ - lib/yarrow/web/generator.rb
261
301
  - lib/yarrow/web/manifest.rb
262
302
  - lib/yarrow/web/static_asset.rb
263
303
  - lib/yarrow/web/template.rb
@@ -1,61 +0,0 @@
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, :assets
26
-
27
- def initialize
28
- @documents = []
29
- @assets = []
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_asset(asset)
57
- @assets << asset
58
- end
59
- end
60
- end
61
- end
@@ -1 +0,0 @@
1
- require "yarrow/extensions/mementus"
@@ -1,43 +0,0 @@
1
- module Yarrow
2
- module Output
3
- # Generates documentation from an object model.
4
- class Generator
5
- def initialize(config={})
6
- @config = config
7
- end
8
-
9
- # Mapping between template types and provided object model
10
- def object_map
11
- @config[:output][:object_map]
12
- end
13
-
14
- # Mapping between template types and provided output templates.
15
- def template_map
16
-
17
- end
18
-
19
- # Template converter used by this generator instance.
20
- def converter
21
-
22
- end
23
-
24
- def write_output_file(filename, content)
25
- end
26
-
27
- # Builds the output documentation.
28
- def build_docs
29
- object_map.each do |index, objects|
30
- objects.each do |object|
31
- template_context = {
32
- #:meta => Site
33
- index => object
34
- }
35
- content = converter.render(template_map[index], template_context)
36
- filename = converter.filename_for(object)
37
- write_output_file(filename, content)
38
- end
39
- end
40
- end
41
- end
42
- end
43
- end
@@ -1,23 +0,0 @@
1
- module Yarrow
2
- module Output
3
- class Mapper
4
-
5
- def initialize(config)
6
- @config = config
7
- end
8
-
9
- def object_map
10
- @config.output.object_map
11
- end
12
-
13
- def template_map
14
- @config.output.template_map
15
- end
16
-
17
- def model
18
-
19
- end
20
-
21
- end
22
- end
23
- end
@@ -1,13 +0,0 @@
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
@@ -1,9 +0,0 @@
1
- module Yarrow
2
- module Web
3
- class HTMLDocument
4
- def initialize
5
-
6
- end
7
- end
8
- end
9
- end