bridgetown_notion 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (28) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/CHANGELOG.md +11 -1
  4. data/Gemfile +3 -0
  5. data/README.md +31 -14
  6. data/bridgetown_notion.gemspec +1 -0
  7. data/lib/bridgetown_notion/builder.rb +10 -67
  8. data/lib/bridgetown_notion/markdown_generators/bulleted_list_item_markdown_generator.rb +11 -0
  9. data/lib/bridgetown_notion/markdown_generators/heading_1_markdown_generator.rb +11 -0
  10. data/lib/bridgetown_notion/markdown_generators/heading_2_markdown_generator.rb +11 -0
  11. data/lib/bridgetown_notion/markdown_generators/heading_3_markdown_generator.rb +11 -0
  12. data/lib/bridgetown_notion/markdown_generators/heading_4_markdown_generator.rb +11 -0
  13. data/lib/bridgetown_notion/markdown_generators/heading_5_markdown_generator.rb +11 -0
  14. data/lib/bridgetown_notion/markdown_generators/heading_6_markdown_generator.rb +11 -0
  15. data/lib/bridgetown_notion/markdown_generators/paragraph_markdown_generator.rb +11 -0
  16. data/lib/bridgetown_notion/notion_posts_factory.rb +43 -0
  17. data/lib/bridgetown_notion/parsers/block_parser.rb +25 -0
  18. data/lib/bridgetown_notion/parsers/categories_parser.rb +12 -0
  19. data/lib/bridgetown_notion/parsers/content_parser.rb +27 -0
  20. data/lib/bridgetown_notion/parsers/is_published_parser.rb +11 -0
  21. data/lib/bridgetown_notion/parsers/post_parser.rb +28 -0
  22. data/lib/bridgetown_notion/parsers/published_at_parser.rb +11 -0
  23. data/lib/bridgetown_notion/parsers/slug_parser.rb +13 -0
  24. data/lib/bridgetown_notion/parsers/tags_parser.rb +12 -0
  25. data/lib/bridgetown_notion/parsers/title_parser.rb +11 -0
  26. data/lib/bridgetown_notion/version.rb +1 -1
  27. data/lib/bridgetown_notion.rb +12 -0
  28. metadata +34 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2e86e10243ccaea80727bc54084c1c071d407c49d4a7fac41a4c9aa5983321b7
4
- data.tar.gz: 61973da5ac8daf87996a88d826d03be727255431c2e4ed8a5304047186ed5f92
3
+ metadata.gz: 54259116b5b744f64ed97d979eb96a7b5fc32908e101ebceb966e5ff850f2614
4
+ data.tar.gz: 6766dd525ac714f6cdc49410148204f124a34bd21a600bd591cb2aff54e37d64
5
5
  SHA512:
6
- metadata.gz: 6bb6f9beecc295140d9bc4edda7019891aeb50b77c151d7be34075adec1a36fd3b92924ae70f94bb1640eb81c4141397217d29e19e0768468ceb3c35686a3abe
7
- data.tar.gz: e2416855fad78e9f31d437fa539ca9ac1e447cf89906147a773d5d5ba231b7ed56cbef71285a2f4404e6934a7021d6ca8b87a55dcda392366a537d62ed799a83
6
+ metadata.gz: d5d2d274bc28e7965666163509781ebf62f92f10911f4d2ad0b909240531fc7a16e814c6dc687fdb7733c22a28c42134b57129317bee2414f8344401616da0e1
7
+ data.tar.gz: '04903b167f5f58f59ef1f2558c4a296212d15138236dc4ef5b3e5c965979c5ca652ce1f0151d9cea6c60dcda25abd4c7103b1a42f13eeefec3d561116be04f7b'
data/.gitignore CHANGED
@@ -18,6 +18,7 @@ Gemfile.lock
18
18
  .bundle
19
19
  .ruby-version
20
20
  .tool-versions
21
+ .solargraph.yml
21
22
 
22
23
  # Node
23
24
  node_modules
data/CHANGELOG.md CHANGED
@@ -7,7 +7,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
- -
10
+ ## [0.2.0] - 2023-03-13
11
+
12
+ ### Added
13
+
14
+ - Add new initializer config, backwards compatible with previous env implementation.
15
+ - Add activesupport dependecy for help with changing letter cases.
16
+
17
+ ### Fixed
18
+
19
+ - Fix invalid URI bug. By returning a slug property from the posts factory we can ensure
20
+ that we don't attempt to create posts with spaces in the file name.
11
21
 
12
22
  ## [0.1.0] - 2023-02-04
13
23
 
data/Gemfile CHANGED
@@ -6,7 +6,10 @@ gemspec
6
6
  gem "bridgetown", ENV["BRIDGETOWN_VERSION"] if ENV["BRIDGETOWN_VERSION"]
7
7
 
8
8
  group :test do
9
+ gem "debug", ">= 1.0.0"
9
10
  gem "minitest"
10
11
  gem "minitest-reporters"
11
12
  gem "shoulda"
13
+ gem "timecop"
14
+ gem "webmock"
12
15
  end
data/README.md CHANGED
@@ -1,34 +1,51 @@
1
- # Sample plugin for Bridgetown
1
+ # Bridgetown Notions CMS Plugin
2
2
 
3
- _NOTE: This isn't a real plugin! Copy this sample code and use it to create your own Ruby gem! [Help guide here…](https://www.bridgetownrb.com/docs/plugins)_ 😃
3
+ A Bridgetown plugin to pull content directly out of a Notion database. Each page in the
4
+ Notion database is added to your posts collection in Bridgetown.
4
5
 
5
- _You can run_ `bridgetown plugins new` _to easily set up a customized verison of this starter repo._
6
-
7
- A Bridgetown plugin to [fill in the blank]…
8
6
 
9
7
  ## Installation
10
8
 
11
- Run this command to add this plugin to your site's Gemfile:
9
+ 1. Run this command to add this plugin to your site's Gemfile:
12
10
 
13
11
  ```shell
14
- $ bundle add my-awesome-plugin -g bridgetown_plugins
12
+ $ bundle add bridgetown_notion
15
13
  ```
16
14
 
17
- Or if there's a `bridgetown.automation.rb` automation script, you can run that instead for guided setup:
15
+ 2. Add the following to your site's `config/initializers.rb`:
18
16
 
19
- ```shell
20
- $ bin/bridgetown apply https://github.com/username/my-awesome-plugin
17
+ ```ruby
18
+ Bridgetown.configure do |config|
19
+ init :bridgetown_notion do
20
+ notion_key '<your-notion-connection-key>'
21
+ notion_db_id '<your-notion-db-id>'
22
+ end
23
+ end
21
24
  ```
22
25
 
26
+ You should consider using environment variables to store the `notion_key` and `notion_db_id`.
27
+ It is generally a bad practice to store credentials in version control.
28
+
23
29
  ## Usage
24
30
 
25
- The plugin will…
31
+ ### Notion Setup
32
+
33
+ [bridgetown_notion](https://github.com/fbuys/bridgetown_notion) assumes that you have a Notion
34
+ database table with the following fileds:
26
35
 
27
- ### Optional configuration options
36
+ | Field | Type |
37
+ |-|-|
38
+ | title (required | Title |
39
+ | published_at (required) | Date |
40
+ | published | Checkbox |
41
+ | categories | Multi-selet |
42
+ | tags | Multi-selet |
43
+ | author | Select |
28
44
 
29
- The plugin will automatically use any of the following metadata variables if they are present in your site's `_data/site_metadata.yml` file.
45
+ Note the case of the fields as this is important.
30
46
 
31
-
47
+ You would also need to create a Notion connection that provides read access to the specific
48
+ database. You can find the [instructions for adding a connection over here](https://www.notion.so/help/add-and-manage-connections-with-the-api).
32
49
 
33
50
  ## Testing
34
51
 
@@ -19,6 +19,7 @@ Gem::Specification.new do |spec|
19
19
 
20
20
  spec.add_dependency "bridgetown", ">= 1.0", "< 2.0"
21
21
  spec.add_dependency "notion-ruby-client", ">= 1.0", "< 2.0"
22
+ spec.add_dependency "activesupport"
22
23
 
23
24
  spec.add_development_dependency "bundler"
24
25
  spec.add_development_dependency "rake", ">= 13.0"
@@ -1,78 +1,21 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "bridgetown_notion/notion_posts_factory"
4
+
3
5
  module BridgetownNotion
4
6
  class Builder < Bridgetown::Builder
5
- # rubocop:disable Metrics/CyclomaticComplexity, Metrics/AbcSize, Metrics/PerceivedComplexity, Metrics/MethodLength
6
7
  def build
7
- Notion.configure do |config|
8
- config.token = ENV.fetch("NOTION_KEY")
9
- end
10
-
11
- client = Notion::Client.new
12
-
13
- client.database_query(database_id: ENV.fetch("NOTION_DB_ID")) do |posts_page|
14
- posts_page.results.each do |post|
15
- title = post.dig("properties", "title", "title", 0, "text", "content")
16
- categories = (post.dig("properties", "categories", "multi_select") || [])
17
- .map { |c| c["name"] }.join(" ")
18
- tags = (post.dig("properties", "tags", "multi_select") || [])
19
- .map { |t| t["name"] }.join(" ")
20
- is_published = post["properties"]["published"]["checkbox"]
21
- published_at = post.dig("properties", "published_at", "date", "start")
22
- content = ""
23
-
24
- next if published_at.nil? || title.nil?
25
-
26
- client.block_children(block_id: post.id) do |blocks_page|
27
- blocks_page.results.each do |block|
28
- content += extract_content(block)
29
- end
30
- end
31
-
32
- add_resource :posts, "#{published_at}-#{title}.md" do
33
- categories categories
34
- content content
35
- layout :post
36
- published is_published
37
- tags tags
38
- title title
39
- end
8
+ BridgetownNotion::NotionPostsFactory.create_posts(config.bridgetown_notion).each do |post|
9
+ add_resource :posts, "#{post[:slug]}.md" do
10
+ categories post[:categories]
11
+ content post[:content]
12
+ layout :post
13
+ published post[:is_published]
14
+ tags post[:tags]
15
+ title post[:title]
40
16
  end
41
17
  end
42
18
  end
43
- # rubocop:enable Metrics/CyclomaticComplexity, Metrics/AbcSize, Metrics/PerceivedComplexity, Metrics/MethodLength
44
-
45
- private
46
-
47
- # rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
48
- def extract_content(block)
49
- result = block.dig("heading_1", "rich_text", 0, "text", "content")
50
- return "# #{result}\n" if result
51
-
52
- result = block.dig("heading_2", "rich_text", 0, "text", "content")
53
- return "## #{result}\n" if result
54
-
55
- result = block.dig("heading_3", "rich_text", 0, "text", "content")
56
- return "### #{result}\n" if result
57
-
58
- result = block.dig("heading_4", "rich_text", 0, "text", "content")
59
- return "#### #{result}\n" if result
60
-
61
- result = block.dig("heading_5", "rich_text", 0, "text", "content")
62
- return "##### #{result}\n" if result
63
-
64
- result = block.dig("heading_6", "rich_text", 0, "text", "content")
65
- return "###### #{result}\n" if result
66
-
67
- result = block.dig("paragraph", "rich_text", 0, "text", "content")
68
- return "#{result}\n" if result
69
-
70
- result = block.dig("bulleted_list_item", "rich_text", 0, "text", "content")
71
- return "- #{result}\n" if result
72
-
73
- "\n"
74
- end
75
- # rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
76
19
  end
77
20
  end
78
21
 
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BridgetownNotion
4
+ module MarkdownGenerators
5
+ class BulletedListItemMarkdownGenerator
6
+ def self.generate(text)
7
+ "- #{text}\n"
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BridgetownNotion
4
+ module MarkdownGenerators
5
+ class Heading1MarkdownGenerator
6
+ def self.generate(text)
7
+ "# #{text}\n"
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BridgetownNotion
4
+ module MarkdownGenerators
5
+ class Heading2MarkdownGenerator
6
+ def self.generate(text)
7
+ "## #{text}\n"
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BridgetownNotion
4
+ module MarkdownGenerators
5
+ class Heading3MarkdownGenerator
6
+ def self.generate(text)
7
+ "### #{text}\n"
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BridgetownNotion
4
+ module MarkdownGenerators
5
+ class Heading4MarkdownGenerator
6
+ def self.generate(text)
7
+ "#### #{text}\n"
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BridgetownNotion
4
+ module MarkdownGenerators
5
+ class Heading5MarkdownGenerator
6
+ def self.generate(text)
7
+ "##### #{text}\n"
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BridgetownNotion
4
+ module MarkdownGenerators
5
+ class Heading6MarkdownGenerator
6
+ def self.generate(text)
7
+ "###### #{text}\n"
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BridgetownNotion
4
+ module MarkdownGenerators
5
+ class ParagraphMarkdownGenerator
6
+ def self.generate(text)
7
+ "#{text}\n"
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BridgetownNotion
4
+ class NotionPostsFactory
5
+ # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
6
+ def self.create_posts(config)
7
+ notion_key = config.notion_key
8
+ notion_db_id = config.notion_db_id
9
+
10
+ Notion.configure do |notion|
11
+ notion.token = notion_key
12
+ end
13
+
14
+ notion_client = Notion::Client.new
15
+
16
+ result = []
17
+
18
+ notion_client.database_query(database_id: notion_db_id) do |posts_page|
19
+ posts_page.results.each do |post|
20
+ notion_client.block_children(block_id: post.id) do |blocks_page|
21
+ post["blocks"] = [*post["blocks"], *blocks_page.results]
22
+ end
23
+
24
+ parsed_post = BridgetownNotion::Parsers::PostParser.parse(post)
25
+
26
+ next if parsed_post.published_at.nil? || parsed_post.title.nil?
27
+
28
+ result.push({
29
+ categories: parsed_post.categories,
30
+ content: parsed_post.content,
31
+ is_published: parsed_post.is_published,
32
+ slug: parsed_post.slug,
33
+ tags: parsed_post.tags,
34
+ title: parsed_post.title,
35
+ })
36
+ end
37
+ end
38
+
39
+ result
40
+ end
41
+ # rubocop:enable Metrics/AbcSize, Metrics/MethodLength
42
+ end
43
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BridgetownNotion
4
+ module Parsers
5
+ class BlockParser
6
+ def self.parse(block)
7
+ for_each_block_type do |block_type|
8
+ content = block.dig(block_type, "rich_text", 0, "text", "content")
9
+ return [block_type, content] if content
10
+ end
11
+ []
12
+ end
13
+
14
+ private_class_method def self.for_each_block_type
15
+ pattern = %r{(?<block_type>\w+)(?!.*/)_markdown_generator.rb}
16
+ markdown_generator_files = Dir[
17
+ "#{File.dirname(__FILE__)}/../markdown_generators/**/*_markdown_generator.rb"
18
+ ]
19
+ markdown_generator_files.each do |file|
20
+ yield file.match(pattern)[:block_type].to_s
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BridgetownNotion
4
+ module Parsers
5
+ class CategoriesParser
6
+ def self.parse(post)
7
+ categories = (post.dig("properties", "categories", "multi_select") || [])
8
+ categories.map { |c| c["name"] }.join(" ")
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/core_ext/string/inflections"
4
+
5
+ module BridgetownNotion
6
+ module Parsers
7
+ class ContentParser
8
+ def self.parse(post)
9
+ content = ""
10
+ blocks = post.fetch("blocks", [])
11
+ blocks.each do |block|
12
+ content += get_content(block)
13
+ end
14
+ content
15
+ end
16
+
17
+ private_class_method def self.get_content(block)
18
+ block_type, content = BridgetownNotion::Parsers::BlockParser.parse(block)
19
+ Object.const_get(
20
+ "BridgetownNotion::MarkdownGenerators::#{block_type.camelize}MarkdownGenerator"
21
+ ).generate(content)
22
+ rescue StandardError
23
+ "\n"
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BridgetownNotion
4
+ module Parsers
5
+ class IsPublishedParser
6
+ def self.parse(post)
7
+ post.dig("properties", "published", "checkbox") || false
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/core_ext/string/inflections"
4
+
5
+ module BridgetownNotion
6
+ module Parsers
7
+ class PostParser
8
+ def initialize(post)
9
+ @post = post
10
+ end
11
+
12
+ def self.parse(post)
13
+ new(post)
14
+ end
15
+
16
+ def method_missing(method_name)
17
+ parser = method_name.to_s.camelize
18
+ Object.const_get("BridgetownNotion::Parsers::#{parser}Parser").parse(@post)
19
+ end
20
+
21
+ def respond_to_missing?(method_name)
22
+ Dir["./**/*_parser.rb"].each do |f|
23
+ return true if f.include?(method_name)
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BridgetownNotion
4
+ module Parsers
5
+ class PublishedAtParser
6
+ def self.parse(post)
7
+ post.dig("properties", "published_at", "date", "start")
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BridgetownNotion
4
+ module Parsers
5
+ class SlugParser
6
+ def self.parse(post)
7
+ published_at = BridgetownNotion::Parsers::PublishedAtParser.parse(post)
8
+ title = BridgetownNotion::Parsers::TitleParser.parse(post)
9
+ "#{published_at}-#{title}".downcase.strip.tr(" ", "-").gsub(%r/[^\w-]/, "")
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BridgetownNotion
4
+ module Parsers
5
+ class TagsParser
6
+ def self.parse(post)
7
+ tags = (post.dig("properties", "tags", "multi_select") || [])
8
+ tags.map { |t| t["name"] }.join(" ")
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BridgetownNotion
4
+ module Parsers
5
+ class TitleParser
6
+ def self.parse(post)
7
+ post.dig("properties", "title", "title", 0, "text", "content")
8
+ end
9
+ end
10
+ end
11
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module BridgetownNotion
4
- VERSION = "0.1.0"
4
+ VERSION = "0.2.0"
5
5
  end
@@ -3,3 +3,15 @@
3
3
  require "bridgetown"
4
4
  require "bridgetown_notion/builder"
5
5
  require "notion-ruby-client"
6
+ require "zeitwerk"
7
+
8
+ loader = Zeitwerk::Loader.for_gem
9
+ loader.setup
10
+
11
+ Bridgetown.initializer :bridgetown_notion do |config, notion_key:, notion_db_id:|
12
+ config.bridgetown_notion ||= {}
13
+ config.bridgetown_notion.notion_key ||= notion_key || ENV.fetch("NOTION_KEY")
14
+ config.bridgetown_notion.notion_db_id ||= notion_db_id || ENV.fetch("NOTION_DB_ID")
15
+
16
+ config.builder BridgetownNotion::Builder
17
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bridgetown_notion
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Francois Buys
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-02-04 00:00:00.000000000 Z
11
+ date: 2023-03-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bridgetown
@@ -50,6 +50,20 @@ dependencies:
50
50
  - - "<"
51
51
  - !ruby/object:Gem::Version
52
52
  version: '2.0'
53
+ - !ruby/object:Gem::Dependency
54
+ name: activesupport
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: '0'
60
+ type: :runtime
61
+ prerelease: false
62
+ version_requirements: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ version: '0'
53
67
  - !ruby/object:Gem::Dependency
54
68
  name: bundler
55
69
  requirement: !ruby/object:Gem::Requirement
@@ -109,6 +123,24 @@ files:
109
123
  - bridgetown_notion.gemspec
110
124
  - lib/bridgetown_notion.rb
111
125
  - lib/bridgetown_notion/builder.rb
126
+ - lib/bridgetown_notion/markdown_generators/bulleted_list_item_markdown_generator.rb
127
+ - lib/bridgetown_notion/markdown_generators/heading_1_markdown_generator.rb
128
+ - lib/bridgetown_notion/markdown_generators/heading_2_markdown_generator.rb
129
+ - lib/bridgetown_notion/markdown_generators/heading_3_markdown_generator.rb
130
+ - lib/bridgetown_notion/markdown_generators/heading_4_markdown_generator.rb
131
+ - lib/bridgetown_notion/markdown_generators/heading_5_markdown_generator.rb
132
+ - lib/bridgetown_notion/markdown_generators/heading_6_markdown_generator.rb
133
+ - lib/bridgetown_notion/markdown_generators/paragraph_markdown_generator.rb
134
+ - lib/bridgetown_notion/notion_posts_factory.rb
135
+ - lib/bridgetown_notion/parsers/block_parser.rb
136
+ - lib/bridgetown_notion/parsers/categories_parser.rb
137
+ - lib/bridgetown_notion/parsers/content_parser.rb
138
+ - lib/bridgetown_notion/parsers/is_published_parser.rb
139
+ - lib/bridgetown_notion/parsers/post_parser.rb
140
+ - lib/bridgetown_notion/parsers/published_at_parser.rb
141
+ - lib/bridgetown_notion/parsers/slug_parser.rb
142
+ - lib/bridgetown_notion/parsers/tags_parser.rb
143
+ - lib/bridgetown_notion/parsers/title_parser.rb
112
144
  - lib/bridgetown_notion/version.rb
113
145
  homepage: https://github.com/fbuys/bridgetown_notion
114
146
  licenses: