bunto-import 1.0.0

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.
@@ -0,0 +1,207 @@
1
+ # encoding: UTF-8
2
+
3
+ module BuntoImport
4
+ module Importers
5
+ class WordpressDotCom < Importer
6
+ def self.require_deps
7
+ BuntoImport.require_with_fallback(%w[
8
+ rubygems
9
+ fileutils
10
+ safe_yaml
11
+ hpricot
12
+ time
13
+ open-uri
14
+ open_uri_redirections
15
+ ])
16
+ end
17
+
18
+ def self.specify_options(c)
19
+ c.option 'source', '--source FILE', 'WordPress export XML file (default: "wordpress.xml")'
20
+ c.option 'no_fetch_images', '--no-fetch-images', 'Do not fetch the images referenced in the posts'
21
+ c.option 'assets_folder', '--assets_folder FOLDER', 'Folder where assets such as images will be downloaded to (default: assets)'
22
+ end
23
+
24
+ # Will modify post DOM tree
25
+ def self.download_images(title, post_hpricot, assets_folder)
26
+ images = (post_hpricot/"img")
27
+ if images.length == 0
28
+ return
29
+ end
30
+ puts "Downloading images for " + title
31
+ images.each do |i|
32
+ uri = i["src"]
33
+
34
+ i["src"] = "{{ site.baseurl }}/%s/%s" % [assets_folder, File.basename(uri)]
35
+ dst = File.join(assets_folder, File.basename(uri))
36
+ puts " " + uri
37
+ if File.exist?(dst)
38
+ puts " Already in cache. Clean assets folder if you want a redownload."
39
+ next
40
+ end
41
+ begin
42
+ open(uri, allow_redirections: :safe) {|f|
43
+ File.open(dst, "wb") do |out|
44
+ out.puts f.read
45
+ end
46
+ }
47
+ puts " OK!"
48
+ rescue => e
49
+ puts " Error: #{e.message}"
50
+ puts e.backtrace.join("\n")
51
+ end
52
+ end
53
+ end
54
+
55
+ class Item
56
+ def initialize(node)
57
+ @node = node
58
+ end
59
+
60
+ def text_for(path)
61
+ @node.at(path).inner_text
62
+ end
63
+
64
+ def title
65
+ @title ||= text_for(:title).strip
66
+ end
67
+
68
+ def permalink_title
69
+ post_name = text_for('wp:post_name')
70
+ # Fallback to "prettified" title if post_name is empty (can happen)
71
+ @permalink_title ||= if post_name.empty?
72
+ WordpressDotCom.sluggify(title)
73
+ else
74
+ post_name
75
+ end
76
+ end
77
+
78
+ def published_at
79
+ if published?
80
+ @published_at ||= Time.parse(text_for('wp:post_date'))
81
+ end
82
+ end
83
+
84
+ def status
85
+ @status ||= text_for('wp:status')
86
+ end
87
+
88
+ def post_type
89
+ @post_type ||= text_for('wp:post_type')
90
+ end
91
+
92
+ def file_name
93
+ @file_name ||= if published?
94
+ "#{published_at.strftime('%Y-%m-%d')}-#{permalink_title}.html"
95
+ else
96
+ "#{permalink_title}.html"
97
+ end
98
+ end
99
+
100
+ def directory_name
101
+ @directory_name ||= if !published? && post_type == 'post'
102
+ '_drafts'
103
+ else
104
+ "_#{post_type}s"
105
+ end
106
+ end
107
+
108
+ def published?
109
+ @published ||= (status == 'publish')
110
+ end
111
+
112
+ def excerpt
113
+ @excerpt ||= begin
114
+ text = Hpricot(text_for('excerpt:encoded')).inner_text
115
+ if text.empty?
116
+ nil
117
+ else
118
+ text
119
+ end
120
+ end
121
+ end
122
+ end
123
+
124
+ def self.process(options)
125
+ source = options.fetch('source', "wordpress.xml")
126
+ fetch = !options.fetch('no_fetch_images', false)
127
+ assets_folder = options.fetch('assets_folder', 'assets')
128
+ FileUtils.mkdir_p(assets_folder)
129
+
130
+ import_count = Hash.new(0)
131
+ doc = Hpricot::XML(File.read(source))
132
+ # Fetch authors data from header
133
+ authors = Hash[
134
+ (doc/:channel/'wp:author').map do |author|
135
+ [author.at("wp:author_login").inner_text.strip, {
136
+ "login" => author.at("wp:author_login").inner_text.strip,
137
+ "email" => author.at("wp:author_email").inner_text,
138
+ "display_name" => author.at("wp:author_display_name").inner_text,
139
+ "first_name" => author.at("wp:author_first_name").inner_text,
140
+ "last_name" => author.at("wp:author_last_name").inner_text
141
+ }]
142
+ end
143
+ ] rescue {}
144
+
145
+ (doc/:channel/:item).each do |node|
146
+ item = Item.new(node)
147
+ categories = node.search('category[@domain="category"]').map(&:inner_text).reject{|c| c == 'Uncategorized'}.uniq
148
+ tags = node.search('category[@domain="post_tag"]').map(&:inner_text).uniq
149
+
150
+ metas = Hash.new
151
+ node.search("wp:postmeta").each do |meta|
152
+ key = meta.at('wp:meta_key').inner_text
153
+ value = meta.at('wp:meta_value').inner_text
154
+ metas[key] = value
155
+ end
156
+
157
+ author_login = item.text_for('dc:creator').strip
158
+
159
+ header = {
160
+ 'layout' => item.post_type,
161
+ 'title' => item.title,
162
+ 'date' => item.published_at,
163
+ 'type' => item.post_type,
164
+ 'published' => item.published?,
165
+ 'status' => item.status,
166
+ 'categories' => categories,
167
+ 'tags' => tags,
168
+ 'meta' => metas,
169
+ 'author' => authors[author_login]
170
+ }
171
+
172
+ begin
173
+ content = Hpricot(item.text_for('content:encoded'))
174
+ header['excerpt'] = item.excerpt if item.excerpt
175
+
176
+ if fetch
177
+ download_images(item.title, content, assets_folder)
178
+ end
179
+
180
+ FileUtils.mkdir_p item.directory_name
181
+ File.open(File.join(item.directory_name, item.file_name), "w") do |f|
182
+ f.puts header.to_yaml
183
+ f.puts '---'
184
+ f.puts Util.wpautop(content.to_html)
185
+ end
186
+ rescue => e
187
+ puts "Couldn't import post!"
188
+ puts "Title: #{item.title}"
189
+ puts "Name/Slug: #{item.file_name}\n"
190
+ puts "Error: #{e.message}"
191
+ next
192
+ end
193
+
194
+ import_count[item.post_type] += 1
195
+ end
196
+
197
+ import_count.each do |key, value|
198
+ puts "Imported #{value} #{key}s"
199
+ end
200
+ end
201
+
202
+ def self.sluggify(title)
203
+ title.gsub(/[^[:alnum:]]+/, '-').downcase
204
+ end
205
+ end
206
+ end
207
+ end
@@ -0,0 +1,76 @@
1
+ module BuntoImport
2
+ module Util
3
+
4
+ # Ruby translation of wordpress wpautop (see https://core.trac.wordpress.org/browser/trunk/src/wp-includes/formatting.php)
5
+ #
6
+ # A group of regex replaces used to identify text formatted with newlines and
7
+ # replace double line-breaks with HTML paragraph tags. The remaining
8
+ # line-breaks after conversion become <<br />> tags, unless $br is set to false
9
+ #
10
+ # @param string pee The text which has to be formatted.
11
+ # @param bool br Optional. If set, this will convert all remaining line-breaks after paragraphing. Default true.
12
+ # @return string Text which has been converted into correct paragraph tags.
13
+ #
14
+ def self.wpautop(pee, br = true)
15
+ return '' if pee.strip == ''
16
+
17
+ allblocks = '(?:table|thead|tfoot|caption|col|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|option|form|map|area|blockquote|address|math|style|p|h[1-6]|hr|fieldset|noscript|legend|section|article|aside|hgroup|header|footer|nav|figure|figcaption|details|menu|summary)'
18
+ pre_tags = {}
19
+ pee = pee + "\n"
20
+
21
+ if pee.include?('<pre')
22
+ pee_parts = pee.split('</pre>')
23
+ last_pee = pee_parts.pop
24
+ pee = ''
25
+ pee_parts.each_with_index do |pee_part, i|
26
+ start = pee_part.index('<pre')
27
+
28
+ unless start
29
+ pee += pee_part
30
+ next
31
+ end
32
+
33
+ name = "<pre wp-pre-tag-#{i}></pre>"
34
+ pre_tags[name] = pee_part[start..-1] + '</pre>'
35
+
36
+ pee += pee_part[0, start] + name
37
+ end
38
+ pee += last_pee
39
+ end
40
+
41
+ pee = pee.gsub(Regexp.new('<br />\s*<br />'), "\n\n")
42
+ pee = pee.gsub(Regexp.new("(<" + allblocks + "[^>]*>)"), "\n\\1")
43
+ pee = pee.gsub(Regexp.new("(</" + allblocks + ">)"), "\\1\n\n")
44
+ pee = pee.gsub("\r\n", "\n").gsub("\r", "\n")
45
+ if pee.include? '<object'
46
+ pee = pee.gsub(Regexp.new('\s*<param([^>]*)>\s*'), "<param\\1>")
47
+ pee = pee.gsub(Regexp.new('\s*</embed>\s*'), '</embed>')
48
+ end
49
+
50
+ pees = pee.split(/\n\s*\n/).compact
51
+ pee = ''
52
+ pees.each { |tinkle| pee += '<p>' + tinkle.chomp("\n") + "</p>\n" }
53
+ pee = pee.gsub(Regexp.new('<p>\s*</p>'), '')
54
+ pee = pee.gsub(Regexp.new('<p>([^<]+)</(div|address|form)>'), "<p>\\1</p></\\2>")
55
+ pee = pee.gsub(Regexp.new('<p>\s*(</?' + allblocks + '[^>]*>)\s*</p>'), "\\1")
56
+ pee = pee.gsub(Regexp.new('<p>(<li.+?)</p>'), "\\1")
57
+ pee = pee.gsub(Regexp.new('<p><blockquote([^>]*)>', 'i'), "<blockquote\\1><p>")
58
+ pee = pee.gsub('</blockquote></p>', '</p></blockquote>')
59
+ pee = pee.gsub(Regexp.new('<p>\s*(</?' + allblocks + '[^>]*>)'), "\\1")
60
+ pee = pee.gsub(Regexp.new('(</?' + allblocks + '[^>]*>)\s*</p>'), "\\1")
61
+ if br
62
+ pee = pee.gsub(Regexp.new('<(script|style).*?</\1>')) { |match| match.gsub("\n", "<WPPreserveNewline />") }
63
+ pee = pee.gsub(Regexp.new('(?<!<br />)\s*\n'), "<br />\n")
64
+ pee = pee.gsub('<WPPreserveNewline />', "\n")
65
+ end
66
+ pee = pee.gsub(Regexp.new('(</?' + allblocks + '[^>]*>)\s*<br />'), "\\1")
67
+ pee = pee.gsub(Regexp.new('<br />(\s*</?(?:p|li|div|dl|dd|dt|th|pre|td|ul|ol)[^>]*>)'), "\\1")
68
+ pee = pee.gsub(Regexp.new('\n</p>$'), '</p>')
69
+
70
+ pre_tags.each do |name, value|
71
+ pee.gsub!(name, value)
72
+ end
73
+ pee
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,3 @@
1
+ module BuntoImport
2
+ VERSION = '1.0.0'
3
+ end
@@ -0,0 +1,79 @@
1
+ $:.unshift File.expand_path("../../", File.dirname(__FILE__)) # load from bunto-import/lib
2
+ require 'bunto/command'
3
+ require 'bunto-import'
4
+
5
+ module Bunto
6
+ module Commands
7
+ class Import < Command
8
+
9
+ IMPORTERS = {
10
+ :blogger => 'Blogger',
11
+ :behance => 'Behance',
12
+ :csv => 'CSV',
13
+ :drupal6 => 'Drupal6',
14
+ :drupal7 => 'Drupal7',
15
+ :enki => 'Enki',
16
+ :joomla => 'Joomla',
17
+ :joomla3 => 'Joomla3',
18
+ :jrnl => 'Jrnl',
19
+ :ghost => 'Ghost',
20
+ :google_reader => 'GoogleReader',
21
+ :marley => 'Marley',
22
+ :mephisto => 'Mephisto',
23
+ :mt => 'MT',
24
+ :posterous => 'Posterous',
25
+ :rss => 'RSS',
26
+ :s9y => 'S9Y',
27
+ :textpattern => 'TextPattern',
28
+ :tumblr => 'Tumblr',
29
+ :typo => 'Typo',
30
+ :wordpress => 'WordPress',
31
+ :wordpressdotcom => 'WordpressDotCom'
32
+ }
33
+
34
+ class << self
35
+
36
+ def init_with_program(prog)
37
+ prog.command(:import) do |c|
38
+ c.syntax 'import <platform> [options]'
39
+ c.description 'Import your old blog to Bunto'
40
+ importers = BuntoImport.add_importer_commands(c)
41
+
42
+ c.action do |args, options|
43
+ if args.empty?
44
+ Bunto.logger.warn "You must specify an importer."
45
+ Bunto.logger.info "Valid options are:"
46
+ importers.each { |i| Bunto.logger.info "*", "#{i}" }
47
+ end
48
+ end
49
+ end
50
+ end
51
+
52
+ def process(migrator, options)
53
+ migrator = migrator.to_s.downcase
54
+
55
+ if IMPORTERS.keys.include?(migrator.to_sym)
56
+ if BuntoImport::Importers.const_defined?(IMPORTERS[migrator.to_sym])
57
+ klass = BuntoImport::Importers.const_get(IMPORTERS[migrator.to_sym])
58
+ if options.respond_to?(:__hash__)
59
+ klass.run(options.__hash__)
60
+ else
61
+ klass.run(options)
62
+ end
63
+ end
64
+ else
65
+ abort_on_invalid_migrator(migrator)
66
+ end
67
+ end
68
+
69
+ def abort_on_invalid_migrator(migrator)
70
+ $stderr.puts "Sorry, '#{migrator}' isn't a valid migrator. Valid choices:"
71
+ IMPORTERS.keys.each { |k| $stderr.puts "* #{k}" }
72
+ raise RuntimeError.new("'#{migrator}' is not a valid migrator.")
73
+ end
74
+
75
+ end
76
+
77
+ end
78
+ end
79
+ end
metadata ADDED
@@ -0,0 +1,374 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: bunto-import
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Tom Preston-Werner
8
+ - Suriyaa Kudo
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2016-04-02 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.0'
20
+ name: bunto
21
+ prerelease: false
22
+ type: :runtime
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: '1.0'
28
+ - !ruby/object:Gem::Dependency
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ name: fastercsv
35
+ prerelease: false
36
+ type: :runtime
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ - !ruby/object:Gem::Dependency
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ name: nokogiri
49
+ prerelease: false
50
+ type: :runtime
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ - !ruby/object:Gem::Dependency
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 10.1.0
62
+ name: rake
63
+ prerelease: false
64
+ type: :development
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: 10.1.0
70
+ - !ruby/object:Gem::Dependency
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 4.0.0
76
+ name: rdoc
77
+ prerelease: false
78
+ type: :development
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - "~>"
82
+ - !ruby/object:Gem::Version
83
+ version: 4.0.0
84
+ - !ruby/object:Gem::Dependency
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '3.2'
90
+ name: activesupport
91
+ prerelease: false
92
+ type: :development
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - "~>"
96
+ - !ruby/object:Gem::Version
97
+ version: '3.2'
98
+ - !ruby/object:Gem::Dependency
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '1.2'
104
+ name: redgreen
105
+ prerelease: false
106
+ type: :development
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - "~>"
110
+ - !ruby/object:Gem::Version
111
+ version: '1.2'
112
+ - !ruby/object:Gem::Dependency
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '3.5'
118
+ name: shoulda
119
+ prerelease: false
120
+ type: :development
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - "~>"
124
+ - !ruby/object:Gem::Version
125
+ version: '3.5'
126
+ - !ruby/object:Gem::Dependency
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '1.0'
132
+ name: rr
133
+ prerelease: false
134
+ type: :development
135
+ version_requirements: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - "~>"
138
+ - !ruby/object:Gem::Version
139
+ version: '1.0'
140
+ - !ruby/object:Gem::Dependency
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '0.7'
146
+ name: simplecov
147
+ prerelease: false
148
+ type: :development
149
+ version_requirements: !ruby/object:Gem::Requirement
150
+ requirements:
151
+ - - "~>"
152
+ - !ruby/object:Gem::Version
153
+ version: '0.7'
154
+ - !ruby/object:Gem::Dependency
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: 1.0.1
160
+ name: simplecov-gem-adapter
161
+ prerelease: false
162
+ type: :development
163
+ version_requirements: !ruby/object:Gem::Requirement
164
+ requirements:
165
+ - - "~>"
166
+ - !ruby/object:Gem::Version
167
+ version: 1.0.1
168
+ - !ruby/object:Gem::Dependency
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - "~>"
172
+ - !ruby/object:Gem::Version
173
+ version: '3.42'
174
+ name: sequel
175
+ prerelease: false
176
+ type: :development
177
+ version_requirements: !ruby/object:Gem::Requirement
178
+ requirements:
179
+ - - "~>"
180
+ - !ruby/object:Gem::Version
181
+ version: '3.42'
182
+ - !ruby/object:Gem::Dependency
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - "~>"
186
+ - !ruby/object:Gem::Version
187
+ version: '4.3'
188
+ name: htmlentities
189
+ prerelease: false
190
+ type: :development
191
+ version_requirements: !ruby/object:Gem::Requirement
192
+ requirements:
193
+ - - "~>"
194
+ - !ruby/object:Gem::Version
195
+ version: '4.3'
196
+ - !ruby/object:Gem::Dependency
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - "~>"
200
+ - !ruby/object:Gem::Version
201
+ version: '0.8'
202
+ name: hpricot
203
+ prerelease: false
204
+ type: :development
205
+ version_requirements: !ruby/object:Gem::Requirement
206
+ requirements:
207
+ - - "~>"
208
+ - !ruby/object:Gem::Version
209
+ version: '0.8'
210
+ - !ruby/object:Gem::Dependency
211
+ requirement: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - "~>"
214
+ - !ruby/object:Gem::Version
215
+ version: '2.8'
216
+ name: mysql
217
+ prerelease: false
218
+ type: :development
219
+ version_requirements: !ruby/object:Gem::Requirement
220
+ requirements:
221
+ - - "~>"
222
+ - !ruby/object:Gem::Version
223
+ version: '2.8'
224
+ - !ruby/object:Gem::Dependency
225
+ requirement: !ruby/object:Gem::Requirement
226
+ requirements:
227
+ - - "~>"
228
+ - !ruby/object:Gem::Version
229
+ version: '0.12'
230
+ name: pg
231
+ prerelease: false
232
+ type: :development
233
+ version_requirements: !ruby/object:Gem::Requirement
234
+ requirements:
235
+ - - "~>"
236
+ - !ruby/object:Gem::Version
237
+ version: '0.12'
238
+ - !ruby/object:Gem::Dependency
239
+ requirement: !ruby/object:Gem::Requirement
240
+ requirements:
241
+ - - "~>"
242
+ - !ruby/object:Gem::Version
243
+ version: '0.3'
244
+ name: mysql2
245
+ prerelease: false
246
+ type: :development
247
+ version_requirements: !ruby/object:Gem::Requirement
248
+ requirements:
249
+ - - "~>"
250
+ - !ruby/object:Gem::Version
251
+ version: '0.3'
252
+ - !ruby/object:Gem::Dependency
253
+ requirement: !ruby/object:Gem::Requirement
254
+ requirements:
255
+ - - "~>"
256
+ - !ruby/object:Gem::Version
257
+ version: '0.3'
258
+ name: behance
259
+ prerelease: false
260
+ type: :development
261
+ version_requirements: !ruby/object:Gem::Requirement
262
+ requirements:
263
+ - - "~>"
264
+ - !ruby/object:Gem::Version
265
+ version: '0.3'
266
+ - !ruby/object:Gem::Dependency
267
+ requirement: !ruby/object:Gem::Requirement
268
+ requirements:
269
+ - - ">="
270
+ - !ruby/object:Gem::Version
271
+ version: '0'
272
+ name: unidecode
273
+ prerelease: false
274
+ type: :development
275
+ version_requirements: !ruby/object:Gem::Requirement
276
+ requirements:
277
+ - - ">="
278
+ - !ruby/object:Gem::Version
279
+ version: '0'
280
+ - !ruby/object:Gem::Dependency
281
+ requirement: !ruby/object:Gem::Requirement
282
+ requirements:
283
+ - - ">="
284
+ - !ruby/object:Gem::Version
285
+ version: '0'
286
+ name: open_uri_redirections
287
+ prerelease: false
288
+ type: :development
289
+ version_requirements: !ruby/object:Gem::Requirement
290
+ requirements:
291
+ - - ">="
292
+ - !ruby/object:Gem::Version
293
+ version: '0'
294
+ - !ruby/object:Gem::Dependency
295
+ requirement: !ruby/object:Gem::Requirement
296
+ requirements:
297
+ - - "~>"
298
+ - !ruby/object:Gem::Version
299
+ version: '2.4'
300
+ name: launchy
301
+ prerelease: false
302
+ type: :development
303
+ version_requirements: !ruby/object:Gem::Requirement
304
+ requirements:
305
+ - - "~>"
306
+ - !ruby/object:Gem::Version
307
+ version: '2.4'
308
+ description: Provides the Import command for Bunto.
309
+ email:
310
+ - tom@mojombo.com
311
+ - SuriyaaKudoIsc@users.noreply.github.com
312
+ executables: []
313
+ extensions: []
314
+ extra_rdoc_files:
315
+ - README.markdown
316
+ - LICENSE
317
+ files:
318
+ - LICENSE
319
+ - README.markdown
320
+ - lib/bunto-import.rb
321
+ - lib/bunto-import/importer.rb
322
+ - lib/bunto-import/importers.rb
323
+ - lib/bunto-import/importers/behance.rb
324
+ - lib/bunto-import/importers/blogger.rb
325
+ - lib/bunto-import/importers/csv.rb
326
+ - lib/bunto-import/importers/drupal6.rb
327
+ - lib/bunto-import/importers/drupal7.rb
328
+ - lib/bunto-import/importers/easyblog.rb
329
+ - lib/bunto-import/importers/enki.rb
330
+ - lib/bunto-import/importers/ghost.rb
331
+ - lib/bunto-import/importers/google_reader.rb
332
+ - lib/bunto-import/importers/joomla.rb
333
+ - lib/bunto-import/importers/joomla3.rb
334
+ - lib/bunto-import/importers/jrnl.rb
335
+ - lib/bunto-import/importers/marley.rb
336
+ - lib/bunto-import/importers/mephisto.rb
337
+ - lib/bunto-import/importers/mt.rb
338
+ - lib/bunto-import/importers/posterous.rb
339
+ - lib/bunto-import/importers/rss.rb
340
+ - lib/bunto-import/importers/s9y.rb
341
+ - lib/bunto-import/importers/textpattern.rb
342
+ - lib/bunto-import/importers/tumblr.rb
343
+ - lib/bunto-import/importers/typo.rb
344
+ - lib/bunto-import/importers/wordpress.rb
345
+ - lib/bunto-import/importers/wordpressdotcom.rb
346
+ - lib/bunto-import/util.rb
347
+ - lib/bunto-import/version.rb
348
+ - lib/bunto/commands/import.rb
349
+ homepage: http://github.com/bunto/bunto-import
350
+ licenses:
351
+ - MIT
352
+ metadata: {}
353
+ post_install_message:
354
+ rdoc_options:
355
+ - "--charset=UTF-8"
356
+ require_paths:
357
+ - lib
358
+ required_ruby_version: !ruby/object:Gem::Requirement
359
+ requirements:
360
+ - - ">="
361
+ - !ruby/object:Gem::Version
362
+ version: 1.9.3
363
+ required_rubygems_version: !ruby/object:Gem::Requirement
364
+ requirements:
365
+ - - ">="
366
+ - !ruby/object:Gem::Version
367
+ version: '0'
368
+ requirements: []
369
+ rubyforge_project:
370
+ rubygems_version: 2.4.8
371
+ signing_key:
372
+ specification_version: 2
373
+ summary: Import command for Bunto (static site generator).
374
+ test_files: []