cloudcannon-jekyll 1.4.3 → 1.5.0

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: 92b0e675c47140f4aef7c11b38d2f3fb9e650dfe68639f0a0f7a66c0fd312ad1
4
- data.tar.gz: 4bead9682c10702bfb3271e6dd103df94a35106f70136fb5b3c37a11b833c9f8
3
+ metadata.gz: 33d4053706ea20c8d2e3985de49e437dcee1c275ecd4ccdf78dc7c7d1a94cf83
4
+ data.tar.gz: 4fe382c19ba59e3242f6cfa9b5b7e46de152c2091036602a622618fce3f2e8ba
5
5
  SHA512:
6
- metadata.gz: 9639f12433c8ccd842eea34ae0569d0ec6a0dcf062ba37e2f9fc313cb15de81720db9a91ceea91bfabc39eed094dd333cebd3fb271af11ee7a105b11f2e9470a
7
- data.tar.gz: c8f6b1b80ad75c5ea2f76d638cc4843fa020449d30c1d35a3b863f6d99f9cc9cb5d8842fc7b38a968a43998506e305f60d4701352fa838e112e62dbd97ed8417
6
+ metadata.gz: f3d509ec5cfdedc0dce34b639152efd81a81c2d798f403dbf656ab17cc16af127a45609d4cf482b830e02fbdbe4b77c7c6bc7a8a8a3a584b501273b3f40d4fdb
7
+ data.tar.gz: f1c56c046ff5dcf46048184cf7de498aff85706804afbf168613cfac4d0e6a448ebecc29e6575114ee58098c7df7e3a83ba19bb07f9d68902aa0cbd60db120e0
@@ -0,0 +1,19 @@
1
+ name: Mark stale issues
2
+
3
+ on:
4
+ schedule:
5
+ - cron: "30 1 * * *"
6
+
7
+ jobs:
8
+ stale:
9
+
10
+ runs-on: ubuntu-latest
11
+
12
+ steps:
13
+ - uses: actions/stale@v1
14
+ with:
15
+ repo-token: ${{ secrets.GITHUB_TOKEN }}
16
+ stale-issue-message: 'This issue is stale because it has been open 30 days with no activity. Remove stale label or comment or this will be closed in 5 days'
17
+ stale-issue-label: 'no-issue-activity'
18
+ days-before-stale: 30
19
+ days-before-close: 5
@@ -28,15 +28,12 @@ Naming/MemoizedInstanceVariableName:
28
28
  Metrics/CyclomaticComplexity:
29
29
  Exclude:
30
30
  - lib/cloudcannon-jekyll/jsonify-filter.rb # TODO remove this and fix warnings
31
+ - lib/cloudcannon-jekyll/readers/old-data-reader.rb # TODO remove this and fix warnings
31
32
 
32
33
  Metrics/PerceivedComplexity:
33
34
  Exclude:
34
35
  - lib/cloudcannon-jekyll/jsonify-filter.rb # TODO remove this and fix warnings
35
36
 
36
- Metrics/MethodLength:
37
- Exclude:
38
- - lib/cloudcannon-jekyll/jsonify-filter.rb # TODO remove this and fix warnings
39
-
40
37
  Metrics/AbcSize:
41
38
  Exclude:
42
39
  - lib/cloudcannon-jekyll/jsonify-filter.rb # TODO remove this and fix warnings
data/HISTORY.md CHANGED
@@ -1,6 +1,13 @@
1
- # 1.4.3
2
-
3
- * Fix off-by-one depth for nested documents from last change
1
+ # 1.5.0
2
+
3
+ * Added drafts to collections in details
4
+ * Added drafts and data to collections in config
5
+ * Added category folder drafts and posts to collections in config
6
+ * Added `_path` field to each collection definition in config
7
+ * Removed some unused fields
8
+ * Renamed static to static-pages in details and removed `robots.txt` and `sitemap.xml` exceptions
9
+ * Add `url` to static-pages
10
+ * Normalise `_path` in static-pages
4
11
 
5
12
  # 1.4.2
6
13
 
@@ -10,7 +10,7 @@ require_relative "cloudcannon-jekyll/version"
10
10
 
11
11
  Liquid::Template.register_filter(CloudCannonJekyll::JsonifyFilter)
12
12
 
13
- if Jekyll::VERSION.start_with? "2"
13
+ if Jekyll::VERSION.start_with? "2."
14
14
  module Jekyll
15
15
  # Hooks didn't exist in Jekyll 2 so we monkey patch to get an :after_reset hook
16
16
  class Site
@@ -8,7 +8,7 @@
8
8
  "include": {{ config.include | cc_jsonify }},
9
9
  "exclude": {{ config.exclude | cc_jsonify }},
10
10
  {% if config.baseurl %}"base-url": {{ config.baseurl | cc_jsonify }},{% endif %}
11
- {% if config.collections %}"collections": {{ config.collections | cc_jsonify: 'collections' }},{% endif %}
11
+ "collections": {{ collections | cc_jsonify: 'collections' }},
12
12
  {% if config._comments %}"comments": {{ config._comments | cc_jsonify }},{% endif %}
13
13
  {% if config._options %}"input-options": {{ config._options | cc_jsonify }},{% endif %}
14
14
  {% if config.defaults %}"defaults": {{ config.defaults | cc_jsonify }},{% endif %}
@@ -8,7 +8,7 @@
8
8
  "include": {{ config.include | cc_jsonify }},
9
9
  "exclude": {{ config.exclude | cc_jsonify }},
10
10
  {% if config.baseurl %}"base-url": {{ config.baseurl | cc_jsonify }},{% endif %}
11
- {% if config.collections %}"collections": {{ config.collections | cc_jsonify: 'collections' }},{% endif %}
11
+ "collections": {{ collections | cc_jsonify: 'collections' }},
12
12
  {% if config._comments %}"comments": {{ config._comments | cc_jsonify }},{% endif %}
13
13
  {% if config._options %}"input-options": {{ config._options | cc_jsonify }},{% endif %}
14
14
  {% if config.defaults %}"defaults": {{ config.defaults | cc_jsonify }},{% endif %}
@@ -12,9 +12,7 @@
12
12
  {% if config.baseurl -%}
13
13
  "base-url": {{ config.baseurl | cc_jsonify }},
14
14
  {%- endif %}
15
- {% if config.collections -%}
16
- "collections": {{ config.collections | cc_jsonify: 'collections' }},
17
- {%- endif %}
15
+ "collections": {{ collections | cc_jsonify: 'collections' }},
18
16
  {% if config._comments -%}
19
17
  "comments": {{ config._comments | cc_jsonify }},
20
18
  {%- endif %}
@@ -18,10 +18,11 @@
18
18
  {% for data in site.data %}{% assign key = data[0] %}{% if site.cloudcannon.data[key] %}{% if data_seen %},{% endif %}{{ data[0] | cc_jsonify }}: {{ data[1] | cc_jsonify }}{% assign data_seen = true %}{% endif %}{% endfor %}},
19
19
  {% elsif site.cloudcannon.data %}"data": {{ site.data | cc_jsonify }},{% endif %}
20
20
  "collections": {
21
+ "drafts": {{ drafts | cc_jsonify }},
21
22
  "posts": {{ site.posts | reverse | cc_jsonify }}{% if site.collections.size > 0 %},{% endif %}
22
23
  {% for collection in site.collections %}"{{ collection[0] | xml_escape }}": {{ collection[1].docs | cc_jsonify }}{% unless forloop.last %},{% endunless %}
23
24
  {% endfor %}
24
25
  },
25
26
  "pages": {{ site.pages | cc_jsonify }},
26
- "static": {{ site.static_files | cc_static_files_jsonify }}
27
+ "static-pages": {{ site.static_files | cc_static_files_jsonify }}
27
28
  }
@@ -18,9 +18,10 @@
18
18
  {% for data in site.data %}{% assign key = data[0] %}{% if site.cloudcannon.data[key] %}{% if data_seen %},{% endif %}{{ data[0] | cc_jsonify }}: {{ data[1] | cc_jsonify }}{% assign data_seen = true %}{% endif %}{% endfor %}},
19
19
  {% elsif site.cloudcannon.data %}"data": {{ site.data | cc_jsonify }},{% endif %}
20
20
  "collections": {
21
+ "drafts": {{ drafts | cc_jsonify }}{% if site.collections.size > 0 %},{% endif %}
21
22
  {% for collection in site.collections %}"{{ collection.label | xml_escape }}": {{ collection.docs | cc_jsonify }}{% unless forloop.last %},{% endunless %}
22
23
  {% endfor %}
23
24
  },
24
25
  "pages": {{ site.pages | cc_jsonify }},
25
- "static": {{ site.static_files | cc_static_files_jsonify }}
26
+ "static-pages": {{ site.static_files | cc_static_files_jsonify }}
26
27
  }
@@ -30,11 +30,12 @@
30
30
  "data": {{ site.data | cc_jsonify }},
31
31
  {%- endif %}
32
32
  "collections": {
33
+ "drafts": {{ drafts | cc_jsonify }}{% if site.collections.size > 0 %},{% endif %}
33
34
  {%- for collection in site.collections -%}
34
35
  "{{ collection.label | xml_escape }}": {{ collection.docs | cc_jsonify }}
35
36
  {%- unless forloop.last %},{% endunless %}
36
37
  {%- endfor -%}
37
38
  },
38
39
  "pages": {{ site.pages | cc_jsonify }},
39
- "static": {{ site.static_files | cc_static_files_jsonify }}
40
+ "static-pages": {{ site.static_files | cc_static_files_jsonify }}
40
41
  }
@@ -17,7 +17,7 @@ module CloudCannonJekyll
17
17
  config = config.fix_common_issues if config.respond_to? :fix_common_issues
18
18
  config = config.add_default_excludes if config.respond_to? :add_default_excludes
19
19
 
20
- key = Jekyll::VERSION.start_with?("2") ? "gems" : "plugins"
20
+ key = Jekyll::VERSION.start_with?("2.") ? "gems" : "plugins"
21
21
 
22
22
  config[key] = Array(config[key])
23
23
  config[key].push("cloudcannon-jekyll") unless config[key].include? "cloudcannon-jekyll"
@@ -2,6 +2,7 @@
2
2
 
3
3
  require "jekyll"
4
4
  require "fileutils"
5
+ require_relative "reader"
5
6
 
6
7
  module CloudCannonJekyll
7
8
  # Generates JSON files containing build config and build output details
@@ -10,25 +11,111 @@ module CloudCannonJekyll
10
11
 
11
12
  def generate(site)
12
13
  @site = site
14
+ @reader = Reader.new(@site)
15
+
16
+ collections_config = @site.config["collections"].dup || {}
13
17
 
14
18
  payload = @site.site_payload.merge({
15
19
  "gem_version" => CloudCannonJekyll::VERSION,
20
+ })
21
+
22
+ drafts = add_blogging_config(collections_config)
23
+ add_collection_paths(collections_config)
24
+ add_data_config(collections_config)
25
+
26
+ generate_file("config", payload.merge({
16
27
  "pwd" => Dir.pwd,
17
28
  "config" => @site.config,
18
- })
29
+ "collections" => collections_config,
30
+ }))
31
+
32
+ generate_file("details", payload.merge({
33
+ "drafts" => drafts,
34
+ }))
35
+ end
19
36
 
20
- generate_file("details", payload)
21
- generate_file("config", payload)
37
+ def collections_dir
38
+ return "" if Jekyll::VERSION.start_with? "2."
22
39
 
23
- @site.keep_files ||= []
24
- @site.keep_files << path("details")
25
- @site.keep_files << path("config")
40
+ @site.config["collections_dir"] || ""
41
+ end
42
+
43
+ def data_dir
44
+ @site.config["data_dir"] || "_data"
45
+ end
46
+
47
+ def add_category_folder_config(collections_config, posts_config = {})
48
+ posts = @site.posts || @site.collections["posts"]
49
+ seen = {}
50
+
51
+ posts.map do |post|
52
+ parts = post.relative_path.split("/_posts/")
53
+ path = parts.first
54
+
55
+ # Ignore unless it's an unseen category folder post
56
+ next if parts.length < 2 || path.empty? || seen[path]
57
+
58
+ # Could check this to ensure raw files exist since posts can be generated without files
59
+ # next if @reader.read_posts(parts[0]).empty?
60
+
61
+ seen[path] = true
62
+ folder = path.sub(%r!^\/+!, "")
63
+ collections_path = "#{collections_dir}/#{folder}".gsub(%r!\/+!, "/").sub(%r!^\/+!, "")
64
+
65
+ collections_config["#{folder}/posts"] = posts_config.merge({
66
+ "_path" => "#{collections_path}/_posts",
67
+ })
68
+
69
+ # Adding the category draft config like this isn't ideal, since you could have drafts
70
+ # without posts, but it's a decent trade off vs looking for _drafts folders
71
+ collections_config["#{folder}/drafts"] = posts_config.merge({
72
+ "_path" => "#{collections_path}/_drafts",
73
+ })
74
+
75
+ path
76
+ end
77
+ end
78
+
79
+ # Add data to collections config if raw data files exist
80
+ def add_data_config(collections_config)
81
+ data_files = @reader.read_data(data_dir)
82
+ collections_config["data"] = { "_path" => data_dir } if data_files&.keys&.any?
83
+ end
84
+
85
+ # Add posts/drafts to collections config
86
+ def add_blogging_config(collections_config)
87
+ collections_config["posts"] = { "output" => true } if Jekyll::VERSION.start_with? "2."
88
+ drafts = @reader.read_drafts(collections_dir)
89
+
90
+ if collections_config.key?("posts")
91
+ collections_config["drafts"] = collections_config["posts"].dup
92
+ elsif drafts.any?
93
+ collections_config["drafts"] = {}
94
+ end
95
+
96
+ folders = add_category_folder_config(collections_config, collections_config["posts"])
97
+ folders.compact.each do |folder|
98
+ drafts += @reader.read_drafts(folder)
99
+ end
100
+
101
+ drafts
102
+ end
103
+
104
+ # Add _path to each collection config
105
+ def add_collection_paths(collections_config)
106
+ collections_config.each do |key, collection|
107
+ next if collection.key?("_path")
108
+
109
+ collection["_path"] = File.join(collections_dir, "_#{key}").sub(%r!^\/+!, "")
110
+ end
26
111
  end
27
112
 
28
113
  def generate_file(filename, data)
29
114
  dest = destination_path(filename)
30
115
  FileUtils.mkdir_p(File.dirname(dest))
31
116
  File.open(dest, "w") { |file| file.write(file_content(filename, data)) }
117
+ @site.keep_files ||= []
118
+ @site.keep_files << path(filename)
32
119
  end
33
120
 
34
121
  def version_path_suffix
@@ -6,7 +6,6 @@ module CloudCannonJekyll
6
6
  # Filter for converting Jekyll objects into JSON
7
7
  module JsonifyFilter
8
8
  STATIC_EXTENSIONS = [".html", ".htm"].freeze
9
- STATIC_PATHS = ["/robots.txt", "/sitemap.xml"].freeze
10
9
 
11
10
  CC_JSONIFY_KEY_SWAPS = {
12
11
  "collections" => {
@@ -46,17 +45,14 @@ module CloudCannonJekyll
46
45
  end
47
46
 
48
47
  def self.static_file_to_json(input, depth, max_depth)
48
+ path = input.relative_path.sub(%r!^\/+!, "")
49
+ url = Jekyll::VERSION.start_with?("2.") ? "/#{path}" : input.url
50
+
49
51
  out = [
50
- "\"extname\": #{JsonifyFilter.to_json(input.extname, depth, max_depth)}",
51
- "\"path\": #{JsonifyFilter.to_json(input.relative_path, depth, max_depth)}",
52
+ "\"path\": #{JsonifyFilter.to_json(path, depth, max_depth)}",
53
+ "\"url\": #{JsonifyFilter.to_json(url, depth, max_depth)}",
52
54
  ]
53
55
 
54
- # modified_time isn't defined in Jekyll 2.4.0
55
- if input.respond_to? :modified_time
56
- file_json = JsonifyFilter.to_json(input.modified_time, depth, max_depth)
57
- out.push("\"modified_time\": #{file_json}")
58
- end
59
-
60
56
  "{#{out.join(",")}}"
61
57
  end
62
58
 
@@ -77,7 +73,6 @@ module CloudCannonJekyll
77
73
  prevent = %w(dir name path url date id categories tags)
78
74
 
79
75
  out = [
80
- "\"dir\": #{JsonifyFilter.to_json(input.dir, depth, max_depth)}",
81
76
  "\"name\": #{JsonifyFilter.to_json(input.name, depth, max_depth)}",
82
77
  "\"path\": #{JsonifyFilter.to_json(input.path, depth, max_depth)}",
83
78
  "\"url\": #{JsonifyFilter.to_json(input.url, depth, max_depth)}",
@@ -95,7 +90,6 @@ module CloudCannonJekyll
95
90
  prevent = %w(dir name path url)
96
91
 
97
92
  out = [
98
- "\"dir\": #{JsonifyFilter.to_json(input.dir, depth, max_depth)}",
99
93
  "\"name\": #{JsonifyFilter.to_json(input.name, depth, max_depth)}",
100
94
  "\"path\": #{JsonifyFilter.to_json(input.path, depth, max_depth)}",
101
95
  "\"url\": #{JsonifyFilter.to_json(input.url, depth, max_depth)}",
@@ -114,11 +108,9 @@ module CloudCannonJekyll
114
108
 
115
109
  def self.document_to_json(input, depth, max_depth)
116
110
  prevent = %w(dir id relative_path url collection)
117
- path_json = JsonifyFilter.to_json(input.relative_path, depth, max_depth)
118
111
 
119
112
  out = [
120
- "\"path\": #{path_json}",
121
- "\"relative_path\": #{path_json}",
113
+ "\"path\": #{JsonifyFilter.to_json(input.relative_path, depth, max_depth)}",
122
114
  "\"url\": #{JsonifyFilter.to_json(input.url, depth, max_depth)}",
123
115
  ]
124
116
 
@@ -128,11 +120,6 @@ module CloudCannonJekyll
128
120
  out.push("\"collection\": #{collection_json}")
129
121
  end
130
122
 
131
- # id isn't defined in Jekyll 2.4.0
132
- if input.respond_to? :id
133
- out.push("\"id\": #{JsonifyFilter.to_json(input.id, depth, max_depth)}")
134
- end
135
-
136
123
  out += JsonifyFilter.document_data_to_a(input.data, prevent, depth, max_depth)
137
124
  "{#{out.join(",")}}"
138
125
  end
@@ -180,7 +167,7 @@ module CloudCannonJekyll
180
167
  def self.to_json(input, depth, max_depth = 9, key_swaps = {})
181
168
  depth += 1
182
169
 
183
- if depth > max_depth || (depth > 3 && JsonifyFilter.document_type?(input))
170
+ if depth > max_depth || (depth > 2 && JsonifyFilter.document_type?(input))
184
171
  '"MAXIMUM_DEPTH"'
185
172
  elsif JsonifyFilter.simple_type?(input)
186
173
  input.to_json
@@ -203,9 +190,7 @@ module CloudCannonJekyll
203
190
 
204
191
  def cc_static_files_jsonify(input)
205
192
  out = input.map do |page|
206
- next unless STATIC_EXTENSIONS.include?(page.extname) || STATIC_PATHS.include?(page.path)
207
-
208
- JsonifyFilter.to_json(page, 1)
193
+ JsonifyFilter.to_json(page, 1) if STATIC_EXTENSIONS.include?(page.extname)
209
194
  end
210
195
 
211
196
  out.compact!
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "jekyll"
4
+
5
+ if !Jekyll::VERSION.start_with? "2."
6
+ require_relative "readers/data-reader"
7
+ else
8
+ require_relative "readers/old-data-reader"
9
+ end
10
+
11
+ module CloudCannonJekyll
12
+ # Wraps read functions into one class
13
+ class Reader
14
+ attr_reader :site
15
+
16
+ def initialize(site)
17
+ @site = site
18
+ end
19
+
20
+ def read_data(dir = "_data")
21
+ if Jekyll::VERSION.start_with? "2."
22
+ CloudCannonJekyll::OldDataReader.new(@site).read(dir)
23
+ else
24
+ CloudCannonJekyll::DataReader.new(@site).read(dir)
25
+ end
26
+ end
27
+
28
+ def read_drafts(dir = "")
29
+ if Jekyll::VERSION.start_with? "2."
30
+ @site.read_content(dir, "_drafts", Jekyll::Draft)
31
+ else
32
+ Jekyll::PostReader.new(@site).read_drafts(dir)
33
+ end
34
+ end
35
+
36
+ def read_posts(dir = "")
37
+ if Jekyll::VERSION.start_with? "2."
38
+ @site.read_content(dir, "_posts", Jekyll::Post)
39
+ else
40
+ Jekyll::PostReader.new(@site).read_posts(dir)
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "jekyll"
4
+
5
+ module CloudCannonJekyll
6
+ # Reads data files and creates a collections-style hash representation
7
+ class DataReader < Jekyll::DataReader
8
+ # Determines how to read a data file.
9
+ # This is overridden return a hash instead of reading the file.
10
+ #
11
+ # Returns a hash with the path to the data file.
12
+ def read_data_file(path)
13
+ {
14
+ "path" => path,
15
+ }
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "jekyll"
4
+
5
+ module CloudCannonJekyll
6
+ # Reads data files and creates a collections-style hash representation
7
+ # Aims to replicate the data reading logic in Jekyll 2.5
8
+ class OldDataReader
9
+ attr_reader :site
10
+
11
+ def initialize(site)
12
+ @site = site
13
+ @safe = site.safe
14
+ @content = {}
15
+ end
16
+
17
+ def read(dir)
18
+ base = Jekyll.sanitized_path(@site.source, dir)
19
+ read_data_to(base, @content)
20
+ @content
21
+ end
22
+
23
+ def read_data_to(dir, data)
24
+ return unless File.directory?(dir) && (!@safe || !File.symlink?(dir))
25
+
26
+ entries = Dir.chdir(dir) do
27
+ Dir["*.{yaml,yml,json,csv}"] + Dir["*"].select { |fn| File.directory?(fn) }
28
+ end
29
+
30
+ entries.each do |entry|
31
+ path = Jekyll.sanitized_path(dir, entry)
32
+ next if File.symlink?(path) && @safe
33
+
34
+ key = sanitize_filename(File.basename(entry, ".*"))
35
+ if File.directory?(path)
36
+ read_data_to(path, data[key] = {})
37
+ else
38
+ data[key] = read_data_file(path)
39
+ end
40
+ end
41
+ end
42
+
43
+ def read_data_file(path)
44
+ {
45
+ "path" => path,
46
+ }
47
+ end
48
+
49
+ def sanitize_filename(name)
50
+ name.gsub!(%r![^\w\s_-]+!, "")
51
+ name.gsub!(%r!(^|\b\s)\s+($|\s?\b)!, '\\1\\2')
52
+ name.gsub(%r!\s+!, "_")
53
+ end
54
+ end
55
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module CloudCannonJekyll
4
- VERSION = "1.4.3"
4
+ VERSION = "1.5.0"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cloudcannon-jekyll
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.3
4
+ version: 1.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - CloudCannon
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-11-02 00:00:00.000000000 Z
11
+ date: 2020-11-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jekyll
@@ -107,6 +107,7 @@ executables: []
107
107
  extensions: []
108
108
  extra_rdoc_files: []
109
109
  files:
110
+ - ".github/workflows/stale.yml"
110
111
  - ".gitignore"
111
112
  - ".reek.yml"
112
113
  - ".rspec"
@@ -129,6 +130,9 @@ files:
129
130
  - lib/cloudcannon-jekyll/generator.rb
130
131
  - lib/cloudcannon-jekyll/jsonify-filter.rb
131
132
  - lib/cloudcannon-jekyll/page-without-a-file.rb
133
+ - lib/cloudcannon-jekyll/reader.rb
134
+ - lib/cloudcannon-jekyll/readers/data-reader.rb
135
+ - lib/cloudcannon-jekyll/readers/old-data-reader.rb
132
136
  - lib/cloudcannon-jekyll/version.rb
133
137
  - script/ci-smoke-test
134
138
  - script/cibuild