cloudcannon-jekyll 1.4.3 → 1.5.0

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