bunto-import 2.0.0 → 3.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.
- checksums.yaml +4 -4
- data/LICENSE +21 -21
- data/README.markdown +33 -33
- data/lib/bunto-import.rb +49 -49
- data/lib/bunto-import/importer.rb +26 -26
- data/lib/bunto-import/importers.rb +10 -10
- data/lib/bunto-import/importers/behance.rb +80 -80
- data/lib/bunto-import/importers/blogger.rb +330 -264
- data/lib/bunto-import/importers/csv.rb +96 -96
- data/lib/bunto-import/importers/drupal6.rb +53 -139
- data/lib/bunto-import/importers/drupal7.rb +54 -111
- data/lib/bunto-import/importers/drupal_common.rb +157 -0
- data/lib/bunto-import/importers/easyblog.rb +96 -96
- data/lib/bunto-import/importers/enki.rb +74 -74
- data/lib/bunto-import/importers/ghost.rb +68 -68
- data/lib/bunto-import/importers/google_reader.rb +64 -64
- data/lib/bunto-import/importers/joomla.rb +92 -90
- data/lib/bunto-import/importers/joomla3.rb +91 -91
- data/lib/bunto-import/importers/jrnl.rb +125 -125
- data/lib/bunto-import/importers/marley.rb +72 -72
- data/lib/bunto-import/importers/mephisto.rb +99 -99
- data/lib/bunto-import/importers/mt.rb +257 -257
- data/lib/bunto-import/importers/posterous.rb +130 -130
- data/lib/bunto-import/importers/rss.rb +62 -62
- data/lib/bunto-import/importers/s9y.rb +60 -60
- data/lib/bunto-import/importers/s9y_database.rb +363 -0
- data/lib/bunto-import/importers/textpattern.rb +70 -70
- data/lib/bunto-import/importers/tumblr.rb +300 -289
- data/lib/bunto-import/importers/typo.rb +88 -88
- data/lib/bunto-import/importers/wordpress.rb +372 -372
- data/lib/bunto-import/importers/wordpressdotcom.rb +207 -207
- data/lib/bunto-import/util.rb +76 -76
- data/lib/bunto-import/version.rb +3 -3
- data/lib/bunto/commands/import.rb +79 -79
- metadata +84 -54
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8d44ab513c3fff1cf9e032de4f22330f4c02e7c3
|
4
|
+
data.tar.gz: cfacd4ea5f5784da123be72c02c17fbd2e7e6fd6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 48e63850a82509c11ad4cc93b945f29d3df0cbc53a771e604f261d2244c12ccf04e673cbc02c540bcf2e9d54abc6605f93f6a0d3c539218016a1d61bfa01cff2
|
7
|
+
data.tar.gz: 61044c86c4d03105c5dab0bb2c74b24e4a2ef6c08a16471014aee0b77e00aa10e3dbfb19fd7e135c861ae2c414e684b794409e9ccc34fda3595b9fcc509e606d
|
data/LICENSE
CHANGED
@@ -1,21 +1,21 @@
|
|
1
|
-
The MIT License (MIT)
|
2
|
-
|
3
|
-
Copyright (c) 2016-present
|
4
|
-
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
7
|
-
in the Software without restriction, including without limitation the rights
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
10
|
-
furnished to do so, subject to the following conditions:
|
11
|
-
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
13
|
-
copies or substantial portions of the Software.
|
14
|
-
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
-
SOFTWARE.
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2016-present Suriyaa Kudo
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
data/README.markdown
CHANGED
@@ -1,33 +1,33 @@
|
|
1
|
-
# bunto-import
|
2
|
-
|
3
|
-
[](https://travis-ci.org/bunto/bunto-import)
|
4
|
-
[](https://hakiri.io/github/bunto/bunto-import/master)
|
5
|
-
|
6
|
-
The new __Bunto__ command for importing from various blogs to Bunto format.
|
7
|
-
|
8
|
-
**Note: _migrators_ are now called _importers_ and are only available if one installs the `bunto-import` _gem_.**
|
9
|
-
|
10
|
-
## How `bunto-import` works:
|
11
|
-
|
12
|
-
### Bunto v2.x and higher
|
13
|
-
|
14
|
-
1. Install the _rubygem_ with `gem install bunto-import`.
|
15
|
-
2. Run `bunto import IMPORTER [options]`
|
16
|
-
|
17
|
-
### Bunto v1.x
|
18
|
-
|
19
|
-
Launch IRB:
|
20
|
-
|
21
|
-
```ruby
|
22
|
-
# 1. Require bunto-import
|
23
|
-
irb> require 'bunto-import'
|
24
|
-
# 2. Choose the importer you'd like to use.
|
25
|
-
irb> importer_class = "Behance" # an example, there are many others!
|
26
|
-
# 3. Run it!
|
27
|
-
irb> BuntoImport::Importers.const_get(importer_class).run(options_hash)
|
28
|
-
```
|
29
|
-
|
30
|
-
## Documentation
|
31
|
-
|
32
|
-
bunto-import has its own documentation site, found at https://bunto.
|
33
|
-
Dedicated [documentation for each migrator](https://bunto.
|
1
|
+
# bunto-import
|
2
|
+
|
3
|
+
[](https://travis-ci.org/bunto/bunto-import)
|
4
|
+
[](https://hakiri.io/github/bunto/bunto-import/master)
|
5
|
+
|
6
|
+
The new __Bunto__ command for importing from various blogs to Bunto format.
|
7
|
+
|
8
|
+
**Note: _migrators_ are now called _importers_ and are only available if one installs the `bunto-import` _gem_.**
|
9
|
+
|
10
|
+
## How `bunto-import` works:
|
11
|
+
|
12
|
+
### Bunto v2.x and higher
|
13
|
+
|
14
|
+
1. Install the _rubygem_ with `gem install bunto-import`.
|
15
|
+
2. Run `bunto import IMPORTER [options]`
|
16
|
+
|
17
|
+
### Bunto v1.x
|
18
|
+
|
19
|
+
Launch IRB:
|
20
|
+
|
21
|
+
```ruby
|
22
|
+
# 1. Require bunto-import
|
23
|
+
irb> require 'bunto-import'
|
24
|
+
# 2. Choose the importer you'd like to use.
|
25
|
+
irb> importer_class = "Behance" # an example, there are many others!
|
26
|
+
# 3. Run it!
|
27
|
+
irb> BuntoImport::Importers.const_get(importer_class).run(options_hash)
|
28
|
+
```
|
29
|
+
|
30
|
+
## Documentation
|
31
|
+
|
32
|
+
bunto-import has its own documentation site, found at https://bunto-import.tk/.
|
33
|
+
Dedicated [documentation for each migrator](https://bunto-import.tk/docs/home/) is available there.
|
data/lib/bunto-import.rb
CHANGED
@@ -1,49 +1,49 @@
|
|
1
|
-
$:.unshift File.dirname(__FILE__) # For use/testing when no gem is installed
|
2
|
-
require 'rubygems'
|
3
|
-
require 'bunto'
|
4
|
-
require 'bunto/commands/import'
|
5
|
-
require 'colorator'
|
6
|
-
|
7
|
-
require 'bunto-import/importer'
|
8
|
-
require 'bunto-import/importers'
|
9
|
-
require 'bunto-import/util'
|
10
|
-
|
11
|
-
module BuntoImport
|
12
|
-
# Public: Add the subcommands for each importer
|
13
|
-
#
|
14
|
-
# cmd - the instance of Mercenary::Command from the
|
15
|
-
#
|
16
|
-
# Returns a list of valid subcommands
|
17
|
-
def self.add_importer_commands(cmd)
|
18
|
-
commands = []
|
19
|
-
BuntoImport::Importer.subclasses.each do |importer|
|
20
|
-
name = importer.to_s.split("::").last.downcase
|
21
|
-
commands << name
|
22
|
-
cmd.command(name.to_sym) do |c|
|
23
|
-
c.syntax "#{name} [options]"
|
24
|
-
importer.specify_options(c)
|
25
|
-
c.action do |_, options|
|
26
|
-
importer.run(options)
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
commands
|
31
|
-
end
|
32
|
-
|
33
|
-
def self.require_with_fallback(gems)
|
34
|
-
Array[gems].flatten.each do |gem|
|
35
|
-
begin
|
36
|
-
require gem
|
37
|
-
rescue LoadError
|
38
|
-
Bunto.logger.error "Whoops! Looks like you need to install '#{gem}' before you can use this importer."
|
39
|
-
Bunto.logger.error ""
|
40
|
-
Bunto.logger.error "If you're using bundler:"
|
41
|
-
Bunto.logger.error " 1. Add 'gem \"#{gem}\"' to your Gemfile"
|
42
|
-
Bunto.logger.error " 2. Run 'bundle install'"
|
43
|
-
Bunto.logger.error ""
|
44
|
-
Bunto.logger.error "If you're not using bundler:"
|
45
|
-
Bunto.logger.abort_with " 1. Run 'gem install #{gem}'."
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
1
|
+
$:.unshift File.dirname(__FILE__) # For use/testing when no gem is installed
|
2
|
+
require 'rubygems'
|
3
|
+
require 'bunto'
|
4
|
+
require 'bunto/commands/import'
|
5
|
+
require 'colorator'
|
6
|
+
|
7
|
+
require 'bunto-import/importer'
|
8
|
+
require 'bunto-import/importers'
|
9
|
+
require 'bunto-import/util'
|
10
|
+
|
11
|
+
module BuntoImport
|
12
|
+
# Public: Add the subcommands for each importer
|
13
|
+
#
|
14
|
+
# cmd - the instance of Mercenary::Command from the
|
15
|
+
#
|
16
|
+
# Returns a list of valid subcommands
|
17
|
+
def self.add_importer_commands(cmd)
|
18
|
+
commands = []
|
19
|
+
BuntoImport::Importer.subclasses.each do |importer|
|
20
|
+
name = importer.to_s.split("::").last.downcase
|
21
|
+
commands << name
|
22
|
+
cmd.command(name.to_sym) do |c|
|
23
|
+
c.syntax "#{name} [options]"
|
24
|
+
importer.specify_options(c)
|
25
|
+
c.action do |_, options|
|
26
|
+
importer.run(options)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
commands
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.require_with_fallback(gems)
|
34
|
+
Array[gems].flatten.each do |gem|
|
35
|
+
begin
|
36
|
+
require gem
|
37
|
+
rescue LoadError
|
38
|
+
Bunto.logger.error "Whoops! Looks like you need to install '#{gem}' before you can use this importer."
|
39
|
+
Bunto.logger.error ""
|
40
|
+
Bunto.logger.error "If you're using bundler:"
|
41
|
+
Bunto.logger.error " 1. Add 'gem \"#{gem}\"' to your Gemfile"
|
42
|
+
Bunto.logger.error " 2. Run 'bundle install'"
|
43
|
+
Bunto.logger.error ""
|
44
|
+
Bunto.logger.error "If you're not using bundler:"
|
45
|
+
Bunto.logger.abort_with " 1. Run 'gem install #{gem}'."
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -1,26 +1,26 @@
|
|
1
|
-
module BuntoImport
|
2
|
-
class Importer
|
3
|
-
def self.inherited(base)
|
4
|
-
subclasses << base
|
5
|
-
end
|
6
|
-
|
7
|
-
def self.subclasses
|
8
|
-
@subclasses ||= []
|
9
|
-
end
|
10
|
-
|
11
|
-
def self.stringify_keys(hash)
|
12
|
-
the_hash = hash.clone
|
13
|
-
the_hash.keys.each do |key|
|
14
|
-
the_hash[(key.to_s rescue key) || key] = the_hash.delete(key)
|
15
|
-
end
|
16
|
-
the_hash
|
17
|
-
end
|
18
|
-
|
19
|
-
def self.run(options = {})
|
20
|
-
opts = stringify_keys(options)
|
21
|
-
self.require_deps
|
22
|
-
self.validate(opts) if self.respond_to?(:validate)
|
23
|
-
self.process(opts)
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
1
|
+
module BuntoImport
|
2
|
+
class Importer
|
3
|
+
def self.inherited(base)
|
4
|
+
subclasses << base
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.subclasses
|
8
|
+
@subclasses ||= []
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.stringify_keys(hash)
|
12
|
+
the_hash = hash.clone
|
13
|
+
the_hash.keys.each do |key|
|
14
|
+
the_hash[(key.to_s rescue key) || key] = the_hash.delete(key)
|
15
|
+
end
|
16
|
+
the_hash
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.run(options = {})
|
20
|
+
opts = stringify_keys(options)
|
21
|
+
self.require_deps
|
22
|
+
self.validate(opts) if self.respond_to?(:validate)
|
23
|
+
self.process(opts)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -1,10 +1,10 @@
|
|
1
|
-
module BuntoImport
|
2
|
-
module Importers
|
3
|
-
Dir.chdir(File.expand_path(File.join("importers"), File.dirname(__FILE__))) do
|
4
|
-
Dir.entries(".").each do |f|
|
5
|
-
next if f[0..0].eql?(".")
|
6
|
-
require "bunto-import/importers/#{f}"
|
7
|
-
end
|
8
|
-
end
|
9
|
-
end
|
10
|
-
end
|
1
|
+
module BuntoImport
|
2
|
+
module Importers
|
3
|
+
Dir.chdir(File.expand_path(File.join("importers"), File.dirname(__FILE__))) do
|
4
|
+
Dir.entries(".").each do |f|
|
5
|
+
next if f[0..0].eql?(".")
|
6
|
+
require "bunto-import/importers/#{f}"
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
@@ -1,80 +1,80 @@
|
|
1
|
-
module BuntoImport
|
2
|
-
module Importers
|
3
|
-
class Behance < Importer
|
4
|
-
def self.require_deps
|
5
|
-
BuntoImport.require_with_fallback(%w[
|
6
|
-
fileutils
|
7
|
-
safe_yaml
|
8
|
-
date
|
9
|
-
time
|
10
|
-
behance
|
11
|
-
])
|
12
|
-
end
|
13
|
-
|
14
|
-
def self.specify_options(c)
|
15
|
-
c.option 'user', '--user NAME', 'The username of the account'
|
16
|
-
c.option 'api_token', '--api_token TOKEN', 'The API access token for the account'
|
17
|
-
end
|
18
|
-
|
19
|
-
def self.validate(options)
|
20
|
-
%w[user api_token].each do |option|
|
21
|
-
if options[option].nil?
|
22
|
-
abort "Missing mandatory option --#{option}."
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
# Process the import.
|
28
|
-
#
|
29
|
-
# user - the behance user to retrieve projects (ID or username)
|
30
|
-
# api_token - your developer API Token
|
31
|
-
#
|
32
|
-
# Returns nothing.
|
33
|
-
def self.process(options)
|
34
|
-
user = options.fetch('user')
|
35
|
-
token = options.fetch('api_token')
|
36
|
-
|
37
|
-
client = fetch_behance(token)
|
38
|
-
|
39
|
-
user_projects = client.user_projects(user)
|
40
|
-
|
41
|
-
puts "#{user_projects.length} project(s) found. Importing now..."
|
42
|
-
|
43
|
-
user_projects.each do |project|
|
44
|
-
|
45
|
-
details = client.project(project['id'])
|
46
|
-
title = project['name'].to_s
|
47
|
-
formatted_date = Time.at(project['published_on'].to_i).to_date.to_s
|
48
|
-
|
49
|
-
post_name = title.split(%r{ |!|/|:|&|-|$|,}).map do |character|
|
50
|
-
character.downcase unless character.empty?
|
51
|
-
end.compact.join('-')
|
52
|
-
|
53
|
-
name = "#{formatted_date}-#{post_name}"
|
54
|
-
|
55
|
-
header = {
|
56
|
-
"layout" => "post",
|
57
|
-
"title" => title,
|
58
|
-
"details" => details
|
59
|
-
}
|
60
|
-
|
61
|
-
FileUtils.mkdir_p("_posts")
|
62
|
-
|
63
|
-
File.open("_posts/#{name}.md", "w") do |f|
|
64
|
-
f.puts header.to_yaml
|
65
|
-
f.puts "---\n\n"
|
66
|
-
f.puts details['description'].to_s
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
puts "Finished importing."
|
71
|
-
end
|
72
|
-
|
73
|
-
private
|
74
|
-
|
75
|
-
def self.fetch_behance(token)
|
76
|
-
::Behance::Client.new(access_token: token)
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
1
|
+
module BuntoImport
|
2
|
+
module Importers
|
3
|
+
class Behance < Importer
|
4
|
+
def self.require_deps
|
5
|
+
BuntoImport.require_with_fallback(%w[
|
6
|
+
fileutils
|
7
|
+
safe_yaml
|
8
|
+
date
|
9
|
+
time
|
10
|
+
behance
|
11
|
+
])
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.specify_options(c)
|
15
|
+
c.option 'user', '--user NAME', 'The username of the account'
|
16
|
+
c.option 'api_token', '--api_token TOKEN', 'The API access token for the account'
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.validate(options)
|
20
|
+
%w[user api_token].each do |option|
|
21
|
+
if options[option].nil?
|
22
|
+
abort "Missing mandatory option --#{option}."
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
# Process the import.
|
28
|
+
#
|
29
|
+
# user - the behance user to retrieve projects (ID or username)
|
30
|
+
# api_token - your developer API Token
|
31
|
+
#
|
32
|
+
# Returns nothing.
|
33
|
+
def self.process(options)
|
34
|
+
user = options.fetch('user')
|
35
|
+
token = options.fetch('api_token')
|
36
|
+
|
37
|
+
client = fetch_behance(token)
|
38
|
+
|
39
|
+
user_projects = client.user_projects(user)
|
40
|
+
|
41
|
+
puts "#{user_projects.length} project(s) found. Importing now..."
|
42
|
+
|
43
|
+
user_projects.each do |project|
|
44
|
+
|
45
|
+
details = client.project(project['id'])
|
46
|
+
title = project['name'].to_s
|
47
|
+
formatted_date = Time.at(project['published_on'].to_i).to_date.to_s
|
48
|
+
|
49
|
+
post_name = title.split(%r{ |!|/|:|&|-|$|,}).map do |character|
|
50
|
+
character.downcase unless character.empty?
|
51
|
+
end.compact.join('-')
|
52
|
+
|
53
|
+
name = "#{formatted_date}-#{post_name}"
|
54
|
+
|
55
|
+
header = {
|
56
|
+
"layout" => "post",
|
57
|
+
"title" => title,
|
58
|
+
"details" => details
|
59
|
+
}
|
60
|
+
|
61
|
+
FileUtils.mkdir_p("_posts")
|
62
|
+
|
63
|
+
File.open("_posts/#{name}.md", "w") do |f|
|
64
|
+
f.puts header.to_yaml
|
65
|
+
f.puts "---\n\n"
|
66
|
+
f.puts details['description'].to_s
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
puts "Finished importing."
|
71
|
+
end
|
72
|
+
|
73
|
+
private
|
74
|
+
|
75
|
+
def self.fetch_behance(token)
|
76
|
+
::Behance::Client.new(access_token: token)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|