jekyll_ghost_importer 0.3.0 → 0.4.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: c1482339e32652c4e370beafe41755bc0f4f03da
4
- data.tar.gz: 91bdfad5e617caaebd3873f283dce011e6d05620
3
+ metadata.gz: 3103e2b999a9e1f32d2a6164fdaae346e34bf761
4
+ data.tar.gz: 3f908a60dfcf85d8131aca3a87864af729c0e664
5
5
  SHA512:
6
- metadata.gz: bf1a62a1172c46ee499571652c7355f659d3feae45116d0d6e47f10c2356f64baba5d43b43e856f7df78e438b29b33c96798a0342d309fe0af5c535b8db32e58
7
- data.tar.gz: 026f9c9da18f84e2ef63e48fd422d054000896f99078bf0ff8eec74484d8d59ca79e7b8d8b719737a673c57bd60f70bc10f8dcc27fa5ecb301d36d61f9fccd72
6
+ metadata.gz: 0a1fb01587e48ef2f421d3302feeab4c2ee19c0e919f25231d52c50974962c9ed5fbc70305ec71f8b5f356e7c8700fb344251815c2d5d8b7a857698cd7e4564c
7
+ data.tar.gz: eb8f7d251b4a749da61becc674d71f3c84d891935e0a140cdf3d550a79bc82a0073c72731d7972fc74876ff7e0a0e8a769941daef133daf0e687a13268bbc709
data/README.md CHANGED
@@ -1,9 +1,13 @@
1
+ [![Code Climate](http://img.shields.io/codeclimate/github/eloyesp/jekyll_ghost_importer.svg)](https://codeclimate.com/github/eloyesp/jekyll_ghost_importer)
2
+ [![Build status](https://img.shields.io/codeship/d6c1ddd0-16a3-0132-5f85-2e35c05e22b1/master.svg?maxAge=2592000)](https://codeship.com/projects/153176)
3
+ [![Gem Version](http://img.shields.io/gem/v/jekyll_ghost_importer.svg)](https://rubygems.org/gems/jekyll_ghost_importer)
4
+
1
5
  # Jekyll ghost importer
2
6
 
3
7
  This program let you import your post on [ghost][1] to [jekyll][2]. It uses a
4
8
  [ghost backup][3] to read the data and creates posts and drafts from them.
5
9
 
6
- [1]: https://ghost.org/
10
+ [1]: https://ghost.org/about/
7
11
  [2]: http://jekyllrb.com/
8
12
  [3]: http://support.ghost.org/import-and-export-my-ghost-blog-settings-and-data/
9
13
 
@@ -8,43 +8,106 @@ require 'yaml'
8
8
  FileUtils.mkdir_p("_posts")
9
9
  FileUtils.mkdir_p("_drafts")
10
10
 
11
- json = JSON.parse File.read(ARGV.pop), symbolize_names: true
11
+ $json = JSON.parse File.read(ARGV.pop), symbolize_names: true
12
12
 
13
- unless json[:data].nil?
14
- posts = json[:data][:posts]
13
+ unless $json[:data].nil?
14
+ posts = $json[:data][:posts]
15
15
  else
16
- posts = json[:db].first[:data][:posts]
16
+ posts = $json[:db].first[:data][:posts]
17
+ end
18
+
19
+ def there_are_tags?
20
+ @tags ||=
21
+ $json[:db] &&
22
+ $json[:db].first[:data][:posts_tags] &&
23
+ $json[:db].first[:data][:tags]
17
24
  end
18
25
 
19
26
  @imported = Hash.new(0)
20
27
 
28
+ class Post
29
+ # the source of the post
30
+ attr_reader :post
31
+
32
+ def initialize post
33
+ @post = post
34
+ end
35
+
36
+ def import
37
+ puts "Importing #{ filename }"
38
+ File.write filename, full_body
39
+ end
40
+
41
+ def draft?
42
+ post[:status] == 'draft'
43
+ end
44
+
45
+ private
46
+
47
+ def folder
48
+ draft? ? '_drafts' : '_posts'
49
+ end
50
+
51
+ def filename
52
+ File.join folder, basename
53
+ end
54
+
55
+ def date
56
+ case post[:published_at]
57
+ when String
58
+ DateTime.parse(post[:published_at])
59
+ when Integer
60
+ Time.at(post[:published_at] / 1000).utc.to_datetime
61
+ end
62
+ end
63
+
64
+ def front_matter
65
+ front_matter_hash = {
66
+ 'layout' => "post",
67
+ 'title' => post[:title]
68
+ }
69
+ unless draft?
70
+ front_matter_hash['date'] = date.strftime('%Y-%m-%d %H:%M:%S') if date
71
+ end
72
+ front_matter_hash['tags'] = tags if tags && !tags.empty?
73
+ front_matter_hash
74
+ end
75
+
76
+ def slug
77
+ post[:slug]
78
+ end
79
+
80
+ def tags
81
+ if there_are_tags?
82
+ post_tags = $json[:db].first[:data][:posts_tags].select do |pt|
83
+ pt[:post_id] == post[:id]
84
+ end
85
+ tags_ids = post_tags.map { |pt| pt[:tag_id] }
86
+ tags = $json[:db].first[:data][:tags].select do |t|
87
+ tags_ids.include? t[:id]
88
+ end
89
+ tags.map { |t| t[:slug] }
90
+ end
91
+ end
92
+
93
+ def full_body
94
+ front_matter.to_yaml + "---\n\n" + post[:markdown]
95
+ end
96
+
97
+ def basename
98
+ if draft?
99
+ "#{ slug }.markdown"
100
+ else
101
+ "#{ date.strftime('%Y-%m-%d') }-#{ slug }.markdown"
102
+ end
103
+ end
104
+ end
105
+
21
106
  posts.each do |post|
22
- date = case post[:published_at]
23
- when String
24
- DateTime.parse(post[:published_at])
25
- when Integer
26
- Time.at(post[:published_at] / 1000).utc.to_datetime
27
- end
28
- slug = post[:slug]
29
- front_matter_hash = {
30
- 'layout' => "post",
31
- 'title' => post[:title]
32
- }
33
- front_matter_hash['date'] = date.strftime('%Y-%m-%d %H:%M:%S') if date
34
-
35
- body = front_matter_hash.to_yaml + "---\n\n" + post[:markdown]
36
- draft = post[:status] == 'draft'
37
- basename = if draft
38
- "#{ slug }.markdown"
39
- else
40
- "#{ date.strftime('%Y-%m-%d') }-#{ slug }.markdown"
41
- end
42
- folder = draft ? '_drafts' : '_posts'
43
- filename = File.join folder, basename
44
- puts "Importing #{ filename }"
45
- File.write filename, body
107
+ post = Post.new post
108
+ post.import
46
109
  @imported[:posts] += 1
47
- @imported[:drafts] += 1 if draft
110
+ @imported[:drafts] += 1 if post.draft?
48
111
  end
49
112
 
50
113
  puts "#{ @imported[:posts] } posts imported ( #{ @imported[:drafts] } draft )"
@@ -252,6 +252,8 @@ Feature: Import posts
252
252
  layout: post
253
253
  title: Welcome to Ghost
254
254
  date: '2015-02-19 11:49:14'
255
+ tags:
256
+ - getting-started
255
257
  ---
256
258
 
257
259
  You're live!
@@ -261,3 +263,111 @@ Feature: Import posts
261
263
  """
262
264
  Something here
263
265
  """
266
+
267
+ Scenario: Import a draft with an invalid published_at date
268
+ Given a file named "draft_with_invalid_date.json" with:
269
+ """
270
+ {
271
+ "db": [
272
+ {
273
+ "meta": {
274
+ "exported_on": 1424346829618,
275
+ "version": "003"
276
+ },
277
+ "data": {
278
+ "posts": [
279
+ {
280
+ "id": 824,
281
+ "uuid": "3f932273-14ef-4a7d-8119-25cfee021b0c",
282
+ "title": "Are you using a fixed width font for development?",
283
+ "slug": "temp-slug-9",
284
+ "markdown": "This is just a draft, so the date doesn't really matter",
285
+ "html": "<p>This is just a draft, so the date doesn't really matter</p>",
286
+ "image": null,
287
+ "featured": 0,
288
+ "page": 0,
289
+ "status": "draft",
290
+ "language": "en_US",
291
+ "meta_title": null,
292
+ "meta_description": null,
293
+ "author_id": 1,
294
+ "created_at": "2013-05-22T08:30:25.000Z",
295
+ "created_by": 1,
296
+ "updated_at": "2013-05-22T08:30:25.000Z",
297
+ "updated_by": 1,
298
+ "published_at": "0000-00-00 00:00:00",
299
+ "published_by": 1,
300
+ "visibility": "public",
301
+ "mobiledoc": null
302
+ }
303
+ ],
304
+ "users": [
305
+ {
306
+ "id": 1,
307
+ "uuid": "6a013e8f-24d3-4c77-901a-7e57f6537f47",
308
+ "name": "test test2",
309
+ "slug": "test",
310
+ "password": "some_password",
311
+ "email": "my_email",
312
+ "image": null,
313
+ "cover": null,
314
+ "bio": null,
315
+ "website": null,
316
+ "location": null,
317
+ "accessibility": null,
318
+ "status": "active",
319
+ "language": "en_US",
320
+ "meta_title": null,
321
+ "meta_description": null,
322
+ "last_login": 1424346712870,
323
+ "created_at": 1424346562473,
324
+ "created_by": 1,
325
+ "updated_at": 1424346712870,
326
+ "updated_by": 1
327
+ }
328
+ ],
329
+ "tags": [
330
+ {
331
+ "id": 1,
332
+ "uuid": "befcb6c7-c777-4a65-a272-6e2577cade61",
333
+ "name": "Getting Started",
334
+ "slug": "getting-started",
335
+ "description": null,
336
+ "image": null,
337
+ "hidden": 0,
338
+ "parent_id": null,
339
+ "meta_title": null,
340
+ "meta_description": null,
341
+ "created_at": 1424346554967,
342
+ "created_by": 1,
343
+ "updated_at": 1424346554967,
344
+ "updated_by": 1
345
+ }
346
+ ],
347
+ "posts_tags": [
348
+ {
349
+ "id": 1,
350
+ "post_id": 1,
351
+ "tag_id": 1
352
+ }
353
+ ]
354
+ }
355
+ }
356
+ ]
357
+ }
358
+ """
359
+ When I run `jekyll_ghost_importer draft_with_invalid_date.json`
360
+ Then it should pass with:
361
+ """
362
+ 1 posts imported ( 1 draft )
363
+ """
364
+ And a directory named "_drafts" should exist
365
+ And the file "_drafts/temp-slug-9.markdown" should contain:
366
+ """
367
+ ---
368
+ layout: post
369
+ title: Are you using a fixed width font for development?
370
+ ---
371
+
372
+ This is just a draft, so the date doesn't really matter
373
+ """
@@ -1,26 +1,18 @@
1
1
  # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
3
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require 'jekyll_ghost_importer'
5
-
6
2
  Gem::Specification.new do |spec|
7
3
  spec.name = "jekyll_ghost_importer"
8
- spec.version = JekyllGhostImporter::VERSION
4
+ spec.version = "0.4.0"
9
5
  spec.authors = ["Eloy Espinaco"]
10
6
  spec.email = ["eloyesp@gmail.com"]
11
7
  spec.summary = %q{Import your posts from a ghost backup file.}
12
8
  spec.homepage = ""
13
- spec.license = "GPLv3"
9
+ spec.license = "GPL-3.0+"
14
10
 
15
11
  spec.files = `git ls-files -z`.split("\x0")
16
12
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
13
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
14
  spec.require_paths = ["lib"]
19
15
 
20
- spec.add_development_dependency "bundler", "~> 1.6"
21
- spec.add_development_dependency "rake", "~> 10.0"
22
- spec.add_development_dependency "cucumber"
23
- spec.add_development_dependency "aruba"
24
- spec.add_development_dependency "guard"
25
- spec.add_development_dependency "guard-cucumber"
16
+ spec.add_development_dependency "cucumber", '~> 1.3'
17
+ spec.add_development_dependency "aruba", '~> 0'
26
18
  end
@@ -1,3 +1,2 @@
1
1
  module JekyllGhostImporter
2
- VERSION = "0.3.0"
3
2
  end
metadata CHANGED
@@ -1,97 +1,41 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jekyll_ghost_importer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eloy Espinaco
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-02-20 00:00:00.000000000 Z
11
+ date: 2016-05-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: bundler
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: '1.6'
20
- type: :development
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
25
- - !ruby/object:Gem::Version
26
- version: '1.6'
27
- - !ruby/object:Gem::Dependency
28
- name: rake
14
+ name: cucumber
29
15
  requirement: !ruby/object:Gem::Requirement
30
16
  requirements:
31
17
  - - "~>"
32
18
  - !ruby/object:Gem::Version
33
- version: '10.0'
19
+ version: '1.3'
34
20
  type: :development
35
21
  prerelease: false
36
22
  version_requirements: !ruby/object:Gem::Requirement
37
23
  requirements:
38
24
  - - "~>"
39
25
  - !ruby/object:Gem::Version
40
- version: '10.0'
41
- - !ruby/object:Gem::Dependency
42
- name: cucumber
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - ">="
46
- - !ruby/object:Gem::Version
47
- version: '0'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- version: '0'
26
+ version: '1.3'
55
27
  - !ruby/object:Gem::Dependency
56
28
  name: aruba
57
29
  requirement: !ruby/object:Gem::Requirement
58
30
  requirements:
59
- - - ">="
60
- - !ruby/object:Gem::Version
61
- version: '0'
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - ">="
67
- - !ruby/object:Gem::Version
68
- version: '0'
69
- - !ruby/object:Gem::Dependency
70
- name: guard
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - ">="
74
- - !ruby/object:Gem::Version
75
- version: '0'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - ">="
81
- - !ruby/object:Gem::Version
82
- version: '0'
83
- - !ruby/object:Gem::Dependency
84
- name: guard-cucumber
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - ">="
31
+ - - "~>"
88
32
  - !ruby/object:Gem::Version
89
33
  version: '0'
90
34
  type: :development
91
35
  prerelease: false
92
36
  version_requirements: !ruby/object:Gem::Requirement
93
37
  requirements:
94
- - - ">="
38
+ - - "~>"
95
39
  - !ruby/object:Gem::Version
96
40
  version: '0'
97
41
  description:
@@ -118,7 +62,7 @@ files:
118
62
  - lib/jekyll_ghost_importer.rb
119
63
  homepage: ''
120
64
  licenses:
121
- - GPLv3
65
+ - GPL-3.0+
122
66
  metadata: {}
123
67
  post_install_message:
124
68
  rdoc_options: []
@@ -136,7 +80,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
136
80
  version: '0'
137
81
  requirements: []
138
82
  rubyforge_project:
139
- rubygems_version: 2.4.5
83
+ rubygems_version: 2.5.1
140
84
  signing_key:
141
85
  specification_version: 4
142
86
  summary: Import your posts from a ghost backup file.
@@ -145,4 +89,3 @@ test_files:
145
89
  - features/import_posts.feature
146
90
  - features/step_definitions/backup_files.rb
147
91
  - features/support/requires.rb
148
- has_rdoc: