yarrow 0.7.6 → 0.8.1

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: 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