nanoc-conref-fs 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +29 -0
- data/.travis.yml +12 -0
- data/Gemfile +11 -0
- data/LICENSE.txt +22 -0
- data/README.md +64 -0
- data/Rakefile +11 -0
- data/lib/nanoc-conref-fs.rb +3 -0
- data/lib/nanoc-conref-fs/conref-fs.rb +103 -0
- data/lib/nanoc-conref-fs/conrefifier.rb +18 -0
- data/lib/nanoc-conref-fs/datafiles.rb +48 -0
- data/nanoc-conref-fs.gemspec +24 -0
- data/script/bootstrap +5 -0
- data/test/conref_fs_test.rb +100 -0
- data/test/datafiles_test.rb +41 -0
- data/test/fixtures/Rules +23 -0
- data/test/fixtures/content/datafiles/deep.html +18 -0
- data/test/fixtures/content/datafiles/deep.md +6 -0
- data/test/fixtures/content/frontmatter/audience.html +18 -0
- data/test/fixtures/content/frontmatter/audience.md +5 -0
- data/test/fixtures/content/frontmatter/different.html +18 -0
- data/test/fixtures/content/frontmatter/different.md +5 -0
- data/test/fixtures/content/frontmatter/title.html +18 -0
- data/test/fixtures/content/frontmatter/title.md +6 -0
- data/test/fixtures/content/parents/missing_title.html +18 -0
- data/test/fixtures/content/parents/missing_title.md +5 -0
- data/test/fixtures/content/parents/single_parent.html +18 -0
- data/test/fixtures/content/parents/single_parent.md +5 -0
- data/test/fixtures/content/parents/two_parents.html +18 -0
- data/test/fixtures/content/parents/two_parents.md +5 -0
- data/test/fixtures/data/categories/category.yml +9 -0
- data/test/fixtures/data/reusables/intro.yml +14 -0
- data/test/fixtures/data/reusables/names.yml +1 -0
- data/test/fixtures/data/variables/empty.yml +0 -0
- data/test/fixtures/data/variables/product.yml +14 -0
- data/test/fixtures/layouts/default.html +16 -0
- data/test/fixtures/nanoc.yaml +51 -0
- data/test/test_helper.rb +75 -0
- metadata +176 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: c521a9f295c33c7aa6f4dc47ca92045539c467e5
|
4
|
+
data.tar.gz: 42ac9a18696599fd0f298899f48b7f6b4484bd3f
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 3fad6cd16943d5e3b4cbda7579d7c0cc6b3b30b0ddf7194a9a198d2d2f01138ed564c3b353d510e78076f7b5c11fe35a088e06cf1332c7d0e1f883fb2525dd12
|
7
|
+
data.tar.gz: ca660bcfaf0287c737ff8a50186d61196cae39b39861fffbb4925f62a2539e1cfa0a56d79c2ccd0bd71815a125a4c41e143e2dde2c9314cf52cb314e3221c7f5
|
data/.gitignore
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
*.gem
|
2
|
+
*.rbc
|
3
|
+
.bundle
|
4
|
+
.config
|
5
|
+
coverage
|
6
|
+
InstalledFiles
|
7
|
+
lib/bundler/man
|
8
|
+
pkg
|
9
|
+
rdoc
|
10
|
+
spec/reports
|
11
|
+
test/tmp
|
12
|
+
test/version_tmp
|
13
|
+
tmp
|
14
|
+
|
15
|
+
Gemfile.lock
|
16
|
+
out/
|
17
|
+
sample.rb
|
18
|
+
run_sample.rb
|
19
|
+
src/
|
20
|
+
docs/
|
21
|
+
|
22
|
+
# YARD artifacts
|
23
|
+
.yardoc
|
24
|
+
_yardoc
|
25
|
+
doc/
|
26
|
+
.DS_Store
|
27
|
+
|
28
|
+
test/fixtures/output
|
29
|
+
test/fixtures/tmp
|
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2015 Garen J. Torikian
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
# nanoc-conref-fs
|
2
|
+
|
3
|
+
This gem adds a new Filesystem type called `ConrefFS` to nanoc.
|
4
|
+
|
5
|
+
The idea is that you have a set of YAML files in a data folder which act as your reusables. You can apply thse reusables throughout your content and layout.
|
6
|
+
|
7
|
+
[![Build Status](https://travis-ci.org/gjtorikian/nanoc-conref-fs.svg)](https://travis-ci.org/gjtorikian/nanoc-conref-fs)
|
8
|
+
|
9
|
+
## Usage
|
10
|
+
|
11
|
+
Nearly all the usage of this gem relies on a *data* folder, sibling to your *content* and *layouts* folders. See [the test fixture](test/fixtures/data) for an example.
|
12
|
+
|
13
|
+
You'll also need some relevant keys added to your *nanoc.yaml* file:
|
14
|
+
|
15
|
+
* The `data_variables` key applies additional/dynamic values to your data files, based on their path. For example, the following `data_variables` configuration adds a `version` attribute to every data file, whose value is `dotcom`:
|
16
|
+
|
17
|
+
``` yaml
|
18
|
+
data_variables:
|
19
|
+
-
|
20
|
+
scope:
|
21
|
+
path: ""
|
22
|
+
values:
|
23
|
+
version: "dotcom"
|
24
|
+
```
|
25
|
+
|
26
|
+
You could add to this key to indicate that any data file called *changed* instead has a version of `something_different`:
|
27
|
+
|
28
|
+
``` yaml
|
29
|
+
data_variables:
|
30
|
+
-
|
31
|
+
scope:
|
32
|
+
path: ""
|
33
|
+
values:
|
34
|
+
version: "dotcom"
|
35
|
+
-
|
36
|
+
scope:
|
37
|
+
path: "changed"
|
38
|
+
values:
|
39
|
+
version: "2.0"
|
40
|
+
```
|
41
|
+
|
42
|
+
* Similarly, the `page_variables` also use `scope`s and `value`s to determine variables:
|
43
|
+
|
44
|
+
``` yaml
|
45
|
+
page_variables:
|
46
|
+
-
|
47
|
+
scope:
|
48
|
+
path: ""
|
49
|
+
values:
|
50
|
+
version: "dotcom"
|
51
|
+
-
|
52
|
+
scope:
|
53
|
+
path: "different"
|
54
|
+
values:
|
55
|
+
version: "2.0"
|
56
|
+
```
|
57
|
+
|
58
|
+
In this case, every file path will get a `version` of `dotcom`, but any file matching `different` will get a version of 2.0.
|
59
|
+
|
60
|
+
See the tests for further usage of these conditionals. In both cases, `path` is converted into a Ruby regular expression before being matched against a filename.
|
61
|
+
|
62
|
+
### Associating files with data
|
63
|
+
|
64
|
+
If you have a special `data_association` value, additional metadata to items will be applied. Right now, this only adds a `parent` type to each item.
|
data/Rakefile
ADDED
@@ -0,0 +1,103 @@
|
|
1
|
+
require_relative 'conrefifier'
|
2
|
+
|
3
|
+
class ConrefFS < Nanoc::DataSource
|
4
|
+
include Nanoc::DataSources::Filesystem
|
5
|
+
|
6
|
+
identifier :conref_fs
|
7
|
+
|
8
|
+
# Before iterating over the file objects, this method loads the data folder
|
9
|
+
# and applies to to an ivar for later usage.
|
10
|
+
def load_objects(dir_name, kind, klass)
|
11
|
+
data = Datafiles.process(@site_config)
|
12
|
+
@vars = { 'site' => { 'config' => @site_config.to_h, 'data' => data } }
|
13
|
+
super
|
14
|
+
end
|
15
|
+
|
16
|
+
# This function calls the parent super, then adds additional metadata to the item.
|
17
|
+
def parse(content_filename, meta_filename, _kind)
|
18
|
+
meta, content = super
|
19
|
+
page_vars = Conrefifier.file_variables(@site_config[:page_variables], content_filename)
|
20
|
+
unless page_vars[:data_association].nil?
|
21
|
+
association = page_vars[:data_association]
|
22
|
+
reference = association.split('.')
|
23
|
+
toc = @vars['site']['data']
|
24
|
+
while key = reference.shift
|
25
|
+
toc = toc[key]
|
26
|
+
end
|
27
|
+
meta['parents'] = find_parents(toc, meta['title'])
|
28
|
+
end
|
29
|
+
[meta, content]
|
30
|
+
end
|
31
|
+
|
32
|
+
# Given a category file, this method finds its parent.
|
33
|
+
def find_parents(toc, title)
|
34
|
+
parents = ''
|
35
|
+
toc.keys.each do |key|
|
36
|
+
toc[key].each do |item|
|
37
|
+
if item.is_a?(Hash)
|
38
|
+
if item.keys.include?(title)
|
39
|
+
parents = key
|
40
|
+
break
|
41
|
+
else
|
42
|
+
if item[item.keys.first].include?(title)
|
43
|
+
parents = key
|
44
|
+
break
|
45
|
+
end
|
46
|
+
end
|
47
|
+
elsif title == item
|
48
|
+
parents = key
|
49
|
+
break
|
50
|
+
end
|
51
|
+
end
|
52
|
+
break unless parents.empty?
|
53
|
+
end
|
54
|
+
parents
|
55
|
+
end
|
56
|
+
|
57
|
+
# This file reads each piece of content as it comes in. It also applies the conref variables
|
58
|
+
# (demarcated by Liquid's {{ }} tags) using both the data/ folder and any variables defined
|
59
|
+
# within the nanoc.yaml config file
|
60
|
+
def read(filename)
|
61
|
+
begin
|
62
|
+
page_vars = Conrefifier.file_variables(@site_config[:page_variables], filename)
|
63
|
+
page_vars = { :page => page_vars }.merge(@vars)
|
64
|
+
|
65
|
+
data = File.read(filename)
|
66
|
+
return data unless filename.start_with?('content')
|
67
|
+
|
68
|
+
# This first pass converts the frontmatter variables,
|
69
|
+
# and inserts data variables into the body
|
70
|
+
result = Conrefifier.apply_liquid(data, page_vars)
|
71
|
+
# This second application renders the previously inserted
|
72
|
+
# data conditionals within the body
|
73
|
+
result = Conrefifier.apply_liquid(result, page_vars)
|
74
|
+
rescue => e
|
75
|
+
raise RuntimeError.new("Could not read #{filename}: #{e.inspect}")
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
# This method is extracted from the Nanoc default FS
|
80
|
+
def filename_for(base_filename, ext)
|
81
|
+
if ext.nil?
|
82
|
+
nil
|
83
|
+
elsif ext.empty?
|
84
|
+
base_filename
|
85
|
+
else
|
86
|
+
base_filename + '.' + ext
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
# This method is extracted from the Nanoc default FS
|
91
|
+
def identifier_for_filename(filename)
|
92
|
+
if config[:identifier_type] == 'full'
|
93
|
+
return Nanoc::Identifier.new(filename)
|
94
|
+
end
|
95
|
+
|
96
|
+
if filename =~ /(^|\/)index(\.[^\/]+)?$/
|
97
|
+
regex = @config && @config[:allow_periods_in_identifiers] ? /\/?(index)?(\.[^\/\.]+)?$/ : /\/?index(\.[^\/]+)?$/
|
98
|
+
else
|
99
|
+
regex = @config && @config[:allow_periods_in_identifiers] ? /\.[^\/\.]+$/ : /\.[^\/]+$/
|
100
|
+
end
|
101
|
+
Nanoc::Identifier.new(filename.sub(regex, ''), type: :legacy)
|
102
|
+
end
|
103
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'liquid'
|
2
|
+
|
3
|
+
module Conrefifier
|
4
|
+
def self.file_variables(variables, path)
|
5
|
+
return {} if variables.nil?
|
6
|
+
|
7
|
+
data_vars = {}
|
8
|
+
scopes = variables.select { |v| v[:scope][:path].empty? || Regexp.new(v[:scope][:path]) =~ path }
|
9
|
+
scopes.each do |scope|
|
10
|
+
data_vars = data_vars.merge(scope[:values])
|
11
|
+
end
|
12
|
+
data_vars
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.apply_liquid(content, data_vars)
|
16
|
+
::Liquid::Template.parse(content).render(data_vars.deep_stringify_keys)
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
require 'active_support'
|
3
|
+
require 'active_support/core_ext/hash'
|
4
|
+
|
5
|
+
require_relative 'conrefifier'
|
6
|
+
|
7
|
+
module Datafiles
|
8
|
+
|
9
|
+
def self.apply_conditionals(config, path, content)
|
10
|
+
data_vars = Conrefifier.file_variables(config[:data_variables], path)
|
11
|
+
data_vars = { :page => data_vars, :site => { :config => config } }
|
12
|
+
|
13
|
+
content = content.gsub(/(\s*\{% (?:if|unless).+? %\}.*?\{% end(?:if|unless) %\})/m) do |match|
|
14
|
+
# We must obfuscate Liquid variables while replacing conditionals
|
15
|
+
match = match.gsub(/{{/, '~~#~~')
|
16
|
+
match = Conrefifier.apply_liquid(match, data_vars)
|
17
|
+
match.gsub('~~#~~', '{{')
|
18
|
+
end
|
19
|
+
|
20
|
+
doc = YAML.load(content)
|
21
|
+
data_keys = "#{path}".gsub(%r{^data/}, '').gsub(%r{/}, '.').gsub(/\.yml/, '').split('.')
|
22
|
+
create_nested_hash(data_keys, doc)
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.create_nested_hash(keys, final)
|
26
|
+
keys.reverse.inject do |mem, var|
|
27
|
+
if mem == keys.last
|
28
|
+
{ var => { mem => final } }
|
29
|
+
else
|
30
|
+
{ var => mem }
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.collect_data(dir)
|
36
|
+
Dir["#{dir}/**/*.{yaml,yml}"]
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.process(config)
|
40
|
+
data = {}
|
41
|
+
files = collect_data('data')
|
42
|
+
files.each do |file|
|
43
|
+
content = File.read(file)
|
44
|
+
data = data.deep_merge apply_conditionals(config, file, content)
|
45
|
+
end
|
46
|
+
data
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
lib = File.expand_path('../lib', __FILE__)
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
+
|
4
|
+
Gem::Specification.new do |spec|
|
5
|
+
spec.name = 'nanoc-conref-fs'
|
6
|
+
spec.version = '0.0.1'
|
7
|
+
spec.authors = ['Garen Torikian']
|
8
|
+
spec.email = ['gjtorikian@gmail.com']
|
9
|
+
spec.summary = 'A Nanoc filesystem to permit using conrefs/reusables in your content.'
|
10
|
+
spec.homepage = 'https://github.com/gjtorikian/nanoc-conref-fs'
|
11
|
+
spec.license = 'MIT'
|
12
|
+
|
13
|
+
spec.files = `git ls-files`.split($/)
|
14
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
15
|
+
spec.test_files = spec.files.grep(%r{^(test)/})
|
16
|
+
spec.require_paths = ['lib']
|
17
|
+
|
18
|
+
spec.add_runtime_dependency 'nanoc', '>= 3.1.6'
|
19
|
+
spec.add_runtime_dependency 'activesupport', '~> 4.2'
|
20
|
+
spec.add_runtime_dependency 'liquid', '~> 3.0'
|
21
|
+
|
22
|
+
spec.add_development_dependency 'rake'
|
23
|
+
spec.add_development_dependency 'minitest', '~> 5.8'
|
24
|
+
end
|
data/script/bootstrap
ADDED
@@ -0,0 +1,100 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class DatafilesTest < MiniTest::Test
|
4
|
+
|
5
|
+
def test_it_renders_conrefs_in_frontmatter
|
6
|
+
with_site(name: FIXTURES_DIR) do |site|
|
7
|
+
|
8
|
+
site = Nanoc::Int::SiteLoader.new.new_from_cwd
|
9
|
+
site.compile
|
10
|
+
|
11
|
+
output_file = read_output_file('frontmatter', 'title')
|
12
|
+
test_file = read_test_file('frontmatter', 'title')
|
13
|
+
assert_equal output_file, test_file
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_it_renders_conrefs_in_frontmatter_at_different_path
|
18
|
+
with_site(name: FIXTURES_DIR) do |site|
|
19
|
+
|
20
|
+
site = Nanoc::Int::SiteLoader.new.new_from_cwd
|
21
|
+
site.compile
|
22
|
+
|
23
|
+
output_file = read_output_file('frontmatter', 'different')
|
24
|
+
test_file = read_test_file('frontmatter', 'different')
|
25
|
+
assert_equal output_file, test_file
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_it_renders_conrefs_in_frontmatter_with_audience
|
30
|
+
with_site(name: FIXTURES_DIR) do |site|
|
31
|
+
|
32
|
+
site = Nanoc::Int::SiteLoader.new.new_from_cwd
|
33
|
+
site.compile
|
34
|
+
|
35
|
+
output_file = read_output_file('frontmatter', 'audience')
|
36
|
+
test_file = read_test_file('frontmatter', 'audience')
|
37
|
+
assert_equal output_file, test_file
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_it_renders_nested_conrefs
|
42
|
+
with_site(name: FIXTURES_DIR) do |site|
|
43
|
+
|
44
|
+
site = Nanoc::Int::SiteLoader.new.new_from_cwd
|
45
|
+
site.compile
|
46
|
+
|
47
|
+
output_file = read_output_file('datafiles', 'deep')
|
48
|
+
test_file = read_test_file('datafiles', 'deep')
|
49
|
+
assert_equal output_file, test_file
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_it_renders_nested_conrefs
|
54
|
+
with_site(name: FIXTURES_DIR) do |site|
|
55
|
+
|
56
|
+
site = Nanoc::Int::SiteLoader.new.new_from_cwd
|
57
|
+
site.compile
|
58
|
+
|
59
|
+
output_file = read_output_file('datafiles', 'deep')
|
60
|
+
test_file = read_test_file('datafiles', 'deep')
|
61
|
+
assert_equal output_file, test_file
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_it_renders_single_parents
|
66
|
+
with_site(name: FIXTURES_DIR) do |site|
|
67
|
+
|
68
|
+
site = Nanoc::Int::SiteLoader.new.new_from_cwd
|
69
|
+
site.compile
|
70
|
+
|
71
|
+
output_file = read_output_file('parents', 'single_parent')
|
72
|
+
test_file = read_test_file('parents', 'single_parent')
|
73
|
+
assert_equal output_file, test_file
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def test_it_renders_two_parents
|
78
|
+
with_site(name: FIXTURES_DIR) do |site|
|
79
|
+
|
80
|
+
site = Nanoc::Int::SiteLoader.new.new_from_cwd
|
81
|
+
site.compile
|
82
|
+
|
83
|
+
output_file = read_output_file('parents', 'two_parents')
|
84
|
+
test_file = read_test_file('parents', 'two_parents')
|
85
|
+
assert_equal output_file, test_file
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def test_missing_cateogory_title_does_not_blow_up_parents
|
90
|
+
with_site(name: FIXTURES_DIR) do |site|
|
91
|
+
|
92
|
+
site = Nanoc::Int::SiteLoader.new.new_from_cwd
|
93
|
+
site.compile
|
94
|
+
|
95
|
+
output_file = read_output_file('parents', 'missing_title')
|
96
|
+
test_file = read_test_file('parents', 'missing_title')
|
97
|
+
assert_equal output_file, test_file
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class DatafilesTest < MiniTest::Test
|
4
|
+
def setup
|
5
|
+
@config = YAML.load_file(File.join(FIXTURES_DIR, 'nanoc.yaml')).deep_symbolize_keys
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_it_collects_the_files
|
9
|
+
files = Datafiles.collect_data(File.join(FIXTURES_DIR, 'data'))
|
10
|
+
names = %w(categories/category reusables/intro reusables/names variables/empty variables/product)
|
11
|
+
names.map! { |name| File.join(FIXTURES_DIR, 'data', "#{name}.yml") }
|
12
|
+
assert_equal files, names
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_it_creates_nested_hash
|
16
|
+
string = %w(this is deep)
|
17
|
+
value = 42
|
18
|
+
hash = Datafiles.create_nested_hash(string, value)
|
19
|
+
value = { 'this' => { 'is' => { 'deep' => 42 } } }
|
20
|
+
assert_equal value, hash
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_it_applies_conref_conditionals
|
24
|
+
file = File.join(FIXTURES_DIR, 'data', 'variables', 'product.yml')
|
25
|
+
content = File.read(file)
|
26
|
+
result = Datafiles.apply_conditionals(@config, file, content)
|
27
|
+
assert_includes result.to_s, 'No caveats!'
|
28
|
+
|
29
|
+
@config[:data_variables][0][:values][:version] = 'foof'
|
30
|
+
result = Datafiles.apply_conditionals(@config, file, content)
|
31
|
+
assert_includes result.to_s, 'Well.....there is one.'
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_it_leaves_liquid_substitutions_alone
|
35
|
+
file = File.join(FIXTURES_DIR, 'data', 'reusables', 'intro.yml')
|
36
|
+
content = File.read(file)
|
37
|
+
result = Datafiles.apply_conditionals(@config, file, content)
|
38
|
+
assert_includes result.to_s, 'We use {{ site.data.reusables.names.new_name }}'
|
39
|
+
assert_includes result.to_s, '{{ site.data.variables.product.product_name }} is great'
|
40
|
+
end
|
41
|
+
end
|
data/test/fixtures/Rules
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
compile '/**/*.html' do
|
4
|
+
layout '/default.*'
|
5
|
+
end
|
6
|
+
|
7
|
+
compile '/**/*.md' do
|
8
|
+
layout '/default.*'
|
9
|
+
end
|
10
|
+
|
11
|
+
route '/**/*.md' do
|
12
|
+
item.identifier.without_ext + '/index.html'
|
13
|
+
end
|
14
|
+
|
15
|
+
route '/**/*.html}' do
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
route '/**/*' do
|
20
|
+
item.identifier.to_s
|
21
|
+
end
|
22
|
+
|
23
|
+
layout '/**/*', :erb
|
@@ -0,0 +1,14 @@
|
|
1
|
+
frontmatter_intro: Here I am, in the front.
|
2
|
+
|
3
|
+
svn_intro: "We use {{ site.data.reusables.names.new_name }}"
|
4
|
+
|
5
|
+
conditional_with_subs: |
|
6
|
+
{% if page.version == 'dotcom' %}
|
7
|
+
|
8
|
+
{{ site.data.variables.product.product_name }} is great for open source.
|
9
|
+
|
10
|
+
{% else %}
|
11
|
+
|
12
|
+
{{ site.data.variables.product.product_name }} is great for businesses.
|
13
|
+
|
14
|
+
{% endif %}
|
@@ -0,0 +1 @@
|
|
1
|
+
new_name: 'SVNHub'
|
File without changes
|
@@ -0,0 +1,51 @@
|
|
1
|
+
|
2
|
+
data_variables:
|
3
|
+
-
|
4
|
+
scope:
|
5
|
+
path: ""
|
6
|
+
values:
|
7
|
+
version: "dotcom"
|
8
|
+
|
9
|
+
page_variables:
|
10
|
+
-
|
11
|
+
scope:
|
12
|
+
path: ""
|
13
|
+
values:
|
14
|
+
version: "dotcom"
|
15
|
+
data_association: "categories.category"
|
16
|
+
-
|
17
|
+
scope:
|
18
|
+
path: "different"
|
19
|
+
values:
|
20
|
+
version: "2.0"
|
21
|
+
|
22
|
+
string_pattern_type: glob
|
23
|
+
|
24
|
+
text_extensions: [ 'coffee', 'css', 'erb', 'haml', 'handlebars', 'hb', 'htm', 'html', 'js', 'less', 'markdown', 'md', 'ms', 'mustache', 'php', 'rb', 'rdoc', 'sass', 'scss', 'slim', 'txt', 'xhtml', 'xml' ]
|
25
|
+
|
26
|
+
output_dir: output
|
27
|
+
|
28
|
+
index_filenames: [ 'index.html' ]
|
29
|
+
|
30
|
+
enable_output_diff: false
|
31
|
+
|
32
|
+
prune:
|
33
|
+
auto_prune: true
|
34
|
+
|
35
|
+
exclude: [ '.git', '.hg', '.svn', 'CVS' ]
|
36
|
+
|
37
|
+
data_sources:
|
38
|
+
-
|
39
|
+
# The type is the identifier of the data source.
|
40
|
+
type: conref_fs
|
41
|
+
|
42
|
+
items_root: /
|
43
|
+
layouts_root: /
|
44
|
+
|
45
|
+
encoding: utf-8
|
46
|
+
|
47
|
+
identifier_type: full
|
48
|
+
|
49
|
+
checks:
|
50
|
+
internal_links:
|
51
|
+
exclude: []
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
require 'bundler/setup'
|
2
|
+
require 'nanoc'
|
3
|
+
require_relative '../lib/nanoc-conref-fs'
|
4
|
+
require 'minitest/autorun'
|
5
|
+
require 'minitest/pride'
|
6
|
+
require 'active_support'
|
7
|
+
|
8
|
+
FIXTURES_DIR = File.join(Dir.pwd, 'test', 'fixtures')
|
9
|
+
|
10
|
+
def read_output_file(dir, name)
|
11
|
+
File.read(File.join('output', dir, name, 'index.html')).gsub(/^\s*$/, '')
|
12
|
+
end
|
13
|
+
|
14
|
+
def read_test_file(dir, name)
|
15
|
+
File.read(File.join(FIXTURES_DIR, 'content', dir, "#{name}.html")).gsub(/^\s*$/, '')
|
16
|
+
end
|
17
|
+
|
18
|
+
def with_site(params = {})
|
19
|
+
# Build site name
|
20
|
+
site_name = params[:name]
|
21
|
+
if site_name.nil?
|
22
|
+
@site_num ||= 0
|
23
|
+
site_name = "site-#{@site_num}"
|
24
|
+
@site_num += 1
|
25
|
+
end
|
26
|
+
|
27
|
+
# Build rules
|
28
|
+
rules_content = <<EOS
|
29
|
+
compile '*' do
|
30
|
+
{{compilation_rule_content}}
|
31
|
+
end
|
32
|
+
|
33
|
+
route '*' do
|
34
|
+
if item.binary?
|
35
|
+
item.identifier.chop + (item[:extension] ? '.' + item[:extension] : '')
|
36
|
+
else
|
37
|
+
item.identifier + 'index.html'
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
layout '*', :erb
|
42
|
+
EOS
|
43
|
+
rules_content.gsub!('{{compilation_rule_content}}', params[:compilation_rule_content] || '')
|
44
|
+
|
45
|
+
# Create site
|
46
|
+
unless File.directory?(site_name)
|
47
|
+
FileUtils.mkdir_p(site_name)
|
48
|
+
FileUtils.cd(site_name) do
|
49
|
+
FileUtils.mkdir_p('content')
|
50
|
+
FileUtils.mkdir_p('layouts')
|
51
|
+
FileUtils.mkdir_p('lib')
|
52
|
+
FileUtils.mkdir_p('output')
|
53
|
+
|
54
|
+
if params[:has_layout]
|
55
|
+
File.open('layouts/default.html', 'w') do |io|
|
56
|
+
io.write('... <%= @yield %> ...')
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
File.open('nanoc.yaml', 'w') do |io|
|
61
|
+
io << 'string_pattern_type: legacy' << "\n"
|
62
|
+
io << 'data_sources:' << "\n"
|
63
|
+
io << ' -' << "\n"
|
64
|
+
io << ' type: filesystem' << "\n"
|
65
|
+
io << ' identifier_type: legacy' << "\n"
|
66
|
+
end
|
67
|
+
File.open('Rules', 'w') { |io| io.write(rules_content) }
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
# Yield site
|
72
|
+
FileUtils.cd(site_name) do
|
73
|
+
yield Nanoc::Int::SiteLoader.new.new_from_cwd
|
74
|
+
end
|
75
|
+
end
|
metadata
ADDED
@@ -0,0 +1,176 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: nanoc-conref-fs
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Garen Torikian
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-10-19 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: nanoc
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 3.1.6
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 3.1.6
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: activesupport
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '4.2'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '4.2'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: liquid
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '3.0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rake
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: minitest
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '5.8'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '5.8'
|
83
|
+
description:
|
84
|
+
email:
|
85
|
+
- gjtorikian@gmail.com
|
86
|
+
executables: []
|
87
|
+
extensions: []
|
88
|
+
extra_rdoc_files: []
|
89
|
+
files:
|
90
|
+
- ".gitignore"
|
91
|
+
- ".travis.yml"
|
92
|
+
- Gemfile
|
93
|
+
- LICENSE.txt
|
94
|
+
- README.md
|
95
|
+
- Rakefile
|
96
|
+
- lib/nanoc-conref-fs.rb
|
97
|
+
- lib/nanoc-conref-fs/conref-fs.rb
|
98
|
+
- lib/nanoc-conref-fs/conrefifier.rb
|
99
|
+
- lib/nanoc-conref-fs/datafiles.rb
|
100
|
+
- nanoc-conref-fs.gemspec
|
101
|
+
- script/bootstrap
|
102
|
+
- test/conref_fs_test.rb
|
103
|
+
- test/datafiles_test.rb
|
104
|
+
- test/fixtures/Rules
|
105
|
+
- test/fixtures/content/datafiles/deep.html
|
106
|
+
- test/fixtures/content/datafiles/deep.md
|
107
|
+
- test/fixtures/content/frontmatter/audience.html
|
108
|
+
- test/fixtures/content/frontmatter/audience.md
|
109
|
+
- test/fixtures/content/frontmatter/different.html
|
110
|
+
- test/fixtures/content/frontmatter/different.md
|
111
|
+
- test/fixtures/content/frontmatter/title.html
|
112
|
+
- test/fixtures/content/frontmatter/title.md
|
113
|
+
- test/fixtures/content/parents/missing_title.html
|
114
|
+
- test/fixtures/content/parents/missing_title.md
|
115
|
+
- test/fixtures/content/parents/single_parent.html
|
116
|
+
- test/fixtures/content/parents/single_parent.md
|
117
|
+
- test/fixtures/content/parents/two_parents.html
|
118
|
+
- test/fixtures/content/parents/two_parents.md
|
119
|
+
- test/fixtures/data/categories/category.yml
|
120
|
+
- test/fixtures/data/reusables/intro.yml
|
121
|
+
- test/fixtures/data/reusables/names.yml
|
122
|
+
- test/fixtures/data/variables/empty.yml
|
123
|
+
- test/fixtures/data/variables/product.yml
|
124
|
+
- test/fixtures/layouts/default.html
|
125
|
+
- test/fixtures/nanoc.yaml
|
126
|
+
- test/test_helper.rb
|
127
|
+
homepage: https://github.com/gjtorikian/nanoc-conref-fs
|
128
|
+
licenses:
|
129
|
+
- MIT
|
130
|
+
metadata: {}
|
131
|
+
post_install_message:
|
132
|
+
rdoc_options: []
|
133
|
+
require_paths:
|
134
|
+
- lib
|
135
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
136
|
+
requirements:
|
137
|
+
- - ">="
|
138
|
+
- !ruby/object:Gem::Version
|
139
|
+
version: '0'
|
140
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
141
|
+
requirements:
|
142
|
+
- - ">="
|
143
|
+
- !ruby/object:Gem::Version
|
144
|
+
version: '0'
|
145
|
+
requirements: []
|
146
|
+
rubyforge_project:
|
147
|
+
rubygems_version: 2.4.5
|
148
|
+
signing_key:
|
149
|
+
specification_version: 4
|
150
|
+
summary: A Nanoc filesystem to permit using conrefs/reusables in your content.
|
151
|
+
test_files:
|
152
|
+
- test/conref_fs_test.rb
|
153
|
+
- test/datafiles_test.rb
|
154
|
+
- test/fixtures/Rules
|
155
|
+
- test/fixtures/content/datafiles/deep.html
|
156
|
+
- test/fixtures/content/datafiles/deep.md
|
157
|
+
- test/fixtures/content/frontmatter/audience.html
|
158
|
+
- test/fixtures/content/frontmatter/audience.md
|
159
|
+
- test/fixtures/content/frontmatter/different.html
|
160
|
+
- test/fixtures/content/frontmatter/different.md
|
161
|
+
- test/fixtures/content/frontmatter/title.html
|
162
|
+
- test/fixtures/content/frontmatter/title.md
|
163
|
+
- test/fixtures/content/parents/missing_title.html
|
164
|
+
- test/fixtures/content/parents/missing_title.md
|
165
|
+
- test/fixtures/content/parents/single_parent.html
|
166
|
+
- test/fixtures/content/parents/single_parent.md
|
167
|
+
- test/fixtures/content/parents/two_parents.html
|
168
|
+
- test/fixtures/content/parents/two_parents.md
|
169
|
+
- test/fixtures/data/categories/category.yml
|
170
|
+
- test/fixtures/data/reusables/intro.yml
|
171
|
+
- test/fixtures/data/reusables/names.yml
|
172
|
+
- test/fixtures/data/variables/empty.yml
|
173
|
+
- test/fixtures/data/variables/product.yml
|
174
|
+
- test/fixtures/layouts/default.html
|
175
|
+
- test/fixtures/nanoc.yaml
|
176
|
+
- test/test_helper.rb
|