jekyll-notion-import 0.0.1

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 12baae0fb76a11d3e3be5c043d2ff12f565f790036179d49bba106a7191f2766
4
+ data.tar.gz: 78c2c572cfbda808a0686ae994742c8d0ebe79a42815aeab8e31b8781dc38141
5
+ SHA512:
6
+ metadata.gz: 87de63514836198f82870a4037b3499687847a94011fefa34674cd8a12687f97d755a1102683433781829498e4ce9f92bb9e44ef789a47a6c7bda9a27f0f9d3d
7
+ data.tar.gz: 47fb0188ef5340c05c88ab93f654ac73d813ece0671000b5f33c6d5899416a9a3ddbdf40f4c8e05bf6d2e8c01126ff8eb74f61393be7cd384cb835db3165f420
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Jekyll
4
+ module Commands
5
+ class NotionImportCommand < Command
6
+ def self.init_with_program(prog)
7
+ prog.command(:notion_import) do |c|
8
+ c.syntax "notion_import"
9
+ c.description "Imports posts from notion"
10
+
11
+ options.each { |opt| c.option(*opt) }
12
+
13
+ c.action { |args, options| process(args, options) }
14
+ end
15
+ end
16
+
17
+ def self.options
18
+ []
19
+ end
20
+
21
+ def self.process(args = [], options = {})
22
+ config = Jekyll.configuration(options)
23
+
24
+ Jekyll::NotionImport::Import.perform(config:)
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Jekyll
4
+ module NotionImport
5
+ class Database
6
+ def initialize(config: {})
7
+ @notion = Notion::Client.new
8
+ @config = config
9
+ end
10
+
11
+ def id
12
+ config["id"]
13
+ end
14
+
15
+ # Returns an empty array or a NotionToMd:Page array
16
+ def fetch
17
+ return [] unless id?
18
+
19
+ @fetch ||= notion.database_query(query)[:results].map do |page|
20
+ page = NotionToMd::Page.new(:page => page, :blocks => build_blocks(page.id))
21
+ end
22
+ end
23
+
24
+ def filter
25
+ config["filter"]
26
+ end
27
+
28
+ def sorts
29
+ if config["sort"]
30
+ Jekyll.logger.warn("Jekyll Notion:", "sort property is deprecated, use sorts instead")
31
+ end
32
+ config["sorts"]
33
+ end
34
+
35
+ def collection_name
36
+ config["collection"] || "posts"
37
+ end
38
+
39
+ def data_name
40
+ config["data"]
41
+ end
42
+
43
+ private
44
+
45
+ attr_reader :config, :notion
46
+
47
+ def query
48
+ { :database_id => id, :filter => filter, :sorts => sorts }.compact
49
+ end
50
+
51
+ def id?
52
+ if id.nil? || id.empty?
53
+ Jekyll.logger.warn("Jekyll Notion:",
54
+ "Database or page id is not provided. Cannot read from Notion.")
55
+ return false
56
+ end
57
+ true
58
+ end
59
+
60
+ def build_blocks(block_id)
61
+ NotionToMd::Blocks.build(block_id: block_id) do |nested_id|
62
+ @notion.block_children({ :block_id => nested_id })
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Jekyll
4
+ module NotionImport
5
+ class Import
6
+ def self.perform(...)
7
+ new(...).tap(&:perform)
8
+ end
9
+
10
+ def initialize(config:)
11
+ @config = config["notion"] || {}
12
+ end
13
+
14
+ def perform
15
+ return unless notion_token? && config?
16
+
17
+ config["databases"].each do |database_config|
18
+ database = Database.new(config: database_config)
19
+
20
+ database.fetch.each do |page|
21
+ Post.new(
22
+ collection_name: database.collection_name,
23
+ page:
24
+ ).import
25
+ end
26
+ end
27
+ end
28
+
29
+ private
30
+
31
+ attr_reader :config
32
+
33
+ def notion_token?
34
+ return true unless ENV["NOTION_TOKEN"].blank?
35
+
36
+ Jekyll.logger.warn("Jekyll Notion Import:",
37
+ "NOTION_TOKEN not provided. Cannot read from Notion.")
38
+ false
39
+ end
40
+
41
+ def config?
42
+ return true unless config.empty?
43
+
44
+ Jekyll.logger.warn("Jekyll Notion:", "No config provided.")
45
+ false
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Jekyll
4
+ module NotionImport
5
+ class Post
6
+ def initialize(collection_name:, page:)
7
+ @page = page
8
+ @collection_name = collection_name
9
+ end
10
+
11
+ def import
12
+ unless Dir.exist?(collection_directory)
13
+ Jekyll.logger.info("Jekyll Notion Import:", "Create #{collection_directory}")
14
+ FileUtils.mkdir_p(collection_directory)
15
+ end
16
+
17
+
18
+ if file_exists?
19
+ file_last_updated = DateTime.parse(YAML.load(File.read(path))["last_edited_time"])
20
+
21
+ return if file_last_updated >= page.last_edited_time
22
+ end
23
+
24
+ Jekyll.logger.info("Jekyll Notion Import:", "Import #{file_name}")
25
+
26
+ write_file
27
+ end
28
+
29
+ def write_file
30
+ File.open(path, "w") do |f|
31
+ f.puts(front_matter)
32
+ f.puts(page.body)
33
+ end
34
+ end
35
+
36
+ def file_exists?
37
+ File.exists?(path)
38
+ end
39
+
40
+ def file_name
41
+ @filename ||= "#{publish_date.strftime("%Y-%m-%d")}-#{Jekyll::Utils.slugify(page.title)}.md"
42
+ end
43
+
44
+ def publish_date
45
+ @publish_date ||= Date.parse(page.props["published"])
46
+ end
47
+
48
+ def path
49
+ @path ||= File.join(collection_directory, file_name)
50
+ end
51
+
52
+ def collection_directory
53
+ @collection_directory ||= "_#{collection_name}"
54
+ end
55
+
56
+ def front_matter
57
+ @front_matter ||= YAML.dump(
58
+ page.props.transform_values {|v| v.is_a?(DateTime) ? v.iso8601 : v}
59
+ ) + "---\n\n"
60
+ end
61
+
62
+ private
63
+
64
+ attr_reader :page, :collection_name
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Jekyll
4
+ module NotionImport
5
+ VERSION = "0.0.1"
6
+ end
7
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "notion"
4
+ require "notion_to_md"
5
+
6
+ require "jekyll-notion-import/version"
7
+ require "jekyll-notion-import/database"
8
+ require "jekyll-notion-import/post"
9
+ require "jekyll-notion-import/import"
10
+ require "jekyll/commands/notion_import.rb"
11
+
12
+ Notion.configure do |config|
13
+ config.token = ENV["NOTION_TOKEN"]
14
+ end
15
+
16
+ module Jekyll
17
+ module NotionImport
18
+ end
19
+ end
metadata ADDED
@@ -0,0 +1,167 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: jekyll-notion-import
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Matt Hall
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-11-26 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: jekyll
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '3.7'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '5.0'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: '3.7'
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '5.0'
33
+ - !ruby/object:Gem::Dependency
34
+ name: notion_to_md
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ type: :runtime
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ - !ruby/object:Gem::Dependency
48
+ name: bundler
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ - !ruby/object:Gem::Dependency
62
+ name: byebug
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ - !ruby/object:Gem::Dependency
76
+ name: rake
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '12.0'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '12.0'
89
+ - !ruby/object:Gem::Dependency
90
+ name: rspec
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '3.0'
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '3.0'
103
+ - !ruby/object:Gem::Dependency
104
+ name: rubocop-jekyll
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '0.5'
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: '0.5'
117
+ - !ruby/object:Gem::Dependency
118
+ name: webmock
119
+ requirement: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: 3.18.1
124
+ type: :development
125
+ prerelease: false
126
+ version_requirements: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - "~>"
129
+ - !ruby/object:Gem::Version
130
+ version: 3.18.1
131
+ description: Import posts from notion
132
+ email:
133
+ - matt@codebeef.com
134
+ executables: []
135
+ extensions: []
136
+ extra_rdoc_files: []
137
+ files:
138
+ - lib/jekyll-notion-import.rb
139
+ - lib/jekyll-notion-import/database.rb
140
+ - lib/jekyll-notion-import/import.rb
141
+ - lib/jekyll-notion-import/post.rb
142
+ - lib/jekyll-notion-import/version.rb
143
+ - lib/jekyll/commands/notion_import.rb
144
+ homepage: https://github.com/codebeef/jekyll-notion-import
145
+ licenses:
146
+ - MIT
147
+ metadata: {}
148
+ post_install_message:
149
+ rdoc_options: []
150
+ require_paths:
151
+ - lib
152
+ required_ruby_version: !ruby/object:Gem::Requirement
153
+ requirements:
154
+ - - ">="
155
+ - !ruby/object:Gem::Version
156
+ version: 2.4.0
157
+ required_rubygems_version: !ruby/object:Gem::Requirement
158
+ requirements:
159
+ - - ">="
160
+ - !ruby/object:Gem::Version
161
+ version: '0'
162
+ requirements: []
163
+ rubygems_version: 3.0.3.1
164
+ signing_key:
165
+ specification_version: 4
166
+ summary: Import posts from notion
167
+ test_files: []