jekyll-import 0.9.0 → 0.10.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
  SHA1:
3
- metadata.gz: 07d3bbdc383ff8bcf6b7b686332687345dc8a71b
4
- data.tar.gz: 73fa392dc3e4957d0aae9dce535a0abb3655c73f
3
+ metadata.gz: 978cb59817a6828ea723eeef82002e9520fb9993
4
+ data.tar.gz: d193cd60fe7c2c3872a072030e2d08d4d7d42637
5
5
  SHA512:
6
- metadata.gz: 32ddb7124f545ddc9031190529a40348051b713c2343f509ce26bc7970310ed456ed59e0dd7f4a7baaafde3141cd3248f42b85f47d3d26b237b090d452ade2d7
7
- data.tar.gz: 6331a88ff5fe73131e7d4f0331e0767ff4871b190135260f42af846a2ea0b2f2c989ae678c0992400ac2defe3818a2d34b16fdf2bb3e26fc52a36a7b4af767ef
6
+ metadata.gz: cd53d8b869acd8123793c72e261e2a5e4a452a3ea3162783aa5df9af32059c23a37a2fb9e5eb238f91894632fb37558b735660c0257b06b242954443afb5e7dd
7
+ data.tar.gz: ed999729e91426cd839bb5abd8954c6a3004c78b22a6d3571bc5336d3abd634848ea19726aabef4af8041c0485765b18549a6cc3f225622e0a5d08630c051d3d
data/lib/jekyll-import.rb CHANGED
@@ -9,10 +9,6 @@ require 'jekyll-import/importers'
9
9
  require 'jekyll-import/util'
10
10
 
11
11
  module JekyllImport
12
- def self.logger
13
- @logger ||= Jekyll::Stevenson.new
14
- end
15
-
16
12
  # Public: Add the subcommands for each importer
17
13
  #
18
14
  # cmd - the instance of Mercenary::Command from the
@@ -39,14 +35,14 @@ module JekyllImport
39
35
  begin
40
36
  require gem
41
37
  rescue LoadError
42
- logger.error "Whoops! Looks like you need to install '#{gem}' before you can use this importer."
43
- logger.error ""
44
- logger.error "If you're using bundler:"
45
- logger.error " 1. Add 'gem \"#{gem}\"' to your Gemfile"
46
- logger.error " 2. Run 'bundle install'"
47
- logger.error ""
48
- logger.error "If you're not using bundler:"
49
- logger.abort_with " 1. Run 'gem install #{gem}'."
38
+ Jekyll.logger.error "Whoops! Looks like you need to install '#{gem}' before you can use this importer."
39
+ Jekyll.logger.error ""
40
+ Jekyll.logger.error "If you're using bundler:"
41
+ Jekyll.logger.error " 1. Add 'gem \"#{gem}\"' to your Gemfile"
42
+ Jekyll.logger.error " 2. Run 'bundle install'"
43
+ Jekyll.logger.error ""
44
+ Jekyll.logger.error "If you're not using bundler:"
45
+ Jekyll.logger.abort_with " 1. Run 'gem install #{gem}'."
50
46
  end
51
47
  end
52
48
  end
@@ -1,3 +1,5 @@
1
+ # encoding: UTF-8
2
+
1
3
  module JekyllImport
2
4
  module Importers
3
5
  class CSV < Importer
@@ -5,6 +7,7 @@ module JekyllImport
5
7
  JekyllImport.require_with_fallback(%w[
6
8
  csv
7
9
  fileutils
10
+ yaml
8
11
  ])
9
12
  end
10
13
 
@@ -23,34 +26,69 @@ module JekyllImport
23
26
  abort "Cannot find the file '#{file}'. Aborting." unless File.file?(file)
24
27
 
25
28
  ::CSV.foreach(file) do |row|
26
- next if row[0] == "title"
29
+ next if row[0] == "title" # header
27
30
  posts += 1
28
- name = build_name(row)
29
- write_post(name, row[0], row[2], options)
31
+ write_post(CSVPost.new(row), options)
30
32
  end
31
- "Created #{posts} posts!"
33
+ Jekyll.logger.info "Created #{posts} posts!"
32
34
  end
33
35
 
34
- def self.write_post(name, title, content, options)
35
- File.open("_posts/#{name}", "w") do |f|
36
- write_frontmatter(f, title, options)
37
- f.puts content
36
+ class CSVPost
37
+ attr_reader :title, :permalink, :body, :markup
38
+
39
+ MissingDataError = Class.new(RuntimeError)
40
+
41
+ # Creates a CSVPost
42
+ #
43
+ # row - Array of data, length of 4 or 5 with the columns:
44
+ #
45
+ # 1. title
46
+ # 2. permalink
47
+ # 3. body
48
+ # 4. published_at
49
+ # 5. markup (markdown, textile)
50
+ def initialize(row)
51
+ @title = row[0] || missing_data("Post title not present in first column.")
52
+ @permalink = row[1] || missing_data("Post permalink not present in second column.")
53
+ @body = row[2] || missing_data("Post body not present in third column.")
54
+ @published_at = row[3] || missing_data("Post publish date not present in fourth column.")
55
+ @markup = row[4] || "markdown"
56
+ end
57
+
58
+ def published_at
59
+ if @published_at && !@published_at.is_a?(DateTime)
60
+ @published_at = DateTime.parse(@published_at)
61
+ else
62
+ @published_at
63
+ end
64
+ end
65
+
66
+ def filename
67
+ "#{published_at.strftime("%Y-%m-%d")}-#{File.basename(permalink, ".*")}.#{markup}"
68
+ end
69
+
70
+ def missing_data(message)
71
+ raise MissingDataError, message
38
72
  end
39
73
  end
40
74
 
41
- def self.build_name(row)
42
- row[3].split(" ")[0]+"-"+row[1]+(row[4] =~ /markdown/ ? ".markdown" : ".textile")
75
+ def self.write_post(post, options = {})
76
+ File.open(File.join("_posts", post.filename), "w") do |f|
77
+ write_frontmatter(f, post, options)
78
+ f.puts post.body
79
+ end
43
80
  end
44
81
 
45
- def self.write_frontmatter(f, title, options)
82
+ def self.write_frontmatter(f, post, options)
46
83
  no_frontmatter = options.fetch('no-front-matter', false)
47
84
  unless no_frontmatter
48
- f.puts <<-HEADER
49
- ---
50
- layout: post
51
- title: #{title}
52
- ---
53
- HEADER
85
+ f.puts YAML.dump({
86
+ "layout" => "post",
87
+ "title" => post.title,
88
+ "date" => post.published_at.to_s,
89
+ "permalink" => post.permalink
90
+ })
91
+ f.puts "---"
54
92
  end
55
93
  end
56
94
  end
@@ -13,7 +13,7 @@ module JekyllImport
13
13
  node AS n \
14
14
  LEFT OUTER JOIN term_node AS tn ON tn.nid = n.nid \
15
15
  LEFT OUTER JOIN term_data AS td ON tn.tid = td.tid \
16
- WHERE (n.type = 'blog' OR n.type = 'story' OR n.type = 'article') \
16
+ WHERE (%types%) \
17
17
  AND n.vid = nr.vid \
18
18
  GROUP BY n.nid"
19
19
 
@@ -31,6 +31,7 @@ module JekyllImport
31
31
  c.option 'password', '--password PW', "Database user's password (default: '')"
32
32
  c.option 'host', '--host HOST', 'Database host name (default: "localhost")'
33
33
  c.option 'prefix', '--prefix PREFIX', 'Table prefix name'
34
+ c.option 'types', '--types TYPE1[,TYPE2[,TYPE3...]]', Array, 'The Drupal content types to be imported.'
34
35
  end
35
36
 
36
37
  def self.require_deps
@@ -48,6 +49,7 @@ module JekyllImport
48
49
  pass = options.fetch('password', "")
49
50
  host = options.fetch('host', "localhost")
50
51
  prefix = options.fetch('prefix', "")
52
+ types = options.fetch('types', ['blog', 'story', 'article'])
51
53
 
52
54
  db = Sequel.mysql(dbname, :user => user, :password => pass, :host => host, :encoding => 'utf8')
53
55
 
@@ -58,6 +60,9 @@ module JekyllImport
58
60
  QUERY[" term_data "] = " " + prefix + "term_data "
59
61
  end
60
62
 
63
+ types = types.join("' OR n.type = '")
64
+ QUERY[" WHERE (%types%) "] = " WHERE (n.type = '#{types}') "
65
+
61
66
  FileUtils.mkdir_p "_posts"
62
67
  FileUtils.mkdir_p "_drafts"
63
68
  FileUtils.mkdir_p "_layouts"
@@ -7,12 +7,16 @@ module JekyllImport
7
7
  fdb.body_value, \
8
8
  fdb.body_summary, \
9
9
  n.created, \
10
- n.status \
10
+ n.status, \
11
+ n.nid, \
12
+ u.name \
11
13
  FROM node AS n, \
12
- field_data_body AS fdb \
13
- WHERE (n.type = 'blog' OR n.type = 'story' OR n.type = 'article') \
14
+ field_data_body AS fdb, \
15
+ users AS u \
16
+ WHERE (%types%) \
14
17
  AND n.nid = fdb.entity_id \
15
- AND n.vid = fdb.revision_id"
18
+ AND n.vid = fdb.revision_id
19
+ AND n.uid = u.uid"
16
20
 
17
21
  def self.validate(options)
18
22
  %w[dbname user].each do |option|
@@ -28,6 +32,7 @@ module JekyllImport
28
32
  c.option 'password', '--password PW', 'Database user\'s password (default: "")'
29
33
  c.option 'host', '--host HOST', 'Database host name (default: "localhost")'
30
34
  c.option 'prefix', '--prefix PREFIX', 'Table prefix name'
35
+ c.option 'types', '--types TYPE1[,TYPE2[,TYPE3...]]', Array, 'The Drupal content types to be imported.'
31
36
  end
32
37
 
33
38
  def self.require_deps
@@ -45,14 +50,19 @@ module JekyllImport
45
50
  pass = options.fetch('password', "")
46
51
  host = options.fetch('host', "localhost")
47
52
  prefix = options.fetch('prefix', "")
53
+ types = options.fetch('types', ['blog', 'story', 'article'])
48
54
 
49
55
  db = Sequel.mysql(dbname, :user => user, :password => pass, :host => host, :encoding => 'utf8')
50
56
 
51
57
  unless prefix.empty?
52
58
  QUERY[" node "] = " " + prefix + "node "
53
59
  QUERY[" field_data_body "] = " " + prefix + "field_data_body "
60
+ QUERY[" users "] = " " + prefix + "users "
54
61
  end
55
62
 
63
+ types = types.join("' OR n.type = '")
64
+ QUERY[" WHERE (%types%) "] = " WHERE (n.type = '#{types}') "
65
+
56
66
  FileUtils.mkdir_p "_posts"
57
67
  FileUtils.mkdir_p "_drafts"
58
68
  FileUtils.mkdir_p "_layouts"
@@ -63,6 +73,8 @@ module JekyllImport
63
73
  content = post[:body_value]
64
74
  summary = post[:body_summary]
65
75
  created = post[:created]
76
+ author = post[:name]
77
+ nid = post[:nid]
66
78
  time = Time.at(created)
67
79
  is_published = post[:status] == 1
68
80
  dir = is_published ? "_posts" : "_drafts"
@@ -74,6 +86,8 @@ module JekyllImport
74
86
  data = {
75
87
  'layout' => 'post',
76
88
  'title' => title.strip.force_encoding("UTF-8"),
89
+ 'author' => author,
90
+ 'nid' => nid,
77
91
  'created' => created,
78
92
  'excerpt' => summary
79
93
  }.delete_if { |k,v| v.nil? || v == ''}.to_yaml
@@ -2,6 +2,8 @@ module JekyllImport
2
2
  module Importers
3
3
  class MT < Importer
4
4
 
5
+ SUPPORTED_ENGINES = %{mysql postgres sqlite}
6
+
5
7
  STATUS_DRAFT = 1
6
8
  STATUS_PUBLISHED = 2
7
9
  MORE_CONTENT_SEPARATOR = '<!--more-->'
@@ -65,27 +67,10 @@ module JekyllImport
65
67
  def self.process(options)
66
68
  options = default_options.merge(options)
67
69
 
68
- engine = options.fetch('engine', 'mysql')
69
- dbname = options.fetch('dbname')
70
- user = options.fetch('user')
71
- pass = options.fetch('password', "")
72
- host = options.fetch('host', "localhost")
73
70
  comments = options.fetch('comments')
71
+ posts_name_by_id = {} if comments
74
72
 
75
- posts_name_by_id = { } if comments
76
-
77
- db_opts = { user => user, :password => pass, :host => host }
78
-
79
- # Use the default port by default, but set the port if one is provided.
80
- if options['port']
81
- db_opts[:port] = options['port']
82
- end
83
-
84
- if engine != 'mysql' && engine != 'postgres'
85
- abort("unsupported --engine value supplied '#{engine}'. Only 'mysql' and 'postgres' are supported")
86
- end
87
-
88
- db = Sequel.public_send(engine, dbname, db_opts)
73
+ db = database_from_opts(options)
89
74
 
90
75
  post_categories = db[:mt_placement].join(:mt_category, :category_id => :placement_category_id)
91
76
 
@@ -102,7 +87,7 @@ module JekyllImport
102
87
 
103
88
  data = post_metadata(post, options)
104
89
  data['categories'] = categories if !categories.empty? && options['categories']
105
- yaml_front_matter = data.delete_if { |k,v| v.nil? || v == '' }.to_yaml
90
+ yaml_front_matter = data.delete_if { |_,v| v.nil? || v == '' }.to_yaml
106
91
 
107
92
  # save post path for comment processing
108
93
  posts_name_by_id[data['post_id']] = file_name if comments
@@ -122,13 +107,13 @@ module JekyllImport
122
107
 
123
108
  comments = db[:mt_comment]
124
109
  comments.each do |comment|
125
- if posts_name_by_id.has_key?(comment[:comment_entry_id]) # if the entry exists
110
+ if posts_name_by_id.key?(comment[:comment_entry_id]) # if the entry exists
126
111
  dir_name, base_name = comment_file_dir_and_base_name(posts_name_by_id, comment, options)
127
112
  FileUtils.mkdir_p "_comments/#{dir_name}"
128
113
 
129
114
  data = comment_metadata(comment, options)
130
115
  content = comment_content(comment, options)
131
- yaml_front_matter = data.delete_if { |k,v| v.nil? || v == '' }.to_yaml
116
+ yaml_front_matter = data.delete_if { |_,v| v.nil? || v == '' }.to_yaml
132
117
 
133
118
  File.open("_comments/#{dir_name}/#{base_name}", "w") do |f|
134
119
  f.puts yaml_front_matter
@@ -243,6 +228,30 @@ module JekyllImport
243
228
  entry_type
244
229
  end
245
230
  end
231
+
232
+ def self.database_from_opts(options)
233
+ engine = options.fetch('engine', 'mysql')
234
+ dbname = options.fetch('dbname')
235
+
236
+ case engine
237
+ when "sqlite"
238
+ Sequel.sqlite(dbname)
239
+ when "mysql", "postgres"
240
+ db_connect_opts = {
241
+ :host => options.fetch('host', 'localhost'),
242
+ :user => options.fetch('user'),
243
+ :password => options.fetch('password', '')
244
+ }
245
+ db_connect_opts = options['port'] if options['port']
246
+ Sequel.public_send(
247
+ engine,
248
+ dbname,
249
+ db_connect_opts
250
+ )
251
+ else
252
+ abort("Unsupported engine: '#{engine}'. Must be one of #{SUPPORTED_ENGINES.join(', ')}")
253
+ end
254
+ end
246
255
  end
247
256
  end
248
257
  end
@@ -1,3 +1,3 @@
1
1
  module JekyllImport
2
- VERSION = '0.9.0'
2
+ VERSION = '0.10.0'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jekyll-import
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.0
4
+ version: 0.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tom Preston-Werner
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-11-04 00:00:00.000000000 Z
11
+ date: 2016-01-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jekyll
@@ -364,7 +364,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
364
364
  version: '0'
365
365
  requirements: []
366
366
  rubyforge_project:
367
- rubygems_version: 2.2.5
367
+ rubygems_version: 2.5.1
368
368
  signing_key:
369
369
  specification_version: 2
370
370
  summary: Import command for Jekyll (static site generator).